Subversion Repository Public Repository

Nextrek

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
    "uid": "7AD6803FKBBC9A4E4CSAF66EFC2E93FF462D",
    "isLoaded": true,
    "lastModificationTime": 0,
    "items": {
        "name": "Component_LayoutSceneBehavior",
        "type": "game_script",
        "order": 1,
        "content": "# ===================================================================\n#\n#   Script: Component_LayoutSceneBehavior \n#\n#   $$COPYRIGHT$$\n#\n# ===================================================================\nclass Component_LayoutSceneBehavior extends gs.Component_SceneBehavior\n  #  @objectCodecBlackList = [\"objectManager\"]\n    ###*\n    * The base class of all scene-behavior components. A scene-behavior component\n    * define the logic of a single game scene. \n    *\n    * @module gs\n    * @class Component_LayoutSceneBehavior\n    * @extends gs.Component_SceneBehavior\n    * @memberof gs\n    ###\n    constructor: ->\n        super()\n        \n        @objectManager = SceneManager\n        @layout = null\n        @resourceContext = null\n    \n    ###*\n    * Initializes the scene. \n    *\n    * @method initialize\n    ###    \n    initialize: ->\n        super\n        \n        @resourceContext = ResourceManager.createContext()\n        ResourceManager.context = @resourceContext\n        \n        if not @object.layoutData?\n            @object.layoutData = { \"type\": \"ui.FreeLayout\", \"controls\": [], \"frame\": [0, 0, 1, 1] }\n            \n        LanguageManager.loadBundles()\n        \n    ###*\n    * Disposes the scene. \n    *\n    * @method dispose\n    ###\n    dispose: ->\n        super\n     \n    ###*\n    * Prepares all data for the scene and loads the necessary graphic and audio resources.\n    *\n    * @method prepareData\n    * @abstract\n    ###    \n    prepareData: ->\n        gs.ObjectManager.current = @objectManager\n        \n        if not GameManager.initialized\n            GameManager.initialize()\n            \n        @dataFields = ui.UiFactory.dataSources[@object.layoutData.dataSource || \"default\"]()\n        window.$dataFields = @dataFields\n        @music = ui.Component_FormulaHandler.fieldValue(@object, @object.layoutData.music)\n        AudioManager.loadMusic(@music)\n        @prepareTransition(RecordManager.system.menuTransition)\n        \n        ResourceLoader.loadUiTypesGraphics(ui.UiFactory.customTypes)\n        ResourceLoader.loadUiLayoutGraphics(@object.layoutData)\n        \n        if @dataFields?\n            ResourceLoader.loadUiDataFieldsGraphics(@dataFields)\n        ResourceManager.getBitmap(\"Graphics/Characters/JaneDate_Normal\")\n     \n    ###*\n    * Prepares all visual game object for the scene.\n    *\n    * @method prepareVisual\n    ###         \n    prepareVisual: ->\n        scale = Graphics.scale\n        vocab = RecordManager.vocabulary\n\n        if not @layout?\n            @dataObject = {}\n            @layout = ui.UiFactory.createFromDescriptor(@object.layoutData, @object)\n    \n            if @music?\n                AudioManager.changeMusic(@music, 30)\n\n                        \n        @layout.ui.prepare()\n        @layout.ui.appear()\n        @layout.update()\n        \n        @transition()\n        \n        if SceneManager.previousScenes.length == 0\n            if GameManager.tempFields.isExitingGame\n                GameManager.tempFields.isExitingGame = no\n                gs.GameNotifier.postResetSceneChange(@object.layoutName)\n            else\n                gs.GameNotifier.postSceneChange(@object.layoutName)\n     \n    ###*\n    * Updates the scene's content.\n    *\n    * @method updateContent\n    ###    \n    updateContent: ->\n        GameManager.update()\n        Graphics.viewport.update()\n     \n    ###*\n    * Shows/Hides the current scene. A hidden scene is no longer shown and executed\n    * but all objects and data is still there and be shown again anytime.\n    *\n    * @method show\n    * @param {boolean} visible - Indicates if the scene should be shown or hidden.\n    ###          \n    show: (visible) ->\n        if visible\n            ResourceManager.context = @resourceContext\n        @layout.visible = visible\n        @layout.update()\n        @objectManager.active = visible\n        if visible\n            gs.ObjectManager.current = SceneManager #@objectManager\n        #@objectManager.update()\n     \n    ###*\n    * Action method which triggers a full refresh on the object returned by the specified binding-expression.\n    * The params must be a direct binding-expression string.\n    *\n    * @method fullRefreshObject\n    * @param {gs.Object_Base} sender - The sender object.\n    * @param {string} params -  The binding expression.\n    ###    \n    fullRefreshObject: (sender, object) ->\n        object = ui.Component_FormulaHandler.fieldValue(sender, object)\n        object?.fullRefresh()\n      \n    ###*\n    * Action method which triggers a refresh on the object returned by the specified binding-expression.\n    * The params must be a direct binding-expression string.\n    *\n    * @method refreshObject\n    * @param {gs.Object_Base} sender - The sender object.\n    * @param {string} params -  The binding expression.\n    ###    \n    refreshObject: (sender, object) ->\n        object = ui.Component_FormulaHandler.fieldValue(sender, object)\n        object?.needsUpdate = true\n        \n    addStyle: (sender, style) ->\n        styleObject = ui.UIManager.styles[style]\n        styleObject?.apply(sender)\n        sender.needsUpdate = yes\n        if styleObject?.font\n            sender.behavior.refresh()\n        \n    removeStyle: (sender, style) -> \n        styleObject = ui.UIManager.styles[style]\n        styleObject?.revert(sender)\n        sender.descriptor.styles.remove(style)\n        \n        for s in sender.descriptor.styles\n            ui.UIManager.styles[s]?.apply(sender)\n        sender.needsUpdate = yes\n        if styleObject?.font\n            sender.behavior.refresh()\n            \n    \n    \n    ###*\n    * Action method which executes the specified bindings.\n    *\n    * @method executeBindings\n    * @param {gs.Object_Base} sender - The sender object.\n    * @param {Object[]} params -  An array of binding-definitions.\n    ### \n    executeBindings: (sender, bindings) ->\n        for binding in bindings\n            ui.Component_FormulaHandler.executeBinding(sender, binding)\n            \n        return null\n    \n    ###*\n    * Action method which executes the specified formulas.\n    *\n    * @method executeFormulas\n    * @param {gs.Object_Base} sender - The sender object.\n    * @param {ui.Formula[]} params -  An array of formula-definitions.\n    ###  \n    executeFormulas: (sender, formulas) ->\n        for formula in formulas\n            ui.Component_FormulaHandler.executeFormula(sender, formula)\n    \n    ###*\n    * Action method which executes an animation on a specified target game object.\n    *\n    * @method executeAnimation\n    * @param {gs.Object_Base} sender - The sender object.\n    * @param {Object} params -  Contains target-id and animations: { target, animations }\n    ###         \n    executeAnimation: (sender, params) ->\n        object = ui.Component_FormulaHandler.fieldValue(sender, params.target)\n        animation = object?.animations.first (a) -> a.event == params.event\n        \n        if animation and object\n            object.animationExecutor.execute(animation)\n            \n    ###*\n    * Action method which emits the specified event.\n    *\n    * @method emitEvent\n    * @param {gs.Object_Base} sender - The sender object.\n    * @param {Object} params - Contains event name, source and data.\n    * <ul>\n    * <li>params.name - The name of the event to emit</li>\n    * <li>params.source - A binding-expression to define the game object which should emit the event.</li>\n    * <li>params.data - An object containing additional event specific data.</li>\n    * </ul>\n    ###    \n    emitEvent: (sender, params) ->\n        object = ui.Component_FormulaHandler.fieldValue(sender, params.source)\n        object?.events.emit(params.name, object, ui.Component_FormulaHandler.fieldValue(sender, params.data))\n    \n    ###*\n    * Action method which changes the game's aspect ratio.\n    *\n    * @method executeBindings\n    * @param {gs.Object_Base} sender - The sender object.\n    * @param {boolean} params -  If <b>true</b> the game screen will stretched so that it fills the entire screen\n    * of the player without any black borders. Otherwise the game screen stretches but keeps its ratio\n    * so black borders are possible if the game resolution's ratio and the target display's ratio are not match. It can also\n    * be a binding-expression.\n    ###\n    adjustAspectRatio: (sender, adjust) ->\n        adjust = ui.Component_FormulaHandler.fieldValue(sender, adjust)\n    \n        GameManager.settings.adjustAspectRatio = adjust\n        Graphics.keepRatio = !adjust\n        Graphics.onResize()\n        \n    ###*\n    * Action method which enters fullscreen mode.\n    *\n    * @method enterFullScreen\n    * @param {gs.Object_Base} sender - The sender object.\n    * @param {boolean} params - Can be <b>null</b>\n    ###\n    enterFullScreen: (sender, params) -> \n        gs.Graphics.enterFullscreen()\n        GameManager.settings.fullScreen = Graphics.isFullscreen()\n        \n            \n    ###*\n    * Action method which leaves fullscreen mode.\n    *\n    * @method leaveFullScreen\n    * @param {gs.Object_Base} sender - The sender object.\n    * @param {boolean} params - Can be <b>null</b>\n    ###\n    leaveFullScreen: -> \n        gs.Graphics.leaveFullscreen()\n        GameManager.settings.fullScreen = Graphics.isFullscreen()\n        \n    ###*\n    * Action method which toggles between window and fullscreen mode.\n    *\n    * @method toggleFullScreen\n    * @param {gs.Object_Base} sender - The sender object.\n    * @param {boolean|string} params - Can be <b>null</b>\n    ###\n    toggleFullScreen: (sender, params) ->\n        if gs.Graphics.isFullscreen()\n            gs.Graphics.leaveFullscreen()\n        else\n            gs.Graphics.enterFullscreen()\n\n        GameManager.settings.fullScreen = gs.Graphics.isFullscreen()\n      \n    ###*\n    * Action method which plays the specified sound.\n    *\n    * @method playSound\n    * @param {gs.Object_Base} sender - The sender object.\n    * @param {Object} params - The sound to play.\n    ###\n    playSound: (sender, params) ->\n        AudioManager.loadSound(params)\n        AudioManager.playSound(params)\n        \n    ###*\n    * Action method which plays the specified voice.\n    *\n    * @method playVoice\n    * @param {gs.Object_Base} sender - The sender object.\n    * @param {Object} params - The voice to play.\n    ###\n    playVoice: (sender, params) ->\n        AudioManager.loadSound(params)\n        AudioManager.playVoice(params)\n      \n     \n    ###*\n    * Action method which turns voice on or off.\n    *\n    * @method turnOnOffVoice\n    * @param {gs.Object_Base} sender - The sender object.\n    * @param {boolean|string} params - If <b>true</b> voice will be turned on. Otherwise it will be turned off. Can also be a binding-expression.\n    ### \n    turnOnOffVoice: (sender, state) ->\n        if ui.Component_FormulaHandler.fieldValue(sender, state) then @turnOnVoice() else @turnOffVoice()\n        \n    ###*\n    * Action method which turns music on or off.\n    *\n    * @method turnOnOffMusic\n    * @param {gs.Object_Base} sender - The sender object.\n    * @param {boolean|string} params - If <b>true</b> music will be turned on. Otherwise it will be turned off. Can also be a binding-expression.\n    ### \n    turnOnOffMusic: (sender, state) ->\n        if ui.Component_FormulaHandler.fieldValue(sender, state) then @turnOnMusic() else @turnOffMusic()\n        \n    ###*\n    * Action method which turns sound on or off.\n    *\n    * @method turnOnOffSound\n    * @param {gs.Object_Base} sender - The sender object.\n    * @param {boolean|string} params - If <b>true</b> sound will be turned on. Otherwise it will be turned off. Can also be a binding-expression.\n    ### \n    turnOnOffSound: (sender, state) ->\n        if ui.Component_FormulaHandler.fieldValue(sender, state) then @turnOnSound() else @turnOffSound()\n        \n    ###*\n    * Action method which turns off voice.\n    *\n    * @method turnOffVoice\n    * @param {gs.Object_Base} sender - The sender object.\n    * @param {boolean|string} params - Can be <b>null</b>.\n    ### \n    turnOffVoice: ->\n        AudioManager.stopAllVoices()\n        \n    ###*\n    * Action method which turns off music.\n    *\n    * @method turnOffMusic\n    * @param {gs.Object_Base} sender - The sender object.\n    * @param {boolean|string} params - Can be <b>null</b>.\n    ### \n    turnOffMusic: ->\n        AudioManager.stopMusic()\n        \n    ###*\n    * Action method which turns off sound.\n    *\n    * @method turnOffSound\n    * @param {gs.Object_Base} sender - The sender object.\n    * @param {boolean|string} params - Can be <b>null</b>.\n    ### \n    turnOffSound: ->\n        AudioManager.stopAllSounds()\n        \n    ###*\n    * Action method which turns on voice.\n    *\n    * @method turnOnVoice\n    * @param {gs.Object_Base} sender - The sender object.\n    * @param {boolean|string} params - Can be <b>null</b>.\n    ### \n    turnOnVoice: ->\n        \n    ###*\n    * Action method which turns on sound.\n    *\n    * @method turnOnSound\n    * @param {gs.Object_Base} sender - The sender object.\n    * @param {boolean|string} params - Can be <b>null</b>.\n    ### \n    turnOnSound: ->\n        \n    ###*\n    * Action method which turns on music.\n    *\n    * @method turnOnMusic\n    * @param {gs.Object_Base} sender - The sender object.\n    * @param {boolean|string} params - Can be <b>null</b>.\n    ### \n    turnOnMusic: ->\n        AudioManager.resumeMusic()\n        \n    ###*\n    * Action method which selects the specified language.\n    *\n    * @method selectLanguage\n    * @param {gs.Object_Base} sender - The sender object.\n    * @param {number|string} params - Index of the language to set. Can be a binding-expression.\n    ### \n    selectLanguage: (sender, params)->\n        language = LanguageManager.languages[ui.Component_FormulaHandler.fieldValue(sender, params)]\n        LanguageManager.selectLanguage(language)\n       \n    ###*\n    * Action method which resets global data storage.\n    *\n    * @method resetGlobalData\n    * @param {gs.Object_Base} sender - The sender object.\n    * @param {Object} params - Can be <b>null</b>.\n    ### \n    resetGlobalData: (sender) -> \n        GameManager.resetGlobalData()\n    \n    ###*\n    * Action method which saves game settings.\n    *\n    * @method saveSettings\n    * @param {gs.Object_Base} sender - The sender object.\n    * @param {Object} params - Can be <b>null</b>.\n    ### \n    saveSettings: (sender) -> GameManager.saveSettings()\n    \n    ###*\n    * Action method which prepares the game for saving by taking a snapshot of the current game state\n    * and storing it in GameManager.saveGame.\n    *\n    * @method prepareSaveGame\n    * @param {gs.Object_Base} sender - The sender object.\n    * @param {Object} params - Can be <b>null</b>.\n    ### \n    prepareSaveGame: (sender, params) ->\n        GameManager.prepareSaveGame(params?.snapshot)\n        \n    ###*\n    * Action method which saves the current game at the specified save slot.\n    *\n    * @method saveGame\n    * @param {gs.Object_Base} sender - The sender object.\n    * @param {Object} params - Contains the slot-index where the game should be saved.\n    * <ul>\n    * <li>params.slot - The slot-index where the game should be saved. Can be a binding-expression.</li>\n    * </ul>\n    ### \n    saveGame: (sender, params) -> GameManager.save(ui.Component_FormulaHandler.fieldValue(sender, params.slot))\n    \n    ###*\n    * Action method which loads the game from the specified save slot.\n    *\n    * @method loadGame\n    * @param {gs.Object_Base} sender - The sender object.\n    * @param {Object} params - Contains the slot-index where the game should be loaded from.\n    * <ul>\n    * <li>params.slot - The slot-index where the game should be loaded from. Can be a binding-expression.</li>\n    * </ul>\n    ### \n    loadGame: (sender, params) ->\n        GameManager.tempSettings.skip = no\n        GameManager.load(ui.Component_FormulaHandler.fieldValue(sender, params.slot))\n     \n    ###*\n    * Action method which starts a new game.\n    *\n    * @method newGame\n    * @param {gs.Object_Base} sender - The sender object.\n    * @param {Object} params - Can be <b>null</b>\n    ### \n    newGame: (sender, params) ->\n        AudioManager.stopAllMusic(30)\n        GameManager.newGame()\n        \n        scene = new vn.Object_Scene()\n        SceneManager.clear()\n        SceneManager.switchTo(scene)\n    \n    ###*\n    * Action method which exists the current game. It doesn't change the scene and\n    * should be called before switching back to the title screen or main menu.\n    *\n    * @method exitGame\n    * @param {gs.Object_Base} sender - The sender object.\n    * @param {Object} params - Can be <b>null</b>\n    ### \n    exitGame: (sender, params) ->\n        GameManager.exitGame()\n        \n    ###*\n    * Action method which switches to another scene.\n    *\n    * @method switchScene\n    * @param {gs.Object_Base} sender - The sender object.\n    * @param {Object} params - Contains the class name of the scene to switch to.\n    * <ul>\n    * <li>params.name - The class-name of the scene to switch to. The class must be defined in vn-namespace.</li>\n    * </ul>\n    ###     \n    switchScene: (sender, params) ->\n        f = =>\n            if params.clear\n                SceneManager.clear()\n                \n            scene = new vn[params.name]()\n            SceneManager.switchTo(scene, params.savePrevious)\n            \n        if !params.savePrevious\n            @layout.ui.disappear (e) => f()\n        else\n            f()\n        \n    ###*\n    * Action method which switches to another game scene.\n    *\n    * @method switchGameScene\n    * @param {gs.Object_Base} sender - The sender object.\n    * @param {Object} params - Contains the UID of the scene to switch to.\n    * <ul>\n    * <li>params.uid - The UID of the scene to switch to.</li>\n    * </ul>\n    ###    \n    switchGameScene: (sender, params) ->\n        f = =>\n            if params.clear\n                SceneManager.clear()\n                \n            uid = params.uid\n            if params.name\n                sceneDocuments = DataManager.getDocumentsByType(\"vn.scene\")\n                sceneDocument = sceneDocuments.first (d) -> d.items.name == params.name\n                if sceneDocument\n                    uid = sceneDocument.uid\n            \n            sceneData = uid: uid, pictures: [], texts: []\n            GameManager.sceneData = sceneData\n            newScene = new vn.Object_Scene()\n            newScene.sceneData = sceneData\n            \n            SceneManager.switchTo(newScene, params.savePrevious)\n            \n        if !params.savePrevious\n            (@layout||@object.layout).ui.disappear (e) => f()\n        else\n            f()\n    \n    ###*\n    * Action method which switches to another layout.\n    *\n    * @method switchLayout\n    * @param {gs.Object_Base} sender - The sender object.\n    * @param {Object} params - Contains the name of the layout to switch to.\n    * <ul>\n    * <li>params.name - The name of the layout to switch to.</li>\n    * <li>params.savePrevious - Indicates if the current layout should not be erased but paused and hidden instead so\n    * that it can be restored using <i>returnToPrevious</i> action.</li>\n    * <li>params.dataFields - Defines the data of \"$dataFields\" binding-expression variable. Can be a binding-expression\n    * or a direct object. Optional.</li>\n    * </ul>\n    ###    \n    switchLayout: (sender, layout) ->\n        f = =>\n            Graphics.freeze()\n            if layout.clear\n                SceneManager.clear()\n                \n            scene = new gs.Object_Layout(layout.name)\n          \n            dataFields = sender.dataFields\n            if typeof layout.dataFields == \"string\"\n                dataFields = ui.Component_FormulaHandler.fieldValue(sender, layout.dataFields)\n            else if layout.dataFields?\n                dataFields = layout.dataFields\n                \n            scene.dataFields = dataFields\n            scene.controllers = layout.controllers\n            \n            if layout.senderData?\n                for senderField in layout.senderData\n                    scene[senderField] = sender[senderField]\n            SceneManager.switchTo(scene, layout.savePrevious, layout.stack)\n        \n        if !layout.savePrevious\n            (@layout||@object.layout).ui.disappear (e) => f()\n        else\n            f()\n     \n    ###*\n    * Action method which returns to previous layout. (If savePrevious was set to <b>true</b> on switchLayout.).\n    *\n    * @method previousLayout\n    * @param {gs.Object_Base} sender - The sender object.\n    * @param {Object} params - Can be <b>null</b>.\n    ###     \n    previousLayout: (sender) ->\n        SceneManager.returnToPrevious()\n      \n    ###*\n    * Action method which disposes the specified control.\n    *\n    * @method disposeControl\n    * @param {gs.Object_Base} sender - The sender object.\n    * @param {string} params - The ID of the control to dispose. Can be a binding-expression.\n    ###    \n    disposeControl: (sender, id) ->\n        control = @objectManager.objectById(ui.Component_FormulaHandler.fieldValue(sender, id))\n        \n        \n        control?.ui.disappear (sender) -> sender.dispose()\n    \n    ###*\n    * Action method which creates a new control from the specified descriptor.\n    *\n    * @method createControl\n    * @param {gs.Object_Base} sender - The sender object.\n    * @param {string} params - Contains the descriptor and other data needed to construct the control.\n    * <ul>\n    * <li>params.descriptor - The control' descriptor. Can be a direct descriptor definition or a template name</li>\n    * <li>params.parent - A binding-expression which returns the control's parent.</li>\n    * <li>params.senderData - An object containing additional data merged into the control object.</li>\n    * </ul>\n    ###  \n    createControl: (sender, data) ->\n        if typeof data.descriptor == \"string\"\n            descriptor = ui.UIManager.customTypes[data.descriptor]\n        else\n            descriptor = data.descriptor\n        \n        parent = ui.Component_FormulaHandler.fieldValue(sender, data.parent)\n        control = ui.UiFactory._createFromDescriptor(descriptor, parent ? (@object.layout||@object) )\n        \n        if data.senderData?\n            for fieldName in data.senderData\n                control[fieldName] = sender[fieldName]\n        control.ui.prepare()\n        control.ui.appear()\n        \n        return control\n        \n    ###*\n    * Action method which quits the game.\n    *\n    * @method quitGame\n    * @param {gs.Object_Base} sender - The sender object.\n    * @param {string} params - Can be <b>null</b>.\n    ### \n    quitGame: (sender, data) ->\n        SceneManager.switchTo(null)\n            \n        \n        \ngs.Component_LayoutSceneBehavior = Component_LayoutSceneBehavior",
        "parentId": "0C1D8BE8KDB63A469AS9782EB90E63254DB3",
        "folder": false,
        "compiledContent": "var Component_LayoutSceneBehavior,\n  extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n  hasProp = {}.hasOwnProperty;\n\nComponent_LayoutSceneBehavior = (function(superClass) {\n  extend(Component_LayoutSceneBehavior, superClass);\n\n\n  /**\n  * The base class of all scene-behavior components. A scene-behavior component\n  * define the logic of a single game scene. \n  *\n  * @module gs\n  * @class Component_LayoutSceneBehavior\n  * @extends gs.Component_SceneBehavior\n  * @memberof gs\n   */\n\n  function Component_LayoutSceneBehavior() {\n    Component_LayoutSceneBehavior.__super__.constructor.call(this);\n    this.objectManager = SceneManager;\n    this.layout = null;\n    this.resourceContext = null;\n  }\n\n\n  /**\n  * Initializes the scene. \n  *\n  * @method initialize\n   */\n\n  Component_LayoutSceneBehavior.prototype.initialize = function() {\n    Component_LayoutSceneBehavior.__super__.initialize.apply(this, arguments);\n    this.resourceContext = ResourceManager.createContext();\n    ResourceManager.context = this.resourceContext;\n    if (this.object.layoutData == null) {\n      this.object.layoutData = {\n        \"type\": \"ui.FreeLayout\",\n        \"controls\": [],\n        \"frame\": [0, 0, 1, 1]\n      };\n    }\n    return LanguageManager.loadBundles();\n  };\n\n\n  /**\n  * Disposes the scene. \n  *\n  * @method dispose\n   */\n\n  Component_LayoutSceneBehavior.prototype.dispose = function() {\n    return Component_LayoutSceneBehavior.__super__.dispose.apply(this, arguments);\n  };\n\n\n  /**\n  * Prepares all data for the scene and loads the necessary graphic and audio resources.\n  *\n  * @method prepareData\n  * @abstract\n   */\n\n  Component_LayoutSceneBehavior.prototype.prepareData = function() {\n    gs.ObjectManager.current = this.objectManager;\n    if (!GameManager.initialized) {\n      GameManager.initialize();\n    }\n    this.dataFields = ui.UiFactory.dataSources[this.object.layoutData.dataSource || \"default\"]();\n    window.$dataFields = this.dataFields;\n    this.music = ui.Component_FormulaHandler.fieldValue(this.object, this.object.layoutData.music);\n    AudioManager.loadMusic(this.music);\n    this.prepareTransition(RecordManager.system.menuTransition);\n    ResourceLoader.loadUiTypesGraphics(ui.UiFactory.customTypes);\n    ResourceLoader.loadUiLayoutGraphics(this.object.layoutData);\n    if (this.dataFields != null) {\n      ResourceLoader.loadUiDataFieldsGraphics(this.dataFields);\n    }\n    return ResourceManager.getBitmap(\"Graphics/Characters/JaneDate_Normal\");\n  };\n\n\n  /**\n  * Prepares all visual game object for the scene.\n  *\n  * @method prepareVisual\n   */\n\n  Component_LayoutSceneBehavior.prototype.prepareVisual = function() {\n    var scale, vocab;\n    scale = Graphics.scale;\n    vocab = RecordManager.vocabulary;\n    if (this.layout == null) {\n      this.dataObject = {};\n      this.layout = ui.UiFactory.createFromDescriptor(this.object.layoutData, this.object);\n      if (this.music != null) {\n        AudioManager.changeMusic(this.music, 30);\n      }\n    }\n    this.layout.ui.prepare();\n    this.layout.ui.appear();\n    this.layout.update();\n    this.transition();\n    if (SceneManager.previousScenes.length === 0) {\n      if (GameManager.tempFields.isExitingGame) {\n        GameManager.tempFields.isExitingGame = false;\n        return gs.GameNotifier.postResetSceneChange(this.object.layoutName);\n      } else {\n        return gs.GameNotifier.postSceneChange(this.object.layoutName);\n      }\n    }\n  };\n\n\n  /**\n  * Updates the scene's content.\n  *\n  * @method updateContent\n   */\n\n  Component_LayoutSceneBehavior.prototype.updateContent = function() {\n    GameManager.update();\n    return Graphics.viewport.update();\n  };\n\n\n  /**\n  * Shows/Hides the current scene. A hidden scene is no longer shown and executed\n  * but all objects and data is still there and be shown again anytime.\n  *\n  * @method show\n  * @param {boolean} visible - Indicates if the scene should be shown or hidden.\n   */\n\n  Component_LayoutSceneBehavior.prototype.show = function(visible) {\n    if (visible) {\n      ResourceManager.context = this.resourceContext;\n    }\n    this.layout.visible = visible;\n    this.layout.update();\n    this.objectManager.active = visible;\n    if (visible) {\n      return gs.ObjectManager.current = SceneManager;\n    }\n  };\n\n\n  /**\n  * Action method which triggers a full refresh on the object returned by the specified binding-expression.\n  * The params must be a direct binding-expression string.\n  *\n  * @method fullRefreshObject\n  * @param {gs.Object_Base} sender - The sender object.\n  * @param {string} params -  The binding expression.\n   */\n\n  Component_LayoutSceneBehavior.prototype.fullRefreshObject = function(sender, object) {\n    object = ui.Component_FormulaHandler.fieldValue(sender, object);\n    return object != null ? object.fullRefresh() : void 0;\n  };\n\n\n  /**\n  * Action method which triggers a refresh on the object returned by the specified binding-expression.\n  * The params must be a direct binding-expression string.\n  *\n  * @method refreshObject\n  * @param {gs.Object_Base} sender - The sender object.\n  * @param {string} params -  The binding expression.\n   */\n\n  Component_LayoutSceneBehavior.prototype.refreshObject = function(sender, object) {\n    object = ui.Component_FormulaHandler.fieldValue(sender, object);\n    return object != null ? object.needsUpdate = true : void 0;\n  };\n\n  Component_LayoutSceneBehavior.prototype.addStyle = function(sender, style) {\n    var styleObject;\n    styleObject = ui.UIManager.styles[style];\n    if (styleObject != null) {\n      styleObject.apply(sender);\n    }\n    sender.needsUpdate = true;\n    if (styleObject != null ? styleObject.font : void 0) {\n      return sender.behavior.refresh();\n    }\n  };\n\n  Component_LayoutSceneBehavior.prototype.removeStyle = function(sender, style) {\n    var i, len, ref, ref1, s, styleObject;\n    styleObject = ui.UIManager.styles[style];\n    if (styleObject != null) {\n      styleObject.revert(sender);\n    }\n    sender.descriptor.styles.remove(style);\n    ref = sender.descriptor.styles;\n    for (i = 0, len = ref.length; i < len; i++) {\n      s = ref[i];\n      if ((ref1 = ui.UIManager.styles[s]) != null) {\n        ref1.apply(sender);\n      }\n    }\n    sender.needsUpdate = true;\n    if (styleObject != null ? styleObject.font : void 0) {\n      return sender.behavior.refresh();\n    }\n  };\n\n\n  /**\n  * Action method which executes the specified bindings.\n  *\n  * @method executeBindings\n  * @param {gs.Object_Base} sender - The sender object.\n  * @param {Object[]} params -  An array of binding-definitions.\n   */\n\n  Component_LayoutSceneBehavior.prototype.executeBindings = function(sender, bindings) {\n    var binding, i, len;\n    for (i = 0, len = bindings.length; i < len; i++) {\n      binding = bindings[i];\n      ui.Component_FormulaHandler.executeBinding(sender, binding);\n    }\n    return null;\n  };\n\n\n  /**\n  * Action method which executes the specified formulas.\n  *\n  * @method executeFormulas\n  * @param {gs.Object_Base} sender - The sender object.\n  * @param {ui.Formula[]} params -  An array of formula-definitions.\n   */\n\n  Component_LayoutSceneBehavior.prototype.executeFormulas = function(sender, formulas) {\n    var formula, i, len, results;\n    results = [];\n    for (i = 0, len = formulas.length; i < len; i++) {\n      formula = formulas[i];\n      results.push(ui.Component_FormulaHandler.executeFormula(sender, formula));\n    }\n    return results;\n  };\n\n\n  /**\n  * Action method which executes an animation on a specified target game object.\n  *\n  * @method executeAnimation\n  * @param {gs.Object_Base} sender - The sender object.\n  * @param {Object} params -  Contains target-id and animations: { target, animations }\n   */\n\n  Component_LayoutSceneBehavior.prototype.executeAnimation = function(sender, params) {\n    var animation, object;\n    object = ui.Component_FormulaHandler.fieldValue(sender, params.target);\n    animation = object != null ? object.animations.first(function(a) {\n      return a.event === params.event;\n    }) : void 0;\n    if (animation && object) {\n      return object.animationExecutor.execute(animation);\n    }\n  };\n\n\n  /**\n  * Action method which emits the specified event.\n  *\n  * @method emitEvent\n  * @param {gs.Object_Base} sender - The sender object.\n  * @param {Object} params - Contains event name, source and data.\n  * <ul>\n  * <li>params.name - The name of the event to emit</li>\n  * <li>params.source - A binding-expression to define the game object which should emit the event.</li>\n  * <li>params.data - An object containing additional event specific data.</li>\n  * </ul>\n   */\n\n  Component_LayoutSceneBehavior.prototype.emitEvent = function(sender, params) {\n    var object;\n    object = ui.Component_FormulaHandler.fieldValue(sender, params.source);\n    return object != null ? object.events.emit(params.name, object, ui.Component_FormulaHandler.fieldValue(sender, params.data)) : void 0;\n  };\n\n\n  /**\n  * Action method which changes the game's aspect ratio.\n  *\n  * @method executeBindings\n  * @param {gs.Object_Base} sender - The sender object.\n  * @param {boolean} params -  If <b>true</b> the game screen will stretched so that it fills the entire screen\n  * of the player without any black borders. Otherwise the game screen stretches but keeps its ratio\n  * so black borders are possible if the game resolution's ratio and the target display's ratio are not match. It can also\n  * be a binding-expression.\n   */\n\n  Component_LayoutSceneBehavior.prototype.adjustAspectRatio = function(sender, adjust) {\n    adjust = ui.Component_FormulaHandler.fieldValue(sender, adjust);\n    GameManager.settings.adjustAspectRatio = adjust;\n    Graphics.keepRatio = !adjust;\n    return Graphics.onResize();\n  };\n\n\n  /**\n  * Action method which enters fullscreen mode.\n  *\n  * @method enterFullScreen\n  * @param {gs.Object_Base} sender - The sender object.\n  * @param {boolean} params - Can be <b>null</b>\n   */\n\n  Component_LayoutSceneBehavior.prototype.enterFullScreen = function(sender, params) {\n    gs.Graphics.enterFullscreen();\n    return GameManager.settings.fullScreen = Graphics.isFullscreen();\n  };\n\n\n  /**\n  * Action method which leaves fullscreen mode.\n  *\n  * @method leaveFullScreen\n  * @param {gs.Object_Base} sender - The sender object.\n  * @param {boolean} params - Can be <b>null</b>\n   */\n\n  Component_LayoutSceneBehavior.prototype.leaveFullScreen = function() {\n    gs.Graphics.leaveFullscreen();\n    return GameManager.settings.fullScreen = Graphics.isFullscreen();\n  };\n\n\n  /**\n  * Action method which toggles between window and fullscreen mode.\n  *\n  * @method toggleFullScreen\n  * @param {gs.Object_Base} sender - The sender object.\n  * @param {boolean|string} params - Can be <b>null</b>\n   */\n\n  Component_LayoutSceneBehavior.prototype.toggleFullScreen = function(sender, params) {\n    if (gs.Graphics.isFullscreen()) {\n      gs.Graphics.leaveFullscreen();\n    } else {\n      gs.Graphics.enterFullscreen();\n    }\n    return GameManager.settings.fullScreen = gs.Graphics.isFullscreen();\n  };\n\n\n  /**\n  * Action method which plays the specified sound.\n  *\n  * @method playSound\n  * @param {gs.Object_Base} sender - The sender object.\n  * @param {Object} params - The sound to play.\n   */\n\n  Component_LayoutSceneBehavior.prototype.playSound = function(sender, params) {\n    AudioManager.loadSound(params);\n    return AudioManager.playSound(params);\n  };\n\n\n  /**\n  * Action method which plays the specified voice.\n  *\n  * @method playVoice\n  * @param {gs.Object_Base} sender - The sender object.\n  * @param {Object} params - The voice to play.\n   */\n\n  Component_LayoutSceneBehavior.prototype.playVoice = function(sender, params) {\n    AudioManager.loadSound(params);\n    return AudioManager.playVoice(params);\n  };\n\n\n  /**\n  * Action method which turns voice on or off.\n  *\n  * @method turnOnOffVoice\n  * @param {gs.Object_Base} sender - The sender object.\n  * @param {boolean|string} params - If <b>true</b> voice will be turned on. Otherwise it will be turned off. Can also be a binding-expression.\n   */\n\n  Component_LayoutSceneBehavior.prototype.turnOnOffVoice = function(sender, state) {\n    if (ui.Component_FormulaHandler.fieldValue(sender, state)) {\n      return this.turnOnVoice();\n    } else {\n      return this.turnOffVoice();\n    }\n  };\n\n\n  /**\n  * Action method which turns music on or off.\n  *\n  * @method turnOnOffMusic\n  * @param {gs.Object_Base} sender - The sender object.\n  * @param {boolean|string} params - If <b>true</b> music will be turned on. Otherwise it will be turned off. Can also be a binding-expression.\n   */\n\n  Component_LayoutSceneBehavior.prototype.turnOnOffMusic = function(sender, state) {\n    if (ui.Component_FormulaHandler.fieldValue(sender, state)) {\n      return this.turnOnMusic();\n    } else {\n      return this.turnOffMusic();\n    }\n  };\n\n\n  /**\n  * Action method which turns sound on or off.\n  *\n  * @method turnOnOffSound\n  * @param {gs.Object_Base} sender - The sender object.\n  * @param {boolean|string} params - If <b>true</b> sound will be turned on. Otherwise it will be turned off. Can also be a binding-expression.\n   */\n\n  Component_LayoutSceneBehavior.prototype.turnOnOffSound = function(sender, state) {\n    if (ui.Component_FormulaHandler.fieldValue(sender, state)) {\n      return this.turnOnSound();\n    } else {\n      return this.turnOffSound();\n    }\n  };\n\n\n  /**\n  * Action method which turns off voice.\n  *\n  * @method turnOffVoice\n  * @param {gs.Object_Base} sender - The sender object.\n  * @param {boolean|string} params - Can be <b>null</b>.\n   */\n\n  Component_LayoutSceneBehavior.prototype.turnOffVoice = function() {\n    return AudioManager.stopAllVoices();\n  };\n\n\n  /**\n  * Action method which turns off music.\n  *\n  * @method turnOffMusic\n  * @param {gs.Object_Base} sender - The sender object.\n  * @param {boolean|string} params - Can be <b>null</b>.\n   */\n\n  Component_LayoutSceneBehavior.prototype.turnOffMusic = function() {\n    return AudioManager.stopMusic();\n  };\n\n\n  /**\n  * Action method which turns off sound.\n  *\n  * @method turnOffSound\n  * @param {gs.Object_Base} sender - The sender object.\n  * @param {boolean|string} params - Can be <b>null</b>.\n   */\n\n  Component_LayoutSceneBehavior.prototype.turnOffSound = function() {\n    return AudioManager.stopAllSounds();\n  };\n\n\n  /**\n  * Action method which turns on voice.\n  *\n  * @method turnOnVoice\n  * @param {gs.Object_Base} sender - The sender object.\n  * @param {boolean|string} params - Can be <b>null</b>.\n   */\n\n  Component_LayoutSceneBehavior.prototype.turnOnVoice = function() {};\n\n\n  /**\n  * Action method which turns on sound.\n  *\n  * @method turnOnSound\n  * @param {gs.Object_Base} sender - The sender object.\n  * @param {boolean|string} params - Can be <b>null</b>.\n   */\n\n  Component_LayoutSceneBehavior.prototype.turnOnSound = function() {};\n\n\n  /**\n  * Action method which turns on music.\n  *\n  * @method turnOnMusic\n  * @param {gs.Object_Base} sender - The sender object.\n  * @param {boolean|string} params - Can be <b>null</b>.\n   */\n\n  Component_LayoutSceneBehavior.prototype.turnOnMusic = function() {\n    return AudioManager.resumeMusic();\n  };\n\n\n  /**\n  * Action method which selects the specified language.\n  *\n  * @method selectLanguage\n  * @param {gs.Object_Base} sender - The sender object.\n  * @param {number|string} params - Index of the language to set. Can be a binding-expression.\n   */\n\n  Component_LayoutSceneBehavior.prototype.selectLanguage = function(sender, params) {\n    var language;\n    language = LanguageManager.languages[ui.Component_FormulaHandler.fieldValue(sender, params)];\n    return LanguageManager.selectLanguage(language);\n  };\n\n\n  /**\n  * Action method which resets global data storage.\n  *\n  * @method resetGlobalData\n  * @param {gs.Object_Base} sender - The sender object.\n  * @param {Object} params - Can be <b>null</b>.\n   */\n\n  Component_LayoutSceneBehavior.prototype.resetGlobalData = function(sender) {\n    return GameManager.resetGlobalData();\n  };\n\n\n  /**\n  * Action method which saves game settings.\n  *\n  * @method saveSettings\n  * @param {gs.Object_Base} sender - The sender object.\n  * @param {Object} params - Can be <b>null</b>.\n   */\n\n  Component_LayoutSceneBehavior.prototype.saveSettings = function(sender) {\n    return GameManager.saveSettings();\n  };\n\n\n  /**\n  * Action method which prepares the game for saving by taking a snapshot of the current game state\n  * and storing it in GameManager.saveGame.\n  *\n  * @method prepareSaveGame\n  * @param {gs.Object_Base} sender - The sender object.\n  * @param {Object} params - Can be <b>null</b>.\n   */\n\n  Component_LayoutSceneBehavior.prototype.prepareSaveGame = function(sender, params) {\n    return GameManager.prepareSaveGame(params != null ? params.snapshot : void 0);\n  };\n\n\n  /**\n  * Action method which saves the current game at the specified save slot.\n  *\n  * @method saveGame\n  * @param {gs.Object_Base} sender - The sender object.\n  * @param {Object} params - Contains the slot-index where the game should be saved.\n  * <ul>\n  * <li>params.slot - The slot-index where the game should be saved. Can be a binding-expression.</li>\n  * </ul>\n   */\n\n  Component_LayoutSceneBehavior.prototype.saveGame = function(sender, params) {\n    return GameManager.save(ui.Component_FormulaHandler.fieldValue(sender, params.slot));\n  };\n\n\n  /**\n  * Action method which loads the game from the specified save slot.\n  *\n  * @method loadGame\n  * @param {gs.Object_Base} sender - The sender object.\n  * @param {Object} params - Contains the slot-index where the game should be loaded from.\n  * <ul>\n  * <li>params.slot - The slot-index where the game should be loaded from. Can be a binding-expression.</li>\n  * </ul>\n   */\n\n  Component_LayoutSceneBehavior.prototype.loadGame = function(sender, params) {\n    GameManager.tempSettings.skip = false;\n    return GameManager.load(ui.Component_FormulaHandler.fieldValue(sender, params.slot));\n  };\n\n\n  /**\n  * Action method which starts a new game.\n  *\n  * @method newGame\n  * @param {gs.Object_Base} sender - The sender object.\n  * @param {Object} params - Can be <b>null</b>\n   */\n\n  Component_LayoutSceneBehavior.prototype.newGame = function(sender, params) {\n    var scene;\n    AudioManager.stopAllMusic(30);\n    GameManager.newGame();\n    scene = new vn.Object_Scene();\n    SceneManager.clear();\n    return SceneManager.switchTo(scene);\n  };\n\n\n  /**\n  * Action method which exists the current game. It doesn't change the scene and\n  * should be called before switching back to the title screen or main menu.\n  *\n  * @method exitGame\n  * @param {gs.Object_Base} sender - The sender object.\n  * @param {Object} params - Can be <b>null</b>\n   */\n\n  Component_LayoutSceneBehavior.prototype.exitGame = function(sender, params) {\n    return GameManager.exitGame();\n  };\n\n\n  /**\n  * Action method which switches to another scene.\n  *\n  * @method switchScene\n  * @param {gs.Object_Base} sender - The sender object.\n  * @param {Object} params - Contains the class name of the scene to switch to.\n  * <ul>\n  * <li>params.name - The class-name of the scene to switch to. The class must be defined in vn-namespace.</li>\n  * </ul>\n   */\n\n  Component_LayoutSceneBehavior.prototype.switchScene = function(sender, params) {\n    var f;\n    f = (function(_this) {\n      return function() {\n        var scene;\n        if (params.clear) {\n          SceneManager.clear();\n        }\n        scene = new vn[params.name]();\n        return SceneManager.switchTo(scene, params.savePrevious);\n      };\n    })(this);\n    if (!params.savePrevious) {\n      return this.layout.ui.disappear((function(_this) {\n        return function(e) {\n          return f();\n        };\n      })(this));\n    } else {\n      return f();\n    }\n  };\n\n\n  /**\n  * Action method which switches to another game scene.\n  *\n  * @method switchGameScene\n  * @param {gs.Object_Base} sender - The sender object.\n  * @param {Object} params - Contains the UID of the scene to switch to.\n  * <ul>\n  * <li>params.uid - The UID of the scene to switch to.</li>\n  * </ul>\n   */\n\n  Component_LayoutSceneBehavior.prototype.switchGameScene = function(sender, params) {\n    var f;\n    f = (function(_this) {\n      return function() {\n        var newScene, sceneData, sceneDocument, sceneDocuments, uid;\n        if (params.clear) {\n          SceneManager.clear();\n        }\n        uid = params.uid;\n        if (params.name) {\n          sceneDocuments = DataManager.getDocumentsByType(\"vn.scene\");\n          sceneDocument = sceneDocuments.first(function(d) {\n            return d.items.name === params.name;\n          });\n          if (sceneDocument) {\n            uid = sceneDocument.uid;\n          }\n        }\n        sceneData = {\n          uid: uid,\n          pictures: [],\n          texts: []\n        };\n        GameManager.sceneData = sceneData;\n        newScene = new vn.Object_Scene();\n        newScene.sceneData = sceneData;\n        return SceneManager.switchTo(newScene, params.savePrevious);\n      };\n    })(this);\n    if (!params.savePrevious) {\n      return (this.layout || this.object.layout).ui.disappear((function(_this) {\n        return function(e) {\n          return f();\n        };\n      })(this));\n    } else {\n      return f();\n    }\n  };\n\n\n  /**\n  * Action method which switches to another layout.\n  *\n  * @method switchLayout\n  * @param {gs.Object_Base} sender - The sender object.\n  * @param {Object} params - Contains the name of the layout to switch to.\n  * <ul>\n  * <li>params.name - The name of the layout to switch to.</li>\n  * <li>params.savePrevious - Indicates if the current layout should not be erased but paused and hidden instead so\n  * that it can be restored using <i>returnToPrevious</i> action.</li>\n  * <li>params.dataFields - Defines the data of \"$dataFields\" binding-expression variable. Can be a binding-expression\n  * or a direct object. Optional.</li>\n  * </ul>\n   */\n\n  Component_LayoutSceneBehavior.prototype.switchLayout = function(sender, layout) {\n    var f;\n    f = (function(_this) {\n      return function() {\n        var dataFields, i, len, ref, scene, senderField;\n        Graphics.freeze();\n        if (layout.clear) {\n          SceneManager.clear();\n        }\n        scene = new gs.Object_Layout(layout.name);\n        dataFields = sender.dataFields;\n        if (typeof layout.dataFields === \"string\") {\n          dataFields = ui.Component_FormulaHandler.fieldValue(sender, layout.dataFields);\n        } else if (layout.dataFields != null) {\n          dataFields = layout.dataFields;\n        }\n        scene.dataFields = dataFields;\n        scene.controllers = layout.controllers;\n        if (layout.senderData != null) {\n          ref = layout.senderData;\n          for (i = 0, len = ref.length; i < len; i++) {\n            senderField = ref[i];\n            scene[senderField] = sender[senderField];\n          }\n        }\n        return SceneManager.switchTo(scene, layout.savePrevious, layout.stack);\n      };\n    })(this);\n    if (!layout.savePrevious) {\n      return (this.layout || this.object.layout).ui.disappear((function(_this) {\n        return function(e) {\n          return f();\n        };\n      })(this));\n    } else {\n      return f();\n    }\n  };\n\n\n  /**\n  * Action method which returns to previous layout. (If savePrevious was set to <b>true</b> on switchLayout.).\n  *\n  * @method previousLayout\n  * @param {gs.Object_Base} sender - The sender object.\n  * @param {Object} params - Can be <b>null</b>.\n   */\n\n  Component_LayoutSceneBehavior.prototype.previousLayout = function(sender) {\n    return SceneManager.returnToPrevious();\n  };\n\n\n  /**\n  * Action method which disposes the specified control.\n  *\n  * @method disposeControl\n  * @param {gs.Object_Base} sender - The sender object.\n  * @param {string} params - The ID of the control to dispose. Can be a binding-expression.\n   */\n\n  Component_LayoutSceneBehavior.prototype.disposeControl = function(sender, id) {\n    var control;\n    control = this.objectManager.objectById(ui.Component_FormulaHandler.fieldValue(sender, id));\n    return control != null ? control.ui.disappear(function(sender) {\n      return sender.dispose();\n    }) : void 0;\n  };\n\n\n  /**\n  * Action method which creates a new control from the specified descriptor.\n  *\n  * @method createControl\n  * @param {gs.Object_Base} sender - The sender object.\n  * @param {string} params - Contains the descriptor and other data needed to construct the control.\n  * <ul>\n  * <li>params.descriptor - The control' descriptor. Can be a direct descriptor definition or a template name</li>\n  * <li>params.parent - A binding-expression which returns the control's parent.</li>\n  * <li>params.senderData - An object containing additional data merged into the control object.</li>\n  * </ul>\n   */\n\n  Component_LayoutSceneBehavior.prototype.createControl = function(sender, data) {\n    var control, descriptor, fieldName, i, len, parent, ref;\n    if (typeof data.descriptor === \"string\") {\n      descriptor = ui.UIManager.customTypes[data.descriptor];\n    } else {\n      descriptor = data.descriptor;\n    }\n    parent = ui.Component_FormulaHandler.fieldValue(sender, data.parent);\n    control = ui.UiFactory._createFromDescriptor(descriptor, parent != null ? parent : this.object.layout || this.object);\n    if (data.senderData != null) {\n      ref = data.senderData;\n      for (i = 0, len = ref.length; i < len; i++) {\n        fieldName = ref[i];\n        control[fieldName] = sender[fieldName];\n      }\n    }\n    control.ui.prepare();\n    control.ui.appear();\n    return control;\n  };\n\n\n  /**\n  * Action method which quits the game.\n  *\n  * @method quitGame\n  * @param {gs.Object_Base} sender - The sender object.\n  * @param {string} params - Can be <b>null</b>.\n   */\n\n  Component_LayoutSceneBehavior.prototype.quitGame = function(sender, data) {\n    return SceneManager.switchTo(null);\n  };\n\n  return Component_LayoutSceneBehavior;\n\n})(gs.Component_SceneBehavior);\n\ngs.Component_LayoutSceneBehavior = Component_LayoutSceneBehavior;\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU9BLElBQUEsNkJBQUE7RUFBQTs7O0FBQU07Ozs7QUFFRjs7Ozs7Ozs7OztFQVNhLHVDQUFBO0lBQ1QsNkRBQUE7SUFFQSxJQUFDLENBQUEsYUFBRCxHQUFpQjtJQUNqQixJQUFDLENBQUEsTUFBRCxHQUFVO0lBQ1YsSUFBQyxDQUFBLGVBQUQsR0FBbUI7RUFMVjs7O0FBT2I7Ozs7OzswQ0FLQSxVQUFBLEdBQVksU0FBQTtJQUNSLCtEQUFBLFNBQUE7SUFFQSxJQUFDLENBQUEsZUFBRCxHQUFtQixlQUFlLENBQUMsYUFBaEIsQ0FBQTtJQUNuQixlQUFlLENBQUMsT0FBaEIsR0FBMEIsSUFBQyxDQUFBO0lBRTNCLElBQU8sOEJBQVA7TUFDSSxJQUFDLENBQUEsTUFBTSxDQUFDLFVBQVIsR0FBcUI7UUFBRSxNQUFBLEVBQVEsZUFBVjtRQUEyQixVQUFBLEVBQVksRUFBdkM7UUFBMkMsT0FBQSxFQUFTLENBQUMsQ0FBRCxFQUFJLENBQUosRUFBTyxDQUFQLEVBQVUsQ0FBVixDQUFwRDtRQUR6Qjs7V0FHQSxlQUFlLENBQUMsV0FBaEIsQ0FBQTtFQVRROzs7QUFXWjs7Ozs7OzBDQUtBLE9BQUEsR0FBUyxTQUFBO1dBQ0wsNERBQUEsU0FBQTtFQURLOzs7QUFHVDs7Ozs7OzswQ0FNQSxXQUFBLEdBQWEsU0FBQTtJQUNULEVBQUUsQ0FBQyxhQUFhLENBQUMsT0FBakIsR0FBMkIsSUFBQyxDQUFBO0lBRTVCLElBQUcsQ0FBSSxXQUFXLENBQUMsV0FBbkI7TUFDSSxXQUFXLENBQUMsVUFBWixDQUFBLEVBREo7O0lBR0EsSUFBQyxDQUFBLFVBQUQsR0FBYyxFQUFFLENBQUMsU0FBUyxDQUFDLFdBQVksQ0FBQSxJQUFDLENBQUEsTUFBTSxDQUFDLFVBQVUsQ0FBQyxVQUFuQixJQUFpQyxTQUFqQyxDQUF6QixDQUFBO0lBQ2QsTUFBTSxDQUFDLFdBQVAsR0FBcUIsSUFBQyxD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QXZDLEVBQStDLEVBQS9DLENBQTFCOzZCQUdWLE9BQU8sQ0FBRSxFQUFFLENBQUMsU0FBWixDQUFzQixTQUFDLE1BQUQ7YUFBWSxNQUFNLENBQUMsT0FBUCxDQUFBO0lBQVosQ0FBdEI7RUFKWTs7O0FBTWhCOzs7Ozs7Ozs7Ozs7OzBDQVlBLGFBQUEsR0FBZSxTQUFDLE1BQUQsRUFBUyxJQUFUO0FBQ1gsUUFBQTtJQUFBLElBQUcsT0FBTyxJQUFJLENBQUMsVUFBWixLQUEwQixRQUE3QjtNQUNJLFVBQUEsR0FBYSxFQUFFLENBQUMsU0FBUyxDQUFDLFdBQVksQ0FBQSxJQUFJLENBQUMsVUFBTCxFQUQxQztLQUFBLE1BQUE7TUFHSSxVQUFBLEdBQWEsSUFBSSxDQUFDLFdBSHRCOztJQUtBLE1BQUEsR0FBUyxFQUFFLENBQUMsd0JBQXdCLENBQUMsVUFBNUIsQ0FBdUMsTUFBdkMsRUFBK0MsSUFBSSxDQUFDLE1BQXBEO0lBQ1QsT0FBQSxHQUFVLEVBQUUsQ0FBQyxTQUFTLENBQUMscUJBQWIsQ0FBbUMsVUFBbkMsbUJBQStDLFNBQVUsSUFBQyxDQUFBLE1BQU0sQ0FBQyxNQUFSLElBQWdCLElBQUMsQ0FBQSxNQUExRTtJQUVWLElBQUcsdUJBQUg7QUFDSTtBQUFBLFdBQUEscUNBQUE7O1FBQ0ksT0FBUSxDQUFBLFNBQUEsQ0FBUixHQUFxQixNQUFPLENBQUEsU0FBQTtBQURoQyxPQURKOztJQUdBLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBWCxDQUFBO0lBQ0EsT0FBTyxDQUFDLEVBQUUsQ0FBQyxNQUFYLENBQUE7QUFFQSxXQUFPO0VBZkk7OztBQWlCZjs7Ozs7Ozs7MENBT0EsUUFBQSxHQUFVLFNBQUMsTUFBRCxFQUFTLElBQVQ7V0FDTixZQUFZLENBQUMsUUFBYixDQUFzQixJQUF0QjtFQURNOzs7O0dBN25COEIsRUFBRSxDQUFDOztBQWtvQi9DLEVBQUUsQ0FBQyw2QkFBSCxHQUFtQyIsInNvdXJjZXNDb250ZW50IjpbIiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuI1xuIyAgIFNjcmlwdDogQ29tcG9uZW50X0xheW91dFNjZW5lQmVoYXZpb3LjgIBcbiNcbiMgICAkJENPUFlSSUdIVCQkXG4jXG4jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmNsYXNzIENvbXBvbmVudF9MYXlvdXRTY2VuZUJlaGF2aW9yIGV4dGVuZHMgZ3MuQ29tcG9uZW50X1NjZW5lQmVoYXZpb3JcbiAgIyAgQG9iamVjdENvZGVjQmxhY2tMaXN0ID0gW1wib2JqZWN0TWFuYWdlclwiXVxuICAgICMjIypcbiAgICAqIFRoZSBiYXNlIGNsYXNzIG9mIGFsbCBzY2VuZS1iZWhhdmlvciBjb21wb25lbnRzLiBBIHNjZW5lLWJlaGF2aW9yIGNvbXBvbmVudFxuICAgICogZGVmaW5lIHRoZSBsb2dpYyBvZiBhIHNpbmdsZSBnYW1lIHNjZW5lLiBcbiAgICAqXG4gICAgKiBAbW9kdWxlIGdzXG4gICAgKiBAY2xhc3MgQ29tcG9uZW50X0xheW91dFNjZW5lQmVoYXZpb3JcbiAgICAqIEBleHRlbmRzIGdzLkNvbXBvbmVudF9TY2VuZUJlaGF2aW9yXG4gICAgKiBAbWVtYmVyb2YgZ3NcbiAgICAjIyNcbiAgICBjb25zdHJ1Y3RvcjogLT5cbiAgICAgICAgc3VwZXIoKVxuICAgICAgICBcbiAgICAgICAgQG9iamVjdE1hbmFnZXIgPSBTY2VuZU1hbmFnZXJcbiAgICAgICAgQGxheW91dCA9IG51bGxcbiAgICAgICAgQHJlc291cmNlQ29udGV4dCA9IG51bGxcbiAgICBcbiAgICAjIyMqXG4gICAgKiBJbml0aWFsaXplcyB0aGUgc2NlbmUuIFxuICAgICpcbiAgICAqIEBtZXRob2QgaW5pdGlhbGl6ZVxuICAgICMjIyAgICBcbiAgICBpbml0aWFsaXplOiAtPlxuICAgICAgICBzdXBlclxuICAgICAgICBcbiAgICAgICAgQHJlc291cmNlQ29udGV4dCA9IFJlc291cmNlTWFuYWdlci5jcmVhdGVDb250ZXh0KClcbiAgICAgICAgUmVzb3VyY2VNYW5hZ2VyLmNvbnRleHQgPSBAcmVzb3VyY2VDb250ZXh0XG4gICAgICAgIFxuICAgICAgICBpZiBub3QgQG9iamVjdC5sYXlvdXREYXRhP1xuICAgICAgICAgICAgQG9iamVjdC5sYXlvdXREYXRhID0geyBcInR5cGVcIjogXCJ1aS5GcmVlTGF5b3V0XCIsIFwiY29udHJvbHNcIjogW10sIFwiZnJhbWVcIjogWzAsIDAsIDEsIDFdIH1cbiAgICAgICAgICAgIFxuICAgICAgICBMYW5ndWFnZU1hbmFnZXIubG9hZEJ1bmRsZXMoKVxuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBEaXNwb3NlcyB0aGUgc2NlbmUuIFxuICAgICpcbiAgICAqIEBtZXRob2QgZGlzcG9zZVxuICAgICMjI1xuICAgIGRpc3Bvc2U6IC0+XG4gICAgICAgIHN1cGVyXG4gICAgIFxuICAgICMjIypcbiAgICAqIFByZXBhcmVzIGFsbCBkYXRhIGZvciB0aGUgc2NlbmUgYW5kIGxvYWRzIHRoZSBuZWNlc3NhcnkgZ3JhcGhpYyBhbmQgYXVkaW8gcmVzb3VyY2VzLlxuICAgICpcbiAgICAqIEBtZXRob2QgcHJlcGFyZURhdGFcbiAgICAqIEBhYnN0cmFjdFxuICAgICMjIyAgICBcbiAgICBwcmVwYXJlRGF0YTogLT5cbiAgICAgICAgZ3MuT2JqZWN0TWFuYWdlci5jdXJyZW50ID0gQG9iamVjdE1hbmFnZXJcbiAgICAgICAgXG4gICAgICAgIGlmIG5vdCBHYW1lTWFuYWdlci5pbml0aWFsaXplZFxuICAgICAgICAgICAgR2FtZU1hbmFnZXIuaW5pdGlhbGl6ZSgpXG4gICAgICAgICAgICBcbiAgICAgICAgQGRhdGFGaWVsZHMgPSB1aS5VaUZhY3RvcnkuZGF0YVNvdXJjZXNbQG9iamVjdC5sYXlvdXREYXRhLmRhdGFTb3VyY2UgfHwgXCJkZWZhdWx0XCJdKClcbiAgICAgICAgd2luZG93LiRkYXRhRmllbGRzID0gQGRhdGFGaWVsZHNcbiAgICAgICAgQG11c2ljID0gdWkuQ29tcG9uZW50X0Zvcm11bGFIYW5kbGVyLmZpZWxkVmFsdWUoQG9iamVjdCwgQG9iamVjdC5sYXlvdXREYXRhLm11c2ljKVxuICAgICAgICBBdWRpb01hbmFnZXIubG9hZE11c2ljKEBtdXNpYylcbiAgICAgICAgQHByZXBhcmVUcmFuc2l0aW9uKFJlY29yZE1hbmFnZXIuc3lzdGVtLm1lbnVUcmFuc2l0aW9uKVxuICAgICAgICBcbiAgICAgICAgUmVzb3VyY2VMb2FkZXIubG9hZFVpVHlwZXNHcmFwaGljcyh1aS5VaUZhY3RvcnkuY3VzdG9tVHlwZXMpXG4gICAgICAgIFJlc291cmNlTG9hZGVyLmxvYWRVaUxheW91dEdyYXBoaWNzKEBvYmplY3QubGF5b3V0RGF0YSlcbiAgICAgICAgXG4gICAgICAgIGlmIEBkYXRhRmllbGRzP1xuICAgICAgICAgICAgUmVzb3VyY2VMb2FkZXIubG9hZFVpRGF0YUZpZWxkc0dyYXBoaWNzKEBkYXRhRmllbGRzKVxuICAgICAgICBSZXNvdXJjZU1hbmFnZXIuZ2V0Qml0bWFwKFwiR3JhcGhpY3MvQ2hhcmFjdGVycy9KYW5lRGF0ZV9Ob3JtYWxcIilcbiAgICAgXG4gICAgIyMjKlxuICAgICogUHJlcGFyZXMgYWxsIHZpc3VhbCBnYW1lIG9iamVjdCBmb3IgdGhlIHNjZW5lLlxuICAgICpcbiAgICAqIEBtZXRob2QgcHJlcGFyZVZpc3VhbFxuICAgICMjIyAgICAgICAgIFxuICAgIHByZXBhcmVWaXN1YWw6IC0+XG4gICAgICAgIHNjYWxlID0gR3JhcGhpY3Muc2NhbGVcbiAgICAgICAgdm9jYWIgPSBSZWNvcmRNYW5hZ2VyLnZvY2FidWxhcnlcblxuICAgICAgICBpZiBub3QgQGxheW91dD9cbiAgICAgICAgICAgIEBkYXRhT2JqZWN0ID0ge31cbiAgICAgICAgICAgIEBsYXlvdXQgPSB1aS5VaUZhY3RvcnkuY3JlYXRlRnJvbURlc2NyaXB0b3IoQG9iamVjdC5sYXlvdXREYXRhLCBAb2JqZWN0KVxuICAgIFxuICAgICAgICAgICAgaWYgQG11c2ljP1xuICAgICAgICAgICAgICAgIEF1ZGlvTWFuYWdlci5jaGFuZ2VNdXNpYyhAbXVzaWMsIDMwKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgQGxheW91dC51aS5wcmVwYXJlKClcbiAgICAgICAgQGxheW91dC51aS5hcHBlYXIoKVxuICAgICAgICBAbGF5b3V0LnVwZGF0ZSgpXG4gICAgICAgIFxuICAgICAgICBAdHJhbnNpdGlvbigpXG4gICAgICAgIFxuICAgICAgICBpZiBTY2VuZU1hbmFnZXIucHJldmlvdXNTY2VuZXMubGVuZ3RoID09IDBcbiAgICAgICAgICAgIGlmIEdhbWVNYW5hZ2VyLnRlbXBGaWVsZHMuaXNFeGl0aW5nR2FtZVxuICAgICAgICAgICAgICAgIEdhbWVNYW5hZ2VyLnRlbXBGaWVsZHMuaXNFeGl0aW5nR2FtZSA9IG5vXG4gICAgICAgICAgICAgICAgZ3MuR2FtZU5vdGlmaWVyLnBvc3RSZXNldFNjZW5lQ2hhbmdlKEBvYmplY3QubGF5b3V0TmFtZSlcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBncy5HYW1lTm90aWZpZXIucG9zdFNjZW5lQ2hhbmdlKEBvYmplY3QubGF5b3V0TmFtZSlcbiAgICAgXG4gICAgIyMjKlxuICAgICogVXBkYXRlcyB0aGUgc2NlbmUncyBjb250ZW50LlxuICAgICpcbiAgICAqIEBtZXRob2QgdXBkYXRlQ29udGVudFxuICAgICMjIyAgICBcbiAgICB1cGRhdGVDb250ZW50OiAtPlxuICAgICAgICBHYW1lTWFuYWdlci51cGRhdGUoKVxuICAgICAgICBHcmFwaGljcy52aWV3cG9ydC51cGRhdGUoKVxuICAgICBcbiAgICAjIyMqXG4gICAgKiBTaG93cy9IaWRlcyB0aGUgY3VycmVudCBzY2VuZS4gQSBoaWRkZW4gc2NlbmUgaXMgbm8gbG9uZ2VyIHNob3duIGFuZCBleGVjdXRlZFxuICAgICogYnV0IGFsbCBvYmplY3RzIGFuZCBkYXRhIGlzIHN0aWxsIHRoZXJlIGFuZCBiZSBzaG93biBhZ2FpbiBhbnl0aW1lLlxuICAgICpcbiAgICAqIEBtZXRob2Qgc2hvd1xuICAgICogQHBhcmFtIHtib29sZWFufSB2aXNpYmxlIC0gSW5kaWNhdGVzIGlmIHRoZSBzY2VuZSBzaG91bGQgYmUgc2hvd24gb3IgaGlkZGVuLlxuICAgICMjIyAgICAgICAgICBcbiAgICBzaG93OiAodmlzaWJsZSkgLT5cbiAgICAgICAgaWYgdmlzaWJsZVxuICAgICAgICAgICAgUmVzb3VyY2VNYW5hZ2VyLmNvbnRleHQgPSBAcmVzb3VyY2VDb250ZXh0XG4gICAgICAgIEBsYXlvdXQudmlzaWJsZSA9IHZpc2libGVcbiAgICAgICAgQGxheW91dC51cGRhdGUoKVxuICAgICAgICBAb2JqZWN0TWFuYWdlci5hY3RpdmUgPSB2aXNpYmxlXG4gICAgICAgIGlmIHZpc2libGVcbiAgICAgICAgICAgIGdzLk9iamVjdE1hbmFnZXIuY3VycmVudCA9IFNjZW5lTWFuYWdlciAjQG9iamVjdE1hbmFnZXJcbiAgICAgICAgI0BvYmplY3RNYW5hZ2VyLnVwZGF0ZSgpXG4gICAgIFxuICAgICMjIypcbiAgICAqIEFjdGlvbiBtZXRob2Qgd2hpY2ggdHJpZ2dlcnMgYSBmdWxsIHJlZnJlc2ggb24gdGhlIG9iamVjdCByZXR1cm5lZCBieSB0aGUgc3BlY2lmaWVkIGJpbmRpbmctZXhwcmVzc2lvbi5cbiAgICAqIFRoZSBwYXJhbXMgbXVzdCBiZSBhIGRpcmVjdCBiaW5kaW5nLWV4cHJlc3Npb24gc3RyaW5nLlxuICAgICpcbiAgICAqIEBtZXRob2QgZnVsbFJlZnJlc2hPYmplY3RcbiAgICAqIEBwYXJhbSB7Z3MuT2JqZWN0X0Jhc2V9IHNlbmRlciAtIFRoZSBzZW5kZXIgb2JqZWN0LlxuICAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcyAtICBUaGUgYmluZGluZyBleHByZXNzaW9uLlxuICAgICMjIyAgICBcbiAgICBmdWxsUmVmcmVzaE9iamVjdDogKHNlbmRlciwgb2JqZWN0KSAtPlxuICAgICAgICBvYmplY3QgPSB1aS5Db21wb25lbnRfRm9ybXVsYUhhbmRsZXIuZmllbGRWYWx1ZShzZW5kZXIsIG9iamVjdClcbiAgICAgICAgb2JqZWN0Py5mdWxsUmVmcmVzaCgpXG4gICAgICBcbiAgICAjIyMqXG4gICAgKiBBY3Rpb24gbWV0aG9kIHdoaWNoIHRyaWdnZXJzIGEgcmVmcmVzaCBvbiB0aGUgb2JqZWN0IHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgYmluZGluZy1leHByZXNzaW9uLlxuICAgICogVGhlIHBhcmFtcyBtdXN0IGJlIGEgZGlyZWN0IGJpbmRpbmctZXhwcmVzc2lvbiBzdHJpbmcuXG4gICAgKlxuICAgICogQG1ldGhvZCByZWZyZXNoT2JqZWN0XG4gICAgKiBAcGFyYW0ge2dzLk9iamVjdF9CYXNlfSBzZW5kZXIgLSBUaGUgc2VuZGVyIG9iamVjdC5cbiAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMgLSAgVGhlIGJpbmRpbmcgZXhwcmVzc2lvbi5cbiAgICAjIyMgICAgXG4gICAgcmVmcmVzaE9iamVjdDogKHNlbmRlciwgb2JqZWN0KSAtPlxuICAgICAgICBvYmplY3QgPSB1aS5Db21wb25lbnRfRm9ybXVsYUhhbmRsZXIuZmllbGRWYWx1ZShzZW5kZXIsIG9iamVjdClcbiAgICAgICAgb2JqZWN0Py5uZWVkc1VwZGF0ZSA9IHRydWVcbiAgICAgICAgXG4gICAgYWRkU3R5bGU6IChzZW5kZXIsIHN0eWxlKSAtPlxuICAgICAgICBzdHlsZU9iamVjdCA9IHVpLlVJTWFuYWdlci5zdHlsZXNbc3R5bGVdXG4gICAgICAgIHN0eWxlT2JqZWN0Py5hcHBseShzZW5kZXIpXG4gICAgICAgIHNlbmRlci5uZWVkc1VwZGF0ZSA9IHllc1xuICAgICAgICBpZiBzdHlsZU9iamVjdD8uZm9udFxuICAgICAgICAgICAgc2VuZGVyLmJlaGF2aW9yLnJlZnJlc2goKVxuICAgICAgICBcbiAgICByZW1vdmVTdHlsZTogKHNlbmRlciwgc3R5bGUpIC0+IFxuICAgICAgICBzdHlsZU9iamVjdCA9IHVpLlVJTWFuYWdlci5zdHlsZXNbc3R5bGVdXG4gICAgICAgIHN0eWxlT2JqZWN0Py5yZXZlcnQoc2VuZGVyKVxuICAgICAgICBzZW5kZXIuZGVzY3JpcHRvci5zdHlsZXMucmVtb3ZlKHN0eWxlKVxuICAgICAgICBcbiAgICAgICAgZm9yIHMgaW4gc2VuZGVyLmRlc2NyaXB0b3Iuc3R5bGVzXG4gICAgICAgICAgICB1aS5VSU1hbmFnZXIuc3R5bGVzW3NdPy5hcHBseShzZW5kZXIpXG4gICAgICAgIHNlbmRlci5uZWVkc1VwZGF0ZSA9IHllc1xuICAgICAgICBpZiBzdHlsZU9iamVjdD8uZm9udFxuICAgICAgICAgICAgc2VuZGVyLmJlaGF2aW9yLnJlZnJlc2goKVxuICAgICAgICAgICAgXG4gICAgXG4gICAgXG4gICAgIyMjKlxuICAgICogQWN0aW9uIG1ldGhvZCB3aGljaCBleGVjdXRlcyB0aGUgc3BlY2lmaWVkIGJpbmRpbmdzLlxuICAgICpcbiAgICAqIEBtZXRob2QgZXhlY3V0ZUJpbmRpbmdzXG4gICAgKiBAcGFyYW0ge2dzLk9iamVjdF9CYXNlfSBzZW5kZXIgLSBUaGUgc2VuZGVyIG9iamVjdC5cbiAgICAqIEBwYXJhbSB7T2JqZWN0W119IHBhcmFtcyAtICBBbiBhcnJheSBvZiBiaW5kaW5nLWRlZmluaXRpb25zLlxuICAgICMjIyBcbiAgICBleGVjdXRlQmluZGluZ3M6IChzZW5kZXIsIGJpbmRpbmdzKSAtPlxuICAgICAgICBmb3IgYmluZGluZyBpbiBiaW5kaW5nc1xuICAgICAgICAgICAgdWkuQ29tcG9uZW50X0Zvcm11bGFIYW5kbGVyLmV4ZWN1dGVCaW5kaW5nKHNlbmRlciwgYmluZGluZylcbiAgICAgICAgICAgIFxuICAgICAgICByZXR1cm4gbnVsbFxuICAgIFxuICAgICMjIypcbiAgICAqIEFjdGlvbiBtZXRob2Qgd2hpY2ggZXhlY3V0ZXMgdGhlIHNwZWNpZmllZCBmb3JtdWxhcy5cbiAgICAqXG4gICAgKiBAbWV0aG9kIGV4ZWN1dGVGb3JtdWxhc1xuICAgICogQHBhcmFtIHtncy5PYmplY3RfQmFzZX0gc2VuZGVyIC0gVGhlIHNlbmRlciBvYmplY3QuXG4gICAgKiBAcGFyYW0ge3VpLkZvcm11bGFbXX0gcGFyYW1zIC0gIEFuIGFycmF5IG9mIGZvcm11bGEtZGVmaW5pdGlvbnMuXG4gICAgIyMjICBcbiAgICBleGVjdXRlRm9ybXVsYXM6IChzZW5kZXIsIGZvcm11bGFzKSAtPlxuICAgICAgICBmb3IgZm9ybXVsYSBpbiBmb3JtdWxhc1xuICAgICAgICAgICAgdWkuQ29tcG9uZW50X0Zvcm11bGFIYW5kbGVyLmV4ZWN1dGVGb3JtdWxhKHNlbmRlciwgZm9ybXVsYSlcbiAgICBcbiAgICAjIyMqXG4gICAgKiBBY3Rpb24gbWV0aG9kIHdoaWNoIGV4ZWN1dGVzIGFuIGFuaW1hdGlvbiBvbiBhIHNwZWNpZmllZCB0YXJnZXQgZ2FtZSBvYmplY3QuXG4gICAgKlxuICAgICogQG1ldGhvZCBleGVjdXRlQW5pbWF0aW9uXG4gICAgKiBAcGFyYW0ge2dzLk9iamVjdF9CYXNlfSBzZW5kZXIgLSBUaGUgc2VuZGVyIG9iamVjdC5cbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSAgQ29udGFpbnMgdGFyZ2V0LWlkIGFuZCBhbmltYXRpb25zOiB7IHRhcmdldCwgYW5pbWF0aW9ucyB9XG4gICAgIyMjICAgICAgICAgXG4gICAgZXhlY3V0ZUFuaW1hdGlvbjogKHNlbmRlciwgcGFyYW1zKSAtPlxuICAgICAgICBvYmplY3QgPSB1aS5Db21wb25lbnRfRm9ybXVsYUhhbmRsZXIuZmllbGRWYWx1ZShzZW5kZXIsIHBhcmFtcy50YXJnZXQpXG4gICAgICAgIGFuaW1hdGlvbiA9IG9iamVjdD8uYW5pbWF0aW9ucy5maXJzdCAoYSkgLT4gYS5ldmVudCA9PSBwYXJhbXMuZXZlbnRcbiAgICAgICAgXG4gICAgICAgIGlmIGFuaW1hdGlvbiBhbmQgb2JqZWN0XG4gICAgICAgICAgICBvYmplY3QuYW5pbWF0aW9uRXhlY3V0b3IuZXhlY3V0ZShhbmltYXRpb24pXG4gICAgICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBBY3Rpb24gbWV0aG9kIHdoaWNoIGVtaXRzIHRoZSBzcGVjaWZpZWQgZXZlbnQuXG4gICAgKlxuICAgICogQG1ldGhvZCBlbWl0RXZlbnRcbiAgICAqIEBwYXJhbSB7Z3MuT2JqZWN0X0Jhc2V9IHNlbmRlciAtIFRoZSBzZW5kZXIgb2JqZWN0LlxuICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIENvbnRhaW5zIGV2ZW50IG5hbWUsIHNvdXJjZSBhbmQgZGF0YS5cbiAgICAqIDx1bD5cbiAgICAqIDxsaT5wYXJhbXMubmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudCB0byBlbWl0PC9saT5cbiAgICAqIDxsaT5wYXJhbXMuc291cmNlIC0gQSBiaW5kaW5nLWV4cHJlc3Npb24gdG8gZGVmaW5lIHRoZSBnYW1lIG9iamVjdCB3aGljaCBzaG91bGQgZW1pdCB0aGUgZXZlbnQuPC9saT5cbiAgICAqIDxsaT5wYXJhbXMuZGF0YSAtIEFuIG9iamVjdCBjb250YWluaW5nIGFkZGl0aW9uYWwgZXZlbnQgc3BlY2lmaWMgZGF0YS48L2xpPlxuICAgICogPC91bD5cbiAgICAjIyMgICAgXG4gICAgZW1pdEV2ZW50OiAoc2VuZGVyLCBwYXJhbXMpIC0+XG4gICAgICAgIG9iamVjdCA9IHVpLkNvbXBvbmVudF9Gb3JtdWxhSGFuZGxlci5maWVsZFZhbHVlKHNlbmRlciwgcGFyYW1zLnNvdXJjZSlcbiAgICAgICAgb2JqZWN0Py5ldmVudHMuZW1pdChwYXJhbXMubmFtZSwgb2JqZWN0LCB1aS5Db21wb25lbnRfRm9ybXVsYUhhbmRsZXIuZmllbGRWYWx1ZShzZW5kZXIsIHBhcmFtcy5kYXRhKSlcbiAgICBcbiAgICAjIyMqXG4gICAgKiBBY3Rpb24gbWV0aG9kIHdoaWNoIGNoYW5nZXMgdGhlIGdhbWUncyBhc3BlY3QgcmF0aW8uXG4gICAgKlxuICAgICogQG1ldGhvZCBleGVjdXRlQmluZGluZ3NcbiAgICAqIEBwYXJhbSB7Z3MuT2JqZWN0X0Jhc2V9IHNlbmRlciAtIFRoZSBzZW5kZXIgb2JqZWN0LlxuICAgICogQHBhcmFtIHtib29sZWFufSBwYXJhbXMgLSAgSWYgPGI+dHJ1ZTwvYj4gdGhlIGdhbWUgc2NyZWVuIHdpbGwgc3RyZXRjaGVkIHNvIHRoYXQgaXQgZmlsbHMgdGhlIGVudGlyZSBzY3JlZW5cbiAgICAqIG9mIHRoZSBwbGF5ZXIgd2l0aG91dCBhbnkgYmxhY2sgYm9yZGVycy4gT3RoZXJ3aXNlIHRoZSBnYW1lIHNjcmVlbiBzdHJldGNoZXMgYnV0IGtlZXBzIGl0cyByYXRpb1xuICAgICogc28gYmxhY2sgYm9yZGVycyBhcmUgcG9zc2libGUgaWYgdGhlIGdhbWUgcmVzb2x1dGlvbidzIHJhdGlvIGFuZCB0aGUgdGFyZ2V0IGRpc3BsYXkncyByYXRpbyBhcmUgbm90IG1hdGNoLiBJdCBjYW4gYWxzb1xuICAgICogYmUgYSBiaW5kaW5nLWV4cHJlc3Npb24uXG4gICAgIyMjXG4gICAgYWRqdXN0QXNwZWN0UmF0aW86IChzZW5kZXIsIGFkanVzdCkgLT5cbiAgICAgICAgYWRqdXN0ID0gdWkuQ29tcG9uZW50X0Zvcm11bGFIYW5kbGVyLmZpZWxkVmFsdWUoc2VuZGVyLCBhZGp1c3QpXG4gICAgXG4gICAgICAgIEdhbWVNYW5hZ2VyLnNldHRpbmdzLmFkanVzdEFzcGVjdFJhdGlvID0gYWRqdXN0XG4gICAgICAgIEdyYXBoaWNzLmtlZXBSYXRpbyA9ICFhZGp1c3RcbiAgICAgICAgR3JhcGhpY3Mub25SZXNpemUoKVxuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBBY3Rpb24gbWV0aG9kIHdoaWNoIGVudGVycyBmdWxsc2NyZWVuIG1vZGUuXG4gICAgKlxuICAgICogQG1ldGhvZCBlbnRlckZ1bGxTY3JlZW5cbiAgICAqIEBwYXJhbSB7Z3MuT2JqZWN0X0Jhc2V9IHNlbmRlciAtIFRoZSBzZW5kZXIgb2JqZWN0LlxuICAgICogQHBhcmFtIHtib29sZWFufSBwYXJhbXMgLSBDYW4gYmUgPGI+bnVsbDwvYj5cbiAgICAjIyNcbiAgICBlbnRlckZ1bGxTY3JlZW46IChzZW5kZXIsIHBhcmFtcykgLT4gXG4gICAgICAgIGdzLkdyYXBoaWNzLmVudGVyRnVsbHNjcmVlbigpXG4gICAgICAgIEdhbWVNYW5hZ2VyLnNldHRpbmdzLmZ1bGxTY3JlZW4gPSBHcmFwaGljcy5pc0Z1bGxzY3JlZW4oKVxuICAgICAgICBcbiAgICAgICAgICAgIFxuICAgICMjIypcbiAgICAqIEFjdGlvbiBtZXRob2Qgd2hpY2ggbGVhdmVzIGZ1bGxzY3JlZW4gbW9kZS5cbiAgICAqXG4gICAgKiBAbWV0aG9kIGxlYXZlRnVsbFNjcmVlblxuICAgICogQHBhcmFtIHtncy5PYmplY3RfQmFzZX0gc2VuZGVyIC0gVGhlIHNlbmRlciBvYmplY3QuXG4gICAgKiBAcGFyYW0ge2Jvb2xlYW59IHBhcmFtcyAtIENhbiBiZSA8Yj5udWxsPC9iPlxuICAgICMjI1xuICAgIGxlYXZlRnVsbFNjcmVlbjogLT4gXG4gICAgICAgIGdzLkdyYXBoaWNzLmxlYXZlRnVsbHNjcmVlbigpXG4gICAgICAgIEdhbWVNYW5hZ2VyLnNldHRpbmdzLmZ1bGxTY3JlZW4gPSBHcmFwaGljcy5pc0Z1bGxzY3JlZW4oKVxuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBBY3Rpb24gbWV0aG9kIHdoaWNoIHRvZ2dsZXMgYmV0d2VlbiB3aW5kb3cgYW5kIGZ1bGxzY3JlZW4gbW9kZS5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHRvZ2dsZUZ1bGxTY3JlZW5cbiAgICAqIEBwYXJhbSB7Z3MuT2JqZWN0X0Jhc2V9IHNlbmRlciAtIFRoZSBzZW5kZXIgb2JqZWN0LlxuICAgICogQHBhcmFtIHtib29sZWFufHN0cmluZ30gcGFyYW1zIC0gQ2FuIGJlIDxiPm51bGw8L2I+XG4gICAgIyMjXG4gICAgdG9nZ2xlRnVsbFNjcmVlbjogKHNlbmRlciwgcGFyYW1zKSAtPlxuICAgICAgICBpZiBncy5HcmFwaGljcy5pc0Z1bGxzY3JlZW4oKVxuICAgICAgICAgICAgZ3MuR3JhcGhpY3MubGVhdmVGdWxsc2NyZWVuKClcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgZ3MuR3JhcGhpY3MuZW50ZXJGdWxsc2NyZWVuKClcblxuICAgICAgICBHYW1lTWFuYWdlci5zZXR0aW5ncy5mdWxsU2NyZWVuID0gZ3MuR3JhcGhpY3MuaXNGdWxsc2NyZWVuKClcbiAgICAgIFxuICAgICMjIypcbiAgICAqIEFjdGlvbiBtZXRob2Qgd2hpY2ggcGxheXMgdGhlIHNwZWNpZmllZCBzb3VuZC5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHBsYXlTb3VuZFxuICAgICogQHBhcmFtIHtncy5PYmplY3RfQmFzZX0gc2VuZGVyIC0gVGhlIHNlbmRlciBvYmplY3QuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gVGhlIHNvdW5kIHRvIHBsYXkuXG4gICAgIyMjXG4gICAgcGxheVNvdW5kOiAoc2VuZGVyLCBwYXJhbXMpIC0+XG4gICAgICAgIEF1ZGlvTWFuYWdlci5sb2FkU291bmQocGFyYW1zKVxuICAgICAgICBBdWRpb01hbmFnZXIucGxheVNvdW5kKHBhcmFtcylcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogQWN0aW9uIG1ldGhvZCB3aGljaCBwbGF5cyB0aGUgc3BlY2lmaWVkIHZvaWNlLlxuICAgICpcbiAgICAqIEBtZXRob2QgcGxheVZvaWNlXG4gICAgKiBAcGFyYW0ge2dzLk9iamVjdF9CYXNlfSBzZW5kZXIgLSBUaGUgc2VuZGVyIG9iamVjdC5cbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBUaGUgdm9pY2UgdG8gcGxheS5cbiAgICAjIyNcbiAgICBwbGF5Vm9pY2U6IChzZW5kZXIsIHBhcmFtcykgLT5cbiAgICAgICAgQXVkaW9NYW5hZ2VyLmxvYWRTb3VuZChwYXJhbXMpXG4gICAgICAgIEF1ZGlvTWFuYWdlci5wbGF5Vm9pY2UocGFyYW1zKVxuICAgICAgXG4gICAgIFxuICAgICMjIypcbiAgICAqIEFjdGlvbiBtZXRob2Qgd2hpY2ggdHVybnMgdm9pY2Ugb24gb3Igb2ZmLlxuICAgICpcbiAgICAqIEBtZXRob2QgdHVybk9uT2ZmVm9pY2VcbiAgICAqIEBwYXJhbSB7Z3MuT2JqZWN0X0Jhc2V9IHNlbmRlciAtIFRoZSBzZW5kZXIgb2JqZWN0LlxuICAgICogQHBhcmFtIHtib29sZWFufHN0cmluZ30gcGFyYW1zIC0gSWYgPGI+dHJ1ZTwvYj4gdm9pY2Ugd2lsbCBiZSB0dXJuZWQgb24uIE90aGVyd2lzZSBpdCB3aWxsIGJlIHR1cm5lZCBvZmYuIENhbiBhbHNvIGJlIGEgYmluZGluZy1leHByZXNzaW9uLlxuICAgICMjIyBcbiAgICB0dXJuT25PZmZWb2ljZTogKHNlbmRlciwgc3RhdGUpIC0+XG4gICAgICAgIGlmIHVpLkNvbXBvbmVudF9Gb3JtdWxhSGFuZGxlci5maWVsZFZhbHVlKHNlbmRlciwgc3RhdGUpIHRoZW4gQHR1cm5PblZvaWNlKCkgZWxzZSBAdHVybk9mZlZvaWNlKClcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogQWN0aW9uIG1ldGhvZCB3aGljaCB0dXJucyBtdXNpYyBvbiBvciBvZmYuXG4gICAgKlxuICAgICogQG1ldGhvZCB0dXJuT25PZmZNdXNpY1xuICAgICogQHBhcmFtIHtncy5PYmplY3RfQmFzZX0gc2VuZGVyIC0gVGhlIHNlbmRlciBvYmplY3QuXG4gICAgKiBAcGFyYW0ge2Jvb2xlYW58c3RyaW5nfSBwYXJhbXMgLSBJZiA8Yj50cnVlPC9iPiBtdXNpYyB3aWxsIGJlIHR1cm5lZCBvbi4gT3RoZXJ3aXNlIGl0IHdpbGwgYmUgdHVybmVkIG9mZi4gQ2FuIGFsc28gYmUgYSBiaW5kaW5nLWV4cHJlc3Npb24uXG4gICAgIyMjIFxuICAgIHR1cm5Pbk9mZk11c2ljOiAoc2VuZGVyLCBzdGF0ZSkgLT5cbiAgICAgICAgaWYgdWkuQ29tcG9uZW50X0Zvcm11bGFIYW5kbGVyLmZpZWxkVmFsdWUoc2VuZGVyLCBzdGF0ZSkgdGhlbiBAdHVybk9uTXVzaWMoKSBlbHNlIEB0dXJuT2ZmTXVzaWMoKVxuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBBY3Rpb24gbWV0aG9kIHdoaWNoIHR1cm5zIHNvdW5kIG9uIG9yIG9mZi5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHR1cm5Pbk9mZlNvdW5kXG4gICAgKiBAcGFyYW0ge2dzLk9iamVjdF9CYXNlfSBzZW5kZXIgLSBUaGUgc2VuZGVyIG9iamVjdC5cbiAgICAqIEBwYXJhbSB7Ym9vbGVhbnxzdHJpbmd9IHBhcmFtcyAtIElmIDxiPnRydWU8L2I+IHNvdW5kIHdpbGwgYmUgdHVybmVkIG9uLiBPdGhlcndpc2UgaXQgd2lsbCBiZSB0dXJuZWQgb2ZmLiBDYW4gYWxzbyBiZSBhIGJpbmRpbmctZXhwcmVzc2lvbi5cbiAgICAjIyMgXG4gICAgdHVybk9uT2ZmU291bmQ6IChzZW5kZXIsIHN0YXRlKSAtPlxuICAgICAgICBpZiB1aS5Db21wb25lbnRfRm9ybXVsYUhhbmRsZXIuZmllbGRWYWx1ZShzZW5kZXIsIHN0YXRlKSB0aGVuIEB0dXJuT25Tb3VuZCgpIGVsc2UgQHR1cm5PZmZTb3VuZCgpXG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIEFjdGlvbiBtZXRob2Qgd2hpY2ggdHVybnMgb2ZmIHZvaWNlLlxuICAgICpcbiAgICAqIEBtZXRob2QgdHVybk9mZlZvaWNlXG4gICAgKiBAcGFyYW0ge2dzLk9iamVjdF9CYXNlfSBzZW5kZXIgLSBUaGUgc2VuZGVyIG9iamVjdC5cbiAgICAqIEBwYXJhbSB7Ym9vbGVhbnxzdHJpbmd9IHBhcmFtcyAtIENhbiBiZSA8Yj5udWxsPC9iPi5cbiAgICAjIyMgXG4gICAgdHVybk9mZlZvaWNlOiAtPlxuICAgICAgICBBdWRpb01hbmFnZXIuc3RvcEFsbFZvaWNlcygpXG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIEFjdGlvbiBtZXRob2Qgd2hpY2ggdHVybnMgb2ZmIG11c2ljLlxuICAgICpcbiAgICAqIEBtZXRob2QgdHVybk9mZk11c2ljXG4gICAgKiBAcGFyYW0ge2dzLk9iamVjdF9CYXNlfSBzZW5kZXIgLSBUaGUgc2VuZGVyIG9iamVjdC5cbiAgICAqIEBwYXJhbSB7Ym9vbGVhbnxzdHJpbmd9IHBhcmFtcyAtIENhbiBiZSA8Yj5udWxsPC9iPi5cbiAgICAjIyMgXG4gICAgdHVybk9mZk11c2ljOiAtPlxuICAgICAgICBBdWRpb01hbmFnZXIuc3RvcE11c2ljKClcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogQWN0aW9uIG1ldGhvZCB3aGljaCB0dXJucyBvZmYgc291bmQuXG4gICAgKlxuICAgICogQG1ldGhvZCB0dXJuT2ZmU291bmRcbiAgICAqIEBwYXJhbSB7Z3MuT2JqZWN0X0Jhc2V9IHNlbmRlciAtIFRoZSBzZW5kZXIgb2JqZWN0LlxuICAgICogQHBhcmFtIHtib29sZWFufHN0cmluZ30gcGFyYW1zIC0gQ2FuIGJlIDxiPm51bGw8L2I+LlxuICAgICMjIyBcbiAgICB0dXJuT2ZmU291bmQ6IC0+XG4gICAgICAgIEF1ZGlvTWFuYWdlci5zdG9wQWxsU291bmRzKClcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogQWN0aW9uIG1ldGhvZCB3aGljaCB0dXJucyBvbiB2b2ljZS5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHR1cm5PblZvaWNlXG4gICAgKiBAcGFyYW0ge2dzLk9iamVjdF9CYXNlfSBzZW5kZXIgLSBUaGUgc2VuZGVyIG9iamVjdC5cbiAgICAqIEBwYXJhbSB7Ym9vbGVhbnxzdHJpbmd9IHBhcmFtcyAtIENhbiBiZSA8Yj5udWxsPC9iPi5cbiAgICAjIyMgXG4gICAgdHVybk9uVm9pY2U6IC0+XG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIEFjdGlvbiBtZXRob2Qgd2hpY2ggdHVybnMgb24gc291bmQuXG4gICAgKlxuICAgICogQG1ldGhvZCB0dXJuT25Tb3VuZFxuICAgICogQHBhcmFtIHtncy5PYmplY3RfQmFzZX0gc2VuZGVyIC0gVGhlIHNlbmRlciBvYmplY3QuXG4gICAgKiBAcGFyYW0ge2Jvb2xlYW58c3RyaW5nfSBwYXJhbXMgLSBDYW4gYmUgPGI+bnVsbDwvYj4uXG4gICAgIyMjIFxuICAgIHR1cm5PblNvdW5kOiAtPlxuICAgICAgICBcbiAgICAjIyMqXG4gICAgKiBBY3Rpb24gbWV0aG9kIHdoaWNoIHR1cm5zIG9uIG11c2ljLlxuICAgICpcbiAgICAqIEBtZXRob2QgdHVybk9uTXVzaWNcbiAgICAqIEBwYXJhbSB7Z3MuT2JqZWN0X0Jhc2V9IHNlbmRlciAtIFRoZSBzZW5kZXIgb2JqZWN0LlxuICAgICogQHBhcmFtIHtib29sZWFufHN0cmluZ30gcGFyYW1zIC0gQ2FuIGJlIDxiPm51bGw8L2I+LlxuICAgICMjIyBcbiAgICB0dXJuT25NdXNpYzogLT5cbiAgICAgICAgQXVkaW9NYW5hZ2VyLnJlc3VtZU11c2ljKClcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogQWN0aW9uIG1ldGhvZCB3aGljaCBzZWxlY3RzIHRoZSBzcGVjaWZpZWQgbGFuZ3VhZ2UuXG4gICAgKlxuICAgICogQG1ldGhvZCBzZWxlY3RMYW5ndWFnZVxuICAgICogQHBhcmFtIHtncy5PYmplY3RfQmFzZX0gc2VuZGVyIC0gVGhlIHNlbmRlciBvYmplY3QuXG4gICAgKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IHBhcmFtcyAtIEluZGV4IG9mIHRoZSBsYW5ndWFnZSB0byBzZXQuIENhbiBiZSBhIGJpbmRpbmctZXhwcmVzc2lvbi5cbiAgICAjIyMgXG4gICAgc2VsZWN0TGFuZ3VhZ2U6IChzZW5kZXIsIHBhcmFtcyktPlxuICAgICAgICBsYW5ndWFnZSA9IExhbmd1YWdlTWFuYWdlci5sYW5ndWFnZXNbdWkuQ29tcG9uZW50X0Zvcm11bGFIYW5kbGVyLmZpZWxkVmFsdWUoc2VuZGVyLCBwYXJhbXMpXVxuICAgICAgICBMYW5ndWFnZU1hbmFnZXIuc2VsZWN0TGFuZ3VhZ2UobGFuZ3VhZ2UpXG4gICAgICAgXG4gICAgIyMjKlxuICAgICogQWN0aW9uIG1ldGhvZCB3aGljaCByZXNldHMgZ2xvYmFsIGRhdGEgc3RvcmFnZS5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHJlc2V0R2xvYmFsRGF0YVxuICAgICogQHBhcmFtIHtncy5PYmplY3RfQmFzZX0gc2VuZGVyIC0gVGhlIHNlbmRlciBvYmplY3QuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gQ2FuIGJlIDxiPm51bGw8L2I+LlxuICAgICMjIyBcbiAgICByZXNldEdsb2JhbERhdGE6IChzZW5kZXIpIC0+IFxuICAgICAgICBHYW1lTWFuYWdlci5yZXNldEdsb2JhbERhdGEoKVxuICAgIFxuICAgICMjIypcbiAgICAqIEFjdGlvbiBtZXRob2Qgd2hpY2ggc2F2ZXMgZ2FtZSBzZXR0aW5ncy5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHNhdmVTZXR0aW5nc1xuICAgICogQHBhcmFtIHtncy5PYmplY3RfQmFzZX0gc2VuZGVyIC0gVGhlIHNlbmRlciBvYmplY3QuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gQ2FuIGJlIDxiPm51bGw8L2I+LlxuICAgICMjIyBcbiAgICBzYXZlU2V0dGluZ3M6IChzZW5kZXIpIC0+IEdhbWVNYW5hZ2VyLnNhdmVTZXR0aW5ncygpXG4gICAgXG4gICAgIyMjKlxuICAgICogQWN0aW9uIG1ldGhvZCB3aGljaCBwcmVwYXJlcyB0aGUgZ2FtZSBmb3Igc2F2aW5nIGJ5IHRha2luZyBhIHNuYXBzaG90IG9mIHRoZSBjdXJyZW50IGdhbWUgc3RhdGVcbiAgICAqIGFuZCBzdG9yaW5nIGl0IGluIEdhbWVNYW5hZ2VyLnNhdmVHYW1lLlxuICAgICpcbiAgICAqIEBtZXRob2QgcHJlcGFyZVNhdmVHYW1lXG4gICAgKiBAcGFyYW0ge2dzLk9iamVjdF9CYXNlfSBzZW5kZXIgLSBUaGUgc2VuZGVyIG9iamVjdC5cbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBDYW4gYmUgPGI+bnVsbDwvYj4uXG4gICAgIyMjIFxuICAgIHByZXBhcmVTYXZlR2FtZTogKHNlbmRlciwgcGFyYW1zKSAtPlxuICAgICAgICBHYW1lTWFuYWdlci5wcmVwYXJlU2F2ZUdhbWUocGFyYW1zPy5zbmFwc2hvdClcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogQWN0aW9uIG1ldGhvZCB3aGljaCBzYXZlcyB0aGUgY3VycmVudCBnYW1lIGF0IHRoZSBzcGVjaWZpZWQgc2F2ZSBzbG90LlxuICAgICpcbiAgICAqIEBtZXRob2Qgc2F2ZUdhbWVcbiAgICAqIEBwYXJhbSB7Z3MuT2JqZWN0X0Jhc2V9IHNlbmRlciAtIFRoZSBzZW5kZXIgb2JqZWN0LlxuICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIENvbnRhaW5zIHRoZSBzbG90LWluZGV4IHdoZXJlIHRoZSBnYW1lIHNob3VsZCBiZSBzYXZlZC5cbiAgICAqIDx1bD5cbiAgICAqIDxsaT5wYXJhbXMuc2xvdCAtIFRoZSBzbG90LWluZGV4IHdoZXJlIHRoZSBnYW1lIHNob3VsZCBiZSBzYXZlZC4gQ2FuIGJlIGEgYmluZGluZy1leHByZXNzaW9uLjwvbGk+XG4gICAgKiA8L3VsPlxuICAgICMjIyBcbiAgICBzYXZlR2FtZTogKHNlbmRlciwgcGFyYW1zKSAtPiBHYW1lTWFuYWdlci5zYXZlKHVpLkNvbXBvbmVudF9Gb3JtdWxhSGFuZGxlci5maWVsZFZhbHVlKHNlbmRlciwgcGFyYW1zLnNsb3QpKVxuICAgIFxuICAgICMjIypcbiAgICAqIEFjdGlvbiBtZXRob2Qgd2hpY2ggbG9hZHMgdGhlIGdhbWUgZnJvbSB0aGUgc3BlY2lmaWVkIHNhdmUgc2xvdC5cbiAgICAqXG4gICAgKiBAbWV0aG9kIGxvYWRHYW1lXG4gICAgKiBAcGFyYW0ge2dzLk9iamVjdF9CYXNlfSBzZW5kZXIgLSBUaGUgc2VuZGVyIG9iamVjdC5cbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBDb250YWlucyB0aGUgc2xvdC1pbmRleCB3aGVyZSB0aGUgZ2FtZSBzaG91bGQgYmUgbG9hZGVkIGZyb20uXG4gICAgKiA8dWw+XG4gICAgKiA8bGk+cGFyYW1zLnNsb3QgLSBUaGUgc2xvdC1pbmRleCB3aGVyZSB0aGUgZ2FtZSBzaG91bGQgYmUgbG9hZGVkIGZyb20uIENhbiBiZSBhIGJpbmRpbmctZXhwcmVzc2lvbi48L2xpPlxuICAgICogPC91bD5cbiAgICAjIyMgXG4gICAgbG9hZEdhbWU6IChzZW5kZXIsIHBhcmFtcykgLT5cbiAgICAgICAgR2FtZU1hbmFnZXIudGVtcFNldHRpbmdzLnNraXAgPSBub1xuICAgICAgICBHYW1lTWFuYWdlci5sb2FkKHVpLkNvbXBvbmVudF9Gb3JtdWxhSGFuZGxlci5maWVsZFZhbHVlKHNlbmRlciwgcGFyYW1zLnNsb3QpKVxuICAgICBcbiAgICAjIyMqXG4gICAgKiBBY3Rpb24gbWV0aG9kIHdoaWNoIHN0YXJ0cyBhIG5ldyBnYW1lLlxuICAgICpcbiAgICAqIEBtZXRob2QgbmV3R2FtZVxuICAgICogQHBhcmFtIHtncy5PYmplY3RfQmFzZX0gc2VuZGVyIC0gVGhlIHNlbmRlciBvYmplY3QuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gQ2FuIGJlIDxiPm51bGw8L2I+XG4gICAgIyMjIFxuICAgIG5ld0dhbWU6IChzZW5kZXIsIHBhcmFtcykgLT5cbiAgICAgICAgQXVkaW9NYW5hZ2VyLnN0b3BBbGxNdXNpYygzMClcbiAgICAgICAgR2FtZU1hbmFnZXIubmV3R2FtZSgpXG4gICAgICAgIFxuICAgICAgICBzY2VuZSA9IG5ldyB2bi5PYmplY3RfU2NlbmUoKVxuICAgICAgICBTY2VuZU1hbmFnZXIuY2xlYXIoKVxuICAgICAgICBTY2VuZU1hbmFnZXIuc3dpdGNoVG8oc2NlbmUpXG4gICAgXG4gICAgIyMjKlxuICAgICogQWN0aW9uIG1ldGhvZCB3aGljaCBleGlzdHMgdGhlIGN1cnJlbnQgZ2FtZS4gSXQgZG9lc24ndCBjaGFuZ2UgdGhlIHNjZW5lIGFuZFxuICAgICogc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgc3dpdGNoaW5nIGJhY2sgdG8gdGhlIHRpdGxlIHNjcmVlbiBvciBtYWluIG1lbnUuXG4gICAgKlxuICAgICogQG1ldGhvZCBleGl0R2FtZVxuICAgICogQHBhcmFtIHtncy5PYmplY3RfQmFzZX0gc2VuZGVyIC0gVGhlIHNlbmRlciBvYmplY3QuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gQ2FuIGJlIDxiPm51bGw8L2I+XG4gICAgIyMjIFxuICAgIGV4aXRHYW1lOiAoc2VuZGVyLCBwYXJhbXMpIC0+XG4gICAgICAgIEdhbWVNYW5hZ2VyLmV4aXRHYW1lKClcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogQWN0aW9uIG1ldGhvZCB3aGljaCBzd2l0Y2hlcyB0byBhbm90aGVyIHNjZW5lLlxuICAgICpcbiAgICAqIEBtZXRob2Qgc3dpdGNoU2NlbmVcbiAgICAqIEBwYXJhbSB7Z3MuT2JqZWN0X0Jhc2V9IHNlbmRlciAtIFRoZSBzZW5kZXIgb2JqZWN0LlxuICAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIENvbnRhaW5zIHRoZSBjbGFzcyBuYW1lIG9mIHRoZSBzY2VuZSB0byBzd2l0Y2ggdG8uXG4gICAgKiA8dWw+XG4gICAgKiA8bGk+cGFyYW1zLm5hbWUgLSBUaGUgY2xhc3MtbmFtZSBvZiB0aGUgc2NlbmUgdG8gc3dpdGNoIHRvLiBUaGUgY2xhc3MgbXVzdCBiZSBkZWZpbmVkIGluIHZuLW5hbWVzcGFjZS48L2xpPlxuICAgICogPC91bD5cbiAgICAjIyMgICAgIFxuICAgIHN3aXRjaFNjZW5lOiAoc2VuZGVyLCBwYXJhbXMpIC0+XG4gICAgICAgIGYgPSA9PlxuICAgICAgICAgICAgaWYgcGFyYW1zLmNsZWFyXG4gICAgICAgICAgICAgICAgU2NlbmVNYW5hZ2VyLmNsZWFyKClcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIHNjZW5lID0gbmV3IHZuW3BhcmFtcy5uYW1lXSgpXG4gICAgICAgICAgICBTY2VuZU1hbmFnZXIuc3dpdGNoVG8oc2NlbmUsIHBhcmFtcy5zYXZlUHJldmlvdXMpXG4gICAgICAgICAgICBcbiAgICAgICAgaWYgIXBhcmFtcy5zYXZlUHJldmlvdXNcbiAgICAgICAgICAgIEBsYXlvdXQudWkuZGlzYXBwZWFyIChlKSA9PiBmKClcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgZigpXG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIEFjdGlvbiBtZXRob2Qgd2hpY2ggc3dpdGNoZXMgdG8gYW5vdGhlciBnYW1lIHNjZW5lLlxuICAgICpcbiAgICAqIEBtZXRob2Qgc3dpdGNoR2FtZVNjZW5lXG4gICAgKiBAcGFyYW0ge2dzLk9iamVjdF9CYXNlfSBzZW5kZXIgLSBUaGUgc2VuZGVyIG9iamVjdC5cbiAgICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBDb250YWlucyB0aGUgVUlEIG9mIHRoZSBzY2VuZSB0byBzd2l0Y2ggdG8uXG4gICAgKiA8dWw+XG4gICAgKiA8bGk+cGFyYW1zLnVpZCAtIFRoZSBVSUQgb2YgdGhlIHNjZW5lIHRvIHN3aXRjaCB0by48L2xpPlxuICAgICogPC91bD5cbiAgICAjIyMgICAgXG4gICAgc3dpdGNoR2FtZVNjZW5lOiAoc2VuZGVyLCBwYXJhbXMpIC0+XG4gICAgICAgIGYgPSA9PlxuICAgICAgICAgICAgaWYgcGFyYW1zLmNsZWFyXG4gICAgICAgICAgICAgICAgU2NlbmVNYW5hZ2VyLmNsZWFyKClcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIHVpZCA9IHBhcmFtcy51aWRcbiAgICAgICAgICAgIGlmIHBhcmFtcy5uYW1lXG4gICAgICAgICAgICAgICAgc2NlbmVEb2N1bWVudHMgPSBEYXRhTWFuYWdlci5nZXREb2N1bWVudHNCeVR5cGUoXCJ2bi5zY2VuZVwiKVxuICAgICAgICAgICAgICAgIHNjZW5lRG9jdW1lbnQgPSBzY2VuZURvY3VtZW50cy5maXJzdCAoZCkgLT4gZC5pdGVtcy5uYW1lID09IHBhcmFtcy5uYW1lXG4gICAgICAgICAgICAgICAgaWYgc2NlbmVEb2N1bWVudFxuICAgICAgICAgICAgICAgICAgICB1aWQgPSBzY2VuZURvY3VtZW50LnVpZFxuICAgICAgICAgICAgXG4gICAgICAgICAgICBzY2VuZURhdGEgPSB1aWQ6IHVpZCwgcGljdHVyZXM6IFtdLCB0ZXh0czogW11cbiAgICAgICAgICAgIEdhbWVNYW5hZ2VyLnNjZW5lRGF0YSA9IHNjZW5lRGF0YVxuICAgICAgICAgICAgbmV3U2NlbmUgPSBuZXcgdm4uT2JqZWN0X1NjZW5lKClcbiAgICAgICAgICAgIG5ld1NjZW5lLnNjZW5lRGF0YSA9IHNjZW5lRGF0YVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBTY2VuZU1hbmFnZXIuc3dpdGNoVG8obmV3U2NlbmUsIHBhcmFtcy5zYXZlUHJldmlvdXMpXG4gICAgICAgICAgICBcbiAgICAgICAgaWYgIXBhcmFtcy5zYXZlUHJldmlvdXNcbiAgICAgICAgICAgIChAbGF5b3V0fHxAb2JqZWN0LmxheW91dCkudWkuZGlzYXBwZWFyIChlKSA9PiBmKClcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgZigpXG4gICAgXG4gICAgIyMjKlxuICAgICogQWN0aW9uIG1ldGhvZCB3aGljaCBzd2l0Y2hlcyB0byBhbm90aGVyIGxheW91dC5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHN3aXRjaExheW91dFxuICAgICogQHBhcmFtIHtncy5PYmplY3RfQmFzZX0gc2VuZGVyIC0gVGhlIHNlbmRlciBvYmplY3QuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gQ29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIGxheW91dCB0byBzd2l0Y2ggdG8uXG4gICAgKiA8dWw+XG4gICAgKiA8bGk+cGFyYW1zLm5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgbGF5b3V0IHRvIHN3aXRjaCB0by48L2xpPlxuICAgICogPGxpPnBhcmFtcy5zYXZlUHJldmlvdXMgLSBJbmRpY2F0ZXMgaWYgdGhlIGN1cnJlbnQgbGF5b3V0IHNob3VsZCBub3QgYmUgZXJhc2VkIGJ1dCBwYXVzZWQgYW5kIGhpZGRlbiBpbnN0ZWFkIHNvXG4gICAgKiB0aGF0IGl0IGNhbiBiZSByZXN0b3JlZCB1c2luZyA8aT5yZXR1cm5Ub1ByZXZpb3VzPC9pPiBhY3Rpb24uPC9saT5cbiAgICAqIDxsaT5wYXJhbXMuZGF0YUZpZWxkcyAtIERlZmluZXMgdGhlIGRhdGEgb2YgXCIkZGF0YUZpZWxkc1wiIGJpbmRpbmctZXhwcmVzc2lvbiB2YXJpYWJsZS4gQ2FuIGJlIGEgYmluZGluZy1leHByZXNzaW9uXG4gICAgKiBvciBhIGRpcmVjdCBvYmplY3QuIE9wdGlvbmFsLjwvbGk+XG4gICAgKiA8L3VsPlxuICAgICMjIyAgICBcbiAgICBzd2l0Y2hMYXlvdXQ6IChzZW5kZXIsIGxheW91dCkgLT5cbiAgICAgICAgZiA9ID0+XG4gICAgICAgICAgICBHcmFwaGljcy5mcmVlemUoKVxuICAgICAgICAgICAgaWYgbGF5b3V0LmNsZWFyXG4gICAgICAgICAgICAgICAgU2NlbmVNYW5hZ2VyLmNsZWFyKClcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIHNjZW5lID0gbmV3IGdzLk9iamVjdF9MYXlvdXQobGF5b3V0Lm5hbWUpXG4gICAgICAgICAgXG4gICAgICAgICAgICBkYXRhRmllbGRzID0gc2VuZGVyLmRhdGFGaWVsZHNcbiAgICAgICAgICAgIGlmIHR5cGVvZiBsYXlvdXQuZGF0YUZpZWxkcyA9PSBcInN0cmluZ1wiXG4gICAgICAgICAgICAgICAgZGF0YUZpZWxkcyA9IHVpLkNvbXBvbmVudF9Gb3JtdWxhSGFuZGxlci5maWVsZFZhbHVlKHNlbmRlciwgbGF5b3V0LmRhdGFGaWVsZHMpXG4gICAgICAgICAgICBlbHNlIGlmIGxheW91dC5kYXRhRmllbGRzP1xuICAgICAgICAgICAgICAgIGRhdGFGaWVsZHMgPSBsYXlvdXQuZGF0YUZpZWxkc1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgc2NlbmUuZGF0YUZpZWxkcyA9IGRhdGFGaWVsZHNcbiAgICAgICAgICAgIHNjZW5lLmNvbnRyb2xsZXJzID0gbGF5b3V0LmNvbnRyb2xsZXJzXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIGxheW91dC5zZW5kZXJEYXRhP1xuICAgICAgICAgICAgICAgIGZvciBzZW5kZXJGaWVsZCBpbiBsYXlvdXQuc2VuZGVyRGF0YVxuICAgICAgICAgICAgICAgICAgICBzY2VuZVtzZW5kZXJGaWVsZF0gPSBzZW5kZXJbc2VuZGVyRmllbGRdXG4gICAgICAgICAgICBTY2VuZU1hbmFnZXIuc3dpdGNoVG8oc2NlbmUsIGxheW91dC5zYXZlUHJldmlvdXMsIGxheW91dC5zdGFjaylcbiAgICAgICAgXG4gICAgICAgIGlmICFsYXlvdXQuc2F2ZVByZXZpb3VzXG4gICAgICAgICAgICAoQGxheW91dHx8QG9iamVjdC5sYXlvdXQpLnVpLmRpc2FwcGVhciAoZSkgPT4gZigpXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIGYoKVxuICAgICBcbiAgICAjIyMqXG4gICAgKiBBY3Rpb24gbWV0aG9kIHdoaWNoIHJldHVybnMgdG8gcHJldmlvdXMgbGF5b3V0LiAoSWYgc2F2ZVByZXZpb3VzIHdhcyBzZXQgdG8gPGI+dHJ1ZTwvYj4gb24gc3dpdGNoTGF5b3V0LikuXG4gICAgKlxuICAgICogQG1ldGhvZCBwcmV2aW91c0xheW91dFxuICAgICogQHBhcmFtIHtncy5PYmplY3RfQmFzZX0gc2VuZGVyIC0gVGhlIHNlbmRlciBvYmplY3QuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gQ2FuIGJlIDxiPm51bGw8L2I+LlxuICAgICMjIyAgICAgXG4gICAgcHJldmlvdXNMYXlvdXQ6IChzZW5kZXIpIC0+XG4gICAgICAgIFNjZW5lTWFuYWdlci5yZXR1cm5Ub1ByZXZpb3VzKClcbiAgICAgIFxuICAgICMjIypcbiAgICAqIEFjdGlvbiBtZXRob2Qgd2hpY2ggZGlzcG9zZXMgdGhlIHNwZWNpZmllZCBjb250cm9sLlxuICAgICpcbiAgICAqIEBtZXRob2QgZGlzcG9zZUNvbnRyb2xcbiAgICAqIEBwYXJhbSB7Z3MuT2JqZWN0X0Jhc2V9IHNlbmRlciAtIFRoZSBzZW5kZXIgb2JqZWN0LlxuICAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcyAtIFRoZSBJRCBvZiB0aGUgY29udHJvbCB0byBkaXNwb3NlLiBDYW4gYmUgYSBiaW5kaW5nLWV4cHJlc3Npb24uXG4gICAgIyMjICAgIFxuICAgIGRpc3Bvc2VDb250cm9sOiAoc2VuZGVyLCBpZCkgLT5cbiAgICAgICAgY29udHJvbCA9IEBvYmplY3RNYW5hZ2VyLm9iamVjdEJ5SWQodWkuQ29tcG9uZW50X0Zvcm11bGFIYW5kbGVyLmZpZWxkVmFsdWUoc2VuZGVyLCBpZCkpXG4gICAgICAgIFxuICAgICAgICBcbiAgICAgICAgY29udHJvbD8udWkuZGlzYXBwZWFyIChzZW5kZXIpIC0+IHNlbmRlci5kaXNwb3NlKClcbiAgICBcbiAgICAjIyMqXG4gICAgKiBBY3Rpb24gbWV0aG9kIHdoaWNoIGNyZWF0ZXMgYSBuZXcgY29udHJvbCBmcm9tIHRoZSBzcGVjaWZpZWQgZGVzY3JpcHRvci5cbiAgICAqXG4gICAgKiBAbWV0aG9kIGNyZWF0ZUNvbnRyb2xcbiAgICAqIEBwYXJhbSB7Z3MuT2JqZWN0X0Jhc2V9IHNlbmRlciAtIFRoZSBzZW5kZXIgb2JqZWN0LlxuICAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcyAtIENvbnRhaW5zIHRoZSBkZXNjcmlwdG9yIGFuZCBvdGhlciBkYXRhIG5lZWRlZCB0byBjb25zdHJ1Y3QgdGhlIGNvbnRyb2wuXG4gICAgKiA8dWw+XG4gICAgKiA8bGk+cGFyYW1zLmRlc2NyaXB0b3IgLSBUaGUgY29udHJvbCcgZGVzY3JpcHRvci4gQ2FuIGJlIGEgZGlyZWN0IGRlc2NyaXB0b3IgZGVmaW5pdGlvbiBvciBhIHRlbXBsYXRlIG5hbWU8L2xpPlxuICAgICogPGxpPnBhcmFtcy5wYXJlbnQgLSBBIGJpbmRpbmctZXhwcmVzc2lvbiB3aGljaCByZXR1cm5zIHRoZSBjb250cm9sJ3MgcGFyZW50LjwvbGk+XG4gICAgKiA8bGk+cGFyYW1zLnNlbmRlckRhdGEgLSBBbiBvYmplY3QgY29udGFpbmluZyBhZGRpdGlvbmFsIGRhdGEgbWVyZ2VkIGludG8gdGhlIGNvbnRyb2wgb2JqZWN0LjwvbGk+XG4gICAgKiA8L3VsPlxuICAgICMjIyAgXG4gICAgY3JlYXRlQ29udHJvbDogKHNlbmRlciwgZGF0YSkgLT5cbiAgICAgICAgaWYgdHlwZW9mIGRhdGEuZGVzY3JpcHRvciA9PSBcInN0cmluZ1wiXG4gICAgICAgICAgICBkZXNjcmlwdG9yID0gdWkuVUlNYW5hZ2VyLmN1c3RvbVR5cGVzW2RhdGEuZGVzY3JpcHRvcl1cbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgZGVzY3JpcHRvciA9IGRhdGEuZGVzY3JpcHRvclxuICAgICAgICBcbiAgICAgICAgcGFyZW50ID0gdWkuQ29tcG9uZW50X0Zvcm11bGFIYW5kbGVyLmZpZWxkVmFsdWUoc2VuZGVyLCBkYXRhLnBhcmVudClcbiAgICAgICAgY29udHJvbCA9IHVpLlVpRmFjdG9yeS5fY3JlYXRlRnJvbURlc2NyaXB0b3IoZGVzY3JpcHRvciwgcGFyZW50ID8gKEBvYmplY3QubGF5b3V0fHxAb2JqZWN0KSApXG4gICAgICAgIFxuICAgICAgICBpZiBkYXRhLnNlbmRlckRhdGE/XG4gICAgICAgICAgICBmb3IgZmllbGROYW1lIGluIGRhdGEuc2VuZGVyRGF0YVxuICAgICAgICAgICAgICAgIGNvbnRyb2xbZmllbGROYW1lXSA9IHNlbmRlcltmaWVsZE5hbWVdXG4gICAgICAgIGNvbnRyb2wudWkucHJlcGFyZSgpXG4gICAgICAgIGNvbnRyb2wudWkuYXBwZWFyKClcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBjb250cm9sXG4gICAgICAgIFxuICAgICMjIypcbiAgICAqIEFjdGlvbiBtZXRob2Qgd2hpY2ggcXVpdHMgdGhlIGdhbWUuXG4gICAgKlxuICAgICogQG1ldGhvZCBxdWl0R2FtZVxuICAgICogQHBhcmFtIHtncy5PYmplY3RfQmFzZX0gc2VuZGVyIC0gVGhlIHNlbmRlciBvYmplY3QuXG4gICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zIC0gQ2FuIGJlIDxiPm51bGw8L2I+LlxuICAgICMjIyBcbiAgICBxdWl0R2FtZTogKHNlbmRlciwgZGF0YSkgLT5cbiAgICAgICAgU2NlbmVNYW5hZ2VyLnN3aXRjaFRvKG51bGwpXG4gICAgICAgICAgICBcbiAgICAgICAgXG4gICAgICAgIFxuZ3MuQ29tcG9uZW50X0xheW91dFNjZW5lQmVoYXZpb3IgPSBDb21wb25lbnRfTGF5b3V0U2NlbmVCZWhhdmlvciJdfQ==\n//# sourceURL=Component_LayoutSceneBehavior_22.js"
    },
    "summary": [
        "name",
        "type",
        "order"
    ]
}

Commits for Nextrek/s2s/data/7AD6803FKBBC9A4E4CSAF66EFC2E93FF462D.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