Subversion Repository Public Repository

Nextrek

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
    "uid": "9D2D1D14K49FAA43CBS8582E7937AF84F3A2",
    "isLoaded": true,
    "lastModificationTime": 1422817393812,
    "items": {
        "name": "GameManager",
        "type": "game_script",
        "order": 1,
        "content": "# ===================================================================\n#\n#   Script: GameManager\n#\n#   $$COPYRIGHT$$\n#\n# ===================================================================\nclass GameManager\n    ###*\n    * Manages all general things around the game like holding the game settings,\n    * manages the save/load of a game, etc.\n    *\n    * @module gs\n    * @class GameManager\n    * @memberof gs\n    * @constructor\n    ###\n    constructor: ->\n        ###*\n        * The current scene data.\n        * @property sceneData\n        * @type Object\n        ### \n        @sceneData = {}\n        \n        ###*\n        * The scene viewport containing all visual objects which are part of the scene and influenced\n        * by the in-game camera.\n        * @property sceneViewport\n        * @type gs.Object_Viewport\n        ###\n        @sceneViewport = null\n        \n        ###*\n        * The list of common events.\n        * @property commonEvents\n        * @type gs.Object_CommonEvent[]\n        ### \n        @commonEvents = []\n        \n        ###*\n        * Indicates if the GameManager is initialized.\n        * @property commonEvents\n        * @type gs.Object_CommonEvent[]\n        ### \n        @initialized = no\n        \n        ###*\n        * Temporary game settings.\n        * @property tempSettings\n        * @type Object\n        ### \n        @tempSettings = skip: false, skipTime: 5, loadMenuAccess: true, menuAccess: true, backlogAccess: true, saveMenuAccess: true, messageFading: { animation: { type: 1 }, duration: 15, easing: null }\n        \n        ###*\n        * Temporary game fields.\n        * @property tempFields\n        * @type Object\n        ### \n        @tempFields = null\n        \n        ###*\n        * Stores default values for backgrounds, pictures, etc.\n        * @property defaults\n        * @type Object\n        ###\n        @defaults = { \n            background: { \"duration\": 30, \"origin\": 0, \"zOrder\": 0, \"loopVertical\": 0, \"loopHorizontal\": 0, \"easing\": { \"type\": 0, \"inOut\": 1 }, \"animation\": { \"type\": 1, \"movement\": 0, \"mask\": { \"graphic\": null, \"vague\": 30 } }, \"motionBlur\": { \"enabled\": 0, \"delay\": 2, \"opacity\": 100, \"dissolveSpeed\": 3 } },\n            picture: { \"appearDuration\": 30, \"disappearDuration\": 30, \"origin\": 0, \"zOrder\": 0, \"appearEasing\": { \"type\": 0, \"inOut\": 1 }, \"disappearEasing\": { \"type\": 0, \"inOut\": 1 }, \"appearAnimation\": { \"type\": 1, \"movement\": 0, \"mask\": { \"graphic\": null, \"vague\": 30 } }, \"disappearAnimation\": { \"type\": 1, \"movement\": 0, \"mask\": { \"graphic\": null, \"vague\": 30 } }, \"motionBlur\": { \"enabled\": 0, \"delay\": 2, \"opacity\": 100, \"dissolveSpeed\": 3 } },\n            character: { \"expressionDuration\": 0, \"appearDuration\": 40, \"disappearDuration\": 40, \"origin\": 0, \"zOrder\": 0, \"appearEasing\": { \"type\": 2, \"inOut\": 2 }, \"disappearEasing\": { \"type\": 1, \"inOut\": 1 }, \"appearAnimation\": { \"type\": 1, \"movement\": 0, \"mask\": { \"graphic\": null, \"vague\": 30 } }, \"disappearAnimation\": { \"type\": 1, \"movement\": 0, \"mask\": { \"graphic\": null, \"vague\": 30 } }, \"motionBlur\": { \"enabled\": 0, \"delay\": 2, \"opacity\": 100, \"dissolveSpeed\": 3 }, \"changeAnimation\": { \"type\": 1, \"movement\": 0, \"fading\": 0, \"mask\": { \"graphic\": null, \"vague\": 30 } }, \"changeEasing\": { \"type\": 2, \"inOut\": 2 } },\n            text: { \"appearDuration\": 30, \"disappearDuration\": 30, \"positionOrigin\": 0, \"origin\": 0, \"zOrder\": 0, \"appearEasing\": { \"type\": 0, \"inOut\": 1 }, \"disappearEasing\": { \"type\": 0, \"inOut\": 1 }, \"appearAnimation\": { \"type\": 1, \"movement\": 0, \"mask\": { \"graphic\": null, \"vague\": 30 } }, \"disappearAnimation\": { \"type\": 1, \"movement\": 0, \"mask\": { \"graphic\": null, \"vague\": 30 } }, \"motionBlur\": { \"enabled\": 0, \"delay\": 2, \"opacity\": 100, \"dissolveSpeed\": 3 } },\n            video: { \"appearDuration\": 30, \"disappearDuration\": 30, \"origin\": 0, \"zOrder\": 0, \"appearEasing\": { \"type\": 0, \"inOut\": 1 }, \"disappearEasing\": { \"type\": 0, \"inOut\": 1 }, \"appearAnimation\": { \"type\": 1, \"movement\": 0, \"mask\": { \"graphic\": null, \"vague\": 30 } }, \"disappearAnimation\": { \"type\": 1, \"movement\": 0, \"mask\": { \"graphic\": null, \"vague\": 30 } }, \"motionBlur\": { \"enabled\": 0, \"delay\": 2, \"opacity\": 100, \"dissolveSpeed\": 3 } },\n            live2d: { \"motionFadeInTime\": 1000, \"appearDuration\": 30, \"disappearDuration\": 30, \"zOrder\": 0, \"appearEasing\": { \"type\": 0, \"inOut\": 1 }, \"disappearEasing\": { \"type\": 0, \"inOut\": 1 }, \"appearAnimation\": { \"type\": 1, \"movement\": 0, \"mask\": { \"graphic\": null, \"vague\": 30 } }, \"disappearAnimation\": { \"type\": 1, \"movement\": 0, \"mask\": { \"graphic\": null, \"vague\": 30 } } },\n            messageBox: { \"appearDuration\": 30, \"disappearDuration\": 30, \"zOrder\": 0, \"appearEasing\": { \"type\": 0, \"inOut\": 1 }, \"disappearEasing\": { \"type\": 0, \"inOut\": 1 }, \"appearAnimation\": { \"type\": 0, \"movement\": 3, \"mask\": { \"graphic\": null, \"vague\": 30 } }, \"disappearAnimation\": { \"type\": 0, \"movement\": 3, \"mask\": { \"graphic\": null, \"vague\": 30 } } },\n            audio: { \"musicFadeInDuration\": 0, \"musicFadeOutDuration\": 0, \"musicVolume\": 100, \"musicPlaybackRate\": 100, \"soundVolume\": 100, \"soundPlaybackRate\": 100, \"voiceVolume\": 100, \"voicePlaybackRate\": 100 }\n        }\n        \n        ###*\n        * The game's backlog.\n        * @property backlog\n        * @type Object[]\n        ### \n        @backlog = []\n        \n        ###*\n        * Character parameters by character ID.\n        * @property characterParams\n        * @type Object[]\n        ### \n        @characterParams = []\n        \n        ###*\n        * The game's chapter\n        * @property chapters\n        * @type gs.Document[]\n        ### \n        @chapters = []\n        \n        ###*\n        * The game's current displayed messages. Especially in NVL mode the messages \n        * of the current page are stored here.\n        * @property messages\n        * @type Object[]\n        ### \n        @messages = []\n        \n        ###*\n        * Count of save slots. Default is 100.\n        * @property saveSlotCount\n        * @type number\n        ### \n        @saveSlotCount = 100\n        \n        ###*\n        * The index of save games. Contains the header-info for each save game slot.\n        * @property saveGameSlots\n        * @type Object[]\n        ### \n        @saveGameSlots = []\n        \n        ###*\n        * Stores global data like the state of persistent game variables.\n        * @property globalData\n        * @type Object\n        ### \n        @globalData = null\n        \n        ###*\n        * Indicates if the game runs in editor's live-preview.\n        * @property inLivePreview\n        * @type Object\n        ### \n        @inLivePreview = no\n        \n    \n    ###*\n    * Initializes the GameManager, should be called before the actual game starts.\n    *\n    * @method initialize\n    ###    \n    initialize: ->\n        @initialized = yes\n        @inLivePreview = $PARAMS.preview?\n        @saveSlotCount = RecordManager.system.saveSlotCount || 100\n        @tempFields = new gs.GameTemp()\n        window.$tempFields = @tempFields\n        \n        @createSaveGameIndex()\n        @variableStore = new gs.VariableStore()\n        DataManager.getDocumentsByType(\"persistent_variables\")\n        @variableStore.setupDomains(DataManager.getDocumentsByType(\"global_variables\").select (v) -> v.items.domain||\"\")\n        @variableStore.persistentNumbersByDomain = @globalData.persistentNumbers ? @variableStore.persistentNumbersByDomain\n        @variableStore.persistentBooleansByDomain = @globalData.persistentBooleans ? @variableStore.persistentBooleansByDomain\n        @variableStore.persistentStringsByDomain = @globalData.persistentStrings ? @variableStore.persistentStringsByDomain\n        @variableStore.persistentListsByDomain = @globalData.persistentLists ? @variableStore.persistentListsByDomain\n        \n        @sceneViewport = new gs.Object_Viewport(new Viewport(0, 0, Graphics.width, Graphics.height, Graphics.viewport))\n        for character in RecordManager.charactersArray\n            if character?\n                @characterParams[character.index] = {}\n                if character.params?\n                    for param in character.params\n                        @characterParams[character.index][param.name] = param.value \n\n        \n        @setupCommonEvents()\n            \n        for i in [0...RecordManager.characters]\n            @settings.voicesPerCharacter[i] = 100\n             \n        @chapters = DataManager.getDocumentsByType(\"vn.chapter\")\n        @chapters.sort (a, b) ->\n            if a.items.order > b.items.order\n                return 1\n            else if a.items.order < b.items.order\n                return -1\n            else\n                return 0\n     \n    ###*\n    * Sets up common events.\n    *\n    * @method setupCommonEvents\n    ###            \n    setupCommonEvents: ->\n        for event in @commonEvents\n            event?.dispose()\n        \n        @commonEvents = []    \n        for event in RecordManager.commonEvents\n            continue if not event\n            if event.startCondition == 1 and event.autoPreload\n                gs.ResourceLoader.loadEventCommandsGraphics(event.commands)\n                \n            object = new gs.Object_CommonEvent()\n            object.record = event\n            object.rid = event.index\n            @commonEvents[event.index] = object\n            @commonEvents.push(object)\n    \n    ###*\n    * Sets up cursor depending on system settings.\n    *\n    * @method setupCursor\n    ###\n    setupCursor: ->\n        if RecordManager.system.cursor?.name\n            bitmap = ResourceManager.getBitmap(\"Graphics/Pictures/#{RecordManager.system.cursor.name}\")\n            Graphics.setCursorBitmap(bitmap, RecordManager.system.cursor.hx, RecordManager.system.cursor.hy)\n        else\n            Graphics.setCursorBitmap(null)\n        \n    ###*\n    * Disposes the GameManager. Should be called before quit the game.\n    *\n    * @method dispose\n    ###               \n    dispose: ->\n        \n    ###*\n    * Quits the game. The implementation depends on the platform. So for example on mobile\n    * devices this method has no effect.\n    *\n    * @method exit\n    ###   \n    exit: -> Application.exit()\n    \n    ###*\n    * Resets the GameManager by disposing and re-initializing it.\n    *\n    * @method reset\n    ###          \n    reset: ->\n        @initialized = no\n        @interpreter = null\n        @dispose()\n        @initialize()\n     \n    ###*\n    * Starts a new game.\n    *\n    * @method newGame\n    ###      \n    newGame: ->\n        @messages = []\n        @variableStore.clearAllGlobalVariables()\n        @variableStore.clearAllLocalVariables()\n        @tempSettings.skip = no\n        @tempFields.clear()\n        @tempFields.inGame = yes\n        @setupCommonEvents()\n        @tempSettings.menuAccess = yes\n        @tempSettings.saveMenuAccess = yes\n        @tempSettings.loadMenuAccess = yes\n        @tempSettings.backlogAccess = yes\n    \n    \n    ###*\n    * Exists the game and resets the GameManager which is important before going back to\n    * the main menu or title screen.\n    *\n    * @method exitGame\n    ###    \n    exitGame: ->\n        @tempFields.inGame = no     \n        @tempFields.isExitingGame = yes\n    \n    ###*\n    * Updates the GameManager. Should be called once per frame.\n    *\n    * @method update\n    ###     \n    update: ->\n    \n    ###*\n    * Creates the index of all save-games. Should be called whenever a new save game\n    * is created.\n    *\n    * @method createSaveGameIndex\n    * @protected\n    ### \n    createSaveGameIndex: ->\n        @saveGameSlots = []\n        for i in [0...@saveSlotCount]\n            if GameStorage.exists(\"SaveGame_#{i}_Header\")\n                header = GameStorage.getObject(\"SaveGame_#{i}_Header\")\n                chapter = DataManager.getDocument(header.chapterUid)\n                scene = DataManager.getDocumentSummary(header.sceneUid)\n                image = header.image\n            else\n                header = null\n                chaper = null\n                scene = null\n                \n            if chapter? and scene? and !@inLivePreview\n                @saveGameSlots.push({\n                    date: header.date,\n                    chapter: chapter.items.name || \"DELETED\"\n                    scene: scene.items.name || \"DELETED\",\n                    image: image #chapter.items.commands[0].params.saveGameGraphic?.name\n                })\n            else\n                @saveGameSlots.push({ \"date\": \"\", \"chapter\": \"\", \"scene\": \"\", \"image\": null })\n        \n        return @saveGameSlots\n        \n    ###*\n    * Resets the game's settings to its default values.\n    *\n    * @method resetSettings\n    ###            \n    resetSettings: ->\n        @settings = { version: 342, renderer: 0, filter: 1, confirmation: yes, adjustAspectRatio: no, allowSkip: yes, allowSkipUnreadMessages: yes,  allowVideoSkip: yes, skipVoiceOnAction: yes, allowChoiceSkip: no, voicesByCharacter: [], timeMessageToVoice: true,  \"autoMessage\": { enabled: false, time: 0, waitForVoice: yes, stopOnAction: no },  \"voiceEnabled\": true, \"bgmEnabled\": true, \"soundEnabled\": true, \"voiceVolume\": 100, \"bgmVolume\": 100, \"seVolume\": 100, \"messageSpeed\": 4, \"fullScreen\": no, \"aspectRatio\": 0 }\n        @saveGameSlots = []\n        for i in [0...@saveSlotCount]\n            GameStorage.remove(\"SaveGame_#{i}_Header\")\n            GameStorage.remove(\"SaveGame_#{i}\")\n            \n            @saveGameSlots.push({ \"date\": \"\", \"chapter\": \"\", \"scene\": \"\", \"thumb\": \"\" })\n       \n        GameStorage.setObject(\"settings\", @settings)\n        \n        \n        \n    ###*\n    * Saves current game settings.\n    *\n    * @method saveSettings\n    ###     \n    saveSettings: ->\n        GameStorage.setObject(\"settings\", @settings)\n        \n    ###*\n    * Saves current global data.\n    *\n    * @method saveGlobalData\n    ###  \n    saveGlobalData: ->\n        @globalData.persistentNumbers = @variableStore.persistentNumbersByDomain\n        @globalData.persistentLists = @variableStore.persistentListsByDomain\n        @globalData.persistentBooleans = @variableStore.persistentBooleansByDomain\n        @globalData.persistentStrings = @variableStore.persistentStringsByDomain\n        GameStorage.setObject(\"globalData\", @globalData)\n     \n    ###*\n    * Resets current global data. All stored data about read messages, persistent variables and\n    * CG gallery will be deleted.\n    *\n    * @method resetGlobalData\n    ###     \n    resetGlobalData: ->\n        version = @globalData?.version\n        data = @globalData\n        \n        @globalData = { \n            messages: {}, cgGallery: {}, version: 342, \n            persistentNumbers: { \"0\": [], \"com.degica.vnm.default\": [] }, \n            persistentStrings: { \"0\": [], \"com.degica.vnm.default\": [] }, \n            persistentBooleans: { \"0\": [], \"com.degica.vnm.default\": [] }, \n            persistentLists: { \"0\": [], \"com.degica.vnm.default\": [] } \n        }\n        \n        for cg, i in RecordManager.cgGalleryArray\n            if cg?\n                @globalData.cgGallery[cg.index] = { unlocked: no }\n                \n        GameStorage.setObject(\"globalData\", @globalData) \n    \n        @migrateGlobalData(data, version+1, @globalData.version)\n    \n    migrateGlobalData: (data, from, to) ->\n        for i in [from..to]\n            if this[\"migrateGlobalData#{i}\"]?\n                this[\"migrateGlobalData#{i}\"](data)\n                \n    migrateGlobalData342: (data) -> \n        if data?\n            @globalData.persistentNumbers[0] = data.persistentNumbers[0] || []\n            @globalData.persistentStrings[0] = data.persistentStrings[0] || []\n            @globalData.persistentBooleans[0] = data.persistentBooleans[0] || []\n            @globalData.persistentLists[0] = data.persistentLists[0] || []\n            @globalData.persistentNumbers[\"com.degica.vnm.default\"] = data.persistentNumbers[0] || []\n            @globalData.persistentStrings[\"com.degica.vnm.default\"] = data.persistentStrings[0] || []\n            @globalData.persistentBooleans[\"com.degica.vnm.default\"] = data.persistentBooleans[0] || []\n            @globalData.persistentLists[\"com.degica.vnm.default\"] = data.persistentLists[0] || []\n     \n    readSaveGame: (saveGame) ->\n    writeSaveGame: (saveGame) ->\n        \n    prepareSaveGame: (snapshot) ->\n        if snapshot\n            snapshot = ResourceManager.getCustomBitmap(\"$snapshot\")\n            snapshot?.dispose()\n            ResourceManager.setCustomBitmap(\"$snapshot\", Graphics.snapshot())\n        \n        context = new gs.ObjectCodecContext()\n        context.decodedObjectStore.push(Graphics.viewport)\n        context.decodedObjectStore.push(@scene)\n        context.decodedObjectStore.push(@scene.behavior)\n  \n        messageBoxIds = [\"messageBox\", \"nvlMessageBox\", \"messageMenu\"];\n        messageIds = [\"gameMessage_message\", \"nvlGameMessage_message\"];\n        messageBoxes = messageBoxIds.select (id) => @scene.behavior.objectManager.objectById(id)\n        messages = messageIds.select (id) => @scene.behavior.objectManager.objectById(id)\n        \n        sceneData = {}\n        saveGame = {}\n        saveGame.encodedObjectStore = null\n        saveGame.sceneUid = @scene.sceneDocument.uid\n        saveGame.data = {\n            resourceContext: @scene.behavior.resourceContext.toDataBundle(),\n            currentCharacter: @scene.currentCharacter,\n            characterParams: @characterParams,\n            frameCount: Graphics.frameCount,\n            tempFields: @tempFields,\n            viewport: @scene.viewport,\n            characters: @scene.characters,\n            characterNames: RecordManager.charactersArray.select((c) -> { name: c.name, index: c.index }),\n            backgrounds: @scene.backgrounds,\n            pictures: @scene.pictureContainer.subObjectsByDomain,\n            texts: @scene.textContainer.subObjectsByDomain,\n            videos: @scene.videoContainer.subObjectsByDomain,\n            viewports: @scene.viewportContainer.subObjects,\n            commonEvents: @scene.commonEventContainer.subObjects,\n            hotspots: @scene.hotspotContainer.subObjectsByDomain,\n            interpreter: @scene.interpreter,\n            choices: @scene.choices,\n            messageBoxes: messageBoxes.select((mb, i) => { visible: mb.visible, id: mb.id, message: messages[i] }),\n            backlog: @backlog,\n            variableStore: @variableStore,\n            defaults: @defaults,\n            transitionData: SceneManager.transitionData,\n            audio: { audioBuffers: AudioManager.audioBuffers, audioBuffersByLayer: AudioManager.audioBuffersByLayer, audioLayers: AudioManager.audioLayers, soundReferences: AudioManager.soundReferences },\n            messageAreas: @scene.messageAreaContainer.subObjectsByDomain\n          #  messageAreas: @scene.messageAreas.select (f) ->\n          #      if f \n          #          { \n          #              message: f.message, \n          #              layout: { dstRect: gs.Rect.fromObject(f.layout.dstRect) } \n          #          } \n          #      else \n          #          null\n        }\n        \n        #ss = window.performance.now()\n        saveGame.data = gs.ObjectCodec.encode(saveGame.data, context)\n        #console.log(window.performance.now() - ss)\n        saveGame.encodedObjectStore = context.encodedObjectStore\n\n        @saveGame = saveGame\n      \n    createSaveGameSlot: (header) ->\n        slot = {\n            \"date\": new Date().toDateString(),\n            \"chapter\": @scene.chapter.items.name,\n            \"scene\": @scene.sceneDocument.items.name,\n            \"image\": header.image\n        }\n        \n        return slot;\n        \n    createSaveGameHeader: (thumbWidth, thumbHeight) ->\n        thumbImage = @createSaveGameThumbImage(thumbWidth, thumbHeight)\n        \n        header = {\n            \"date\": new Date().toDateString(),\n            \"chapterUid\": @scene.chapter.uid,\n            \"sceneUid\": @scene.sceneDocument.uid,\n            \"image\": thumbImage?.image.toDataURL() \n        }\n        \n        thumbImage?.dispose()\n        \n        return header\n        \n    createSaveGameThumbImage: (width, height) ->\n        snapshot = ResourceManager.getBitmap(\"$snapshot\")\n        thumbImage = null\n        \n        if snapshot and snapshot.loaded\n            if width and height\n                thumbImage = new Bitmap(width, height)\n            else\n                thumbImage = new Bitmap(Graphics.width / 8, Graphics.height / 8)\n            thumbImage.stretchBlt(new Rect(0, 0, thumbImage.width, thumbImage.height), snapshot, new Rect(0, 0, snapshot.width, snapshot.height))\n            \n        return thumbImage\n      \n    storeSaveGame: (name, saveGame, header) ->\n        if header\n            GameStorage.setData(\"#{name}_Header\", JSON.stringify(header))\n            \n        GameStorage.setData(name, JSON.stringify(saveGame))\n        \n    ###*\n    * Saves the current game at the specified slot.\n    *\n    * @method save\n    * @param {number} slot - The slot where the game should be saved at.\n    * @param {number} thumbWidth - The width for the snapshot-thumb. You can specify <b>null</b> or 0 to use an auto calculated width.\n    * @param {number} thumbHeight - The height for the snapshot-thumb. You can specify <b>null</b> or 0 to use an auto calculated height.\n    ###     \n    save: (slot, thumbWidth, thumbHeight) ->\n        if @saveGame\n            header = @createSaveGameHeader(thumbWidth, thumbHeight)\n            @saveGameSlots[slot] = @createSaveGameSlot(header)\n            @storeSaveGame(\"SaveGame_#{slot}\", @saveGame, header)\n            @sceneData = {}\n            \n            return @saveGame\n    \n    restore: (saveGame) ->\n        @backlog = saveGame.data.backlog\n        @defaults = saveGame.data.defaults\n        @variableStore = saveGame.data.variableStore\n        @sceneData = saveGame.data\n        @saveGame = null\n        @loadedSaveGame = null\n        @tempFields = saveGame.data.tempFields\n        @characterParams = saveGame.data.characterParams\n        window.$tempFields = @tempFields\n        window.$dataFields.backlog = @backlog\n            \n    \n    prepareLoadGame: ->\n        AudioManager.stopAllMusic(30)\n        \n    ###*\n    * Loads the game from the specified save game slot. This method triggers\n    * a automatic scene change.\n    *\n    * @method load\n    * @param {number} slot - The slot where the game should be loaded from.\n    ###        \n    load: (slot) ->\n        return if !@saveGameSlots[slot] or @saveGameSlots[slot].date.trim().length == 0\n        \n        @prepareLoadGame()\n        @loadedSaveGame = @loadSaveGame(\"SaveGame_#{slot}\")\n        \n        \n        SceneManager.switchTo(new vn.Object_Scene())\n        SceneManager.clear()\n        \n        \n    loadSaveGame: (name) -> JSON.parse(GameStorage.getData(name))\n        \n        \n    ###*\n    * Gets the save game data for a specified slot.\n    *\n    * @method getSaveGame\n    * @param {number} slot - The slot to get the save data from.\n    * @return {Object} The save game data.\n    ###        \n    getSaveGame: (slot) -> JSON.parse(GameStorage.getData(\"SaveGame_#{slot}\"))\n    \nwindow.GameManager = new GameManager()\ngs.GameManager = window.GameManager",
        "compiledContent": "var GameManager;\n\nGameManager = (function() {\n\n  /**\n  * Manages all general things around the game like holding the game settings,\n  * manages the save/load of a game, etc.\n  *\n  * @module gs\n  * @class GameManager\n  * @memberof gs\n  * @constructor\n   */\n  function GameManager() {\n\n    /**\n    * The current scene data.\n    * @property sceneData\n    * @type Object\n     */\n    this.sceneData = {};\n\n    /**\n    * The scene viewport containing all visual objects which are part of the scene and influenced\n    * by the in-game camera.\n    * @property sceneViewport\n    * @type gs.Object_Viewport\n     */\n    this.sceneViewport = null;\n\n    /**\n    * The list of common events.\n    * @property commonEvents\n    * @type gs.Object_CommonEvent[]\n     */\n    this.commonEvents = [];\n\n    /**\n    * Indicates if the GameManager is initialized.\n    * @property commonEvents\n    * @type gs.Object_CommonEvent[]\n     */\n    this.initialized = false;\n\n    /**\n    * Temporary game settings.\n    * @property tempSettings\n    * @type Object\n     */\n    this.tempSettings = {\n      skip: false,\n      skipTime: 5,\n      loadMenuAccess: true,\n      menuAccess: true,\n      backlogAccess: true,\n      saveMenuAccess: true,\n      messageFading: {\n        animation: {\n          type: 1\n        },\n        duration: 15,\n        easing: null\n      }\n\n      /**\n      * Temporary game fields.\n      * @property tempFields\n      * @type Object\n       */\n    };\n    this.tempFields = null;\n\n    /**\n    * Stores default values for backgrounds, pictures, etc.\n    * @property defaults\n    * @type Object\n     */\n    this.defaults = {\n      background: {\n        \"duration\": 30,\n        \"origin\": 0,\n        \"zOrder\": 0,\n        \"loopVertical\": 0,\n        \"loopHorizontal\": 0,\n        \"easing\": {\n          \"type\": 0,\n          \"inOut\": 1\n        },\n        \"animation\": {\n          \"type\": 1,\n          \"movement\": 0,\n          \"mask\": {\n            \"graphic\": null,\n            \"vague\": 30\n          }\n        },\n        \"motionBlur\": {\n          \"enabled\": 0,\n          \"delay\": 2,\n          \"opacity\": 100,\n          \"dissolveSpeed\": 3\n        }\n      },\n      picture: {\n        \"appearDuration\": 30,\n        \"disappearDuration\": 30,\n        \"origin\": 0,\n        \"zOrder\": 0,\n        \"appearEasing\": {\n          \"type\": 0,\n          \"inOut\": 1\n        },\n        \"disappearEasing\": {\n          \"type\": 0,\n          \"inOut\": 1\n        },\n        \"appearAnimation\": {\n          \"type\": 1,\n          \"movement\": 0,\n          \"mask\": {\n            \"graphic\": null,\n            \"vague\": 30\n          }\n        },\n        \"disappearAnimation\": {\n          \"type\": 1,\n          \"movement\": 0,\n          \"mask\": {\n            \"graphic\": null,\n            \"vague\": 30\n          }\n        },\n        \"motionBlur\": {\n          \"enabled\": 0,\n          \"delay\": 2,\n          \"opacity\": 100,\n          \"dissolveSpeed\": 3\n        }\n      },\n      character: {\n        \"expressionDuration\": 0,\n        \"appearDuration\": 40,\n        \"disappearDuration\": 40,\n        \"origin\": 0,\n        \"zOrder\": 0,\n        \"appearEasing\": {\n          \"type\": 2,\n          \"inOut\": 2\n        },\n        \"disappearEasing\": {\n          \"type\": 1,\n          \"inOut\": 1\n        },\n        \"appearAnimation\": {\n          \"type\": 1,\n          \"movement\": 0,\n          \"mask\": {\n            \"graphic\": null,\n            \"vague\": 30\n          }\n        },\n        \"disappearAnimation\": {\n          \"type\": 1,\n          \"movement\": 0,\n          \"mask\": {\n            \"graphic\": null,\n            \"vague\": 30\n          }\n        },\n        \"motionBlur\": {\n          \"enabled\": 0,\n          \"delay\": 2,\n          \"opacity\": 100,\n          \"dissolveSpeed\": 3\n        },\n        \"changeAnimation\": {\n          \"type\": 1,\n          \"movement\": 0,\n          \"fading\": 0,\n          \"mask\": {\n            \"graphic\": null,\n            \"vague\": 30\n          }\n        },\n        \"changeEasing\": {\n          \"type\": 2,\n          \"inOut\": 2\n        }\n      },\n      text: {\n        \"appearDuration\": 30,\n        \"disappearDuration\": 30,\n        \"positionOrigin\": 0,\n        \"origin\": 0,\n        \"zOrder\": 0,\n        \"appearEasing\": {\n          \"type\": 0,\n          \"inOut\": 1\n        },\n        \"disappearEasing\": {\n          \"type\": 0,\n          \"inOut\": 1\n        },\n        \"appearAnimation\": {\n          \"type\": 1,\n          \"movement\": 0,\n          \"mask\": {\n            \"graphic\": null,\n            \"vague\": 30\n          }\n        },\n        \"disappearAnimation\": {\n          \"type\": 1,\n          \"movement\": 0,\n          \"mask\": {\n            \"graphic\": null,\n            \"vague\": 30\n          }\n        },\n        \"motionBlur\": {\n          \"enabled\": 0,\n          \"delay\": 2,\n          \"opacity\": 100,\n          \"dissolveSpeed\": 3\n        }\n      },\n      video: {\n        \"appearDuration\": 30,\n        \"disappearDuration\": 30,\n        \"origin\": 0,\n        \"zOrder\": 0,\n        \"appearEasing\": {\n          \"type\": 0,\n          \"inOut\": 1\n        },\n        \"disappearEasing\": {\n          \"type\": 0,\n          \"inOut\": 1\n        },\n        \"appearAnimation\": {\n          \"type\": 1,\n          \"movement\": 0,\n          \"mask\": {\n            \"graphic\": null,\n            \"vague\": 30\n          }\n        },\n        \"disappearAnimation\": {\n          \"type\": 1,\n          \"movement\": 0,\n          \"mask\": {\n            \"graphic\": null,\n            \"vague\": 30\n          }\n        },\n        \"motionBlur\": {\n          \"enabled\": 0,\n          \"delay\": 2,\n          \"opacity\": 100,\n          \"dissolveSpeed\": 3\n        }\n      },\n      live2d: {\n        \"motionFadeInTime\": 1000,\n        \"appearDuration\": 30,\n        \"disappearDuration\": 30,\n        \"zOrder\": 0,\n        \"appearEasing\": {\n          \"type\": 0,\n          \"inOut\": 1\n        },\n        \"disappearEasing\": {\n          \"type\": 0,\n          \"inOut\": 1\n        },\n        \"appearAnimation\": {\n          \"type\": 1,\n          \"movement\": 0,\n          \"mask\": {\n            \"graphic\": null,\n            \"vague\": 30\n          }\n        },\n        \"disappearAnimation\": {\n          \"type\": 1,\n          \"movement\": 0,\n          \"mask\": {\n            \"graphic\": null,\n            \"vague\": 30\n          }\n        }\n      },\n      messageBox: {\n        \"appearDuration\": 30,\n        \"disappearDuration\": 30,\n        \"zOrder\": 0,\n        \"appearEasing\": {\n          \"type\": 0,\n          \"inOut\": 1\n        },\n        \"disappearEasing\": {\n          \"type\": 0,\n          \"inOut\": 1\n        },\n        \"appearAnimation\": {\n          \"type\": 0,\n          \"movement\": 3,\n          \"mask\": {\n            \"graphic\": null,\n            \"vague\": 30\n          }\n        },\n        \"disappearAnimation\": {\n          \"type\": 0,\n          \"movement\": 3,\n          \"mask\": {\n            \"graphic\": null,\n            \"vague\": 30\n          }\n        }\n      },\n      audio: {\n        \"musicFadeInDuration\": 0,\n        \"musicFadeOutDuration\": 0,\n        \"musicVolume\": 100,\n        \"musicPlaybackRate\": 100,\n        \"soundVolume\": 100,\n        \"soundPlaybackRate\": 100,\n        \"voiceVolume\": 100,\n        \"voicePlaybackRate\": 100\n      }\n    };\n\n    /**\n    * The game's backlog.\n    * @property backlog\n    * @type Object[]\n     */\n    this.backlog = [];\n\n    /**\n    * Character parameters by character ID.\n    * @property characterParams\n    * @type Object[]\n     */\n    this.characterParams = [];\n\n    /**\n    * The game's chapter\n    * @property chapters\n    * @type gs.Document[]\n     */\n    this.chapters = [];\n\n    /**\n    * The game's current displayed messages. Especially in NVL mode the messages \n    * of the current page are stored here.\n    * @property messages\n    * @type Object[]\n     */\n    this.messages = [];\n\n    /**\n    * Count of save slots. Default is 100.\n    * @property saveSlotCount\n    * @type number\n     */\n    this.saveSlotCount = 100;\n\n    /**\n    * The index of save games. Contains the header-info for each save game slot.\n    * @property saveGameSlots\n    * @type Object[]\n     */\n    this.saveGameSlots = [];\n\n    /**\n    * Stores global data like the state of persistent game variables.\n    * @property globalData\n    * @type Object\n     */\n    this.globalData = null;\n\n    /**\n    * Indicates if the game runs in editor's live-preview.\n    * @property inLivePreview\n    * @type Object\n     */\n    this.inLivePreview = false;\n  }\n\n\n  /**\n  * Initializes the GameManager, should be called before the actual game starts.\n  *\n  * @method initialize\n   */\n\n  GameManager.prototype.initialize = function() {\n    var character, i, j, k, l, len, len1, param, ref, ref1, ref2, ref3, ref4, ref5, ref6;\n    this.initialized = true;\n    this.inLivePreview = $PARAMS.preview != null;\n    this.saveSlotCount = RecordManager.system.saveSlotCount || 100;\n    this.tempFields = new gs.GameTemp();\n    window.$tempFields = this.tempFields;\n    this.createSaveGameIndex();\n    this.variableStore = new gs.VariableStore();\n    DataManager.getDocumentsByType(\"persistent_variables\");\n    this.variableStore.setupDomains(DataManager.getDocumentsByType(\"global_variables\").select(function(v) {\n      return v.items.domain || \"\";\n    }));\n    this.variableStore.persistentNumbersByDomain = (ref = this.globalData.persistentNumbers) != null ? ref : this.variableStore.persistentNumbersByDomain;\n    this.variableStore.persistentBooleansByDomain = (ref1 = this.globalData.persistentBooleans) != null ? ref1 : this.variableStore.persistentBooleansByDomain;\n    this.variableStore.persistentStringsByDomain = (ref2 = this.globalData.persistentStrings) != null ? ref2 : this.variableStore.persistentStringsByDomain;\n    this.variableStore.persistentListsByDomain = (ref3 = this.globalData.persistentLists) != null ? ref3 : this.variableStore.persistentListsByDomain;\n    this.sceneViewport = new gs.Object_Viewport(new Viewport(0, 0, Graphics.width, Graphics.height, Graphics.viewport));\n    ref4 = RecordManager.charactersArray;\n    for (j = 0, len = ref4.length; j < len; j++) {\n      character = ref4[j];\n      if (character != null) {\n        this.characterParams[character.index] = {};\n        if (character.params != null) {\n          ref5 = character.params;\n          for (k = 0, len1 = ref5.length; k < len1; k++) {\n            param = ref5[k];\n            this.characterParams[character.index][param.name] = param.value;\n          }\n        }\n      }\n    }\n    this.setupCommonEvents();\n    for (i = l = 0, ref6 = RecordManager.characters; 0 <= ref6 ? l < ref6 : l > ref6; i = 0 <= ref6 ? ++l : --l) {\n      this.settings.voicesPerCharacter[i] = 100;\n    }\n    this.chapters = DataManager.getDocumentsByType(\"vn.chapter\");\n    return this.chapters.sort(function(a, b) {\n      if (a.items.order > b.items.order) {\n        return 1;\n      } else if (a.items.order < b.items.order) {\n        return -1;\n      } else {\n        return 0;\n      }\n    });\n  };\n\n\n  /**\n  * Sets up common events.\n  *\n  * @method setupCommonEvents\n   */\n\n  GameManager.prototype.setupCommonEvents = function() {\n    var event, j, k, len, len1, object, ref, ref1, results;\n    ref = this.commonEvents;\n    for (j = 0, len = ref.length; j < len; j++) {\n      event = ref[j];\n      if (event != null) {\n        event.dispose();\n      }\n    }\n    this.commonEvents = [];\n    ref1 = RecordManager.commonEvents;\n    results = [];\n    for (k = 0, len1 = ref1.length; k < len1; k++) {\n      event = ref1[k];\n      if (!event) {\n        continue;\n      }\n      if (event.startCondition === 1 && event.autoPreload) {\n        gs.ResourceLoader.loadEventCommandsGraphics(event.commands);\n      }\n      object = new gs.Object_CommonEvent();\n      object.record = event;\n      object.rid = event.index;\n      this.commonEvents[event.index] = object;\n      results.push(this.commonEvents.push(object));\n    }\n    return results;\n  };\n\n\n  /**\n  * Sets up cursor depending on system settings.\n  *\n  * @method setupCursor\n   */\n\n  GameManager.prototype.setupCursor = function() {\n    var bitmap, ref;\n    if ((ref = RecordManager.system.cursor) != null ? ref.name : void 0) {\n      bitmap = ResourceManager.getBitmap(\"Graphics/Pictures/\" + RecordManager.system.cursor.name);\n      return Graphics.setCursorBitmap(bitmap, RecordManager.system.cursor.hx, RecordManager.system.cursor.hy);\n    } else {\n      return Graphics.setCursorBitmap(null);\n    }\n  };\n\n\n  /**\n  * Disposes the GameManager. Should be called before quit the game.\n  *\n  * @method dispose\n   */\n\n  GameManager.prototype.dispose = function() {};\n\n\n  /**\n  * Quits the game. The implementation depends on the platform. So for example on mobile\n  * devices this method has no effect.\n  *\n  * @method exit\n   */\n\n  GameManager.prototype.exit = function() {\n    return Application.exit();\n  };\n\n\n  /**\n  * Resets the GameManager by disposing and re-initializing it.\n  *\n  * @method reset\n   */\n\n  GameManager.prototype.reset = function() {\n    this.initialized = false;\n    this.interpreter = null;\n    this.dispose();\n    return this.initialize();\n  };\n\n\n  /**\n  * Starts a new game.\n  *\n  * @method newGame\n   */\n\n  GameManager.prototype.newGame = function() {\n    this.messages = [];\n    this.variableStore.clearAllGlobalVariables();\n    this.variableStore.clearAllLocalVariables();\n    this.tempSettings.skip = false;\n    this.tempFields.clear();\n    this.tempFields.inGame = true;\n    this.setupCommonEvents();\n    this.tempSettings.menuAccess = true;\n    this.tempSettings.saveMenuAccess = true;\n    this.tempSettings.loadMenuAccess = true;\n    return this.tempSettings.backlogAccess = true;\n  };\n\n\n  /**\n  * Exists the game and resets the GameManager which is important before going back to\n  * the main menu or title screen.\n  *\n  * @method exitGame\n   */\n\n  GameManager.prototype.exitGame = function() {\n    this.tempFields.inGame = false;\n    return this.tempFields.isExitingGame = true;\n  };\n\n\n  /**\n  * Updates the GameManager. Should be called once per frame.\n  *\n  * @method update\n   */\n\n  GameManager.prototype.update = function() {};\n\n\n  /**\n  * Creates the index of all save-games. Should be called whenever a new save game\n  * is created.\n  *\n  * @method createSaveGameIndex\n  * @protected\n   */\n\n  GameManager.prototype.createSaveGameIndex = function() {\n    var chaper, chapter, header, i, image, j, ref, scene;\n    this.saveGameSlots = [];\n    for (i = j = 0, ref = this.saveSlotCount; 0 <= ref ? j < ref : j > ref; i = 0 <= ref ? ++j : --j) {\n      if (GameStorage.exists(\"SaveGame_\" + i + \"_Header\")) {\n        header = GameStorage.getObject(\"SaveGame_\" + i + \"_Header\");\n        chapter = DataManager.getDocument(header.chapterUid);\n        scene = DataManager.getDocumentSummary(header.sceneUid);\n        image = header.image;\n      } else {\n        header = null;\n        chaper = null;\n        scene = null;\n      }\n      if ((chapter != null) && (scene != null) && !this.inLivePreview) {\n        this.saveGameSlots.push({\n          date: header.date,\n          chapter: chapter.items.name || \"DELETED\",\n          scene: scene.items.name || \"DELETED\",\n          image: image\n        });\n      } else {\n        this.saveGameSlots.push({\n          \"date\": \"\",\n          \"chapter\": \"\",\n          \"scene\": \"\",\n          \"image\": null\n        });\n      }\n    }\n    return this.saveGameSlots;\n  };\n\n\n  /**\n  * Resets the game's settings to its default values.\n  *\n  * @method resetSettings\n   */\n\n  GameManager.prototype.resetSettings = function() {\n    var i, j, ref;\n    this.settings = {\n      version: 342,\n      renderer: 0,\n      filter: 1,\n      confirmation: true,\n      adjustAspectRatio: false,\n      allowSkip: true,\n      allowSkipUnreadMessages: true,\n      allowVideoSkip: true,\n      skipVoiceOnAction: true,\n      allowChoiceSkip: false,\n      voicesByCharacter: [],\n      timeMessageToVoice: true,\n      \"autoMessage\": {\n        enabled: false,\n        time: 0,\n        waitForVoice: true,\n        stopOnAction: false\n      },\n      \"voiceEnabled\": true,\n      \"bgmEnabled\": true,\n      \"soundEnabled\": true,\n      \"voiceVolume\": 100,\n      \"bgmVolume\": 100,\n      \"seVolume\": 100,\n      \"messageSpeed\": 4,\n      \"fullScreen\": false,\n      \"aspectRatio\": 0\n    };\n    this.saveGameSlots = [];\n    for (i = j = 0, ref = this.saveSlotCount; 0 <= ref ? j < ref : j > ref; i = 0 <= ref ? ++j : --j) {\n      GameStorage.remove(\"SaveGame_\" + i + \"_Header\");\n      GameStorage.remove(\"SaveGame_\" + i);\n      this.saveGameSlots.push({\n        \"date\": \"\",\n        \"chapter\": \"\",\n        \"scene\": \"\",\n        \"thumb\": \"\"\n      });\n    }\n    return GameStorage.setObject(\"settings\", this.settings);\n  };\n\n\n  /**\n  * Saves current game settings.\n  *\n  * @method saveSettings\n   */\n\n  GameManager.prototype.saveSettings = function() {\n    return GameStorage.setObject(\"settings\", this.settings);\n  };\n\n\n  /**\n  * Saves current global data.\n  *\n  * @method saveGlobalData\n   */\n\n  GameManager.prototype.saveGlobalData = function() {\n    this.globalData.persistentNumbers = this.variableStore.persistentNumbersByDomain;\n    this.globalData.persistentLists = this.variableStore.persistentListsByDomain;\n    this.globalData.persistentBooleans = this.variableStore.persistentBooleansByDomain;\n    this.globalData.persistentStrings = this.variableStore.persistentStringsByDomain;\n    return GameStorage.setObject(\"globalData\", this.globalData);\n  };\n\n\n  /**\n  * Resets current global data. All stored data about read messages, persistent variables and\n  * CG gallery will be deleted.\n  *\n  * @method resetGlobalData\n   */\n\n  GameManager.prototype.resetGlobalData = function() {\n    var cg, data, i, j, len, ref, ref1, version;\n    version = (ref = this.globalData) != null ? ref.version : void 0;\n    data = this.globalData;\n    this.globalData = {\n      messages: {},\n      cgGallery: {},\n      version: 342,\n      persistentNumbers: {\n        \"0\": [],\n        \"com.degica.vnm.default\": []\n      },\n      persistentStrings: {\n        \"0\": [],\n        \"com.degica.vnm.default\": []\n      },\n      persistentBooleans: {\n        \"0\": [],\n        \"com.degica.vnm.default\": []\n      },\n      persistentLists: {\n        \"0\": [],\n        \"com.degica.vnm.default\": []\n      }\n    };\n    ref1 = RecordManager.cgGalleryArray;\n    for (i = j = 0, len = ref1.length; j < len; i = ++j) {\n      cg = ref1[i];\n      if (cg != null) {\n        this.globalData.cgGallery[cg.index] = {\n          unlocked: false\n        };\n      }\n    }\n    GameStorage.setObject(\"globalData\", this.globalData);\n    return this.migrateGlobalData(data, version + 1, this.globalData.version);\n  };\n\n  GameManager.prototype.migrateGlobalData = function(data, from, to) {\n    var i, j, ref, ref1, results;\n    results = [];\n    for (i = j = ref = from, ref1 = to; ref <= ref1 ? j <= ref1 : j >= ref1; i = ref <= ref1 ? ++j : --j) {\n      if (this[\"migrateGlobalData\" + i] != null) {\n        results.push(this[\"migrateGlobalData\" + i](data));\n      } else {\n        results.push(void 0);\n      }\n    }\n    return results;\n  };\n\n  GameManager.prototype.migrateGlobalData342 = function(data) {\n    if (data != null) {\n      this.globalData.persistentNumbers[0] = data.persistentNumbers[0] || [];\n      this.globalData.persistentStrings[0] = data.persistentStrings[0] || [];\n      this.globalData.persistentBooleans[0] = data.persistentBooleans[0] || [];\n      this.globalData.persistentLists[0] = data.persistentLists[0] || [];\n      this.globalData.persistentNumbers[\"com.degica.vnm.default\"] = data.persistentNumbers[0] || [];\n      this.globalData.persistentStrings[\"com.degica.vnm.default\"] = data.persistentStrings[0] || [];\n      this.globalData.persistentBooleans[\"com.degica.vnm.default\"] = data.persistentBooleans[0] || [];\n      return this.globalData.persistentLists[\"com.degica.vnm.default\"] = data.persistentLists[0] || [];\n    }\n  };\n\n  GameManager.prototype.readSaveGame = function(saveGame) {};\n\n  GameManager.prototype.writeSaveGame = function(saveGame) {};\n\n  GameManager.prototype.prepareSaveGame = function(snapshot) {\n    var context, messageBoxIds, messageBoxes, messageIds, messages, saveGame, sceneData;\n    if (snapshot) {\n      snapshot = ResourceManager.getCustomBitmap(\"$snapshot\");\n      if (snapshot != null) {\n        snapshot.dispose();\n      }\n      ResourceManager.setCustomBitmap(\"$snapshot\", Graphics.snapshot());\n    }\n    context = new gs.ObjectCodecContext();\n    context.decodedObjectStore.push(Graphics.viewport);\n    context.decodedObjectStore.push(this.scene);\n    context.decodedObjectStore.push(this.scene.behavior);\n    messageBoxIds = [\"messageBox\", \"nvlMessageBox\", \"messageMenu\"];\n    messageIds = [\"gameMessage_message\", \"nvlGameMessage_message\"];\n    messageBoxes = messageBoxIds.select((function(_this) {\n      return function(id) {\n        return _this.scene.behavior.objectManager.objectById(id);\n      };\n    })(this));\n    messages = messageIds.select((function(_this) {\n      return function(id) {\n        return _this.scene.behavior.objectManager.objectById(id);\n      };\n    })(this));\n    sceneData = {};\n    saveGame = {};\n    saveGame.encodedObjectStore = null;\n    saveGame.sceneUid = this.scene.sceneDocument.uid;\n    saveGame.data = {\n      resourceContext: this.scene.behavior.resourceContext.toDataBundle(),\n      currentCharacter: this.scene.currentCharacter,\n      characterParams: this.characterParams,\n      frameCount: Graphics.frameCount,\n      tempFields: this.tempFields,\n      viewport: this.scene.viewport,\n      characters: this.scene.characters,\n      characterNames: RecordManager.charactersArray.select(function(c) {\n        return {\n          name: c.name,\n          index: c.index\n        };\n      }),\n      backgrounds: this.scene.backgrounds,\n      pictures: this.scene.pictureContainer.subObjectsByDomain,\n      texts: this.scene.textContainer.subObjectsByDomain,\n      videos: this.scene.videoContainer.subObjectsByDomain,\n      viewports: this.scene.viewportContainer.subObjects,\n      commonEvents: this.scene.commonEventContainer.subObjects,\n      hotspots: this.scene.hotspotContainer.subObjectsByDomain,\n      interpreter: this.scene.interpreter,\n      choices: this.scene.choices,\n      messageBoxes: messageBoxes.select((function(_this) {\n        return function(mb, i) {\n          return {\n            visible: mb.visible,\n            id: mb.id,\n            message: messages[i]\n          };\n        };\n      })(this)),\n      backlog: this.backlog,\n      variableStore: this.variableStore,\n      defaults: this.defaults,\n      transitionData: SceneManager.transitionData,\n      audio: {\n        audioBuffers: AudioManager.audioBuffers,\n        audioBuffersByLayer: AudioManager.audioBuffersByLayer,\n        audioLayers: AudioManager.audioLayers,\n        soundReferences: AudioManager.soundReferences\n      },\n      messageAreas: this.scene.messageAreaContainer.subObjectsByDomain\n    };\n    saveGame.data = gs.ObjectCodec.encode(saveGame.data, context);\n    saveGame.encodedObjectStore = context.encodedObjectStore;\n    return this.saveGame = saveGame;\n  };\n\n  GameManager.prototype.createSaveGameSlot = function(header) {\n    var slot;\n    slot = {\n      \"date\": new Date().toDateString(),\n      \"chapter\": this.scene.chapter.items.name,\n      \"scene\": this.scene.sceneDocument.items.name,\n      \"image\": header.image\n    };\n    return slot;\n  };\n\n  GameManager.prototype.createSaveGameHeader = function(thumbWidth, thumbHeight) {\n    var header, thumbImage;\n    thumbImage = this.createSaveGameThumbImage(thumbWidth, thumbHeight);\n    header = {\n      \"date\": new Date().toDateString(),\n      \"chapterUid\": this.scene.chapter.uid,\n      \"sceneUid\": this.scene.sceneDocument.uid,\n      \"image\": thumbImage != null ? thumbImage.image.toDataURL() : void 0\n    };\n    if (thumbImage != null) {\n      thumbImage.dispose();\n    }\n    return header;\n  };\n\n  GameManager.prototype.createSaveGameThumbImage = function(width, height) {\n    var snapshot, thumbImage;\n    snapshot = ResourceManager.getBitmap(\"$snapshot\");\n    thumbImage = null;\n    if (snapshot && snapshot.loaded) {\n      if (width && height) {\n        thumbImage = new Bitmap(width, height);\n      } else {\n        thumbImage = new Bitmap(Graphics.width / 8, Graphics.height / 8);\n      }\n      thumbImage.stretchBlt(new Rect(0, 0, thumbImage.width, thumbImage.height), snapshot, new Rect(0, 0, snapshot.width, snapshot.height));\n    }\n    return thumbImage;\n  };\n\n  GameManager.prototype.storeSaveGame = function(name, saveGame, header) {\n    if (header) {\n      GameStorage.setData(name + \"_Header\", JSON.stringify(header));\n    }\n    return GameStorage.setData(name, JSON.stringify(saveGame));\n  };\n\n\n  /**\n  * Saves the current game at the specified slot.\n  *\n  * @method save\n  * @param {number} slot - The slot where the game should be saved at.\n  * @param {number} thumbWidth - The width for the snapshot-thumb. You can specify <b>null</b> or 0 to use an auto calculated width.\n  * @param {number} thumbHeight - The height for the snapshot-thumb. You can specify <b>null</b> or 0 to use an auto calculated height.\n   */\n\n  GameManager.prototype.save = function(slot, thumbWidth, thumbHeight) {\n    var header;\n    if (this.saveGame) {\n      header = this.createSaveGameHeader(thumbWidth, thumbHeight);\n      this.saveGameSlots[slot] = this.createSaveGameSlot(header);\n      this.storeSaveGame(\"SaveGame_\" + slot, this.saveGame, header);\n      this.sceneData = {};\n      return this.saveGame;\n    }\n  };\n\n  GameManager.prototype.restore = function(saveGame) {\n    this.backlog = saveGame.data.backlog;\n    this.defaults = saveGame.data.defaults;\n    this.variableStore = saveGame.data.variableStore;\n    this.sceneData = saveGame.data;\n    this.saveGame = null;\n    this.loadedSaveGame = null;\n    this.tempFields = saveGame.data.tempFields;\n    this.characterParams = saveGame.data.characterParams;\n    window.$tempFields = this.tempFields;\n    return window.$dataFields.backlog = this.backlog;\n  };\n\n  GameManager.prototype.prepareLoadGame = function() {\n    return AudioManager.stopAllMusic(30);\n  };\n\n\n  /**\n  * Loads the game from the specified save game slot. This method triggers\n  * a automatic scene change.\n  *\n  * @method load\n  * @param {number} slot - The slot where the game should be loaded from.\n   */\n\n  GameManager.prototype.load = function(slot) {\n    if (!this.saveGameSlots[slot] || this.saveGameSlots[slot].date.trim().length === 0) {\n      return;\n    }\n    this.prepareLoadGame();\n    this.loadedSaveGame = this.loadSaveGame(\"SaveGame_\" + slot);\n    SceneManager.switchTo(new vn.Object_Scene());\n    return SceneManager.clear();\n  };\n\n  GameManager.prototype.loadSaveGame = function(name) {\n    return JSON.parse(GameStorage.getData(name));\n  };\n\n\n  /**\n  * Gets the save game data for a specified slot.\n  *\n  * @method getSaveGame\n  * @param {number} slot - The slot to get the save data from.\n  * @return {Object} The save game data.\n   */\n\n  GameManager.prototype.getSaveGame = function(slot) {\n    return JSON.parse(GameStorage.getData(\"SaveGame_\" + slot));\n  };\n\n  return GameManager;\n\n})();\n\nwindow.GameManager = new GameManager();\n\ngs.GameManager = window.GameManager;\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU9BLElBQUE7O0FBQU07O0FBQ0Y7Ozs7Ozs7OztFQVNhLHFCQUFBOztBQUNUOzs7OztJQUtBLElBQUMsQ0FBQSxTQUFELEdBQWE7O0FBRWI7Ozs7OztJQU1BLElBQUMsQ0FBQSxhQUFELEdBQWlCOztBQUVqQjs7Ozs7SUFLQSxJQUFDLENBQUEsWUFBRCxHQUFnQjs7QUFFaEI7Ozs7O0lBS0EsSUFBQyxDQUFBLFdBQUQsR0FBZTs7QUFFZjs7Ozs7SUFLQSxJQUFDLENBQUEsWUFBRCxHQUFnQjtNQUFBLElBQUEsRUFBTSxLQUFOO01BQWEsUUFBQSxFQUFVLENBQXZCO01BQTBCLGNBQUEsRUFBZ0IsSUFBMUM7TUFBZ0QsVUFBQSxFQUFZLElBQTVEO01BQWtFLGFBQUEsRUFBZSxJQUFqRjtNQUF1RixjQUFBLEVBQWdCLElBQXZHO01BQTZHLGFBQUEsRUFBZTtRQUFFLFNBQUEsRUFBVztVQUFFLElBQUEsRUFBTSxDQUFSO1NBQWI7UUFBMEIsUUFBQSxFQUFVLEVBQXBDO1FBQXdDLE1BQUEsRUFBUSxJQUFoRDs7O0FBRTVJOzs7O1NBRmdCOztJQU9oQixJQUFDLENBQUEsVUFBRCxHQUFjOztBQUVkOzs7OztJQUtBLElBQUMsQ0FBQSxRQUFELEdBQVk7TUFDUixVQUFBLEVBQVk7UUFBRSxVQUFBLEVBQVksRUFBZDtRQUFrQixRQUFBLEVBQVUsQ0FBNUI7UUFBK0IsUUFBQSxFQUFVLENBQXpDO1FBQTRDLGNBQUEsRUFBZ0IsQ0FBNUQ7UUFBK0QsZ0JBQUEsRUFBa0IsQ0FBakY7UUFBb0YsUUFBQSxFQUFVO1VBQUUsTUFBQSxFQUFRLENBQVY7VUFBYSxPQUFBLEVBQVMsQ0FBdEI7U0FBOUY7UUFBeUgsV0FBQSxFQUFhO1VBQUUsTUFBQSxFQUFRLENBQVY7VUFBYSxVQUFBLEVBQVksQ0FBekI7VUFBNEIsTUFBQSxFQUFRO1lBQUUsU0FBQSxFQUFXLElBQWI7WUFBbUIsT0FB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bUIsUUFBUSxDQUFDLElBQUksQ0FBQztJQUNqQyxNQUFNLENBQUMsV0FBUCxHQUFxQixJQUFDLENBQUE7V0FDdEIsTUFBTSxDQUFDLFdBQVcsQ0FBQyxPQUFuQixHQUE2QixJQUFDLENBQUE7RUFWekI7O3dCQWFULGVBQUEsR0FBaUIsU0FBQTtXQUNiLFlBQVksQ0FBQyxZQUFiLENBQTBCLEVBQTFCO0VBRGE7OztBQUdqQjs7Ozs7Ozs7d0JBT0EsSUFBQSxHQUFNLFNBQUMsSUFBRDtJQUNGLElBQVUsQ0FBQyxJQUFDLENBQUEsYUFBYyxDQUFBLElBQUEsQ0FBaEIsSUFBeUIsSUFBQyxDQUFBLGFBQWMsQ0FBQSxJQUFBLENBQUssQ0FBQyxJQUFJLENBQUMsSUFBMUIsQ0FBQSxDQUFnQyxDQUFDLE1BQWpDLEtBQTJDLENBQTlFO0FBQUEsYUFBQTs7SUFFQSxJQUFDLENBQUEsZUFBRCxDQUFBO0lBQ0EsSUFBQyxDQUFBLGNBQUQsR0FBa0IsSUFBQyxDQUFBLFlBQUQsQ0FBYyxXQUFBLEdBQVksSUFBMUI7SUFHbEIsWUFBWSxDQUFDLFFBQWIsQ0FBMEIsSUFBQSxFQUFFLENBQUMsWUFBSCxDQUFBLENBQTFCO1dBQ0EsWUFBWSxDQUFDLEtBQWIsQ0FBQTtFQVJFOzt3QkFXTixZQUFBLEdBQWMsU0FBQyxJQUFEO1dBQVUsSUFBSSxDQUFDLEtBQUwsQ0FBVyxXQUFXLENBQUMsT0FBWixDQUFvQixJQUFwQixDQUFYO0VBQVY7OztBQUdkOzs7Ozs7Ozt3QkFPQSxXQUFBLEdBQWEsU0FBQyxJQUFEO1dBQVUsSUFBSSxDQUFDLEtBQUwsQ0FBVyxXQUFXLENBQUMsT0FBWixDQUFvQixXQUFBLEdBQVksSUFBaEMsQ0FBWDtFQUFWOzs7Ozs7QUFFakIsTUFBTSxDQUFDLFdBQVAsR0FBeUIsSUFBQSxXQUFBLENBQUE7O0FBQ3pCLEVBQUUsQ0FBQyxXQUFILEdBQWlCLE1BQU0sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuI1xuIyAgIFNjcmlwdDogR2FtZU1hbmFnZXJcbiNcbiMgICAkJENPUFlSSUdIVCQkXG4jXG4jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmNsYXNzIEdhbWVNYW5hZ2VyXG4gICAgIyMjKlxuICAgICogTWFuYWdlcyBhbGwgZ2VuZXJhbCB0aGluZ3MgYXJvdW5kIHRoZSBnYW1lIGxpa2UgaG9sZGluZyB0aGUgZ2FtZSBzZXR0aW5ncyxcbiAgICAqIG1hbmFnZXMgdGhlIHNhdmUvbG9hZCBvZiBhIGdhbWUsIGV0Yy5cbiAgICAqXG4gICAgKiBAbW9kdWxlIGdzXG4gICAgKiBAY2xhc3MgR2FtZU1hbmFnZXJcbiAgICAqIEBtZW1iZXJvZiBnc1xuICAgICogQGNvbnN0cnVjdG9yXG4gICAgIyMjXG4gICAgY29uc3RydWN0b3I6IC0+XG4gICAgICAgICMjIypcbiAgICAgICAgKiBUaGUgY3VycmVudCBzY2VuZSBkYXRhLlxuICAgICAgICAqIEBwcm9wZXJ0eSBzY2VuZURhdGFcbiAgICAgICAgKiBAdHlwZSBPYmplY3RcbiAgICAgICAgIyMjIFxuICAgICAgICBAc2NlbmVEYXRhID0ge31cbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBUaGUgc2NlbmUgdmlld3BvcnQgY29udGFpbmluZyBhbGwgdmlzdWFsIG9iamVjdHMgd2hpY2ggYXJlIHBhcnQgb2YgdGhlIHNjZW5lIGFuZCBpbmZsdWVuY2VkXG4gICAgICAgICogYnkgdGhlIGluLWdhbWUgY2FtZXJhLlxuICAgICAgICAqIEBwcm9wZXJ0eSBzY2VuZVZpZXdwb3J0XG4gICAgICAgICogQHR5cGUgZ3MuT2JqZWN0X1ZpZXdwb3J0XG4gICAgICAgICMjI1xuICAgICAgICBAc2NlbmVWaWV3cG9ydCA9IG51bGxcbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBUaGUgbGlzdCBvZiBjb21tb24gZXZlbnRzLlxuICAgICAgICAqIEBwcm9wZXJ0eSBjb21tb25FdmVudHNcbiAgICAgICAgKiBAdHlwZSBncy5PYmplY3RfQ29tbW9uRXZlbnRbXVxuICAgICAgICAjIyMgXG4gICAgICAgIEBjb21tb25FdmVudHMgPSBbXVxuICAgICAgICBcbiAgICAgICAgIyMjKlxuICAgICAgICAqIEluZGljYXRlcyBpZiB0aGUgR2FtZU1hbmFnZXIgaXMgaW5pdGlhbGl6ZWQuXG4gICAgICAgICogQHByb3BlcnR5IGNvbW1vbkV2ZW50c1xuICAgICAgICAqIEB0eXBlIGdzLk9iamVjdF9Db21tb25FdmVudFtdXG4gICAgICAgICMjIyBcbiAgICAgICAgQGluaXRpYWxpemVkID0gbm9cbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBUZW1wb3JhcnkgZ2FtZSBzZXR0aW5ncy5cbiAgICAgICAgKiBAcHJvcGVydHkgdGVtcFNldHRpbmdzXG4gICAgICAgICogQHR5cGUgT2JqZWN0XG4gICAgICAgICMjIyBcbiAgICAgICAgQHRlbXBTZXR0aW5ncyA9IHNraXA6IGZhbHNlLCBza2lwVGltZTogNSwgbG9hZE1lbnVBY2Nlc3M6IHRydWUsIG1lbnVBY2Nlc3M6IHRydWUsIGJhY2tsb2dBY2Nlc3M6IHRydWUsIHNhdmVNZW51QWNjZXNzOiB0cnVlLCBtZXNzYWdlRmFkaW5nOiB7IGFuaW1hdGlvbjogeyB0eXBlOiAxIH0sIGR1cmF0aW9uOiAxNSwgZWFzaW5nOiBudWxsIH1cbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBUZW1wb3JhcnkgZ2FtZSBmaWVsZHMuXG4gICAgICAgICogQHByb3BlcnR5IHRlbXBGaWVsZHNcbiAgICAgICAgKiBAdHlwZSBPYmplY3RcbiAgICAgICAgIyMjIFxuICAgICAgICBAdGVtcEZpZWxkcyA9IG51bGxcbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBTdG9yZXMgZGVmYXVsdCB2YWx1ZXMgZm9yIGJhY2tncm91bmRzLCBwaWN0dXJlcywgZXRjLlxuICAgICAgICAqIEBwcm9wZXJ0eSBkZWZhdWx0c1xuICAgICAgICAqIEB0eXBlIE9iamVjdFxuICAgICAgICAjIyNcbiAgICAgICAgQGRlZmF1bHRzID0geyBcbiAgICAgICAgICAgIGJhY2tncm91bmQ6IHsgXCJkdXJhdGlvblwiOiAzMCwgXCJvcmlnaW5cIjogMCwgXCJ6T3JkZXJcIjogMCwgXCJsb29wVmVydGljYWxcIjogMCwgXCJsb29wSG9yaXpvbnRhbFwiOiAwLCBcImVhc2luZ1wiOiB7IFwidHlwZVwiOiAwLCBcImluT3V0XCI6IDEgfSwgXCJhbmltYXRpb25cIjogeyBcInR5cGVcIjogMSwgXCJtb3ZlbWVudFwiOiAwLCBcIm1hc2tcIjogeyBcImdyYXBoaWNcIjogbnVsbCwgXCJ2YWd1ZVwiOiAzMCB9IH0sIFwibW90aW9uQmx1clwiOiB7IFwiZW5hYmxlZFwiOiAwLCBcImRlbGF5XCI6IDIsIFwib3BhY2l0eVwiOiAxMDAsIFwiZGlzc29sdmVTcGVlZFwiOiAzIH0gfSxcbiAgICAgICAgICAgIHBpY3R1cmU6IHsgXCJhcHBlYXJEdXJhdGlvblwiOiAzMCwgXCJkaXNhcHBlYXJEdXJhdGlvblwiOiAzMCwgXCJvcmlnaW5cIjogMCwgXCJ6T3JkZXJcIjogMCwgXCJhcHBlYXJFYXNpbmdcIjogeyBcInR5cGVcIjogMCwgXCJpbk91dFwiOiAxIH0sIFwiZGlzYXBwZWFyRWFzaW5nXCI6IHsgXCJ0eXBlXCI6IDAsIFwiaW5PdXRcIjogMSB9LCBcImFwcGVhckFuaW1hdGlvblwiOiB7IFwidHlwZVwiOiAxLCBcIm1vdmVtZW50XCI6IDAsIFwibWFza1wiOiB7IFwiZ3JhcGhpY1wiOiBudWxsLCBcInZhZ3VlXCI6IDMwIH0gfSwgXCJkaXNhcHBlYXJBbmltYXRpb25cIjogeyBcInR5cGVcIjogMSwgXCJtb3ZlbWVudFwiOiAwLCBcIm1hc2tcIjogeyBcImdyYXBoaWNcIjogbnVsbCwgXCJ2YWd1ZVwiOiAzMCB9IH0sIFwibW90aW9uQmx1clwiOiB7IFwiZW5hYmxlZFwiOiAwLCBcImRlbGF5XCI6IDIsIFwib3BhY2l0eVwiOiAxMDAsIFwiZGlzc29sdmVTcGVlZFwiOiAzIH0gfSxcbiAgICAgICAgICAgIGNoYXJhY3RlcjogeyBcImV4cHJlc3Npb25EdXJhdGlvblwiOiAwLCBcImFwcGVhckR1cmF0aW9uXCI6IDQwLCBcImRpc2FwcGVhckR1cmF0aW9uXCI6IDQwLCBcIm9yaWdpblwiOiAwLCBcInpPcmRlclwiOiAwLCBcImFwcGVhckVhc2luZ1wiOiB7IFwidHlwZVwiOiAyLCBcImluT3V0XCI6IDIgfSwgXCJkaXNhcHBlYXJFYXNpbmdcIjogeyBcInR5cGVcIjogMSwgXCJpbk91dFwiOiAxIH0sIFwiYXBwZWFyQW5pbWF0aW9uXCI6IHsgXCJ0eXBlXCI6IDEsIFwibW92ZW1lbnRcIjogMCwgXCJtYXNrXCI6IHsgXCJncmFwaGljXCI6IG51bGwsIFwidmFndWVcIjogMzAgfSB9LCBcImRpc2FwcGVhckFuaW1hdGlvblwiOiB7IFwidHlwZVwiOiAxLCBcIm1vdmVtZW50XCI6IDAsIFwibWFza1wiOiB7IFwiZ3JhcGhpY1wiOiBudWxsLCBcInZhZ3VlXCI6IDMwIH0gfSwgXCJtb3Rpb25CbHVyXCI6IHsgXCJlbmFibGVkXCI6IDAsIFwiZGVsYXlcIjogMiwgXCJvcGFjaXR5XCI6IDEwMCwgXCJkaXNzb2x2ZVNwZWVkXCI6IDMgfSwgXCJjaGFuZ2VBbmltYXRpb25cIjogeyBcInR5cGVcIjogMSwgXCJtb3ZlbWVudFwiOiAwLCBcImZhZGluZ1wiOiAwLCBcIm1hc2tcIjogeyBcImdyYXBoaWNcIjogbnVsbCwgXCJ2YWd1ZVwiOiAzMCB9IH0sIFwiY2hhbmdlRWFzaW5nXCI6IHsgXCJ0eXBlXCI6IDIsIFwiaW5PdXRcIjogMiB9IH0sXG4gICAgICAgICAgICB0ZXh0OiB7IFwiYXBwZWFyRHVyYXRpb25cIjogMzAsIFwiZGlzYXBwZWFyRHVyYXRpb25cIjogMzAsIFwicG9zaXRpb25PcmlnaW5cIjogMCwgXCJvcmlnaW5cIjogMCwgXCJ6T3JkZXJcIjogMCwgXCJhcHBlYXJFYXNpbmdcIjogeyBcInR5cGVcIjogMCwgXCJpbk91dFwiOiAxIH0sIFwiZGlzYXBwZWFyRWFzaW5nXCI6IHsgXCJ0eXBlXCI6IDAsIFwiaW5PdXRcIjogMSB9LCBcImFwcGVhckFuaW1hdGlvblwiOiB7IFwidHlwZVwiOiAxLCBcIm1vdmVtZW50XCI6IDAsIFwibWFza1wiOiB7IFwiZ3JhcGhpY1wiOiBudWxsLCBcInZhZ3VlXCI6IDMwIH0gfSwgXCJkaXNhcHBlYXJBbmltYXRpb25cIjogeyBcInR5cGVcIjogMSwgXCJtb3ZlbWVudFwiOiAwLCBcIm1hc2tcIjogeyBcImdyYXBoaWNcIjogbnVsbCwgXCJ2YWd1ZVwiOiAzMCB9IH0sIFwibW90aW9uQmx1clwiOiB7IFwiZW5hYmxlZFwiOiAwLCBcImRlbGF5XCI6IDIsIFwib3BhY2l0eVwiOiAxMDAsIFwiZGlzc29sdmVTcGVlZFwiOiAzIH0gfSxcbiAgICAgICAgICAgIHZpZGVvOiB7IFwiYXBwZWFyRHVyYXRpb25cIjogMzAsIFwiZGlzYXBwZWFyRHVyYXRpb25cIjogMzAsIFwib3JpZ2luXCI6IDAsIFwiek9yZGVyXCI6IDAsIFwiYXBwZWFyRWFzaW5nXCI6IHsgXCJ0eXBlXCI6IDAsIFwiaW5PdXRcIjogMSB9LCBcImRpc2FwcGVhckVhc2luZ1wiOiB7IFwidHlwZVwiOiAwLCBcImluT3V0XCI6IDEgfSwgXCJhcHBlYXJBbmltYXRpb25cIjogeyBcInR5cGVcIjogMSwgXCJtb3ZlbWVudFwiOiAwLCBcIm1hc2tcIjogeyBcImdyYXBoaWNcIjogbnVsbCwgXCJ2YWd1ZVwiOiAzMCB9IH0sIFwiZGlzYXBwZWFyQW5pbWF0aW9uXCI6IHsgXCJ0eXBlXCI6IDEsIFwibW92ZW1lbnRcIjogMCwgXCJtYXNrXCI6IHsgXCJncmFwaGljXCI6IG51bGwsIFwidmFndWVcIjogMzAgfSB9LCBcIm1vdGlvbkJsdXJcIjogeyBcImVuYWJsZWRcIjogMCwgXCJkZWxheVwiOiAyLCBcIm9wYWNpdHlcIjogMTAwLCBcImRpc3NvbHZlU3BlZWRcIjogMyB9IH0sXG4gICAgICAgICAgICBsaXZlMmQ6IHsgXCJtb3Rpb25GYWRlSW5UaW1lXCI6IDEwMDAsIFwiYXBwZWFyRHVyYXRpb25cIjogMzAsIFwiZGlzYXBwZWFyRHVyYXRpb25cIjogMzAsIFwiek9yZGVyXCI6IDAsIFwiYXBwZWFyRWFzaW5nXCI6IHsgXCJ0eXBlXCI6IDAsIFwiaW5PdXRcIjogMSB9LCBcImRpc2FwcGVhckVhc2luZ1wiOiB7IFwidHlwZVwiOiAwLCBcImluT3V0XCI6IDEgfSwgXCJhcHBlYXJBbmltYXRpb25cIjogeyBcInR5cGVcIjogMSwgXCJtb3ZlbWVudFwiOiAwLCBcIm1hc2tcIjogeyBcImdyYXBoaWNcIjogbnVsbCwgXCJ2YWd1ZVwiOiAzMCB9IH0sIFwiZGlzYXBwZWFyQW5pbWF0aW9uXCI6IHsgXCJ0eXBlXCI6IDEsIFwibW92ZW1lbnRcIjogMCwgXCJtYXNrXCI6IHsgXCJncmFwaGljXCI6IG51bGwsIFwidmFndWVcIjogMzAgfSB9IH0sXG4gICAgICAgICAgICBtZXNzYWdlQm94OiB7IFwiYXBwZWFyRHVyYXRpb25cIjogMzAsIFwiZGlzYXBwZWFyRHVyYXRpb25cIjogMzAsIFwiek9yZGVyXCI6IDAsIFwiYXBwZWFyRWFzaW5nXCI6IHsgXCJ0eXBlXCI6IDAsIFwiaW5PdXRcIjogMSB9LCBcImRpc2FwcGVhckVhc2luZ1wiOiB7IFwidHlwZVwiOiAwLCBcImluT3V0XCI6IDEgfSwgXCJhcHBlYXJBbmltYXRpb25cIjogeyBcInR5cGVcIjogMCwgXCJtb3ZlbWVudFwiOiAzLCBcIm1hc2tcIjogeyBcImdyYXBoaWNcIjogbnVsbCwgXCJ2YWd1ZVwiOiAzMCB9IH0sIFwiZGlzYXBwZWFyQW5pbWF0aW9uXCI6IHsgXCJ0eXBlXCI6IDAsIFwibW92ZW1lbnRcIjogMywgXCJtYXNrXCI6IHsgXCJncmFwaGljXCI6IG51bGwsIFwidmFndWVcIjogMzAgfSB9IH0sXG4gICAgICAgICAgICBhdWRpbzogeyBcIm11c2ljRmFkZUluRHVyYXRpb25cIjogMCwgXCJtdXNpY0ZhZGVPdXREdXJhdGlvblwiOiAwLCBcIm11c2ljVm9sdW1lXCI6IDEwMCwgXCJtdXNpY1BsYXliYWNrUmF0ZVwiOiAxMDAsIFwic291bmRWb2x1bWVcIjogMTAwLCBcInNvdW5kUGxheWJhY2tSYXRlXCI6IDEwMCwgXCJ2b2ljZVZvbHVtZVwiOiAxMDAsIFwidm9pY2VQbGF5YmFja1JhdGVcIjogMTAwIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgIyMjKlxuICAgICAgICAqIFRoZSBnYW1lJ3MgYmFja2xvZy5cbiAgICAgICAgKiBAcHJvcGVydHkgYmFja2xvZ1xuICAgICAgICAqIEB0eXBlIE9iamVjdFtdXG4gICAgICAgICMjIyBcbiAgICAgICAgQGJhY2tsb2cgPSBbXVxuICAgICAgICBcbiAgICAgICAgIyMjKlxuICAgICAgICAqIENoYXJhY3RlciBwYXJhbWV0ZXJzIGJ5IGNoYXJhY3RlciBJRC5cbiAgICAgICAgKiBAcHJvcGVydHkgY2hhcmFjdGVyUGFyYW1zXG4gICAgICAgICogQHR5cGUgT2JqZWN0W11cbiAgICAgICAgIyMjIFxuICAgICAgICBAY2hhcmFjdGVyUGFyYW1zID0gW11cbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBUaGUgZ2FtZSdzIGNoYXB0ZXJcbiAgICAgICAgKiBAcHJvcGVydHkgY2hhcHRlcnNcbiAgICAgICAgKiBAdHlwZSBncy5Eb2N1bWVudFtdXG4gICAgICAgICMjIyBcbiAgICAgICAgQGNoYXB0ZXJzID0gW11cbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBUaGUgZ2FtZSdzIGN1cnJlbnQgZGlzcGxheWVkIG1lc3NhZ2VzLiBFc3BlY2lhbGx5IGluIE5WTCBtb2RlIHRoZSBtZXNzYWdlcyBcbiAgICAgICAgKiBvZiB0aGUgY3VycmVudCBwYWdlIGFyZSBzdG9yZWQgaGVyZS5cbiAgICAgICAgKiBAcHJvcGVydHkgbWVzc2FnZXNcbiAgICAgICAgKiBAdHlwZSBPYmplY3RbXVxuICAgICAgICAjIyMgXG4gICAgICAgIEBtZXNzYWdlcyA9IFtdXG4gICAgICAgIFxuICAgICAgICAjIyMqXG4gICAgICAgICogQ291bnQgb2Ygc2F2ZSBzbG90cy4gRGVmYXVsdCBpcyAxMDAuXG4gICAgICAgICogQHByb3BlcnR5IHNhdmVTbG90Q291bnRcbiAgICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAgIyMjIFxuICAgICAgICBAc2F2ZVNsb3RDb3VudCA9IDEwMFxuICAgICAgICBcbiAgICAgICAgIyMjKlxuICAgICAgICAqIFRoZSBpbmRleCBvZiBzYXZlIGdhbWVzLiBDb250YWlucyB0aGUgaGVhZGVyLWluZm8gZm9yIGVhY2ggc2F2ZSBnYW1lIHNsb3QuXG4gICAgICAgICogQHByb3BlcnR5IHNhdmVHYW1lU2xvdHNcbiAgICAgICAgKiBAdHlwZSBPYmplY3RbXVxuICAgICAgICAjIyMgXG4gICAgICAgIEBzYXZlR2FtZVNsb3RzID0gW11cbiAgICAgICAgXG4gICAgICAgICMjIypcbiAgICAgICAgKiBTdG9yZXMgZ2xvYmFsIGRhdGEgbGlrZSB0aGUgc3RhdGUgb2YgcGVyc2lzdGVudCBnYW1lIHZhcmlhYmxlcy5cbiAgICAgICAgKiBAcHJvcGVydHkgZ2xvYmFsRGF0YVxuICAgICAgICAqIEB0eXBlIE9iamVjdFxuICAgICAgICAjIyMgXG4gICAgICAgIEBnbG9iYWxEYXRhID0gbnVsbFxuICAgICAgICBcbiAgICAgICAgIyMjKlxuICAgICAgICAqIEluZGljYXRlcyBpZiB0aGUgZ2FtZSBydW5zIGluIGVkaXRvcidzIGxpdmUtcHJldmlldy5cbiAgICAgICAgKiBAcHJvcGVydHkgaW5MaXZlUHJldmlld1xuICAgICAgICAqIEB0eXBlIE9iamVjdFxuICAgICAgICAjIyMgXG4gICAgICAgIEBpbkxpdmVQcmV2aWV3ID0gbm9cbiAgICAgICAgXG4gICAgXG4gICAgIyMjKlxuICAgICogSW5pdGlhbGl6ZXMgdGhlIEdhbWVNYW5hZ2VyLCBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSB0aGUgYWN0dWFsIGdhbWUgc3RhcnRzLlxuICAgICpcbiAgICAqIEBtZXRob2QgaW5pdGlhbGl6ZVxuICAgICMjIyAgICBcbiAgICBpbml0aWFsaXplOiAtPlxuICAgICAgICBAaW5pdGlhbGl6ZWQgPSB5ZXNcbiAgICAgICAgQGluTGl2ZVByZXZpZXcgPSAkUEFSQU1TLnByZXZpZXc/XG4gICAgICAgIEBzYXZlU2xvdENvdW50ID0gUmVjb3JkTWFuYWdlci5zeXN0ZW0uc2F2ZVNsb3RDb3VudCB8fCAxMDBcbiAgICAgICAgQHRlbXBGaWVsZHMgPSBuZXcgZ3MuR2FtZVRlbXAoKVxuICAgICAgICB3aW5kb3cuJHRlbXBGaWVsZHMgPSBAdGVtcEZpZWxkc1xuICAgICAgICBcbiAgICAgICAgQGNyZWF0ZVNhdmVHYW1lSW5kZXgoKVxuICAgICAgICBAdmFyaWFibGVTdG9yZSA9IG5ldyBncy5WYXJpYWJsZVN0b3JlKClcbiAgICAgICAgRGF0YU1hbmFnZXIuZ2V0RG9jdW1lbnRzQnlUeXBlKFwicGVyc2lzdGVudF92YXJpYWJsZXNcIilcbiAgICAgICAgQHZhcmlhYmxlU3RvcmUuc2V0dXBEb21haW5zKERhdGFNYW5hZ2VyLmdldERvY3VtZW50c0J5VHlwZShcImdsb2JhbF92YXJpYWJsZXNcIikuc2VsZWN0ICh2KSAtPiB2Lml0ZW1zLmRvbWFpbnx8XCJcIilcbiAgICAgICAgQHZhcmlhYmxlU3RvcmUucGVyc2lzdGVudE51bWJlcnNCeURvbWFpbiA9IEBnbG9iYWxEYXRhLnBlcnNpc3RlbnROdW1iZXJzID8gQHZhcmlhYmxlU3RvcmUucGVyc2lzdGVudE51bWJlcnNCeURvbWFpblxuICAgICAgICBAdmFyaWFibGVTdG9yZS5wZXJzaXN0ZW50Qm9vbGVhbnNCeURvbWFpbiA9IEBnbG9iYWxEYXRhLnBlcnNpc3RlbnRCb29sZWFucyA/IEB2YXJpYWJsZVN0b3JlLnBlcnNpc3RlbnRCb29sZWFuc0J5RG9tYWluXG4gICAgICAgIEB2YXJpYWJsZVN0b3JlLnBlcnNpc3RlbnRTdHJpbmdzQnlEb21haW4gPSBAZ2xvYmFsRGF0YS5wZXJzaXN0ZW50U3RyaW5ncyA/IEB2YXJpYWJsZVN0b3JlLnBlcnNpc3RlbnRTdHJpbmdzQnlEb21haW5cbiAgICAgICAgQHZhcmlhYmxlU3RvcmUucGVyc2lzdGVudExpc3RzQnlEb21haW4gPSBAZ2xvYmFsRGF0YS5wZXJzaXN0ZW50TGlzdHMgPyBAdmFyaWFibGVTdG9yZS5wZXJzaXN0ZW50TGlzdHNCeURvbWFpblxuICAgICAgICBcbiAgICAgICAgQHNjZW5lVmlld3BvcnQgPSBuZXcgZ3MuT2JqZWN0X1ZpZXdwb3J0KG5ldyBWaWV3cG9ydCgwLCAwLCBHcmFwaGljcy53aWR0aCwgR3JhcGhpY3MuaGVpZ2h0LCBHcmFwaGljcy52aWV3cG9ydCkpXG4gICAgICAgIGZvciBjaGFyYWN0ZXIgaW4gUmVjb3JkTWFuYWdlci5jaGFyYWN0ZXJzQXJyYXlcbiAgICAgICAgICAgIGlmIGNoYXJhY3Rlcj9cbiAgICAgICAgICAgICAgICBAY2hhcmFjdGVyUGFyYW1zW2NoYXJhY3Rlci5pbmRleF0gPSB7fVxuICAgICAgICAgICAgICAgIGlmIGNoYXJhY3Rlci5wYXJhbXM/XG4gICAgICAgICAgICAgICAgICAgIGZvciBwYXJhbSBpbiBjaGFyYWN0ZXIucGFyYW1zXG4gICAgICAgICAgICAgICAgICAgICAgICBAY2hhcmFjdGVyUGFyYW1zW2NoYXJhY3Rlci5pbmRleF1bcGFyYW0ubmFtZV0gPSBwYXJhbS52YWx1ZSBcblxuICAgICAgICBcbiAgICAgICAgQHNldHVwQ29tbW9uRXZlbnRzKClcbiAgICAgICAgICAgIFxuICAgICAgICBmb3IgaSBpbiBbMC4uLlJlY29yZE1hbmFnZXIuY2hhcmFjdGVyc11cbiAgICAgICAgICAgIEBzZXR0aW5ncy52b2ljZXNQZXJDaGFyYWN0ZXJbaV0gPSAxMDBcbiAgICAgICAgICAgICBcbiAgICAgICAgQGNoYXB0ZXJzID0gRGF0YU1hbmFnZXIuZ2V0RG9jdW1lbnRzQnlUeXBlKFwidm4uY2hhcHRlclwiKVxuICAgICAgICBAY2hhcHRlcnMuc29ydCAoYSwgYikgLT5cbiAgICAgICAgICAgIGlmIGEuaXRlbXMub3JkZXIgPiBiLml0ZW1zLm9yZGVyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDFcbiAgICAgICAgICAgIGVsc2UgaWYgYS5pdGVtcy5vcmRlciA8IGIuaXRlbXMub3JkZXJcbiAgICAgICAgICAgICAgICByZXR1cm4gLTFcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gMFxuICAgICBcbiAgICAjIyMqXG4gICAgKiBTZXRzIHVwIGNvbW1vbiBldmVudHMuXG4gICAgKlxuICAgICogQG1ldGhvZCBzZXR1cENvbW1vbkV2ZW50c1xuICAgICMjIyAgICAgICAgICAgIFxuICAgIHNldHVwQ29tbW9uRXZlbnRzOiAtPlxuICAgICAgICBmb3IgZXZlbnQgaW4gQGNvbW1vbkV2ZW50c1xuICAgICAgICAgICAgZXZlbnQ/LmRpc3Bvc2UoKVxuICAgICAgICBcbiAgICAgICAgQGNvbW1vbkV2ZW50cyA9IFtdICAgIFxuICAgICAgICBmb3IgZXZlbnQgaW4gUmVjb3JkTWFuYWdlci5jb21tb25FdmVudHNcbiAgICAgICAgICAgIGNvbnRpbnVlIGlmIG5vdCBldmVudFxuICAgICAgICAgICAgaWYgZXZlbnQuc3RhcnRDb25kaXRpb24gPT0gMSBhbmQgZXZlbnQuYXV0b1ByZWxvYWRcbiAgICAgICAgICAgICAgICBncy5SZXNvdXJjZUxvYWRlci5sb2FkRXZlbnRDb21tYW5kc0dyYXBoaWNzKGV2ZW50LmNvbW1hbmRzKVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgb2JqZWN0ID0gbmV3IGdzLk9iamVjdF9Db21tb25FdmVudCgpXG4gICAgICAgICAgICBvYmplY3QucmVjb3JkID0gZXZlbnRcbiAgICAgICAgICAgIG9iamVjdC5yaWQgPSBldmVudC5pbmRleFxuICAgICAgICAgICAgQGNvbW1vbkV2ZW50c1tldmVudC5pbmRleF0gPSBvYmplY3RcbiAgICAgICAgICAgIEBjb21tb25FdmVudHMucHVzaChvYmplY3QpXG4gICAgXG4gICAgIyMjKlxuICAgICogU2V0cyB1cCBjdXJzb3IgZGVwZW5kaW5nIG9uIHN5c3RlbSBzZXR0aW5ncy5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHNldHVwQ3Vyc29yXG4gICAgIyMjXG4gICAgc2V0dXBDdXJzb3I6IC0+XG4gICAgICAgIGlmIFJlY29yZE1hbmFnZXIuc3lzdGVtLmN1cnNvcj8ubmFtZVxuICAgICAgICAgICAgYml0bWFwID0gUmVzb3VyY2VNYW5hZ2VyLmdldEJpdG1hcChcIkdyYXBoaWNzL1BpY3R1cmVzLyN7UmVjb3JkTWFuYWdlci5zeXN0ZW0uY3Vyc29yLm5hbWV9XCIpXG4gICAgICAgICAgICBHcmFwaGljcy5zZXRDdXJzb3JCaXRtYXAoYml0bWFwLCBSZWNvcmRNYW5hZ2VyLnN5c3RlbS5jdXJzb3IuaHgsIFJlY29yZE1hbmFnZXIuc3lzdGVtLmN1cnNvci5oeSlcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgR3JhcGhpY3Muc2V0Q3Vyc29yQml0bWFwKG51bGwpXG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIERpc3Bvc2VzIHRoZSBHYW1lTWFuYWdlci4gU2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgcXVpdCB0aGUgZ2FtZS5cbiAgICAqXG4gICAgKiBAbWV0aG9kIGRpc3Bvc2VcbiAgICAjIyMgICAgICAgICAgICAgICBcbiAgICBkaXNwb3NlOiAtPlxuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBRdWl0cyB0aGUgZ2FtZS4gVGhlIGltcGxlbWVudGF0aW9uIGRlcGVuZHMgb24gdGhlIHBsYXRmb3JtLiBTbyBmb3IgZXhhbXBsZSBvbiBtb2JpbGVcbiAgICAqIGRldmljZXMgdGhpcyBtZXRob2QgaGFzIG5vIGVmZmVjdC5cbiAgICAqXG4gICAgKiBAbWV0aG9kIGV4aXRcbiAgICAjIyMgICBcbiAgICBleGl0OiAtPiBBcHBsaWNhdGlvbi5leGl0KClcbiAgICBcbiAgICAjIyMqXG4gICAgKiBSZXNldHMgdGhlIEdhbWVNYW5hZ2VyIGJ5IGRpc3Bvc2luZyBhbmQgcmUtaW5pdGlhbGl6aW5nIGl0LlxuICAgICpcbiAgICAqIEBtZXRob2QgcmVzZXRcbiAgICAjIyMgICAgICAgICAgXG4gICAgcmVzZXQ6IC0+XG4gICAgICAgIEBpbml0aWFsaXplZCA9IG5vXG4gICAgICAgIEBpbnRlcnByZXRlciA9IG51bGxcbiAgICAgICAgQGRpc3Bvc2UoKVxuICAgICAgICBAaW5pdGlhbGl6ZSgpXG4gICAgIFxuICAgICMjIypcbiAgICAqIFN0YXJ0cyBhIG5ldyBnYW1lLlxuICAgICpcbiAgICAqIEBtZXRob2QgbmV3R2FtZVxuICAgICMjIyAgICAgIFxuICAgIG5ld0dhbWU6IC0+XG4gICAgICAgIEBtZXNzYWdlcyA9IFtdXG4gICAgICAgIEB2YXJpYWJsZVN0b3JlLmNsZWFyQWxsR2xvYmFsVmFyaWFibGVzKClcbiAgICAgICAgQHZhcmlhYmxlU3RvcmUuY2xlYXJBbGxMb2NhbFZhcmlhYmxlcygpXG4gICAgICAgIEB0ZW1wU2V0dGluZ3Muc2tpcCA9IG5vXG4gICAgICAgIEB0ZW1wRmllbGRzLmNsZWFyKClcbiAgICAgICAgQHRlbXBGaWVsZHMuaW5HYW1lID0geWVzXG4gICAgICAgIEBzZXR1cENvbW1vbkV2ZW50cygpXG4gICAgICAgIEB0ZW1wU2V0dGluZ3MubWVudUFjY2VzcyA9IHllc1xuICAgICAgICBAdGVtcFNldHRpbmdzLnNhdmVNZW51QWNjZXNzID0geWVzXG4gICAgICAgIEB0ZW1wU2V0dGluZ3MubG9hZE1lbnVBY2Nlc3MgPSB5ZXNcbiAgICAgICAgQHRlbXBTZXR0aW5ncy5iYWNrbG9nQWNjZXNzID0geWVzXG4gICAgXG4gICAgXG4gICAgIyMjKlxuICAgICogRXhpc3RzIHRoZSBnYW1lIGFuZCByZXNldHMgdGhlIEdhbWVNYW5hZ2VyIHdoaWNoIGlzIGltcG9ydGFudCBiZWZvcmUgZ29pbmcgYmFjayB0b1xuICAgICogdGhlIG1haW4gbWVudSBvciB0aXRsZSBzY3JlZW4uXG4gICAgKlxuICAgICogQG1ldGhvZCBleGl0R2FtZVxuICAgICMjIyAgICBcbiAgICBleGl0R2FtZTogLT5cbiAgICAgICAgQHRlbXBGaWVsZHMuaW5HYW1lID0gbm8gICAgIFxuICAgICAgICBAdGVtcEZpZWxkcy5pc0V4aXRpbmdHYW1lID0geWVzXG4gICAgXG4gICAgIyMjKlxuICAgICogVXBkYXRlcyB0aGUgR2FtZU1hbmFnZXIuIFNob3VsZCBiZSBjYWxsZWQgb25jZSBwZXIgZnJhbWUuXG4gICAgKlxuICAgICogQG1ldGhvZCB1cGRhdGVcbiAgICAjIyMgICAgIFxuICAgIHVwZGF0ZTogLT5cbiAgICBcbiAgICAjIyMqXG4gICAgKiBDcmVhdGVzIHRoZSBpbmRleCBvZiBhbGwgc2F2ZS1nYW1lcy4gU2hvdWxkIGJlIGNhbGxlZCB3aGVuZXZlciBhIG5ldyBzYXZlIGdhbWVcbiAgICAqIGlzIGNyZWF0ZWQuXG4gICAgKlxuICAgICogQG1ldGhvZCBjcmVhdGVTYXZlR2FtZUluZGV4XG4gICAgKiBAcHJvdGVjdGVkXG4gICAgIyMjIFxuICAgIGNyZWF0ZVNhdmVHYW1lSW5kZXg6IC0+XG4gICAgICAgIEBzYXZlR2FtZVNsb3RzID0gW11cbiAgICAgICAgZm9yIGkgaW4gWzAuLi5Ac2F2ZVNsb3RDb3VudF1cbiAgICAgICAgICAgIGlmIEdhbWVTdG9yYWdlLmV4aXN0cyhcIlNhdmVHYW1lXyN7aX1fSGVhZGVyXCIpXG4gICAgICAgICAgICAgICAgaGVhZGVyID0gR2FtZVN0b3JhZ2UuZ2V0T2JqZWN0KFwiU2F2ZUdhbWVfI3tpfV9IZWFkZXJcIilcbiAgICAgICAgICAgICAgICBjaGFwdGVyID0gRGF0YU1hbmFnZXIuZ2V0RG9jdW1lbnQoaGVhZGVyLmNoYXB0ZXJVaWQpXG4gICAgICAgICAgICAgICAgc2NlbmUgPSBEYXRhTWFuYWdlci5nZXREb2N1bWVudFN1bW1hcnkoaGVhZGVyLnNjZW5lVWlkKVxuICAgICAgICAgICAgICAgIGltYWdlID0gaGVhZGVyLmltYWdlXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgaGVhZGVyID0gbnVsbFxuICAgICAgICAgICAgICAgIGNoYXBlciA9IG51bGxcbiAgICAgICAgICAgICAgICBzY2VuZSA9IG51bGxcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIGNoYXB0ZXI/IGFuZCBzY2VuZT8gYW5kICFAaW5MaXZlUHJldmlld1xuICAgICAgICAgICAgICAgIEBzYXZlR2FtZVNsb3RzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBkYXRlOiBoZWFkZXIuZGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgY2hhcHRlcjogY2hhcHRlci5pdGVtcy5uYW1lIHx8IFwiREVMRVRFRFwiXG4gICAgICAgICAgICAgICAgICAgIHNjZW5lOiBzY2VuZS5pdGVtcy5uYW1lIHx8IFwiREVMRVRFRFwiLFxuICAgICAgICAgICAgICAgICAgICBpbWFnZTogaW1hZ2UgI2NoYXB0ZXIuaXRlbXMuY29tbWFuZHNbMF0ucGFyYW1zLnNhdmVHYW1lR3JhcGhpYz8ubmFtZVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgQHNhdmVHYW1lU2xvdHMucHVzaCh7IFwiZGF0ZVwiOiBcIlwiLCBcImNoYXB0ZXJcIjogXCJcIiwgXCJzY2VuZVwiOiBcIlwiLCBcImltYWdlXCI6IG51bGwgfSlcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBAc2F2ZUdhbWVTbG90c1xuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBSZXNldHMgdGhlIGdhbWUncyBzZXR0aW5ncyB0byBpdHMgZGVmYXVsdCB2YWx1ZXMuXG4gICAgKlxuICAgICogQG1ldGhvZCByZXNldFNldHRpbmdzXG4gICAgIyMjICAgICAgICAgICAgXG4gICAgcmVzZXRTZXR0aW5nczogLT5cbiAgICAgICAgQHNldHRpbmdzID0geyB2ZXJzaW9uOiAzNDIsIHJlbmRlcmVyOiAwLCBmaWx0ZXI6IDEsIGNvbmZpcm1hdGlvbjogeWVzLCBhZGp1c3RBc3BlY3RSYXRpbzogbm8sIGFsbG93U2tpcDogeWVzLCBhbGxvd1NraXBVbnJlYWRNZXNzYWdlczogeWVzLCAgYWxsb3dWaWRlb1NraXA6IHllcywgc2tpcFZvaWNlT25BY3Rpb246IHllcywgYWxsb3dDaG9pY2VTa2lwOiBubywgdm9pY2VzQnlDaGFyYWN0ZXI6IFtdLCB0aW1lTWVzc2FnZVRvVm9pY2U6IHRydWUsICBcImF1dG9NZXNzYWdlXCI6IHsgZW5hYmxlZDogZmFsc2UsIHRpbWU6IDAsIHdhaXRGb3JWb2ljZTogeWVzLCBzdG9wT25BY3Rpb246IG5vIH0sICBcInZvaWNlRW5hYmxlZFwiOiB0cnVlLCBcImJnbUVuYWJsZWRcIjogdHJ1ZSwgXCJzb3VuZEVuYWJsZWRcIjogdHJ1ZSwgXCJ2b2ljZVZvbHVtZVwiOiAxMDAsIFwiYmdtVm9sdW1lXCI6IDEwMCwgXCJzZVZvbHVtZVwiOiAxMDAsIFwibWVzc2FnZVNwZWVkXCI6IDQsIFwiZnVsbFNjcmVlblwiOiBubywgXCJhc3BlY3RSYXRpb1wiOiAwIH1cbiAgICAgICAgQHNhdmVHYW1lU2xvdHMgPSBbXVxuICAgICAgICBmb3IgaSBpbiBbMC4uLkBzYXZlU2xvdENvdW50XVxuICAgICAgICAgICAgR2FtZVN0b3JhZ2UucmVtb3ZlKFwiU2F2ZUdhbWVfI3tpfV9IZWFkZXJcIilcbiAgICAgICAgICAgIEdhbWVTdG9yYWdlLnJlbW92ZShcIlNhdmVHYW1lXyN7aX1cIilcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgQHNhdmVHYW1lU2xvdHMucHVzaCh7IFwiZGF0ZVwiOiBcIlwiLCBcImNoYXB0ZXJcIjogXCJcIiwgXCJzY2VuZVwiOiBcIlwiLCBcInRodW1iXCI6IFwiXCIgfSlcbiAgICAgICBcbiAgICAgICAgR2FtZVN0b3JhZ2Uuc2V0T2JqZWN0KFwic2V0dGluZ3NcIiwgQHNldHRpbmdzKVxuICAgICAgICBcbiAgICAgICAgXG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIFNhdmVzIGN1cnJlbnQgZ2FtZSBzZXR0aW5ncy5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHNhdmVTZXR0aW5nc1xuICAgICMjIyAgICAgXG4gICAgc2F2ZVNldHRpbmdzOiAtPlxuICAgICAgICBHYW1lU3RvcmFnZS5zZXRPYmplY3QoXCJzZXR0aW5nc1wiLCBAc2V0dGluZ3MpXG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIFNhdmVzIGN1cnJlbnQgZ2xvYmFsIGRhdGEuXG4gICAgKlxuICAgICogQG1ldGhvZCBzYXZlR2xvYmFsRGF0YVxuICAgICMjIyAgXG4gICAgc2F2ZUdsb2JhbERhdGE6IC0+XG4gICAgICAgIEBnbG9iYWxEYXRhLnBlcnNpc3RlbnROdW1iZXJzID0gQHZhcmlhYmxlU3RvcmUucGVyc2lzdGVudE51bWJlcnNCeURvbWFpblxuICAgICAgICBAZ2xvYmFsRGF0YS5wZXJzaXN0ZW50TGlzdHMgPSBAdmFyaWFibGVTdG9yZS5wZXJzaXN0ZW50TGlzdHNCeURvbWFpblxuICAgICAgICBAZ2xvYmFsRGF0YS5wZXJzaXN0ZW50Qm9vbGVhbnMgPSBAdmFyaWFibGVTdG9yZS5wZXJzaXN0ZW50Qm9vbGVhbnNCeURvbWFpblxuICAgICAgICBAZ2xvYmFsRGF0YS5wZXJzaXN0ZW50U3RyaW5ncyA9IEB2YXJpYWJsZVN0b3JlLnBlcnNpc3RlbnRTdHJpbmdzQnlEb21haW5cbiAgICAgICAgR2FtZVN0b3JhZ2Uuc2V0T2JqZWN0KFwiZ2xvYmFsRGF0YVwiLCBAZ2xvYmFsRGF0YSlcbiAgICAgXG4gICAgIyMjKlxuICAgICogUmVzZXRzIGN1cnJlbnQgZ2xvYmFsIGRhdGEuIEFsbCBzdG9yZWQgZGF0YSBhYm91dCByZWFkIG1lc3NhZ2VzLCBwZXJzaXN0ZW50IHZhcmlhYmxlcyBhbmRcbiAgICAqIENHIGdhbGxlcnkgd2lsbCBiZSBkZWxldGVkLlxuICAgICpcbiAgICAqIEBtZXRob2QgcmVzZXRHbG9iYWxEYXRhXG4gICAgIyMjICAgICBcbiAgICByZXNldEdsb2JhbERhdGE6IC0+XG4gICAgICAgIHZlcnNpb24gPSBAZ2xvYmFsRGF0YT8udmVyc2lvblxuICAgICAgICBkYXRhID0gQGdsb2JhbERhdGFcbiAgICAgICAgXG4gICAgICAgIEBnbG9iYWxEYXRhID0geyBcbiAgICAgICAgICAgIG1lc3NhZ2VzOiB7fSwgY2dHYWxsZXJ5OiB7fSwgdmVyc2lvbjogMzQyLCBcbiAgICAgICAgICAgIHBlcnNpc3RlbnROdW1iZXJzOiB7IFwiMFwiOiBbXSwgXCJjb20uZGVnaWNhLnZubS5kZWZhdWx0XCI6IFtdIH0sIFxuICAgICAgICAgICAgcGVyc2lzdGVudFN0cmluZ3M6IHsgXCIwXCI6IFtdLCBcImNvbS5kZWdpY2Eudm5tLmRlZmF1bHRcIjogW10gfSwgXG4gICAgICAgICAgICBwZXJzaXN0ZW50Qm9vbGVhbnM6IHsgXCIwXCI6IFtdLCBcImNvbS5kZWdpY2Eudm5tLmRlZmF1bHRcIjogW10gfSwgXG4gICAgICAgICAgICBwZXJzaXN0ZW50TGlzdHM6IHsgXCIwXCI6IFtdLCBcImNvbS5kZWdpY2Eudm5tLmRlZmF1bHRcIjogW10gfSBcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgZm9yIGNnLCBpIGluIFJlY29yZE1hbmFnZXIuY2dHYWxsZXJ5QXJyYXlcbiAgICAgICAgICAgIGlmIGNnP1xuICAgICAgICAgICAgICAgIEBnbG9iYWxEYXRhLmNnR2FsbGVyeVtjZy5pbmRleF0gPSB7IHVubG9ja2VkOiBubyB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgIEdhbWVTdG9yYWdlLnNldE9iamVjdChcImdsb2JhbERhdGFcIiwgQGdsb2JhbERhdGEpIFxuICAgIFxuICAgICAgICBAbWlncmF0ZUdsb2JhbERhdGEoZGF0YSwgdmVyc2lvbisxLCBAZ2xvYmFsRGF0YS52ZXJzaW9uKVxuICAgIFxuICAgIG1pZ3JhdGVHbG9iYWxEYXRhOiAoZGF0YSwgZnJvbSwgdG8pIC0+XG4gICAgICAgIGZvciBpIGluIFtmcm9tLi50b11cbiAgICAgICAgICAgIGlmIHRoaXNbXCJtaWdyYXRlR2xvYmFsRGF0YSN7aX1cIl0/XG4gICAgICAgICAgICAgICAgdGhpc1tcIm1pZ3JhdGVHbG9iYWxEYXRhI3tpfVwiXShkYXRhKVxuICAgICAgICAgICAgICAgIFxuICAgIG1pZ3JhdGVHbG9iYWxEYXRhMzQyOiAoZGF0YSkgLT4gXG4gICAgICAgIGlmIGRhdGE/XG4gICAgICAgICAgICBAZ2xvYmFsRGF0YS5wZXJzaXN0ZW50TnVtYmVyc1swXSA9IGRhdGEucGVyc2lzdGVudE51bWJlcnNbMF0gfHwgW11cbiAgICAgICAgICAgIEBnbG9iYWxEYXRhLnBlcnNpc3RlbnRTdHJpbmdzWzBdID0gZGF0YS5wZXJzaXN0ZW50U3RyaW5nc1swXSB8fCBbXVxuICAgICAgICAgICAgQGdsb2JhbERhdGEucGVyc2lzdGVudEJvb2xlYW5zWzBdID0gZGF0YS5wZXJzaXN0ZW50Qm9vbGVhbnNbMF0gfHwgW11cbiAgICAgICAgICAgIEBnbG9iYWxEYXRhLnBlcnNpc3RlbnRMaXN0c1swXSA9IGRhdGEucGVyc2lzdGVudExpc3RzWzBdIHx8IFtdXG4gICAgICAgICAgICBAZ2xvYmFsRGF0YS5wZXJzaXN0ZW50TnVtYmVyc1tcImNvbS5kZWdpY2Eudm5tLmRlZmF1bHRcIl0gPSBkYXRhLnBlcnNpc3RlbnROdW1iZXJzWzBdIHx8IFtdXG4gICAgICAgICAgICBAZ2xvYmFsRGF0YS5wZXJzaXN0ZW50U3RyaW5nc1tcImNvbS5kZWdpY2Eudm5tLmRlZmF1bHRcIl0gPSBkYXRhLnBlcnNpc3RlbnRTdHJpbmdzWzBdIHx8IFtdXG4gICAgICAgICAgICBAZ2xvYmFsRGF0YS5wZXJzaXN0ZW50Qm9vbGVhbnNbXCJjb20uZGVnaWNhLnZubS5kZWZhdWx0XCJdID0gZGF0YS5wZXJzaXN0ZW50Qm9vbGVhbnNbMF0gfHwgW11cbiAgICAgICAgICAgIEBnbG9iYWxEYXRhLnBlcnNpc3RlbnRMaXN0c1tcImNvbS5kZWdpY2Eudm5tLmRlZmF1bHRcIl0gPSBkYXRhLnBlcnNpc3RlbnRMaXN0c1swXSB8fCBbXVxuICAgICBcbiAgICByZWFkU2F2ZUdhbWU6IChzYXZlR2FtZSkgLT5cbiAgICB3cml0ZVNhdmVHYW1lOiAoc2F2ZUdhbWUpIC0+XG4gICAgICAgIFxuICAgIHByZXBhcmVTYXZlR2FtZTogKHNuYXBzaG90KSAtPlxuICAgICAgICBpZiBzbmFwc2hvdFxuICAgICAgICAgICAgc25hcHNob3QgPSBSZXNvdXJjZU1hbmFnZXIuZ2V0Q3VzdG9tQml0bWFwKFwiJHNuYXBzaG90XCIpXG4gICAgICAgICAgICBzbmFwc2hvdD8uZGlzcG9zZSgpXG4gICAgICAgICAgICBSZXNvdXJjZU1hbmFnZXIuc2V0Q3VzdG9tQml0bWFwKFwiJHNuYXBzaG90XCIsIEdyYXBoaWNzLnNuYXBzaG90KCkpXG4gICAgICAgIFxuICAgICAgICBjb250ZXh0ID0gbmV3IGdzLk9iamVjdENvZGVjQ29udGV4dCgpXG4gICAgICAgIGNvbnRleHQuZGVjb2RlZE9iamVjdFN0b3JlLnB1c2goR3JhcGhpY3Mudmlld3BvcnQpXG4gICAgICAgIGNvbnRleHQuZGVjb2RlZE9iamVjdFN0b3JlLnB1c2goQHNjZW5lKVxuICAgICAgICBjb250ZXh0LmRlY29kZWRPYmplY3RTdG9yZS5wdXNoKEBzY2VuZS5iZWhhdmlvcilcbiAgXG4gICAgICAgIG1lc3NhZ2VCb3hJZHMgPSBbXCJtZXNzYWdlQm94XCIsIFwibnZsTWVzc2FnZUJveFwiLCBcIm1lc3NhZ2VNZW51XCJdO1xuICAgICAgICBtZXNzYWdlSWRzID0gW1wiZ2FtZU1lc3NhZ2VfbWVzc2FnZVwiLCBcIm52bEdhbWVNZXNzYWdlX21lc3NhZ2VcIl07XG4gICAgICAgIG1lc3NhZ2VCb3hlcyA9IG1lc3NhZ2VCb3hJZHMuc2VsZWN0IChpZCkgPT4gQHNjZW5lLmJlaGF2aW9yLm9iamVjdE1hbmFnZXIub2JqZWN0QnlJZChpZClcbiAgICAgICAgbWVzc2FnZXMgPSBtZXNzYWdlSWRzLnNlbGVjdCAoaWQpID0+IEBzY2VuZS5iZWhhdmlvci5vYmplY3RNYW5hZ2VyLm9iamVjdEJ5SWQoaWQpXG4gICAgICAgIFxuICAgICAgICBzY2VuZURhdGEgPSB7fVxuICAgICAgICBzYXZlR2FtZSA9IHt9XG4gICAgICAgIHNhdmVHYW1lLmVuY29kZWRPYmplY3RTdG9yZSA9IG51bGxcbiAgICAgICAgc2F2ZUdhbWUuc2NlbmVVaWQgPSBAc2NlbmUuc2NlbmVEb2N1bWVudC51aWRcbiAgICAgICAgc2F2ZUdhbWUuZGF0YSA9IHtcbiAgICAgICAgICAgIHJlc291cmNlQ29udGV4dDogQHNjZW5lLmJlaGF2aW9yLnJlc291cmNlQ29udGV4dC50b0RhdGFCdW5kbGUoKSxcbiAgICAgICAgICAgIGN1cnJlbnRDaGFyYWN0ZXI6IEBzY2VuZS5jdXJyZW50Q2hhcmFjdGVyLFxuICAgICAgICAgICAgY2hhcmFjdGVyUGFyYW1zOiBAY2hhcmFjdGVyUGFyYW1zLFxuICAgICAgICAgICAgZnJhbWVDb3VudDogR3JhcGhpY3MuZnJhbWVDb3VudCxcbiAgICAgICAgICAgIHRlbXBGaWVsZHM6IEB0ZW1wRmllbGRzLFxuICAgICAgICAgICAgdmlld3BvcnQ6IEBzY2VuZS52aWV3cG9ydCxcbiAgICAgICAgICAgIGNoYXJhY3RlcnM6IEBzY2VuZS5jaGFyYWN0ZXJzLFxuICAgICAgICAgICAgY2hhcmFjdGVyTmFtZXM6IFJlY29yZE1hbmFnZXIuY2hhcmFjdGVyc0FycmF5LnNlbGVjdCgoYykgLT4geyBuYW1lOiBjLm5hbWUsIGluZGV4OiBjLmluZGV4IH0pLFxuICAgICAgICAgICAgYmFja2dyb3VuZHM6IEBzY2VuZS5iYWNrZ3JvdW5kcyxcbiAgICAgICAgICAgIHBpY3R1cmVzOiBAc2NlbmUucGljdHVyZUNvbnRhaW5lci5zdWJPYmplY3RzQnlEb21haW4sXG4gICAgICAgICAgICB0ZXh0czogQHNjZW5lLnRleHRDb250YWluZXIuc3ViT2JqZWN0c0J5RG9tYWluLFxuICAgICAgICAgICAgdmlkZW9zOiBAc2NlbmUudmlkZW9Db250YWluZXIuc3ViT2JqZWN0c0J5RG9tYWluLFxuICAgICAgICAgICAgdmlld3BvcnRzOiBAc2NlbmUudmlld3BvcnRDb250YWluZXIuc3ViT2JqZWN0cyxcbiAgICAgICAgICAgIGNvbW1vbkV2ZW50czogQHNjZW5lLmNvbW1vbkV2ZW50Q29udGFpbmVyLnN1Yk9iamVjdHMsXG4gICAgICAgICAgICBob3RzcG90czogQHNjZW5lLmhvdHNwb3RDb250YWluZXIuc3ViT2JqZWN0c0J5RG9tYWluLFxuICAgICAgICAgICAgaW50ZXJwcmV0ZXI6IEBzY2VuZS5pbnRlcnByZXRlcixcbiAgICAgICAgICAgIGNob2ljZXM6IEBzY2VuZS5jaG9pY2VzLFxuICAgICAgICAgICAgbWVzc2FnZUJveGVzOiBtZXNzYWdlQm94ZXMuc2VsZWN0KChtYiwgaSkgPT4geyB2aXNpYmxlOiBtYi52aXNpYmxlLCBpZDogbWIuaWQsIG1lc3NhZ2U6IG1lc3NhZ2VzW2ldIH0pLFxuICAgICAgICAgICAgYmFja2xvZzogQGJhY2tsb2csXG4gICAgICAgICAgICB2YXJpYWJsZVN0b3JlOiBAdmFyaWFibGVTdG9yZSxcbiAgICAgICAgICAgIGRlZmF1bHRzOiBAZGVmYXVsdHMsXG4gICAgICAgICAgICB0cmFuc2l0aW9uRGF0YTogU2NlbmVNYW5hZ2VyLnRyYW5zaXRpb25EYXRhLFxuICAgICAgICAgICAgYXVkaW86IHsgYXVkaW9CdWZmZXJzOiBBdWRpb01hbmFnZXIuYXVkaW9CdWZmZXJzLCBhdWRpb0J1ZmZlcnNCeUxheWVyOiBBdWRpb01hbmFnZXIuYXVkaW9CdWZmZXJzQnlMYXllciwgYXVkaW9MYXllcnM6IEF1ZGlvTWFuYWdlci5hdWRpb0xheWVycywgc291bmRSZWZlcmVuY2VzOiBBdWRpb01hbmFnZXIuc291bmRSZWZlcmVuY2VzIH0sXG4gICAgICAgICAgICBtZXNzYWdlQXJlYXM6IEBzY2VuZS5tZXNzYWdlQXJlYUNvbnRhaW5lci5zdWJPYmplY3RzQnlEb21haW5cbiAgICAgICAgICAjICBtZXNzYWdlQXJlYXM6IEBzY2VuZS5tZXNzYWdlQXJlYXMuc2VsZWN0IChmKSAtPlxuICAgICAgICAgICMgICAgICBpZiBmIFxuICAgICAgICAgICMgICAgICAgICAgeyBcbiAgICAgICAgICAjICAgICAgICAgICAgICBtZXNzYWdlOiBmLm1lc3NhZ2UsIFxuICAgICAgICAgICMgICAgICAgICAgICAgIGxheW91dDogeyBkc3RSZWN0OiBncy5SZWN0LmZyb21PYmplY3QoZi5sYXlvdXQuZHN0UmVjdCkgfSBcbiAgICAgICAgICAjICAgICAgICAgIH0gXG4gICAgICAgICAgIyAgICAgIGVsc2UgXG4gICAgICAgICAgIyAgICAgICAgICBudWxsXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgICNzcyA9IHdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKVxuICAgICAgICBzYXZlR2FtZS5kYXRhID0gZ3MuT2JqZWN0Q29kZWMuZW5jb2RlKHNhdmVHYW1lLmRhdGEsIGNvbnRleHQpXG4gICAgICAgICNjb25zb2xlLmxvZyh3aW5kb3cucGVyZm9ybWFuY2Uubm93KCkgLSBzcylcbiAgICAgICAgc2F2ZUdhbWUuZW5jb2RlZE9iamVjdFN0b3JlID0gY29udGV4dC5lbmNvZGVkT2JqZWN0U3RvcmVcblxuICAgICAgICBAc2F2ZUdhbWUgPSBzYXZlR2FtZVxuICAgICAgXG4gICAgY3JlYXRlU2F2ZUdhbWVTbG90OiAoaGVhZGVyKSAtPlxuICAgICAgICBzbG90ID0ge1xuICAgICAgICAgICAgXCJkYXRlXCI6IG5ldyBEYXRlKCkudG9EYXRlU3RyaW5nKCksXG4gICAgICAgICAgICBcImNoYXB0ZXJcIjogQHNjZW5lLmNoYXB0ZXIuaXRlbXMubmFtZSxcbiAgICAgICAgICAgIFwic2NlbmVcIjogQHNjZW5lLnNjZW5lRG9jdW1lbnQuaXRlbXMubmFtZSxcbiAgICAgICAgICAgIFwiaW1hZ2VcIjogaGVhZGVyLmltYWdlXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBzbG90O1xuICAgICAgICBcbiAgICBjcmVhdGVTYXZlR2FtZUhlYWRlcjogKHRodW1iV2lkdGgsIHRodW1iSGVpZ2h0KSAtPlxuICAgICAgICB0aHVtYkltYWdlID0gQGNyZWF0ZVNhdmVHYW1lVGh1bWJJbWFnZSh0aHVtYldpZHRoLCB0aHVtYkhlaWdodClcbiAgICAgICAgXG4gICAgICAgIGhlYWRlciA9IHtcbiAgICAgICAgICAgIFwiZGF0ZVwiOiBuZXcgRGF0ZSgpLnRvRGF0ZVN0cmluZygpLFxuICAgICAgICAgICAgXCJjaGFwdGVyVWlkXCI6IEBzY2VuZS5jaGFwdGVyLnVpZCxcbiAgICAgICAgICAgIFwic2NlbmVVaWRcIjogQHNjZW5lLnNjZW5lRG9jdW1lbnQudWlkLFxuICAgICAgICAgICAgXCJpbWFnZVwiOiB0aHVtYkltYWdlPy5pbWFnZS50b0RhdGFVUkwoKSBcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgdGh1bWJJbWFnZT8uZGlzcG9zZSgpXG4gICAgICAgIFxuICAgICAgICByZXR1cm4gaGVhZGVyXG4gICAgICAgIFxuICAgIGNyZWF0ZVNhdmVHYW1lVGh1bWJJbWFnZTogKHdpZHRoLCBoZWlnaHQpIC0+XG4gICAgICAgIHNuYXBzaG90ID0gUmVzb3VyY2VNYW5hZ2VyLmdldEJpdG1hcChcIiRzbmFwc2hvdFwiKVxuICAgICAgICB0aHVtYkltYWdlID0gbnVsbFxuICAgICAgICBcbiAgICAgICAgaWYgc25hcHNob3QgYW5kIHNuYXBzaG90LmxvYWRlZFxuICAgICAgICAgICAgaWYgd2lkdGggYW5kIGhlaWdodFxuICAgICAgICAgICAgICAgIHRodW1iSW1hZ2UgPSBuZXcgQml0bWFwKHdpZHRoLCBoZWlnaHQpXG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGh1bWJJbWFnZSA9IG5ldyBCaXRtYXAoR3JhcGhpY3Mud2lkdGggLyA4LCBHcmFwaGljcy5oZWlnaHQgLyA4KVxuICAgICAgICAgICAgdGh1bWJJbWFnZS5zdHJldGNoQmx0KG5ldyBSZWN0KDAsIDAsIHRodW1iSW1hZ2Uud2lkdGgsIHRodW1iSW1hZ2UuaGVpZ2h0KSwgc25hcHNob3QsIG5ldyBSZWN0KDAsIDAsIHNuYXBzaG90LndpZHRoLCBzbmFwc2hvdC5oZWlnaHQpKVxuICAgICAgICAgICAgXG4gICAgICAgIHJldHVybiB0aHVtYkltYWdlXG4gICAgICBcbiAgICBzdG9yZVNhdmVHYW1lOiAobmFtZSwgc2F2ZUdhbWUsIGhlYWRlcikgLT5cbiAgICAgICAgaWYgaGVhZGVyXG4gICAgICAgICAgICBHYW1lU3RvcmFnZS5zZXREYXRhKFwiI3tuYW1lfV9IZWFkZXJcIiwgSlNPTi5zdHJpbmdpZnkoaGVhZGVyKSlcbiAgICAgICAgICAgIFxuICAgICAgICBHYW1lU3RvcmFnZS5zZXREYXRhKG5hbWUsIEpTT04uc3RyaW5naWZ5KHNhdmVHYW1lKSlcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogU2F2ZXMgdGhlIGN1cnJlbnQgZ2FtZSBhdCB0aGUgc3BlY2lmaWVkIHNsb3QuXG4gICAgKlxuICAgICogQG1ldGhvZCBzYXZlXG4gICAgKiBAcGFyYW0ge251bWJlcn0gc2xvdCAtIFRoZSBzbG90IHdoZXJlIHRoZSBnYW1lIHNob3VsZCBiZSBzYXZlZCBhdC5cbiAgICAqIEBwYXJhbSB7bnVtYmVyfSB0aHVtYldpZHRoIC0gVGhlIHdpZHRoIGZvciB0aGUgc25hcHNob3QtdGh1bWIuIFlvdSBjYW4gc3BlY2lmeSA8Yj5udWxsPC9iPiBvciAwIHRvIHVzZSBhbiBhdXRvIGNhbGN1bGF0ZWQgd2lkdGguXG4gICAgKiBAcGFyYW0ge251bWJlcn0gdGh1bWJIZWlnaHQgLSBUaGUgaGVpZ2h0IGZvciB0aGUgc25hcHNob3QtdGh1bWIuIFlvdSBjYW4gc3BlY2lmeSA8Yj5udWxsPC9iPiBvciAwIHRvIHVzZSBhbiBhdXRvIGNhbGN1bGF0ZWQgaGVpZ2h0LlxuICAgICMjIyAgICAgXG4gICAgc2F2ZTogKHNsb3QsIHRodW1iV2lkdGgsIHRodW1iSGVpZ2h0KSAtPlxuICAgICAgICBpZiBAc2F2ZUdhbWVcbiAgICAgICAgICAgIGhlYWRlciA9IEBjcmVhdGVTYXZlR2FtZUhlYWRlcih0aHVtYldpZHRoLCB0aHVtYkhlaWdodClcbiAgICAgICAgICAgIEBzYXZlR2FtZVNsb3RzW3Nsb3RdID0gQGNyZWF0ZVNhdmVHYW1lU2xvdChoZWFkZXIpXG4gICAgICAgICAgICBAc3RvcmVTYXZlR2FtZShcIlNhdmVHYW1lXyN7c2xvdH1cIiwgQHNhdmVHYW1lLCBoZWFkZXIpXG4gICAgICAgICAgICBAc2NlbmVEYXRhID0ge31cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIEBzYXZlR2FtZVxuICAgIFxuICAgIHJlc3RvcmU6IChzYXZlR2FtZSkgLT5cbiAgICAgICAgQGJhY2tsb2cgPSBzYXZlR2FtZS5kYXRhLmJhY2tsb2dcbiAgICAgICAgQGRlZmF1bHRzID0gc2F2ZUdhbWUuZGF0YS5kZWZhdWx0c1xuICAgICAgICBAdmFyaWFibGVTdG9yZSA9IHNhdmVHYW1lLmRhdGEudmFyaWFibGVTdG9yZVxuICAgICAgICBAc2NlbmVEYXRhID0gc2F2ZUdhbWUuZGF0YVxuICAgICAgICBAc2F2ZUdhbWUgPSBudWxsXG4gICAgICAgIEBsb2FkZWRTYXZlR2FtZSA9IG51bGxcbiAgICAgICAgQHRlbXBGaWVsZHMgPSBzYXZlR2FtZS5kYXRhLnRlbXBGaWVsZHNcbiAgICAgICAgQGNoYXJhY3RlclBhcmFtcyA9IHNhdmVHYW1lLmRhdGEuY2hhcmFjdGVyUGFyYW1zXG4gICAgICAgIHdpbmRvdy4kdGVtcEZpZWxkcyA9IEB0ZW1wRmllbGRzXG4gICAgICAgIHdpbmRvdy4kZGF0YUZpZWxkcy5iYWNrbG9nID0gQGJhY2tsb2dcbiAgICAgICAgICAgIFxuICAgIFxuICAgIHByZXBhcmVMb2FkR2FtZTogLT5cbiAgICAgICAgQXVkaW9NYW5hZ2VyLnN0b3BBbGxNdXNpYygzMClcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogTG9hZHMgdGhlIGdhbWUgZnJvbSB0aGUgc3BlY2lmaWVkIHNhdmUgZ2FtZSBzbG90LiBUaGlzIG1ldGhvZCB0cmlnZ2Vyc1xuICAgICogYSBhdXRvbWF0aWMgc2NlbmUgY2hhbmdlLlxuICAgICpcbiAgICAqIEBtZXRob2QgbG9hZFxuICAgICogQHBhcmFtIHtudW1iZXJ9IHNsb3QgLSBUaGUgc2xvdCB3aGVyZSB0aGUgZ2FtZSBzaG91bGQgYmUgbG9hZGVkIGZyb20uXG4gICAgIyMjICAgICAgICBcbiAgICBsb2FkOiAoc2xvdCkgLT5cbiAgICAgICAgcmV0dXJuIGlmICFAc2F2ZUdhbWVTbG90c1tzbG90XSBvciBAc2F2ZUdhbWVTbG90c1tzbG90XS5kYXRlLnRyaW0oKS5sZW5ndGggPT0gMFxuICAgICAgICBcbiAgICAgICAgQHByZXBhcmVMb2FkR2FtZSgpXG4gICAgICAgIEBsb2FkZWRTYXZlR2FtZSA9IEBsb2FkU2F2ZUdhbWUoXCJTYXZlR2FtZV8je3Nsb3R9XCIpXG4gICAgICAgIFxuICAgICAgICBcbiAgICAgICAgU2NlbmVNYW5hZ2VyLnN3aXRjaFRvKG5ldyB2bi5PYmplY3RfU2NlbmUoKSlcbiAgICAgICAgU2NlbmVNYW5hZ2VyLmNsZWFyKClcbiAgICAgICAgXG4gICAgICAgIFxuICAgIGxvYWRTYXZlR2FtZTogKG5hbWUpIC0+IEpTT04ucGFyc2UoR2FtZVN0b3JhZ2UuZ2V0RGF0YShuYW1lKSlcbiAgICAgICAgXG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIEdldHMgdGhlIHNhdmUgZ2FtZSBkYXRhIGZvciBhIHNwZWNpZmllZCBzbG90LlxuICAgICpcbiAgICAqIEBtZXRob2QgZ2V0U2F2ZUdhbWVcbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBzbG90IC0gVGhlIHNsb3QgdG8gZ2V0IHRoZSBzYXZlIGRhdGEgZnJvbS5cbiAgICAqIEByZXR1cm4ge09iamVjdH0gVGhlIHNhdmUgZ2FtZSBkYXRhLlxuICAgICMjIyAgICAgICAgXG4gICAgZ2V0U2F2ZUdhbWU6IChzbG90KSAtPiBKU09OLnBhcnNlKEdhbWVTdG9yYWdlLmdldERhdGEoXCJTYXZlR2FtZV8je3Nsb3R9XCIpKVxuICAgIFxud2luZG93LkdhbWVNYW5hZ2VyID0gbmV3IEdhbWVNYW5hZ2VyKClcbmdzLkdhbWVNYW5hZ2VyID0gd2luZG93LkdhbWVNYW5hZ2VyIl19\n//# sourceURL=GameManager_27.js",
        "parentId": "C0268943K60B3A42B7SA6F1EDDCF2F642FD7"
    },
    "summary": [
        "name",
        "type",
        "order"
    ]
}

Commits for Nextrek/s2s/data/9D2D1D14K49FAA43CBS8582E7937AF84F3A2.json

Diff revisions: vs.
Revision Author Commited Message
1086 Diff Diff ASorrentino picture ASorrentino Fri 11 May, 2018 21:50:37 +0000
1084 MOliva picture MOliva Fri 11 May, 2018 12:41:55 +0000