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": "922103F9K2F40A4605SB7D6E96ACC3F0E72D",
    "isLoaded": true,
    "lastModificationTime": 0,
    "items": {
        "name": "Component_MoveAnimation",
        "type": "game_script",
        "order": 6,
        "content": "# ===================================================================\n#\n#   Script: Component_MoveAnimation\n#\n#   $$COPYRIGHT$$\n#\n# ===================================================================\nclass Component_MoveAnimation extends gs.Component_Animation\n    ###*\n    * Executes a move-animation on a game-object.\n    *\n    * @module gs\n    * @class Component_MoveAnimation\n    * @extends gs.Component_Animation\n    * @memberof gs\n    * @constructor\n    ###\n    constructor: (data) ->\n        super\n        \n        ###*\n        * The easing-object used for the animation.\n        * @property easing\n        * @type gs.Easing\n        ###\n        @easing = new gs.Easing(null, data?.easing)\n        \n        ###*\n        * The move-animation type (move-in, move-out, etc.).\n        * @property animationType\n        * @type gs.MoveAnimationType\n        ###\n        @animationType = data?.animationType || 0\n     \n    ###*\n    * Serializes the move-animation into a data-bundle.\n    *\n    * @method toDataBundle\n    ###      \n    toDataBundle: ->\n        easing: @easing,\n        animationType: @animationType\n     \n    ###*\n    * Updates the move-animation.\n    *\n    * @method update\n    ###      \n    update: ->\n        super()\n        if not @easing.isRunning then return\n        \n        @easing.updatePosition()\n        \n        @updateCoordinates()\n            \n        if not @easing.isRunning\n            if not @easing.isEndless\n                @object.dstRect.x = Math.round(@object.dstRect.x)\n                @object.dstRect.y = Math.round(@object.dstRect.y)\n            @callback?(@object, this)\n     \n    ###*\n    * Updates the game object's coordinates depending on animation type.\n    *\n    * @method updateCoordinates\n    * @protected\n    ###     \n    updateCoordinates: ->\n        switch @animationType\n            when 0\n                @object.offset.x = Math.floor(@easing.x)\n                @object.offset.y = Math.floor(@easing.y)\n            when 1\n                @object.dstRect.x = Math.floor(@easing.x)\n                @object.dstRect.y = Math.floor(@easing.y)\n            when 2\n                @object.visual.scroll.x = Math.round(@easing.x)\n                @object.visual.scroll.y = Math.round(@easing.y)\n                \n    ###*\n    * Scrolls the game object's content with a specified speed if supported.\n    *\n    * @method scroll\n    * @param {number} speedX The speed on x-axis in pixels per frame.\n    * @param {number} speedY The speed on y-axis in pixels per frame.\n    * @param {number} duration The duration in frames.\n    * @param {Object} easingType The easing-type used for the animation.\n    * @param {function} [callback] An optional callback-function called when the animation is finished.\n    ###  \n    scroll: (speedX, speedY, duration, easingType, callback) ->\n        @move(speedX, speedY, duration, easingType, callback)\n        @animationType = 2\n        \n    ###*\n    * Scrolls the game object to a specified position.\n    *\n    * @method scrollTo\n    * @param {number} x The x-coordinate of the position.\n    * @param {number} y The y-coordinate of the position.\n    * @param {number} duration The duration in frames.\n    * @param {Object} easingType The easing-type.\n    * @param {function} [callback] An optional callback-function called when the animation is finished.\n    ###      \n    scrollTo: (x, y, duration, easingType, callback) ->\n        @animationType = 2\n        @callback = callback\n        if @object.visual.scroll.x == x and @object.visual.scroll.y == y then return\n        \n        @easing.type = easingType || gs.Easings.EASE_LINEAR[gs.EasingTypes.EASE_IN]\n        if duration == 0 or @isInstantSkip()\n            @object.visual.scroll.x = x\n            @object.visual.scroll.y = y\n            @callback?(@object, this)\n        else\n            @easing.start(@object.visual.scroll.x, @object.visual.scroll.y, x, y, duration)\n            @targetX = x\n            @targetY = y\n        \n    ###*\n    * Moves the game object with a specified speed.\n    *\n    * @method move\n    * @param {number} speedX The speed on x-axis in pixels per frame.\n    * @param {number} speedY The speed on y-axis in pixels per frame.\n    * @param {number} duration The duration in frames.\n    * @param {Object} easingType The easing-type used for the animation.\n    * @param {function} [callback] An optional callback-function called when the animation is finished.\n    ###        \n    move: (speedX, speedY, duration, easingType, callback) ->\n        @animationType = 1\n        @targetX = duration * speedX\n        @targetY = duration * speedY\n        @callback = callback\n        \n        @easing.type = easingType || gs.Easings.EASE_LINEAR[gs.EasingTypes.EASE_IN]\n        if duration == 0 or @isInstantSkip()\n            @easing.startEndless(speedX, speedY)\n        else\n            @easing.start(@object.dstRect.x, @object.dstRect.y, @targetX, @targetY, duration)\n    \n    ###*\n    * Moves the game object to a specified position.\n    *\n    * @method moveTo\n    * @param {number} x The x-coordinate of the position.\n    * @param {number} y The y-coordinate of the position.\n    * @param {number} duration The duration in frames.\n    * @param {Object} easingType The easing-type.\n    * @param {function} [callback] An optional callback-function called when the animation is finished.\n    ###      \n    moveTo: (x, y, duration, easingType, callback) ->\n        @animationType = 1\n        @callback = callback\n        if @object.dstRect.x == x and @object.dstRect.y == y then return\n        \n        @easing.type = easingType || gs.Easings.EASE_LINEAR[gs.EasingTypes.EASE_IN]\n        if duration == 0 or @isInstantSkip()\n            @easing.x = x\n            @easing.y = y\n            @updateCoordinates()\n        else\n            @easing.start(@object.dstRect.x, @object.dstRect.y, x, y, duration)\n            @targetX = x\n            @targetY = y\n    \n    ###*\n    * Lets a game object appear on screen from left, top, right or bottom using \n    * a move-animation\n    *\n    * @method moveIn\n    * @param {number} x The x-coordinate of the target-position.\n    * @param {number} y The y-coordinate of the target-position.\n    * @param {number} type The movement-direction from where the game object should move-in.\n    * @param {number} duration The duration in frames.\n    * @param {Object} easingType The easing-type.\n    * @param {function} [callback] An optional callback-function called when the animation is finished. \n    ###         \n    moveIn: (x, y, type, duration, easing, callback) ->\n        @animationType = 0\n        @object.offset.x = 0\n        @object.offset.y = 0\n        \n        if duration == 0 or @isInstantSkip()\n            @object.update()\n            return callback?(@object, this)\n        \n        @easing.type = easing\n        @callback = callback\n        \n        rect = if @object.angle? then @object.dstRect.rotate(@object.angle) else @object.dstRect\n        width = rect.width * @object.zoom.x\n        height = rect.height * @object.zoom.y\n        x = @object.dstRect.x - (width-rect.width) * @object.anchor.x\n        y = @object.dstRect.y - (height-rect.height) * @object.anchor.y\n        \n        switch type\n            when 0 # Left\n                @object.offset.y = 0\n                @object.offset.x = -(x+width+@object.origin.x)\n            when 1 # Top\n                @object.offset.y = -(y+height+@object.origin.y)\n                @object.offset.x = 0\n            when 2 # Right\n                @object.offset.x = (@object.viewport||Graphics.viewport).rect.width - x\n                @object.offset.y = 0\n            when 3 # Bottom\n                @object.offset.x = 0\n                @object.offset.y = (@object.viewport||Graphics.viewport).rect.height - y\n\n        @object.update()\n        @easing.start(@object.offset.x, @object.offset.y, 0, 0, duration)\n       \n    ###*\n    * Lets a game object disappear from screen to the left, top, right or bottom using \n    * a move-animation\n    *\n    * @method moveOut\n    * @param {number} type The movement-direction in which the game object should move-out.\n    * @param {number} duration The duration in frames.\n    * @param {Object} easingType The easing-type.\n    * @param {function} [callback] An optional callback-function called when the animation is finished. \n    ###    \n    moveOut: (type, duration, easing, callback) ->\n        #if duration == 0 or @isInstantSkip()\n        #    return callback?(@object, this)\n            \n        @animationType = 0\n        @easing.type = easing\n        @callback = callback\n        \n        \n            \n        x = 0\n        y = 0\n        viewport = Graphics.viewport\n        \n        \n        rect = if @object.angle? then @object.dstRect.rotate(@object.angle) else @object.dstRect\n        width = rect.width * @object.zoom.x\n        height = rect.height * @object.zoom.y\n        x = @object.dstRect.x - (width-rect.width) * @object.anchor.x\n        y = @object.dstRect.y - (height-rect.height) * @object.anchor.y\n        \n        switch type\n            when 0 # Left\n                x = -(@object.origin.x+x+width)\n                y = 0\n            when 1 # Top\n                y = -(@object.origin.y+y+height)\n                x = 0\n            when 2 # Right\n                x = (@object.viewport||Graphics.viewport).rect.width\n                y = 0 \n            when 3 # Bottom\n                y = (@object.viewport||Graphics.viewport).rect.height\n                x = 0\n                \n        if duration == 0 or @isInstantSkip()\n            @object.offset.x = x\n            @object.offset.y = y\n            @callback?(@object, this)\n        else\n            @easing.start(@object.offset.x, @object.offset.y, x, y, duration)\n        \ngs.Component_MoveAnimation = Component_MoveAnimation",
        "parentId": "A8E9945CKEE5CA4855SAC81E480CB8098E0E",
        "folder": false,
        "compiledContent": "var Component_MoveAnimation,\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_MoveAnimation = (function(superClass) {\n  extend(Component_MoveAnimation, superClass);\n\n\n  /**\n  * Executes a move-animation on a game-object.\n  *\n  * @module gs\n  * @class Component_MoveAnimation\n  * @extends gs.Component_Animation\n  * @memberof gs\n  * @constructor\n   */\n\n  function Component_MoveAnimation(data) {\n    Component_MoveAnimation.__super__.constructor.apply(this, arguments);\n\n    /**\n    * The easing-object used for the animation.\n    * @property easing\n    * @type gs.Easing\n     */\n    this.easing = new gs.Easing(null, data != null ? data.easing : void 0);\n\n    /**\n    * The move-animation type (move-in, move-out, etc.).\n    * @property animationType\n    * @type gs.MoveAnimationType\n     */\n    this.animationType = (data != null ? data.animationType : void 0) || 0;\n  }\n\n\n  /**\n  * Serializes the move-animation into a data-bundle.\n  *\n  * @method toDataBundle\n   */\n\n  Component_MoveAnimation.prototype.toDataBundle = function() {\n    return {\n      easing: this.easing,\n      animationType: this.animationType\n    };\n  };\n\n\n  /**\n  * Updates the move-animation.\n  *\n  * @method update\n   */\n\n  Component_MoveAnimation.prototype.update = function() {\n    Component_MoveAnimation.__super__.update.call(this);\n    if (!this.easing.isRunning) {\n      return;\n    }\n    this.easing.updatePosition();\n    this.updateCoordinates();\n    if (!this.easing.isRunning) {\n      if (!this.easing.isEndless) {\n        this.object.dstRect.x = Math.round(this.object.dstRect.x);\n        this.object.dstRect.y = Math.round(this.object.dstRect.y);\n      }\n      return typeof this.callback === \"function\" ? this.callback(this.object, this) : void 0;\n    }\n  };\n\n\n  /**\n  * Updates the game object's coordinates depending on animation type.\n  *\n  * @method updateCoordinates\n  * @protected\n   */\n\n  Component_MoveAnimation.prototype.updateCoordinates = function() {\n    switch (this.animationType) {\n      case 0:\n        this.object.offset.x = Math.floor(this.easing.x);\n        return this.object.offset.y = Math.floor(this.easing.y);\n      case 1:\n        this.object.dstRect.x = Math.floor(this.easing.x);\n        return this.object.dstRect.y = Math.floor(this.easing.y);\n      case 2:\n        this.object.visual.scroll.x = Math.round(this.easing.x);\n        return this.object.visual.scroll.y = Math.round(this.easing.y);\n    }\n  };\n\n\n  /**\n  * Scrolls the game object's content with a specified speed if supported.\n  *\n  * @method scroll\n  * @param {number} speedX The speed on x-axis in pixels per frame.\n  * @param {number} speedY The speed on y-axis in pixels per frame.\n  * @param {number} duration The duration in frames.\n  * @param {Object} easingType The easing-type used for the animation.\n  * @param {function} [callback] An optional callback-function called when the animation is finished.\n   */\n\n  Component_MoveAnimation.prototype.scroll = function(speedX, speedY, duration, easingType, callback) {\n    this.move(speedX, speedY, duration, easingType, callback);\n    return this.animationType = 2;\n  };\n\n\n  /**\n  * Scrolls the game object to a specified position.\n  *\n  * @method scrollTo\n  * @param {number} x The x-coordinate of the position.\n  * @param {number} y The y-coordinate of the position.\n  * @param {number} duration The duration in frames.\n  * @param {Object} easingType The easing-type.\n  * @param {function} [callback] An optional callback-function called when the animation is finished.\n   */\n\n  Component_MoveAnimation.prototype.scrollTo = function(x, y, duration, easingType, callback) {\n    this.animationType = 2;\n    this.callback = callback;\n    if (this.object.visual.scroll.x === x && this.object.visual.scroll.y === y) {\n      return;\n    }\n    this.easing.type = easingType || gs.Easings.EASE_LINEAR[gs.EasingTypes.EASE_IN];\n    if (duration === 0 || this.isInstantSkip()) {\n      this.object.visual.scroll.x = x;\n      this.object.visual.scroll.y = y;\n      return typeof this.callback === \"function\" ? this.callback(this.object, this) : void 0;\n    } else {\n      this.easing.start(this.object.visual.scroll.x, this.object.visual.scroll.y, x, y, duration);\n      this.targetX = x;\n      return this.targetY = y;\n    }\n  };\n\n\n  /**\n  * Moves the game object with a specified speed.\n  *\n  * @method move\n  * @param {number} speedX The speed on x-axis in pixels per frame.\n  * @param {number} speedY The speed on y-axis in pixels per frame.\n  * @param {number} duration The duration in frames.\n  * @param {Object} easingType The easing-type used for the animation.\n  * @param {function} [callback] An optional callback-function called when the animation is finished.\n   */\n\n  Component_MoveAnimation.prototype.move = function(speedX, speedY, duration, easingType, callback) {\n    this.animationType = 1;\n    this.targetX = duration * speedX;\n    this.targetY = duration * speedY;\n    this.callback = callback;\n    this.easing.type = easingType || gs.Easings.EASE_LINEAR[gs.EasingTypes.EASE_IN];\n    if (duration === 0 || this.isInstantSkip()) {\n      return this.easing.startEndless(speedX, speedY);\n    } else {\n      return this.easing.start(this.object.dstRect.x, this.object.dstRect.y, this.targetX, this.targetY, duration);\n    }\n  };\n\n\n  /**\n  * Moves the game object to a specified position.\n  *\n  * @method moveTo\n  * @param {number} x The x-coordinate of the position.\n  * @param {number} y The y-coordinate of the position.\n  * @param {number} duration The duration in frames.\n  * @param {Object} easingType The easing-type.\n  * @param {function} [callback] An optional callback-function called when the animation is finished.\n   */\n\n  Component_MoveAnimation.prototype.moveTo = function(x, y, duration, easingType, callback) {\n    this.animationType = 1;\n    this.callback = callback;\n    if (this.object.dstRect.x === x && this.object.dstRect.y === y) {\n      return;\n    }\n    this.easing.type = easingType || gs.Easings.EASE_LINEAR[gs.EasingTypes.EASE_IN];\n    if (duration === 0 || this.isInstantSkip()) {\n      this.easing.x = x;\n      this.easing.y = y;\n      return this.updateCoordinates();\n    } else {\n      this.easing.start(this.object.dstRect.x, this.object.dstRect.y, x, y, duration);\n      this.targetX = x;\n      return this.targetY = y;\n    }\n  };\n\n\n  /**\n  * Lets a game object appear on screen from left, top, right or bottom using \n  * a move-animation\n  *\n  * @method moveIn\n  * @param {number} x The x-coordinate of the target-position.\n  * @param {number} y The y-coordinate of the target-position.\n  * @param {number} type The movement-direction from where the game object should move-in.\n  * @param {number} duration The duration in frames.\n  * @param {Object} easingType The easing-type.\n  * @param {function} [callback] An optional callback-function called when the animation is finished.\n   */\n\n  Component_MoveAnimation.prototype.moveIn = function(x, y, type, duration, easing, callback) {\n    var height, rect, width;\n    this.animationType = 0;\n    this.object.offset.x = 0;\n    this.object.offset.y = 0;\n    if (duration === 0 || this.isInstantSkip()) {\n      this.object.update();\n      return typeof callback === \"function\" ? callback(this.object, this) : void 0;\n    }\n    this.easing.type = easing;\n    this.callback = callback;\n    rect = this.object.angle != null ? this.object.dstRect.rotate(this.object.angle) : this.object.dstRect;\n    width = rect.width * this.object.zoom.x;\n    height = rect.height * this.object.zoom.y;\n    x = this.object.dstRect.x - (width - rect.width) * this.object.anchor.x;\n    y = this.object.dstRect.y - (height - rect.height) * this.object.anchor.y;\n    switch (type) {\n      case 0:\n        this.object.offset.y = 0;\n        this.object.offset.x = -(x + width + this.object.origin.x);\n        break;\n      case 1:\n        this.object.offset.y = -(y + height + this.object.origin.y);\n        this.object.offset.x = 0;\n        break;\n      case 2:\n        this.object.offset.x = (this.object.viewport || Graphics.viewport).rect.width - x;\n        this.object.offset.y = 0;\n        break;\n      case 3:\n        this.object.offset.x = 0;\n        this.object.offset.y = (this.object.viewport || Graphics.viewport).rect.height - y;\n    }\n    this.object.update();\n    return this.easing.start(this.object.offset.x, this.object.offset.y, 0, 0, duration);\n  };\n\n\n  /**\n  * Lets a game object disappear from screen to the left, top, right or bottom using \n  * a move-animation\n  *\n  * @method moveOut\n  * @param {number} type The movement-direction in which the game object should move-out.\n  * @param {number} duration The duration in frames.\n  * @param {Object} easingType The easing-type.\n  * @param {function} [callback] An optional callback-function called when the animation is finished.\n   */\n\n  Component_MoveAnimation.prototype.moveOut = function(type, duration, easing, callback) {\n    var height, rect, viewport, width, x, y;\n    this.animationType = 0;\n    this.easing.type = easing;\n    this.callback = callback;\n    x = 0;\n    y = 0;\n    viewport = Graphics.viewport;\n    rect = this.object.angle != null ? this.object.dstRect.rotate(this.object.angle) : this.object.dstRect;\n    width = rect.width * this.object.zoom.x;\n    height = rect.height * this.object.zoom.y;\n    x = this.object.dstRect.x - (width - rect.width) * this.object.anchor.x;\n    y = this.object.dstRect.y - (height - rect.height) * this.object.anchor.y;\n    switch (type) {\n      case 0:\n        x = -(this.object.origin.x + x + width);\n        y = 0;\n        break;\n      case 1:\n        y = -(this.object.origin.y + y + height);\n        x = 0;\n        break;\n      case 2:\n        x = (this.object.viewport || Graphics.viewport).rect.width;\n        y = 0;\n        break;\n      case 3:\n        y = (this.object.viewport || Graphics.viewport).rect.height;\n        x = 0;\n    }\n    if (duration === 0 || this.isInstantSkip()) {\n      this.object.offset.x = x;\n      this.object.offset.y = y;\n      return typeof this.callback === \"function\" ? this.callback(this.object, this) : void 0;\n    } else {\n      return this.easing.start(this.object.offset.x, this.object.offset.y, x, y, duration);\n    }\n  };\n\n  return Component_MoveAnimation;\n\n})(gs.Component_Animation);\n\ngs.Component_MoveAnimation = Component_MoveAnimation;\n\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU9BLElBQUEsdUJBQUE7RUFBQTs7O0FBQU07Ozs7QUFDRjs7Ozs7Ozs7OztFQVNhLGlDQUFDLElBQUQ7SUFDVCwwREFBQSxTQUFBOztBQUVBOzs7OztJQUtBLElBQUMsQ0FBQSxNQUFELEdBQWMsSUFBQSxFQUFFLENBQUMsTUFBSCxDQUFVLElBQVYsaUJBQWdCLElBQUksQ0FBRSxlQUF0Qjs7QUFFZDs7Ozs7SUFLQSxJQUFDLENBQUEsYUFBRCxtQkFBaUIsSUFBSSxDQUFFLHVCQUFOLElBQXVCO0VBZi9COzs7QUFpQmI7Ozs7OztvQ0FLQSxZQUFBLEdBQWMsU0FBQTtXQUNWO01BQUEsTUFBQSxFQUFRLElBQUMsQ0FBQSxNQUFUO01BQ0EsYUFBQSxFQUFlLElBQUMsQ0FBQSxhQURoQjs7RUFEVTs7O0FBSWQ7Ozs7OztvQ0FLQSxNQUFBLEdBQVEsU0FBQTtJQUNKLGtEQUFBO0lBQ0EsSUFBRyxDQUFJLElBQUMsQ0FBQSxNQUFNLENBQUMsU0FBZjtBQUE4QixhQUE5Qjs7SUFFQSxJQUFDLENBQUEsTUFBTSxDQUFDLGNBQVIsQ0FBQTtJQUVBLElBQUMsQ0FBQSxpQkFBRCxDQUFBO0lBRUEsSUFBRyxDQUFJLElBQUMsQ0FBQSxNQUFNLENBQUMsU0FBZjtNQUNJLElBQUcsQ0FBSSxJQUFDLENBQUEsTUFBTSxDQUFDLFNBQWY7UUFDSSxJQUFDLENBQUEsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFoQixHQUFvQixJQUFJLENBQUMsS0FBTCxDQUFXLElBQUMsQ0FBQSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQTNCO1FBQ3BCLElBQUMsQ0FBQSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQWhCLEdBQW9CLElBQUksQ0FBQyxLQUFMLENBQVcsSUFBQyxDQUFBLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBM0IsRUFGeEI7O21EQUdBLElBQUMsQ0FBQSxTQUFVLElBQUMsQ0FBQSxRQUFR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QUEsYUFBRCxDQUFBLENBQXBCO01BQ0ksSUFBQyxDQUFBLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBZixHQUFtQjtNQUNuQixJQUFDLENBQUEsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFmLEdBQW1CO21EQUNuQixJQUFDLENBQUEsU0FBVSxJQUFDLENBQUEsUUFBUSxlQUh4QjtLQUFBLE1BQUE7YUFLSSxJQUFDLENBQUEsTUFBTSxDQUFDLEtBQVIsQ0FBYyxJQUFDLENBQUEsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUE3QixFQUFnQyxJQUFDLENBQUEsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUEvQyxFQUFrRCxDQUFsRCxFQUFxRCxDQUFyRCxFQUF3RCxRQUF4RCxFQUxKOztFQW5DSzs7OztHQXhOeUIsRUFBRSxDQUFDOztBQWtRekMsRUFBRSxDQUFDLHVCQUFILEdBQTZCIiwic291cmNlc0NvbnRlbnQiOlsiIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4jXG4jICAgU2NyaXB0OiBDb21wb25lbnRfTW92ZUFuaW1hdGlvblxuI1xuIyAgICQkQ09QWVJJR0hUJCRcbiNcbiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuY2xhc3MgQ29tcG9uZW50X01vdmVBbmltYXRpb24gZXh0ZW5kcyBncy5Db21wb25lbnRfQW5pbWF0aW9uXG4gICAgIyMjKlxuICAgICogRXhlY3V0ZXMgYSBtb3ZlLWFuaW1hdGlvbiBvbiBhIGdhbWUtb2JqZWN0LlxuICAgICpcbiAgICAqIEBtb2R1bGUgZ3NcbiAgICAqIEBjbGFzcyBDb21wb25lbnRfTW92ZUFuaW1hdGlvblxuICAgICogQGV4dGVuZHMgZ3MuQ29tcG9uZW50X0FuaW1hdGlvblxuICAgICogQG1lbWJlcm9mIGdzXG4gICAgKiBAY29uc3RydWN0b3JcbiAgICAjIyNcbiAgICBjb25zdHJ1Y3RvcjogKGRhdGEpIC0+XG4gICAgICAgIHN1cGVyXG4gICAgICAgIFxuICAgICAgICAjIyMqXG4gICAgICAgICogVGhlIGVhc2luZy1vYmplY3QgdXNlZCBmb3IgdGhlIGFuaW1hdGlvbi5cbiAgICAgICAgKiBAcHJvcGVydHkgZWFzaW5nXG4gICAgICAgICogQHR5cGUgZ3MuRWFzaW5nXG4gICAgICAgICMjI1xuICAgICAgICBAZWFzaW5nID0gbmV3IGdzLkVhc2luZyhudWxsLCBkYXRhPy5lYXNpbmcpXG4gICAgICAgIFxuICAgICAgICAjIyMqXG4gICAgICAgICogVGhlIG1vdmUtYW5pbWF0aW9uIHR5cGUgKG1vdmUtaW4sIG1vdmUtb3V0LCBldGMuKS5cbiAgICAgICAgKiBAcHJvcGVydHkgYW5pbWF0aW9uVHlwZVxuICAgICAgICAqIEB0eXBlIGdzLk1vdmVBbmltYXRpb25UeXBlXG4gICAgICAgICMjI1xuICAgICAgICBAYW5pbWF0aW9uVHlwZSA9IGRhdGE/LmFuaW1hdGlvblR5cGUgfHwgMFxuICAgICBcbiAgICAjIyMqXG4gICAgKiBTZXJpYWxpemVzIHRoZSBtb3ZlLWFuaW1hdGlvbiBpbnRvIGEgZGF0YS1idW5kbGUuXG4gICAgKlxuICAgICogQG1ldGhvZCB0b0RhdGFCdW5kbGVcbiAgICAjIyMgICAgICBcbiAgICB0b0RhdGFCdW5kbGU6IC0+XG4gICAgICAgIGVhc2luZzogQGVhc2luZyxcbiAgICAgICAgYW5pbWF0aW9uVHlwZTogQGFuaW1hdGlvblR5cGVcbiAgICAgXG4gICAgIyMjKlxuICAgICogVXBkYXRlcyB0aGUgbW92ZS1hbmltYXRpb24uXG4gICAgKlxuICAgICogQG1ldGhvZCB1cGRhdGVcbiAgICAjIyMgICAgICBcbiAgICB1cGRhdGU6IC0+XG4gICAgICAgIHN1cGVyKClcbiAgICAgICAgaWYgbm90IEBlYXNpbmcuaXNSdW5uaW5nIHRoZW4gcmV0dXJuXG4gICAgICAgIFxuICAgICAgICBAZWFzaW5nLnVwZGF0ZVBvc2l0aW9uKClcbiAgICAgICAgXG4gICAgICAgIEB1cGRhdGVDb29yZGluYXRlcygpXG4gICAgICAgICAgICBcbiAgICAgICAgaWYgbm90IEBlYXNpbmcuaXNSdW5uaW5nXG4gICAgICAgICAgICBpZiBub3QgQGVhc2luZy5pc0VuZGxlc3NcbiAgICAgICAgICAgICAgICBAb2JqZWN0LmRzdFJlY3QueCA9IE1hdGgucm91bmQoQG9iamVjdC5kc3RSZWN0LngpXG4gICAgICAgICAgICAgICAgQG9iamVjdC5kc3RSZWN0LnkgPSBNYXRoLnJvdW5kKEBvYmplY3QuZHN0UmVjdC55KVxuICAgICAgICAgICAgQGNhbGxiYWNrPyhAb2JqZWN0LCB0aGlzKVxuICAgICBcbiAgICAjIyMqXG4gICAgKiBVcGRhdGVzIHRoZSBnYW1lIG9iamVjdCdzIGNvb3JkaW5hdGVzIGRlcGVuZGluZyBvbiBhbmltYXRpb24gdHlwZS5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHVwZGF0ZUNvb3JkaW5hdGVzXG4gICAgKiBAcHJvdGVjdGVkXG4gICAgIyMjICAgICBcbiAgICB1cGRhdGVDb29yZGluYXRlczogLT5cbiAgICAgICAgc3dpdGNoIEBhbmltYXRpb25UeXBlXG4gICAgICAgICAgICB3aGVuIDBcbiAgICAgICAgICAgICAgICBAb2JqZWN0Lm9mZnNldC54ID0gTWF0aC5mbG9vcihAZWFzaW5nLngpXG4gICAgICAgICAgICAgICAgQG9iamVjdC5vZmZzZXQueSA9IE1hdGguZmxvb3IoQGVhc2luZy55KVxuICAgICAgICAgICAgd2hlbiAxXG4gICAgICAgICAgICAgICAgQG9iamVjdC5kc3RSZWN0LnggPSBNYXRoLmZsb29yKEBlYXNpbmcueClcbiAgICAgICAgICAgICAgICBAb2JqZWN0LmRzdFJlY3QueSA9IE1hdGguZmxvb3IoQGVhc2luZy55KVxuICAgICAgICAgICAgd2hlbiAyXG4gICAgICAgICAgICAgICAgQG9iamVjdC52aXN1YWwuc2Nyb2xsLnggPSBNYXRoLnJvdW5kKEBlYXNpbmcueClcbiAgICAgICAgICAgICAgICBAb2JqZWN0LnZpc3VhbC5zY3JvbGwueSA9IE1hdGgucm91bmQoQGVhc2luZy55KVxuICAgICAgICAgICAgICAgIFxuICAgICMjIypcbiAgICAqIFNjcm9sbHMgdGhlIGdhbWUgb2JqZWN0J3MgY29udGVudCB3aXRoIGEgc3BlY2lmaWVkIHNwZWVkIGlmIHN1cHBvcnRlZC5cbiAgICAqXG4gICAgKiBAbWV0aG9kIHNjcm9sbFxuICAgICogQHBhcmFtIHtudW1iZXJ9IHNwZWVkWCBUaGUgc3BlZWQgb24geC1heGlzIGluIHBpeGVscyBwZXIgZnJhbWUuXG4gICAgKiBAcGFyYW0ge251bWJlcn0gc3BlZWRZIFRoZSBzcGVlZCBvbiB5LWF4aXMgaW4gcGl4ZWxzIHBlciBmcmFtZS5cbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gaW4gZnJhbWVzLlxuICAgICogQHBhcmFtIHtPYmplY3R9IGVhc2luZ1R5cGUgVGhlIGVhc2luZy10eXBlIHVzZWQgZm9yIHRoZSBhbmltYXRpb24uXG4gICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbY2FsbGJhY2tdIEFuIG9wdGlvbmFsIGNhbGxiYWNrLWZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBhbmltYXRpb24gaXMgZmluaXNoZWQuXG4gICAgIyMjICBcbiAgICBzY3JvbGw6IChzcGVlZFgsIHNwZWVkWSwgZHVyYXRpb24sIGVhc2luZ1R5cGUsIGNhbGxiYWNrKSAtPlxuICAgICAgICBAbW92ZShzcGVlZFgsIHNwZWVkWSwgZHVyYXRpb24sIGVhc2luZ1R5cGUsIGNhbGxiYWNrKVxuICAgICAgICBAYW5pbWF0aW9uVHlwZSA9IDJcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogU2Nyb2xscyB0aGUgZ2FtZSBvYmplY3QgdG8gYSBzcGVjaWZpZWQgcG9zaXRpb24uXG4gICAgKlxuICAgICogQG1ldGhvZCBzY3JvbGxUb1xuICAgICogQHBhcmFtIHtudW1iZXJ9IHggVGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgcG9zaXRpb24uXG4gICAgKiBAcGFyYW0ge251bWJlcn0geSBUaGUgeS1jb29yZGluYXRlIG9mIHRoZSBwb3NpdGlvbi5cbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBkdXJhdGlvbiBUaGUgZHVyYXRpb24gaW4gZnJhbWVzLlxuICAgICogQHBhcmFtIHtPYmplY3R9IGVhc2luZ1R5cGUgVGhlIGVhc2luZy10eXBlLlxuICAgICogQHBhcmFtIHtmdW5jdGlvbn0gW2NhbGxiYWNrXSBBbiBvcHRpb25hbCBjYWxsYmFjay1mdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGUgYW5pbWF0aW9uIGlzIGZpbmlzaGVkLlxuICAgICMjIyAgICAgIFxuICAgIHNjcm9sbFRvOiAoeCwgeSwgZHVyYXRpb24sIGVhc2luZ1R5cGUsIGNhbGxiYWNrKSAtPlxuICAgICAgICBAYW5pbWF0aW9uVHlwZSA9IDJcbiAgICAgICAgQGNhbGxiYWNrID0gY2FsbGJhY2tcbiAgICAgICAgaWYgQG9iamVjdC52aXN1YWwuc2Nyb2xsLnggPT0geCBhbmQgQG9iamVjdC52aXN1YWwuc2Nyb2xsLnkgPT0geSB0aGVuIHJldHVyblxuICAgICAgICBcbiAgICAgICAgQGVhc2luZy50eXBlID0gZWFzaW5nVHlwZSB8fCBncy5FYXNpbmdzLkVBU0VfTElORUFSW2dzLkVhc2luZ1R5cGVzLkVBU0VfSU5dXG4gICAgICAgIGlmIGR1cmF0aW9uID09IDAgb3IgQGlzSW5zdGFudFNraXAoKVxuICAgICAgICAgICAgQG9iamVjdC52aXN1YWwuc2Nyb2xsLnggPSB4XG4gICAgICAgICAgICBAb2JqZWN0LnZpc3VhbC5zY3JvbGwueSA9IHlcbiAgICAgICAgICAgIEBjYWxsYmFjaz8oQG9iamVjdCwgdGhpcylcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgQGVhc2luZy5zdGFydChAb2JqZWN0LnZpc3VhbC5zY3JvbGwueCwgQG9iamVjdC52aXN1YWwuc2Nyb2xsLnksIHgsIHksIGR1cmF0aW9uKVxuICAgICAgICAgICAgQHRhcmdldFggPSB4XG4gICAgICAgICAgICBAdGFyZ2V0WSA9IHlcbiAgICAgICAgXG4gICAgIyMjKlxuICAgICogTW92ZXMgdGhlIGdhbWUgb2JqZWN0IHdpdGggYSBzcGVjaWZpZWQgc3BlZWQuXG4gICAgKlxuICAgICogQG1ldGhvZCBtb3ZlXG4gICAgKiBAcGFyYW0ge251bWJlcn0gc3BlZWRYIFRoZSBzcGVlZCBvbiB4LWF4aXMgaW4gcGl4ZWxzIHBlciBmcmFtZS5cbiAgICAqIEBwYXJhbSB7bnVtYmVyfSBzcGVlZFkgVGhlIHNwZWVkIG9uIHktYXhpcyBpbiBwaXhlbHMgcGVyIGZyYW1lLlxuICAgICogQHBhcmFtIHtudW1iZXJ9IGR1cmF0aW9uIFRoZSBkdXJhdGlvbiBpbiBmcmFtZXMuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gZWFzaW5nVHlwZSBUaGUgZWFzaW5nLXR5cGUgdXNlZCBmb3IgdGhlIGFuaW1hdGlvbi5cbiAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IFtjYWxsYmFja10gQW4gb3B0aW9uYWwgY2FsbGJhY2stZnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlIGFuaW1hdGlvbiBpcyBmaW5pc2hlZC5cbiAgICAjIyMgICAgICAgIFxuICAgIG1vdmU6IChzcGVlZFgsIHNwZWVkWSwgZHVyYXRpb24sIGVhc2luZ1R5cGUsIGNhbGxiYWNrKSAtPlxuICAgICAgICBAYW5pbWF0aW9uVHlwZSA9IDFcbiAgICAgICAgQHRhcmdldFggPSBkdXJhdGlvbiAqIHNwZWVkWFxuICAgICAgICBAdGFyZ2V0WSA9IGR1cmF0aW9uICogc3BlZWRZXG4gICAgICAgIEBjYWxsYmFjayA9IGNhbGxiYWNrXG4gICAgICAgIFxuICAgICAgICBAZWFzaW5nLnR5cGUgPSBlYXNpbmdUeXBlIHx8IGdzLkVhc2luZ3MuRUFTRV9MSU5FQVJbZ3MuRWFzaW5nVHlwZXMuRUFTRV9JTl1cbiAgICAgICAgaWYgZHVyYXRpb24gPT0gMCBvciBAaXNJbnN0YW50U2tpcCgpXG4gICAgICAgICAgICBAZWFzaW5nLnN0YXJ0RW5kbGVzcyhzcGVlZFgsIHNwZWVkWSlcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgQGVhc2luZy5zdGFydChAb2JqZWN0LmRzdFJlY3QueCwgQG9iamVjdC5kc3RSZWN0LnksIEB0YXJnZXRYLCBAdGFyZ2V0WSwgZHVyYXRpb24pXG4gICAgXG4gICAgIyMjKlxuICAgICogTW92ZXMgdGhlIGdhbWUgb2JqZWN0IHRvIGEgc3BlY2lmaWVkIHBvc2l0aW9uLlxuICAgICpcbiAgICAqIEBtZXRob2QgbW92ZVRvXG4gICAgKiBAcGFyYW0ge251bWJlcn0geCBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBwb3NpdGlvbi5cbiAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IFRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIHBvc2l0aW9uLlxuICAgICogQHBhcmFtIHtudW1iZXJ9IGR1cmF0aW9uIFRoZSBkdXJhdGlvbiBpbiBmcmFtZXMuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gZWFzaW5nVHlwZSBUaGUgZWFzaW5nLXR5cGUuXG4gICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbY2FsbGJhY2tdIEFuIG9wdGlvbmFsIGNhbGxiYWNrLWZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBhbmltYXRpb24gaXMgZmluaXNoZWQuXG4gICAgIyMjICAgICAgXG4gICAgbW92ZVRvOiAoeCwgeSwgZHVyYXRpb24sIGVhc2luZ1R5cGUsIGNhbGxiYWNrKSAtPlxuICAgICAgICBAYW5pbWF0aW9uVHlwZSA9IDFcbiAgICAgICAgQGNhbGxiYWNrID0gY2FsbGJhY2tcbiAgICAgICAgaWYgQG9iamVjdC5kc3RSZWN0LnggPT0geCBhbmQgQG9iamVjdC5kc3RSZWN0LnkgPT0geSB0aGVuIHJldHVyblxuICAgICAgICBcbiAgICAgICAgQGVhc2luZy50eXBlID0gZWFzaW5nVHlwZSB8fCBncy5FYXNpbmdzLkVBU0VfTElORUFSW2dzLkVhc2luZ1R5cGVzLkVBU0VfSU5dXG4gICAgICAgIGlmIGR1cmF0aW9uID09IDAgb3IgQGlzSW5zdGFudFNraXAoKVxuICAgICAgICAgICAgQGVhc2luZy54ID0geFxuICAgICAgICAgICAgQGVhc2luZy55ID0geVxuICAgICAgICAgICAgQHVwZGF0ZUNvb3JkaW5hdGVzKClcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgQGVhc2luZy5zdGFydChAb2JqZWN0LmRzdFJlY3QueCwgQG9iamVjdC5kc3RSZWN0LnksIHgsIHksIGR1cmF0aW9uKVxuICAgICAgICAgICAgQHRhcmdldFggPSB4XG4gICAgICAgICAgICBAdGFyZ2V0WSA9IHlcbiAgICBcbiAgICAjIyMqXG4gICAgKiBMZXRzIGEgZ2FtZSBvYmplY3QgYXBwZWFyIG9uIHNjcmVlbiBmcm9tIGxlZnQsIHRvcCwgcmlnaHQgb3IgYm90dG9tIHVzaW5nIFxuICAgICogYSBtb3ZlLWFuaW1hdGlvblxuICAgICpcbiAgICAqIEBtZXRob2QgbW92ZUluXG4gICAgKiBAcGFyYW0ge251bWJlcn0geCBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSB0YXJnZXQtcG9zaXRpb24uXG4gICAgKiBAcGFyYW0ge251bWJlcn0geSBUaGUgeS1jb29yZGluYXRlIG9mIHRoZSB0YXJnZXQtcG9zaXRpb24uXG4gICAgKiBAcGFyYW0ge251bWJlcn0gdHlwZSBUaGUgbW92ZW1lbnQtZGlyZWN0aW9uIGZyb20gd2hlcmUgdGhlIGdhbWUgb2JqZWN0IHNob3VsZCBtb3ZlLWluLlxuICAgICogQHBhcmFtIHtudW1iZXJ9IGR1cmF0aW9uIFRoZSBkdXJhdGlvbiBpbiBmcmFtZXMuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gZWFzaW5nVHlwZSBUaGUgZWFzaW5nLXR5cGUuXG4gICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbY2FsbGJhY2tdIEFuIG9wdGlvbmFsIGNhbGxiYWNrLWZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBhbmltYXRpb24gaXMgZmluaXNoZWQuIFxuICAgICMjIyAgICAgICAgIFxuICAgIG1vdmVJbjogKHgsIHksIHR5cGUsIGR1cmF0aW9uLCBlYXNpbmcsIGNhbGxiYWNrKSAtPlxuICAgICAgICBAYW5pbWF0aW9uVHlwZSA9IDBcbiAgICAgICAgQG9iamVjdC5vZmZzZXQueCA9IDBcbiAgICAgICAgQG9iamVjdC5vZmZzZXQueSA9IDBcbiAgICAgICAgXG4gICAgICAgIGlmIGR1cmF0aW9uID09IDAgb3IgQGlzSW5zdGFudFNraXAoKVxuICAgICAgICAgICAgQG9iamVjdC51cGRhdGUoKVxuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrPyhAb2JqZWN0LCB0aGlzKVxuICAgICAgICBcbiAgICAgICAgQGVhc2luZy50eXBlID0gZWFzaW5nXG4gICAgICAgIEBjYWxsYmFjayA9IGNhbGxiYWNrXG4gICAgICAgIFxuICAgICAgICByZWN0ID0gaWYgQG9iamVjdC5hbmdsZT8gdGhlbiBAb2JqZWN0LmRzdFJlY3Qucm90YXRlKEBvYmplY3QuYW5nbGUpIGVsc2UgQG9iamVjdC5kc3RSZWN0XG4gICAgICAgIHdpZHRoID0gcmVjdC53aWR0aCAqIEBvYmplY3Quem9vbS54XG4gICAgICAgIGhlaWdodCA9IHJlY3QuaGVpZ2h0ICogQG9iamVjdC56b29tLnlcbiAgICAgICAgeCA9IEBvYmplY3QuZHN0UmVjdC54IC0gKHdpZHRoLXJlY3Qud2lkdGgpICogQG9iamVjdC5hbmNob3IueFxuICAgICAgICB5ID0gQG9iamVjdC5kc3RSZWN0LnkgLSAoaGVpZ2h0LXJlY3QuaGVpZ2h0KSAqIEBvYmplY3QuYW5jaG9yLnlcbiAgICAgICAgXG4gICAgICAgIHN3aXRjaCB0eXBlXG4gICAgICAgICAgICB3aGVuIDAgIyBMZWZ0XG4gICAgICAgICAgICAgICAgQG9iamVjdC5vZmZzZXQueSA9IDBcbiAgICAgICAgICAgICAgICBAb2JqZWN0Lm9mZnNldC54ID0gLSh4K3dpZHRoK0BvYmplY3Qub3JpZ2luLngpXG4gICAgICAgICAgICB3aGVuIDEgIyBUb3BcbiAgICAgICAgICAgICAgICBAb2JqZWN0Lm9mZnNldC55ID0gLSh5K2hlaWdodCtAb2JqZWN0Lm9yaWdpbi55KVxuICAgICAgICAgICAgICAgIEBvYmplY3Qub2Zmc2V0LnggPSAwXG4gICAgICAgICAgICB3aGVuIDIgIyBSaWdodFxuICAgICAgICAgICAgICAgIEBvYmplY3Qub2Zmc2V0LnggPSAoQG9iamVjdC52aWV3cG9ydHx8R3JhcGhpY3Mudmlld3BvcnQpLnJlY3Qud2lkdGggLSB4XG4gICAgICAgICAgICAgICAgQG9iamVjdC5vZmZzZXQueSA9IDBcbiAgICAgICAgICAgIHdoZW4gMyAjIEJvdHRvbVxuICAgICAgICAgICAgICAgIEBvYmplY3Qub2Zmc2V0LnggPSAwXG4gICAgICAgICAgICAgICAgQG9iamVjdC5vZmZzZXQueSA9IChAb2JqZWN0LnZpZXdwb3J0fHxHcmFwaGljcy52aWV3cG9ydCkucmVjdC5oZWlnaHQgLSB5XG5cbiAgICAgICAgQG9iamVjdC51cGRhdGUoKVxuICAgICAgICBAZWFzaW5nLnN0YXJ0KEBvYmplY3Qub2Zmc2V0LngsIEBvYmplY3Qub2Zmc2V0LnksIDAsIDAsIGR1cmF0aW9uKVxuICAgICAgIFxuICAgICMjIypcbiAgICAqIExldHMgYSBnYW1lIG9iamVjdCBkaXNhcHBlYXIgZnJvbSBzY3JlZW4gdG8gdGhlIGxlZnQsIHRvcCwgcmlnaHQgb3IgYm90dG9tIHVzaW5nIFxuICAgICogYSBtb3ZlLWFuaW1hdGlvblxuICAgICpcbiAgICAqIEBtZXRob2QgbW92ZU91dFxuICAgICogQHBhcmFtIHtudW1iZXJ9IHR5cGUgVGhlIG1vdmVtZW50LWRpcmVjdGlvbiBpbiB3aGljaCB0aGUgZ2FtZSBvYmplY3Qgc2hvdWxkIG1vdmUtb3V0LlxuICAgICogQHBhcmFtIHtudW1iZXJ9IGR1cmF0aW9uIFRoZSBkdXJhdGlvbiBpbiBmcmFtZXMuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gZWFzaW5nVHlwZSBUaGUgZWFzaW5nLXR5cGUuXG4gICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBbY2FsbGJhY2tdIEFuIG9wdGlvbmFsIGNhbGxiYWNrLWZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBhbmltYXRpb24gaXMgZmluaXNoZWQuIFxuICAgICMjIyAgICBcbiAgICBtb3ZlT3V0OiAodHlwZSwgZHVyYXRpb24sIGVhc2luZywgY2FsbGJhY2spIC0+XG4gICAgICAgICNpZiBkdXJhdGlvbiA9PSAwIG9yIEBpc0luc3RhbnRTa2lwKClcbiAgICAgICAgIyAgICByZXR1cm4gY2FsbGJhY2s/KEBvYmplY3QsIHRoaXMpXG4gICAgICAgICAgICBcbiAgICAgICAgQGFuaW1hdGlvblR5cGUgPSAwXG4gICAgICAgIEBlYXNpbmcudHlwZSA9IGVhc2luZ1xuICAgICAgICBAY2FsbGJhY2sgPSBjYWxsYmFja1xuICAgICAgICBcbiAgICAgICAgXG4gICAgICAgICAgICBcbiAgICAgICAgeCA9IDBcbiAgICAgICAgeSA9IDBcbiAgICAgICAgdmlld3BvcnQgPSBHcmFwaGljcy52aWV3cG9ydFxuICAgICAgICBcbiAgICAgICAgXG4gICAgICAgIHJlY3QgPSBpZiBAb2JqZWN0LmFuZ2xlPyB0aGVuIEBvYmplY3QuZHN0UmVjdC5yb3RhdGUoQG9iamVjdC5hbmdsZSkgZWxzZSBAb2JqZWN0LmRzdFJlY3RcbiAgICAgICAgd2lkdGggPSByZWN0LndpZHRoICogQG9iamVjdC56b29tLnhcbiAgICAgICAgaGVpZ2h0ID0gcmVjdC5oZWlnaHQgKiBAb2JqZWN0Lnpvb20ueVxuICAgICAgICB4ID0gQG9iamVjdC5kc3RSZWN0LnggLSAod2lkdGgtcmVjdC53aWR0aCkgKiBAb2JqZWN0LmFuY2hvci54XG4gICAgICAgIHkgPSBAb2JqZWN0LmRzdFJlY3QueSAtIChoZWlnaHQtcmVjdC5oZWlnaHQpICogQG9iamVjdC5hbmNob3IueVxuICAgICAgICBcbiAgICAgICAgc3dpdGNoIHR5cGVcbiAgICAgICAgICAgIHdoZW4gMCAjIExlZnRcbiAgICAgICAgICAgICAgICB4ID0gLShAb2JqZWN0Lm9yaWdpbi54K3grd2lkdGgpXG4gICAgICAgICAgICAgICAgeSA9IDBcbiAgICAgICAgICAgIHdoZW4gMSAjIFRvcFxuICAgICAgICAgICAgICAgIHkgPSAtKEBvYmplY3Qub3JpZ2luLnkreStoZWlnaHQpXG4gICAgICAgICAgICAgICAgeCA9IDBcbiAgICAgICAgICAgIHdoZW4gMiAjIFJpZ2h0XG4gICAgICAgICAgICAgICAgeCA9IChAb2JqZWN0LnZpZXdwb3J0fHxHcmFwaGljcy52aWV3cG9ydCkucmVjdC53aWR0aFxuICAgICAgICAgICAgICAgIHkgPSAwIFxuICAgICAgICAgICAgd2hlbiAzICMgQm90dG9tXG4gICAgICAgICAgICAgICAgeSA9IChAb2JqZWN0LnZpZXdwb3J0fHxHcmFwaGljcy52aWV3cG9ydCkucmVjdC5oZWlnaHRcbiAgICAgICAgICAgICAgICB4ID0gMFxuICAgICAgICAgICAgICAgIFxuICAgICAgICBpZiBkdXJhdGlvbiA9PSAwIG9yIEBpc0luc3RhbnRTa2lwKClcbiAgICAgICAgICAgIEBvYmplY3Qub2Zmc2V0LnggPSB4XG4gICAgICAgICAgICBAb2JqZWN0Lm9mZnNldC55ID0geVxuICAgICAgICAgICAgQGNhbGxiYWNrPyhAb2JqZWN0LCB0aGlzKVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBAZWFzaW5nLnN0YXJ0KEBvYmplY3Qub2Zmc2V0LngsIEBvYmplY3Qub2Zmc2V0LnksIHgsIHksIGR1cmF0aW9uKVxuICAgICAgICBcbmdzLkNvbXBvbmVudF9Nb3ZlQW5pbWF0aW9uID0gQ29tcG9uZW50X01vdmVBbmltYXRpb24iXX0=\n//# sourceURL=Component_MoveAnimation_83.js"
    },
    "summary": [
        "name",
        "type",
        "order"
    ]
}

Commits for Nextrek/s2s/data/922103F9K2F40A4605SB7D6E96ACC3F0E72D.json

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