From a4324108afa81caace333e48c49cdceeab9f4b6d Mon Sep 17 00:00:00 2001 From: a-jie Date: Sat, 27 Jan 2018 21:16:43 +0800 Subject: [PATCH] proton update v3.0.5 proton update v3.0.5 --- .babelrc | 6 + .gitignore | 2 + README.md | 31 +- bower.json | 2 +- build/build.js | 83 - build/config | 91 - build/lib/parse-js.js | 1320 --- build/lib/process.js | 1609 --- build/lib/squeeze-more.js | 22 - build/proton.js | 9056 +++++++++-------- build/proton.js.map | 1 + build/proton.min.js | 19 +- build/proton.min.js.map | 1 + example/behaviour/attraction/attraction1.html | 304 +- example/behaviour/attraction/attraction2.html | 338 +- example/behaviour/collision/collision.html | 288 +- .../behaviour/collision/collisionBall.html | 218 +- example/behaviour/color/color.html | 168 +- example/behaviour/custom/circle.html | 373 +- example/behaviour/force/force.html | 308 +- example/behaviour/force/star.html | 247 +- example/behaviour/gravitywell/linebug.html | 355 +- .../behaviour/randomDirft/randomdirft1.html | 180 +- .../behaviour/randomDirft/randomdirft2.html | 14 +- .../behaviour/randomDirft/randomdirft3.html | 167 +- example/behaviour/repulsion/fireflies.html | 300 +- example/behaviour/repulsion/repulsion.html | 232 +- example/behaviour/rotate/rotate.html | 190 +- .../emitter/followEmitter/followEmitter.html | 10 +- example/emitter/followEmitter/mouseDown.html | 174 +- example/game/colliejs/collie.html | 403 +- example/game/colliejs/image/yame_walk2.png | Bin 40034 -> 16392 bytes example/game/crafty/asteroids.html | 2 +- example/game/crafty/images/fighter.png | Bin 20621 -> 5688 bytes example/game/crafty/js/game.js | 466 +- example/game/easeljs/easeljs.html | 461 +- example/game/easeljs/image/ground.png | Bin 14966 -> 2237 bytes .../image/{parallaxHill1.png => hill1.png} | Bin .../image/{parallaxHill2.png => hill2.png} | Bin example/game/easeljs/image/p1.png | Bin 0 -> 119 bytes example/game/easeljs/image/p2.png | Bin 0 -> 132 bytes example/game/easeljs/image/p3.png | Bin 0 -> 139 bytes example/game/easeljs/image/p4.png | Bin 0 -> 145 bytes example/game/easeljs/image/p5.png | Bin 0 -> 123 bytes example/game/easeljs/image/runningGrant.png | Bin 183180 -> 0 bytes .../game/easeljs/image/spritesheet_grant.png | Bin 0 -> 105262 bytes .../easeljs/js/createjs-2013.02.12.min.js | 246 - .../game/easeljs/js/preloadjs-0.3.0.min.js | 60 - example/game/pixijs/assets/Pixie.atlas | 158 + example/game/pixijs/assets/Pixie.json | 924 ++ example/game/pixijs/assets/Pixie.png | Bin 0 -> 30276 bytes example/game/pixijs/assets/iP4_BGtile.jpg | Bin 0 -> 97832 bytes example/game/pixijs/assets/iP4_ground.png | Bin 0 -> 43321 bytes example/game/pixijs/image/gold_anim.json | 66 + example/game/pixijs/image/gold_anim.png | Bin 0 -> 5177 bytes example/game/pixijs/image/rain.png | Bin 0 -> 212 bytes example/game/pixijs/image/smoke.png | Bin 0 -> 2474 bytes example/game/pixijs/pixi-game.html | 273 + example/game/quarkjs/images/body_walk.png | Bin 43265 -> 19114 bytes example/game/quarkjs/images/head_idle.png | Bin 12193 -> 6189 bytes example/game/quarkjs/squirrel.html | 433 +- example/helloworld/emitter/emitter.html | 8 +- example/index.html | 212 + example/initialize/imagetarget/Spitfire.html | 190 +- example/initialize/imagetarget/fire2.html | 242 +- example/initialize/imagetarget/image/pt.jpg | Bin 0 -> 17893 bytes example/initialize/imagetarget/image/rock.png | Bin 0 -> 15270 bytes .../initialize/imagetarget/imagetarget.html | 172 +- example/lib/TweenLite.min.js | 12 + example/lib/color.min.js | 2 + example/lib/config.js | 217 - example/lib/domReady.js | 129 - example/lib/easeljs-0.8.2.min.js | 14 + example/lib/pixi-spine.js | 7183 +++++++++++++ example/lib/pixi.min.js | 22 + example/lib/preloadjs-0.6.2.min.js | 13 + example/lib/profiler.js | 137 + example/lib/require.js | 35 - example/render/custom/custom-renderer.html | 107 + example/render/custom/pixi.js | 5702 ----------- example/render/custom/pixijs.html | 130 - example/render/custom/popup.html | 30 + example/render/dom/canvasVSdom.html | 218 +- example/render/dom/domrender.html | 233 +- example/render/dom/image/8.png | Bin 57472 -> 16275 bytes example/render/dom/image/fox.png | Bin 20094 -> 5694 bytes example/render/dom/jpgmove.html | 186 +- example/render/dom/webglVSdom.html | 229 +- example/render/easeljs/easeljs.html | 174 +- .../easeljs/js/createjs-2013.02.12.min.js | 246 - example/render/pixel/google.html | 379 +- example/render/pixel/pixelrender.html | 362 +- example/render/pixel/thousand.html | 270 +- .../render/{custom => pixi}/image/bunny.png | Bin example/render/pixi/image/eggHead.png | Bin 0 -> 9067 bytes example/render/pixi/image/flowerTop.png | Bin 0 -> 5424 bytes example/render/pixi/image/helmlok.png | Bin 0 -> 6374 bytes .../{custom => pixi}/image/particle.png | Bin example/render/pixi/pixi-mulirender.html | 271 + example/render/pixi/pixirender.html | 125 + example/render/webgl/webglrender.html | 247 +- example/sparks/bigfire/bigfire.html | 165 +- example/sparks/bomb/bomb.html | 232 +- example/sparks/drugs/drugs.html | 221 +- .../sparks/eightDiagrams/eightDiagrams.html | 281 +- example/sparks/firework/bg.jpg | Bin 0 -> 88333 bytes example/sparks/firework/fireworks.html | 20 +- example/sparks/sun/fireball.html | 187 +- example/sparks/sun/sun.html | 251 +- example/zone/circlezone/circlezone.html | 191 +- example/zone/imagezone/imagezone.html | 271 +- example/zone/linezone/bound.html | 38 +- example/zone/pointzone/pointzone.html | 246 +- home.md | 107 - jsdoc.json | 17 - package.json | 21 +- rollup.config.js | 44 + script/makeexamplepage.js | 59 + src/behaviour/Alpha.js | 53 +- src/behaviour/Attraction.js | 56 +- src/behaviour/Behaviour.js | 248 +- src/behaviour/Collision.js | 71 +- src/behaviour/Color.js | 187 +- src/behaviour/CrossZone.js | 114 +- src/behaviour/Force.js | 39 +- src/behaviour/Gravity.js | 25 +- src/behaviour/GravityWell.js | 67 +- src/behaviour/RandomDrift.js | 54 +- src/behaviour/Repulsion.js | 25 +- src/behaviour/Rotate.js | 50 +- src/behaviour/Scale.js | 54 +- src/core/Particle.js | 299 +- src/core/Pool.js | 259 +- src/core/Proton.js | 337 +- src/debug/Debug.js | 135 +- src/debug/Stats.js | 116 + src/emitter/BehaviourEmitter.js | 48 +- src/emitter/Emitter.js | 334 +- src/emitter/FollowEmitter.js | 55 +- src/events/EventDispatcher.js | 93 +- src/index.js | 126 + src/initialize/Body.js | 29 + src/initialize/ImageTarget.js | 33 - src/initialize/Initialize.js | 19 +- src/initialize/InitializeUtil.js | 59 +- src/initialize/Life.js | 24 +- src/initialize/Mass.js | 23 +- src/initialize/Position.js | 30 +- src/initialize/Radius.js | 26 +- src/initialize/Rate.js | 67 +- src/initialize/Velocity.js | 76 +- src/math/ArraySpan.js | 37 + src/math/ColorSpan.js | 21 - src/math/Integration.js | 28 + src/math/Mat3.js | 96 +- src/math/MathUtils.js | 67 +- src/math/NumericalIntegration.js | 27 - src/math/Polar2D.js | 118 +- src/math/Rectangle.js | 24 +- src/math/Span.js | 43 +- src/math/Vector2D.js | 389 +- src/math/ease.js | 124 + src/plus/ease.js | 124 - .../requestAnimationFrame.js | 0 src/render/BaseRender.js | 91 - src/render/BaseRenderer.js | 77 + src/render/CanvasRender.js | 108 - src/render/CanvasRenderer.js | 126 + src/render/CustomRenderer.js | 12 + src/render/DomRender.js | 90 - src/render/DomRenderer.js | 94 + src/render/EaselRender.js | 66 - src/render/EaselRenderer.js | 72 + src/render/PixelRender.js | 67 - src/render/PixelRenderer.js | 65 + src/render/PixiRender.js | 76 - src/render/PixiRenderer.js | 105 + src/render/Renderer.js | 103 - src/render/WebGLRender.js | 244 - src/render/WebGLRenderer.js | 271 + src/utils/CanvasUtil.js | 53 - src/utils/ColorUtil.js | 45 + src/utils/DomUtil.js | 137 +- src/utils/ImgUtil.js | 74 + src/utils/MStack.js | 34 +- src/utils/PUID.js | 34 + src/utils/Util.js | 632 +- src/utils/WebGLUtil.js | 248 +- src/zone/CircleZone.js | 124 +- src/zone/ImageZone.js | 69 +- src/zone/LineZone.js | 130 +- src/zone/PointZone.js | 21 +- src/zone/RectZone.js | 31 +- src/zone/Zone.js | 25 +- 194 files changed, 23995 insertions(+), 23107 deletions(-) create mode 100644 .babelrc delete mode 100644 build/build.js delete mode 100644 build/config delete mode 100644 build/lib/parse-js.js delete mode 100644 build/lib/process.js delete mode 100644 build/lib/squeeze-more.js create mode 100644 build/proton.js.map create mode 100644 build/proton.min.js.map mode change 100644 => 100755 example/game/easeljs/image/ground.png rename example/game/easeljs/image/{parallaxHill1.png => hill1.png} (100%) mode change 100644 => 100755 rename example/game/easeljs/image/{parallaxHill2.png => hill2.png} (100%) mode change 100644 => 100755 create mode 100644 example/game/easeljs/image/p1.png create mode 100644 example/game/easeljs/image/p2.png create mode 100644 example/game/easeljs/image/p3.png create mode 100644 example/game/easeljs/image/p4.png create mode 100644 example/game/easeljs/image/p5.png delete mode 100644 example/game/easeljs/image/runningGrant.png create mode 100644 example/game/easeljs/image/spritesheet_grant.png delete mode 100644 example/game/easeljs/js/createjs-2013.02.12.min.js delete mode 100644 example/game/easeljs/js/preloadjs-0.3.0.min.js create mode 100755 example/game/pixijs/assets/Pixie.atlas create mode 100755 example/game/pixijs/assets/Pixie.json create mode 100644 example/game/pixijs/assets/Pixie.png create mode 100644 example/game/pixijs/assets/iP4_BGtile.jpg create mode 100644 example/game/pixijs/assets/iP4_ground.png create mode 100755 example/game/pixijs/image/gold_anim.json create mode 100755 example/game/pixijs/image/gold_anim.png create mode 100755 example/game/pixijs/image/rain.png create mode 100755 example/game/pixijs/image/smoke.png create mode 100644 example/game/pixijs/pixi-game.html create mode 100644 example/index.html create mode 100644 example/initialize/imagetarget/image/pt.jpg create mode 100644 example/initialize/imagetarget/image/rock.png create mode 100644 example/lib/TweenLite.min.js create mode 100644 example/lib/color.min.js delete mode 100644 example/lib/config.js delete mode 100644 example/lib/domReady.js create mode 100644 example/lib/easeljs-0.8.2.min.js create mode 100755 example/lib/pixi-spine.js create mode 100644 example/lib/pixi.min.js create mode 100644 example/lib/preloadjs-0.6.2.min.js create mode 100644 example/lib/profiler.js delete mode 100644 example/lib/require.js create mode 100644 example/render/custom/custom-renderer.html delete mode 100755 example/render/custom/pixi.js delete mode 100644 example/render/custom/pixijs.html create mode 100644 example/render/custom/popup.html delete mode 100644 example/render/easeljs/js/createjs-2013.02.12.min.js rename example/render/{custom => pixi}/image/bunny.png (100%) create mode 100644 example/render/pixi/image/eggHead.png create mode 100644 example/render/pixi/image/flowerTop.png create mode 100644 example/render/pixi/image/helmlok.png rename example/render/{custom => pixi}/image/particle.png (100%) create mode 100644 example/render/pixi/pixi-mulirender.html create mode 100644 example/render/pixi/pixirender.html create mode 100644 example/sparks/firework/bg.jpg delete mode 100644 home.md delete mode 100644 jsdoc.json create mode 100644 rollup.config.js create mode 100644 script/makeexamplepage.js create mode 100644 src/debug/Stats.js create mode 100644 src/index.js create mode 100644 src/initialize/Body.js delete mode 100644 src/initialize/ImageTarget.js create mode 100644 src/math/ArraySpan.js delete mode 100644 src/math/ColorSpan.js create mode 100644 src/math/Integration.js delete mode 100644 src/math/NumericalIntegration.js create mode 100644 src/math/ease.js delete mode 100644 src/plus/ease.js rename src/{plus => polyfill}/requestAnimationFrame.js (100%) delete mode 100644 src/render/BaseRender.js create mode 100644 src/render/BaseRenderer.js delete mode 100644 src/render/CanvasRender.js create mode 100644 src/render/CanvasRenderer.js create mode 100644 src/render/CustomRenderer.js delete mode 100644 src/render/DomRender.js create mode 100644 src/render/DomRenderer.js delete mode 100644 src/render/EaselRender.js create mode 100644 src/render/EaselRenderer.js delete mode 100644 src/render/PixelRender.js create mode 100644 src/render/PixelRenderer.js delete mode 100644 src/render/PixiRender.js create mode 100644 src/render/PixiRenderer.js delete mode 100644 src/render/Renderer.js delete mode 100644 src/render/WebGLRender.js create mode 100644 src/render/WebGLRenderer.js delete mode 100644 src/utils/CanvasUtil.js create mode 100644 src/utils/ColorUtil.js create mode 100644 src/utils/ImgUtil.js create mode 100644 src/utils/PUID.js diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000..014b1c1 --- /dev/null +++ b/.babelrc @@ -0,0 +1,6 @@ +{ + "presets": [ + "es2015-rollup", + "stage-0" + ] +} \ No newline at end of file diff --git a/.gitignore b/.gitignore index c276c20..fce9b1a 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,5 @@ node_modules # documentation build/docs/ + +package-lock.json diff --git a/README.md b/README.md index aced88c..11d1143 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ Proton > The documentation is available [here](https://projects.jpeer.at/proton/) -Proton is an easily customizable html5 particle engine including six different types of renderers.
+Proton is a lightweight and powerful javascript particle engine including six different types of renderers.
Check out examples at http://a-jie.github.io/Proton/ ## Features @@ -11,8 +11,8 @@ Check out examples at http://a-jie.github.io/Proton/ - canvas - dom - webgl - - easeljs - pixel + - easeljs - pixijs - Create cool effects like the demo of 71squared's ParticleDesigner in 10 lines of code. - Integratable into any game engine @@ -56,33 +56,34 @@ emitter.addBehaviour(new Proton.Alpha(1, 0)); //set emitter position emitter.p.x = canvas.width / 2; emitter.p.y = canvas.height / 2; -emitter.emit(); +emitter.emit(5); //add emitter to the proton proton.addEmitter(emitter); // add canvas renderer -var renderer = new Proton.Renderer('canvas', proton, canvas); -renderer.start(); +var renderer = new Proton.CanvasRenderer(canvas); +proton.addRenderer(renderer); //use Euler integration calculation is more accurate (default false) Proton.USE_CLOCK = false or true; ``` ## Building Proton -Node is a dependency, use terminal to install it with with: -`git clone git://github.com/a-jie/Proton.git` - -Then navigate to the build directory by running: +Node is a dependency, use terminal to install it with: -``` -cd ./build -node build.js +```javascript +git clone git://github.com/a-jie/Proton.git +... +npm install +npm run build ``` -Or use npm script -``` -npm run build +and run example + +```javascript +npm start +//vist http://localhost:3001/example/ ``` ## Changelog diff --git a/bower.json b/bower.json index b2f3f08..8fd0063 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "Proton", - "version": "2.2.1", + "version": "3.0.1", "homepage": "http://a-jie.github.io/Proton", "authors": [ "a-jie " diff --git a/build/build.js b/build/build.js deleted file mode 100644 index a285307..0000000 --- a/build/build.js +++ /dev/null @@ -1,83 +0,0 @@ -var fs = require("fs"), - uglify = { - parser: require("./lib/parse-js.js"), - processor: require("./lib/process.js") - }, - - // Set the config filename - configfile = "config", - - config, version, source_dir, output_full, output_min, head, umd, filenames, foot, i, - ast, minified_source, - - files = [], - numFiles = 0, - - source = ""; - -// Get config file -console.log("Reading config file..."); -config = fs.readFileSync(configfile, "UTF-8"); - -// Get variables from config file -version = /^version = (.*)$/m.exec(config)[1], - source_dir = /^source_dir = (.*)$/m.exec(config)[1], - output_full = /^output_full = (.*)$/m.exec(config)[1].replace("{version}", version), - output_min = /^output_min = (.*)$/m.exec(config)[1].replace("{version}", version), - head = /head\s-----\s([\s\S]*?)-----\s/g.exec(config)[1].replace("{version}", version).replace("{year}", "2011-" + (new Date()).getFullYear()), - umd = /umd\s-----\s([\s\S]*?)-----\s/g.exec(config)[1], - filenames = /files\s-----\s([\s\S]*?)\s-----/g.exec(config)[1].split(/\s/); - -numFiles = filenames.length; - -// Get all the source files -for (i = 0; i < filenames.length; i++) { - console.log("Reading file: " + filenames[i]); - - // Add current file - files.push({ - name: filenames[i], - content: fs.readFileSync(source_dir + filenames[i], "UTF-8") - }); -} - -// Start the building process -console.log("Building source file..."); - -source = head + umd; -for (i = 0; i < numFiles; i++) { - - if (files[i].name === "core/Proton.js") { - files[i].content = files[i].content.replace(/\}(\s|)\)(\s|)\(window(\s|)\);/, ""); - files[i].content = files[i].content.replace(/\(function\(window\,\sundefined\)\s\{/, ""); - files[i].content = files[i].content.replace(/window\.Proton\s\=\sProton\;/, ""); - } else { - files[i].content = files[i].content.replace(/\(function(\s|)\((\s|)Proton,(\s|)undefined(\s|)\)(\s|)\{/, ""); - files[i].content = files[i].content.replace(/\}(\s|)\)(\s|)\((\s|)Proton(\s|)\);/, ""); - } - - // Append the file to the full source - source += "\n" + files[i].content; - - // Append the end of the core wrapper - if (i === numFiles - 1) { - //source += "\n})(window);"; - source += "\n\n return Proton;\n}));"; - } -} -///console.log(umd); -// Save source to output file -fs.writeFile(output_full, source, "UTF-8"); -console.log("Source file saved as: " + output_full); - -// Run UglifyJS to minify the source -console.log("Minifying source with UglifyJS..."); -ast = uglify.parser.parse(source); -ast = uglify.processor.ast_mangle(ast); -ast = uglify.processor.ast_squeeze(ast); -ast = uglify.processor.ast_squeeze_more(ast); -minified_source = uglify.processor.gen_code(ast); - -// Save minified source file -fs.writeFile(output_min, head + minified_source, "UTF-8"); -console.log("Minified source file saved as: " + output_min); \ No newline at end of file diff --git a/build/config b/build/config deleted file mode 100644 index dbbedc7..0000000 --- a/build/config +++ /dev/null @@ -1,91 +0,0 @@ -version = 2.2.1 -source_dir = ../src/ -output_full = proton.js -output_min = proton.min.js - -head ------ -/*! - * Proton v{version} - * https://github.com/a-jie/Proton - * - * Copyright {year}, A-JIE - * Licensed under the MIT license - * http://www.opensource.org/licenses/mit-license - * - */ ------ - -umd ------ -(function (root, factory) { - if (typeof define === 'function' && define.amd) { - define([], factory); - } else if (typeof module !== 'undefined' && module.exports) { - module.exports = factory(); - } else { - root.Proton = factory(); - } -}(this, function () { ------ - -files ------ -core/Proton.js -events/EventDispatcher.js -utils/Util.js -utils/WebGLUtil.js -utils/DomUtil.js -utils/MStack.js -core/Particle.js -core/Pool.js -math/MathUtils.js -math/NumericalIntegration.js -math/Vector2D.js -math/Polar2D.js -math/Span.js -math/ColorSpan.js -math/Rectangle.js -math/Mat3.js -behaviour/Behaviour.js -initialize/Rate.js -initialize/Initialize.js -initialize/InitializeUtil.js -initialize/Life.js -initialize/Position.js -initialize/Velocity.js -initialize/Mass.js -initialize/Radius.js -initialize/ImageTarget.js -behaviour/Force.js -behaviour/Attraction.js -behaviour/RandomDrift.js -behaviour/Repulsion.js -behaviour/Gravity.js -behaviour/Collision.js -behaviour/CrossZone.js -behaviour/Alpha.js -behaviour/Scale.js -behaviour/Rotate.js -behaviour/Color.js -behaviour/GravityWell.js -emitter/Emitter.js -emitter/BehaviourEmitter.js -emitter/FollowEmitter.js -plus/ease.js -render/Renderer.js -render/BaseRender.js -render/DomRender.js -render/EaselRender.js -render/CanvasRender.js -render/PixelRender.js -render/WebGLRender.js -zone/Zone.js -zone/LineZone.js -zone/CircleZone.js -zone/PointZone.js -zone/RectZone.js -zone/ImageZone.js -debug/Debug.js -plus/requestAnimationFrame.js ------ \ No newline at end of file diff --git a/build/lib/parse-js.js b/build/lib/parse-js.js deleted file mode 100644 index d4a04eb..0000000 --- a/build/lib/parse-js.js +++ /dev/null @@ -1,1320 +0,0 @@ -/*********************************************************************** - - A JavaScript tokenizer / parser / beautifier / compressor. - - This version is suitable for Node.js. With minimal changes (the - exports stuff) it should work on any JS platform. - - This file contains the tokenizer/parser. It is a port to JavaScript - of parse-js [1], a JavaScript parser library written in Common Lisp - by Marijn Haverbeke. Thank you Marijn! - - [1] http://marijn.haverbeke.nl/parse-js/ - - Exported functions: - - - tokenizer(code) -- returns a function. Call the returned - function to fetch the next token. - - - parse(code) -- returns an AST of the given JavaScript code. - - -------------------------------- (C) --------------------------------- - - Author: Mihai Bazon - - http://mihai.bazon.net/blog - - Distributed under the BSD license: - - Copyright 2010 (c) Mihai Bazon - Based on parse-js (http://marijn.haverbeke.nl/parse-js/). - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - * Redistributions of source code must retain the above - copyright notice, this list of conditions and the following - disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials - provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR - TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF - THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - SUCH DAMAGE. - - ***********************************************************************/ - -/* -----[ Tokenizer (constants) ]----- */ - -var KEYWORDS = array_to_hash([ - "break", - "case", - "catch", - "const", - "continue", - "default", - "delete", - "do", - "else", - "finally", - "for", - "function", - "if", - "in", - "instanceof", - "new", - "return", - "switch", - "throw", - "try", - "typeof", - "var", - "void", - "while", - "with" -]); - -var RESERVED_WORDS = array_to_hash([ - "abstract", - "boolean", - "byte", - "char", - "class", - "debugger", - "double", - "enum", - "export", - "extends", - "final", - "float", - "goto", - "implements", - "import", - "int", - "interface", - "long", - "native", - "package", - "private", - "protected", - "public", - "short", - "static", - "super", - "synchronized", - "throws", - "transient", - "volatile" -]); - -var KEYWORDS_BEFORE_EXPRESSION = array_to_hash([ - "return", - "new", - "delete", - "throw", - "else", - "case" -]); - -var KEYWORDS_ATOM = array_to_hash([ - "false", - "null", - "true", - "undefined" -]); - -var OPERATOR_CHARS = array_to_hash(characters("+-*&%=<>!?|~^")); - -var RE_HEX_NUMBER = /^0x[0-9a-f]+$/i; -var RE_OCT_NUMBER = /^0[0-7]+$/; -var RE_DEC_NUMBER = /^\d*\.?\d*(?:e[+-]?\d*(?:\d\.?|\.?\d)\d*)?$/i; - -var OPERATORS = array_to_hash([ - "in", - "instanceof", - "typeof", - "new", - "void", - "delete", - "++", - "--", - "+", - "-", - "!", - "~", - "&", - "|", - "^", - "*", - "/", - "%", - ">>", - "<<", - ">>>", - "<", - ">", - "<=", - ">=", - "==", - "===", - "!=", - "!==", - "?", - "=", - "+=", - "-=", - "/=", - "*=", - "%=", - ">>=", - "<<=", - ">>>=", - "%=", - "|=", - "^=", - "&=", - "&&", - "||" -]); - -var WHITESPACE_CHARS = array_to_hash(characters(" \n\r\t\u200b")); - -var PUNC_BEFORE_EXPRESSION = array_to_hash(characters("[{}(,.;:")); - -var PUNC_CHARS = array_to_hash(characters("[]{}(),;:")); - -var REGEXP_MODIFIERS = array_to_hash(characters("gmsiy")); - -/* -----[ Tokenizer ]----- */ - -// regexps adapted from http://xregexp.com/plugins/#unicode -var UNICODE = { - letter: new RegExp("[\\u0041-\\u005A\\u0061-\\u007A\\u00AA\\u00B5\\u00BA\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u0523\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0621-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971\\u0972\\u097B-\\u097F\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C33\\u0C35-\\u0C39\\u0C3D\\u0C58\\u0C59\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D28\\u0D2A-\\u0D39\\u0D3D\\u0D60\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC\\u0EDD\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8B\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10D0-\\u10FA\\u10FC\\u1100-\\u1159\\u115F-\\u11A2\\u11A8-\\u11F9\\u1200-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C\\u166F-\\u1676\\u1681-\\u169A\\u16A0-\\u16EA\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u1900-\\u191C\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19A9\\u19C1-\\u19C7\\u1A00-\\u1A16\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u2094\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2C6F\\u2C71-\\u2C7D\\u2C80-\\u2CE4\\u2D00-\\u2D25\\u2D30-\\u2D65\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31B7\\u31F0-\\u31FF\\u3400\\u4DB5\\u4E00\\u9FC3\\uA000-\\uA48C\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA65F\\uA662-\\uA66E\\uA67F-\\uA697\\uA717-\\uA71F\\uA722-\\uA788\\uA78B\\uA78C\\uA7FB-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA90A-\\uA925\\uA930-\\uA946\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAC00\\uD7A3\\uF900-\\uFA2D\\uFA30-\\uFA6A\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]"), - non_spacing_mark: new RegExp("[\\u0300-\\u036F\\u0483-\\u0487\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065E\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0900-\\u0902\\u093C\\u0941-\\u0948\\u094D\\u0951-\\u0955\\u0962\\u0963\\u0981\\u09BC\\u09C1-\\u09C4\\u09CD\\u09E2\\u09E3\\u0A01\\u0A02\\u0A3C\\u0A41\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81\\u0A82\\u0ABC\\u0AC1-\\u0AC5\\u0AC7\\u0AC8\\u0ACD\\u0AE2\\u0AE3\\u0B01\\u0B3C\\u0B3F\\u0B41-\\u0B44\\u0B4D\\u0B56\\u0B62\\u0B63\\u0B82\\u0BC0\\u0BCD\\u0C3E-\\u0C40\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0CBC\\u0CBF\\u0CC6\\u0CCC\\u0CCD\\u0CE2\\u0CE3\\u0D41-\\u0D44\\u0D4D\\u0D62\\u0D63\\u0DCA\\u0DD2-\\u0DD4\\u0DD6\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F71-\\u0F7E\\u0F80-\\u0F84\\u0F86\\u0F87\\u0F90-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102D-\\u1030\\u1032-\\u1037\\u1039\\u103A\\u103D\\u103E\\u1058\\u1059\\u105E-\\u1060\\u1071-\\u1074\\u1082\\u1085\\u1086\\u108D\\u109D\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B7-\\u17BD\\u17C6\\u17C9-\\u17D3\\u17DD\\u180B-\\u180D\\u18A9\\u1920-\\u1922\\u1927\\u1928\\u1932\\u1939-\\u193B\\u1A17\\u1A18\\u1A56\\u1A58-\\u1A5E\\u1A60\\u1A62\\u1A65-\\u1A6C\\u1A73-\\u1A7C\\u1A7F\\u1B00-\\u1B03\\u1B34\\u1B36-\\u1B3A\\u1B3C\\u1B42\\u1B6B-\\u1B73\\u1B80\\u1B81\\u1BA2-\\u1BA5\\u1BA8\\u1BA9\\u1C2C-\\u1C33\\u1C36\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE0\\u1CE2-\\u1CE8\\u1CED\\u1DC0-\\u1DE6\\u1DFD-\\u1DFF\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2CEF-\\u2CF1\\u2DE0-\\u2DFF\\u302A-\\u302F\\u3099\\u309A\\uA66F\\uA67C\\uA67D\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA825\\uA826\\uA8C4\\uA8E0-\\uA8F1\\uA926-\\uA92D\\uA947-\\uA951\\uA980-\\uA982\\uA9B3\\uA9B6-\\uA9B9\\uA9BC\\uAA29-\\uAA2E\\uAA31\\uAA32\\uAA35\\uAA36\\uAA43\\uAA4C\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uABE5\\uABE8\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE26]"), - space_combining_mark: new RegExp("[\\u0903\\u093E-\\u0940\\u0949-\\u094C\\u094E\\u0982\\u0983\\u09BE-\\u09C0\\u09C7\\u09C8\\u09CB\\u09CC\\u09D7\\u0A03\\u0A3E-\\u0A40\\u0A83\\u0ABE-\\u0AC0\\u0AC9\\u0ACB\\u0ACC\\u0B02\\u0B03\\u0B3E\\u0B40\\u0B47\\u0B48\\u0B4B\\u0B4C\\u0B57\\u0BBE\\u0BBF\\u0BC1\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCC\\u0BD7\\u0C01-\\u0C03\\u0C41-\\u0C44\\u0C82\\u0C83\\u0CBE\\u0CC0-\\u0CC4\\u0CC7\\u0CC8\\u0CCA\\u0CCB\\u0CD5\\u0CD6\\u0D02\\u0D03\\u0D3E-\\u0D40\\u0D46-\\u0D48\\u0D4A-\\u0D4C\\u0D57\\u0D82\\u0D83\\u0DCF-\\u0DD1\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0F3E\\u0F3F\\u0F7F\\u102B\\u102C\\u1031\\u1038\\u103B\\u103C\\u1056\\u1057\\u1062-\\u1064\\u1067-\\u106D\\u1083\\u1084\\u1087-\\u108C\\u108F\\u109A-\\u109C\\u17B6\\u17BE-\\u17C5\\u17C7\\u17C8\\u1923-\\u1926\\u1929-\\u192B\\u1930\\u1931\\u1933-\\u1938\\u19B0-\\u19C0\\u19C8\\u19C9\\u1A19-\\u1A1B\\u1A55\\u1A57\\u1A61\\u1A63\\u1A64\\u1A6D-\\u1A72\\u1B04\\u1B35\\u1B3B\\u1B3D-\\u1B41\\u1B43\\u1B44\\u1B82\\u1BA1\\u1BA6\\u1BA7\\u1BAA\\u1C24-\\u1C2B\\u1C34\\u1C35\\u1CE1\\u1CF2\\uA823\\uA824\\uA827\\uA880\\uA881\\uA8B4-\\uA8C3\\uA952\\uA953\\uA983\\uA9B4\\uA9B5\\uA9BA\\uA9BB\\uA9BD-\\uA9C0\\uAA2F\\uAA30\\uAA33\\uAA34\\uAA4D\\uAA7B\\uABE3\\uABE4\\uABE6\\uABE7\\uABE9\\uABEA\\uABEC]"), - connector_punctuation: new RegExp("[\\u005F\\u203F\\u2040\\u2054\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFF3F]") -}; - -function is_letter(ch) { - return UNICODE.letter.test(ch); -}; - -function is_digit(ch) { - ch = ch.charCodeAt(0); - return ch >= 48 && ch <= 57; //XXX: find out if "UnicodeDigit" means something else than 0..9 -}; - -function is_alphanumeric_char(ch) { - return is_digit(ch) || is_letter(ch); -}; - -function is_unicode_combining_mark(ch) { - return UNICODE.non_spacing_mark.test(ch) || UNICODE.space_combining_mark.test(ch); -}; - -function is_unicode_connector_punctuation(ch) { - return UNICODE.connector_punctuation.test(ch); -}; - -function is_identifier_start(ch) { - return ch == "$" || ch == "_" || is_letter(ch); -}; - -function is_identifier_char(ch) { - return is_identifier_start(ch) - || is_unicode_combining_mark(ch) - || is_digit(ch) - || is_unicode_connector_punctuation(ch) - || ch == "\u200c" // zero-width non-joiner - || ch == "\u200d" // zero-width joiner (in my ECMA-262 PDF, this is also 200c) - ; -}; - -function parse_js_number(num) { - if (RE_HEX_NUMBER.test(num)) { - return parseInt(num.substr(2), 16); - } else if (RE_OCT_NUMBER.test(num)) { - return parseInt(num.substr(1), 8); - } else if (RE_DEC_NUMBER.test(num)) { - return parseFloat(num); - } -}; - -function JS_Parse_Error(message, line, col, pos) { - this.message = message; - this.line = line; - this.col = col; - this.pos = pos; - try { - ({})(); - } catch(ex) { - this.stack = ex.stack; - }; -}; - -JS_Parse_Error.prototype.toString = function() { - return this.message + " (line: " + this.line + ", col: " + this.col + ", pos: " + this.pos + ")" + "\n\n" + this.stack; -}; - -function js_error(message, line, col, pos) { - throw new JS_Parse_Error(message, line, col, pos); -}; - -function is_token(token, type, val) { - return token.type == type && (val == null || token.value == val); -}; - -var EX_EOF = {}; - -function tokenizer($TEXT) { - - var S = { - text : $TEXT.replace(/\r\n?|[\n\u2028\u2029]/g, "\n").replace(/^\uFEFF/, ''), - pos : 0, - tokpos : 0, - line : 0, - tokline : 0, - col : 0, - tokcol : 0, - newline_before : false, - regex_allowed : false, - comments_before : [] - }; - - function peek() { return S.text.charAt(S.pos); }; - - function next(signal_eof) { - var ch = S.text.charAt(S.pos++); - if (signal_eof && !ch) - throw EX_EOF; - if (ch == "\n") { - S.newline_before = true; - ++S.line; - S.col = 0; - } else { - ++S.col; - } - return ch; - }; - - function eof() { - return !S.peek(); - }; - - function find(what, signal_eof) { - var pos = S.text.indexOf(what, S.pos); - if (signal_eof && pos == -1) throw EX_EOF; - return pos; - }; - - function start_token() { - S.tokline = S.line; - S.tokcol = S.col; - S.tokpos = S.pos; - }; - - function token(type, value, is_comment) { - S.regex_allowed = ((type == "operator" && !HOP(UNARY_POSTFIX, value)) || - (type == "keyword" && HOP(KEYWORDS_BEFORE_EXPRESSION, value)) || - (type == "punc" && HOP(PUNC_BEFORE_EXPRESSION, value))); - var ret = { - type : type, - value : value, - line : S.tokline, - col : S.tokcol, - pos : S.tokpos, - nlb : S.newline_before - }; - if (!is_comment) { - ret.comments_before = S.comments_before; - S.comments_before = []; - } - S.newline_before = false; - return ret; - }; - - function skip_whitespace() { - while (HOP(WHITESPACE_CHARS, peek())) - next(); - }; - - function read_while(pred) { - var ret = "", ch = peek(), i = 0; - while (ch && pred(ch, i++)) { - ret += next(); - ch = peek(); - } - return ret; - }; - - function parse_error(err) { - js_error(err, S.tokline, S.tokcol, S.tokpos); - }; - - function read_num(prefix) { - var has_e = false, after_e = false, has_x = false, has_dot = prefix == "."; - var num = read_while(function(ch, i){ - if (ch == "x" || ch == "X") { - if (has_x) return false; - return has_x = true; - } - if (!has_x && (ch == "E" || ch == "e")) { - if (has_e) return false; - return has_e = after_e = true; - } - if (ch == "-") { - if (after_e || (i == 0 && !prefix)) return true; - return false; - } - if (ch == "+") return after_e; - after_e = false; - if (ch == ".") { - if (!has_dot) - return has_dot = true; - return false; - } - return is_alphanumeric_char(ch); - }); - if (prefix) - num = prefix + num; - var valid = parse_js_number(num); - if (!isNaN(valid)) { - return token("num", valid); - } else { - parse_error("Invalid syntax: " + num); - } - }; - - function read_escaped_char() { - var ch = next(true); - switch (ch) { - case "n" : return "\n"; - case "r" : return "\r"; - case "t" : return "\t"; - case "b" : return "\b"; - case "v" : return "\v"; - case "f" : return "\f"; - case "0" : return "\0"; - case "x" : return String.fromCharCode(hex_bytes(2)); - case "u" : return String.fromCharCode(hex_bytes(4)); - default : return ch; - } - }; - - function hex_bytes(n) { - var num = 0; - for (; n > 0; --n) { - var digit = parseInt(next(true), 16); - if (isNaN(digit)) - parse_error("Invalid hex-character pattern in string"); - num = (num << 4) | digit; - } - return num; - }; - - function read_string() { - return with_eof_error("Unterminated string constant", function(){ - var quote = next(), ret = ""; - for (;;) { - var ch = next(true); - if (ch == "\\") ch = read_escaped_char(); - else if (ch == quote) break; - ret += ch; - } - return token("string", ret); - }); - }; - - function read_line_comment() { - next(); - var i = find("\n"), ret; - if (i == -1) { - ret = S.text.substr(S.pos); - S.pos = S.text.length; - } else { - ret = S.text.substring(S.pos, i); - S.pos = i; - } - return token("comment1", ret, true); - }; - - function read_multiline_comment() { - next(); - return with_eof_error("Unterminated multiline comment", function(){ - var i = find("*/", true), - text = S.text.substring(S.pos, i), - tok = token("comment2", text, true); - S.pos = i + 2; - S.line += text.split("\n").length - 1; - S.newline_before = text.indexOf("\n") >= 0; - - // https://github.com/mishoo/UglifyJS/issues/#issue/100 - if (/^@cc_on/i.test(text)) { - warn("WARNING: at line " + S.line); - warn("*** Found \"conditional comment\": " + text); - warn("*** UglifyJS DISCARDS ALL COMMENTS. This means your code might no longer work properly in Internet Explorer."); - } - - return tok; - }); - }; - - function read_name() { - var backslash = false, name = "", ch; - while ((ch = peek()) != null) { - if (!backslash) { - if (ch == "\\") backslash = true, next(); - else if (is_identifier_char(ch)) name += next(); - else break; - } - else { - if (ch != "u") parse_error("Expecting UnicodeEscapeSequence -- uXXXX"); - ch = read_escaped_char(); - if (!is_identifier_char(ch)) parse_error("Unicode char: " + ch.charCodeAt(0) + " is not valid in identifier"); - name += ch; - backslash = false; - } - } - return name; - }; - - function read_regexp() { - return with_eof_error("Unterminated regular expression", function(){ - var prev_backslash = false, regexp = "", ch, in_class = false; - while ((ch = next(true))) if (prev_backslash) { - regexp += "\\" + ch; - prev_backslash = false; - } else if (ch == "[") { - in_class = true; - regexp += ch; - } else if (ch == "]" && in_class) { - in_class = false; - regexp += ch; - } else if (ch == "/" && !in_class) { - break; - } else if (ch == "\\") { - prev_backslash = true; - } else { - regexp += ch; - } - var mods = read_name(); - return token("regexp", [ regexp, mods ]); - }); - }; - - function read_operator(prefix) { - function grow(op) { - if (!peek()) return op; - var bigger = op + peek(); - if (HOP(OPERATORS, bigger)) { - next(); - return grow(bigger); - } else { - return op; - } - }; - return token("operator", grow(prefix || next())); - }; - - function handle_slash() { - next(); - var regex_allowed = S.regex_allowed; - switch (peek()) { - case "/": - S.comments_before.push(read_line_comment()); - S.regex_allowed = regex_allowed; - return next_token(); - case "*": - S.comments_before.push(read_multiline_comment()); - S.regex_allowed = regex_allowed; - return next_token(); - } - return S.regex_allowed ? read_regexp() : read_operator("/"); - }; - - function handle_dot() { - next(); - return is_digit(peek()) - ? read_num(".") - : token("punc", "."); - }; - - function read_word() { - var word = read_name(); - return !HOP(KEYWORDS, word) - ? token("name", word) - : HOP(OPERATORS, word) - ? token("operator", word) - : HOP(KEYWORDS_ATOM, word) - ? token("atom", word) - : token("keyword", word); - }; - - function with_eof_error(eof_error, cont) { - try { - return cont(); - } catch(ex) { - if (ex === EX_EOF) parse_error(eof_error); - else throw ex; - } - }; - - function next_token(force_regexp) { - if (force_regexp) - return read_regexp(); - skip_whitespace(); - start_token(); - var ch = peek(); - if (!ch) return token("eof"); - if (is_digit(ch)) return read_num(); - if (ch == '"' || ch == "'") return read_string(); - if (HOP(PUNC_CHARS, ch)) return token("punc", next()); - if (ch == ".") return handle_dot(); - if (ch == "/") return handle_slash(); - if (HOP(OPERATOR_CHARS, ch)) return read_operator(); - if (ch == "\\" || is_identifier_start(ch)) return read_word(); - parse_error("Unexpected character '" + ch + "'"); - }; - - next_token.context = function(nc) { - if (nc) S = nc; - return S; - }; - - return next_token; - -}; - -/* -----[ Parser (constants) ]----- */ - -var UNARY_PREFIX = array_to_hash([ - "typeof", - "void", - "delete", - "--", - "++", - "!", - "~", - "-", - "+" -]); - -var UNARY_POSTFIX = array_to_hash([ "--", "++" ]); - -var ASSIGNMENT = (function(a, ret, i){ - while (i < a.length) { - ret[a[i]] = a[i].substr(0, a[i].length - 1); - i++; - } - return ret; -})( - ["+=", "-=", "/=", "*=", "%=", ">>=", "<<=", ">>>=", "|=", "^=", "&="], - { "=": true }, - 0 -); - -var PRECEDENCE = (function(a, ret){ - for (var i = 0, n = 1; i < a.length; ++i, ++n) { - var b = a[i]; - for (var j = 0; j < b.length; ++j) { - ret[b[j]] = n; - } - } - return ret; -})( - [ - ["||"], - ["&&"], - ["|"], - ["^"], - ["&"], - ["==", "===", "!=", "!=="], - ["<", ">", "<=", ">=", "in", "instanceof"], - [">>", "<<", ">>>"], - ["+", "-"], - ["*", "/", "%"] - ], - {} -); - -var STATEMENTS_WITH_LABELS = array_to_hash([ "for", "do", "while", "switch" ]); - -var ATOMIC_START_TOKEN = array_to_hash([ "atom", "num", "string", "regexp", "name" ]); - -/* -----[ Parser ]----- */ - -function NodeWithToken(str, start, end) { - this.name = str; - this.start = start; - this.end = end; -}; - -NodeWithToken.prototype.toString = function() { return this.name; }; - -function parse($TEXT, exigent_mode, embed_tokens) { - - var S = { - input : typeof $TEXT == "string" ? tokenizer($TEXT, true) : $TEXT, - token : null, - prev : null, - peeked : null, - in_function : 0, - in_loop : 0, - labels : [] - }; - - S.token = next(); - - function is(type, value) { - return is_token(S.token, type, value); - }; - - function peek() { return S.peeked || (S.peeked = S.input()); }; - - function next() { - S.prev = S.token; - if (S.peeked) { - S.token = S.peeked; - S.peeked = null; - } else { - S.token = S.input(); - } - return S.token; - }; - - function prev() { - return S.prev; - }; - - function croak(msg, line, col, pos) { - var ctx = S.input.context(); - js_error(msg, - line != null ? line : ctx.tokline, - col != null ? col : ctx.tokcol, - pos != null ? pos : ctx.tokpos); - }; - - function token_error(token, msg) { - croak(msg, token.line, token.col); - }; - - function unexpected(token) { - if (token == null) - token = S.token; - token_error(token, "Unexpected token: " + token.type + " (" + token.value + ")"); - }; - - function expect_token(type, val) { - if (is(type, val)) { - return next(); - } - token_error(S.token, "Unexpected token " + S.token.type + ", expected " + type); - }; - - function expect(punc) { return expect_token("punc", punc); }; - - function can_insert_semicolon() { - return !exigent_mode && ( - S.token.nlb || is("eof") || is("punc", "}") - ); - }; - - function semicolon() { - if (is("punc", ";")) next(); - else if (!can_insert_semicolon()) unexpected(); - }; - - function as() { - return slice(arguments); - }; - - function parenthesised() { - expect("("); - var ex = expression(); - expect(")"); - return ex; - }; - - function add_tokens(str, start, end) { - return str instanceof NodeWithToken ? str : new NodeWithToken(str, start, end); - }; - - var statement = embed_tokens ? function() { - var start = S.token; - var ast = $statement.apply(this, arguments); - ast[0] = add_tokens(ast[0], start, prev()); - return ast; - } : $statement; - - function $statement() { - if (is("operator", "/")) { - S.peeked = null; - S.token = S.input(true); // force regexp - } - switch (S.token.type) { - case "num": - case "string": - case "regexp": - case "operator": - case "atom": - return simple_statement(); - - case "name": - return is_token(peek(), "punc", ":") - ? labeled_statement(prog1(S.token.value, next, next)) - : simple_statement(); - - case "punc": - switch (S.token.value) { - case "{": - return as("block", block_()); - case "[": - case "(": - return simple_statement(); - case ";": - next(); - return as("block"); - default: - unexpected(); - } - - case "keyword": - switch (prog1(S.token.value, next)) { - case "break": - return break_cont("break"); - - case "continue": - return break_cont("continue"); - - case "debugger": - semicolon(); - return as("debugger"); - - case "do": - return (function(body){ - expect_token("keyword", "while"); - return as("do", prog1(parenthesised, semicolon), body); - })(in_loop(statement)); - - case "for": - return for_(); - - case "function": - return function_(true); - - case "if": - return if_(); - - case "return": - if (S.in_function == 0) - croak("'return' outside of function"); - return as("return", - is("punc", ";") - ? (next(), null) - : can_insert_semicolon() - ? null - : prog1(expression, semicolon)); - - case "switch": - return as("switch", parenthesised(), switch_block_()); - - case "throw": - return as("throw", prog1(expression, semicolon)); - - case "try": - return try_(); - - case "var": - return prog1(var_, semicolon); - - case "const": - return prog1(const_, semicolon); - - case "while": - return as("while", parenthesised(), in_loop(statement)); - - case "with": - return as("with", parenthesised(), statement()); - - default: - unexpected(); - } - } - }; - - function labeled_statement(label) { - S.labels.push(label); - var start = S.token, stat = statement(); - if (exigent_mode && !HOP(STATEMENTS_WITH_LABELS, stat[0])) - unexpected(start); - S.labels.pop(); - return as("label", label, stat); - }; - - function simple_statement() { - return as("stat", prog1(expression, semicolon)); - }; - - function break_cont(type) { - var name = is("name") ? S.token.value : null; - if (name != null) { - next(); - if (!member(name, S.labels)) - croak("Label " + name + " without matching loop or statement"); - } - else if (S.in_loop == 0) - croak(type + " not inside a loop or switch"); - semicolon(); - return as(type, name); - }; - - function for_() { - expect("("); - var init = null; - if (!is("punc", ";")) { - init = is("keyword", "var") - ? (next(), var_(true)) - : expression(true, true); - if (is("operator", "in")) - return for_in(init); - } - return regular_for(init); - }; - - function regular_for(init) { - expect(";"); - var test = is("punc", ";") ? null : expression(); - expect(";"); - var step = is("punc", ")") ? null : expression(); - expect(")"); - return as("for", init, test, step, in_loop(statement)); - }; - - function for_in(init) { - var lhs = init[0] == "var" ? as("name", init[1][0]) : init; - next(); - var obj = expression(); - expect(")"); - return as("for-in", init, lhs, obj, in_loop(statement)); - }; - - var function_ = embed_tokens ? function() { - var start = prev(); - var ast = $function_.apply(this, arguments); - ast[0] = add_tokens(ast[0], start, prev()); - return ast; - } : $function_; - - function $function_(in_statement) { - var name = is("name") ? prog1(S.token.value, next) : null; - if (in_statement && !name) - unexpected(); - expect("("); - return as(in_statement ? "defun" : "function", - name, - // arguments - (function(first, a){ - while (!is("punc", ")")) { - if (first) first = false; else expect(","); - if (!is("name")) unexpected(); - a.push(S.token.value); - next(); - } - next(); - return a; - })(true, []), - // body - (function(){ - ++S.in_function; - var loop = S.in_loop; - S.in_loop = 0; - var a = block_(); - --S.in_function; - S.in_loop = loop; - return a; - })()); - }; - - function if_() { - var cond = parenthesised(), body = statement(), belse; - if (is("keyword", "else")) { - next(); - belse = statement(); - } - return as("if", cond, body, belse); - }; - - function block_() { - expect("{"); - var a = []; - while (!is("punc", "}")) { - if (is("eof")) unexpected(); - a.push(statement()); - } - next(); - return a; - }; - - var switch_block_ = curry(in_loop, function(){ - expect("{"); - var a = [], cur = null; - while (!is("punc", "}")) { - if (is("eof")) unexpected(); - if (is("keyword", "case")) { - next(); - cur = []; - a.push([ expression(), cur ]); - expect(":"); - } - else if (is("keyword", "default")) { - next(); - expect(":"); - cur = []; - a.push([ null, cur ]); - } - else { - if (!cur) unexpected(); - cur.push(statement()); - } - } - next(); - return a; - }); - - function try_() { - var body = block_(), bcatch, bfinally; - if (is("keyword", "catch")) { - next(); - expect("("); - if (!is("name")) - croak("Name expected"); - var name = S.token.value; - next(); - expect(")"); - bcatch = [ name, block_() ]; - } - if (is("keyword", "finally")) { - next(); - bfinally = block_(); - } - if (!bcatch && !bfinally) - croak("Missing catch/finally blocks"); - return as("try", body, bcatch, bfinally); - }; - - function vardefs(no_in) { - var a = []; - for (;;) { - if (!is("name")) - unexpected(); - var name = S.token.value; - next(); - if (is("operator", "=")) { - next(); - a.push([ name, expression(false, no_in) ]); - } else { - a.push([ name ]); - } - if (!is("punc", ",")) - break; - next(); - } - return a; - }; - - function var_(no_in) { - return as("var", vardefs(no_in)); - }; - - function const_() { - return as("const", vardefs()); - }; - - function new_() { - var newexp = expr_atom(false), args; - if (is("punc", "(")) { - next(); - args = expr_list(")"); - } else { - args = []; - } - return subscripts(as("new", newexp, args), true); - }; - - function expr_atom(allow_calls) { - if (is("operator", "new")) { - next(); - return new_(); - } - if (is("operator") && HOP(UNARY_PREFIX, S.token.value)) { - return make_unary("unary-prefix", - prog1(S.token.value, next), - expr_atom(allow_calls)); - } - if (is("punc")) { - switch (S.token.value) { - case "(": - next(); - return subscripts(prog1(expression, curry(expect, ")")), allow_calls); - case "[": - next(); - return subscripts(array_(), allow_calls); - case "{": - next(); - return subscripts(object_(), allow_calls); - } - unexpected(); - } - if (is("keyword", "function")) { - next(); - return subscripts(function_(false), allow_calls); - } - if (HOP(ATOMIC_START_TOKEN, S.token.type)) { - var atom = S.token.type == "regexp" - ? as("regexp", S.token.value[0], S.token.value[1]) - : as(S.token.type, S.token.value); - return subscripts(prog1(atom, next), allow_calls); - } - unexpected(); - }; - - function expr_list(closing, allow_trailing_comma, allow_empty) { - var first = true, a = []; - while (!is("punc", closing)) { - if (first) first = false; else expect(","); - if (allow_trailing_comma && is("punc", closing)) break; - if (is("punc", ",") && allow_empty) { - a.push([ "atom", "undefined" ]); - } else { - a.push(expression(false)); - } - } - next(); - return a; - }; - - function array_() { - return as("array", expr_list("]", !exigent_mode, true)); - }; - - function object_() { - var first = true, a = []; - while (!is("punc", "}")) { - if (first) first = false; else expect(","); - if (!exigent_mode && is("punc", "}")) - // allow trailing comma - break; - var type = S.token.type; - var name = as_property_name(); - if (type == "name" && (name == "get" || name == "set") && !is("punc", ":")) { - a.push([ as_name(), function_(false), name ]); - } else { - expect(":"); - a.push([ name, expression(false) ]); - } - } - next(); - return as("object", a); - }; - - function as_property_name() { - switch (S.token.type) { - case "num": - case "string": - return prog1(S.token.value, next); - } - return as_name(); - }; - - function as_name() { - switch (S.token.type) { - case "name": - case "operator": - case "keyword": - case "atom": - return prog1(S.token.value, next); - default: - unexpected(); - } - }; - - function subscripts(expr, allow_calls) { - if (is("punc", ".")) { - next(); - return subscripts(as("dot", expr, as_name()), allow_calls); - } - if (is("punc", "[")) { - next(); - return subscripts(as("sub", expr, prog1(expression, curry(expect, "]"))), allow_calls); - } - if (allow_calls && is("punc", "(")) { - next(); - return subscripts(as("call", expr, expr_list(")")), true); - } - if (allow_calls && is("operator") && HOP(UNARY_POSTFIX, S.token.value)) { - return prog1(curry(make_unary, "unary-postfix", S.token.value, expr), - next); - } - return expr; - }; - - function make_unary(tag, op, expr) { - if ((op == "++" || op == "--") && !is_assignable(expr)) - croak("Invalid use of " + op + " operator"); - return as(tag, op, expr); - }; - - function expr_op(left, min_prec, no_in) { - var op = is("operator") ? S.token.value : null; - if (op && op == "in" && no_in) op = null; - var prec = op != null ? PRECEDENCE[op] : null; - if (prec != null && prec > min_prec) { - next(); - var right = expr_op(expr_atom(true), prec, no_in); - return expr_op(as("binary", op, left, right), min_prec, no_in); - } - return left; - }; - - function expr_ops(no_in) { - return expr_op(expr_atom(true), 0, no_in); - }; - - function maybe_conditional(no_in) { - var expr = expr_ops(no_in); - if (is("operator", "?")) { - next(); - var yes = expression(false); - expect(":"); - return as("conditional", expr, yes, expression(false, no_in)); - } - return expr; - }; - - function is_assignable(expr) { - if (!exigent_mode) return true; - switch (expr[0]) { - case "dot": - case "sub": - case "new": - case "call": - return true; - case "name": - return expr[1] != "this"; - } - }; - - function maybe_assign(no_in) { - var left = maybe_conditional(no_in), val = S.token.value; - if (is("operator") && HOP(ASSIGNMENT, val)) { - if (is_assignable(left)) { - next(); - return as("assign", ASSIGNMENT[val], left, maybe_assign(no_in)); - } - croak("Invalid assignment"); - } - return left; - }; - - function expression(commas, no_in) { - if (arguments.length == 0) - commas = true; - var expr = maybe_assign(no_in); - if (commas && is("punc", ",")) { - next(); - return as("seq", expr, expression(true, no_in)); - } - return expr; - }; - - function in_loop(cont) { - try { - ++S.in_loop; - return cont(); - } finally { - --S.in_loop; - } - }; - - return as("toplevel", (function(a){ - while (!is("eof")) - a.push(statement()); - return a; - })([])); - -}; - -/* -----[ Utilities ]----- */ - -function curry(f) { - var args = slice(arguments, 1); - return function() { return f.apply(this, args.concat(slice(arguments))); }; -}; - -function prog1(ret) { - if (ret instanceof Function) - ret = ret(); - for (var i = 1, n = arguments.length; --n > 0; ++i) - arguments[i](); - return ret; -}; - -function array_to_hash(a) { - var ret = {}; - for (var i = 0; i < a.length; ++i) - ret[a[i]] = true; - return ret; -}; - -function slice(a, start) { - return Array.prototype.slice.call(a, start == null ? 0 : start); -}; - -function characters(str) { - return str.split(""); -}; - -function member(name, array) { - for (var i = array.length; --i >= 0;) - if (array[i] === name) - return true; - return false; -}; - -function HOP(obj, prop) { - return Object.prototype.hasOwnProperty.call(obj, prop); -}; - -var warn = function() {}; - -/* -----[ Exports ]----- */ - -exports.tokenizer = tokenizer; -exports.parse = parse; -exports.slice = slice; -exports.curry = curry; -exports.member = member; -exports.array_to_hash = array_to_hash; -exports.PRECEDENCE = PRECEDENCE; -exports.KEYWORDS_ATOM = KEYWORDS_ATOM; -exports.RESERVED_WORDS = RESERVED_WORDS; -exports.KEYWORDS = KEYWORDS; -exports.ATOMIC_START_TOKEN = ATOMIC_START_TOKEN; -exports.OPERATORS = OPERATORS; -exports.is_alphanumeric_char = is_alphanumeric_char; -exports.set_logger = function(logger) { - warn = logger; -}; diff --git a/build/lib/process.js b/build/lib/process.js deleted file mode 100644 index b8e5a8b..0000000 --- a/build/lib/process.js +++ /dev/null @@ -1,1609 +0,0 @@ -/*********************************************************************** - - A JavaScript tokenizer / parser / beautifier / compressor. - - This version is suitable for Node.js. With minimal changes (the - exports stuff) it should work on any JS platform. - - This file implements some AST processors. They work on data built - by parse-js. - - Exported functions: - - - ast_mangle(ast, options) -- mangles the variable/function names - in the AST. Returns an AST. - - - ast_squeeze(ast) -- employs various optimizations to make the - final generated code even smaller. Returns an AST. - - - gen_code(ast, options) -- generates JS code from the AST. Pass - true (or an object, see the code for some options) as second - argument to get "pretty" (indented) code. - - -------------------------------- (C) --------------------------------- - - Author: Mihai Bazon - - http://mihai.bazon.net/blog - - Distributed under the BSD license: - - Copyright 2010 (c) Mihai Bazon - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - - * Redistributions of source code must retain the above - copyright notice, this list of conditions and the following - disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials - provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR - TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF - THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - SUCH DAMAGE. - - ***********************************************************************/ - -var jsp = require("./parse-js"), - slice = jsp.slice, - member = jsp.member, - PRECEDENCE = jsp.PRECEDENCE, - OPERATORS = jsp.OPERATORS; - -/* -----[ helper for AST traversal ]----- */ - -function ast_walker(ast) { - function _vardefs(defs) { - return [ this[0], MAP(defs, function(def){ - var a = [ def[0] ]; - if (def.length > 1) - a[1] = walk(def[1]); - return a; - }) ]; - }; - var walkers = { - "string": function(str) { - return [ this[0], str ]; - }, - "num": function(num) { - return [ this[0], num ]; - }, - "name": function(name) { - return [ this[0], name ]; - }, - "toplevel": function(statements) { - return [ this[0], MAP(statements, walk) ]; - }, - "block": function(statements) { - var out = [ this[0] ]; - if (statements != null) - out.push(MAP(statements, walk)); - return out; - }, - "var": _vardefs, - "const": _vardefs, - "try": function(t, c, f) { - return [ - this[0], - MAP(t, walk), - c != null ? [ c[0], MAP(c[1], walk) ] : null, - f != null ? MAP(f, walk) : null - ]; - }, - "throw": function(expr) { - return [ this[0], walk(expr) ]; - }, - "new": function(ctor, args) { - return [ this[0], walk(ctor), MAP(args, walk) ]; - }, - "switch": function(expr, body) { - return [ this[0], walk(expr), MAP(body, function(branch){ - return [ branch[0] ? walk(branch[0]) : null, - MAP(branch[1], walk) ]; - }) ]; - }, - "break": function(label) { - return [ this[0], label ]; - }, - "continue": function(label) { - return [ this[0], label ]; - }, - "conditional": function(cond, t, e) { - return [ this[0], walk(cond), walk(t), walk(e) ]; - }, - "assign": function(op, lvalue, rvalue) { - return [ this[0], op, walk(lvalue), walk(rvalue) ]; - }, - "dot": function(expr) { - return [ this[0], walk(expr) ].concat(slice(arguments, 1)); - }, - "call": function(expr, args) { - return [ this[0], walk(expr), MAP(args, walk) ]; - }, - "function": function(name, args, body) { - return [ this[0], name, args.slice(), MAP(body, walk) ]; - }, - "defun": function(name, args, body) { - return [ this[0], name, args.slice(), MAP(body, walk) ]; - }, - "if": function(conditional, t, e) { - return [ this[0], walk(conditional), walk(t), walk(e) ]; - }, - "for": function(init, cond, step, block) { - return [ this[0], walk(init), walk(cond), walk(step), walk(block) ]; - }, - "for-in": function(vvar, key, hash, block) { - return [ this[0], walk(vvar), walk(key), walk(hash), walk(block) ]; - }, - "while": function(cond, block) { - return [ this[0], walk(cond), walk(block) ]; - }, - "do": function(cond, block) { - return [ this[0], walk(cond), walk(block) ]; - }, - "return": function(expr) { - return [ this[0], walk(expr) ]; - }, - "binary": function(op, left, right) { - return [ this[0], op, walk(left), walk(right) ]; - }, - "unary-prefix": function(op, expr) { - return [ this[0], op, walk(expr) ]; - }, - "unary-postfix": function(op, expr) { - return [ this[0], op, walk(expr) ]; - }, - "sub": function(expr, subscript) { - return [ this[0], walk(expr), walk(subscript) ]; - }, - "object": function(props) { - return [ this[0], MAP(props, function(p){ - return p.length == 2 - ? [ p[0], walk(p[1]) ] - : [ p[0], walk(p[1]), p[2] ]; // get/set-ter - }) ]; - }, - "regexp": function(rx, mods) { - return [ this[0], rx, mods ]; - }, - "array": function(elements) { - return [ this[0], MAP(elements, walk) ]; - }, - "stat": function(stat) { - return [ this[0], walk(stat) ]; - }, - "seq": function() { - return [ this[0] ].concat(MAP(slice(arguments), walk)); - }, - "label": function(name, block) { - return [ this[0], name, walk(block) ]; - }, - "with": function(expr, block) { - return [ this[0], walk(expr), walk(block) ]; - }, - "atom": function(name) { - return [ this[0], name ]; - } - }; - - var user = {}; - var stack = []; - function walk(ast) { - if (ast == null) - return null; - try { - stack.push(ast); - var type = ast[0]; - var gen = user[type]; - if (gen) { - var ret = gen.apply(ast, ast.slice(1)); - if (ret != null) - return ret; - } - gen = walkers[type]; - return gen.apply(ast, ast.slice(1)); - } finally { - stack.pop(); - } - }; - - function with_walkers(walkers, cont){ - var save = {}, i; - for (i in walkers) if (HOP(walkers, i)) { - save[i] = user[i]; - user[i] = walkers[i]; - } - var ret = cont(); - for (i in save) if (HOP(save, i)) { - if (!save[i]) delete user[i]; - else user[i] = save[i]; - } - return ret; - }; - - return { - walk: walk, - with_walkers: with_walkers, - parent: function() { - return stack[stack.length - 2]; // last one is current node - }, - stack: function() { - return stack; - } - }; -}; - -/* -----[ Scope and mangling ]----- */ - -function Scope(parent) { - this.names = {}; // names defined in this scope - this.mangled = {}; // mangled names (orig.name => mangled) - this.rev_mangled = {}; // reverse lookup (mangled => orig.name) - this.cname = -1; // current mangled name - this.refs = {}; // names referenced from this scope - this.uses_with = false; // will become TRUE if eval() is detected in this or any subscopes - this.uses_eval = false; // will become TRUE if with() is detected in this or any subscopes - this.parent = parent; // parent scope - this.children = []; // sub-scopes - if (parent) { - this.level = parent.level + 1; - parent.children.push(this); - } else { - this.level = 0; - } -}; - -var base54 = (function(){ - var DIGITS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_"; - return function(num) { - var ret = ""; - do { - ret = DIGITS.charAt(num % 54) + ret; - num = Math.floor(num / 54); - } while (num > 0); - return ret; - }; -})(); - -Scope.prototype = { - has: function(name) { - for (var s = this; s; s = s.parent) - if (HOP(s.names, name)) - return s; - }, - has_mangled: function(mname) { - for (var s = this; s; s = s.parent) - if (HOP(s.rev_mangled, mname)) - return s; - }, - toJSON: function() { - return { - names: this.names, - uses_eval: this.uses_eval, - uses_with: this.uses_with - }; - }, - - next_mangled: function() { - // we must be careful that the new mangled name: - // - // 1. doesn't shadow a mangled name from a parent - // scope, unless we don't reference the original - // name from this scope OR from any sub-scopes! - // This will get slow. - // - // 2. doesn't shadow an original name from a parent - // scope, in the event that the name is not mangled - // in the parent scope and we reference that name - // here OR IN ANY SUBSCOPES! - // - // 3. doesn't shadow a name that is referenced but not - // defined (possibly global defined elsewhere). - for (;;) { - var m = base54(++this.cname), prior; - - // case 1. - prior = this.has_mangled(m); - if (prior && this.refs[prior.rev_mangled[m]] === prior) - continue; - - // case 2. - prior = this.has(m); - if (prior && prior !== this && this.refs[m] === prior && !prior.has_mangled(m)) - continue; - - // case 3. - if (HOP(this.refs, m) && this.refs[m] == null) - continue; - - // I got "do" once. :-/ - if (!is_identifier(m)) - continue; - - return m; - } - }, - get_mangled: function(name, newMangle) { - if (this.uses_eval || this.uses_with) return name; // no mangle if eval or with is in use - var s = this.has(name); - if (!s) return name; // not in visible scope, no mangle - if (HOP(s.mangled, name)) return s.mangled[name]; // already mangled in this scope - if (!newMangle) return name; // not found and no mangling requested - - var m = s.next_mangled(); - s.rev_mangled[m] = name; - return s.mangled[name] = m; - }, - define: function(name) { - if (name != null) - return this.names[name] = name; - } -}; - -function ast_add_scope(ast) { - - var current_scope = null; - var w = ast_walker(), walk = w.walk; - var having_eval = []; - - function with_new_scope(cont) { - current_scope = new Scope(current_scope); - var ret = current_scope.body = cont(); - ret.scope = current_scope; - current_scope = current_scope.parent; - return ret; - }; - - function define(name) { - return current_scope.define(name); - }; - - function reference(name) { - current_scope.refs[name] = true; - }; - - function _lambda(name, args, body) { - return [ this[0], define(name), args, with_new_scope(function(){ - MAP(args, define); - return MAP(body, walk); - })]; - }; - - return with_new_scope(function(){ - // process AST - var ret = w.with_walkers({ - "function": _lambda, - "defun": _lambda, - "with": function(expr, block) { - for (var s = current_scope; s; s = s.parent) - s.uses_with = true; - }, - "var": function(defs) { - MAP(defs, function(d){ define(d[0]) }); - }, - "const": function(defs) { - MAP(defs, function(d){ define(d[0]) }); - }, - "try": function(t, c, f) { - if (c != null) return [ - this[0], - MAP(t, walk), - [ define(c[0]), MAP(c[1], walk) ], - f != null ? MAP(f, walk) : null - ]; - }, - "name": function(name) { - if (name == "eval") - having_eval.push(current_scope); - reference(name); - } - }, function(){ - return walk(ast); - }); - - // the reason why we need an additional pass here is - // that names can be used prior to their definition. - - // scopes where eval was detected and their parents - // are marked with uses_eval, unless they define the - // "eval" name. - MAP(having_eval, function(scope){ - if (!scope.has("eval")) while (scope) { - scope.uses_eval = true; - scope = scope.parent; - } - }); - - // for referenced names it might be useful to know - // their origin scope. current_scope here is the - // toplevel one. - function fixrefs(scope, i) { - // do children first; order shouldn't matter - for (i = scope.children.length; --i >= 0;) - fixrefs(scope.children[i]); - for (i in scope.refs) if (HOP(scope.refs, i)) { - // find origin scope and propagate the reference to origin - for (var origin = scope.has(i), s = scope; s; s = s.parent) { - s.refs[i] = origin; - if (s === origin) break; - } - } - }; - fixrefs(current_scope); - - return ret; - }); - -}; - -/* -----[ mangle names ]----- */ - -function ast_mangle(ast, options) { - var w = ast_walker(), walk = w.walk, scope; - options = options || {}; - - function get_mangled(name, newMangle) { - if (!options.toplevel && !scope.parent) return name; // don't mangle toplevel - if (options.except && member(name, options.except)) - return name; - return scope.get_mangled(name, newMangle); - }; - - function _lambda(name, args, body) { - if (name) name = get_mangled(name); - body = with_scope(body.scope, function(){ - args = MAP(args, function(name){ return get_mangled(name) }); - return MAP(body, walk); - }); - return [ this[0], name, args, body ]; - }; - - function with_scope(s, cont) { - var _scope = scope; - scope = s; - for (var i in s.names) if (HOP(s.names, i)) { - get_mangled(i, true); - } - var ret = cont(); - ret.scope = s; - scope = _scope; - return ret; - }; - - function _vardefs(defs) { - return [ this[0], MAP(defs, function(d){ - return [ get_mangled(d[0]), walk(d[1]) ]; - }) ]; - }; - - return w.with_walkers({ - "function": _lambda, - "defun": function() { - // move function declarations to the top when - // they are not in some block. - var ast = _lambda.apply(this, arguments); - switch (w.parent()[0]) { - case "toplevel": - case "function": - case "defun": - return MAP.at_top(ast); - } - return ast; - }, - "var": _vardefs, - "const": _vardefs, - "name": function(name) { - return [ this[0], get_mangled(name) ]; - }, - "try": function(t, c, f) { - return [ this[0], - MAP(t, walk), - c != null ? [ get_mangled(c[0]), MAP(c[1], walk) ] : null, - f != null ? MAP(f, walk) : null ]; - }, - "toplevel": function(body) { - var self = this; - return with_scope(self.scope, function(){ - return [ self[0], MAP(body, walk) ]; - }); - } - }, function() { - return walk(ast_add_scope(ast)); - }); -}; - -/* -----[ - - compress foo["bar"] into foo.bar, - - remove block brackets {} where possible - - join consecutive var declarations - - various optimizations for IFs: - - if (cond) foo(); else bar(); ==> cond?foo():bar(); - - if (cond) foo(); ==> cond&&foo(); - - if (foo) return bar(); else return baz(); ==> return foo?bar():baz(); // also for throw - - if (foo) return bar(); else something(); ==> {if(foo)return bar();something()} - ]----- */ - -var warn = function(){}; - -function best_of(ast1, ast2) { - return gen_code(ast1).length > gen_code(ast2[0] == "stat" ? ast2[1] : ast2).length ? ast2 : ast1; -}; - -function last_stat(b) { - if (b[0] == "block" && b[1] && b[1].length > 0) - return b[1][b[1].length - 1]; - return b; -} - -function aborts(t) { - if (t) { - t = last_stat(t); - if (t[0] == "return" || t[0] == "break" || t[0] == "continue" || t[0] == "throw") - return true; - } -}; - -function boolean_expr(expr) { - return ( (expr[0] == "unary-prefix" - && member(expr[1], [ "!", "delete" ])) || - - (expr[0] == "binary" - && member(expr[1], [ "in", "instanceof", "==", "!=", "===", "!==", "<", "<=", ">=", ">" ])) || - - (expr[0] == "binary" - && member(expr[1], [ "&&", "||" ]) - && boolean_expr(expr[2]) - && boolean_expr(expr[3])) || - - (expr[0] == "conditional" - && boolean_expr(expr[2]) - && boolean_expr(expr[3])) || - - (expr[0] == "assign" - && expr[1] === true - && boolean_expr(expr[3])) || - - (expr[0] == "seq" - && boolean_expr(expr[expr.length - 1])) - ); -}; - -function make_conditional(c, t, e) { - if (c[0] == "unary-prefix" && c[1] == "!") { - return e ? [ "conditional", c[2], e, t ] : [ "binary", "||", c[2], t ]; - } else { - return e ? [ "conditional", c, t, e ] : [ "binary", "&&", c, t ]; - } -}; - -function empty(b) { - return !b || (b[0] == "block" && (!b[1] || b[1].length == 0)); -}; - -function is_string(node) { - return (node[0] == "string" || - node[0] == "unary-prefix" && node[1] == "typeof" || - node[0] == "binary" && node[1] == "+" && - (is_string(node[2]) || is_string(node[3]))); -}; - -var when_constant = (function(){ - - var $NOT_CONSTANT = {}; - - // this can only evaluate constant expressions. If it finds anything - // not constant, it throws $NOT_CONSTANT. - function evaluate(expr) { - switch (expr[0]) { - case "string": - case "num": - return expr[1]; - case "name": - case "atom": - switch (expr[1]) { - case "true": return true; - case "false": return false; - } - break; - case "unary-prefix": - switch (expr[1]) { - case "!": return !evaluate(expr[2]); - case "typeof": return typeof evaluate(expr[2]); - case "~": return ~evaluate(expr[2]); - case "-": return -evaluate(expr[2]); - case "+": return +evaluate(expr[2]); - } - break; - case "binary": - var left = expr[2], right = expr[3]; - switch (expr[1]) { - case "&&" : return evaluate(left) && evaluate(right); - case "||" : return evaluate(left) || evaluate(right); - case "|" : return evaluate(left) | evaluate(right); - case "&" : return evaluate(left) & evaluate(right); - case "^" : return evaluate(left) ^ evaluate(right); - case "+" : return evaluate(left) + evaluate(right); - case "*" : return evaluate(left) * evaluate(right); - case "/" : return evaluate(left) / evaluate(right); - case "-" : return evaluate(left) - evaluate(right); - case "<<" : return evaluate(left) << evaluate(right); - case ">>" : return evaluate(left) >> evaluate(right); - case ">>>" : return evaluate(left) >>> evaluate(right); - case "==" : return evaluate(left) == evaluate(right); - case "===" : return evaluate(left) === evaluate(right); - case "!=" : return evaluate(left) != evaluate(right); - case "!==" : return evaluate(left) !== evaluate(right); - case "<" : return evaluate(left) < evaluate(right); - case "<=" : return evaluate(left) <= evaluate(right); - case ">" : return evaluate(left) > evaluate(right); - case ">=" : return evaluate(left) >= evaluate(right); - case "in" : return evaluate(left) in evaluate(right); - case "instanceof" : return evaluate(left) instanceof evaluate(right); - } - } - throw $NOT_CONSTANT; - }; - - return function(expr, yes, no) { - try { - var val = evaluate(expr), ast; - switch (typeof val) { - case "string": ast = [ "string", val ]; break; - case "number": ast = [ "num", val ]; break; - case "boolean": ast = [ "name", String(val) ]; break; - default: throw new Error("Can't handle constant of type: " + (typeof val)); - } - return yes.call(expr, ast, val); - } catch(ex) { - if (ex === $NOT_CONSTANT) { - if (expr[0] == "binary" - && (expr[1] == "===" || expr[1] == "!==") - && ((is_string(expr[2]) && is_string(expr[3])) - || (boolean_expr(expr[2]) && boolean_expr(expr[3])))) { - expr[1] = expr[1].substr(0, 2); - } - return no ? no.call(expr, expr) : null; - } - else throw ex; - } - }; - -})(); - -function warn_unreachable(ast) { - if (!empty(ast)) - warn("Dropping unreachable code: " + gen_code(ast, true)); -}; - -function ast_squeeze(ast, options) { - options = defaults(options, { - make_seqs : true, - dead_code : true, - keep_comps : true, - no_warnings : false - }); - - var w = ast_walker(), walk = w.walk, scope; - - function negate(c) { - var not_c = [ "unary-prefix", "!", c ]; - switch (c[0]) { - case "unary-prefix": - return c[1] == "!" && boolean_expr(c[2]) ? c[2] : not_c; - case "seq": - c = slice(c); - c[c.length - 1] = negate(c[c.length - 1]); - return c; - case "conditional": - return best_of(not_c, [ "conditional", c[1], negate(c[2]), negate(c[3]) ]); - case "binary": - var op = c[1], left = c[2], right = c[3]; - if (!options.keep_comps) switch (op) { - case "<=" : return [ "binary", ">", left, right ]; - case "<" : return [ "binary", ">=", left, right ]; - case ">=" : return [ "binary", "<", left, right ]; - case ">" : return [ "binary", "<=", left, right ]; - } - switch (op) { - case "==" : return [ "binary", "!=", left, right ]; - case "!=" : return [ "binary", "==", left, right ]; - case "===" : return [ "binary", "!==", left, right ]; - case "!==" : return [ "binary", "===", left, right ]; - case "&&" : return best_of(not_c, [ "binary", "||", negate(left), negate(right) ]); - case "||" : return best_of(not_c, [ "binary", "&&", negate(left), negate(right) ]); - } - break; - } - return not_c; - }; - - function with_scope(s, cont) { - var _scope = scope; - scope = s; - var ret = cont(); - ret.scope = s; - scope = _scope; - return ret; - }; - - function rmblock(block) { - if (block != null && block[0] == "block" && block[1]) { - if (block[1].length == 1) - block = block[1][0]; - else if (block[1].length == 0) - block = [ "block" ]; - } - return block; - }; - - function _lambda(name, args, body) { - return [ this[0], name, args, with_scope(body.scope, function(){ - return tighten(MAP(body, walk), "lambda"); - }) ]; - }; - - // we get here for blocks that have been already transformed. - // this function does a few things: - // 1. discard useless blocks - // 2. join consecutive var declarations - // 3. remove obviously dead code - // 4. transform consecutive statements using the comma operator - // 5. if block_type == "lambda" and it detects constructs like if(foo) return ... - rewrite like if (!foo) { ... } - function tighten(statements, block_type) { - statements = statements.reduce(function(a, stat){ - if (stat[0] == "block") { - if (stat[1]) { - a.push.apply(a, stat[1]); - } - } else { - a.push(stat); - } - return a; - }, []); - - statements = (function(a, prev){ - statements.forEach(function(cur){ - if (prev && ((cur[0] == "var" && prev[0] == "var") || - (cur[0] == "const" && prev[0] == "const"))) { - prev[1] = prev[1].concat(cur[1]); - } else { - a.push(cur); - prev = cur; - } - }); - return a; - })([]); - - if (options.dead_code) statements = (function(a, has_quit){ - statements.forEach(function(st){ - if (has_quit) { - if (member(st[0], [ "function", "defun" , "var", "const" ])) { - a.push(st); - } - else if (!options.no_warnings) - warn_unreachable(st); - } - else { - a.push(st); - if (member(st[0], [ "return", "throw", "break", "continue" ])) - has_quit = true; - } - }); - return a; - })([]); - - if (options.make_seqs) statements = (function(a, prev) { - statements.forEach(function(cur){ - if (prev && prev[0] == "stat" && cur[0] == "stat") { - prev[1] = [ "seq", prev[1], cur[1] ]; - } else { - a.push(cur); - prev = cur; - } - }); - return a; - })([]); - - if (block_type == "lambda") statements = (function(i, a, stat){ - while (i < statements.length) { - stat = statements[i++]; - if (stat[0] == "if" && !stat[3]) { - if (stat[2][0] == "return" && stat[2][1] == null) { - a.push(make_if(negate(stat[1]), [ "block", statements.slice(i) ])); - break; - } - var last = last_stat(stat[2]); - if (last[0] == "return" && last[1] == null) { - a.push(make_if(stat[1], [ "block", stat[2][1].slice(0, -1) ], [ "block", statements.slice(i) ])); - break; - } - } - a.push(stat); - } - return a; - })(0, []); - - return statements; - }; - - function make_if(c, t, e) { - return when_constant(c, function(ast, val){ - if (val) { - warn_unreachable(e); - return t; - } else { - warn_unreachable(t); - return e; - } - }, function() { - return make_real_if(c, t, e); - }); - }; - - function make_real_if(c, t, e) { - c = walk(c); - t = walk(t); - e = walk(e); - - if (empty(t)) { - c = negate(c); - t = e; - e = null; - } else if (empty(e)) { - e = null; - } else { - // if we have both else and then, maybe it makes sense to switch them? - (function(){ - var a = gen_code(c); - var n = negate(c); - var b = gen_code(n); - if (b.length < a.length) { - var tmp = t; - t = e; - e = tmp; - c = n; - } - })(); - } - if (empty(e) && empty(t)) - return [ "stat", c ]; - var ret = [ "if", c, t, e ]; - if (t[0] == "if" && empty(t[3]) && empty(e)) { - ret = best_of(ret, walk([ "if", [ "binary", "&&", c, t[1] ], t[2] ])); - } - else if (t[0] == "stat") { - if (e) { - if (e[0] == "stat") { - ret = best_of(ret, [ "stat", make_conditional(c, t[1], e[1]) ]); - } - } - else { - ret = best_of(ret, [ "stat", make_conditional(c, t[1]) ]); - } - } - else if (e && t[0] == e[0] && (t[0] == "return" || t[0] == "throw") && t[1] && e[1]) { - ret = best_of(ret, [ t[0], make_conditional(c, t[1], e[1] ) ]); - } - else if (e && aborts(t)) { - ret = [ [ "if", c, t ] ]; - if (e[0] == "block") { - if (e[1]) ret = ret.concat(e[1]); - } - else { - ret.push(e); - } - ret = walk([ "block", ret ]); - } - else if (t && aborts(e)) { - ret = [ [ "if", negate(c), e ] ]; - if (t[0] == "block") { - if (t[1]) ret = ret.concat(t[1]); - } else { - ret.push(t); - } - ret = walk([ "block", ret ]); - } - return ret; - }; - - function _do_while(cond, body) { - return when_constant(cond, function(cond, val){ - if (!val) { - warn_unreachable(body); - return [ "block" ]; - } else { - return [ "for", null, null, null, walk(body) ]; - } - }); - }; - - return w.with_walkers({ - "sub": function(expr, subscript) { - if (subscript[0] == "string") { - var name = subscript[1]; - if (is_identifier(name)) { - return [ "dot", walk(expr), name ]; - } - } - }, - "if": make_if, - "toplevel": function(body) { - return [ "toplevel", with_scope(this.scope, function(){ - return tighten(MAP(body, walk)); - }) ]; - }, - "switch": function(expr, body) { - var last = body.length - 1; - return [ "switch", walk(expr), MAP(body, function(branch, i){ - var block = tighten(MAP(branch[1], walk)); - if (i == last && block.length > 0) { - var node = block[block.length - 1]; - if (node[0] == "break" && !node[1]) - block.pop(); - } - return [ branch[0] ? walk(branch[0]) : null, block ]; - }) ]; - }, - "function": function() { - var ret = _lambda.apply(this, arguments); - if (ret[1] && !HOP(scope.refs, ret[1])) { - ret[1] = null; - } - return ret; - }, - "defun": _lambda, - "block": function(body) { - if (body) return rmblock([ "block", tighten(MAP(body, walk)) ]); - }, - "binary": function(op, left, right) { - return when_constant([ "binary", op, walk(left), walk(right) ], function yes(c){ - return best_of(walk(c), this); - }, function no() { - return this; - }); - }, - "conditional": function(c, t, e) { - return make_conditional(walk(c), walk(t), walk(e)); - }, - "try": function(t, c, f) { - return [ - "try", - tighten(MAP(t, walk)), - c != null ? [ c[0], tighten(MAP(c[1], walk)) ] : null, - f != null ? tighten(MAP(f, walk)) : null - ]; - }, - "unary-prefix": function(op, expr) { - expr = walk(expr); - var ret = [ "unary-prefix", op, expr ]; - if (op == "!") - ret = best_of(ret, negate(expr)); - return when_constant(ret, function(ast, val){ - return walk(ast); // it's either true or false, so minifies to !0 or !1 - }, function() { return ret }); - }, - "name": function(name) { - switch (name) { - case "true": return [ "unary-prefix", "!", [ "num", 0 ]]; - case "false": return [ "unary-prefix", "!", [ "num", 1 ]]; - } - }, - "new": function(ctor, args) { - if (ctor[0] == "name" && ctor[1] == "Array" && !scope.has("Array")) { - if (args.length != 1) { - return [ "array", args ]; - } else { - return [ "call", [ "name", "Array" ], args ]; - } - } - }, - "call": function(expr, args) { - if (expr[0] == "name" && expr[1] == "Array" && args.length != 1 && !scope.has("Array")) { - return [ "array", args ]; - } - }, - "while": _do_while, - "do": _do_while - }, function() { - return walk(ast_add_scope(ast)); - }); -}; - -/* -----[ re-generate code from the AST ]----- */ - -var DOT_CALL_NO_PARENS = jsp.array_to_hash([ - "name", - "array", - "string", - "dot", - "sub", - "call", - "regexp" -]); - -function make_string(str, ascii_only) { - var dq = 0, sq = 0; - str = str.replace(/[\\\b\f\n\r\t\x22\x27]/g, function(s){ - switch (s) { - case "\\": return "\\\\"; - case "\b": return "\\b"; - case "\f": return "\\f"; - case "\n": return "\\n"; - case "\r": return "\\r"; - case "\t": return "\\t"; - case '"': ++dq; return '"'; - case "'": ++sq; return "'"; - } - return s; - }); - if (ascii_only) str = to_ascii(str); - if (dq > sq) return "'" + str.replace(/\x27/g, "\\'") + "'"; - else return '"' + str.replace(/\x22/g, '\\"') + '"'; -}; - -function to_ascii(str) { - return str.replace(/[\u0080-\uffff]/g, function(ch) { - var code = ch.charCodeAt(0).toString(16); - while (code.length < 4) code = "0" + code; - return "\\u" + code; - }); -}; - -function gen_code(ast, options) { - options = defaults(options, { - indent_start : 0, - indent_level : 4, - quote_keys : false, - space_colon : false, - beautify : false, - ascii_only : false - }); - var beautify = !!options.beautify; - var indentation = 0, - newline = beautify ? "\n" : "", - space = beautify ? " " : ""; - - function encode_string(str) { - return make_string(str, options.ascii_only); - }; - - function make_name(name) { - name = name.toString(); - if (options.ascii_only) - name = to_ascii(name); - return name; - }; - - function indent(line) { - if (line == null) - line = ""; - if (beautify) - line = repeat_string(" ", options.indent_start + indentation * options.indent_level) + line; - return line; - }; - - function with_indent(cont, incr) { - if (incr == null) incr = 1; - indentation += incr; - try { return cont.apply(null, slice(arguments, 1)); } - finally { indentation -= incr; } - }; - - function add_spaces(a) { - if (beautify) - return a.join(" "); - var b = []; - for (var i = 0; i < a.length; ++i) { - var next = a[i + 1]; - b.push(a[i]); - if (next && - ((/[a-z0-9_\x24]$/i.test(a[i].toString()) && /^[a-z0-9_\x24]/i.test(next.toString())) || - (/[\+\-]$/.test(a[i].toString()) && /^[\+\-]/.test(next.toString())))) { - b.push(" "); - } - } - return b.join(""); - }; - - function add_commas(a) { - return a.join("," + space); - }; - - function parenthesize(expr) { - var gen = make(expr); - for (var i = 1; i < arguments.length; ++i) { - var el = arguments[i]; - if ((el instanceof Function && el(expr)) || expr[0] == el) - return "(" + gen + ")"; - } - return gen; - }; - - function best_of(a) { - if (a.length == 1) { - return a[0]; - } - if (a.length == 2) { - var b = a[1]; - a = a[0]; - return a.length <= b.length ? a : b; - } - return best_of([ a[0], best_of(a.slice(1)) ]); - }; - - function needs_parens(expr) { - if (expr[0] == "function") { - // dot/call on a literal function requires the - // function literal itself to be parenthesized - // only if it's the first "thing" in a - // statement. This means that the parent is - // "stat", but it could also be a "seq" and - // we're the first in this "seq" and the - // parent is "stat", and so on. Messy stuff, - // but it worths the trouble. - var a = slice($stack), self = a.pop(), p = a.pop(); - while (p) { - if (p[0] == "stat") return true; - if ((p[0] == "seq" && p[1] === self) || - (p[0] == "call" && p[1] === self) || - (p[0] == "binary" && p[2] === self)) { - self = p; - p = a.pop(); - } else { - return false; - } - } - } - return !HOP(DOT_CALL_NO_PARENS, expr[0]); - }; - - function make_num(num) { - var str = num.toString(10), a = [ str.replace(/^0\./, ".") ], m; - if (Math.floor(num) === num) { - a.push("0x" + num.toString(16).toLowerCase(), // probably pointless - "0" + num.toString(8)); // same. - if ((m = /^(.*?)(0+)$/.exec(num))) { - a.push(m[1] + "e" + m[2].length); - } - } else if ((m = /^0?\.(0+)(.*)$/.exec(num))) { - a.push(m[2] + "e-" + (m[1].length + m[2].length), - str.substr(str.indexOf("."))); - } - return best_of(a); - }; - - var generators = { - "string": encode_string, - "num": make_num, - "name": make_name, - "toplevel": function(statements) { - return make_block_statements(statements) - .join(newline + newline); - }, - "block": make_block, - "var": function(defs) { - return "var " + add_commas(MAP(defs, make_1vardef)) + ";"; - }, - "const": function(defs) { - return "const " + add_commas(MAP(defs, make_1vardef)) + ";"; - }, - "try": function(tr, ca, fi) { - var out = [ "try", make_block(tr) ]; - if (ca) out.push("catch", "(" + ca[0] + ")", make_block(ca[1])); - if (fi) out.push("finally", make_block(fi)); - return add_spaces(out); - }, - "throw": function(expr) { - return add_spaces([ "throw", make(expr) ]) + ";"; - }, - "new": function(ctor, args) { - args = args.length > 0 ? "(" + add_commas(MAP(args, make)) + ")" : ""; - return add_spaces([ "new", parenthesize(ctor, "seq", "binary", "conditional", "assign", function(expr){ - var w = ast_walker(), has_call = {}; - try { - w.with_walkers({ - "call": function() { throw has_call }, - "function": function() { return this } - }, function(){ - w.walk(expr); - }); - } catch(ex) { - if (ex === has_call) - return true; - throw ex; - } - }) + args ]); - }, - "switch": function(expr, body) { - return add_spaces([ "switch", "(" + make(expr) + ")", make_switch_block(body) ]); - }, - "break": function(label) { - var out = "break"; - if (label != null) - out += " " + make_name(label); - return out + ";"; - }, - "continue": function(label) { - var out = "continue"; - if (label != null) - out += " " + make_name(label); - return out + ";"; - }, - "conditional": function(co, th, el) { - return add_spaces([ parenthesize(co, "assign", "seq", "conditional"), "?", - parenthesize(th, "seq"), ":", - parenthesize(el, "seq") ]); - }, - "assign": function(op, lvalue, rvalue) { - if (op && op !== true) op += "="; - else op = "="; - return add_spaces([ make(lvalue), op, parenthesize(rvalue, "seq") ]); - }, - "dot": function(expr) { - var out = make(expr), i = 1; - if (expr[0] == "num") - out += "."; - else if (needs_parens(expr)) - out = "(" + out + ")"; - while (i < arguments.length) - out += "." + make_name(arguments[i++]); - return out; - }, - "call": function(func, args) { - var f = make(func); - if (needs_parens(func)) - f = "(" + f + ")"; - return f + "(" + add_commas(MAP(args, function(expr){ - return parenthesize(expr, "seq"); - })) + ")"; - }, - "function": make_function, - "defun": make_function, - "if": function(co, th, el) { - var out = [ "if", "(" + make(co) + ")", el ? make_then(th) : make(th) ]; - if (el) { - out.push("else", make(el)); - } - return add_spaces(out); - }, - "for": function(init, cond, step, block) { - var out = [ "for" ]; - init = (init != null ? make(init) : "").replace(/;*\s*$/, ";" + space); - cond = (cond != null ? make(cond) : "").replace(/;*\s*$/, ";" + space); - step = (step != null ? make(step) : "").replace(/;*\s*$/, ""); - var args = init + cond + step; - if (args == "; ; ") args = ";;"; - out.push("(" + args + ")", make(block)); - return add_spaces(out); - }, - "for-in": function(vvar, key, hash, block) { - return add_spaces([ "for", "(" + - (vvar ? make(vvar).replace(/;+$/, "") : make(key)), - "in", - make(hash) + ")", make(block) ]); - }, - "while": function(condition, block) { - return add_spaces([ "while", "(" + make(condition) + ")", make(block) ]); - }, - "do": function(condition, block) { - return add_spaces([ "do", make(block), "while", "(" + make(condition) + ")" ]) + ";"; - }, - "return": function(expr) { - var out = [ "return" ]; - if (expr != null) out.push(make(expr)); - return add_spaces(out) + ";"; - }, - "binary": function(operator, lvalue, rvalue) { - var left = make(lvalue), right = make(rvalue); - // XXX: I'm pretty sure other cases will bite here. - // we need to be smarter. - // adding parens all the time is the safest bet. - if (member(lvalue[0], [ "assign", "conditional", "seq" ]) || - lvalue[0] == "binary" && PRECEDENCE[operator] > PRECEDENCE[lvalue[1]]) { - left = "(" + left + ")"; - } - if (member(rvalue[0], [ "assign", "conditional", "seq" ]) || - rvalue[0] == "binary" && PRECEDENCE[operator] >= PRECEDENCE[rvalue[1]] && - !(rvalue[1] == operator && member(operator, [ "&&", "||", "*" ]))) { - right = "(" + right + ")"; - } - return add_spaces([ left, operator, right ]); - }, - "unary-prefix": function(operator, expr) { - var val = make(expr); - if (!(expr[0] == "num" || (expr[0] == "unary-prefix" && !HOP(OPERATORS, operator + expr[1])) || !needs_parens(expr))) - val = "(" + val + ")"; - return operator + (jsp.is_alphanumeric_char(operator.charAt(0)) ? " " : "") + val; - }, - "unary-postfix": function(operator, expr) { - var val = make(expr); - if (!(expr[0] == "num" || (expr[0] == "unary-postfix" && !HOP(OPERATORS, operator + expr[1])) || !needs_parens(expr))) - val = "(" + val + ")"; - return val + operator; - }, - "sub": function(expr, subscript) { - var hash = make(expr); - if (needs_parens(expr)) - hash = "(" + hash + ")"; - return hash + "[" + make(subscript) + "]"; - }, - "object": function(props) { - if (props.length == 0) - return "{}"; - return "{" + newline + with_indent(function(){ - return MAP(props, function(p){ - if (p.length == 3) { - // getter/setter. The name is in p[0], the arg.list in p[1][2], the - // body in p[1][3] and type ("get" / "set") in p[2]. - return indent(make_function(p[0], p[1][2], p[1][3], p[2])); - } - var key = p[0], val = make(p[1]); - if (options.quote_keys) { - key = encode_string(key); - } else if ((typeof key == "number" || !beautify && +key + "" == key) - && parseFloat(key) >= 0) { - key = make_num(+key); - } else if (!is_identifier(key)) { - key = encode_string(key); - } - return indent(add_spaces(beautify && options.space_colon - ? [ key, ":", val ] - : [ key + ":", val ])); - }).join("," + newline); - }) + newline + indent("}"); - }, - "regexp": function(rx, mods) { - return "/" + rx + "/" + mods; - }, - "array": function(elements) { - if (elements.length == 0) return "[]"; - return add_spaces([ "[", add_commas(MAP(elements, function(el){ - if (!beautify && el[0] == "atom" && el[1] == "undefined") return ""; - return parenthesize(el, "seq"); - })), "]" ]); - }, - "stat": function(stmt) { - return make(stmt).replace(/;*\s*$/, ";"); - }, - "seq": function() { - return add_commas(MAP(slice(arguments), make)); - }, - "label": function(name, block) { - return add_spaces([ make_name(name), ":", make(block) ]); - }, - "with": function(expr, block) { - return add_spaces([ "with", "(" + make(expr) + ")", make(block) ]); - }, - "atom": function(name) { - return make_name(name); - } - }; - - // The squeezer replaces "block"-s that contain only a single - // statement with the statement itself; technically, the AST - // is correct, but this can create problems when we output an - // IF having an ELSE clause where the THEN clause ends in an - // IF *without* an ELSE block (then the outer ELSE would refer - // to the inner IF). This function checks for this case and - // adds the block brackets if needed. - function make_then(th) { - if (th[0] == "do") { - // https://github.com/mishoo/UglifyJS/issues/#issue/57 - // IE croaks with "syntax error" on code like this: - // if (foo) do ... while(cond); else ... - // we need block brackets around do/while - return make([ "block", [ th ]]); - } - var b = th; - while (true) { - var type = b[0]; - if (type == "if") { - if (!b[3]) - // no else, we must add the block - return make([ "block", [ th ]]); - b = b[3]; - } - else if (type == "while" || type == "do") b = b[2]; - else if (type == "for" || type == "for-in") b = b[4]; - else break; - } - return make(th); - }; - - function make_function(name, args, body, keyword) { - var out = keyword || "function"; - if (name) { - out += " " + make_name(name); - } - out += "(" + add_commas(MAP(args, make_name)) + ")"; - return add_spaces([ out, make_block(body) ]); - }; - - function make_block_statements(statements) { - for (var a = [], last = statements.length - 1, i = 0; i <= last; ++i) { - var stat = statements[i]; - var code = make(stat); - if (code != ";") { - if (!beautify && i == last) { - if ((stat[0] == "while" && empty(stat[2])) || - (member(stat[0], [ "for", "for-in"] ) && empty(stat[4])) || - (stat[0] == "if" && empty(stat[2]) && !stat[3]) || - (stat[0] == "if" && stat[3] && empty(stat[3]))) { - code = code.replace(/;*\s*$/, ";"); - } else { - code = code.replace(/;+\s*$/, ""); - } - } - a.push(code); - } - } - return MAP(a, indent); - }; - - function make_switch_block(body) { - var n = body.length; - if (n == 0) return "{}"; - return "{" + newline + MAP(body, function(branch, i){ - var has_body = branch[1].length > 0, code = with_indent(function(){ - return indent(branch[0] - ? add_spaces([ "case", make(branch[0]) + ":" ]) - : "default:"); - }, 0.5) + (has_body ? newline + with_indent(function(){ - return make_block_statements(branch[1]).join(newline); - }) : ""); - if (!beautify && has_body && i < n - 1) - code += ";"; - return code; - }).join(newline) + newline + indent("}"); - }; - - function make_block(statements) { - if (!statements) return ";"; - if (statements.length == 0) return "{}"; - return "{" + newline + with_indent(function(){ - return make_block_statements(statements).join(newline); - }) + newline + indent("}"); - }; - - function make_1vardef(def) { - var name = def[0], val = def[1]; - if (val != null) - name = add_spaces([ make_name(name), "=", make(val) ]); - return name; - }; - - var $stack = []; - - function make(node) { - var type = node[0]; - var gen = generators[type]; - if (!gen) - throw new Error("Can't find generator for \"" + type + "\""); - $stack.push(node); - var ret = gen.apply(type, node.slice(1)); - $stack.pop(); - return ret; - }; - - return make(ast); -}; - -function split_lines(code, max_line_length) { - var splits = [ 0 ]; - jsp.parse(function(){ - var next_token = jsp.tokenizer(code); - var last_split = 0; - var prev_token; - function current_length(tok) { - return tok.pos - last_split; - }; - function split_here(tok) { - last_split = tok.pos; - splits.push(last_split); - }; - function custom(){ - var tok = next_token.apply(this, arguments); - out: { - if (prev_token) { - if (prev_token.type == "keyword") break out; - } - if (current_length(tok) > max_line_length) { - switch (tok.type) { - case "keyword": - case "atom": - case "name": - case "punc": - split_here(tok); - break out; - } - } - } - prev_token = tok; - return tok; - }; - custom.context = function() { - return next_token.context.apply(this, arguments); - }; - return custom; - }()); - return splits.map(function(pos, i){ - return code.substring(pos, splits[i + 1] || code.length); - }).join("\n"); -}; - -/* -----[ Utilities ]----- */ - -function repeat_string(str, i) { - if (i <= 0) return ""; - if (i == 1) return str; - var d = repeat_string(str, i >> 1); - d += d; - if (i & 1) d += str; - return d; -}; - -function defaults(args, defs) { - var ret = {}; - if (args === true) - args = {}; - for (var i in defs) if (HOP(defs, i)) { - ret[i] = (args && HOP(args, i)) ? args[i] : defs[i]; - } - return ret; -}; - -function is_identifier(name) { - return /^[a-z_$][a-z0-9_$]*$/i.test(name) - && name != "this" - && !HOP(jsp.KEYWORDS_ATOM, name) - && !HOP(jsp.RESERVED_WORDS, name) - && !HOP(jsp.KEYWORDS, name); -}; - -function HOP(obj, prop) { - return Object.prototype.hasOwnProperty.call(obj, prop); -}; - -// some utilities - -var MAP; - -(function(){ - MAP = function(a, f, o) { - var ret = []; - for (var i = 0; i < a.length; ++i) { - var val = f.call(o, a[i], i); - if (val instanceof AtTop) ret.unshift(val.v); - else ret.push(val); - } - return ret; - }; - MAP.at_top = function(val) { return new AtTop(val) }; - function AtTop(val) { this.v = val }; -})(); - -/* -----[ Exports ]----- */ - -exports.ast_walker = ast_walker; -exports.ast_mangle = ast_mangle; -exports.ast_squeeze = ast_squeeze; -exports.gen_code = gen_code; -exports.ast_add_scope = ast_add_scope; -exports.ast_squeeze_more = require("./squeeze-more").ast_squeeze_more; -exports.set_logger = function(logger) { warn = logger }; -exports.make_string = make_string; -exports.split_lines = split_lines; \ No newline at end of file diff --git a/build/lib/squeeze-more.js b/build/lib/squeeze-more.js deleted file mode 100644 index 12380af..0000000 --- a/build/lib/squeeze-more.js +++ /dev/null @@ -1,22 +0,0 @@ -var jsp = require("./parse-js"), - pro = require("./process"), - slice = jsp.slice, - member = jsp.member, - PRECEDENCE = jsp.PRECEDENCE, - OPERATORS = jsp.OPERATORS; - -function ast_squeeze_more(ast) { - var w = pro.ast_walker(), walk = w.walk; - return w.with_walkers({ - "call": function(expr, args) { - if (expr[0] == "dot" && expr[2] == "toString" && args.length == 0) { - // foo.toString() ==> foo+"" - return [ "binary", "+", expr[1], [ "string", "" ]]; - } - } - }, function() { - return walk(ast); - }); -}; - -exports.ast_squeeze_more = ast_squeeze_more; diff --git a/build/proton.js b/build/proton.js index e759c9b..e718cef 100644 --- a/build/proton.js +++ b/build/proton.js @@ -1,4978 +1,5618 @@ -/*! - * Proton v2.2.1 - * https://github.com/a-jie/Proton - * - * Copyright 2011-2017, A-JIE - * Licensed under the MIT license - * http://www.opensource.org/licenses/mit-license - * - */ -(function (root, factory) { - if (typeof define === 'function' && define.amd) { - define([], factory); - } else if (typeof module !== 'undefined' && module.exports) { - module.exports = factory(); - } else { - root.Proton = factory(); +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global.Proton = factory()); +}(this, (function () { 'use strict'; + +var PI = 3.1415926; + +var MathUtils = { + + PI: PI, + PIx2: PI * 2, + PI_2: PI / 2, + PI_180: PI / 180, + N180_PI: 180 / PI, + + randomAToB: function randomAToB(a, b, INT) { + if (!INT) return a + Math.random() * (b - a);else return Math.floor(Math.random() * (b - a)) + a; + }, + randomFloating: function randomFloating(center, f, INT) { + return this.randomAToB(center - f, center + f, INT); + }, + randomZone: function randomZone(display) {}, + degreeTransform: function degreeTransform(a) { + return a * PI / 180; + }, + toColor16: function toColor16(num) { + return "#" + num.toString(16); + }, + randomColor: function randomColor() { + return '#' + ('00000' + (Math.random() * 0x1000000 << 0).toString(16)).slice(-6); } -}(this, function () { +}; +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { + return typeof obj; +} : function (obj) { + return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; +}; - //the max particle number in pool - Proton.POOL_MAX = 1000; - Proton.TIME_STEP = 60; - Proton.USE_CLOCK = false; - - //1:100 - Proton.MEASURE = 100; - Proton.EULER = 'euler'; - Proton.RK2 = 'runge-kutta2'; - Proton.VERLET = 'verlet'; - - Proton.PARTICLE_CREATED = 'partilcleCreated'; - Proton.PARTICLE_UPDATE = 'partilcleUpdate'; - Proton.PARTICLE_SLEEP = 'particleSleep'; - Proton.PARTICLE_DEAD = 'partilcleDead'; - Proton.PROTON_UPDATE = 'protonUpdate'; - Proton.PROTON_UPDATE_AFTER = 'protonUpdateAfter'; - Proton.EMITTER_ADDED = 'emitterAdded'; - Proton.EMITTER_REMOVED = 'emitterRemoved'; - - Proton.amendChangeTabsBug = true; - Proton.TextureBuffer = {}; - Proton.TextureCanvasBuffer = {}; - /** - * The constructor to add emitters - * - * @constructor Proton - * - * @todo proParticleCount is not in use - * @todo add more documentation of the single properties and parameters - * - * @param {Number} [proParticleCount] not in use? - * @param {Number} [integrationType=Proton.EULER] - * - * @property {String} [integrationType=Proton.EULER] - * @property {Array} emitters All added emitter - * @property {Array} renderers All added renderer - * @property {Number} time The active time - * @property {Number} oldtime The old time - */ - function Proton(proParticleCount, integrationType) { - this.integrationType = Proton.Util.initValue(integrationType, Proton.EULER); - this.emitters = []; - this.renderers = []; - this.time = 0; - this.oldTime = 0; - Proton.pool = new Proton.Pool(100); - Proton.integrator = new Proton.NumericalIntegration(this.integrationType); - } - Proton.prototype = { - /** - * add a type of Renderer - * - * @method addRender - * @memberof Proton - * @instance - * - * @param {Renderer} render - */ - addRender: function(render) { - render.proton = this; - this.renderers.push(render.proton); - }, - /** - * add the Emitter - * - * @method addEmitter - * @memberof Proton - * @instance - * - * @param {Emitter} emitter - */ - addEmitter: function(emitter) { - this.emitters.push(emitter); - emitter.parent = this; - this.dispatchEvent(Proton.EMITTER_ADDED, emitter); - }, - /** - * Removes an Emitter - * - * @method removeEmitter - * @memberof Proton - * @instance - * - * @param {Proton.Emitter} emitter - */ - removeEmitter: function(emitter) { - var index = this.emitters.indexOf(emitter); - this.emitters.splice(index, 1); - emitter.parent = null; - this.dispatchEvent(Proton.EMITTER_REMOVED, emitter); - }, - /** - * Updates all added emitters - * - * @method update - * @memberof Proton - * @instance - */ - update: function() { - this.dispatchEvent(Proton.PROTON_UPDATE); - - if (Proton.USE_CLOCK) { - if (!this.oldTime) - this.oldTime = new Date().getTime(); - - var time = new Date().getTime(); - this.elapsed = (time - this.oldTime) / 1000; - if (Proton.amendChangeTabsBug) - this.amendChangeTabsBug(); - this.oldTime = time; - } else { - this.elapsed = 0.0167; - } - - if (this.elapsed > 0) { - for (var i = 0; i < this.emitters.length; i++) { - this.emitters[i].update(this.elapsed); - } - } - - this.dispatchEvent(Proton.PROTON_UPDATE_AFTER); - }, - - /** - * @todo add description - * - * @method amendChangeTabsBug - * @memberof Proton - * @instance - */ - amendChangeTabsBug: function() { - if (this.elapsed > .5) { - this.oldTime = new Date().getTime(); - this.elapsed = 0; - } - }, - /** - * Counts all particles from all emitters - * - * @method getCount - * @memberof Proton - * @instance - */ - getCount: function() { - var total = 0; - var length = this.emitters.length; - for (var i = 0; i < length; i++) { - total += this.emitters[i].particles.length; - } - return total; - }, - - /** - * Destroys everything related to this Proton instance. This includes all emitters, and all properties - * - * @method destroy - * @memberof Proton - * @instance - */ - destroy: function() { - var length = this.emitters.length; - for (var i = 0; i < length; i++) { - this.emitters[i].destroy(); - delete this.emitters[i]; - } - - this.emitters = []; - this.time = 0; - this.oldTime = 0; - Proton.pool.release(); - } - }; +var classCallCheck = function (instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +}; - - - -/* - * EventDispatcher - * Visit http://createjs.com/ for documentation, updates and examples. - * - **/ - - - function EventDispatcher() { - this.initialize(); - }; - - EventDispatcher.initialize = function(target) { - target.addEventListener = p.addEventListener; - target.removeEventListener = p.removeEventListener; - target.removeAllEventListeners = p.removeAllEventListeners; - target.hasEventListener = p.hasEventListener; - target.dispatchEvent = p.dispatchEvent; - }; - - var p = EventDispatcher.prototype; - - p._listeners = null; - - p.initialize = function() {}; - p.addEventListener = function(type, listener) { - if (!this._listeners) { - this._listeners = {}; - } else { - this.removeEventListener(type, listener); - } - - if (!this._listeners[type]) this._listeners[type] = [] - this._listeners[type].push(listener); - - return listener; - }; - - p.removeEventListener = function(type, listener) { - if (!this._listeners) return; - if (!this._listeners[type]) return; - - var arr = this._listeners[type]; - for (var i = 0, l = arr.length; i < l; i++) { - if (arr[i] == listener) { - if (l == 1) { - delete(this._listeners[type]); - } - // allows for faster checks. - else { - arr.splice(i, 1); - } - break; - } - } - }; - - p.removeAllEventListeners = function(type) { - if (!type) - this._listeners = null; - else if (this._listeners) - delete(this._listeners[type]); - }; - - p.dispatchEvent = function(eventName, eventTarget) { - var ret = false, - listeners = this._listeners; - - if (eventName && listeners) { - var arr = listeners[eventName]; - if (!arr) return ret; - - arr = arr.slice(); - // to avoid issues with items being removed or added during the dispatch - - var handler, i = arr.length; - while (i--) { - var handler = arr[i]; - ret = ret || handler(eventTarget); - } - - } +var createClass = function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } - return !!ret; - }; + return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; + }; +}(); - p.hasEventListener = function(type) { - var listeners = this._listeners; - return !!(listeners && listeners[type]); - }; - EventDispatcher.initialize(Proton.prototype); - Proton.EventDispatcher = EventDispatcher; - /** - * @namespace - * @memberof! Proton# - * @alias Proton.Util - */ - var Util = Util || { - /** - * Returns the default if the value is null or undefined - * - * @memberof Proton#Proton.Util - * @method initValue - * - * @param {Mixed} value a specific value, could be everything but null or undefined - * @param {Mixed} defaults the default if the value is null or undefined - */ - initValue: function(value, defaults) { - var value = (value != null && value != undefined) ? value : defaults; - return value; - }, +var get = function get(object, property, receiver) { + if (object === null) object = Function.prototype; + var desc = Object.getOwnPropertyDescriptor(object, property); - /** - * Checks if the value is a valid array - * - * @memberof Proton#Proton.Util - * @method isArray - * - * @param {Array} value Any array - * - * @returns {Boolean} - */ - isArray: function(value) { - return typeof value === 'object' && value.hasOwnProperty('length'); - }, - - /** - * Destroyes the given array - * - * @memberof Proton#Proton.Util - * @method destroyArray - * - * @param {Array} array Any array - */ - destroyArray: function(array) { - array.length = 0; - }, - - /** - * Destroyes the given object - * - * @memberof Proton#Proton.Util - * @method destroyObject - * - * @param {Object} obj Any object - */ - destroyObject: function(obj) { - for (var o in obj) - delete obj[o]; - }, - - /** - * Returns the Vector2D - or creates a new one - * - * @memberof Proton#Proton.Util - * @method getVector2D - * - * @param {Proton.Vector2D | Number} postionOrX - * @param {Number} [y] just valid if 'postionOrX' is not an object - * - * @return {Proton.Vector2D} - */ - getVector2D: function(postionOrX, y) { - if (typeof(postionOrX) == 'object') { - return postionOrX; - } else { - var vector2d = new Proton.Vector2D(postionOrX, y); - return vector2d; - } - }, + if (desc === undefined) { + var parent = Object.getPrototypeOf(object); - /** - * Makes an instance of a class and binds the given array - * - * @memberof Proton#Proton.Util - * @method classApply - * - * @param {Function} constructor A class to make an instance from - * @param {Array} [argArray] Any array to bind it to the constructor - * - * @return {Object} The instance of constructor, optionally bind with argArray - */ - classApply: function(constructor, argArray) { - if (!argArray) return new constructor; + if (parent === null) { + return undefined; + } else { + return get(parent, property, receiver); + } + } else if ("value" in desc) { + return desc.value; + } else { + var getter = desc.get; - var args = [null].concat(argArray); - var factoryFunction = constructor.bind.apply(constructor, args); - return new factoryFunction(); - }, + if (getter === undefined) { + return undefined; + } - /** - * @memberof Proton#Proton.Util - * @method judgeVector2D - * - * @todo add description for param `pOBJ` - * @todo add description for function - * - * @param {Object} pOBJ - * - * @return {String} result - */ - judgeVector2D: function(pOBJ) { - var result = ''; - if (pOBJ.hasOwnProperty('x') || pOBJ.hasOwnProperty('y') || pOBJ.hasOwnProperty('p') || pOBJ.hasOwnProperty('position')) - result += 'p'; - if (pOBJ.hasOwnProperty('vx') || pOBJ.hasOwnProperty('vx') || pOBJ.hasOwnProperty('v') || pOBJ.hasOwnProperty('velocity')) - result += 'v'; - if (pOBJ.hasOwnProperty('ax') || pOBJ.hasOwnProperty('ax') || pOBJ.hasOwnProperty('a') || pOBJ.hasOwnProperty('accelerate')) - result += 'a'; + return getter.call(receiver); + } +}; + +var inherits = function (subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); + } + + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + enumerable: false, + writable: true, + configurable: true + } + }); + if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; +}; - return result; - }, - /** - * @memberof Proton#Proton.Util - * @method setVector2DByObject - * - * @todo add description for param `target` - * @todo add description for param `pOBJ` - * @todo add description for function - * - * @param {Object} target - * @param {Object} pOBJ - */ - setVector2DByObject: function(target, pOBJ) { - if (pOBJ.hasOwnProperty('x')) - target.p.x = pOBJ['x']; - if (pOBJ.hasOwnProperty('y')) - target.p.y = pOBJ['y']; - if (pOBJ.hasOwnProperty('vx')) - target.v.x = pOBJ['vx']; - if (pOBJ.hasOwnProperty('vy')) - target.v.y = pOBJ['vy']; - if (pOBJ.hasOwnProperty('ax')) - target.a.x = pOBJ['ax']; - if (pOBJ.hasOwnProperty('ay')) - target.a.y = pOBJ['ay']; - if (pOBJ.hasOwnProperty('p')) - particle.p.copy(pOBJ['p']); - if (pOBJ.hasOwnProperty('v')) - particle.v.copy(pOBJ['v']); - if (pOBJ.hasOwnProperty('a')) - particle.a.copy(pOBJ['a']); - if (pOBJ.hasOwnProperty('position')) - particle.p.copy(pOBJ['position']); +var possibleConstructorReturn = function (self, call) { + if (!self) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } - if (pOBJ.hasOwnProperty('velocity')) - particle.v.copy(pOBJ['velocity']); + return call && (typeof call === "object" || typeof call === "function") ? call : self; +}; - if (pOBJ.hasOwnProperty('accelerate')) - particle.a.copy(pOBJ['accelerate']); - }, +var Vector2D = function () { + function Vector2D(x, y) { + classCallCheck(this, Vector2D); - /** - * 强行添加属性 - * - * @memberof Proton#Proton.Util - * @method addPrototypeByObject - * - * @todo add description for param `target` - * @todo add description for param `filters` - * @todo translate desription from chinese to english - * - * @param {Object} target - * @param {Object} prototypeObject An object of single prototypes - * @param {Object} filters - * - * @return {Object} target - */ - addPrototypeByObject: function(target, prototypeObject, filters) { - for (var singlePrototype in prototypeObject) { - if (filters) { - if (filters.indexOf(singlePrototype) < 0) - target[singlePrototype] = Proton.Util.getSpanValue(prototypeObject[singlePrototype]); - } else { - target[singlePrototype] = Proton.Util.getSpanValue(prototypeObject[singlePrototype]); - } - } + this.x = x || 0; + this.y = y || 0; + } - return target; - }, + createClass(Vector2D, [{ + key: 'set', + value: function set$$1(x, y) { + this.x = x; + this.y = y; + return this; + } + }, { + key: 'setX', + value: function setX(x) { + this.x = x; + return this; + } + }, { + key: 'setY', + value: function setY(y) { + this.y = y; + return this; + } + }, { + key: 'getGradient', + value: function getGradient() { + if (this.x != 0) return Math.atan2(this.y, this.x);else if (this.y > 0) return MathUtils.PI_2;else if (this.y < 0) return -MathUtils.PI_2; + } + }, { + key: 'copy', + value: function copy(v) { + this.x = v.x; + this.y = v.y; - /** - * set the prototype in a given prototypeObject - * - * @memberof Proton#Proton.Util - * @method setPrototypeByObject - * - * @todo add description for param `target` - * @todo add description for param `filters` - * @todo translate desription from chinese to english - * - * @param {Object} target - * @param {Object} prototypeObject An object of single prototypes - * @param {Object} filters - * - * @return {Object} target - */ - setPrototypeByObject: function(target, prototypeObject, filters) { - for (var singlePrototype in prototypeObject) { - if (target.hasOwnProperty(singlePrototype)) { - if (filters) { - if (filters.indexOf(singlePrototype) < 0) - target[singlePrototype] = Proton.Util.getSpanValue(prototypeObject[singlePrototype]); - } else { - target[singlePrototype] = Proton.Util.getSpanValue(prototypeObject[singlePrototype]); - } - } + return this; + } + }, { + key: 'add', + value: function add(v, w) { + if (w !== undefined) { + return this.addVectors(v, w); } - return target; - }, + this.x += v.x; + this.y += v.y; - /** - * Returns a new Proton.Span object - * - * @memberof Proton#Proton.Util - * @method setSpanValue - * - * @todo a, b and c should be 'Mixed' or 'Number'? - * - * @param {Mixed | Proton.Span} a - * @param {Mixed} b - * @param {Mixed} c - * - * @return {Proton.Span} - */ - setSpanValue: function(a, b, c) { - if (a instanceof Proton.Span) { - return a; - } else { - if (!b) { - return new Proton.Span(a); - } else { - if (!c) - return new Proton.Span(a, b); - else - return new Proton.Span(a, b, c); - } - } - }, + return this; + } + }, { + key: 'addXY', + value: function addXY(a, b) { + this.x += a; + this.y += b; - /** - * Returns the value from a Proton.Span, if the param is not a Proton.Span it will return the given parameter - * - * @memberof Proton#Proton.Util - * @method getSpanValue - * - * @param {Mixed | Proton.Span} pan - * - * @return {Mixed} the value of Proton.Span OR the parameter if it is not a Proton.Span - */ - getSpanValue: function(pan) { - if (pan instanceof Proton.Span) - return pan.getValue(); - else - return pan; - }, + return this; + } + }, { + key: 'addVectors', + value: function addVectors(a, b) { + this.x = a.x + b.x; + this.y = a.y + b.y; - /** - * Inherits any class from the superclass. Acts like 'extends' in Java - * - * @memberof Proton#Proton.Util - * @method inherits - * - * @param {Object} subClass the child class - * @param {Object} superClass the parent/super class - */ - inherits: function(subClass, superClass) { - subClass._super_ = superClass; - if (Object['create']) { - //console.log(subClass,superClass); - subClass.prototype = Object.create(superClass.prototype, { - constructor: { - value: subClass - } - }); - } else { - var F = function() {}; - F.prototype = superClass.prototype; - subClass.prototype = new F(); - subClass.prototype.constructor = subClass; + return this; + } + }, { + key: 'sub', + value: function sub(v, w) { + if (w !== undefined) { + return this.subVectors(v, w); } - }, - /** - * This will get the image data. It could be necessary to create a Proton.Zone. - * - * @memberof Proton#Proton.Util - * @method getImageData - * - * @param {HTMLCanvasElement} context any canvas, must be a 2dContext 'canvas.getContext('2d')' - * @param {Object} image could be any dom image, e.g. document.getElementById('thisIsAnImgTag'); - * @param {Proton.Rectangle} rect - */ - getImageData: function(context, image, rect) { - context.drawImage(image, rect.x, rect.y); - var imagedata = context.getImageData(rect.x, rect.y, rect.width, rect.height); - context.clearRect(rect.x, rect.y, rect.width, rect.height); - return imagedata; - }, + this.x -= v.x; + this.y -= v.y; - /** - * @memberof Proton#Proton.Util - * @method getImage - * - * @todo add description - * @todo describe fun - * - * @param {Mixed} img - * @param {Proton.Particle} particle - * @param {Boolean} drawCanvas set to true if a canvas should be saved into particle.transform.canvas - * @param {Boolean} fun - */ - getImage: function(img, particle, drawCanvas, fun) { - if (typeof(img) == 'string') { - this.loadAndSetImage(img, particle, drawCanvas, fun); - } else if (typeof(img) == 'object') { - this.loadAndSetImage(img.src, particle, drawCanvas, fun); - } else if (img instanceof Image) { - this.loadedImage(img.src, particle, drawCanvas, fun, img); - } - }, - - /** - * @memberof Proton#Proton.Util - * @method loadedImage - * - * @todo add description - * @todo describe fun - * @todo describe target - * - * @param {String} src the src of an img-tag - * @param {Proton.Particle} particle - * @param {Boolean} drawCanvas set to true if a canvas should be saved into particle.transform.canvas - * @param {Boolean} fun - * @param {Object} target - */ - loadedImage: function(src, particle, drawCanvas, fun, target) { - particle.target = target; - particle.transform.src = src; - if (!Proton.TextureBuffer[src]) - Proton.TextureBuffer[src] = particle.target; - if (drawCanvas) { - if (Proton.TextureCanvasBuffer[src]) { - particle.transform.canvas = Proton.TextureCanvasBuffer[src]; - } else { - var _width = Proton.WebGLUtil.nhpot(particle.target.width); - var _height = Proton.WebGLUtil.nhpot(particle.target.height); - particle.transform.canvas = Proton.DomUtil.createCanvas('canvas' + src, _width, _height); - var context = particle.transform.canvas.getContext('2d'); - context.drawImage(particle.target, 0, 0, particle.target.width, particle.target.height); - Proton.TextureCanvasBuffer[src] = particle.transform.canvas; - } - } - if (fun) - fun(particle); - }, + return this; + } + }, { + key: 'subVectors', + value: function subVectors(a, b) { + this.x = a.x - b.x; + this.y = a.y - b.y; - /** - * @memberof Proton#Proton.Util - * @method loadAndSetImage - * - * @todo add description - * @todo describe fun - * - * @param {String} src the src of an img-tag - * @param {Proton.Particle} particle - * @param {Boolean} drawCanvas set to true if a canvas should be saved into particle.transform.canvas - * @param {Boolean} fun - */ - loadAndSetImage: function(src, particle, drawCanvas, fun) { - if (Proton.TextureBuffer[src]) { - this.loadedImage(src, particle, drawCanvas, fun, Proton.TextureBuffer[src]); + return this; + } + }, { + key: 'divideScalar', + value: function divideScalar(s) { + if (s !== 0) { + this.x /= s; + this.y /= s; } else { - var self = this; - var myImage = new Image(); - myImage.onload = function(e) { - self.loadedImage(src, particle, drawCanvas, fun, e.target); - } - myImage.src = src; + this.set(0, 0); } - }, - /** - * @typedef {Object} rgbObject - * @property {Number} r red value - * @property {Number} g green value - * @property {Number} b blue value - */ - /** - * converts a hex value to a rgb object - * - * @memberof Proton#Proton.Util - * @method hexToRGB - * - * @param {String} h any hex value, e.g. #000000 or 000000 for black - * - * @return {rgbObject} - */ - hexToRGB: function(h) { - var hex16 = (h.charAt(0) == "#") ? h.substring(1, 7) : h; - var r = parseInt(hex16.substring(0, 2), 16); - var g = parseInt(hex16.substring(2, 4), 16); - var b = parseInt(hex16.substring(4, 6), 16); - - return { - r: r, - g: g, - b: b - } - }, - - /** - * converts a rgb value to a rgb string - * - * @memberof Proton#Proton.Util - * @method rgbToHex - * - * @param {Object | Proton.hexToRGB} rgb a rgb object like in {@link Proton#Proton.Util.hexToRGB} - * - * @return {String} rgb() - */ - rgbToHex: function(rbg) { - return 'rgb(' + rbg.r + ', ' + rbg.g + ', ' + rbg.b + ')'; + return this; } - }; + }, { + key: 'multiplyScalar', + value: function multiplyScalar(s) { + this.x *= s; + this.y *= s; - Proton.Util = Util; - - - -///bind -if (!Function.prototype.bind) { - Function.prototype.bind = function(oThis) { - if (typeof this !== "function") { - // closest thing possible to the ECMAScript 5 - // internal IsCallable function - throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable"); + return this; } + }, { + key: 'negate', + value: function negate() { + return this.multiplyScalar(-1); + } + }, { + key: 'dot', + value: function dot(v) { + return this.x * v.x + this.y * v.y; + } + }, { + key: 'lengthSq', + value: function lengthSq() { + return this.x * this.x + this.y * this.y; + } + }, { + key: 'length', + value: function length() { + return Math.sqrt(this.x * this.x + this.y * this.y); + } + }, { + key: 'normalize', + value: function normalize() { + return this.divideScalar(this.length()); + } + }, { + key: 'distanceTo', + value: function distanceTo(v) { + return Math.sqrt(this.distanceToSquared(v)); + } + }, { + key: 'rotate', + value: function rotate(tha) { + var x = this.x; + var y = this.y; - var aArgs = Array.prototype.slice.call(arguments, 1), - fToBind = this, - fNOP = function() {}, - fBound = function() { - return fToBind.apply(this instanceof fNOP ? this : oThis || this, - aArgs.concat(Array.prototype.slice.call(arguments))); - }; - - fNOP.prototype = this.prototype; - fBound.prototype = new fNOP(); - - return fBound; - }; -} - - + this.x = x * Math.cos(tha) + y * Math.sin(tha); + this.y = -x * Math.sin(tha) + y * Math.cos(tha); - /** - * @namespace - * @memberof! Proton# - * @alias Proton.WebGLUtil - */ - var WebGLUtil = WebGLUtil || { - - /** - * @memberof Proton#Proton.WebGLUtil - * @method ipot - * - * @todo add description - * @todo add length description - * - * @param {Number} length - * - * @return {Boolean} - */ - ipot : function(length) { - return (length & (length - 1)) == 0; - }, + return this; + } + }, { + key: 'distanceToSquared', + value: function distanceToSquared(v) { + var dx = this.x - v.x; + var dy = this.y - v.y; - /** - * @memberof Proton#Proton.WebGLUtil - * @method nhpot - * - * @todo add description - * @todo add length description - * - * @param {Number} length - * - * @return {Number} - */ - nhpot : function(length) {--length; - for (var i = 1; i < 32; i <<= 1) { - length = length | length >> i; - } - return length + 1; - }, + return dx * dx + dy * dy; + } + }, { + key: 'lerp', + value: function lerp(v, alpha) { + this.x += (v.x - this.x) * alpha; + this.y += (v.y - this.y) * alpha; - /** - * @memberof Proton#Proton.WebGLUtil - * @method makeTranslation - * - * @todo add description - * @todo add tx, ty description - * @todo add return description - * - * @param {Number} tx either 0 or 1 - * @param {Number} ty either 0 or 1 - * - * @return {Object} - */ - makeTranslation : function(tx, ty) { - return [1, 0, 0, 0, 1, 0, tx, ty, 1]; - }, + return this; + } + }, { + key: 'equals', + value: function equals(v) { + return v.x === this.x && v.y === this.y; + } + }, { + key: 'clear', + value: function clear() { + this.x = 0.0; + this.y = 0.0; + return this; + } + }, { + key: 'clone', + value: function clone() { + return new Vector2D(this.x, this.y); + } + }]); + return Vector2D; +}(); - /** - * @memberof Proton#Proton.WebGLUtil - * @method makeRotation - * - * @todo add description - * @todo add return description - * - * @param {Number} angleInRadians - * - * @return {Object} - */ - makeRotation : function(angleInRadians) { - var c = Math.cos(angleInRadians); - var s = Math.sin(angleInRadians); - return [c, -s, 0, s, c, 0, 0, 0, 1]; - }, +var Span = function () { + function Span(a, b, center) { + classCallCheck(this, Span); - /** - * @memberof Proton#Proton.WebGLUtil - * @method makeScale - * - * @todo add description - * @todo add tx, ty description - * @todo add return description - * - * @param {Number} sx either 0 or 1 - * @param {Number} sy either 0 or 1 - * - * @return {Object} - */ - makeScale : function(sx, sy) { - return [sx, 0, 0, 0, sy, 0, 0, 0, 1]; - }, + this.isArray = false; - /** - * @memberof Proton#Proton.WebGLUtil - * @method matrixMultiply - * - * @todo add description - * @todo add a, b description - * @todo add return description - * - * @param {Object} a - * @param {Object} b - * - * @return {Object} - */ - matrixMultiply : function(a, b) { - var a00 = a[0 * 3 + 0]; - var a01 = a[0 * 3 + 1]; - var a02 = a[0 * 3 + 2]; - var a10 = a[1 * 3 + 0]; - var a11 = a[1 * 3 + 1]; - var a12 = a[1 * 3 + 2]; - var a20 = a[2 * 3 + 0]; - var a21 = a[2 * 3 + 1]; - var a22 = a[2 * 3 + 2]; - var b00 = b[0 * 3 + 0]; - var b01 = b[0 * 3 + 1]; - var b02 = b[0 * 3 + 2]; - var b10 = b[1 * 3 + 0]; - var b11 = b[1 * 3 + 1]; - var b12 = b[1 * 3 + 2]; - var b20 = b[2 * 3 + 0]; - var b21 = b[2 * 3 + 1]; - var b22 = b[2 * 3 + 2]; - return [a00 * b00 + a01 * b10 + a02 * b20, a00 * b01 + a01 * b11 + a02 * b21, a00 * b02 + a01 * b12 + a02 * b22, a10 * b00 + a11 * b10 + a12 * b20, a10 * b01 + a11 * b11 + a12 * b21, a10 * b02 + a11 * b12 + a12 * b22, a20 * b00 + a21 * b10 + a22 * b20, a20 * b01 + a21 * b11 + a22 * b21, a20 * b02 + a21 * b12 + a22 * b22]; + if (Util.isArray(a)) { + this.isArray = true; + this.a = a; + } else { + this.a = Util.initValue(a, 1); + this.b = Util.initValue(b, this.a); + this.center = Util.initValue(center, false); } } - Proton.WebGLUtil = WebGLUtil; - - - - - /** - * @namespace - * @memberof! Proton# - * @alias Proton.DomUtil - */ - var DomUtil = DomUtil || { - - /** - * Creates and returns a new canvas. The opacity is by default set to 0 - * - * @memberof Proton#Proton.DomUtil - * @method createCanvas - * - * @param {String} $id the canvas' id - * @param {Number} $width the canvas' width - * @param {Number} $height the canvas' height - * @param {String} [$position=absolute] the canvas' position, default is 'absolute' - * - * @return {Object} - */ - createCanvas : function($id, $width, $height, $position) { - var element = document.createElement("canvas"); - var position = $position ? $position : 'absolute'; - element.id = $id; - element.width = $width; - element.height = $height; - element.style.position = position; - element.style.opacity = 0; - this.transformDom(element, -500, -500, 0, 0); - return element; - }, - - /** - * Adds a transform: translate(), scale(), rotate() to a given div element for all browsers - * - * @memberof Proton#Proton.DomUtil - * @method transformDom - * - * @param {HTMLDivElement} $div - * @param {Number} $x - * @param {Number} $y - * @param {Number} $scale - * @param {Number} $rotate - */ - transformDom : function($div, $x, $y, $scale, $rotate) { - $div.style.WebkitTransform = 'translate(' + $x + 'px, ' + $y + 'px) ' + 'scale(' + $scale + ') ' + 'rotate(' + $rotate + 'deg)'; - $div.style.MozTransform = 'translate(' + $x + 'px, ' + $y + 'px) ' + 'scale(' + $scale + ') ' + 'rotate(' + $rotate + 'deg)'; - $div.style.OTransform = 'translate(' + $x + 'px, ' + $y + 'px) ' + 'scale(' + $scale + ') ' + 'rotate(' + $rotate + 'deg)'; - $div.style.msTransform = 'translate(' + $x + 'px, ' + $y + 'px) ' + 'scale(' + $scale + ') ' + 'rotate(' + $rotate + 'deg)'; - $div.style.transform = 'translate(' + $x + 'px, ' + $y + 'px) ' + 'scale(' + $scale + ') ' + 'rotate(' + $rotate + 'deg)'; + createClass(Span, [{ + key: 'getValue', + value: function getValue(INT) { + if (this.isArray) { + return this.a[Math.floor(this.a.length * Math.random())]; + } else { + if (!this.center) return MathUtils.randomAToB(this.a, this.b, INT);else return MathUtils.randomFloating(this.a, this.b, INT); + } } - } + }]); + return Span; +}(); - Proton.DomUtil = DomUtil; +var WebGLUtil = { + /** + * @memberof Proton#Proton.WebGLUtil + * @method ipot + * + * @todo add description + * @todo add length description + * + * @param {Number} length + * + * @return {Boolean} + */ + ipot: function ipot(length) { + return (length & length - 1) == 0; + }, - function MStack() { - this.mats = []; - this.size = 0; - for (var i = 0; i < 20; i++) - this.mats.push(Proton.Mat3.create([0, 0, 0, 0, 0, 0, 0, 0, 0])); - } - - - MStack.prototype.set = function(m, i) { - if (i == 0) - Proton.Mat3.set(m, this.mats[0]); - else - Proton.Mat3.multiply(this.mats[i - 1], m, this.mats[i]); - this.size = Math.max(this.size, i + 1); - } + /** + * @memberof Proton#Proton.WebGLUtil + * @method nhpot + * + * @todo add description + * @todo add length description + * + * @param {Number} length + * + * @return {Number} + */ + nhpot: function nhpot(length) { + --length; + for (var i = 1; i < 32; i <<= 1) { + length = length | length >> i; + } - MStack.prototype.push = function(m) { - if (this.size == 0) - Proton.Mat3.set(m, this.mats[0]); - else - Proton.Mat3.multiply(this.mats[this.size - 1], m, this.mats[this.size]); - this.size++; - } + return length + 1; + }, - MStack.prototype.pop = function() { - if (this.size > 0) - this.size--; - } - MStack.prototype.top = function() { - return (this.mats[this.size - 1]); - } + /** + * @memberof Proton#Proton.WebGLUtil + * @method makeTranslation + * + * @todo add description + * @todo add tx, ty description + * @todo add return description + * + * @param {Number} tx either 0 or 1 + * @param {Number} ty either 0 or 1 + * + * @return {Object} + */ + makeTranslation: function makeTranslation(tx, ty) { + return [1, 0, 0, 0, 1, 0, tx, ty, 1]; + }, - Proton.MStack = MStack; + /** + * @memberof Proton#Proton.WebGLUtil + * @method makeRotation + * + * @todo add description + * @todo add return description + * + * @param {Number} angleInRadians + * + * @return {Object} + */ + makeRotation: function makeRotation(angleInRadians) { + var c = Math.cos(angleInRadians); + var s = Math.sin(angleInRadians); + return [c, -s, 0, s, c, 0, 0, 0, 1]; + }, - Particle.ID = 0; - /** - * the Particle class - * - * @class Proton.Particle - * @constructor - * @param {Object} pObj the parameters object; - * for example {life:3,dead:false} - */ - function Particle(pOBJ) { - /** - * The particle's id; - * @property id - * @type {string} - */ - this.id = 'particle_' + Particle.ID++; - this.reset(true); - Proton.Util.setPrototypeByObject(this, pOBJ); - } + /** + * @memberof Proton#Proton.WebGLUtil + * @method makeScale + * + * @todo add description + * @todo add tx, ty description + * @todo add return description + * + * @param {Number} sx either 0 or 1 + * @param {Number} sy either 0 or 1 + * + * @return {Object} + */ + makeScale: function makeScale(sx, sy) { + return [sx, 0, 0, 0, sy, 0, 0, 0, 1]; + }, - Particle.prototype = { - getDirection : function() { - return Math.atan2(this.v.x, -this.v.y) * (180 / Math.PI); - }, - - reset : function(init) { - this.life = Infinity; - this.age = 0; - - //Energy loss - this.energy = 1; - this.dead = false; - this.sleep = false; - this.target = null; - this.sprite = null; - this.parent = null; - this.mass = 1; - this.radius = 10; - this.alpha = 1; - this.scale = 1; - this.rotation = 0; - this.color = null; - this.easing = Proton.ease.setEasingByName(Proton.easeLinear); - - if (init) { - this.transform = {} - this.p = new Proton.Vector2D(); - this.v = new Proton.Vector2D(); - this.a = new Proton.Vector2D(); - this.old = { - p : new Proton.Vector2D(), - v : new Proton.Vector2D(), - a : new Proton.Vector2D() - }; - this.behaviours = []; - } else { - Proton.Util.destroyObject(this.transform); - this.p.set(0, 0); - this.v.set(0, 0); - this.a.set(0, 0); - this.old.p.set(0, 0); - this.old.v.set(0, 0); - this.old.a.set(0, 0); - - this.removeAllBehaviours(); - } + /** + * @memberof Proton#Proton.WebGLUtil + * @method matrixMultiply + * + * @todo add description + * @todo add a, b description + * @todo add return description + * + * @param {Object} a + * @param {Object} b + * + * @return {Object} + */ + matrixMultiply: function matrixMultiply(a, b) { + var a00 = a[0 * 3 + 0]; + var a01 = a[0 * 3 + 1]; + var a02 = a[0 * 3 + 2]; + var a10 = a[1 * 3 + 0]; + var a11 = a[1 * 3 + 1]; + var a12 = a[1 * 3 + 2]; + var a20 = a[2 * 3 + 0]; + var a21 = a[2 * 3 + 1]; + var a22 = a[2 * 3 + 2]; + var b00 = b[0 * 3 + 0]; + var b01 = b[0 * 3 + 1]; + var b02 = b[0 * 3 + 2]; + var b10 = b[1 * 3 + 0]; + var b11 = b[1 * 3 + 1]; + var b12 = b[1 * 3 + 2]; + var b20 = b[2 * 3 + 0]; + var b21 = b[2 * 3 + 1]; + var b22 = b[2 * 3 + 2]; + + return [a00 * b00 + a01 * b10 + a02 * b20, a00 * b01 + a01 * b11 + a02 * b21, a00 * b02 + a01 * b12 + a02 * b22, a10 * b00 + a11 * b10 + a12 * b20, a10 * b01 + a11 * b11 + a12 * b21, a10 * b02 + a11 * b12 + a12 * b22, a20 * b00 + a21 * b10 + a22 * b20, a20 * b01 + a21 * b11 + a22 * b21, a20 * b02 + a21 * b12 + a22 * b22]; + } +}; - this.transform.rgb = { - r : 255, - g : 255, - b : 255 - } +var DomUtil = { - return this; - }, + /** + * Creates and returns a new canvas. The opacity is by default set to 0 + * + * @memberof Proton#Proton.DomUtil + * @method createCanvas + * + * @param {String} $id the canvas' id + * @param {Number} $width the canvas' width + * @param {Number} $height the canvas' height + * @param {String} [$position=absolute] the canvas' position, default is 'absolute' + * + * @return {Object} + */ + createCanvas: function createCanvas(id, width, height, position) { + var dom = document.createElement("canvas"); + position = position || 'absolute'; - update : function(time, index) { - if (!this.sleep) { - this.age += time; - var length = this.behaviours.length, i; + dom.id = id; + dom.width = width; + dom.height = height; + dom.style.opacity = 0; + dom.style.position = position; - for ( i = 0; i < length; i++) { - if (this.behaviours[i]) - this.behaviours[i].applyBehaviour(this, time, index) - } - } else { + this.transform(dom, -500, -500, 0, 0); - } + return dom; + }, + createDiv: function createDiv(id, width, height) { + var dom = document.createElement("div"); - if (this.age >= this.life) { - this.destroy(); - } else { - var scale = this.easing(this.age / this.life); - this.energy = Math.max(1 - scale, 0); - } + dom.id = id; + dom.style.position = 'absolute'; + this.resize(dom, width, height); - }, + return dom; + }, + resize: function resize(dom, width, height) { + dom.style.width = width + 'px'; + dom.style.height = height + 'px'; + dom.style.marginLeft = -width / 2 + 'px'; + dom.style.marginTop = -height / 2 + 'px'; + }, - addBehaviour : function(behaviour) { - this.behaviours.push(behaviour); - if (behaviour.hasOwnProperty('parents')) - behaviour.parents.push(this); - behaviour.initialize(this); - }, + /** + * Adds a transform: translate(), scale(), rotate() to a given div dom for all browsers + * + * @memberof Proton#Proton.DomUtil + * @method transform + * + * @param {HTMLDivElement} div + * @param {Number} $x + * @param {Number} $y + * @param {Number} $scale + * @param {Number} $rotate + */ + transform: function transform(div, x, y, scale, rotate) { + var transform = "translate(" + x + "px, " + y + "px) scale(" + scale + ") rotate(" + rotate + "deg)"; + + div.style.willChange = 'transform'; + this.css3(div, 'transform', transform); + }, + transform3d: function transform3d(div, x, y, scale, rotate) { + var transform = "translate3d(" + x + "px, " + y + "px, 0) scale(" + scale + ") rotate(" + rotate + "deg)"; + + div.style.willChange = 'transform'; + this.css3(div, 'backfaceVisibility', 'hidden'); + this.css3(div, 'transform', transform); + }, + css3: function css3(div, key, val) { + var bkey = key.charAt(0).toUpperCase() + key.substr(1); + + div.style["Webkit" + bkey] = val; + div.style["Moz" + bkey] = val; + div.style["O" + bkey] = val; + div.style["ms" + bkey] = val; + div.style["" + key] = val; + } +}; - addBehaviours : function(behaviours) { - var length = behaviours.length, i; +var IMG_CACHE = {}; +var CANVAS_CACHE = {}; +var canvasID = 0; - for ( i = 0; i < length; i++) { - this.addBehaviour(behaviours[i]); - } - }, +var ImgUtil = { - removeBehaviour : function(behaviour) { - var index = this.behaviours.indexOf(behaviour); - if (index > -1) { - var behaviour = this.behaviours.splice(index, 1); - behaviour.parents = null; - } - }, + /** + * This will get the image data. It could be necessary to create a Proton.Zone. + * + * @memberof Proton#Proton.Util + * @method getImageData + * + * @param {HTMLCanvasElement} context any canvas, must be a 2dContext 'canvas.getContext('2d')' + * @param {Object} image could be any dom image, e.g. document.getElementById('thisIsAnImgTag'); + * @param {Proton.Rectangle} rect + */ + getImageData: function getImageData(context, image, rect) { + context.drawImage(image, rect.x, rect.y); + var imagedata = context.getImageData(rect.x, rect.y, rect.width, rect.height); + context.clearRect(rect.x, rect.y, rect.width, rect.height); - removeAllBehaviours : function() { - Proton.Util.destroyArray(this.behaviours); - }, - - /** - * Destory this particle - * @method destroy - */ - destroy : function() { - this.removeAllBehaviours(); - this.energy = 0; - this.dead = true; - this.parent = null; - } - }; + return imagedata; + }, - Proton.Particle = Particle; + /** + * @memberof Proton#Proton.Util + * @method getImgFromCache + * + * @todo add description + * @todo describe func + * + * @param {Mixed} img + * @param {Proton.Particle} particle + * @param {Boolean} drawCanvas set to true if a canvas should be saved into particle.transform.canvas + * @param {Boolean} func + */ + getImgFromCache: function getImgFromCache(img, callback, param) { + var src = typeof img == 'string' ? img : img.src; + if (IMG_CACHE[src]) { + callback(IMG_CACHE[src], param); + } else { + var image = new Image(); + image.onload = function (e) { + IMG_CACHE[src] = e.target; + callback(IMG_CACHE[src], param); + }; + image.src = src; + } + }, + getCanvasFromCache: function getCanvasFromCache(img, callback, param) { + var src = img.src; - /** - * @memberof! Proton# - * @constructor - * @alias Proton.Pool - * - * @todo add description - * @todo add description of properties - * - * @property {Number} cID - * @property {Object} list - */ - function Pool() { - this.cID = 0; - this.list = {}; - } - - Pool.prototype = { + if (!CANVAS_CACHE[src]) { + var width = WebGLUtil.nhpot(img.width); + var height = WebGLUtil.nhpot(img.height); - /** - * Creates a new class instance - * - * @todo add more documentation - * - * @method create - * @memberof Proton#Proton.Pool - * - * @param {Object|Function} obj any Object or Function - * @param {Object} [params] just add if `obj` is a function - * - * @return {Object} - */ - create: function(obj, params) { - this.cID++; - - if (typeof obj == "function") - return Proton.Util.classApply(obj, params); - else - return obj.clone(); - }, + var canvas = DomUtil.createCanvas('canvas_cache_' + canvasID, width, height); + var context = canvas.getContext('2d'); + context.drawImage(img, 0, 0, img.width, img.height); - /** - * @todo add description - what is in the list? - * - * @method getCount - * @memberof Proton#Proton.Pool - * - * @return {Number} - */ - getCount: function() { - var count = 0; - for (var id in this.list) - count += this.list[id].length; - - return count++;; - }, + CANVAS_CACHE[src] = canvas; + } - /** - * @todo add description - * - * @method get - * @memberof Proton#Proton.Pool - * - * @param {Object|Function} obj - * @param {Object} [params] just add if `obj` is a function - * - * @return {Object} - */ - get: function(obj, params) { - var p, puid = obj.__puid || PUID.id(obj); - if (this.list[puid] && this.list[puid].length > 0) - p = this.list[puid].pop(); - else - p = this.create(obj, params); - - p.__puid = obj.__puid || puid; - return p; - }, + callback && callback(CANVAS_CACHE[src], param); - /** - * @todo add description - * - * @method set - * @memberof Proton#Proton.Pool - * - * @param {Object} obj - * - * @return {Object} - */ - set: function(obj) { - return this._getList(obj.__puid).push(obj); - }, + return CANVAS_CACHE[src]; + } +}; - /** - * Destroyes all items from Pool.list - * - * @method destroy - * @memberof Proton#Proton.Pool - */ - destroy: function() { - for (var id in this.list) { - this.list[id].length = 0; - delete this.list[id]; - } - }, +var Util = { - /** - * Returns Pool.list - * - * @method _getList - * @memberof Proton#Proton.Pool - * @private - * - * @param {Number} uid the unique id - * - * @return {Object} - */ - _getList: function(uid) { - uid = uid || "default"; - if (!this.list[uid]) this.list[uid] = []; - return this.list[uid]; - } - } + /** + * Returns the default if the value is null or undefined + * + * @memberof Proton#Proton.Util + * @method initValue + * + * @param {Mixed} value a specific value, could be everything but null or undefined + * @param {Mixed} defaults the default if the value is null or undefined + */ + initValue: function initValue(value, defaults) { + value = value !== null && value !== undefined ? value : defaults; + return value; + }, - Proton.Pool = Pool; - var PUID = { - _id: 0, - _uids: {}, - id: function(obj) { - for (var id in this._uids) { - if (this._uids[id] == obj) return id; - } + /** + * Checks if the value is a valid array + * + * @memberof Proton#Proton.Util + * @method isArray + * + * @param {Array} value Any array + * + * @returns {Boolean} + */ + isArray: function isArray(value) { + return Object.prototype.toString.call(value) === '[object Array]'; + }, - var nid = "PUID_" + (this._id++); - this._uids[nid] = obj; - return nid; - }, - hash: function(str) { - return; - } - } + /** + * Destroyes the given array + * + * @memberof Proton#Proton.Util + * @method destroyArray + * + * @param {Array} array Any array + */ + destroyArray: function destroyArray(array) { + if (array) array.length = 0; + }, + /** + * Destroyes the given object + * + * @memberof Proton#Proton.Util + * @method destroyObject + * + * @param {Object} obj Any object + */ + destroyObject: function destroyObject(obj, ignore) { + for (var o in obj) { + if (ignore && ignore.indexOf(o) > -1) continue; + delete obj[o]; + } + }, - var MathUtils = { - randomAToB : function(a, b, INT) { - if (!INT) - return a + Math.random() * (b - a ); - else - return Math.floor(Math.random() * (b - a)) + a; - }, - randomFloating : function(center, f, INT) { - return MathUtils.randomAToB(center - f, center + f, INT); - }, - randomZone : function(display) { + /** + * Makes an instance of a class and binds the given array + * + * @memberof Proton#Proton.Util + * @method classApply + * + * @param {Function} constructor A class to make an instance from + * @param {Array} [args] Any array to bind it to the constructor + * + * @return {Object} The instance of constructor, optionally bind with args + */ + classApply: function classApply(constructor, args) { + if (!args) return new constructor(); - }, + args = [null].concat(args); + var factoryFunction = constructor.bind.apply(constructor, args); + return new factoryFunction(); + }, - degreeTransform : function(a) { - return a * Math.PI / 180; - }, - toColor16 : function getRGB(num) { - return "#" + num.toString(16); - }, - - randomColor : function() { - return '#' + ('00000' + (Math.random() * 0x1000000 << 0).toString(16)).slice(-6); - } - } + /** + * @memberof Proton#Proton.Util + * @method setVector2DByObject + * + * @todo add description for param `target` + * @todo add description for param `pOBJ` + * @todo add description for function + * + * @param {Object} target + * @param {Object} pOBJ + */ + setVector2DByObject: function setVector2DByObject(target, pOBJ) { + if (this.hasProp(pOBJ, 'x')) target.p.x = pOBJ['x']; + if (this.hasProp(pOBJ, 'y')) target.p.y = pOBJ['y']; - Proton.MathUtils = MathUtils; + if (this.hasProp(pOBJ, 'vx')) target.v.x = pOBJ['vx']; + if (this.hasProp(pOBJ, 'vy')) target.v.y = pOBJ['vy']; + if (this.hasProp(pOBJ, 'ax')) target.a.x = pOBJ['ax']; + if (this.hasProp(pOBJ, 'ay')) target.a.y = pOBJ['ay']; -//数值积分 + if (this.hasProp(pOBJ, 'p')) particle.p.copy(pOBJ['p']); + if (this.hasProp(pOBJ, 'v')) particle.v.copy(pOBJ['v']); + if (this.hasProp(pOBJ, 'a')) particle.a.copy(pOBJ['a']); - var NumericalIntegration = function(type) { - this.type = Proton.Util.initValue(type, Proton.EULER); - } + if (this.hasProp(pOBJ, 'position')) particle.p.copy(pOBJ['position']); + if (this.hasProp(pOBJ, 'velocity')) particle.v.copy(pOBJ['velocity']); + if (this.hasProp(pOBJ, 'accelerate')) particle.a.copy(pOBJ['accelerate']); + }, + hasProp: function hasProp(obj, key) { + if (!obj) return false; + return obj[key] !== undefined; + // return obj.hasOwnProperty(key); + }, - NumericalIntegration.prototype = { - integrate : function(particles, time, damping) { - this.eulerIntegrate(particles, time, damping); - }, - eulerIntegrate : function(particle, time, damping) { - if (!particle.sleep) { - particle.old.p.copy(particle.p); - particle.old.v.copy(particle.v); - particle.a.multiplyScalar(1 / particle.mass); - particle.v.add(particle.a.multiplyScalar(time)); - particle.p.add(particle.old.v.multiplyScalar(time)); - if (damping) - particle.v.multiplyScalar(damping); - particle.a.clear(); - } - } - } + /** + * set the prototype in a given prototypeObject + * + * @memberof Proton#Proton.Util + * @method setPrototypeByObject + * + * @todo add description for param `target` + * @todo add description for param `filters` + * @todo translate desription from chinese to english + * + * @param {Object} target + * @param {Object} prototypeObject An object of single prototypes + * @param {Object} filters + * + * @return {Object} target + */ + setPrototypeByObject: function setPrototypeByObject(target, prototypeObject, filters) { + for (var singleProp in prototypeObject) { + if (target.hasOwnProperty(singleProp)) { + if (filters) { + if (filters.indexOf(singleProp) < 0) target[singleProp] = this.getSpanValue(prototypeObject[singleProp]); + } else { + target[singleProp] = this.getSpanValue(prototypeObject[singleProp]); + } + } + } - Proton.NumericalIntegration = NumericalIntegration; + return target; + }, -//@author mrdoob / http://mrdoob.com/ + /** + * Returns a new Span object + * + * @memberof Proton#Proton.Util + * @method setSpanValue + * + * @todo a, b and c should be 'Mixed' or 'Number'? + * + * @param {Mixed | Span} a + * @param {Mixed} b + * @param {Mixed} c + * + * @return {Span} + */ + setSpanValue: function setSpanValue(a, b, c) { + if (a instanceof Span) { + return a; + } else { + if (!b) { + return new Span(a); + } else { + if (!c) return new Span(a, b);else return new Span(a, b, c); + } + } + }, - var Vector2D = function(x, y) { - this.x = x || 0; - this.y = y || 0; - } - Vector2D.prototype = { - set : function(x, y) { + /** + * Returns the value from a Span, if the param is not a Span it will return the given parameter + * + * @memberof Proton#Proton.Util + * @method getSpanValue + * + * @param {Mixed | Span} pan + * + * @return {Mixed} the value of Span OR the parameter if it is not a Span + */ + getSpanValue: function getSpanValue(pan) { + return pan instanceof Span ? pan.getValue() : pan; + }, - this.x = x; - this.y = y; - return this; - }, + /** + * This will get the image data. It could be necessary to create a Proton.Zone. + * + * @memberof Proton#Proton.Util + * @method getImageData + * + * @param {HTMLCanvasElement} context any canvas, must be a 2dContext 'canvas.getContext('2d')' + * @param {Object} image could be any dom image, e.g. document.getElementById('thisIsAnImgTag'); + * @param {Proton.Rectangle} rect + */ + getImageData: function getImageData(context, image, rect) { + return ImgUtil.getImageData(context, image, rect); + }, + destroy: function destroy(arr, param) { + var i = arr.length; + + while (i--) { + try { + arr[i].destroy(param); + } catch (e) {} + delete arr[i]; + } - setX : function(x) { + arr.length = 0; + } +}; - this.x = x; - return this; +var PUID = { + id: 0, + cache: {}, - }, + getID: function getID(target) { + var uid = this.getCacheID(target); + if (uid) return uid; - setY : function(y) { + uid = 'PUID_' + this.id++; + this.cache[uid] = target; - this.y = y; + return uid; + }, + getCacheID: function getCacheID(target) { + var obj = void 0; + for (var id in this.cache) { + obj = this.cache[id]; - return this; + if (obj === target) return id; - }, + if ((typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) === 'object' && (typeof target === 'undefined' ? 'undefined' : _typeof(target)) === 'object' && obj.isInner && target.isInner) { + if (obj.src === target.src) return id; + } + } - getGradient : function() { - if (this.x != 0) - return Math.atan2(this.y, this.x); - else if (this.y > 0) - return Math.PI / 2; - else if (this.y < 0) - return -Math.PI / 2; - }, + return null; + }, + getTarget: function getTarget(uid) { + return this.cache[uid]; + } +}; + +/** + * get -> PUID :: uid-> Body + * -> cache[abc]. -> cache[abc] .pop() + * -> create [new Body| clone] + * -> return p1: { __pid: abc } + * + * expire -> cache[abc]= [p0, p1]; + * + */ +var Pool = function () { - copy : function(v) { + /** + * @memberof! Proton# + * @constructor + * @alias Proton.Pool + * + * @todo add description + * @todo add description of properties + * + * @property {Number} total + * @property {Object} cache + */ + function Pool(num) { + classCallCheck(this, Pool); - this.x = v.x; - this.y = v.y; + this.total = 0; + this.cache = {}; + } - return this; + /** + * @todo add description + * + * @method get + * @memberof Proton#Proton.Pool + * + * @param {Object|Function} target + * @param {Object} [params] just add if `target` is a function + * + * @return {Object} + */ - }, - add : function(v, w) { + createClass(Pool, [{ + key: 'get', + value: function get$$1(target, params, uid) { + var p = void 0; + uid = uid || target.__puid || PUID.getID(target); - if (w !== undefined) { - return this.addVectors(v, w); + if (this.cache[uid] && this.cache[uid].length > 0) p = this.cache[uid].pop();else p = this.createOrClone(target, params); - } + p.__puid = target.__puid || uid; + return p; + } - this.x += v.x; - this.y += v.y; + /** + * @todo add description + * + * @method set + * @memberof Proton#Proton.Pool + * + * @param {Object} target + * + * @return {Object} + */ - return this; + }, { + key: 'expire', + value: function expire(target) { + return this.getCache(target.__puid).push(target); + } - }, + /** + * Creates a new class instance + * + * @todo add more documentation + * + * @method create + * @memberof Proton#Proton.Pool + * + * @param {Object|Function} target any Object or Function + * @param {Object} [params] just add if `target` is a function + * + * @return {Object} + */ - addXY : function(a, b) { + }, { + key: 'createOrClone', + value: function createOrClone(target, params) { + this.total++; - this.x += a; - this.y += b; + if (this.create) { + return this.create(target, params); + } else if (typeof target == "function") { + return Util.classApply(target, params); + } else { + return target.clone(); + } + } - return this; + /** + * @todo add description - what is in the cache? + * + * @method getCount + * @memberof Proton#Proton.Pool + * + * @return {Number} + */ - }, + }, { + key: 'getCount', + value: function getCount() { + var count = 0; - addVectors : function(a, b) { + for (var id in this.cache) { + count += this.cache[id].length; + }return count++; + } - this.x = a.x + b.x; - this.y = a.y + b.y; + /** + * Destroyes all items from Pool.cache + * + * @method destroy + * @memberof Proton#Proton.Pool + */ - return this; + }, { + key: 'destroy', + value: function destroy() { + for (var id in this.cache) { + this.cache[id].length = 0; + delete this.cache[id]; + } + } - }, + /** + * Returns Pool.cache + * + * @method getCache + * @memberof Proton#Proton.Pool + * @private + * + * @param {Number} uid the unique id + * + * @return {Object} + */ - addScalar : function(s) { + }, { + key: 'getCache', + value: function getCache(uid) { + uid = uid || "default"; - this.x += s; - this.y += s; + if (!this.cache[uid]) this.cache[uid] = []; + return this.cache[uid]; + } + }]); + return Pool; +}(); - return this; +var Stats = function () { + function Stats(proton) { + classCallCheck(this, Stats); - }, + this.proton = proton; + this.container = null; + this.type = 1; - sub : function(v, w) { + this.emitterIndex = 0; + this.rendererIndex = 0; + } - if (w !== undefined) { - return this.subVectors(v, w); + createClass(Stats, [{ + key: "update", + value: function update(style, body) { + this.add(style, body); + + var emitter = this.getEmitter(); + var renderer = this.getRenderer(); + var str = ""; + + switch (this.type) { + case 2: + str += "emitter:" + this.proton.emitters.length + "
"; + if (emitter) str += "em speed:" + emitter.emitSpeed + "
"; + if (emitter) str += "pos:" + this.getEmitterPos(emitter); + break; + + case 3: + if (emitter) str += "initializes:" + emitter.initializes.length + "
"; + if (emitter) str += "" + this.concatArr(emitter.initializes) + "
"; + if (emitter) str += "behaviours:" + emitter.behaviours.length + "
"; + if (emitter) str += "" + this.concatArr(emitter.behaviours) + "
"; + break; + + case 4: + if (renderer) str += renderer.name + "
"; + if (renderer) str += "body:" + this.getCreatedNumber(renderer) + "
"; + break; + + default: + str += "particles:" + this.proton.getCount() + "
"; + str += "pool:" + this.proton.pool.getCount() + "
"; + str += "total:" + this.proton.pool.total; + } - } + this.container.innerHTML = str; + } + }, { + key: "add", + value: function add(style, body) { + var _this = this; + + if (!this.container) { + this.type = 1; + + this.container = document.createElement('div'); + this.container.style.cssText = ['position:absolute;bottom:0px;left:0;cursor:pointer;', 'opacity:0.9;z-index:10000;padding:10px;font-size:12px;', 'width:120px;height:50px;background-color:#002;color:#0ff;'].join(''); + + this.container.addEventListener('click', function (e) { + _this.type++; + if (_this.type > 4) _this.type = 1; + }, false); + + var bg = void 0, + color = void 0; + switch (style) { + case 2: + bg = "#201"; + color = "#f08"; + break; + + case 3: + bg = "#020"; + color = "#0f0"; + break; + + default: + bg = "#002"; + color = "#0ff"; + } - this.x -= v.x; - this.y -= v.y; + this.container.style["background-color"] = bg; + this.container.style["color"] = color; + } - return this; + if (!this.container.parentNode) { + body = body || this.body || document.body; + body.appendChild(this.container); + } + } + }, { + key: "getEmitter", + value: function getEmitter() { + return this.proton.emitters[this.emitterIndex]; + } + }, { + key: "getRenderer", + value: function getRenderer() { + return this.proton.renderers[this.rendererIndex]; + } + }, { + key: "concatArr", + value: function concatArr(arr) { + var result = ''; + if (!arr || !arr.length) return result; - }, + for (var i = 0; i < arr.length; i++) { + result += (arr[i].name || '').substr(0, 1) + '.'; + } - subVectors : function(a, b) { + return result; + } + }, { + key: "getCreatedNumber", + value: function getCreatedNumber(renderer) { + return renderer.pool.total || renderer.cpool && renderer.cpool.total || 0; + } + }, { + key: "getEmitterPos", + value: function getEmitterPos(e) { + return Math.round(e.p.x) + "," + Math.round(e.p.y); + } + }]); + return Stats; +}(); - this.x = a.x - b.x; - this.y = a.y - b.y; +/* + * EventDispatcher + * This code reference since http://createjs.com/. + * + **/ - return this; +var EventDispatcher = function () { + function EventDispatcher() { + classCallCheck(this, EventDispatcher); - }, + this._listeners = null; + } - multiplyScalar : function(s) { + createClass(EventDispatcher, [{ + key: "addEventListener", + value: function addEventListener(type, listener) { + if (!this._listeners) { + this._listeners = {}; + } else { + this.removeEventListener(type, listener); + } - this.x *= s; - this.y *= s; + if (!this._listeners[type]) this._listeners[type] = []; + this._listeners[type].push(listener); - return this; + return listener; + } + }, { + key: "removeEventListener", + value: function removeEventListener(type, listener) { + if (!this._listeners) return; + if (!this._listeners[type]) return; - }, + var arr = this._listeners[type]; + var length = arr.length; - divideScalar : function(s) { + for (var i = 0; i < length; i++) { + if (arr[i] == listener) { + if (length == 1) { + delete this._listeners[type]; + } - if (s !== 0) { + // allows for faster checks. + else { + arr.splice(i, 1); + } - this.x /= s; - this.y /= s; + break; + } + } + } + }, { + key: "removeAllEventListeners", + value: function removeAllEventListeners(type) { + if (!type) this._listeners = null;else if (this._listeners) delete this._listeners[type]; + } + }, { + key: "dispatchEvent", + value: function dispatchEvent(type, args) { + var result = false; + var listeners = this._listeners; + + if (type && listeners) { + var arr = listeners[type]; + if (!arr) return result; + + //arr = arr.slice(); + // to avoid issues with items being removed or added during the dispatch + + var handler = void 0; + var i = arr.length; + while (i--) { + handler = arr[i]; + result = result || handler(args); + } + } - } else { + return !!result; + } + }, { + key: "hasEventListener", + value: function hasEventListener(type) { + var listeners = this._listeners; + return !!(listeners && listeners[type]); + } + }], [{ + key: "bind", + value: function bind(TargetClass) { + TargetClass.prototype.dispatchEvent = EventDispatcher.prototype.dispatchEvent; + TargetClass.prototype.hasEventListener = EventDispatcher.prototype.hasEventListener; + TargetClass.prototype.addEventListener = EventDispatcher.prototype.addEventListener; + TargetClass.prototype.removeEventListener = EventDispatcher.prototype.removeEventListener; + TargetClass.prototype.removeAllEventListeners = EventDispatcher.prototype.removeAllEventListeners; + } + }]); + return EventDispatcher; +}(); - this.set(0, 0); +var Integration = function () { + function Integration(type) { + classCallCheck(this, Integration); - } + this.type = type; + } - return this; + createClass(Integration, [{ + key: 'calculate', + value: function calculate(particles, time, damping) { + this.eulerIntegrate(particles, time, damping); + } - }, + // Euler Integrate - min : function(v) { + }, { + key: 'eulerIntegrate', + value: function eulerIntegrate(particle, time, damping) { + if (!particle.sleep) { + particle.old.p.copy(particle.p); + particle.old.v.copy(particle.v); - if (this.x > v.x) { + particle.a.multiplyScalar(1 / particle.mass); + particle.v.add(particle.a.multiplyScalar(time)); + particle.p.add(particle.old.v.multiplyScalar(time)); - this.x = v.x; + if (damping) particle.v.multiplyScalar(damping); + particle.a.clear(); } + } + }]); + return Integration; +}(); - if (this.y > v.y) { - - this.y = v.y; - - } +var Proton$1 = function () { - return this; + /** + * The constructor to add emitters + * + * @constructor Proton + * + * @todo proParticleCount is not in use + * @todo add more documentation of the single properties and parameters + * + * @param {Number} [proParticleCount] not in use? + * @param {Number} [integrationType=Proton.EULER] + * + * @property {String} [integrationType=Proton.EULER] + * @property {Array} emitters All added emitter + * @property {Array} renderers All added renderer + * @property {Number} time The active time + * @property {Number} oldtime The old time + */ + function Proton(integrationType) { + classCallCheck(this, Proton); - }, - max : function(v) { + this.emitters = []; + this.renderers = []; - if (this.x < v.x) { + this.time = 0; + this.oldTime = 0; + this.elapsed = 0; - this.x = v.x; + this.stats = new Stats(this); + this.pool = new Pool(80); - } + this.integrationType = Util.initValue(integrationType, Proton.EULER); + this.integrator = new Integration(this.integrationType); + } - if (this.y < v.y) { + /** + * add a type of Renderer + * + * @method addRenderer + * @memberof Proton + * @instance + * + * @param {Renderer} render + */ - this.y = v.y; - } + //1:100 - return this; - }, + createClass(Proton, [{ + key: 'addRenderer', + value: function addRenderer(render) { + render.init(this); + this.renderers.push(render); + } - negate : function() { + /** + * @name add a type of Renderer + * + * @method addRenderer + * @param {Renderer} render + */ + + }, { + key: 'removeRenderer', + value: function removeRenderer(render) { + var index = this.renderers.indexOf(render); + this.renderers.splice(index, 1); + render.remove(this); + } - return this.multiplyScalar(-1); + /** + * add the Emitter + * + * @method addEmitter + * @memberof Proton + * @instance + * + * @param {Emitter} emitter + */ - }, + }, { + key: 'addEmitter', + value: function addEmitter(emitter) { + this.emitters.push(emitter); + emitter.parent = this; - dot : function(v) { + this.dispatchEvent(Proton.EMITTER_ADDED, emitter); + } - return this.x * v.x + this.y * v.y; + /** + * Removes an Emitter + * + * @method removeEmitter + * @memberof Proton + * @instance + * + * @param {Proton.Emitter} emitter + */ - }, + }, { + key: 'removeEmitter', + value: function removeEmitter(emitter) { + var index = this.emitters.indexOf(emitter); + this.emitters.splice(index, 1); + emitter.parent = null; - lengthSq : function() { + this.dispatchEvent(Proton.EMITTER_REMOVED, emitter); + } - return this.x * this.x + this.y * this.y; + /** + * Updates all added emitters + * + * @method update + * @memberof Proton + * @instance + */ - }, + }, { + key: 'update', + value: function update() { + this.dispatchEvent(Proton.PROTON_UPDATE); - length : function() { + if (Proton.USE_CLOCK) { + if (!this.oldTime) this.oldTime = new Date().getTime(); - return Math.sqrt(this.x * this.x + this.y * this.y); + var time = new Date().getTime(); + this.elapsed = (time - this.oldTime) / 1000; + Proton.amendChangeTabsBug && this.amendChangeTabsBug(); - }, + this.oldTime = time; + } else { + this.elapsed = 0.0167; + } - normalize : function() { + // emitter update + if (this.elapsed > 0) this.emittersUpdate(this.elapsed); - return this.divideScalar(this.length()); + this.dispatchEvent(Proton.PROTON_UPDATE_AFTER); + } + }, { + key: 'emittersUpdate', + value: function emittersUpdate(elapsed) { + var i = this.emitters.length; + while (i--) { + this.emitters[i].update(elapsed); + } + } - }, + /** + * @todo add description + * + * @method amendChangeTabsBug + * @memberof Proton + * @instance + */ - distanceTo : function(v) { + }, { + key: 'amendChangeTabsBug', + value: function amendChangeTabsBug() { + if (this.elapsed > .5) { + this.oldTime = new Date().getTime(); + this.elapsed = 0; + } + } - return Math.sqrt(this.distanceToSquared(v)); + /** + * Counts all particles from all emitters + * + * @method getCount + * @memberof Proton + * @instance + */ - }, + }, { + key: 'getCount', + value: function getCount() { + var total = 0; + var i = this.emitters.length; - rotate : function(tha) { - var x = this.x; - var y = this.y; - this.x = x * Math.cos(tha) + y * Math.sin(tha); - this.y = -x * Math.sin(tha) + y * Math.cos(tha); - return this; - }, + while (i--) { + total += this.emitters[i].particles.length; + }return total; + } + }, { + key: 'getAllParticles', + value: function getAllParticles() { + var particles = []; + var i = this.emitters.length; - distanceToSquared : function(v) { + while (i--) { + particles = particles.concat(this.emitters[i].particles); + }return particles; + } - var dx = this.x - v.x, dy = this.y - v.y; - return dx * dx + dy * dy; + /** + * Destroys everything related to this Proton instance. This includes all emitters, and all properties + * + * @method destroy + * @memberof Proton + * @instance + */ - }, + }, { + key: 'destroy', + value: function destroy() { + Util.destroy(this.renderers, this.getAllParticles()); + Util.destroy(this.emitters); - setLength : function(l) { + this.time = 0; + this.oldTime = 0; - var oldLength = this.length(); + this.pool.destroy(); + } + }]); + return Proton; +}(); + +Proton$1.USE_CLOCK = false; +Proton$1.MEASURE = 100; +Proton$1.EULER = 'euler'; +Proton$1.RK2 = 'runge-kutta2'; +Proton$1.PARTICLE_CREATED = 'PARTICLE_CREATED'; +Proton$1.PARTICLE_UPDATE = 'PARTICLE_UPDATE'; +Proton$1.PARTICLE_SLEEP = 'PARTICLE_SLEEP'; +Proton$1.PARTICLE_DEAD = 'PARTICLE_DEAD'; +Proton$1.PROTON_UPDATE = 'PROTON_UPDATE'; +Proton$1.PROTON_UPDATE_AFTER = 'PROTON_UPDATE_AFTER'; +Proton$1.EMITTER_ADDED = 'EMITTER_ADDED'; +Proton$1.EMITTER_REMOVED = 'EMITTER_REMOVED'; +Proton$1.amendChangeTabsBug = true; +Proton$1.bindEmtterEvent = false; +EventDispatcher.bind(Proton$1); + +var ease = { + easeLinear: function easeLinear(value) { + return value; + }, + easeInQuad: function easeInQuad(value) { + return Math.pow(value, 2); + }, + easeOutQuad: function easeOutQuad(value) { + return -(Math.pow(value - 1, 2) - 1); + }, + easeInOutQuad: function easeInOutQuad(value) { + if ((value /= 0.5) < 1) return 0.5 * Math.pow(value, 2); + + return -0.5 * ((value -= 2) * value - 2); + }, + easeInCubic: function easeInCubic(value) { + return Math.pow(value, 3); + }, + easeOutCubic: function easeOutCubic(value) { + return Math.pow(value - 1, 3) + 1; + }, + easeInOutCubic: function easeInOutCubic(value) { + if ((value /= 0.5) < 1) return 0.5 * Math.pow(value, 3); + + return 0.5 * (Math.pow(value - 2, 3) + 2); + }, + easeInQuart: function easeInQuart(value) { + return Math.pow(value, 4); + }, + easeOutQuart: function easeOutQuart(value) { + return -(Math.pow(value - 1, 4) - 1); + }, + easeInOutQuart: function easeInOutQuart(value) { + if ((value /= 0.5) < 1) return 0.5 * Math.pow(value, 4); + + return -0.5 * ((value -= 2) * Math.pow(value, 3) - 2); + }, + easeInSine: function easeInSine(value) { + return -Math.cos(value * MathUtils.PI_2) + 1; + }, + easeOutSine: function easeOutSine(value) { + return Math.sin(value * MathUtils.PI_2); + }, + easeInOutSine: function easeInOutSine(value) { + return -0.5 * (Math.cos(MathUtils.PI * value) - 1); + }, + easeInExpo: function easeInExpo(value) { + return value === 0 ? 0 : Math.pow(2, 10 * (value - 1)); + }, + easeOutExpo: function easeOutExpo(value) { + return value === 1 ? 1 : -Math.pow(2, -10 * value) + 1; + }, + easeInOutExpo: function easeInOutExpo(value) { + if (value === 0) return 0; + + if (value === 1) return 1; + + if ((value /= 0.5) < 1) return 0.5 * Math.pow(2, 10 * (value - 1)); + + return 0.5 * (-Math.pow(2, -10 * --value) + 2); + }, + easeInCirc: function easeInCirc(value) { + return -(Math.sqrt(1 - value * value) - 1); + }, + easeOutCirc: function easeOutCirc(value) { + return Math.sqrt(1 - Math.pow(value - 1, 2)); + }, + easeInOutCirc: function easeInOutCirc(value) { + if ((value /= 0.5) < 1) return -0.5 * (Math.sqrt(1 - value * value) - 1); + return 0.5 * (Math.sqrt(1 - (value -= 2) * value) + 1); + }, + easeInBack: function easeInBack(value) { + var s = 1.70158; + return value * value * ((s + 1) * value - s); + }, + easeOutBack: function easeOutBack(value) { + var s = 1.70158; + return (value = value - 1) * value * ((s + 1) * value + s) + 1; + }, + easeInOutBack: function easeInOutBack(value) { + var s = 1.70158; + if ((value /= 0.5) < 1) return 0.5 * (value * value * (((s *= 1.525) + 1) * value - s)); + return 0.5 * ((value -= 2) * value * (((s *= 1.525) + 1) * value + s) + 2); + }, + getEasing: function getEasing(ease) { + if (typeof ease === 'function') return ease;else return this[ease] || this.easeLinear; + } +}; - if (oldLength !== 0 && l !== oldLength) { +var Particle = function () { - this.multiplyScalar(l / oldLength); - } + /** + * the Particle class + * + * @class Proton.Particle + * @constructor + * @param {Object} pObj the parameters object; + * for example {life:3,dead:false} + */ + function Particle(pOBJ) { + classCallCheck(this, Particle); - return this; + /** + * The particle's id; + * @property id + * @type {string} + */ + this.id = 'particle_' + Particle.ID++; + this.reset('init'); - }, + pOBJ && Util.setPrototypeByObject(this, pOBJ); + } - lerp : function(v, alpha) { + createClass(Particle, [{ + key: 'getDirection', + value: function getDirection() { + return Math.atan2(this.v.x, -this.v.y) * MathUtils.N180_PI; + } + }, { + key: 'reset', + value: function reset(init) { + this.life = Infinity; + this.age = 0; + + //Energy loss + this.energy = 1; + this.dead = false; + this.sleep = false; + this.body = null; + this.sprite = null; + this.parent = null; + + this.mass = 1; + this.radius = 10; + this.alpha = 1; + this.scale = 1; + this.rotation = 0; + this.color = null; + + this.easing = ease.easeLinear; + + if (init == 'init') { + this.transform = {}; + this.p = new Vector2D(); + this.v = new Vector2D(); + this.a = new Vector2D(); + + this.old = { + p: new Vector2D(), + v: new Vector2D(), + a: new Vector2D() + }; + + this.behaviours = []; + } else { + Util.destroyObject(this.transform, 'rgb'); - this.x += (v.x - this.x ) * alpha; - this.y += (v.y - this.y ) * alpha; + this.p.set(0, 0); + this.v.set(0, 0); + this.a.set(0, 0); - return this; + this.old.p.set(0, 0); + this.old.v.set(0, 0); + this.old.a.set(0, 0); - }, + this.removeAllBehaviours(); + } - equals : function(v) { + if (!this.transform.rgb) { + this.transform.rgb = { r: 255, g: 255, b: 255 }; + } else { + this.transform.rgb.r = 255; + this.transform.rgb.g = 255; + this.transform.rgb.b = 255; + } - return ((v.x === this.x ) && (v.y === this.y ) ); + return this; + } + }, { + key: 'update', + value: function update(time, index) { + if (!this.sleep) { + this.age += time; + this.applyBehaviours(time, index); + } - }, + if (this.age < this.life) { + var scale = this.easing(this.age / this.life); + this.energy = Math.max(1 - scale, 0); + } else { + this.destroy(); + } + } + }, { + key: 'applyBehaviours', + value: function applyBehaviours(time, index) { + var length = this.behaviours.length; + var i = void 0; + + for (i = 0; i < length; i++) { + this.behaviours[i] && this.behaviours[i].applyBehaviour(this, time, index); + } + } + }, { + key: 'addBehaviour', + value: function addBehaviour(behaviour) { + this.behaviours.push(behaviour); - toArray : function() { + if (behaviour.hasOwnProperty('parents')) behaviour.parents.push(this); + behaviour.initialize(this); + } + }, { + key: 'addBehaviours', + value: function addBehaviours(behaviours) { + var length = behaviours.length; + var i = void 0; + + for (i = 0; i < length; i++) { + this.addBehaviour(behaviours[i]); + } + } + }, { + key: 'removeBehaviour', + value: function removeBehaviour(behaviour) { + var index = this.behaviours.indexOf(behaviour); + + if (index > -1) { + var _behaviour = this.behaviours.splice(index, 1); + _behaviour.parents = null; + } + } + }, { + key: 'removeAllBehaviours', + value: function removeAllBehaviours() { + Util.destroyArray(this.behaviours); + } - return [this.x, this.y]; + /** + * Destory this particle + * @method destroy + */ - }, + }, { + key: 'destroy', + value: function destroy() { + this.removeAllBehaviours(); + this.energy = 0; + this.dead = true; + this.parent = null; + } + }]); + return Particle; +}(); - clear : function() { - this.x = 0.0; - this.y = 0.0; - return this; - }, +Particle.ID = 0; - clone : function() { +var ColorUtil = { - return new Proton.Vector2D(this.x, this.y); + /** + * @typedef {Object} rgbObject + * @property {Number} r red value + * @property {Number} g green value + * @property {Number} b blue value + */ + /** + * converts a hex value to a rgb object + * + * @memberof Proton#Proton.Util + * @method hexToRGB + * + * @param {String} h any hex value, e.g. #000000 or 000000 for black + * + * @return {rgbObject} + */ + hexToRGB: function hexToRGB(h) { + var hex16 = h.charAt(0) == "#" ? h.substring(1, 7) : h; + var r = parseInt(hex16.substring(0, 2), 16); + var g = parseInt(hex16.substring(2, 4), 16); + var b = parseInt(hex16.substring(4, 6), 16); - } - }; + return { r: r, g: g, b: b }; + }, - Proton.Vector2D = Vector2D; + /** + * converts a rgb value to a rgb string + * + * @memberof Proton#Proton.Util + * @method rgbToHex + * + * @param {Object | Proton.hexToRGB} rgb a rgb object like in {@link Proton#Proton.} + * + * @return {String} rgb() + */ + rgbToHex: function rgbToHex(rbg) { + return "rgb(" + rbg.r + ", " + rbg.g + ", " + rbg.b + ")"; + }, + getHex16FromParticle: function getHex16FromParticle(p) { + return Number(p.transform.rgb.r) * 65536 + Number(p.transform.rgb.g) * 256 + Number(p.transform.rgb.b); + } +}; +var Polar2D = function () { + function Polar2D(r, tha) { + classCallCheck(this, Polar2D); - var Polar2D = function(r, tha) { this.r = Math.abs(r) || 0; this.tha = tha || 0; } - Polar2D.prototype = { - set : function(r, tha) { - + createClass(Polar2D, [{ + key: 'set', + value: function set$$1(r, tha) { this.r = r; this.tha = tha; return this; - - }, - - setR : function(r) { - + } + }, { + key: 'setR', + value: function setR(r) { this.r = r; return this; - - }, - - setTha : function(tha) { - + } + }, { + key: 'setTha', + value: function setTha(tha) { this.tha = tha; - return this; - - }, - - copy : function(p) { - + } + }, { + key: 'copy', + value: function copy(p) { this.r = p.r; this.tha = p.tha; - return this; - - }, - - toVector : function() { - return new Proton.Vector2D(this.getX(), this.getY()); - }, - - getX : function() { + } + }, { + key: 'toVector', + value: function toVector() { + return new Vector2D(this.getX(), this.getY()); + } + }, { + key: 'getX', + value: function getX() { return this.r * Math.sin(this.tha); - }, - - getY : function() { + } + }, { + key: 'getY', + value: function getY() { return -this.r * Math.cos(this.tha); - }, - - normalize : function() { - + } + }, { + key: 'normalize', + value: function normalize() { this.r = 1; return this; - }, - - equals : function(v) { - - return ((v.r === this.r ) && (v.tha === this.tha ) ); - - }, - - toArray : function() { - - return [this.r, this.tha]; - - }, - - clear : function() { + } + }, { + key: 'equals', + value: function equals(v) { + return v.r === this.r && v.tha === this.tha; + } + }, { + key: 'clear', + value: function clear() { this.r = 0.0; this.tha = 0.0; return this; - }, - - clone : function() { - - return new Proton.Polar2D(this.r, this.tha); - - } - }; - - Proton.Polar2D = Polar2D; - - - - function Span(a, b, center) { - this.isArray = false; - - if (Proton.Util.isArray(a)) { - this.isArray = true; - this.a = a; - } else { - this.a = Proton.Util.initValue(a, 1); - this.b = Proton.Util.initValue(b, this.a); - this.center = Proton.Util.initValue(center, false); - } - } - - - Span.prototype = { - getValue : function(INT) { - if (this.isArray) { - return this.a[Math.floor(this.a.length * Math.random())]; - } else { - if (!this.center) - return Proton.MathUtils.randomAToB(this.a, this.b, INT); - else - return Proton.MathUtils.randomFloating(this.a, this.b, INT); - } } - } - - Proton.Span = Span; - Proton.getSpan = function(a, b, center) { - return new Proton.Span(a, b, center); - } - - - - function ColorSpan(color) { - if (Proton.Util.isArray(color)) { - this.colorArr = color; - } else { - this.colorArr = [color]; + }, { + key: 'clone', + value: function clone() { + return new Polar2D(this.r, this.tha); } - } - + }]); + return Polar2D; +}(); + +var Mat3 = { + create: function create(mat3) { + var mat = new Float32Array(9); + if (mat3) this.set(mat3, mat); + + return mat; + }, + set: function set(mat1, mat2) { + for (var i = 0; i < 9; i++) { + mat2[i] = mat1[i]; + }return mat2; + }, + multiply: function multiply(mat, mat2, mat3) { + var a00 = mat[0], + a01 = mat[1], + a02 = mat[2], + a10 = mat[3], + a11 = mat[4], + a20 = mat[6], + a21 = mat[7], + b00 = mat2[0], + b01 = mat2[1], + b02 = mat2[2], + b10 = mat2[3], + b11 = mat2[4], + b20 = mat2[6], + b21 = mat2[7]; + + mat3[0] = b00 * a00 + b01 * a10; + mat3[1] = b00 * a01 + b01 * a11; + mat3[2] = a02 * b02; + mat3[3] = b10 * a00 + b11 * a10; + mat3[4] = b10 * a01 + b11 * a11; + mat3[6] = b20 * a00 + b21 * a10 + a20; + mat3[7] = b20 * a01 + b21 * a11 + a21; + + return mat3; + }, + inverse: function inverse(mat, mat3) { + var a00 = mat[0], + a01 = mat[1], + a10 = mat[3], + a11 = mat[4], + a20 = mat[6], + a21 = mat[7], + b01 = a11, + b11 = -a10, + b21 = a21 * a10 - a11 * a20, + d = a00 * b01 + a01 * b11, + id = void 0; + + id = 1 / d; + mat3[0] = b01 * id; + mat3[1] = -a01 * id; + mat3[3] = b11 * id; + mat3[4] = a00 * id; + mat3[6] = b21 * id; + mat3[7] = (-a21 * a00 + a01 * a20) * id; + + return mat3; + }, + multiplyVec2: function multiplyVec2(m, vec, mat3) { + var x = vec[0], + y = vec[1]; + + mat3[0] = x * m[0] + y * m[3] + m[6]; + mat3[1] = x * m[1] + y * m[4] + m[7]; + + return mat3; + } +}; + +var ArraySpan = function (_Span) { + inherits(ArraySpan, _Span); + + function ArraySpan(color) { + classCallCheck(this, ArraySpan); + + var _this = possibleConstructorReturn(this, (ArraySpan.__proto__ || Object.getPrototypeOf(ArraySpan)).call(this)); + + _this._arr = Util.isArray(color) ? color : [color]; + return _this; + } - Proton.Util.inherits(ColorSpan, Proton.Span); - ColorSpan.prototype.getValue = function() { - var color = this.colorArr[Math.floor(this.colorArr.length * Math.random())]; - if (color == 'random' || color == 'Random') - return Proton.MathUtils.randomColor(); - else - return color; - } + createClass(ArraySpan, [{ + key: 'getValue', + value: function getValue() { + var color = this._arr[Math.floor(this._arr.length * Math.random())]; + return color === 'random' || color === 'Random' ? MathUtils.randomColor() : color; + } - Proton.ColorSpan = ColorSpan; + /** + * Make sure that the color is an instance of Proton.ArraySpan, if not it makes a new instance + * + * @method setSpanValue + * @memberof Proton#Proton.Color + * @instance + * + * @param {Proton.Particle} particle + * @param {Number} the integrate time 1/ms + * @param {Int} the particle index + */ + }], [{ + key: 'createArraySpan', + value: function createArraySpan(arr) { + if (!arr) return null; + if (arr instanceof ArraySpan) return arr;else return new ArraySpan(arr); + } + }]); + return ArraySpan; +}(Span); +var Rectangle = function () { function Rectangle(x, y, w, h) { + classCallCheck(this, Rectangle); + this.x = x; this.y = y; + this.width = w; this.height = h; + this.bottom = this.y + this.height; this.right = this.x + this.width; } - - Rectangle.prototype = { - contains : function(x, y) { - if (x <= this.right && x >= this.x && y <= this.bottom && y >= this.y) - return true - else - return false - } - } - - Proton.Rectangle = Rectangle; - - - - var Mat3 = Mat3 || { - create : function(mat3) { - var mat = new Float32Array(9); - if (mat3) - this.set(mat3, mat); - return mat; - }, - set : function(mat1, mat2) { - for (var i = 0; i < 9; i++) - mat2[i] = mat1[i]; - return mat2; - }, - multiply : function(mat, mat2, mat3) { - var a00 = mat[0], a01 = mat[1], a02 = mat[2], a10 = mat[3], a11 = mat[4], a20 = mat[6], a21 = mat[7], b00 = mat2[0], b01 = mat2[1], b02 = mat2[2], b10 = mat2[3], b11 = mat2[4], b20 = mat2[6], b21 = mat2[7]; - - mat3[0] = b00 * a00 + b01 * a10; - mat3[1] = b00 * a01 + b01 * a11; - mat3[2] = a02 * b02; - mat3[3] = b10 * a00 + b11 * a10; - mat3[4] = b10 * a01 + b11 * a11; - mat3[6] = b20 * a00 + b21 * a10 + a20; - mat3[7] = b20 * a01 + b21 * a11 + a21; - return mat3; - }, - inverse : function(mat, mat3) { - var a00 = mat[0], a01 = mat[1], a10 = mat[3], a11 = mat[4], a20 = mat[6], a21 = mat[7], b01 = a11, b11 = -a10, b21 = a21 * a10 - a11 * a20, d = a00 * b01 + a01 * b11, id; - id = 1 / d; - mat3[0] = b01 * id; - mat3[1] = (-a01 ) * id; - mat3[3] = b11 * id; - mat3[4] = a00 * id; - mat3[6] = b21 * id; - mat3[7] = (-a21 * a00 + a01 * a20) * id; - return mat3; - }, - multiplyVec2 : function(m, vec, mat3) { - var x = vec[0], y = vec[1]; - mat3[0] = x * m[0] + y * m[3] + m[6]; - mat3[1] = x * m[1] + y * m[4] + m[7]; - return mat3; + createClass(Rectangle, [{ + key: "contains", + value: function contains(x, y) { + if (x <= this.right && x >= this.x && y <= this.bottom && y >= this.y) return true;else return false; } - } - - Proton.Mat3 = Mat3; - + }]); + return Rectangle; +}(); - - Behaviour.id = 0; +var Rate = function () { /** - * The Behaviour class is the base for the other Behaviour - * - * @memberof! - - * @interface - * @alias Proton.Behaviour - * - * @param {Number} life the behaviours life - * @param {String} easing The behaviour's decaying trend, for example Proton.easeOutQuart - * - * @property {String} id The behaviours id - * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=Proton.easeLinear] this behaviour's easing - * @property {Number} age=0 How long the particle should be 'alife' - * @property {Number} energy=1 - * @property {Boolean} dead=false The particle is dead at first - * @property {Array} parents The behaviour's parents array - * @property {String} name The behaviour name - */ - function Behaviour(life, easing) { - this.id = 'Behaviour_' + Behaviour.id++; - this.life = Proton.Util.initValue(life, Infinity); - this.easing = Proton.ease.setEasingByName(easing); - this.age = 0; - this.energy = 1; - this.dead = false; - this.parents = []; - this.name = 'Behaviour'; - } - - - Behaviour.prototype = { - /** - * Reset this behaviour's parameters - * - * @method reset - * @memberof Proton.Behaviour - * @instance - * - * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=easeLinear] this behaviour's easing - */ - reset : function(life, easing) { - this.life = Proton.Util.initValue(life, Infinity); - this.easing = Proton.Util.initValue(easing, Proton.ease.setEasingByName(Proton.easeLinear)); - }, - /** - * Normalize a force by 1:100; - * - * @method normalizeForce - * @memberof Proton.Behaviour - * @instance - * - * @param {Proton.Vector2D} force - */ - normalizeForce : function(force) { - return force.multiplyScalar(Proton.MEASURE); - }, - - /** - * Normalize a value by 1:100; - * - * @method normalizeValue - * @memberof Proton.Behaviour - * @instance - * - * @param {Number} value - */ - normalizeValue : function(value) { - return value * Proton.MEASURE; - }, - - /** - * Initialize the behaviour's parameters for all particles - * - * @method initialize - * @memberof Proton.Behaviour - * @instance - * - * @param {Proton.Particle} particle - */ - initialize : function(particle) { - }, - - /** - * Apply this behaviour for all particles every time - * - * @method applyBehaviour - * @memberof Proton.Behaviour - * @instance - * - * @param {Proton.Particle} particle - * @param {Number} time the integrate time 1/ms - * @param {Int} index the particle index - */ - applyBehaviour : function(particle, time, index) { - this.age += time; - if (this.age >= this.life || this.dead) { - this.energy = 0; - this.dead = true; - this.destroy(); - } else { - var scale = this.easing(particle.age / particle.life); - this.energy = Math.max(1 - scale, 0); - } - }, - - /** - * Destory this behaviour - * - * @method destroy - * @memberof Proton.Behaviour - * @instance - */ - destroy : function() { - var index; - var length = this.parents.length, i; - for ( i = 0; i < length; i++) { - this.parents[i].removeBehaviour(this); - } - - this.parents = []; - } - }; - - Proton.Behaviour = Behaviour; - + * The number of particles per second emission (a [particle]/b [s]); + * @namespace + * @memberof! Proton# + * @constructor + * @alias Rate + * + * @param {Array | Number | Span} numpan the number of each emission; + * @param {Array | Number | Span} timepan the time of each emission; + * for example: new Rate(new Span(10, 20), new Span(.1, .25)); + */ + function Rate(numpan, timepan) { + classCallCheck(this, Rate); + this.numPan = Util.setSpanValue(Util.initValue(numpan, 1)); + this.timePan = Util.setSpanValue(Util.initValue(timepan, 1)); - /** - * The number of particles per second emission (a [particle]/b [s]); - * @namespace - * @memberof! Proton# - * @constructor - * @alias Proton.Rate - * - * @param {Array | Number | Proton.Span} numpan the number of each emission; - * @param {Array | Number | Proton.Span} timepan the time of each emission; - * for example: new Proton.Rate(new Proton.Span(10, 20), new Proton.Span(.1, .25)); - */ - function Rate(numpan, timepan) { - this.numPan = Proton.Util.initValue(numpan, 1); - this.timePan = Proton.Util.initValue(timepan, 1); - this.numPan = Proton.Util.setSpanValue(this.numPan); - this.timePan = Proton.Util.setSpanValue(this.timePan); this.startTime = 0; this.nextTime = 0; this.init(); } - - Rate.prototype = { - /** - * @method init - * @memberof Proton#Proton.Rate - * @instance - */ - init : function() { + createClass(Rate, [{ + key: 'init', + value: function init() { this.startTime = 0; this.nextTime = this.timePan.getValue(); - }, - - getValue : function(time) { + } + }, { + key: 'getValue', + value: function getValue(time) { this.startTime += time; + if (this.startTime >= this.nextTime) { this.startTime = 0; this.nextTime = this.timePan.getValue(); + if (this.numPan.b == 1) { - if (this.numPan.getValue(false) > 0.5) - return 1; - else - return 0; + if (this.numPan.getValue(false) > 0.5) return 1;else return 0; } else { return this.numPan.getValue(true); } } + return 0; } + }]); + return Rate; +}(); + +var Initialize = function () { + function Initialize() { + classCallCheck(this, Initialize); + } + + createClass(Initialize, [{ + key: "reset", + value: function reset() {} + }, { + key: "init", + value: function init(emitter, particle) { + if (particle) { + this.initialize(particle); + } else { + this.initialize(emitter); + } + } + }, { + key: "initialize", + + + ///sub class init + value: function initialize(target) {} + }]); + return Initialize; +}(); + +var Life = function (_Initialize) { + inherits(Life, _Initialize); + + function Life(a, b, c) { + classCallCheck(this, Life); + + var _this = possibleConstructorReturn(this, (Life.__proto__ || Object.getPrototypeOf(Life)).call(this)); + + _this.lifePan = Util.setSpanValue(a, b, c); + _this.name = 'Life'; + return _this; + } + + createClass(Life, [{ + key: 'initialize', + value: function initialize(target) { + if (this.lifePan.a == Infinity) target.life = Infinity;else target.life = this.lifePan.getValue(); + } + }]); + return Life; +}(Initialize); + +var Zone = function () { + function Zone() { + classCallCheck(this, Zone); + + this.vector = new Vector2D(0, 0); + this.random = 0; + this.crossType = "dead"; + this.alert = true; } - Proton.Rate = Rate; + createClass(Zone, [{ + key: "getPosition", + value: function getPosition() {} + }, { + key: "crossing", + value: function crossing(particle) {} + }]); + return Zone; +}(); +var PointZone = function (_Zone) { + inherits(PointZone, _Zone); + function PointZone(x, y) { + classCallCheck(this, PointZone); - function Initialize() { + var _this = possibleConstructorReturn(this, (PointZone.__proto__ || Object.getPrototypeOf(PointZone)).call(this)); + _this.x = x; + _this.y = y; + return _this; } + createClass(PointZone, [{ + key: 'getPosition', + value: function getPosition() { + this.vector.x = this.x; + this.vector.y = this.y; - Initialize.prototype.reset = function() { - - } + return this.vector; + } + }, { + key: 'crossing', + value: function crossing(particle) { - Initialize.prototype.init = function(emitter, particle) { - if (particle) { - this.initialize(particle); - } else { - this.initialize(emitter); + if (this.alert) { + alert('Sorry PointZone does not support crossing method'); + this.alert = false; + } } - }; + }]); + return PointZone; +}(Zone); - ///sub class init - Initialize.prototype.initialize = function(target) { - }; +var Position = function (_Initialize) { + inherits(Position, _Initialize); - Proton.Initialize = Initialize; + function Position(zone) { + classCallCheck(this, Position); + var _this = possibleConstructorReturn(this, (Position.__proto__ || Object.getPrototypeOf(Position)).call(this)); + _this.zone = Util.initValue(zone, new PointZone()); - var InitializeUtil = { + _this.name = 'Position'; + return _this; + } - initialize : function(emitter, particle, initializes) { - var length = initializes.length, i; - for ( i = 0; i < length; i++) { - if (initializes[i] instanceof Proton.Initialize) - initializes[i].init(emitter, particle); - else - Proton.InitializeUtil.init(emitter, particle, initializes[i]); - } + createClass(Position, [{ + key: 'reset', + value: function reset(zone) { + this.zone = Util.initValue(zone, new PointZone()); + } + }, { + key: 'initialize', + value: function initialize(target) { + this.zone.getPosition(); - Proton.InitializeUtil.bindEmitter(emitter, particle); - }, - - //////////////////////init////////////////////// - init : function(emitter, particle, initialize) { - Proton.Util.setPrototypeByObject(particle, initialize); - Proton.Util.setVector2DByObject(particle, initialize); - }, - - bindEmitter : function(emitter, particle) { - if (emitter.bindEmitter) { - particle.p.add(emitter.p); - particle.v.add(emitter.v); - particle.a.add(emitter.a); - particle.v.rotate(Proton.MathUtils.degreeTransform(emitter.rotation)); - } + target.p.x = this.zone.vector.x; + target.p.y = this.zone.vector.y; } - //////////////////////init////////////////////// - } + }]); + return Position; +}(Initialize); - Proton.InitializeUtil = InitializeUtil; +var Velocity = function (_Initialize) { + inherits(Velocity, _Initialize); + function Velocity(rpan, thapan, type) { + classCallCheck(this, Velocity); + var _this = possibleConstructorReturn(this, (Velocity.__proto__ || Object.getPrototypeOf(Velocity)).call(this)); - function Life(a, b, c) { - Life._super_.call(this); - this.lifePan = Proton.Util.setSpanValue(a, b, c); - } + _this.rPan = Util.setSpanValue(rpan); + _this.thaPan = Util.setSpanValue(thapan); + _this.type = Util.initValue(type, 'vector'); + _this.name = 'Velocity'; + return _this; + } - Proton.Util.inherits(Life, Proton.Initialize); - Life.prototype.initialize = function(target) { - if (this.lifePan.a == Infinity) - target.life = Infinity; - else - target.life = this.lifePan.getValue(); - }; + createClass(Velocity, [{ + key: 'reset', + value: function reset(rpan, thapan, type) { + this.rPan = Util.setSpanValue(rpan); + this.thaPan = Util.setSpanValue(thapan); + this.type = Util.initValue(type, 'vector'); + } + }, { + key: 'normalizeVelocity', + value: function normalizeVelocity(vr) { + return vr * Proton$1.MEASURE; + } + }, { + key: 'initialize', + value: function initialize(target) { + if (this.type == 'p' || this.type == 'P' || this.type == 'polar') { + var polar2d = new Polar2D(this.normalizeVelocity(this.rPan.getValue()), this.thaPan.getValue() * MathUtils.PI_180); + + target.v.x = polar2d.getX(); + target.v.y = polar2d.getY(); + } else { + target.v.x = this.normalizeVelocity(this.rPan.getValue()); + target.v.y = this.normalizeVelocity(this.thaPan.getValue()); + } + } + }]); + return Velocity; +}(Initialize); - Proton.Life = Life; +var Mass = function (_Initialize) { + inherits(Mass, _Initialize); + function Mass(a, b, c) { + classCallCheck(this, Mass); + var _this = possibleConstructorReturn(this, (Mass.__proto__ || Object.getPrototypeOf(Mass)).call(this)); - function Position(zone) { - Position._super_.call(this); - this.zone = Proton.Util.initValue(zone, new Proton.PointZone()); + _this.massPan = Util.setSpanValue(a, b, c); + _this.name = 'Mass'; + return _this; } + createClass(Mass, [{ + key: 'initialize', + value: function initialize(target) { + target.mass = this.massPan.getValue(); + } + }]); + return Mass; +}(Initialize); - Proton.Util.inherits(Position, Proton.Initialize); - Position.prototype.reset = function(zone) { - this.zone = Proton.Util.initValue(zone, new Proton.PointZone()); - }; - - Position.prototype.initialize = function(target) { - this.zone.getPosition(); - target.p.x = this.zone.vector.x; - target.p.y = this.zone.vector.y; - }; +var Radius = function (_Initialize) { + inherits(Radius, _Initialize); - Proton.Position = Position; - Proton.P = Position; + function Radius(a, b, c) { + classCallCheck(this, Radius); + var _this = possibleConstructorReturn(this, (Radius.__proto__ || Object.getPrototypeOf(Radius)).call(this)); + _this.radius = Util.setSpanValue(a, b, c); - //radius and tha - function Velocity(rpan, thapan, type) { - Velocity._super_.call(this); - this.rPan = Proton.Util.setSpanValue(rpan); - this.thaPan = Proton.Util.setSpanValue(thapan); - this.type = Proton.Util.initValue(type, 'vector'); + _this.name = 'Radius'; + return _this; } + createClass(Radius, [{ + key: 'reset', + value: function reset(a, b, c) { + this.radius = Util.setSpanValue(a, b, c); + } + }, { + key: 'initialize', + value: function initialize(particle) { + particle.radius = this.radius.getValue(); + particle.transform.oldRadius = particle.radius; + } + }]); + return Radius; +}(Initialize); + +var Body = function (_Initialize) { + inherits(Body, _Initialize); - Proton.Util.inherits(Velocity, Proton.Initialize); + function Body(image, w, h) { + classCallCheck(this, Body); - Velocity.prototype.reset = function(rpan, thapan, type) { - this.rPan = Proton.Util.setSpanValue(rpan); - this.thaPan = Proton.Util.setSpanValue(thapan); - this.type = Proton.Util.initValue(type, 'vector'); - }; + var _this = possibleConstructorReturn(this, (Body.__proto__ || Object.getPrototypeOf(Body)).call(this)); - Velocity.prototype.normalizeVelocity = function(vr) { - return vr * Proton.MEASURE; - } + _this.image = _this.setSpanValue(image); + _this.w = Util.initValue(w, 20); + _this.h = Util.initValue(h, _this.w); + _this.name = 'Body'; + return _this; + } - Velocity.prototype.initialize = function(target) { - if (this.type == 'p' || this.type == 'P' || this.type == 'polar') { - var polar2d = new Proton.Polar2D(this.normalizeVelocity(this.rPan.getValue()), this.thaPan.getValue() * Math.PI / 180); - target.v.x = polar2d.getX(); - target.v.y = polar2d.getY(); - } else { - target.v.x = this.normalizeVelocity(this.rPan.getValue()); - target.v.y = this.normalizeVelocity(this.thaPan.getValue()); - } - }; + createClass(Body, [{ + key: 'initialize', + value: function initialize(particle) { + var imagetarget = this.image.getValue(); - Proton.Velocity = Velocity; - Proton.V = Velocity; + if (typeof imagetarget == 'string') { + particle.body = { width: this.w, height: this.h, src: imagetarget, isInner: true, inner: true }; + } else { + particle.body = imagetarget; + } + } + }, { + key: 'setSpanValue', + value: function setSpanValue(color) { + return color instanceof ArraySpan ? color : new ArraySpan(color); + } + }]); + return Body; +}(Initialize); +var Behaviour = function () { + /** + * The Behaviour class is the base for the other Behaviour + * + * @memberof! - + * @interface + * @alias Proton.Behaviour + * + * @param {Number} life the behaviours life + * @param {String} easing The behaviour's decaying trend, for example ease.easeOutQuart + * + * @property {String} id The behaviours id + * @param {Number} [life=Infinity] this behaviour's life + * @param {String} [easing=ease.easeLinear] this behaviour's easing + * @property {Number} age=0 How long the particle should be 'alife' + * @property {Number} energy=1 + * @property {Boolean} dead=false The particle is dead at first + * @property {Array} parents The behaviour's parents array + * @property {String} name The behaviour name + */ + function Behaviour(life, easing) { + classCallCheck(this, Behaviour); - function Mass(a, b, c) { - Mass._super_.call(this); - this.massPan = Proton.Util.setSpanValue(a, b, c); - } + this.life = Util.initValue(life, Infinity); + this.easing = ease.getEasing(easing); - Proton.Util.inherits(Mass, Proton.Initialize); - Mass.prototype.initialize = function(target) { - target.mass = this.massPan.getValue(); - }; + this.age = 0; + this.energy = 1; + this.dead = false; + this.parents = []; - Proton.Mass = Mass; + this.id = 'Behaviour_' + Behaviour.id++; + this.name = 'Behaviour'; + } + /** + * Reset this behaviour's parameters + * + * @method reset + * @memberof Proton.Behaviour + * @instance + * + * @param {Number} [life=Infinity] this behaviour's life + * @param {String} [easing=easeLinear] this behaviour's easing + */ - function Radius(a, b, c) { - Radius._super_.call(this); - this.radius = Proton.Util.setSpanValue(a, b, c); - } + createClass(Behaviour, [{ + key: 'reset', + value: function reset(life, easing) { + this.life = Util.initValue(life, Infinity); + this.easing = ease.getEasing(easing); + } + /** + * Normalize a force by 1:100; + * + * @method normalizeForce + * @memberof Proton.Behaviour + * @instance + * + * @param {Proton.Vector2D} force + */ - Proton.Util.inherits(Radius, Proton.Initialize); - Radius.prototype.reset = function(a, b, c) { - this.radius = Proton.Util.setSpanValue(a, b, c); - }; + }, { + key: 'normalizeForce', + value: function normalizeForce(force) { + return force.multiplyScalar(Proton$1.MEASURE); + } - Radius.prototype.initialize = function(particle) { - particle.radius = this.radius.getValue(); - particle.transform.oldRadius = particle.radius; - }; + /** + * Normalize a value by 1:100; + * + * @method normalizeValue + * @memberof Proton.Behaviour + * @instance + * + * @param {Number} value + */ - Proton.Radius = Radius; + }, { + key: 'normalizeValue', + value: function normalizeValue(value) { + return value * Proton$1.MEASURE; + } + /** + * Initialize the behaviour's parameters for all particles + * + * @method initialize + * @memberof Proton.Behaviour + * @instance + * + * @param {Proton.Particle} particle + */ + }, { + key: 'initialize', + value: function initialize(particle) {} - function ImageTarget(image, w, h) { - ImageTarget._super_.call(this); - this.image = this.setSpanValue(image); - this.w = Proton.Util.initValue(w, 20); - this.h = Proton.Util.initValue(h, this.w); - } + /** + * Apply this behaviour for all particles every time + * + * @method applyBehaviour + * @memberof Proton.Behaviour + * @instance + * + * @param {Proton.Particle} particle + * @param {Number} time the integrate time 1/ms + * @param {Int} index the particle index + */ + }, { + key: 'calculate', + value: function calculate(particle, time, index) { + this.age += time; - Proton.Util.inherits(ImageTarget, Proton.Initialize); - ImageTarget.prototype.initialize = function(particle) { - var imagetarget = this.image.getValue(); - if ( typeof (imagetarget) == 'string') { - particle.target = { - width : this.w, - height : this.h, - src : imagetarget - } - } else { - particle.target = imagetarget; - } - }; + if (this.age >= this.life || this.dead) { + this.energy = 0; + this.dead = true; + this.destroy(); + } else { + var scale = this.easing(particle.age / particle.life); + this.energy = Math.max(1 - scale, 0); + } + } - ImageTarget.prototype.setSpanValue = function(color) { - if ( color instanceof Proton.ColorSpan) { - return color; - } else { - return new Proton.ColorSpan(color); - } - } + /** + * Destory this behaviour + * + * @method destroy + * @memberof Proton.Behaviour + * @instance + */ - Proton.ImageTarget = ImageTarget; + }, { + key: 'destroy', + value: function destroy() { + var i = this.parents.length; + while (i--) { + this.parents[i].removeBehaviour(this); + } + this.parents.length = 0; + } + }]); + return Behaviour; +}(); +Behaviour.id = 0; +var Force = function (_Behaviour) { + inherits(Force, _Behaviour); /** - * @memberof! Proton# - * @augments Proton.Behaviour - * @constructor - * @alias Proton.Force - * - * @param {Number} fx - * @param {Number} fy - * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=Proton.easeLinear] this behaviour's easing - * - * @property {String} name The Behaviour name - */ + * @memberof! Proton# + * @augments Proton.Behaviour + * @constructor + * @alias Proton.Force + * + * @param {Number} fx + * @param {Number} fy + * @param {Number} [life=Infinity] this behaviour's life + * @param {String} [easing=ease.easeLinear] this behaviour's easing + * + * @property {String} name The Behaviour name + */ function Force(fx, fy, life, easing) { - Force._super_.call(this, life, easing); - this.force = this.normalizeForce(new Proton.Vector2D(fx, fy)); - this.name = "Force"; - } + classCallCheck(this, Force); + var _this = possibleConstructorReturn(this, (Force.__proto__ || Object.getPrototypeOf(Force)).call(this, life, easing)); - Proton.Util.inherits(Force, Proton.Behaviour); - - /** - * Reset this behaviour's parameters - * - * @method reset - * @memberof Proton#Proton.Force - * @instance - * - * @param {Number} fx - * @param {Number} fy - * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=Proton.easeLinear] this behaviour's easing - */ - Force.prototype.reset = function(fx, fy, life, easing) { - this.force = this.normalizeForce(new Proton.Vector2D(fx, fy)); - if (life) - Force._super_.prototype.reset.call(this, life, easing); + _this.force = _this.normalizeForce(new Vector2D(fx, fy)); + _this.name = "Force"; + return _this; } /** - * Apply this behaviour for all particles every time - * - * @method applyBehaviour - * @memberof Proton#Proton.Force - * @instance - * - * @param {Proton.Particle} particle - * @param {Number} the integrate time 1/ms - * @param {Int} the particle index - */ - Force.prototype.applyBehaviour = function(particle, time, index) { - Force._super_.prototype.applyBehaviour.call(this, particle, time, index); - particle.a.add(this.force); - }; - - Proton.Force = Force; - Proton.F = Force; + * Reset this behaviour's parameters + * + * @method reset + * @memberof Proton#Proton.Force + * @instance + * + * @param {Number} fx + * @param {Number} fy + * @param {Number} [life=Infinity] this behaviour's life + * @param {String} [easing=ease.easeLinear] this behaviour's easing + */ + + + createClass(Force, [{ + key: 'reset', + value: function reset(fx, fy, life, easing) { + this.force = this.normalizeForce(new Vector2D(fx, fy)); + + life && get(Force.prototype.__proto__ || Object.getPrototypeOf(Force.prototype), 'reset', this).call(this, life, easing); + } + /** + * Apply this behaviour for all particles every time + * + * @method applyBehaviour + * @memberof Proton#Proton.Force + * @instance + * + * @param {Proton.Particle} particle + * @param {Number} the integrate time 1/ms + * @param {Int} the particle index + */ + + }, { + key: 'applyBehaviour', + value: function applyBehaviour(particle, time, index) { + this.calculate(particle, time, index); + particle.a.add(this.force); + } + }]); + return Force; +}(Behaviour); +var Attraction = function (_Behaviour) { + inherits(Attraction, _Behaviour); /** - * This behaviour let the particles follow one specific Proton.Vector2D - * - * @memberof! Proton# - * @augments Proton.Behaviour - * @constructor - * @alias Proton.Attraction - * - * @todo add description for 'force' and 'radius' - * - * @param {Proton.Vector2D} targetPosition the attraction point coordinates - * @param {Number} [force=100] - * @param {Number} [radius=1000] - * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=Proton.easeLinear] this behaviour's easing - * - * @property {Proton.Vector2D} targetPosition - * @property {Number} radius - * @property {Number} force - * @property {Number} radiusSq - * @property {Proton.Vector2D} attractionForce - * @property {Number} lengthSq - * @property {String} name The Behaviour name - */ + * This behaviour let the particles follow one specific Proton.Vector2D + * + * @memberof! Proton# + * @augments Proton.Behaviour + * @constructor + * @alias Proton.Attraction + * + * @todo add description for 'force' and 'radius' + * + * @param {Proton.Vector2D} targetPosition the attraction point coordinates + * @param {Number} [force=100] + * @param {Number} [radius=1000] + * @param {Number} [life=Infinity] this behaviour's life + * @param {String} [easing=ease.easeLinear] this behaviour's easing + * + * @property {Proton.Vector2D} targetPosition + * @property {Number} radius + * @property {Number} force + * @property {Number} radiusSq + * @property {Proton.Vector2D} attractionForce + * @property {Number} lengthSq + * @property {String} name The Behaviour name + */ function Attraction(targetPosition, force, radius, life, easing) { - Attraction._super_.call(this, life, easing); - - this.targetPosition = Proton.Util.initValue(targetPosition, new Proton.Vector2D); - this.radius = Proton.Util.initValue(radius, 1000); - this.force = Proton.Util.initValue(this.normalizeValue(force), 100); - this.radiusSq = this.radius * this.radius - this.attractionForce = new Proton.Vector2D(); - this.lengthSq = 0; - this.name = "Attraction"; - } + classCallCheck(this, Attraction); + var _this = possibleConstructorReturn(this, (Attraction.__proto__ || Object.getPrototypeOf(Attraction)).call(this, life, easing)); - Proton.Util.inherits(Attraction, Proton.Behaviour); + _this.targetPosition = Util.initValue(targetPosition, new Vector2D()); + _this.radius = Util.initValue(radius, 1000); + _this.force = Util.initValue(_this.normalizeValue(force), 100); - /** - * Reset this behaviour's parameters - * - * @method reset - * @memberof Proton#Proton.Attraction - * @instance - * - * @todo add description for 'force' and 'radius' - * - * @param {Proton.Vector2D} targetPosition the attraction point coordinates - * @param {Number} [force=100] - * @param {Number} [radius=1000] - * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=Proton.easeLinear] this behaviour's easing - */ - Attraction.prototype.reset = function(targetPosition, force, radius, life, easing) { - this.targetPosition = Proton.Util.initValue(targetPosition, new Proton.Vector2D); - this.radius = Proton.Util.initValue(radius, 1000); - this.force = Proton.Util.initValue(this.normalizeValue(force), 100); - this.radiusSq = this.radius * this.radius - this.attractionForce = new Proton.Vector2D(); - this.lengthSq = 0; - if (life) - Attraction._super_.prototype.reset.call(this, life, easing); + _this.radiusSq = _this.radius * _this.radius; + _this.attractionForce = new Vector2D(); + _this.lengthSq = 0; + + _this.name = "Attraction"; + return _this; } /** - * Apply this behaviour for all particles every time - * - * @memberof Proton#Proton.Attraction - * @method applyBehaviour - * @instance - * - * @param {Proton.Particle} particle - * @param {Number} time the integrate time 1/ms - * @param {Int} index the particle index - */ - Attraction.prototype.applyBehaviour = function(particle, time, index) { - Attraction._super_.prototype.applyBehaviour.call(this, particle, time, index); - this.attractionForce.copy(this.targetPosition); - this.attractionForce.sub(particle.p); - this.lengthSq = this.attractionForce.lengthSq(); - if (this.lengthSq > 0.000004 && this.lengthSq < this.radiusSq) { - this.attractionForce.normalize(); - this.attractionForce.multiplyScalar(1 - this.lengthSq / this.radiusSq); - this.attractionForce.multiplyScalar(this.force); - particle.a.add(this.attractionForce); + * Reset this behaviour's parameters + * + * @method reset + * @memberof Proton#Proton.Attraction + * @instance + * + * @todo add description for 'force' and 'radius' + * + * @param {Proton.Vector2D} targetPosition the attraction point coordinates + * @param {Number} [force=100] + * @param {Number} [radius=1000] + * @param {Number} [life=Infinity] this behaviour's life + * @param {String} [easing=ease.easeLinear] this behaviour's easing + */ + + + createClass(Attraction, [{ + key: 'reset', + value: function reset(targetPosition, force, radius, life, easing) { + this.targetPosition = Util.initValue(targetPosition, new Vector2D()); + this.radius = Util.initValue(radius, 1000); + this.force = Util.initValue(this.normalizeValue(force), 100); + + this.radiusSq = this.radius * this.radius; + this.attractionForce = new Vector2D(); + this.lengthSq = 0; + + life && get(Attraction.prototype.__proto__ || Object.getPrototypeOf(Attraction.prototype), 'reset', this).call(this, life, easing); } - }; - Proton.Attraction = Attraction; + /** + * Apply this behaviour for all particles every time + * + * @memberof Proton#Proton.Attraction + * @method applyBehaviour + * @instance + * + * @param {Proton.Particle} particle + * @param {Number} time the integrate time 1/ms + * @param {Int} index the particle index + */ + + }, { + key: 'applyBehaviour', + value: function applyBehaviour(particle, time, index) { + this.calculate(particle, time, index); + + this.attractionForce.copy(this.targetPosition); + this.attractionForce.sub(particle.p); + this.lengthSq = this.attractionForce.lengthSq(); + + if (this.lengthSq > 0.000004 && this.lengthSq < this.radiusSq) { + this.attractionForce.normalize(); + this.attractionForce.multiplyScalar(1 - this.lengthSq / this.radiusSq); + this.attractionForce.multiplyScalar(this.force); + + particle.a.add(this.attractionForce); + } + } + }]); + return Attraction; +}(Behaviour); +var RandomDrift = function (_Behaviour) { + inherits(RandomDrift, _Behaviour); + /** + * @memberof! Proton# + * @augments Behaviour + * @constructor + * @alias RandomDrift + * + * @param {Number} driftX X value of the new Vector2D + * @param {Number} driftY Y value of the new Vector2D + * @param {Number} delay How much delay the drift should have + * @param {Number} [life=Infinity] this behaviour's life + * @param {String} [easing=easeLinear] this behaviour's easing + * + * @property {Number} time The time of the drift + * @property {String} name The Behaviour name + */ + function RandomDrift(driftX, driftY, delay, life, easing) { + classCallCheck(this, RandomDrift); + var _this = possibleConstructorReturn(this, (RandomDrift.__proto__ || Object.getPrototypeOf(RandomDrift)).call(this, life, easing)); + _this.reset(driftX, driftY, delay); + _this.time = 0; + _this.name = "RandomDrift"; + return _this; + } /** - * @memberof! Proton# - * @augments Proton.Behaviour - * @constructor - * @alias Proton.RandomDrift - * - * @param {Number} driftX X value of the new Proton.Vector2D - * @param {Number} driftY Y value of the new Proton.Vector2D - * @param {Number} delay How much delay the drift should have - * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=easeLinear] this behaviour's easing - * - * @property {Number} time The time of the drift - * @property {String} name The Behaviour name - */ - function RandomDrift(driftX, driftY, delay, life, easing) { - RandomDrift._super_.call(this, life, easing); - this.reset(driftX, driftY, delay); - this.time = 0; - this.name = "RandomDrift"; - } + * Reset this behaviour's parameters + * + * @method reset + * @memberof Proton#RandomDrift + * @instance + * + * @param {Number} driftX X value of the new Vector2D + * @param {Number} driftY Y value of the new Vector2D + * @param {Number} delay How much delay the drift should have + * @param {Number} [life=Infinity] this behaviour's life + * @param {String} [easing=easeLinear] this behaviour's easing + */ + + + createClass(RandomDrift, [{ + key: 'reset', + value: function reset(driftX, driftY, delay, life, easing) { + this.panFoce = new Vector2D(driftX, driftY); + this.panFoce = this.normalizeForce(this.panFoce); + this.delay = delay; + + life && get(RandomDrift.prototype.__proto__ || Object.getPrototypeOf(RandomDrift.prototype), 'reset', this).call(this, life, easing); + } + + /** + * Apply this behaviour for all particles every time + * + * @method applyBehaviour + * @memberof Proton#RandomDrift + * @instance + * + * @param {Particle} particle + * @param {Number} time the integrate time 1/ms + * @param {Int} index the particle index + */ + + }, { + key: 'applyBehaviour', + value: function applyBehaviour(particle, time, index) { + this.calculate(particle, time, index); + this.time += time; + + if (this.time >= this.delay) { + particle.a.addXY(MathUtils.randomAToB(-this.panFoce.x, this.panFoce.x), MathUtils.randomAToB(-this.panFoce.y, this.panFoce.y)); + this.time = 0; + } + } + }]); + return RandomDrift; +}(Behaviour); - Proton.Util.inherits(RandomDrift, Proton.Behaviour); +var Gravity = function (_Force) { + inherits(Gravity, _Force); /** - * Reset this behaviour's parameters - * - * @method reset - * @memberof Proton#Proton.RandomDrift - * @instance - * - * @param {Number} driftX X value of the new Proton.Vector2D - * @param {Number} driftY Y value of the new Proton.Vector2D - * @param {Number} delay How much delay the drift should have - * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=easeLinear] this behaviour's easing - */ - RandomDrift.prototype.reset = function(driftX, driftY, delay, life, easing) { - this.panFoce = new Proton.Vector2D(driftX, driftY); - this.panFoce = this.normalizeForce(this.panFoce); - this.delay = delay; - if (life) - RandomDrift._super_.prototype.reset.call(this, life, easing); + * @memberof! Proton# + * @augments Proton#Proton.Force + * @constructor + * @alias Proton.Gravity + * + * @param {Number} g Gravity + * @param {Number} [life=Infinity] this behaviour's life + * @param {String} [easing=ease.easeLinear] this behaviour's easing + * + * @property {String} name The Behaviour name + */ + function Gravity(g, life, easing) { + classCallCheck(this, Gravity); + + var _this = possibleConstructorReturn(this, (Gravity.__proto__ || Object.getPrototypeOf(Gravity)).call(this, 0, g, life, easing)); + + _this.name = "Gravity"; + return _this; } /** - * Apply this behaviour for all particles every time - * - * @method applyBehaviour - * @memberof Proton#Proton.RandomDrift - * @instance - * - * @param {Proton.Particle} particle - * @param {Number} time the integrate time 1/ms - * @param {Int} index the particle index - */ - RandomDrift.prototype.applyBehaviour = function(particle, time, index) { - RandomDrift._super_.prototype.applyBehaviour.call(this, particle, time, index); - this.time += time; - if (this.time >= this.delay) { - - particle.a.addXY(Proton.MathUtils.randomAToB(-this.panFoce.x, this.panFoce.x), Proton.MathUtils.randomAToB(-this.panFoce.y, this.panFoce.y)); - this.time = 0; - }; - }; + * Reset this behaviour's parameters + * + * @method reset + * @memberof Proton#Proton.Gravity + * @instance + * + * @param {Number} g Gravity + * @param {Number} [life=Infinity] this behaviour's life + * @param {String} [easing=ease.easeLinear] this behaviour's easing + */ + + + createClass(Gravity, [{ + key: 'reset', + value: function reset(g, life, easing) { + get(Gravity.prototype.__proto__ || Object.getPrototypeOf(Gravity.prototype), 'reset', this).call(this, 0, g, life, easing); + } + }]); + return Gravity; +}(Force); - Proton.RandomDrift = RandomDrift; +//can use Collision(emitter,true,function(){}) or Collision(); +var Collision = function (_Behaviour) { + inherits(Collision, _Behaviour); + /** + * The callback after collision + * + * @callback Callback + * + * @param {Proton.Particle} particle + * @param {Proton.Paritcle} otherParticle + */ + /** + * @memberof! Proton# + * @augments Proton.Behaviour + * @constructor + * @alias Proton.Collision + * + * @todo add description to mass + * + * @param {Proton.Emitter} [emitter=null] the attraction point coordinates + * @param {Boolean} [mass=true] + * @param {Callback} [callback=null] the callback after the collision + * @param {Number} [life=Infinity] this behaviour's life + * @param {String} [easing=ease.easeLinear] this behaviour's easing + * + * @property {String} name The Behaviour name + */ + function Collision(emitter, mass, callback, life, easing) { + classCallCheck(this, Collision); + var _this = possibleConstructorReturn(this, (Collision.__proto__ || Object.getPrototypeOf(Collision)).call(this, life, easing)); - /** - * The oppisite of Proton.Attraction - turns the force - * - * @memberof! Proton# - * @augments Proton#Proton.Attraction - * @constructor - * @alias Proton.Repulsion - * - * @todo add description for 'force' and 'radius' - * - * @param {Proton.Vector2D} targetPosition the attraction point coordinates - * @param {Number} [force=100] - * @param {Number} [radius=1000] - * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=Proton.easeLinear] this behaviour's easing - * - * @property {Number} force - * @property {String} name The Behaviour name - */ - function Repulsion(targetPosition, force, radius, life, easing) { - Repulsion._super_.call(this, targetPosition, force, radius, life, easing); - this.force *= -1; - this.name = "Repulsion"; + _this.reset(emitter, mass, callback); + _this.name = "Collision"; + return _this; } - Proton.Util.inherits(Repulsion, Proton.Attraction); - /** - * Reset this behaviour's parameters - * - * @method reset - * @memberof Proton#Proton.Repulsion - * @instance - * - * @todo add description for 'force' and 'radius' - * - * @param {Proton.Vector2D} targetPosition the attraction point coordinates - * @param {Number} [force=100] - * @param {Number} [radius=1000] - * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=Proton.easeLinear] this behaviour's easing - */ - Repulsion.prototype.reset = function(targetPosition, force, radius, life, easing) { - Repulsion._super_.prototype.reset.call(this, targetPosition, force, radius, life, easing); - this.force *= -1; - } + * Reset this behaviour's parameters + * + * @memberof Proton#Proton.Collision + * @method reset + * @instance + * + * @todo add description to mass + * + * @param {Proton.Emitter} [emitter=null] the attraction point coordinates + * @param {Boolean} [mass=true] + * @param {Callback} [callback=null] the callback after the collision + * @param {Number} [life=Infinity] this behaviour's life + * @param {String} [easing=ease.easeLinear] this behaviour's easing + */ + + + createClass(Collision, [{ + key: 'reset', + value: function reset(emitter, mass, callback, life, easing) { + this.emitter = Util.initValue(emitter, null); + this.mass = Util.initValue(mass, true); + this.callback = Util.initValue(callback, null); + + this.collisionPool = []; + this.delta = new Vector2D(); + + life && get(Collision.prototype.__proto__ || Object.getPrototypeOf(Collision.prototype), 'reset', this).call(this, life, easing); + } - Proton.Repulsion = Repulsion; + /** + * Apply this behaviour for all particles every time + * + * @memberof Proton#Proton.Collision + * @method applyBehaviour + * @instance + * + * @param {Proton.Particle} particle + * @param {Number} time the integrate time 1/ms + * @param {Int} index the particle index + */ + + }, { + key: 'applyBehaviour', + value: function applyBehaviour(particle, time, index) { + var newPool = this.emitter ? this.emitter.particles.slice(index) : this.pool.slice(index); + var length = newPool.length; + + var otherParticle = void 0; + var lengthSq = void 0; + var overlap = void 0; + var totalMass = void 0; + var averageMass1 = void 0, + averageMass2 = void 0; + var i = void 0; + + for (i = 0; i < length; i++) { + otherParticle = newPool[i]; + + if (otherParticle !== particle) { + this.delta.copy(otherParticle.p); + this.delta.sub(particle.p); + + lengthSq = this.delta.lengthSq(); + var distance = particle.radius + otherParticle.radius; + + if (lengthSq <= distance * distance) { + overlap = distance - Math.sqrt(lengthSq); + overlap += 0.5; + + totalMass = particle.mass + otherParticle.mass; + averageMass1 = this.mass ? otherParticle.mass / totalMass : 0.5; + averageMass2 = this.mass ? particle.mass / totalMass : 0.5; + + particle.p.add(this.delta.clone().normalize().multiplyScalar(overlap * -averageMass1)); + otherParticle.p.add(this.delta.normalize().multiplyScalar(overlap * averageMass2)); + + this.callback && this.callback(particle, otherParticle); + } + } + } + } + }]); + return Collision; +}(Behaviour); +var CrossZone = function (_Behaviour) { + inherits(CrossZone, _Behaviour); + /** + * Defines what happens if the particles come to the end of the specified zone + * + * @memberof! Proton# + * @augments Proton.Behaviour + * @constructor + * @alias Proton.CrossZone + * + * @param {Proton.Zone} zone can be any Proton.Zone - e.g. Proton.RectZone() + * @param {String} [crossType=dead] what happens if the particles pass the zone - allowed strings: dead | bound | cross + * @param {Number} [life=Infinity] this behaviour's life + * @param {String} [easing=ease.easeLinear] this behaviour's easing + * + * @property {String} name The Behaviour name + */ + function CrossZone(zone, crossType, life, easing) { + classCallCheck(this, CrossZone); + var _this = possibleConstructorReturn(this, (CrossZone.__proto__ || Object.getPrototypeOf(CrossZone)).call(this, life, easing)); + _this.reset(zone, crossType); + _this.name = "CrossZone"; + return _this; + } - /** - * @memberof! Proton# - * @augments Proton#Proton.Force - * @constructor - * @alias Proton.Gravity - * - * @param {Number} g Gravity - * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=Proton.easeLinear] this behaviour's easing - * - * @property {String} name The Behaviour name - */ - function Gravity(g, life, easing) { - Gravity._super_.call(this, 0, g, life, easing); - this.name = "Gravity"; - } + /** + * Reset this behaviour's parameters + * + * @method reset + * @memberof Proton#Proton.CrossZone + * @instance + * + * @param {Proton.Zone} zone can be any Proton.Zone - e.g. Proton.RectZone() + * @param {String} [crossType=dead] what happens if the particles pass the zone - allowed strings: dead | bound | cross + * @param {Number} [life=Infinity] this behaviour's life + * @param {String} [easing=easeLinear] this behaviour's easing + */ - Proton.Util.inherits(Gravity, Proton.Force); - /** - * Reset this behaviour's parameters - * - * @method reset - * @memberof Proton#Proton.Gravity - * @instance - * - * @param {Number} g Gravity - * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=Proton.easeLinear] this behaviour's easing - */ - Gravity.prototype.reset = function(g, life, easing) { - Gravity._super_.prototype.reset.call(this, 0, g, life, easing); - } + createClass(CrossZone, [{ + key: 'reset', + value: function reset(zone, crossType, life, easing) { + this.zone = zone; + this.zone.crossType = Util.initValue(crossType, "dead"); - Proton.Gravity = Gravity; - Proton.G = Gravity; + life && get(CrossZone.prototype.__proto__ || Object.getPrototypeOf(CrossZone.prototype), 'reset', this).call(this, life, easing); + } + /** + * Apply this behaviour for all particles every time + * + * @method applyBehaviour + * @memberof Proton#Proton.CrossZone + * @instance + * + * @param {Proton.Particle} particle + * @param {Number} the integrate time 1/ms + * @param {Int} the particle index + */ + }, { + key: 'applyBehaviour', + value: function applyBehaviour(particle, time, index) { + this.calculate(particle, time, index); + this.zone.crossing(particle); + } + }]); + return CrossZone; +}(Behaviour); - //can use Collision(emitter,true,function(){}) or Collision(); +var Alpha = function (_Behaviour) { + inherits(Alpha, _Behaviour); /** - * The callback after collision - * - * @callback Callback - * - * @param {Proton.Particle} particle - * @param {Proton.Paritcle} otherParticle - */ - /** - * @memberof! Proton# - * @augments Proton.Behaviour - * @constructor - * @alias Proton.Collision - * - * @todo add description to mass - * - * @param {Proton.Emitter} [emitter=null] the attraction point coordinates - * @param {Boolean} [mass=true] - * @param {Callback} [callback=null] the callback after the collision - * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=Proton.easeLinear] this behaviour's easing - * - * @property {String} name The Behaviour name - */ - function Collision(emitter, mass, callback, life, easing) { - Collision._super_.call(this, life, easing); - this.reset(emitter, mass, callback); - this.name = "Collision"; + * @memberof! Proton# + * @augments Proton.Behaviour + * @constructor + * @alias Proton.Alpha + * + * @todo add description for 'a' and 'b' + * + * @param {Number} a + * @param {String} b + * @param {Number} [life=Infinity] this behaviour's life + * @param {String} [easing=ease.easeLinear] this behaviour's easing + * + * @property {String} name The Behaviour name + */ + function Alpha(a, b, life, easing) { + classCallCheck(this, Alpha); + + var _this = possibleConstructorReturn(this, (Alpha.__proto__ || Object.getPrototypeOf(Alpha)).call(this, life, easing)); + + _this.reset(a, b); + _this.name = "Alpha"; + return _this; } + /** + * Reset this behaviour's parameters + * + * @method reset + * @memberof Proton#Proton.Alpha + * @instance + * + * @todo add description for 'a' and 'b' + * + * @param {Number} a + * @param {String} b + * @param {Number} [life=Infinity] this behaviour's life + * @param {String} [easing=ease.easeLinear] this behaviour's easing + */ + + + createClass(Alpha, [{ + key: 'reset', + value: function reset(a, b, life, easing) { + this.same = b === null || b === undefined ? true : false; + this.a = Util.setSpanValue(Util.initValue(a, 1)); + this.b = Util.setSpanValue(b); + + life && get(Alpha.prototype.__proto__ || Object.getPrototypeOf(Alpha.prototype), 'reset', this).call(this, life, easing); + } + + /** + * Sets the new alpha value of the particle + * + * @method initialize + * @memberof Proton#Proton.Alpha + * @instance + * + * @param {Proton.Particle} particle A single Proton generated particle + */ + + }, { + key: 'initialize', + value: function initialize(particle) { + particle.transform.alphaA = this.a.getValue(); + + if (this.same) particle.transform.alphaB = particle.transform.alphaA;else particle.transform.alphaB = this.b.getValue(); + } + + /** + * @method applyBehaviour + * @memberof Proton#Proton.Alpha + * @instance + * + * @param {Proton.Particle} particle + * @param {Number} time the integrate time 1/ms + * @param {Int} index the particle index + */ + + }, { + key: 'applyBehaviour', + value: function applyBehaviour(particle, time, index) { + this.calculate(particle, time, index); + + particle.alpha = particle.transform.alphaB + (particle.transform.alphaA - particle.transform.alphaB) * this.energy; + if (particle.alpha < 0.001) particle.alpha = 0; + } + }]); + return Alpha; +}(Behaviour); - Proton.Util.inherits(Collision, Proton.Behaviour); +var Scale = function (_Behaviour) { + inherits(Scale, _Behaviour); /** - * Reset this behaviour's parameters - * - * @memberof Proton#Proton.Collision - * @method reset - * @instance - * - * @todo add description to mass - * - * @param {Proton.Emitter} [emitter=null] the attraction point coordinates - * @param {Boolean} [mass=true] - * @param {Callback} [callback=null] the callback after the collision - * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=Proton.easeLinear] this behaviour's easing - */ - Collision.prototype.reset = function(emitter, mass, callback, life, easing) { - this.emitter = Proton.Util.initValue(emitter, null); - this.mass = Proton.Util.initValue(mass, true); - this.callback = Proton.Util.initValue(callback, null); - this.collisionPool = []; - this.delta = new Proton.Vector2D(); - if (life) - Collision._super_.prototype.reset.call(this, life, easing); + * @memberof! Proton# + * @augments Proton.Behaviour + * @constructor + * @alias Proton.Scale + * + * @todo add description for 'a' and 'b' + * + * @param {Number} a + * @param {String} b + * @param {Number} [life=Infinity] this behaviour's life + * @param {String} [easing=ease.easeLinear] this behaviour's easing + * + * @property {String} name The Behaviour name + */ + function Scale(a, b, life, easing) { + classCallCheck(this, Scale); + + var _this = possibleConstructorReturn(this, (Scale.__proto__ || Object.getPrototypeOf(Scale)).call(this, life, easing)); + + _this.reset(a, b); + _this.name = "Scale"; + return _this; } /** - * Apply this behaviour for all particles every time - * - * @memberof Proton#Proton.Collision - * @method applyBehaviour - * @instance - * - * @param {Proton.Particle} particle - * @param {Number} time the integrate time 1/ms - * @param {Int} index the particle index - */ - Collision.prototype.applyBehaviour = function(particle, time, index) { - var newPool = this.emitter ? this.emitter.particles.slice(index) : this.pool.slice(index); - var otherParticle; - var lengthSq; - var overlap; - var averageMass1, averageMass2; - var length = newPool.length; - for (var i = 0; i < length; i++) { - otherParticle = newPool[i]; - if (otherParticle !== particle) { - this.delta.copy(otherParticle.p); - this.delta.sub(particle.p); - lengthSq = this.delta.lengthSq(); - distance = particle.radius + otherParticle.radius; - - if (lengthSq <= distance * distance) { - overlap = distance - Math.sqrt(lengthSq); - overlap += 0.5; - totalMass = particle.mass + otherParticle.mass; - averageMass1 = this.mass ? otherParticle.mass / totalMass : 0.5; - averageMass2 = this.mass ? particle.mass / totalMass : 0.5; - particle.p.add(this.delta.clone().normalize().multiplyScalar(overlap * -averageMass1)); - otherParticle.p.add(this.delta.normalize().multiplyScalar(overlap * averageMass2)); - if (this.callback) - this.callback(particle, otherParticle); - } - } + * Reset this behaviour's parameters + * + * @method reset + * @memberof Proton#Proton.Scale + * @instance + * + * @param {Number} a + * @param {String} b + * @param {Number} [life=Infinity] this behaviour's life + * @param {String} [easing=ease.easeLinear] this behaviour's easing + */ + + + createClass(Scale, [{ + key: 'reset', + value: function reset(a, b, life, easing) { + this.same = b === null || b === undefined ? true : false; + this.a = Util.setSpanValue(Util.initValue(a, 1)); + this.b = Util.setSpanValue(b); + + life && get(Scale.prototype.__proto__ || Object.getPrototypeOf(Scale.prototype), 'reset', this).call(this, life, easing); } - }; - - Proton.Collision = Collision; + /** + * Initialize the behaviour's parameters for all particles + * + * @method initialize + * @memberof Proton#Proton.Scale + * @instance + * + * @param {Proton.Particle} particle + */ + + }, { + key: 'initialize', + value: function initialize(particle) { + particle.transform.scaleA = this.a.getValue(); + particle.transform.oldRadius = particle.radius; + particle.transform.scaleB = this.same ? particle.transform.scaleA : this.b.getValue(); + } + }, { + key: 'applyBehaviour', + /** + * Apply this behaviour for all particles every time + * + * @method applyBehaviour + * @memberof Proton#Proton.Scale + * @instance + * + * @param {Proton.Particle} particle + * @param {Number} time the integrate time 1/ms + * @param {Int} index the particle index + */ + value: function applyBehaviour(particle, time, index) { + this.calculate(particle, time, index); + particle.scale = particle.transform.scaleB + (particle.transform.scaleA - particle.transform.scaleB) * this.energy; + + if (particle.scale < 0.0001) particle.scale = 0; + particle.radius = particle.transform.oldRadius * particle.scale; + } + }]); + return Scale; +}(Behaviour); +var Rotate = function (_Behaviour) { + inherits(Rotate, _Behaviour); /** - * Defines what happens if the particles come to the end of the specified zone - * - * @memberof! Proton# - * @augments Proton.Behaviour - * @constructor - * @alias Proton.CrossZone - * - * @param {Proton.Zone} zone can be any Proton.Zone - e.g. Proton.RectZone() - * @param {String} [crossType=dead] what happens if the particles pass the zone - allowed strings: dead | bound | cross - * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=Proton.easeLinear] this behaviour's easing - * - * @property {String} name The Behaviour name - */ - function CrossZone(zone, crossType, life, easing) { - CrossZone._super_.call(this, life, easing); - this.reset(zone, crossType); - this.name = "CrossZone"; - } + * @memberof! Proton# + * @augments Proton.Behaviour + * @constructor + * @alias Proton.Rotate + * + * @todo add description for 'a', 'b' and 'style' + * + * @param {Number} a + * @param {String} b + * @param {String} [style=to] + * @param {Number} [life=Infinity] this behaviour's life + * @param {String} [easing=ease.easeLinear] this behaviour's easing + * + * @property {String} name The Behaviour name + */ + function Rotate(a, b, style, life, easing) { + classCallCheck(this, Rotate); - Proton.Util.inherits(CrossZone, Proton.Behaviour); + var _this = possibleConstructorReturn(this, (Rotate.__proto__ || Object.getPrototypeOf(Rotate)).call(this, life, easing)); - /** - * Reset this behaviour's parameters - * - * @method reset - * @memberof Proton#Proton.CrossZone - * @instance - * - * @param {Proton.Zone} zone can be any Proton.Zone - e.g. Proton.RectZone() - * @param {String} [crossType=dead] what happens if the particles pass the zone - allowed strings: dead | bound | cross - * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=easeLinear] this behaviour's easing - */ - CrossZone.prototype.reset = function(zone, crossType, life, easing) { - this.zone = zone; - this.zone.crossType = Proton.Util.initValue(crossType, "dead"); - if (life) - CrossZone._super_.prototype.reset.call(this, life, easing); + _this.reset(a, b, style); + _this.name = "Rotate"; + return _this; } /** - * Apply this behaviour for all particles every time - * - * @method applyBehaviour - * @memberof Proton#Proton.CrossZone - * @instance - * - * @param {Proton.Particle} particle - * @param {Number} the integrate time 1/ms - * @param {Int} the particle index - */ - CrossZone.prototype.applyBehaviour = function(particle, time, index) { - CrossZone._super_.prototype.applyBehaviour.call(this, particle, time, index); - this.zone.crossing(particle); - }; + * Reset this behaviour's parameters + * + * @method reset + * @memberof Proton#Proton.Rotate + * @instance + * + * @todo add description for 'a', 'b' and 'style' + * + * @param {Number} a + * @param {String} b + * @param {String} [style=to] + * @param {Number} [life=Infinity] this behaviour's life + * @param {String} [easing=ease.easeLinear] this behaviour's easing + */ + + + createClass(Rotate, [{ + key: 'reset', + value: function reset(a, b, style, life, easing) { + this.same = b === null || b === undefined ? true : false; + + this.a = Util.setSpanValue(Util.initValue(a, "Velocity")); + this.b = Util.setSpanValue(Util.initValue(b, 0)); + this.style = Util.initValue(style, 'to'); + + life && get(Rotate.prototype.__proto__ || Object.getPrototypeOf(Rotate.prototype), 'reset', this).call(this, life, easing); + } - Proton.CrossZone = CrossZone; + /** + * Initialize the behaviour's parameters for all particles + * + * @method initialize + * @memberof Proton#Proton.Rotate + * @instance + * + * @param {Proton.Particle} particle + */ + + }, { + key: 'initialize', + value: function initialize(particle) { + particle.rotation = this.a.getValue(); + particle.transform.rotationA = this.a.getValue(); + + if (!this.same) particle.transform.rotationB = this.b.getValue(); + } + }, { + key: 'applyBehaviour', + /** + * Apply this behaviour for all particles every time + * + * @method applyBehaviour + * @memberof Proton#Proton.Rotate + * @instance + * + * @param {Proton.Particle} particle + * @param {Number} time the integrate time 1/ms + * @param {Int} index the particle index + */ + value: function applyBehaviour(particle, time, index) { + this.calculate(particle, time, index); + + if (!this.same) { + if (this.style == 'to' || this.style == 'TO' || this.style == '_') { + particle.rotation += particle.transform.rotationB + (particle.transform.rotationA - particle.transform.rotationB) * this.energy; + } else { + particle.rotation += particle.transform.rotationB; + } + } else if (this.a.a == "V" || this.a.a == "Velocity" || this.a.a == "v") { + //beta... + particle.rotation = particle.getDirection(); + } + } + }]); + return Rotate; +}(Behaviour); +var Color = function (_Behaviour) { + inherits(Color, _Behaviour); - /** - * @memberof! Proton# - * @augments Proton.Behaviour - * @constructor - * @alias Proton.Alpha - * - * @todo add description for 'a' and 'b' - * - * @param {Number} a - * @param {String} b - * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=Proton.easeLinear] this behaviour's easing - * - * @property {String} name The Behaviour name - */ - function Alpha(a, b, life, easing) { - Alpha._super_.call(this, life, easing); - this.reset(a, b); - this.name = "Alpha"; - } + /** + * @memberof! Proton# + * @augments Proton.Behaviour + * @constructor + * @alias Proton.Color + * + * @param {Proton.ArraySpan | String} a the string should be a hex e.g. #000000 for black + * @param {Proton.ArraySpan | String} b the string should be a hex e.g. #000000 for black + * @param {Number} [life=Infinity] this behaviour's life + * @param {String} [easing=easeLinear] this behaviour's easing + * + * @property {String} name The Behaviour name + */ + function Color(a, b, life, easing) { + classCallCheck(this, Color); + var _this = possibleConstructorReturn(this, (Color.__proto__ || Object.getPrototypeOf(Color)).call(this, life, easing)); - Proton.Util.inherits(Alpha, Proton.Behaviour); + _this.reset(a, b); + _this.name = "Color"; + return _this; + } - /** - * Reset this behaviour's parameters - * - * @method reset - * @memberof Proton#Proton.Alpha - * @instance - * - * @todo add description for 'a' and 'b' - * - * @param {Number} a - * @param {String} b - * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=Proton.easeLinear] this behaviour's easing - */ - Alpha.prototype.reset = function(a, b, life, easing) { - if (b == null || b == undefined) - this.same = true; - else - this.same = false; - this.a = Proton.Util.setSpanValue(Proton.Util.initValue(a, 1)); - this.b = Proton.Util.setSpanValue(b); - if (life) - Alpha._super_.prototype.reset.call(this, life, easing); - } + /** + * Reset this behaviour's parameters + * + * @method reset + * @memberof Proton#Proton.Color + * @instance + * + * @param {Proton.ArraySpan | String} a the string should be a hex e.g. #000000 for black + * @param {Proton.ArraySpan | String} b the string should be a hex e.g. #000000 for black + * @param {Number} [life=Infinity] this behaviour's life + * @param {String} [easing=easeLinear] this behaviour's easing + */ - /** - * Sets the new alpha value of the particle - * - * @method initialize - * @memberof Proton#Proton.Alpha - * @instance - * - * @param {Proton.Particle} particle A single Proton generated particle - */ - Alpha.prototype.initialize = function(particle) { - particle.transform.alphaA = this.a.getValue(); - if (this.same) - particle.transform.alphaB = particle.transform.alphaA; - else - particle.transform.alphaB = this.b.getValue(); - }; - /** - * @method applyBehaviour - * @memberof Proton#Proton.Alpha - * @instance - * - * @param {Proton.Particle} particle - * @param {Number} time the integrate time 1/ms - * @param {Int} index the particle index - */ - Alpha.prototype.applyBehaviour = function(particle, time, index) { - Alpha._super_.prototype.applyBehaviour.call(this, particle, time, index); - particle.alpha = particle.transform.alphaB + (particle.transform.alphaA - particle.transform.alphaB) * this.energy; - if (particle.alpha < 0.001) - particle.alpha = 0; - }; + createClass(Color, [{ + key: 'reset', + value: function reset(a, b, life, easing) { + this.a = ArraySpan.createArraySpan(a); + this.b = ArraySpan.createArraySpan(b); - Proton.Alpha = Alpha; + life && get(Color.prototype.__proto__ || Object.getPrototypeOf(Color.prototype), 'reset', this).call(this, life, easing); + } + /** + * Initialize the behaviour's parameters for all particles + * + * @method initialize + * @memberof Proton#Proton.Color + * @instance + * + * @param {Proton.Particle} particle + */ + }, { + key: 'initialize', + value: function initialize(particle) { + particle.color = this.a.getValue(); + particle.transform.colorA = ColorUtil.hexToRGB(particle.color); + if (this.b) particle.transform.colorB = ColorUtil.hexToRGB(this.b.getValue()); + } + }, { + key: 'applyBehaviour', - /** - * @memberof! Proton# - * @augments Proton.Behaviour - * @constructor - * @alias Proton.Scale - * - * @todo add description for 'a' and 'b' - * - * @param {Number} a - * @param {String} b - * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=Proton.easeLinear] this behaviour's easing - * - * @property {String} name The Behaviour name - */ - function Scale(a, b, life, easing) { - Scale._super_.call(this, life, easing); - this.reset(a, b); - this.name = "Scale"; - } + /** + * Apply this behaviour for all particles every time + * + * @method applyBehaviour + * @memberof Proton#Proton.Color + * @instance + * + * @param {Proton.Particle} particle + * @param {Number} the integrate time 1/ms + * @param {Int} the particle index + */ + value: function applyBehaviour(particle, time, index) { + if (this.b) { + this.calculate(particle, time, index); + + particle.transform.rgb.r = particle.transform.colorB.r + (particle.transform.colorA.r - particle.transform.colorB.r) * this.energy; + particle.transform.rgb.g = particle.transform.colorB.g + (particle.transform.colorA.g - particle.transform.colorB.g) * this.energy; + particle.transform.rgb.b = particle.transform.colorB.b + (particle.transform.colorA.b - particle.transform.colorB.b) * this.energy; + + particle.transform.rgb.r = Math.floor(particle.transform.rgb.r); + particle.transform.rgb.g = Math.floor(particle.transform.rgb.g); + particle.transform.rgb.b = Math.floor(particle.transform.rgb.b); + } else { + particle.transform.rgb.r = particle.transform.colorA.r; + particle.transform.rgb.g = particle.transform.colorA.g; + particle.transform.rgb.b = particle.transform.colorA.b; + } + } + }]); + return Color; +}(Behaviour); + +var Repulsion = function (_Attraction) { + inherits(Repulsion, _Attraction); + + /** + * The oppisite of Proton.Attraction - turns the force + * + * @memberof! Proton# + * @augments Proton#Proton.Attraction + * @constructor + * @alias Proton.Repulsion + * + * @todo add description for 'force' and 'radius' + * + * @param {Proton.Vector2D} targetPosition the attraction point coordinates + * @param {Number} [force=100] + * @param {Number} [radius=1000] + * @param {Number} [life=Infinity] this behaviour's life + * @param {String} [easing=ease.easeLinear] this behaviour's easing + * + * @property {Number} force + * @property {String} name The Behaviour name + */ + function Repulsion(targetPosition, force, radius, life, easing) { + classCallCheck(this, Repulsion); - Proton.Util.inherits(Scale, Proton.Behaviour); + var _this = possibleConstructorReturn(this, (Repulsion.__proto__ || Object.getPrototypeOf(Repulsion)).call(this, targetPosition, force, radius, life, easing)); - /** - * Reset this behaviour's parameters - * - * @method reset - * @memberof Proton#Proton.Scale - * @instance - * - * @param {Number} a - * @param {String} b - * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=Proton.easeLinear] this behaviour's easing - */ - Scale.prototype.reset = function(a, b, life, easing) { - if (b == null || b == undefined) - this.same = true; - else - this.same = false; - this.a = Proton.Util.setSpanValue(Proton.Util.initValue(a, 1)); - this.b = Proton.Util.setSpanValue(b); - if (life) - Scale._super_.prototype.reset.call(this, life, easing); + _this.force *= -1; + _this.name = "Repulsion"; + return _this; } /** - * Initialize the behaviour's parameters for all particles - * - * @method initialize - * @memberof Proton#Proton.Scale - * @instance - * - * @param {Proton.Particle} particle - */ - Scale.prototype.initialize = function(particle) { - particle.transform.scaleA = this.a.getValue(); - particle.transform.oldRadius = particle.radius; - if (this.same) - particle.transform.scaleB = particle.transform.scaleA; - else - particle.transform.scaleB = this.b.getValue(); + * Reset this behaviour's parameters + * + * @method reset + * @memberof Proton#Proton.Repulsion + * @instance + * + * @todo add description for 'force' and 'radius' + * + * @param {Proton.Vector2D} targetPosition the attraction point coordinates + * @param {Number} [force=100] + * @param {Number} [radius=1000] + * @param {Number} [life=Infinity] this behaviour's life + * @param {String} [easing=ease.easeLinear] this behaviour's easing + */ + + + createClass(Repulsion, [{ + key: 'reset', + value: function reset(targetPosition, force, radius, life, easing) { + get(Repulsion.prototype.__proto__ || Object.getPrototypeOf(Repulsion.prototype), 'reset', this).call(this, targetPosition, force, radius, life, easing); + this.force *= -1; + } + }]); + return Repulsion; +}(Attraction); - }; +var GravityWell = function (_Behaviour) { + inherits(GravityWell, _Behaviour); /** - * Apply this behaviour for all particles every time - * - * @method applyBehaviour - * @memberof Proton#Proton.Scale - * @instance - * - * @param {Proton.Particle} particle - * @param {Number} time the integrate time 1/ms - * @param {Int} index the particle index - */ - Scale.prototype.applyBehaviour = function(particle, time, index) { - Scale._super_.prototype.applyBehaviour.call(this, particle, time, index); - particle.scale = particle.transform.scaleB + (particle.transform.scaleA - particle.transform.scaleB) * this.energy; - if (particle.scale < 0.0001) - particle.scale = 0; - particle.radius = particle.transform.oldRadius * particle.scale; - }; - - Proton.Scale = Scale; + * @memberof! Proton# + * @augments Behaviour + * @constructor + * @alias GravityWell + * + * @param {Vector2D} [centerPoint=new Vector2D] The point in the center + * @param {Number} [force=100] The force + * @param {Number} [life=Infinity] this behaviour's life + * @param {String} [easing=easeLinear] this behaviour's easing + * + * @property {String} name The Behaviour name + */ + function GravityWell(centerPoint, force, life, easing) { + classCallCheck(this, GravityWell); + var _this = possibleConstructorReturn(this, (GravityWell.__proto__ || Object.getPrototypeOf(GravityWell)).call(this, life, easing)); + _this.distanceVec = new Vector2D(); + _this.centerPoint = Util.initValue(centerPoint, new Vector2D()); + _this.force = Util.initValue(_this.normalizeValue(force), 100); + _this.name = "GravityWell"; + return _this; + } /** - * @memberof! Proton# - * @augments Proton.Behaviour - * @constructor - * @alias Proton.Rotate - * - * @todo add description for 'a', 'b' and 'style' - * - * @param {Number} a - * @param {String} b - * @param {String} [style=to] - * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=Proton.easeLinear] this behaviour's easing - * - * @property {String} name The Behaviour name - */ - function Rotate(a, b, style, life, easing) { - Rotate._super_.call(this, life, easing); - this.reset(a, b, style); - this.name = "Rotate"; - } + * Reset this behaviour's parameters + * + * @method reset + * @memberof Proton#GravityWell + * @instance + * + * @param {Vector2D} [centerPoint=new Vector2D] The point in the center + * @param {Number} [force=100] The force + * @param {Number} [life=Infinity] this behaviour's life + * @param {String} [easing=easeLinear] this behaviour's easing + */ + + + createClass(GravityWell, [{ + key: 'reset', + value: function reset(centerPoint, force, life, easing) { + this.distanceVec = new Vector2D(); + this.centerPoint = Util.initValue(centerPoint, new Vector2D()); + this.force = Util.initValue(this.normalizeValue(force), 100); + + life && get(GravityWell.prototype.__proto__ || Object.getPrototypeOf(GravityWell.prototype), 'reset', this).call(this, life, easing); + } + }, { + key: 'initialize', - Proton.Util.inherits(Rotate, Proton.Behaviour); - /** - * Reset this behaviour's parameters - * - * @method reset - * @memberof Proton#Proton.Rotate - * @instance - * - * @todo add description for 'a', 'b' and 'style' - * - * @param {Number} a - * @param {String} b - * @param {String} [style=to] - * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=Proton.easeLinear] this behaviour's easing - */ - Rotate.prototype.reset = function(a, b, style, life, easing) { - if (b == null || b == undefined) - this.same = true; - else - this.same = false; - this.a = Proton.Util.setSpanValue(Proton.Util.initValue(a, "Velocity")); - this.b = Proton.Util.setSpanValue(Proton.Util.initValue(b, 0)); - this.style = Proton.Util.initValue(style, 'to'); - if (life) - Rotate._super_.prototype.reset.call(this, life, easing); - } + /** + * @inheritdoc + */ + value: function initialize(particle) {} + }, { + key: 'applyBehaviour', - /** - * Initialize the behaviour's parameters for all particles - * - * @method initialize - * @memberof Proton#Proton.Rotate - * @instance - * - * @param {Proton.Particle} particle - */ - Rotate.prototype.initialize = function(particle) { - particle.rotation = this.a.getValue(); - particle.transform.rotationA = this.a.getValue(); - if (!this.same) - particle.transform.rotationB = this.b.getValue(); - }; - /** - * Apply this behaviour for all particles every time - * - * @method applyBehaviour - * @memberof Proton#Proton.Rotate - * @instance - * - * @param {Proton.Particle} particle - * @param {Number} time the integrate time 1/ms - * @param {Int} index the particle index - */ - Rotate.prototype.applyBehaviour = function(particle, time, index) { - Rotate._super_.prototype.applyBehaviour.call(this, particle, time, index); - if (!this.same) { - if (this.style == 'to' || this.style == 'TO' || this.style == '_') { - particle.rotation += particle.transform.rotationB + (particle.transform.rotationA - particle.transform.rotationB) * this.energy - } else { - particle.rotation += particle.transform.rotationB; + /** + * Apply this behaviour for all particles every time + * + * @method applyBehaviour + * @memberof Proton#GravityWell + * @instance + * + * @param {Particle} particle + * @param {Number} the integrate time 1/ms + * @param {Int} the particle index + */ + value: function applyBehaviour(particle, time, index) { + this.distanceVec.set(this.centerPoint.x - particle.p.x, this.centerPoint.y - particle.p.y); + var distanceSq = this.distanceVec.lengthSq(); + + if (distanceSq != 0) { + var distance = this.distanceVec.length(); + var factor = this.force * time / (distanceSq * distance); + + particle.v.x += factor * this.distanceVec.x; + particle.v.y += factor * this.distanceVec.y; } - } else if (this.a.a == "V" || this.a.a == "Velocity" || this.a.a == "v") { - //beta... - particle.rotation = particle.getDirection(); } - }; - - Proton.Rotate = Rotate; - + }]); + return GravityWell; +}(Behaviour); +var InitializeUtil = { + initialize: function initialize(emitter, particle, initializes) { + var length = initializes.length; + var i = void 0; + for (i = 0; i < length; i++) { + if (initializes[i] instanceof Proton.Initialize) initializes[i].init(emitter, particle);else this.init(emitter, particle, initializes[i]); + } - /** - * @memberof! Proton# - * @augments Proton.Behaviour - * @constructor - * @alias Proton.Color - * - * @param {Proton.ColorSpan | String} color1 the string should be a hex e.g. #000000 for black - * @param {Proton.ColorSpan | String} color2 the string should be a hex e.g. #000000 for black - * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=easeLinear] this behaviour's easing - * - * @property {String} name The Behaviour name - */ - function Color(color1, color2, life, easing) { - Color._super_.call(this, life, easing); - this.reset(color1, color2); - this.name = "Color"; - } + this.bindEmitter(emitter, particle); + }, - Proton.Util.inherits(Color, Proton.Behaviour); + //////////////////////init////////////////////// + init: function init(emitter, particle, initialize) { + Util.setPrototypeByObject(particle, initialize); + Util.setVector2DByObject(particle, initialize); + }, + bindEmitter: function bindEmitter(emitter, particle) { + if (emitter.bindEmitter) { + particle.p.add(emitter.p); + particle.v.add(emitter.v); + particle.a.add(emitter.a); - /** - * Reset this behaviour's parameters - * - * @method reset - * @memberof Proton#Proton.Color - * @instance - * - * @param {Proton.ColorSpan | String} color1 the string should be a hex e.g. #000000 for black - * @param {Proton.ColorSpan | String} color2 the string should be a hex e.g. #000000 for black - * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=easeLinear] this behaviour's easing - */ - Color.prototype.reset = function(color1, color2, life, easing) { - this.color1 = this.setSpanValue(color1); - this.color2 = this.setSpanValue(color2); - if (life) - Color._super_.prototype.reset.call(this, life, easing); + particle.v.rotate(MathUtils.degreeTransform(emitter.rotation)); + } } +}; - /** - * Initialize the behaviour's parameters for all particles - * - * @method initialize - * @memberof Proton#Proton.Color - * @instance - * - * @param {Proton.Particle} particle - */ - Color.prototype.initialize = function(particle) { - particle.color = this.color1.getValue(); - particle.transform.beginRGB = Proton.Util.hexToRGB(particle.color); - - if (this.color2) - particle.transform.endRGB = Proton.Util.hexToRGB(this.color2.getValue()); - }; +var Emitter = function (_Particle) { + inherits(Emitter, _Particle); /** - * Apply this behaviour for all particles every time - * - * @method applyBehaviour - * @memberof Proton#Proton.Color - * @instance - * - * @param {Proton.Particle} particle - * @param {Number} the integrate time 1/ms - * @param {Int} the particle index - */ - Color.prototype.applyBehaviour = function(particle, time, index) { - if (this.color2) { - Color._super_.prototype.applyBehaviour.call(this, particle, time, index); - particle.transform.rgb.r = particle.transform.endRGB.r + (particle.transform.beginRGB.r - particle.transform.endRGB.r) * this.energy; - particle.transform.rgb.g = particle.transform.endRGB.g + (particle.transform.beginRGB.g - particle.transform.endRGB.g) * this.energy; - particle.transform.rgb.b = particle.transform.endRGB.b + (particle.transform.beginRGB.b - particle.transform.endRGB.b) * this.energy; - particle.transform.rgb.r = parseInt(particle.transform.rgb.r, 10); - particle.transform.rgb.g = parseInt(particle.transform.rgb.g, 10); - particle.transform.rgb.b = parseInt(particle.transform.rgb.b, 10); - } else { - particle.transform.rgb.r = particle.transform.beginRGB.r; - particle.transform.rgb.g = particle.transform.beginRGB.g; - particle.transform.rgb.b = particle.transform.beginRGB.b; + * You can use this emit particles. + * + * It will dispatch follow events: + * PARTICLE_CREATED + * PARTICLE_UPDATA + * PARTICLE_DEAD + * + * @class Emitter + * @constructor + * @param {Object} pObj the parameters object; + * for example {damping:0.01,bindEmitter:false} + */ + function Emitter(pObj) { + classCallCheck(this, Emitter); - } - }; + var _this = possibleConstructorReturn(this, (Emitter.__proto__ || Object.getPrototypeOf(Emitter)).call(this, pObj)); - /** - * Make sure that the color is an instance of Proton.ColorSpan, if not it makes a new instance - * - * @method setSpanValue - * @memberof Proton#Proton.Color - * @instance - * - * @param {Proton.Particle} particle - * @param {Number} the integrate time 1/ms - * @param {Int} the particle index - */ - Color.prototype.setSpanValue = function(color) { - if (color) { - if ( color instanceof Proton.ColorSpan) { - return color; - } else { - return new Proton.ColorSpan(color); - } - } else { - return null; - } - } + _this.initializes = []; + _this.particles = []; + _this.behaviours = []; - Proton.Color = Color; + _this.emitSpeed = 0; + _this.currentEmitTime = 0; + _this.totalEmitTimes = -1; + /** + * The friction coefficient for all particle emit by This; + * @property damping + * @type {Number} + * @default 0.006 + */ + _this.damping = .006; + /** + * If bindEmitter the particles can bind this emitter's property; + * @property bindEmitter + * @type {Boolean} + * @default true + */ + _this.bindEmitter = true; + /** + * The number of particles per second emit (a [particle]/b [s]); + * @property rate + * @type {Rate} + * @default Rate(1, .1) + */ + _this.rate = new Rate(1, .1); - /** - * @memberof! Proton# - * @augments Proton.Behaviour - * @constructor - * @alias Proton.GravityWell - * - * @param {Proton.Vector2D} [centerPoint=new Proton.Vector2D] The point in the center - * @param {Number} [force=100] The force - * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=Proton.easeLinear] this behaviour's easing - * - * @property {String} name The Behaviour name - */ - function GravityWell(centerPoint, force, life, easing) { - GravityWell._super_.call(this, life, easing); - this.distanceVec = new Proton.Vector2D(); - this.centerPoint = Proton.Util.initValue(centerPoint, new Proton.Vector2D); - this.force = Proton.Util.initValue(this.normalizeValue(force), 100); - this.name = "GravityWell"; + _this.id = 'emitter_' + Emitter.ID++; + _this.name = 'Emitter'; + return _this; } - Proton.Util.inherits(GravityWell, Proton.Behaviour); - /** - * Reset this behaviour's parameters - * - * @method reset - * @memberof Proton#Proton.GravityWell - * @instance - * - * @param {Proton.Vector2D} [centerPoint=new Proton.Vector2D] The point in the center - * @param {Number} [force=100] The force - * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=Proton.easeLinear] this behaviour's easing - */ - GravityWell.prototype.reset = function(centerPoint, force, life, easing) { - this.distanceVec = new Proton.Vector2D(); - this.centerPoint = Proton.Util.initValue(centerPoint, new Proton.Vector2D); - this.force = Proton.Util.initValue(this.normalizeValue(force), 100); - if (life) - GravityWell._super_.prototype.reset.call(this, life, easing); - }; + * start emit particle + * @method emit + * @param {Number} currentEmitTime begin emit time; + * @param {String} life the life of this emitter + */ + + + createClass(Emitter, [{ + key: 'emit', + value: function emit(totalEmitTimes, life) { + this.stoped = false; + this.currentEmitTime = 0; + this.totalEmitTimes = Util.initValue(totalEmitTimes, Infinity); + + if (life == true || life == 'life' || life == 'destroy') { + this.life = totalEmitTimes == 'once' ? 1 : this.totalEmitTimes; + } else if (!isNaN(life)) { + this.life = life; + } - /** - * @inheritdoc - */ - GravityWell.prototype.initialize = function(particle) { + this.rate.init(); + } - }; + /** + * stop emiting + * @method stop + */ + + }, { + key: 'stop', + value: function stop() { + this.totalEmitTimes = -1; + this.currentEmitTime = 0; + this.stoped = true; + } - /** - * Apply this behaviour for all particles every time - * - * @method applyBehaviour - * @memberof Proton#Proton.GravityWell - * @instance - * - * @param {Proton.Particle} particle - * @param {Number} the integrate time 1/ms - * @param {Int} the particle index - */ - GravityWell.prototype.applyBehaviour = function(particle, time, index) { - this.distanceVec.set(this.centerPoint.x - particle.p.x, this.centerPoint.y - particle.p.y); - var distanceSq = this.distanceVec.lengthSq(); - if (distanceSq != 0) { - var distance = this.distanceVec.length(); - var factor = (this.force * time ) / (distanceSq * distance ); - particle.v.x += factor * this.distanceVec.x; - particle.v.y += factor * this.distanceVec.y; + /** + * remove current all particles + * @method removeAllParticles + */ + + }, { + key: 'removeAllParticles', + value: function removeAllParticles() { + var i = this.particles.length; + while (i--) { + this.particles[i].dead = true; + } } - } - Proton.GravityWell = GravityWell; + /** + * add initialize to this emitter + * @method addSelfInitialize + */ + + }, { + key: 'addSelfInitialize', + value: function addSelfInitialize(pObj) { + if (pObj['init']) { + pObj.init(this); + } else { + this.initAll(); + } + } + /** + * add the Initialize to particles; + * + * you can use initializes array:for example emitter.addInitialize(initialize1,initialize2,initialize3); + * @method addInitialize + * @param {Initialize} initialize like this new Radius(1, 12) + */ + + }, { + key: 'addInitialize', + value: function addInitialize() { + for (var _len = arguments.length, rest = Array(_len), _key = 0; _key < _len; _key++) { + rest[_key] = arguments[_key]; + } + var i = rest.length; + while (i--) { + this.initializes.push(rest[i]); + } + } - Emitter.ID = 0; - /** - * You can use this emit particles. - * - * It will dispatch follow events: - * Proton.PARTICLE_CREATED - * Proton.PARTICLE_UPDATA - * Proton.PARTICLE_DEAD - * - * @class Proton.Emitter - * @constructor - * @param {Object} pObj the parameters object; - * for example {damping:0.01,bindEmitter:false} - */ - function Emitter(pObj) { - this.initializes = []; - this.particles = []; - this.behaviours = []; - this.emitTime = 0; - this.emitTotalTimes = -1; - /** - * The friction coefficient for all particle emit by This; - * @property damping - * @type {Number} - * @default 0.006 - */ - this.damping = .006; /** - * If bindEmitter the particles can bind this emitter's property; - * @property bindEmitter - * @type {Boolean} - * @default true - */ - this.bindEmitter = true; + * remove the Initialize + * @method removeInitialize + * @param {Initialize} initialize a initialize + */ + + }, { + key: 'removeInitialize', + value: function removeInitialize(initializer) { + var index = this.initializes.indexOf(initializer); + if (index > -1) this.initializes.splice(index, 1); + } + /** - * The number of particles per second emit (a [particle]/b [s]); - * @property rate - * @type {Proton.Rate} - * @default Proton.Rate(1, .1) - */ - this.rate = new Proton.Rate(1, .1); - Emitter._super_.call(this, pObj); + * remove all Initializes + * @method removeInitializers + */ + + }, { + key: 'removeAllInitializers', + value: function removeAllInitializers() { + Util.destroyArray(this.initializes); + } + /** - * The emitter's id; - * @property id - * @type {string} - */ - this.id = 'emitter_' + Emitter.ID++; - }; + * add the Behaviour to particles; + * + * you can use Behaviours array:emitter.addBehaviour(Behaviour1,Behaviour2,Behaviour3); + * @method addBehaviour + * @param {Behaviour} behaviour like this new Color('random') + */ + + }, { + key: 'addBehaviour', + value: function addBehaviour() { + for (var _len2 = arguments.length, rest = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + rest[_key2] = arguments[_key2]; + } - Proton.Util.inherits(Emitter, Proton.Particle); - Proton.EventDispatcher.initialize(Emitter.prototype); - /** - * start emit particle - * @method emit - * @param {Number} emitTime begin emit time; - * @param {String} life the life of this emitter - */ - Emitter.prototype.emit = function(emitTime, life) { - this.emitTime = 0; - this.emitTotalTimes = Proton.Util.initValue(emitTime, Infinity); - - if (life == true || life == 'life' || life == 'destroy') { - if (emitTime == 'once') - this.life = 1; - else - this.life = this.emitTotalTimes; - - } else if (!isNaN(life)) { - this.life = life; + var i = arguments.length; + while (i--) { + var behaviour = rest[i]; + this.behaviours.push(behaviour); + if (behaviour.parents) behaviour.parents.push(this); + } } - this.rate.init(); - }; + /** + * remove the Behaviour + * @method removeBehaviour + * @param {Behaviour} behaviour a behaviour + */ + + }, { + key: 'removeBehaviour', + value: function removeBehaviour(behaviour) { + var index = this.behaviours.indexOf(behaviour); + this.behaviours.splice(index, 1); - /** - * stop emiting - * @method stopEmit - */ - Emitter.prototype.stopEmit = function() { - this.emitTotalTimes = -1; - this.emitTime = 0; - }; + if (behaviour.parents) { + index = behaviour.parents.indexOf(behaviour); + behaviour.parents.splice(index, 1); + } - /** - * remove current all particles - * @method removeAllParticles - */ - Emitter.prototype.removeAllParticles = function() { - for (var i = 0; i < this.particles.length; i++) - this.particles[i].dead = true; - }; - /** - * create single particle; - * - * can use emit({x:10},new Gravity(10),{'particleUpdate',fun}) or emit([{x:10},new Initialize],new Gravity(10),{'particleUpdate',fun}) - * @method removeAllParticles - */ - Emitter.prototype.createParticle = function(initialize, behaviour) { - var particle = Proton.pool.get(Proton.Particle); - this.setupParticle(particle, initialize, behaviour); - this.dispatchEvent(Proton.PARTICLE_CREATED, particle); - - return particle; - }; - /** - * add initialize to this emitter - * @method addSelfInitialize - */ - Emitter.prototype.addSelfInitialize = function(pObj) { - if (pObj['init']) { - pObj.init(this); - } else { - this.initAll(); - } - }; - /** - * add the Initialize to particles; - * - * you can use initializes array:for example emitter.addInitialize(initialize1,initialize2,initialize3); - * @method addInitialize - * @param {Proton.Initialize} initialize like this new Proton.Radius(1, 12) - */ - Emitter.prototype.addInitialize = function() { - var length = arguments.length, i; - for ( i = 0; i < length; i++) { - this.initializes.push(arguments[i]); - } - }; - /** - * remove the Initialize - * @method removeInitialize - * @param {Proton.Initialize} initialize a initialize - */ - Emitter.prototype.removeInitialize = function(initializer) { - var index = this.initializes.indexOf(initializer); - if (index > -1) { - this.initializes.splice(index, 1); + return index; } - }; - /** - * remove all Initializes - * @method removeInitializers - */ - Emitter.prototype.removeInitializers = function() { - Proton.Util.destroyArray(this.initializes); - }; - /** - * add the Behaviour to particles; - * - * you can use Behaviours array:emitter.addBehaviour(Behaviour1,Behaviour2,Behaviour3); - * @method addBehaviour - * @param {Proton.Behaviour} behaviour like this new Proton.Color('random') - */ - Emitter.prototype.addBehaviour = function() { - var length = arguments.length, i; - for ( i = 0; i < length; i++) { - this.behaviours.push(arguments[i]); - if (arguments[i].hasOwnProperty("parents")) - arguments[i].parents.push(this); + /** + * remove all behaviours + * @method removeAllBehaviours + */ + + }, { + key: 'removeAllBehaviours', + value: function removeAllBehaviours() { + Util.destroyArray(this.behaviours); } - }; - /** - * remove the Behaviour - * @method removeBehaviour - * @param {Proton.Behaviour} behaviour a behaviour - */ - Emitter.prototype.removeBehaviour = function(behaviour) { - var index = this.behaviours.indexOf(behaviour); - if (index > -1) - this.behaviours.splice(index, 1); - }; - /** - * remove all behaviours - * @method removeAllBehaviours - */ - Emitter.prototype.removeAllBehaviours = function() { - Proton.Util.destroyArray(this.behaviours); - }; - Emitter.prototype.integrate = function(time) { - var damping = 1 - this.damping; - Proton.integrator.integrate(this, time, damping); - var length = this.particles.length, i; - for ( i = 0; i < length; i++) { - var particle = this.particles[i]; - particle.update(time, i); - Proton.integrator.integrate(particle, time, damping); + // emitter update - this.dispatchEvent(Proton.PARTICLE_UPDATE, particle); + }, { + key: 'update', + value: function update(time) { + this.age += time; + if (this.age >= this.life || this.dead) this.destroy(); + + this.emitting(time); + this.integrate(time); } - }; + }, { + key: 'integrate', + value: function integrate(time) { + if (!this.parent) return; - Emitter.prototype.emitting = function(time) { - if (this.emitTotalTimes == 'once') { - var length = this.rate.getValue(99999), i; - for ( i = 0; i < length; i++) { - this.createParticle(); - } + var damping = 1 - this.damping; + this.parent.integrator.calculate(this, time, damping); + + var length = this.particles.length; + var i = void 0, + particle = void 0; + + for (i = length - 1; i >= 0; i--) { + particle = this.particles[i]; + + // particle update + particle.update(time, i); + this.parent.integrator.calculate(particle, time, damping); + this.dispatch("PARTICLE_UPDATE", particle); + + // check dead + if (particle.dead) { + this.dispatch("PARTICLE_DEAD", particle); - this.emitTotalTimes = 'none'; - } else if (!isNaN(this.emitTotalTimes)) { - this.emitTime += time; - if (this.emitTime < this.emitTotalTimes) { - var length = this.rate.getValue(time), i; - for ( i = 0; i < length; i++) { + this.parent.pool.expire(particle); + this.particles.splice(i, 1); + } + } + } + }, { + key: 'dispatch', + value: function dispatch(event, target) { + this.parent && this.parent.dispatchEvent(event, target); + Proton.bindEmtterEvent && this.dispatchEvent(event, target); + } + }, { + key: 'emitting', + value: function emitting(time) { + if (this.totalEmitTimes == 'once') { + var i = void 0; + var length = this.rate.getValue(99999); + + if (length > 0) this.emitSpeed = length; + for (i = 0; i < length; i++) { this.createParticle(); + }this.totalEmitTimes = 'none'; + } else { + this.currentEmitTime += time; + + if (this.currentEmitTime < this.totalEmitTimes) { + var _length = this.rate.getValue(time); + var _i = void 0; + + if (_length > 0) this.emitSpeed = _length; + for (_i = 0; _i < _length; _i++) { + this.createParticle(); + } } } } - } - Emitter.prototype.update = function(time) { - this.age += time; - if (this.age >= this.life || this.dead) { - this.destroy(); + /** + * create single particle; + * + * can use emit({x:10},new Gravity(10),{'particleUpdate',fun}) or emit([{x:10},new Initialize],new Gravity(10),{'particleUpdate',fun}) + * @method removeAllParticles + */ + + }, { + key: 'createParticle', + value: function createParticle(initialize, behaviour) { + var particle = this.parent.pool.get(Particle); + this.setupParticle(particle, initialize, behaviour); + this.dispatch("PARTICLE_CREATED", particle); + + return particle; } + }, { + key: 'setupParticle', + value: function setupParticle(particle, initialize, behaviour) { + var initializes = this.initializes; + var behaviours = this.behaviours; + + if (initialize) { + initializes = Util.isArray(initialize) ? initialize : [initialize]; + } - this.emitting(time); - this.integrate(time); - var particle; - var length = this.particles.length, k; - for ( k = length - 1; k >= 0; k--) { - particle = this.particles[k]; - if (particle.dead) { - this.dispatchEvent(Proton.PARTICLE_DEAD , particle); - - Proton.pool.set(particle); - this.particles.splice(k, 1); + if (behaviour) { + behaviour = Util.isArray(behaviour) ? behaviour : [behaviour]; } - } - }; - Emitter.prototype.setupParticle = function(particle, initialize, behaviour) { - var initializes = this.initializes; - var behaviours = this.behaviours; + particle.reset(); + InitializeUtil.initialize(this, particle, initializes); + particle.addBehaviours(behaviours); + particle.parent = this; - if (initialize) { - if ( initialize instanceof Array) - initializes = initialize; - else - initializes = [initialize]; + this.particles.push(particle); + } + }, { + key: 'remove', + value: function remove() { + this.stop(); + Util.destroy(this.particles); } - if (behaviour) { - if ( behaviour instanceof Array) - behaviours = behaviour; - else - behaviours = [behaviour]; + /** + * Destory this Emitter + * @method destroy + */ + + }, { + key: 'destroy', + value: function destroy(slow) { + this.dead = true; + this.remove(); + this.removeAllInitializers(); + this.removeAllBehaviours(); + this.parent && this.parent.removeEmitter(this); } + }]); + return Emitter; +}(Particle); - particle.reset(); - Proton.InitializeUtil.initialize(this, particle, initializes); - particle.addBehaviours(behaviours); - particle.parent = this; - this.particles.push(particle); - }; +Emitter.ID = 0; +EventDispatcher.bind(Emitter); + +var BehaviourEmitter = function (_Emitter) { + inherits(BehaviourEmitter, _Emitter); /** - * Destory this Emitter - * @method destroy - */ - Emitter.prototype.destroy = function() { - this.dead = true; - this.emitTotalTimes = -1; - if (this.particles.length == 0) { - this.removeInitializers(); - this.removeAllBehaviours(); + * The BehaviourEmitter class inherits from Proton.Emitter + * + * use the BehaviourEmitter you can add behaviours to self; + * @class Proton.BehaviourEmitter + * @constructor + * @param {Object} pObj the parameters object; + */ + function BehaviourEmitter(pObj) { + classCallCheck(this, BehaviourEmitter); - if (this.parent) - this.parent.removeEmitter(this); - } + var _this = possibleConstructorReturn(this, (BehaviourEmitter.__proto__ || Object.getPrototypeOf(BehaviourEmitter)).call(this, pObj)); + + _this.selfBehaviours = []; + return _this; } - Proton.Emitter = Emitter; + createClass(BehaviourEmitter, [{ + key: 'addSelfBehaviour', + /** + * add the Behaviour to emitter; + * + * you can use Behaviours array:emitter.addSelfBehaviour(Behaviour1,Behaviour2,Behaviour3); + * @method addSelfBehaviour + * @param {Proton.Behaviour} behaviour like this new Proton.Color('random') + */ + value: function addSelfBehaviour() { + for (var _len = arguments.length, rest = Array(_len), _key = 0; _key < _len; _key++) { + rest[_key] = arguments[_key]; + } - /** - * The BehaviourEmitter class inherits from Proton.Emitter - * - * use the BehaviourEmitter you can add behaviours to self; - * @class Proton.BehaviourEmitter - * @constructor - * @param {Object} pObj the parameters object; - */ - function BehaviourEmitter(pObj) { - this.selfBehaviours = []; - BehaviourEmitter._super_.call(this, pObj); - }; + var length = rest.length; + var i = void 0; - Proton.Util.inherits(BehaviourEmitter, Proton.Emitter); - /** - * add the Behaviour to emitter; - * - * you can use Behaviours array:emitter.addSelfBehaviour(Behaviour1,Behaviour2,Behaviour3); - * @method addSelfBehaviour - * @param {Proton.Behaviour} behaviour like this new Proton.Color('random') - */ - BehaviourEmitter.prototype.addSelfBehaviour = function() { - var length = arguments.length, i; - for ( i = 0; i < length; i++) { - this.selfBehaviours.push(arguments[i]); + for (i = 0; i < length; i++) { + this.selfBehaviours.push(rest[i]); + } } - }; - /** - * remove the Behaviour for self - * @method removeSelfBehaviour - * @param {Proton.Behaviour} behaviour a behaviour - */ - BehaviourEmitter.prototype.removeSelfBehaviour = function(behaviour) { - var index = this.selfBehaviours.indexOf(behaviour); - if (index > -1) - this.selfBehaviours.splice(index, 1); - }; + }, { + key: 'removeSelfBehaviour', - BehaviourEmitter.prototype.update = function(time) { - BehaviourEmitter._super_.prototype.update.call(this, time); - if (!this.sleep) { - var length = this.selfBehaviours.length, i; - for ( i = 0; i < length; i++) { - this.selfBehaviours[i].applyBehaviour(this, time, i) - } + /** + * remove the Behaviour for self + * @method removeSelfBehaviour + * @param {Proton.Behaviour} behaviour a behaviour + */ + value: function removeSelfBehaviour(behaviour) { + var index = this.selfBehaviours.indexOf(behaviour); + if (index > -1) this.selfBehaviours.splice(index, 1); } - } + }, { + key: 'update', + value: function update(time) { + get(BehaviourEmitter.prototype.__proto__ || Object.getPrototypeOf(BehaviourEmitter.prototype), 'update', this).call(this, time); - Proton.BehaviourEmitter = BehaviourEmitter; + if (!this.sleep) { + var length = this.selfBehaviours.length; + var i = void 0; + for (i = 0; i < length; i++) { + this.selfBehaviours[i].applyBehaviour(this, time, i); + } + } + } + }]); + return BehaviourEmitter; +}(Emitter); +var FollowEmitter = function (_Emitter) { + inherits(FollowEmitter, _Emitter); /** - * The FollowEmitter class inherits from Proton.Emitter - * - * use the FollowEmitter will emit particle when mousemoving - * - * @class Proton.FollowEmitter - * @constructor - * @param {Element} mouseTarget mouseevent's target; - * @param {Number} ease the easing of following speed; - * @default 0.7 - * @param {Object} pObj the parameters object; - */ + * The FollowEmitter class inherits from Proton.Emitter + * + * use the FollowEmitter will emit particle when mousemoving + * + * @class Proton.FollowEmitter + * @constructor + * @param {Element} mouseTarget mouseevent's target; + * @param {Number} ease the easing of following speed; + * @default 0.7 + * @param {Object} pObj the parameters object; + */ function FollowEmitter(mouseTarget, ease, pObj) { - this.mouseTarget = Proton.Util.initValue(mouseTarget, window); - this.ease = Proton.Util.initValue(ease, .7); - this._allowEmitting = false; - this.initEventHandler(); - FollowEmitter._super_.call(this, pObj); - }; + classCallCheck(this, FollowEmitter); - Proton.Util.inherits(FollowEmitter, Proton.Emitter); - FollowEmitter.prototype.initEventHandler = function() { - var self = this; - this.mousemoveHandler = function(e) { - self.mousemove.call(self, e); - }; - - this.mousedownHandler = function(e) { - self.mousedown.call(self, e); - }; - - this.mouseupHandler = function(e) { - self.mouseup.call(self, e); - }; - this.mouseTarget.addEventListener('mousemove', this.mousemoveHandler, false); - } - /** - * start emit particle - * @method emit - */ - FollowEmitter.prototype.emit = function() { - this._allowEmitting = true; - } - /** - * stop emiting - * @method stopEmit - */ - FollowEmitter.prototype.stopEmit = function() { - this._allowEmitting = false; - } + var _this = possibleConstructorReturn(this, (FollowEmitter.__proto__ || Object.getPrototypeOf(FollowEmitter)).call(this, pObj)); - FollowEmitter.prototype.mousemove = function(e) { - if (e.layerX || e.layerX == 0) { - this.p.x += (e.layerX - this.p.x) * this.ease; - this.p.y += (e.layerY - this.p.y) * this.ease; - } else if (e.offsetX || e.offsetX == 0) { - this.p.x += (e.offsetX - this.p.x) * this.ease; - this.p.y += (e.offsetY - this.p.y) * this.ease; - } - if (this._allowEmitting) - FollowEmitter._super_.prototype.emit.call(this, 'once'); - }; - /** - * Destory this Emitter - * @method destroy - */ - FollowEmitter.prototype.destroy = function() { - FollowEmitter._super_.prototype.destroy.call(this); - this.mouseTarget.removeEventListener('mousemove', this.mousemoveHandler, false); - } + _this.mouseTarget = Util.initValue(mouseTarget, window); + _this.ease = Util.initValue(ease, .7); - Proton.FollowEmitter = FollowEmitter; - - - - var ease = ease || { - easeLinear : function(value) { - return value; - }, - - easeInQuad : function(value) { - return Math.pow(value, 2); - }, - - easeOutQuad : function(value) { - return -(Math.pow((value - 1), 2) - 1); - }, - - easeInOutQuad : function(value) { - if ((value /= 0.5) < 1) - return 0.5 * Math.pow(value, 2); - return -0.5 * ((value -= 2) * value - 2); - }, - - easeInCubic : function(value) { - return Math.pow(value, 3); - }, - - easeOutCubic : function(value) { - return (Math.pow((value - 1), 3) + 1); - }, - - easeInOutCubic : function(value) { - if ((value /= 0.5) < 1) - return 0.5 * Math.pow(value, 3); - return 0.5 * (Math.pow((value - 2), 3) + 2); - }, - - easeInQuart : function(value) { - return Math.pow(value, 4); - }, - - easeOutQuart : function(value) { - return -(Math.pow((value - 1), 4) - 1); - }, - - easeInOutQuart : function(value) { - if ((value /= 0.5) < 1) - return 0.5 * Math.pow(value, 4); - return -0.5 * ((value -= 2) * Math.pow(value, 3) - 2); - }, - - easeInSine : function(value) { - return -Math.cos(value * (Math.PI / 2)) + 1; - }, - - easeOutSine : function(value) { - return Math.sin(value * (Math.PI / 2)); - }, - - easeInOutSine : function(value) { - return (-0.5 * (Math.cos(Math.PI * value) - 1)); - }, - - easeInExpo : function(value) { - return (value === 0) ? 0 : Math.pow(2, 10 * (value - 1)); - }, - - easeOutExpo : function(value) { - return (value === 1) ? 1 : -Math.pow(2, -10 * value) + 1; - }, - - easeInOutExpo : function(value) { - if (value === 0) - return 0; - if (value === 1) - return 1; - if ((value /= 0.5) < 1) - return 0.5 * Math.pow(2, 10 * (value - 1)); - return 0.5 * (-Math.pow(2, -10 * --value) + 2); - }, - - easeInCirc : function(value) { - return -(Math.sqrt(1 - (value * value)) - 1); - }, - - easeOutCirc : function(value) { - return Math.sqrt(1 - Math.pow((value - 1), 2)); - }, - - easeInOutCirc : function(value) { - if ((value /= 0.5) < 1) - return -0.5 * (Math.sqrt(1 - value * value) - 1); - return 0.5 * (Math.sqrt(1 - (value -= 2) * value) + 1); - }, - - easeInBack : function(value) { - var s = 1.70158; - return (value) * value * ((s + 1) * value - s); - }, - - easeOutBack : function(value) { - var s = 1.70158; - return ( value = value - 1) * value * ((s + 1) * value + s) + 1; - }, - - easeInOutBack : function(value) { - var s = 1.70158; - if ((value /= 0.5) < 1) - return 0.5 * (value * value * (((s *= (1.525)) + 1) * value - s)); - return 0.5 * ((value -= 2) * value * (((s *= (1.525)) + 1) * value + s) + 2); - }, - - setEasingByName: function(easeName) { - if (!!ease[easeName]) - return ease[easeName]; - else - return ease.easeLinear; - } + _this._allowEmitting = false; + _this.initEventHandler(); + return _this; } - for (var key in ease) { - if (key != "setEasingByName") Proton[key] = ease[key]; - } + createClass(FollowEmitter, [{ + key: 'initEventHandler', + value: function initEventHandler() { + var _this2 = this; + + this.mousemoveHandler = function (e) { + return _this2.mousemove.call(_this2, e); + }; + this.mousedownHandler = function (e) { + return _this2.mousedown.call(_this2, e); + }; + this.mouseupHandler = function (e) { + return _this2.mouseup.call(_this2, e); + }; - Proton.ease = ease; - + this.mouseTarget.addEventListener('mousemove', this.mousemoveHandler, false); + } + /** + * start emit particle + * @method emit + */ + + }, { + key: 'emit', + value: function emit() { + this._allowEmitting = true; + } -//the own renderer + /** + * stop emiting + * @method stop + */ + + }, { + key: 'stop', + value: function stop() { + this._allowEmitting = false; + } + }, { + key: 'mousemove', + value: function mousemove(e) { + if (e.layerX || e.layerX == 0) { + this.p.x += (e.layerX - this.p.x) * this.ease; + this.p.y += (e.layerY - this.p.y) * this.ease; + } else if (e.offsetX || e.offsetX == 0) { + this.p.x += (e.offsetX - this.p.x) * this.ease; + this.p.y += (e.offsetY - this.p.y) * this.ease; + } - function Renderer(type, proton, element) { - ///element dom/div canvas/canvas easeljs/cantainer(or stage) - this.element = element; - this.type = Proton.Util.initValue(type, 'canvas'); - this.proton = proton; - this.renderer = this.getRenderer(); - } + if (this._allowEmitting) get(FollowEmitter.prototype.__proto__ || Object.getPrototypeOf(FollowEmitter.prototype), 'emit', this).call(this, 'once'); + } + }, { + key: 'destroy', - Renderer.prototype = { - start : function() { - this.addEventHandler(); - this.renderer.start(); - }, - stop : function() { - this.renderer.stop(); - }, - - resize : function(width, height) { - this.renderer.resize(width, height); - }, - setStroke : function(color, thinkness) { - if (this.renderer.hasOwnProperty('stroke')) - this.renderer.setStroke(color, thinkness); - else - alert('Sorry this renderer do not suppest stroke method!'); - }, - createImageData : function(data) { - if (this.renderer instanceof Proton.PixelRender) - this.renderer.createImageData(data); - }, - setMaxRadius : function(radius) { - if (this.renderer instanceof Proton.WebGLRender) - this.renderer.setMaxRadius(radius); - }, - blendEquation : function(A) { - if (this.renderer instanceof Proton.WebGLRender) - this.renderer.blendEquation(A); - }, - blendFunc : function(A, B) { - if (this.renderer instanceof Proton.WebGLRender) - this.renderer.blendFunc(A, B); - }, - setType : function(type) { - this.type = type; - this.renderer = this.getRenderer(); - }, - getRenderer : function() { - switch(this.type) { - case 'pixi': - return new Proton.PixiRender(this.proton, this.element); - break; - - case 'dom': - return new Proton.DomRender(this.proton, this.element); - break; - - case 'canvas': - return new Proton.CanvasRender(this.proton, this.element); - break; - - case 'webgl': - return new Proton.WebGLRender(this.proton, this.element); - break; - - case 'easel': - return new Proton.EaselRender(this.proton, this.element); - break; - - case 'easeljs': - return new Proton.EaselRender(this.proton, this.element); - break; - - case 'pixel': - return new Proton.PixelRender(this.proton, this.element); - break; - - default: - return new Proton.BaseRender(this.proton, this.element); - } - }, - render : function(callback) { - this.renderer.render(callback); - }, - addEventHandler : function() { - if (this.onProtonUpdate) - this.renderer.onProtonUpdate = this.onProtonUpdate; - - if (this.onParticleCreated) - this.renderer.onParticleCreated = this.onParticleCreated; - - if (this.onParticleUpdate) - this.renderer.onParticleUpdate = this.onParticleUpdate; - - if (this.onParticleDead) - this.renderer.onParticleDead = this.onParticleDead; + /** + * Destory this Emitter + * @method destroy + */ + value: function destroy() { + get(FollowEmitter.prototype.__proto__ || Object.getPrototypeOf(FollowEmitter.prototype), 'destroy', this).call(this); + this.mouseTarget.removeEventListener('mousemove', this.mousemoveHandler, false); } - } + }]); + return FollowEmitter; +}(Emitter); - Proton.Renderer = Renderer; +var BaseRenderer = function () { + function BaseRenderer(element, stroke) { + classCallCheck(this, BaseRenderer); + this.element = element; + this.stroke = stroke; + this.initHandler(); - function BaseRender(proton, element, stroke) { - this.proton = proton; - this.element = element; - this.stroke = stroke; - this.pool = new Proton.Pool(); - } + this.circleConf = { isCircle: true }; + this.pool = new Pool(); + this.name = 'BaseRenderer'; + } + + createClass(BaseRenderer, [{ + key: 'setStroke', + value: function setStroke(color, thinkness) { + color = Util.initValue(color, '#000000'); + thinkness = Util.initValue(thinkness, 1); + + this.stroke = { color: color, thinkness: thinkness }; + } + }, { + key: 'initHandler', + value: function initHandler() { + var _this = this; + + this._protonUpdateHandler = function () { + _this.onProtonUpdate.call(_this); + }; + this._protonUpdateAfterHandler = function () { + _this.onProtonUpdateAfter.call(_this); + }; + this._emitterAddedHandler = function (emitter) { + _this.onEmitterAdded.call(_this, emitter); + }; + this._emitterRemovedHandler = function (emitter) { + _this.onEmitterRemoved.call(_this, emitter); + }; + this._particleCreatedHandler = function (particle) { + _this.onParticleCreated.call(_this, particle); + }; + this._particleUpdateHandler = function (particle) { + _this.onParticleUpdate.call(_this, particle); + }; + this._particleDeadHandler = function (particle) { + _this.onParticleDead.call(_this, particle); + }; + } + }, { + key: 'init', + value: function init(proton) { + this.parent = proton; + proton.addEventListener(Proton.PROTON_UPDATE, this._protonUpdateHandler); + proton.addEventListener(Proton.PROTON_UPDATE_AFTER, this._protonUpdateAfterHandler); - BaseRender.prototype = { - start : function() { - var self = this; - this.proton.addEventListener(Proton.PROTON_UPDATE, function() { - self.onProtonUpdate.call(self); - }); + proton.addEventListener(Proton.EMITTER_ADDED, this._emitterAddedHandler); + proton.addEventListener(Proton.EMITTER_REMOVED, this._emitterRemovedHandler); - this.proton.addEventListener(Proton.PROTON_UPDATE_AFTER, function() { - self.onProtonUpdateAfter.call(self); - }); + proton.addEventListener(Proton.PARTICLE_CREATED, this._particleCreatedHandler); + proton.addEventListener(Proton.PARTICLE_UPDATE, this._particleUpdateHandler); + proton.addEventListener(Proton.PARTICLE_DEAD, this._particleDeadHandler); + } + }, { + key: 'resize', + value: function resize(width, height) {} + }, { + key: 'remove', + value: function remove(proton) { + this.parent.removeEventListener(Proton.PROTON_UPDATE, this._protonUpdateHandler); + this.parent.removeEventListener(Proton.PROTON_UPDATE_AFTER, this._protonUpdateAfterHandler); + + this.parent.removeEventListener(Proton.EMITTER_ADDED, this._emitterAddedHandler); + this.parent.removeEventListener(Proton.EMITTER_REMOVED, this._emitterRemovedHandler); + + this.parent.removeEventListener(Proton.PARTICLE_CREATED, this._particleCreatedHandler); + this.parent.removeEventListener(Proton.PARTICLE_UPDATE, this._particleUpdateHandler); + this.parent.removeEventListener(Proton.PARTICLE_DEAD, this._particleDeadHandler); + + this.parent = null; + } + }, { + key: 'destroy', + value: function destroy() { + this.remove(); + } + }, { + key: 'onProtonUpdate', + value: function onProtonUpdate() {} + }, { + key: 'onProtonUpdateAfter', + value: function onProtonUpdateAfter() {} + }, { + key: 'onEmitterAdded', + value: function onEmitterAdded(emitter) {} + }, { + key: 'onEmitterRemoved', + value: function onEmitterRemoved(emitter) {} + }, { + key: 'onParticleCreated', + value: function onParticleCreated(particle) {} + }, { + key: 'onParticleUpdate', + value: function onParticleUpdate(particle) {} + }, { + key: 'onParticleDead', + value: function onParticleDead(particle) {} + }]); + return BaseRenderer; +}(); + +var CanvasRenderer = function (_BaseRenderer) { + inherits(CanvasRenderer, _BaseRenderer); + + function CanvasRenderer(element) { + classCallCheck(this, CanvasRenderer); + + var _this = possibleConstructorReturn(this, (CanvasRenderer.__proto__ || Object.getPrototypeOf(CanvasRenderer)).call(this, element)); + + _this.stroke = null; + _this.context = _this.element.getContext("2d"); + _this.bufferCache = {}; + + _this.name = 'CanvasRenderer'; + return _this; + } - this.proton.addEventListener(Proton.EMITTER_ADDED, function(emitter) { - self.onEmitterAdded.call(self, emitter); - }); + createClass(CanvasRenderer, [{ + key: 'resize', + value: function resize(width, height) { + this.element.width = width; + this.element.height = height; + } + }, { + key: 'onProtonUpdate', + value: function onProtonUpdate() { + this.context.clearRect(0, 0, this.element.width, this.element.height); + } + }, { + key: 'onParticleCreated', + value: function onParticleCreated(particle) { + if (particle.body) ImgUtil.getImgFromCache(particle.body, this.addImg2Body, particle);else particle.color = particle.color || '#ff0000'; + } + }, { + key: 'onParticleUpdate', + value: function onParticleUpdate(particle) { + if (particle.body) { + if (particle.body instanceof Image) this.drawImage(particle); + } else { + this.drawCircle(particle); + } + } + }, { + key: 'onParticleDead', + value: function onParticleDead(particle) { + particle.body = null; + } - this.proton.addEventListener(Proton.EMITTER_REMOVED, function(emitter) { - self.onEmitterRemoved.call(self, emitter); - }); + // private - var length = this.proton.emitters.length, i; - for ( i = 0; i < length; i++) { - var emitter = this.proton.emitters[i]; - this.addEmitterListener(emitter); - } - }, - - resize : function(width, height) { - }, - - addEmitterListener : function(emitter) { - var self = this; - emitter.addEventListener(Proton.PARTICLE_CREATED, function(particle) { - self.onParticleCreated.call(self, particle); - }); - emitter.addEventListener(Proton.PARTICLE_UPDATE, function(particle) { - self.onParticleUpdate.call(self, particle); - }); - emitter.addEventListener(Proton.PARTICLE_DEAD, function(particle) { - self.onParticleDead.call(self, particle); - }); - }, - - stop : function() { - var length = this.proton.emitters.length, i; - this.proton.removeAllEventListeners(); - for ( i = 0; i < length; i++) { - var emitter = this.proton.emitters[i]; - emitter.removeAllEventListeners(); - } - }, + }, { + key: 'addImg2Body', + value: function addImg2Body(img, particle) { + particle.body = img; + } - onEmitterAdded : function(emitter) { - this.addEmitterListener(emitter); - }, + // private drawCircle -- - onEmitterRemoved : function(emitter) { - emitter.removeAllEventListeners(); - }, + }, { + key: 'drawImage', + value: function drawImage(particle) { + var w = particle.body.width * particle.scale | 0; + var h = particle.body.height * particle.scale | 0; + var x = particle.p.x - w / 2; + var y = particle.p.y - h / 2; - onProtonUpdate : function() { + if (!!particle.color) { + if (!particle.transform["buffer"]) particle.transform.buffer = this.createBuffer(particle.body); - }, + var bufferContext = particle.transform.buffer.getContext('2d'); + bufferContext.clearRect(0, 0, particle.transform.buffer.width, particle.transform.buffer.height); + bufferContext.globalAlpha = particle.alpha; + bufferContext.drawImage(particle.body, 0, 0); - onProtonUpdateAfter : function() { + bufferContext.globalCompositeOperation = "source-atop"; + bufferContext.fillStyle = ColorUtil.rgbToHex(particle.transform.rgb); + bufferContext.fillRect(0, 0, particle.transform.buffer.width, particle.transform.buffer.height); + bufferContext.globalCompositeOperation = "source-over"; + bufferContext.globalAlpha = 1; - }, + this.context.drawImage(particle.transform.buffer, 0, 0, particle.transform.buffer.width, particle.transform.buffer.height, x, y, w, h); + } else { + this.context.save(); - onParticleCreated : function(particle) { + this.context.globalAlpha = particle.alpha; + this.context.translate(particle.p.x, particle.p.y); + this.context.rotate(MathUtils.degreeTransform(particle.rotation)); + this.context.translate(-particle.p.x, -particle.p.y); + this.context.drawImage(particle.body, 0, 0, particle.body.width, particle.body.height, x, y, w, h); - }, + this.context.globalAlpha = 1; + this.context.restore(); + } + } - onParticleUpdate : function(particle) { + // private drawCircle -- - }, + }, { + key: 'drawCircle', + value: function drawCircle(particle) { + if (particle.transform["rgb"]) this.context.fillStyle = 'rgba(' + particle.transform.rgb.r + ',' + particle.transform.rgb.g + ',' + particle.transform.rgb.b + ',' + particle.alpha + ')';else this.context.fillStyle = particle.color; - onParticleDead : function(particle) { + // draw circle + this.context.beginPath(); + this.context.arc(particle.p.x, particle.p.y, particle.radius, 0, Math.PI * 2, true); - } - } + if (this.stroke) { + this.context.strokeStyle = this.stroke.color; + this.context.lineWidth = this.stroke.thinkness; + this.context.stroke(); + } - Proton.BaseRender = BaseRender; + this.context.closePath(); + this.context.fill(); + } + // private createBuffer -- + }, { + key: 'createBuffer', + value: function createBuffer(image) { + if (image instanceof Image) { + var size = image.width + '_' + image.height; + var canvas = this.bufferCache[size]; - function DomRender(proton, element) { - DomRender._super_.call(this, proton, element); - this.stroke = null; - } + if (!canvas) { + canvas = document.createElement('canvas'); + canvas.width = image.width; + canvas.height = image.height; + this.bufferCache[size] = canvas; + } + return canvas; + } + } + }]); + return CanvasRenderer; +}(BaseRenderer); - Proton.Util.inherits(DomRender, Proton.BaseRender); +var DomRenderer = function (_BaseRenderer) { + inherits(DomRenderer, _BaseRenderer); - DomRender.prototype.start = function() { - DomRender._super_.prototype.start.call(this); - } + function DomRenderer(element) { + classCallCheck(this, DomRenderer); - DomRender.prototype.setStroke = function(color, thinkness) { - color = Proton.Util.initValue(color, '#000000'); - thinkness = Proton.Util.initValue(thinkness, 1); - this.stroke = { - color : color, - thinkness : thinkness - }; - } + var _this = possibleConstructorReturn(this, (DomRenderer.__proto__ || Object.getPrototypeOf(DomRenderer)).call(this, element)); - DomRender.prototype.onProtonUpdate = function() { - } + _this.stroke = null; + _this.pool.create = function (body, particle) { + return _this.createBody(body, particle); + }; + _this.addImg2Body = _this.addImg2Body.bind(_this); - DomRender.prototype.onParticleCreated = function(particle) { - if (particle.target) { - var self = this; - Proton.Util.getImage(particle.target, particle, false, function(particle) { - self.setImgInDIV.call(self, particle); - }); - } else { - particle.transform.canvas = Proton.DomUtil.createCanvas(particle.id + '_canvas', particle.radius + 1, particle.radius + 1, 'absolute'); - particle.transform.bakOldRadius = particle.radius; + _this.transform3d = false; - if (this.stroke) { - particle.transform.canvas.width = 2 * particle.radius + this.stroke.thinkness * 2; - particle.transform.canvas.height = 2 * particle.radius + this.stroke.thinkness * 2; - } else { - particle.transform.canvas.width = 2 * particle.radius + 1; - particle.transform.canvas.height = 2 * particle.radius + 1; - } + _this.name = 'DomRenderer'; + return _this; + } - particle.transform.context = particle.transform.canvas.getContext('2d'); - particle.transform.context.fillStyle = particle.color; - particle.transform.context.beginPath(); - particle.transform.context.arc(particle.radius, particle.radius, particle.radius, 0, Math.PI * 2, true); + createClass(DomRenderer, [{ + key: 'onParticleCreated', + value: function onParticleCreated(particle) { + if (particle.body) { + ImgUtil.getImgFromCache(particle.body, this.addImg2Body, particle); + } else { + particle.body = this.pool.get(this.circleConf, particle); + this.element.appendChild(particle.body); + } + } + }, { + key: 'onParticleUpdate', + value: function onParticleUpdate(particle) { + if (this.bodyReady(particle)) { + if (this.transform3d) DomUtil.transform3d(particle.body, particle.p.x, particle.p.y, particle.scale, particle.rotation);else DomUtil.transform(particle.body, particle.p.x, particle.p.y, particle.scale, particle.rotation); + + particle.body.style.opacity = particle.alpha; + if (particle.body.isCircle) { + particle.body.style.backgroundColor = particle.color || '#ff0000'; + } + } + } + }, { + key: 'onParticleDead', + value: function onParticleDead(particle) { + if (this.bodyReady(particle)) { + this.element.removeChild(particle.body); + this.pool.expire(particle.body); + particle.body = null; + } + } + }, { + key: 'bodyReady', + value: function bodyReady(particle) { + return _typeof(particle.body) === 'object' && particle.body && !particle.body.isInner; + } - if (this.stroke) { - particle.transform.context.strokeStyle = this.stroke.color; - particle.transform.context.lineWidth = this.stroke.thinkness; - particle.transform.context.stroke(); - } + // private - particle.transform.context.closePath(); - particle.transform.context.fill(); - this.element.appendChild(particle.transform.canvas); - } + }, { + key: 'addImg2Body', + value: function addImg2Body(img, particle) { + if (particle.dead) return; + particle.body = this.pool.get(img, particle); + DomUtil.resize(particle.body, img.width, img.height); - } + this.element.appendChild(particle.body); + } + }, { + key: 'createBody', + value: function createBody(body, particle) { + if (body.isCircle) return this.createCircle(particle);else return this.createSprite(body, particle); + } - DomRender.prototype.onParticleUpdate = function(particle) { - if (particle.target) { - if (particle.target instanceof Image) { - particle.transform.canvas.style.opacity = particle.alpha; - Proton.DomUtil.transformDom(particle.transform.canvas, particle.p.x - particle.target.width / 2, particle.p.y - particle.target.height / 2, particle.scale, particle.rotation); - } - } else { - particle.transform.canvas.style.opacity = particle.alpha; - if (particle.transform['oldRadius']) - Proton.DomUtil.transformDom(particle.transform.canvas, particle.p.x - particle.transform.oldRadius, particle.p.y - particle.transform.oldRadius, particle.scale, particle.rotation); - else - Proton.DomUtil.transformDom(particle.transform.canvas, particle.p.x - particle.transform.bakOldRadius, particle.p.y - particle.transform.bakOldRadius, particle.scale, particle.rotation); - } - } + // private -- - DomRender.prototype.onParticleDead = function(particle) { - if (particle.transform.canvas) - this.element.removeChild(particle.transform.canvas); - } + }, { + key: 'createCircle', + value: function createCircle(particle) { + var dom = DomUtil.createDiv(particle.id + '_dom', 2 * particle.radius, 2 * particle.radius); + dom.style.borderRadius = particle.radius + 'px'; - DomRender.prototype.setImgInDIV = function(particle) { - particle.transform.canvas = Proton.DomUtil.createCanvas(particle.id + '_canvas', particle.target.width + 1, particle.target.height + 1, 'absolute', particle.p.x - particle.radius, particle.p.y - particle.radius); - particle.transform.context = particle.transform.canvas.getContext('2d'); - particle.transform.context.drawImage(particle.target, 0, 0, particle.target.width, particle.target.height); - this.element.appendChild(particle.transform.canvas); - } + if (this.stroke) { + dom.style.borderColor = this.stroke.color; + dom.style.borderWidth = this.stroke.thinkness + 'px'; + } + dom.isCircle = true; + + return dom; + } + }, { + key: 'createSprite', + value: function createSprite(body, particle) { + var url = typeof body === 'string' ? body : body.src; + var dom = DomUtil.createDiv(particle.id + '_dom', body.width, body.height); + dom.style.backgroundImage = 'url(' + url + ')'; + + return dom; + } + }]); + return DomRenderer; +}(BaseRenderer); - Proton.DomRender = DomRender; +var EaselRenderer = function (_BaseRenderer) { + inherits(EaselRenderer, _BaseRenderer); + function EaselRenderer(element, stroke) { + classCallCheck(this, EaselRenderer); + var _this = possibleConstructorReturn(this, (EaselRenderer.__proto__ || Object.getPrototypeOf(EaselRenderer)).call(this, element)); - function EaselRender(proton, element, stroke) { - EaselRender._super_.call(this, proton, element); - this.stroke = stroke; + _this.stroke = stroke; + _this.name = 'EaselRenderer'; + return _this; } + createClass(EaselRenderer, [{ + key: 'onParticleCreated', + value: function onParticleCreated(particle) { + if (particle.body) { + this.createSprite(particle); + } else { + this.createCircle(particle); + } - Proton.Util.inherits(EaselRender, Proton.BaseRender); - EaselRender.prototype.resize = function(width, height) { + this.element.addChild(particle.body); + } + }, { + key: 'onParticleUpdate', + value: function onParticleUpdate(particle) { + if (particle.body) { + particle.body.x = particle.p.x; + particle.body.y = particle.p.y; + + particle.body.alpha = particle.alpha; + particle.body.scaleX = particle.body.scaleY = particle.scale; + particle.body.rotation = particle.rotation; + } + } + }, { + key: 'onParticleDead', + value: function onParticleDead(particle) { + if (particle.body) { + particle.body.parent && particle.body.parent.removeChild(particle.body); + this.pool.expire(particle.body); + particle.body = null; + } - } - EaselRender.prototype.start = function() { - EaselRender._super_.prototype.start.call(this); - }; + if (particle.graphics) this.pool.expire(particle.graphics); + } - EaselRender.prototype.onProtonUpdate = function() { + // private - } + }, { + key: 'createSprite', + value: function createSprite(particle) { + particle.body = this.pool.get(particle.body); - EaselRender.prototype.onParticleCreated = function(particle) { - if (particle.target) { - particle.target = this.pool.get(particle.target); - if (!particle.target.parent) { - if (!!particle.target['image']) { - particle.target.regX = particle.target.image.width / 2; - particle.target.regY = particle.target.image.height / 2; - } - this.element.addChild(particle.target); + if (particle.body.parent) return; + if (particle.body['image']) { + particle.body.regX = particle.body.image.width / 2; + particle.body.regY = particle.body.image.height / 2; } - } else { + } + }, { + key: 'createCircle', + value: function createCircle(particle) { var graphics = this.pool.get(createjs.Graphics); + if (this.stroke) { - if (this.stroke == true) { - graphics.beginStroke('#000000'); - } else if (this.stroke instanceof String) { - graphics.beginStroke(this.stroke); - } + if (this.stroke instanceof String) graphics.beginStroke(this.stroke);else graphics.beginStroke('#000000'); } + graphics.beginFill(particle.color || '#ff0000').drawCircle(0, 0, particle.radius); - graphics.beginFill(particle.color).drawCircle(0, 0, particle.radius); - var shape = new createjs.Shape(graphics); - particle.target = shape; - this.element.addChild(particle.target); - } - } + var shape = this.pool.get(createjs.Shape, [graphics]); - EaselRender.prototype.onParticleUpdate = function(particle) { - if (particle.target) { - particle.target.x = particle.p.x; - particle.target.y = particle.p.y; - particle.target.alpha = particle.alpha; - particle.target.scaleX = particle.target.scaleY = particle.scale; - particle.target.rotation = particle.rotation; + particle.body = shape; + particle.graphics = graphics; } - } + }]); + return EaselRenderer; +}(BaseRenderer); - EaselRender.prototype.onParticleDead = function(particle) { - if (particle.target) { - particle.target.parent && particle.target.parent.removeChild(particle.target); - this.pool.set(particle.target); - particle.target = null; - } - } +var PixelRenderer = function (_BaseRenderer) { + inherits(PixelRenderer, _BaseRenderer); - Proton.EaselRender = EaselRender; + function PixelRenderer(element, rectangle) { + classCallCheck(this, PixelRenderer); + var _this = possibleConstructorReturn(this, (PixelRenderer.__proto__ || Object.getPrototypeOf(PixelRenderer)).call(this, element)); + _this.context = _this.element.getContext('2d'); + _this.imageData = null; + _this.rectangle = null; + _this.rectangle = rectangle; + _this.createImageData(rectangle); - function CanvasRender(proton, element) { - CanvasRender._super_.call(this, proton, element); - this.stroke = null; - this.context = this.element.getContext("2d"); - this.bufferCache = {}; - } + _this.name = 'PixelRenderer'; + return _this; + } + createClass(PixelRenderer, [{ + key: 'resize', + value: function resize(width, height) { + this.element.width = width; + this.element.height = height; + } + }, { + key: 'createImageData', + value: function createImageData(rectangle) { + this.rectangle = rectangle ? rectangle : new Rectangle(0, 0, this.element.width, this.element.height); + this.imageData = this.context.createImageData(this.rectangle.width, this.rectangle.height); + this.context.putImageData(this.imageData, this.rectangle.x, this.rectangle.y); + } + }, { + key: 'onProtonUpdate', + value: function onProtonUpdate() { + this.context.clearRect(this.rectangle.x, this.rectangle.y, this.rectangle.width, this.rectangle.height); + this.imageData = this.context.getImageData(this.rectangle.x, this.rectangle.y, this.rectangle.width, this.rectangle.height); + } + }, { + key: 'onProtonUpdateAfter', + value: function onProtonUpdateAfter() { + this.context.putImageData(this.imageData, this.rectangle.x, this.rectangle.y); + } + }, { + key: 'onParticleCreated', + value: function onParticleCreated(particle) {} + }, { + key: 'onParticleUpdate', + value: function onParticleUpdate(particle) { + if (this.imageData) { + this.setPixel(this.imageData, Math.floor(particle.p.x - this.rectangle.x), Math.floor(particle.p.y - this.rectangle.y), particle); + } + } + }, { + key: 'setPixel', + value: function setPixel(imagedata, x, y, particle) { + var rgb = particle.transform.rgb; - Proton.Util.inherits(CanvasRender, Proton.BaseRender); - CanvasRender.prototype.resize = function(width, height) { - this.element.width = width; - this.element.height = height; - } - CanvasRender.prototype.start = function() { - CanvasRender._super_.prototype.start.call(this); - } + if (x < 0 || x > this.element.width || y < 0 || y > this.elementwidth) return; - CanvasRender.prototype.setStroke = function(color, thinkness) { - color = Proton.Util.initValue(color, '#000000'); - thinkness = Proton.Util.initValue(thinkness, 1); - this.stroke = { - color : color, - thinkness : thinkness - }; - } + var i = ((y >> 0) * imagedata.width + (x >> 0)) * 4; - CanvasRender.prototype.onProtonUpdate = function() { - this.context.clearRect(0, 0, this.element.width, this.element.height); - } + imagedata.data[i] = rgb.r; + imagedata.data[i + 1] = rgb.g; + imagedata.data[i + 2] = rgb.b; + imagedata.data[i + 3] = particle.alpha * 255; + } + }, { + key: 'onParticleDead', + value: function onParticleDead(particle) {} + }]); + return PixelRenderer; +}(BaseRenderer); + +var PixiRenderer = function (_BaseRenderer) { + inherits(PixiRenderer, _BaseRenderer); + + function PixiRenderer(element, stroke) { + classCallCheck(this, PixiRenderer); + + var _this = possibleConstructorReturn(this, (PixiRenderer.__proto__ || Object.getPrototypeOf(PixiRenderer)).call(this, element)); + + _this.stroke = stroke; + _this.setColor = false; + _this.pool.create = function (body, particle) { + return _this.createBody(body, particle); + }; + _this.name = 'PixiRenderer'; + return _this; + } - CanvasRender.prototype.onParticleCreated = function(particle) { - if (particle.target) - Proton.Util.getImage(particle.target, particle, false); - else - particle.color = particle.color ? particle.color : '#ff0000'; - } + createClass(PixiRenderer, [{ + key: 'onProtonUpdate', + value: function onProtonUpdate() {} - CanvasRender.prototype.onParticleUpdate = function(particle) { - if (particle.target) { - if (particle.target instanceof Image) { - var w = particle.target.width * particle.scale | 0; - var h = particle.target.height * particle.scale | 0; - var x = particle.p.x - w / 2; - var y = particle.p.y - h / 2; - - if (!!particle.color) { - if (!particle.transform["buffer"]) - particle.transform.buffer = this.getBuffer(particle.target); - var bufferContext = particle.transform.buffer.getContext('2d'); - bufferContext.clearRect(0, 0, particle.transform.buffer.width, particle.transform.buffer.height); - bufferContext.globalAlpha = particle.alpha; - bufferContext.drawImage(particle.target, 0, 0); - bufferContext.globalCompositeOperation = "source-atop"; - bufferContext.fillStyle = Proton.Util.rgbToHex(particle.transform.rgb); - bufferContext.fillRect(0, 0, particle.transform.buffer.width, particle.transform.buffer.height); - bufferContext.globalCompositeOperation = "source-over"; - bufferContext.globalAlpha = 1; - this.context.drawImage(particle.transform.buffer, 0, 0, particle.transform.buffer.width, particle.transform.buffer.height, x, y, w, h); - } else { - this.context.save(); - this.context.globalAlpha = particle.alpha; - this.context.translate(particle.p.x, particle.p.y); - this.context.rotate(Proton.MathUtils.degreeTransform(particle.rotation)); - this.context.translate(-particle.p.x, -particle.p.y); - this.context.drawImage(particle.target, 0, 0, particle.target.width, particle.target.height, x, y, w, h); - this.context.globalAlpha = 1; - this.context.restore(); - } - } - } else { - if (particle.transform["rgb"]) - this.context.fillStyle = 'rgba(' + particle.transform.rgb.r + ',' + particle.transform.rgb.g + ',' + particle.transform.rgb.b + ',' + particle.alpha + ')'; - else - this.context.fillStyle = particle.color; - this.context.beginPath(); - this.context.arc(particle.p.x, particle.p.y, particle.radius, 0, Math.PI * 2, true); - if (this.stroke) { - this.context.strokeStyle = this.stroke.color; - this.context.lineWidth = this.stroke.thinkness; - this.context.stroke(); - } + /** + * @param particle + */ - this.context.closePath(); - this.context.fill(); - } - } + }, { + key: 'onParticleCreated', + value: function onParticleCreated(particle) { + if (particle.body) { + particle.body = this.pool.get(particle.body, particle); + } else { + particle.body = this.pool.get(this.circleConf, particle); + } - CanvasRender.prototype.onParticleDead = function(particle) { + this.element.addChild(particle.body); + } - } + /** + * @param particle + */ - CanvasRender.prototype.getBuffer = function(image) { - if ( image instanceof Image) { - var size = image.width + '_' + image.height; - var canvas = this.bufferCache[size]; - if (!canvas) { - canvas = document.createElement('canvas'); - canvas.width = image.width; - canvas.height = image.height; - this.bufferCache[size] = canvas; - } - return canvas; - } - } + }, { + key: 'onParticleUpdate', + value: function onParticleUpdate(particle) { + this.transform(particle, particle.body); + if (this.setColor) particle.body.tint = ColorUtil.getHex16FromParticle(particle); + } - Proton.CanvasRender = CanvasRender; + /** + * @param particle + */ + }, { + key: 'onParticleDead', + value: function onParticleDead(particle) { + this.element.removeChild(particle.body); + this.pool.expire(particle.body); + particle.body = null; + } + }, { + key: 'destroy', + value: function destroy(particles) { + get(PixiRenderer.prototype.__proto__ || Object.getPrototypeOf(PixiRenderer.prototype), 'destroy', this).call(this); + this.pool.destroy(); + var i = particles.length; + while (i--) { + var particle = particles[i]; + if (particle.body) { + this.element.removeChild(particle.body); + } + } + } + }, { + key: 'transform', + value: function transform(particle, target) { + target.x = particle.p.x; + target.y = particle.p.y; - function PixelRender(proton, element, rectangle) { - PixelRender._super_.call(this, proton, element); - this.context = this.element.getContext('2d'); - this.imageData = null; - this.rectangle = null; - this.rectangle = rectangle; - this.createImageData(rectangle); - } + target.alpha = particle.alpha; + target.scale.x = particle.scale; + target.scale.y = particle.scale; - Proton.Util.inherits(PixelRender, Proton.BaseRender); - PixelRender.prototype.resize = function(width, height) { - this.element.width = width; - this.element.height = height; - } - PixelRender.prototype.createImageData = function(rectangle) { - if (!rectangle) - this.rectangle = new Proton.Rectangle(0, 0, this.element.width, this.element.height); - else - this.rectangle = rectangle; - this.imageData = this.context.createImageData(this.rectangle.width, this.rectangle.height); - this.context.putImageData(this.imageData, this.rectangle.x, this.rectangle.y); - } + // using cached version of MathUtils.PI_180 for slight performance increase. + target.rotation = particle.rotation * MathUtils.PI_180; // MathUtils.PI_180; + } + }, { + key: 'createBody', + value: function createBody(body, particle) { + if (body.isCircle) return this.createCircle(particle);else return this.createSprite(body); + } + }, { + key: 'createSprite', + value: function createSprite(body) { + var sprite = body.isInner ? PIXI.Sprite.fromImage(body.src) : new PIXI.Sprite(body); + sprite.anchor.x = 0.5; + sprite.anchor.y = 0.5; + + return sprite; + } + }, { + key: 'createCircle', + value: function createCircle(particle) { + var graphics = new PIXI.Graphics(); - PixelRender.prototype.start = function() { - PixelRender._super_.prototype.start.call(this); - }; + if (this.stroke) { + var stroke = this.stroke instanceof String ? this.stroke : 0x000000; + graphics.beginStroke(this.stroke); + } - PixelRender.prototype.onProtonUpdate = function() { - this.context.clearRect(this.rectangle.x, this.rectangle.y, this.rectangle.width, this.rectangle.height); - this.imageData = this.context.getImageData(this.rectangle.x, this.rectangle.y, this.rectangle.width, this.rectangle.height); - } + graphics.beginFill(particle.color || 0x008ced); + graphics.drawCircle(0, 0, particle.radius); + graphics.endFill(); - PixelRender.prototype.onProtonUpdateAfter = function() { - this.context.putImageData(this.imageData, this.rectangle.x, this.rectangle.y); - } + return graphics; + } + }]); + return PixiRenderer; +}(BaseRenderer); - PixelRender.prototype.onParticleCreated = function(particle) { +var MStack = function () { + function MStack() { + classCallCheck(this, MStack); - } + this.mats = []; + this.size = 0; - PixelRender.prototype.onParticleUpdate = function(particle) { - if (this.imageData) { - this.setPixel(this.imageData, Math.floor(particle.p.x - this.rectangle.x), Math.floor(particle.p.y - this.rectangle.y), particle); + for (var i = 0; i < 20; i++) { + this.mats.push(Mat3.create([0, 0, 0, 0, 0, 0, 0, 0, 0])); } } - PixelRender.prototype.setPixel = function(imagedata, x, y, particle) { - var rgb = particle.transform.rgb; - if ((x < 0) || (x > this.element.width) || (y < 0) || (y > this.elementwidth)) - return; + createClass(MStack, [{ + key: 'set', + value: function set$$1(m, i) { + if (i == 0) Mat3.set(m, this.mats[0]);else Mat3.multiply(this.mats[i - 1], m, this.mats[i]); - var i = ((y >> 0) * imagedata.width + (x >> 0)) * 4; + this.size = Math.max(this.size, i + 1); + } + }, { + key: 'push', + value: function push(m) { + if (this.size == 0) Mat3.set(m, this.mats[0]);else Mat3.multiply(this.mats[this.size - 1], m, this.mats[this.size]); - imagedata.data[i] = rgb.r; - imagedata.data[i + 1] = rgb.g; - imagedata.data[i + 2] = rgb.b; - imagedata.data[i + 3] = particle.alpha * 255; - } + this.size++; + } + }, { + key: 'pop', + value: function pop() { + if (this.size > 0) this.size--; + } + }, { + key: 'top', + value: function top() { + return this.mats[this.size - 1]; + } + }]); + return MStack; +}(); - PixelRender.prototype.onParticleDead = function(particle) { +var WebGLRenderer = function (_BaseRenderer) { + inherits(WebGLRenderer, _BaseRenderer); - } + function WebGLRenderer(element) { + classCallCheck(this, WebGLRenderer); - Proton.PixelRender = PixelRender; + var _this = possibleConstructorReturn(this, (WebGLRenderer.__proto__ || Object.getPrototypeOf(WebGLRenderer)).call(this, element)); + _this.gl = _this.element.getContext('experimental-webgl', { antialias: true, stencil: false, depth: false }); + if (!_this.gl) alert("Sorry your browser do not suppest WebGL!"); + _this.initVar(); + _this.setMaxRadius(); + _this.initShaders(); + _this.initBuffers(); - function WebGLRender(proton, element) { - WebGLRender._super_.call(this, proton, element); - this.gl = this.element.getContext('experimental-webgl', { - antialias : true, - stencil : false, - depth : false - }); - if (!this.gl) - alert("Sorry your browser do not suppest WebGL!"); - this.initVar(); - this.setMaxRadius(); - this.initShaders(); - this.initBuffers(); - this.gl.blendEquation(this.gl.FUNC_ADD); - this.gl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE_MINUS_SRC_ALPHA); - this.gl.enable(this.gl.BLEND); - } + _this.gl.blendEquation(_this.gl.FUNC_ADD); + _this.gl.blendFunc(_this.gl.SRC_ALPHA, _this.gl.ONE_MINUS_SRC_ALPHA); + _this.gl.enable(_this.gl.BLEND); + _this.addImg2Body = _this.addImg2Body.bind(_this); - Proton.Util.inherits(WebGLRender, Proton.BaseRender); - WebGLRender.prototype.resize = function(width, height) { - this.umat[4] = -2; - this.umat[7] = 1; - this.smat[0] = 1 / width; - this.smat[4] = 1 / height; - this.mstack.set(this.umat, 0); - this.mstack.set(this.smat, 1); - this.gl.viewport(0, 0, width, height); - this.element.width = width; - this.element.height = height; - } + _this.name = 'WebGLRenderer'; + return _this; + } - WebGLRender.prototype.setMaxRadius = function(radius) { - this.circleCanvasURL = this.createCircle(radius); - } + createClass(WebGLRenderer, [{ + key: 'init', + value: function init(proton) { + get(WebGLRenderer.prototype.__proto__ || Object.getPrototypeOf(WebGLRenderer.prototype), 'init', this).call(this, proton); + this.resize(this.element.width, this.element.height); + } + }, { + key: 'resize', + value: function resize(width, height) { + this.umat[4] = -2; + this.umat[7] = 1; - WebGLRender.prototype.getVertexShader = function() { - var vsSource = ["uniform vec2 viewport;", "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "uniform mat3 tMat;", "varying vec2 vTextureCoord;", "varying float alpha;", "void main() {", "vec3 v = tMat * vec3(aVertexPosition, 1.0);", "gl_Position = vec4(v.x, v.y, 0, 1);", "vTextureCoord = aTextureCoord;", "alpha = tMat[0][2];", "}"].join("\n"); - return vsSource; - } + this.smat[0] = 1 / width; + this.smat[4] = 1 / height; - WebGLRender.prototype.getFragmentShader = function() { - var fsSource = ["precision mediump float;", "varying vec2 vTextureCoord;", "varying float alpha;", "uniform sampler2D uSampler;", "uniform vec4 color;", "uniform bool useTexture;", "uniform vec3 uColor;", "void main() {", "vec4 textureColor = texture2D(uSampler, vTextureCoord);", "gl_FragColor = textureColor * vec4(uColor, 1.0);", "gl_FragColor.w *= alpha;", "}"].join("\n"); - return fsSource; - } + this.mstack.set(this.umat, 0); + this.mstack.set(this.smat, 1); - WebGLRender.prototype.initVar = function() { - this.mstack = new Proton.MStack(); - this.umat = Proton.Mat3.create([2, 0, 1, 0, -2, 0, -1, 1, 1]); - this.smat = Proton.Mat3.create([1 / 100, 0, 1, 0, 1 / 100, 0, 0, 0, 1]); - this.texturebuffers = {}; - } + this.gl.viewport(0, 0, width, height); + this.element.width = width; + this.element.height = height; + } + }, { + key: 'setMaxRadius', + value: function setMaxRadius(radius) { + this.circleCanvasURL = this.createCircle(radius); + } + }, { + key: 'getVertexShader', + value: function getVertexShader() { + var vsSource = ["uniform vec2 viewport;", "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "uniform mat3 tMat;", "varying vec2 vTextureCoord;", "varying float alpha;", "void main() {", "vec3 v = tMat * vec3(aVertexPosition, 1.0);", "gl_Position = vec4(v.x, v.y, 0, 1);", "vTextureCoord = aTextureCoord;", "alpha = tMat[0][2];", "}"].join("\n"); + return vsSource; + } + }, { + key: 'getFragmentShader', + value: function getFragmentShader() { + var fsSource = ["precision mediump float;", "varying vec2 vTextureCoord;", "varying float alpha;", "uniform sampler2D uSampler;", "uniform vec4 color;", "uniform bool useTexture;", "uniform vec3 uColor;", "void main() {", "vec4 textureColor = texture2D(uSampler, vTextureCoord);", "gl_FragColor = textureColor * vec4(uColor, 1.0);", "gl_FragColor.w *= alpha;", "}"].join("\n"); + return fsSource; + } + }, { + key: 'initVar', + value: function initVar() { + this.mstack = new MStack(); + this.umat = Mat3.create([2, 0, 1, 0, -2, 0, -1, 1, 1]); + this.smat = Mat3.create([1 / 100, 0, 1, 0, 1 / 100, 0, 0, 0, 1]); + this.texturebuffers = {}; + } + }, { + key: 'blendEquation', + value: function blendEquation(A) { + this.gl.blendEquation(this.gl[A]); + } + }, { + key: 'blendFunc', + value: function blendFunc(A, B) { + this.gl.blendFunc(this.gl[A], this.gl[B]); + } + }, { + key: 'getShader', + value: function getShader(gl, str, fs) { + var shader = fs ? gl.createShader(gl.FRAGMENT_SHADER) : gl.createShader(gl.VERTEX_SHADER); - WebGLRender.prototype.start = function() { - WebGLRender._super_.prototype.start.call(this); - this.resize(this.element.width, this.element.height); - } + gl.shaderSource(shader, str); + gl.compileShader(shader); - WebGLRender.prototype.blendEquation = function(A) { - this.gl.blendEquation(this.gl[A]); - } + if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { + alert(gl.getShaderInfoLog(shader)); + return null; + } - WebGLRender.prototype.blendFunc = function(A, B) { - this.gl.blendFunc(this.gl[A], this.gl[B]); - } + return shader; + } + }, { + key: 'initShaders', + value: function initShaders() { + var fragmentShader = this.getShader(this.gl, this.getFragmentShader(), true); + var vertexShader = this.getShader(this.gl, this.getVertexShader(), false); + + this.sprogram = this.gl.createProgram(); + this.gl.attachShader(this.sprogram, vertexShader); + this.gl.attachShader(this.sprogram, fragmentShader); + this.gl.linkProgram(this.sprogram); + + if (!this.gl.getProgramParameter(this.sprogram, this.gl.LINK_STATUS)) alert("Could not initialise shaders"); + + this.gl.useProgram(this.sprogram); + this.sprogram.vpa = this.gl.getAttribLocation(this.sprogram, "aVertexPosition"); + this.sprogram.tca = this.gl.getAttribLocation(this.sprogram, "aTextureCoord"); + this.gl.enableVertexAttribArray(this.sprogram.tca); + this.gl.enableVertexAttribArray(this.sprogram.vpa); + + this.sprogram.tMatUniform = this.gl.getUniformLocation(this.sprogram, "tMat"); + this.sprogram.samplerUniform = this.gl.getUniformLocation(this.sprogram, "uSampler"); + this.sprogram.useTex = this.gl.getUniformLocation(this.sprogram, "useTexture"); + this.sprogram.color = this.gl.getUniformLocation(this.sprogram, "uColor"); + this.gl.uniform1i(this.sprogram.useTex, 1); + } + }, { + key: 'initBuffers', + value: function initBuffers() { + var vs = [0, 3, 1, 0, 2, 3]; + var idx = void 0; + + this.unitIBuffer = this.gl.createBuffer(); + this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitIBuffer); + this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(vs), this.gl.STATIC_DRAW); + + var i = void 0; + var ids = []; + for (i = 0; i < 100; i++) { + ids.push(i); + }idx = new Uint16Array(ids); + + this.unitI33 = this.gl.createBuffer(); + this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitI33); + this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, idx, this.gl.STATIC_DRAW); + + ids = []; + for (i = 0; i < 100; i++) { + ids.push(i, i + 1, i + 2); + }idx = new Uint16Array(ids); + + this.stripBuffer = this.gl.createBuffer(); + this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.stripBuffer); + this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, idx, this.gl.STATIC_DRAW); + } + }, { + key: 'createCircle', + value: function createCircle(raidus) { + this.circleCanvasRadius = WebGLUtil.nhpot(Util.initValue(raidus, 32)); + var canvas = DomUtil.createCanvas('circle_canvas', this.circleCanvasRadius * 2, this.circleCanvasRadius * 2); + var context = canvas.getContext('2d'); + + context.beginPath(); + context.arc(this.circleCanvasRadius, this.circleCanvasRadius, this.circleCanvasRadius, 0, Math.PI * 2, true); + context.closePath(); + context.fillStyle = '#FFF'; + context.fill(); + + return canvas.toDataURL(); + } + }, { + key: 'drawImg2Canvas', + value: function drawImg2Canvas(particle) { + var _w = particle.body.width; + var _h = particle.body.height; - WebGLRender.prototype.getShader = function(gl, str, fs) { - var shader; - if (fs) - shader = gl.createShader(gl.FRAGMENT_SHADER); - else - shader = gl.createShader(gl.VERTEX_SHADER); - gl.shaderSource(shader, str); - gl.compileShader(shader); - - if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { - alert(gl.getShaderInfoLog(shader)); - return null; - } - return shader; - } + var _width = WebGLUtil.nhpot(particle.body.width); + var _height = WebGLUtil.nhpot(particle.body.height); - WebGLRender.prototype.initShaders = function() { - var fragmentShader = this.getShader(this.gl, this.getFragmentShader(), true); - var vertexShader = this.getShader(this.gl, this.getVertexShader(), false); - - this.sprogram = this.gl.createProgram(); - this.gl.attachShader(this.sprogram, vertexShader); - this.gl.attachShader(this.sprogram, fragmentShader); - this.gl.linkProgram(this.sprogram); - if (!this.gl.getProgramParameter(this.sprogram, this.gl.LINK_STATUS)) - alert("Could not initialise shaders"); - - this.gl.useProgram(this.sprogram); - this.sprogram.vpa = this.gl.getAttribLocation(this.sprogram, "aVertexPosition"); - this.sprogram.tca = this.gl.getAttribLocation(this.sprogram, "aTextureCoord"); - this.gl.enableVertexAttribArray(this.sprogram.tca); - this.gl.enableVertexAttribArray(this.sprogram.vpa); - - this.sprogram.tMatUniform = this.gl.getUniformLocation(this.sprogram, "tMat"); - this.sprogram.samplerUniform = this.gl.getUniformLocation(this.sprogram, "uSampler"); - this.sprogram.useTex = this.gl.getUniformLocation(this.sprogram, "useTexture"); - this.sprogram.color = this.gl.getUniformLocation(this.sprogram, "uColor"); - this.gl.uniform1i(this.sprogram.useTex, 1); - }; + var _scaleX = particle.body.width / _width; + var _scaleY = particle.body.height / _height; - WebGLRender.prototype.initBuffers = function() { - this.unitIBuffer = this.gl.createBuffer(); - this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitIBuffer); - var vs = [0, 3, 1, 0, 2, 3]; - this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(vs), this.gl.STATIC_DRAW); - - var ids = []; - for (var i = 0; i < 100; i++) - ids.push(i); - - idx = new Uint16Array(ids); - this.unitI33 = this.gl.createBuffer(); - this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitI33); - this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, idx, this.gl.STATIC_DRAW); - - ids = []; - for ( i = 0; i < 100; i++) - ids.push(i, i + 1, i + 2); - - idx = new Uint16Array(ids); - this.stripBuffer = this.gl.createBuffer(); - this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.stripBuffer); - this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, idx, this.gl.STATIC_DRAW); - }; + if (!this.texturebuffers[particle.transform.src]) this.texturebuffers[particle.transform.src] = [this.gl.createTexture(), this.gl.createBuffer(), this.gl.createBuffer()]; - WebGLRender.prototype.createCircle = function(raidus) { - this.circleCanvasRadius = Proton.WebGLUtil.nhpot(Proton.Util.initValue(raidus, 32)); - var canvas = Proton.DomUtil.createCanvas('circle_canvas', this.circleCanvasRadius * 2, this.circleCanvasRadius * 2); - var context = canvas.getContext('2d'); - context.beginPath(); - context.arc(this.circleCanvasRadius, this.circleCanvasRadius, this.circleCanvasRadius, 0, Math.PI * 2, true); - context.closePath(); - context.fillStyle = '#FFF'; - context.fill(); - return canvas.toDataURL(); - }; + particle.transform.texture = this.texturebuffers[particle.transform.src][0]; + particle.transform.vcBuffer = this.texturebuffers[particle.transform.src][1]; + particle.transform.tcBuffer = this.texturebuffers[particle.transform.src][2]; - WebGLRender.prototype.setImgInCanvas = function(particle) { - var _w = particle.target.width; - var _h = particle.target.height; - var _width = Proton.WebGLUtil.nhpot(particle.target.width); - var _height = Proton.WebGLUtil.nhpot(particle.target.height); - var _scaleX = particle.target.width / _width; - var _scaleY = particle.target.height / _height; - - if (!this.texturebuffers[particle.transform.src]) - this.texturebuffers[particle.transform.src] = [this.gl.createTexture(), this.gl.createBuffer(), this.gl.createBuffer()]; - particle.transform.texture = this.texturebuffers[particle.transform.src][0]; - particle.transform.vcBuffer = this.texturebuffers[particle.transform.src][1]; - particle.transform.tcBuffer = this.texturebuffers[particle.transform.src][2]; - this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.transform.tcBuffer); - this.gl.bufferData(this.gl.ARRAY_BUFFER, new Float32Array([0.0, 0.0, _scaleX, 0.0, 0.0, _scaleY, _scaleY, _scaleY]), this.gl.STATIC_DRAW); - this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.transform.vcBuffer); - this.gl.bufferData(this.gl.ARRAY_BUFFER, new Float32Array([0.0, 0.0, _w, 0.0, 0.0, _h, _w, _h]), this.gl.STATIC_DRAW); - - var context = particle.transform.canvas.getContext('2d'); - var data = context.getImageData(0, 0, _width, _height); - - this.gl.bindTexture(this.gl.TEXTURE_2D, particle.transform.texture); - this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, this.gl.RGBA, this.gl.UNSIGNED_BYTE, data); - this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MAG_FILTER, this.gl.LINEAR); - this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MIN_FILTER, this.gl.LINEAR_MIPMAP_NEAREST); - this.gl.generateMipmap(this.gl.TEXTURE_2D); - particle.transform.textureLoaded = true; - particle.transform.textureWidth = _w; - particle.transform.textureHeight = _h; - } + this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.transform.tcBuffer); + this.gl.bufferData(this.gl.ARRAY_BUFFER, new Float32Array([0.0, 0.0, _scaleX, 0.0, 0.0, _scaleY, _scaleY, _scaleY]), this.gl.STATIC_DRAW); + this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.transform.vcBuffer); + this.gl.bufferData(this.gl.ARRAY_BUFFER, new Float32Array([0.0, 0.0, _w, 0.0, 0.0, _h, _w, _h]), this.gl.STATIC_DRAW); - WebGLRender.prototype.setStroke = function(color, thinkness) { + var context = particle.transform.canvas.getContext('2d'); + var data = context.getImageData(0, 0, _width, _height); - } + this.gl.bindTexture(this.gl.TEXTURE_2D, particle.transform.texture); + this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, this.gl.RGBA, this.gl.UNSIGNED_BYTE, data); + this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MAG_FILTER, this.gl.LINEAR); + this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MIN_FILTER, this.gl.LINEAR_MIPMAP_NEAREST); + this.gl.generateMipmap(this.gl.TEXTURE_2D); - WebGLRender.prototype.onProtonUpdate = function() { - //this.gl.clearColor(0, 0, 0, 1); - //this.gl.clear(this.gl.COLOR_BUFFER_BIT | this.gl.DEPTH_BUFFER_BIT); - } + particle.transform.textureLoaded = true; + particle.transform.textureWidth = _w; + particle.transform.textureHeight = _h; + } + }, { + key: 'onProtonUpdate', + value: function onProtonUpdate() { + //this.gl.clearColor(0, 0, 0, 1); + //this.gl.clear(this.gl.COLOR_BUFFER_BIT | this.gl.DEPTH_BUFFER_BIT); + } + }, { + key: 'onParticleCreated', + value: function onParticleCreated(particle) { + particle.transform.textureLoaded = false; + particle.transform.tmat = Mat3.create(); + particle.transform.tmat[8] = 1; + particle.transform.imat = Mat3.create(); + particle.transform.imat[8] = 1; + + if (particle.body) { + ImgUtil.getImgFromCache(particle.body, this.addImg2Body, particle); + } else { + ImgUtil.getImgFromCache(this.circleCanvasURL, this.addImg2Body, particle); + particle.transform.oldScale = particle.radius / this.circleCanvasRadius; + } + } - WebGLRender.prototype.onParticleCreated = function(particle) { - var self = this; - particle.transform.textureLoaded = false; - particle.transform.tmat = Proton.Mat3.create(); - particle.transform.tmat[8] = 1; - particle.transform.imat = Proton.Mat3.create(); - particle.transform.imat[8] = 1; - if (particle.target) { - Proton.Util.getImage(particle.target, particle, true, function(particle) { - self.setImgInCanvas.call(self, particle); - particle.transform.oldScale = 1; - }); - } else { - Proton.Util.getImage(this.circleCanvasURL, particle, true, function(particle) { - self.setImgInCanvas.call(self, particle); - particle.transform.oldScale = particle.radius / self.circleCanvasRadius; - }); - } - } + // private - WebGLRender.prototype.onParticleUpdate = function(particle) { - if (particle.transform.textureLoaded) { - this.updateMatrix(particle); - this.gl.uniform3f(this.sprogram.color, particle.transform.rgb.r / 255, particle.transform.rgb.g / 255, particle.transform.rgb.b / 255); - this.gl.uniformMatrix3fv(this.sprogram.tMatUniform, false, this.mstack.top()); - this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.transform.vcBuffer); - this.gl.vertexAttribPointer(this.sprogram.vpa, 2, this.gl.FLOAT, false, 0, 0); - this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.transform.tcBuffer); - this.gl.vertexAttribPointer(this.sprogram.tca, 2, this.gl.FLOAT, false, 0, 0); - this.gl.bindTexture(this.gl.TEXTURE_2D, particle.transform.texture); - this.gl.uniform1i(this.sprogram.samplerUniform, 0); - this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitIBuffer); - this.gl.drawElements(this.gl.TRIANGLES, 6, this.gl.UNSIGNED_SHORT, 0); - this.mstack.pop(); - } - } + }, { + key: 'addImg2Body', + value: function addImg2Body(img, particle) { + if (particle.dead) return; - WebGLRender.prototype.onParticleDead = function(particle) { - - } + particle.body = img; + particle.transform.src = img.src; + particle.transform.canvas = ImgUtil.getCanvasFromCache(img); + particle.transform.oldScale = 1; - WebGLRender.prototype.updateMatrix = function(particle) { - var moveOriginMatrix = Proton.WebGLUtil.makeTranslation(-particle.transform.textureWidth / 2, -particle.transform.textureHeight / 2); - var translationMatrix = Proton.WebGLUtil.makeTranslation(particle.p.x, particle.p.y); - var angel = particle.rotation * (Math.PI / 180); - var rotationMatrix = Proton.WebGLUtil.makeRotation(angel); - var scale = particle.scale * particle.transform.oldScale; - var scaleMatrix = Proton.WebGLUtil.makeScale(scale, scale); - - var matrix = Proton.WebGLUtil.matrixMultiply(moveOriginMatrix, scaleMatrix); - matrix = Proton.WebGLUtil.matrixMultiply(matrix, rotationMatrix); - matrix = Proton.WebGLUtil.matrixMultiply(matrix, translationMatrix); - - Proton.Mat3.inverse(matrix, particle.transform.imat); - matrix[2] = particle.alpha; - this.mstack.push(matrix); - } + this.drawImg2Canvas(particle); + } + }, { + key: 'onParticleUpdate', + value: function onParticleUpdate(particle) { + if (particle.transform.textureLoaded) { + this.updateMatrix(particle); + + this.gl.uniform3f(this.sprogram.color, particle.transform.rgb.r / 255, particle.transform.rgb.g / 255, particle.transform.rgb.b / 255); + this.gl.uniformMatrix3fv(this.sprogram.tMatUniform, false, this.mstack.top()); + + this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.transform.vcBuffer); + this.gl.vertexAttribPointer(this.sprogram.vpa, 2, this.gl.FLOAT, false, 0, 0); + this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.transform.tcBuffer); + this.gl.vertexAttribPointer(this.sprogram.tca, 2, this.gl.FLOAT, false, 0, 0); + this.gl.bindTexture(this.gl.TEXTURE_2D, particle.transform.texture); + this.gl.uniform1i(this.sprogram.samplerUniform, 0); + this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitIBuffer); + + this.gl.drawElements(this.gl.TRIANGLES, 6, this.gl.UNSIGNED_SHORT, 0); + + this.mstack.pop(); + } + } + }, { + key: 'onParticleDead', + value: function onParticleDead(particle) {} + }, { + key: 'updateMatrix', + value: function updateMatrix(particle) { + var moveOriginMatrix = WebGLUtil.makeTranslation(-particle.transform.textureWidth / 2, -particle.transform.textureHeight / 2); + var translationMatrix = WebGLUtil.makeTranslation(particle.p.x, particle.p.y); - Proton.WebGLRender = WebGLRender; + var angel = particle.rotation * MathUtils.PI_180; + var rotationMatrix = WebGLUtil.makeRotation(angel); + var scale = particle.scale * particle.transform.oldScale; + var scaleMatrix = WebGLUtil.makeScale(scale, scale); + var matrix = WebGLUtil.matrixMultiply(moveOriginMatrix, scaleMatrix); + matrix = WebGLUtil.matrixMultiply(matrix, rotationMatrix); + matrix = WebGLUtil.matrixMultiply(matrix, translationMatrix); - function Zone() { - this.vector = new Proton.Vector2D(0, 0); - this.random = 0; - this.crossType = "dead"; - this.alert = true; - } + Mat3.inverse(matrix, particle.transform.imat); + matrix[2] = particle.alpha; + this.mstack.push(matrix); + } + }]); + return WebGLRenderer; +}(BaseRenderer); - Zone.prototype = { - getPosition : function() { +var CustomRenderer = function (_BaseRenderer) { + inherits(CustomRenderer, _BaseRenderer); - }, + function CustomRenderer(element) { + classCallCheck(this, CustomRenderer); - crossing : function(particle) { + var _this = possibleConstructorReturn(this, (CustomRenderer.__proto__ || Object.getPrototypeOf(CustomRenderer)).call(this, element)); - } - }; + _this.name = 'CustomRenderer'; + return _this; + } + + return CustomRenderer; +}(BaseRenderer); - Proton.Zone = Zone; +var CircleZone = function (_Zone) { + inherits(CircleZone, _Zone); + function CircleZone(x1, y1, x2, y2, direction) { + classCallCheck(this, CircleZone); + var _this = possibleConstructorReturn(this, (CircleZone.__proto__ || Object.getPrototypeOf(CircleZone)).call(this)); - function LineZone(x1, y1, x2, y2, direction) { - LineZone._super_.call(this); if (x2 - x1 >= 0) { - this.x1 = x1; - this.y1 = y1; - this.x2 = x2; - this.y2 = y2; + _this.x1 = x1; + _this.y1 = y1; + _this.x2 = x2; + _this.y2 = y2; } else { - this.x1 = x2; - this.y1 = y2; - this.x2 = x1; - this.y2 = y1; + _this.x1 = x2; + _this.y1 = y2; + _this.x2 = x1; + _this.y2 = y1; } - this.dx = this.x2 - this.x1; - this.dy = this.y2 - this.y1; - this.minx = Math.min(this.x1, this.x2); - this.miny = Math.min(this.y1, this.y2); - this.maxx = Math.max(this.x1, this.x2); - this.maxy = Math.max(this.y1, this.y2); - this.dot = this.x2 * this.y1 - this.x1 * this.y2; - this.xxyy = this.dx * this.dx + this.dy * this.dy; - this.gradient = this.getGradient(); - this.length = this.getLength(); - this.direction = Proton.Util.initValue(direction, '>'); - } - - Proton.Util.inherits(LineZone, Proton.Zone); - LineZone.prototype.getPosition = function() { - this.random = Math.random(); - this.vector.x = this.x1 + this.random * this.length * Math.cos(this.gradient); - this.vector.y = this.y1 + this.random * this.length * Math.sin(this.gradient); - return this.vector; - } + _this.dx = _this.x2 - _this.x1; + _this.dy = _this.y2 - _this.y1; - LineZone.prototype.getDirection = function(x, y) { - var A = this.dy; - var B = -this.dx; - var C = this.dot; - var D = B == 0 ? 1 : B; - if ((A * x + B * y + C) * D > 0) - return true - else - return false; - } + _this.minx = Math.min(_this.x1, _this.x2); + _this.miny = Math.min(_this.y1, _this.y2); + _this.maxx = Math.max(_this.x1, _this.x2); + _this.maxy = Math.max(_this.y1, _this.y2); - LineZone.prototype.getDistance = function(x, y) { - var A = this.dy; - var B = -this.dx; - var C = this.dot; - var D = (A * x + B * y + C); - return D / Math.sqrt(this.xxyy); - } + _this.dot = _this.x2 * _this.y1 - _this.x1 * _this.y2; + _this.xxyy = _this.dx * _this.dx + _this.dy * _this.dy; - LineZone.prototype.getSymmetric = function(v) { - var tha2 = v.getGradient(); - var tha1 = this.getGradient(); - var tha = 2 * (tha1 - tha2); - var oldx = v.x; - var oldy = v.y; - v.x = oldx * Math.cos(tha) - oldy * Math.sin(tha); - v.y = oldx * Math.sin(tha) + oldy * Math.cos(tha); - return v; + _this.gradient = _this.getGradient(); + _this.length = _this.getLength(); + _this.direction = Util.initValue(direction, '>'); + return _this; } - LineZone.prototype.getGradient = function() { - return Math.atan2(this.dy, this.dx); - } + createClass(CircleZone, [{ + key: 'getPosition', + value: function getPosition() { + this.random = Math.random(); + this.vector.x = this.x1 + this.random * this.length * Math.cos(this.gradient); + this.vector.y = this.y1 + this.random * this.length * Math.sin(this.gradient); - LineZone.prototype.getRange = function(particle, fun) { - var angle = Math.abs(this.getGradient()); - if (angle <= Math.PI / 4) { - if (particle.p.x < this.maxx && particle.p.x > this.minx) { - fun(); - } - } else { - if (particle.p.y < this.maxy && particle.p.y > this.miny) { - fun(); - } + return this.vector; } - } + }, { + key: 'getDirection', + value: function getDirection(x, y) { + var A = this.dy; + var B = -this.dx; + var C = this.dot; + var D = B == 0 ? 1 : B; + + if ((A * x + B * y + C) * D > 0) return true;else return false; + } + }, { + key: 'getDistance', + value: function getDistance(x, y) { + var A = this.dy; + var B = -this.dx; + var C = this.dot; + var D = A * x + B * y + C; + + return D / Math.sqrt(this.xxyy); + } + }, { + key: 'getSymmetric', + value: function getSymmetric(v) { + var tha2 = v.getGradient(); + var tha1 = this.getGradient(); + var tha = 2 * (tha1 - tha2); - LineZone.prototype.getLength = function() { - return Math.sqrt(this.dx * this.dx + this.dy * this.dy) - } + var oldx = v.x; + var oldy = v.y; - LineZone.prototype.crossing = function(particle) { - var self = this; - if (this.crossType == "dead") { - if (this.direction == ">" || this.direction == "R" || this.direction == "right" || this.direction == "down") { - this.getRange(particle, function() { - if (self.getDirection(particle.p.x, particle.p.y)) - particle.dead = true; - }) + v.x = oldx * Math.cos(tha) - oldy * Math.sin(tha); + v.y = oldx * Math.sin(tha) + oldy * Math.cos(tha); + + return v; + } + }, { + key: 'getGradient', + value: function getGradient() { + return Math.atan2(this.dy, this.dx); + } + }, { + key: 'rangeOut', + value: function rangeOut(particle) { + var angle = Math.abs(this.getGradient()); + + if (angle <= MathUtils.PI / 4) { + if (particle.p.x <= this.maxx && particle.p.x >= this.minx) return true; } else { - this.getRange(particle, function() { - if (!self.getDirection(particle.p.x, particle.p.y)) - particle.dead = true; - }) + if (particle.p.y <= this.maxy && particle.p.y >= this.miny) return true; } - } else if (this.crossType == "bound") { - this.getRange(particle, function() { - if (self.getDistance(particle.p.x, particle.p.y) <= particle.radius) { - if (self.dx == 0) { + + return false; + } + }, { + key: 'getLength', + value: function getLength() { + return Math.sqrt(this.dx * this.dx + this.dy * this.dy); + } + }, { + key: 'crossing', + value: function crossing(particle) { + if (this.crossType == "dead") { + if (this.direction == ">" || this.direction == "R" || this.direction == "right" || this.direction == "down") { + if (!this.rangeOut(particle)) return; + if (this.getDirection(particle.p.x, particle.p.y)) particle.dead = true; + } else { + if (!this.rangeOut(particle)) return; + if (!this.getDirection(particle.p.x, particle.p.y)) particle.dead = true; + } + } else if (this.crossType == "bound") { + if (!this.rangeOut(particle)) return; + + if (this.getDistance(particle.p.x, particle.p.y) <= particle.radius) { + if (this.dx == 0) { particle.v.x *= -1; - } else if (self.dy == 0) { + } else if (this.dy == 0) { particle.v.y *= -1; } else { - self.getSymmetric(particle.v); + this.getSymmetric(particle.v); } } - }); - } else if (this.crossType == "cross") { - if (this.alert) { - alert('Sorry lineZone does not support cross method'); - this.alert = false; + } else if (this.crossType == "cross") { + if (this.alert) { + console.error('Sorry lineZone does not support cross method'); + this.alert = false; + } } } - } - - Proton.LineZone = LineZone; + }]); + return CircleZone; +}(Zone); +var CircleZone$1 = function (_Zone) { + inherits(CircleZone, _Zone); + function CircleZone(x, y, radius) { + classCallCheck(this, CircleZone); - function CircleZone(x, y, radius) { - CircleZone._super_.call(this); - this.x = x; - this.y = y; - this.radius = radius; - this.angle = 0; - this.center = { - x : this.x, - y : this.y - }; - } - + var _this = possibleConstructorReturn(this, (CircleZone.__proto__ || Object.getPrototypeOf(CircleZone)).call(this)); - Proton.Util.inherits(CircleZone, Proton.Zone); - CircleZone.prototype.getPosition = function() { - this.random = Math.random(); - this.angle = Math.PI * 2 * Math.random(); - this.vector.x = this.x + this.random * this.radius * Math.cos(this.angle); - this.vector.y = this.y + this.random * this.radius * Math.sin(this.angle); - return this.vector; - } + _this.x = x; + _this.y = y; + _this.radius = radius; - CircleZone.prototype.setCenter = function(x, y) { - this.center.x = x; - this.center.y = y; - } + _this.angle = 0; + _this.center = { x: x, y: y }; + return _this; + } - CircleZone.prototype.crossing = function(particle) { - var d = particle.p.distanceTo(this.center); - if (this.crossType == "dead") { - if (d - particle.radius > this.radius) - particle.dead = true; - } else if (this.crossType == "bound") { - if (d + particle.radius >= this.radius) - this.getSymmetric(particle); - } else if (this.crossType == "cross") { - if (this.alert) { - alert('Sorry CircleZone does not support cross method'); - this.alert = false; - } - } - } + createClass(CircleZone, [{ + key: 'getPosition', + value: function getPosition() { + this.random = Math.random(); + this.angle = MathUtils.PIx2 * Math.random(); - CircleZone.prototype.getSymmetric = function(particle) { - var tha2 = particle.v.getGradient(); - var tha1 = this.getGradient(particle); - var tha = 2 * (tha1 - tha2); - var oldx = particle.v.x; - var oldy = particle.v.y; - particle.v.x = oldx * Math.cos(tha) - oldy * Math.sin(tha); - particle.v.y = oldx * Math.sin(tha) + oldy * Math.cos(tha); - } + this.vector.x = this.x + this.random * this.radius * Math.cos(this.angle); + this.vector.y = this.y + this.random * this.radius * Math.sin(this.angle); - CircleZone.prototype.getGradient = function(particle) { - return -Math.PI / 2 + Math.atan2(particle.p.y - this.center.y, particle.p.x - this.center.x); - } + return this.vector; + } + }, { + key: 'setCenter', + value: function setCenter(x, y) { + this.center.x = x; + this.center.y = y; + } + }, { + key: 'crossing', + value: function crossing(particle) { + var d = particle.p.distanceTo(this.center); + + if (this.crossType == "dead") { + if (d - particle.radius > this.radius) particle.dead = true; + } else if (this.crossType == "bound") { + if (d + particle.radius >= this.radius) this.getSymmetric(particle); + } else if (this.crossType == "cross") { + if (this.alert) { + alert('Sorry CircleZone does not support cross method'); + this.alert = false; + } + } + } + }, { + key: 'getSymmetric', + value: function getSymmetric(particle) { + var tha2 = particle.v.getGradient(); + var tha1 = this.getGradient(particle); + + var tha = 2 * (tha1 - tha2); + var oldx = particle.v.x; + var oldy = particle.v.y; + + particle.v.x = oldx * Math.cos(tha) - oldy * Math.sin(tha); + particle.v.y = oldx * Math.sin(tha) + oldy * Math.cos(tha); + } + }, { + key: 'getGradient', + value: function getGradient(particle) { + return -MathUtils.PI_2 + Math.atan2(particle.p.y - this.center.y, particle.p.x - this.center.x); + } + }]); + return CircleZone; +}(Zone); - Proton.CircleZone = CircleZone; +var PointZoneRectZone = function (_Zone) { + inherits(PointZoneRectZone, _Zone); + function PointZoneRectZone(x, y, width, height) { + classCallCheck(this, PointZoneRectZone); + var _this = possibleConstructorReturn(this, (PointZoneRectZone.__proto__ || Object.getPrototypeOf(PointZoneRectZone)).call(this)); - function PointZone(x, y) { - PointZone._super_.call(this); - this.x = x; - this.y = y; + _this.x = x; + _this.y = y; + _this.width = width; + _this.height = height; + return _this; } + createClass(PointZoneRectZone, [{ + key: "getPosition", + value: function getPosition() { + this.vector.x = this.x + Math.random() * this.width; + this.vector.y = this.y + Math.random() * this.height; - Proton.Util.inherits(PointZone, Proton.Zone); - PointZone.prototype.getPosition = function() { - this.vector.x = this.x; - this.vector.y = this.y; - return this.vector; - } - - PointZone.prototype.crossing = function(particle) { - if (this.alert) { - alert('Sorry PointZone does not support crossing method'); - this.alert = false; + return this.vector; } - } - - Proton.PointZone = PointZone; - - - - function RectZone(x, y, width, height) { - RectZone._super_.call(this); - this.x = x; - this.y = y; - this.width = width; - this.height = height; - } - + }, { + key: "crossing", + value: function crossing(particle) { + if (this.crossType == "dead") { + if (particle.p.x + particle.radius < this.x) particle.dead = true;else if (particle.p.x - particle.radius > this.x + this.width) particle.dead = true; + + if (particle.p.y + particle.radius < this.y) particle.dead = true;else if (particle.p.y - particle.radius > this.y + this.height) particle.dead = true; + } else if (this.crossType == "bound") { + if (particle.p.x - particle.radius < this.x) { + particle.p.x = this.x + particle.radius; + particle.v.x *= -1; + } else if (particle.p.x + particle.radius > this.x + this.width) { + particle.p.x = this.x + this.width - particle.radius; + particle.v.x *= -1; + } - Proton.Util.inherits(RectZone, Proton.Zone); - RectZone.prototype.getPosition = function() { - this.vector.x = this.x + Math.random() * this.width; - this.vector.y = this.y + Math.random() * this.height; - return this.vector; - } + if (particle.p.y - particle.radius < this.y) { + particle.p.y = this.y + particle.radius; + particle.v.y *= -1; + } else if (particle.p.y + particle.radius > this.y + this.height) { + particle.p.y = this.y + this.height - particle.radius; + particle.v.y *= -1; + } + } else if (this.crossType == "cross") { + if (particle.p.x + particle.radius < this.x && particle.v.x <= 0) particle.p.x = this.x + this.width + particle.radius;else if (particle.p.x - particle.radius > this.x + this.width && particle.v.x >= 0) particle.p.x = this.x - particle.radius; - RectZone.prototype.crossing = function(particle) { - if (this.crossType == "dead") { - if (particle.p.x + particle.radius < this.x) - particle.dead = true; - else if (particle.p.x - particle.radius > this.x + this.width) - particle.dead = true; - - if (particle.p.y + particle.radius < this.y) - particle.dead = true; - else if (particle.p.y - particle.radius > this.y + this.height) - particle.dead = true; - } else if (this.crossType == "bound") { - if (particle.p.x - particle.radius < this.x) { - particle.p.x = this.x + particle.radius; - particle.v.x *= -1; - } else if (particle.p.x + particle.radius > this.x + this.width) { - particle.p.x = this.x + this.width - particle.radius; - particle.v.x *= -1; + if (particle.p.y + particle.radius < this.y && particle.v.y <= 0) particle.p.y = this.y + this.height + particle.radius;else if (particle.p.y - particle.radius > this.y + this.height && particle.v.y >= 0) particle.p.y = this.y - particle.radius; } - - if (particle.p.y - particle.radius < this.y) { - particle.p.y = this.y + particle.radius; - particle.v.y *= -1; - } else if (particle.p.y + particle.radius > this.y + this.height) { - particle.p.y = this.y + this.height - particle.radius; - particle.v.y *= -1; - } - } else if (this.crossType == "cross") { - if (particle.p.x + particle.radius < this.x && particle.v.x <= 0) - particle.p.x = this.x + this.width + particle.radius; - else if (particle.p.x - particle.radius > this.x + this.width && particle.v.x >= 0) - particle.p.x = this.x - particle.radius; - - if (particle.p.y + particle.radius < this.y && particle.v.y <= 0) - particle.p.y = this.y + this.height + particle.radius; - else if (particle.p.y - particle.radius > this.y + this.height && particle.v.y >= 0) - particle.p.y = this.y - particle.radius; } - } - - Proton.RectZone = RectZone; - + }]); + return PointZoneRectZone; +}(Zone); +var ImageZone = function (_Zone) { + inherits(ImageZone, _Zone); function ImageZone(imageData, x, y, d) { - ImageZone._super_.call(this); - this.reset(imageData, x, y, d); - } + classCallCheck(this, ImageZone); + var _this = possibleConstructorReturn(this, (ImageZone.__proto__ || Object.getPrototypeOf(ImageZone)).call(this)); - Proton.Util.inherits(ImageZone, Proton.Zone); - ImageZone.prototype.reset = function(imageData, x, y, d) { - this.imageData = imageData; - this.x = Proton.Util.initValue(x, 0); - this.y = Proton.Util.initValue(y, 0); - this.d = Proton.Util.initValue(d, 2); - this.vectors = []; - this.setVectors(); + _this.reset(imageData, x, y, d); + return _this; } - ImageZone.prototype.setVectors = function() { - var i, j; - var length1 = this.imageData.width; - var length2 = this.imageData.height; - for ( i = 0; i < length1; i += this.d) { - for ( j = 0; j < length2; j += this.d) { - var index = ((j >> 0) * length1 + (i >> 0)) * 4; - if (this.imageData.data[index + 3] > 0) { - this.vectors.push({ - x : i + this.x, - y : j + this.y - }); + createClass(ImageZone, [{ + key: 'reset', + value: function reset(imageData, x, y, d) { + this.imageData = imageData; + this.x = Util.initValue(x, 0); + this.y = Util.initValue(y, 0); + this.d = Util.initValue(d, 2); + + this.vectors = []; + this.setVectors(); + } + }, { + key: 'setVectors', + value: function setVectors() { + var i = void 0, + j = void 0; + var length1 = this.imageData.width; + var length2 = this.imageData.height; + + for (i = 0; i < length1; i += this.d) { + for (j = 0; j < length2; j += this.d) { + var index = ((j >> 0) * length1 + (i >> 0)) * 4; + + if (this.imageData.data[index + 3] > 0) { + this.vectors.push({ x: i + this.x, y: j + this.y }); + } } } - } - return this.vector; - } - ImageZone.prototype.getBound = function(x, y) { - var index = ((y >> 0) * this.imageData.width + (x >> 0)) * 4; - if (this.imageData.data[index + 3] > 0) - return true; - else - return false; - } - - ImageZone.prototype.getPosition = function() { - return this.vector.copy(this.vectors[Math.floor(Math.random() * this.vectors.length)]); - } - - ImageZone.prototype.getColor = function(x, y) { - x -= this.x; - y -= this.y; - var i = ((y >> 0) * this.imageData.width + (x >> 0)) * 4; - return { - r : this.imageData.data[i], - g : this.imageData.data[i + 1], - b : this.imageData.data[i + 2], - a : this.imageData.data[i + 3] - }; - } - - ImageZone.prototype.crossing = function(particle) { - if (this.crossType == "dead") { - if (this.getBound(particle.p.x - this.x, particle.p.y - this.y)) - particle.dead = true; - else - particle.dead = false; - } else if (this.crossType == "bound") { - if (!this.getBound(particle.p.x - this.x, particle.p.y - this.y)) - particle.v.negate(); + return this.vector; } - } - - Proton.ImageZone = ImageZone; - - - - var Debug = Debug || { - addEventListener : function(proton, fun) { - proton.addEventListener(Proton.PROTON_UPDATE, function() { - fun(); - }); - }, - - setStyle : function(c) { - var color = c || '#ff0000'; - var rgb = Proton.Util.hexToRGB(color); - var style = 'rgba(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ',' + 0.5 + ')'; - - return style; - }, - - drawZone : function(proton, canvas, zone, clear) { - var context = canvas.getContext('2d'); - var style = this.setStyle(); - - this.addEventListener(proton, function() { - if (clear) - context.clearRect(0, 0, canvas.width, canvas.height); - - if ( zone instanceof Proton.PointZone) { - context.beginPath(); - context.fillStyle = style; - context.arc(zone.x, zone.y, 10, 0, Math.PI * 2, true); - context.fill(); - context.closePath(); - } else if ( zone instanceof Proton.LineZone) { - context.beginPath(); - context.strokeStyle = style; - context.moveTo(zone.x1, zone.y1); - context.lineTo(zone.x2, zone.y2); - context.stroke(); - context.closePath(); - } else if ( zone instanceof Proton.RectZone) { - context.beginPath(); - context.strokeStyle = style; - context.drawRect(zone.x, zone.y, zone.width, zone.height); - context.stroke(); - context.closePath(); - } else if ( zone instanceof Proton.CircleZone) { - context.beginPath(); - context.strokeStyle = style; - context.arc(zone.x, zone.y, zone.radius, 0, Math.PI * 2, true); - context.stroke(); - context.closePath(); - } - }); - }, + }, { + key: 'getBound', + value: function getBound(x, y) { + var index = ((y >> 0) * this.imageData.width + (x >> 0)) * 4; + if (this.imageData.data[index + 3] > 0) return true;else return false; + } + }, { + key: 'getPosition', + value: function getPosition() { + return this.vector.copy(this.vectors[Math.floor(Math.random() * this.vectors.length)]); + } + }, { + key: 'getColor', + value: function getColor(x, y) { + x -= this.x; + y -= this.y; + var i = ((y >> 0) * this.imageData.width + (x >> 0)) * 4; + + return { + r: this.imageData.data[i], + g: this.imageData.data[i + 1], + b: this.imageData.data[i + 2], + a: this.imageData.data[i + 3] + }; + } + }, { + key: 'crossing', + value: function crossing(particle) { + if (this.crossType == "dead") { + if (this.getBound(particle.p.x - this.x, particle.p.y - this.y)) particle.dead = true;else particle.dead = false; + } else if (this.crossType == "bound") { + if (!this.getBound(particle.p.x - this.x, particle.p.y - this.y)) particle.v.negate(); + } + } + }]); + return ImageZone; +}(Zone); + +var Debug = { + addEventListener: function addEventListener(proton, fun) { + proton.addEventListener("PROTON_UPDATE_AFTER", function () { + return fun(); + }); + }, + getStyle: function getStyle(color) { + var rgb = ColorUtil.hexToRGB(color || '#ff0000'); + return 'rgba(' + rgb.r + ', ' + rgb.g + ', ' + rgb.b + ', 0.5)'; + }, + drawZone: function drawZone(proton, canvas, zone, clear) { + var context = canvas.getContext('2d'); + var style = this.getStyle(); - drawEmitter : function(proton, canvas, emitter, clear) { - var context = canvas.getContext('2d'); - var style = this.setStyle(); - this.addEventListener(proton, function() { - if (clear) - context.clearRect(0, 0, canvas.width, canvas.height); + this.addEventListener(proton, function () { + if (clear) context.clearRect(0, 0, canvas.width, canvas.height); + if (zone instanceof PointZone) { context.beginPath(); context.fillStyle = style; - context.arc(emitter.p.x, emitter.p.y, 10, 0, Math.PI * 2, true); + context.arc(zone.x, zone.y, 10, 0, Math.PI * 2, true); context.fill(); context.closePath(); - }); - }, - - test : {}, + } else if (zone instanceof CircleZone) { + context.beginPath(); + context.strokeStyle = style; + context.moveTo(zone.x1, zone.y1); + context.lineTo(zone.x2, zone.y2); + context.stroke(); + context.closePath(); + } else if (zone instanceof PointZoneRectZone) { + context.beginPath(); + context.strokeStyle = style; + context.drawRect(zone.x, zone.y, zone.width, zone.height); + context.stroke(); + context.closePath(); + } else if (zone instanceof CircleZone$1) { + context.beginPath(); + context.strokeStyle = style; + context.arc(zone.x, zone.y, zone.radius, 0, Math.PI * 2, true); + context.stroke(); + context.closePath(); + } + }); + }, + drawEmitter: function drawEmitter(proton, canvas, emitter, clear) { + var context = canvas.getContext('2d'); + var style = this.getStyle(); - setTest : function(id, value) { - this.test[id] = value; - }, + this.addEventListener(proton, function () { + if (clear) context.clearRect(0, 0, canvas.width, canvas.height); - getTest : function(id) { - if (this.test.hasOwnProperty(id)) - return this.test[id]; - else - return false; - } + context.beginPath(); + context.fillStyle = style; + context.arc(emitter.p.x, emitter.p.y, 10, 0, Math.PI * 2, true); + context.fill(); + context.closePath(); + }); } - - Proton.Debug = Debug; - +}; // http://paulirish.com/2011/requestanimationframe-for-smart-animating/ // http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating // requestAnimationFrame polyfill by Erik Möller // fixes from Paul Irish and Tino Zijdel -( function() { - var lastTime = 0; - var vendors = ['ms', 'moz', 'webkit', 'o']; - for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) { - window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame']; - window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame']; - } - - if (!window.requestAnimationFrame) - window.requestAnimationFrame = function(callback, element) { - var currTime = new Date().getTime(); - var timeToCall = Math.max(0, 16 - (currTime - lastTime)); - var id = window.setTimeout(function() { - callback(currTime + timeToCall); - }, timeToCall); - lastTime = currTime + timeToCall; - return id; - }; - - if (!window.cancelAnimationFrame) - window.cancelAnimationFrame = function(id) { - clearTimeout(id); - }; - }()); +(function () { + var lastTime = 0; + var vendors = ['ms', 'moz', 'webkit', 'o']; + for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) { + window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame']; + window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame']; + } + + if (!window.requestAnimationFrame) window.requestAnimationFrame = function (callback, element) { + var currTime = new Date().getTime(); + var timeToCall = Math.max(0, 16 - (currTime - lastTime)); + var id = window.setTimeout(function () { + callback(currTime + timeToCall); + }, timeToCall); + lastTime = currTime + timeToCall; + return id; + }; - return Proton; -})); \ No newline at end of file + if (!window.cancelAnimationFrame) window.cancelAnimationFrame = function (id) { + clearTimeout(id); + }; +})(); + +// import +// namespace +Proton$1.Particle = Proton$1.P = Particle; +Proton$1.Pool = Pool; + +Proton$1.Util = Util; +Proton$1.ColorUtil = ColorUtil; +Proton$1.MathUtils = MathUtils; +Proton$1.Vector2D = Proton$1.Vector = Vector2D; +Proton$1.Polar2D = Proton$1.Polar = Polar2D; +Proton$1.ArraySpan = ArraySpan; +Proton$1.Rectangle = Rectangle; +Proton$1.Rate = Rate; +Proton$1.ease = ease; +Proton$1.Span = Span; +Proton$1.Mat3 = Mat3; +Proton$1.getSpan = function (a, b, center) { + return new Span(a, b, center); +}; +Proton$1.createArraySpan = ArraySpan.createArraySpan; + +Proton$1.Initialize = Proton$1.Init = Initialize; +Proton$1.Life = Proton$1.L = Life; +Proton$1.Position = Proton$1.P = Position; +Proton$1.Velocity = Proton$1.V = Velocity; +Proton$1.Mass = Proton$1.M = Mass; +Proton$1.Radius = Proton$1.R = Radius; +Proton$1.Body = Proton$1.B = Body; + +Proton$1.Behaviour = Behaviour; +Proton$1.Force = Proton$1.F = Force; +Proton$1.Attraction = Proton$1.A = Attraction; +Proton$1.RandomDrift = Proton$1.RD = RandomDrift; +Proton$1.Gravity = Proton$1.G = Gravity; +Proton$1.Collision = Collision; +Proton$1.CrossZone = CrossZone; +Proton$1.Alpha = Proton$1.A = Alpha; +Proton$1.Scale = Proton$1.S = Scale; +Proton$1.Rotate = Rotate; +Proton$1.Color = Color; +Proton$1.Repulsion = Repulsion; +Proton$1.GravityWell = GravityWell; + +Proton$1.Emitter = Emitter; +Proton$1.BehaviourEmitter = BehaviourEmitter; +Proton$1.FollowEmitter = FollowEmitter; + +Proton$1.Zone = Zone; +Proton$1.LineZone = CircleZone; +Proton$1.CircleZone = CircleZone$1; +Proton$1.PointZone = PointZone; +Proton$1.RectZone = PointZoneRectZone; +Proton$1.ImageZone = ImageZone; + +Proton$1.CanvasRenderer = CanvasRenderer; +Proton$1.DomRenderer = DomRenderer; +Proton$1.EaselRenderer = EaselRenderer; +Proton$1.PixiRenderer = PixiRenderer; +Proton$1.PixelRenderer = PixelRenderer; +Proton$1.WebGLRenderer = Proton$1.WebGlRenderer = WebGLRenderer; +Proton$1.CustomRenderer = CustomRenderer; + +Proton$1.Debug = Debug; + +Object.assign(Proton$1, ease); + +return Proton$1; + +}))); +//# sourceMappingURL=proton.js.map diff --git a/build/proton.js.map b/build/proton.js.map new file mode 100644 index 0000000..941f38f --- /dev/null +++ b/build/proton.js.map @@ -0,0 +1 @@ +{"version":3,"file":"proton.js","sources":["../src/math/MathUtils.js","../src/math/Vector2D.js","../src/math/Span.js","../src/utils/WebGLUtil.js","../src/utils/DomUtil.js","../src/utils/ImgUtil.js","../src/utils/Util.js","../src/utils/PUID.js","../src/core/Pool.js","../src/debug/Stats.js","../src/events/EventDispatcher.js","../src/math/Integration.js","../src/core/Proton.js","../src/math/ease.js","../src/core/Particle.js","../src/utils/ColorUtil.js","../src/math/Polar2D.js","../src/math/Mat3.js","../src/math/ArraySpan.js","../src/math/Rectangle.js","../src/initialize/Rate.js","../src/initialize/Initialize.js","../src/initialize/Life.js","../src/zone/Zone.js","../src/zone/PointZone.js","../src/initialize/Position.js","../src/initialize/Velocity.js","../src/initialize/Mass.js","../src/initialize/Radius.js","../src/initialize/Body.js","../src/behaviour/Behaviour.js","../src/behaviour/Force.js","../src/behaviour/Attraction.js","../src/behaviour/RandomDrift.js","../src/behaviour/Gravity.js","../src/behaviour/Collision.js","../src/behaviour/CrossZone.js","../src/behaviour/Alpha.js","../src/behaviour/Scale.js","../src/behaviour/Rotate.js","../src/behaviour/Color.js","../src/behaviour/Repulsion.js","../src/behaviour/GravityWell.js","../src/initialize/InitializeUtil.js","../src/emitter/Emitter.js","../src/emitter/BehaviourEmitter.js","../src/emitter/FollowEmitter.js","../src/render/BaseRenderer.js","../src/render/CanvasRenderer.js","../src/render/DomRenderer.js","../src/render/EaselRenderer.js","../src/render/PixelRenderer.js","../src/render/PixiRenderer.js","../src/utils/MStack.js","../src/render/WebGLRenderer.js","../src/render/CustomRenderer.js","../src/zone/LineZone.js","../src/zone/CircleZone.js","../src/zone/RectZone.js","../src/zone/ImageZone.js","../src/debug/Debug.js","../src/polyfill/requestAnimationFrame.js","../src/index.js"],"sourcesContent":["const PI = 3.1415926;\n\nconst MathUtils = {\n\n PI: PI,\n PIx2: PI * 2,\n PI_2: PI / 2,\n PI_180: PI / 180,\n N180_PI: 180 / PI,\n\n randomAToB(a, b, INT) {\n if (!INT)\n return a + Math.random() * (b - a);\n else\n return Math.floor(Math.random() * (b - a)) + a;\n },\n\n randomFloating(center, f, INT) {\n return this.randomAToB(center - f, center + f, INT);\n },\n\n randomZone(display) {},\n\n degreeTransform(a) {\n return a * PI / 180;\n },\n\n toColor16(num) {\n return \"#\" + num.toString(16);\n },\n\n randomColor() {\n return '#' + ('00000' + (Math.random() * 0x1000000 << 0).toString(16)).slice(-6);\n }\n}\n\nexport default MathUtils;","import MathUtils from '../math/MathUtils';\n\nexport default class Vector2D {\n\n constructor(x, y) {\n this.x = x || 0;\n this.y = y || 0;\n }\n\n set(x, y) {\n this.x = x;\n this.y = y;\n return this;\n }\n\n setX(x) {\n this.x = x;\n return this;\n }\n\n setY(y) {\n this.y = y;\n return this;\n }\n\n getGradient() {\n if (this.x != 0)\n return Math.atan2(this.y, this.x);\n else if (this.y > 0)\n return MathUtils.PI_2;\n else if (this.y < 0)\n return -MathUtils.PI_2;\n }\n\n copy(v) {\n this.x = v.x;\n this.y = v.y;\n\n return this;\n }\n\n add(v, w) {\n if (w !== undefined) {\n return this.addVectors(v, w);\n }\n\n this.x += v.x;\n this.y += v.y;\n\n return this;\n }\n\n addXY(a, b) {\n this.x += a;\n this.y += b;\n\n return this;\n }\n\n addVectors(a, b) {\n this.x = a.x + b.x;\n this.y = a.y + b.y;\n\n return this;\n }\n\n sub(v, w) {\n if (w !== undefined) {\n return this.subVectors(v, w);\n }\n\n this.x -= v.x;\n this.y -= v.y;\n\n return this;\n }\n\n subVectors(a, b) {\n this.x = a.x - b.x;\n this.y = a.y - b.y;\n\n return this;\n }\n\n divideScalar(s) {\n if (s !== 0) {\n this.x /= s;\n this.y /= s;\n } else {\n this.set(0, 0);\n }\n\n return this;\n }\n\n multiplyScalar(s) {\n this.x *= s;\n this.y *= s;\n\n return this;\n }\n\n negate() {\n return this.multiplyScalar(-1);\n }\n\n dot(v) {\n return this.x * v.x + this.y * v.y;\n }\n\n lengthSq() {\n return this.x * this.x + this.y * this.y;\n }\n\n length() {\n return Math.sqrt(this.x * this.x + this.y * this.y);\n }\n\n normalize() {\n return this.divideScalar(this.length());\n }\n\n distanceTo(v) {\n return Math.sqrt(this.distanceToSquared(v));\n }\n\n rotate(tha) {\n const x = this.x;\n const y = this.y;\n\n this.x = x * Math.cos(tha) + y * Math.sin(tha);\n this.y = -x * Math.sin(tha) + y * Math.cos(tha);\n\n return this;\n }\n\n distanceToSquared(v) {\n const dx = this.x - v.x;\n const dy = this.y - v.y;\n\n return dx * dx + dy * dy;\n }\n\n lerp(v, alpha) {\n this.x += (v.x - this.x) * alpha;\n this.y += (v.y - this.y) * alpha;\n\n return this;\n }\n\n equals(v) {\n return ((v.x === this.x) && (v.y === this.y));\n }\n\n clear() {\n this.x = 0.0;\n this.y = 0.0;\n return this;\n }\n\n clone() {\n return new Vector2D(this.x, this.y);\n }\n}","import Util from '../utils/Util';\nimport MathUtils from '../math/MathUtils';\n\nexport default class Span {\n\n\tconstructor(a, b, center) {\n\t\tthis.isArray = false;\n\n\t\tif (Util.isArray(a)) {\n\t\t\tthis.isArray = true;\n\t\t\tthis.a = a;\n\t\t} else {\n\t\t\tthis.a = Util.initValue(a, 1);\n\t\t\tthis.b = Util.initValue(b, this.a);\n\t\t\tthis.center = Util.initValue(center, false);\n\t\t}\n\n\t}\n\n\tgetValue(INT) {\n\t\tif (this.isArray) {\n\t\t\treturn this.a[Math.floor(this.a.length * Math.random())];\n\t\t} else {\n\t\t\tif (!this.center)\n\t\t\t\treturn MathUtils.randomAToB(this.a, this.b, INT);\n\t\t\telse\n\t\t\t\treturn MathUtils.randomFloating(this.a, this.b, INT);\n\t\t}\n\t}\n}","export default {\n\n /**\n * @memberof Proton#Proton.WebGLUtil\n * @method ipot\n *\n * @todo add description\n * @todo add length description\n *\n * @param {Number} length\n *\n * @return {Boolean}\n */\n ipot(length) {\n return (length & (length - 1)) == 0;\n },\n\n /**\n * @memberof Proton#Proton.WebGLUtil\n * @method nhpot\n *\n * @todo add description\n * @todo add length description\n *\n * @param {Number} length\n *\n * @return {Number}\n */\n nhpot(length) {\n --length;\n for (let i = 1; i < 32; i <<= 1) {\n length = length | length >> i;\n }\n\n return length + 1;\n },\n\n /**\n * @memberof Proton#Proton.WebGLUtil\n * @method makeTranslation\n *\n * @todo add description\n * @todo add tx, ty description\n * @todo add return description\n *\n * @param {Number} tx either 0 or 1\n * @param {Number} ty either 0 or 1\n *\n * @return {Object}\n */\n makeTranslation(tx, ty) {\n return [1, 0, 0, 0, 1, 0, tx, ty, 1];\n },\n\n /**\n * @memberof Proton#Proton.WebGLUtil\n * @method makeRotation\n *\n * @todo add description\n * @todo add return description\n *\n * @param {Number} angleInRadians\n *\n * @return {Object}\n */\n makeRotation(angleInRadians) {\n let c = Math.cos(angleInRadians);\n let s = Math.sin(angleInRadians);\n\n return [c, -s, 0, s, c, 0, 0, 0, 1];\n },\n\n /**\n * @memberof Proton#Proton.WebGLUtil\n * @method makeScale\n *\n * @todo add description\n * @todo add tx, ty description\n * @todo add return description\n *\n * @param {Number} sx either 0 or 1\n * @param {Number} sy either 0 or 1\n *\n * @return {Object}\n */\n makeScale(sx, sy) {\n return [sx, 0, 0, 0, sy, 0, 0, 0, 1];\n },\n\n /**\n * @memberof Proton#Proton.WebGLUtil\n * @method matrixMultiply\n *\n * @todo add description\n * @todo add a, b description\n * @todo add return description\n *\n * @param {Object} a\n * @param {Object} b\n *\n * @return {Object}\n */\n matrixMultiply(a, b) {\n let a00 = a[0 * 3 + 0];\n let a01 = a[0 * 3 + 1];\n let a02 = a[0 * 3 + 2];\n let a10 = a[1 * 3 + 0];\n let a11 = a[1 * 3 + 1];\n let a12 = a[1 * 3 + 2];\n let a20 = a[2 * 3 + 0];\n let a21 = a[2 * 3 + 1];\n let a22 = a[2 * 3 + 2];\n let b00 = b[0 * 3 + 0];\n let b01 = b[0 * 3 + 1];\n let b02 = b[0 * 3 + 2];\n let b10 = b[1 * 3 + 0];\n let b11 = b[1 * 3 + 1];\n let b12 = b[1 * 3 + 2];\n let b20 = b[2 * 3 + 0];\n let b21 = b[2 * 3 + 1];\n let b22 = b[2 * 3 + 2];\n\n return [\n a00 * b00 + a01 * b10 + a02 * b20,\n a00 * b01 + a01 * b11 + a02 * b21,\n a00 * b02 + a01 * b12 + a02 * b22,\n a10 * b00 + a11 * b10 + a12 * b20,\n a10 * b01 + a11 * b11 + a12 * b21,\n a10 * b02 + a11 * b12 + a12 * b22,\n a20 * b00 + a21 * b10 + a22 * b20,\n a20 * b01 + a21 * b11 + a22 * b21,\n a20 * b02 + a21 * b12 + a22 * b22\n ];\n }\n}","export default {\n\n /**\n * Creates and returns a new canvas. The opacity is by default set to 0\n *\n * @memberof Proton#Proton.DomUtil\n * @method createCanvas\n *\n * @param {String} $id the canvas' id\n * @param {Number} $width the canvas' width\n * @param {Number} $height the canvas' height\n * @param {String} [$position=absolute] the canvas' position, default is 'absolute' \n *\n * @return {Object}\n */\n createCanvas(id, width, height, position) {\n const dom = document.createElement(\"canvas\");\n position = position || 'absolute';\n\n dom.id = id;\n dom.width = width;\n dom.height = height;\n dom.style.opacity = 0;\n dom.style.position = position;\n\n this.transform(dom, -500, -500, 0, 0);\n\n return dom;\n },\n\n createDiv(id, width, height) {\n const dom = document.createElement(\"div\");\n\n dom.id = id;\n dom.style.position = 'absolute';\n this.resize(dom, width, height);\n\n return dom;\n },\n\n resize(dom, width, height) {\n dom.style.width = width + 'px';\n dom.style.height = height + 'px';\n dom.style.marginLeft = -width / 2 + 'px';\n dom.style.marginTop = -height / 2 + 'px';\n },\n\n /**\n * Adds a transform: translate(), scale(), rotate() to a given div dom for all browsers\n *\n * @memberof Proton#Proton.DomUtil\n * @method transform\n *\n * @param {HTMLDivElement} div \n * @param {Number} $x \n * @param {Number} $y \n * @param {Number} $scale \n * @param {Number} $rotate \n */\n transform(div, x, y, scale, rotate) {\n const transform = `translate(${x}px, ${y}px) scale(${scale}) rotate(${rotate}deg)`;\n\n div.style.willChange = 'transform';\n this.css3(div, 'transform', transform);\n },\n\n transform3d(div, x, y, scale, rotate) {\n const transform = `translate3d(${x}px, ${y}px, 0) scale(${scale}) rotate(${rotate}deg)`;\n\n div.style.willChange = 'transform';\n this.css3(div, 'backfaceVisibility', 'hidden');\n this.css3(div, 'transform', transform);\n },\n\n css3(div, key, val) {\n const bkey = key.charAt(0).toUpperCase() + key.substr(1);\n\n div.style[`Webkit${bkey}`] = val;\n div.style[`Moz${bkey}`] = val;\n div.style[`O${bkey}`] = val;\n div.style[`ms${bkey}`] = val;\n div.style[`${key}`] = val;\n }\n}","import WebGLUtil from './WebGLUtil';\nimport DomUtil from './DomUtil';\n\nconst IMG_CACHE = {};\nconst CANVAS_CACHE = {};\nlet canvasID = 0;\n\nexport default {\n\n /**\n * This will get the image data. It could be necessary to create a Proton.Zone.\n *\n * @memberof Proton#Proton.Util\n * @method getImageData\n *\n * @param {HTMLCanvasElement} context any canvas, must be a 2dContext 'canvas.getContext('2d')'\n * @param {Object} image could be any dom image, e.g. document.getElementById('thisIsAnImgTag');\n * @param {Proton.Rectangle} rect\n */\n getImageData(context, image, rect) {\n context.drawImage(image, rect.x, rect.y);\n const imagedata = context.getImageData(rect.x, rect.y, rect.width, rect.height);\n context.clearRect(rect.x, rect.y, rect.width, rect.height);\n\n return imagedata;\n },\n\n /**\n * @memberof Proton#Proton.Util\n * @method getImgFromCache\n *\n * @todo add description\n * @todo describe func\n *\n * @param {Mixed} img\n * @param {Proton.Particle} particle\n * @param {Boolean} drawCanvas set to true if a canvas should be saved into particle.transform.canvas\n * @param {Boolean} func\n */\n getImgFromCache(img, callback, param) {\n const src = typeof (img) == 'string' ? img : img.src;\n\n if (IMG_CACHE[src]) {\n callback(IMG_CACHE[src], param);\n } else {\n const image = new Image();\n image.onload = e => {\n IMG_CACHE[src] = e.target;\n callback(IMG_CACHE[src], param);\n }\n\n image.src = src;\n }\n },\n\n getCanvasFromCache(img, callback, param) {\n const src = img.src;\n\n if (!CANVAS_CACHE[src]) {\n const width = WebGLUtil.nhpot(img.width);\n const height = WebGLUtil.nhpot(img.height);\n\n const canvas = DomUtil.createCanvas(`canvas_cache_${canvasID}`, width, height);\n const context = canvas.getContext('2d');\n context.drawImage(img, 0, 0, img.width, img.height);\n\n CANVAS_CACHE[src] = canvas;\n }\n\n callback && callback(CANVAS_CACHE[src], param);\n\n return CANVAS_CACHE[src];\n }\n}","import Vector2D from '../math/Vector2D';\nimport Span from '../math/Span';\nimport ImgUtil from './ImgUtil';\nimport DomUtil from './DomUtil';\n\nexport default {\n\n /**\n * Returns the default if the value is null or undefined\n *\n * @memberof Proton#Proton.Util\n * @method initValue\n *\n * @param {Mixed} value a specific value, could be everything but null or undefined\n * @param {Mixed} defaults the default if the value is null or undefined\n */\n initValue(value, defaults) {\n value = (value !== null && value !== undefined) ? value : defaults;\n return value;\n },\n\n /**\n * Checks if the value is a valid array\n *\n * @memberof Proton#Proton.Util\n * @method isArray\n *\n * @param {Array} value Any array\n *\n * @returns {Boolean} \n */\n isArray(value) {\n return Object.prototype.toString.call(value) === '[object Array]';\n },\n\n /**\n * Destroyes the given array\n *\n * @memberof Proton#Proton.Util\n * @method destroyArray\n *\n * @param {Array} array Any array\n */\n destroyArray(array) {\n if (array) array.length = 0;\n },\n\n /**\n * Destroyes the given object\n *\n * @memberof Proton#Proton.Util\n * @method destroyObject\n *\n * @param {Object} obj Any object\n */\n destroyObject(obj, ignore) {\n for (let o in obj) {\n if (ignore && ignore.indexOf(o) > -1) continue;\n delete obj[o];\n }\n },\n\n /**\n * Makes an instance of a class and binds the given array\n *\n * @memberof Proton#Proton.Util\n * @method classApply\n *\n * @param {Function} constructor A class to make an instance from\n * @param {Array} [args] Any array to bind it to the constructor\n *\n * @return {Object} The instance of constructor, optionally bind with args\n */\n classApply(constructor, args) {\n if (!args) return new constructor;\n\n args = [null].concat(args);\n const factoryFunction = constructor.bind.apply(constructor, args);\n return new factoryFunction();\n },\n\n /**\n * @memberof Proton#Proton.Util\n * @method setVector2DByObject\n *\n * @todo add description for param `target`\n * @todo add description for param `pOBJ`\n * @todo add description for function\n *\n * @param {Object} target\n * @param {Object} pOBJ\n */\n setVector2DByObject(target, pOBJ) {\n if (this.hasProp(pOBJ, 'x')) target.p.x = pOBJ['x'];\n if (this.hasProp(pOBJ, 'y')) target.p.y = pOBJ['y'];\n\n if (this.hasProp(pOBJ, 'vx')) target.v.x = pOBJ['vx'];\n if (this.hasProp(pOBJ, 'vy')) target.v.y = pOBJ['vy'];\n\n if (this.hasProp(pOBJ, 'ax')) target.a.x = pOBJ['ax'];\n if (this.hasProp(pOBJ, 'ay')) target.a.y = pOBJ['ay'];\n\n if (this.hasProp(pOBJ, 'p')) particle.p.copy(pOBJ['p']);\n if (this.hasProp(pOBJ, 'v')) particle.v.copy(pOBJ['v']);\n if (this.hasProp(pOBJ, 'a')) particle.a.copy(pOBJ['a']);\n\n if (this.hasProp(pOBJ, 'position')) particle.p.copy(pOBJ['position']);\n if (this.hasProp(pOBJ, 'velocity')) particle.v.copy(pOBJ['velocity']);\n if (this.hasProp(pOBJ, 'accelerate')) particle.a.copy(pOBJ['accelerate']);\n },\n\n hasProp(obj, key) {\n if (!obj) return false;\n return obj[key] !== undefined;\n // return obj.hasOwnProperty(key);\n },\n\n /**\n * set the prototype in a given prototypeObject\n *\n * @memberof Proton#Proton.Util\n * @method setPrototypeByObject\n *\n * @todo add description for param `target`\n * @todo add description for param `filters`\n * @todo translate desription from chinese to english\n *\n * @param {Object} target\n * @param {Object} prototypeObject An object of single prototypes\n * @param {Object} filters\n *\n * @return {Object} target\n */\n setPrototypeByObject(target, prototypeObject, filters) {\n for (let singleProp in prototypeObject) {\n if (target.hasOwnProperty(singleProp)) {\n if (filters) {\n if (filters.indexOf(singleProp) < 0)\n target[singleProp] = this.getSpanValue(prototypeObject[singleProp]);\n } else {\n target[singleProp] = this.getSpanValue(prototypeObject[singleProp]);\n }\n }\n }\n\n return target;\n },\n\n /**\n * Returns a new Span object\n *\n * @memberof Proton#Proton.Util\n * @method setSpanValue\n *\n * @todo a, b and c should be 'Mixed' or 'Number'?\n *\n * @param {Mixed | Span} a\n * @param {Mixed} b\n * @param {Mixed} c\n *\n * @return {Span}\n */\n setSpanValue(a, b, c) {\n if (a instanceof Span) {\n return a;\n } else {\n if (!b) {\n return new Span(a);\n } else {\n if (!c)\n return new Span(a, b);\n else\n return new Span(a, b, c);\n }\n }\n },\n\n /**\n * Returns the value from a Span, if the param is not a Span it will return the given parameter\n *\n * @memberof Proton#Proton.Util\n * @method getSpanValue\n *\n * @param {Mixed | Span} pan\n *\n * @return {Mixed} the value of Span OR the parameter if it is not a Span\n */\n getSpanValue(pan) {\n return pan instanceof Span ? pan.getValue() : pan;\n },\n\n /**\n * This will get the image data. It could be necessary to create a Proton.Zone.\n *\n * @memberof Proton#Proton.Util\n * @method getImageData\n *\n * @param {HTMLCanvasElement} context any canvas, must be a 2dContext 'canvas.getContext('2d')'\n * @param {Object} image could be any dom image, e.g. document.getElementById('thisIsAnImgTag');\n * @param {Proton.Rectangle} rect\n */\n getImageData(context, image, rect) {\n return ImgUtil.getImageData(context, image, rect);\n },\n\n destroy(arr, param) {\n let i = arr.length;\n\n while (i--) {\n try { arr[i].destroy(param); } catch (e) { }\n delete arr[i];\n }\n\n arr.length = 0;\n }\n\n}","export default {\n id: 0,\n cache: {},\n\n getID(target) {\n let uid = this.getCacheID(target);\n if (uid) return uid;\n\n uid = `PUID_${this.id++}`;\n this.cache[uid] = target;\n\n return uid;\n },\n\n getCacheID(target) {\n let obj;\n for (let id in this.cache) {\n obj = this.cache[id];\n\n if (obj === target) return id;\n \n if (typeof obj === 'object' && typeof target === 'object' && obj.isInner && target.isInner) {\n if (obj.src === target.src)\n return id;\n }\n }\n\n return null;\n },\n\n getTarget(uid) {\n return this.cache[uid];\n }\n}","/**\n * get -> PUID :: uid-> Body\n * -> cache[abc]. -> cache[abc] .pop()\n * -> create [new Body| clone]\n * -> return p1: { __pid: abc }\n * \n * expire -> cache[abc]= [p0, p1];\n * \n */\nimport Util from '../utils/Util';\nimport PUID from '../utils/PUID';\n\nexport default class Pool {\n\n /**\n * @memberof! Proton#\n * @constructor\n * @alias Proton.Pool\n *\n * @todo add description\n * @todo add description of properties\n *\n * @property {Number} total\n * @property {Object} cache\n */\n constructor(num) {\n this.total = 0;\n this.cache = {};\n }\n\n /**\n * @todo add description\n *\n * @method get\n * @memberof Proton#Proton.Pool\n *\n * @param {Object|Function} target\n * @param {Object} [params] just add if `target` is a function\n *\n * @return {Object}\n */\n get(target, params, uid) {\n let p;\n uid = uid || target.__puid || PUID.getID(target);\n\n if (this.cache[uid] && this.cache[uid].length > 0)\n p = this.cache[uid].pop();\n else\n p = this.createOrClone(target, params);\n\n p.__puid = target.__puid || uid;\n return p;\n }\n\n /**\n * @todo add description\n *\n * @method set\n * @memberof Proton#Proton.Pool\n *\n * @param {Object} target\n *\n * @return {Object}\n */\n expire(target) {\n return this.getCache(target.__puid).push(target);\n }\n\n /**\n * Creates a new class instance\n *\n * @todo add more documentation \n *\n * @method create\n * @memberof Proton#Proton.Pool\n *\n * @param {Object|Function} target any Object or Function\n * @param {Object} [params] just add if `target` is a function\n *\n * @return {Object}\n */\n createOrClone(target, params) {\n this.total++;\n\n if (this.create) {\n return this.create(target, params);\n } else if (typeof target == \"function\") {\n return Util.classApply(target, params);\n } else {\n return target.clone();\n }\n }\n\n /**\n * @todo add description - what is in the cache?\n *\n * @method getCount\n * @memberof Proton#Proton.Pool\n *\n * @return {Number}\n */\n getCount() {\n let count = 0;\n\n for (let id in this.cache)\n count += this.cache[id].length;\n\n return count++;;\n }\n\n /**\n * Destroyes all items from Pool.cache\n *\n * @method destroy\n * @memberof Proton#Proton.Pool\n */\n destroy() {\n for (let id in this.cache) {\n this.cache[id].length = 0;\n delete this.cache[id];\n }\n }\n\n /**\n * Returns Pool.cache\n *\n * @method getCache\n * @memberof Proton#Proton.Pool\n * @private\n *\n * @param {Number} uid the unique id\n *\n * @return {Object}\n */\n getCache(uid) {\n uid = uid || \"default\";\n\n if (!this.cache[uid]) this.cache[uid] = [];\n return this.cache[uid];\n }\n}","export default class Stats {\n\n constructor(proton) {\n this.proton = proton;\n this.container = null;\n this.type = 1;\n\n this.emitterIndex = 0;\n this.rendererIndex = 0;\n }\n\n update(style, body) {\n this.add(style, body);\n\n const emitter = this.getEmitter();\n const renderer = this.getRenderer();\n let str = \"\";\n\n switch (this.type) {\n case 2:\n str += \"emitter:\" + this.proton.emitters.length + \"
\";\n if (emitter) str += \"em speed:\" + emitter.emitSpeed + \"
\";\n if (emitter) str += \"pos:\" + this.getEmitterPos(emitter);\n break;\n\n case 3:\n if (emitter) str += \"initializes:\" + emitter.initializes.length + \"
\";\n if (emitter) str += \"\" + this.concatArr(emitter.initializes) + \"
\";\n if (emitter) str += \"behaviours:\" + emitter.behaviours.length + \"
\";\n if (emitter) str += \"\" + this.concatArr(emitter.behaviours) + \"
\";\n break;\n\n case 4:\n if (renderer) str += renderer.name + \"
\";\n if (renderer) str += \"body:\" + this.getCreatedNumber(renderer) + \"
\";\n break;\n\n default:\n str += \"particles:\" + this.proton.getCount() + \"
\";\n str += \"pool:\" + this.proton.pool.getCount() + \"
\";\n str += \"total:\" + this.proton.pool.total;\n }\n\n this.container.innerHTML = str;\n }\n\n add(style, body) {\n if (!this.container) {\n this.type = 1;\n\n this.container = document.createElement('div');\n this.container.style.cssText = [\n 'position:absolute;bottom:0px;left:0;cursor:pointer;',\n 'opacity:0.9;z-index:10000;padding:10px;font-size:12px;',\n 'width:120px;height:50px;background-color:#002;color:#0ff;'\n ].join('');\n\n this.container.addEventListener('click', e => {\n this.type++;\n if (this.type > 4) this.type = 1;\n }, false);\n\n let bg, color;\n switch (style) {\n case 2:\n bg = \"#201\";\n color = \"#f08\";\n break;\n\n case 3:\n bg = \"#020\";\n color = \"#0f0\";\n break;\n\n default:\n bg = \"#002\";\n color = \"#0ff\";\n }\n\n this.container.style[\"background-color\"] = bg;\n this.container.style[\"color\"] = color;\n }\n\n if (!this.container.parentNode) {\n body = body || this.body || document.body;\n body.appendChild(this.container);\n }\n }\n\n getEmitter() {\n return this.proton.emitters[this.emitterIndex];\n }\n\n getRenderer() {\n return this.proton.renderers[this.rendererIndex];\n }\n\n concatArr(arr) {\n let result = '';\n if (!arr || !arr.length) return result;\n\n for (let i = 0; i < arr.length; i++) {\n result += (arr[i].name || '').substr(0, 1) + '.';\n }\n\n return result;\n }\n\n getCreatedNumber(renderer) {\n return renderer.pool.total || (renderer.cpool && renderer.cpool.total) || 0;\n }\n\n getEmitterPos(e) {\n return Math.round(e.p.x) + \",\" + Math.round(e.p.y);\n }\n}","/*\n * EventDispatcher\n * This code reference since http://createjs.com/.\n *\n **/\n\nexport default class EventDispatcher {\n\n constructor() {\n this._listeners = null;\n }\n\n static bind(TargetClass){\n TargetClass.prototype.dispatchEvent = EventDispatcher.prototype.dispatchEvent;\n TargetClass.prototype.hasEventListener = EventDispatcher.prototype.hasEventListener;\n TargetClass.prototype.addEventListener = EventDispatcher.prototype.addEventListener;\n TargetClass.prototype.removeEventListener = EventDispatcher.prototype.removeEventListener;\n TargetClass.prototype.removeAllEventListeners = EventDispatcher.prototype.removeAllEventListeners;\n }\n\n addEventListener(type, listener) {\n if (!this._listeners) {\n this._listeners = {};\n } else {\n this.removeEventListener(type, listener);\n }\n\n if (!this._listeners[type]) this._listeners[type] = [];\n this._listeners[type].push(listener);\n\n return listener;\n }\n\n removeEventListener(type, listener) {\n if (!this._listeners) return;\n if (!this._listeners[type]) return;\n\n const arr = this._listeners[type];\n const length = arr.length;\n\n for (let i = 0;i < length; i++) {\n if (arr[i] == listener) {\n if (length == 1) {\n delete (this._listeners[type]);\n }\n\n // allows for faster checks.\n else {\n arr.splice(i, 1);\n }\n\n break;\n }\n }\n }\n\n removeAllEventListeners(type) {\n if (!type)\n this._listeners = null;\n else if (this._listeners)\n delete (this._listeners[type]);\n }\n\n dispatchEvent(type, args) {\n let result = false;\n const listeners = this._listeners;\n\n if (type && listeners) {\n let arr = listeners[type];\n if (!arr) return result;\n\n //arr = arr.slice();\n // to avoid issues with items being removed or added during the dispatch\n\n let handler;\n let i = arr.length;\n while (i--) {\n handler = arr[i];\n result = result || handler(args);\n }\n\n }\n\n return !!result;\n }\n\n hasEventListener(type) {\n const listeners = this._listeners;\n return !!(listeners && listeners[type]);\n }\n\n}","import Util from '../utils/Util';\n\nexport default class Integration {\n\n\tconstructor(type) {\n\t\tthis.type = type;\n\t}\n\n\tcalculate(particles, time, damping) {\n\t\tthis.eulerIntegrate(particles, time, damping);\n\t}\n\n\t// Euler Integrate\n\teulerIntegrate(particle, time, damping) {\n\t\tif (!particle.sleep) {\n\t\t\tparticle.old.p.copy(particle.p);\n\t\t\tparticle.old.v.copy(particle.v);\n\n\t\t\tparticle.a.multiplyScalar(1 / particle.mass);\n\t\t\tparticle.v.add(particle.a.multiplyScalar(time));\n\t\t\tparticle.p.add(particle.old.v.multiplyScalar(time));\n\n\t\t\tif (damping) particle.v.multiplyScalar(damping);\n\n\t\t\tparticle.a.clear();\n\t\t}\n\t}\n}","import Pool from './Pool';\nimport Util from '../utils/Util';\nimport Stats from '../debug/Stats';\nimport EventDispatcher from '../events/EventDispatcher';\nimport Integration from '../math/Integration';\n\nexport default class Proton {\n\n static USE_CLOCK = false;\n\n //1:100\n static MEASURE = 100;\n static EULER = 'euler';\n static RK2 = 'runge-kutta2';\n\n static PARTICLE_CREATED = 'PARTICLE_CREATED';\n static PARTICLE_UPDATE = 'PARTICLE_UPDATE';\n static PARTICLE_SLEEP = 'PARTICLE_SLEEP';\n static PARTICLE_DEAD = 'PARTICLE_DEAD';\n static PROTON_UPDATE = 'PROTON_UPDATE';\n static PROTON_UPDATE_AFTER = 'PROTON_UPDATE_AFTER';\n static EMITTER_ADDED = 'EMITTER_ADDED';\n static EMITTER_REMOVED = 'EMITTER_REMOVED';\n\n static amendChangeTabsBug = true;\n static bindEmtterEvent = false;\n\n /**\n * The constructor to add emitters\n *\n * @constructor Proton\n *\n * @todo proParticleCount is not in use\n * @todo add more documentation of the single properties and parameters\n *\n * @param {Number} [proParticleCount] not in use?\n * @param {Number} [integrationType=Proton.EULER]\n *\n * @property {String} [integrationType=Proton.EULER]\n * @property {Array} emitters All added emitter\n * @property {Array} renderers All added renderer\n * @property {Number} time The active time\n * @property {Number} oldtime The old time\n */\n constructor(integrationType) {\n\n this.emitters = [];\n this.renderers = [];\n\n this.time = 0;\n this.oldTime = 0;\n this.elapsed = 0;\n\n this.stats = new Stats(this);\n this.pool = new Pool(80);\n\n this.integrationType = Util.initValue(integrationType, Proton.EULER);\n this.integrator = new Integration(this.integrationType);\n }\n\n /**\n * add a type of Renderer\n *\n * @method addRenderer\n * @memberof Proton\n * @instance\n *\n * @param {Renderer} render\n */\n addRenderer(render) {\n render.init(this);\n this.renderers.push(render);\n }\n\n /**\n * @name add a type of Renderer\n *\n * @method addRenderer\n * @param {Renderer} render\n */\n removeRenderer(render) {\n const index = this.renderers.indexOf(render);\n this.renderers.splice(index, 1);\n render.remove(this);\n }\n\n /**\n * add the Emitter\n *\n * @method addEmitter\n * @memberof Proton\n * @instance\n *\n * @param {Emitter} emitter\n */\n addEmitter(emitter) {\n this.emitters.push(emitter);\n emitter.parent = this;\n\n this.dispatchEvent(Proton.EMITTER_ADDED, emitter);\n }\n\n /**\n * Removes an Emitter\n *\n * @method removeEmitter\n * @memberof Proton\n * @instance\n *\n * @param {Proton.Emitter} emitter\n */\n removeEmitter(emitter) {\n const index = this.emitters.indexOf(emitter);\n this.emitters.splice(index, 1);\n emitter.parent = null;\n\n this.dispatchEvent(Proton.EMITTER_REMOVED, emitter);\n }\n\n /**\n * Updates all added emitters\n *\n * @method update\n * @memberof Proton\n * @instance\n */\n update() {\n this.dispatchEvent(Proton.PROTON_UPDATE);\n\n if (Proton.USE_CLOCK) {\n if (!this.oldTime) this.oldTime = (new Date()).getTime();\n\n let time = new Date().getTime();\n this.elapsed = (time - this.oldTime) / 1000;\n Proton.amendChangeTabsBug && this.amendChangeTabsBug();\n\n this.oldTime = time;\n } else {\n this.elapsed = 0.0167;\n }\n\n // emitter update\n if (this.elapsed > 0) this.emittersUpdate(this.elapsed);\n\n this.dispatchEvent(Proton.PROTON_UPDATE_AFTER);\n }\n\n emittersUpdate(elapsed) {\n let i = this.emitters.length;\n while (i--) this.emitters[i].update(elapsed);\n }\n\n /**\n * @todo add description\n *\n * @method amendChangeTabsBug\n * @memberof Proton\n * @instance\n */\n amendChangeTabsBug() {\n if (this.elapsed > .5) {\n this.oldTime = (new Date()).getTime();\n this.elapsed = 0;\n }\n }\n\n /**\n * Counts all particles from all emitters\n *\n * @method getCount\n * @memberof Proton\n * @instance\n */\n getCount() {\n let total = 0;\n let i = this.emitters.length;\n\n while (i--) total += this.emitters[i].particles.length;\n return total;\n }\n\n getAllParticles() {\n let particles = [];\n let i = this.emitters.length;\n\n while (i--) particles = particles.concat(this.emitters[i].particles);\n return particles;\n }\n\n /**\n * Destroys everything related to this Proton instance. This includes all emitters, and all properties\n *\n * @method destroy\n * @memberof Proton\n * @instance\n */\n destroy() {\n Util.destroy(this.renderers, this.getAllParticles());\n Util.destroy(this.emitters);\n\n this.time = 0;\n this.oldTime = 0;\n\n this.pool.destroy();\n }\n}\n\nEventDispatcher.bind(Proton);","import MathUtils from './MathUtils';\n\nexport default {\n\n easeLinear(value) {\n return value;\n },\n\n easeInQuad(value) {\n return Math.pow(value, 2);\n },\n\n easeOutQuad(value) {\n return -(Math.pow((value - 1), 2) - 1);\n },\n\n easeInOutQuad(value) {\n if ((value /= 0.5) < 1)\n return 0.5 * Math.pow(value, 2);\n\n return -0.5 * ((value -= 2) * value - 2);\n },\n\n easeInCubic(value) {\n return Math.pow(value, 3);\n },\n\n easeOutCubic(value) {\n return (Math.pow((value - 1), 3) + 1);\n },\n\n easeInOutCubic(value) {\n if ((value /= 0.5) < 1)\n return 0.5 * Math.pow(value, 3);\n\n return 0.5 * (Math.pow((value - 2), 3) + 2);\n },\n\n easeInQuart(value) {\n return Math.pow(value, 4);\n },\n\n easeOutQuart(value) {\n return -(Math.pow((value - 1), 4) - 1);\n },\n\n easeInOutQuart(value) {\n if ((value /= 0.5) < 1)\n return 0.5 * Math.pow(value, 4);\n\n return -0.5 * ((value -= 2) * Math.pow(value, 3) - 2);\n },\n\n easeInSine(value) {\n return -Math.cos(value * (MathUtils.PI_2)) + 1;\n },\n\n easeOutSine(value) {\n return Math.sin(value * (MathUtils.PI_2));\n },\n\n easeInOutSine(value) {\n return (-0.5 * (Math.cos(MathUtils.PI * value) - 1));\n },\n\n easeInExpo(value) {\n return (value === 0) ? 0 : Math.pow(2, 10 * (value - 1));\n },\n\n easeOutExpo(value) {\n return (value === 1) ? 1 : -Math.pow(2, -10 * value) + 1;\n },\n\n easeInOutExpo(value) {\n if (value === 0)\n return 0;\n\n if (value === 1)\n return 1;\n\n if ((value /= 0.5) < 1)\n return 0.5 * Math.pow(2, 10 * (value - 1));\n\n return 0.5 * (-Math.pow(2, -10 * --value) + 2);\n },\n\n easeInCirc(value) {\n return -(Math.sqrt(1 - (value * value)) - 1);\n },\n\n easeOutCirc(value) {\n return Math.sqrt(1 - Math.pow((value - 1), 2));\n },\n\n easeInOutCirc(value) {\n if ((value /= 0.5) < 1)\n return -0.5 * (Math.sqrt(1 - value * value) - 1);\n return 0.5 * (Math.sqrt(1 - (value -= 2) * value) + 1);\n },\n\n easeInBack(value) {\n let s = 1.70158;\n return (value) * value * ((s + 1) * value - s);\n },\n\n easeOutBack(value) {\n let s = 1.70158;\n return (value = value - 1) * value * ((s + 1) * value + s) + 1;\n },\n\n easeInOutBack(value) {\n let s = 1.70158;\n if ((value /= 0.5) < 1)\n return 0.5 * (value * value * (((s *= (1.525)) + 1) * value - s));\n return 0.5 * ((value -= 2) * value * (((s *= (1.525)) + 1) * value + s) + 2);\n },\n\n getEasing(ease) {\n if (typeof ease === 'function')\n return ease;\n else\n return this[ease] || this.easeLinear;\n }\n};","import Util from '../utils/Util';\nimport ease from '../math/ease';\nimport Vector2D from '../math/Vector2D';\nimport MathUtils from '../math/MathUtils';\n\nexport default class Particle {\n\n static ID = 0;\n\n /**\n * the Particle class\n *\n * @class Proton.Particle\n * @constructor\n * @param {Object} pObj the parameters object;\n * for example {life:3,dead:false}\n */\n constructor(pOBJ) {\n /**\n * The particle's id;\n * @property id\n * @type {string}\n */\n this.id = `particle_${Particle.ID++}`;\n this.reset('init');\n\n pOBJ && Util.setPrototypeByObject(this, pOBJ);\n }\n\n getDirection() {\n return Math.atan2(this.v.x, -this.v.y) * MathUtils.N180_PI;\n }\n\n reset(init) {\n this.life = Infinity;\n this.age = 0;\n\n //Energy loss\n this.energy = 1;\n this.dead = false;\n this.sleep = false;\n this.body = null;\n this.sprite = null;\n this.parent = null;\n\n this.mass = 1;\n this.radius = 10;\n this.alpha = 1;\n this.scale = 1;\n this.rotation = 0;\n this.color = null;\n\n this.easing = ease.easeLinear;\n\n if (init == 'init') {\n this.transform = {};\n this.p = new Vector2D();\n this.v = new Vector2D();\n this.a = new Vector2D();\n\n this.old = {\n p: new Vector2D(),\n v: new Vector2D(),\n a: new Vector2D()\n };\n\n this.behaviours = [];\n } else {\n Util.destroyObject(this.transform, 'rgb');\n\n this.p.set(0, 0);\n this.v.set(0, 0);\n this.a.set(0, 0);\n\n this.old.p.set(0, 0);\n this.old.v.set(0, 0);\n this.old.a.set(0, 0);\n\n this.removeAllBehaviours();\n }\n\n if (!this.transform.rgb) {\n this.transform.rgb = { r: 255, g: 255, b: 255 };\n } else {\n this.transform.rgb.r = 255;\n this.transform.rgb.g = 255;\n this.transform.rgb.b = 255;\n }\n\n return this;\n }\n\n update(time, index) {\n if (!this.sleep) {\n this.age += time;\n this.applyBehaviours(time, index);\n }\n\n if (this.age < this.life) {\n const scale = this.easing(this.age / this.life);\n this.energy = Math.max(1 - scale, 0);\n } else {\n this.destroy();\n }\n }\n\n applyBehaviours(time, index) {\n const length = this.behaviours.length;\n let i;\n\n for (i = 0; i < length; i++) {\n this.behaviours[i] && this.behaviours[i].applyBehaviour(this, time, index)\n }\n }\n\n addBehaviour(behaviour) {\n this.behaviours.push(behaviour);\n\n if (behaviour.hasOwnProperty('parents')) behaviour.parents.push(this);\n behaviour.initialize(this);\n }\n\n addBehaviours(behaviours) {\n const length = behaviours.length;\n let i;\n\n for (i = 0; i < length; i++) {\n this.addBehaviour(behaviours[i]);\n }\n }\n\n removeBehaviour(behaviour) {\n const index = this.behaviours.indexOf(behaviour);\n\n if (index > -1) {\n const behaviour = this.behaviours.splice(index, 1);\n behaviour.parents = null;\n }\n }\n\n removeAllBehaviours() {\n Util.destroyArray(this.behaviours);\n }\n\n /**\n * Destory this particle\n * @method destroy\n */\n destroy() {\n this.removeAllBehaviours();\n this.energy = 0;\n this.dead = true;\n this.parent = null;\n }\n\n}","export default {\n\n /**\n * @typedef {Object} rgbObject\n * @property {Number} r red value\n * @property {Number} g green value\n * @property {Number} b blue value\n */\n /**\n * converts a hex value to a rgb object\n *\n * @memberof Proton#Proton.Util\n * @method hexToRGB\n *\n * @param {String} h any hex value, e.g. #000000 or 000000 for black\n *\n * @return {rgbObject}\n */\n hexToRGB(h) {\n const hex16 = (h.charAt(0) == \"#\") ? h.substring(1, 7) : h;\n const r = parseInt(hex16.substring(0, 2), 16);\n const g = parseInt(hex16.substring(2, 4), 16);\n const b = parseInt(hex16.substring(4, 6), 16);\n\n return { r, g, b };\n },\n\n /**\n * converts a rgb value to a rgb string\n *\n * @memberof Proton#Proton.Util\n * @method rgbToHex\n *\n * @param {Object | Proton.hexToRGB} rgb a rgb object like in {@link Proton#Proton.}\n *\n * @return {String} rgb()\n */\n rgbToHex(rbg) {\n return `rgb(${rbg.r}, ${rbg.g}, ${rbg.b})`;\n },\n\n getHex16FromParticle(p) {\n return Number(p.transform.rgb.r) * 65536 + Number(p.transform.rgb.g) * 256 + Number(p.transform.rgb.b);\n }\n}","import Vector2D from './Vector2D';\n\nexport default class Polar2D {\n\n\tconstructor(r, tha) {\n\t\tthis.r = Math.abs(r) || 0;\n\t\tthis.tha = tha || 0;\n\t}\n\n\tset(r, tha) {\n\t\tthis.r = r;\n\t\tthis.tha = tha;\n\t\treturn this;\n\t}\n\n\tsetR(r) {\n\t\tthis.r = r;\n\t\treturn this;\n\t}\n\n\tsetTha(tha) {\n\t\tthis.tha = tha;\n\t\treturn this;\n\t}\n\n\tcopy(p) {\n\t\tthis.r = p.r;\n\t\tthis.tha = p.tha;\n\t\treturn this;\n\t}\n\n\ttoVector() {\n\t\treturn new Vector2D(this.getX(), this.getY());\n\t}\n\n\tgetX() {\n\t\treturn this.r * Math.sin(this.tha);\n\t}\n\n\tgetY() {\n\t\treturn -this.r * Math.cos(this.tha);\n\t}\n\n\tnormalize() {\n\t\tthis.r = 1;\n\t\treturn this;\n\t}\n\n\tequals(v) {\n\t\treturn ((v.r === this.r) && (v.tha === this.tha));\n\t}\n\n\tclear() {\n\t\tthis.r = 0.0;\n\t\tthis.tha = 0.0;\n\t\treturn this;\n\t}\n\n\tclone() {\n\t\treturn new Polar2D(this.r, this.tha);\n\t}\n}","export default {\n\tcreate(mat3) {\n\t\tconst mat = new Float32Array(9);\n\t\tif (mat3) this.set(mat3, mat);\n\n\t\treturn mat;\n\t},\n\n\tset(mat1, mat2) {\n\t\tfor (let i = 0; i < 9; i++)\n\t\t\tmat2[i] = mat1[i];\n\n\t\treturn mat2;\n\t},\n\n\tmultiply(mat, mat2, mat3) {\n\t\tlet a00 = mat[0], a01 = mat[1], a02 = mat[2], a10 = mat[3], a11 = mat[4], a20 = mat[6], a21 = mat[7], b00 = mat2[0], b01 = mat2[1], b02 = mat2[2], b10 = mat2[3], b11 = mat2[4], b20 = mat2[6], b21 = mat2[7];\n\n\t\tmat3[0] = b00 * a00 + b01 * a10;\n\t\tmat3[1] = b00 * a01 + b01 * a11;\n\t\tmat3[2] = a02 * b02;\n\t\tmat3[3] = b10 * a00 + b11 * a10;\n\t\tmat3[4] = b10 * a01 + b11 * a11;\n\t\tmat3[6] = b20 * a00 + b21 * a10 + a20;\n\t\tmat3[7] = b20 * a01 + b21 * a11 + a21;\n\n\t\treturn mat3;\n\t},\n\n\tinverse(mat, mat3) {\n\t\tlet a00 = mat[0], a01 = mat[1], a10 = mat[3], a11 = mat[4], a20 = mat[6], a21 = mat[7], b01 = a11, b11 = -a10, b21 = a21 * a10 - a11 * a20, d = a00 * b01 + a01 * b11, id;\n\n\t\tid = 1 / d;\n\t\tmat3[0] = b01 * id;\n\t\tmat3[1] = (-a01) * id;\n\t\tmat3[3] = b11 * id;\n\t\tmat3[4] = a00 * id;\n\t\tmat3[6] = b21 * id;\n\t\tmat3[7] = (-a21 * a00 + a01 * a20) * id;\n\n\t\treturn mat3;\n\t},\n\n\tmultiplyVec2(m, vec, mat3) {\n\t\tlet x = vec[0], y = vec[1];\n\n\t\tmat3[0] = x * m[0] + y * m[3] + m[6];\n\t\tmat3[1] = x * m[1] + y * m[4] + m[7];\n\n\t\treturn mat3;\n\t}\n}","import Span from './Span';\nimport Util from '../utils/Util';\nimport MathUtils from './MathUtils';\n\nexport default class ArraySpan extends Span {\n\n constructor(color) {\n super();\n this._arr = Util.isArray(color) ? color : [color];\n }\n\n getValue() {\n const color = this._arr[Math.floor(this._arr.length * Math.random())];\n return color === 'random' || color === 'Random' ? MathUtils.randomColor() : color;\n }\n\n /**\n * Make sure that the color is an instance of Proton.ArraySpan, if not it makes a new instance\n *\n * @method setSpanValue\n * @memberof Proton#Proton.Color\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} the integrate time 1/ms\n * @param {Int} the particle index\n */\n static createArraySpan(arr) {\n if (!arr) return null;\n\n if (arr instanceof ArraySpan)\n return arr;\n else\n return new ArraySpan(arr);\n }\n\n}","export default class Rectangle {\n\n\tconstructor(x, y, w, h) {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\n\t\tthis.width = w;\n\t\tthis.height = h;\n\n\t\tthis.bottom = this.y + this.height;\n\t\tthis.right = this.x + this.width;\n\t}\n\n\tcontains(x, y) {\n\t\tif (x <= this.right && x >= this.x && y <= this.bottom && y >= this.y)\n\t\t\treturn true;\n\t\telse\n\t\t\treturn false;\n\t}\n}\n","import Util from '../utils/Util';\n\nexport default class Rate {\n\n\t/**\n\t * The number of particles per second emission (a [particle]/b [s]);\n\t * @namespace\n\t * @memberof! Proton#\n\t * @constructor\n\t * @alias Rate\n\t *\n\t * @param {Array | Number | Span} numpan the number of each emission;\n\t * @param {Array | Number | Span} timepan the time of each emission;\n\t * for example: new Rate(new Span(10, 20), new Span(.1, .25));\n\t */\n\tconstructor(numpan, timepan) {\n\t\tthis.numPan = Util.setSpanValue(Util.initValue(numpan, 1));\n\t\tthis.timePan = Util.setSpanValue(Util.initValue(timepan, 1));\n\n\t\tthis.startTime = 0;\n\t\tthis.nextTime = 0;\n\t\tthis.init();\n\t}\n\n\tinit() {\n\t\tthis.startTime = 0;\n\t\tthis.nextTime = this.timePan.getValue();\n\t}\n\n\tgetValue(time) {\n\t\tthis.startTime += time;\n\n\t\tif (this.startTime >= this.nextTime) {\n\t\t\tthis.startTime = 0;\n\t\t\tthis.nextTime = this.timePan.getValue();\n\n\t\t\tif (this.numPan.b == 1) {\n\t\t\t\tif (this.numPan.getValue(false) > 0.5)\n\t\t\t\t\treturn 1;\n\t\t\t\telse\n\t\t\t\t\treturn 0;\n\t\t\t} else {\n\t\t\t\treturn this.numPan.getValue(true);\n\t\t\t}\n\t\t}\n\n\t\treturn 0;\n\t}\n}","export default class Initialize {\n\t\n\treset() {\n\t}\n\n\tinit(emitter, particle) {\n\t\tif (particle) {\n\t\t\tthis.initialize(particle);\n\t\t} else {\n\t\t\tthis.initialize(emitter);\n\t\t}\n\t};\n\n\t///sub class init\n\tinitialize(target) {\n\t};\n}","import Util from '../utils/Util';\nimport Initialize from './Initialize';\n\nexport default class Life extends Initialize {\n\n\tconstructor(a, b, c) {\n\t\tsuper();\n\n\t\tthis.lifePan = Util.setSpanValue(a, b, c);\n\t\tthis.name = 'Life';\n\t}\n\n\tinitialize(target) {\n\t\tif (this.lifePan.a == Infinity)\n\t\t\ttarget.life = Infinity;\n\t\telse\n\t\t\ttarget.life = this.lifePan.getValue();\n\t}\n}\n","import Vector2D from '../math/Vector2D';\n\nexport default class Zone {\n\tconstructor() {\n\t\tthis.vector = new Vector2D(0, 0);\n\t\tthis.random = 0;\n\t\tthis.crossType = \"dead\";\n\t\tthis.alert = true;\n\t}\n\n\tgetPosition() {\n\t}\n\n\tcrossing(particle) {\n\t}\n}","import Zone from './Zone';\n\nexport default class PointZone extends Zone {\n\n\tconstructor(x, y) {\n\t\tsuper();\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t}\n\n\tgetPosition() {\n\t\tthis.vector.x = this.x;\n\t\tthis.vector.y = this.y;\n\n\t\treturn this.vector;\n\t}\n\n\tcrossing(particle) {\n\t\t\n\t\tif (this.alert) {\n\t\t\talert('Sorry PointZone does not support crossing method');\n\t\t\tthis.alert = false;\n\t\t}\n\t}\n}","import Util from '../utils/Util';\nimport PointZone from '../zone/PointZone';\nimport Initialize from './Initialize';\n\nexport default class Position extends Initialize {\n\n\tconstructor(zone) {\n\t\tsuper();\n\t\tthis.zone = Util.initValue(zone, new PointZone());\n\n\t\tthis.name = 'Position';\n\t}\n\n\treset(zone) {\n\t\tthis.zone = Util.initValue(zone, new PointZone());\n\t}\n\n\tinitialize(target) {\n\t\tthis.zone.getPosition();\n\n\t\ttarget.p.x = this.zone.vector.x;\n\t\ttarget.p.y = this.zone.vector.y;\n\t};\n\n}\n","import Proton from '../core/Proton';\nimport Util from '../utils/Util';\nimport Polar2D from '../math/Polar2D';\nimport MathUtils from '../math/MathUtils';\nimport Initialize from './Initialize';\n\nexport default class Velocity extends Initialize {\n\n constructor(rpan, thapan, type) {\n super();\n\n this.rPan = Util.setSpanValue(rpan);\n this.thaPan = Util.setSpanValue(thapan);\n this.type = Util.initValue(type, 'vector');\n\n this.name = 'Velocity';\n }\n\n reset(rpan, thapan, type) {\n this.rPan = Util.setSpanValue(rpan);\n this.thaPan = Util.setSpanValue(thapan);\n this.type = Util.initValue(type, 'vector');\n };\n\n normalizeVelocity(vr) {\n return vr * Proton.MEASURE;\n }\n\n initialize(target) {\n if (this.type == 'p' || this.type == 'P' || this.type == 'polar') {\n const polar2d = new Polar2D(this.normalizeVelocity(this.rPan.getValue()), this.thaPan.getValue() * MathUtils.PI_180);\n\n target.v.x = polar2d.getX();\n target.v.y = polar2d.getY();\n } else {\n target.v.x = this.normalizeVelocity(this.rPan.getValue());\n target.v.y = this.normalizeVelocity(this.thaPan.getValue());\n }\n };\n}","import Util from '../utils/Util';\nimport Initialize from './Initialize';\n\nexport default class Mass extends Initialize {\n\n\tconstructor(a, b, c) {\n\t\tsuper();\n\t\tthis.massPan = Util.setSpanValue(a, b, c);\n\t\tthis.name = 'Mass';\n\t}\n\n\tinitialize(target) {\n\t\ttarget.mass = this.massPan.getValue();\n\t}\n}","import Util from '../utils/Util';\nimport Initialize from './Initialize';\n\nexport default class Radius extends Initialize {\n\n\tconstructor(a, b, c) {\n\t\tsuper();\n\t\tthis.radius = Util.setSpanValue(a, b, c);\n\n\t\tthis.name = 'Radius';\n\t}\n\n\treset(a, b, c) {\n\t\tthis.radius = Util.setSpanValue(a, b, c);\n\t};\n\n\tinitialize(particle) {\n\t\tparticle.radius = this.radius.getValue();\n\t\tparticle.transform.oldRadius = particle.radius;\n\t};\n}","import Util from '../utils/Util';\nimport ArraySpan from '../math/ArraySpan';\nimport Initialize from './Initialize';\n\nexport default class Body extends Initialize {\n\n constructor(image, w, h) {\n super();\n\n this.image = this.setSpanValue(image);\n this.w = Util.initValue(w, 20);\n this.h = Util.initValue(h, this.w);\n this.name = 'Body';\n }\n\n initialize(particle) {\n const imagetarget = this.image.getValue();\n\n if (typeof(imagetarget) == 'string') {\n particle.body = { width: this.w, height: this.h, src: imagetarget , isInner: true, inner: true };\n } else {\n particle.body = imagetarget;\n }\n };\n\n setSpanValue(color) {\n return color instanceof ArraySpan ? color : new ArraySpan(color);\n }\n}","import Proton from '../core/Proton';\nimport Util from '../utils/Util';\nimport ease from '../math/ease';\n\nexport default class Behaviour {\n static id = 0;\n\n /**\n * The Behaviour class is the base for the other Behaviour\n *\n * @memberof! -\n * @interface\n * @alias Proton.Behaviour\n *\n * @param {Number} life \tthe behaviours life\n * @param {String} easing \tThe behaviour's decaying trend, for example ease.easeOutQuart\n *\n * @property {String} id \t\tThe behaviours id\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n * @property {Number} age=0 \tHow long the particle should be 'alife'\n * @property {Number} energy=1\n * @property {Boolean} dead=false The particle is dead at first\n * @property {Array} parents \tThe behaviour's parents array\n * @property {String} name \tThe behaviour name\n */\n constructor(life, easing) {\n\n this.life = Util.initValue(life, Infinity);\n this.easing = ease.getEasing(easing);\n\n this.age = 0;\n this.energy = 1;\n this.dead = false;\n this.parents = [];\n\n this.id = `Behaviour_${Behaviour.id++}`;\n this.name = 'Behaviour';\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton.Behaviour\n * @instance\n *\n * @param {Number} [life=Infinity] \t\tthis behaviour's life\n * @param {String} [easing=easeLinear] \tthis behaviour's easing\n */\n reset(life, easing) {\n this.life = Util.initValue(life, Infinity);\n this.easing = ease.getEasing(easing);\n }\n\n /**\n * Normalize a force by 1:100;\n *\n * @method normalizeForce\n * @memberof Proton.Behaviour\n * @instance\n *\n * @param {Proton.Vector2D} force \n */\n normalizeForce(force) {\n return force.multiplyScalar(Proton.MEASURE);\n }\n\n /**\n * Normalize a value by 1:100;\n *\n * @method normalizeValue\n * @memberof Proton.Behaviour\n * @instance\n *\n * @param {Number} value\n */\n normalizeValue(value) {\n return value * Proton.MEASURE;\n }\n\n /**\n * Initialize the behaviour's parameters for all particles\n *\n * @method initialize\n * @memberof Proton.Behaviour\n * @instance\n *\n * @param {Proton.Particle} particle\n */\n initialize(particle) {}\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton.Behaviour\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} \t\t\ttime the integrate time 1/ms\n * @param {Int} \t\t\tindex the particle index\n */\n calculate(particle, time, index) {\n this.age += time;\n\n if (this.age >= this.life || this.dead) {\n this.energy = 0;\n this.dead = true;\n this.destroy();\n } else {\n const scale = this.easing(particle.age / particle.life);\n this.energy = Math.max(1 - scale, 0);\n }\n }\n\n /**\n * Destory this behaviour\n *\n * @method destroy\n * @memberof Proton.Behaviour\n * @instance\n */\n destroy() {\n let i = this.parents.length;\n while (i--) {\n this.parents[i].removeBehaviour(this);\n }\n\n this.parents.length = 0;\n }\n}","import Util from '../utils/Util';\nimport Vector2D from '../math/Vector2D';\nimport Behaviour from './Behaviour';\n\nexport default class Force extends Behaviour {\n\n\t/**\n\t * @memberof! Proton#\n\t * @augments Proton.Behaviour\n\t * @constructor\n\t * @alias Proton.Force\n\t *\n\t * @param {Number} fx\n\t * @param {Number} fy\n\t * @param {Number} [life=Infinity] \t\t\tthis behaviour's life\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n\t *\n\t * @property {String} name The Behaviour name\n\t */\n\tconstructor(fx, fy, life, easing) {\n\t\tsuper(life, easing);\n\n\t\tthis.force = this.normalizeForce(new Vector2D(fx, fy));\n\t\tthis.name = \"Force\";\n\t}\n\n\t/**\n\t * Reset this behaviour's parameters\n\t *\n\t * @method reset\n\t * @memberof Proton#Proton.Force\n\t * @instance\n\t *\n\t * @param {Number} fx\n\t * @param {Number} fy\n\t * @param {Number} [life=Infinity] \t\t\tthis behaviour's life\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n\t */\n\treset(fx, fy, life, easing) {\n\t\tthis.force = this.normalizeForce(new Vector2D(fx, fy));\n\n\t\tlife && super.reset(life, easing);\n\t}\n\n\t/**\n\t * Apply this behaviour for all particles every time\n\t *\n\t * @method applyBehaviour\n\t * @memberof Proton#Proton.Force\n\t * @instance\n\t *\n\t * @param {Proton.Particle} particle\n\t * @param {Number} the integrate time 1/ms\n\t * @param {Int} the particle index\n\t */\n\tapplyBehaviour(particle, time, index) {\n\t\tthis.calculate(particle, time, index);\n\t\tparticle.a.add(this.force);\n\t}\n}","import Util from '../utils/Util';\nimport Vector2D from '../math/Vector2D';\nimport Behaviour from './Behaviour';\n\nexport default class Attraction extends Behaviour {\n\n\t/**\n\t * This behaviour let the particles follow one specific Proton.Vector2D\n\t *\n\t * @memberof! Proton#\n\t * @augments Proton.Behaviour\n\t * @constructor\n\t * @alias Proton.Attraction\n\t *\n\t * @todo add description for 'force' and 'radius'\n\t *\n\t * @param {Proton.Vector2D} targetPosition the attraction point coordinates\n\t * @param {Number} [force=100]\n\t * @param {Number} [radius=1000]\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n\t *\n\t * @property {Proton.Vector2D} targetPosition\n\t * @property {Number} radius\n\t * @property {Number} force\n\t * @property {Number} radiusSq\n\t * @property {Proton.Vector2D} attractionForce\n\t * @property {Number} lengthSq\n\t * @property {String} name The Behaviour name\n\t */\n\tconstructor(targetPosition, force, radius, life, easing) {\n\t\tsuper(life, easing);\n\n\t\tthis.targetPosition = Util.initValue(targetPosition, new Vector2D);\n\t\tthis.radius = Util.initValue(radius, 1000);\n\t\tthis.force = Util.initValue(this.normalizeValue(force), 100);\n\n\t\tthis.radiusSq = this.radius * this.radius\n\t\tthis.attractionForce = new Vector2D();\n\t\tthis.lengthSq = 0;\n\n\t\tthis.name = \"Attraction\";\n\t}\n\n\t/**\n\t * Reset this behaviour's parameters\n\t *\n\t * @method reset\n\t * @memberof Proton#Proton.Attraction\n\t * @instance\n\t *\n\t * @todo add description for 'force' and 'radius'\n\t *\n\t * @param {Proton.Vector2D} targetPosition the attraction point coordinates\n\t * @param {Number} [force=100]\n\t * @param {Number} [radius=1000]\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n\t */\n\treset(targetPosition, force, radius, life, easing) {\n\t\tthis.targetPosition = Util.initValue(targetPosition, new Vector2D);\n\t\tthis.radius = Util.initValue(radius, 1000);\n\t\tthis.force = Util.initValue(this.normalizeValue(force), 100);\n\n\t\tthis.radiusSq = this.radius * this.radius\n\t\tthis.attractionForce = new Vector2D();\n\t\tthis.lengthSq = 0;\n\n\t\tlife && super.reset(life, easing);\n\t}\n\n\t/**\n\t * Apply this behaviour for all particles every time\n\t *\n\t * @memberof Proton#Proton.Attraction\n\t * @method applyBehaviour\n\t * @instance\n\t *\n\t * @param {Proton.Particle} particle\n\t * @param {Number} \t\t\ttime the integrate time 1/ms\n\t * @param {Int} \t\t\tindex the particle index\n\t */\n\tapplyBehaviour(particle, time, index) {\n\t\tthis.calculate(particle, time, index);\n\n\t\tthis.attractionForce.copy(this.targetPosition);\n\t\tthis.attractionForce.sub(particle.p);\n\t\tthis.lengthSq = this.attractionForce.lengthSq();\n\n\t\tif (this.lengthSq > 0.000004 && this.lengthSq < this.radiusSq) {\n\t\t\tthis.attractionForce.normalize();\n\t\t\tthis.attractionForce.multiplyScalar(1 - this.lengthSq / this.radiusSq);\n\t\t\tthis.attractionForce.multiplyScalar(this.force);\n\n\t\t\tparticle.a.add(this.attractionForce);\n\t\t}\n\t}\n}\n\n","import Util from '../utils/Util';\nimport Vector2D from '../math/Vector2D';\nimport MathUtils from '../math/MathUtils';\nimport Behaviour from './Behaviour';\n\nexport default class RandomDrift extends Behaviour {\n\n\t/**\n\t * @memberof! Proton#\n\t * @augments Behaviour\n\t * @constructor\n\t * @alias RandomDrift\n\t *\n\t * @param {Number} driftX \t\t\t\tX value of the new Vector2D\n\t * @param {Number} driftY \t\t\t\tY value of the new Vector2D\n\t * @param {Number} delay \t\t\t\tHow much delay the drift should have\n\t * @param {Number} [life=Infinity] \t\tthis behaviour's life\n\t * @param {String} [easing=easeLinear] \tthis behaviour's easing\n\t *\n\t * @property {Number} time The time of the drift\n\t * @property {String} name The Behaviour name\n\t */\n\tconstructor(driftX, driftY, delay, life, easing) {\n\t\tsuper(life, easing);\n\n\t\tthis.reset(driftX, driftY, delay);\n\t\tthis.time = 0;\n\t\tthis.name = \"RandomDrift\";\n\t}\n\n\t/**\n\t * Reset this behaviour's parameters\n\t *\n\t * @method reset\n\t * @memberof Proton#RandomDrift\n\t * @instance\n\t *\n\t * @param {Number} driftX \t\t\t\tX value of the new Vector2D\n\t * @param {Number} driftY \t\t\t\tY value of the new Vector2D\n\t * @param {Number} delay \t\t\t\tHow much delay the drift should have\n\t * @param {Number} [life=Infinity] \t\tthis behaviour's life\n\t * @param {String} [easing=easeLinear] \tthis behaviour's easing\n\t */\n\treset(driftX, driftY, delay, life, easing) {\n\t\tthis.panFoce = new Vector2D(driftX, driftY);\n\t\tthis.panFoce = this.normalizeForce(this.panFoce);\n\t\tthis.delay = delay;\n\n\t\tlife && super.reset(life, easing);\n\t}\n\n\t/**\n\t * Apply this behaviour for all particles every time\n\t *\n\t * @method applyBehaviour\n\t * @memberof Proton#RandomDrift\n\t * @instance\n\t *\n\t * @param {Particle} particle\n\t * @param {Number} \t\t\ttime the integrate time 1/ms\n\t * @param {Int} \t\t\tindex the particle index\n\t */\n\tapplyBehaviour(particle, time, index) {\n\t\tthis.calculate(particle, time, index);\n\t\tthis.time += time;\n\n\t\tif (this.time >= this.delay) {\n\t\t\tparticle.a.addXY(MathUtils.randomAToB(-this.panFoce.x, this.panFoce.x), MathUtils.randomAToB(-this.panFoce.y, this.panFoce.y));\n\t\t\tthis.time = 0;\n\t\t};\n\t}\n}\n","import Util from '../utils/Util';\nimport Vector2D from '../math/Vector2D';\nimport Force from './Force';\n\nexport default class Gravity extends Force {\n\n\t/**\n\t * @memberof! Proton#\n\t * @augments Proton#Proton.Force\n\t * @constructor\n\t * @alias Proton.Gravity\n\t *\n\t * @param {Number} g \t\t\t\t\t\t\tGravity\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n\t *\n\t * @property {String} name The Behaviour name\n\t */\n\tconstructor(g, life, easing) {\n\t\tsuper(0, g, life, easing);\n\t\tthis.name = \"Gravity\";\n\t}\n\n\t/**\n\t * Reset this behaviour's parameters\n\t *\n\t * @method reset\n\t * @memberof Proton#Proton.Gravity\n\t * @instance\n\t *\n\t * @param {Number} g \t\t\t\t\t\t\tGravity\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n\t */\n\treset(g, life, easing) {\n\t\tsuper.reset(0, g, life, easing);\n\t}\n}","import Util from '../utils/Util';\nimport Vector2D from '../math/Vector2D';\nimport Behaviour from './Behaviour';\n\n//can use Collision(emitter,true,function(){}) or Collision();\nexport default class Collision extends Behaviour {\n\n\t/**\n\t * The callback after collision\n\t *\n\t * @callback Callback\n\t *\n\t * @param {Proton.Particle} particle\n\t * @param {Proton.Paritcle} otherParticle\n\t */\n\t/**\n\t * @memberof! Proton#\n\t * @augments Proton.Behaviour\n\t * @constructor\n\t * @alias Proton.Collision\n\t *\n\t * @todo add description to mass\n\t *\n\t * @param {Proton.Emitter} \t[emitter=null] \t\tthe attraction point coordinates\n\t * @param {Boolean} \t\t[mass=true]\t\t\t\n\t * @param {Callback}\t \t[callback=null]\t\tthe callback after the collision\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n\t *\n\t * @property {String} name The Behaviour name\n\t */\n\tconstructor(emitter, mass, callback, life, easing) {\n\t\tsuper(life, easing);\n\n\t\tthis.reset(emitter, mass, callback);\n\t\tthis.name = \"Collision\";\n\t}\n\n\t/**\n\t * Reset this behaviour's parameters\n\t *\n\t * @memberof Proton#Proton.Collision\n\t * @method reset\n\t * @instance\n\t *\n\t * @todo add description to mass\n\t *\n\t * @param {Proton.Emitter} \t[emitter=null] \t\tthe attraction point coordinates\n\t * @param {Boolean} \t\t[mass=true]\t\t\t\n\t * @param {Callback}\t \t[callback=null]\t\tthe callback after the collision\n\t * @param {Number} \t\t\t[life=Infinity] \tthis behaviour's life\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n\t */\n\treset(emitter, mass, callback, life, easing) {\n\t\tthis.emitter = Util.initValue(emitter, null);\n\t\tthis.mass = Util.initValue(mass, true);\n\t\tthis.callback = Util.initValue(callback, null);\n\n\t\tthis.collisionPool = [];\n\t\tthis.delta = new Vector2D();\n\n\t\tlife && super.reset(life, easing);\n\t}\n\n\t/**\n\t * Apply this behaviour for all particles every time\n\t *\n\t * @memberof Proton#Proton.Collision\n\t * @method applyBehaviour\n\t * @instance\n\t *\n\t * @param {Proton.Particle} particle\n\t * @param {Number} \t\t\ttime the integrate time 1/ms\n\t * @param {Int} \t\t\tindex the particle index\n\t */\n\tapplyBehaviour(particle, time, index) {\n\t\tconst newPool = this.emitter ? this.emitter.particles.slice(index) : this.pool.slice(index);\n\t\tconst length = newPool.length;\n\n\t\tlet otherParticle;\n\t\tlet lengthSq;\n\t\tlet overlap;\n\t\tlet totalMass;\n\t\tlet averageMass1, averageMass2;\n\t\tlet i;\n\n\t\tfor (i = 0; i < length; i++) {\n\t\t\totherParticle = newPool[i];\n\n\t\t\tif (otherParticle !== particle) {\n\t\t\t\tthis.delta.copy(otherParticle.p);\n\t\t\t\tthis.delta.sub(particle.p);\n\n\t\t\t\tlengthSq = this.delta.lengthSq();\n\t\t\t\tconst distance = particle.radius + otherParticle.radius;\n\n\t\t\t\tif (lengthSq <= distance * distance) {\n\t\t\t\t\toverlap = distance - Math.sqrt(lengthSq);\n\t\t\t\t\toverlap += 0.5;\n\n\t\t\t\t\ttotalMass = particle.mass + otherParticle.mass;\n\t\t\t\t\taverageMass1 = this.mass ? otherParticle.mass / totalMass : 0.5;\n\t\t\t\t\taverageMass2 = this.mass ? particle.mass / totalMass : 0.5;\n\t\t\t\t\t\n\t\t\t\t\tparticle.p.add(this.delta.clone().normalize().multiplyScalar(overlap * -averageMass1));\n\t\t\t\t\totherParticle.p.add(this.delta.normalize().multiplyScalar(overlap * averageMass2));\n\n\t\t\t\t\tthis.callback && this.callback(particle, otherParticle);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n","import Util from '../utils/Util';\nimport Behaviour from './Behaviour';\n\nexport default class CrossZone extends Behaviour {\n\n /**\n * Defines what happens if the particles come to the end of the specified zone\n *\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.CrossZone\n *\n * @param {Proton.Zone} zone \t\t\t\t\t\tcan be any Proton.Zone - e.g. Proton.RectZone()\n * @param {String} \t\t[crossType=dead] \t\t\twhat happens if the particles pass the zone - allowed strings: dead | bound | cross\n * @param {Number} \t\t[life=Infinity] \t\t\tthis behaviour's life\n * @param {String} \t\t[easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(zone, crossType, life, easing) {\n super(life, easing);\n\n this.reset(zone, crossType);\n this.name = \"CrossZone\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.CrossZone\n * @instance\n *\n * @param {Proton.Zone} zone \t\t\t\tcan be any Proton.Zone - e.g. Proton.RectZone()\n * @param {String} \t\t[crossType=dead] \twhat happens if the particles pass the zone - allowed strings: dead | bound | cross\n * @param {Number} \t\t[life=Infinity] \tthis behaviour's life\n * @param {String} \t\t[easing=easeLinear]\tthis behaviour's easing\n */\n reset(zone, crossType, life, easing) {\n this.zone = zone;\n this.zone.crossType = Util.initValue(crossType, \"dead\");\n\n life && super.reset(life, easing);\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#Proton.CrossZone\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} the integrate time 1/ms\n * @param {Int} the particle index\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n this.zone.crossing(particle);\n };\n}","import Util from '../utils/Util';\nimport Behaviour from './Behaviour';\n\nexport default class Alpha extends Behaviour {\n\n\t/**\n\t * @memberof! Proton#\n\t * @augments Proton.Behaviour\n\t * @constructor\n\t * @alias Proton.Alpha\n\t *\n\t * @todo add description for 'a' and 'b'\n\t *\n\t * @param {Number} a\n\t * @param {String} b\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n\t *\n\t * @property {String} name The Behaviour name\n\t */\n\tconstructor(a, b, life, easing) {\n\t\tsuper(life, easing);\n\n\t\tthis.reset(a, b);\n\t\tthis.name = \"Alpha\";\n\t}\n\n\t/**\n\t * Reset this behaviour's parameters\n\t *\n\t * @method reset\n\t * @memberof Proton#Proton.Alpha\n\t * @instance\n\t *\n\t * @todo add description for 'a' and 'b'\n\t *\n\t * @param {Number} a\n\t * @param {String} b\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n\t */\n\treset(a, b, life, easing) {\n\t\tthis.same = b === null || b === undefined ? true : false;\n\t\tthis.a = Util.setSpanValue(Util.initValue(a, 1));\n\t\tthis.b = Util.setSpanValue(b);\n\n\t\tlife && super.reset(life, easing);\n\t}\n\t\n\t/**\n\t * Sets the new alpha value of the particle\n\t *\n\t * @method initialize\n\t * @memberof Proton#Proton.Alpha\n\t * @instance\n\t *\n\t * @param {Proton.Particle} particle A single Proton generated particle\n\t */\n\tinitialize(particle) {\n\t\tparticle.transform.alphaA = this.a.getValue();\n\n\t\tif (this.same)\n\t\t\tparticle.transform.alphaB = particle.transform.alphaA;\n\t\telse\n\t\t\tparticle.transform.alphaB = this.b.getValue();\n\t}\n\n\t/**\n\t * @method applyBehaviour\n\t * @memberof Proton#Proton.Alpha\n\t * @instance\n\t *\n\t * @param {Proton.Particle} particle\n\t * @param {Number} \t\t\ttime the integrate time 1/ms\n\t * @param {Int} \t\t\tindex the particle index\n \t */\n\tapplyBehaviour(particle, time, index) {\n\t\tthis.calculate(particle, time, index);\n\t\t\n\t\tparticle.alpha = particle.transform.alphaB + (particle.transform.alphaA - particle.transform.alphaB) * this.energy;\n\t\tif (particle.alpha < 0.001) particle.alpha = 0;\n\t}\n}\n","import Util from '../utils/Util';\nimport Behaviour from './Behaviour';\n\nexport default class Scale extends Behaviour {\n\n\t/**\n\t * @memberof! Proton#\n\t * @augments Proton.Behaviour\n\t * @constructor\n\t * @alias Proton.Scale\n\t *\n\t * @todo add description for 'a' and 'b'\n\t *\n\t * @param {Number} a\n\t * @param {String} b\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n\t *\n\t * @property {String} name The Behaviour name\n\t */\n\tconstructor(a, b, life, easing) {\n\t\tsuper(life, easing);\n\n\t\tthis.reset(a, b);\n\t\tthis.name = \"Scale\";\n\t}\n\n\t/**\n\t * Reset this behaviour's parameters\n\t *\n\t * @method reset\n\t * @memberof Proton#Proton.Scale\n\t * @instance\n\t *\n\t * @param {Number} a\n\t * @param {String} b\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n\t */\n\treset(a, b, life, easing) {\n\t\tthis.same = b === null || b === undefined ? true : false;\n\t\tthis.a = Util.setSpanValue(Util.initValue(a, 1));\n\t\tthis.b = Util.setSpanValue(b);\n\n\t\tlife && super.reset(life, easing);\n\t}\n\n\t/**\n\t * Initialize the behaviour's parameters for all particles\n\t *\n\t * @method initialize\n\t * @memberof Proton#Proton.Scale\n\t * @instance\n\t *\n\t * @param {Proton.Particle} particle\n\t */\n\tinitialize(particle) {\n\t\tparticle.transform.scaleA = this.a.getValue();\n\t\tparticle.transform.oldRadius = particle.radius;\n\t\tparticle.transform.scaleB = this.same ? particle.transform.scaleA : this.b.getValue();\n\t};\n\n\t/**\n\t * Apply this behaviour for all particles every time\n\t *\n\t * @method applyBehaviour\n\t * @memberof Proton#Proton.Scale\n\t * @instance\n\t *\n\t * @param {Proton.Particle} particle\n\t * @param {Number} \t\t\ttime the integrate time 1/ms\n\t * @param {Int} \t\t\tindex the particle index\n\t */\n\tapplyBehaviour(particle, time, index) {\n\t\tthis.calculate(particle, time, index);\n\t\tparticle.scale = particle.transform.scaleB + (particle.transform.scaleA - particle.transform.scaleB) * this.energy;\n\n\t\tif (particle.scale < 0.0001) particle.scale = 0;\n\t\tparticle.radius = particle.transform.oldRadius * particle.scale;\n\t}\n}","import Util from '../utils/Util';\nimport Behaviour from './Behaviour';\n\nexport default class Rotate extends Behaviour {\n\n\t/**\n\t * @memberof! Proton#\n\t * @augments Proton.Behaviour\n\t * @constructor\n\t * @alias Proton.Rotate\n\t *\n\t * @todo add description for 'a', 'b' and 'style'\n\t *\n\t * @param {Number} a\n\t * @param {String} b\n\t * @param {String} [style=to]\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n\t *\n\t * @property {String} name The Behaviour name\n\t */\n\tconstructor(a, b, style, life, easing) {\n\t\tsuper(life, easing);\n\n\t\tthis.reset(a, b, style);\n\t\tthis.name = \"Rotate\";\n\t}\n\n\t/**\n\t * Reset this behaviour's parameters\n\t *\n\t * @method reset\n\t * @memberof Proton#Proton.Rotate\n\t * @instance\n\t *\n\t * @todo add description for 'a', 'b' and 'style'\n\t *\n\t * @param {Number} a\n\t * @param {String} b\n\t * @param {String} [style=to]\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n\t */\n\treset(a, b, style, life, easing) {\n\t\tthis.same = b === null || b === undefined ? true : false;\n\n\t\tthis.a = Util.setSpanValue(Util.initValue(a, \"Velocity\"));\n\t\tthis.b = Util.setSpanValue(Util.initValue(b, 0));\n\t\tthis.style = Util.initValue(style, 'to');\n\n\t\tlife && super.reset(life, easing);\n\t}\n\n\t/**\n\t * Initialize the behaviour's parameters for all particles\n\t *\n\t * @method initialize\n\t * @memberof Proton#Proton.Rotate\n\t * @instance\n\t *\n\t * @param {Proton.Particle} particle\n\t */\n\tinitialize(particle) {\n\t\tparticle.rotation = this.a.getValue();\n\t\tparticle.transform.rotationA = this.a.getValue();\n\n\t\tif (!this.same) particle.transform.rotationB = this.b.getValue();\n\t};\n\n\t/**\n\t * Apply this behaviour for all particles every time\n\t *\n\t * @method applyBehaviour\n\t * @memberof Proton#Proton.Rotate\n\t * @instance\n\t *\n\t * @param {Proton.Particle} particle\n\t * @param {Number} \t\t\ttime the integrate time 1/ms\n\t * @param {Int} \t\t\tindex the particle index\n\t */\n\tapplyBehaviour(particle, time, index) {\n\t\tthis.calculate(particle, time, index);\n\n\t\tif (!this.same) {\n\t\t\tif (this.style == 'to' || this.style == 'TO' || this.style == '_') {\n\t\t\t\tparticle.rotation += particle.transform.rotationB + (particle.transform.rotationA - particle.transform.rotationB) * this.energy\n\t\t\t} else {\n\t\t\t\tparticle.rotation += particle.transform.rotationB;\n\t\t\t}\n\t\t} else if (this.a.a == \"V\" || this.a.a == \"Velocity\" || this.a.a == \"v\") {\n\t\t\t//beta...\n\t\t\tparticle.rotation = particle.getDirection();\n\t\t}\n\t}\n\n}","import Util from '../utils/Util';\nimport ColorUtil from '../utils/ColorUtil';\nimport ArraySpan from '../math/ArraySpan';\nimport Behaviour from './Behaviour';\n\nexport default class Color extends Behaviour {\n\n /**\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.Color\n *\n * @param {Proton.ArraySpan | String} a the string should be a hex e.g. #000000 for black\n * @param {Proton.ArraySpan | String} b the string should be a hex e.g. #000000 for black\n * @param {Number} [life=Infinity] \tthis behaviour's life\n * @param {String} [easing=easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(a, b, life, easing) {\n super(life, easing);\n\n this.reset(a, b);\n this.name = \"Color\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.Color\n * @instance\n *\n * @param {Proton.ArraySpan | String} a the string should be a hex e.g. #000000 for black\n * @param {Proton.ArraySpan | String} b the string should be a hex e.g. #000000 for black\n * @param {Number} [life=Infinity] \tthis behaviour's life\n * @param {String} [easing=easeLinear] \tthis behaviour's easing\n */\n reset(a, b, life, easing) {\n this.a = ArraySpan.createArraySpan(a);\n this.b = ArraySpan.createArraySpan(b);\n\n life && super.reset(life, easing);\n }\n\n /**\n * Initialize the behaviour's parameters for all particles\n *\n * @method initialize\n * @memberof Proton#Proton.Color\n * @instance\n *\n * @param {Proton.Particle} particle\n */\n initialize(particle) {\n particle.color = this.a.getValue();\n particle.transform.colorA = ColorUtil.hexToRGB(particle.color);\n\n if (this.b)\n particle.transform.colorB = ColorUtil.hexToRGB(this.b.getValue());\n };\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#Proton.Color\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} the integrate time 1/ms\n * @param {Int} the particle index\n */\n applyBehaviour(particle, time, index) {\n if (this.b) {\n this.calculate(particle, time, index);\n\n particle.transform.rgb.r = particle.transform.colorB.r + (particle.transform.colorA.r - particle.transform.colorB.r) * this.energy;\n particle.transform.rgb.g = particle.transform.colorB.g + (particle.transform.colorA.g - particle.transform.colorB.g) * this.energy;\n particle.transform.rgb.b = particle.transform.colorB.b + (particle.transform.colorA.b - particle.transform.colorB.b) * this.energy;\n\n particle.transform.rgb.r = Math.floor(particle.transform.rgb.r);\n particle.transform.rgb.g = Math.floor(particle.transform.rgb.g);\n particle.transform.rgb.b = Math.floor(particle.transform.rgb.b);\n\n } else {\n particle.transform.rgb.r = particle.transform.colorA.r;\n particle.transform.rgb.g = particle.transform.colorA.g;\n particle.transform.rgb.b = particle.transform.colorA.b;\n }\n };\n\n}","import Util from '../utils/Util';\nimport Attraction from './Attraction';\n\nexport default class Repulsion extends Attraction {\n\n\t/**\n\t * The oppisite of Proton.Attraction - turns the force\n\t *\n\t * @memberof! Proton#\n\t * @augments Proton#Proton.Attraction\n\t * @constructor\n\t * @alias Proton.Repulsion\n\t *\n\t * @todo add description for 'force' and 'radius'\n\t *\n\t * @param {Proton.Vector2D} targetPosition the attraction point coordinates\n\t * @param {Number} [force=100]\n\t * @param {Number} [radius=1000]\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n\t *\n\t * @property {Number} force\n\t * @property {String} name The Behaviour name\n\t */\n\tconstructor(targetPosition, force, radius, life, easing) {\n\t\tsuper(targetPosition, force, radius, life, easing);\n\n\t\tthis.force *= -1;\n\t\tthis.name = \"Repulsion\";\n\t}\n\n\t/**\n\t * Reset this behaviour's parameters\n\t *\n\t * @method reset\n\t * @memberof Proton#Proton.Repulsion\n\t * @instance\n\t *\n\t * @todo add description for 'force' and 'radius'\n\t *\n\t * @param {Proton.Vector2D} targetPosition the attraction point coordinates\n\t * @param {Number} [force=100]\n\t * @param {Number} [radius=1000]\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n\t */\n\treset(targetPosition, force, radius, life, easing) {\n\t\tsuper.reset(targetPosition, force, radius, life, easing);\n\t\tthis.force *= -1;\n\t}\n}\n","import Util from '../utils/Util';\nimport Vector2D from '../math/Vector2D';\nimport Behaviour from './Behaviour';\n\nexport default class GravityWell extends Behaviour {\n\n\t/**\n\t * @memberof! Proton#\n\t * @augments Behaviour\n\t * @constructor\n\t * @alias GravityWell\n\t *\n\t * @param {Vector2D} [centerPoint=new Vector2D] The point in the center\n\t * @param {Number} [force=100]\t\t\t\t\tThe force\t\n\t * @param {Number} [life=Infinity]\t\t\t\tthis behaviour's life\n\t * @param {String} [easing=easeLinear]\tthis behaviour's easing\n\t *\n\t * @property {String} name The Behaviour name\n\t */\n\tconstructor(centerPoint, force, life, easing) {\n\t\tsuper(life, easing);\n\n\t\tthis.distanceVec = new Vector2D();\n\t\tthis.centerPoint = Util.initValue(centerPoint, new Vector2D);\n\t\tthis.force = Util.initValue(this.normalizeValue(force), 100);\n\n\t\tthis.name = \"GravityWell\";\n\t}\n\n\t/**\n\t * Reset this behaviour's parameters\n\t *\n\t * @method reset\n\t * @memberof Proton#GravityWell\n\t * @instance\n\t *\n\t * @param {Vector2D} [centerPoint=new Vector2D] The point in the center\n\t * @param {Number} [force=100]\t\t\t\t\tThe force\t\n\t * @param {Number} [life=Infinity]\t\t\t\tthis behaviour's life\n\t * @param {String} [easing=easeLinear]\tthis behaviour's easing\n\t */\n\treset(centerPoint, force, life, easing) {\n\t\tthis.distanceVec = new Vector2D();\n\t\tthis.centerPoint = Util.initValue(centerPoint, new Vector2D);\n\t\tthis.force = Util.initValue(this.normalizeValue(force), 100);\n\t\t\n\t\tlife && super.reset(life, easing);\n\t};\n\n\t/**\n\t * @inheritdoc\n\t */\n\tinitialize(particle) {\n\t};\n\n\t/**\n\t * Apply this behaviour for all particles every time\n\t *\n\t * @method applyBehaviour\n\t * @memberof Proton#GravityWell\n\t * @instance\n\t *\n\t * @param {Particle} particle\n\t * @param {Number} the integrate time 1/ms\n\t * @param {Int} the particle index\n\t */\n\tapplyBehaviour(particle, time, index) {\n\t\tthis.distanceVec.set(this.centerPoint.x - particle.p.x, this.centerPoint.y - particle.p.y);\n\t\tconst distanceSq = this.distanceVec.lengthSq();\n\n\t\tif (distanceSq != 0) {\n\t\t\tconst distance = this.distanceVec.length();\n\t\t\tconst factor = (this.force * time) / (distanceSq * distance);\n\n\t\t\tparticle.v.x += factor * this.distanceVec.x;\n\t\t\tparticle.v.y += factor * this.distanceVec.y;\n\t\t}\n\t}\n}","import Util from '../utils/Util';\nimport MathUtils from '../math/MathUtils';\n\nexport default {\n\n\tinitialize(emitter, particle, initializes) {\n\t\tconst length = initializes.length;\n\t\tlet i;\n\n\t\tfor (i = 0; i < length; i++) {\n\t\t\tif (initializes[i] instanceof Proton.Initialize)\n\t\t\t\tinitializes[i].init(emitter, particle);\n\t\t\telse\n\t\t\t\tthis.init(emitter, particle, initializes[i]);\n\t\t}\n\n\t\tthis.bindEmitter(emitter, particle);\n\t},\n\n\t//////////////////////init//////////////////////\n\tinit(emitter, particle, initialize) {\n\t\tUtil.setPrototypeByObject(particle, initialize);\n\t\tUtil.setVector2DByObject(particle, initialize);\n\t},\n\t\n\tbindEmitter(emitter, particle) {\n\t\tif (emitter.bindEmitter) {\n\t\t\tparticle.p.add(emitter.p);\n\t\t\tparticle.v.add(emitter.v);\n\t\t\tparticle.a.add(emitter.a);\n\n\t\t\tparticle.v.rotate(MathUtils.degreeTransform(emitter.rotation));\n\t\t}\n\t}\n}\n","import Util from '../utils/Util';\nimport Particle from '../core/Particle';\nimport EventDispatcher from '../events/EventDispatcher';\n\nimport Rate from '../initialize/Rate';\nimport InitializeUtil from '../initialize/InitializeUtil';\n\nexport default class Emitter extends Particle {\n\n\tstatic ID = 0;\n\n\t/**\n\t * You can use this emit particles.\n\t *\n\t * It will dispatch follow events:\n\t * PARTICLE_CREATED\n\t * PARTICLE_UPDATA\n\t * PARTICLE_DEAD\n\t *\n\t * @class Emitter\n\t * @constructor\n\t * @param {Object} pObj the parameters object;\n\t * for example {damping:0.01,bindEmitter:false}\n\t */\n\tconstructor(pObj) {\n\t\tsuper(pObj);\n\n\t\tthis.initializes = [];\n\t\tthis.particles = [];\n\t\tthis.behaviours = [];\n\n\t\tthis.emitSpeed = 0;\n\t\tthis.currentEmitTime = 0;\n\t\tthis.totalEmitTimes = -1;\n\n\t\t/**\n\t\t * The friction coefficient for all particle emit by This;\n\t\t * @property damping\n\t\t * @type {Number}\n\t\t * @default 0.006\n\t\t */\n\t\tthis.damping = .006;\n\n\t\t/**\n\t\t * If bindEmitter the particles can bind this emitter's property;\n\t\t * @property bindEmitter\n\t\t * @type {Boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.bindEmitter = true;\n\n\t\t/**\n\t\t * The number of particles per second emit (a [particle]/b [s]);\n\t\t * @property rate\n\t\t * @type {Rate}\n\t\t * @default Rate(1, .1)\n\t\t */\n\t\tthis.rate = new Rate(1, .1);\n\n\t\tthis.id = `emitter_${Emitter.ID++}`;\n\t\tthis.name = 'Emitter';\n\t}\n\n\t/**\n\t * start emit particle\n\t * @method emit\n\t * @param {Number} currentEmitTime begin emit time;\n\t * @param {String} life the life of this emitter\n\t */\n\temit(totalEmitTimes, life) {\n\t\tthis.stoped = false;\n\t\tthis.currentEmitTime = 0;\n\t\tthis.totalEmitTimes = Util.initValue(totalEmitTimes, Infinity);\n\n\t\tif (life == true || life == 'life' || life == 'destroy') {\n\t\t\tthis.life = totalEmitTimes == 'once' ? 1 : this.totalEmitTimes;\n\t\t} else if (!isNaN(life)) {\n\t\t\tthis.life = life;\n\t\t}\n\n\t\tthis.rate.init();\n\t}\n\n\t/**\n\t * stop emiting\n\t * @method stop\n\t */\n\tstop() {\n\t\tthis.totalEmitTimes = -1;\n\t\tthis.currentEmitTime = 0;\n\t\tthis.stoped = true;\n\t}\n\n\t/**\n\t * remove current all particles\n\t * @method removeAllParticles\n\t */\n\tremoveAllParticles() {\n\t\tlet i = this.particles.length;\n\t\twhile (i--) this.particles[i].dead = true;\n\t}\n\n\t/**\n\t * add initialize to this emitter\n\t * @method addSelfInitialize\n\t */\n\taddSelfInitialize(pObj) {\n\t\tif (pObj['init']) {\n\t\t\tpObj.init(this);\n\t\t} else {\n\t\t\tthis.initAll();\n\t\t}\n\t}\n\n\t/**\n\t * add the Initialize to particles;\n\t * \n\t * you can use initializes array:for example emitter.addInitialize(initialize1,initialize2,initialize3);\n\t * @method addInitialize\n\t * @param {Initialize} initialize like this new Radius(1, 12)\n\t */\n\taddInitialize(...rest) {\n\t\tlet i = rest.length;\n\t\twhile (i--)\n\t\t\tthis.initializes.push(rest[i]);\n\t}\n\n\t/**\n\t * remove the Initialize\n\t * @method removeInitialize\n\t * @param {Initialize} initialize a initialize\n\t */\n\tremoveInitialize(initializer) {\n\t\tconst index = this.initializes.indexOf(initializer);\n\t\tif (index > -1) this.initializes.splice(index, 1);\n\t}\n\n\t/**\n\t * remove all Initializes\n\t * @method removeInitializers\n\t */\n\tremoveAllInitializers() {\n\t\tUtil.destroyArray(this.initializes);\n\t}\n\n\t/**\n\t * add the Behaviour to particles;\n\t * \n\t * you can use Behaviours array:emitter.addBehaviour(Behaviour1,Behaviour2,Behaviour3);\n\t * @method addBehaviour\n\t * @param {Behaviour} behaviour like this new Color('random')\n\t */\n\taddBehaviour(...rest) {\n\t\tlet i = arguments.length;\n\t\twhile (i--) {\n\t\t\tlet behaviour = rest[i];\n\t\t\tthis.behaviours.push(behaviour);\n\t\t\tif (behaviour.parents) behaviour.parents.push(this);\n\t\t}\n\t}\n\n\t/**\n\t * remove the Behaviour\n\t * @method removeBehaviour\n\t * @param {Behaviour} behaviour a behaviour\n\t */\n\tremoveBehaviour(behaviour) {\n\t\tlet index = this.behaviours.indexOf(behaviour);\n\t\tthis.behaviours.splice(index, 1);\n\n\t\tif (behaviour.parents) {\n\t\t\tindex = behaviour.parents.indexOf(behaviour);\n\t\t\tbehaviour.parents.splice(index, 1);\n\t\t}\n\n\t\treturn index;\n\t}\n\n\t/**\n\t * remove all behaviours\n\t * @method removeAllBehaviours\n\t */\n\tremoveAllBehaviours() {\n\t\tUtil.destroyArray(this.behaviours);\n\t}\n\n\t// emitter update \n\tupdate(time) {\n\t\tthis.age += time;\n\t\tif (this.age >= this.life || this.dead) this.destroy();\n\n\t\tthis.emitting(time);\n\t\tthis.integrate(time);\n\t}\n\n\tintegrate(time) {\n\t\tif (!this.parent) return;\n\n\t\tconst damping = 1 - this.damping;\n\t\tthis.parent.integrator.calculate(this, time, damping);\n\n\t\tconst length = this.particles.length;\n\t\tlet i, particle;\n\n\t\tfor (i = length - 1; i >= 0; i--) {\n\t\t\tparticle = this.particles[i];\n\n\t\t\t// particle update\n\t\t\tparticle.update(time, i);\n\t\t\tthis.parent.integrator.calculate(particle, time, damping);\n\t\t\tthis.dispatch(\"PARTICLE_UPDATE\", particle);\n\n\t\t\t// check dead\n\t\t\tif (particle.dead) {\n\t\t\t\tthis.dispatch(\"PARTICLE_DEAD\", particle);\n\n\t\t\t\tthis.parent.pool.expire(particle);\n\t\t\t\tthis.particles.splice(i, 1);\n\t\t\t}\n\t\t}\n\t}\n\n\tdispatch(event, target) {\n\t\tthis.parent && this.parent.dispatchEvent(event, target);\n\t\tProton.bindEmtterEvent && this.dispatchEvent(event, target);\n\t}\n\n\temitting(time) {\n\t\tif (this.totalEmitTimes == 'once') {\n\t\t\tlet i;\n\t\t\tconst length = this.rate.getValue(99999);\n\n\t\t\tif (length > 0) this.emitSpeed = length;\n\t\t\tfor (i = 0; i < length; i++) this.createParticle();\n\t\t\tthis.totalEmitTimes = 'none';\n\t\t}\n\n\t\telse {\n\t\t\tthis.currentEmitTime += time;\n\n\t\t\tif (this.currentEmitTime < this.totalEmitTimes) {\n\t\t\t\tconst length = this.rate.getValue(time)\n\t\t\t\tlet i;\n\n\t\t\t\tif (length > 0) this.emitSpeed = length;\n\t\t\t\tfor (i = 0; i < length; i++) this.createParticle();\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * create single particle;\n\t * \n\t * can use emit({x:10},new Gravity(10),{'particleUpdate',fun}) or emit([{x:10},new Initialize],new Gravity(10),{'particleUpdate',fun})\n\t * @method removeAllParticles\n\t */\n\tcreateParticle(initialize, behaviour) {\n\t\tconst particle = this.parent.pool.get(Particle);\n\t\tthis.setupParticle(particle, initialize, behaviour);\n\t\tthis.dispatch(\"PARTICLE_CREATED\", particle);\n\n\t\treturn particle;\n\t}\n\n\tsetupParticle(particle, initialize, behaviour) {\n\t\tlet initializes = this.initializes;\n\t\tlet behaviours = this.behaviours;\n\n\t\tif (initialize) {\n\t\t\tinitializes = Util.isArray(initialize) ? initialize : [initialize];\n\t\t}\n\n\t\tif (behaviour) {\n\t\t\tbehaviour = Util.isArray(behaviour) ? behaviour : [behaviour];\n\t\t}\n\n\t\tparticle.reset();\n\t\tInitializeUtil.initialize(this, particle, initializes);\n\t\tparticle.addBehaviours(behaviours);\n\t\tparticle.parent = this;\n\n\t\tthis.particles.push(particle);\n\t}\n\n\tremove(){\n\t\tthis.stop();\n\t\tUtil.destroy(this.particles);\n\t}\n\n\t/**\n\t * Destory this Emitter\n\t * @method destroy\n\t */\n\tdestroy(slow) {\n\t\tthis.dead = true;\n\t\tthis.remove();\n\t\tthis.removeAllInitializers();\n\t\tthis.removeAllBehaviours();\n\t\tthis.parent && this.parent.removeEmitter(this);\n\t}\n\n}\n\nEventDispatcher.bind(Emitter);","import Util from '../utils/Util';\nimport Emitter from './Emitter';\n\nexport default class BehaviourEmitter extends Emitter {\n\n\t/**\n\t * The BehaviourEmitter class inherits from Proton.Emitter\n\t *\n\t * use the BehaviourEmitter you can add behaviours to self;\n\t * @class Proton.BehaviourEmitter\n\t * @constructor\n\t * @param {Object} pObj the parameters object;\n\t */\n\tconstructor(pObj) {\n\t\tsuper(pObj);\n\n\t\tthis.selfBehaviours = [];\n\t};\n\t\n\t/**\n\t * add the Behaviour to emitter;\n\t *\n\t * you can use Behaviours array:emitter.addSelfBehaviour(Behaviour1,Behaviour2,Behaviour3);\n\t * @method addSelfBehaviour\n\t * @param {Proton.Behaviour} behaviour like this new Proton.Color('random')\n\t */\n\taddSelfBehaviour(...rest) {\n\t\tconst length = rest.length;\n\t\tlet i;\n\n\t\tfor (i = 0; i < length; i++) {\n\t\t\tthis.selfBehaviours.push(rest[i]);\n\t\t}\n\t};\n\n\t/**\n\t * remove the Behaviour for self\n\t * @method removeSelfBehaviour\n\t * @param {Proton.Behaviour} behaviour a behaviour\n\t */\n\tremoveSelfBehaviour(behaviour) {\n\t\tconst index = this.selfBehaviours.indexOf(behaviour);\n\t\tif (index > -1) this.selfBehaviours.splice(index, 1);\n\t};\n\n\tupdate(time) {\n\t\tsuper.update(time);\n\n\t\tif (!this.sleep) {\n\t\t\tconst length = this.selfBehaviours.length;\n\t\t\tlet i;\n\n\t\t\tfor (i = 0; i < length; i++) {\n\t\t\t\tthis.selfBehaviours[i].applyBehaviour(this, time, i);\n\t\t\t}\n\t\t}\n\t}\n}","import Util from '../utils/Util';\nimport Emitter from './Emitter';\n\nexport default class FollowEmitter extends Emitter {\n\n\t/**\n\t * The FollowEmitter class inherits from Proton.Emitter\n\t *\n\t * use the FollowEmitter will emit particle when mousemoving\n\t *\n\t * @class Proton.FollowEmitter\n\t * @constructor\n\t * @param {Element} mouseTarget mouseevent's target;\n\t * @param {Number} ease the easing of following speed;\n\t * @default 0.7\n\t * @param {Object} pObj the parameters object;\n\t */\n\tconstructor(mouseTarget, ease, pObj) {\n\t\tsuper(pObj);\n\n\t\tthis.mouseTarget = Util.initValue(mouseTarget, window);\n\t\tthis.ease = Util.initValue(ease, .7);\n\n\t\tthis._allowEmitting = false;\n\t\tthis.initEventHandler();\n\t};\n\n\tinitEventHandler() {\n\t\tthis.mousemoveHandler = e => this.mousemove.call(this, e);\n\t\tthis.mousedownHandler = e => this.mousedown.call(this, e);\n\t\tthis.mouseupHandler = e => this.mouseup.call(this, e);\n\n\t\tthis.mouseTarget.addEventListener('mousemove', this.mousemoveHandler, false);\n\t}\n\n\t/**\n\t * start emit particle\n\t * @method emit\n\t */\n\temit() {\n\t\tthis._allowEmitting = true;\n\t}\n\n\t/**\n\t * stop emiting\n\t * @method stop\n\t */\n\tstop() {\n\t\tthis._allowEmitting = false;\n\t}\n\n\tmousemove(e) {\n\t\tif (e.layerX || e.layerX == 0) {\n\t\t\tthis.p.x += (e.layerX - this.p.x) * this.ease;\n\t\t\tthis.p.y += (e.layerY - this.p.y) * this.ease;\n\t\t} else if (e.offsetX || e.offsetX == 0) {\n\t\t\tthis.p.x += (e.offsetX - this.p.x) * this.ease;\n\t\t\tthis.p.y += (e.offsetY - this.p.y) * this.ease;\n\t\t}\n\n\t\tif (this._allowEmitting) super.emit('once');\n\t};\n\n\t/**\n\t * Destory this Emitter\n\t * @method destroy\n\t */\n\tdestroy() {\n\t\tsuper.destroy();\n\t\tthis.mouseTarget.removeEventListener('mousemove', this.mousemoveHandler, false);\n\t}\n\n}\n","import Pool from '../core/Pool';\nimport Util from '../utils/Util';\n\nexport default class BaseRenderer {\n\n constructor(element, stroke) {\n this.element = element;\n this.stroke = stroke;\n\n this.initHandler();\n\n this.circleConf = { isCircle: true };\n this.pool = new Pool();\n this.name = 'BaseRenderer';\n }\n\n setStroke(color, thinkness) {\n color = Util.initValue(color, '#000000');\n thinkness = Util.initValue(thinkness, 1);\n\n this.stroke = { color, thinkness };\n }\n\n initHandler() {\n this._protonUpdateHandler = () => { this.onProtonUpdate.call(this) };\n this._protonUpdateAfterHandler = () => { this.onProtonUpdateAfter.call(this) };\n this._emitterAddedHandler = (emitter) => { this.onEmitterAdded.call(this, emitter) };\n this._emitterRemovedHandler = (emitter) => { this.onEmitterRemoved.call(this, emitter) };\n this._particleCreatedHandler = (particle) => { this.onParticleCreated.call(this, particle) };\n this._particleUpdateHandler = (particle) => { this.onParticleUpdate.call(this, particle) };\n this._particleDeadHandler = (particle) => { this.onParticleDead.call(this, particle) };\n }\n\n init(proton) {\n this.parent = proton;\n\n proton.addEventListener(Proton.PROTON_UPDATE, this._protonUpdateHandler);\n proton.addEventListener(Proton.PROTON_UPDATE_AFTER, this._protonUpdateAfterHandler);\n\n proton.addEventListener(Proton.EMITTER_ADDED, this._emitterAddedHandler);\n proton.addEventListener(Proton.EMITTER_REMOVED, this._emitterRemovedHandler);\n\n proton.addEventListener(Proton.PARTICLE_CREATED, this._particleCreatedHandler);\n proton.addEventListener(Proton.PARTICLE_UPDATE, this._particleUpdateHandler);\n proton.addEventListener(Proton.PARTICLE_DEAD, this._particleDeadHandler);\n }\n\n resize(width, height) {}\n\n remove(proton) {\n this.parent.removeEventListener(Proton.PROTON_UPDATE, this._protonUpdateHandler);\n this.parent.removeEventListener(Proton.PROTON_UPDATE_AFTER, this._protonUpdateAfterHandler);\n\n this.parent.removeEventListener(Proton.EMITTER_ADDED, this._emitterAddedHandler);\n this.parent.removeEventListener(Proton.EMITTER_REMOVED, this._emitterRemovedHandler);\n\n this.parent.removeEventListener(Proton.PARTICLE_CREATED, this._particleCreatedHandler);\n this.parent.removeEventListener(Proton.PARTICLE_UPDATE, this._particleUpdateHandler);\n this.parent.removeEventListener(Proton.PARTICLE_DEAD, this._particleDeadHandler);\n\n this.parent = null;\n }\n\n destroy(){\n this.remove();\n }\n \n onProtonUpdate() {}\n onProtonUpdateAfter() {}\n\n onEmitterAdded(emitter) {}\n onEmitterRemoved(emitter) {}\n\n onParticleCreated(particle) {}\n onParticleUpdate(particle) {}\n onParticleDead(particle) {}\n}","import Util from '../utils/Util';\nimport ImgUtil from '../utils/ImgUtil';\nimport ColorUtil from '../utils/ColorUtil';\nimport MathUtils from '../math/MathUtils';\nimport BaseRenderer from './BaseRenderer';\n\nexport default class CanvasRenderer extends BaseRenderer {\n\n constructor(element) {\n super(element);\n\n this.stroke = null;\n this.context = this.element.getContext(\"2d\");\n this.bufferCache = {};\n\n this.name = 'CanvasRenderer';\n }\n\n resize(width, height) {\n this.element.width = width;\n this.element.height = height;\n }\n\n onProtonUpdate() {\n this.context.clearRect(0, 0, this.element.width, this.element.height);\n }\n\n onParticleCreated(particle) {\n if (particle.body)\n ImgUtil.getImgFromCache(particle.body, this.addImg2Body, particle);\n else\n particle.color = particle.color || '#ff0000';\n }\n\n onParticleUpdate(particle) {\n if (particle.body) {\n if (particle.body instanceof Image) this.drawImage(particle);\n } else {\n this.drawCircle(particle);\n }\n }\n\n onParticleDead(particle) {\n particle.body = null;\n }\n\n\n // private \n addImg2Body(img, particle) {\n particle.body = img;\n }\n\n // private drawCircle --\n drawImage(particle) {\n const w = particle.body.width * particle.scale | 0;\n const h = particle.body.height * particle.scale | 0;\n const x = particle.p.x - w / 2;\n const y = particle.p.y - h / 2;\n\n if (!!particle.color) {\n if (!particle.transform[\"buffer\"]) particle.transform.buffer = this.createBuffer(particle.body);\n\n const bufferContext = particle.transform.buffer.getContext('2d');\n bufferContext.clearRect(0, 0, particle.transform.buffer.width, particle.transform.buffer.height);\n bufferContext.globalAlpha = particle.alpha;\n bufferContext.drawImage(particle.body, 0, 0);\n\n bufferContext.globalCompositeOperation = \"source-atop\";\n bufferContext.fillStyle = ColorUtil.rgbToHex(particle.transform.rgb);\n bufferContext.fillRect(0, 0, particle.transform.buffer.width, particle.transform.buffer.height);\n bufferContext.globalCompositeOperation = \"source-over\";\n bufferContext.globalAlpha = 1;\n\n this.context.drawImage(particle.transform.buffer, 0, 0, particle.transform.buffer.width, particle.transform.buffer.height, x, y, w, h);\n } else {\n this.context.save();\n\n this.context.globalAlpha = particle.alpha;\n this.context.translate(particle.p.x, particle.p.y);\n this.context.rotate(MathUtils.degreeTransform(particle.rotation));\n this.context.translate(-particle.p.x, -particle.p.y);\n this.context.drawImage(particle.body, 0, 0, particle.body.width, particle.body.height, x, y, w, h);\n\n this.context.globalAlpha = 1;\n this.context.restore();\n }\n }\n\n // private drawCircle --\n drawCircle(particle) {\n if (particle.transform[\"rgb\"])\n this.context.fillStyle = 'rgba(' + particle.transform.rgb.r + ',' + particle.transform.rgb.g + ',' + particle.transform.rgb.b + ',' + particle.alpha + ')';\n else\n this.context.fillStyle = particle.color;\n\n // draw circle\n this.context.beginPath();\n this.context.arc(particle.p.x, particle.p.y, particle.radius, 0, Math.PI * 2, true);\n\n if (this.stroke) {\n this.context.strokeStyle = this.stroke.color;\n this.context.lineWidth = this.stroke.thinkness;\n this.context.stroke();\n }\n\n this.context.closePath();\n this.context.fill();\n }\n\n // private createBuffer --\n createBuffer(image) {\n if (image instanceof Image) {\n const size = image.width + '_' + image.height;\n let canvas = this.bufferCache[size];\n\n if (!canvas) {\n canvas = document.createElement('canvas');\n canvas.width = image.width;\n canvas.height = image.height;\n this.bufferCache[size] = canvas;\n }\n\n return canvas;\n }\n }\n}","import Util from '../utils/Util';\nimport DomUtil from '../utils/DomUtil';\nimport ImgUtil from '../utils/ImgUtil';\nimport MathUtils from '../math/MathUtils';\nimport BaseRenderer from './BaseRenderer';\n\nexport default class DomRenderer extends BaseRenderer {\n\n constructor(element) {\n super(element);\n\n this.stroke = null;\n this.pool.create = (body, particle) => this.createBody(body, particle);\n this.addImg2Body = this.addImg2Body.bind(this);\n\n this.transform3d = false;\n\n this.name = 'DomRenderer';\n }\n\n onParticleCreated(particle) {\n if (particle.body) {\n ImgUtil.getImgFromCache(particle.body, this.addImg2Body, particle);\n } else {\n particle.body = this.pool.get(this.circleConf, particle);\n this.element.appendChild(particle.body);\n }\n }\n\n onParticleUpdate(particle) {\n if (this.bodyReady(particle)) {\n if (this.transform3d)\n DomUtil.transform3d(particle.body, particle.p.x, particle.p.y, particle.scale, particle.rotation);\n else\n DomUtil.transform(particle.body, particle.p.x, particle.p.y, particle.scale, particle.rotation);\n\n particle.body.style.opacity = particle.alpha;\n if (particle.body.isCircle) {\n particle.body.style.backgroundColor = particle.color || '#ff0000';\n }\n }\n }\n\n onParticleDead(particle) {\n if (this.bodyReady(particle)) {\n this.element.removeChild(particle.body);\n this.pool.expire(particle.body);\n particle.body = null;\n }\n }\n\n bodyReady(particle) {\n return typeof particle.body === 'object' && particle.body && !particle.body.isInner;\n }\n\n // private \n addImg2Body(img, particle) {\n if (particle.dead) return;\n particle.body = this.pool.get(img, particle);\n DomUtil.resize(particle.body, img.width, img.height);\n\n this.element.appendChild(particle.body);\n }\n\n createBody(body, particle) {\n if (body.isCircle)\n return this.createCircle(particle);\n else\n return this.createSprite(body, particle);\n }\n\n // private --\n createCircle(particle) {\n const dom = DomUtil.createDiv(`${particle.id}_dom`, 2 * particle.radius, 2 * particle.radius);\n dom.style.borderRadius = `${particle.radius}px`;\n\n if (this.stroke) {\n dom.style.borderColor = this.stroke.color;\n dom.style.borderWidth = `${this.stroke.thinkness}px`;\n }\n dom.isCircle = true;\n\n return dom;\n }\n\n createSprite(body, particle) {\n const url = typeof body === 'string' ? body : body.src;\n const dom = DomUtil.createDiv(`${particle.id}_dom`, body.width, body.height);\n dom.style.backgroundImage = `url(${url})`;\n\n return dom;\n }\n\n}","import Util from '../utils/Util';\nimport BaseRenderer from './BaseRenderer';\n\nexport default class EaselRenderer extends BaseRenderer {\n\n constructor(element, stroke) {\n super(element);\n\n this.stroke = stroke;\n this.name = 'EaselRenderer';\n }\n\n onParticleCreated(particle) {\n if (particle.body) {\n this.createSprite(particle);\n } else {\n this.createCircle(particle);\n }\n\n this.element.addChild(particle.body);\n }\n\n onParticleUpdate(particle) {\n if (particle.body) {\n particle.body.x = particle.p.x;\n particle.body.y = particle.p.y;\n\n particle.body.alpha = particle.alpha;\n particle.body.scaleX = particle.body.scaleY = particle.scale;\n particle.body.rotation = particle.rotation;\n }\n }\n\n onParticleDead(particle) {\n if (particle.body) {\n particle.body.parent && particle.body.parent.removeChild(particle.body);\n this.pool.expire(particle.body);\n particle.body = null;\n }\n\n if (particle.graphics) this.pool.expire(particle.graphics);\n }\n\n // private\n createSprite(particle) {\n particle.body = this.pool.get(particle.body);\n\n if (particle.body.parent) return;\n if (particle.body['image']) {\n particle.body.regX = particle.body.image.width / 2;\n particle.body.regY = particle.body.image.height / 2;\n }\n }\n\n createCircle(particle) {\n const graphics = this.pool.get(createjs.Graphics);\n\n if (this.stroke) {\n if (this.stroke instanceof String)\n graphics.beginStroke(this.stroke);\n else\n graphics.beginStroke('#000000');\n }\n graphics.beginFill(particle.color || '#ff0000').drawCircle(0, 0, particle.radius);\n\n const shape = this.pool.get(createjs.Shape, [graphics]);\n\n particle.body = shape;\n particle.graphics = graphics;\n }\n\n}","import Util from '../utils/Util';\nimport Rectangle from '../math/Rectangle';\nimport BaseRenderer from './BaseRenderer';\n\nexport default class PixelRenderer extends BaseRenderer {\n\n constructor(element, rectangle) {\n super(element);\n\n this.context = this.element.getContext('2d');\n this.imageData = null;\n this.rectangle = null;\n this.rectangle = rectangle;\n this.createImageData(rectangle);\n\n this.name = 'PixelRenderer';\n }\n\n resize(width, height) {\n this.element.width = width;\n this.element.height = height;\n }\n\n createImageData(rectangle) {\n this.rectangle = rectangle ? rectangle : new Rectangle(0, 0, this.element.width, this.element.height);\n this.imageData = this.context.createImageData(this.rectangle.width, this.rectangle.height);\n this.context.putImageData(this.imageData, this.rectangle.x, this.rectangle.y);\n }\n\n onProtonUpdate() {\n this.context.clearRect(this.rectangle.x, this.rectangle.y, this.rectangle.width, this.rectangle.height);\n this.imageData = this.context.getImageData(this.rectangle.x, this.rectangle.y, this.rectangle.width, this.rectangle.height);\n }\n\n onProtonUpdateAfter() {\n this.context.putImageData(this.imageData, this.rectangle.x, this.rectangle.y);\n }\n\n onParticleCreated(particle) {}\n\n onParticleUpdate(particle) {\n if (this.imageData) {\n this.setPixel(this.imageData, Math.floor(particle.p.x - this.rectangle.x), Math.floor(particle.p.y - this.rectangle.y), particle);\n }\n }\n\n setPixel(imagedata, x, y, particle) {\n const rgb = particle.transform.rgb;\n\n if ((x < 0) || (x > this.element.width) || (y < 0) || (y > this.elementwidth))\n return;\n\n const i = ((y >> 0) * imagedata.width + (x >> 0)) * 4;\n\n imagedata.data[i] = rgb.r;\n imagedata.data[i + 1] = rgb.g;\n imagedata.data[i + 2] = rgb.b;\n imagedata.data[i + 3] = particle.alpha * 255;\n }\n\n onParticleDead(particle) {\n\n }\n\n}","import Pool from '../core/Pool';\nimport Util from '../utils/Util';\nimport ColorUtil from '../utils/ColorUtil';\nimport MathUtils from '../math/MathUtils';\nimport BaseRenderer from './BaseRenderer';\n\nexport default class PixiRenderer extends BaseRenderer {\n\n constructor(element, stroke) {\n super(element);\n\n this.stroke = stroke;\n this.setColor = false;\n this.pool.create = (body, particle) => this.createBody(body, particle);\n this.name = 'PixiRenderer';\n }\n\n onProtonUpdate() { }\n\n /**\n * @param particle\n */\n onParticleCreated(particle) {\n if (particle.body) {\n particle.body = this.pool.get(particle.body, particle);\n } else {\n particle.body = this.pool.get(this.circleConf, particle);\n }\n\n this.element.addChild(particle.body);\n }\n\n /**\n * @param particle\n */\n onParticleUpdate(particle) {\n this.transform(particle, particle.body);\n if (this.setColor) particle.body.tint = ColorUtil.getHex16FromParticle(particle);\n }\n\n /**\n * @param particle\n */\n onParticleDead(particle) {\n this.element.removeChild(particle.body);\n this.pool.expire(particle.body);\n particle.body = null;\n }\n\n destroy(particles) {\n super.destroy();\n this.pool.destroy();\n\n let i = particles.length;\n while (i--) {\n let particle = particles[i];\n if (particle.body) {\n this.element.removeChild(particle.body);\n }\n }\n }\n\n transform(particle, target) {\n target.x = particle.p.x;\n target.y = particle.p.y;\n\n target.alpha = particle.alpha;\n\n target.scale.x = particle.scale;\n target.scale.y = particle.scale;\n\n // using cached version of MathUtils.PI_180 for slight performance increase.\n target.rotation = particle.rotation * MathUtils.PI_180; // MathUtils.PI_180;\n }\n\n createBody(body, particle) {\n if (body.isCircle)\n return this.createCircle(particle);\n else\n return this.createSprite(body);\n }\n\n createSprite(body) {\n const sprite = body.isInner ? PIXI.Sprite.fromImage(body.src) : new PIXI.Sprite(body);\n sprite.anchor.x = 0.5;\n sprite.anchor.y = 0.5;\n\n return sprite;\n }\n\n createCircle(particle) {\n const graphics = new PIXI.Graphics();\n\n if (this.stroke) {\n let stroke = this.stroke instanceof String ? this.stroke : 0x000000;\n graphics.beginStroke(this.stroke);\n }\n\n graphics.beginFill(particle.color || 0x008ced);\n graphics.drawCircle(0, 0, particle.radius);\n graphics.endFill();\n\n return graphics;\n }\n}","import Mat3 from '../math/Mat3';\n\nexport default class MStack {\n\n\tconstructor() {\n\t\tthis.mats = [];\n\t\tthis.size = 0;\n\n\t\tfor (let i = 0; i < 20; i++) this.mats.push(Mat3.create([0, 0, 0, 0, 0, 0, 0, 0, 0]));\n\t}\n\n\tset(m, i) {\n\t\tif (i == 0)\n\t\t\tMat3.set(m, this.mats[0]);\n\t\telse\n\t\t\tMat3.multiply(this.mats[i - 1], m, this.mats[i]);\n\n\t\tthis.size = Math.max(this.size, i + 1);\n\t}\n\n\tpush(m) {\n\t\tif (this.size == 0)\n\t\t\tMat3.set(m, this.mats[0]);\n\t\telse\n\t\t\tMat3.multiply(this.mats[this.size - 1], m, this.mats[this.size]);\n\n\t\tthis.size++;\n\t}\n\n\tpop() {\n\t\tif (this.size > 0)\n\t\t\tthis.size--;\n\t}\n\n\ttop() {\n\t\treturn (this.mats[this.size - 1]);\n\t}\n}","import Mat3 from '../math/Mat3';\nimport BaseRenderer from './BaseRenderer';\n\nimport Util from '../utils/Util';\nimport ImgUtil from '../utils/ImgUtil';\nimport MStack from '../utils/MStack';\nimport DomUtil from '../utils/DomUtil';\nimport WebGLUtil from '../utils/WebGLUtil';\nimport MathUtils from '../math/MathUtils';\n\nexport default class WebGLRenderer extends BaseRenderer {\n\n constructor(element) {\n super(element);\n\n this.gl = this.element.getContext('experimental-webgl', { antialias: true, stencil: false, depth: false });\n if (!this.gl) alert(\"Sorry your browser do not suppest WebGL!\");\n\n this.initVar();\n this.setMaxRadius();\n this.initShaders();\n this.initBuffers();\n\n this.gl.blendEquation(this.gl.FUNC_ADD);\n this.gl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE_MINUS_SRC_ALPHA);\n this.gl.enable(this.gl.BLEND);\n\n this.addImg2Body = this.addImg2Body.bind(this);\n\n this.name = 'WebGLRenderer';\n }\n\n init(proton) {\n super.init(proton);\n this.resize(this.element.width, this.element.height);\n }\n\n resize(width, height) {\n this.umat[4] = -2;\n this.umat[7] = 1;\n\n this.smat[0] = 1 / width;\n this.smat[4] = 1 / height;\n\n this.mstack.set(this.umat, 0);\n this.mstack.set(this.smat, 1);\n\n this.gl.viewport(0, 0, width, height);\n this.element.width = width;\n this.element.height = height;\n }\n\n setMaxRadius(radius) {\n this.circleCanvasURL = this.createCircle(radius);\n }\n\n getVertexShader() {\n const vsSource = [\"uniform vec2 viewport;\", \"attribute vec2 aVertexPosition;\", \"attribute vec2 aTextureCoord;\", \"uniform mat3 tMat;\", \"varying vec2 vTextureCoord;\", \"varying float alpha;\", \"void main() {\", \"vec3 v = tMat * vec3(aVertexPosition, 1.0);\", \"gl_Position = vec4(v.x, v.y, 0, 1);\", \"vTextureCoord = aTextureCoord;\", \"alpha = tMat[0][2];\", \"}\"].join(\"\\n\");\n return vsSource;\n }\n\n getFragmentShader() {\n const fsSource = [\"precision mediump float;\", \"varying vec2 vTextureCoord;\", \"varying float alpha;\", \"uniform sampler2D uSampler;\", \"uniform vec4 color;\", \"uniform bool useTexture;\", \"uniform vec3 uColor;\", \"void main() {\", \"vec4 textureColor = texture2D(uSampler, vTextureCoord);\", \"gl_FragColor = textureColor * vec4(uColor, 1.0);\", \"gl_FragColor.w *= alpha;\", \"}\"].join(\"\\n\");\n return fsSource;\n }\n\n initVar() {\n this.mstack = new MStack();\n this.umat = Mat3.create([2, 0, 1, 0, -2, 0, -1, 1, 1]);\n this.smat = Mat3.create([1 / 100, 0, 1, 0, 1 / 100, 0, 0, 0, 1]);\n this.texturebuffers = {};\n }\n\n blendEquation(A) {\n this.gl.blendEquation(this.gl[A]);\n }\n\n blendFunc(A, B) {\n this.gl.blendFunc(this.gl[A], this.gl[B]);\n }\n\n getShader(gl, str, fs) {\n const shader = fs ? gl.createShader(gl.FRAGMENT_SHADER) : gl.createShader(gl.VERTEX_SHADER);\n\n gl.shaderSource(shader, str);\n gl.compileShader(shader);\n\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n alert(gl.getShaderInfoLog(shader));\n return null;\n }\n\n return shader;\n }\n\n initShaders() {\n const fragmentShader = this.getShader(this.gl, this.getFragmentShader(), true);\n const vertexShader = this.getShader(this.gl, this.getVertexShader(), false);\n\n this.sprogram = this.gl.createProgram();\n this.gl.attachShader(this.sprogram, vertexShader);\n this.gl.attachShader(this.sprogram, fragmentShader);\n this.gl.linkProgram(this.sprogram);\n\n if (!this.gl.getProgramParameter(this.sprogram, this.gl.LINK_STATUS))\n alert(\"Could not initialise shaders\");\n\n this.gl.useProgram(this.sprogram);\n this.sprogram.vpa = this.gl.getAttribLocation(this.sprogram, \"aVertexPosition\");\n this.sprogram.tca = this.gl.getAttribLocation(this.sprogram, \"aTextureCoord\");\n this.gl.enableVertexAttribArray(this.sprogram.tca);\n this.gl.enableVertexAttribArray(this.sprogram.vpa);\n\n this.sprogram.tMatUniform = this.gl.getUniformLocation(this.sprogram, \"tMat\");\n this.sprogram.samplerUniform = this.gl.getUniformLocation(this.sprogram, \"uSampler\");\n this.sprogram.useTex = this.gl.getUniformLocation(this.sprogram, \"useTexture\");\n this.sprogram.color = this.gl.getUniformLocation(this.sprogram, \"uColor\");\n this.gl.uniform1i(this.sprogram.useTex, 1);\n };\n\n initBuffers() {\n const vs = [0, 3, 1, 0, 2, 3];\n let idx;\n\n this.unitIBuffer = this.gl.createBuffer();\n this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitIBuffer);\n this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(vs), this.gl.STATIC_DRAW);\n\n let i;\n let ids = [];\n for (i = 0; i < 100; i++) ids.push(i);\n idx = new Uint16Array(ids);\n\n this.unitI33 = this.gl.createBuffer();\n this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitI33);\n this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, idx, this.gl.STATIC_DRAW);\n\n ids = [];\n for (i = 0; i < 100; i++) ids.push(i, i + 1, i + 2);\n idx = new Uint16Array(ids);\n\n this.stripBuffer = this.gl.createBuffer();\n this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.stripBuffer);\n this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, idx, this.gl.STATIC_DRAW);\n };\n\n createCircle(raidus) {\n this.circleCanvasRadius = WebGLUtil.nhpot(Util.initValue(raidus, 32));\n const canvas = DomUtil.createCanvas('circle_canvas', this.circleCanvasRadius * 2, this.circleCanvasRadius * 2);\n const context = canvas.getContext('2d');\n\n context.beginPath();\n context.arc(this.circleCanvasRadius, this.circleCanvasRadius, this.circleCanvasRadius, 0, Math.PI * 2, true);\n context.closePath();\n context.fillStyle = '#FFF';\n context.fill();\n\n return canvas.toDataURL();\n };\n\n drawImg2Canvas(particle) {\n const _w = particle.body.width;\n const _h = particle.body.height;\n\n const _width = WebGLUtil.nhpot(particle.body.width);\n const _height = WebGLUtil.nhpot(particle.body.height);\n\n const _scaleX = particle.body.width / _width;\n const _scaleY = particle.body.height / _height;\n\n if (!this.texturebuffers[particle.transform.src])\n this.texturebuffers[particle.transform.src] = [this.gl.createTexture(), this.gl.createBuffer(), this.gl.createBuffer()];\n\n particle.transform.texture = this.texturebuffers[particle.transform.src][0];\n particle.transform.vcBuffer = this.texturebuffers[particle.transform.src][1];\n particle.transform.tcBuffer = this.texturebuffers[particle.transform.src][2];\n\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.transform.tcBuffer);\n this.gl.bufferData(this.gl.ARRAY_BUFFER, new Float32Array([0.0, 0.0, _scaleX, 0.0, 0.0, _scaleY, _scaleY, _scaleY]), this.gl.STATIC_DRAW);\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.transform.vcBuffer);\n this.gl.bufferData(this.gl.ARRAY_BUFFER, new Float32Array([0.0, 0.0, _w, 0.0, 0.0, _h, _w, _h]), this.gl.STATIC_DRAW);\n\n const context = particle.transform.canvas.getContext('2d');\n const data = context.getImageData(0, 0, _width, _height);\n\n this.gl.bindTexture(this.gl.TEXTURE_2D, particle.transform.texture);\n this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, this.gl.RGBA, this.gl.UNSIGNED_BYTE, data);\n this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MAG_FILTER, this.gl.LINEAR);\n this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MIN_FILTER, this.gl.LINEAR_MIPMAP_NEAREST);\n this.gl.generateMipmap(this.gl.TEXTURE_2D);\n\n particle.transform.textureLoaded = true;\n particle.transform.textureWidth = _w;\n particle.transform.textureHeight = _h;\n }\n\n onProtonUpdate() {\n //this.gl.clearColor(0, 0, 0, 1);\n //this.gl.clear(this.gl.COLOR_BUFFER_BIT | this.gl.DEPTH_BUFFER_BIT);\n }\n\n onParticleCreated(particle) {\n particle.transform.textureLoaded = false;\n particle.transform.tmat = Mat3.create();\n particle.transform.tmat[8] = 1;\n particle.transform.imat = Mat3.create();\n particle.transform.imat[8] = 1;\n\n if (particle.body) {\n ImgUtil.getImgFromCache(particle.body, this.addImg2Body, particle);\n } else {\n ImgUtil.getImgFromCache(this.circleCanvasURL, this.addImg2Body, particle);\n particle.transform.oldScale = particle.radius / this.circleCanvasRadius;\n }\n }\n\n // private \n addImg2Body(img, particle) {\n if (particle.dead) return;\n \n particle.body = img;\n particle.transform.src = img.src;\n particle.transform.canvas = ImgUtil.getCanvasFromCache(img);\n particle.transform.oldScale = 1;\n\n this.drawImg2Canvas(particle);\n }\n\n onParticleUpdate(particle) {\n if (particle.transform.textureLoaded) {\n this.updateMatrix(particle);\n\n this.gl.uniform3f(this.sprogram.color, particle.transform.rgb.r / 255, particle.transform.rgb.g / 255, particle.transform.rgb.b / 255);\n this.gl.uniformMatrix3fv(this.sprogram.tMatUniform, false, this.mstack.top());\n\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.transform.vcBuffer);\n this.gl.vertexAttribPointer(this.sprogram.vpa, 2, this.gl.FLOAT, false, 0, 0);\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.transform.tcBuffer);\n this.gl.vertexAttribPointer(this.sprogram.tca, 2, this.gl.FLOAT, false, 0, 0);\n this.gl.bindTexture(this.gl.TEXTURE_2D, particle.transform.texture);\n this.gl.uniform1i(this.sprogram.samplerUniform, 0);\n this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitIBuffer);\n\n this.gl.drawElements(this.gl.TRIANGLES, 6, this.gl.UNSIGNED_SHORT, 0);\n\n this.mstack.pop();\n }\n }\n\n onParticleDead(particle) { }\n\n updateMatrix(particle) {\n const moveOriginMatrix = WebGLUtil.makeTranslation(-particle.transform.textureWidth / 2, -particle.transform.textureHeight / 2);\n const translationMatrix = WebGLUtil.makeTranslation(particle.p.x, particle.p.y);\n\n const angel = particle.rotation * (MathUtils.PI_180);\n const rotationMatrix = WebGLUtil.makeRotation(angel);\n\n const scale = particle.scale * particle.transform.oldScale;\n const scaleMatrix = WebGLUtil.makeScale(scale, scale);\n let matrix = WebGLUtil.matrixMultiply(moveOriginMatrix, scaleMatrix);\n\n matrix = WebGLUtil.matrixMultiply(matrix, rotationMatrix);\n matrix = WebGLUtil.matrixMultiply(matrix, translationMatrix);\n\n Mat3.inverse(matrix, particle.transform.imat);\n matrix[2] = particle.alpha;\n\n this.mstack.push(matrix);\n }\n}","import Util from '../utils/Util';\nimport BaseRenderer from './BaseRenderer';\n\nexport default class CustomRenderer extends BaseRenderer {\n\n constructor(element) {\n super(element);\n\n this.name = 'CustomRenderer';\n }\n\n}","import Zone from './Zone';\nimport Util from '../utils/Util';\nimport MathUtils from '../math/MathUtils';\n\nexport default class CircleZone extends Zone {\n\n\tconstructor(x1, y1, x2, y2, direction) {\n\t\tsuper();\n\n\t\tif (x2 - x1 >= 0) {\n\t\t\tthis.x1 = x1;\n\t\t\tthis.y1 = y1;\n\t\t\tthis.x2 = x2;\n\t\t\tthis.y2 = y2;\n\t\t} else {\n\t\t\tthis.x1 = x2;\n\t\t\tthis.y1 = y2;\n\t\t\tthis.x2 = x1;\n\t\t\tthis.y2 = y1;\n\t\t}\n\n\t\tthis.dx = this.x2 - this.x1;\n\t\tthis.dy = this.y2 - this.y1;\n\n\t\tthis.minx = Math.min(this.x1, this.x2);\n\t\tthis.miny = Math.min(this.y1, this.y2);\n\t\tthis.maxx = Math.max(this.x1, this.x2);\n\t\tthis.maxy = Math.max(this.y1, this.y2);\n\n\t\tthis.dot = this.x2 * this.y1 - this.x1 * this.y2;\n\t\tthis.xxyy = this.dx * this.dx + this.dy * this.dy;\n\n\t\tthis.gradient = this.getGradient();\n\t\tthis.length = this.getLength();\n\t\tthis.direction = Util.initValue(direction, '>');\n\t}\n\n\n\tgetPosition() {\n\t\tthis.random = Math.random();\n\t\tthis.vector.x = this.x1 + this.random * this.length * Math.cos(this.gradient);\n\t\tthis.vector.y = this.y1 + this.random * this.length * Math.sin(this.gradient);\n\n\t\treturn this.vector;\n\t}\n\n\tgetDirection(x, y) {\n\t\tconst A = this.dy;\n\t\tconst B = -this.dx;\n\t\tconst C = this.dot;\n\t\tconst D = B == 0 ? 1 : B;\n\n\t\tif ((A * x + B * y + C) * D > 0)\n\t\t\treturn true;\n\t\telse\n\t\t\treturn false;\n\t}\n\n\tgetDistance(x, y) {\n\t\tconst A = this.dy;\n\t\tconst B = -this.dx;\n\t\tconst C = this.dot;\n\t\tconst D = (A * x + B * y + C);\n\n\t\treturn D / Math.sqrt(this.xxyy);\n\t}\n\n\tgetSymmetric(v) {\n\t\tconst tha2 = v.getGradient();\n\t\tconst tha1 = this.getGradient();\n\t\tconst tha = 2 * (tha1 - tha2);\n\n\t\tconst oldx = v.x;\n\t\tconst oldy = v.y;\n\n\t\tv.x = oldx * Math.cos(tha) - oldy * Math.sin(tha);\n\t\tv.y = oldx * Math.sin(tha) + oldy * Math.cos(tha);\n\n\t\treturn v;\n\t}\n\n\tgetGradient() {\n\t\treturn Math.atan2(this.dy, this.dx);\n\t}\n\n\trangeOut(particle) {\n\t\tconst angle = Math.abs(this.getGradient());\n\n\t\tif (angle <= MathUtils.PI / 4) {\n\t\t\tif (particle.p.x <= this.maxx && particle.p.x >= this.minx) return true;\n\t\t} else {\n\t\t\tif (particle.p.y <= this.maxy && particle.p.y >= this.miny) return true;\n\t\t}\n\t\t\n\t\treturn false;\n\t}\n\n\tgetLength() {\n\t\treturn Math.sqrt(this.dx * this.dx + this.dy * this.dy)\n\t}\n\n\tcrossing(particle) {\n\t\tif (this.crossType == \"dead\") {\n\t\t\tif (this.direction == \">\" || this.direction == \"R\" || this.direction == \"right\" || this.direction == \"down\") {\n\t\t\t\tif (!this.rangeOut(particle)) return;\n\t\t\t\tif (this.getDirection(particle.p.x, particle.p.y)) particle.dead = true;\n\t\t\t} else {\n\t\t\t\tif (!this.rangeOut(particle)) return;\n\t\t\t\tif (!this.getDirection(particle.p.x, particle.p.y)) particle.dead = true;\n\t\t\t}\n\t\t}\n\n\t\telse if (this.crossType == \"bound\") {\n\t\t\tif (!this.rangeOut(particle)) return;\n\n\t\t\tif (this.getDistance(particle.p.x, particle.p.y) <= particle.radius) {\n\t\t\t\tif (this.dx == 0) {\n\t\t\t\t\tparticle.v.x *= -1;\n\t\t\t\t} else if (this.dy == 0) {\n\t\t\t\t\tparticle.v.y *= -1;\n\t\t\t\t} else {\n\t\t\t\t\tthis.getSymmetric(particle.v);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\telse if (this.crossType == \"cross\") {\n\t\t\tif (this.alert) {\n\t\t\t\tconsole.error('Sorry lineZone does not support cross method');\n\t\t\t\tthis.alert = false;\n\t\t\t}\n\t\t}\n\t}\n\n}","import Zone from './Zone';\nimport MathUtils from '../math/MathUtils';\n\nexport default class CircleZone extends Zone {\n\n constructor(x, y, radius) {\n super();\n\n this.x = x;\n this.y = y;\n this.radius = radius;\n\n this.angle = 0;\n this.center = { x, y };\n }\n\n getPosition() {\n this.random = Math.random();\n this.angle = MathUtils.PIx2 * Math.random();\n\n this.vector.x = this.x + this.random * this.radius * Math.cos(this.angle);\n this.vector.y = this.y + this.random * this.radius * Math.sin(this.angle);\n\n return this.vector;\n }\n\n setCenter(x, y) {\n this.center.x = x;\n this.center.y = y;\n }\n\n crossing(particle) {\n const d = particle.p.distanceTo(this.center);\n\n if (this.crossType == \"dead\") {\n if (d - particle.radius > this.radius)\n particle.dead = true;\n } else if (this.crossType == \"bound\") {\n if (d + particle.radius >= this.radius)\n this.getSymmetric(particle);\n } else if (this.crossType == \"cross\") {\n if (this.alert) {\n alert('Sorry CircleZone does not support cross method');\n this.alert = false;\n }\n }\n }\n\n getSymmetric(particle) {\n let tha2 = particle.v.getGradient();\n let tha1 = this.getGradient(particle);\n\n let tha = 2 * (tha1 - tha2);\n let oldx = particle.v.x;\n let oldy = particle.v.y;\n\n particle.v.x = oldx * Math.cos(tha) - oldy * Math.sin(tha);\n particle.v.y = oldx * Math.sin(tha) + oldy * Math.cos(tha);\n }\n\n getGradient(particle) {\n return -MathUtils.PI_2 + Math.atan2(particle.p.y - this.center.y, particle.p.x - this.center.x);\n }\n}","import Zone from './Zone';\n\nexport default class PointZoneRectZone extends Zone {\n\n\tconstructor(x, y, width, height) {\n\t\tsuper();\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.width = width;\n\t\tthis.height = height;\n\t}\n\n\tgetPosition() {\n\t\tthis.vector.x = this.x + Math.random() * this.width;\n\t\tthis.vector.y = this.y + Math.random() * this.height;\n\n\t\treturn this.vector;\n\t}\n\n\tcrossing(particle) {\n\t\tif (this.crossType == \"dead\") {\n\t\t\tif (particle.p.x + particle.radius < this.x)\n\t\t\t\tparticle.dead = true;\n\t\t\telse if (particle.p.x - particle.radius > this.x + this.width)\n\t\t\t\tparticle.dead = true;\n\n\t\t\tif (particle.p.y + particle.radius < this.y)\n\t\t\t\tparticle.dead = true;\n\t\t\telse if (particle.p.y - particle.radius > this.y + this.height)\n\t\t\t\tparticle.dead = true;\n\t\t}\n\n\t\telse if (this.crossType == \"bound\") {\n\t\t\tif (particle.p.x - particle.radius < this.x) {\n\t\t\t\tparticle.p.x = this.x + particle.radius;\n\t\t\t\tparticle.v.x *= -1;\n\t\t\t} else if (particle.p.x + particle.radius > this.x + this.width) {\n\t\t\t\tparticle.p.x = this.x + this.width - particle.radius;\n\t\t\t\tparticle.v.x *= -1;\n\t\t\t}\n\n\t\t\tif (particle.p.y - particle.radius < this.y) {\n\t\t\t\tparticle.p.y = this.y + particle.radius;\n\t\t\t\tparticle.v.y *= -1;\n\t\t\t} else if (particle.p.y + particle.radius > this.y + this.height) {\n\t\t\t\tparticle.p.y = this.y + this.height - particle.radius;\n\t\t\t\tparticle.v.y *= -1;\n\t\t\t}\n\t\t}\n\n\t\telse if (this.crossType == \"cross\") {\n\t\t\tif (particle.p.x + particle.radius < this.x && particle.v.x <= 0)\n\t\t\t\tparticle.p.x = this.x + this.width + particle.radius;\n\t\t\telse if (particle.p.x - particle.radius > this.x + this.width && particle.v.x >= 0)\n\t\t\t\tparticle.p.x = this.x - particle.radius;\n\n\t\t\tif (particle.p.y + particle.radius < this.y && particle.v.y <= 0)\n\t\t\t\tparticle.p.y = this.y + this.height + particle.radius;\n\t\t\telse if (particle.p.y - particle.radius > this.y + this.height && particle.v.y >= 0)\n\t\t\t\tparticle.p.y = this.y - particle.radius;\n\t\t}\n\t}\n}","import Zone from './Zone';\nimport Util from '../utils/Util';\n\nexport default class ImageZone extends Zone {\n\n\tconstructor(imageData, x, y, d) {\n\t\tsuper();\n\n\t\tthis.reset(imageData, x, y, d);\n\t}\n\n\treset(imageData, x, y, d) {\n\t\tthis.imageData = imageData;\n\t\tthis.x = Util.initValue(x, 0);\n\t\tthis.y = Util.initValue(y, 0);\n\t\tthis.d = Util.initValue(d, 2);\n\n\t\tthis.vectors = [];\n\t\tthis.setVectors();\n\t}\n\n\tsetVectors() {\n\t\tlet i, j;\n\t\tconst length1 = this.imageData.width;\n\t\tconst length2 = this.imageData.height;\n\n\t\tfor (i = 0; i < length1; i += this.d) {\n\t\t\tfor (j = 0; j < length2; j += this.d) {\n\t\t\t\tlet index = ((j >> 0) * length1 + (i >> 0)) * 4;\n\n\t\t\t\tif (this.imageData.data[index + 3] > 0) {\n\t\t\t\t\tthis.vectors.push({ x: i + this.x, y: j + this.y });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.vector;\n\t}\n\n\tgetBound(x, y) {\n\t\tvar index = ((y >> 0) * this.imageData.width + (x >> 0)) * 4;\n\t\tif (this.imageData.data[index + 3] > 0)\n\t\t\treturn true;\n\t\telse\n\t\t\treturn false;\n\t}\n\n\tgetPosition() {\n\t\treturn this.vector.copy(this.vectors[Math.floor(Math.random() * this.vectors.length)]);\n\t}\n\n\tgetColor(x, y) {\n\t\tx -= this.x;\n\t\ty -= this.y;\n\t\tvar i = ((y >> 0) * this.imageData.width + (x >> 0)) * 4;\n\n\t\treturn {\n\t\t\tr: this.imageData.data[i],\n\t\t\tg: this.imageData.data[i + 1],\n\t\t\tb: this.imageData.data[i + 2],\n\t\t\ta: this.imageData.data[i + 3]\n\t\t};\n\t}\n\n\tcrossing(particle) {\n\t\tif (this.crossType == \"dead\") {\n\t\t\tif (this.getBound(particle.p.x - this.x, particle.p.y - this.y))\n\t\t\t\tparticle.dead = true;\n\t\t\telse\n\t\t\t\tparticle.dead = false;\n\t\t} \n\t\t\n\t\telse if (this.crossType == \"bound\") {\n\t\t\tif (!this.getBound(particle.p.x - this.x, particle.p.y - this.y))\n\t\t\t\tparticle.v.negate();\n\t\t}\n\t}\n}","import Util from '../utils/Util';\nimport ColorUtil from '../utils/ColorUtil';\nimport MathUtils from '../math/MathUtils';\nimport CircleZone from '../zone/CircleZone';\nimport PointZone from '../zone/PointZone';\nimport LineZone from '../zone/LineZone';\nimport RectZone from '../zone/RectZone';\n\nexport default {\n\taddEventListener(proton, fun) {\n\t\tproton.addEventListener(\"PROTON_UPDATE_AFTER\", () => fun());\n\t},\n\n\tgetStyle(color) {\n\t\tconst rgb = ColorUtil.hexToRGB(color || '#ff0000');\n\t\treturn `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, 0.5)`;\n\t},\n\t\n\tdrawZone(proton, canvas, zone, clear) {\n\t\tconst context = canvas.getContext('2d');\n\t\tconst style = this.getStyle();\n\n\t\tthis.addEventListener(proton, () => {\n\t\t\tif (clear)\n\t\t\t\tcontext.clearRect(0, 0, canvas.width, canvas.height);\n\n\t\t\tif (zone instanceof PointZone) {\n\t\t\t\tcontext.beginPath();\n\t\t\t\tcontext.fillStyle = style;\n\t\t\t\tcontext.arc(zone.x, zone.y, 10, 0, Math.PI * 2, true);\n\t\t\t\tcontext.fill();\n\t\t\t\tcontext.closePath();\n\t\t\t} else if (zone instanceof LineZone) {\n\t\t\t\tcontext.beginPath();\n\t\t\t\tcontext.strokeStyle = style;\n\t\t\t\tcontext.moveTo(zone.x1, zone.y1);\n\t\t\t\tcontext.lineTo(zone.x2, zone.y2);\n\t\t\t\tcontext.stroke();\n\t\t\t\tcontext.closePath();\n\t\t\t} else if (zone instanceof RectZone) {\n\t\t\t\tcontext.beginPath();\n\t\t\t\tcontext.strokeStyle = style;\n\t\t\t\tcontext.drawRect(zone.x, zone.y, zone.width, zone.height);\n\t\t\t\tcontext.stroke();\n\t\t\t\tcontext.closePath();\n\t\t\t} else if (zone instanceof CircleZone) {\n\t\t\t\tcontext.beginPath();\n\t\t\t\tcontext.strokeStyle = style;\n\t\t\t\tcontext.arc(zone.x, zone.y, zone.radius, 0, Math.PI * 2, true);\n\t\t\t\tcontext.stroke();\n\t\t\t\tcontext.closePath();\n\t\t\t}\n\t\t});\n\t},\n\t\n\tdrawEmitter(proton, canvas, emitter, clear) {\n\t\tconst context = canvas.getContext('2d');\n\t\tconst style = this.getStyle();\n\n\t\tthis.addEventListener(proton, () => {\n\t\t\tif (clear) context.clearRect(0, 0, canvas.width, canvas.height);\n\t\t\t\n\t\t\tcontext.beginPath();\n\t\t\tcontext.fillStyle = style;\n\t\t\tcontext.arc(emitter.p.x, emitter.p.y, 10, 0, Math.PI * 2, true);\n\t\t\tcontext.fill();\n\t\t\tcontext.closePath();\n\t\t});\n\t},\n}\n\n","// http://paulirish.com/2011/requestanimationframe-for-smart-animating/\n// http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating\n\n// requestAnimationFrame polyfill by Erik Möller\n// fixes from Paul Irish and Tino Zijdel\n( function() {\n\t\tvar lastTime = 0;\n\t\tvar vendors = ['ms', 'moz', 'webkit', 'o'];\n\t\tfor (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {\n\t\t\twindow.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];\n\t\t\twindow.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n\t\t}\n\n\t\tif (!window.requestAnimationFrame)\n\t\t\twindow.requestAnimationFrame = function(callback, element) {\n\t\t\t\tvar currTime = new Date().getTime();\n\t\t\t\tvar timeToCall = Math.max(0, 16 - (currTime - lastTime));\n\t\t\t\tvar id = window.setTimeout(function() {\n\t\t\t\t\tcallback(currTime + timeToCall);\n\t\t\t\t}, timeToCall);\n\t\t\t\tlastTime = currTime + timeToCall;\n\t\t\t\treturn id;\n\t\t\t};\n\n\t\tif (!window.cancelAnimationFrame)\n\t\t\twindow.cancelAnimationFrame = function(id) {\n\t\t\t\tclearTimeout(id);\n\t\t\t};\n\t}()); ","// import \nimport Proton from \"./core/Proton\";\nimport Particle from \"./core/Particle\";\nimport Pool from \"./core/Pool\";\n\nimport Util from \"./utils/Util\";\nimport ColorUtil from \"./utils/ColorUtil\";\nimport MathUtils from \"./math/MathUtils\";\nimport Vector2D from \"./math/Vector2D\";\nimport Polar2D from \"./math/Polar2D\";\nimport Mat3 from \"./math/Mat3\";\nimport Span from \"./math/Span\";\nimport ArraySpan from \"./math/ArraySpan\";\nimport Rectangle from \"./math/Rectangle\";\nimport ease from \"./math/ease\";\n\nimport Rate from \"./initialize/Rate\";\nimport Initialize from \"./initialize/Initialize\";\nimport Life from \"./initialize/Life\";\nimport Position from \"./initialize/Position\";\nimport Velocity from \"./initialize/Velocity\";\nimport Mass from \"./initialize/Mass\";\nimport Radius from \"./initialize/Radius\";\nimport Body from \"./initialize/Body\";\n\nimport Behaviour from \"./behaviour/Behaviour\";\nimport Force from \"./behaviour/Force\";\nimport Attraction from \"./behaviour/Attraction\";\nimport RandomDrift from \"./behaviour/RandomDrift\";\nimport Gravity from \"./behaviour/Gravity\";\nimport Collision from \"./behaviour/Collision\";\nimport CrossZone from \"./behaviour/CrossZone\";\nimport Alpha from \"./behaviour/Alpha\";\nimport Scale from \"./behaviour/Scale\";\nimport Rotate from \"./behaviour/Rotate\";\nimport Color from \"./behaviour/Color\";\nimport Repulsion from \"./behaviour/Repulsion\";\nimport GravityWell from \"./behaviour/GravityWell\";\n\nimport Emitter from \"./emitter/Emitter\";\nimport BehaviourEmitter from \"./emitter/BehaviourEmitter\";\nimport FollowEmitter from \"./emitter/FollowEmitter\";\n\nimport CanvasRenderer from \"./render/CanvasRenderer\";\nimport DomRenderer from \"./render/DomRenderer\";\nimport EaselRenderer from \"./render/EaselRenderer\";\nimport PixelRenderer from \"./render/PixelRenderer\";\nimport PixiRenderer from \"./render/PixiRenderer\";\nimport WebGLRenderer from \"./render/WebGLRenderer\";\nimport CustomRenderer from \"./render/CustomRenderer\";\n\nimport Zone from \"./zone/Zone\";\nimport LineZone from \"./zone/LineZone\";\nimport CircleZone from \"./zone/CircleZone\";\nimport PointZone from \"./zone/PointZone\";\nimport RectZone from \"./zone/RectZone\";\nimport ImageZone from \"./zone/ImageZone\";\n\nimport Debug from \"./debug/Debug\";\nimport \"./polyfill/requestAnimationFrame\";\n\n// namespace\nProton.Particle = Proton.P = Particle;\nProton.Pool = Pool;\n\nProton.Util = Util;\nProton.ColorUtil = ColorUtil;\nProton.MathUtils = MathUtils;\nProton.Vector2D = Proton.Vector = Vector2D;\nProton.Polar2D = Proton.Polar = Polar2D;\nProton.ArraySpan = ArraySpan;\nProton.Rectangle = Rectangle;\nProton.Rate = Rate;\nProton.ease = ease;\nProton.Span = Span;\nProton.Mat3 = Mat3;\nProton.getSpan = (a, b, center) => new Span(a, b, center);\nProton.createArraySpan = ArraySpan.createArraySpan;\n\nProton.Initialize = Proton.Init = Initialize;\nProton.Life = Proton.L = Life;\nProton.Position = Proton.P = Position;\nProton.Velocity = Proton.V = Velocity;\nProton.Mass = Proton.M = Mass;\nProton.Radius = Proton.R = Radius;\nProton.Body = Proton.B = Body;\n\nProton.Behaviour = Behaviour;\nProton.Force = Proton.F = Force;\nProton.Attraction = Proton.A = Attraction;\nProton.RandomDrift = Proton.RD = RandomDrift;\nProton.Gravity = Proton.G = Gravity;\nProton.Collision = Collision;\nProton.CrossZone = CrossZone;\nProton.Alpha = Proton.A = Alpha;\nProton.Scale = Proton.S = Scale;\nProton.Rotate = Rotate;\nProton.Color = Color;\nProton.Repulsion = Repulsion;\nProton.GravityWell = GravityWell;\n\nProton.Emitter = Emitter;\nProton.BehaviourEmitter = BehaviourEmitter;\nProton.FollowEmitter = FollowEmitter;\n\nProton.Zone = Zone;\nProton.LineZone = LineZone;\nProton.CircleZone = CircleZone;\nProton.PointZone = PointZone;\nProton.RectZone = RectZone;\nProton.ImageZone = ImageZone;\n\nProton.CanvasRenderer = CanvasRenderer;\nProton.DomRenderer = DomRenderer;\nProton.EaselRenderer = EaselRenderer;\nProton.PixiRenderer = PixiRenderer;\nProton.PixelRenderer = PixelRenderer;\nProton.WebGLRenderer = Proton.WebGlRenderer = WebGLRenderer;\nProton.CustomRenderer = CustomRenderer;\n\nProton.Debug = Debug;\n\nObject.assign(Proton, ease);\n\n// export\nexport default Proton;"],"names":["PI","MathUtils","a","b","INT","Math","random","floor","center","f","randomAToB","display","num","toString","slice","Vector2D","x","y","atan2","PI_2","v","w","undefined","addVectors","subVectors","s","set","multiplyScalar","sqrt","divideScalar","length","distanceToSquared","tha","cos","sin","dx","dy","alpha","Span","isArray","Util","initValue","randomFloating","i","tx","ty","angleInRadians","c","sx","sy","a00","a01","a02","a10","a11","a12","a20","a21","a22","b00","b01","b02","b10","b11","b12","b20","b21","b22","id","width","height","position","dom","document","createElement","style","opacity","transform","resize","marginLeft","marginTop","div","scale","rotate","willChange","css3","key","val","bkey","charAt","toUpperCase","substr","IMG_CACHE","CANVAS_CACHE","canvasID","context","image","rect","drawImage","imagedata","getImageData","clearRect","img","callback","param","src","Image","onload","e","target","WebGLUtil","nhpot","canvas","DomUtil","createCanvas","getContext","value","defaults","Object","prototype","call","array","obj","ignore","o","indexOf","constructor","args","concat","factoryFunction","bind","apply","pOBJ","hasProp","p","particle","copy","prototypeObject","filters","singleProp","hasOwnProperty","getSpanValue","pan","getValue","ImgUtil","arr","destroy","uid","getCacheID","cache","isInner","Pool","total","params","__puid","PUID","getID","pop","createOrClone","getCache","push","create","classApply","clone","count","Stats","proton","container","type","emitterIndex","rendererIndex","body","add","emitter","getEmitter","renderer","getRenderer","str","emitters","emitSpeed","getEmitterPos","initializes","concatArr","behaviours","name","getCreatedNumber","getCount","pool","innerHTML","cssText","join","addEventListener","bg","color","parentNode","appendChild","renderers","result","cpool","round","EventDispatcher","_listeners","listener","removeEventListener","splice","listeners","handler","TargetClass","dispatchEvent","hasEventListener","removeAllEventListeners","Integration","particles","time","damping","eulerIntegrate","sleep","old","mass","clear","Proton","integrationType","oldTime","elapsed","stats","EULER","integrator","render","init","index","remove","parent","EMITTER_ADDED","EMITTER_REMOVED","PROTON_UPDATE","USE_CLOCK","Date","getTime","amendChangeTabsBug","emittersUpdate","PROTON_UPDATE_AFTER","update","getAllParticles","MEASURE","RK2","PARTICLE_CREATED","PARTICLE_UPDATE","PARTICLE_SLEEP","PARTICLE_DEAD","bindEmtterEvent","pow","ease","easeLinear","Particle","ID","reset","setPrototypeByObject","N180_PI","life","Infinity","age","energy","dead","sprite","radius","rotation","easing","destroyObject","removeAllBehaviours","rgb","r","g","applyBehaviours","max","applyBehaviour","behaviour","parents","initialize","addBehaviour","destroyArray","h","hex16","substring","parseInt","rbg","Number","Polar2D","abs","getX","getY","mat3","mat","Float32Array","mat1","mat2","d","m","vec","ArraySpan","_arr","randomColor","Rectangle","bottom","right","Rate","numpan","timepan","numPan","setSpanValue","timePan","startTime","nextTime","Initialize","Life","lifePan","Zone","vector","crossType","alert","PointZone","Position","zone","getPosition","Velocity","rpan","thapan","rPan","thaPan","vr","polar2d","normalizeVelocity","PI_180","Mass","massPan","Radius","oldRadius","Body","imagetarget","inner","Behaviour","getEasing","force","removeBehaviour","Force","fx","fy","normalizeForce","calculate","Attraction","targetPosition","normalizeValue","radiusSq","attractionForce","lengthSq","sub","normalize","RandomDrift","driftX","driftY","delay","panFoce","addXY","Gravity","Collision","collisionPool","delta","newPool","otherParticle","overlap","totalMass","averageMass1","averageMass2","distance","CrossZone","crossing","Alpha","same","alphaA","alphaB","Scale","scaleA","scaleB","Rotate","rotationA","rotationB","getDirection","Color","createArraySpan","colorA","ColorUtil","hexToRGB","colorB","Repulsion","GravityWell","centerPoint","distanceVec","distanceSq","factor","bindEmitter","setVector2DByObject","degreeTransform","Emitter","pObj","currentEmitTime","totalEmitTimes","rate","stoped","isNaN","initAll","rest","initializer","arguments","emitting","integrate","dispatch","expire","event","createParticle","get","setupParticle","addBehaviours","stop","slow","removeAllInitializers","removeEmitter","BehaviourEmitter","selfBehaviours","FollowEmitter","mouseTarget","window","_allowEmitting","initEventHandler","mousemoveHandler","mousemove","mousedownHandler","mousedown","mouseupHandler","mouseup","layerX","layerY","offsetX","offsetY","babelHelpers.get","BaseRenderer","element","stroke","initHandler","circleConf","isCircle","thinkness","_protonUpdateHandler","onProtonUpdate","_protonUpdateAfterHandler","onProtonUpdateAfter","_emitterAddedHandler","onEmitterAdded","_emitterRemovedHandler","onEmitterRemoved","_particleCreatedHandler","onParticleCreated","_particleUpdateHandler","onParticleUpdate","_particleDeadHandler","onParticleDead","CanvasRenderer","bufferCache","getImgFromCache","addImg2Body","drawCircle","buffer","createBuffer","bufferContext","globalAlpha","globalCompositeOperation","fillStyle","rgbToHex","fillRect","save","translate","restore","beginPath","arc","strokeStyle","lineWidth","closePath","fill","size","DomRenderer","createBody","transform3d","bodyReady","backgroundColor","removeChild","babelHelpers.typeof","createCircle","createSprite","createDiv","borderRadius","borderColor","borderWidth","url","backgroundImage","EaselRenderer","addChild","scaleX","scaleY","graphics","regX","regY","createjs","Graphics","String","beginStroke","beginFill","shape","Shape","PixelRenderer","rectangle","imageData","createImageData","putImageData","setPixel","elementwidth","data","PixiRenderer","setColor","tint","getHex16FromParticle","PIXI","Sprite","fromImage","anchor","endFill","MStack","mats","Mat3","multiply","WebGLRenderer","gl","antialias","stencil","depth","initVar","setMaxRadius","initShaders","initBuffers","blendEquation","FUNC_ADD","blendFunc","SRC_ALPHA","ONE_MINUS_SRC_ALPHA","enable","BLEND","umat","smat","mstack","viewport","circleCanvasURL","vsSource","fsSource","texturebuffers","A","B","fs","shader","createShader","FRAGMENT_SHADER","VERTEX_SHADER","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","getShaderInfoLog","fragmentShader","getShader","getFragmentShader","vertexShader","getVertexShader","sprogram","createProgram","attachShader","linkProgram","getProgramParameter","LINK_STATUS","useProgram","vpa","getAttribLocation","tca","enableVertexAttribArray","tMatUniform","getUniformLocation","samplerUniform","useTex","uniform1i","vs","idx","unitIBuffer","bindBuffer","ELEMENT_ARRAY_BUFFER","bufferData","Uint16Array","STATIC_DRAW","ids","unitI33","stripBuffer","raidus","circleCanvasRadius","toDataURL","_w","_h","_width","_height","_scaleX","_scaleY","createTexture","texture","vcBuffer","tcBuffer","ARRAY_BUFFER","bindTexture","TEXTURE_2D","texImage2D","RGBA","UNSIGNED_BYTE","texParameteri","TEXTURE_MAG_FILTER","LINEAR","TEXTURE_MIN_FILTER","LINEAR_MIPMAP_NEAREST","generateMipmap","textureLoaded","textureWidth","textureHeight","tmat","imat","oldScale","getCanvasFromCache","drawImg2Canvas","updateMatrix","uniform3f","uniformMatrix3fv","top","vertexAttribPointer","FLOAT","drawElements","TRIANGLES","UNSIGNED_SHORT","moveOriginMatrix","makeTranslation","translationMatrix","angel","rotationMatrix","makeRotation","scaleMatrix","makeScale","matrix","matrixMultiply","inverse","CustomRenderer","CircleZone","x1","y1","x2","y2","direction","minx","min","miny","maxx","maxy","dot","xxyy","gradient","getGradient","getLength","C","D","tha2","tha1","oldx","oldy","angle","rangeOut","getDistance","getSymmetric","error","PIx2","distanceTo","PointZoneRectZone","ImageZone","vectors","setVectors","j","length1","length2","getBound","negate","fun","getStyle","LineZone","moveTo","lineTo","RectZone","drawRect","lastTime","vendors","requestAnimationFrame","cancelAnimationFrame","currTime","timeToCall","setTimeout","P","Vector","Polar","getSpan","Init","L","V","M","R","F","RD","G","S","WebGlRenderer","Debug","assign"],"mappings":"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"} \ No newline at end of file diff --git a/build/proton.min.js b/build/proton.min.js index d769c64..c019325 100644 --- a/build/proton.min.js +++ b/build/proton.min.js @@ -1,10 +1,11 @@ /*! - * Proton v2.2.1 - * https://github.com/a-jie/Proton - * - * Copyright 2011-2017, A-JIE - * Licensed under the MIT license - * http://www.opensource.org/licenses/mit-license - * - */ -(function(a,b){typeof define=="function"&&define.amd?define([],b):typeof module!="undefined"&&module.exports?module.exports=b():a.Proton=b()})(this,function(){function be(a,b,c,d){be._super_.call(this),this.reset(a,b,c,d)}function bd(a,b,c,d){bd._super_.call(this),this.x=a,this.y=b,this.width=c,this.height=d}function bc(a,b){bc._super_.call(this),this.x=a,this.y=b}function bb(a,b,c){bb._super_.call(this),this.x=a,this.y=b,this.radius=c,this.angle=0,this.center={x:this.x,y:this.y}}function ba(b,c,d,e,f){ba._super_.call(this),d-b>=0?(this.x1=b,this.y1=c,this.x2=d,this.y2=e):(this.x1=d,this.y1=e,this.x2=b,this.y2=c),this.dx=this.x2-this.x1,this.dy=this.y2-this.y1,this.minx=Math.min(this.x1,this.x2),this.miny=Math.min(this.y1,this.y2),this.maxx=Math.max(this.x1,this.x2),this.maxy=Math.max(this.y1,this.y2),this.dot=this.x2*this.y1-this.x1*this.y2,this.xxyy=this.dx*this.dx+this.dy*this.dy,this.gradient=this.getGradient(),this.length=this.getLength(),this.direction=a.Util.initValue(f,">")}function _(){this.vector=new a.Vector2D(0,0),this.random=0,this.crossType="dead",this.alert=!0}function $(a,b){$._super_.call(this,a,b),this.gl=this.element.getContext("experimental-webgl",{antialias:!0,stencil:!1,depth:!1}),this.gl||alert("Sorry your browser do not suppest WebGL!"),this.initVar(),this.setMaxRadius(),this.initShaders(),this.initBuffers(),this.gl.blendEquation(this.gl.FUNC_ADD),this.gl.blendFunc(this.gl.SRC_ALPHA,this.gl.ONE_MINUS_SRC_ALPHA),this.gl.enable(this.gl.BLEND)}function Z(a,b,c){Z._super_.call(this,a,b),this.context=this.element.getContext("2d"),this.imageData=null,this.rectangle=null,this.rectangle=c,this.createImageData(c)}function Y(a,b){Y._super_.call(this,a,b),this.stroke=null,this.context=this.element.getContext("2d"),this.bufferCache={}}function X(a,b,c){X._super_.call(this,a,b),this.stroke=c}function W(a,b){W._super_.call(this,a,b),this.stroke=null}function V(b,c,d){this.proton=b,this.element=c,this.stroke=d,this.pool=new a.Pool}function U(b,c,d){this.element=d,this.type=a.Util.initValue(b,"canvas"),this.proton=c,this.renderer=this.getRenderer()}function R(b,c,d){this.mouseTarget=a.Util.initValue(b,window),this.ease=a.Util.initValue(c,.7),this._allowEmitting=!1,this.initEventHandler(),R._super_.call(this,d)}function Q(a){this.selfBehaviours=[],Q._super_.call(this,a)}function P(b){this.initializes=[],this.particles=[],this.behaviours=[],this.emitTime=0,this.emitTotalTimes=-1,this.damping=.006,this.bindEmitter=!0,this.rate=new a.Rate(1,.1),P._super_.call(this,b),this.id="emitter_"+P.ID++}function O(b,c,d,e){O._super_.call(this,d,e),this.distanceVec=new a.Vector2D,this.centerPoint=a.Util.initValue(b,new a.Vector2D),this.force=a.Util.initValue(this.normalizeValue(c),100),this.name="GravityWell"}function N(a,b,c,d){N._super_.call(this,c,d),this.reset(a,b),this.name="Color"}function M(a,b,c,d,e){M._super_.call(this,d,e),this.reset(a,b,c),this.name="Rotate"}function L(a,b,c,d){L._super_.call(this,c,d),this.reset(a,b),this.name="Scale"}function K(a,b,c,d){K._super_.call(this,c,d),this.reset(a,b),this.name="Alpha"}function J(a,b,c,d){J._super_.call(this,c,d),this.reset(a,b),this.name="CrossZone"}function I(a,b,c,d,e){I._super_.call(this,d,e),this.reset(a,b,c),this.name="Collision"}function H(a,b,c){H._super_.call(this,0,a,b,c),this.name="Gravity"}function G(a,b,c,d,e){G._super_.call(this,a,b,c,d,e),this.force*=-1,this.name="Repulsion"}function F(a,b,c,d,e){F._super_.call(this,d,e),this.reset(a,b,c),this.time=0,this.name="RandomDrift"}function E(b,c,d,e,f){E._super_.call(this,e,f),this.targetPosition=a.Util.initValue(b,new a.Vector2D),this.radius=a.Util.initValue(d,1e3),this.force=a.Util.initValue(this.normalizeValue(c),100),this.radiusSq=this.radius*this.radius,this.attractionForce=new a.Vector2D,this.lengthSq=0,this.name="Attraction"}function D(b,c,d,e){D._super_.call(this,d,e),this.force=this.normalizeForce(new a.Vector2D(b,c)),this.name="Force"}function C(b,c,d){C._super_.call(this),this.image=this.setSpanValue(b),this.w=a.Util.initValue(c,20),this.h=a.Util.initValue(d,this.w)}function B(b,c,d){B._super_.call(this),this.radius=a.Util.setSpanValue(b,c,d)}function A(b,c,d){A._super_.call(this),this.massPan=a.Util.setSpanValue(b,c,d)}function z(b,c,d){z._super_.call(this),this.rPan=a.Util.setSpanValue(b),this.thaPan=a.Util.setSpanValue(c),this.type=a.Util.initValue(d,"vector")}function y(b){y._super_.call(this),this.zone=a.Util.initValue(b,new a.PointZone)}function x(b,c,d){x._super_.call(this),this.lifePan=a.Util.setSpanValue(b,c,d)}function v(){}function u(b,c){this.numPan=a.Util.initValue(b,1),this.timePan=a.Util.initValue(c,1),this.numPan=a.Util.setSpanValue(this.numPan),this.timePan=a.Util.setSpanValue(this.timePan),this.startTime=0,this.nextTime=0,this.init()}function t(b,c){this.id="Behaviour_"+t.id++,this.life=a.Util.initValue(b,Infinity),this.easing=a.ease.setEasingByName(c),this.age=0,this.energy=1,this.dead=!1,this.parents=[],this.name="Behaviour"}function r(a,b,c,d){this.x=a,this.y=b,this.width=c,this.height=d,this.bottom=this.y+this.height,this.right=this.x+this.width}function q(b){a.Util.isArray(b)?this.colorArr=b:this.colorArr=[b]}function p(b,c,d){this.isArray=!1,a.Util.isArray(b)?(this.isArray=!0,this.a=b):(this.a=a.Util.initValue(b,1),this.b=a.Util.initValue(c,this.a),this.center=a.Util.initValue(d,!1))}function i(){this.cID=0,this.list={}}function h(b){this.id="particle_"+h.ID++,this.reset(!0),a.Util.setPrototypeByObject(this,b)}function g(){this.mats=[],this.size=0;for(var b=0;b<20;b++)this.mats.push(a.Mat3.create([0,0,0,0,0,0,0,0,0]))}function b(){this.initialize()}function a(b,c){this.integrationType=a.Util.initValue(c,a.EULER),this.emitters=[],this.renderers=[],this.time=0,this.oldTime=0,a.pool=new a.Pool(100),a.integrator=new a.NumericalIntegration(this.integrationType)}a.POOL_MAX=1e3,a.TIME_STEP=60,a.USE_CLOCK=!1,a.MEASURE=100,a.EULER="euler",a.RK2="runge-kutta2",a.VERLET="verlet",a.PARTICLE_CREATED="partilcleCreated",a.PARTICLE_UPDATE="partilcleUpdate",a.PARTICLE_SLEEP="particleSleep",a.PARTICLE_DEAD="partilcleDead",a.PROTON_UPDATE="protonUpdate",a.PROTON_UPDATE_AFTER="protonUpdateAfter",a.EMITTER_ADDED="emitterAdded",a.EMITTER_REMOVED="emitterRemoved",a.amendChangeTabsBug=!0,a.TextureBuffer={},a.TextureCanvasBuffer={},a.prototype={addRender:function(a){a.proton=this,this.renderers.push(a.proton)},addEmitter:function(b){this.emitters.push(b),b.parent=this,this.dispatchEvent(a.EMITTER_ADDED,b)},removeEmitter:function(b){var c=this.emitters.indexOf(b);this.emitters.splice(c,1),b.parent=null,this.dispatchEvent(a.EMITTER_REMOVED,b)},update:function(){this.dispatchEvent(a.PROTON_UPDATE);if(a.USE_CLOCK){this.oldTime||(this.oldTime=(new Date).getTime());var b=(new Date).getTime();this.elapsed=(b-this.oldTime)/1e3,a.amendChangeTabsBug&&this.amendChangeTabsBug(),this.oldTime=b}else this.elapsed=.0167;if(this.elapsed>0)for(var c=0;c.5&&(this.oldTime=(new Date).getTime(),this.elapsed=0)},getCount:function(){var a=0,b=this.emitters.length;for(var c=0;c>b;return a+1},makeTranslation:function(a,b){return[1,0,0,0,1,0,a,b,1]},makeRotation:function(a){var b=Math.cos(a),c=Math.sin(a);return[b,-c,0,c,b,0,0,0,1]},makeScale:function(a,b){return[a,0,0,0,b,0,0,0,1]},matrixMultiply:function(a,b){var c=a[0],d=a[1],e=a[2],f=a[3],g=a[4],h=a[5],i=a[6],j=a[7],k=a[8],l=b[0],m=b[1],n=b[2],o=b[3],p=b[4],q=b[5],r=b[6],s=b[7],t=b[8];return[c*l+d*o+e*r,c*m+d*p+e*s,c*n+d*q+e*t,f*l+g*o+h*r,f*m+g*p+h*s,f*n+g*q+h*t,i*l+j*o+k*r,i*m+j*p+k*s,i*n+j*q+k*t]}};a.WebGLUtil=e;var f=f||{createCanvas:function(a,b,c,d){var e=document.createElement("canvas"),f=d?d:"absolute";e.id=a,e.width=b,e.height=c,e.style.position=f,e.style.opacity=0,this.transformDom(e,-500,-500,0,0);return e},transformDom:function(a,b,c,d,e){a.style.WebkitTransform="translate("+b+"px, "+c+"px) "+"scale("+d+") "+"rotate("+e+"deg)",a.style.MozTransform="translate("+b+"px, "+c+"px) "+"scale("+d+") "+"rotate("+e+"deg)",a.style.OTransform="translate("+b+"px, "+c+"px) "+"scale("+d+") "+"rotate("+e+"deg)",a.style.msTransform="translate("+b+"px, "+c+"px) "+"scale("+d+") "+"rotate("+e+"deg)",a.style.transform="translate("+b+"px, "+c+"px) "+"scale("+d+") "+"rotate("+e+"deg)"}};a.DomUtil=f,g.prototype.set=function(b,c){c==0?a.Mat3.set(b,this.mats[0]):a.Mat3.multiply(this.mats[c-1],b,this.mats[c]),this.size=Math.max(this.size,c+1)},g.prototype.push=function(b){this.size==0?a.Mat3.set(b,this.mats[0]):a.Mat3.multiply(this.mats[this.size-1],b,this.mats[this.size]),this.size++},g.prototype.pop=function(){this.size>0&&this.size--},g.prototype.top=function(){return this.mats[this.size-1]},a.MStack=g,h.ID=0,h.prototype={getDirection:function(){return Math.atan2(this.v.x,-this.v.y)*(180/Math.PI)},reset:function(b){this.life=Infinity,this.age=0,this.energy=1,this.dead=!1,this.sleep=!1,this.target=null,this.sprite=null,this.parent=null,this.mass=1,this.radius=10,this.alpha=1,this.scale=1,this.rotation=0,this.color=null,this.easing=a.ease.setEasingByName(a.easeLinear),b?(this.transform={},this.p=new a.Vector2D,this.v=new a.Vector2D,this.a=new a.Vector2D,this.old={p:new a.Vector2D,v:new a.Vector2D,a:new a.Vector2D},this.behaviours=[]):(a.Util.destroyObject(this.transform),this.p.set(0,0),this.v.set(0,0),this.a.set(0,0),this.old.p.set(0,0),this.old.v.set(0,0),this.old.a.set(0,0),this.removeAllBehaviours()),this.transform.rgb={r:255,g:255,b:255};return this},update:function(a,b){if(!this.sleep){this.age+=a;var c=this.behaviours.length,d;for(d=0;d=this.life)this.destroy();else{var e=this.easing(this.age/this.life);this.energy=Math.max(1-e,0)}},addBehaviour:function(a){this.behaviours.push(a),a.hasOwnProperty("parents")&&a.parents.push(this),a.initialize(this)},addBehaviours:function(a){var b=a.length,c;for(c=0;c-1){var a=this.behaviours.splice(b,1);a.parents=null}},removeAllBehaviours:function(){a.Util.destroyArray(this.behaviours)},destroy:function(){this.removeAllBehaviours(),this.energy=0,this.dead=!0,this.parent=null}},a.Particle=h,i.prototype={create:function(b,c){this.cID++;return typeof b=="function"?a.Util.classApply(b,c):b.clone()},getCount:function(){var a=0;for(var b in this.list)a+=this.list[b].length;return a++},get:function(a,b){var c,d=a.__puid||j.id(a);this.list[d]&&this.list[d].length>0?c=this.list[d].pop():c=this.create(a,b),c.__puid=a.__puid||d;return c},set:function(a){return this._getList(a.__puid).push(a)},destroy:function(){for(var a in this.list)this.list[a].length=0,delete this.list[a]},_getList:function(a){a=a||"default",this.list[a]||(this.list[a]=[]);return this.list[a]}},a.Pool=i;var j={_id:0,_uids:{},id:function(a){for(var b in this._uids)if(this._uids[b]==a)return b;var c="PUID_"+this._id++;this._uids[c]=a;return c},hash:function(a){return}},k={randomAToB:function(a,b,c){return c?Math.floor(Math.random()*(b-a))+a:a+Math.random()*(b-a)},randomFloating:function(a,b,c){return k.randomAToB(a-b,a+b,c)},randomZone:function(a){},degreeTransform:function(a){return a*Math.PI/180},toColor16:function(a){return"#"+a.toString(16)},randomColor:function(){return"#"+("00000"+(Math.random()*16777216<<0).toString(16)).slice(-6)}};a.MathUtils=k;var m=function(b){this.type=a.Util.initValue(b,a.EULER)};m.prototype={integrate:function(a,b,c){this.eulerIntegrate(a,b,c)},eulerIntegrate:function(a,b,c){a.sleep||(a.old.p.copy(a.p),a.old.v.copy(a.v),a.a.multiplyScalar(1/a.mass),a.v.add(a.a.multiplyScalar(b)),a.p.add(a.old.v.multiplyScalar(b)),c&&a.v.multiplyScalar(c),a.a.clear())}},a.NumericalIntegration=m;var n=function(a,b){this.x=a||0,this.y=b||0};n.prototype={set:function(a,b){this.x=a,this.y=b;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},getGradient:function(){if(this.x!=0)return Math.atan2(this.y,this.x);if(this.y>0)return Math.PI/2;if(this.y<0)return-Math.PI/2},copy:function(a){this.x=a.x,this.y=a.y;return this},add:function(a,b){if(b!==undefined)return this.addVectors(a,b);this.x+=a.x,this.y+=a.y;return this},addXY:function(a,b){this.x+=a,this.y+=b;return this},addVectors:function(a,b){this.x=a.x+b.x,this.y=a.y+b.y;return this},addScalar:function(a){this.x+=a,this.y+=a;return this},sub:function(a,b){if(b!==undefined)return this.subVectors(a,b);this.x-=a.x,this.y-=a.y;return this},subVectors:function(a,b){this.x=a.x-b.x,this.y=a.y-b.y;return this},multiplyScalar:function(a){this.x*=a,this.y*=a;return this},divideScalar:function(a){a!==0?(this.x/=a,this.y/=a):this.set(0,0);return this},min:function(a){this.x>a.x&&(this.x=a.x),this.y>a.y&&(this.y=a.y);return this},max:function(a){this.x=this.x&&b<=this.bottom&&b>=this.y?!0:!1}},a.Rectangle=r;var s=s||{create:function(a){var b=new Float32Array(9);a&&this.set(a,b);return b},set:function(a,b){for(var c=0;c<9;c++)b[c]=a[c];return b},multiply:function(a,b,c){var d=a[0],e=a[1],f=a[2],g=a[3],h=a[4],i=a[6],j=a[7],k=b[0],l=b[1],m=b[2],n=b[3],o=b[4],p=b[6],q=b[7];c[0]=k*d+l*g,c[1]=k*e+l*h,c[2]=f*m,c[3]=n*d+o*g,c[4]=n*e+o*h,c[6]=p*d+q*g+i,c[7]=p*e+q*h+j;return c},inverse:function(a,b){var c=a[0],d=a[1],e=a[3],f=a[4],g=a[6],h=a[7],i=f,j=-e,k=h*e-f*g,l=c*i+d*j,m;m=1/l,b[0]=i*m,b[1]=-d*m,b[3]=j*m,b[4]=c*m,b[6]=k*m,b[7]=(-h*c+d*g)*m;return b},multiplyVec2:function(a,b,c){var d=b[0],e=b[1];c[0]=d*a[0]+e*a[3]+a[6],c[1]=d*a[1]+e*a[4]+a[7];return c}};a.Mat3=s,t.id=0,t.prototype={reset:function(b,c){this.life=a.Util.initValue(b,Infinity),this.easing=a.Util.initValue(c,a.ease.setEasingByName(a.easeLinear))},normalizeForce:function(b){return b.multiplyScalar(a.MEASURE)},normalizeValue:function(b){return b*a.MEASURE},initialize:function(a){},applyBehaviour:function(a,b,c){this.age+=b;if(this.age>=this.life||this.dead)this.energy=0,this.dead=!0,this.destroy();else{var d=this.easing(a.age/a.life);this.energy=Math.max(1-d,0)}},destroy:function(){var a,b=this.parents.length,c;for(c=0;c=this.nextTime){this.startTime=0,this.nextTime=this.timePan.getValue();return this.numPan.b==1?this.numPan.getValue(!1)>.5?1:0:this.numPan.getValue(!0)}return 0}},a.Rate=u,v.prototype.reset=function(){},v.prototype.init=function(a,b){b?this.initialize(b):this.initialize(a)},v.prototype.initialize=function(a){},a.Initialize=v;var w={initialize:function(b,c,d){var e=d.length,f;for(f=0;f4e-6&&this.lengthSq=this.delay&&(b.a.addXY(a.MathUtils.randomAToB(-this.panFoce.x,this.panFoce.x),a.MathUtils.randomAToB(-this.panFoce.y,this.panFoce.y)),this.time=0)},a.RandomDrift=F,a.Util.inherits(G,a.Attraction),G.prototype.reset=function(a,b,c,d,e){G._super_.prototype.reset.call(this,a,b,c,d,e),this.force*=-1},a.Repulsion=G,a.Util.inherits(H,a.Force),H.prototype.reset=function(a,b,c){H._super_.prototype.reset.call(this,0,a,b,c)},a.Gravity=H,a.G=H,a.Util.inherits(I,a.Behaviour),I.prototype.reset=function(b,c,d,e,f){this.emitter=a.Util.initValue(b,null),this.mass=a.Util.initValue(c,!0),this.callback=a.Util.initValue(d,null),this.collisionPool=[],this.delta=new a.Vector2D,e&&I._super_.prototype.reset.call(this,e,f)},I.prototype.applyBehaviour=function(a,b,c){var d=this.emitter?this.emitter.particles.slice(c):this.pool.slice(c),e,f,g,h,i,j=d.length;for(var k=0;k-1&&this.initializes.splice(b,1)},P.prototype.removeInitializers=function(){a.Util.destroyArray(this.initializes)},P.prototype.addBehaviour=function(){var a=arguments.length,b;for(b=0;b-1&&this.behaviours.splice(b,1)},P.prototype.removeAllBehaviours=function(){a.Util.destroyArray(this.behaviours)},P.prototype.integrate=function(b){var c=1-this.damping;a.integrator.integrate(this,b,c);var d=this.particles.length,e;for(e=0;e=this.life||this.dead)&&this.destroy(),this.emitting(b),this.integrate(b);var c,d=this.particles.length,e;for(e=d-1;e>=0;e--)c=this.particles[e],c.dead&&(this.dispatchEvent(a.PARTICLE_DEAD,c),a.pool.set(c),this.particles.splice(e,1))},P.prototype.setupParticle=function(b,c,d){var e=this.initializes,f=this.behaviours;c&&(c instanceof Array?e=c:e=[c]),d&&(d instanceof Array?f=d:f=[d]),b.reset(),a.InitializeUtil.initialize(this,b,e),b.addBehaviours(f),b.parent=this,this.particles.push(b)},P.prototype.destroy=function(){this.dead=!0,this.emitTotalTimes=-1,this.particles.length==0&&(this.removeInitializers(),this.removeAllBehaviours(),this.parent&&this.parent.removeEmitter(this))},a.Emitter=P,a.Util.inherits(Q,a.Emitter),Q.prototype.addSelfBehaviour=function(){var a=arguments.length,b;for(b=0;b-1&&this.selfBehaviours.splice(b,1)},Q.prototype.update=function(a){Q._super_.prototype.update.call(this,a);if(!this.sleep){var b=this.selfBehaviours.length,c;for(c=0;cthis.element.width||c<0||c>this.elementwidth)){var f=((c>>0)*a.width+(b>>0))*4;a.data[f]=e.r,a.data[f+1]=e.g,a.data[f+2]=e.b,a.data[f+3]=d.alpha*255}},Z.prototype.onParticleDead=function(a){},a.PixelRender=Z,a.Util.inherits($,a.BaseRender),$.prototype.resize=function(a,b){this.umat[4]=-2,this.umat[7]=1,this.smat[0]=1/a,this.smat[4]=1/b,this.mstack.set(this.umat,0),this.mstack.set(this.smat,1),this.gl.viewport(0,0,a,b),this.element.width=a,this.element.height=b},$.prototype.setMaxRadius=function(a){this.circleCanvasURL=this.createCircle(a)},$.prototype.getVertexShader=function(){var a=["uniform vec2 viewport;","attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","uniform mat3 tMat;","varying vec2 vTextureCoord;","varying float alpha;","void main() {","vec3 v = tMat * vec3(aVertexPosition, 1.0);","gl_Position = vec4(v.x, v.y, 0, 1);","vTextureCoord = aTextureCoord;","alpha = tMat[0][2];","}"].join("\n");return a},$.prototype.getFragmentShader=function(){var a=["precision mediump float;","varying vec2 vTextureCoord;","varying float alpha;","uniform sampler2D uSampler;","uniform vec4 color;","uniform bool useTexture;","uniform vec3 uColor;","void main() {","vec4 textureColor = texture2D(uSampler, vTextureCoord);","gl_FragColor = textureColor * vec4(uColor, 1.0);","gl_FragColor.w *= alpha;","}"].join("\n");return a},$.prototype.initVar=function(){this.mstack=new a.MStack,this.umat=a.Mat3.create([2,0,1,0,-2,0,-1,1,1]),this.smat=a.Mat3.create([.01,0,1,0,.01,0,0,0,1]),this.texturebuffers={}},$.prototype.start=function(){$._super_.prototype.start.call(this),this.resize(this.element.width,this.element.height)},$.prototype.blendEquation=function(a){this.gl.blendEquation(this.gl[a])},$.prototype.blendFunc=function(a,b){this.gl.blendFunc(this.gl[a],this.gl[b])},$.prototype.getShader=function(a,b,c){var d;c?d=a.createShader(a.FRAGMENT_SHADER):d=a.createShader(a.VERTEX_SHADER),a.shaderSource(d,b),a.compileShader(d);if(!a.getShaderParameter(d,a.COMPILE_STATUS)){alert(a.getShaderInfoLog(d));return null}return d},$.prototype.initShaders=function(){var a=this.getShader(this.gl,this.getFragmentShader(),!0),b=this.getShader(this.gl,this.getVertexShader(),!1);this.sprogram=this.gl.createProgram(),this.gl.attachShader(this.sprogram,b),this.gl.attachShader(this.sprogram,a),this.gl.linkProgram(this.sprogram),this.gl.getProgramParameter(this.sprogram,this.gl.LINK_STATUS)||alert("Could not initialise shaders"),this.gl.useProgram(this.sprogram),this.sprogram.vpa=this.gl.getAttribLocation(this.sprogram,"aVertexPosition"),this.sprogram.tca=this.gl.getAttribLocation(this.sprogram,"aTextureCoord"),this.gl.enableVertexAttribArray(this.sprogram.tca),this.gl.enableVertexAttribArray(this.sprogram.vpa),this.sprogram.tMatUniform=this.gl.getUniformLocation(this.sprogram,"tMat"),this.sprogram.samplerUniform=this.gl.getUniformLocation(this.sprogram,"uSampler"),this.sprogram.useTex=this.gl.getUniformLocation(this.sprogram,"useTexture"),this.sprogram.color=this.gl.getUniformLocation(this.sprogram,"uColor"),this.gl.uniform1i(this.sprogram.useTex,1)},$.prototype.initBuffers=function(){this.unitIBuffer=this.gl.createBuffer(),this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER,this.unitIBuffer);var a=[0,3,1,0,2,3];this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER,new Uint16Array(a),this.gl.STATIC_DRAW);var b=[];for(var c=0;c<100;c++)b.push(c);idx=new Uint16Array(b),this.unitI33=this.gl.createBuffer(),this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER,this.unitI33),this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER,idx,this.gl.STATIC_DRAW),b=[];for(c=0;c<100;c++)b.push(c,c+1,c+2);idx=new Uint16Array(b),this.stripBuffer=this.gl.createBuffer(),this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER,this.stripBuffer),this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER,idx,this.gl.STATIC_DRAW)},$.prototype.createCircle=function(b){this.circleCanvasRadius=a.WebGLUtil.nhpot(a.Util.initValue(b,32));var c=a.DomUtil.createCanvas("circle_canvas",this.circleCanvasRadius*2,this.circleCanvasRadius*2),d=c.getContext("2d");d.beginPath(),d.arc(this.circleCanvasRadius,this.circleCanvasRadius,this.circleCanvasRadius,0,Math.PI*2,!0),d.closePath(),d.fillStyle="#FFF",d.fill();return c.toDataURL()},$.prototype.setImgInCanvas=function(b){var c=b.target.width,d=b.target.height,e=a.WebGLUtil.nhpot(b.target.width),f=a.WebGLUtil.nhpot(b.target.height),g=b.target.width/e,h=b.target.height/f;this.texturebuffers[b.transform.src]||(this.texturebuffers[b.transform.src]=[this.gl.createTexture(),this.gl.createBuffer(),this.gl.createBuffer()]),b.transform.texture=this.texturebuffers[b.transform.src][0],b.transform.vcBuffer=this.texturebuffers[b.transform.src][1],b.transform.tcBuffer=this.texturebuffers[b.transform.src][2],this.gl.bindBuffer(this.gl.ARRAY_BUFFER,b.transform.tcBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array([0,0,g,0,0,h,h,h]),this.gl.STATIC_DRAW),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,b.transform.vcBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array([0,0,c,0,0,d,c,d]),this.gl.STATIC_DRAW);var i=b.transform.canvas.getContext("2d"),j=i.getImageData(0,0,e,f);this.gl.bindTexture(this.gl.TEXTURE_2D,b.transform.texture),this.gl.texImage2D(this.gl.TEXTURE_2D,0,this.gl.RGBA,this.gl.RGBA,this.gl.UNSIGNED_BYTE,j),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MAG_FILTER,this.gl.LINEAR),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MIN_FILTER,this.gl.LINEAR_MIPMAP_NEAREST),this.gl.generateMipmap(this.gl.TEXTURE_2D),b.transform.textureLoaded=!0,b.transform.textureWidth=c,b.transform.textureHeight=d},$.prototype.setStroke=function(a,b){},$.prototype.onProtonUpdate=function(){},$.prototype.onParticleCreated=function(b){var c=this;b.transform.textureLoaded=!1,b.transform.tmat=a.Mat3.create(),b.transform.tmat[8]=1,b.transform.imat=a.Mat3.create(),b.transform.imat[8]=1,b.target?a.Util.getImage(b.target,b,!0,function(a){c.setImgInCanvas.call(c,a),a.transform.oldScale=1}):a.Util.getImage(this.circleCanvasURL,b,!0,function(a){c.setImgInCanvas.call(c,a),a.transform.oldScale=a.radius/c.circleCanvasRadius})},$.prototype.onParticleUpdate=function(a){a.transform.textureLoaded&&(this.updateMatrix(a),this.gl.uniform3f(this.sprogram.color,a.transform.rgb.r/255,a.transform.rgb.g/255,a.transform.rgb.b/255),this.gl.uniformMatrix3fv(this.sprogram.tMatUniform,!1,this.mstack.top()),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,a.transform.vcBuffer),this.gl.vertexAttribPointer(this.sprogram.vpa,2,this.gl.FLOAT,!1,0,0),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,a.transform.tcBuffer),this.gl.vertexAttribPointer(this.sprogram.tca,2,this.gl.FLOAT,!1,0,0),this.gl.bindTexture(this.gl.TEXTURE_2D,a.transform.texture),this.gl.uniform1i(this.sprogram.samplerUniform,0),this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER,this.unitIBuffer),this.gl.drawElements(this.gl.TRIANGLES,6,this.gl.UNSIGNED_SHORT,0),this.mstack.pop())},$.prototype.onParticleDead=function(a){},$.prototype.updateMatrix=function(b){var c=a.WebGLUtil.makeTranslation(-b.transform.textureWidth/2,-b.transform.textureHeight/2),d=a.WebGLUtil.makeTranslation(b.p.x,b.p.y),e=b.rotation*(Math.PI/180),f=a.WebGLUtil.makeRotation(e),g=b.scale*b.transform.oldScale,h=a.WebGLUtil.makeScale(g,g),i=a.WebGLUtil.matrixMultiply(c,h);i=a.WebGLUtil.matrixMultiply(i,f),i=a.WebGLUtil.matrixMultiply(i,d),a.Mat3.inverse(i,b.transform.imat),i[2]=b.alpha,this.mstack.push(i)},a.WebGLRender=$,_.prototype={getPosition:function(){},crossing:function(a){}},a.Zone=_,a.Util.inherits(ba,a.Zone),ba.prototype.getPosition=function(){this.random=Math.random(),this.vector.x=this.x1+this.random*this.length*Math.cos(this.gradient),this.vector.y=this.y1+this.random*this.length*Math.sin(this.gradient);return this.vector},ba.prototype.getDirection=function(a,b){var c=this.dy,d=-this.dx,e=this.dot,f=d==0?1:d;return(c*a+d*b+e)*f>0?!0:!1},ba.prototype.getDistance=function(a,b){var c=this.dy,d=-this.dx,e=this.dot,f=c*a+d*b+e;return f/Math.sqrt(this.xxyy)},ba.prototype.getSymmetric=function(a){var b=a.getGradient(),c=this.getGradient(),d=2*(c-b),e=a.x,f=a.y;a.x=e*Math.cos(d)-f*Math.sin(d),a.y=e*Math.sin(d)+f*Math.cos(d);return a},ba.prototype.getGradient=function(){return Math.atan2(this.dy,this.dx)},ba.prototype.getRange=function(a,b){var c=Math.abs(this.getGradient());c<=Math.PI/4?a.p.xthis.minx&&b():a.p.ythis.miny&&b()},ba.prototype.getLength=function(){return Math.sqrt(this.dx*this.dx+this.dy*this.dy)},ba.prototype.crossing=function(a){var b=this;this.crossType=="dead"?this.direction==">"||this.direction=="R"||this.direction=="right"||this.direction=="down"?this.getRange(a,function(){b.getDirection(a.p.x,a.p.y)&&(a.dead=!0)}):this.getRange(a,function(){b.getDirection(a.p.x,a.p.y)||(a.dead=!0)}):this.crossType=="bound"?this.getRange(a,function(){b.getDistance(a.p.x,a.p.y)<=a.radius&&(b.dx==0?a.v.x*=-1:b.dy==0?a.v.y*=-1:b.getSymmetric(a.v))}):this.crossType=="cross"&&this.alert&&(alert("Sorry lineZone does not support cross method"),this.alert=!1)},a.LineZone=ba,a.Util.inherits(bb,a.Zone),bb.prototype.getPosition=function(){this.random=Math.random(),this.angle=Math.PI*2*Math.random(),this.vector.x=this.x+this.random*this.radius*Math.cos(this.angle),this.vector.y=this.y+this.random*this.radius*Math.sin(this.angle);return this.vector},bb.prototype.setCenter=function(a,b){this.center.x=a,this.center.y=b},bb.prototype.crossing=function(a){var b=a.p.distanceTo(this.center);this.crossType=="dead"?b-a.radius>this.radius&&(a.dead=!0):this.crossType=="bound"?b+a.radius>=this.radius&&this.getSymmetric(a):this.crossType=="cross"&&this.alert&&(alert("Sorry CircleZone does not support cross method"),this.alert=!1)},bb.prototype.getSymmetric=function(a){var b=a.v.getGradient(),c=this.getGradient(a),d=2*(c-b),e=a.v.x,f=a.v.y;a.v.x=e*Math.cos(d)-f*Math.sin(d),a.v.y=e*Math.sin(d)+f*Math.cos(d)},bb.prototype.getGradient=function(a){return-Math.PI/2+Math.atan2(a.p.y-this.center.y,a.p.x-this.center.x)},a.CircleZone=bb,a.Util.inherits(bc,a.Zone),bc.prototype.getPosition=function(){this.vector.x=this.x,this.vector.y=this.y;return this.vector},bc.prototype.crossing=function(a){this.alert&&(alert("Sorry PointZone does not support crossing method"),this.alert=!1)},a.PointZone=bc,a.Util.inherits(bd,a.Zone),bd.prototype.getPosition=function(){this.vector.x=this.x+Math.random()*this.width,this.vector.y=this.y+Math.random()*this.height;return this.vector},bd.prototype.crossing=function(a){this.crossType=="dead"?(a.p.x+a.radiusthis.x+this.width&&(a.dead=!0),a.p.y+a.radiusthis.y+this.height&&(a.dead=!0)):this.crossType=="bound"?(a.p.x-a.radiusthis.x+this.width&&(a.p.x=this.x+this.width-a.radius,a.v.x*=-1),a.p.y-a.radiusthis.y+this.height&&(a.p.y=this.y+this.height-a.radius,a.v.y*=-1)):this.crossType=="cross"&&(a.p.x+a.radiusthis.x+this.width&&a.v.x>=0&&(a.p.x=this.x-a.radius),a.p.y+a.radiusthis.y+this.height&&a.v.y>=0&&(a.p.y=this.y-a.radius))},a.RectZone=bd,a.Util.inherits(be,a.Zone),be.prototype.reset=function(b,c,d,e){this.imageData=b,this.x=a.Util.initValue(c,0),this.y=a.Util.initValue(d,0),this.d=a.Util.initValue(e,2),this.vectors=[],this.setVectors()},be.prototype.setVectors=function(){var a,b,c=this.imageData.width,d=this.imageData.height;for(a=0;a>0)*c+(a>>0))*4;this.imageData.data[e+3]>0&&this.vectors.push({x:a+this.x,y:b+this.y})}return this.vector},be.prototype.getBound=function(a,b){var c=((b>>0)*this.imageData.width+(a>>0))*4;return this.imageData.data[c+3]>0?!0:!1},be.prototype.getPosition=function(){return this.vector.copy(this.vectors[Math.floor(Math.random()*this.vectors.length)])},be.prototype.getColor=function(a,b){a-=this.x,b-=this.y;var c=((b>>0)*this.imageData.width+(a>>0))*4;return{r:this.imageData.data[c],g:this.imageData.data[c+1],b:this.imageData.data[c+2],a:this.imageData.data[c+3]}},be.prototype.crossing=function(a){this.crossType=="dead"?this.getBound(a.p.x-this.x,a.p.y-this.y)?a.dead=!0:a.dead=!1:this.crossType=="bound"&&(this.getBound(a.p.x-this.x,a.p.y-this.y)||a.v.negate())},a.ImageZone=be;var bf=bf||{addEventListener:function(b,c){b.addEventListener(a.PROTON_UPDATE,function(){c()})},setStyle:function(b){var c=b||"#ff0000",d=a.Util.hexToRGB(c),e="rgba("+d.r+","+d.g+","+d.b+","+.5+")";return e},drawZone:function(b,c,d,e){var f=c.getContext("2d"),g=this.setStyle();this.addEventListener(b,function(){e&&f.clearRect(0,0,c.width,c.height),d instanceof a.PointZone?(f.beginPath(),f.fillStyle=g,f.arc(d.x,d.y,10,0,Math.PI*2,!0),f.fill(),f.closePath()):d instanceof a.LineZone?(f.beginPath(),f.strokeStyle=g,f.moveTo(d.x1,d.y1),f.lineTo(d.x2,d.y2),f.stroke(),f.closePath()):d instanceof a.RectZone?(f.beginPath(),f.strokeStyle=g,f.drawRect(d.x,d.y,d.width,d.height),f.stroke(),f.closePath()):d instanceof a.CircleZone&&(f.beginPath(),f.strokeStyle=g,f.arc(d.x,d.y,d.radius,0,Math.PI*2,!0),f.stroke(),f.closePath())})},drawEmitter:function(a,b,c,d){var e=b.getContext("2d"),f=this.setStyle();this.addEventListener(a,function(){d&&e.clearRect(0,0,b.width,b.height),e.beginPath(),e.fillStyle=f,e.arc(c.p.x,c.p.y,10,0,Math.PI*2,!0),e.fill(),e.closePath()})},test:{},setTest:function(a,b){this.test[a]=b},getTest:function(a){return this.test.hasOwnProperty(a)?this.test[a]:!1}};a.Debug=bf,function(){var a=0,b=["ms","moz","webkit","o"];for(var c=0;c0?e.PI_2:this.y<0?-e.PI_2:void 0}},{key:"copy",value:function(t){return this.x=t.x,this.y=t.y,this}},{key:"add",value:function(t,e){return void 0!==e?this.addVectors(t,e):(this.x+=t.x,this.y+=t.y,this)}},{key:"addXY",value:function(t,e){return this.x+=t,this.y+=e,this}},{key:"addVectors",value:function(t,e){return this.x=t.x+e.x,this.y=t.y+e.y,this}},{key:"sub",value:function(t,e){return void 0!==e?this.subVectors(t,e):(this.x-=t.x,this.y-=t.y,this)}},{key:"subVectors",value:function(t,e){return this.x=t.x-e.x,this.y=t.y-e.y,this}},{key:"divideScalar",value:function(t){return 0!==t?(this.x/=t,this.y/=t):this.set(0,0),this}},{key:"multiplyScalar",value:function(t){return this.x*=t,this.y*=t,this}},{key:"negate",value:function(){return this.multiplyScalar(-1)}},{key:"dot",value:function(t){return this.x*t.x+this.y*t.y}},{key:"lengthSq",value:function(){return this.x*this.x+this.y*this.y}},{key:"length",value:function(){return Math.sqrt(this.x*this.x+this.y*this.y)}},{key:"normalize",value:function(){return this.divideScalar(this.length())}},{key:"distanceTo",value:function(t){return Math.sqrt(this.distanceToSquared(t))}},{key:"rotate",value:function(t){var e=this.x,i=this.y;return this.x=e*Math.cos(t)+i*Math.sin(t),this.y=-e*Math.sin(t)+i*Math.cos(t),this}},{key:"distanceToSquared",value:function(t){var e=this.x-t.x,i=this.y-t.y;return e*e+i*i}},{key:"lerp",value:function(t,e){return this.x+=(t.x-this.x)*e,this.y+=(t.y-this.y)*e,this}},{key:"equals",value:function(t){return t.x===this.x&&t.y===this.y}},{key:"clear",value:function(){return this.x=0,this.y=0,this}},{key:"clone",value:function(){return new t(this.x,this.y)}}]),t}(),l=function(){function t(e,i,n){r(this,t),this.isArray=!1,x.isArray(e)?(this.isArray=!0,this.a=e):(this.a=x.initValue(e,1),this.b=x.initValue(i,this.a),this.center=x.initValue(n,!1))}return n(t,[{key:"getValue",value:function(t){return this.isArray?this.a[Math.floor(this.a.length*Math.random())]:this.center?e.randomFloating(this.a,this.b,t):e.randomAToB(this.a,this.b,t)}}]),t}(),u=function(t){--t;for(var e=1;e<32;e<<=1)t|=t>>e;return t+1},c=function(t,e){return[1,0,0,0,1,0,t,e,1]},f=function(t){var e=Math.cos(t),i=Math.sin(t);return[e,-i,0,i,e,0,0,0,1]},d=function(t,e){return[t,0,0,0,e,0,0,0,1]},y=function(t,e){var i=t[0],r=t[1],n=t[2],a=t[3],s=t[4],o=t[5],h=t[6],l=t[7],u=t[8],c=e[0],f=e[1],d=e[2],y=e[3],p=e[4],v=e[5],g=e[6],m=e[7],b=e[8];return[i*c+r*y+n*g,i*f+r*p+n*m,i*d+r*v+n*b,a*c+s*y+o*g,a*f+s*p+o*m,a*d+s*v+o*b,h*c+l*y+u*g,h*f+l*p+u*m,h*d+l*v+u*b]},p={createCanvas:function(t,e,i,r){var n=document.createElement("canvas");return r=r||"absolute",n.id=t,n.width=e,n.height=i,n.style.opacity=0,n.style.position=r,this.transform(n,-500,-500,0,0),n},createDiv:function(t,e,i){var r=document.createElement("div");return r.id=t,r.style.position="absolute",this.resize(r,e,i),r},resize:function(t,e,i){t.style.width=e+"px",t.style.height=i+"px",t.style.marginLeft=-e/2+"px",t.style.marginTop=-i/2+"px"},transform:function(t,e,i,r,n){var a="translate("+e+"px, "+i+"px) scale("+r+") rotate("+n+"deg)";t.style.willChange="transform",this.css3(t,"transform",a)},transform3d:function(t,e,i,r,n){var a="translate3d("+e+"px, "+i+"px, 0) scale("+r+") rotate("+n+"deg)";t.style.willChange="transform",this.css3(t,"backfaceVisibility","hidden"),this.css3(t,"transform",a)},css3:function(t,e,i){var r=e.charAt(0).toUpperCase()+e.substr(1);t.style["Webkit"+r]=i,t.style["Moz"+r]=i,t.style["O"+r]=i,t.style["ms"+r]=i,t.style[""+e]=i}},v={},g={},m=function(t,e,i){t.drawImage(e,i.x,i.y);var r=t.getImageData(i.x,i.y,i.width,i.height);return t.clearRect(i.x,i.y,i.width,i.height),r},b=function(t,e,i){var r="string"==typeof t?t:t.src;if(v[r])e(v[r],i);else{var n=new Image;n.onload=function(t){v[r]=t.target,e(v[r],i)},n.src=r}},_=function(t,e,i){var r=t.src;if(!g[r]){var n=u(t.width),a=u(t.height),s=p.createCanvas("canvas_cache_0",n,a);s.getContext("2d").drawImage(t,0,0,t.width,t.height),g[r]=s}return e&&e(g[r],i),g[r]},x={initValue:function(t,e){return t=null!==t&&void 0!==t?t:e},isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)},destroyArray:function(t){t&&(t.length=0)},destroyObject:function(t,e){for(var i in t)e&&e.indexOf(i)>-1||delete t[i]},classApply:function(t,e){return e?(e=[null].concat(e),new(t.bind.apply(t,e))):new t},setVector2DByObject:function(t,e){this.hasProp(e,"x")&&(t.p.x=e.x),this.hasProp(e,"y")&&(t.p.y=e.y),this.hasProp(e,"vx")&&(t.v.x=e.vx),this.hasProp(e,"vy")&&(t.v.y=e.vy),this.hasProp(e,"ax")&&(t.a.x=e.ax),this.hasProp(e,"ay")&&(t.a.y=e.ay),this.hasProp(e,"p")&&particle.p.copy(e.p),this.hasProp(e,"v")&&particle.v.copy(e.v),this.hasProp(e,"a")&&particle.a.copy(e.a),this.hasProp(e,"position")&&particle.p.copy(e.position),this.hasProp(e,"velocity")&&particle.v.copy(e.velocity),this.hasProp(e,"accelerate")&&particle.a.copy(e.accelerate)},hasProp:function(t,e){return!!t&&void 0!==t[e]},setPrototypeByObject:function(t,e,i){for(var r in e)t.hasOwnProperty(r)&&(i?i.indexOf(r)<0&&(t[r]=this.getSpanValue(e[r])):t[r]=this.getSpanValue(e[r]));return t},setSpanValue:function(t,e,i){return t instanceof l?t:e?i?new l(t,e,i):new l(t,e):new l(t)},getSpanValue:function(t){return t instanceof l?t.getValue():t},getImageData:function(t,e,i){return m(t,e,i)},destroy:function(t,e){for(var i=t.length;i--;){try{t[i].destroy(e)}catch(t){}delete t[i]}t.length=0}},k={id:0,cache:{},getID:function(t){var e=this.getCacheID(t);return e||(e="PUID_"+this.id++,this.cache[e]=t,e)},getCacheID:function(t){var e=void 0;for(var r in this.cache){if((e=this.cache[r])===t)return r;if("object"===(void 0===e?"undefined":i(e))&&"object"===(void 0===t?"undefined":i(t))&&e.isInner&&t.isInner&&e.src===t.src)return r}return null},getTarget:function(t){return this.cache[t]}},P=function(){function t(e){r(this,t),this.total=0,this.cache={}}return n(t,[{key:"get",value:function(t,e,i){var r=void 0;return i=i||t.__puid||k.getID(t),(r=this.cache[i]&&this.cache[i].length>0?this.cache[i].pop():this.createOrClone(t,e)).__puid=t.__puid||i,r}},{key:"expire",value:function(t){return this.getCache(t.__puid).push(t)}},{key:"createOrClone",value:function(t,e){return this.total++,this.create?this.create(t,e):"function"==typeof t?x.classApply(t,e):t.clone()}},{key:"getCount",value:function(){var t=0;for(var e in this.cache)t+=this.cache[e].length;return t++}},{key:"destroy",value:function(){for(var t in this.cache)this.cache[t].length=0,delete this.cache[t]}},{key:"getCache",value:function(t){return t=t||"default",this.cache[t]||(this.cache[t]=[]),this.cache[t]}}]),t}(),E=function(){function t(e){r(this,t),this.proton=e,this.container=null,this.type=1,this.emitterIndex=0,this.rendererIndex=0}return n(t,[{key:"update",value:function(t,e){this.add(t,e);var i=this.getEmitter(),r=this.getRenderer(),n="";switch(this.type){case 2:n+="emitter:"+this.proton.emitters.length+"
",i&&(n+="em speed:"+i.emitSpeed+"
"),i&&(n+="pos:"+this.getEmitterPos(i));break;case 3:i&&(n+="initializes:"+i.initializes.length+"
"),i&&(n+=""+this.concatArr(i.initializes)+"
"),i&&(n+="behaviours:"+i.behaviours.length+"
"),i&&(n+=""+this.concatArr(i.behaviours)+"
");break;case 4:r&&(n+=r.name+"
"),r&&(n+="body:"+this.getCreatedNumber(r)+"
");break;default:n+="particles:"+this.proton.getCount()+"
",n+="pool:"+this.proton.pool.getCount()+"
",n+="total:"+this.proton.pool.total}this.container.innerHTML=n}},{key:"add",value:function(t,e){var i=this;if(!this.container){this.type=1,this.container=document.createElement("div"),this.container.style.cssText=["position:absolute;bottom:0px;left:0;cursor:pointer;","opacity:0.9;z-index:10000;padding:10px;font-size:12px;","width:120px;height:50px;background-color:#002;color:#0ff;"].join(""),this.container.addEventListener("click",function(t){i.type++,i.type>4&&(i.type=1)},!1);var r=void 0,n=void 0;switch(t){case 2:r="#201",n="#f08";break;case 3:r="#020",n="#0f0";break;default:r="#002",n="#0ff"}this.container.style["background-color"]=r,this.container.style.color=n}this.container.parentNode||(e=e||this.body||document.body).appendChild(this.container)}},{key:"getEmitter",value:function(){return this.proton.emitters[this.emitterIndex]}},{key:"getRenderer",value:function(){return this.proton.renderers[this.rendererIndex]}},{key:"concatArr",value:function(t){var e="";if(!t||!t.length)return e;for(var i=0;i0&&this.emittersUpdate(this.elapsed),this.dispatchEvent(t.PROTON_UPDATE_AFTER)}},{key:"emittersUpdate",value:function(t){for(var e=this.emitters.length;e--;)this.emitters[e].update(t)}},{key:"amendChangeTabsBug",value:function(){this.elapsed>.5&&(this.oldTime=(new Date).getTime(),this.elapsed=0)}},{key:"getCount",value:function(){for(var t=0,e=this.emitters.length;e--;)t+=this.emitters[e].particles.length;return t}},{key:"getAllParticles",value:function(){for(var t=[],e=this.emitters.length;e--;)t=t.concat(this.emitters[e].particles);return t}},{key:"destroy",value:function(){x.destroy(this.renderers,this.getAllParticles()),x.destroy(this.emitters),this.time=0,this.oldTime=0,this.pool.destroy()}}]),t}();R.USE_CLOCK=!1,R.MEASURE=100,R.EULER="euler",R.RK2="runge-kutta2",R.PARTICLE_CREATED="PARTICLE_CREATED",R.PARTICLE_UPDATE="PARTICLE_UPDATE",R.PARTICLE_SLEEP="PARTICLE_SLEEP",R.PARTICLE_DEAD="PARTICLE_DEAD",R.PROTON_UPDATE="PROTON_UPDATE",R.PROTON_UPDATE_AFTER="PROTON_UPDATE_AFTER",R.EMITTER_ADDED="EMITTER_ADDED",R.EMITTER_REMOVED="EMITTER_REMOVED",R.amendChangeTabsBug=!0,R.bindEmtterEvent=!1,A.bind(R);var w={easeLinear:function(t){return t},easeInQuad:function(t){return Math.pow(t,2)},easeOutQuad:function(t){return-(Math.pow(t-1,2)-1)},easeInOutQuad:function(t){return(t/=.5)<1?.5*Math.pow(t,2):-.5*((t-=2)*t-2)},easeInCubic:function(t){return Math.pow(t,3)},easeOutCubic:function(t){return Math.pow(t-1,3)+1},easeInOutCubic:function(t){return(t/=.5)<1?.5*Math.pow(t,3):.5*(Math.pow(t-2,3)+2)},easeInQuart:function(t){return Math.pow(t,4)},easeOutQuart:function(t){return-(Math.pow(t-1,4)-1)},easeInOutQuart:function(t){return(t/=.5)<1?.5*Math.pow(t,4):-.5*((t-=2)*Math.pow(t,3)-2)},easeInSine:function(t){return 1-Math.cos(t*e.PI_2)},easeOutSine:function(t){return Math.sin(t*e.PI_2)},easeInOutSine:function(t){return-.5*(Math.cos(e.PI*t)-1)},easeInExpo:function(t){return 0===t?0:Math.pow(2,10*(t-1))},easeOutExpo:function(t){return 1===t?1:1-Math.pow(2,-10*t)},easeInOutExpo:function(t){return 0===t?0:1===t?1:(t/=.5)<1?.5*Math.pow(2,10*(t-1)):.5*(2-Math.pow(2,-10*--t))},easeInCirc:function(t){return-(Math.sqrt(1-t*t)-1)},easeOutCirc:function(t){return Math.sqrt(1-Math.pow(t-1,2))},easeInOutCirc:function(t){return(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInBack:function(t){return t*t*(2.70158*t-1.70158)},easeOutBack:function(t){return(t-=1)*t*(2.70158*t+1.70158)+1},easeInOutBack:function(t){var e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},getEasing:function(t){return"function"==typeof t?t:this[t]||this.easeLinear}},O=function(){function t(e){r(this,t),this.id="particle_"+t.ID++,this.reset("init"),e&&x.setPrototypeByObject(this,e)}return n(t,[{key:"getDirection",value:function(){return Math.atan2(this.v.x,-this.v.y)*e.N180_PI}},{key:"reset",value:function(t){return this.life=1/0,this.age=0,this.energy=1,this.dead=!1,this.sleep=!1,this.body=null,this.sprite=null,this.parent=null,this.mass=1,this.radius=10,this.alpha=1,this.scale=1,this.rotation=0,this.color=null,this.easing=w.easeLinear,"init"==t?(this.transform={},this.p=new h,this.v=new h,this.a=new h,this.old={p:new h,v:new h,a:new h},this.behaviours=[]):(x.destroyObject(this.transform,"rgb"),this.p.set(0,0),this.v.set(0,0),this.a.set(0,0),this.old.p.set(0,0),this.old.v.set(0,0),this.old.a.set(0,0),this.removeAllBehaviours()),this.transform.rgb?(this.transform.rgb.r=255,this.transform.rgb.g=255,this.transform.rgb.b=255):this.transform.rgb={r:255,g:255,b:255},this}},{key:"update",value:function(t,e){if(this.sleep||(this.age+=t,this.applyBehaviours(t,e)),this.age-1&&(this.behaviours.splice(e,1).parents=null)}},{key:"removeAllBehaviours",value:function(){x.destroyArray(this.behaviours)}},{key:"destroy",value:function(){this.removeAllBehaviours(),this.energy=0,this.dead=!0,this.parent=null}}]),t}();O.ID=0;var C={hexToRGB:function(t){var e="#"==t.charAt(0)?t.substring(1,7):t;return{r:parseInt(e.substring(0,2),16),g:parseInt(e.substring(2,4),16),b:parseInt(e.substring(4,6),16)}},rgbToHex:function(t){return"rgb("+t.r+", "+t.g+", "+t.b+")"},getHex16FromParticle:function(t){return 65536*Number(t.transform.rgb.r)+256*Number(t.transform.rgb.g)+Number(t.transform.rgb.b)}},S=function(){function t(e,i){r(this,t),this.r=Math.abs(e)||0,this.tha=i||0}return n(t,[{key:"set",value:function(t,e){return this.r=t,this.tha=e,this}},{key:"setR",value:function(t){return this.r=t,this}},{key:"setTha",value:function(t){return this.tha=t,this}},{key:"copy",value:function(t){return this.r=t.r,this.tha=t.tha,this}},{key:"toVector",value:function(){return new h(this.getX(),this.getY())}},{key:"getX",value:function(){return this.r*Math.sin(this.tha)}},{key:"getY",value:function(){return-this.r*Math.cos(this.tha)}},{key:"normalize",value:function(){return this.r=1,this}},{key:"equals",value:function(t){return t.r===this.r&&t.tha===this.tha}},{key:"clear",value:function(){return this.r=0,this.tha=0,this}},{key:"clone",value:function(){return new t(this.r,this.tha)}}]),t}(),I={create:function(t){var e=new Float32Array(9);return t&&this.set(t,e),e},set:function(t,e){for(var i=0;i<9;i++)e[i]=t[i];return e},multiply:function(t,e,i){var r=t[0],n=t[1],a=t[2],s=t[3],o=t[4],h=t[6],l=t[7],u=e[0],c=e[1],f=e[2],d=e[3],y=e[4],p=e[6],v=e[7];return i[0]=u*r+c*s,i[1]=u*n+c*o,i[2]=a*f,i[3]=d*r+y*s,i[4]=d*n+y*o,i[6]=p*r+v*s+h,i[7]=p*n+v*o+l,i},inverse:function(t,e){var i,r=t[0],n=t[1],a=t[3],s=t[4],o=t[6],h=t[7],l=s,u=-a,c=h*a-s*o;return i=1/(r*l+n*u),e[0]=l*i,e[1]=-n*i,e[3]=u*i,e[4]=r*i,e[6]=c*i,e[7]=(-h*r+n*o)*i,e},multiplyVec2:function(t,e,i){var r=e[0],n=e[1];return i[0]=r*t[0]+n*t[3]+t[6],i[1]=r*t[1]+n*t[4]+t[7],i}},D=function(t){function i(t){r(this,i);var e=o(this,(i.__proto__||Object.getPrototypeOf(i)).call(this));return e._arr=x.isArray(t)?t:[t],e}return s(i,l),n(i,[{key:"getValue",value:function(){var t=this._arr[Math.floor(this._arr.length*Math.random())];return"random"===t||"Random"===t?e.randomColor():t}}],[{key:"createArraySpan",value:function(t){return t?t instanceof i?t:new i(t):null}}]),i}(),B=function(){function t(e,i,n,a){r(this,t),this.x=e,this.y=i,this.width=n,this.height=a,this.bottom=this.y+this.height,this.right=this.x+this.width}return n(t,[{key:"contains",value:function(t,e){return t<=this.right&&t>=this.x&&e<=this.bottom&&e>=this.y}}]),t}(),V=function(){function t(e,i){r(this,t),this.numPan=x.setSpanValue(x.initValue(e,1)),this.timePan=x.setSpanValue(x.initValue(i,1)),this.startTime=0,this.nextTime=0,this.init()}return n(t,[{key:"init",value:function(){this.startTime=0,this.nextTime=this.timePan.getValue()}},{key:"getValue",value:function(t){return this.startTime+=t,this.startTime>=this.nextTime?(this.startTime=0,this.nextTime=this.timePan.getValue(),1==this.numPan.b?this.numPan.getValue(!1)>.5?1:0:this.numPan.getValue(!0)):0}}]),t}(),M=function(){function t(){r(this,t)}return n(t,[{key:"reset",value:function(){}},{key:"init",value:function(t,e){e?this.initialize(e):this.initialize(t)}},{key:"initialize",value:function(t){}}]),t}(),L=function(t){function e(t,i,n){r(this,e);var a=o(this,(e.__proto__||Object.getPrototypeOf(e)).call(this));return a.lifePan=x.setSpanValue(t,i,n),a.name="Life",a}return s(e,M),n(e,[{key:"initialize",value:function(t){this.lifePan.a==1/0?t.life=1/0:t.life=this.lifePan.getValue()}}]),e}(),U=function(){function t(){r(this,t),this.vector=new h(0,0),this.random=0,this.crossType="dead",this.alert=!0}return n(t,[{key:"getPosition",value:function(){}},{key:"crossing",value:function(t){}}]),t}(),F=function(t){function e(t,i){r(this,e);var n=o(this,(e.__proto__||Object.getPrototypeOf(e)).call(this));return n.x=t,n.y=i,n}return s(e,U),n(e,[{key:"getPosition",value:function(){return this.vector.x=this.x,this.vector.y=this.y,this.vector}},{key:"crossing",value:function(t){this.alert&&(alert("Sorry PointZone does not support crossing method"),this.alert=!1)}}]),e}(),z=function(t){function e(t){r(this,e);var i=o(this,(e.__proto__||Object.getPrototypeOf(e)).call(this));return i.zone=x.initValue(t,new F),i.name="Position",i}return s(e,M),n(e,[{key:"reset",value:function(t){this.zone=x.initValue(t,new F)}},{key:"initialize",value:function(t){this.zone.getPosition(),t.p.x=this.zone.vector.x,t.p.y=this.zone.vector.y}}]),e}(),j=function(t){function i(t,e,n){r(this,i);var a=o(this,(i.__proto__||Object.getPrototypeOf(i)).call(this));return a.rPan=x.setSpanValue(t),a.thaPan=x.setSpanValue(e),a.type=x.initValue(n,"vector"),a.name="Velocity",a}return s(i,M),n(i,[{key:"reset",value:function(t,e,i){this.rPan=x.setSpanValue(t),this.thaPan=x.setSpanValue(e),this.type=x.initValue(i,"vector")}},{key:"normalizeVelocity",value:function(t){return t*R.MEASURE}},{key:"initialize",value:function(t){if("p"==this.type||"P"==this.type||"polar"==this.type){var i=new S(this.normalizeVelocity(this.rPan.getValue()),this.thaPan.getValue()*e.PI_180);t.v.x=i.getX(),t.v.y=i.getY()}else t.v.x=this.normalizeVelocity(this.rPan.getValue()),t.v.y=this.normalizeVelocity(this.thaPan.getValue())}}]),i}(),N=function(t){function e(t,i,n){r(this,e);var a=o(this,(e.__proto__||Object.getPrototypeOf(e)).call(this));return a.massPan=x.setSpanValue(t,i,n),a.name="Mass",a}return s(e,M),n(e,[{key:"initialize",value:function(t){t.mass=this.massPan.getValue()}}]),e}(),H=function(t){function e(t,i,n){r(this,e);var a=o(this,(e.__proto__||Object.getPrototypeOf(e)).call(this));return a.radius=x.setSpanValue(t,i,n),a.name="Radius",a}return s(e,M),n(e,[{key:"reset",value:function(t,e,i){this.radius=x.setSpanValue(t,e,i)}},{key:"initialize",value:function(t){t.radius=this.radius.getValue(),t.transform.oldRadius=t.radius}}]),e}(),q=function(t){function e(t,i,n){r(this,e);var a=o(this,(e.__proto__||Object.getPrototypeOf(e)).call(this));return a.image=a.setSpanValue(t),a.w=x.initValue(i,20),a.h=x.initValue(n,a.w),a.name="Body",a}return s(e,M),n(e,[{key:"initialize",value:function(t){var e=this.image.getValue();t.body="string"==typeof e?{width:this.w,height:this.h,src:e,isInner:!0,inner:!0}:e}},{key:"setSpanValue",value:function(t){return t instanceof D?t:new D(t)}}]),e}(),G=function(){function t(e,i){r(this,t),this.life=x.initValue(e,1/0),this.easing=w.getEasing(i),this.age=0,this.energy=1,this.dead=!1,this.parents=[],this.id="Behaviour_"+t.id++,this.name="Behaviour"}return n(t,[{key:"reset",value:function(t,e){this.life=x.initValue(t,1/0),this.easing=w.getEasing(e)}},{key:"normalizeForce",value:function(t){return t.multiplyScalar(R.MEASURE)}},{key:"normalizeValue",value:function(t){return t*R.MEASURE}},{key:"initialize",value:function(t){}},{key:"calculate",value:function(t,e,i){if(this.age+=e,this.age>=this.life||this.dead)this.energy=0,this.dead=!0,this.destroy();else{var r=this.easing(t.age/t.life);this.energy=Math.max(1-r,0)}}},{key:"destroy",value:function(){for(var t=this.parents.length;t--;)this.parents[t].removeBehaviour(this);this.parents.length=0}}]),t}();G.id=0;var X=function(t){function e(t,i,n,a){r(this,e);var s=o(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,n,a));return s.force=s.normalizeForce(new h(t,i)),s.name="Force",s}return s(e,G),n(e,[{key:"reset",value:function(t,i,r,n){this.force=this.normalizeForce(new h(t,i)),r&&a(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"reset",this).call(this,r,n)}},{key:"applyBehaviour",value:function(t,e,i){this.calculate(t,e,i),t.a.add(this.force)}}]),e}(),Y=function(t){function e(t,i,n,a,s){r(this,e);var l=o(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,a,s));return l.targetPosition=x.initValue(t,new h),l.radius=x.initValue(n,1e3),l.force=x.initValue(l.normalizeValue(i),100),l.radiusSq=l.radius*l.radius,l.attractionForce=new h,l.lengthSq=0,l.name="Attraction",l}return s(e,G),n(e,[{key:"reset",value:function(t,i,r,n,s){this.targetPosition=x.initValue(t,new h),this.radius=x.initValue(r,1e3),this.force=x.initValue(this.normalizeValue(i),100),this.radiusSq=this.radius*this.radius,this.attractionForce=new h,this.lengthSq=0,n&&a(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"reset",this).call(this,n,s)}},{key:"applyBehaviour",value:function(t,e,i){this.calculate(t,e,i),this.attractionForce.copy(this.targetPosition),this.attractionForce.sub(t.p),this.lengthSq=this.attractionForce.lengthSq(),this.lengthSq>4e-6&&this.lengthSq=this.delay&&(t.a.addXY(e.randomAToB(-this.panFoce.x,this.panFoce.x),e.randomAToB(-this.panFoce.y,this.panFoce.y)),this.time=0)}}]),i}(),Z=function(t){function e(t,i,n){r(this,e);var a=o(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,0,t,i,n));return a.name="Gravity",a}return s(e,X),n(e,[{key:"reset",value:function(t,i,r){a(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"reset",this).call(this,0,t,i,r)}}]),e}(),Q=function(t){function e(t,i,n,a,s){r(this,e);var h=o(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,a,s));return h.reset(t,i,n),h.name="Collision",h}return s(e,G),n(e,[{key:"reset",value:function(t,i,r,n,s){this.emitter=x.initValue(t,null),this.mass=x.initValue(i,!0),this.callback=x.initValue(r,null),this.collisionPool=[],this.delta=new h,n&&a(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"reset",this).call(this,n,s)}},{key:"applyBehaviour",value:function(t,e,i){var r=this.emitter?this.emitter.particles.slice(i):this.pool.slice(i),n=r.length,a=void 0,s=void 0,o=void 0,h=void 0,l=void 0,u=void 0,c=void 0;for(c=0;c-1&&this.initializes.splice(e,1)}},{key:"removeAllInitializers",value:function(){x.destroyArray(this.initializes)}},{key:"addBehaviour",value:function(){for(var t=arguments.length,e=Array(t),i=0;i=this.life||this.dead)&&this.destroy(),this.emitting(t),this.integrate(t)}},{key:"integrate",value:function(t){if(this.parent){var e=1-this.damping;this.parent.integrator.calculate(this,t,e);var i=void 0,r=void 0;for(i=this.particles.length-1;i>=0;i--)(r=this.particles[i]).update(t,i),this.parent.integrator.calculate(r,t,e),this.dispatch("PARTICLE_UPDATE",r),r.dead&&(this.dispatch("PARTICLE_DEAD",r),this.parent.pool.expire(r),this.particles.splice(i,1))}}},{key:"dispatch",value:function(t,e){this.parent&&this.parent.dispatchEvent(t,e),Proton.bindEmtterEvent&&this.dispatchEvent(t,e)}},{key:"emitting",value:function(t){if("once"==this.totalEmitTimes){var e=void 0,i=this.rate.getValue(99999);for(i>0&&(this.emitSpeed=i),e=0;e0&&(this.emitSpeed=r),n=0;n-1&&this.selfBehaviours.splice(e,1)}},{key:"update",value:function(t){if(a(e.prototype.__proto__||Object.getPrototypeOf(e.prototype),"update",this).call(this,t),!this.sleep){var i=this.selfBehaviours.length,r=void 0;for(r=0;rthis.element.width||i<0||i>this.elementwidth)){var a=4*((i>>0)*t.width+(e>>0));t.data[a]=n.r,t.data[a+1]=n.g,t.data[a+2]=n.b,t.data[a+3]=255*r.alpha}}},{key:"onParticleDead",value:function(t){}}]),e}(),dt=function(t){function i(t,e){r(this,i);var n=o(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t));return n.stroke=e,n.setColor=!1,n.pool.create=function(t,e){return n.createBody(t,e)},n.name="PixiRenderer",n}return s(i,ht),n(i,[{key:"onProtonUpdate",value:function(){}},{key:"onParticleCreated",value:function(t){t.body?t.body=this.pool.get(t.body,t):t.body=this.pool.get(this.circleConf,t),this.element.addChild(t.body)}},{key:"onParticleUpdate",value:function(t){this.transform(t,t.body),this.setColor&&(t.body.tint=C.getHex16FromParticle(t))}},{key:"onParticleDead",value:function(t){this.element.removeChild(t.body),this.pool.expire(t.body),t.body=null}},{key:"destroy",value:function(t){a(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"destroy",this).call(this),this.pool.destroy();for(var e=t.length;e--;){var r=t[e];r.body&&this.element.removeChild(r.body)}}},{key:"transform",value:function(t,i){i.x=t.p.x,i.y=t.p.y,i.alpha=t.alpha,i.scale.x=t.scale,i.scale.y=t.scale,i.rotation=t.rotation*e.PI_180}},{key:"createBody",value:function(t,e){return t.isCircle?this.createCircle(e):this.createSprite(t)}},{key:"createSprite",value:function(t){var e=t.isInner?PIXI.Sprite.fromImage(t.src):new PIXI.Sprite(t);return e.anchor.x=.5,e.anchor.y=.5,e}},{key:"createCircle",value:function(t){var e=new PIXI.Graphics;if(this.stroke){this.stroke instanceof String&&this.stroke;e.beginStroke(this.stroke)}return e.beginFill(t.color||36077),e.drawCircle(0,0,t.radius),e.endFill(),e}}]),i}(),yt=function(){function t(){r(this,t),this.mats=[],this.size=0;for(var e=0;e<20;e++)this.mats.push(I.create([0,0,0,0,0,0,0,0,0]))}return n(t,[{key:"set",value:function(t,e){0==e?I.set(t,this.mats[0]):I.multiply(this.mats[e-1],t,this.mats[e]),this.size=Math.max(this.size,e+1)}},{key:"push",value:function(t){0==this.size?I.set(t,this.mats[0]):I.multiply(this.mats[this.size-1],t,this.mats[this.size]),this.size++}},{key:"pop",value:function(){this.size>0&&this.size--}},{key:"top",value:function(){return this.mats[this.size-1]}}]),t}(),pt=function(t){function i(t){r(this,i);var e=o(this,(i.__proto__||Object.getPrototypeOf(i)).call(this,t));return e.gl=e.element.getContext("experimental-webgl",{antialias:!0,stencil:!1,depth:!1}),e.gl||alert("Sorry your browser do not suppest WebGL!"),e.initVar(),e.setMaxRadius(),e.initShaders(),e.initBuffers(),e.gl.blendEquation(e.gl.FUNC_ADD),e.gl.blendFunc(e.gl.SRC_ALPHA,e.gl.ONE_MINUS_SRC_ALPHA),e.gl.enable(e.gl.BLEND),e.addImg2Body=e.addImg2Body.bind(e),e.name="WebGLRenderer",e}return s(i,ht),n(i,[{key:"init",value:function(t){a(i.prototype.__proto__||Object.getPrototypeOf(i.prototype),"init",this).call(this,t),this.resize(this.element.width,this.element.height)}},{key:"resize",value:function(t,e){this.umat[4]=-2,this.umat[7]=1,this.smat[0]=1/t,this.smat[4]=1/e,this.mstack.set(this.umat,0),this.mstack.set(this.smat,1),this.gl.viewport(0,0,t,e),this.element.width=t,this.element.height=e}},{key:"setMaxRadius",value:function(t){this.circleCanvasURL=this.createCircle(t)}},{key:"getVertexShader",value:function(){return["uniform vec2 viewport;","attribute vec2 aVertexPosition;","attribute vec2 aTextureCoord;","uniform mat3 tMat;","varying vec2 vTextureCoord;","varying float alpha;","void main() {","vec3 v = tMat * vec3(aVertexPosition, 1.0);","gl_Position = vec4(v.x, v.y, 0, 1);","vTextureCoord = aTextureCoord;","alpha = tMat[0][2];","}"].join("\n")}},{key:"getFragmentShader",value:function(){return["precision mediump float;","varying vec2 vTextureCoord;","varying float alpha;","uniform sampler2D uSampler;","uniform vec4 color;","uniform bool useTexture;","uniform vec3 uColor;","void main() {","vec4 textureColor = texture2D(uSampler, vTextureCoord);","gl_FragColor = textureColor * vec4(uColor, 1.0);","gl_FragColor.w *= alpha;","}"].join("\n")}},{key:"initVar",value:function(){this.mstack=new yt,this.umat=I.create([2,0,1,0,-2,0,-1,1,1]),this.smat=I.create([.01,0,1,0,.01,0,0,0,1]),this.texturebuffers={}}},{key:"blendEquation",value:function(t){this.gl.blendEquation(this.gl[t])}},{key:"blendFunc",value:function(t,e){this.gl.blendFunc(this.gl[t],this.gl[e])}},{key:"getShader",value:function(t,e,i){var r=i?t.createShader(t.FRAGMENT_SHADER):t.createShader(t.VERTEX_SHADER);return t.shaderSource(r,e),t.compileShader(r),t.getShaderParameter(r,t.COMPILE_STATUS)?r:(alert(t.getShaderInfoLog(r)),null)}},{key:"initShaders",value:function(){var t=this.getShader(this.gl,this.getFragmentShader(),!0),e=this.getShader(this.gl,this.getVertexShader(),!1);this.sprogram=this.gl.createProgram(),this.gl.attachShader(this.sprogram,e),this.gl.attachShader(this.sprogram,t),this.gl.linkProgram(this.sprogram),this.gl.getProgramParameter(this.sprogram,this.gl.LINK_STATUS)||alert("Could not initialise shaders"),this.gl.useProgram(this.sprogram),this.sprogram.vpa=this.gl.getAttribLocation(this.sprogram,"aVertexPosition"),this.sprogram.tca=this.gl.getAttribLocation(this.sprogram,"aTextureCoord"),this.gl.enableVertexAttribArray(this.sprogram.tca),this.gl.enableVertexAttribArray(this.sprogram.vpa),this.sprogram.tMatUniform=this.gl.getUniformLocation(this.sprogram,"tMat"),this.sprogram.samplerUniform=this.gl.getUniformLocation(this.sprogram,"uSampler"),this.sprogram.useTex=this.gl.getUniformLocation(this.sprogram,"useTexture"),this.sprogram.color=this.gl.getUniformLocation(this.sprogram,"uColor"),this.gl.uniform1i(this.sprogram.useTex,1)}},{key:"initBuffers",value:function(){var t=void 0;this.unitIBuffer=this.gl.createBuffer(),this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER,this.unitIBuffer),this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER,new Uint16Array([0,3,1,0,2,3]),this.gl.STATIC_DRAW);var e=void 0,i=[];for(e=0;e<100;e++)i.push(e);for(t=new Uint16Array(i),this.unitI33=this.gl.createBuffer(),this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER,this.unitI33),this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER,t,this.gl.STATIC_DRAW),i=[],e=0;e<100;e++)i.push(e,e+1,e+2);t=new Uint16Array(i),this.stripBuffer=this.gl.createBuffer(),this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER,this.stripBuffer),this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER,t,this.gl.STATIC_DRAW)}},{key:"createCircle",value:function(t){this.circleCanvasRadius=u(x.initValue(t,32));var e=p.createCanvas("circle_canvas",2*this.circleCanvasRadius,2*this.circleCanvasRadius),i=e.getContext("2d");return i.beginPath(),i.arc(this.circleCanvasRadius,this.circleCanvasRadius,this.circleCanvasRadius,0,2*Math.PI,!0),i.closePath(),i.fillStyle="#FFF",i.fill(),e.toDataURL()}},{key:"drawImg2Canvas",value:function(t){var e=t.body.width,i=t.body.height,r=u(t.body.width),n=u(t.body.height),a=t.body.width/r,s=t.body.height/n;this.texturebuffers[t.transform.src]||(this.texturebuffers[t.transform.src]=[this.gl.createTexture(),this.gl.createBuffer(),this.gl.createBuffer()]),t.transform.texture=this.texturebuffers[t.transform.src][0],t.transform.vcBuffer=this.texturebuffers[t.transform.src][1],t.transform.tcBuffer=this.texturebuffers[t.transform.src][2],this.gl.bindBuffer(this.gl.ARRAY_BUFFER,t.transform.tcBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array([0,0,a,0,0,s,s,s]),this.gl.STATIC_DRAW),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,t.transform.vcBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array([0,0,e,0,0,i,e,i]),this.gl.STATIC_DRAW);var o=t.transform.canvas.getContext("2d").getImageData(0,0,r,n);this.gl.bindTexture(this.gl.TEXTURE_2D,t.transform.texture),this.gl.texImage2D(this.gl.TEXTURE_2D,0,this.gl.RGBA,this.gl.RGBA,this.gl.UNSIGNED_BYTE,o),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MAG_FILTER,this.gl.LINEAR),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MIN_FILTER,this.gl.LINEAR_MIPMAP_NEAREST),this.gl.generateMipmap(this.gl.TEXTURE_2D),t.transform.textureLoaded=!0,t.transform.textureWidth=e,t.transform.textureHeight=i}},{key:"onProtonUpdate",value:function(){}},{key:"onParticleCreated",value:function(t){t.transform.textureLoaded=!1,t.transform.tmat=I.create(),t.transform.tmat[8]=1,t.transform.imat=I.create(),t.transform.imat[8]=1,t.body?b(t.body,this.addImg2Body,t):(b(this.circleCanvasURL,this.addImg2Body,t),t.transform.oldScale=t.radius/this.circleCanvasRadius)}},{key:"addImg2Body",value:function(t,e){e.dead||(e.body=t,e.transform.src=t.src,e.transform.canvas=_(t),e.transform.oldScale=1,this.drawImg2Canvas(e))}},{key:"onParticleUpdate",value:function(t){t.transform.textureLoaded&&(this.updateMatrix(t),this.gl.uniform3f(this.sprogram.color,t.transform.rgb.r/255,t.transform.rgb.g/255,t.transform.rgb.b/255),this.gl.uniformMatrix3fv(this.sprogram.tMatUniform,!1,this.mstack.top()),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,t.transform.vcBuffer),this.gl.vertexAttribPointer(this.sprogram.vpa,2,this.gl.FLOAT,!1,0,0),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,t.transform.tcBuffer),this.gl.vertexAttribPointer(this.sprogram.tca,2,this.gl.FLOAT,!1,0,0),this.gl.bindTexture(this.gl.TEXTURE_2D,t.transform.texture),this.gl.uniform1i(this.sprogram.samplerUniform,0),this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER,this.unitIBuffer),this.gl.drawElements(this.gl.TRIANGLES,6,this.gl.UNSIGNED_SHORT,0),this.mstack.pop())}},{key:"onParticleDead",value:function(t){}},{key:"updateMatrix",value:function(t){var i=c(-t.transform.textureWidth/2,-t.transform.textureHeight/2),r=c(t.p.x,t.p.y),n=t.rotation*e.PI_180,a=f(n),s=t.scale*t.transform.oldScale,o=d(s,s),h=y(i,o);h=y(h,a),h=y(h,r),I.inverse(h,t.transform.imat),h[2]=t.alpha,this.mstack.push(h)}}]),i}(),vt=function(t){function e(t){r(this,e);var i=o(this,(e.__proto__||Object.getPrototypeOf(e)).call(this,t));return i.name="CustomRenderer",i}return s(e,ht),e}(),gt=function(t){function i(t,e,n,a,s){r(this,i);var h=o(this,(i.__proto__||Object.getPrototypeOf(i)).call(this));return n-t>=0?(h.x1=t,h.y1=e,h.x2=n,h.y2=a):(h.x1=n,h.y1=a,h.x2=t,h.y2=e),h.dx=h.x2-h.x1,h.dy=h.y2-h.y1,h.minx=Math.min(h.x1,h.x2),h.miny=Math.min(h.y1,h.y2),h.maxx=Math.max(h.x1,h.x2),h.maxy=Math.max(h.y1,h.y2),h.dot=h.x2*h.y1-h.x1*h.y2,h.xxyy=h.dx*h.dx+h.dy*h.dy,h.gradient=h.getGradient(),h.length=h.getLength(),h.direction=x.initValue(s,">"),h}return s(i,U),n(i,[{key:"getPosition",value:function(){return this.random=Math.random(),this.vector.x=this.x1+this.random*this.length*Math.cos(this.gradient),this.vector.y=this.y1+this.random*this.length*Math.sin(this.gradient),this.vector}},{key:"getDirection",value:function(t,e){var i=this.dy,r=-this.dx;return(i*t+r*e+this.dot)*(0==r?1:r)>0}},{key:"getDistance",value:function(t,e){return(this.dy*t+-this.dx*e+this.dot)/Math.sqrt(this.xxyy)}},{key:"getSymmetric",value:function(t){var e=t.getGradient(),i=2*(this.getGradient()-e),r=t.x,n=t.y;return t.x=r*Math.cos(i)-n*Math.sin(i),t.y=r*Math.sin(i)+n*Math.cos(i),t}},{key:"getGradient",value:function(){return Math.atan2(this.dy,this.dx)}},{key:"rangeOut",value:function(t){if(Math.abs(this.getGradient())<=e.PI/4){if(t.p.x<=this.maxx&&t.p.x>=this.minx)return!0}else if(t.p.y<=this.maxy&&t.p.y>=this.miny)return!0;return!1}},{key:"getLength",value:function(){return Math.sqrt(this.dx*this.dx+this.dy*this.dy)}},{key:"crossing",value:function(t){if("dead"==this.crossType)if(">"==this.direction||"R"==this.direction||"right"==this.direction||"down"==this.direction){if(!this.rangeOut(t))return;this.getDirection(t.p.x,t.p.y)&&(t.dead=!0)}else{if(!this.rangeOut(t))return;this.getDirection(t.p.x,t.p.y)||(t.dead=!0)}else if("bound"==this.crossType){if(!this.rangeOut(t))return;this.getDistance(t.p.x,t.p.y)<=t.radius&&(0==this.dx?t.v.x*=-1:0==this.dy?t.v.y*=-1:this.getSymmetric(t.v))}else"cross"==this.crossType&&this.alert&&(console.error("Sorry lineZone does not support cross method"),this.alert=!1)}}]),i}(),mt=function(t){function i(t,e,n){r(this,i);var a=o(this,(i.__proto__||Object.getPrototypeOf(i)).call(this));return a.x=t,a.y=e,a.radius=n,a.angle=0,a.center={x:t,y:e},a}return s(i,U),n(i,[{key:"getPosition",value:function(){return this.random=Math.random(),this.angle=e.PIx2*Math.random(),this.vector.x=this.x+this.random*this.radius*Math.cos(this.angle),this.vector.y=this.y+this.random*this.radius*Math.sin(this.angle),this.vector}},{key:"setCenter",value:function(t,e){this.center.x=t,this.center.y=e}},{key:"crossing",value:function(t){var e=t.p.distanceTo(this.center);"dead"==this.crossType?e-t.radius>this.radius&&(t.dead=!0):"bound"==this.crossType?e+t.radius>=this.radius&&this.getSymmetric(t):"cross"==this.crossType&&this.alert&&(alert("Sorry CircleZone does not support cross method"),this.alert=!1)}},{key:"getSymmetric",value:function(t){var e=t.v.getGradient(),i=2*(this.getGradient(t)-e),r=t.v.x,n=t.v.y;t.v.x=r*Math.cos(i)-n*Math.sin(i),t.v.y=r*Math.sin(i)+n*Math.cos(i)}},{key:"getGradient",value:function(t){return-e.PI_2+Math.atan2(t.p.y-this.center.y,t.p.x-this.center.x)}}]),i}(),bt=function(t){function e(t,i,n,a){r(this,e);var s=o(this,(e.__proto__||Object.getPrototypeOf(e)).call(this));return s.x=t,s.y=i,s.width=n,s.height=a,s}return s(e,U),n(e,[{key:"getPosition",value:function(){return this.vector.x=this.x+Math.random()*this.width,this.vector.y=this.y+Math.random()*this.height,this.vector}},{key:"crossing",value:function(t){"dead"==this.crossType?(t.p.x+t.radiusthis.x+this.width&&(t.dead=!0),t.p.y+t.radiusthis.y+this.height&&(t.dead=!0)):"bound"==this.crossType?(t.p.x-t.radiusthis.x+this.width&&(t.p.x=this.x+this.width-t.radius,t.v.x*=-1),t.p.y-t.radiusthis.y+this.height&&(t.p.y=this.y+this.height-t.radius,t.v.y*=-1)):"cross"==this.crossType&&(t.p.x+t.radiusthis.x+this.width&&t.v.x>=0&&(t.p.x=this.x-t.radius),t.p.y+t.radiusthis.y+this.height&&t.v.y>=0&&(t.p.y=this.y-t.radius))}}]),e}(),_t=function(t){function e(t,i,n,a){r(this,e);var s=o(this,(e.__proto__||Object.getPrototypeOf(e)).call(this));return s.reset(t,i,n,a),s}return s(e,U),n(e,[{key:"reset",value:function(t,e,i,r){this.imageData=t,this.x=x.initValue(e,0),this.y=x.initValue(i,0),this.d=x.initValue(r,2),this.vectors=[],this.setVectors()}},{key:"setVectors",value:function(){var t=void 0,e=void 0,i=this.imageData.width,r=this.imageData.height;for(t=0;t>0)*i+(t>>0));this.imageData.data[n+3]>0&&this.vectors.push({x:t+this.x,y:e+this.y})}return this.vector}},{key:"getBound",value:function(t,e){var i=4*((e>>0)*this.imageData.width+(t>>0));return this.imageData.data[i+3]>0}},{key:"getPosition",value:function(){return this.vector.copy(this.vectors[Math.floor(Math.random()*this.vectors.length)])}},{key:"getColor",value:function(t,e){t-=this.x;var i=4*(((e-=this.y)>>0)*this.imageData.width+(t>>0));return{r:this.imageData.data[i],g:this.imageData.data[i+1],b:this.imageData.data[i+2],a:this.imageData.data[i+3]}}},{key:"crossing",value:function(t){"dead"==this.crossType?this.getBound(t.p.x-this.x,t.p.y-this.y)?t.dead=!0:t.dead=!1:"bound"==this.crossType&&(this.getBound(t.p.x-this.x,t.p.y-this.y)||t.v.negate())}}]),e}(),xt={addEventListener:function(t,e){t.addEventListener("PROTON_UPDATE_AFTER",function(){return e()})},getStyle:function(t){var e=C.hexToRGB(t||"#ff0000");return"rgba("+e.r+", "+e.g+", "+e.b+", 0.5)"},drawZone:function(t,e,i,r){var n=e.getContext("2d"),a=this.getStyle();this.addEventListener(t,function(){r&&n.clearRect(0,0,e.width,e.height),i instanceof F?(n.beginPath(),n.fillStyle=a,n.arc(i.x,i.y,10,0,2*Math.PI,!0),n.fill(),n.closePath()):i instanceof gt?(n.beginPath(),n.strokeStyle=a,n.moveTo(i.x1,i.y1),n.lineTo(i.x2,i.y2),n.stroke(),n.closePath()):i instanceof bt?(n.beginPath(),n.strokeStyle=a,n.drawRect(i.x,i.y,i.width,i.height),n.stroke(),n.closePath()):i instanceof mt&&(n.beginPath(),n.strokeStyle=a,n.arc(i.x,i.y,i.radius,0,2*Math.PI,!0),n.stroke(),n.closePath())})},drawEmitter:function(t,e,i,r){var n=e.getContext("2d"),a=this.getStyle();this.addEventListener(t,function(){r&&n.clearRect(0,0,e.width,e.height),n.beginPath(),n.fillStyle=a,n.arc(i.p.x,i.p.y,10,0,2*Math.PI,!0),n.fill(),n.closePath()})}};return function(){for(var t=0,e=["ms","moz","webkit","o"],i=0;i 0)\n return MathUtils.PI_2;\n else if (this.y < 0)\n return -MathUtils.PI_2;\n }\n\n copy(v) {\n this.x = v.x;\n this.y = v.y;\n\n return this;\n }\n\n add(v, w) {\n if (w !== undefined) {\n return this.addVectors(v, w);\n }\n\n this.x += v.x;\n this.y += v.y;\n\n return this;\n }\n\n addXY(a, b) {\n this.x += a;\n this.y += b;\n\n return this;\n }\n\n addVectors(a, b) {\n this.x = a.x + b.x;\n this.y = a.y + b.y;\n\n return this;\n }\n\n sub(v, w) {\n if (w !== undefined) {\n return this.subVectors(v, w);\n }\n\n this.x -= v.x;\n this.y -= v.y;\n\n return this;\n }\n\n subVectors(a, b) {\n this.x = a.x - b.x;\n this.y = a.y - b.y;\n\n return this;\n }\n\n divideScalar(s) {\n if (s !== 0) {\n this.x /= s;\n this.y /= s;\n } else {\n this.set(0, 0);\n }\n\n return this;\n }\n\n multiplyScalar(s) {\n this.x *= s;\n this.y *= s;\n\n return this;\n }\n\n negate() {\n return this.multiplyScalar(-1);\n }\n\n dot(v) {\n return this.x * v.x + this.y * v.y;\n }\n\n lengthSq() {\n return this.x * this.x + this.y * this.y;\n }\n\n length() {\n return Math.sqrt(this.x * this.x + this.y * this.y);\n }\n\n normalize() {\n return this.divideScalar(this.length());\n }\n\n distanceTo(v) {\n return Math.sqrt(this.distanceToSquared(v));\n }\n\n rotate(tha) {\n const x = this.x;\n const y = this.y;\n\n this.x = x * Math.cos(tha) + y * Math.sin(tha);\n this.y = -x * Math.sin(tha) + y * Math.cos(tha);\n\n return this;\n }\n\n distanceToSquared(v) {\n const dx = this.x - v.x;\n const dy = this.y - v.y;\n\n return dx * dx + dy * dy;\n }\n\n lerp(v, alpha) {\n this.x += (v.x - this.x) * alpha;\n this.y += (v.y - this.y) * alpha;\n\n return this;\n }\n\n equals(v) {\n return ((v.x === this.x) && (v.y === this.y));\n }\n\n clear() {\n this.x = 0.0;\n this.y = 0.0;\n return this;\n }\n\n clone() {\n return new Vector2D(this.x, this.y);\n }\n}","import Util from '../utils/Util';\nimport MathUtils from '../math/MathUtils';\n\nexport default class Span {\n\n\tconstructor(a, b, center) {\n\t\tthis.isArray = false;\n\n\t\tif (Util.isArray(a)) {\n\t\t\tthis.isArray = true;\n\t\t\tthis.a = a;\n\t\t} else {\n\t\t\tthis.a = Util.initValue(a, 1);\n\t\t\tthis.b = Util.initValue(b, this.a);\n\t\t\tthis.center = Util.initValue(center, false);\n\t\t}\n\n\t}\n\n\tgetValue(INT) {\n\t\tif (this.isArray) {\n\t\t\treturn this.a[Math.floor(this.a.length * Math.random())];\n\t\t} else {\n\t\t\tif (!this.center)\n\t\t\t\treturn MathUtils.randomAToB(this.a, this.b, INT);\n\t\t\telse\n\t\t\t\treturn MathUtils.randomFloating(this.a, this.b, INT);\n\t\t}\n\t}\n}","export default {\n\n /**\n * @memberof Proton#Proton.WebGLUtil\n * @method ipot\n *\n * @todo add description\n * @todo add length description\n *\n * @param {Number} length\n *\n * @return {Boolean}\n */\n ipot(length) {\n return (length & (length - 1)) == 0;\n },\n\n /**\n * @memberof Proton#Proton.WebGLUtil\n * @method nhpot\n *\n * @todo add description\n * @todo add length description\n *\n * @param {Number} length\n *\n * @return {Number}\n */\n nhpot(length) {\n --length;\n for (let i = 1; i < 32; i <<= 1) {\n length = length | length >> i;\n }\n\n return length + 1;\n },\n\n /**\n * @memberof Proton#Proton.WebGLUtil\n * @method makeTranslation\n *\n * @todo add description\n * @todo add tx, ty description\n * @todo add return description\n *\n * @param {Number} tx either 0 or 1\n * @param {Number} ty either 0 or 1\n *\n * @return {Object}\n */\n makeTranslation(tx, ty) {\n return [1, 0, 0, 0, 1, 0, tx, ty, 1];\n },\n\n /**\n * @memberof Proton#Proton.WebGLUtil\n * @method makeRotation\n *\n * @todo add description\n * @todo add return description\n *\n * @param {Number} angleInRadians\n *\n * @return {Object}\n */\n makeRotation(angleInRadians) {\n let c = Math.cos(angleInRadians);\n let s = Math.sin(angleInRadians);\n\n return [c, -s, 0, s, c, 0, 0, 0, 1];\n },\n\n /**\n * @memberof Proton#Proton.WebGLUtil\n * @method makeScale\n *\n * @todo add description\n * @todo add tx, ty description\n * @todo add return description\n *\n * @param {Number} sx either 0 or 1\n * @param {Number} sy either 0 or 1\n *\n * @return {Object}\n */\n makeScale(sx, sy) {\n return [sx, 0, 0, 0, sy, 0, 0, 0, 1];\n },\n\n /**\n * @memberof Proton#Proton.WebGLUtil\n * @method matrixMultiply\n *\n * @todo add description\n * @todo add a, b description\n * @todo add return description\n *\n * @param {Object} a\n * @param {Object} b\n *\n * @return {Object}\n */\n matrixMultiply(a, b) {\n let a00 = a[0 * 3 + 0];\n let a01 = a[0 * 3 + 1];\n let a02 = a[0 * 3 + 2];\n let a10 = a[1 * 3 + 0];\n let a11 = a[1 * 3 + 1];\n let a12 = a[1 * 3 + 2];\n let a20 = a[2 * 3 + 0];\n let a21 = a[2 * 3 + 1];\n let a22 = a[2 * 3 + 2];\n let b00 = b[0 * 3 + 0];\n let b01 = b[0 * 3 + 1];\n let b02 = b[0 * 3 + 2];\n let b10 = b[1 * 3 + 0];\n let b11 = b[1 * 3 + 1];\n let b12 = b[1 * 3 + 2];\n let b20 = b[2 * 3 + 0];\n let b21 = b[2 * 3 + 1];\n let b22 = b[2 * 3 + 2];\n\n return [\n a00 * b00 + a01 * b10 + a02 * b20,\n a00 * b01 + a01 * b11 + a02 * b21,\n a00 * b02 + a01 * b12 + a02 * b22,\n a10 * b00 + a11 * b10 + a12 * b20,\n a10 * b01 + a11 * b11 + a12 * b21,\n a10 * b02 + a11 * b12 + a12 * b22,\n a20 * b00 + a21 * b10 + a22 * b20,\n a20 * b01 + a21 * b11 + a22 * b21,\n a20 * b02 + a21 * b12 + a22 * b22\n ];\n }\n}","export default {\n\n /**\n * Creates and returns a new canvas. The opacity is by default set to 0\n *\n * @memberof Proton#Proton.DomUtil\n * @method createCanvas\n *\n * @param {String} $id the canvas' id\n * @param {Number} $width the canvas' width\n * @param {Number} $height the canvas' height\n * @param {String} [$position=absolute] the canvas' position, default is 'absolute' \n *\n * @return {Object}\n */\n createCanvas(id, width, height, position) {\n const dom = document.createElement(\"canvas\");\n position = position || 'absolute';\n\n dom.id = id;\n dom.width = width;\n dom.height = height;\n dom.style.opacity = 0;\n dom.style.position = position;\n\n this.transform(dom, -500, -500, 0, 0);\n\n return dom;\n },\n\n createDiv(id, width, height) {\n const dom = document.createElement(\"div\");\n\n dom.id = id;\n dom.style.position = 'absolute';\n this.resize(dom, width, height);\n\n return dom;\n },\n\n resize(dom, width, height) {\n dom.style.width = width + 'px';\n dom.style.height = height + 'px';\n dom.style.marginLeft = -width / 2 + 'px';\n dom.style.marginTop = -height / 2 + 'px';\n },\n\n /**\n * Adds a transform: translate(), scale(), rotate() to a given div dom for all browsers\n *\n * @memberof Proton#Proton.DomUtil\n * @method transform\n *\n * @param {HTMLDivElement} div \n * @param {Number} $x \n * @param {Number} $y \n * @param {Number} $scale \n * @param {Number} $rotate \n */\n transform(div, x, y, scale, rotate) {\n const transform = `translate(${x}px, ${y}px) scale(${scale}) rotate(${rotate}deg)`;\n\n div.style.willChange = 'transform';\n this.css3(div, 'transform', transform);\n },\n\n transform3d(div, x, y, scale, rotate) {\n const transform = `translate3d(${x}px, ${y}px, 0) scale(${scale}) rotate(${rotate}deg)`;\n\n div.style.willChange = 'transform';\n this.css3(div, 'backfaceVisibility', 'hidden');\n this.css3(div, 'transform', transform);\n },\n\n css3(div, key, val) {\n const bkey = key.charAt(0).toUpperCase() + key.substr(1);\n\n div.style[`Webkit${bkey}`] = val;\n div.style[`Moz${bkey}`] = val;\n div.style[`O${bkey}`] = val;\n div.style[`ms${bkey}`] = val;\n div.style[`${key}`] = val;\n }\n}","import WebGLUtil from './WebGLUtil';\nimport DomUtil from './DomUtil';\n\nconst IMG_CACHE = {};\nconst CANVAS_CACHE = {};\nlet canvasID = 0;\n\nexport default {\n\n /**\n * This will get the image data. It could be necessary to create a Proton.Zone.\n *\n * @memberof Proton#Proton.Util\n * @method getImageData\n *\n * @param {HTMLCanvasElement} context any canvas, must be a 2dContext 'canvas.getContext('2d')'\n * @param {Object} image could be any dom image, e.g. document.getElementById('thisIsAnImgTag');\n * @param {Proton.Rectangle} rect\n */\n getImageData(context, image, rect) {\n context.drawImage(image, rect.x, rect.y);\n const imagedata = context.getImageData(rect.x, rect.y, rect.width, rect.height);\n context.clearRect(rect.x, rect.y, rect.width, rect.height);\n\n return imagedata;\n },\n\n /**\n * @memberof Proton#Proton.Util\n * @method getImgFromCache\n *\n * @todo add description\n * @todo describe func\n *\n * @param {Mixed} img\n * @param {Proton.Particle} particle\n * @param {Boolean} drawCanvas set to true if a canvas should be saved into particle.transform.canvas\n * @param {Boolean} func\n */\n getImgFromCache(img, callback, param) {\n const src = typeof (img) == 'string' ? img : img.src;\n\n if (IMG_CACHE[src]) {\n callback(IMG_CACHE[src], param);\n } else {\n const image = new Image();\n image.onload = e => {\n IMG_CACHE[src] = e.target;\n callback(IMG_CACHE[src], param);\n }\n\n image.src = src;\n }\n },\n\n getCanvasFromCache(img, callback, param) {\n const src = img.src;\n\n if (!CANVAS_CACHE[src]) {\n const width = WebGLUtil.nhpot(img.width);\n const height = WebGLUtil.nhpot(img.height);\n\n const canvas = DomUtil.createCanvas(`canvas_cache_${canvasID}`, width, height);\n const context = canvas.getContext('2d');\n context.drawImage(img, 0, 0, img.width, img.height);\n\n CANVAS_CACHE[src] = canvas;\n }\n\n callback && callback(CANVAS_CACHE[src], param);\n\n return CANVAS_CACHE[src];\n }\n}","import Vector2D from '../math/Vector2D';\nimport Span from '../math/Span';\nimport ImgUtil from './ImgUtil';\nimport DomUtil from './DomUtil';\n\nexport default {\n\n /**\n * Returns the default if the value is null or undefined\n *\n * @memberof Proton#Proton.Util\n * @method initValue\n *\n * @param {Mixed} value a specific value, could be everything but null or undefined\n * @param {Mixed} defaults the default if the value is null or undefined\n */\n initValue(value, defaults) {\n value = (value !== null && value !== undefined) ? value : defaults;\n return value;\n },\n\n /**\n * Checks if the value is a valid array\n *\n * @memberof Proton#Proton.Util\n * @method isArray\n *\n * @param {Array} value Any array\n *\n * @returns {Boolean} \n */\n isArray(value) {\n return Object.prototype.toString.call(value) === '[object Array]';\n },\n\n /**\n * Destroyes the given array\n *\n * @memberof Proton#Proton.Util\n * @method destroyArray\n *\n * @param {Array} array Any array\n */\n destroyArray(array) {\n if (array) array.length = 0;\n },\n\n /**\n * Destroyes the given object\n *\n * @memberof Proton#Proton.Util\n * @method destroyObject\n *\n * @param {Object} obj Any object\n */\n destroyObject(obj, ignore) {\n for (let o in obj) {\n if (ignore && ignore.indexOf(o) > -1) continue;\n delete obj[o];\n }\n },\n\n /**\n * Makes an instance of a class and binds the given array\n *\n * @memberof Proton#Proton.Util\n * @method classApply\n *\n * @param {Function} constructor A class to make an instance from\n * @param {Array} [args] Any array to bind it to the constructor\n *\n * @return {Object} The instance of constructor, optionally bind with args\n */\n classApply(constructor, args) {\n if (!args) return new constructor;\n\n args = [null].concat(args);\n const factoryFunction = constructor.bind.apply(constructor, args);\n return new factoryFunction();\n },\n\n /**\n * @memberof Proton#Proton.Util\n * @method setVector2DByObject\n *\n * @todo add description for param `target`\n * @todo add description for param `pOBJ`\n * @todo add description for function\n *\n * @param {Object} target\n * @param {Object} pOBJ\n */\n setVector2DByObject(target, pOBJ) {\n if (this.hasProp(pOBJ, 'x')) target.p.x = pOBJ['x'];\n if (this.hasProp(pOBJ, 'y')) target.p.y = pOBJ['y'];\n\n if (this.hasProp(pOBJ, 'vx')) target.v.x = pOBJ['vx'];\n if (this.hasProp(pOBJ, 'vy')) target.v.y = pOBJ['vy'];\n\n if (this.hasProp(pOBJ, 'ax')) target.a.x = pOBJ['ax'];\n if (this.hasProp(pOBJ, 'ay')) target.a.y = pOBJ['ay'];\n\n if (this.hasProp(pOBJ, 'p')) particle.p.copy(pOBJ['p']);\n if (this.hasProp(pOBJ, 'v')) particle.v.copy(pOBJ['v']);\n if (this.hasProp(pOBJ, 'a')) particle.a.copy(pOBJ['a']);\n\n if (this.hasProp(pOBJ, 'position')) particle.p.copy(pOBJ['position']);\n if (this.hasProp(pOBJ, 'velocity')) particle.v.copy(pOBJ['velocity']);\n if (this.hasProp(pOBJ, 'accelerate')) particle.a.copy(pOBJ['accelerate']);\n },\n\n hasProp(obj, key) {\n if (!obj) return false;\n return obj[key] !== undefined;\n // return obj.hasOwnProperty(key);\n },\n\n /**\n * set the prototype in a given prototypeObject\n *\n * @memberof Proton#Proton.Util\n * @method setPrototypeByObject\n *\n * @todo add description for param `target`\n * @todo add description for param `filters`\n * @todo translate desription from chinese to english\n *\n * @param {Object} target\n * @param {Object} prototypeObject An object of single prototypes\n * @param {Object} filters\n *\n * @return {Object} target\n */\n setPrototypeByObject(target, prototypeObject, filters) {\n for (let singleProp in prototypeObject) {\n if (target.hasOwnProperty(singleProp)) {\n if (filters) {\n if (filters.indexOf(singleProp) < 0)\n target[singleProp] = this.getSpanValue(prototypeObject[singleProp]);\n } else {\n target[singleProp] = this.getSpanValue(prototypeObject[singleProp]);\n }\n }\n }\n\n return target;\n },\n\n /**\n * Returns a new Span object\n *\n * @memberof Proton#Proton.Util\n * @method setSpanValue\n *\n * @todo a, b and c should be 'Mixed' or 'Number'?\n *\n * @param {Mixed | Span} a\n * @param {Mixed} b\n * @param {Mixed} c\n *\n * @return {Span}\n */\n setSpanValue(a, b, c) {\n if (a instanceof Span) {\n return a;\n } else {\n if (!b) {\n return new Span(a);\n } else {\n if (!c)\n return new Span(a, b);\n else\n return new Span(a, b, c);\n }\n }\n },\n\n /**\n * Returns the value from a Span, if the param is not a Span it will return the given parameter\n *\n * @memberof Proton#Proton.Util\n * @method getSpanValue\n *\n * @param {Mixed | Span} pan\n *\n * @return {Mixed} the value of Span OR the parameter if it is not a Span\n */\n getSpanValue(pan) {\n return pan instanceof Span ? pan.getValue() : pan;\n },\n\n /**\n * This will get the image data. It could be necessary to create a Proton.Zone.\n *\n * @memberof Proton#Proton.Util\n * @method getImageData\n *\n * @param {HTMLCanvasElement} context any canvas, must be a 2dContext 'canvas.getContext('2d')'\n * @param {Object} image could be any dom image, e.g. document.getElementById('thisIsAnImgTag');\n * @param {Proton.Rectangle} rect\n */\n getImageData(context, image, rect) {\n return ImgUtil.getImageData(context, image, rect);\n },\n\n destroy(arr, param) {\n let i = arr.length;\n\n while (i--) {\n try { arr[i].destroy(param); } catch (e) { }\n delete arr[i];\n }\n\n arr.length = 0;\n }\n\n}","export default {\n id: 0,\n cache: {},\n\n getID(target) {\n let uid = this.getCacheID(target);\n if (uid) return uid;\n\n uid = `PUID_${this.id++}`;\n this.cache[uid] = target;\n\n return uid;\n },\n\n getCacheID(target) {\n let obj;\n for (let id in this.cache) {\n obj = this.cache[id];\n\n if (obj === target) return id;\n \n if (typeof obj === 'object' && typeof target === 'object' && obj.isInner && target.isInner) {\n if (obj.src === target.src)\n return id;\n }\n }\n\n return null;\n },\n\n getTarget(uid) {\n return this.cache[uid];\n }\n}","/**\n * get -> PUID :: uid-> Body\n * -> cache[abc]. -> cache[abc] .pop()\n * -> create [new Body| clone]\n * -> return p1: { __pid: abc }\n * \n * expire -> cache[abc]= [p0, p1];\n * \n */\nimport Util from '../utils/Util';\nimport PUID from '../utils/PUID';\n\nexport default class Pool {\n\n /**\n * @memberof! Proton#\n * @constructor\n * @alias Proton.Pool\n *\n * @todo add description\n * @todo add description of properties\n *\n * @property {Number} total\n * @property {Object} cache\n */\n constructor(num) {\n this.total = 0;\n this.cache = {};\n }\n\n /**\n * @todo add description\n *\n * @method get\n * @memberof Proton#Proton.Pool\n *\n * @param {Object|Function} target\n * @param {Object} [params] just add if `target` is a function\n *\n * @return {Object}\n */\n get(target, params, uid) {\n let p;\n uid = uid || target.__puid || PUID.getID(target);\n\n if (this.cache[uid] && this.cache[uid].length > 0)\n p = this.cache[uid].pop();\n else\n p = this.createOrClone(target, params);\n\n p.__puid = target.__puid || uid;\n return p;\n }\n\n /**\n * @todo add description\n *\n * @method set\n * @memberof Proton#Proton.Pool\n *\n * @param {Object} target\n *\n * @return {Object}\n */\n expire(target) {\n return this.getCache(target.__puid).push(target);\n }\n\n /**\n * Creates a new class instance\n *\n * @todo add more documentation \n *\n * @method create\n * @memberof Proton#Proton.Pool\n *\n * @param {Object|Function} target any Object or Function\n * @param {Object} [params] just add if `target` is a function\n *\n * @return {Object}\n */\n createOrClone(target, params) {\n this.total++;\n\n if (this.create) {\n return this.create(target, params);\n } else if (typeof target == \"function\") {\n return Util.classApply(target, params);\n } else {\n return target.clone();\n }\n }\n\n /**\n * @todo add description - what is in the cache?\n *\n * @method getCount\n * @memberof Proton#Proton.Pool\n *\n * @return {Number}\n */\n getCount() {\n let count = 0;\n\n for (let id in this.cache)\n count += this.cache[id].length;\n\n return count++;;\n }\n\n /**\n * Destroyes all items from Pool.cache\n *\n * @method destroy\n * @memberof Proton#Proton.Pool\n */\n destroy() {\n for (let id in this.cache) {\n this.cache[id].length = 0;\n delete this.cache[id];\n }\n }\n\n /**\n * Returns Pool.cache\n *\n * @method getCache\n * @memberof Proton#Proton.Pool\n * @private\n *\n * @param {Number} uid the unique id\n *\n * @return {Object}\n */\n getCache(uid) {\n uid = uid || \"default\";\n\n if (!this.cache[uid]) this.cache[uid] = [];\n return this.cache[uid];\n }\n}","export default class Stats {\n\n constructor(proton) {\n this.proton = proton;\n this.container = null;\n this.type = 1;\n\n this.emitterIndex = 0;\n this.rendererIndex = 0;\n }\n\n update(style, body) {\n this.add(style, body);\n\n const emitter = this.getEmitter();\n const renderer = this.getRenderer();\n let str = \"\";\n\n switch (this.type) {\n case 2:\n str += \"emitter:\" + this.proton.emitters.length + \"
\";\n if (emitter) str += \"em speed:\" + emitter.emitSpeed + \"
\";\n if (emitter) str += \"pos:\" + this.getEmitterPos(emitter);\n break;\n\n case 3:\n if (emitter) str += \"initializes:\" + emitter.initializes.length + \"
\";\n if (emitter) str += \"\" + this.concatArr(emitter.initializes) + \"
\";\n if (emitter) str += \"behaviours:\" + emitter.behaviours.length + \"
\";\n if (emitter) str += \"\" + this.concatArr(emitter.behaviours) + \"
\";\n break;\n\n case 4:\n if (renderer) str += renderer.name + \"
\";\n if (renderer) str += \"body:\" + this.getCreatedNumber(renderer) + \"
\";\n break;\n\n default:\n str += \"particles:\" + this.proton.getCount() + \"
\";\n str += \"pool:\" + this.proton.pool.getCount() + \"
\";\n str += \"total:\" + this.proton.pool.total;\n }\n\n this.container.innerHTML = str;\n }\n\n add(style, body) {\n if (!this.container) {\n this.type = 1;\n\n this.container = document.createElement('div');\n this.container.style.cssText = [\n 'position:absolute;bottom:0px;left:0;cursor:pointer;',\n 'opacity:0.9;z-index:10000;padding:10px;font-size:12px;',\n 'width:120px;height:50px;background-color:#002;color:#0ff;'\n ].join('');\n\n this.container.addEventListener('click', e => {\n this.type++;\n if (this.type > 4) this.type = 1;\n }, false);\n\n let bg, color;\n switch (style) {\n case 2:\n bg = \"#201\";\n color = \"#f08\";\n break;\n\n case 3:\n bg = \"#020\";\n color = \"#0f0\";\n break;\n\n default:\n bg = \"#002\";\n color = \"#0ff\";\n }\n\n this.container.style[\"background-color\"] = bg;\n this.container.style[\"color\"] = color;\n }\n\n if (!this.container.parentNode) {\n body = body || this.body || document.body;\n body.appendChild(this.container);\n }\n }\n\n getEmitter() {\n return this.proton.emitters[this.emitterIndex];\n }\n\n getRenderer() {\n return this.proton.renderers[this.rendererIndex];\n }\n\n concatArr(arr) {\n let result = '';\n if (!arr || !arr.length) return result;\n\n for (let i = 0; i < arr.length; i++) {\n result += (arr[i].name || '').substr(0, 1) + '.';\n }\n\n return result;\n }\n\n getCreatedNumber(renderer) {\n return renderer.pool.total || (renderer.cpool && renderer.cpool.total) || 0;\n }\n\n getEmitterPos(e) {\n return Math.round(e.p.x) + \",\" + Math.round(e.p.y);\n }\n}","/*\n * EventDispatcher\n * This code reference since http://createjs.com/.\n *\n **/\n\nexport default class EventDispatcher {\n\n constructor() {\n this._listeners = null;\n }\n\n static bind(TargetClass){\n TargetClass.prototype.dispatchEvent = EventDispatcher.prototype.dispatchEvent;\n TargetClass.prototype.hasEventListener = EventDispatcher.prototype.hasEventListener;\n TargetClass.prototype.addEventListener = EventDispatcher.prototype.addEventListener;\n TargetClass.prototype.removeEventListener = EventDispatcher.prototype.removeEventListener;\n TargetClass.prototype.removeAllEventListeners = EventDispatcher.prototype.removeAllEventListeners;\n }\n\n addEventListener(type, listener) {\n if (!this._listeners) {\n this._listeners = {};\n } else {\n this.removeEventListener(type, listener);\n }\n\n if (!this._listeners[type]) this._listeners[type] = [];\n this._listeners[type].push(listener);\n\n return listener;\n }\n\n removeEventListener(type, listener) {\n if (!this._listeners) return;\n if (!this._listeners[type]) return;\n\n const arr = this._listeners[type];\n const length = arr.length;\n\n for (let i = 0;i < length; i++) {\n if (arr[i] == listener) {\n if (length == 1) {\n delete (this._listeners[type]);\n }\n\n // allows for faster checks.\n else {\n arr.splice(i, 1);\n }\n\n break;\n }\n }\n }\n\n removeAllEventListeners(type) {\n if (!type)\n this._listeners = null;\n else if (this._listeners)\n delete (this._listeners[type]);\n }\n\n dispatchEvent(type, args) {\n let result = false;\n const listeners = this._listeners;\n\n if (type && listeners) {\n let arr = listeners[type];\n if (!arr) return result;\n\n //arr = arr.slice();\n // to avoid issues with items being removed or added during the dispatch\n\n let handler;\n let i = arr.length;\n while (i--) {\n handler = arr[i];\n result = result || handler(args);\n }\n\n }\n\n return !!result;\n }\n\n hasEventListener(type) {\n const listeners = this._listeners;\n return !!(listeners && listeners[type]);\n }\n\n}","import Util from '../utils/Util';\n\nexport default class Integration {\n\n\tconstructor(type) {\n\t\tthis.type = type;\n\t}\n\n\tcalculate(particles, time, damping) {\n\t\tthis.eulerIntegrate(particles, time, damping);\n\t}\n\n\t// Euler Integrate\n\teulerIntegrate(particle, time, damping) {\n\t\tif (!particle.sleep) {\n\t\t\tparticle.old.p.copy(particle.p);\n\t\t\tparticle.old.v.copy(particle.v);\n\n\t\t\tparticle.a.multiplyScalar(1 / particle.mass);\n\t\t\tparticle.v.add(particle.a.multiplyScalar(time));\n\t\t\tparticle.p.add(particle.old.v.multiplyScalar(time));\n\n\t\t\tif (damping) particle.v.multiplyScalar(damping);\n\n\t\t\tparticle.a.clear();\n\t\t}\n\t}\n}","import Pool from './Pool';\nimport Util from '../utils/Util';\nimport Stats from '../debug/Stats';\nimport EventDispatcher from '../events/EventDispatcher';\nimport Integration from '../math/Integration';\n\nexport default class Proton {\n\n static USE_CLOCK = false;\n\n //1:100\n static MEASURE = 100;\n static EULER = 'euler';\n static RK2 = 'runge-kutta2';\n\n static PARTICLE_CREATED = 'PARTICLE_CREATED';\n static PARTICLE_UPDATE = 'PARTICLE_UPDATE';\n static PARTICLE_SLEEP = 'PARTICLE_SLEEP';\n static PARTICLE_DEAD = 'PARTICLE_DEAD';\n static PROTON_UPDATE = 'PROTON_UPDATE';\n static PROTON_UPDATE_AFTER = 'PROTON_UPDATE_AFTER';\n static EMITTER_ADDED = 'EMITTER_ADDED';\n static EMITTER_REMOVED = 'EMITTER_REMOVED';\n\n static amendChangeTabsBug = true;\n static bindEmtterEvent = false;\n\n /**\n * The constructor to add emitters\n *\n * @constructor Proton\n *\n * @todo proParticleCount is not in use\n * @todo add more documentation of the single properties and parameters\n *\n * @param {Number} [proParticleCount] not in use?\n * @param {Number} [integrationType=Proton.EULER]\n *\n * @property {String} [integrationType=Proton.EULER]\n * @property {Array} emitters All added emitter\n * @property {Array} renderers All added renderer\n * @property {Number} time The active time\n * @property {Number} oldtime The old time\n */\n constructor(integrationType) {\n\n this.emitters = [];\n this.renderers = [];\n\n this.time = 0;\n this.oldTime = 0;\n this.elapsed = 0;\n\n this.stats = new Stats(this);\n this.pool = new Pool(80);\n\n this.integrationType = Util.initValue(integrationType, Proton.EULER);\n this.integrator = new Integration(this.integrationType);\n }\n\n /**\n * add a type of Renderer\n *\n * @method addRenderer\n * @memberof Proton\n * @instance\n *\n * @param {Renderer} render\n */\n addRenderer(render) {\n render.init(this);\n this.renderers.push(render);\n }\n\n /**\n * @name add a type of Renderer\n *\n * @method addRenderer\n * @param {Renderer} render\n */\n removeRenderer(render) {\n const index = this.renderers.indexOf(render);\n this.renderers.splice(index, 1);\n render.remove(this);\n }\n\n /**\n * add the Emitter\n *\n * @method addEmitter\n * @memberof Proton\n * @instance\n *\n * @param {Emitter} emitter\n */\n addEmitter(emitter) {\n this.emitters.push(emitter);\n emitter.parent = this;\n\n this.dispatchEvent(Proton.EMITTER_ADDED, emitter);\n }\n\n /**\n * Removes an Emitter\n *\n * @method removeEmitter\n * @memberof Proton\n * @instance\n *\n * @param {Proton.Emitter} emitter\n */\n removeEmitter(emitter) {\n const index = this.emitters.indexOf(emitter);\n this.emitters.splice(index, 1);\n emitter.parent = null;\n\n this.dispatchEvent(Proton.EMITTER_REMOVED, emitter);\n }\n\n /**\n * Updates all added emitters\n *\n * @method update\n * @memberof Proton\n * @instance\n */\n update() {\n this.dispatchEvent(Proton.PROTON_UPDATE);\n\n if (Proton.USE_CLOCK) {\n if (!this.oldTime) this.oldTime = (new Date()).getTime();\n\n let time = new Date().getTime();\n this.elapsed = (time - this.oldTime) / 1000;\n Proton.amendChangeTabsBug && this.amendChangeTabsBug();\n\n this.oldTime = time;\n } else {\n this.elapsed = 0.0167;\n }\n\n // emitter update\n if (this.elapsed > 0) this.emittersUpdate(this.elapsed);\n\n this.dispatchEvent(Proton.PROTON_UPDATE_AFTER);\n }\n\n emittersUpdate(elapsed) {\n let i = this.emitters.length;\n while (i--) this.emitters[i].update(elapsed);\n }\n\n /**\n * @todo add description\n *\n * @method amendChangeTabsBug\n * @memberof Proton\n * @instance\n */\n amendChangeTabsBug() {\n if (this.elapsed > .5) {\n this.oldTime = (new Date()).getTime();\n this.elapsed = 0;\n }\n }\n\n /**\n * Counts all particles from all emitters\n *\n * @method getCount\n * @memberof Proton\n * @instance\n */\n getCount() {\n let total = 0;\n let i = this.emitters.length;\n\n while (i--) total += this.emitters[i].particles.length;\n return total;\n }\n\n getAllParticles() {\n let particles = [];\n let i = this.emitters.length;\n\n while (i--) particles = particles.concat(this.emitters[i].particles);\n return particles;\n }\n\n /**\n * Destroys everything related to this Proton instance. This includes all emitters, and all properties\n *\n * @method destroy\n * @memberof Proton\n * @instance\n */\n destroy() {\n Util.destroy(this.renderers, this.getAllParticles());\n Util.destroy(this.emitters);\n\n this.time = 0;\n this.oldTime = 0;\n\n this.pool.destroy();\n }\n}\n\nEventDispatcher.bind(Proton);","import MathUtils from './MathUtils';\n\nexport default {\n\n easeLinear(value) {\n return value;\n },\n\n easeInQuad(value) {\n return Math.pow(value, 2);\n },\n\n easeOutQuad(value) {\n return -(Math.pow((value - 1), 2) - 1);\n },\n\n easeInOutQuad(value) {\n if ((value /= 0.5) < 1)\n return 0.5 * Math.pow(value, 2);\n\n return -0.5 * ((value -= 2) * value - 2);\n },\n\n easeInCubic(value) {\n return Math.pow(value, 3);\n },\n\n easeOutCubic(value) {\n return (Math.pow((value - 1), 3) + 1);\n },\n\n easeInOutCubic(value) {\n if ((value /= 0.5) < 1)\n return 0.5 * Math.pow(value, 3);\n\n return 0.5 * (Math.pow((value - 2), 3) + 2);\n },\n\n easeInQuart(value) {\n return Math.pow(value, 4);\n },\n\n easeOutQuart(value) {\n return -(Math.pow((value - 1), 4) - 1);\n },\n\n easeInOutQuart(value) {\n if ((value /= 0.5) < 1)\n return 0.5 * Math.pow(value, 4);\n\n return -0.5 * ((value -= 2) * Math.pow(value, 3) - 2);\n },\n\n easeInSine(value) {\n return -Math.cos(value * (MathUtils.PI_2)) + 1;\n },\n\n easeOutSine(value) {\n return Math.sin(value * (MathUtils.PI_2));\n },\n\n easeInOutSine(value) {\n return (-0.5 * (Math.cos(MathUtils.PI * value) - 1));\n },\n\n easeInExpo(value) {\n return (value === 0) ? 0 : Math.pow(2, 10 * (value - 1));\n },\n\n easeOutExpo(value) {\n return (value === 1) ? 1 : -Math.pow(2, -10 * value) + 1;\n },\n\n easeInOutExpo(value) {\n if (value === 0)\n return 0;\n\n if (value === 1)\n return 1;\n\n if ((value /= 0.5) < 1)\n return 0.5 * Math.pow(2, 10 * (value - 1));\n\n return 0.5 * (-Math.pow(2, -10 * --value) + 2);\n },\n\n easeInCirc(value) {\n return -(Math.sqrt(1 - (value * value)) - 1);\n },\n\n easeOutCirc(value) {\n return Math.sqrt(1 - Math.pow((value - 1), 2));\n },\n\n easeInOutCirc(value) {\n if ((value /= 0.5) < 1)\n return -0.5 * (Math.sqrt(1 - value * value) - 1);\n return 0.5 * (Math.sqrt(1 - (value -= 2) * value) + 1);\n },\n\n easeInBack(value) {\n let s = 1.70158;\n return (value) * value * ((s + 1) * value - s);\n },\n\n easeOutBack(value) {\n let s = 1.70158;\n return (value = value - 1) * value * ((s + 1) * value + s) + 1;\n },\n\n easeInOutBack(value) {\n let s = 1.70158;\n if ((value /= 0.5) < 1)\n return 0.5 * (value * value * (((s *= (1.525)) + 1) * value - s));\n return 0.5 * ((value -= 2) * value * (((s *= (1.525)) + 1) * value + s) + 2);\n },\n\n getEasing(ease) {\n if (typeof ease === 'function')\n return ease;\n else\n return this[ease] || this.easeLinear;\n }\n};","import Util from '../utils/Util';\nimport ease from '../math/ease';\nimport Vector2D from '../math/Vector2D';\nimport MathUtils from '../math/MathUtils';\n\nexport default class Particle {\n\n static ID = 0;\n\n /**\n * the Particle class\n *\n * @class Proton.Particle\n * @constructor\n * @param {Object} pObj the parameters object;\n * for example {life:3,dead:false}\n */\n constructor(pOBJ) {\n /**\n * The particle's id;\n * @property id\n * @type {string}\n */\n this.id = `particle_${Particle.ID++}`;\n this.reset('init');\n\n pOBJ && Util.setPrototypeByObject(this, pOBJ);\n }\n\n getDirection() {\n return Math.atan2(this.v.x, -this.v.y) * MathUtils.N180_PI;\n }\n\n reset(init) {\n this.life = Infinity;\n this.age = 0;\n\n //Energy loss\n this.energy = 1;\n this.dead = false;\n this.sleep = false;\n this.body = null;\n this.sprite = null;\n this.parent = null;\n\n this.mass = 1;\n this.radius = 10;\n this.alpha = 1;\n this.scale = 1;\n this.rotation = 0;\n this.color = null;\n\n this.easing = ease.easeLinear;\n\n if (init == 'init') {\n this.transform = {};\n this.p = new Vector2D();\n this.v = new Vector2D();\n this.a = new Vector2D();\n\n this.old = {\n p: new Vector2D(),\n v: new Vector2D(),\n a: new Vector2D()\n };\n\n this.behaviours = [];\n } else {\n Util.destroyObject(this.transform, 'rgb');\n\n this.p.set(0, 0);\n this.v.set(0, 0);\n this.a.set(0, 0);\n\n this.old.p.set(0, 0);\n this.old.v.set(0, 0);\n this.old.a.set(0, 0);\n\n this.removeAllBehaviours();\n }\n\n if (!this.transform.rgb) {\n this.transform.rgb = { r: 255, g: 255, b: 255 };\n } else {\n this.transform.rgb.r = 255;\n this.transform.rgb.g = 255;\n this.transform.rgb.b = 255;\n }\n\n return this;\n }\n\n update(time, index) {\n if (!this.sleep) {\n this.age += time;\n this.applyBehaviours(time, index);\n }\n\n if (this.age < this.life) {\n const scale = this.easing(this.age / this.life);\n this.energy = Math.max(1 - scale, 0);\n } else {\n this.destroy();\n }\n }\n\n applyBehaviours(time, index) {\n const length = this.behaviours.length;\n let i;\n\n for (i = 0; i < length; i++) {\n this.behaviours[i] && this.behaviours[i].applyBehaviour(this, time, index)\n }\n }\n\n addBehaviour(behaviour) {\n this.behaviours.push(behaviour);\n\n if (behaviour.hasOwnProperty('parents')) behaviour.parents.push(this);\n behaviour.initialize(this);\n }\n\n addBehaviours(behaviours) {\n const length = behaviours.length;\n let i;\n\n for (i = 0; i < length; i++) {\n this.addBehaviour(behaviours[i]);\n }\n }\n\n removeBehaviour(behaviour) {\n const index = this.behaviours.indexOf(behaviour);\n\n if (index > -1) {\n const behaviour = this.behaviours.splice(index, 1);\n behaviour.parents = null;\n }\n }\n\n removeAllBehaviours() {\n Util.destroyArray(this.behaviours);\n }\n\n /**\n * Destory this particle\n * @method destroy\n */\n destroy() {\n this.removeAllBehaviours();\n this.energy = 0;\n this.dead = true;\n this.parent = null;\n }\n\n}","export default {\n\n /**\n * @typedef {Object} rgbObject\n * @property {Number} r red value\n * @property {Number} g green value\n * @property {Number} b blue value\n */\n /**\n * converts a hex value to a rgb object\n *\n * @memberof Proton#Proton.Util\n * @method hexToRGB\n *\n * @param {String} h any hex value, e.g. #000000 or 000000 for black\n *\n * @return {rgbObject}\n */\n hexToRGB(h) {\n const hex16 = (h.charAt(0) == \"#\") ? h.substring(1, 7) : h;\n const r = parseInt(hex16.substring(0, 2), 16);\n const g = parseInt(hex16.substring(2, 4), 16);\n const b = parseInt(hex16.substring(4, 6), 16);\n\n return { r, g, b };\n },\n\n /**\n * converts a rgb value to a rgb string\n *\n * @memberof Proton#Proton.Util\n * @method rgbToHex\n *\n * @param {Object | Proton.hexToRGB} rgb a rgb object like in {@link Proton#Proton.}\n *\n * @return {String} rgb()\n */\n rgbToHex(rbg) {\n return `rgb(${rbg.r}, ${rbg.g}, ${rbg.b})`;\n },\n\n getHex16FromParticle(p) {\n return Number(p.transform.rgb.r) * 65536 + Number(p.transform.rgb.g) * 256 + Number(p.transform.rgb.b);\n }\n}","import Vector2D from './Vector2D';\n\nexport default class Polar2D {\n\n\tconstructor(r, tha) {\n\t\tthis.r = Math.abs(r) || 0;\n\t\tthis.tha = tha || 0;\n\t}\n\n\tset(r, tha) {\n\t\tthis.r = r;\n\t\tthis.tha = tha;\n\t\treturn this;\n\t}\n\n\tsetR(r) {\n\t\tthis.r = r;\n\t\treturn this;\n\t}\n\n\tsetTha(tha) {\n\t\tthis.tha = tha;\n\t\treturn this;\n\t}\n\n\tcopy(p) {\n\t\tthis.r = p.r;\n\t\tthis.tha = p.tha;\n\t\treturn this;\n\t}\n\n\ttoVector() {\n\t\treturn new Vector2D(this.getX(), this.getY());\n\t}\n\n\tgetX() {\n\t\treturn this.r * Math.sin(this.tha);\n\t}\n\n\tgetY() {\n\t\treturn -this.r * Math.cos(this.tha);\n\t}\n\n\tnormalize() {\n\t\tthis.r = 1;\n\t\treturn this;\n\t}\n\n\tequals(v) {\n\t\treturn ((v.r === this.r) && (v.tha === this.tha));\n\t}\n\n\tclear() {\n\t\tthis.r = 0.0;\n\t\tthis.tha = 0.0;\n\t\treturn this;\n\t}\n\n\tclone() {\n\t\treturn new Polar2D(this.r, this.tha);\n\t}\n}","export default {\n\tcreate(mat3) {\n\t\tconst mat = new Float32Array(9);\n\t\tif (mat3) this.set(mat3, mat);\n\n\t\treturn mat;\n\t},\n\n\tset(mat1, mat2) {\n\t\tfor (let i = 0; i < 9; i++)\n\t\t\tmat2[i] = mat1[i];\n\n\t\treturn mat2;\n\t},\n\n\tmultiply(mat, mat2, mat3) {\n\t\tlet a00 = mat[0], a01 = mat[1], a02 = mat[2], a10 = mat[3], a11 = mat[4], a20 = mat[6], a21 = mat[7], b00 = mat2[0], b01 = mat2[1], b02 = mat2[2], b10 = mat2[3], b11 = mat2[4], b20 = mat2[6], b21 = mat2[7];\n\n\t\tmat3[0] = b00 * a00 + b01 * a10;\n\t\tmat3[1] = b00 * a01 + b01 * a11;\n\t\tmat3[2] = a02 * b02;\n\t\tmat3[3] = b10 * a00 + b11 * a10;\n\t\tmat3[4] = b10 * a01 + b11 * a11;\n\t\tmat3[6] = b20 * a00 + b21 * a10 + a20;\n\t\tmat3[7] = b20 * a01 + b21 * a11 + a21;\n\n\t\treturn mat3;\n\t},\n\n\tinverse(mat, mat3) {\n\t\tlet a00 = mat[0], a01 = mat[1], a10 = mat[3], a11 = mat[4], a20 = mat[6], a21 = mat[7], b01 = a11, b11 = -a10, b21 = a21 * a10 - a11 * a20, d = a00 * b01 + a01 * b11, id;\n\n\t\tid = 1 / d;\n\t\tmat3[0] = b01 * id;\n\t\tmat3[1] = (-a01) * id;\n\t\tmat3[3] = b11 * id;\n\t\tmat3[4] = a00 * id;\n\t\tmat3[6] = b21 * id;\n\t\tmat3[7] = (-a21 * a00 + a01 * a20) * id;\n\n\t\treturn mat3;\n\t},\n\n\tmultiplyVec2(m, vec, mat3) {\n\t\tlet x = vec[0], y = vec[1];\n\n\t\tmat3[0] = x * m[0] + y * m[3] + m[6];\n\t\tmat3[1] = x * m[1] + y * m[4] + m[7];\n\n\t\treturn mat3;\n\t}\n}","import Span from './Span';\nimport Util from '../utils/Util';\nimport MathUtils from './MathUtils';\n\nexport default class ArraySpan extends Span {\n\n constructor(color) {\n super();\n this._arr = Util.isArray(color) ? color : [color];\n }\n\n getValue() {\n const color = this._arr[Math.floor(this._arr.length * Math.random())];\n return color === 'random' || color === 'Random' ? MathUtils.randomColor() : color;\n }\n\n /**\n * Make sure that the color is an instance of Proton.ArraySpan, if not it makes a new instance\n *\n * @method setSpanValue\n * @memberof Proton#Proton.Color\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} the integrate time 1/ms\n * @param {Int} the particle index\n */\n static createArraySpan(arr) {\n if (!arr) return null;\n\n if (arr instanceof ArraySpan)\n return arr;\n else\n return new ArraySpan(arr);\n }\n\n}","export default class Rectangle {\n\n\tconstructor(x, y, w, h) {\n\t\tthis.x = x;\n\t\tthis.y = y;\n\n\t\tthis.width = w;\n\t\tthis.height = h;\n\n\t\tthis.bottom = this.y + this.height;\n\t\tthis.right = this.x + this.width;\n\t}\n\n\tcontains(x, y) {\n\t\tif (x <= this.right && x >= this.x && y <= this.bottom && y >= this.y)\n\t\t\treturn true;\n\t\telse\n\t\t\treturn false;\n\t}\n}\n","import Util from '../utils/Util';\n\nexport default class Rate {\n\n\t/**\n\t * The number of particles per second emission (a [particle]/b [s]);\n\t * @namespace\n\t * @memberof! Proton#\n\t * @constructor\n\t * @alias Rate\n\t *\n\t * @param {Array | Number | Span} numpan the number of each emission;\n\t * @param {Array | Number | Span} timepan the time of each emission;\n\t * for example: new Rate(new Span(10, 20), new Span(.1, .25));\n\t */\n\tconstructor(numpan, timepan) {\n\t\tthis.numPan = Util.setSpanValue(Util.initValue(numpan, 1));\n\t\tthis.timePan = Util.setSpanValue(Util.initValue(timepan, 1));\n\n\t\tthis.startTime = 0;\n\t\tthis.nextTime = 0;\n\t\tthis.init();\n\t}\n\n\tinit() {\n\t\tthis.startTime = 0;\n\t\tthis.nextTime = this.timePan.getValue();\n\t}\n\n\tgetValue(time) {\n\t\tthis.startTime += time;\n\n\t\tif (this.startTime >= this.nextTime) {\n\t\t\tthis.startTime = 0;\n\t\t\tthis.nextTime = this.timePan.getValue();\n\n\t\t\tif (this.numPan.b == 1) {\n\t\t\t\tif (this.numPan.getValue(false) > 0.5)\n\t\t\t\t\treturn 1;\n\t\t\t\telse\n\t\t\t\t\treturn 0;\n\t\t\t} else {\n\t\t\t\treturn this.numPan.getValue(true);\n\t\t\t}\n\t\t}\n\n\t\treturn 0;\n\t}\n}","export default class Initialize {\n\t\n\treset() {\n\t}\n\n\tinit(emitter, particle) {\n\t\tif (particle) {\n\t\t\tthis.initialize(particle);\n\t\t} else {\n\t\t\tthis.initialize(emitter);\n\t\t}\n\t};\n\n\t///sub class init\n\tinitialize(target) {\n\t};\n}","import Util from '../utils/Util';\nimport Initialize from './Initialize';\n\nexport default class Life extends Initialize {\n\n\tconstructor(a, b, c) {\n\t\tsuper();\n\n\t\tthis.lifePan = Util.setSpanValue(a, b, c);\n\t\tthis.name = 'Life';\n\t}\n\n\tinitialize(target) {\n\t\tif (this.lifePan.a == Infinity)\n\t\t\ttarget.life = Infinity;\n\t\telse\n\t\t\ttarget.life = this.lifePan.getValue();\n\t}\n}\n","import Vector2D from '../math/Vector2D';\n\nexport default class Zone {\n\tconstructor() {\n\t\tthis.vector = new Vector2D(0, 0);\n\t\tthis.random = 0;\n\t\tthis.crossType = \"dead\";\n\t\tthis.alert = true;\n\t}\n\n\tgetPosition() {\n\t}\n\n\tcrossing(particle) {\n\t}\n}","import Zone from './Zone';\n\nexport default class PointZone extends Zone {\n\n\tconstructor(x, y) {\n\t\tsuper();\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t}\n\n\tgetPosition() {\n\t\tthis.vector.x = this.x;\n\t\tthis.vector.y = this.y;\n\n\t\treturn this.vector;\n\t}\n\n\tcrossing(particle) {\n\t\t\n\t\tif (this.alert) {\n\t\t\talert('Sorry PointZone does not support crossing method');\n\t\t\tthis.alert = false;\n\t\t}\n\t}\n}","import Util from '../utils/Util';\nimport PointZone from '../zone/PointZone';\nimport Initialize from './Initialize';\n\nexport default class Position extends Initialize {\n\n\tconstructor(zone) {\n\t\tsuper();\n\t\tthis.zone = Util.initValue(zone, new PointZone());\n\n\t\tthis.name = 'Position';\n\t}\n\n\treset(zone) {\n\t\tthis.zone = Util.initValue(zone, new PointZone());\n\t}\n\n\tinitialize(target) {\n\t\tthis.zone.getPosition();\n\n\t\ttarget.p.x = this.zone.vector.x;\n\t\ttarget.p.y = this.zone.vector.y;\n\t};\n\n}\n","import Proton from '../core/Proton';\nimport Util from '../utils/Util';\nimport Polar2D from '../math/Polar2D';\nimport MathUtils from '../math/MathUtils';\nimport Initialize from './Initialize';\n\nexport default class Velocity extends Initialize {\n\n constructor(rpan, thapan, type) {\n super();\n\n this.rPan = Util.setSpanValue(rpan);\n this.thaPan = Util.setSpanValue(thapan);\n this.type = Util.initValue(type, 'vector');\n\n this.name = 'Velocity';\n }\n\n reset(rpan, thapan, type) {\n this.rPan = Util.setSpanValue(rpan);\n this.thaPan = Util.setSpanValue(thapan);\n this.type = Util.initValue(type, 'vector');\n };\n\n normalizeVelocity(vr) {\n return vr * Proton.MEASURE;\n }\n\n initialize(target) {\n if (this.type == 'p' || this.type == 'P' || this.type == 'polar') {\n const polar2d = new Polar2D(this.normalizeVelocity(this.rPan.getValue()), this.thaPan.getValue() * MathUtils.PI_180);\n\n target.v.x = polar2d.getX();\n target.v.y = polar2d.getY();\n } else {\n target.v.x = this.normalizeVelocity(this.rPan.getValue());\n target.v.y = this.normalizeVelocity(this.thaPan.getValue());\n }\n };\n}","import Util from '../utils/Util';\nimport Initialize from './Initialize';\n\nexport default class Mass extends Initialize {\n\n\tconstructor(a, b, c) {\n\t\tsuper();\n\t\tthis.massPan = Util.setSpanValue(a, b, c);\n\t\tthis.name = 'Mass';\n\t}\n\n\tinitialize(target) {\n\t\ttarget.mass = this.massPan.getValue();\n\t}\n}","import Util from '../utils/Util';\nimport Initialize from './Initialize';\n\nexport default class Radius extends Initialize {\n\n\tconstructor(a, b, c) {\n\t\tsuper();\n\t\tthis.radius = Util.setSpanValue(a, b, c);\n\n\t\tthis.name = 'Radius';\n\t}\n\n\treset(a, b, c) {\n\t\tthis.radius = Util.setSpanValue(a, b, c);\n\t};\n\n\tinitialize(particle) {\n\t\tparticle.radius = this.radius.getValue();\n\t\tparticle.transform.oldRadius = particle.radius;\n\t};\n}","import Util from '../utils/Util';\nimport ArraySpan from '../math/ArraySpan';\nimport Initialize from './Initialize';\n\nexport default class Body extends Initialize {\n\n constructor(image, w, h) {\n super();\n\n this.image = this.setSpanValue(image);\n this.w = Util.initValue(w, 20);\n this.h = Util.initValue(h, this.w);\n this.name = 'Body';\n }\n\n initialize(particle) {\n const imagetarget = this.image.getValue();\n\n if (typeof(imagetarget) == 'string') {\n particle.body = { width: this.w, height: this.h, src: imagetarget , isInner: true, inner: true };\n } else {\n particle.body = imagetarget;\n }\n };\n\n setSpanValue(color) {\n return color instanceof ArraySpan ? color : new ArraySpan(color);\n }\n}","import Proton from '../core/Proton';\nimport Util from '../utils/Util';\nimport ease from '../math/ease';\n\nexport default class Behaviour {\n static id = 0;\n\n /**\n * The Behaviour class is the base for the other Behaviour\n *\n * @memberof! -\n * @interface\n * @alias Proton.Behaviour\n *\n * @param {Number} life \tthe behaviours life\n * @param {String} easing \tThe behaviour's decaying trend, for example ease.easeOutQuart\n *\n * @property {String} id \t\tThe behaviours id\n * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n * @property {Number} age=0 \tHow long the particle should be 'alife'\n * @property {Number} energy=1\n * @property {Boolean} dead=false The particle is dead at first\n * @property {Array} parents \tThe behaviour's parents array\n * @property {String} name \tThe behaviour name\n */\n constructor(life, easing) {\n\n this.life = Util.initValue(life, Infinity);\n this.easing = ease.getEasing(easing);\n\n this.age = 0;\n this.energy = 1;\n this.dead = false;\n this.parents = [];\n\n this.id = `Behaviour_${Behaviour.id++}`;\n this.name = 'Behaviour';\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton.Behaviour\n * @instance\n *\n * @param {Number} [life=Infinity] \t\tthis behaviour's life\n * @param {String} [easing=easeLinear] \tthis behaviour's easing\n */\n reset(life, easing) {\n this.life = Util.initValue(life, Infinity);\n this.easing = ease.getEasing(easing);\n }\n\n /**\n * Normalize a force by 1:100;\n *\n * @method normalizeForce\n * @memberof Proton.Behaviour\n * @instance\n *\n * @param {Proton.Vector2D} force \n */\n normalizeForce(force) {\n return force.multiplyScalar(Proton.MEASURE);\n }\n\n /**\n * Normalize a value by 1:100;\n *\n * @method normalizeValue\n * @memberof Proton.Behaviour\n * @instance\n *\n * @param {Number} value\n */\n normalizeValue(value) {\n return value * Proton.MEASURE;\n }\n\n /**\n * Initialize the behaviour's parameters for all particles\n *\n * @method initialize\n * @memberof Proton.Behaviour\n * @instance\n *\n * @param {Proton.Particle} particle\n */\n initialize(particle) {}\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton.Behaviour\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} \t\t\ttime the integrate time 1/ms\n * @param {Int} \t\t\tindex the particle index\n */\n calculate(particle, time, index) {\n this.age += time;\n\n if (this.age >= this.life || this.dead) {\n this.energy = 0;\n this.dead = true;\n this.destroy();\n } else {\n const scale = this.easing(particle.age / particle.life);\n this.energy = Math.max(1 - scale, 0);\n }\n }\n\n /**\n * Destory this behaviour\n *\n * @method destroy\n * @memberof Proton.Behaviour\n * @instance\n */\n destroy() {\n let i = this.parents.length;\n while (i--) {\n this.parents[i].removeBehaviour(this);\n }\n\n this.parents.length = 0;\n }\n}","import Util from '../utils/Util';\nimport Vector2D from '../math/Vector2D';\nimport Behaviour from './Behaviour';\n\nexport default class Force extends Behaviour {\n\n\t/**\n\t * @memberof! Proton#\n\t * @augments Proton.Behaviour\n\t * @constructor\n\t * @alias Proton.Force\n\t *\n\t * @param {Number} fx\n\t * @param {Number} fy\n\t * @param {Number} [life=Infinity] \t\t\tthis behaviour's life\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n\t *\n\t * @property {String} name The Behaviour name\n\t */\n\tconstructor(fx, fy, life, easing) {\n\t\tsuper(life, easing);\n\n\t\tthis.force = this.normalizeForce(new Vector2D(fx, fy));\n\t\tthis.name = \"Force\";\n\t}\n\n\t/**\n\t * Reset this behaviour's parameters\n\t *\n\t * @method reset\n\t * @memberof Proton#Proton.Force\n\t * @instance\n\t *\n\t * @param {Number} fx\n\t * @param {Number} fy\n\t * @param {Number} [life=Infinity] \t\t\tthis behaviour's life\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n\t */\n\treset(fx, fy, life, easing) {\n\t\tthis.force = this.normalizeForce(new Vector2D(fx, fy));\n\n\t\tlife && super.reset(life, easing);\n\t}\n\n\t/**\n\t * Apply this behaviour for all particles every time\n\t *\n\t * @method applyBehaviour\n\t * @memberof Proton#Proton.Force\n\t * @instance\n\t *\n\t * @param {Proton.Particle} particle\n\t * @param {Number} the integrate time 1/ms\n\t * @param {Int} the particle index\n\t */\n\tapplyBehaviour(particle, time, index) {\n\t\tthis.calculate(particle, time, index);\n\t\tparticle.a.add(this.force);\n\t}\n}","import Util from '../utils/Util';\nimport Vector2D from '../math/Vector2D';\nimport Behaviour from './Behaviour';\n\nexport default class Attraction extends Behaviour {\n\n\t/**\n\t * This behaviour let the particles follow one specific Proton.Vector2D\n\t *\n\t * @memberof! Proton#\n\t * @augments Proton.Behaviour\n\t * @constructor\n\t * @alias Proton.Attraction\n\t *\n\t * @todo add description for 'force' and 'radius'\n\t *\n\t * @param {Proton.Vector2D} targetPosition the attraction point coordinates\n\t * @param {Number} [force=100]\n\t * @param {Number} [radius=1000]\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n\t *\n\t * @property {Proton.Vector2D} targetPosition\n\t * @property {Number} radius\n\t * @property {Number} force\n\t * @property {Number} radiusSq\n\t * @property {Proton.Vector2D} attractionForce\n\t * @property {Number} lengthSq\n\t * @property {String} name The Behaviour name\n\t */\n\tconstructor(targetPosition, force, radius, life, easing) {\n\t\tsuper(life, easing);\n\n\t\tthis.targetPosition = Util.initValue(targetPosition, new Vector2D);\n\t\tthis.radius = Util.initValue(radius, 1000);\n\t\tthis.force = Util.initValue(this.normalizeValue(force), 100);\n\n\t\tthis.radiusSq = this.radius * this.radius\n\t\tthis.attractionForce = new Vector2D();\n\t\tthis.lengthSq = 0;\n\n\t\tthis.name = \"Attraction\";\n\t}\n\n\t/**\n\t * Reset this behaviour's parameters\n\t *\n\t * @method reset\n\t * @memberof Proton#Proton.Attraction\n\t * @instance\n\t *\n\t * @todo add description for 'force' and 'radius'\n\t *\n\t * @param {Proton.Vector2D} targetPosition the attraction point coordinates\n\t * @param {Number} [force=100]\n\t * @param {Number} [radius=1000]\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n\t */\n\treset(targetPosition, force, radius, life, easing) {\n\t\tthis.targetPosition = Util.initValue(targetPosition, new Vector2D);\n\t\tthis.radius = Util.initValue(radius, 1000);\n\t\tthis.force = Util.initValue(this.normalizeValue(force), 100);\n\n\t\tthis.radiusSq = this.radius * this.radius\n\t\tthis.attractionForce = new Vector2D();\n\t\tthis.lengthSq = 0;\n\n\t\tlife && super.reset(life, easing);\n\t}\n\n\t/**\n\t * Apply this behaviour for all particles every time\n\t *\n\t * @memberof Proton#Proton.Attraction\n\t * @method applyBehaviour\n\t * @instance\n\t *\n\t * @param {Proton.Particle} particle\n\t * @param {Number} \t\t\ttime the integrate time 1/ms\n\t * @param {Int} \t\t\tindex the particle index\n\t */\n\tapplyBehaviour(particle, time, index) {\n\t\tthis.calculate(particle, time, index);\n\n\t\tthis.attractionForce.copy(this.targetPosition);\n\t\tthis.attractionForce.sub(particle.p);\n\t\tthis.lengthSq = this.attractionForce.lengthSq();\n\n\t\tif (this.lengthSq > 0.000004 && this.lengthSq < this.radiusSq) {\n\t\t\tthis.attractionForce.normalize();\n\t\t\tthis.attractionForce.multiplyScalar(1 - this.lengthSq / this.radiusSq);\n\t\t\tthis.attractionForce.multiplyScalar(this.force);\n\n\t\t\tparticle.a.add(this.attractionForce);\n\t\t}\n\t}\n}\n\n","import Util from '../utils/Util';\nimport Vector2D from '../math/Vector2D';\nimport MathUtils from '../math/MathUtils';\nimport Behaviour from './Behaviour';\n\nexport default class RandomDrift extends Behaviour {\n\n\t/**\n\t * @memberof! Proton#\n\t * @augments Behaviour\n\t * @constructor\n\t * @alias RandomDrift\n\t *\n\t * @param {Number} driftX \t\t\t\tX value of the new Vector2D\n\t * @param {Number} driftY \t\t\t\tY value of the new Vector2D\n\t * @param {Number} delay \t\t\t\tHow much delay the drift should have\n\t * @param {Number} [life=Infinity] \t\tthis behaviour's life\n\t * @param {String} [easing=easeLinear] \tthis behaviour's easing\n\t *\n\t * @property {Number} time The time of the drift\n\t * @property {String} name The Behaviour name\n\t */\n\tconstructor(driftX, driftY, delay, life, easing) {\n\t\tsuper(life, easing);\n\n\t\tthis.reset(driftX, driftY, delay);\n\t\tthis.time = 0;\n\t\tthis.name = \"RandomDrift\";\n\t}\n\n\t/**\n\t * Reset this behaviour's parameters\n\t *\n\t * @method reset\n\t * @memberof Proton#RandomDrift\n\t * @instance\n\t *\n\t * @param {Number} driftX \t\t\t\tX value of the new Vector2D\n\t * @param {Number} driftY \t\t\t\tY value of the new Vector2D\n\t * @param {Number} delay \t\t\t\tHow much delay the drift should have\n\t * @param {Number} [life=Infinity] \t\tthis behaviour's life\n\t * @param {String} [easing=easeLinear] \tthis behaviour's easing\n\t */\n\treset(driftX, driftY, delay, life, easing) {\n\t\tthis.panFoce = new Vector2D(driftX, driftY);\n\t\tthis.panFoce = this.normalizeForce(this.panFoce);\n\t\tthis.delay = delay;\n\n\t\tlife && super.reset(life, easing);\n\t}\n\n\t/**\n\t * Apply this behaviour for all particles every time\n\t *\n\t * @method applyBehaviour\n\t * @memberof Proton#RandomDrift\n\t * @instance\n\t *\n\t * @param {Particle} particle\n\t * @param {Number} \t\t\ttime the integrate time 1/ms\n\t * @param {Int} \t\t\tindex the particle index\n\t */\n\tapplyBehaviour(particle, time, index) {\n\t\tthis.calculate(particle, time, index);\n\t\tthis.time += time;\n\n\t\tif (this.time >= this.delay) {\n\t\t\tparticle.a.addXY(MathUtils.randomAToB(-this.panFoce.x, this.panFoce.x), MathUtils.randomAToB(-this.panFoce.y, this.panFoce.y));\n\t\t\tthis.time = 0;\n\t\t};\n\t}\n}\n","import Util from '../utils/Util';\nimport Vector2D from '../math/Vector2D';\nimport Force from './Force';\n\nexport default class Gravity extends Force {\n\n\t/**\n\t * @memberof! Proton#\n\t * @augments Proton#Proton.Force\n\t * @constructor\n\t * @alias Proton.Gravity\n\t *\n\t * @param {Number} g \t\t\t\t\t\t\tGravity\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n\t *\n\t * @property {String} name The Behaviour name\n\t */\n\tconstructor(g, life, easing) {\n\t\tsuper(0, g, life, easing);\n\t\tthis.name = \"Gravity\";\n\t}\n\n\t/**\n\t * Reset this behaviour's parameters\n\t *\n\t * @method reset\n\t * @memberof Proton#Proton.Gravity\n\t * @instance\n\t *\n\t * @param {Number} g \t\t\t\t\t\t\tGravity\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n\t */\n\treset(g, life, easing) {\n\t\tsuper.reset(0, g, life, easing);\n\t}\n}","import Util from '../utils/Util';\nimport Vector2D from '../math/Vector2D';\nimport Behaviour from './Behaviour';\n\n//can use Collision(emitter,true,function(){}) or Collision();\nexport default class Collision extends Behaviour {\n\n\t/**\n\t * The callback after collision\n\t *\n\t * @callback Callback\n\t *\n\t * @param {Proton.Particle} particle\n\t * @param {Proton.Paritcle} otherParticle\n\t */\n\t/**\n\t * @memberof! Proton#\n\t * @augments Proton.Behaviour\n\t * @constructor\n\t * @alias Proton.Collision\n\t *\n\t * @todo add description to mass\n\t *\n\t * @param {Proton.Emitter} \t[emitter=null] \t\tthe attraction point coordinates\n\t * @param {Boolean} \t\t[mass=true]\t\t\t\n\t * @param {Callback}\t \t[callback=null]\t\tthe callback after the collision\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n\t *\n\t * @property {String} name The Behaviour name\n\t */\n\tconstructor(emitter, mass, callback, life, easing) {\n\t\tsuper(life, easing);\n\n\t\tthis.reset(emitter, mass, callback);\n\t\tthis.name = \"Collision\";\n\t}\n\n\t/**\n\t * Reset this behaviour's parameters\n\t *\n\t * @memberof Proton#Proton.Collision\n\t * @method reset\n\t * @instance\n\t *\n\t * @todo add description to mass\n\t *\n\t * @param {Proton.Emitter} \t[emitter=null] \t\tthe attraction point coordinates\n\t * @param {Boolean} \t\t[mass=true]\t\t\t\n\t * @param {Callback}\t \t[callback=null]\t\tthe callback after the collision\n\t * @param {Number} \t\t\t[life=Infinity] \tthis behaviour's life\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n\t */\n\treset(emitter, mass, callback, life, easing) {\n\t\tthis.emitter = Util.initValue(emitter, null);\n\t\tthis.mass = Util.initValue(mass, true);\n\t\tthis.callback = Util.initValue(callback, null);\n\n\t\tthis.collisionPool = [];\n\t\tthis.delta = new Vector2D();\n\n\t\tlife && super.reset(life, easing);\n\t}\n\n\t/**\n\t * Apply this behaviour for all particles every time\n\t *\n\t * @memberof Proton#Proton.Collision\n\t * @method applyBehaviour\n\t * @instance\n\t *\n\t * @param {Proton.Particle} particle\n\t * @param {Number} \t\t\ttime the integrate time 1/ms\n\t * @param {Int} \t\t\tindex the particle index\n\t */\n\tapplyBehaviour(particle, time, index) {\n\t\tconst newPool = this.emitter ? this.emitter.particles.slice(index) : this.pool.slice(index);\n\t\tconst length = newPool.length;\n\n\t\tlet otherParticle;\n\t\tlet lengthSq;\n\t\tlet overlap;\n\t\tlet totalMass;\n\t\tlet averageMass1, averageMass2;\n\t\tlet i;\n\n\t\tfor (i = 0; i < length; i++) {\n\t\t\totherParticle = newPool[i];\n\n\t\t\tif (otherParticle !== particle) {\n\t\t\t\tthis.delta.copy(otherParticle.p);\n\t\t\t\tthis.delta.sub(particle.p);\n\n\t\t\t\tlengthSq = this.delta.lengthSq();\n\t\t\t\tconst distance = particle.radius + otherParticle.radius;\n\n\t\t\t\tif (lengthSq <= distance * distance) {\n\t\t\t\t\toverlap = distance - Math.sqrt(lengthSq);\n\t\t\t\t\toverlap += 0.5;\n\n\t\t\t\t\ttotalMass = particle.mass + otherParticle.mass;\n\t\t\t\t\taverageMass1 = this.mass ? otherParticle.mass / totalMass : 0.5;\n\t\t\t\t\taverageMass2 = this.mass ? particle.mass / totalMass : 0.5;\n\t\t\t\t\t\n\t\t\t\t\tparticle.p.add(this.delta.clone().normalize().multiplyScalar(overlap * -averageMass1));\n\t\t\t\t\totherParticle.p.add(this.delta.normalize().multiplyScalar(overlap * averageMass2));\n\n\t\t\t\t\tthis.callback && this.callback(particle, otherParticle);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n","import Util from '../utils/Util';\nimport Behaviour from './Behaviour';\n\nexport default class CrossZone extends Behaviour {\n\n /**\n * Defines what happens if the particles come to the end of the specified zone\n *\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.CrossZone\n *\n * @param {Proton.Zone} zone \t\t\t\t\t\tcan be any Proton.Zone - e.g. Proton.RectZone()\n * @param {String} \t\t[crossType=dead] \t\t\twhat happens if the particles pass the zone - allowed strings: dead | bound | cross\n * @param {Number} \t\t[life=Infinity] \t\t\tthis behaviour's life\n * @param {String} \t\t[easing=ease.easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(zone, crossType, life, easing) {\n super(life, easing);\n\n this.reset(zone, crossType);\n this.name = \"CrossZone\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.CrossZone\n * @instance\n *\n * @param {Proton.Zone} zone \t\t\t\tcan be any Proton.Zone - e.g. Proton.RectZone()\n * @param {String} \t\t[crossType=dead] \twhat happens if the particles pass the zone - allowed strings: dead | bound | cross\n * @param {Number} \t\t[life=Infinity] \tthis behaviour's life\n * @param {String} \t\t[easing=easeLinear]\tthis behaviour's easing\n */\n reset(zone, crossType, life, easing) {\n this.zone = zone;\n this.zone.crossType = Util.initValue(crossType, \"dead\");\n\n life && super.reset(life, easing);\n }\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#Proton.CrossZone\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} the integrate time 1/ms\n * @param {Int} the particle index\n */\n applyBehaviour(particle, time, index) {\n this.calculate(particle, time, index);\n this.zone.crossing(particle);\n };\n}","import Util from '../utils/Util';\nimport Behaviour from './Behaviour';\n\nexport default class Alpha extends Behaviour {\n\n\t/**\n\t * @memberof! Proton#\n\t * @augments Proton.Behaviour\n\t * @constructor\n\t * @alias Proton.Alpha\n\t *\n\t * @todo add description for 'a' and 'b'\n\t *\n\t * @param {Number} a\n\t * @param {String} b\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n\t *\n\t * @property {String} name The Behaviour name\n\t */\n\tconstructor(a, b, life, easing) {\n\t\tsuper(life, easing);\n\n\t\tthis.reset(a, b);\n\t\tthis.name = \"Alpha\";\n\t}\n\n\t/**\n\t * Reset this behaviour's parameters\n\t *\n\t * @method reset\n\t * @memberof Proton#Proton.Alpha\n\t * @instance\n\t *\n\t * @todo add description for 'a' and 'b'\n\t *\n\t * @param {Number} a\n\t * @param {String} b\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n\t */\n\treset(a, b, life, easing) {\n\t\tthis.same = b === null || b === undefined ? true : false;\n\t\tthis.a = Util.setSpanValue(Util.initValue(a, 1));\n\t\tthis.b = Util.setSpanValue(b);\n\n\t\tlife && super.reset(life, easing);\n\t}\n\t\n\t/**\n\t * Sets the new alpha value of the particle\n\t *\n\t * @method initialize\n\t * @memberof Proton#Proton.Alpha\n\t * @instance\n\t *\n\t * @param {Proton.Particle} particle A single Proton generated particle\n\t */\n\tinitialize(particle) {\n\t\tparticle.transform.alphaA = this.a.getValue();\n\n\t\tif (this.same)\n\t\t\tparticle.transform.alphaB = particle.transform.alphaA;\n\t\telse\n\t\t\tparticle.transform.alphaB = this.b.getValue();\n\t}\n\n\t/**\n\t * @method applyBehaviour\n\t * @memberof Proton#Proton.Alpha\n\t * @instance\n\t *\n\t * @param {Proton.Particle} particle\n\t * @param {Number} \t\t\ttime the integrate time 1/ms\n\t * @param {Int} \t\t\tindex the particle index\n \t */\n\tapplyBehaviour(particle, time, index) {\n\t\tthis.calculate(particle, time, index);\n\t\t\n\t\tparticle.alpha = particle.transform.alphaB + (particle.transform.alphaA - particle.transform.alphaB) * this.energy;\n\t\tif (particle.alpha < 0.001) particle.alpha = 0;\n\t}\n}\n","import Util from '../utils/Util';\nimport Behaviour from './Behaviour';\n\nexport default class Scale extends Behaviour {\n\n\t/**\n\t * @memberof! Proton#\n\t * @augments Proton.Behaviour\n\t * @constructor\n\t * @alias Proton.Scale\n\t *\n\t * @todo add description for 'a' and 'b'\n\t *\n\t * @param {Number} a\n\t * @param {String} b\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n\t *\n\t * @property {String} name The Behaviour name\n\t */\n\tconstructor(a, b, life, easing) {\n\t\tsuper(life, easing);\n\n\t\tthis.reset(a, b);\n\t\tthis.name = \"Scale\";\n\t}\n\n\t/**\n\t * Reset this behaviour's parameters\n\t *\n\t * @method reset\n\t * @memberof Proton#Proton.Scale\n\t * @instance\n\t *\n\t * @param {Number} a\n\t * @param {String} b\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n\t */\n\treset(a, b, life, easing) {\n\t\tthis.same = b === null || b === undefined ? true : false;\n\t\tthis.a = Util.setSpanValue(Util.initValue(a, 1));\n\t\tthis.b = Util.setSpanValue(b);\n\n\t\tlife && super.reset(life, easing);\n\t}\n\n\t/**\n\t * Initialize the behaviour's parameters for all particles\n\t *\n\t * @method initialize\n\t * @memberof Proton#Proton.Scale\n\t * @instance\n\t *\n\t * @param {Proton.Particle} particle\n\t */\n\tinitialize(particle) {\n\t\tparticle.transform.scaleA = this.a.getValue();\n\t\tparticle.transform.oldRadius = particle.radius;\n\t\tparticle.transform.scaleB = this.same ? particle.transform.scaleA : this.b.getValue();\n\t};\n\n\t/**\n\t * Apply this behaviour for all particles every time\n\t *\n\t * @method applyBehaviour\n\t * @memberof Proton#Proton.Scale\n\t * @instance\n\t *\n\t * @param {Proton.Particle} particle\n\t * @param {Number} \t\t\ttime the integrate time 1/ms\n\t * @param {Int} \t\t\tindex the particle index\n\t */\n\tapplyBehaviour(particle, time, index) {\n\t\tthis.calculate(particle, time, index);\n\t\tparticle.scale = particle.transform.scaleB + (particle.transform.scaleA - particle.transform.scaleB) * this.energy;\n\n\t\tif (particle.scale < 0.0001) particle.scale = 0;\n\t\tparticle.radius = particle.transform.oldRadius * particle.scale;\n\t}\n}","import Util from '../utils/Util';\nimport Behaviour from './Behaviour';\n\nexport default class Rotate extends Behaviour {\n\n\t/**\n\t * @memberof! Proton#\n\t * @augments Proton.Behaviour\n\t * @constructor\n\t * @alias Proton.Rotate\n\t *\n\t * @todo add description for 'a', 'b' and 'style'\n\t *\n\t * @param {Number} a\n\t * @param {String} b\n\t * @param {String} [style=to]\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n\t *\n\t * @property {String} name The Behaviour name\n\t */\n\tconstructor(a, b, style, life, easing) {\n\t\tsuper(life, easing);\n\n\t\tthis.reset(a, b, style);\n\t\tthis.name = \"Rotate\";\n\t}\n\n\t/**\n\t * Reset this behaviour's parameters\n\t *\n\t * @method reset\n\t * @memberof Proton#Proton.Rotate\n\t * @instance\n\t *\n\t * @todo add description for 'a', 'b' and 'style'\n\t *\n\t * @param {Number} a\n\t * @param {String} b\n\t * @param {String} [style=to]\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n\t */\n\treset(a, b, style, life, easing) {\n\t\tthis.same = b === null || b === undefined ? true : false;\n\n\t\tthis.a = Util.setSpanValue(Util.initValue(a, \"Velocity\"));\n\t\tthis.b = Util.setSpanValue(Util.initValue(b, 0));\n\t\tthis.style = Util.initValue(style, 'to');\n\n\t\tlife && super.reset(life, easing);\n\t}\n\n\t/**\n\t * Initialize the behaviour's parameters for all particles\n\t *\n\t * @method initialize\n\t * @memberof Proton#Proton.Rotate\n\t * @instance\n\t *\n\t * @param {Proton.Particle} particle\n\t */\n\tinitialize(particle) {\n\t\tparticle.rotation = this.a.getValue();\n\t\tparticle.transform.rotationA = this.a.getValue();\n\n\t\tif (!this.same) particle.transform.rotationB = this.b.getValue();\n\t};\n\n\t/**\n\t * Apply this behaviour for all particles every time\n\t *\n\t * @method applyBehaviour\n\t * @memberof Proton#Proton.Rotate\n\t * @instance\n\t *\n\t * @param {Proton.Particle} particle\n\t * @param {Number} \t\t\ttime the integrate time 1/ms\n\t * @param {Int} \t\t\tindex the particle index\n\t */\n\tapplyBehaviour(particle, time, index) {\n\t\tthis.calculate(particle, time, index);\n\n\t\tif (!this.same) {\n\t\t\tif (this.style == 'to' || this.style == 'TO' || this.style == '_') {\n\t\t\t\tparticle.rotation += particle.transform.rotationB + (particle.transform.rotationA - particle.transform.rotationB) * this.energy\n\t\t\t} else {\n\t\t\t\tparticle.rotation += particle.transform.rotationB;\n\t\t\t}\n\t\t} else if (this.a.a == \"V\" || this.a.a == \"Velocity\" || this.a.a == \"v\") {\n\t\t\t//beta...\n\t\t\tparticle.rotation = particle.getDirection();\n\t\t}\n\t}\n\n}","import Util from '../utils/Util';\nimport ColorUtil from '../utils/ColorUtil';\nimport ArraySpan from '../math/ArraySpan';\nimport Behaviour from './Behaviour';\n\nexport default class Color extends Behaviour {\n\n /**\n * @memberof! Proton#\n * @augments Proton.Behaviour\n * @constructor\n * @alias Proton.Color\n *\n * @param {Proton.ArraySpan | String} a the string should be a hex e.g. #000000 for black\n * @param {Proton.ArraySpan | String} b the string should be a hex e.g. #000000 for black\n * @param {Number} [life=Infinity] \tthis behaviour's life\n * @param {String} [easing=easeLinear] \tthis behaviour's easing\n *\n * @property {String} name The Behaviour name\n */\n constructor(a, b, life, easing) {\n super(life, easing);\n\n this.reset(a, b);\n this.name = \"Color\";\n }\n\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @memberof Proton#Proton.Color\n * @instance\n *\n * @param {Proton.ArraySpan | String} a the string should be a hex e.g. #000000 for black\n * @param {Proton.ArraySpan | String} b the string should be a hex e.g. #000000 for black\n * @param {Number} [life=Infinity] \tthis behaviour's life\n * @param {String} [easing=easeLinear] \tthis behaviour's easing\n */\n reset(a, b, life, easing) {\n this.a = ArraySpan.createArraySpan(a);\n this.b = ArraySpan.createArraySpan(b);\n\n life && super.reset(life, easing);\n }\n\n /**\n * Initialize the behaviour's parameters for all particles\n *\n * @method initialize\n * @memberof Proton#Proton.Color\n * @instance\n *\n * @param {Proton.Particle} particle\n */\n initialize(particle) {\n particle.color = this.a.getValue();\n particle.transform.colorA = ColorUtil.hexToRGB(particle.color);\n\n if (this.b)\n particle.transform.colorB = ColorUtil.hexToRGB(this.b.getValue());\n };\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @memberof Proton#Proton.Color\n * @instance\n *\n * @param {Proton.Particle} particle\n * @param {Number} the integrate time 1/ms\n * @param {Int} the particle index\n */\n applyBehaviour(particle, time, index) {\n if (this.b) {\n this.calculate(particle, time, index);\n\n particle.transform.rgb.r = particle.transform.colorB.r + (particle.transform.colorA.r - particle.transform.colorB.r) * this.energy;\n particle.transform.rgb.g = particle.transform.colorB.g + (particle.transform.colorA.g - particle.transform.colorB.g) * this.energy;\n particle.transform.rgb.b = particle.transform.colorB.b + (particle.transform.colorA.b - particle.transform.colorB.b) * this.energy;\n\n particle.transform.rgb.r = Math.floor(particle.transform.rgb.r);\n particle.transform.rgb.g = Math.floor(particle.transform.rgb.g);\n particle.transform.rgb.b = Math.floor(particle.transform.rgb.b);\n\n } else {\n particle.transform.rgb.r = particle.transform.colorA.r;\n particle.transform.rgb.g = particle.transform.colorA.g;\n particle.transform.rgb.b = particle.transform.colorA.b;\n }\n };\n\n}","import Util from '../utils/Util';\nimport Attraction from './Attraction';\n\nexport default class Repulsion extends Attraction {\n\n\t/**\n\t * The oppisite of Proton.Attraction - turns the force\n\t *\n\t * @memberof! Proton#\n\t * @augments Proton#Proton.Attraction\n\t * @constructor\n\t * @alias Proton.Repulsion\n\t *\n\t * @todo add description for 'force' and 'radius'\n\t *\n\t * @param {Proton.Vector2D} targetPosition the attraction point coordinates\n\t * @param {Number} [force=100]\n\t * @param {Number} [radius=1000]\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n\t *\n\t * @property {Number} force\n\t * @property {String} name The Behaviour name\n\t */\n\tconstructor(targetPosition, force, radius, life, easing) {\n\t\tsuper(targetPosition, force, radius, life, easing);\n\n\t\tthis.force *= -1;\n\t\tthis.name = \"Repulsion\";\n\t}\n\n\t/**\n\t * Reset this behaviour's parameters\n\t *\n\t * @method reset\n\t * @memberof Proton#Proton.Repulsion\n\t * @instance\n\t *\n\t * @todo add description for 'force' and 'radius'\n\t *\n\t * @param {Proton.Vector2D} targetPosition the attraction point coordinates\n\t * @param {Number} [force=100]\n\t * @param {Number} [radius=1000]\n\t * @param {Number} [life=Infinity] \t\t\t\tthis behaviour's life\n\t * @param {String} [easing=ease.easeLinear] \tthis behaviour's easing\n\t */\n\treset(targetPosition, force, radius, life, easing) {\n\t\tsuper.reset(targetPosition, force, radius, life, easing);\n\t\tthis.force *= -1;\n\t}\n}\n","import Util from '../utils/Util';\nimport Vector2D from '../math/Vector2D';\nimport Behaviour from './Behaviour';\n\nexport default class GravityWell extends Behaviour {\n\n\t/**\n\t * @memberof! Proton#\n\t * @augments Behaviour\n\t * @constructor\n\t * @alias GravityWell\n\t *\n\t * @param {Vector2D} [centerPoint=new Vector2D] The point in the center\n\t * @param {Number} [force=100]\t\t\t\t\tThe force\t\n\t * @param {Number} [life=Infinity]\t\t\t\tthis behaviour's life\n\t * @param {String} [easing=easeLinear]\tthis behaviour's easing\n\t *\n\t * @property {String} name The Behaviour name\n\t */\n\tconstructor(centerPoint, force, life, easing) {\n\t\tsuper(life, easing);\n\n\t\tthis.distanceVec = new Vector2D();\n\t\tthis.centerPoint = Util.initValue(centerPoint, new Vector2D);\n\t\tthis.force = Util.initValue(this.normalizeValue(force), 100);\n\n\t\tthis.name = \"GravityWell\";\n\t}\n\n\t/**\n\t * Reset this behaviour's parameters\n\t *\n\t * @method reset\n\t * @memberof Proton#GravityWell\n\t * @instance\n\t *\n\t * @param {Vector2D} [centerPoint=new Vector2D] The point in the center\n\t * @param {Number} [force=100]\t\t\t\t\tThe force\t\n\t * @param {Number} [life=Infinity]\t\t\t\tthis behaviour's life\n\t * @param {String} [easing=easeLinear]\tthis behaviour's easing\n\t */\n\treset(centerPoint, force, life, easing) {\n\t\tthis.distanceVec = new Vector2D();\n\t\tthis.centerPoint = Util.initValue(centerPoint, new Vector2D);\n\t\tthis.force = Util.initValue(this.normalizeValue(force), 100);\n\t\t\n\t\tlife && super.reset(life, easing);\n\t};\n\n\t/**\n\t * @inheritdoc\n\t */\n\tinitialize(particle) {\n\t};\n\n\t/**\n\t * Apply this behaviour for all particles every time\n\t *\n\t * @method applyBehaviour\n\t * @memberof Proton#GravityWell\n\t * @instance\n\t *\n\t * @param {Particle} particle\n\t * @param {Number} the integrate time 1/ms\n\t * @param {Int} the particle index\n\t */\n\tapplyBehaviour(particle, time, index) {\n\t\tthis.distanceVec.set(this.centerPoint.x - particle.p.x, this.centerPoint.y - particle.p.y);\n\t\tconst distanceSq = this.distanceVec.lengthSq();\n\n\t\tif (distanceSq != 0) {\n\t\t\tconst distance = this.distanceVec.length();\n\t\t\tconst factor = (this.force * time) / (distanceSq * distance);\n\n\t\t\tparticle.v.x += factor * this.distanceVec.x;\n\t\t\tparticle.v.y += factor * this.distanceVec.y;\n\t\t}\n\t}\n}","import Util from '../utils/Util';\nimport MathUtils from '../math/MathUtils';\n\nexport default {\n\n\tinitialize(emitter, particle, initializes) {\n\t\tconst length = initializes.length;\n\t\tlet i;\n\n\t\tfor (i = 0; i < length; i++) {\n\t\t\tif (initializes[i] instanceof Proton.Initialize)\n\t\t\t\tinitializes[i].init(emitter, particle);\n\t\t\telse\n\t\t\t\tthis.init(emitter, particle, initializes[i]);\n\t\t}\n\n\t\tthis.bindEmitter(emitter, particle);\n\t},\n\n\t//////////////////////init//////////////////////\n\tinit(emitter, particle, initialize) {\n\t\tUtil.setPrototypeByObject(particle, initialize);\n\t\tUtil.setVector2DByObject(particle, initialize);\n\t},\n\t\n\tbindEmitter(emitter, particle) {\n\t\tif (emitter.bindEmitter) {\n\t\t\tparticle.p.add(emitter.p);\n\t\t\tparticle.v.add(emitter.v);\n\t\t\tparticle.a.add(emitter.a);\n\n\t\t\tparticle.v.rotate(MathUtils.degreeTransform(emitter.rotation));\n\t\t}\n\t}\n}\n","import Util from '../utils/Util';\nimport Particle from '../core/Particle';\nimport EventDispatcher from '../events/EventDispatcher';\n\nimport Rate from '../initialize/Rate';\nimport InitializeUtil from '../initialize/InitializeUtil';\n\nexport default class Emitter extends Particle {\n\n\tstatic ID = 0;\n\n\t/**\n\t * You can use this emit particles.\n\t *\n\t * It will dispatch follow events:\n\t * PARTICLE_CREATED\n\t * PARTICLE_UPDATA\n\t * PARTICLE_DEAD\n\t *\n\t * @class Emitter\n\t * @constructor\n\t * @param {Object} pObj the parameters object;\n\t * for example {damping:0.01,bindEmitter:false}\n\t */\n\tconstructor(pObj) {\n\t\tsuper(pObj);\n\n\t\tthis.initializes = [];\n\t\tthis.particles = [];\n\t\tthis.behaviours = [];\n\n\t\tthis.emitSpeed = 0;\n\t\tthis.currentEmitTime = 0;\n\t\tthis.totalEmitTimes = -1;\n\n\t\t/**\n\t\t * The friction coefficient for all particle emit by This;\n\t\t * @property damping\n\t\t * @type {Number}\n\t\t * @default 0.006\n\t\t */\n\t\tthis.damping = .006;\n\n\t\t/**\n\t\t * If bindEmitter the particles can bind this emitter's property;\n\t\t * @property bindEmitter\n\t\t * @type {Boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.bindEmitter = true;\n\n\t\t/**\n\t\t * The number of particles per second emit (a [particle]/b [s]);\n\t\t * @property rate\n\t\t * @type {Rate}\n\t\t * @default Rate(1, .1)\n\t\t */\n\t\tthis.rate = new Rate(1, .1);\n\n\t\tthis.id = `emitter_${Emitter.ID++}`;\n\t\tthis.name = 'Emitter';\n\t}\n\n\t/**\n\t * start emit particle\n\t * @method emit\n\t * @param {Number} currentEmitTime begin emit time;\n\t * @param {String} life the life of this emitter\n\t */\n\temit(totalEmitTimes, life) {\n\t\tthis.stoped = false;\n\t\tthis.currentEmitTime = 0;\n\t\tthis.totalEmitTimes = Util.initValue(totalEmitTimes, Infinity);\n\n\t\tif (life == true || life == 'life' || life == 'destroy') {\n\t\t\tthis.life = totalEmitTimes == 'once' ? 1 : this.totalEmitTimes;\n\t\t} else if (!isNaN(life)) {\n\t\t\tthis.life = life;\n\t\t}\n\n\t\tthis.rate.init();\n\t}\n\n\t/**\n\t * stop emiting\n\t * @method stop\n\t */\n\tstop() {\n\t\tthis.totalEmitTimes = -1;\n\t\tthis.currentEmitTime = 0;\n\t\tthis.stoped = true;\n\t}\n\n\t/**\n\t * remove current all particles\n\t * @method removeAllParticles\n\t */\n\tremoveAllParticles() {\n\t\tlet i = this.particles.length;\n\t\twhile (i--) this.particles[i].dead = true;\n\t}\n\n\t/**\n\t * add initialize to this emitter\n\t * @method addSelfInitialize\n\t */\n\taddSelfInitialize(pObj) {\n\t\tif (pObj['init']) {\n\t\t\tpObj.init(this);\n\t\t} else {\n\t\t\tthis.initAll();\n\t\t}\n\t}\n\n\t/**\n\t * add the Initialize to particles;\n\t * \n\t * you can use initializes array:for example emitter.addInitialize(initialize1,initialize2,initialize3);\n\t * @method addInitialize\n\t * @param {Initialize} initialize like this new Radius(1, 12)\n\t */\n\taddInitialize(...rest) {\n\t\tlet i = rest.length;\n\t\twhile (i--)\n\t\t\tthis.initializes.push(rest[i]);\n\t}\n\n\t/**\n\t * remove the Initialize\n\t * @method removeInitialize\n\t * @param {Initialize} initialize a initialize\n\t */\n\tremoveInitialize(initializer) {\n\t\tconst index = this.initializes.indexOf(initializer);\n\t\tif (index > -1) this.initializes.splice(index, 1);\n\t}\n\n\t/**\n\t * remove all Initializes\n\t * @method removeInitializers\n\t */\n\tremoveAllInitializers() {\n\t\tUtil.destroyArray(this.initializes);\n\t}\n\n\t/**\n\t * add the Behaviour to particles;\n\t * \n\t * you can use Behaviours array:emitter.addBehaviour(Behaviour1,Behaviour2,Behaviour3);\n\t * @method addBehaviour\n\t * @param {Behaviour} behaviour like this new Color('random')\n\t */\n\taddBehaviour(...rest) {\n\t\tlet i = arguments.length;\n\t\twhile (i--) {\n\t\t\tlet behaviour = rest[i];\n\t\t\tthis.behaviours.push(behaviour);\n\t\t\tif (behaviour.parents) behaviour.parents.push(this);\n\t\t}\n\t}\n\n\t/**\n\t * remove the Behaviour\n\t * @method removeBehaviour\n\t * @param {Behaviour} behaviour a behaviour\n\t */\n\tremoveBehaviour(behaviour) {\n\t\tlet index = this.behaviours.indexOf(behaviour);\n\t\tthis.behaviours.splice(index, 1);\n\n\t\tif (behaviour.parents) {\n\t\t\tindex = behaviour.parents.indexOf(behaviour);\n\t\t\tbehaviour.parents.splice(index, 1);\n\t\t}\n\n\t\treturn index;\n\t}\n\n\t/**\n\t * remove all behaviours\n\t * @method removeAllBehaviours\n\t */\n\tremoveAllBehaviours() {\n\t\tUtil.destroyArray(this.behaviours);\n\t}\n\n\t// emitter update \n\tupdate(time) {\n\t\tthis.age += time;\n\t\tif (this.age >= this.life || this.dead) this.destroy();\n\n\t\tthis.emitting(time);\n\t\tthis.integrate(time);\n\t}\n\n\tintegrate(time) {\n\t\tif (!this.parent) return;\n\n\t\tconst damping = 1 - this.damping;\n\t\tthis.parent.integrator.calculate(this, time, damping);\n\n\t\tconst length = this.particles.length;\n\t\tlet i, particle;\n\n\t\tfor (i = length - 1; i >= 0; i--) {\n\t\t\tparticle = this.particles[i];\n\n\t\t\t// particle update\n\t\t\tparticle.update(time, i);\n\t\t\tthis.parent.integrator.calculate(particle, time, damping);\n\t\t\tthis.dispatch(\"PARTICLE_UPDATE\", particle);\n\n\t\t\t// check dead\n\t\t\tif (particle.dead) {\n\t\t\t\tthis.dispatch(\"PARTICLE_DEAD\", particle);\n\n\t\t\t\tthis.parent.pool.expire(particle);\n\t\t\t\tthis.particles.splice(i, 1);\n\t\t\t}\n\t\t}\n\t}\n\n\tdispatch(event, target) {\n\t\tthis.parent && this.parent.dispatchEvent(event, target);\n\t\tProton.bindEmtterEvent && this.dispatchEvent(event, target);\n\t}\n\n\temitting(time) {\n\t\tif (this.totalEmitTimes == 'once') {\n\t\t\tlet i;\n\t\t\tconst length = this.rate.getValue(99999);\n\n\t\t\tif (length > 0) this.emitSpeed = length;\n\t\t\tfor (i = 0; i < length; i++) this.createParticle();\n\t\t\tthis.totalEmitTimes = 'none';\n\t\t}\n\n\t\telse {\n\t\t\tthis.currentEmitTime += time;\n\n\t\t\tif (this.currentEmitTime < this.totalEmitTimes) {\n\t\t\t\tconst length = this.rate.getValue(time)\n\t\t\t\tlet i;\n\n\t\t\t\tif (length > 0) this.emitSpeed = length;\n\t\t\t\tfor (i = 0; i < length; i++) this.createParticle();\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * create single particle;\n\t * \n\t * can use emit({x:10},new Gravity(10),{'particleUpdate',fun}) or emit([{x:10},new Initialize],new Gravity(10),{'particleUpdate',fun})\n\t * @method removeAllParticles\n\t */\n\tcreateParticle(initialize, behaviour) {\n\t\tconst particle = this.parent.pool.get(Particle);\n\t\tthis.setupParticle(particle, initialize, behaviour);\n\t\tthis.dispatch(\"PARTICLE_CREATED\", particle);\n\n\t\treturn particle;\n\t}\n\n\tsetupParticle(particle, initialize, behaviour) {\n\t\tlet initializes = this.initializes;\n\t\tlet behaviours = this.behaviours;\n\n\t\tif (initialize) {\n\t\t\tinitializes = Util.isArray(initialize) ? initialize : [initialize];\n\t\t}\n\n\t\tif (behaviour) {\n\t\t\tbehaviour = Util.isArray(behaviour) ? behaviour : [behaviour];\n\t\t}\n\n\t\tparticle.reset();\n\t\tInitializeUtil.initialize(this, particle, initializes);\n\t\tparticle.addBehaviours(behaviours);\n\t\tparticle.parent = this;\n\n\t\tthis.particles.push(particle);\n\t}\n\n\tremove(){\n\t\tthis.stop();\n\t\tUtil.destroy(this.particles);\n\t}\n\n\t/**\n\t * Destory this Emitter\n\t * @method destroy\n\t */\n\tdestroy(slow) {\n\t\tthis.dead = true;\n\t\tthis.remove();\n\t\tthis.removeAllInitializers();\n\t\tthis.removeAllBehaviours();\n\t\tthis.parent && this.parent.removeEmitter(this);\n\t}\n\n}\n\nEventDispatcher.bind(Emitter);","import Util from '../utils/Util';\nimport Emitter from './Emitter';\n\nexport default class BehaviourEmitter extends Emitter {\n\n\t/**\n\t * The BehaviourEmitter class inherits from Proton.Emitter\n\t *\n\t * use the BehaviourEmitter you can add behaviours to self;\n\t * @class Proton.BehaviourEmitter\n\t * @constructor\n\t * @param {Object} pObj the parameters object;\n\t */\n\tconstructor(pObj) {\n\t\tsuper(pObj);\n\n\t\tthis.selfBehaviours = [];\n\t};\n\t\n\t/**\n\t * add the Behaviour to emitter;\n\t *\n\t * you can use Behaviours array:emitter.addSelfBehaviour(Behaviour1,Behaviour2,Behaviour3);\n\t * @method addSelfBehaviour\n\t * @param {Proton.Behaviour} behaviour like this new Proton.Color('random')\n\t */\n\taddSelfBehaviour(...rest) {\n\t\tconst length = rest.length;\n\t\tlet i;\n\n\t\tfor (i = 0; i < length; i++) {\n\t\t\tthis.selfBehaviours.push(rest[i]);\n\t\t}\n\t};\n\n\t/**\n\t * remove the Behaviour for self\n\t * @method removeSelfBehaviour\n\t * @param {Proton.Behaviour} behaviour a behaviour\n\t */\n\tremoveSelfBehaviour(behaviour) {\n\t\tconst index = this.selfBehaviours.indexOf(behaviour);\n\t\tif (index > -1) this.selfBehaviours.splice(index, 1);\n\t};\n\n\tupdate(time) {\n\t\tsuper.update(time);\n\n\t\tif (!this.sleep) {\n\t\t\tconst length = this.selfBehaviours.length;\n\t\t\tlet i;\n\n\t\t\tfor (i = 0; i < length; i++) {\n\t\t\t\tthis.selfBehaviours[i].applyBehaviour(this, time, i);\n\t\t\t}\n\t\t}\n\t}\n}","import Util from '../utils/Util';\nimport Emitter from './Emitter';\n\nexport default class FollowEmitter extends Emitter {\n\n\t/**\n\t * The FollowEmitter class inherits from Proton.Emitter\n\t *\n\t * use the FollowEmitter will emit particle when mousemoving\n\t *\n\t * @class Proton.FollowEmitter\n\t * @constructor\n\t * @param {Element} mouseTarget mouseevent's target;\n\t * @param {Number} ease the easing of following speed;\n\t * @default 0.7\n\t * @param {Object} pObj the parameters object;\n\t */\n\tconstructor(mouseTarget, ease, pObj) {\n\t\tsuper(pObj);\n\n\t\tthis.mouseTarget = Util.initValue(mouseTarget, window);\n\t\tthis.ease = Util.initValue(ease, .7);\n\n\t\tthis._allowEmitting = false;\n\t\tthis.initEventHandler();\n\t};\n\n\tinitEventHandler() {\n\t\tthis.mousemoveHandler = e => this.mousemove.call(this, e);\n\t\tthis.mousedownHandler = e => this.mousedown.call(this, e);\n\t\tthis.mouseupHandler = e => this.mouseup.call(this, e);\n\n\t\tthis.mouseTarget.addEventListener('mousemove', this.mousemoveHandler, false);\n\t}\n\n\t/**\n\t * start emit particle\n\t * @method emit\n\t */\n\temit() {\n\t\tthis._allowEmitting = true;\n\t}\n\n\t/**\n\t * stop emiting\n\t * @method stop\n\t */\n\tstop() {\n\t\tthis._allowEmitting = false;\n\t}\n\n\tmousemove(e) {\n\t\tif (e.layerX || e.layerX == 0) {\n\t\t\tthis.p.x += (e.layerX - this.p.x) * this.ease;\n\t\t\tthis.p.y += (e.layerY - this.p.y) * this.ease;\n\t\t} else if (e.offsetX || e.offsetX == 0) {\n\t\t\tthis.p.x += (e.offsetX - this.p.x) * this.ease;\n\t\t\tthis.p.y += (e.offsetY - this.p.y) * this.ease;\n\t\t}\n\n\t\tif (this._allowEmitting) super.emit('once');\n\t};\n\n\t/**\n\t * Destory this Emitter\n\t * @method destroy\n\t */\n\tdestroy() {\n\t\tsuper.destroy();\n\t\tthis.mouseTarget.removeEventListener('mousemove', this.mousemoveHandler, false);\n\t}\n\n}\n","import Pool from '../core/Pool';\nimport Util from '../utils/Util';\n\nexport default class BaseRenderer {\n\n constructor(element, stroke) {\n this.element = element;\n this.stroke = stroke;\n\n this.initHandler();\n\n this.circleConf = { isCircle: true };\n this.pool = new Pool();\n this.name = 'BaseRenderer';\n }\n\n setStroke(color, thinkness) {\n color = Util.initValue(color, '#000000');\n thinkness = Util.initValue(thinkness, 1);\n\n this.stroke = { color, thinkness };\n }\n\n initHandler() {\n this._protonUpdateHandler = () => { this.onProtonUpdate.call(this) };\n this._protonUpdateAfterHandler = () => { this.onProtonUpdateAfter.call(this) };\n this._emitterAddedHandler = (emitter) => { this.onEmitterAdded.call(this, emitter) };\n this._emitterRemovedHandler = (emitter) => { this.onEmitterRemoved.call(this, emitter) };\n this._particleCreatedHandler = (particle) => { this.onParticleCreated.call(this, particle) };\n this._particleUpdateHandler = (particle) => { this.onParticleUpdate.call(this, particle) };\n this._particleDeadHandler = (particle) => { this.onParticleDead.call(this, particle) };\n }\n\n init(proton) {\n this.parent = proton;\n\n proton.addEventListener(Proton.PROTON_UPDATE, this._protonUpdateHandler);\n proton.addEventListener(Proton.PROTON_UPDATE_AFTER, this._protonUpdateAfterHandler);\n\n proton.addEventListener(Proton.EMITTER_ADDED, this._emitterAddedHandler);\n proton.addEventListener(Proton.EMITTER_REMOVED, this._emitterRemovedHandler);\n\n proton.addEventListener(Proton.PARTICLE_CREATED, this._particleCreatedHandler);\n proton.addEventListener(Proton.PARTICLE_UPDATE, this._particleUpdateHandler);\n proton.addEventListener(Proton.PARTICLE_DEAD, this._particleDeadHandler);\n }\n\n resize(width, height) {}\n\n remove(proton) {\n this.parent.removeEventListener(Proton.PROTON_UPDATE, this._protonUpdateHandler);\n this.parent.removeEventListener(Proton.PROTON_UPDATE_AFTER, this._protonUpdateAfterHandler);\n\n this.parent.removeEventListener(Proton.EMITTER_ADDED, this._emitterAddedHandler);\n this.parent.removeEventListener(Proton.EMITTER_REMOVED, this._emitterRemovedHandler);\n\n this.parent.removeEventListener(Proton.PARTICLE_CREATED, this._particleCreatedHandler);\n this.parent.removeEventListener(Proton.PARTICLE_UPDATE, this._particleUpdateHandler);\n this.parent.removeEventListener(Proton.PARTICLE_DEAD, this._particleDeadHandler);\n\n this.parent = null;\n }\n\n destroy(){\n this.remove();\n }\n \n onProtonUpdate() {}\n onProtonUpdateAfter() {}\n\n onEmitterAdded(emitter) {}\n onEmitterRemoved(emitter) {}\n\n onParticleCreated(particle) {}\n onParticleUpdate(particle) {}\n onParticleDead(particle) {}\n}","import Util from '../utils/Util';\nimport ImgUtil from '../utils/ImgUtil';\nimport ColorUtil from '../utils/ColorUtil';\nimport MathUtils from '../math/MathUtils';\nimport BaseRenderer from './BaseRenderer';\n\nexport default class CanvasRenderer extends BaseRenderer {\n\n constructor(element) {\n super(element);\n\n this.stroke = null;\n this.context = this.element.getContext(\"2d\");\n this.bufferCache = {};\n\n this.name = 'CanvasRenderer';\n }\n\n resize(width, height) {\n this.element.width = width;\n this.element.height = height;\n }\n\n onProtonUpdate() {\n this.context.clearRect(0, 0, this.element.width, this.element.height);\n }\n\n onParticleCreated(particle) {\n if (particle.body)\n ImgUtil.getImgFromCache(particle.body, this.addImg2Body, particle);\n else\n particle.color = particle.color || '#ff0000';\n }\n\n onParticleUpdate(particle) {\n if (particle.body) {\n if (particle.body instanceof Image) this.drawImage(particle);\n } else {\n this.drawCircle(particle);\n }\n }\n\n onParticleDead(particle) {\n particle.body = null;\n }\n\n\n // private \n addImg2Body(img, particle) {\n particle.body = img;\n }\n\n // private drawCircle --\n drawImage(particle) {\n const w = particle.body.width * particle.scale | 0;\n const h = particle.body.height * particle.scale | 0;\n const x = particle.p.x - w / 2;\n const y = particle.p.y - h / 2;\n\n if (!!particle.color) {\n if (!particle.transform[\"buffer\"]) particle.transform.buffer = this.createBuffer(particle.body);\n\n const bufferContext = particle.transform.buffer.getContext('2d');\n bufferContext.clearRect(0, 0, particle.transform.buffer.width, particle.transform.buffer.height);\n bufferContext.globalAlpha = particle.alpha;\n bufferContext.drawImage(particle.body, 0, 0);\n\n bufferContext.globalCompositeOperation = \"source-atop\";\n bufferContext.fillStyle = ColorUtil.rgbToHex(particle.transform.rgb);\n bufferContext.fillRect(0, 0, particle.transform.buffer.width, particle.transform.buffer.height);\n bufferContext.globalCompositeOperation = \"source-over\";\n bufferContext.globalAlpha = 1;\n\n this.context.drawImage(particle.transform.buffer, 0, 0, particle.transform.buffer.width, particle.transform.buffer.height, x, y, w, h);\n } else {\n this.context.save();\n\n this.context.globalAlpha = particle.alpha;\n this.context.translate(particle.p.x, particle.p.y);\n this.context.rotate(MathUtils.degreeTransform(particle.rotation));\n this.context.translate(-particle.p.x, -particle.p.y);\n this.context.drawImage(particle.body, 0, 0, particle.body.width, particle.body.height, x, y, w, h);\n\n this.context.globalAlpha = 1;\n this.context.restore();\n }\n }\n\n // private drawCircle --\n drawCircle(particle) {\n if (particle.transform[\"rgb\"])\n this.context.fillStyle = 'rgba(' + particle.transform.rgb.r + ',' + particle.transform.rgb.g + ',' + particle.transform.rgb.b + ',' + particle.alpha + ')';\n else\n this.context.fillStyle = particle.color;\n\n // draw circle\n this.context.beginPath();\n this.context.arc(particle.p.x, particle.p.y, particle.radius, 0, Math.PI * 2, true);\n\n if (this.stroke) {\n this.context.strokeStyle = this.stroke.color;\n this.context.lineWidth = this.stroke.thinkness;\n this.context.stroke();\n }\n\n this.context.closePath();\n this.context.fill();\n }\n\n // private createBuffer --\n createBuffer(image) {\n if (image instanceof Image) {\n const size = image.width + '_' + image.height;\n let canvas = this.bufferCache[size];\n\n if (!canvas) {\n canvas = document.createElement('canvas');\n canvas.width = image.width;\n canvas.height = image.height;\n this.bufferCache[size] = canvas;\n }\n\n return canvas;\n }\n }\n}","import Util from '../utils/Util';\nimport DomUtil from '../utils/DomUtil';\nimport ImgUtil from '../utils/ImgUtil';\nimport MathUtils from '../math/MathUtils';\nimport BaseRenderer from './BaseRenderer';\n\nexport default class DomRenderer extends BaseRenderer {\n\n constructor(element) {\n super(element);\n\n this.stroke = null;\n this.pool.create = (body, particle) => this.createBody(body, particle);\n this.addImg2Body = this.addImg2Body.bind(this);\n\n this.transform3d = false;\n\n this.name = 'DomRenderer';\n }\n\n onParticleCreated(particle) {\n if (particle.body) {\n ImgUtil.getImgFromCache(particle.body, this.addImg2Body, particle);\n } else {\n particle.body = this.pool.get(this.circleConf, particle);\n this.element.appendChild(particle.body);\n }\n }\n\n onParticleUpdate(particle) {\n if (this.bodyReady(particle)) {\n if (this.transform3d)\n DomUtil.transform3d(particle.body, particle.p.x, particle.p.y, particle.scale, particle.rotation);\n else\n DomUtil.transform(particle.body, particle.p.x, particle.p.y, particle.scale, particle.rotation);\n\n particle.body.style.opacity = particle.alpha;\n if (particle.body.isCircle) {\n particle.body.style.backgroundColor = particle.color || '#ff0000';\n }\n }\n }\n\n onParticleDead(particle) {\n if (this.bodyReady(particle)) {\n this.element.removeChild(particle.body);\n this.pool.expire(particle.body);\n particle.body = null;\n }\n }\n\n bodyReady(particle) {\n return typeof particle.body === 'object' && particle.body && !particle.body.isInner;\n }\n\n // private \n addImg2Body(img, particle) {\n if (particle.dead) return;\n particle.body = this.pool.get(img, particle);\n DomUtil.resize(particle.body, img.width, img.height);\n\n this.element.appendChild(particle.body);\n }\n\n createBody(body, particle) {\n if (body.isCircle)\n return this.createCircle(particle);\n else\n return this.createSprite(body, particle);\n }\n\n // private --\n createCircle(particle) {\n const dom = DomUtil.createDiv(`${particle.id}_dom`, 2 * particle.radius, 2 * particle.radius);\n dom.style.borderRadius = `${particle.radius}px`;\n\n if (this.stroke) {\n dom.style.borderColor = this.stroke.color;\n dom.style.borderWidth = `${this.stroke.thinkness}px`;\n }\n dom.isCircle = true;\n\n return dom;\n }\n\n createSprite(body, particle) {\n const url = typeof body === 'string' ? body : body.src;\n const dom = DomUtil.createDiv(`${particle.id}_dom`, body.width, body.height);\n dom.style.backgroundImage = `url(${url})`;\n\n return dom;\n }\n\n}","import Util from '../utils/Util';\nimport BaseRenderer from './BaseRenderer';\n\nexport default class EaselRenderer extends BaseRenderer {\n\n constructor(element, stroke) {\n super(element);\n\n this.stroke = stroke;\n this.name = 'EaselRenderer';\n }\n\n onParticleCreated(particle) {\n if (particle.body) {\n this.createSprite(particle);\n } else {\n this.createCircle(particle);\n }\n\n this.element.addChild(particle.body);\n }\n\n onParticleUpdate(particle) {\n if (particle.body) {\n particle.body.x = particle.p.x;\n particle.body.y = particle.p.y;\n\n particle.body.alpha = particle.alpha;\n particle.body.scaleX = particle.body.scaleY = particle.scale;\n particle.body.rotation = particle.rotation;\n }\n }\n\n onParticleDead(particle) {\n if (particle.body) {\n particle.body.parent && particle.body.parent.removeChild(particle.body);\n this.pool.expire(particle.body);\n particle.body = null;\n }\n\n if (particle.graphics) this.pool.expire(particle.graphics);\n }\n\n // private\n createSprite(particle) {\n particle.body = this.pool.get(particle.body);\n\n if (particle.body.parent) return;\n if (particle.body['image']) {\n particle.body.regX = particle.body.image.width / 2;\n particle.body.regY = particle.body.image.height / 2;\n }\n }\n\n createCircle(particle) {\n const graphics = this.pool.get(createjs.Graphics);\n\n if (this.stroke) {\n if (this.stroke instanceof String)\n graphics.beginStroke(this.stroke);\n else\n graphics.beginStroke('#000000');\n }\n graphics.beginFill(particle.color || '#ff0000').drawCircle(0, 0, particle.radius);\n\n const shape = this.pool.get(createjs.Shape, [graphics]);\n\n particle.body = shape;\n particle.graphics = graphics;\n }\n\n}","import Util from '../utils/Util';\nimport Rectangle from '../math/Rectangle';\nimport BaseRenderer from './BaseRenderer';\n\nexport default class PixelRenderer extends BaseRenderer {\n\n constructor(element, rectangle) {\n super(element);\n\n this.context = this.element.getContext('2d');\n this.imageData = null;\n this.rectangle = null;\n this.rectangle = rectangle;\n this.createImageData(rectangle);\n\n this.name = 'PixelRenderer';\n }\n\n resize(width, height) {\n this.element.width = width;\n this.element.height = height;\n }\n\n createImageData(rectangle) {\n this.rectangle = rectangle ? rectangle : new Rectangle(0, 0, this.element.width, this.element.height);\n this.imageData = this.context.createImageData(this.rectangle.width, this.rectangle.height);\n this.context.putImageData(this.imageData, this.rectangle.x, this.rectangle.y);\n }\n\n onProtonUpdate() {\n this.context.clearRect(this.rectangle.x, this.rectangle.y, this.rectangle.width, this.rectangle.height);\n this.imageData = this.context.getImageData(this.rectangle.x, this.rectangle.y, this.rectangle.width, this.rectangle.height);\n }\n\n onProtonUpdateAfter() {\n this.context.putImageData(this.imageData, this.rectangle.x, this.rectangle.y);\n }\n\n onParticleCreated(particle) {}\n\n onParticleUpdate(particle) {\n if (this.imageData) {\n this.setPixel(this.imageData, Math.floor(particle.p.x - this.rectangle.x), Math.floor(particle.p.y - this.rectangle.y), particle);\n }\n }\n\n setPixel(imagedata, x, y, particle) {\n const rgb = particle.transform.rgb;\n\n if ((x < 0) || (x > this.element.width) || (y < 0) || (y > this.elementwidth))\n return;\n\n const i = ((y >> 0) * imagedata.width + (x >> 0)) * 4;\n\n imagedata.data[i] = rgb.r;\n imagedata.data[i + 1] = rgb.g;\n imagedata.data[i + 2] = rgb.b;\n imagedata.data[i + 3] = particle.alpha * 255;\n }\n\n onParticleDead(particle) {\n\n }\n\n}","import Pool from '../core/Pool';\nimport Util from '../utils/Util';\nimport ColorUtil from '../utils/ColorUtil';\nimport MathUtils from '../math/MathUtils';\nimport BaseRenderer from './BaseRenderer';\n\nexport default class PixiRenderer extends BaseRenderer {\n\n constructor(element, stroke) {\n super(element);\n\n this.stroke = stroke;\n this.setColor = false;\n this.pool.create = (body, particle) => this.createBody(body, particle);\n this.name = 'PixiRenderer';\n }\n\n onProtonUpdate() { }\n\n /**\n * @param particle\n */\n onParticleCreated(particle) {\n if (particle.body) {\n particle.body = this.pool.get(particle.body, particle);\n } else {\n particle.body = this.pool.get(this.circleConf, particle);\n }\n\n this.element.addChild(particle.body);\n }\n\n /**\n * @param particle\n */\n onParticleUpdate(particle) {\n this.transform(particle, particle.body);\n if (this.setColor) particle.body.tint = ColorUtil.getHex16FromParticle(particle);\n }\n\n /**\n * @param particle\n */\n onParticleDead(particle) {\n this.element.removeChild(particle.body);\n this.pool.expire(particle.body);\n particle.body = null;\n }\n\n destroy(particles) {\n super.destroy();\n this.pool.destroy();\n\n let i = particles.length;\n while (i--) {\n let particle = particles[i];\n if (particle.body) {\n this.element.removeChild(particle.body);\n }\n }\n }\n\n transform(particle, target) {\n target.x = particle.p.x;\n target.y = particle.p.y;\n\n target.alpha = particle.alpha;\n\n target.scale.x = particle.scale;\n target.scale.y = particle.scale;\n\n // using cached version of MathUtils.PI_180 for slight performance increase.\n target.rotation = particle.rotation * MathUtils.PI_180; // MathUtils.PI_180;\n }\n\n createBody(body, particle) {\n if (body.isCircle)\n return this.createCircle(particle);\n else\n return this.createSprite(body);\n }\n\n createSprite(body) {\n const sprite = body.isInner ? PIXI.Sprite.fromImage(body.src) : new PIXI.Sprite(body);\n sprite.anchor.x = 0.5;\n sprite.anchor.y = 0.5;\n\n return sprite;\n }\n\n createCircle(particle) {\n const graphics = new PIXI.Graphics();\n\n if (this.stroke) {\n let stroke = this.stroke instanceof String ? this.stroke : 0x000000;\n graphics.beginStroke(this.stroke);\n }\n\n graphics.beginFill(particle.color || 0x008ced);\n graphics.drawCircle(0, 0, particle.radius);\n graphics.endFill();\n\n return graphics;\n }\n}","import Mat3 from '../math/Mat3';\n\nexport default class MStack {\n\n\tconstructor() {\n\t\tthis.mats = [];\n\t\tthis.size = 0;\n\n\t\tfor (let i = 0; i < 20; i++) this.mats.push(Mat3.create([0, 0, 0, 0, 0, 0, 0, 0, 0]));\n\t}\n\n\tset(m, i) {\n\t\tif (i == 0)\n\t\t\tMat3.set(m, this.mats[0]);\n\t\telse\n\t\t\tMat3.multiply(this.mats[i - 1], m, this.mats[i]);\n\n\t\tthis.size = Math.max(this.size, i + 1);\n\t}\n\n\tpush(m) {\n\t\tif (this.size == 0)\n\t\t\tMat3.set(m, this.mats[0]);\n\t\telse\n\t\t\tMat3.multiply(this.mats[this.size - 1], m, this.mats[this.size]);\n\n\t\tthis.size++;\n\t}\n\n\tpop() {\n\t\tif (this.size > 0)\n\t\t\tthis.size--;\n\t}\n\n\ttop() {\n\t\treturn (this.mats[this.size - 1]);\n\t}\n}","import Mat3 from '../math/Mat3';\nimport BaseRenderer from './BaseRenderer';\n\nimport Util from '../utils/Util';\nimport ImgUtil from '../utils/ImgUtil';\nimport MStack from '../utils/MStack';\nimport DomUtil from '../utils/DomUtil';\nimport WebGLUtil from '../utils/WebGLUtil';\nimport MathUtils from '../math/MathUtils';\n\nexport default class WebGLRenderer extends BaseRenderer {\n\n constructor(element) {\n super(element);\n\n this.gl = this.element.getContext('experimental-webgl', { antialias: true, stencil: false, depth: false });\n if (!this.gl) alert(\"Sorry your browser do not suppest WebGL!\");\n\n this.initVar();\n this.setMaxRadius();\n this.initShaders();\n this.initBuffers();\n\n this.gl.blendEquation(this.gl.FUNC_ADD);\n this.gl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE_MINUS_SRC_ALPHA);\n this.gl.enable(this.gl.BLEND);\n\n this.addImg2Body = this.addImg2Body.bind(this);\n\n this.name = 'WebGLRenderer';\n }\n\n init(proton) {\n super.init(proton);\n this.resize(this.element.width, this.element.height);\n }\n\n resize(width, height) {\n this.umat[4] = -2;\n this.umat[7] = 1;\n\n this.smat[0] = 1 / width;\n this.smat[4] = 1 / height;\n\n this.mstack.set(this.umat, 0);\n this.mstack.set(this.smat, 1);\n\n this.gl.viewport(0, 0, width, height);\n this.element.width = width;\n this.element.height = height;\n }\n\n setMaxRadius(radius) {\n this.circleCanvasURL = this.createCircle(radius);\n }\n\n getVertexShader() {\n const vsSource = [\"uniform vec2 viewport;\", \"attribute vec2 aVertexPosition;\", \"attribute vec2 aTextureCoord;\", \"uniform mat3 tMat;\", \"varying vec2 vTextureCoord;\", \"varying float alpha;\", \"void main() {\", \"vec3 v = tMat * vec3(aVertexPosition, 1.0);\", \"gl_Position = vec4(v.x, v.y, 0, 1);\", \"vTextureCoord = aTextureCoord;\", \"alpha = tMat[0][2];\", \"}\"].join(\"\\n\");\n return vsSource;\n }\n\n getFragmentShader() {\n const fsSource = [\"precision mediump float;\", \"varying vec2 vTextureCoord;\", \"varying float alpha;\", \"uniform sampler2D uSampler;\", \"uniform vec4 color;\", \"uniform bool useTexture;\", \"uniform vec3 uColor;\", \"void main() {\", \"vec4 textureColor = texture2D(uSampler, vTextureCoord);\", \"gl_FragColor = textureColor * vec4(uColor, 1.0);\", \"gl_FragColor.w *= alpha;\", \"}\"].join(\"\\n\");\n return fsSource;\n }\n\n initVar() {\n this.mstack = new MStack();\n this.umat = Mat3.create([2, 0, 1, 0, -2, 0, -1, 1, 1]);\n this.smat = Mat3.create([1 / 100, 0, 1, 0, 1 / 100, 0, 0, 0, 1]);\n this.texturebuffers = {};\n }\n\n blendEquation(A) {\n this.gl.blendEquation(this.gl[A]);\n }\n\n blendFunc(A, B) {\n this.gl.blendFunc(this.gl[A], this.gl[B]);\n }\n\n getShader(gl, str, fs) {\n const shader = fs ? gl.createShader(gl.FRAGMENT_SHADER) : gl.createShader(gl.VERTEX_SHADER);\n\n gl.shaderSource(shader, str);\n gl.compileShader(shader);\n\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n alert(gl.getShaderInfoLog(shader));\n return null;\n }\n\n return shader;\n }\n\n initShaders() {\n const fragmentShader = this.getShader(this.gl, this.getFragmentShader(), true);\n const vertexShader = this.getShader(this.gl, this.getVertexShader(), false);\n\n this.sprogram = this.gl.createProgram();\n this.gl.attachShader(this.sprogram, vertexShader);\n this.gl.attachShader(this.sprogram, fragmentShader);\n this.gl.linkProgram(this.sprogram);\n\n if (!this.gl.getProgramParameter(this.sprogram, this.gl.LINK_STATUS))\n alert(\"Could not initialise shaders\");\n\n this.gl.useProgram(this.sprogram);\n this.sprogram.vpa = this.gl.getAttribLocation(this.sprogram, \"aVertexPosition\");\n this.sprogram.tca = this.gl.getAttribLocation(this.sprogram, \"aTextureCoord\");\n this.gl.enableVertexAttribArray(this.sprogram.tca);\n this.gl.enableVertexAttribArray(this.sprogram.vpa);\n\n this.sprogram.tMatUniform = this.gl.getUniformLocation(this.sprogram, \"tMat\");\n this.sprogram.samplerUniform = this.gl.getUniformLocation(this.sprogram, \"uSampler\");\n this.sprogram.useTex = this.gl.getUniformLocation(this.sprogram, \"useTexture\");\n this.sprogram.color = this.gl.getUniformLocation(this.sprogram, \"uColor\");\n this.gl.uniform1i(this.sprogram.useTex, 1);\n };\n\n initBuffers() {\n const vs = [0, 3, 1, 0, 2, 3];\n let idx;\n\n this.unitIBuffer = this.gl.createBuffer();\n this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitIBuffer);\n this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(vs), this.gl.STATIC_DRAW);\n\n let i;\n let ids = [];\n for (i = 0; i < 100; i++) ids.push(i);\n idx = new Uint16Array(ids);\n\n this.unitI33 = this.gl.createBuffer();\n this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitI33);\n this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, idx, this.gl.STATIC_DRAW);\n\n ids = [];\n for (i = 0; i < 100; i++) ids.push(i, i + 1, i + 2);\n idx = new Uint16Array(ids);\n\n this.stripBuffer = this.gl.createBuffer();\n this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.stripBuffer);\n this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, idx, this.gl.STATIC_DRAW);\n };\n\n createCircle(raidus) {\n this.circleCanvasRadius = WebGLUtil.nhpot(Util.initValue(raidus, 32));\n const canvas = DomUtil.createCanvas('circle_canvas', this.circleCanvasRadius * 2, this.circleCanvasRadius * 2);\n const context = canvas.getContext('2d');\n\n context.beginPath();\n context.arc(this.circleCanvasRadius, this.circleCanvasRadius, this.circleCanvasRadius, 0, Math.PI * 2, true);\n context.closePath();\n context.fillStyle = '#FFF';\n context.fill();\n\n return canvas.toDataURL();\n };\n\n drawImg2Canvas(particle) {\n const _w = particle.body.width;\n const _h = particle.body.height;\n\n const _width = WebGLUtil.nhpot(particle.body.width);\n const _height = WebGLUtil.nhpot(particle.body.height);\n\n const _scaleX = particle.body.width / _width;\n const _scaleY = particle.body.height / _height;\n\n if (!this.texturebuffers[particle.transform.src])\n this.texturebuffers[particle.transform.src] = [this.gl.createTexture(), this.gl.createBuffer(), this.gl.createBuffer()];\n\n particle.transform.texture = this.texturebuffers[particle.transform.src][0];\n particle.transform.vcBuffer = this.texturebuffers[particle.transform.src][1];\n particle.transform.tcBuffer = this.texturebuffers[particle.transform.src][2];\n\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.transform.tcBuffer);\n this.gl.bufferData(this.gl.ARRAY_BUFFER, new Float32Array([0.0, 0.0, _scaleX, 0.0, 0.0, _scaleY, _scaleY, _scaleY]), this.gl.STATIC_DRAW);\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.transform.vcBuffer);\n this.gl.bufferData(this.gl.ARRAY_BUFFER, new Float32Array([0.0, 0.0, _w, 0.0, 0.0, _h, _w, _h]), this.gl.STATIC_DRAW);\n\n const context = particle.transform.canvas.getContext('2d');\n const data = context.getImageData(0, 0, _width, _height);\n\n this.gl.bindTexture(this.gl.TEXTURE_2D, particle.transform.texture);\n this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, this.gl.RGBA, this.gl.UNSIGNED_BYTE, data);\n this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MAG_FILTER, this.gl.LINEAR);\n this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MIN_FILTER, this.gl.LINEAR_MIPMAP_NEAREST);\n this.gl.generateMipmap(this.gl.TEXTURE_2D);\n\n particle.transform.textureLoaded = true;\n particle.transform.textureWidth = _w;\n particle.transform.textureHeight = _h;\n }\n\n onProtonUpdate() {\n //this.gl.clearColor(0, 0, 0, 1);\n //this.gl.clear(this.gl.COLOR_BUFFER_BIT | this.gl.DEPTH_BUFFER_BIT);\n }\n\n onParticleCreated(particle) {\n particle.transform.textureLoaded = false;\n particle.transform.tmat = Mat3.create();\n particle.transform.tmat[8] = 1;\n particle.transform.imat = Mat3.create();\n particle.transform.imat[8] = 1;\n\n if (particle.body) {\n ImgUtil.getImgFromCache(particle.body, this.addImg2Body, particle);\n } else {\n ImgUtil.getImgFromCache(this.circleCanvasURL, this.addImg2Body, particle);\n particle.transform.oldScale = particle.radius / this.circleCanvasRadius;\n }\n }\n\n // private \n addImg2Body(img, particle) {\n if (particle.dead) return;\n \n particle.body = img;\n particle.transform.src = img.src;\n particle.transform.canvas = ImgUtil.getCanvasFromCache(img);\n particle.transform.oldScale = 1;\n\n this.drawImg2Canvas(particle);\n }\n\n onParticleUpdate(particle) {\n if (particle.transform.textureLoaded) {\n this.updateMatrix(particle);\n\n this.gl.uniform3f(this.sprogram.color, particle.transform.rgb.r / 255, particle.transform.rgb.g / 255, particle.transform.rgb.b / 255);\n this.gl.uniformMatrix3fv(this.sprogram.tMatUniform, false, this.mstack.top());\n\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.transform.vcBuffer);\n this.gl.vertexAttribPointer(this.sprogram.vpa, 2, this.gl.FLOAT, false, 0, 0);\n this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.transform.tcBuffer);\n this.gl.vertexAttribPointer(this.sprogram.tca, 2, this.gl.FLOAT, false, 0, 0);\n this.gl.bindTexture(this.gl.TEXTURE_2D, particle.transform.texture);\n this.gl.uniform1i(this.sprogram.samplerUniform, 0);\n this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitIBuffer);\n\n this.gl.drawElements(this.gl.TRIANGLES, 6, this.gl.UNSIGNED_SHORT, 0);\n\n this.mstack.pop();\n }\n }\n\n onParticleDead(particle) { }\n\n updateMatrix(particle) {\n const moveOriginMatrix = WebGLUtil.makeTranslation(-particle.transform.textureWidth / 2, -particle.transform.textureHeight / 2);\n const translationMatrix = WebGLUtil.makeTranslation(particle.p.x, particle.p.y);\n\n const angel = particle.rotation * (MathUtils.PI_180);\n const rotationMatrix = WebGLUtil.makeRotation(angel);\n\n const scale = particle.scale * particle.transform.oldScale;\n const scaleMatrix = WebGLUtil.makeScale(scale, scale);\n let matrix = WebGLUtil.matrixMultiply(moveOriginMatrix, scaleMatrix);\n\n matrix = WebGLUtil.matrixMultiply(matrix, rotationMatrix);\n matrix = WebGLUtil.matrixMultiply(matrix, translationMatrix);\n\n Mat3.inverse(matrix, particle.transform.imat);\n matrix[2] = particle.alpha;\n\n this.mstack.push(matrix);\n }\n}","import Util from '../utils/Util';\nimport BaseRenderer from './BaseRenderer';\n\nexport default class CustomRenderer extends BaseRenderer {\n\n constructor(element) {\n super(element);\n\n this.name = 'CustomRenderer';\n }\n\n}","import Zone from './Zone';\nimport Util from '../utils/Util';\nimport MathUtils from '../math/MathUtils';\n\nexport default class CircleZone extends Zone {\n\n\tconstructor(x1, y1, x2, y2, direction) {\n\t\tsuper();\n\n\t\tif (x2 - x1 >= 0) {\n\t\t\tthis.x1 = x1;\n\t\t\tthis.y1 = y1;\n\t\t\tthis.x2 = x2;\n\t\t\tthis.y2 = y2;\n\t\t} else {\n\t\t\tthis.x1 = x2;\n\t\t\tthis.y1 = y2;\n\t\t\tthis.x2 = x1;\n\t\t\tthis.y2 = y1;\n\t\t}\n\n\t\tthis.dx = this.x2 - this.x1;\n\t\tthis.dy = this.y2 - this.y1;\n\n\t\tthis.minx = Math.min(this.x1, this.x2);\n\t\tthis.miny = Math.min(this.y1, this.y2);\n\t\tthis.maxx = Math.max(this.x1, this.x2);\n\t\tthis.maxy = Math.max(this.y1, this.y2);\n\n\t\tthis.dot = this.x2 * this.y1 - this.x1 * this.y2;\n\t\tthis.xxyy = this.dx * this.dx + this.dy * this.dy;\n\n\t\tthis.gradient = this.getGradient();\n\t\tthis.length = this.getLength();\n\t\tthis.direction = Util.initValue(direction, '>');\n\t}\n\n\n\tgetPosition() {\n\t\tthis.random = Math.random();\n\t\tthis.vector.x = this.x1 + this.random * this.length * Math.cos(this.gradient);\n\t\tthis.vector.y = this.y1 + this.random * this.length * Math.sin(this.gradient);\n\n\t\treturn this.vector;\n\t}\n\n\tgetDirection(x, y) {\n\t\tconst A = this.dy;\n\t\tconst B = -this.dx;\n\t\tconst C = this.dot;\n\t\tconst D = B == 0 ? 1 : B;\n\n\t\tif ((A * x + B * y + C) * D > 0)\n\t\t\treturn true;\n\t\telse\n\t\t\treturn false;\n\t}\n\n\tgetDistance(x, y) {\n\t\tconst A = this.dy;\n\t\tconst B = -this.dx;\n\t\tconst C = this.dot;\n\t\tconst D = (A * x + B * y + C);\n\n\t\treturn D / Math.sqrt(this.xxyy);\n\t}\n\n\tgetSymmetric(v) {\n\t\tconst tha2 = v.getGradient();\n\t\tconst tha1 = this.getGradient();\n\t\tconst tha = 2 * (tha1 - tha2);\n\n\t\tconst oldx = v.x;\n\t\tconst oldy = v.y;\n\n\t\tv.x = oldx * Math.cos(tha) - oldy * Math.sin(tha);\n\t\tv.y = oldx * Math.sin(tha) + oldy * Math.cos(tha);\n\n\t\treturn v;\n\t}\n\n\tgetGradient() {\n\t\treturn Math.atan2(this.dy, this.dx);\n\t}\n\n\trangeOut(particle) {\n\t\tconst angle = Math.abs(this.getGradient());\n\n\t\tif (angle <= MathUtils.PI / 4) {\n\t\t\tif (particle.p.x <= this.maxx && particle.p.x >= this.minx) return true;\n\t\t} else {\n\t\t\tif (particle.p.y <= this.maxy && particle.p.y >= this.miny) return true;\n\t\t}\n\t\t\n\t\treturn false;\n\t}\n\n\tgetLength() {\n\t\treturn Math.sqrt(this.dx * this.dx + this.dy * this.dy)\n\t}\n\n\tcrossing(particle) {\n\t\tif (this.crossType == \"dead\") {\n\t\t\tif (this.direction == \">\" || this.direction == \"R\" || this.direction == \"right\" || this.direction == \"down\") {\n\t\t\t\tif (!this.rangeOut(particle)) return;\n\t\t\t\tif (this.getDirection(particle.p.x, particle.p.y)) particle.dead = true;\n\t\t\t} else {\n\t\t\t\tif (!this.rangeOut(particle)) return;\n\t\t\t\tif (!this.getDirection(particle.p.x, particle.p.y)) particle.dead = true;\n\t\t\t}\n\t\t}\n\n\t\telse if (this.crossType == \"bound\") {\n\t\t\tif (!this.rangeOut(particle)) return;\n\n\t\t\tif (this.getDistance(particle.p.x, particle.p.y) <= particle.radius) {\n\t\t\t\tif (this.dx == 0) {\n\t\t\t\t\tparticle.v.x *= -1;\n\t\t\t\t} else if (this.dy == 0) {\n\t\t\t\t\tparticle.v.y *= -1;\n\t\t\t\t} else {\n\t\t\t\t\tthis.getSymmetric(particle.v);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\telse if (this.crossType == \"cross\") {\n\t\t\tif (this.alert) {\n\t\t\t\tconsole.error('Sorry lineZone does not support cross method');\n\t\t\t\tthis.alert = false;\n\t\t\t}\n\t\t}\n\t}\n\n}","import Zone from './Zone';\nimport MathUtils from '../math/MathUtils';\n\nexport default class CircleZone extends Zone {\n\n constructor(x, y, radius) {\n super();\n\n this.x = x;\n this.y = y;\n this.radius = radius;\n\n this.angle = 0;\n this.center = { x, y };\n }\n\n getPosition() {\n this.random = Math.random();\n this.angle = MathUtils.PIx2 * Math.random();\n\n this.vector.x = this.x + this.random * this.radius * Math.cos(this.angle);\n this.vector.y = this.y + this.random * this.radius * Math.sin(this.angle);\n\n return this.vector;\n }\n\n setCenter(x, y) {\n this.center.x = x;\n this.center.y = y;\n }\n\n crossing(particle) {\n const d = particle.p.distanceTo(this.center);\n\n if (this.crossType == \"dead\") {\n if (d - particle.radius > this.radius)\n particle.dead = true;\n } else if (this.crossType == \"bound\") {\n if (d + particle.radius >= this.radius)\n this.getSymmetric(particle);\n } else if (this.crossType == \"cross\") {\n if (this.alert) {\n alert('Sorry CircleZone does not support cross method');\n this.alert = false;\n }\n }\n }\n\n getSymmetric(particle) {\n let tha2 = particle.v.getGradient();\n let tha1 = this.getGradient(particle);\n\n let tha = 2 * (tha1 - tha2);\n let oldx = particle.v.x;\n let oldy = particle.v.y;\n\n particle.v.x = oldx * Math.cos(tha) - oldy * Math.sin(tha);\n particle.v.y = oldx * Math.sin(tha) + oldy * Math.cos(tha);\n }\n\n getGradient(particle) {\n return -MathUtils.PI_2 + Math.atan2(particle.p.y - this.center.y, particle.p.x - this.center.x);\n }\n}","import Zone from './Zone';\n\nexport default class PointZoneRectZone extends Zone {\n\n\tconstructor(x, y, width, height) {\n\t\tsuper();\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.width = width;\n\t\tthis.height = height;\n\t}\n\n\tgetPosition() {\n\t\tthis.vector.x = this.x + Math.random() * this.width;\n\t\tthis.vector.y = this.y + Math.random() * this.height;\n\n\t\treturn this.vector;\n\t}\n\n\tcrossing(particle) {\n\t\tif (this.crossType == \"dead\") {\n\t\t\tif (particle.p.x + particle.radius < this.x)\n\t\t\t\tparticle.dead = true;\n\t\t\telse if (particle.p.x - particle.radius > this.x + this.width)\n\t\t\t\tparticle.dead = true;\n\n\t\t\tif (particle.p.y + particle.radius < this.y)\n\t\t\t\tparticle.dead = true;\n\t\t\telse if (particle.p.y - particle.radius > this.y + this.height)\n\t\t\t\tparticle.dead = true;\n\t\t}\n\n\t\telse if (this.crossType == \"bound\") {\n\t\t\tif (particle.p.x - particle.radius < this.x) {\n\t\t\t\tparticle.p.x = this.x + particle.radius;\n\t\t\t\tparticle.v.x *= -1;\n\t\t\t} else if (particle.p.x + particle.radius > this.x + this.width) {\n\t\t\t\tparticle.p.x = this.x + this.width - particle.radius;\n\t\t\t\tparticle.v.x *= -1;\n\t\t\t}\n\n\t\t\tif (particle.p.y - particle.radius < this.y) {\n\t\t\t\tparticle.p.y = this.y + particle.radius;\n\t\t\t\tparticle.v.y *= -1;\n\t\t\t} else if (particle.p.y + particle.radius > this.y + this.height) {\n\t\t\t\tparticle.p.y = this.y + this.height - particle.radius;\n\t\t\t\tparticle.v.y *= -1;\n\t\t\t}\n\t\t}\n\n\t\telse if (this.crossType == \"cross\") {\n\t\t\tif (particle.p.x + particle.radius < this.x && particle.v.x <= 0)\n\t\t\t\tparticle.p.x = this.x + this.width + particle.radius;\n\t\t\telse if (particle.p.x - particle.radius > this.x + this.width && particle.v.x >= 0)\n\t\t\t\tparticle.p.x = this.x - particle.radius;\n\n\t\t\tif (particle.p.y + particle.radius < this.y && particle.v.y <= 0)\n\t\t\t\tparticle.p.y = this.y + this.height + particle.radius;\n\t\t\telse if (particle.p.y - particle.radius > this.y + this.height && particle.v.y >= 0)\n\t\t\t\tparticle.p.y = this.y - particle.radius;\n\t\t}\n\t}\n}","import Zone from './Zone';\nimport Util from '../utils/Util';\n\nexport default class ImageZone extends Zone {\n\n\tconstructor(imageData, x, y, d) {\n\t\tsuper();\n\n\t\tthis.reset(imageData, x, y, d);\n\t}\n\n\treset(imageData, x, y, d) {\n\t\tthis.imageData = imageData;\n\t\tthis.x = Util.initValue(x, 0);\n\t\tthis.y = Util.initValue(y, 0);\n\t\tthis.d = Util.initValue(d, 2);\n\n\t\tthis.vectors = [];\n\t\tthis.setVectors();\n\t}\n\n\tsetVectors() {\n\t\tlet i, j;\n\t\tconst length1 = this.imageData.width;\n\t\tconst length2 = this.imageData.height;\n\n\t\tfor (i = 0; i < length1; i += this.d) {\n\t\t\tfor (j = 0; j < length2; j += this.d) {\n\t\t\t\tlet index = ((j >> 0) * length1 + (i >> 0)) * 4;\n\n\t\t\t\tif (this.imageData.data[index + 3] > 0) {\n\t\t\t\t\tthis.vectors.push({ x: i + this.x, y: j + this.y });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.vector;\n\t}\n\n\tgetBound(x, y) {\n\t\tvar index = ((y >> 0) * this.imageData.width + (x >> 0)) * 4;\n\t\tif (this.imageData.data[index + 3] > 0)\n\t\t\treturn true;\n\t\telse\n\t\t\treturn false;\n\t}\n\n\tgetPosition() {\n\t\treturn this.vector.copy(this.vectors[Math.floor(Math.random() * this.vectors.length)]);\n\t}\n\n\tgetColor(x, y) {\n\t\tx -= this.x;\n\t\ty -= this.y;\n\t\tvar i = ((y >> 0) * this.imageData.width + (x >> 0)) * 4;\n\n\t\treturn {\n\t\t\tr: this.imageData.data[i],\n\t\t\tg: this.imageData.data[i + 1],\n\t\t\tb: this.imageData.data[i + 2],\n\t\t\ta: this.imageData.data[i + 3]\n\t\t};\n\t}\n\n\tcrossing(particle) {\n\t\tif (this.crossType == \"dead\") {\n\t\t\tif (this.getBound(particle.p.x - this.x, particle.p.y - this.y))\n\t\t\t\tparticle.dead = true;\n\t\t\telse\n\t\t\t\tparticle.dead = false;\n\t\t} \n\t\t\n\t\telse if (this.crossType == \"bound\") {\n\t\t\tif (!this.getBound(particle.p.x - this.x, particle.p.y - this.y))\n\t\t\t\tparticle.v.negate();\n\t\t}\n\t}\n}","import Util from '../utils/Util';\nimport ColorUtil from '../utils/ColorUtil';\nimport MathUtils from '../math/MathUtils';\nimport CircleZone from '../zone/CircleZone';\nimport PointZone from '../zone/PointZone';\nimport LineZone from '../zone/LineZone';\nimport RectZone from '../zone/RectZone';\n\nexport default {\n\taddEventListener(proton, fun) {\n\t\tproton.addEventListener(\"PROTON_UPDATE_AFTER\", () => fun());\n\t},\n\n\tgetStyle(color) {\n\t\tconst rgb = ColorUtil.hexToRGB(color || '#ff0000');\n\t\treturn `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, 0.5)`;\n\t},\n\t\n\tdrawZone(proton, canvas, zone, clear) {\n\t\tconst context = canvas.getContext('2d');\n\t\tconst style = this.getStyle();\n\n\t\tthis.addEventListener(proton, () => {\n\t\t\tif (clear)\n\t\t\t\tcontext.clearRect(0, 0, canvas.width, canvas.height);\n\n\t\t\tif (zone instanceof PointZone) {\n\t\t\t\tcontext.beginPath();\n\t\t\t\tcontext.fillStyle = style;\n\t\t\t\tcontext.arc(zone.x, zone.y, 10, 0, Math.PI * 2, true);\n\t\t\t\tcontext.fill();\n\t\t\t\tcontext.closePath();\n\t\t\t} else if (zone instanceof LineZone) {\n\t\t\t\tcontext.beginPath();\n\t\t\t\tcontext.strokeStyle = style;\n\t\t\t\tcontext.moveTo(zone.x1, zone.y1);\n\t\t\t\tcontext.lineTo(zone.x2, zone.y2);\n\t\t\t\tcontext.stroke();\n\t\t\t\tcontext.closePath();\n\t\t\t} else if (zone instanceof RectZone) {\n\t\t\t\tcontext.beginPath();\n\t\t\t\tcontext.strokeStyle = style;\n\t\t\t\tcontext.drawRect(zone.x, zone.y, zone.width, zone.height);\n\t\t\t\tcontext.stroke();\n\t\t\t\tcontext.closePath();\n\t\t\t} else if (zone instanceof CircleZone) {\n\t\t\t\tcontext.beginPath();\n\t\t\t\tcontext.strokeStyle = style;\n\t\t\t\tcontext.arc(zone.x, zone.y, zone.radius, 0, Math.PI * 2, true);\n\t\t\t\tcontext.stroke();\n\t\t\t\tcontext.closePath();\n\t\t\t}\n\t\t});\n\t},\n\t\n\tdrawEmitter(proton, canvas, emitter, clear) {\n\t\tconst context = canvas.getContext('2d');\n\t\tconst style = this.getStyle();\n\n\t\tthis.addEventListener(proton, () => {\n\t\t\tif (clear) context.clearRect(0, 0, canvas.width, canvas.height);\n\t\t\t\n\t\t\tcontext.beginPath();\n\t\t\tcontext.fillStyle = style;\n\t\t\tcontext.arc(emitter.p.x, emitter.p.y, 10, 0, Math.PI * 2, true);\n\t\t\tcontext.fill();\n\t\t\tcontext.closePath();\n\t\t});\n\t},\n}\n\n","// http://paulirish.com/2011/requestanimationframe-for-smart-animating/\n// http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating\n\n// requestAnimationFrame polyfill by Erik Möller\n// fixes from Paul Irish and Tino Zijdel\n( function() {\n\t\tvar lastTime = 0;\n\t\tvar vendors = ['ms', 'moz', 'webkit', 'o'];\n\t\tfor (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {\n\t\t\twindow.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];\n\t\t\twindow.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];\n\t\t}\n\n\t\tif (!window.requestAnimationFrame)\n\t\t\twindow.requestAnimationFrame = function(callback, element) {\n\t\t\t\tvar currTime = new Date().getTime();\n\t\t\t\tvar timeToCall = Math.max(0, 16 - (currTime - lastTime));\n\t\t\t\tvar id = window.setTimeout(function() {\n\t\t\t\t\tcallback(currTime + timeToCall);\n\t\t\t\t}, timeToCall);\n\t\t\t\tlastTime = currTime + timeToCall;\n\t\t\t\treturn id;\n\t\t\t};\n\n\t\tif (!window.cancelAnimationFrame)\n\t\t\twindow.cancelAnimationFrame = function(id) {\n\t\t\t\tclearTimeout(id);\n\t\t\t};\n\t}()); ","// import \nimport Proton from \"./core/Proton\";\nimport Particle from \"./core/Particle\";\nimport Pool from \"./core/Pool\";\n\nimport Util from \"./utils/Util\";\nimport ColorUtil from \"./utils/ColorUtil\";\nimport MathUtils from \"./math/MathUtils\";\nimport Vector2D from \"./math/Vector2D\";\nimport Polar2D from \"./math/Polar2D\";\nimport Mat3 from \"./math/Mat3\";\nimport Span from \"./math/Span\";\nimport ArraySpan from \"./math/ArraySpan\";\nimport Rectangle from \"./math/Rectangle\";\nimport ease from \"./math/ease\";\n\nimport Rate from \"./initialize/Rate\";\nimport Initialize from \"./initialize/Initialize\";\nimport Life from \"./initialize/Life\";\nimport Position from \"./initialize/Position\";\nimport Velocity from \"./initialize/Velocity\";\nimport Mass from \"./initialize/Mass\";\nimport Radius from \"./initialize/Radius\";\nimport Body from \"./initialize/Body\";\n\nimport Behaviour from \"./behaviour/Behaviour\";\nimport Force from \"./behaviour/Force\";\nimport Attraction from \"./behaviour/Attraction\";\nimport RandomDrift from \"./behaviour/RandomDrift\";\nimport Gravity from \"./behaviour/Gravity\";\nimport Collision from \"./behaviour/Collision\";\nimport CrossZone from \"./behaviour/CrossZone\";\nimport Alpha from \"./behaviour/Alpha\";\nimport Scale from \"./behaviour/Scale\";\nimport Rotate from \"./behaviour/Rotate\";\nimport Color from \"./behaviour/Color\";\nimport Repulsion from \"./behaviour/Repulsion\";\nimport GravityWell from \"./behaviour/GravityWell\";\n\nimport Emitter from \"./emitter/Emitter\";\nimport BehaviourEmitter from \"./emitter/BehaviourEmitter\";\nimport FollowEmitter from \"./emitter/FollowEmitter\";\n\nimport CanvasRenderer from \"./render/CanvasRenderer\";\nimport DomRenderer from \"./render/DomRenderer\";\nimport EaselRenderer from \"./render/EaselRenderer\";\nimport PixelRenderer from \"./render/PixelRenderer\";\nimport PixiRenderer from \"./render/PixiRenderer\";\nimport WebGLRenderer from \"./render/WebGLRenderer\";\nimport CustomRenderer from \"./render/CustomRenderer\";\n\nimport Zone from \"./zone/Zone\";\nimport LineZone from \"./zone/LineZone\";\nimport CircleZone from \"./zone/CircleZone\";\nimport PointZone from \"./zone/PointZone\";\nimport RectZone from \"./zone/RectZone\";\nimport ImageZone from \"./zone/ImageZone\";\n\nimport Debug from \"./debug/Debug\";\nimport \"./polyfill/requestAnimationFrame\";\n\n// namespace\nProton.Particle = Proton.P = Particle;\nProton.Pool = Pool;\n\nProton.Util = Util;\nProton.ColorUtil = ColorUtil;\nProton.MathUtils = MathUtils;\nProton.Vector2D = Proton.Vector = Vector2D;\nProton.Polar2D = Proton.Polar = Polar2D;\nProton.ArraySpan = ArraySpan;\nProton.Rectangle = Rectangle;\nProton.Rate = Rate;\nProton.ease = ease;\nProton.Span = Span;\nProton.Mat3 = Mat3;\nProton.getSpan = (a, b, center) => new Span(a, b, center);\nProton.createArraySpan = ArraySpan.createArraySpan;\n\nProton.Initialize = Proton.Init = Initialize;\nProton.Life = Proton.L = Life;\nProton.Position = Proton.P = Position;\nProton.Velocity = Proton.V = Velocity;\nProton.Mass = Proton.M = Mass;\nProton.Radius = Proton.R = Radius;\nProton.Body = Proton.B = Body;\n\nProton.Behaviour = Behaviour;\nProton.Force = Proton.F = Force;\nProton.Attraction = Proton.A = Attraction;\nProton.RandomDrift = Proton.RD = RandomDrift;\nProton.Gravity = Proton.G = Gravity;\nProton.Collision = Collision;\nProton.CrossZone = CrossZone;\nProton.Alpha = Proton.A = Alpha;\nProton.Scale = Proton.S = Scale;\nProton.Rotate = Rotate;\nProton.Color = Color;\nProton.Repulsion = Repulsion;\nProton.GravityWell = GravityWell;\n\nProton.Emitter = Emitter;\nProton.BehaviourEmitter = BehaviourEmitter;\nProton.FollowEmitter = FollowEmitter;\n\nProton.Zone = Zone;\nProton.LineZone = LineZone;\nProton.CircleZone = CircleZone;\nProton.PointZone = PointZone;\nProton.RectZone = RectZone;\nProton.ImageZone = ImageZone;\n\nProton.CanvasRenderer = CanvasRenderer;\nProton.DomRenderer = DomRenderer;\nProton.EaselRenderer = EaselRenderer;\nProton.PixiRenderer = PixiRenderer;\nProton.PixelRenderer = PixelRenderer;\nProton.WebGLRenderer = Proton.WebGlRenderer = WebGLRenderer;\nProton.CustomRenderer = CustomRenderer;\n\nProton.Debug = Debug;\n\nObject.assign(Proton, ease);\n\n// export\nexport default Proton;"],"names":["PI","MathUtils","a","b","INT","Math","floor","random","center","f","this","randomAToB","display","num","toString","slice","Vector2D","x","y","atan2","PI_2","v","w","undefined","addVectors","subVectors","s","set","multiplyScalar","sqrt","divideScalar","length","distanceToSquared","tha","cos","sin","dx","dy","alpha","Span","isArray","Util","initValue","randomFloating","i","tx","ty","angleInRadians","c","sx","sy","a00","a01","a02","a10","a11","a12","a20","a21","a22","b00","b01","b02","b10","b11","b12","b20","b21","b22","id","width","height","position","dom","document","createElement","style","opacity","transform","resize","marginLeft","marginTop","div","scale","rotate","willChange","css3","key","val","bkey","charAt","toUpperCase","substr","IMG_CACHE","CANVAS_CACHE","context","image","rect","drawImage","imagedata","getImageData","clearRect","img","callback","param","src","Image","onload","e","target","WebGLUtil","canvas","DomUtil","createCanvas","getContext","value","defaults","Object","prototype","call","array","obj","ignore","o","indexOf","constructor","args","concat","bind","apply","pOBJ","hasProp","p","particle","copy","prototypeObject","filters","singleProp","hasOwnProperty","getSpanValue","pan","getValue","ImgUtil","arr","destroy","uid","getCacheID","cache","isInner","Pool","total","params","__puid","PUID","getID","pop","createOrClone","getCache","push","create","classApply","clone","count","Stats","proton","container","type","emitterIndex","rendererIndex","body","add","emitter","getEmitter","renderer","getRenderer","str","emitters","emitSpeed","getEmitterPos","initializes","concatArr","behaviours","name","getCreatedNumber","getCount","pool","innerHTML","cssText","join","addEventListener","_this","bg","color","parentNode","appendChild","renderers","result","cpool","round","EventDispatcher","_listeners","listener","removeEventListener","splice","listeners","handler","TargetClass","dispatchEvent","hasEventListener","removeAllEventListeners","Integration","particles","time","damping","eulerIntegrate","sleep","old","mass","clear","Proton","integrationType","oldTime","elapsed","stats","EULER","integrator","render","init","index","remove","parent","EMITTER_ADDED","EMITTER_REMOVED","PROTON_UPDATE","USE_CLOCK","Date","getTime","amendChangeTabsBug","emittersUpdate","PROTON_UPDATE_AFTER","update","getAllParticles","MEASURE","RK2","PARTICLE_CREATED","PARTICLE_UPDATE","PARTICLE_SLEEP","PARTICLE_DEAD","bindEmtterEvent","pow","ease","easeLinear","Particle","ID","reset","setPrototypeByObject","N180_PI","life","Infinity","age","energy","dead","sprite","radius","rotation","easing","destroyObject","removeAllBehaviours","rgb","r","g","applyBehaviours","max","applyBehaviour","behaviour","parents","initialize","addBehaviour","destroyArray","h","hex16","substring","parseInt","rbg","Number","Polar2D","abs","getX","getY","mat3","mat","Float32Array","mat1","mat2","m","vec","ArraySpan","_arr","randomColor","Rectangle","bottom","right","Rate","numpan","timepan","numPan","setSpanValue","timePan","startTime","nextTime","Initialize","Life","lifePan","Zone","vector","crossType","alert","PointZone","Position","zone","getPosition","Velocity","rpan","thapan","rPan","thaPan","vr","polar2d","normalizeVelocity","PI_180","Mass","massPan","Radius","oldRadius","Body","imagetarget","inner","Behaviour","getEasing","force","removeBehaviour","Force","fx","fy","normalizeForce","calculate","Attraction","targetPosition","normalizeValue","radiusSq","attractionForce","lengthSq","sub","normalize","RandomDrift","driftX","driftY","delay","panFoce","addXY","Gravity","Collision","collisionPool","delta","newPool","otherParticle","overlap","totalMass","averageMass1","averageMass2","distance","CrossZone","crossing","Alpha","same","alphaA","alphaB","Scale","scaleA","scaleB","Rotate","rotationA","rotationB","getDirection","Color","createArraySpan","colorA","ColorUtil","hexToRGB","colorB","Repulsion","GravityWell","centerPoint","distanceVec","distanceSq","factor","bindEmitter","setVector2DByObject","degreeTransform","Emitter","pObj","currentEmitTime","totalEmitTimes","rate","stoped","isNaN","initAll","rest","initializer","arguments","emitting","integrate","dispatch","expire","event","createParticle","get","setupParticle","addBehaviours","stop","slow","removeAllInitializers","removeEmitter","BehaviourEmitter","selfBehaviours","FollowEmitter","mouseTarget","window","_allowEmitting","initEventHandler","mousemoveHandler","_this2","mousemove","mousedownHandler","mousedown","mouseupHandler","mouseup","layerX","layerY","offsetX","offsetY","babelHelpers.get","BaseRenderer","element","stroke","initHandler","circleConf","isCircle","thinkness","_protonUpdateHandler","onProtonUpdate","_protonUpdateAfterHandler","onProtonUpdateAfter","_emitterAddedHandler","onEmitterAdded","_emitterRemovedHandler","onEmitterRemoved","_particleCreatedHandler","onParticleCreated","_particleUpdateHandler","onParticleUpdate","_particleDeadHandler","onParticleDead","CanvasRenderer","bufferCache","addImg2Body","drawCircle","buffer","createBuffer","bufferContext","globalAlpha","globalCompositeOperation","fillStyle","rgbToHex","fillRect","save","translate","restore","beginPath","arc","strokeStyle","lineWidth","closePath","fill","size","DomRenderer","createBody","transform3d","bodyReady","backgroundColor","removeChild","babelHelpers.typeof","createCircle","createSprite","createDiv","borderRadius","borderColor","borderWidth","url","backgroundImage","EaselRenderer","addChild","scaleX","scaleY","graphics","regX","regY","createjs","Graphics","String","beginStroke","beginFill","shape","Shape","PixelRenderer","rectangle","imageData","createImageData","putImageData","setPixel","elementwidth","data","PixiRenderer","setColor","tint","getHex16FromParticle","PIXI","Sprite","fromImage","anchor","endFill","MStack","mats","Mat3","multiply","WebGLRenderer","gl","antialias","stencil","depth","initVar","setMaxRadius","initShaders","initBuffers","blendEquation","FUNC_ADD","blendFunc","SRC_ALPHA","ONE_MINUS_SRC_ALPHA","enable","BLEND","umat","smat","mstack","viewport","circleCanvasURL","texturebuffers","A","B","fs","shader","createShader","FRAGMENT_SHADER","VERTEX_SHADER","shaderSource","compileShader","getShaderParameter","COMPILE_STATUS","getShaderInfoLog","fragmentShader","getShader","getFragmentShader","vertexShader","getVertexShader","sprogram","createProgram","attachShader","linkProgram","getProgramParameter","LINK_STATUS","useProgram","vpa","getAttribLocation","tca","enableVertexAttribArray","tMatUniform","getUniformLocation","samplerUniform","useTex","uniform1i","idx","unitIBuffer","bindBuffer","ELEMENT_ARRAY_BUFFER","bufferData","Uint16Array","STATIC_DRAW","ids","unitI33","stripBuffer","raidus","circleCanvasRadius","toDataURL","_w","_h","_width","_height","_scaleX","_scaleY","createTexture","texture","vcBuffer","tcBuffer","ARRAY_BUFFER","bindTexture","TEXTURE_2D","texImage2D","RGBA","UNSIGNED_BYTE","texParameteri","TEXTURE_MAG_FILTER","LINEAR","TEXTURE_MIN_FILTER","LINEAR_MIPMAP_NEAREST","generateMipmap","textureLoaded","textureWidth","textureHeight","tmat","imat","oldScale","drawImg2Canvas","updateMatrix","uniform3f","uniformMatrix3fv","top","vertexAttribPointer","FLOAT","drawElements","TRIANGLES","UNSIGNED_SHORT","moveOriginMatrix","translationMatrix","angel","rotationMatrix","scaleMatrix","matrix","inverse","CustomRenderer","CircleZone","x1","y1","x2","y2","direction","minx","min","miny","maxx","maxy","dot","xxyy","gradient","getGradient","getLength","tha2","oldx","oldy","rangeOut","getDistance","getSymmetric","error","angle","PIx2","d","distanceTo","PointZoneRectZone","ImageZone","vectors","setVectors","j","length1","length2","getBound","negate","fun","getStyle","LineZone","moveTo","lineTo","RectZone","drawRect","lastTime","vendors","requestAnimationFrame","cancelAnimationFrame","currTime","timeToCall","setTimeout","P","Vector","Polar","getSpan","Init","L","V","M","R","F","RD","G","S","WebGlRenderer","Debug","assign"],"mappings":";;;;;;;;;kLAAA,IAAMA,EAAK,UAELC,MAEED,OACO,EAALA,OACAA,EAAK,SACHA,EAAK,YACJ,IAAMA,sBAEJE,EAAGC,EAAGC,UACRA,EAGMC,KAAKC,MAAMD,KAAKE,UAAYJ,EAAID,IAAMA,EAFtCA,EAAIG,KAAKE,UAAYJ,EAAID,4BAKzBM,EAAQC,EAAGL,UACfM,KAAKC,WAAWH,EAASC,EAAGD,EAASC,EAAGL,wBAGxCQ,8BAEKV,UACLA,EAAIF,EAAK,wBAGVa,SACC,IAAMA,EAAIC,SAAS,kCAInB,KAAO,SAA2B,SAAhBT,KAAKE,UAAwB,GAAGO,SAAS,KAAKC,OAAO,iwCC9BjEC,wBAELC,EAAGC,kBACND,EAAIA,GAAK,OACTC,EAAIA,GAAK,wCAGdD,EAAGC,eACED,EAAIA,OACJC,EAAIA,EACFR,kCAGNO,eACIA,EAAIA,EACFP,kCAGNQ,eACIA,EAAIA,EACFR,kDAIO,GAAVA,KAAKO,EACEZ,KAAKc,MAAMT,KAAKQ,EAAGR,KAAKO,GAC1BP,KAAKQ,EAAI,EACPjB,EAAUmB,KACZV,KAAKQ,EAAI,GACNjB,EAAUmB,UADjB,+BAIJC,eACIJ,EAAII,EAAEJ,OACNC,EAAIG,EAAEH,EAEJR,iCAGPW,EAAGC,eACOC,IAAND,EACOZ,KAAKc,WAAWH,EAAGC,SAGzBL,GAAKI,EAAEJ,OACPC,GAAKG,EAAEH,EAELR,oCAGLR,EAAGC,eACAc,GAAKf,OACLgB,GAAKf,EAEHO,wCAGAR,EAAGC,eACLc,EAAIf,EAAEe,EAAId,EAAEc,OACZC,EAAIhB,EAAEgB,EAAIf,EAAEe,EAEVR,iCAGPW,EAAGC,eACOC,IAAND,EACOZ,KAAKe,WAAWJ,EAAGC,SAGzBL,GAAKI,EAAEJ,OACPC,GAAKG,EAAEH,EAELR,yCAGAR,EAAGC,eACLc,EAAIf,EAAEe,EAAId,EAAEc,OACZC,EAAIhB,EAAEgB,EAAIf,EAAEe,EAEVR,0CAGEgB,UACC,IAANA,QACKT,GAAKS,OACLR,GAAKQ,QAELC,IAAI,EAAG,GAGTjB,4CAGIgB,eACNT,GAAKS,OACLR,GAAKQ,EAEHhB,6CAIAA,KAAKkB,gBAAgB,+BAG5BP,UACOX,KAAKO,EAAII,EAAEJ,EAAIP,KAAKQ,EAAIG,EAAEH,4CAI1BR,KAAKO,EAAIP,KAAKO,EAAIP,KAAKQ,EAAIR,KAAKQ,0CAIhCb,KAAKwB,KAAKnB,KAAKO,EAAIP,KAAKO,EAAIP,KAAKQ,EAAIR,KAAKQ,8CAI1CR,KAAKoB,aAAapB,KAAKqB,6CAGvBV,UACAhB,KAAKwB,KAAKnB,KAAKsB,kBAAkBX,mCAGrCY,OACGhB,EAAIP,KAAKO,EACTC,EAAIR,KAAKQ,cAEVD,EAAIA,EAAIZ,KAAK6B,IAAID,GAAOf,EAAIb,KAAK8B,IAAIF,QACrCf,GAAKD,EAAIZ,KAAK8B,IAAIF,GAAOf,EAAIb,KAAK6B,IAAID,GAEpCvB,+CAGOW,OACRe,EAAK1B,KAAKO,EAAII,EAAEJ,EAChBoB,EAAK3B,KAAKQ,EAAIG,EAAEH,SAEfkB,EAAKA,EAAKC,EAAKA,+BAGrBhB,EAAGiB,eACCrB,IAAMI,EAAEJ,EAAIP,KAAKO,GAAKqB,OACtBpB,IAAMG,EAAEH,EAAIR,KAAKQ,GAAKoB,EAEpB5B,oCAGJW,UACMA,EAAEJ,IAAMP,KAAKO,GAAOI,EAAEH,IAAMR,KAAKQ,8CAIrCD,EAAI,OACJC,EAAI,EACFR,4CAIA,IAAIM,EAASN,KAAKO,EAAGP,KAAKQ,YC9JpBqB,wBAERrC,EAAGC,EAAGK,kBACZgC,SAAU,EAEXC,EAAKD,QAAQtC,SACXsC,SAAU,OACVtC,EAAIA,SAEJA,EAAIuC,EAAKC,UAAUxC,EAAG,QACtBC,EAAIsC,EAAKC,UAAUvC,EAAGO,KAAKR,QAC3BM,OAASiC,EAAKC,UAAUlC,GAAQ,+CAK9BJ,UACJM,KAAK8B,QACD9B,KAAKR,EAAEG,KAAKC,MAAMI,KAAKR,EAAE6B,OAAS1B,KAAKE,WAEzCG,KAAKF,OAGFP,EAAU0C,eAAejC,KAAKR,EAAGQ,KAAKP,EAAGC,GAFzCH,EAAUU,WAAWD,KAAKR,EAAGQ,KAAKP,EAAGC,uBCItC2B,KACAA,MACG,IAAIa,EAAI,EAAGA,EAAI,GAAIA,IAAM,KACRb,GAAUa,SAGzBb,EAAS,cAgBJc,EAAIC,UACR,EAAG,EAAG,EAAG,EAAG,EAAG,EAAGD,EAAIC,EAAI,eAczBC,OACLC,EAAI3C,KAAK6B,IAAIa,GACbrB,EAAIrB,KAAK8B,IAAIY,UAETC,GAAItB,EAAG,EAAGA,EAAGsB,EAAG,EAAG,EAAG,EAAG,eAgB3BC,EAAIC,UACFD,EAAI,EAAG,EAAG,EAAGC,EAAI,EAAG,EAAG,EAAG,eAgBvBhD,EAAGC,OACVgD,EAAMjD,EAAE,GACRkD,EAAMlD,EAAE,GACRmD,EAAMnD,EAAE,GACRoD,EAAMpD,EAAE,GACRqD,EAAMrD,EAAE,GACRsD,EAAMtD,EAAE,GACRuD,EAAMvD,EAAE,GACRwD,EAAMxD,EAAE,GACRyD,EAAMzD,EAAE,GACR0D,EAAMzD,EAAE,GACR0D,EAAM1D,EAAE,GACR2D,EAAM3D,EAAE,GACR4D,EAAM5D,EAAE,GACR6D,EAAM7D,EAAE,GACR8D,EAAM9D,EAAE,GACR+D,EAAM/D,EAAE,GACRgE,EAAMhE,EAAE,GACRiE,EAAMjE,EAAE,UAGRgD,EAAMS,EAAMR,EAAMW,EAAMV,EAAMa,EAC9Bf,EAAMU,EAAMT,EAAMY,EAAMX,EAAMc,EAC9BhB,EAAMW,EAAMV,EAAMa,EAAMZ,EAAMe,EAC9Bd,EAAMM,EAAML,EAAMQ,EAAMP,EAAMU,EAC9BZ,EAAMO,EAAMN,EAAMS,EAAMR,EAAMW,EAC9Bb,EAAMQ,EAAMP,EAAMU,EAAMT,EAAMY,EAC9BX,EAAMG,EAAMF,EAAMK,EAAMJ,EAAMO,EAC9BT,EAAMI,EAAMH,EAAMM,EAAML,EAAMQ,EAC9BV,EAAMK,EAAMJ,EAAMO,EAAMN,EAAMS,6BCpHzBC,EAAIC,EAAOC,EAAQC,OACtBC,EAAMC,SAASC,cAAc,mBACxBH,GAAY,aAEnBH,GAAKA,IACLC,MAAQA,IACRC,OAASA,IACTK,MAAMC,QAAU,IAChBD,MAAMJ,SAAWA,OAEhBM,UAAUL,GAAM,KAAM,IAAK,EAAG,GAE5BA,sBAGDJ,EAAIC,EAAOC,OACXE,EAAMC,SAASC,cAAc,gBAE/BN,GAAKA,IACLO,MAAMJ,SAAW,gBAChBO,OAAON,EAAKH,EAAOC,GAEjBE,mBAGJA,EAAKH,EAAOC,KACXK,MAAMN,MAAQA,EAAQ,OACtBM,MAAML,OAASA,EAAS,OACxBK,MAAMI,YAAcV,EAAQ,EAAI,OAChCM,MAAMK,WAAaV,EAAS,EAAI,yBAe9BW,EAAKjE,EAAGC,EAAGiE,EAAOC,OAClBN,eAAyB7D,SAAQC,eAAciE,cAAiBC,WAElER,MAAMS,WAAa,iBAClBC,KAAKJ,EAAK,YAAaJ,yBAGpBI,EAAKjE,EAAGC,EAAGiE,EAAOC,OACpBN,iBAA2B7D,SAAQC,kBAAiBiE,cAAiBC,WAEvER,MAAMS,WAAa,iBAClBC,KAAKJ,EAAK,qBAAsB,eAChCI,KAAKJ,EAAK,YAAaJ,kBAG3BI,EAAKK,EAAKC,OACLC,EAAOF,EAAIG,OAAO,GAAGC,cAAgBJ,EAAIK,OAAO,KAElDhB,eAAea,GAAUD,IACzBZ,YAAYa,GAAUD,IACtBZ,UAAUa,GAAUD,IACpBZ,WAAWa,GAAUD,IACrBZ,SAASW,GAASC,IC9ExBK,KACAC,gBAeWC,EAASC,EAAOC,KACjBC,UAAUF,EAAOC,EAAKhF,EAAGgF,EAAK/E,OAChCiF,EAAYJ,EAAQK,aAAaH,EAAKhF,EAAGgF,EAAK/E,EAAG+E,EAAK3B,MAAO2B,EAAK1B,iBAChE8B,UAAUJ,EAAKhF,EAAGgF,EAAK/E,EAAG+E,EAAK3B,MAAO2B,EAAK1B,QAE5C4B,cAeKG,EAAKC,EAAUC,OACrBC,EAAsB,iBAARH,EAAmBA,EAAMA,EAAIG,OAE7CZ,EAAUY,KACDZ,EAAUY,GAAMD,OACtB,KACGR,EAAQ,IAAIU,QACZC,OAAS,cACDF,GAAOG,EAAEC,SACVhB,EAAUY,GAAMD,MAGvBC,IAAMA,eAIDH,EAAKC,EAAUC,OACxBC,EAAMH,EAAIG,QAEXX,EAAaW,GAAM,KACdnC,EAAQwC,EAAgBR,EAAIhC,OAC5BC,EAASuC,EAAgBR,EAAI/B,QAE7BwC,EAASC,EAAQC,8BAAyC3C,EAAOC,GACvDwC,EAAOG,WAAW,MAC1BhB,UAAUI,EAAK,EAAG,EAAGA,EAAIhC,MAAOgC,EAAI/B,UAE/BkC,GAAOM,YAGZR,EAAST,EAAaW,GAAMD,GAEjCV,EAAaW,0BCvDdU,EAAOC,YACM,OAAVD,QAA4B5F,IAAV4F,EAAuBA,EAAQC,oBActDD,SAC6C,mBAA1CE,OAAOC,UAAUxG,SAASyG,KAAKJ,0BAW7BK,GACLA,IAAOA,EAAMzF,OAAS,2BAWhB0F,EAAKC,OACV,IAAIC,KAAKF,EACNC,GAAUA,EAAOE,QAAQD,IAAM,UAC5BF,EAAIE,wBAeRE,EAAaC,UACfA,MAEG,MAAMC,OAAOD,GAEd,IADiBD,EAAYG,KAAKC,MAAMJ,EAAaC,KAH1C,IAAID,gCAkBNhB,EAAQqB,GACpBxH,KAAKyH,QAAQD,EAAM,OAAMrB,EAAOuB,EAAEnH,EAAIiH,EAAA,GACtCxH,KAAKyH,QAAQD,EAAM,OAAMrB,EAAOuB,EAAElH,EAAIgH,EAAA,GAEtCxH,KAAKyH,QAAQD,EAAM,QAAOrB,EAAOxF,EAAEJ,EAAIiH,EAAA,IACvCxH,KAAKyH,QAAQD,EAAM,QAAOrB,EAAOxF,EAAEH,EAAIgH,EAAA,IAEvCxH,KAAKyH,QAAQD,EAAM,QAAOrB,EAAO3G,EAAEe,EAAIiH,EAAA,IACvCxH,KAAKyH,QAAQD,EAAM,QAAOrB,EAAO3G,EAAEgB,EAAIgH,EAAA,IAEvCxH,KAAKyH,QAAQD,EAAM,MAAMG,SAASD,EAAEE,KAAKJ,EAAA,GACzCxH,KAAKyH,QAAQD,EAAM,MAAMG,SAAShH,EAAEiH,KAAKJ,EAAA,GACzCxH,KAAKyH,QAAQD,EAAM,MAAMG,SAASnI,EAAEoI,KAAKJ,EAAA,GAEzCxH,KAAKyH,QAAQD,EAAM,aAAaG,SAASD,EAAEE,KAAKJ,EAAA,UAChDxH,KAAKyH,QAAQD,EAAM,aAAaG,SAAShH,EAAEiH,KAAKJ,EAAA,UAChDxH,KAAKyH,QAAQD,EAAM,eAAeG,SAASnI,EAAEoI,KAAKJ,EAAA,8BAGlDT,EAAKlC,WACJkC,QACelG,IAAbkG,EAAIlC,kCAoBMsB,EAAQ0B,EAAiBC,OACrC,IAAIC,KAAcF,EACf1B,EAAO6B,eAAeD,KAClBD,EACIA,EAAQZ,QAAQa,GAAc,IAC9B5B,EAAO4B,GAAc/H,KAAKiI,aAAaJ,EAAgBE,OAEpDA,GAAc/H,KAAKiI,aAAaJ,EAAgBE,YAK5D5B,yBAiBE3G,EAAGC,EAAG6C,UACX9C,aAAaqC,EACNrC,EAEFC,EAGI6C,EAGM,IAAIT,EAAKrC,EAAGC,EAAG6C,GAFf,IAAIT,EAAKrC,EAAGC,GAHhB,IAAIoC,EAAKrC,0BAoBf0I,UACFA,aAAerG,EAAOqG,EAAIC,WAAaD,yBAarC7C,EAASC,EAAOC,UAClB6C,EAAqB/C,EAASC,EAAOC,qBAGxC8C,EAAKvC,WACL5D,EAAImG,EAAIhH,OAELa,KAAK,OACEA,GAAGoG,QAAQxC,GAAU,MAAOI,WAC/BmC,EAAInG,KAGXb,OAAS,UCpNb,0BAGE8E,OACEoC,EAAMvI,KAAKwI,WAAWrC,UACtBoC,cAEUvI,KAAK2D,UACd8E,MAAMF,GAAOpC,EAEXoC,wBAGApC,OACHY,aACC,IAAIpD,KAAM3D,KAAKyI,MAAO,OACjBzI,KAAKyI,MAAM9E,MAELwC,EAAQ,OAAOxC,KAER,qBAARoD,gBAAAA,KAAsC,qBAAXZ,gBAAAA,KAAuBY,EAAI2B,SAAWvC,EAAOuC,SAC3E3B,EAAIhB,MAAQI,EAAOJ,IACnB,OAAOpC,SAIZ,yBAGD4E,UACCvI,KAAKyI,MAAMF,KCnBLI,wBAaLxI,kBACHyI,MAAQ,OACRH,+CAcLtC,EAAQ0C,EAAQN,OACZb,kBACEa,GAAOpC,EAAO2C,QAAUC,EAAKC,MAAM7C,IAGrCuB,EADA1H,KAAKyI,MAAMF,IAAQvI,KAAKyI,MAAMF,GAAKlH,OAAS,EACxCrB,KAAKyI,MAAMF,GAAKU,MAEhBjJ,KAAKkJ,cAAc/C,EAAQ0C,IAEjCC,OAAS3C,EAAO2C,QAAUP,EACrBb,iCAaJvB,UACInG,KAAKmJ,SAAShD,EAAO2C,QAAQM,KAAKjD,yCAgB/BA,EAAQ0C,eACbD,QAED5I,KAAKqJ,OACErJ,KAAKqJ,OAAOlD,EAAQ0C,GACH,mBAAV1C,EACPpE,EAAKuH,WAAWnD,EAAQ0C,GAExB1C,EAAOoD,+CAadC,EAAQ,MAEP,IAAI7F,KAAM3D,KAAKyI,SACPzI,KAAKyI,MAAM9E,GAAItC,OAE5B,OAAOmI,0CAUF,IAAI7F,KAAM3D,KAAKyI,WACXA,MAAM9E,GAAItC,OAAS,SACjBrB,KAAKyI,MAAM9E,oCAejB4E,YACCA,GAAO,UAERvI,KAAKyI,MAAMF,KAAMvI,KAAKyI,MAAMF,OAC1BvI,KAAKyI,MAAMF,YC1ILkB,wBAELC,kBACHA,OAASA,OACTC,UAAY,UACZC,KAAO,OAEPC,aAAe,OACfC,cAAgB,2CAGlB5F,EAAO6F,QACLC,IAAI9F,EAAO6F,OAEVE,EAAUjK,KAAKkK,aACfC,EAAWnK,KAAKoK,cAClBC,EAAM,UAEFrK,KAAK4J,WACJ,KACM,WAAa5J,KAAK0J,OAAOY,SAASjJ,OAAS,OAC9C4I,IAASI,GAAO,YAAcJ,EAAQM,UAAY,QAClDN,IAASI,GAAO,OAASrK,KAAKwK,cAAcP,eAG/C,EACGA,IAASI,GAAO,eAAiBJ,EAAQQ,YAAYpJ,OAAS,QAC9D4I,IAASI,GAAO,uCAAyCrK,KAAK0K,UAAUT,EAAQQ,aAAe,eAC/FR,IAASI,GAAO,cAAgBJ,EAAQU,WAAWtJ,OAAS,QAC5D4I,IAASI,GAAO,uCAAyCrK,KAAK0K,UAAUT,EAAQU,YAAc,0BAGjG,EACGR,IAAUE,GAAOF,EAASS,KAAO,QACjCT,IAAUE,GAAO,QAAUrK,KAAK6K,iBAAiBV,GAAY,yBAI1D,aAAenK,KAAK0J,OAAOoB,WAAa,UACxC,QAAU9K,KAAK0J,OAAOqB,KAAKD,WAAa,UACxC,SAAW9K,KAAK0J,OAAOqB,KAAKnC,WAGtCe,UAAUqB,UAAYX,8BAG3BnG,EAAO6F,kBACF/J,KAAK2J,UAAW,MACZC,KAAO,OAEPD,UAAY3F,SAASC,cAAc,YACnC0F,UAAUzF,MAAM+G,SACjB,sDACA,yDACA,6DACFC,KAAK,SAEFvB,UAAUwB,iBAAiB,QAAS,cAChCvB,OACDwB,EAAKxB,KAAO,IAAGwB,EAAKxB,KAAO,KAChC,OAECyB,SAAIC,gBACApH,QACC,IACI,SACG,kBAGP,IACI,SACG,uBAIH,SACG,YAGXyF,UAAUzF,MAAM,oBAAsBmH,OACtC1B,UAAUzF,MAAf,MAAgCoH,EAG/BtL,KAAK2J,UAAU4B,eACTxB,GAAQ/J,KAAK+J,MAAQ/F,SAAS+F,MAChCyB,YAAYxL,KAAK2J,uDAKnB3J,KAAK0J,OAAOY,SAAStK,KAAK6J,2DAI1B7J,KAAK0J,OAAO+B,UAAUzL,KAAK8J,iDAG5BzB,OACFqD,EAAS,OACRrD,IAAQA,EAAIhH,OAAQ,OAAOqK,MAE3B,IAAIxJ,EAAI,EAAGA,EAAImG,EAAIhH,OAAQa,QACjBmG,EAAInG,GAAG0I,MAAQ,IAAI1F,OAAO,EAAG,GAAK,WAG1CwG,2CAGMvB,UACNA,EAASY,KAAKnC,OAAUuB,EAASwB,OAASxB,EAASwB,MAAM/C,OAAU,wCAGhE1C,UACHvG,KAAKiM,MAAM1F,EAAEwB,EAAEnH,GAAK,IAAMZ,KAAKiM,MAAM1F,EAAEwB,EAAElH,YC3GnCqL,yCAGRC,WAAa,wDAWLlC,EAAMmC,UACd/L,KAAK8L,gBAGDE,oBAAoBpC,EAAMmC,QAF1BD,cAKJ9L,KAAK8L,WAAWlC,KAAO5J,KAAK8L,WAAWlC,YACvCkC,WAAWlC,GAAMR,KAAK2C,GAEpBA,8CAGSnC,EAAMmC,MACjB/L,KAAK8L,YACL9L,KAAK8L,WAAWlC,WAEfvB,EAAMrI,KAAK8L,WAAWlC,GACtBvI,EAASgH,EAAIhH,OAEVa,EAAI,EAAEA,EAAIb,EAAQa,OACnBmG,EAAInG,IAAM6J,EAAU,CACN,GAAV1K,SACQrB,KAAK8L,WAAWlC,KAKpBqC,OAAO/J,EAAG,0DAQN0H,GACfA,EAEI5J,KAAK8L,mBACF9L,KAAK8L,WAAWlC,GAFxB5J,KAAK8L,WAAa,2CAKZlC,EAAMxC,OACZsE,GAAS,EACPQ,EAAYlM,KAAK8L,cAEnBlC,GAAQsC,EAAW,KACf7D,EAAM6D,EAAUtC,OACfvB,EAAK,OAAOqD,UAKbS,SACAjK,EAAImG,EAAIhH,OACLa,OACOmG,EAAInG,KACLwJ,GAAUS,EAAQ/E,WAK1BsE,2CAGI9B,OACPsC,EAAYlM,KAAK8L,oBACbI,IAAaA,EAAUtC,mCA5EzBwC,KACIxF,UAAUyF,cAAgBR,EAAgBjF,UAAUyF,gBACpDzF,UAAU0F,iBAAmBT,EAAgBjF,UAAU0F,mBACvD1F,UAAUuE,iBAAmBU,EAAgBjF,UAAUuE,mBACvDvE,UAAUoF,oBAAsBH,EAAgBjF,UAAUoF,sBAC1DpF,UAAU2F,wBAA0BV,EAAgBjF,UAAU2F,iCCf7DC,wBAER5C,kBACNA,KAAOA,8CAGH6C,EAAWC,EAAMC,QACrBC,eAAeH,EAAWC,EAAMC,0CAIvBhF,EAAU+E,EAAMC,GACzBhF,EAASkF,UACJC,IAAIpF,EAAEE,KAAKD,EAASD,KACpBoF,IAAInM,EAAEiH,KAAKD,EAAShH,KAEpBnB,EAAE0B,eAAe,EAAIyG,EAASoF,QAC9BpM,EAAEqJ,IAAIrC,EAASnI,EAAE0B,eAAewL,MAChChF,EAAEsC,IAAIrC,EAASmF,IAAInM,EAAEO,eAAewL,IAEzCC,GAAShF,EAAShH,EAAEO,eAAeyL,KAE9BnN,EAAEwN,kBClBOC,wBAsCLC,kBAEH5C,iBACAmB,kBAEAiB,KAAO,OACPS,QAAU,OACVC,QAAU,OAEVC,MAAQ,IAAI5D,EAAMzJ,WAClB+K,KAAO,IAAIpC,EAAK,SAEhBuE,gBAAkBnL,EAAKC,UAAUkL,EAAiBD,EAAOK,YACzDC,WAAa,IAAIf,EAAYxM,KAAKkN,+DAY/BM,KACDC,KAAKzN,WACPyL,UAAUrC,KAAKoE,0CASTA,OACLE,EAAQ1N,KAAKyL,UAAUvE,QAAQsG,QAChC/B,UAAUQ,OAAOyB,EAAO,KACtBC,OAAO3N,yCAYPiK,QACFK,SAASlB,KAAKa,KACX2D,OAAS5N,UAEZqM,cAAcY,EAAOY,cAAe5D,yCAY/BA,OACJyD,EAAQ1N,KAAKsK,SAASpD,QAAQ+C,QAC/BK,SAAS2B,OAAOyB,EAAO,KACpBE,OAAS,UAEZvB,cAAcY,EAAOa,gBAAiB7D,4CAWtCoC,cAAcY,EAAOc,eAEtBd,EAAOe,UAAW,CACbhO,KAAKmN,UAASnN,KAAKmN,SAAW,IAAIc,MAAQC,eAE3CxB,GAAO,IAAIuB,MAAOC,eACjBd,SAAWV,EAAO1M,KAAKmN,SAAW,MAChCgB,oBAAsBnO,KAAKmO,0BAE7BhB,QAAUT,YAEVU,QAAU,MAIfpN,KAAKoN,QAAU,GAAGpN,KAAKoO,eAAepO,KAAKoN,cAE1Cf,cAAcY,EAAOoB,4DAGfjB,WACPlL,EAAIlC,KAAKsK,SAASjJ,OACfa,UAAUoI,SAASpI,GAAGoM,OAAOlB,gDAWhCpN,KAAKoN,QAAU,UACVD,SAAW,IAAIc,MAAQC,eACvBd,QAAU,8CAYfxE,EAAQ,EACR1G,EAAIlC,KAAKsK,SAASjJ,OAEfa,QAAclC,KAAKsK,SAASpI,GAAGuK,UAAUpL,OAChD,OAAOuH,oDAIH6D,KACAvK,EAAIlC,KAAKsK,SAASjJ,OAEfa,OAAiBuK,EAAUpF,OAAOrH,KAAKsK,SAASpI,GAAGuK,WAC1D,OAAOA,sCAWFnE,QAAQtI,KAAKyL,UAAWzL,KAAKuO,qBAC7BjG,QAAQtI,KAAKsK,eAEboC,KAAO,OACPS,QAAU,OAEVpC,KAAKzC,mBArMG2E,EAEVe,WAAY,EAFFf,EAKVuB,QAAU,IALAvB,EAMVK,MAAQ,QANEL,EAOVwB,IAAM,eAPIxB,EASVyB,iBAAmB,mBATTzB,EAUV0B,gBAAkB,kBAVR1B,EAWV2B,eAAiB,iBAXP3B,EAYV4B,cAAgB,gBAZN5B,EAaVc,cAAgB,gBAbNd,EAcVoB,oBAAsB,sBAdZpB,EAeVY,cAAgB,gBAfNZ,EAgBVa,gBAAkB,kBAhBRb,EAkBVkB,oBAAqB,EAlBXlB,EAmBV6B,iBAAkB,IAsLbxH,KAAK2F,GC7MrB,2BAEexG,UACAA,uBAGAA,UACA9G,KAAKoP,IAAItI,EAAO,yBAGfA,WACC9G,KAAKoP,IAAKtI,EAAQ,EAAI,GAAK,2BAG1BA,UACLA,GAAS,IAAO,EACV,GAAM9G,KAAKoP,IAAItI,EAAO,IAEzB,KAAQA,GAAS,GAAKA,EAAQ,yBAG9BA,UACD9G,KAAKoP,IAAItI,EAAO,0BAGdA,UACD9G,KAAKoP,IAAKtI,EAAQ,EAAI,GAAK,2BAGxBA,UACNA,GAAS,IAAO,EACV,GAAM9G,KAAKoP,IAAItI,EAAO,GAE1B,IAAO9G,KAAKoP,IAAKtI,EAAQ,EAAI,GAAK,yBAGjCA,UACD9G,KAAKoP,IAAItI,EAAO,0BAGdA,WACA9G,KAAKoP,IAAKtI,EAAQ,EAAI,GAAK,4BAGzBA,UACNA,GAAS,IAAO,EACV,GAAM9G,KAAKoP,IAAItI,EAAO,IAEzB,KAAQA,GAAS,GAAK9G,KAAKoP,IAAItI,EAAO,GAAK,wBAG5CA,UACsC,EAArC9G,KAAK6B,IAAIiF,EAASlH,EAAUmB,4BAG5B+F,UACD9G,KAAK8B,IAAIgF,EAASlH,EAAUmB,8BAGzB+F,UACD,IAAO9G,KAAK6B,IAAIjC,EAAUD,GAAKmH,GAAS,wBAG1CA,UACW,IAAVA,EAAe,EAAI9G,KAAKoP,IAAI,EAAG,IAAMtI,EAAQ,0BAG7CA,UACU,IAAVA,EAAe,EAAgC,EAA3B9G,KAAKoP,IAAI,GAAI,GAAKtI,2BAGpCA,UACI,IAAVA,EACO,EAEG,IAAVA,EACO,GAENA,GAAS,IAAO,EACV,GAAM9G,KAAKoP,IAAI,EAAG,IAAMtI,EAAQ,IAEpC,IAAqC,EAA7B9G,KAAKoP,IAAI,GAAI,KAAOtI,yBAG5BA,WACE9G,KAAKwB,KAAK,EAAKsF,EAAQA,GAAU,yBAGlCA,UACD9G,KAAKwB,KAAK,EAAIxB,KAAKoP,IAAKtI,EAAQ,EAAI,4BAGjCA,UACLA,GAAS,IAAO,GACT,IAAO9G,KAAKwB,KAAK,EAAIsF,EAAQA,GAAS,GAC3C,IAAO9G,KAAKwB,KAAK,GAAKsF,GAAS,GAAKA,GAAS,wBAG7CA,UAECA,EAASA,GAAS,QAAUA,EAD5B,+BAIAA,UAEAA,GAAgB,GAAKA,GAAS,QAAUA,EADxC,SACqD,0BAGnDA,OACNzF,EAAI,eACHyF,GAAS,IAAO,EACHA,EAAQA,IAA2B,GAAhBzF,GAAM,QAAeyF,EAAQzF,GAAvD,GACJ,KAAQyF,GAAS,GAAKA,IAA2B,GAAhBzF,GAAM,QAAeyF,EAAQzF,GAAK,uBAGpEgO,SACc,mBAATA,EACAA,EAEAhP,KAAKgP,IAAShP,KAAKiP,aCpHjBC,wBAYL1H,kBAMH7D,eAAiBuL,EAASC,UAC1BC,MAAM,WAEHrN,EAAKsN,qBAAqBrP,KAAMwH,2DAIjC7H,KAAKc,MAAMT,KAAKW,EAAEJ,GAAIP,KAAKW,EAAEH,GAAKjB,EAAU+P,sCAGjD7B,eACG8B,KAAOC,EAAAA,OACPC,IAAM,OAGNC,OAAS,OACTC,MAAO,OACP9C,OAAQ,OACR9C,KAAO,UACP6F,OAAS,UACThC,OAAS,UAETb,KAAO,OACP8C,OAAS,QACTjO,MAAQ,OACR6C,MAAQ,OACRqL,SAAW,OACXxE,MAAQ,UAERyE,OAASf,EAAKC,WAEP,QAARxB,QACKrJ,kBACAsD,EAAI,IAAIpH,OACRK,EAAI,IAAIL,OACRd,EAAI,IAAIc,OAERwM,OACE,IAAIxM,IACJ,IAAIA,IACJ,IAAIA,QAGNqK,kBAEAqF,cAAchQ,KAAKoE,UAAW,YAE9BsD,EAAEzG,IAAI,EAAG,QACTN,EAAEM,IAAI,EAAG,QACTzB,EAAEyB,IAAI,EAAG,QAET6L,IAAIpF,EAAEzG,IAAI,EAAG,QACb6L,IAAInM,EAAEM,IAAI,EAAG,QACb6L,IAAItN,EAAEyB,IAAI,EAAG,QAEbgP,uBAGJjQ,KAAKoE,UAAU8L,UAGX9L,UAAU8L,IAAIC,EAAI,SAClB/L,UAAU8L,IAAIE,EAAI,SAClBhM,UAAU8L,IAAIzQ,EAAI,UAJlB2E,UAAU8L,KAAQC,EAAG,IAAKC,EAAG,IAAK3Q,EAAG,KAOvCO,oCAGJ0M,EAAMgB,MACJ1N,KAAK6M,aACD4C,KAAO/C,OACP2D,gBAAgB3D,EAAMgB,IAG3B1N,KAAKyP,IAAMzP,KAAKuP,KAAM,KAChB9K,EAAQzE,KAAK+P,OAAO/P,KAAKyP,IAAMzP,KAAKuP,WACrCG,OAAS/P,KAAK2Q,IAAI,EAAI7L,EAAO,aAE7B6D,kDAIGoE,EAAMgB,OACZrM,EAASrB,KAAK2K,WAAWtJ,OAC3Ba,aAECA,EAAI,EAAGA,EAAIb,EAAQa,SACfyI,WAAWzI,IAAMlC,KAAK2K,WAAWzI,GAAGqO,eAAevQ,KAAM0M,EAAMgB,wCAI/D8C,QACJ7F,WAAWvB,KAAKoH,GAEjBA,EAAUxI,eAAe,YAAYwI,EAAUC,QAAQrH,KAAKpJ,QACtD0Q,WAAW1Q,4CAGX2K,OACJtJ,EAASsJ,EAAWtJ,OACtBa,aAECA,EAAI,EAAGA,EAAIb,EAAQa,SACfyO,aAAahG,EAAWzI,4CAIrBsO,OACN9C,EAAQ1N,KAAK2K,WAAWzD,QAAQsJ,GAElC9C,GAAS,IACS1N,KAAK2K,WAAWsB,OAAOyB,EAAO,GACtC+C,QAAU,sDAKnBG,aAAa5Q,KAAK2K,mDAQlBsF,2BACAP,OAAS,OACTC,MAAO,OACP/B,OAAS,cAnJDsB,EAEVC,GAAK,ECPhB,yBAkBa0B,OACCC,EAAwB,KAAfD,EAAE7L,OAAO,GAAa6L,EAAEE,UAAU,EAAG,GAAKF,SAKhDV,EAJCa,SAASF,EAAMC,UAAU,EAAG,GAAI,IAI9BX,EAHFY,SAASF,EAAMC,UAAU,EAAG,GAAI,IAG3BtR,EAFLuR,SAASF,EAAMC,UAAU,EAAG,GAAI,wBAerCE,gBACSA,EAAId,OAAMc,EAAIb,OAAMa,EAAIxR,qCAGrBiI,UACkB,MAA5BwJ,OAAOxJ,EAAEtD,UAAU8L,IAAIC,GAAyC,IAA5Be,OAAOxJ,EAAEtD,UAAU8L,IAAIE,GAAWc,OAAOxJ,EAAEtD,UAAU8L,IAAIzQ,KCxCvF0R,wBAERhB,EAAG5O,kBACT4O,EAAIxQ,KAAKyR,IAAIjB,IAAM,OACnB5O,IAAMA,GAAO,wCAGf4O,EAAG5O,eACD4O,EAAIA,OACJ5O,IAAMA,EACJvB,kCAGHmQ,eACCA,EAAIA,EACFnQ,oCAGDuB,eACDA,IAAMA,EACJvB,kCAGH0H,eACCyI,EAAIzI,EAAEyI,OACN5O,IAAMmG,EAAEnG,IACNvB,+CAIA,IAAIM,EAASN,KAAKqR,OAAQrR,KAAKsR,8CAI/BtR,KAAKmQ,EAAIxQ,KAAK8B,IAAIzB,KAAKuB,2CAItBvB,KAAKmQ,EAAIxQ,KAAK6B,IAAIxB,KAAKuB,qDAI1B4O,EAAI,EACFnQ,oCAGDW,UACGA,EAAEwP,IAAMnQ,KAAKmQ,GAAOxP,EAAEY,MAAQvB,KAAKuB,gDAIvC4O,EAAI,OACJ5O,IAAM,EACJvB,4CAIA,IAAImR,EAAQnR,KAAKmQ,EAAGnQ,KAAKuB,iCC1D1BgQ,OACAC,EAAM,IAAIC,aAAa,UACzBF,GAAMvR,KAAKiB,IAAIsQ,EAAMC,GAElBA,gBAGJE,EAAMC,OACJ,IAAIzP,EAAI,EAAGA,EAAI,EAAGA,MACjBA,GAAKwP,EAAKxP,GAEhB,OAAOyP,qBAGCH,EAAKG,EAAMJ,OACf9O,EAAM+O,EAAI,GAAI9O,EAAM8O,EAAI,GAAI7O,EAAM6O,EAAI,GAAI5O,EAAM4O,EAAI,GAAI3O,EAAM2O,EAAI,GAAIzO,EAAMyO,EAAI,GAAIxO,EAAMwO,EAAI,GAAItO,EAAMyO,EAAK,GAAIxO,EAAMwO,EAAK,GAAIvO,EAAMuO,EAAK,GAAItO,EAAMsO,EAAK,GAAIrO,EAAMqO,EAAK,GAAInO,EAAMmO,EAAK,GAAIlO,EAAMkO,EAAK,YAEtM,GAAKzO,EAAMT,EAAMU,EAAMP,IACvB,GAAKM,EAAMR,EAAMS,EAAMN,IACvB,GAAKF,EAAMS,IACX,GAAKC,EAAMZ,EAAMa,EAAMV,IACvB,GAAKS,EAAMX,EAAMY,EAAMT,IACvB,GAAKW,EAAMf,EAAMgB,EAAMb,EAAMG,IAC7B,GAAKS,EAAMd,EAAMe,EAAMZ,EAAMG,EAE3BuO,oBAGAC,EAAKD,OAC2J5N,EAAnKlB,EAAM+O,EAAI,GAAI9O,EAAM8O,EAAI,GAAI5O,EAAM4O,EAAI,GAAI3O,EAAM2O,EAAI,GAAIzO,EAAMyO,EAAI,GAAIxO,EAAMwO,EAAI,GAAIrO,EAAMN,EAAKS,GAAOV,EAAKa,EAAMT,EAAMJ,EAAMC,EAAME,WAElI,GAF2IN,EAAMU,EAAMT,EAAMY,KAG7J,GAAKH,EAAMQ,IACX,IAAOjB,EAAOiB,IACd,GAAKL,EAAMK,IACX,GAAKlB,EAAMkB,IACX,GAAKF,EAAME,IACX,KAAOX,EAAMP,EAAMC,EAAMK,GAAOY,EAE9B4N,yBAGKK,EAAGC,EAAKN,OAChBhR,EAAIsR,EAAI,GAAIrR,EAAIqR,EAAI,YAEnB,GAAKtR,EAAIqR,EAAE,GAAKpR,EAAIoR,EAAE,GAAKA,EAAE,KAC7B,GAAKrR,EAAIqR,EAAE,GAAKpR,EAAIoR,EAAE,GAAKA,EAAE,GAE3BL,IC7CYO,yBAELxG,uFAEHyG,KAAOhQ,EAAKD,QAAQwJ,GAASA,GAASA,gBAJZzJ,6CAQzByJ,EAAQtL,KAAK+R,KAAKpS,KAAKC,MAAMI,KAAK+R,KAAK1Q,OAAS1B,KAAKE,iBAC1C,WAAVyL,GAAgC,WAAVA,EAAqB/L,EAAUyS,cAAgB1G,4CAczDjD,UACdA,EAEDA,aAAeyJ,EACRzJ,EAEA,IAAIyJ,EAAUzJ,GALR,cC5BJ4J,wBAER1R,EAAGC,EAAGI,EAAGiQ,kBACftQ,EAAIA,OACJC,EAAIA,OAEJoD,MAAQhD,OACRiD,OAASgN,OAETqB,OAASlS,KAAKQ,EAAIR,KAAK6D,YACvBsO,MAAQnS,KAAKO,EAAIP,KAAK4D,iDAGnBrD,EAAGC,UACPD,GAAKP,KAAKmS,OAAS5R,GAAKP,KAAKO,GAAKC,GAAKR,KAAKkS,QAAU1R,GAAKR,KAAKQ,WCZjD4R,wBAaRC,EAAQC,kBACdC,OAASxQ,EAAKyQ,aAAazQ,EAAKC,UAAUqQ,EAAQ,SAClDI,QAAU1Q,EAAKyQ,aAAazQ,EAAKC,UAAUsQ,EAAS,SAEpDI,UAAY,OACZC,SAAW,OACXlF,qDAIAiF,UAAY,OACZC,SAAW3S,KAAKyS,QAAQtK,4CAGrBuE,eACHgG,WAAahG,EAEd1M,KAAK0S,WAAa1S,KAAK2S,eACrBD,UAAY,OACZC,SAAW3S,KAAKyS,QAAQtK,WAER,GAAjBnI,KAAKuS,OAAO9S,EACXO,KAAKuS,OAAOpK,UAAS,GAAS,GAC1B,EAEA,EAEDnI,KAAKuS,OAAOpK,UAAS,IAIvB,WC9CYyK,4GAKf3I,EAAStC,GACTA,OACE+I,WAAW/I,QAEX+I,WAAWzG,sCAKP9D,aCXS0M,yBAERrT,EAAGC,EAAG6C,uFAGZwQ,QAAU/Q,EAAKyQ,aAAahT,EAAGC,EAAG6C,KAClCsI,KAAO,oBANoBgI,yCAStBzM,GACNnG,KAAK8S,QAAQtT,GAAKgQ,EAAAA,EACrBrJ,EAAOoJ,KAAOC,EAAAA,EAEdrJ,EAAOoJ,KAAOvP,KAAK8S,QAAQ3K,oBCdT4K,yCAEdC,OAAS,IAAI1S,EAAS,EAAG,QACzBT,OAAS,OACToT,UAAY,YACZC,OAAQ,oFAMLvL,aCXWwL,yBAER5S,EAAGC,uFAETD,EAAIA,IACJC,EAAIA,eAL4BuS,wDAShCC,OAAOzS,EAAIP,KAAKO,OAChByS,OAAOxS,EAAIR,KAAKQ,EAEdR,KAAKgT,wCAGJrL,GAEJ3H,KAAKkT,cACF,yDACDA,OAAQ,YCjBKE,yBAERC,uFAENA,KAAOtR,EAAKC,UAAUqR,EAAM,IAAIF,KAEhCvI,KAAO,wBANwBgI,oCAS/BS,QACAA,KAAOtR,EAAKC,UAAUqR,EAAM,IAAIF,sCAG3BhN,QACLkN,KAAKC,gBAEH5L,EAAEnH,EAAIP,KAAKqT,KAAKL,OAAOzS,IACvBmH,EAAElH,EAAIR,KAAKqT,KAAKL,OAAOxS,WCfX+S,yBAELC,EAAMC,EAAQ7J,uFAGjB8J,KAAO3R,EAAKyQ,aAAagB,KACzBG,OAAS5R,EAAKyQ,aAAaiB,KAC3B7J,KAAO7H,EAAKC,UAAU4H,EAAM,YAE5BgB,KAAO,wBATkBgI,oCAY5BY,EAAMC,EAAQ7J,QACX8J,KAAO3R,EAAKyQ,aAAagB,QACzBG,OAAS5R,EAAKyQ,aAAaiB,QAC3B7J,KAAO7H,EAAKC,UAAU4H,EAAM,oDAGnBgK,UACPA,EAAK3G,EAAOuB,2CAGZrI,MACU,KAAbnG,KAAK4J,MAA4B,KAAb5J,KAAK4J,MAA4B,SAAb5J,KAAK4J,KAAiB,KACxDiK,EAAU,IAAI1C,EAAQnR,KAAK8T,kBAAkB9T,KAAK0T,KAAKvL,YAAanI,KAAK2T,OAAOxL,WAAa5I,EAAUwU,UAEtGpT,EAAEJ,EAAIsT,EAAQxC,SACd1Q,EAAEH,EAAIqT,EAAQvC,cAEd3Q,EAAEJ,EAAIP,KAAK8T,kBAAkB9T,KAAK0T,KAAKvL,cACvCxH,EAAEH,EAAIR,KAAK8T,kBAAkB9T,KAAK2T,OAAOxL,qBCjCvC6L,yBAERxU,EAAGC,EAAG6C,uFAEZ2R,QAAUlS,EAAKyQ,aAAahT,EAAGC,EAAG6C,KAClCsI,KAAO,oBALoBgI,yCAQtBzM,KACH4G,KAAO/M,KAAKiU,QAAQ9L,oBCTR+L,yBAER1U,EAAGC,EAAG6C,uFAEZuN,OAAS9N,EAAKyQ,aAAahT,EAAGC,EAAG6C,KAEjCsI,KAAO,sBANsBgI,oCAS7BpT,EAAGC,EAAG6C,QACNuN,OAAS9N,EAAKyQ,aAAahT,EAAGC,EAAG6C,sCAG5BqF,KACDkI,OAAS7P,KAAK6P,OAAO1H,aACrB/D,UAAU+P,UAAYxM,EAASkI,gBCdrBuE,yBAEL9O,EAAO1E,EAAGiQ,uFAGbvL,MAAQ8F,EAAKoH,aAAalN,KAC1B1E,EAAImB,EAAKC,UAAUpB,EAAG,MACtBiQ,EAAI9O,EAAKC,UAAU6O,EAAGzF,EAAKxK,KAC3BgK,KAAO,oBARcgI,yCAWnBjL,OACD0M,EAAcrU,KAAKsF,MAAM6C,aAGlB4B,KADc,iBAAhBsK,GACWzQ,MAAO5D,KAAKY,EAAGiD,OAAQ7D,KAAK6Q,EAAG9K,IAAKsO,EAAc3L,SAAS,EAAM4L,OAAO,GAE1ED,uCAIX/I,UACFA,aAAiBwG,EAAYxG,EAAQ,IAAIwG,EAAUxG,YCtB7CiJ,wBAsBLhF,EAAMQ,kBAETR,KAAOxN,EAAKC,UAAUuN,EAAMC,EAAAA,QAC5BO,OAASf,EAAKwF,UAAUzE,QAExBN,IAAM,OACNC,OAAS,OACTC,MAAO,OACPc,gBAEA9M,gBAAkB4Q,EAAU5Q,UAC5BiH,KAAO,oDAaV2E,EAAMQ,QACHR,KAAOxN,EAAKC,UAAUuN,EAAMC,EAAAA,QAC5BO,OAASf,EAAKwF,UAAUzE,0CAYlB0E,UACJA,EAAMvT,eAAe+L,EAAOuB,gDAYxB/H,UACJA,EAAQwG,EAAOuB,2CAYf7G,sCAaDA,EAAU+E,EAAMgB,WACjB+B,KAAO/C,EAER1M,KAAKyP,KAAOzP,KAAKuP,MAAQvP,KAAK2P,UACzBD,OAAS,OACTC,MAAO,OACPrH,cACF,KACG7D,EAAQzE,KAAK+P,OAAOpI,EAAS8H,IAAM9H,EAAS4H,WAC7CG,OAAS/P,KAAK2Q,IAAI,EAAI7L,EAAO,8CAYlCvC,EAAIlC,KAAKyQ,QAAQpP,OACda,UACEuO,QAAQvO,GAAGwS,gBAAgB1U,WAG/ByQ,QAAQpP,OAAS,WA7HTkT,EACV5Q,GAAK,MCDKgR,yBAeRC,EAAIC,EAAItF,EAAMQ,4EACnBR,EAAMQ,aAEP0E,MAAQrJ,EAAK0J,eAAe,IAAIxU,EAASsU,EAAIC,MAC7CjK,KAAO,qBAnBqB2J,oCAkC5BK,EAAIC,EAAItF,EAAMQ,QACd0E,MAAQzU,KAAK8U,eAAe,IAAIxU,EAASsU,EAAIC,2FAE9BtF,EAAMQ,0CAcZpI,EAAU+E,EAAMgB,QACzBqH,UAAUpN,EAAU+E,EAAMgB,KACtBlO,EAAEwK,IAAIhK,KAAKyU,gBCrDDO,yBA0BRC,EAAgBR,EAAO5E,EAAQN,EAAMQ,4EAC1CR,EAAMQ,aAEPkF,eAAiBlT,EAAKC,UAAUiT,EAAgB,IAAI3U,KACpDuP,OAAS9N,EAAKC,UAAU6N,EAAQ,OAChC4E,MAAQ1S,EAAKC,UAAUoJ,EAAK8J,eAAeT,GAAQ,OAEnDU,SAAW/J,EAAKyE,OAASzE,EAAKyE,SAC9BuF,gBAAkB,IAAI9U,IACtB+U,SAAW,IAEXzK,KAAO,0BArC0B2J,oCAuDjCU,EAAgBR,EAAO5E,EAAQN,EAAMQ,QACrCkF,eAAiBlT,EAAKC,UAAUiT,EAAgB,IAAI3U,QACpDuP,OAAS9N,EAAKC,UAAU6N,EAAQ,UAChC4E,MAAQ1S,EAAKC,UAAUhC,KAAKkV,eAAeT,GAAQ,UAEnDU,SAAWnV,KAAK6P,OAAS7P,KAAK6P,YAC9BuF,gBAAkB,IAAI9U,OACtB+U,SAAW,yFAEI9F,EAAMQ,0CAcZpI,EAAU+E,EAAMgB,QACzBqH,UAAUpN,EAAU+E,EAAMgB,QAE1B0H,gBAAgBxN,KAAK5H,KAAKiV,qBAC1BG,gBAAgBE,IAAI3N,EAASD,QAC7B2N,SAAWrV,KAAKoV,gBAAgBC,WAEjCrV,KAAKqV,SAAW,MAAYrV,KAAKqV,SAAWrV,KAAKmV,gBAC/CC,gBAAgBG,iBAChBH,gBAAgBlU,eAAe,EAAIlB,KAAKqV,SAAWrV,KAAKmV,eACxDC,gBAAgBlU,eAAelB,KAAKyU,SAEhCjV,EAAEwK,IAAIhK,KAAKoV,2BCzFFI,yBAiBRC,EAAQC,EAAQC,EAAOpG,EAAMQ,4EAClCR,EAAMQ,aAEPX,MAAMqG,EAAQC,EAAQC,KACtBjJ,KAAO,IACP9B,KAAO,2BAtB2B2J,oCAsClCkB,EAAQC,EAAQC,EAAOpG,EAAMQ,QAC7B6F,QAAU,IAAItV,EAASmV,EAAQC,QAC/BE,QAAU5V,KAAK8U,eAAe9U,KAAK4V,cACnCD,MAAQA,yFAEOpG,EAAMQ,0CAcZpI,EAAU+E,EAAMgB,QACzBqH,UAAUpN,EAAU+E,EAAMgB,QAC1BhB,MAAQA,EAET1M,KAAK0M,MAAQ1M,KAAK2V,UACZnW,EAAEqW,MAAMtW,EAAUU,YAAYD,KAAK4V,QAAQrV,EAAGP,KAAK4V,QAAQrV,GAAIhB,EAAUU,YAAYD,KAAK4V,QAAQpV,EAAGR,KAAK4V,QAAQpV,SACtHkM,KAAO,YChEMoJ,yBAcR1F,EAAGb,EAAMQ,4EACd,EAAGK,EAAGb,EAAMQ,aACbnF,KAAO,uBAhBuB+J,oCA8B9BvE,EAAGb,EAAMQ,uFACF,EAAGK,EAAGb,EAAMQ,YC9BLgG,yBA0BR9L,EAAS8C,EAAMlH,EAAU0J,EAAMQ,4EACpCR,EAAMQ,aAEPX,MAAMnF,EAAS8C,EAAMlH,KACrB+E,KAAO,yBA9ByB2J,oCAgDhCtK,EAAS8C,EAAMlH,EAAU0J,EAAMQ,QAC/B9F,QAAUlI,EAAKC,UAAUiI,EAAS,WAClC8C,KAAOhL,EAAKC,UAAU+K,GAAM,QAC5BlH,SAAW9D,EAAKC,UAAU6D,EAAU,WAEpCmQ,sBACAC,MAAQ,IAAI3V,yFAEGiP,EAAMQ,0CAcZpI,EAAU+E,EAAMgB,OACxBwI,EAAUlW,KAAKiK,QAAUjK,KAAKiK,QAAQwC,UAAUpM,MAAMqN,GAAS1N,KAAK+K,KAAK1K,MAAMqN,GAC/ErM,EAAS6U,EAAQ7U,OAEnB8U,SACAd,SACAe,SACAC,SACAC,SAAcC,SACdrU,aAECA,EAAI,EAAGA,EAAIb,EAAQa,UACPgU,EAAQhU,MAEFyF,EAAU,MAC1BsO,MAAMrO,KAAKuO,EAAczO,QACzBuO,MAAMX,IAAI3N,EAASD,KAEb1H,KAAKiW,MAAMZ,eAChBmB,EAAW7O,EAASkI,OAASsG,EAActG,OAE7CwF,GAAYmB,EAAWA,MAChBA,EAAW7W,KAAKwB,KAAKkU,MACpB,KAEC1N,EAASoF,KAAOoJ,EAAcpJ,OAC3B/M,KAAK+M,KAAOoJ,EAAcpJ,KAAOsJ,EAAY,KAC7CrW,KAAK+M,KAAOpF,EAASoF,KAAOsJ,EAAY,KAE9C3O,EAAEsC,IAAIhK,KAAKiW,MAAM1M,QAAQgM,YAAYrU,eAAekV,GAAWE,MAC1D5O,EAAEsC,IAAIhK,KAAKiW,MAAMV,YAAYrU,eAAekV,EAAUG,SAE/D1Q,UAAY7F,KAAK6F,SAAS8B,EAAUwO,cCxGzBM,yBAiBLpD,EAAMJ,EAAW1D,EAAMQ,4EACzBR,EAAMQ,aAEPX,MAAMiE,EAAMJ,KACZrI,KAAO,yBArBmB2J,oCAoC7BlB,EAAMJ,EAAW1D,EAAMQ,QACpBsD,KAAOA,OACPA,KAAKJ,UAAYlR,EAAKC,UAAUiR,EAAW,+FAE5B1D,EAAMQ,0CAcfpI,EAAU+E,EAAMgB,QACtBqH,UAAUpN,EAAU+E,EAAMgB,QAC1B2F,KAAKqD,SAAS/O,YCxDNgP,yBAiBRnX,EAAGC,EAAG8P,EAAMQ,4EACjBR,EAAMQ,aAEPX,MAAM5P,EAAGC,KACTmL,KAAO,qBArBqB2J,oCAsC5B/U,EAAGC,EAAG8P,EAAMQ,QACZ6G,KAAa,OAANnX,QAAoBoB,IAANpB,OACrBD,EAAIuC,EAAKyQ,aAAazQ,EAAKC,UAAUxC,EAAG,SACxCC,EAAIsC,EAAKyQ,aAAa/S,0FAEP8P,EAAMQ,sCAYhBpI,KACDvD,UAAUyS,OAAS7W,KAAKR,EAAE2I,WAE/BnI,KAAK4W,KACRjP,EAASvD,UAAU0S,OAASnP,EAASvD,UAAUyS,OAE/ClP,EAASvD,UAAU0S,OAAS9W,KAAKP,EAAE0I,kDAYtBR,EAAU+E,EAAMgB,QACzBqH,UAAUpN,EAAU+E,EAAMgB,KAEtB9L,MAAQ+F,EAASvD,UAAU0S,QAAUnP,EAASvD,UAAUyS,OAASlP,EAASvD,UAAU0S,QAAU9W,KAAK0P,OACxG/H,EAAS/F,MAAQ,OAAO+F,EAAS/F,MAAQ,YC7E1BmV,yBAiBRvX,EAAGC,EAAG8P,EAAMQ,4EACjBR,EAAMQ,aAEPX,MAAM5P,EAAGC,KACTmL,KAAO,qBArBqB2J,oCAoC5B/U,EAAGC,EAAG8P,EAAMQ,QACZ6G,KAAa,OAANnX,QAAoBoB,IAANpB,OACrBD,EAAIuC,EAAKyQ,aAAazQ,EAAKC,UAAUxC,EAAG,SACxCC,EAAIsC,EAAKyQ,aAAa/S,0FAEP8P,EAAMQ,sCAYhBpI,KACDvD,UAAU4S,OAAShX,KAAKR,EAAE2I,aAC1B/D,UAAU+P,UAAYxM,EAASkI,SAC/BzL,UAAU6S,OAASjX,KAAK4W,KAAOjP,EAASvD,UAAU4S,OAAShX,KAAKP,EAAE0I,kDAc7DR,EAAU+E,EAAMgB,QACzBqH,UAAUpN,EAAU+E,EAAMgB,KACtBjJ,MAAQkD,EAASvD,UAAU6S,QAAUtP,EAASvD,UAAU4S,OAASrP,EAASvD,UAAU6S,QAAUjX,KAAK0P,OAExG/H,EAASlD,MAAQ,OAAQkD,EAASlD,MAAQ,KACrCoL,OAASlI,EAASvD,UAAU+P,UAAYxM,EAASlD,eC3EvCyS,0BAkBR1X,EAAGC,EAAGyE,EAAOqL,EAAMQ,4EACxBR,EAAMQ,aAEPX,MAAM5P,EAAGC,EAAGyE,KACZ0G,KAAO,sBAtBsB2J,oCAwC7B/U,EAAGC,EAAGyE,EAAOqL,EAAMQ,QACnB6G,KAAa,OAANnX,QAAoBoB,IAANpB,OAErBD,EAAIuC,EAAKyQ,aAAazQ,EAAKC,UAAUxC,EAAG,kBACxCC,EAAIsC,EAAKyQ,aAAazQ,EAAKC,UAAUvC,EAAG,SACxCyE,MAAQnC,EAAKC,UAAUkC,EAAO,6FAEfqL,EAAMQ,sCAYhBpI,KACDmI,SAAW9P,KAAKR,EAAE2I,aAClB/D,UAAU+S,UAAYnX,KAAKR,EAAE2I,WAEjCnI,KAAK4W,OAAMjP,EAASvD,UAAUgT,UAAYpX,KAAKP,EAAE0I,mDAcxCR,EAAU+E,EAAMgB,QACzBqH,UAAUpN,EAAU+E,EAAMgB,GAE1B1N,KAAK4W,KAMa,KAAZ5W,KAAKR,EAAEA,GAAwB,YAAZQ,KAAKR,EAAEA,GAA+B,KAAZQ,KAAKR,EAAEA,MAErDsQ,SAAWnI,EAAS0P,gBAPX,MAAdrX,KAAKkE,OAA+B,MAAdlE,KAAKkE,OAA+B,KAAdlE,KAAKkE,QAC3C4L,UAAYnI,EAASvD,UAAUgT,WAAazP,EAASvD,UAAU+S,UAAYxP,EAASvD,UAAUgT,WAAapX,KAAK0P,SAEhHI,UAAYnI,EAASvD,UAAUgT,mBClFvBE,0BAeL9X,EAAGC,EAAG8P,EAAMQ,4EACdR,EAAMQ,aAEPX,MAAM5P,EAAGC,KACTmL,KAAO,qBAnBe2J,oCAkCzB/U,EAAGC,EAAG8P,EAAMQ,QACTvQ,EAAIsS,EAAUyF,gBAAgB/X,QAC9BC,EAAIqS,EAAUyF,gBAAgB9X,0FAEf8P,EAAMQ,sCAYnBpI,KACE2D,MAAQtL,KAAKR,EAAE2I,aACf/D,UAAUoT,OAASC,EAAUC,SAAS/P,EAAS2D,OAEpDtL,KAAKP,IACLkI,EAASvD,UAAUuT,OAASF,EAAUC,SAAS1X,KAAKP,EAAE0I,oDAc/CR,EAAU+E,EAAMgB,GACvB1N,KAAKP,QACAsV,UAAUpN,EAAU+E,EAAMgB,KAEtBtJ,UAAU8L,IAAIC,EAAIxI,EAASvD,UAAUuT,OAAOxH,GAAKxI,EAASvD,UAAUoT,OAAOrH,EAAIxI,EAASvD,UAAUuT,OAAOxH,GAAKnQ,KAAK0P,SACnHtL,UAAU8L,IAAIE,EAAIzI,EAASvD,UAAUuT,OAAOvH,GAAKzI,EAASvD,UAAUoT,OAAOpH,EAAIzI,EAASvD,UAAUuT,OAAOvH,GAAKpQ,KAAK0P,SACnHtL,UAAU8L,IAAIzQ,EAAIkI,EAASvD,UAAUuT,OAAOlY,GAAKkI,EAASvD,UAAUoT,OAAO/X,EAAIkI,EAASvD,UAAUuT,OAAOlY,GAAKO,KAAK0P,SAEnHtL,UAAU8L,IAAIC,EAAIxQ,KAAKC,MAAM+H,EAASvD,UAAU8L,IAAIC,KACpD/L,UAAU8L,IAAIE,EAAIzQ,KAAKC,MAAM+H,EAASvD,UAAU8L,IAAIE,KACpDhM,UAAU8L,IAAIzQ,EAAIE,KAAKC,MAAM+H,EAASvD,UAAU8L,IAAIzQ,OAGpD2E,UAAU8L,IAAIC,EAAIxI,EAASvD,UAAUoT,OAAOrH,IAC5C/L,UAAU8L,IAAIE,EAAIzI,EAASvD,UAAUoT,OAAOpH,IAC5ChM,UAAU8L,IAAIzQ,EAAIkI,EAASvD,UAAUoT,OAAO/X,YCtF5CmY,0BAqBR3C,EAAgBR,EAAO5E,EAAQN,EAAMQ,4EAC1CkF,EAAgBR,EAAO5E,EAAQN,EAAMQ,aAEtC0E,QAAU,IACV7J,KAAO,yBAzByBoK,oCA2ChCC,EAAgBR,EAAO5E,EAAQN,EAAMQ,uFAC9BkF,EAAgBR,EAAO5E,EAAQN,EAAMQ,QAC5C0E,QAAU,WC5CIoD,0BAeRC,EAAarD,EAAOlF,EAAMQ,4EAC/BR,EAAMQ,aAEPgI,YAAc,IAAIzX,IAClBwX,YAAc/V,EAAKC,UAAU8V,EAAa,IAAIxX,KAC9CmU,MAAQ1S,EAAKC,UAAUoJ,EAAK8J,eAAeT,GAAQ,OAEnD7J,KAAO,2BAtB2B2J,oCAqClCuD,EAAarD,EAAOlF,EAAMQ,QAC1BgI,YAAc,IAAIzX,OAClBwX,YAAc/V,EAAKC,UAAU8V,EAAa,IAAIxX,QAC9CmU,MAAQ1S,EAAKC,UAAUhC,KAAKkV,eAAeT,GAAQ,4FAEpClF,EAAMQ,sCAMhBpI,2CAcIA,EAAU+E,EAAMgB,QACzBqK,YAAY9W,IAAIjB,KAAK8X,YAAYvX,EAAIoH,EAASD,EAAEnH,EAAGP,KAAK8X,YAAYtX,EAAImH,EAASD,EAAElH,OAClFwX,EAAahY,KAAK+X,YAAY1C,cAElB,GAAd2C,EAAiB,KACdxB,EAAWxW,KAAK+X,YAAY1W,SAC5B4W,EAAUjY,KAAKyU,MAAQ/H,GAASsL,EAAaxB,KAE1C7V,EAAEJ,GAAK0X,EAASjY,KAAK+X,YAAYxX,IACjCI,EAAEH,GAAKyX,EAASjY,KAAK+X,YAAYvX,oCCtEjCyJ,EAAStC,EAAU8C,OACvBpJ,EAASoJ,EAAYpJ,OACvBa,aAECA,EAAI,EAAGA,EAAIb,EAAQa,IACnBuI,EAAYvI,aAAc+K,OAAO2F,WACpCnI,EAAYvI,GAAGuL,KAAKxD,EAAStC,GAE7B3H,KAAKyN,KAAKxD,EAAStC,EAAU8C,EAAYvI,SAGtCgW,YAAYjO,EAAStC,kBAItBsC,EAAStC,EAAU+I,KAClBrB,qBAAqB1H,EAAU+I,KAC/ByH,oBAAoBxQ,EAAU+I,yBAGxBzG,EAAStC,GAChBsC,EAAQiO,gBACFxQ,EAAEsC,IAAIC,EAAQvC,KACd/G,EAAEqJ,IAAIC,EAAQtJ,KACdnB,EAAEwK,IAAIC,EAAQzK,KAEdmB,EAAE+D,OAAOnF,EAAU6Y,gBAAgBnO,EAAQ6F,cCxBlCuI,0BAiBRC,4EACLA,aAED7N,iBACAgC,eACA9B,gBAEAJ,UAAY,IACZgO,gBAAkB,IAClBC,gBAAkB,IAQlB7L,QAAU,OAQVuL,aAAc,IAQdO,KAAO,IAAIrG,EAAK,EAAG,MAEnBzO,cAAgB0U,EAAQlJ,OACxBvE,KAAO,uBArDuBsE,mCA8D/BsJ,EAAgBjJ,QACfmJ,QAAS,OACTH,gBAAkB,OAClBC,eAAiBzW,EAAKC,UAAUwW,EAAgBhJ,EAAAA,GAEzC,GAARD,GAAwB,QAARA,GAA0B,WAARA,OAChCA,KAAyB,QAAlBiJ,EAA2B,EAAIxY,KAAKwY,eACrCG,MAAMpJ,UACZA,KAAOA,QAGRkJ,KAAKhL,2CAQL+K,gBAAkB,OAClBD,gBAAkB,OAClBG,QAAS,uDAQVxW,EAAIlC,KAAKyM,UAAUpL,OAChBa,UAAUuK,UAAUvK,GAAGyN,MAAO,4CAOpB2I,GACbA,EAAA,OACE7K,KAAKzN,WAEL4Y,6EAWUC,iDACZ3W,EAAI2W,EAAKxX,OACNa,UACDuI,YAAYrB,KAAKyP,EAAK3W,6CAQZ4W,OACVpL,EAAQ1N,KAAKyK,YAAYvD,QAAQ4R,GACnCpL,GAAS,GAAG1N,KAAKyK,YAAYwB,OAAOyB,EAAO,qDAQ1CkD,aAAa5Q,KAAKyK,+EAURoO,iDACX3W,EAAI6W,UAAU1X,OACXa,KAAK,KACPsO,EAAYqI,EAAK3W,QAChByI,WAAWvB,KAAKoH,GACjBA,EAAUC,SAASD,EAAUC,QAAQrH,KAAKpJ,+CAShCwQ,OACX9C,EAAQ1N,KAAK2K,WAAWzD,QAAQsJ,eAC/B7F,WAAWsB,OAAOyB,EAAO,GAE1B8C,EAAUC,YACLD,EAAUC,QAAQvJ,QAAQsJ,KACxBC,QAAQxE,OAAOyB,EAAO,IAG1BA,kDAQFkD,aAAa5Q,KAAK2K,2CAIjB+B,QACD+C,KAAO/C,GACR1M,KAAKyP,KAAOzP,KAAKuP,MAAQvP,KAAK2P,OAAM3P,KAAKsI,eAExC0Q,SAAStM,QACTuM,UAAUvM,qCAGNA,MACJ1M,KAAK4N,YAEJjB,EAAU,EAAI3M,KAAK2M,aACpBiB,OAAOL,WAAWwH,UAAU/U,KAAM0M,EAAMC,OAGzCzK,SAAGyF,aAEFzF,EAHUlC,KAAKyM,UAAUpL,OAGZ,EAAGa,GAAK,EAAGA,OACjBlC,KAAKyM,UAAUvK,IAGjBoM,OAAO5B,EAAMxK,QACjB0L,OAAOL,WAAWwH,UAAUpN,EAAU+E,EAAMC,QAC5CuM,SAAS,kBAAmBvR,GAG7BA,EAASgI,YACPuJ,SAAS,gBAAiBvR,QAE1BiG,OAAO7C,KAAKoO,OAAOxR,QACnB8E,UAAUR,OAAO/J,EAAG,sCAKnBkX,EAAOjT,QACVyH,QAAU5N,KAAK4N,OAAOvB,cAAc+M,EAAOjT,UACzC2I,iBAAmB9O,KAAKqM,cAAc+M,EAAOjT,oCAG5CuG,MACmB,QAAvB1M,KAAKwY,eAA0B,KAC9BtW,SACEb,EAASrB,KAAKyY,KAAKtQ,SAAS,WAE9B9G,EAAS,IAAGrB,KAAKuK,UAAYlJ,GAC5Ba,EAAI,EAAGA,EAAIb,EAAQa,SAAUmX,iBAClCrZ,KAAKwY,eAAiB,oBAIjBD,iBAAmB7L,EAEpB1M,KAAKuY,gBAAkBvY,KAAKwY,eAAgB,KACzCnX,EAASrB,KAAKyY,KAAKtQ,SAASuE,GAC9BxK,aAEAb,EAAS,IAAGrB,KAAKuK,UAAYlJ,GAC5Ba,EAAI,EAAGA,EAAIb,EAAQa,SAAUmX,yDAWtB3I,EAAYF,OACpB7I,EAAW3H,KAAK4N,OAAO7C,KAAKuO,IAAIpK,eACjCqK,cAAc5R,EAAU+I,EAAYF,QACpC0I,SAAS,mBAAoBvR,GAE3BA,wCAGMA,EAAU+I,EAAYF,OAC/B/F,EAAczK,KAAKyK,YACnBE,EAAa3K,KAAK2K,WAElB+F,MACW3O,EAAKD,QAAQ4O,GAAcA,GAAcA,IAGpDF,MACSzO,EAAKD,QAAQ0O,GAAaA,GAAaA,MAG3CpB,WACMsB,WAAW1Q,KAAM2H,EAAU8C,KACjC+O,cAAc7O,KACdiD,OAAS5N,UAEbyM,UAAUrD,KAAKzB,yCAIf8R,SACAnR,QAAQtI,KAAKyM,2CAOXiN,QACF/J,MAAO,OACPhC,cACAgM,6BACA1J,2BACArC,QAAU5N,KAAK4N,OAAOgM,cAAc5Z,eAnStBqY,GAEblJ,GAAK,IAsSG7H,KAAK+Q,QC5SAwB,0BAURvB,4EACLA,aAEDwB,+BAbuCzB,6EAuBzBQ,6CACbxX,EAASwX,EAAKxX,OAChBa,aAECA,EAAI,EAAGA,EAAIb,EAAQa,SAClB4X,eAAe1Q,KAAKyP,EAAK3W,gDASZsO,OACb9C,EAAQ1N,KAAK8Z,eAAe5S,QAAQsJ,GACtC9C,GAAS,GAAG1N,KAAK8Z,eAAe7N,OAAOyB,EAAO,kCAG5ChB,2FACOA,IAER1M,KAAK6M,MAAO,KACVxL,EAASrB,KAAK8Z,eAAezY,OAC/Ba,aAECA,EAAI,EAAGA,EAAIb,EAAQa,SAClB4X,eAAe5X,GAAGqO,eAAevQ,KAAM0M,EAAMxK,aClDjC6X,0BAcRC,EAAahL,EAAMsJ,4EACxBA,aAED0B,YAAcjY,EAAKC,UAAUgY,EAAaC,UAC1CjL,KAAOjN,EAAKC,UAAUgN,EAAM,MAE5BkL,gBAAiB,IACjBC,gCArBoC9B,kEAyBpC+B,iBAAmB,mBAAKC,EAAKC,UAAUzT,OAAWX,SAClDqU,iBAAmB,mBAAKF,EAAKG,UAAU3T,OAAWX,SAClDuU,eAAiB,mBAAKJ,EAAKK,QAAQ7T,OAAWX,SAE9C8T,YAAY7O,iBAAiB,YAAanL,KAAKoa,kBAAkB,uCAQjEF,gBAAiB,sCAQjBA,gBAAiB,oCAGbhU,GACLA,EAAEyU,QAAsB,GAAZzU,EAAEyU,aACZjT,EAAEnH,IAAM2F,EAAEyU,OAAS3a,KAAK0H,EAAEnH,GAAKP,KAAKgP,UACpCtH,EAAElH,IAAM0F,EAAE0U,OAAS5a,KAAK0H,EAAElH,GAAKR,KAAKgP,OAC/B9I,EAAE2U,SAAwB,GAAb3U,EAAE2U,gBACpBnT,EAAEnH,IAAM2F,EAAE2U,QAAU7a,KAAK0H,EAAEnH,GAAKP,KAAKgP,UACrCtH,EAAElH,IAAM0F,EAAE4U,QAAU9a,KAAK0H,EAAElH,GAAKR,KAAKgP,MAGvChP,KAAKka,gBAAgBa,mFAAW,sIAS/Bf,YAAYhO,oBAAoB,YAAahM,KAAKoa,kBAAkB,YClEtDY,yBAELC,EAASC,kBACZD,QAAUA,OACVC,OAASA,OAETC,mBAEAC,YAAeC,UAAU,QACzBtQ,KAAO,IAAIpC,OACXiC,KAAO,2DAGNU,EAAOgQ,KACLvZ,EAAKC,UAAUsJ,EAAO,aAClBvJ,EAAKC,UAAUsZ,EAAW,QAEjCJ,QAAW5P,QAAOgQ,mEAIlBC,qBAAuB,aAAaC,eAAe3U,cACnD4U,0BAA4B,aAAaC,oBAAoB7U,cAC7D8U,qBAAuB,SAAC1R,KAAmB2R,eAAe/U,OAAWoD,SACrE4R,uBAAyB,SAAC5R,KAAmB6R,iBAAiBjV,OAAWoD,SACzE8R,wBAA0B,SAACpU,KAAoBqU,kBAAkBnV,OAAWc,SAC5EsU,uBAAyB,SAACtU,KAAoBuU,iBAAiBrV,OAAWc,SAC1EwU,qBAAuB,SAACxU,KAAoByU,eAAevV,OAAWc,iCAG1E+B,QACIkE,OAASlE,IAEPyB,iBAAiB8B,OAAOc,cAAe/N,KAAKub,wBAC5CpQ,iBAAiB8B,OAAOoB,oBAAqBrO,KAAKyb,6BAElDtQ,iBAAiB8B,OAAOY,cAAe7N,KAAK2b,wBAC5CxQ,iBAAiB8B,OAAOa,gBAAiB9N,KAAK6b,0BAE9C1Q,iBAAiB8B,OAAOyB,iBAAkB1O,KAAK+b,2BAC/C5Q,iBAAiB8B,OAAO0B,gBAAiB3O,KAAKic,0BAC9C9Q,iBAAiB8B,OAAO4B,cAAe7O,KAAKmc,qDAGhDvY,EAAOC,mCAEP6F,QACEkE,OAAO5B,oBAAoBiB,OAAOc,cAAe/N,KAAKub,2BACtD3N,OAAO5B,oBAAoBiB,OAAOoB,oBAAqBrO,KAAKyb,gCAE5D7N,OAAO5B,oBAAoBiB,OAAOY,cAAe7N,KAAK2b,2BACtD/N,OAAO5B,oBAAoBiB,OAAOa,gBAAiB9N,KAAK6b,6BAExDjO,OAAO5B,oBAAoBiB,OAAOyB,iBAAkB1O,KAAK+b,8BACzDnO,OAAO5B,oBAAoBiB,OAAO0B,gBAAiB3O,KAAKic,6BACxDrO,OAAO5B,oBAAoBiB,OAAO4B,cAAe7O,KAAKmc,2BAEtDvO,OAAS,4CAITD,yIAMM1D,6CACEA,8CAECtC,6CACDA,2CACFA,aCrEE0U,0BAELpB,4EACFA,aAEDC,OAAS,OACT7V,QAAU+F,EAAK6P,QAAQzU,WAAW,QAClC8V,iBAEA1R,KAAO,8BATwBoQ,sCAYjCpX,EAAOC,QACLoX,QAAQrX,MAAQA,OAChBqX,QAAQpX,OAASA,gDAIjBwB,QAAQM,UAAU,EAAG,EAAG3F,KAAKib,QAAQrX,MAAO5D,KAAKib,QAAQpX,kDAGhD8D,GACVA,EAASoC,KACT3B,EAAwBT,EAASoC,KAAM/J,KAAKuc,YAAa5U,GAEzDA,EAAS2D,MAAQ3D,EAAS2D,OAAS,mDAG1B3D,GACTA,EAASoC,KACLpC,EAASoC,gBAAgB/D,OAAOhG,KAAKwF,UAAUmC,QAE9C6U,WAAW7U,0CAITA,KACFoC,KAAO,yCAKRnE,EAAK+B,KACJoC,KAAOnE,oCAIV+B,OACA/G,EAAI+G,EAASoC,KAAKnG,MAAQ+D,EAASlD,MAAQ,EAC3CoM,EAAIlJ,EAASoC,KAAKlG,OAAS8D,EAASlD,MAAQ,EAC5ClE,EAAIoH,EAASD,EAAEnH,EAAIK,EAAI,EACvBJ,EAAImH,EAASD,EAAElH,EAAIqQ,EAAI,KAEvBlJ,EAAS2D,MAAO,CACb3D,EAASvD,UAAT,SAA8BuD,EAASvD,UAAUqY,OAASzc,KAAK0c,aAAa/U,EAASoC,WAEpF4S,EAAgBhV,EAASvD,UAAUqY,OAAOjW,WAAW,QAC7Cb,UAAU,EAAG,EAAGgC,EAASvD,UAAUqY,OAAO7Y,MAAO+D,EAASvD,UAAUqY,OAAO5Y,UAC3E+Y,YAAcjV,EAAS/F,QACvB4D,UAAUmC,EAASoC,KAAM,EAAG,KAE5B8S,yBAA2B,gBAC3BC,UAAYrF,EAAUsF,SAASpV,EAASvD,UAAU8L,OAClD8M,SAAS,EAAG,EAAGrV,EAASvD,UAAUqY,OAAO7Y,MAAO+D,EAASvD,UAAUqY,OAAO5Y,UAC1EgZ,yBAA2B,gBAC3BD,YAAc,OAEvBvX,QAAQG,UAAUmC,EAASvD,UAAUqY,OAAQ,EAAG,EAAG9U,EAASvD,UAAUqY,OAAO7Y,MAAO+D,EAASvD,UAAUqY,OAAO5Y,OAAQtD,EAAGC,EAAGI,EAAGiQ,aAE/HxL,QAAQ4X,YAER5X,QAAQuX,YAAcjV,EAAS/F,WAC/ByD,QAAQ6X,UAAUvV,EAASD,EAAEnH,EAAGoH,EAASD,EAAElH,QAC3C6E,QAAQX,OAAOnF,EAAU6Y,gBAAgBzQ,EAASmI,gBAClDzK,QAAQ6X,WAAWvV,EAASD,EAAEnH,GAAIoH,EAASD,EAAElH,QAC7C6E,QAAQG,UAAUmC,EAASoC,KAAM,EAAG,EAAGpC,EAASoC,KAAKnG,MAAO+D,EAASoC,KAAKlG,OAAQtD,EAAGC,EAAGI,EAAGiQ,QAE3FxL,QAAQuX,YAAc,OACtBvX,QAAQ8X,6CAKVxV,GACHA,EAASvD,UAAT,IACApE,KAAKqF,QAAQyX,UAAY,QAAUnV,EAASvD,UAAU8L,IAAIC,EAAI,IAAMxI,EAASvD,UAAU8L,IAAIE,EAAI,IAAMzI,EAASvD,UAAU8L,IAAIzQ,EAAI,IAAMkI,EAAS/F,MAAQ,IAEvJ5B,KAAKqF,QAAQyX,UAAYnV,EAAS2D,WAGjCjG,QAAQ+X,iBACR/X,QAAQgY,IAAI1V,EAASD,EAAEnH,EAAGoH,EAASD,EAAElH,EAAGmH,EAASkI,OAAQ,EAAa,EAAVlQ,KAAKL,IAAQ,GAE1EU,KAAKkb,cACA7V,QAAQiY,YAActd,KAAKkb,OAAO5P,WAClCjG,QAAQkY,UAAYvd,KAAKkb,OAAOI,eAChCjW,QAAQ6V,eAGZ7V,QAAQmY,iBACRnY,QAAQoY,4CAIJnY,MACLA,aAAiBU,MAAO,KAClB0X,EAAOpY,EAAM1B,MAAQ,IAAM0B,EAAMzB,OACnCwC,EAASrG,KAAKsc,YAAYoB,UAEzBrX,OACQrC,SAASC,cAAc,WACzBL,MAAQ0B,EAAM1B,QACdC,OAASyB,EAAMzB,YACjByY,YAAYoB,GAAQrX,GAGtBA,YCpHEsX,0BAEL1C,4EACFA,aAEDC,OAAS,OACTnQ,KAAK1B,OAAS,SAACU,EAAMpC,UAAayD,EAAKwS,WAAW7T,EAAMpC,MACxD4U,YAAcnR,EAAKmR,YAAYjV,UAE/BuW,aAAc,IAEdjT,KAAO,2BAXqBoQ,iDAcnBrT,GACVA,EAASoC,OACepC,EAASoC,KAAM/J,KAAKuc,YAAa5U,MAEhDoC,KAAO/J,KAAK+K,KAAKuO,IAAItZ,KAAKob,WAAYzT,QAC1CsT,QAAQzP,YAAY7D,EAASoC,gDAIzBpC,GACT3H,KAAK8d,UAAUnW,KACX3H,KAAK6d,YACLvX,EAAQuX,YAAYlW,EAASoC,KAAMpC,EAASD,EAAEnH,EAAGoH,EAASD,EAAElH,EAAGmH,EAASlD,MAAOkD,EAASmI,UAExFxJ,EAAQlC,UAAUuD,EAASoC,KAAMpC,EAASD,EAAEnH,EAAGoH,EAASD,EAAElH,EAAGmH,EAASlD,MAAOkD,EAASmI,YAEjF/F,KAAK7F,MAAMC,QAAUwD,EAAS/F,MACnC+F,EAASoC,KAAKsR,aACLtR,KAAK7F,MAAM6Z,gBAAkBpW,EAAS2D,OAAS,mDAKrD3D,GACP3H,KAAK8d,UAAUnW,UACVsT,QAAQ+C,YAAYrW,EAASoC,WAC7BgB,KAAKoO,OAAOxR,EAASoC,QACjBA,KAAO,wCAIdpC,SAC0B,WAAzBsW,EAAOtW,EAASoC,OAAqBpC,EAASoC,OAASpC,EAASoC,KAAKrB,4CAIpE9C,EAAK+B,GACTA,EAASgI,SACJ5F,KAAO/J,KAAK+K,KAAKuO,IAAI1T,EAAK+B,KAC3BtD,OAAOsD,EAASoC,KAAMnE,EAAIhC,MAAOgC,EAAI/B,aAExCoX,QAAQzP,YAAY7D,EAASoC,0CAG3BA,EAAMpC,UACToC,EAAKsR,SACErb,KAAKke,aAAavW,GAElB3H,KAAKme,aAAapU,EAAMpC,wCAI1BA,OACH5D,EAAMuC,EAAQ8X,UAAazW,EAAShE,UAAU,EAAIgE,EAASkI,OAAQ,EAAIlI,EAASkI,iBAClF3L,MAAMma,aAAkB1W,EAASkI,YAEjC7P,KAAKkb,WACDhX,MAAMoa,YAActe,KAAKkb,OAAO5P,QAChCpH,MAAMqa,YAAiBve,KAAKkb,OAAOI,kBAEvCD,UAAW,EAERtX,uCAGEgG,EAAMpC,OACT6W,EAAsB,iBAATzU,EAAoBA,EAAOA,EAAKhE,IAC7ChC,EAAMuC,EAAQ8X,UAAazW,EAAShE,UAAUoG,EAAKnG,MAAOmG,EAAKlG,iBACjEK,MAAMua,uBAAyBD,MAE5Bza,WCvFM2a,0BAELzD,EAASC,4EACXD,aAEDC,OAASA,IACTtQ,KAAO,6BANuBoQ,iDASrBrT,GACVA,EAASoC,UACJoU,aAAaxW,QAEbuW,aAAavW,QAGjBsT,QAAQ0D,SAAShX,EAASoC,+CAGlBpC,GACTA,EAASoC,SACAA,KAAKxJ,EAAIoH,EAASD,EAAEnH,IACpBwJ,KAAKvJ,EAAImH,EAASD,EAAElH,IAEpBuJ,KAAKnI,MAAQ+F,EAAS/F,QACtBmI,KAAK6U,OAASjX,EAASoC,KAAK8U,OAASlX,EAASlD,QAC9CsF,KAAK+F,SAAWnI,EAASmI,iDAI3BnI,GACPA,EAASoC,SACAA,KAAK6D,QAAUjG,EAASoC,KAAK6D,OAAOoQ,YAAYrW,EAASoC,WAC7DgB,KAAKoO,OAAOxR,EAASoC,QACjBA,KAAO,MAGhBpC,EAASmX,UAAU9e,KAAK+K,KAAKoO,OAAOxR,EAASmX,+CAIxCnX,KACAoC,KAAO/J,KAAK+K,KAAKuO,IAAI3R,EAASoC,MAEnCpC,EAASoC,KAAK6D,QACdjG,EAASoC,KAAT,UACSA,KAAKgV,KAAOpX,EAASoC,KAAKzE,MAAM1B,MAAQ,IACxCmG,KAAKiV,KAAOrX,EAASoC,KAAKzE,MAAMzB,OAAS,wCAI7C8D,OACHmX,EAAW9e,KAAK+K,KAAKuO,IAAI2F,SAASC,UAEpClf,KAAKkb,SACDlb,KAAKkb,kBAAkBiE,OACvBL,EAASM,YAAYpf,KAAKkb,QAE1B4D,EAASM,YAAY,cAEpBC,UAAU1X,EAAS2D,OAAS,WAAWkR,WAAW,EAAG,EAAG7U,EAASkI,YAEpEyP,EAAQtf,KAAK+K,KAAKuO,IAAI2F,SAASM,OAAQT,MAEpC/U,KAAOuV,IACPR,SAAWA,WChEPU,0BAELvE,EAASwE,4EACXxE,aAED5V,QAAU+F,EAAK6P,QAAQzU,WAAW,QAClCkZ,UAAY,OACZD,UAAY,OACZA,UAAYA,IACZE,gBAAgBF,KAEhB7U,KAAO,6BAXuBoQ,sCAchCpX,EAAOC,QACLoX,QAAQrX,MAAQA,OAChBqX,QAAQpX,OAASA,0CAGV4b,QACPA,UAAYA,GAAwB,IAAIxN,EAAU,EAAG,EAAGjS,KAAKib,QAAQrX,MAAO5D,KAAKib,QAAQpX,aACzF6b,UAAY1f,KAAKqF,QAAQsa,gBAAgB3f,KAAKyf,UAAU7b,MAAO5D,KAAKyf,UAAU5b,aAC9EwB,QAAQua,aAAa5f,KAAK0f,UAAW1f,KAAKyf,UAAUlf,EAAGP,KAAKyf,UAAUjf,iDAItE6E,QAAQM,UAAU3F,KAAKyf,UAAUlf,EAAGP,KAAKyf,UAAUjf,EAAGR,KAAKyf,UAAU7b,MAAO5D,KAAKyf,UAAU5b,aAC3F6b,UAAY1f,KAAKqF,QAAQK,aAAa1F,KAAKyf,UAAUlf,EAAGP,KAAKyf,UAAUjf,EAAGR,KAAKyf,UAAU7b,MAAO5D,KAAKyf,UAAU5b,2DAI/GwB,QAAQua,aAAa5f,KAAK0f,UAAW1f,KAAKyf,UAAUlf,EAAGP,KAAKyf,UAAUjf,6CAG7DmH,6CAEDA,GACT3H,KAAK0f,gBACAG,SAAS7f,KAAK0f,UAAW/f,KAAKC,MAAM+H,EAASD,EAAEnH,EAAIP,KAAKyf,UAAUlf,GAAIZ,KAAKC,MAAM+H,EAASD,EAAElH,EAAIR,KAAKyf,UAAUjf,GAAImH,oCAIvHlC,EAAWlF,EAAGC,EAAGmH,OAChBuI,EAAMvI,EAASvD,UAAU8L,SAE1B3P,EAAI,GAAOA,EAAIP,KAAKib,QAAQrX,OAAWpD,EAAI,GAAOA,EAAIR,KAAK8f,mBAG1D5d,EAA8C,IAAxC1B,GAAK,GAAKiF,EAAU7B,OAASrD,GAAK,MAEpCwf,KAAK7d,GAAKgO,EAAIC,IACd4P,KAAK7d,EAAI,GAAKgO,EAAIE,IAClB2P,KAAK7d,EAAI,GAAKgO,EAAIzQ,IAClBsgB,KAAK7d,EAAI,GAAsB,IAAjByF,EAAS/F,8CAGtB+F,aCtDEqY,0BAEL/E,EAASC,4EACXD,aAEDC,OAASA,IACT+E,UAAW,IACXlV,KAAK1B,OAAS,SAACU,EAAMpC,UAAayD,EAAKwS,WAAW7T,EAAMpC,MACxDiD,KAAO,4BARsBoQ,2FAgBpBrT,GACVA,EAASoC,OACAA,KAAO/J,KAAK+K,KAAKuO,IAAI3R,EAASoC,KAAMpC,KAEpCoC,KAAO/J,KAAK+K,KAAKuO,IAAItZ,KAAKob,WAAYzT,QAG9CsT,QAAQ0D,SAAShX,EAASoC,+CAMlBpC,QACRvD,UAAUuD,EAAUA,EAASoC,MAC9B/J,KAAKigB,WAAUtY,EAASoC,KAAKmW,KAAOzI,EAAU0I,qBAAqBxY,2CAM5DA,QACNsT,QAAQ+C,YAAYrW,EAASoC,WAC7BgB,KAAKoO,OAAOxR,EAASoC,QACjBA,KAAO,qCAGZ0C,+FAEC1B,KAAKzC,kBAENpG,EAAIuK,EAAUpL,OACXa,KAAK,KACJyF,EAAW8E,EAAUvK,GACrByF,EAASoC,WACJkR,QAAQ+C,YAAYrW,EAASoC,yCAKpCpC,EAAUxB,KACT5F,EAAIoH,EAASD,EAAEnH,IACfC,EAAImH,EAASD,EAAElH,IAEfoB,MAAQ+F,EAAS/F,QAEjB6C,MAAMlE,EAAIoH,EAASlD,QACnBA,MAAMjE,EAAImH,EAASlD,QAGnBqL,SAAWnI,EAASmI,SAAWvQ,EAAUwU,0CAGzChK,EAAMpC,UACToC,EAAKsR,SACErb,KAAKke,aAAavW,GAElB3H,KAAKme,aAAapU,wCAGpBA,OACH6F,EAAS7F,EAAKrB,QAAU0X,KAAKC,OAAOC,UAAUvW,EAAKhE,KAAO,IAAIqa,KAAKC,OAAOtW,YACzEwW,OAAOhgB,EAAI,KACXggB,OAAO/f,EAAI,GAEXoP,uCAGEjI,OACHmX,EAAW,IAAIsB,KAAKlB,YAEtBlf,KAAKkb,OAAQ,CACAlb,KAAKkb,kBAAkBiE,QAASnf,KAAKkb,SACzCkE,YAAYpf,KAAKkb,iBAGrBmE,UAAU1X,EAAS2D,OAAS,SAC5BkR,WAAW,EAAG,EAAG7U,EAASkI,UAC1B2Q,UAEF1B,WCpGM2B,0CAGdC,aACAhD,KAAO,MAEP,IAAIxb,EAAI,EAAGA,EAAI,GAAIA,SAAUwe,KAAKtX,KAAKuX,EAAKtX,QAAQ,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,2CAG9EuI,EAAG1P,GACG,GAALA,EACHye,EAAK1f,IAAI2Q,EAAG5R,KAAK0gB,KAAK,IAEtBC,EAAKC,SAAS5gB,KAAK0gB,KAAKxe,EAAI,GAAI0P,EAAG5R,KAAK0gB,KAAKxe,SAEzCwb,KAAO/d,KAAK2Q,IAAItQ,KAAK0d,KAAMxb,EAAI,gCAGhC0P,GACa,GAAb5R,KAAK0d,KACRiD,EAAK1f,IAAI2Q,EAAG5R,KAAK0gB,KAAK,IAEtBC,EAAKC,SAAS5gB,KAAK0gB,KAAK1gB,KAAK0d,KAAO,GAAI9L,EAAG5R,KAAK0gB,KAAK1gB,KAAK0d,YAEtDA,qCAID1d,KAAK0d,KAAO,GACf1d,KAAK0d,4CAIE1d,KAAK0gB,KAAK1gB,KAAK0d,KAAO,YCzBXmD,0BAEL5F,4EACFA,aAED6F,GAAK1V,EAAK6P,QAAQzU,WAAW,sBAAwBua,WAAW,EAAMC,SAAS,EAAOC,OAAO,IAC7F7V,EAAK0V,IAAI5N,MAAM,8CAEfgO,YACAC,iBACAC,gBACAC,gBAEAP,GAAGQ,cAAclW,EAAK0V,GAAGS,YACzBT,GAAGU,UAAUpW,EAAK0V,GAAGW,UAAWrW,EAAK0V,GAAGY,uBACxCZ,GAAGa,OAAOvW,EAAK0V,GAAGc,SAElBrF,YAAcnR,EAAKmR,YAAYjV,UAE/BsD,KAAO,6BAnBuBoQ,oCAsBlCtR,sFACUA,QACNrF,OAAOrE,KAAKib,QAAQrX,MAAO5D,KAAKib,QAAQpX,uCAG1CD,EAAOC,QACLge,KAAK,IAAM,OACXA,KAAK,GAAK,OAEVC,KAAK,GAAK,EAAIle,OACdke,KAAK,GAAK,EAAIje,OAEdke,OAAO9gB,IAAIjB,KAAK6hB,KAAM,QACtBE,OAAO9gB,IAAIjB,KAAK8hB,KAAM,QAEtBhB,GAAGkB,SAAS,EAAG,EAAGpe,EAAOC,QACzBoX,QAAQrX,MAAQA,OAChBqX,QAAQpX,OAASA,uCAGbgM,QACJoS,gBAAkBjiB,KAAKke,aAAarO,oDAIvB,yBAA0B,kCAAmC,gCAAiC,qBAAsB,8BAA+B,uBAAwB,gBAAiB,8CAA+C,sCAAuC,iCAAkC,sBAAuB,KAAK3E,KAAK,yDAKrV,2BAA4B,8BAA+B,uBAAwB,8BAA+B,sBAAuB,2BAA4B,uBAAwB,gBAAiB,0DAA2D,mDAAoD,2BAA4B,KAAKA,KAAK,6CAKhX6W,OAAS,IAAItB,QACboB,KAAOlB,EAAKtX,QAAQ,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,SAC9CyY,KAAOnB,EAAKtX,QAAQ,IAAS,EAAG,EAAG,EAAG,IAAS,EAAG,EAAG,EAAG,SACxD6Y,wDAGKC,QACLrB,GAAGQ,cAActhB,KAAK8gB,GAAGqB,sCAGxBA,EAAGC,QACJtB,GAAGU,UAAUxhB,KAAK8gB,GAAGqB,GAAIniB,KAAK8gB,GAAGsB,sCAGhCtB,EAAIzW,EAAKgY,OACTC,EAASD,EAAKvB,EAAGyB,aAAazB,EAAG0B,iBAAmB1B,EAAGyB,aAAazB,EAAG2B,wBAE1EC,aAAaJ,EAAQjY,KACrBsY,cAAcL,GAEZxB,EAAG8B,mBAAmBN,EAAQxB,EAAG+B,gBAK/BP,SAJGxB,EAAGgC,iBAAiBR,IACnB,gDAOLS,EAAiB/iB,KAAKgjB,UAAUhjB,KAAK8gB,GAAI9gB,KAAKijB,qBAAqB,GACnEC,EAAeljB,KAAKgjB,UAAUhjB,KAAK8gB,GAAI9gB,KAAKmjB,mBAAmB,QAEhEC,SAAWpjB,KAAK8gB,GAAGuC,qBACnBvC,GAAGwC,aAAatjB,KAAKojB,SAAUF,QAC/BpC,GAAGwC,aAAatjB,KAAKojB,SAAUL,QAC/BjC,GAAGyC,YAAYvjB,KAAKojB,UAEpBpjB,KAAK8gB,GAAG0C,oBAAoBxjB,KAAKojB,SAAUpjB,KAAK8gB,GAAG2C,cACpDvQ,MAAM,qCAEL4N,GAAG4C,WAAW1jB,KAAKojB,eACnBA,SAASO,IAAM3jB,KAAK8gB,GAAG8C,kBAAkB5jB,KAAKojB,SAAU,wBACxDA,SAASS,IAAM7jB,KAAK8gB,GAAG8C,kBAAkB5jB,KAAKojB,SAAU,sBACxDtC,GAAGgD,wBAAwB9jB,KAAKojB,SAASS,UACzC/C,GAAGgD,wBAAwB9jB,KAAKojB,SAASO,UAEzCP,SAASW,YAAc/jB,KAAK8gB,GAAGkD,mBAAmBhkB,KAAKojB,SAAU,aACjEA,SAASa,eAAiBjkB,KAAK8gB,GAAGkD,mBAAmBhkB,KAAKojB,SAAU,iBACpEA,SAASc,OAASlkB,KAAK8gB,GAAGkD,mBAAmBhkB,KAAKojB,SAAU,mBAC5DA,SAAS9X,MAAQtL,KAAK8gB,GAAGkD,mBAAmBhkB,KAAKojB,SAAU,eAC3DtC,GAAGqD,UAAUnkB,KAAKojB,SAASc,OAAQ,6CAKpCE,cAECC,YAAcrkB,KAAK8gB,GAAGpE,oBACtBoE,GAAGwD,WAAWtkB,KAAK8gB,GAAGyD,qBAAsBvkB,KAAKqkB,kBACjDvD,GAAG0D,WAAWxkB,KAAK8gB,GAAGyD,qBAAsB,IAAIE,aALzC,EAAG,EAAG,EAAG,EAAG,EAAG,IAK2CzkB,KAAK8gB,GAAG4D,iBAE1ExiB,SACAyiB,SACCziB,EAAI,EAAGA,EAAI,IAAKA,MAASkH,KAAKlH,OACnCkiB,EAAM,IAAIK,YAAYE,QAEjBC,QAAU5kB,KAAK8gB,GAAGpE,oBAClBoE,GAAGwD,WAAWtkB,KAAK8gB,GAAGyD,qBAAsBvkB,KAAK4kB,cACjD9D,GAAG0D,WAAWxkB,KAAK8gB,GAAGyD,qBAAsBH,EAAKpkB,KAAK8gB,GAAG4D,kBAGzDxiB,EAAI,EAAGA,EAAI,IAAKA,MAASkH,KAAKlH,EAAGA,EAAI,EAAGA,EAAI,GACjDkiB,EAAM,IAAIK,YAAYE,QAEjBE,YAAc7kB,KAAK8gB,GAAGpE,oBACtBoE,GAAGwD,WAAWtkB,KAAK8gB,GAAGyD,qBAAsBvkB,KAAK6kB,kBACjD/D,GAAG0D,WAAWxkB,KAAK8gB,GAAGyD,qBAAsBH,EAAKpkB,KAAK8gB,GAAG4D,kDAGrDI,QACJC,mBAAqB3e,EAAgBrE,EAAKC,UAAU8iB,EAAQ,SAC3Dze,EAASC,EAAQC,aAAa,gBAA2C,EAA1BvG,KAAK+kB,mBAAkD,EAA1B/kB,KAAK+kB,oBACjF1f,EAAUgB,EAAOG,WAAW,eAE1B4W,cACAC,IAAIrd,KAAK+kB,mBAAoB/kB,KAAK+kB,mBAAoB/kB,KAAK+kB,mBAAoB,EAAa,EAAVplB,KAAKL,IAAQ,KAC/Fke,cACAV,UAAY,SACZW,OAEDpX,EAAO2e,mDAGHrd,OACLsd,EAAKtd,EAASoC,KAAKnG,MACnBshB,EAAKvd,EAASoC,KAAKlG,OAEnBshB,EAAS/e,EAAgBuB,EAASoC,KAAKnG,OACvCwhB,EAAUhf,EAAgBuB,EAASoC,KAAKlG,QAExCwhB,EAAU1d,EAASoC,KAAKnG,MAAQuhB,EAChCG,EAAU3d,EAASoC,KAAKlG,OAASuhB,EAElCplB,KAAKkiB,eAAeva,EAASvD,UAAU2B,OACxC/F,KAAKkiB,eAAeva,EAASvD,UAAU2B,MAAQ/F,KAAK8gB,GAAGyE,gBAAiBvlB,KAAK8gB,GAAGpE,eAAgB1c,KAAK8gB,GAAGpE,mBAEnGtY,UAAUohB,QAAUxlB,KAAKkiB,eAAeva,EAASvD,UAAU2B,KAAK,KAChE3B,UAAUqhB,SAAWzlB,KAAKkiB,eAAeva,EAASvD,UAAU2B,KAAK,KACjE3B,UAAUshB,SAAW1lB,KAAKkiB,eAAeva,EAASvD,UAAU2B,KAAK,QAErE+a,GAAGwD,WAAWtkB,KAAK8gB,GAAG6E,aAAche,EAASvD,UAAUshB,eACvD5E,GAAG0D,WAAWxkB,KAAK8gB,GAAG6E,aAAc,IAAIlU,cAAc,EAAK,EAAK4T,EAAS,EAAK,EAAKC,EAASA,EAASA,IAAWtlB,KAAK8gB,GAAG4D,kBACxH5D,GAAGwD,WAAWtkB,KAAK8gB,GAAG6E,aAAche,EAASvD,UAAUqhB,eACvD3E,GAAG0D,WAAWxkB,KAAK8gB,GAAG6E,aAAc,IAAIlU,cAAc,EAAK,EAAKwT,EAAI,EAAK,EAAKC,EAAID,EAAIC,IAAMllB,KAAK8gB,GAAG4D,iBAGnG3E,EADUpY,EAASvD,UAAUiC,OAAOG,WAAW,MAChCd,aAAa,EAAG,EAAGyf,EAAQC,QAE3CtE,GAAG8E,YAAY5lB,KAAK8gB,GAAG+E,WAAYle,EAASvD,UAAUohB,cACtD1E,GAAGgF,WAAW9lB,KAAK8gB,GAAG+E,WAAY,EAAG7lB,KAAK8gB,GAAGiF,KAAM/lB,KAAK8gB,GAAGiF,KAAM/lB,KAAK8gB,GAAGkF,cAAejG,QACxFe,GAAGmF,cAAcjmB,KAAK8gB,GAAG+E,WAAY7lB,KAAK8gB,GAAGoF,mBAAoBlmB,KAAK8gB,GAAGqF,aACzErF,GAAGmF,cAAcjmB,KAAK8gB,GAAG+E,WAAY7lB,KAAK8gB,GAAGsF,mBAAoBpmB,KAAK8gB,GAAGuF,4BACzEvF,GAAGwF,eAAetmB,KAAK8gB,GAAG+E,cAEtBzhB,UAAUmiB,eAAgB,IAC1BniB,UAAUoiB,aAAevB,IACzB7gB,UAAUqiB,cAAgBvB,sFAQrBvd,KACLvD,UAAUmiB,eAAgB,IAC1BniB,UAAUsiB,KAAO/F,EAAKtX,WACtBjF,UAAUsiB,KAAK,GAAK,IACpBtiB,UAAUuiB,KAAOhG,EAAKtX,WACtBjF,UAAUuiB,KAAK,GAAK,EAEzBhf,EAASoC,OACepC,EAASoC,KAAM/J,KAAKuc,YAAa5U,MAEjC3H,KAAKiiB,gBAAiBjiB,KAAKuc,YAAa5U,KACvDvD,UAAUwiB,SAAWjf,EAASkI,OAAS7P,KAAK+kB,wDAKjDnf,EAAK+B,GACTA,EAASgI,SAEJ5F,KAAOnE,IACPxB,UAAU2B,IAAMH,EAAIG,MACpB3B,UAAUiC,OAAS+B,EAA2BxC,KAC9CxB,UAAUwiB,SAAW,OAEzBC,eAAelf,6CAGPA,GACTA,EAASvD,UAAUmiB,qBACdO,aAAanf,QAEbmZ,GAAGiG,UAAU/mB,KAAKojB,SAAS9X,MAAO3D,EAASvD,UAAU8L,IAAIC,EAAI,IAAKxI,EAASvD,UAAU8L,IAAIE,EAAI,IAAKzI,EAASvD,UAAU8L,IAAIzQ,EAAI,UAC7HqhB,GAAGkG,iBAAiBhnB,KAAKojB,SAASW,aAAa,EAAO/jB,KAAK+hB,OAAOkF,YAElEnG,GAAGwD,WAAWtkB,KAAK8gB,GAAG6E,aAAche,EAASvD,UAAUqhB,eACvD3E,GAAGoG,oBAAoBlnB,KAAKojB,SAASO,IAAK,EAAG3jB,KAAK8gB,GAAGqG,OAAO,EAAO,EAAG,QACtErG,GAAGwD,WAAWtkB,KAAK8gB,GAAG6E,aAAche,EAASvD,UAAUshB,eACvD5E,GAAGoG,oBAAoBlnB,KAAKojB,SAASS,IAAK,EAAG7jB,KAAK8gB,GAAGqG,OAAO,EAAO,EAAG,QACtErG,GAAG8E,YAAY5lB,KAAK8gB,GAAG+E,WAAYle,EAASvD,UAAUohB,cACtD1E,GAAGqD,UAAUnkB,KAAKojB,SAASa,eAAgB,QAC3CnD,GAAGwD,WAAWtkB,KAAK8gB,GAAGyD,qBAAsBvkB,KAAKqkB,kBAEjDvD,GAAGsG,aAAapnB,KAAK8gB,GAAGuG,UAAW,EAAGrnB,KAAK8gB,GAAGwG,eAAgB,QAE9DvF,OAAO9Y,8CAILtB,yCAEFA,OACH4f,EAAmBnhB,GAA2BuB,EAASvD,UAAUoiB,aAAe,GAAI7e,EAASvD,UAAUqiB,cAAgB,GACvHe,EAAoBphB,EAA0BuB,EAASD,EAAEnH,EAAGoH,EAASD,EAAElH,GAEvEinB,EAAQ9f,EAASmI,SAAYvQ,EAAUwU,OACvC2T,EAAiBthB,EAAuBqhB,GAExChjB,EAAQkD,EAASlD,MAAQkD,EAASvD,UAAUwiB,SAC5Ce,EAAcvhB,EAAoB3B,EAAOA,GAC3CmjB,EAASxhB,EAAyBmhB,EAAkBI,KAE/CvhB,EAAyBwhB,EAAQF,KACjCthB,EAAyBwhB,EAAQJ,KAErCK,QAAQD,EAAQjgB,EAASvD,UAAUuiB,QACjC,GAAKhf,EAAS/F,WAEhBmgB,OAAO3Y,KAAKwe,YCzQJE,0BAEL7M,4EACFA,aAEDrQ,KAAO,8BALwBoQ,SCCvB+M,0BAERC,EAAIC,EAAIC,EAAIC,EAAIC,qFAGvBF,EAAKF,GAAM,KACTA,GAAKA,IACLC,GAAKA,IACLC,GAAKA,IACLC,GAAKA,MAELH,GAAKE,IACLD,GAAKE,IACLD,GAAKF,IACLG,GAAKF,KAGNvmB,GAAK0J,EAAK8c,GAAK9c,EAAK4c,KACpBrmB,GAAKyJ,EAAK+c,GAAK/c,EAAK6c,KAEpBI,KAAO1oB,KAAK2oB,IAAIld,EAAK4c,GAAI5c,EAAK8c,MAC9BK,KAAO5oB,KAAK2oB,IAAIld,EAAK6c,GAAI7c,EAAK+c,MAC9BK,KAAO7oB,KAAK2Q,IAAIlF,EAAK4c,GAAI5c,EAAK8c,MAC9BO,KAAO9oB,KAAK2Q,IAAIlF,EAAK6c,GAAI7c,EAAK+c,MAE9BO,IAAMtd,EAAK8c,GAAK9c,EAAK6c,GAAK7c,EAAK4c,GAAK5c,EAAK+c,KACzCQ,KAAOvd,EAAK1J,GAAK0J,EAAK1J,GAAK0J,EAAKzJ,GAAKyJ,EAAKzJ,KAE1CinB,SAAWxd,EAAKyd,gBAChBxnB,OAAS+J,EAAK0d,cACdV,UAAYrmB,EAAKC,UAAUomB,EAAW,kBA9BLrV,wDAmCjClT,OAASF,KAAKE,cACdmT,OAAOzS,EAAIP,KAAKgoB,GAAKhoB,KAAKH,OAASG,KAAKqB,OAAS1B,KAAK6B,IAAIxB,KAAK4oB,eAC/D5V,OAAOxS,EAAIR,KAAKioB,GAAKjoB,KAAKH,OAASG,KAAKqB,OAAS1B,KAAK8B,IAAIzB,KAAK4oB,UAE7D5oB,KAAKgT,4CAGAzS,EAAGC,OACT2hB,EAAIniB,KAAK2B,GACTygB,GAAKpiB,KAAK0B,UAIXygB,EAAI5hB,EAAI6hB,EAAI5hB,EAHPR,KAAK0oB,MACA,GAALtG,EAAS,EAAIA,GAEO,sCAMnB7hB,EAAGC,UACJR,KAAK2B,GAGApB,GAFJP,KAAK0B,GAEOlB,EADbR,KAAK0oB,KAGJ/oB,KAAKwB,KAAKnB,KAAK2oB,2CAGdhoB,OACNooB,EAAOpoB,EAAEkoB,cAETtnB,EAAM,GADCvB,KAAK6oB,cACME,GAElBC,EAAOroB,EAAEJ,EACT0oB,EAAOtoB,EAAEH,WAEbD,EAAIyoB,EAAOrpB,KAAK6B,IAAID,GAAO0nB,EAAOtpB,KAAK8B,IAAIF,KAC3Cf,EAAIwoB,EAAOrpB,KAAK8B,IAAIF,GAAO0nB,EAAOtpB,KAAK6B,IAAID,GAEtCZ,+CAIAhB,KAAKc,MAAMT,KAAK2B,GAAI3B,KAAK0B,qCAGxBiG,MACMhI,KAAKyR,IAAIpR,KAAK6oB,gBAEftpB,EAAUD,GAAK,MACvBqI,EAASD,EAAEnH,GAAKP,KAAKwoB,MAAQ7gB,EAASD,EAAEnH,GAAKP,KAAKqoB,KAAM,OAAO,UAE/D1gB,EAASD,EAAElH,GAAKR,KAAKyoB,MAAQ9gB,EAASD,EAAElH,GAAKR,KAAKuoB,KAAM,OAAO,SAG7D,6CAIA5oB,KAAKwB,KAAKnB,KAAK0B,GAAK1B,KAAK0B,GAAK1B,KAAK2B,GAAK3B,KAAK2B,qCAG5CgG,MACc,QAAlB3H,KAAKiT,aACc,KAAlBjT,KAAKooB,WAAsC,KAAlBpoB,KAAKooB,WAAsC,SAAlBpoB,KAAKooB,WAA0C,QAAlBpoB,KAAKooB,UAAqB,KACvGpoB,KAAKkpB,SAASvhB,GAAW,OAC1B3H,KAAKqX,aAAa1P,EAASD,EAAEnH,EAAGoH,EAASD,EAAElH,KAAImH,EAASgI,MAAO,OAC7D,KACD3P,KAAKkpB,SAASvhB,GAAW,OACzB3H,KAAKqX,aAAa1P,EAASD,EAAEnH,EAAGoH,EAASD,EAAElH,KAAImH,EAASgI,MAAO,QAIjE,GAAsB,SAAlB3P,KAAKiT,UAAsB,KAC9BjT,KAAKkpB,SAASvhB,GAAW,OAE1B3H,KAAKmpB,YAAYxhB,EAASD,EAAEnH,EAAGoH,EAASD,EAAElH,IAAMmH,EAASkI,SAC7C,GAAX7P,KAAK0B,KACCf,EAAEJ,IAAM,EACI,GAAXP,KAAK2B,KACNhB,EAAEH,IAAM,OAEZ4oB,aAAazhB,EAAShH,QAKH,SAAlBX,KAAKiT,WACTjT,KAAKkT,gBACAmW,MAAM,qDACTnW,OAAQ,YC9HI6U,0BAELxnB,EAAGC,EAAGqP,uFAGTtP,EAAIA,IACJC,EAAIA,IACJqP,OAASA,IAETyZ,MAAQ,IACRxpB,QAAWS,IAAGC,kBAVauS,wDAc3BlT,OAASF,KAAKE,cACdypB,MAAQ/pB,EAAUgqB,KAAO5pB,KAAKE,cAE9BmT,OAAOzS,EAAIP,KAAKO,EAAIP,KAAKH,OAASG,KAAK6P,OAASlQ,KAAK6B,IAAIxB,KAAKspB,YAC9DtW,OAAOxS,EAAIR,KAAKQ,EAAIR,KAAKH,OAASG,KAAK6P,OAASlQ,KAAK8B,IAAIzB,KAAKspB,OAE5DtpB,KAAKgT,yCAGNzS,EAAGC,QACJV,OAAOS,EAAIA,OACXT,OAAOU,EAAIA,mCAGXmH,OACC6hB,EAAI7hB,EAASD,EAAE+hB,WAAWzpB,KAAKF,QAEf,QAAlBE,KAAKiT,UACDuW,EAAI7hB,EAASkI,OAAS7P,KAAK6P,SAC3BlI,EAASgI,MAAO,GACK,SAAlB3P,KAAKiT,UACRuW,EAAI7hB,EAASkI,QAAU7P,KAAK6P,QAC5B7P,KAAKopB,aAAazhB,GACG,SAAlB3H,KAAKiT,WACRjT,KAAKkT,cACC,uDACDA,OAAQ,wCAKZvL,OACLohB,EAAOphB,EAAShH,EAAEkoB,cAGlBtnB,EAAM,GAFCvB,KAAK6oB,YAAYlhB,GAENohB,GAClBC,EAAOrhB,EAAShH,EAAEJ,EAClB0oB,EAAOthB,EAAShH,EAAEH,IAEbG,EAAEJ,EAAIyoB,EAAOrpB,KAAK6B,IAAID,GAAO0nB,EAAOtpB,KAAK8B,IAAIF,KAC7CZ,EAAEH,EAAIwoB,EAAOrpB,KAAK8B,IAAIF,GAAO0nB,EAAOtpB,KAAK6B,IAAID,uCAG9CoG,UACApI,EAAUmB,KAAOf,KAAKc,MAAMkH,EAASD,EAAElH,EAAIR,KAAKF,OAAOU,EAAGmH,EAASD,EAAEnH,EAAIP,KAAKF,OAAOS,YC3DhFmpB,0BAERnpB,EAAGC,EAAGoD,EAAOC,uFAGnBtD,EAAIA,IACJC,EAAIA,IACJoD,MAAQA,IACRC,OAASA,eAR+BkP,wDAYxCC,OAAOzS,EAAIP,KAAKO,EAAIZ,KAAKE,SAAWG,KAAK4D,WACzCoP,OAAOxS,EAAIR,KAAKQ,EAAIb,KAAKE,SAAWG,KAAK6D,OAEvC7D,KAAKgT,wCAGJrL,GACc,QAAlB3H,KAAKiT,WACJtL,EAASD,EAAEnH,EAAIoH,EAASkI,OAAS7P,KAAKO,EACzCoH,EAASgI,MAAO,EACRhI,EAASD,EAAEnH,EAAIoH,EAASkI,OAAS7P,KAAKO,EAAIP,KAAK4D,QACvD+D,EAASgI,MAAO,GAEbhI,EAASD,EAAElH,EAAImH,EAASkI,OAAS7P,KAAKQ,EACzCmH,EAASgI,MAAO,EACRhI,EAASD,EAAElH,EAAImH,EAASkI,OAAS7P,KAAKQ,EAAIR,KAAK6D,SACvD8D,EAASgI,MAAO,IAGS,SAAlB3P,KAAKiT,WACTtL,EAASD,EAAEnH,EAAIoH,EAASkI,OAAS7P,KAAKO,KAChCmH,EAAEnH,EAAIP,KAAKO,EAAIoH,EAASkI,SACxBlP,EAAEJ,IAAM,GACPoH,EAASD,EAAEnH,EAAIoH,EAASkI,OAAS7P,KAAKO,EAAIP,KAAK4D,UAChD8D,EAAEnH,EAAIP,KAAKO,EAAIP,KAAK4D,MAAQ+D,EAASkI,SACrClP,EAAEJ,IAAM,GAGdoH,EAASD,EAAElH,EAAImH,EAASkI,OAAS7P,KAAKQ,KAChCkH,EAAElH,EAAIR,KAAKQ,EAAImH,EAASkI,SACxBlP,EAAEH,IAAM,GACPmH,EAASD,EAAElH,EAAImH,EAASkI,OAAS7P,KAAKQ,EAAIR,KAAK6D,WAChD6D,EAAElH,EAAIR,KAAKQ,EAAIR,KAAK6D,OAAS8D,EAASkI,SACtClP,EAAEH,IAAM,IAIQ,SAAlBR,KAAKiT,YACTtL,EAASD,EAAEnH,EAAIoH,EAASkI,OAAS7P,KAAKO,GAAKoH,EAAShH,EAAEJ,GAAK,EAC9DoH,EAASD,EAAEnH,EAAIP,KAAKO,EAAIP,KAAK4D,MAAQ+D,EAASkI,OACtClI,EAASD,EAAEnH,EAAIoH,EAASkI,OAAS7P,KAAKO,EAAIP,KAAK4D,OAAS+D,EAAShH,EAAEJ,GAAK,IAChFoH,EAASD,EAAEnH,EAAIP,KAAKO,EAAIoH,EAASkI,QAE9BlI,EAASD,EAAElH,EAAImH,EAASkI,OAAS7P,KAAKQ,GAAKmH,EAAShH,EAAEH,GAAK,EAC9DmH,EAASD,EAAElH,EAAIR,KAAKQ,EAAIR,KAAK6D,OAAS8D,EAASkI,OACvClI,EAASD,EAAElH,EAAImH,EAASkI,OAAS7P,KAAKQ,EAAIR,KAAK6D,QAAU8D,EAAShH,EAAEH,GAAK,IACjFmH,EAASD,EAAElH,EAAIR,KAAKQ,EAAImH,EAASkI,kBCzDhB8Z,0BAERjK,EAAWnf,EAAGC,EAAGgpB,uFAGvBpa,MAAMsQ,EAAWnf,EAAGC,EAAGgpB,gBALSzW,oCAQhC2M,EAAWnf,EAAGC,EAAGgpB,QACjB9J,UAAYA,OACZnf,EAAIwB,EAAKC,UAAUzB,EAAG,QACtBC,EAAIuB,EAAKC,UAAUxB,EAAG,QACtBgpB,EAAIznB,EAAKC,UAAUwnB,EAAG,QAEtBI,gBACAC,sDAID3nB,SAAG4nB,SACDC,EAAU/pB,KAAK0f,UAAU9b,MACzBomB,EAAUhqB,KAAK0f,UAAU7b,WAE1B3B,EAAI,EAAGA,EAAI6nB,EAAS7nB,GAAKlC,KAAKwpB,MAC7BM,EAAI,EAAGA,EAAIE,EAASF,GAAK9pB,KAAKwpB,EAAG,KACjC9b,EAA0C,IAAhCoc,GAAK,GAAKC,GAAW7nB,GAAK,IAEpClC,KAAK0f,UAAUK,KAAKrS,EAAQ,GAAK,QAC/Bkc,QAAQxgB,MAAO7I,EAAG2B,EAAIlC,KAAKO,EAAGC,EAAGspB,EAAI9pB,KAAKQ,WAK3CR,KAAKgT,wCAGJzS,EAAGC,OACPkN,EAAuD,IAA7ClN,GAAK,GAAKR,KAAK0f,UAAU9b,OAASrD,GAAK,WACjDP,KAAK0f,UAAUK,KAAKrS,EAAQ,GAAK,+CAO9B1N,KAAKgT,OAAOpL,KAAK5H,KAAK4pB,QAAQjqB,KAAKC,MAAMD,KAAKE,SAAWG,KAAK4pB,QAAQvoB,2CAGrEd,EAAGC,MACNR,KAAKO,MAEN2B,EAAmD,QADlDlC,KAAKQ,IACK,GAAKR,KAAK0f,UAAU9b,OAASrD,GAAK,aAG7CP,KAAK0f,UAAUK,KAAK7d,KACpBlC,KAAK0f,UAAUK,KAAK7d,EAAI,KACxBlC,KAAK0f,UAAUK,KAAK7d,EAAI,KACxBlC,KAAK0f,UAAUK,KAAK7d,EAAI,qCAIpByF,GACc,QAAlB3H,KAAKiT,UACJjT,KAAKiqB,SAAStiB,EAASD,EAAEnH,EAAIP,KAAKO,EAAGoH,EAASD,EAAElH,EAAIR,KAAKQ,GAC5DmH,EAASgI,MAAO,EAEhBhI,EAASgI,MAAO,EAGS,SAAlB3P,KAAKiT,YACRjT,KAAKiqB,SAAStiB,EAASD,EAAEnH,EAAIP,KAAKO,EAAGoH,EAASD,EAAElH,EAAIR,KAAKQ,IAC7DmH,EAAShH,EAAEupB,iDCjEGxgB,EAAQygB,KACjBhf,iBAAiB,sBAAuB,kBAAMgf,yBAG7C7e,OACF4E,EAAMuH,EAAUC,SAASpM,GAAS,yBACzB4E,EAAIC,OAAMD,EAAIE,OAAMF,EAAIzQ,8BAG/BiK,EAAQrD,EAAQgN,EAAMrG,OACxB3H,EAAUgB,EAAOG,WAAW,MAC5BtC,EAAQlE,KAAKoqB,gBAEdjf,iBAAiBzB,EAAQ,WACzBsD,GACH3H,EAAQM,UAAU,EAAG,EAAGU,EAAOzC,MAAOyC,EAAOxC,QAE1CwP,aAAgBF,KACXiK,cACAN,UAAY5Y,IACZmZ,IAAIhK,EAAK9S,EAAG8S,EAAK7S,EAAG,GAAI,EAAa,EAAVb,KAAKL,IAAQ,KACxCme,SACAD,aACEnK,aAAgBgX,MAClBjN,cACAE,YAAcpZ,IACdomB,OAAOjX,EAAK2U,GAAI3U,EAAK4U,MACrBsC,OAAOlX,EAAK6U,GAAI7U,EAAK8U,MACrBjN,WACAsC,aACEnK,aAAgBmX,MAClBpN,cACAE,YAAcpZ,IACdumB,SAASpX,EAAK9S,EAAG8S,EAAK7S,EAAG6S,EAAKzP,MAAOyP,EAAKxP,UAC1CqX,WACAsC,aACEnK,aAAgB0U,OAClB3K,cACAE,YAAcpZ,IACdmZ,IAAIhK,EAAK9S,EAAG8S,EAAK7S,EAAG6S,EAAKxD,OAAQ,EAAa,EAAVlQ,KAAKL,IAAQ,KACjD4b,WACAsC,qCAKC9T,EAAQrD,EAAQ4D,EAAS+C,OAC9B3H,EAAUgB,EAAOG,WAAW,MAC5BtC,EAAQlE,KAAKoqB,gBAEdjf,iBAAiBzB,EAAQ,WACzBsD,GAAO3H,EAAQM,UAAU,EAAG,EAAGU,EAAOzC,MAAOyC,EAAOxC,UAEhDuZ,cACAN,UAAY5Y,IACZmZ,IAAIpT,EAAQvC,EAAEnH,EAAG0J,EAAQvC,EAAElH,EAAG,GAAI,EAAa,EAAVb,KAAKL,IAAQ,KAClDme,SACAD,uBC7DT,mBACIkN,EAAW,EACXC,GAAW,KAAM,MAAO,SAAU,KAC7BpqB,EAAI,EAAGA,EAAIoqB,EAAQtpB,SAAW4Y,OAAO2Q,wBAAyBrqB,SAC/DqqB,sBAAwB3Q,OAAO0Q,EAAQpqB,GAAK,gCAC5CsqB,qBAAuB5Q,OAAO0Q,EAAQpqB,GAAK,yBAA2B0Z,OAAO0Q,EAAQpqB,GAAK,+BAG7F0Z,OAAO2Q,wBACX3Q,OAAO2Q,sBAAwB,SAAS/kB,EAAUoV,OAC7C6P,GAAW,IAAI7c,MAAOC,UACtB6c,EAAaprB,KAAK2Q,IAAI,EAAG,IAAMwa,EAAWJ,IAC1C/mB,EAAKsW,OAAO+Q,WAAW,aACjBF,EAAWC,IAClBA,YACQD,EAAWC,EACfpnB,IAGJsW,OAAO4Q,uBACX5Q,OAAO4Q,qBAAuB,SAASlnB,gBACzBA,KArBf,GCyDFsJ,EAAOiC,SAAWjC,EAAOge,EAAI/b,EAC7BjC,EAAOtE,KAAOA,EAEdsE,EAAOlL,KAAOA,EACdkL,EAAOwK,UAAYA,EACnBxK,EAAO1N,UAAYA,EACnB0N,EAAO3M,SAAW2M,EAAOie,OAAS5qB,EAClC2M,EAAOkE,QAAUlE,EAAOke,MAAQha,EAChClE,EAAO6E,UAAYA,EACnB7E,EAAOgF,UAAYA,EACnBhF,EAAOmF,KAAOA,EACdnF,EAAO+B,KAAOA,EACd/B,EAAOpL,KAAOA,EACdoL,EAAO0T,KAAOA,EACd1T,EAAOme,QAAU,SAAC5rB,EAAGC,EAAGK,UAAW,IAAI+B,EAAKrC,EAAGC,EAAGK,IAClDmN,EAAOsK,gBAAkBzF,EAAUyF,gBAEnCtK,EAAO2F,WAAa3F,EAAOoe,KAAOzY,EAClC3F,EAAO4F,KAAO5F,EAAOqe,EAAIzY,EACzB5F,EAAOmG,SAAWnG,EAAOge,EAAI7X,EAC7BnG,EAAOsG,SAAWtG,EAAOse,EAAIhY,EAC7BtG,EAAO+G,KAAO/G,EAAOue,EAAIxX,EACzB/G,EAAOiH,OAASjH,EAAOwe,EAAIvX,EAC3BjH,EAAOmH,KAAOnH,EAAOmV,EAAIhO,EAEzBnH,EAAOsH,UAAYA,EACnBtH,EAAO0H,MAAQ1H,EAAOye,EAAI/W,EAC1B1H,EAAO+H,WAAa/H,EAAOkV,EAAInN,EAC/B/H,EAAOuI,YAAcvI,EAAO0e,GAAKnW,EACjCvI,EAAO6I,QAAU7I,EAAO2e,EAAI9V,EAC5B7I,EAAO8I,UAAYA,EACnB9I,EAAOwJ,UAAYA,EACnBxJ,EAAO0J,MAAQ1J,EAAOkV,EAAIxL,EAC1B1J,EAAO8J,MAAQ9J,EAAO4e,EAAI9U,EAC1B9J,EAAOiK,OAASA,GAChBjK,EAAOqK,MAAQA,GACfrK,EAAO2K,UAAYA,GACnB3K,EAAO4K,YAAcA,GAErB5K,EAAOoL,QAAUA,GACjBpL,EAAO4M,iBAAmBA,GAC1B5M,EAAO8M,cAAgBA,GAEvB9M,EAAO8F,KAAOA,EACd9F,EAAOod,SAAWA,GAClBpd,EAAO8a,WAAaA,GACpB9a,EAAOkG,UAAYA,EACnBlG,EAAOud,SAAWA,GAClBvd,EAAO0c,UAAYA,GAEnB1c,EAAOoP,eAAiBA,GACxBpP,EAAO0Q,YAAcA,GACrB1Q,EAAOyR,cAAgBA,GACvBzR,EAAO+S,aAAeA,GACtB/S,EAAOuS,cAAgBA,GACvBvS,EAAO4T,cAAgB5T,EAAO6e,cAAgBjL,GAC9C5T,EAAO6a,eAAiBA,GAExB7a,EAAO8e,MAAQA,GAEfplB,OAAOqlB,OAAO/e,EAAQ+B"} \ No newline at end of file diff --git a/example/behaviour/attraction/attraction1.html b/example/behaviour/attraction/attraction1.html index f966c26..ebd552e 100644 --- a/example/behaviour/attraction/attraction1.html +++ b/example/behaviour/attraction/attraction1.html @@ -1,149 +1,161 @@ - - behaviour-attraction1 - - - - - - - - - - + + + behaviour-attraction1 + + + + + + + + + + + + + \ No newline at end of file diff --git a/example/behaviour/attraction/attraction2.html b/example/behaviour/attraction/attraction2.html index ea3f2eb..6cf74c3 100644 --- a/example/behaviour/attraction/attraction2.html +++ b/example/behaviour/attraction/attraction2.html @@ -1,168 +1,176 @@ - - behaviour-attraction2 - - - - - - - - - - + + + behaviour-attraction2 + + + + + + + + + + + + \ No newline at end of file diff --git a/example/behaviour/collision/collision.html b/example/behaviour/collision/collision.html index f27ad71..2a9e1e9 100644 --- a/example/behaviour/collision/collision.html +++ b/example/behaviour/collision/collision.html @@ -1,141 +1,153 @@ - - behaviour-Collision - - - - - -
- -
- - - - + + + behaviour-Collision + + + + + + +
+ +
+ + + + + \ No newline at end of file diff --git a/example/behaviour/collision/collisionBall.html b/example/behaviour/collision/collisionBall.html index 42647c4..b7db0ce 100644 --- a/example/behaviour/collision/collisionBall.html +++ b/example/behaviour/collision/collisionBall.html @@ -1,107 +1,117 @@ - - behaviour-collisionBall - - - - - - -
- press -
- - - - + + + behaviour-collisionBall + + + + + + + +
+ press +
+ + + + + \ No newline at end of file diff --git a/example/behaviour/color/color.html b/example/behaviour/color/color.html index 2289d10..a1e8f54 100644 --- a/example/behaviour/color/color.html +++ b/example/behaviour/color/color.html @@ -1,92 +1,98 @@ - - proton.js-behaviour-custom - - - - - -
- -
- - - + + + - stats.begin(); - proton.update(); - stats.end(); - } - - \ No newline at end of file diff --git a/example/behaviour/custom/circle.html b/example/behaviour/custom/circle.html index f3a7788..39723dc 100644 --- a/example/behaviour/custom/circle.html +++ b/example/behaviour/custom/circle.html @@ -1,175 +1,204 @@ - - behaviour-custom - - - - - -
- -
- - - - - + + + behaviour-custom + + + + + + +
+ +
+ + + + + + \ No newline at end of file diff --git a/example/behaviour/force/force.html b/example/behaviour/force/force.html index 37884c0..9cc585f 100644 --- a/example/behaviour/force/force.html +++ b/example/behaviour/force/force.html @@ -1,139 +1,175 @@ - - proton.js-behaviour-Force - - - - - - - - - - + + + proton.js-behaviour-Force + + + + + + + + + + + + + + \ No newline at end of file diff --git a/example/behaviour/force/star.html b/example/behaviour/force/star.html index b4937b3..cc82080 100644 --- a/example/behaviour/force/star.html +++ b/example/behaviour/force/star.html @@ -1,124 +1,129 @@ - - behaviour-Force - - - - - -
- -
- - - - + + + behaviour-Force + + + + + + +
+ +
+ + + + + \ No newline at end of file diff --git a/example/behaviour/gravitywell/linebug.html b/example/behaviour/gravitywell/linebug.html index 2ce9ff5..62610ca 100644 --- a/example/behaviour/gravitywell/linebug.html +++ b/example/behaviour/gravitywell/linebug.html @@ -1,176 +1,185 @@ - - proton.js-behaviour-attraction - - - - - - - - - - + + + proton.js-behaviour-attraction + + + + + + + + + + + + \ No newline at end of file diff --git a/example/behaviour/randomDirft/randomdirft1.html b/example/behaviour/randomDirft/randomdirft1.html index f688bab..33b6ab6 100644 --- a/example/behaviour/randomDirft/randomdirft1.html +++ b/example/behaviour/randomDirft/randomdirft1.html @@ -1,93 +1,109 @@ - - proton.js-behaviour-RandomDirft1 - - - - - - - - - + + + - stats.begin(); - emitter.rotation += .5; - proton.update(); - stats.end(); - } - - \ No newline at end of file diff --git a/example/behaviour/randomDirft/randomdirft2.html b/example/behaviour/randomDirft/randomdirft2.html index 30f0a3e..b94055d 100644 --- a/example/behaviour/randomDirft/randomdirft2.html +++ b/example/behaviour/randomDirft/randomdirft2.html @@ -19,7 +19,7 @@ - + - - + + + - stats.begin(); - proton.update(); - stats.end(); - } - - \ No newline at end of file diff --git a/example/behaviour/repulsion/fireflies.html b/example/behaviour/repulsion/fireflies.html index 2d0d58c..5d9bff0 100644 --- a/example/behaviour/repulsion/fireflies.html +++ b/example/behaviour/repulsion/fireflies.html @@ -1,145 +1,161 @@ - - proton.js-behaviour-firefilies - - - - - -
- -
- - - - + + + proton.js-behaviour-firefilies + + + + + + +
+ +
+ + + + + \ No newline at end of file diff --git a/example/behaviour/repulsion/repulsion.html b/example/behaviour/repulsion/repulsion.html index 7377eb8..0050297 100644 --- a/example/behaviour/repulsion/repulsion.html +++ b/example/behaviour/repulsion/repulsion.html @@ -1,124 +1,134 @@ - - proton.js-behaviour-repulsion - - - - - - - - - + + + - stats.begin(); - proton.update(); - stats.end(); - } - - \ No newline at end of file diff --git a/example/behaviour/rotate/rotate.html b/example/behaviour/rotate/rotate.html index a40c937..79f9c48 100644 --- a/example/behaviour/rotate/rotate.html +++ b/example/behaviour/rotate/rotate.html @@ -1,99 +1,109 @@ - - behaviour-rotate - - - - - - -
- arrow -
- - - + + + - function tick() { - requestAnimationFrame(tick); - proton.update(); - } - - \ No newline at end of file diff --git a/example/emitter/followEmitter/followEmitter.html b/example/emitter/followEmitter/followEmitter.html index ca94c72..12201c0 100644 --- a/example/emitter/followEmitter/followEmitter.html +++ b/example/emitter/followEmitter/followEmitter.html @@ -19,7 +19,7 @@ - + diff --git a/example/emitter/followEmitter/mouseDown.html b/example/emitter/followEmitter/mouseDown.html index aad94bf..b3e0da1 100644 --- a/example/emitter/followEmitter/mouseDown.html +++ b/example/emitter/followEmitter/mouseDown.html @@ -1,93 +1,103 @@ - - proton.js-emitter-FlowEmitter - - - - - - - - - + + + - stats.begin(); - proton.update(); - stats.end(); - } - - \ No newline at end of file diff --git a/example/game/colliejs/collie.html b/example/game/colliejs/collie.html index e0c68e7..5e5827a 100644 --- a/example/game/colliejs/collie.html +++ b/example/game/colliejs/collie.html @@ -1,200 +1,209 @@ - - proton.js-behaviour-custom - - - - - -
- -
- - - - + + + proton.js-behaviour-custom + + + + + + +
+ +
+ + + + + \ No newline at end of file diff --git a/example/game/colliejs/image/yame_walk2.png b/example/game/colliejs/image/yame_walk2.png index 1e71c9427dd028408e171ea8059fbd232d68bc04..20fa18754bc2c8adcb854838efed813997cf8a2e 100644 GIT binary patch literal 16392 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�Z-@kI0gQL3E;!QSA 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 - + Crafty-Proton diff --git a/example/game/crafty/images/fighter.png b/example/game/crafty/images/fighter.png index 235fdaeb33aedfc07ff4fce6a6edbbf17d087484..b242a793d928662f9145480c69e2fbfab0001048 100644 GIT binary patch literal 5688 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 sFX#M;r+MS(Vf?VlyGsmx`yc=B0Kjxq^ Crafty.viewport.width || this._x < 0 || this._y > Crafty.viewport.height || this._y < 0) { - this.destroy(); - } - }); - } - }).bind("KeyUp", function(e) { - //on key up, set the move booleans to false - if (e.keyCode === Crafty.keys.RIGHT_ARROW) { - this.move.right = false; - } else if (e.keyCode === Crafty.keys.LEFT_ARROW) { - this.move.left = false; - } else if (e.keyCode === Crafty.keys.UP_ARROW) { - this.move.up = false; - } - }).bind("EnterFrame", function() { - if (this.move.right) - this.rotation += 5; - if (this.move.left) - this.rotation -= 5; + //destroy if it goes out of bounds + if (this._x > Crafty.viewport.width || this._x < 0 || this._y > Crafty.viewport.height || this._y < 0) { + this.destroy(); + } + }); + } + }).bind("KeyUp", function(e) { + //on key up, set the move booleans to false + if (e.keyCode === Crafty.keys.RIGHT_ARROW) { + this.move.right = false; + } else if (e.keyCode === Crafty.keys.LEFT_ARROW) { + this.move.left = false; + } else if (e.keyCode === Crafty.keys.UP_ARROW) { + this.move.up = false; + } + }).bind("EnterFrame", function() { + if (this.move.right) + this.rotation += 5; + if (this.move.left) + this.rotation -= 5; - //acceleration and movement vector - var vx = Math.sin(this._rotation * Math.PI / 180) * 0.3, vy = Math.cos(this._rotation * Math.PI / 180) * 0.3; + //acceleration and movement vector + var vx = Math.sin(this._rotation * Math.PI / 180) * 0.3, + vy = Math.cos(this._rotation * Math.PI / 180) * 0.3; - //if the move up is true, increment the y/xspeeds - if (this.move.up) { - this.yspeed -= vy; - this.xspeed += vx; - } else { - //if released, slow down the ship - this.xspeed *= this.decay; - this.yspeed *= this.decay; - } + //if the move up is true, increment the y/xspeeds + if (this.move.up) { + this.yspeed -= vy; + this.xspeed += vx; + } else { + //if released, slow down the ship + this.xspeed *= this.decay; + this.yspeed *= this.decay; + } - //move the ship by the x and y speeds or movement vector - this.x += this.xspeed; - this.y += this.yspeed; + //move the ship by the x and y speeds or movement vector + this.x += this.xspeed; + this.y += this.yspeed; - //if ship goes out of bounds, put him back - if (this._x > Crafty.viewport.width) { - this.x = -64; - } - if (this._x < -64) { - this.x = Crafty.viewport.width; - } - if (this._y > Crafty.viewport.height) { - this.y = -64; - } - if (this._y < -64) { - this.y = Crafty.viewport.height; - } + //if ship goes out of bounds, put him back + if (this._x > Crafty.viewport.width) { + this.x = -64; + } + if (this._x < -64) { + this.x = Crafty.viewport.width; + } + if (this._y > Crafty.viewport.height) { + this.y = -64; + } + if (this._y < -64) { + this.y = Crafty.viewport.height; + } - //if all asteroids are gone, start again with more - if (asteroidCount <= 0) { - initRocks(lastCount, lastCount * 2); - } - }).collision().onHit("asteroid", function() { - //if player gets hit, restart the game - }); + //if all asteroids are gone, start again with more + if (asteroidCount <= 0) { + initRocks(lastCount, lastCount * 2); + } + }).collision().onHit("asteroid", function() { + //if player gets hit, restart the game + }); - //keep a count of asteroids - var asteroidCount, lastCount; + //keep a count of asteroids + var asteroidCount, lastCount; - //Asteroid component - Crafty.c("asteroid", { - init : function() { - this.origin("center"); - this.attr({ - x : Crafty.math.randomInt(0, Crafty.viewport.width), //give it random positions, rotation and speed - y : Crafty.math.randomInt(0, Crafty.viewport.height), - xspeed : Crafty.math.randomInt(1, 5), - yspeed : Crafty.math.randomInt(1, 5), - rspeed : Crafty.math.randomInt(-5, 5) - }).bind("EnterFrame", function() { - this.x += this.xspeed; - this.y += this.yspeed; - this.rotation += this.rspeed; + //Asteroid component + Crafty.c("asteroid", { + init: function() { + this.origin("center"); + this.attr({ + x: Crafty.math.randomInt(0, Crafty.viewport.width), //give it random positions, rotation and speed + y: Crafty.math.randomInt(0, Crafty.viewport.height), + xspeed: Crafty.math.randomInt(1, 5), + yspeed: Crafty.math.randomInt(1, 5), + rspeed: Crafty.math.randomInt(-5, 5) + }).bind("EnterFrame", function() { + this.x += this.xspeed; + this.y += this.yspeed; + this.rotation += this.rspeed; - if (this._x > Crafty.viewport.width) { - this.x = -64; - } - if (this._x < -64) { - this.x = Crafty.viewport.width; - } - if (this._y > Crafty.viewport.height) { - this.y = -64; - } - if (this._y < -64) { - this.y = Crafty.viewport.height; - } - }).collision().onHit("bullet", function(e) { - e[0].obj.destroy(); - //destroy the bullet - bombEmitter.p.x = e[0].obj.x; - bombEmitter.p.y = e[0].obj.y; - bombEmitter.emit('once'); - var oldxspeed = this.xspeed; - this.xspeed = -this.yspeed; - this.yspeed = oldxspeed; - asteroidCount++; - }); + if (this._x > Crafty.viewport.width) { + this.x = -64; + } + if (this._x < -64) { + this.x = Crafty.viewport.width; + } + if (this._y > Crafty.viewport.height) { + this.y = -64; + } + if (this._y < -64) { + this.y = Crafty.viewport.height; + } + }).collision().onHit("bullet", function(e) { + e[0].obj.destroy(); + //destroy the bullet + bombEmitter.p.x = e[0].obj.x; + bombEmitter.p.y = e[0].obj.y; + bombEmitter.emit('once'); + var oldxspeed = this.xspeed; + this.xspeed = -this.yspeed; + this.yspeed = oldxspeed; + asteroidCount++; + }); - } - }); + } + }); - function createFighterEmitter() { - if (!proton) - proton = new Proton; - fighterEmitter = new Proton.Emitter(); - fighterEmitter.rate = new Proton.Rate(new Proton.Span(6, 8), new Proton.Span(.05, .1)); - fighterEmitter.addInitialize(new Proton.Mass(1)); - fighterEmitter.addInitialize(new Proton.ImageTarget('fire')); - fighterEmitter.addInitialize(new Proton.Life(.8)); - fighterEmitter.addInitialize(new Proton.Velocity(new Proton.Span(1, 2), new Proton.Span(180, 10, true), 'polar')); - fighterEmitter.addBehaviour(new Proton.Alpha(1, 0)); - fighterEmitter.addBehaviour(new Proton.Scale(1, 0)); - proton.addEmitter(fighterEmitter); - fighterEmitter.emit(); - } + function createFighterEmitter() { + if (!proton) + proton = new Proton; - function createBombEmitter() { - if (!proton) - proton = new Proton; - bombEmitter = new Proton.Emitter(); - bombEmitter.rate = new Proton.Rate(new Proton.Span(14, 16), new Proton.Span(.05, .1)); - bombEmitter.addInitialize(new Proton.Mass(1)); - bombEmitter.addInitialize(new Proton.ImageTarget('bomb')); - bombEmitter.addInitialize(new Proton.Life(.8)); - bombEmitter.addInitialize(new Proton.Velocity(new Proton.Span(1, 2), new Proton.Span(0, 360), 'polar')); - bombEmitter.addBehaviour(new Proton.Alpha(1, 0)); - bombEmitter.addBehaviour(new Proton.Scale(Proton.getSpan(1, 2), 0)); - proton.addEmitter(bombEmitter); - } + fighterEmitter = new Proton.Emitter(); + fighterEmitter.rate = new Proton.Rate(new Proton.Span(6, 8), new Proton.Span(.05, .1)); + fighterEmitter.addInitialize(new Proton.Mass(1)); + fighterEmitter.addInitialize(new Proton.Body('fire')); + fighterEmitter.addInitialize(new Proton.Life(.8)); + fighterEmitter.addInitialize(new Proton.Velocity(new Proton.Span(1, 2), new Proton.Span(180, 10, true), 'polar')); + fighterEmitter.addBehaviour(new Proton.Alpha(1, 0)); + fighterEmitter.addBehaviour(new Proton.Scale(1, 0)); - function createRenderer() { - renderer = new Proton.Renderer('other', proton); + proton.addEmitter(fighterEmitter); + fighterEmitter.emit(); + } - renderer.onParticleCreated = function(particle) { - var p = Crafty.e("2D, Canvas," + particle.target.src); - particle.sprite = p; - }; + function createBombEmitter() { + if (!proton) + proton = new Proton; - renderer.onParticleUpdate = function(particle) { - particle.sprite.attr({ - x : particle.p.x, - y : particle.p.y, - alpha : particle.alpha, - w : particle.scale * 10, - h : particle.scale * 10 - }); - }; + bombEmitter = new Proton.Emitter(); + bombEmitter.rate = new Proton.Rate(new Proton.Span(14, 16), new Proton.Span(.05, .1)); + bombEmitter.addInitialize(new Proton.Mass(1)); + bombEmitter.addInitialize(new Proton.Body('bomb')); + bombEmitter.addInitialize(new Proton.Life(.8)); + bombEmitter.addInitialize(new Proton.Velocity(new Proton.Span(1, 2), new Proton.Span(0, 360), 'polar')); + bombEmitter.addBehaviour(new Proton.Alpha(1, 0)); + bombEmitter.addBehaviour(new Proton.Scale(Proton.getSpan(1, 2), 0)); + + proton.addEmitter(bombEmitter); + } - renderer.onParticleDead = function(particle) { - particle.sprite.destroy(); - }; - renderer.start(); - } + function createRenderer() { + renderer = new Proton.CustomRenderer(); - //function to fill the screen with asteroids by a random amount - function initRocks(lower, upper) { - var rocks = Crafty.math.randomInt(lower, upper); - asteroidCount = rocks; - lastCount = rocks; + renderer.onParticleCreated = function(particle) { + var p = Crafty.e("2D, Canvas," + particle.body.src); + particle.sprite = p; + }; - for (var i = 0; i < rocks; i++) { - Crafty.e("2D, DOM, meteorolite, Collision, asteroid"); - } - } + renderer.onParticleUpdate = function(particle) { + particle.sprite.attr({ + x: particle.p.x, + y: particle.p.y, + alpha: particle.alpha, + w: particle.scale * 10, + h: particle.scale * 10 + }); + }; - //first level has between 1 and 10 asteroids - var R = 80; - initRocks(1, 4); - createFighterEmitter(); - createBombEmitter(); - createRenderer(); - setInterval(function() { - proton.update(); - var angle = player.rotation * Math.PI / 180; - fighterEmitter.p.x = player._x + player.w / 2 + R * Math.sin(-angle) - 5; - fighterEmitter.p.y = player._y + player.h / 2 + R * Math.cos(-angle); - fighterEmitter.rotation = -player.rotation; - }, 1000 / 50); - }); -}); + renderer.onParticleDead = function(particle) { + particle.sprite.destroy(); + }; + + proton.addRenderer(renderer); + } + + //function to fill the screen with asteroids by a random amount + function initRocks(lower, upper) { + var rocks = Crafty.math.randomInt(lower, upper); + asteroidCount = rocks; + lastCount = rocks; + + for (var i = 0; i < rocks; i++) { + Crafty.e("2D, DOM, meteorolite, Collision, asteroid"); + } + } + + //first level has between 1 and 10 asteroids + var R = 80; + initRocks(1, 4); + createFighterEmitter(); + createBombEmitter(); + createRenderer(); + setInterval(function() { + proton.update(); + var angle = player.rotation * Math.PI / 180; + fighterEmitter.p.x = player._x + player.w / 2 + R * Math.sin(-angle) - 5; + fighterEmitter.p.y = player._y + player.h / 2 + R * Math.cos(-angle); + fighterEmitter.rotation = -player.rotation; + }, 1000 / 50); + }); +}); \ No newline at end of file diff --git a/example/game/easeljs/easeljs.html b/example/game/easeljs/easeljs.html index b299d34..789d008 100644 --- a/example/game/easeljs/easeljs.html +++ b/example/game/easeljs/easeljs.html @@ -1,243 +1,224 @@ - - proton.js-render-EaseljsRender - - - - - - - - -
- -
- - + + + proton.js-render-EaseljsRender + + + + + + + + + +
+ +
+ + + + \ No newline at end of file diff --git a/example/game/easeljs/image/ground.png b/example/game/easeljs/image/ground.png old mode 100644 new mode 100755 index ad2f75942e5fff942f0066ba087ff20af37f3d9e..662fd6de1f459b20f02ea194fd8f19c4372635b8 GIT binary patch literal 2237 zcmaJ@dpJ~iAD_)D5}AsX@^WTatBjdBgJCAq&|H`p*I|gfjhQ1ub7^KU$R#4ix?9p^ z+j6JNmM(7Hh%QRYrWM{-O{tY`)QU~)(WZU>c)jO&&iVa*-{!qy$e=BkxyoMKJ1tU=5Cka=?@?;RgMIZ@-0G5ci1M-Dy1SxocQnXVnCo3uFPr77yKX1mNflm-c z6b1cPP=Rc3fF_YafISv(!^aarfM|yW?eHW!5(XgPK|Bs5;P4JMAf9aRK*oc>=LZdY zlL^AfzI5hiU+{^7j!-D1WE?IwHWnLeir5t)QUcNdHPfB>f^QmVYi2TrixHC&htS{Cr9aKsNjTLq(!5 zXt}}{`a9nLDJIA_ZuE z_E->L^Y}vXyyX*v%_g(Nas^M!hgft98rHxHg#t2>z+{3<2NxpU#SsJYaZ$a` zT*2b8kQU|Q;9zj`t^Kc7FPPx@ncsdHT=?*1^dT`k?=pC>P2H;2!IxsYw+DyeS0@NK zD|9d08hj>_e59x9O`;y2U+p5PKeWqISLkzk@ zZBv!S>TBv&k~%lVYV}=Y(x%))%XMa_+MZMs1%f*nO?8j%$q$4jZP>XhrdQb(=w5I# zGaU7R^VNv~FPlcSVqJ(JKFQ#2dV`kw<6suyqi0v=x-&f$QwNf$CSui%e_JPxuLyb; zZq{0=ncDGjyz$%rtTRk*p|VyQLF&97rLTr|FhgyYo;*84?+CreFe!~z>v#TGtSKqU zyG}HJ{)*}SI4VeM_P2|eJ29hX1IBSkQp3A&&2yT0nN;y_1;dYhqKtdUriYEoXUF-r zKc)ixDk^^_-BMYuB~Afjw2(BgU*&>dQk!hr`cI!IeO;zz+@2NJ(p4{xHs-pHjpp1a z0=RF9JDqnQtqH0CEjpur6`h`RS1&8~B_6h_EWBp_JJ)F`=6PbzxO5l7GVAy4!3>`Y z6W@aMzg#SOiaD^NS0A}db-=mp%{QvXvL_o1OWr#ZFtvt6%#`nYy5;iBjPQJ`4vV{O zUVDb69>qo1vi)YV^wtbn4Y}fU7d$?WS2&ylmedzXJF zc0fK zysaYcy~PMgqmqgr+7#&?6je6gH_@9;6FVpMX*1YqU1_Ku<@a2Tt1T8M=!1Lu2eouL zr+yx*N1=l}-6-1f4g0Lp4$Zh0UmD}&fwU{Z2{N7Zj@~l*o05aRVpQV9OXkq%y~)I9 z+DKJw#O1NNm~AryWxuRHo1I!y7kQ%Qdc}%6hGl(cFuDC@gtB&3v*+3+r?xSA;(CHt z{-ntu8rjuHX1o}}OoV@@%I4?j$erJO{n)r5t?u~K<0FL8dq?|O{*4dZ1CgcAfFHE? z;iG;ST#YpitzpercijHCcFY*;6EQ+!aUw!uHHLqin0)^9)T6BBsH&h&X#-{ZzQN1} zly&g;|LU0_?DlcnbXCUIE#)E(@TFh9Zh(4P0A?V^+HQeT6HzNOIvvqq~Ustki7 zPkq(pQ$5FW-42_~0?kGd%)>9{Fk1<>T}gd6xN5ac%k|gisrMTTbCuKi`^Ss!bTKcj z@2#B{%cCg@#h&fS0`NOnPca`tYU=HVyZ-%J-fVOBMn0K=d literal 14966 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 Q4l;?s)78&qol`;+0AL#cb z{dexS|4#*SjxTHDoULG(ppua?1t@MGo12oDkdWaZ{^$IG1qV(Xn81*#pOBJJ;V>n0 dF((5P!?D*grE+nGuYtxgc)I$ztaD0e0stMIFf9N8 literal 0 HcmV?d00001 diff --git a/example/game/easeljs/image/p3.png b/example/game/easeljs/image/p3.png new file mode 100644 index 0000000000000000000000000000000000000000..acb196ada06631ec9207bdb7e6c5994659f7190e GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0y_AWs*^5RHj%FYOg{a1dd6@Lsa@ zMN5#%m4*DBK`)+IS$4jNQJA#h;<EJ63U0>554DlRok#(gTj}`@Q m_LI=x$GLKg%hq@H3>J*MGx-?Te%lYSgu&C*&t;ucLK6VNR4~N= literal 0 HcmV?d00001 diff --git a/example/game/easeljs/image/p4.png b/example/game/easeljs/image/p4.png new file mode 100644 index 0000000000000000000000000000000000000000..4f7f16d1fc7c4d96d3164ab0a914e44864337c71 GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0y_2u~Ns5RHk+DF>K>c>muvHZqh+ z0D>R?`wu35t31~HB5THmOck~smfoJsWB>nOzUn5{_MeCMMbm#t2@wfNNg)X!`1e0O p;=qXm9~feJmCY`@2{W)TFl;IiH#$B)Y#Y!H22WQ%mvv4FO#pW6Fu4E# literal 0 HcmV?d00001 diff --git a/example/game/easeljs/image/p5.png b/example/game/easeljs/image/p5.png new file mode 100644 index 0000000000000000000000000000000000000000..ddb7480688ccf79623b5f6745141415da34c1c82 GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xaCr=m05RHk+2?v<|{ZHTU|Ns1l z_9C~FgAcd(PLMDVGBNu1|NMvf>&!M87#Nr&2!g&78WArunC2md;&Rx59aT{GW zFyFO{9sJ3@i+w+M`IOaucGvD77DfiT*8_T{`_~iibz><0n>E(&r;eC3E!}0>CDL;~ zR{dOZrY9ZAxpX}C&XtFv-Ot?Jq8j!a3GOYHigUR2TlwID@GESh;VI$1yKr|!-Bft4 z)KD(`GA@yMdw&;)bRK+RPfXq}@f4jm=2;zC6-Y|=`ZOwSQIla~H%nOl)Y)#^Z`-oI zq`ki0y|rH?Sjehh%M8q zwQ2fl7gA{DiD&5gCT;|^J;1hd;Oib$4){xr@223SMK-d$xEH^0HMZ*g&NVa;31~aJeW1Va(u#x^|6&E6kN5zaQWuaa0ABx&>d@ze z`|xwmFO5MA|&8qw0yTPgV zm1o1jJut;`c;?1Zw9j+wmjul(HI`n_vBLRS@X8-UJUS|%%HhSIvbU$=5JYKs!Qqrq z>9d(^H@hH8N6_Zr_4a@e2ArqXXatd4cM{Ht02lf|ANlalJ%xUDG5w+>Of6d0+x*ck zIJgP=dh`k2>apVr(?=wOXWHlijD@v+KIR&oExq@Ajs4=+2^Bxm>BQ!lxHj~!7$LIX zrBzz){PK_F^5Y?fHRyx>;5tAlM9rZXZI--u?!7Gli(m(A?R@UMa1FW~UZ94W)VZFcVif0gbJiaVj1BT{19q5?lx$PxXBh2e=Jq*V_wG zF$(D7ka}?N4;DReA0N0Dr1_M(+iJ3I;JQD+XZKms0m9UKbktxML;?6hiUluZ6u=Y! zmw>f@$WuI2uL$wpcoF@nrLXB9i2zb*NkMhV7jN@Y=kGhU%*K`Au}r1658vi?vTN~> zXf0ZwHO%dcMTXMV^7wN0c>|vBsKD01oxAtwd|(OZ<{8*w5;%yRFPt5a4gLc3>+Ssy zK?CyK_CaE1y~ob?g+(afP|DyS5eV(~hk_S?70nM4=0I?tr#`T3C-QYUkPG;jWihou zA6!pmgpO+-P{|D^qzA~o=&5+#Gi}Z!=&Wuq)4rO5OI^oZ#{mVur5I0Hr`iqzIYa<~ zf>T+PHI_22v1~0RFRJVy5HO$_2Ytd4DWK-q-$193AUVMYkZH(5gmdub6?E!s$9P*1<-z?WRevb{-JQk_jbHSH5-WVUw4~( z%87`8^dd-9Jpmc}SKxmCCG9%R2zHjB|0SK}e}x5*fdeVKD8xlbWcHm*janCg>=JSc zAbxKzctg6w>Y_P(YcqYzBG}MK?&KCmd$}j0pKq(8gCe)t=QP_+z%NwD>Cd@7|*HyM+v;L;H*8T<2ZIA z-M>K%cth?#7yV;oIZ*--p%J*pj^Oo#vVUT8YN?mhje|ed(t_gtuLUYs za&SX7;f)zDW|XQW(|_7WA{Pom*;U1|yh5FgTtf2GJkamIB%ERXhsXY-6_$IBN;AQw zgoYt$m=K3UE-TdByZzsA>Eja=4Kpy@F>w6#+_>3cU-}=cQ@rWk1Y zD}2Nb<@1K6h=bqGN$e0+S0PAZMI&%2i00rDRyb!^KP|WcIqNYUf36)#w@%$P{6~Z3 zJ4O$_%Tg4O1kj>WrJ%IiVJJj=Yw54CguDWzcC8QKGQkf!9;N0&mrwVMN-G~(A58|P zv17l`r9~RAIYmYu9+RP^b~UzAp1z-GnU13jl$JRqwq@wS~L)RTrEg(K-mA8n{S5@j!HdXd3p#W zFJM&n;R@&V_OiTl8H+wVo5|aBnE$2KMW5qi4jvyi4pif7k3u)hVIkwVUkE$}f;|)55Uu}L z-fkb;G3e!W7Kr(BQxL;SpNo-@-~8{)a9r(Gsb{6BcivJJx?T|&&!VP37ZfROSEsW8 z%RlC}!;T(A<=U$deKu~ALoy@TfFu@eR0GN5?~9T^Zcl!{W!?C*e@A_QCspAc z5Kt%y9kBNd6EdK^JMh(k4w7rMcT@jkNAP_qC}~9FL45(iI|!0N^nrkq9Q7{{7rSG7 z(r@YO;CgBQv)&M^bIgEA3&70|$6tPGy%NNLql5_8POwhfl=vsNfj7OMqNP~c++q6c z@I#khY#=I`aouHMjjq|ZEER%U&WE4vmJt8HxfJACz~khNlPqv!P>yAZiB%aKuw`Qw zDujf#Or)XCjX9-%)n_rF%JFmNp(}JgtJsJ>!E(p1kf?-Ln1=sWAqO_zH21#qM4=Wl z*&qZ3v2xp&_3dB%jVE+i)J!pAS){dTvplSorkk1=s6u1uus<>1%Wv>7!b5g2*EAU6}2;AZ(-!^7sc8@5~ z-fJ*L8@3l`H!Wtw3?KfXFCF6|G(ZocI?%e)wO8tSz-+DddUaAX3TkK z=h{J(3SrGe!+=peCAvS%Arw90`I~K4iSH0PgCIzMW=%Sq(^UKltLa!keE?yTpeJS&)k{G(RN1y~k{iAo9 zjaWf8T#T_aJJ++5GT5zI9n2 zYx5U%wtt58Xt=pM4~0hQf^UJ64T_XIm3L`r*^fqH7J~)~ENo|{46p_y;8eSN;~A>t z4$DfB8{e$si8_}MzeVDjnwoN-fV?!(4y=$>L(iwJX!_lmx##)|#$t+IugE&jSD||2 zMRn1Ia{L8`R5!y|{Y3*7ideW;Bp zhJ0!Cod9V#uv|`cQUkK{y6L7~Qn5MVOlr~q4TeJbBLGnH;=j48Y`RTWHqNA1K6N#X z@%8~()y-Yi8R>ZpC_*QJnJ!v!x`oT%O+D2Xt&k7qf4 zG5V?AD>2ZQTAZ$_7SLPVkv}A@8hy)tFl1Om8!H#b;6RMn*8-Y9PmZ=q=~Wm)!TD8U zX|Nc4oT>-fX-D3a(cA%68Ts+^WPM?jyE;AYT-g>Tiqkq7j)-zVikDcw0l8$c*71@h z{$=0#xb|`2!7&XZQC9dH9%4ZY9b{snM%vW?dX@V3IS%mES2w-$dY&wFOyNjr>Yvem zi(^{aF9b-pRj$-p4hDMhpC7q%8}oU-CTdxAsat0OTdog+`UC8`?G?4x8XF+0@V`Q* z*#r-_4!xkoi{Gk5=$wh^$aKsuC+G4F5+u@zf&qYnMcqLY***PE(!iq>>$xgBPsdB% z!n7(60^$>6cCD3$2E9CJwHCb%rH^X-rNieQZYE0N`jnIu(9#1 zn|PWjttR(Mv+%h=bWxP_Ey8mQ7I}sz~*jUM&?;k6?G0`vPf!e#fZG z+ViTc?JU#|y!R+-ro)pUH~ldxx5$KaMv#<5za@FhnY-4~9|r)e zL?xT~a256Kh68ckHp^DlrVQy~6CHF$WuN z>KVO5DNvGs;td?Vqh(0$t1iXlluXuV$Qth5sjBK9y^^eBB5LvR3*-IZn&e>(7vQ<~ zWq;R1aDlW>2Jv?@^RL30v3DY+1xh@J@fBx-qV8m=sG`dd#^W`wO#Ym!JzTXS|0Jy%|`cYB2g3xy2(IdQvEOKbKk=*1&4 z2G_*)z!V=we3~9lu$lPWm!bebnPM%^06Y~RH__D>Sw&P+Q)#Z;p6UN;;>F)iz0=z# zvV9Zb|5zJ}Uwcnn?uS=$&il;NU8yD81hfhi(c@IKt28o|+;Ero;Q-y}$7NLrttv+? zz9Q|etrQR7w<#$e61S{v;kKrH3e=t&a*0O0W)wS(Mzi|Zq&<&nISE7^s#a7KBtyS! zM!h%b+^huYam{Bbpe;Wo(ZqpvA>R|q>RdUc8e@0cvuS_oN3x4StrYGH;`?P8X9xC* zho!a)4NO-`L77|ntl_X9wRFB-XHLW45a`6;{DcrOt$Lw>e$wUcg{gM3E&Nt7;adD2 zN}ZEemO2J1cznKd{ngn|1zMwCxJo(dmqtJTQ5pLo4Q&as7V0||Y5GAq)3-F~7+O8k z6nT|P3wUX}vCDn8>;fe#u|*dU{mK~d_+3)yqtXB!@NE_6V`iM76mzecfkhHHuGFkqoxP93_)Q(kf$ygn<{^}0wgqIUV_AnjRilj`_vujR+i zpi_6`v@WJ{-O6oo89?Mh?)zsa;a!iwuO+?t@0aj*XL&q&U-8?U{386RY@%?sGnyJ3 z8!HN4l(Qo8L4pba>8!K7khfE|hWOwnJ@hJ05qQ~o+gfs0<5>gYP9r;D!)a^5GtJrk zM=er+0v!cG{o<>~OW!E@7SL`y&2T_QW3^=f%fip(XF6!V^Leb3cT>0&Dm#N76pTu| zpOXq*SHV!4A3Y?u6`)fT&gabD=Q9nZ!j#~fqKWxlUGJdhuert*6W%daj|Kr{ZEoj@?`Z3V5Yw8dDSAA(p0b z@g!ujSSYKD9ZT?g<1DHl&Rzk+i1)P%`*0={6-yL~YW=yxXqq3UFA2&2tfBFP%91gE zv66aRTI{@JcouTs&utFNy@V;0w`*4P;M zwnu<3jQ0v+<7LWYj#*4he&(yrgHmG%v4Zg$%OOz7tJ%j?C16crs=VS9w8W1?NrN|G zKYJ-&Kn8va6q>JIt8GkvkL{DK;a9lQKL*7tyFs9E;gWH(Vh*+o%FD7+s&{S03K|@c z{l_%X56<$~mQOQ1IITwt7{jMMXOCb{#*OJs$*<&Dy}wfan_4vl)Qf~7XI8qaeqC)W z-+EP|3B^2NKr#hIoN|4fIXHrHT-b_^hx4rl+wBjXgD-)CQN946+tn^<-vYWiUs02X8@EgcQGjiw< zgsGSoB`U8$Zo@D9G}Gd5_dk$I)Hi1k=9tWZZgT3FaOkZ{7LEDm^g}sqk{G9dUuJsAKP}C{? za2w|ya+4m^t!h^8>=a<-;v%CDJc!;0;e9E#p2pCG?iJVQv-(RaEAe2#*Kew#pBEKbZS&x)c_w9zDo@xbD^h}|0@-rUQl9>VyhlxZ2pNG#m zwA@88qVhg`yTGx8fsC}?FVDGLppHj#oyM0+B2t$5vwNN(VB1s00Zpo|YLw=lG}qNb zoa`m2jze;9|K@m!>@lV(JFjTP#gq%1bXtD0y>7qd4(TZ;L(bWx=_|p%5L;^9dJ>)l z4HN#_HH;;D7ci^089IpvZjKZXrk4H^Cq~{!x^yL#2WxH23k_~{&?otcezH~mF1P`~ zPnq z%iV#tnIG!neXzmHKP=a5UyJEm(wB>K*RGA$f93_T{K+!1q(7C zkTVMi%xVy=R;3-}FFP~mi3N-d|0?&ElN^X%_y~8mb>$R32!?~K=*<-MaqCb3>f*;( zFX{z{DUR2fr)7uV5O@$--W2~yRC8xSyF+W)B-C|NyW$q6a%?A5H4^8qrGr-b8NC2^DY63^GrbXLSz;lPw$| zu&u;%$S2Fu=MQ~(H=Jn@Np298mDOvQPNwFN8T4DAd*GBlGyBV@o#SiQ&{<~_Ta#ZM z9+i!xK95<~a9w18%thg%OimxR8%IxrHA2dqRxmlaHLb)sfH)*Oi`cznp!%|1|_ zxPnl@z?;Sb7JoyLw(oV8$ly}9WVb~vyfY|i;gj)A0NN2uC5Zn;N+e!=CJ`- zV=R`CXd`Ek-2YN1k%i%04JH;p;NN%TiqOb;|V%wx+*`(fJ*vnY5F`1%$1n zbSBwUMIN+Ofp2HNPHjIQ0ecHz$@h9tF`ju+?|u%W4nE;IXY;Ky*jW9wlDk1;1bgY} zQ=IzY2yIoMB>mt-PHP(9e%#x5cQ!5a{wCx6o|%z5ofjRGsw&O6F)fj=KW1)u*$hfp z(LfdK!|#|yGold-2(r$XBiK!J^)`M-#MHWeuzN84^61d+vxkc!L00hzi;_a*PQY(^ z#%pv&n?Mb-&tGe~PZt~OlYymTjS-g~uhz?;6>Kd2z==2jC=7+j^TUa+T~uBA{d&rP z0U}GaO%>EYz&T^ybbdba#j5M$)<#lX9-T`U<)F7(4a7`6_1HDseld(GxkZD=XrDg@ zu)OTeOa0m_KMl{hH4y~h?gmGWx%EpP%R4C#Wl-U$ID8)nx3*=kXSyGq(|a_>wl!@! z8;6<=3-+JRv2fphjqw2j+yDNkvq=Qb1euum7ooAKZ>TH*`!@a-EYULmYBy8y)}U-9 zH4#Et`|oCB$?h<0?E{Q(5t*xMH3D{+sGN%T;6#iN4Lkem8NgpH?$cBextSez4rI?s|?*0W)+L2INgoE<7a1f(UCLW^bEJw7E(!1p# z8M3Lb3?kKCQp?hY3$vO9A~;NJWo!O?OVu-D!+CcFZ5G=K9XqqUeiEkmnU<|Al&lxg zTC3_MCl^QPm$HecUN13y0<8JNqdk$t_3&h|C$(fEw)=e~`?v>C?89g5*0eHTV6HP{ zRO*i;&7bJ+Glz(g+6{2HgB%=+d$-Gk$3CE45DTj-2SDU^XpZ2_DNxe372m48CIS-e zC1GM@7)i0%GXDWNxpVl{GoZccUyN|H=5TO$*k%zU+V%d8QHPn^E+AlLf?s-TO|3tP z)V$j-K(tKPKMabJ)oD6VREp+Vr`Zn`+z-ifL65&TuGXPHYM5FKfDJT6cbdg%Oc>#QLO>HYtQ(#A+QhhA6m$?vDv!;kmIsC5)s&9-0G{}0j>wQ`g zoxgyN`6bJXK&?n+)R0{}wy)LcA}zYC<4ZQZPyHqSi4cTdi6m12zczdKr9LE=bOvdC z%s-?aI7Bd2E=%lrWX@kywbWcZ^F-B|dryQ>>M=K(o8t9vB5?*?WlE-W0BFyTQgK9+ z({Gar=^75Sq0j4LZd?L25x2!kw96}1^9)^^P38V^^yAl5t7vZ1w-XBpF2{{m3FI`) zXOy?wY(-@dC959r=p$9zg99M|z3*bhA9oWh!iQRNROXs$Wc9q-U@FPit>)`e1BSm4 zwDVqa+0>$qM;MyD$d|4IE$9blKyL{SAL&c|DEh*0&bID1=xWxDN)W%AT4xDjIv;KO zixaCh=4X4XF?1^VkZHOCkL^g}hgFZKHo*)K7jT4)Km9-IbZu?fJAvM=nojuONZ8h5 zm>+G+YHOo;V($0sRv&qLU1w{9T)n<--@SONVMup1unr#jyMMMjXkpZlb|PU_vL9PWbA=JqlKM01*YHCNw6iWW+_-0pcM;~UmZ~ZfU?6EV{ zJ_Tr^MYd+fyY~RVW5c@!{-8&}wHIrmip{gQuGB>I-4HNM?KyKQ?rse^Sz8fA1MF`I z7Mp`4)?Z^nAJdCCtIDn)qb>EoL>3BrucACj=vd}sQiltzK-nVrX1+-oQ^f;jnlEMp za_X65tSLW3N|yq{W3?3mcuGO6+2&%{swu`LE4BBT!I!6^CNSIxXlxD*ma89Di#$YL z`B-yo9co+p6Q$j7dnl{E=;lVMOlHs1HuC*r(+0l;h-8Ip4qc!--Jo$!Qlm_LGIg{x zG4Ac`E#BIht6fZJ&0uuZrFV%U5Y{%|FXzq9_iOBufEue8xsCBgYYOGy5@kSSB;(Fqad$S-k(0tYQpr=0|cH!r`&P_35=0*&#F8kR9wyHw^ zuCmQ4uTH2ZdwUuJJyee&*U_?su?G=zGz`tDD(u5SsqRV=7z)GRh1pITR^W4}KOHtp zMZAl9KJGshg%h$1bQ%=v8?_fFHh>CjmUs3^W^mUf0LB~_|J3{L9gbTJT}XmLijdN!Bfk7<28Brt#+LYIe>nKZR7jBxK8>BRxw)2Sf=Vm z;0V~xaV+ul$r|Lznm0Ey&@3q2>k)Yp%~Is6tG{LDgG@6rb3IjpxCVe5%R zfI-(@+d5gGR+=C6aH{O%$}y8WT5HB%G_Dt}e)6EQy&NVm&h*`0C!WwGVZJo1&p0Ui~`q?QgSwlg!bhxY5EJ)!J-h|Y@ zJ)T9}>Iz$^ML^I_C<5m$r=2^WA3CP6#C>blip#zMq{l`3J}T86(Us(Lu2eRIs^@)2 zNwlPa>&No~g2em1cs0_9&uBn|>CVmtRnIYm#I7IOKLe0~!k7ti&c2$IIDENV{<(@<{!`WkMv& z+4T;nczZzoSa7{dBpB-|m(uI&!|3<)W_K{WXM8UE;he%;eJ2uH0g%EEC(V=Rr*{Dgmj}H2F~$Je?TV| zD0OBYU->Ij5F=#Ayo~HhI<>L+xq5jd6@<(|$4npyt|9tS2U<29_Hcp)4I3EcT^Bly<)mqkDFc73iCp4F2o>2h06r;&!a$;wIdbL$ytCtdQLGnU^#rs7p*U32Gh@@m+$z>dovy(yD){fa z`0=cz1QFlA&9y8P)Oq_a;O2y0#Z-P{qm|A)f@n+^X^z05yIM0M z&O)mdSHEtAR{Is=L~jLPOVmQEm=?>Q6r-_Z87Vz6 zqUHN3DRGjP_)tqAwXUZUYJKu@{mnZZH62_%VtvZFa;;NgYYy!PbQ5DF8CD*NlZBy@ z&8yb^x3_SK13|^WkkxOA6Xhf?eX(Y~U2>~&cg%=Z%#OaW{OFOSH(*_Kk=NIJoz(W)B<4e2%PIAI&@+t z+OWOPw){p*ixqw=Gj%(;T<{a}(qkycRfcn+@NY87>YR_lMO+wCzTC46t&l zs(qPAavnrO+(5*1^vp{_!+^+(gudRq90Bj5|eQge`i8^TYI|uP&=>xInYN17blR~1&ERGs-YQia)|C0`GS}9U+XxeO(A?$>kAHv*E-AioGY2utjsAbst+X1VuxAVV6<51h~?h-~Qq= zE>J2RP}#=;%u}fbZI)ip$>OpjD>JEOo1qeVo0h)4k?x*{teYX%<{#dVn~!`>75N+# zPD{}S*4F|*7OHlO zPryuDnaCL31l~w@q3;CU6i#%gN;c?HG{rI|>MQ9xh(W4=pLl zJRb|XLimRC!FbHjqK4y3);gg@iLk~aEP2GaUGe)n&%qx*!L;QpnB*AnCeFT05xJ_S z*^!x$sS%rG6Ea2h>?>R9TgToK*+^n)W<^y8J_7~E|W%)ICQJX ze*9-I7QhpbZ#V(eb&T;el9zgL#rH{1=E(fHD{0X^;h@x3psoI1Xz4Cmz_$Elh9Q-+ zwl&$y^GR<%riYeXSLMU%U~Ft#^3t2NEP^vKx6?jf70Yyd=< zk`h0BanN>9NM|l~9d4?!?|}C&IUYprucAqfM+Y4o9Y;ih0i+5a+=lQvhAt7OaV>#( zu=y~F2aGN0&?cE;1G=@T!zPUrQ5#5H9{!#@OMj9;8ac3&MxMR<5jlp}McSM<1<*KV z#OsqUeJe(Xxu;vCSvL|V^A_2j@5zCf1>B?1a z9ckCfElwOynJ$+d!;r{C?S*JlnLW*6%arO1)BzeAs`&p*1(E8SX&E#Y`7zN{^2KZHnbJyh70uoUhdhIMB`WcfQ1&uvQe>F zcb0PGxWP=^(NJX*MpUe zz8B-cUE7`c8xarLt%@bKg1vuC=>d1~;1Vu2R^CUHW8Rk3hoy%tiV}@`JsOUqhnYw9 z!~4oxYfWC_Qvm1@a>Fag#%XQ$AX0mHiz9Gg)x;6T>J~Ok{_bq6JyB>6s!W$h2kmLX zcHYXkWb=;`gr1^W5vbRj?Rrq(x80<&oP=7bw;Jd^p9IRwASZUPUbCY5fZWGEXqHqJ zKf;c9KRChzA%`NtJ9>&ApRKn>xqA14ef(?C9t0~0O^YbGnW()k55{~mk*%hUr+4?1 ztWH-=%qVP5&c43+#k$hKt=eGVpfHdQ*F3zSkNB4un&Lm!kIb(wd=b3OE~H=jh2Tz? zSP8ah-}Ybz4jCSfxB!UM=0Lp73OSG(GKDi0^i(&Bz+vbI2S!Gp-AF|N`+S1p_ALjw zy{Ht=vj;qH@aiuUx-P-v4j@eu z@k4?Bx=Ux#z4{jv+xSOq7B|qoOu-bIgQpcKnl-lDx zzl@@A?tg&FrO{|9$)`2d>m z&C1@CloTwZWNzUS(Kz4XN5nysh(aE#l>UV&DEPHACxR$P-!u+71FsK{>JB(vpINrMh44J{UCj(M25!Gu zxj$CrfNTV~ZM84g^RB<;b~z|F{n8^cbEAA5za5kk!e6yO80(52UE}*8RJX1RNkcCT=<^jZrIy@R%+S8H^PqVeHw$ienKd;&arXpNmy8Vy~rCn>lC`U z2lf#%o8b8_n8C@{8iEp|O-0s8QW;>mPU=sTN%787r&pA|A=^Q2gnwe)x5($C7LJMJr9$ zls1c>uc@w}-S>hJl+}_|1<)RC3`}O1yq#fJ@_(8%_20O{{3vJ{|8d!(-$LR^`PY)L zgATN7_Mm?`D*Z{4uIe{hq?Mf`D6U^Lb$K7V9|mCGS9_t=6P{C0AOW2T)lw}F(%Vmm zI-xXh%&jzy3vtD|YAj`=l{DZUvb`!)J!gL}#_WA~zOA6${44->wG(Amq_}~+H==Mk z!(ErO8Hh`E4+)1!=KkzfBhNB!Nbv(B`I_^1QZ|08+kSmsJWOJvKfRafAGUqETg^p8 zFWi1(LFn^haBp9F(&ySh4NB>y`E=l~-$j@>Bd~?U>j#RlxAAJQ5%slfcwBCzV0aPb z-P2`1;g01d?Qyp~&<3k)(9vRJ|Iw?*+)M~l&ZpyIKeGTZVnfau4;M}3A`Pzj|tiO%Y->r^o_8v3V3*zHlrtpu)sJ)Vi4VKDnk zG3`0EU$-TGRQv_OuFnZy0lyLkF zonmQ&)vW4;_HG@g#BDOsC4Y%_4iw}m66q(vMuM$)GWAaYY*s10mFHIG0l;*cMA1TO zSSmB*+*K1So+R<@Iv2_8A^Dbj`yap{F%|Oem=3UZkRs+|VeAt8lf;{ElWQ-Sl06RK z!3n3?PM$b^BFJKP<;-UohuUi9i|W=@x?_SRZR^CD$m(kZI=e6)n}PzQ?v>DUm0^>ULlu~@*!bBe zW)t+)I!4rBfYSPwqVH;tAAhE_+sxtw;USP&ieyhpo?*qU44?U6j{$jV9eLbDOUR!S z5uevT&w_(VHo1(pgSWGR^FKPcRbgev{L?RVc45$1Wo9hxJPN{^hqe3D>JFFX1Zw&> zb%U{OAIGONZnouP_R#!0W@FcY$>D9VUvNdrrK3Q}W~rX58bqp&E5_cv#So~i1##~> zF*T%B#?8Gafqy>-TcPa5;H%)bY}3;|U@`83e_~MsNUmeCyfalXA+!EANG*b|lQKPV7<3u&W51T$Rfke;(j_F%KBrexU1E_}zRP`@LFSztReU3V} zRH)zON(VMmSfC(mg~Exirxekde=p0$nS3%KZCxDPD4GJ1#`{gxptua^$M}e?9En(| zYGN(i-b?-nfS;7!RNp3d`qqm7;PKFnDDCRmBS)-Olh)Vt*>Ee>Oc~a+I%unfpU*nu8hWdz%Ka{ZJxWh#tDscJZ((IS zZczPYlRqYk8;a@o%Y88bFSU~1re4K8TaLove}cugx2@F^e@q7fXnw8yDjw_yarb9B z2KU|L1#!W9P5Vw4m9~*tnw6(vZJ35mut;CN2};j*L)?HjBV9u6+TA zfqnAp6KMsig6pddy^`CEzlZiH2&G@WYAaaS<_9 zRrQ5^`aL6QJnrh?^8-U0X$6d|tvX(M9NvK@FyI89^77$7#LH(qPA?fl064IjU){bM zXMT<;n3pN#cJ~M{6olp{-woIAjnBclWgKRq+{5j~{zEeNk<-4e^w1ViJg#1V(v(X- zs+yKc(+|g$mR$>Iy5;g{PAF`N&9G-u1z*s40_un^bXYwzVSYe^s&{?7T;n+9*==Xo zi2cZ^%YX{IGv~543}1g3i9$~f-=yEYmk_L;WOwhmL+#KD?h``}w&I^MP-V67BWPc#b8#~!eTc4bEMGy*s7ecbhu z)`#_3Kvd7h6PcYVUM7NI%C9|V1QMs}Bc?@;il{;rLBnqC8=+s(7?_AxrG+i>B`4n& z*`7IKp_o2_pH}n)_hB8@XVFN0FjQi|HT@}I4Z#o%>^&YEFK$~oVJ`&v@v6DE5;~um zeF&A9sy_cv%@sUhA>|%)_L6(MH;6r)F_1ofZ#IGYkIg&XZ2H6UD-a8Lju||v4d;h} zCILlWdwt7Fw3jWOzl!x-Ae^W1ZAO+SL9M&!R{jMyx&Ay`{*ufIcdHesI_WEO`UZ+R z*4~IXSkfEHP7N6>Bs8PeO2(O9RdkfkAs~mNJpGbZU1eJS_Pi7G1gAmJvgO8rjriKseZrX_DYF2FY zEvD|FsD5xhHJLF!GvlohAXz$Q0qvN2aZ{PuZ|kz9YNoh6>2capHP5gU))S1?Q^f&z ziJ&TFCm?^e@s>_+qIJBArj-M-{aaK2doc0nl5#^IhMvf(4_zHDKxe1=MQET!xbB+N z7k23PD7ndXXJC23)crGfK(S60ENYFX_@;yPu*QoVe8#op=NIj#9h)1&=378t$7%aJ zKoEQESF3Qm)r|3*4=I`N>^BD2-BO-#Il`?035%nn?Yw?54lNij{{(2>q8_;Ro$EN5 z|M84Jc4V~Vke_JZf?~4x)$r;Q^e4*3j}Er1$Vk<+XSEbFCH;IwZ{x{@;7QpO>oAY_ z&z(UP1G3zRD=9z4sluI&tl&ifJ(;?9S|N^LQETZpXl=Z|VmjEp_?NcLQY=3aUS$$R z^n}u<{@8e9`)Q3W@MdPp8E(EZ_0n1G<4{LI82P9mY`}w)zbq1GD~Kt47+*a*NB-pq zBfdmrPV!$r(_{zKc+Xn6`ETcwW{Ew}~S;Z9Qz6ec~O?p7k=lv3U$ywVA8V7@xu` zsb+11b*YD0NioE258eiJ8`EKP!w%6Z0uY^ARbwL_v@0E}?$KFcfXe{va+%S4Il|oA zAByU{GTHYjQ?FYUG(+~W_xM7V9$7zNL4td}*vkPHN-~nonW{&Kq`g4#x`7LgFdywq zK@{i(B0&8ZDC1Y)w~QU!>PJX2yOw9sQ{Vr>btgZ*Ya$A}#El4>=1LztFW?D?>jra{ z5i8KGp8wV_1$GWf3ei&wsE2I$`M%BK?H>1)%TSo{*P@0}G$;V@@X>5GJRz z%n$G9Pa;hW_NZ_7(GXcyY288hFrTgFlGNqeEmcnknx5i7(6Dg_pnd=Nk{=MtxFHbC zNcEKMIoYP<#XUjKq`O1omFA%9>Fv>3&9)M<;JKWlz(A)W@`IO_`I;NSHtt-uS0<+L z$&8dOuriRhb1$VA+(-sbwezzzwI-Y2hETIPbrf3t zTZ59xRq&Khzt|}Q=cIC=lg`U>%$I3)y+I|%x8PlZ`FD!I>hZqX=dsTn?&D;gF{{lV zu;58bwOY94amGjnJW{)Ai44<7FOlcAu@9bcRd(z21JkCuKb3NlL3)~JpBOL$le+oQ zLW@R=@SIj9yTLI%iaf4!Bq((bR0f()lbU=iq9W!#;)%IFxxZXe+mC~xma1`A(n6tM z+l{Bd>ja6fB=_S??jtqt`*GMLpP)qTODfNZDW9_&dcI4_ZZ$)qO-e63<9(KgoVZ5d z;v49nQD|J-UMaPkOc;>ubFwfFm_-N|@r;a4v1!=Jr`}x70S^1>&ZBEWzoXa@wWS(% zb-Vc;%R|3TZbv^rzf-d;f)mQV1*$^RwZGCPj)Od0o?k)y+o= zVJkYXKq@GWQapULPD*dJRiX~qm73bN!X=Qb(|?f~dwzgsV@Ko6#osd-$4TfM2=n~~ zo?&Xutppgy#{ubD#Zw(RZv0pSsSvsp?WD8Xh-e9&>(>gSpE@%DHYhCjam~{59gW2 zAtd&sK?!1Eh4yLShZf8vdDWc4=-LH#G$h=(o!S5iV42-X#jdMtiK(KzT6FGH{CbM7 zGbqZ!A8bWn07RG1LUvjAWWJYnwp9=EnHW0R|N6Xfm-V@U;?3V&(8JcEyH3oD)!``R zRbQ?buQzip^f~^L6}=?;OKOHFvKm} z4JaJWH@^OevFl5!Tne_}2Mf-5(FF_%s1v$|Mkl=a4K+)Zm6h3eZARc8+zvEM@}CgE z)nf#{P=Ag(&cm;4zvevqMoFdN$gxpnD!TL|Y#@(x4yg4vRV9P5(AHF$!B})_Wj4Tw zRHaKL^0(B3PKlN*`?P)K1->Xz#kCH%S*b*65pGgHPjZ1BpgP``U+0tS736`A*~Ibk zRLDr$Vtz&RJG}w@(nV*`863hGUP@G$t+KsfSyt>h_kFj^Fr32Ck_o zq^n2C%l*`r(uOcE#HG59)@0B`5ZJyAo5yLPTvXX4H8ApO6Dyp2`v<;>ZEsrG29?=# zT3|fgAA{V)n;B|R7We_IkoJY7=5nNJZ}+9WAxH$%&Sw?F^W1nQK8OJP&cQpl6-)sG zu;;BxjHeANdBugk(;Y893QG!2jzl>z7LW*7v+a>UHb>A=T&sy$-!hw2AJ~j*nThL& zpJ=F{ivVD{8Qd3oN=72*4SH<&G{Q;6zE3?Q2t~t?n$dnf2_~{m%4sbXs;O;{p&)cW zoZVDR?eqCl=`Z8b2ZN}ih9lX^PdeVW4CAHUv_6ByH4XjmKT`eUVCf;ZvnN!QQo6tu zzpkG|`b;dHw<5;nYZnvd7cQ*?@H0yme%3d`@D}^3@whHWO2|7Pbz_cM8PG*@HNs^VY*omo?eiAJLaEZgFT>Xf>BlOrf*XGgj6OCY5)P|iK-BxA_O_*f9 z{+YhJJ1y~b;-KKpAoPIo6rCPmQ{^i=b(bphK_t;`y8+iZG0;ajfjSBMU+jHnTT@%t zt{o8tK?Rj2SfbKYL^{|I*+@`&uOiZG2pt9?pyx8Rt+%fP< z+;njLot&i3#npesflb%JGYy^pAj#e5RelP{e(>IK}$&Y*<t~Wc3 zHG5K;)*$S5Z*Gb@r}E0Zo>!S#uqWHZHvvNvWj0ccP7AOf_?^lYyV8xqFH#U=g!2jg`r<=<;VhfTUcuSL`E(XZy0m$a&l15iQ&EEcor@@}h*bFC08*tK2VnyFw8QlX~x-Yj`fet~90{@KD0 z!nqrzF^%3v=5|sjUGABJ=7BeGHs`x7@Aol`e5s4%Z#&!gTGK9q|5fuV)lC!)R8(mgG}tr^ha*WtY1Q&$4qFK?8#4VLrRbD`-S$K4{&7)PJWmv~NZ7B; zpcG_&WJt`v9YV9uF`H!JsLx{a-ZL~)U~mc&aE^tUaP*BEcq4C7Kw_vnD zb8X@0bOapl8b3==BIQ{Pqx@@7)o{sbwKDw<&i?t1Y)7LsMT=H<;mqx#`t~doAGt)y zAXglMvwx;mN0vs;Z&C9xDVlNmeX?lKP=SYaO-mJ{mt{A55I&fhILn&#{;>tr$8s4} zuxaeeb1eS-qav;ey7M_d4x()$p1A3nbn*JN9;~-RF6u?8s*SbHAvf~AK~cX{Rwg-B zTxqmCLA9ZE@aD*|Fm|-5BGsl`p;sP>NrvJC%E)_Cx#m{pMIj>fIk)&m-o~rptkg^LNUJA&~9`KHs8*>;7hH7V7l)Bk2 zjv)LK#LNJD#kw8muEA1hL~Wfp zr2`F!_OyQjTh#|&!ge(RA@3VviD&hf7Raw0=>esvt z%H3)wO4{q)Y-F3XB*0Fo=~ABjwyxnF9yU<#YVuwgX)?5{_cx1sb^^7c3d+7|1x5W5 z=wPS%6S`0K5Xo#7HbS$o;O&0XRmQIw&DVS;uVeyoYg6+9*xznd`+hfxJgCQdoEcwk z7${GkFnF8@y}$+pG?f&SScT;Z zJ0)|wkxdi*tqCUPc8=MLRL<{6nf2}{$8!JCaLr&CW^cYP)L+=FiWY6g*OvEwZs7s- zu-K{P*7AJXQ+`y?Y_{0>mY0K_pP!}a#`GQfW$fD${6ZeO^qekalNJ@!nSUMb9s|*< zbbuUvxUtroN7m!_+{aQfwZ5;KJ7)BnPa*N=8<@<3LGASpyHk;f!Wr+AK6@ zDHkc`eXVV;XI>k3U?nKk@LQ7lgbyw=aY#! zeAOnT7d%XDeXLssS`IwaJ;I7~=Yd|wS(h$Sr-xpAzjp;uX6Z$kkf9KlsSQpNE=AJ7D?JTmwSYIsJh^}Xo@H(wRrmI%ZpH@rrMeWfG% zxy`LXK8MmNT%gapqT103}VZJ;~3#IiJ z%P&MPAf5Q(to^Ql!hnC_|jn8*kw=KQt3a~ zii&5K6qcf}t4q3TY5#Lg) zJJ(W!($~aOUz6%#?4mBzg5uR{LjbC<;!TQ&h!}6&K7<_|(sfHmDszm4;h5pL)2~s6 zW*C0u6mWK+6Ed3A4Leq-Z>LFj?Xs`rS3|`CfCctaps>JYRll;ORTnYK9|T3u zl?y=AN~_12M2Dccx~k7HyH27UwKjg)%}0brDG7I2Q(vT|HZNmeyFSluh$MNk9lr7ffP1<{jg9>rII&Tga`f6Qp$nkOcR>#pJg&mmf_;J+z z>84;=1W6`Im}fgWCoNk3r_?cd%Cm#S#IleTmYPP{Zo|!#ggw=(82C}X>?@LXPqDkE zkT1tEYvkmn_-#?c42e*N#^sJ23r(dc9-e zb&r+MrTd^Bffjy#D}OnPp6uAI!9hG$Q9Qr=x~VdqW>1rK>vgmZt>212ido3ugd9e) z9hb2(-1S?$*OPa#@ERDO8f$Cp`pM~k(qQV zT~k9V^rBLfQze$A679ar1R6wCh34b~Di2qtpLq;6w9DD-lQd49+A8olFKSwJzV3(X zWWk&ZXeTy^#gHwoP)CM8JZF=F*JMx8JGNfzqh<b~Qp8dwL5Q?!hnnHdb; z!8wI?b|#V;{_a}KO~-`6_td~8C{wK)KA1TfjG=aTm#tSZRMP zNfa%foBBdBgXRJr;-`IF#9mF2+5MGE7n9?|^7;xVct6@SUF-deIqEM6D`}y%9UO|& zcRy1oN-k})FVoxhx<28^)Y)2jYUUGDDsn)>5Jl{tZl>HIDSVBarBRA~t)ATvQWt(U z@%=0;d6wz@U^s5whfG_;{X|7*z7=^p6g4^kT?31CH#g~m<#4-v+~=e-uWnC@`i12F z{`L>inXwc`zk;Vp3Z$&1t&>_v`1#EAk_AqF5b6UbY?%$KSLGZW1}YYZKv|@#I$mNf z=u^Fa&y~$T>>!RMB;}>1@5`0pJ9--z6h?;SvQ84U@8Fv9%bM63y>uB{Gb|4x}*1G&pno>m_20qL`W8#F~L=X;M zVj@p%Co_-xgHLUEY!O|scqs3PmKt=HIa6d{CO_|QH|#rqIQKm*xz9RRv~Uic8L|~w z<|Ei$m%Dr@Zrm4ATGjRX#NG~#(PP)PlHa2D z^MCZ8(h&pqr?k@ume*@L zQ!A%kU$JbS!~HfXv;>yf$dLAmw_xk^L}R5?>HbZCdT5XYCf;JQlw&Aypq? zzbrJ8N6qH6NolLB+W|vRso9l~S;>+n8iFeh9BnRp0ayTnjURIK;(`#dh*tlv7At;A z6)NCN{{8+-vQXCO?a>4~0^&|Jq)v&dqYe-U2fJT}UiMk_RSq@HkzrU?X!4;p-M()+ zLJ8UYBgL7z*EM_JK14Z>Xw;!EQCr=eoKL!E5b2GoK{S_kq*^j6AnJ(0>xM3Jr=1d94-q&1hW#j{Gr*@$& zeEX4x(Kwrv_PfejAb>VqqC#!s&=UTOt#+LHil=X&)5KU+j%xW`A*9T%X74kF0(YNB z;ao>y(LWY%jc>1d(Oh=Q3A>{f!-U+|#;!iyWdw~Cm$q$;_cs|xGP#9~@QBz$nd(C7 zNBYMfZ1(dofA(9S7s73N)&Tz4_x2(hD;k83bicrG)aH!+)7H%q#o~pFKh%la@K7f` zV|fwjC^%t_w8{wa)7uGrtF6sd6(RLS0qVTA0Sz)F?!+%DJJo5;m?pWVz1bB#whI_Z zNlC2a@8bC%39^2+D}DwkxmyWP0KB?DXc`JZ8)v~$`)keAxAzHSeXok_F4(Qr%XZ{D z^cOPWrsk7pXp8#HJ3*7Y4zn6odU0gb550DiZYi=LuNcqlp}>LP*{smq?##DnGwQ*~ zWA&I5k7E;^OgnFD2Yz~4f$iSdp#oo=Zl`Cel(WMQv#7_R!if24<0LBhEcO%9p99KJEia}>B^utQiCLI{eUkQ zgFkLlsStY4H)4;NEUQ?IUM!a>DK;;b$rRM5=kqcIz}Cq#3i&Fl((o5((OA-9ES;HW zxPX@Dy!h9Rv014*4l`D1ds#}mjKUg5+0y0 z$VY|WQ~*4T-0NuD=v*}kP|d{Zj&>OliVDsKKM9jqu8?#DB*Syt@aFHpDXYzgW+HII zgS`EXXb|7lW?imVEEU=yc-h8UFU{|Y?TwH z0}O+@66^M*Ay=6pVmor_v3a5|l$sbSSxA^DUo0UOr&-sgML+;U`+Fa3&aX%5_A5SGB5MXzv~N1YP2`iu zP)WY zoEbaf!vH!YCqm3R-Sbgd6C*&|FJW(7vJjn*;0{@OxNtOg?6lzm543)dx$k~ z`x>VHinvWw-~IJ>zOH~5+|^trCd2P?EEope)x|{cN`Czr%xfi;jSBPn12pb9(t%TS zldoMtUW+8i7nI&D-)RWP0*9vzPsL$wH}!g-vUZ6|pWILTO@0&LH>NrLGRuECmpfwF$ z5xkLi!c@!!#0XoMn{Y;QO7^{!=iwF$xY=`$e98!S#dC*v&gUm<8~@t3)SGU62JDRz zHq$bh6OuJK zuHJFe&$(`Y06AGn=1o}%-rSbxqog_ih-~TRHcdn_QI{hOS{ALzvT*JGIfp*g%sloo zqvfFt>_F3JB%&N^a+Q}HiYR33-$Zs!D_ICf9{Sq;-QVr@Pi1B!%b%v6OPVZxC3HcC zKG-{LI35su8{`+AOsXCT2({-A)$&XDHfuX)yrL&|L9lni-e4O0xZ;dTCtm;*aGI!hUS=|Hm_<=>H ze(Xqi?@E^3;O-T?T{$j1+?d6{nAX){_)Z36W#a2dvh#cNSz=(~f)`}h(NSU3yIHRx zt!1x}pyNSCPSiAL9Yr4!5rPBuqV|40i>g0mDXQwGkT1)z1Yxy}UaL(&Y}H+5IDniB z&d3={w~LHtgcgJ93zt;ct`tpwsCJAHE!FMY%wI&j4wl6^=U{wieKdV`YI0BL4v~+O9BRE;$K527gcog|y+s2rt&kmJ$#Sx9)8ee>*z^(7GI{$X6xCU0E zX|VrD*ARY4HdqH%K9xM$jd+)l3;8uVA_#f*o<&>RFB8 zC7QebN6vLXMWW;etr@T2+d{n&dkL+jEwKV$V)A`zLyFb&cU?Fd(rol8(p7S`D>W(9 z7>q0zfK#(E4NBPOoMFhVh&l9SGC1&Z^4JIA~P}&L5QIF(^1=OKnx^#w#is@zjo~-ebhES-UoDwzsIt**Iy?{5a%# zMCZcg8>zEiC(#3s-PLg85E~Jn=TvoQEfkD>k5{E2w#3Eto3mMSpgtw_4jkJ`$>qY? z;H=wu>pEP5a62K`IQ=mTprZys3!%`ytHgKZsz*b&25V&Ng_;S8R)<~{ z5Pj?ZHgrd3->Voc;Uk%ry5AG-1q2J7Y`fdPyiuJ#*L}_@u6U^3En;ZI+N&rP{o=k! zgJsJEuEzU;uB^b5e>~ zi~k_2sJy+~S?9JY-IQ*%RQV(T2fE%stj~FB0W}bI^(Coqm*FKQ z1`9!A`Oo&}?^LO+Sc)0@St)Z!{C+)~IWQVetg8q$OXt>%Ku3FNiJm!4yBBs|d+xp} zwhdhzdCV-o+_4e4QmOJX+|V#6@WJjy$_XBO+a!wU5KoT3b!;KT%nq9=8PA#nQ%(e> zDrf~z_9v* zXE8<4Fv+vJcD#cu-A5YkZVn1}oZV$e+UsBV+ldi84LNN*PrG!PBBC8s_yiyt2kgFHH7v}KTAisW7&x!5Eo%f@4+U-u* z8;@T^6005N?X~iOPZbesR{j%0I=@x?bk4}t*vj;G|?lkTrfPkJG+_|-nkVoT@)vxlV-QWu$po< z=lan(g8j2D*F~s9&fktEp0KU8l{zINIv{#vY74`MA8Z#1tu~S&_(m{B^5Z9@dA~H6 zr(z-4`zn0uCN9nnR^#P;rU*Xw{OOBSna_5Nt3+fmLV_L@G-Ov#g=g{XzV`B07Z3Wj zCW%anHhaOFsnF?QoOT`wIlok$Qv&x-*?Y5S@z;+VUAz<%C1;M|xo+p6@uiuN zD@dlSu4B_3hafgYp!>bsmPANY@-P^-H&+s*Hq zz}TmSnA}-3-@2V_{}7%b!S-bf*b#lV-0gacNZEII^aOP6#4c%?3q`=^EpYLzto+ik za5tLA;>_`_zxzu9lro&~R*ZnTP!1X-Lo;@`vc)C8=ptGypj;-pg8I zC;r|6nUQ9>PXC#klNs7Y{Lx!vUizFp^%FJCha^O+-kNT3&T^u*R+xw3mxBtS9y>?q zcEeG?|=;z7*hI|96uoM#Yp!mbWqm!*By-9rLSNFFNb9UqwemZNzJ1H62d4Ug;Q{lJgyLDIbpM-{UcIlJalZyk2 z;TKJVH#^1eWJol|Z$-9u@SE`}k_IgIwrOcnT+LUfWeb$*=&AsWXgU3g-q0tq46FQ9 z|ECG@I|cwbzw`W!<)ce`3z@_lSb6jcAUP`fA&l3ggbAPd2G3Md5L9&L8t**oSnu}L zl|oGf$lwaf?XdwgE--{?uxkBlTdkq;g`intaUm7KNwjYkN0;dHhFM;)%OOuakfi{s zcEAECH2wu|^p=N*vFsrk7!J0(vuwV}BpOq(=E^qImnug@O6A}4J7C9-Q;{=i%wWdr zKS}}jYt0`xfN?4~Io&2&-cNC-o~A4=chV@}_X#Zie%NP!g5SZYOcF--2O2slMs~Uw&-3gyY}f=w zW_rUEF+tMpS>YjBDdw9}_UzT}a@&cX3uBmUI(f;j`*Y(CSg9Ul79E|<6XYrpD)TWU ziHQy)F?89kE>y@~WVvUrRPfuko8|oI=)7csBqG6Yi2friK6>a*bJiW~29V_Idmk-* zM|(PRe7aU+AZ)=-3>^{3=!u=ZdyyQ}AOd10CKQW;N?XKBt)I|od2#(aW^lRNCA?U~Le#XLU91|b4@;2VZ* z_kH;dM1|GliI`EPcff7o>Z^onXi_q95qX1ncXirthUt?rbVzp28L8_b0;A4GARBU? zxk`DLW3L9G^0)8uV1~YZ0YBxYYZ-PRddnFeh3uJcF=JtAQLki_@%ZI)%yL_g-mk^*=D<5jR4{q_LlyHDn;@AqAXi(rv0KFof+uPRyQA}8rA z($!Zb$=aH{jq^FH!#$12HzNDIg3x|61ylQ@s zGdGE2+fcq3X%DFu3)8N>XMZ7gNYsj{ui8ZzTwO$jNuk_#aIL(olAow)o6wthr9GWT zE;v$0TQ;HYo@HVc#+~grs#Ww|&?D`+Zf4(>h4$YQ&YRlj(6hL%3%N*o1?{{kB0tqi zbY=Tvk4v;x6+b`w-qCD8?tMvGMgqp=A-ce33Q-}DV(A?O0tt;-84{euq9POWu0=Gj zLzL4$H%Kw}tAC??)Vax>jZCsdN%(zP@}}pyc*Qa0XMFndSi1R?tRSan<>Tk&Hx`xj z7+^!aeZ?8tr@%0|y0U@+MY3CoaM99l$Q2jey$!YtlVHZz z;hmbYbe_Aou17j2=+V9cTK@xFDDy$Ko)_~i^M^Px6{MWaMi`Zirih_B`u2ldwCi7G0iep2 zU7Uokc)~BUQ~ANps;tvM)fbyhTUoNBg z1gy$p{l*7Uxvm8CKgB-v?_DZMejP;^J0=BPuA6veYT7`NjQr>`F)dluk|Brfi!{2A zJTLokIC)>tvCDl)RC(jVInuF85>~HEv=ap%3!|!+npw1yFs-z~;1$Q?{*IFXBEgJ^ zyU~#XK5;qxA+ok(_mQ~-yo>XQN87KQUt>!pvqfzrd`Ndr>NB;F(ZWmMOs>y=&S+8j z9%J1$U(07ukh2|I2Y9M^k9f;}!u%SYkaOddkA%t*d<15`u*FK!0A>4QyT}yLob_2{ z!-iA-e2VAC4=&{D?&mWqAbEQ%Choff@1$-&2J7}aND-!K-A>32JivQKnxN=UQ zRO+6dC^E~fMD^tM-!p{xn4&iAE}3liN+A%u4R;8dX@bJX43vfq(p*JD5B^TM6Sl$P ziQQ0LgIW*5LWyjNpxTsz0;^@nsU9@@@oah5Jk^EkE7QHJmXlimI(lk)s`NEeOowcq zdy^3JI+1GPj{nSZS#$hM+7=e4iF4z7PF;@FJqS+Tb>=F2G$)I8tLHFgGioD3w5l0o z25`nlz}JJi5>B9Pgm|b5MH4Q&+vcQtD=S&M=4}C0nJtv>1e(xZOcr#t-CBYy%Z3e~ zwKVvur6+2C#K7~&;~Yz0ejIL#E!-#5E{gXE*-9v{EHnYq0(Uvn6J?a%$m&XET-V%p znChQDW{#e|50+{Lp>qPJr1US57S6A@zF{({P ztjhYIh8S^FXa|3$mlA~Vow6fUmhmnU>7s~jW&AmhZLa#FvSF!J1*7+muH7-ej$%S> z9JfQYm_xkFofIn8v7hmZ^@l!wBIhX1jb_PCTuL|k*-|_(%XP4AsCYKVSS<$52kwnJ zYC(X-U+-`52x1iD=*tyo zA9FX1uFqU)eyfMo%1DfdgQb=3QUeK3%hs!0oqJYXm|Cu&J_PQ)$GoBpxTng6ULgwv zw22I+Fkn!ob)2QtDovKm?fPDBB zLX7s$kC0i87ao(-M$NplpY)z9MYD``5z>=o^e{QMwV$Oy%%+O1w>x2A5qx)|Cmk+id^IKmzn8`W=CPSprDS#}2 ztN;LFBlBHncSQE%-(SHDKf$lyA7+nbZ(W;fXN~f{lg!7YJMqe#UDQL)Xk044eR2g# z?n#lXP_kKC_9O^t$6x34Mqb3w5m*6u4;J@!8hFUIxN9(~L6W1P10BAZQGO77Tka!NT)FX?3K z>)9l%!R(l3$q~mwPn#s|5^TyN9lwlVUY~5=-&Jk)kT#MYK@<<7Yx4>hhW7lI*_Kcu zG2Ps58EH4T40?0dZ*-m6dYZOQrVKj((|v4dy3`44j0hAmopsXc!91ushQ9&AXoOS~ zW(CvxFJa|9&_H9{`9KYW?M-Fva6 z>`iJuCPq}?9sx=ezGllZsCb!UwAQJY|Fez%gUZ_tW{OZnB0Gw##D5rp5ytF)_I^Ao ztj9-hrSMHy$!zZ0Z+y6>INMt6=&V&seTZLI`y?-U(A3Z0GAS96@y`mF#sKUZ4Ie(L zCoSY-fphw7cs2&P2|as_o_1?pJpL6}R8Z>H0kVY#zT)2fSLp=*o8yr4KJBn>iT{=D zFCXEO`HyJ*!xM_A;AS9Mh243-zE`dqkIWh&zqW1w{>LP0?*1{DD%`R*Inz+;D(qRy zY_2IXSJdiTqGwH3flcsyGj$3{IRbqp@>ZbhMgA9b3Pks-JEg{LwAJ`r?Etw(v#Sq^ zF=IHFav9X=pC2&%3T({!bL%E0`kG6c>IGqmh~TX|lLIAMbVNeSqvbHZBijrag2yn4 zi3qbS{9nX=A^P)Q#$E>fJB(mmF8`kE=}UVv%Vln*g>`yPH9{es{e(}tcZyWF+xQLY zTQSq(!X`$VU#`aU4X6hpV0|rNX}}gTJ_))qhpzLfZBIn*C9WP?XB2+3s`7{a8kw+$ zi+!V8bi2|CX}4&tce|Hz8K7`~UT~|8!G;S4dCwoZ-~aOB!n4;Hys+>w#+EVWSL21k zd3Hb}|*A23X^Ql}o`fQ7$HT2y7ttUJC7^;XYD{#HT zSP>?(!G`0-UXyj4; zv$F6YQ(YQ$8UI zbN;;T>rk|}ekBacTq3>&0sCCHOY3~eRaGuBp1sr+0lN$NXtbNiace|Hq;1AI*NKzg zVO*|(4}fX^58C*3ruRSlT~&3$RcoDC`YyiwG#Caj&i@kb{`>6T5|Z@o#-9Z$@MzTA zD6~vvSmJTJ0{2D~S|LAm*H4va!hlM+Hl(=l+E@*F-{0P2@eghIf4SzXs#f0ieR|9A zg6C6rUqH1W>IOWa>vKQ^A6h5nD-SeQ*}VCW9}#?-q0Qi!pPMzmf&yRs$9o`hfVi3e z+JgPt%u^$!VNae6d^tAnSrvU)IAo50bt-*4dvqwlAk8w-AgxTNBz=htkN&Oca(y`& z+Q7LR{XZ#}y-+PRAVHg+^6DU8&HwagPU{;}GiA*kj~l{#J=e zz!&{n6F#!9FVuGSCy4y655snl5uCjb8~q4I!rG1FIC2C0=lu_M!>tvp=@}0OuX^-@ z^^u)lU-|9q4C>%@6Cb#JPzteg469{3h$tuQQ4 zX67bVk71kM0O#T#?^4QB$uKI6J+<(bTPIPLs~JW(*0)_|#FOxE@UR;X#N&UzcjXV0 z^8PeE^1!DWJ>`SeP5*T$G8MLrFMX_Z`8Sq)=&n)A121bx(Mt@2Sq7L| zeSBb)bSaxqBw@plp?^*Ukmq@+68A69vfuic8K3?7eD-%k?Js&(b9BWr#LzgwdNsx&hH>~h zj<9h5EmN>*cav%FWPmJOrQeG|rW%|b!5HYjPcSBtQO}z_{)li_DqBA3}aB)LZQsa>@Ffv+ka?^_rLt$XhN=AH%R)t+4h8sdN+=+ zuvjI>i)&UI66NPK5Z`ec7pA}_4$|?%h=*|mdO+ZYZ@7+Kz*tHmU$ww?$VtSlkMpwZ zZDZ6fetUNfXZX^zF%QXor12@vBW@ZVDUeD2mr;71DLFcfvFC*Dm@_RG7~4XfxV^Z> zC1Bq{=MyrVFd6q5g({vS2Rp?`K(7fj<_N1ZW6L&6F9a*n2Ol8^+`Bq4+4e1=29yhy zyg7KxNCskLfUen%9iKp@n_yk(ul$kyRdYdTNL^jodF^FAgpge{>Ni+lx`~^{9fh~w zTmKmk?^#Y_IPclHcOMW9GP`)y?kznTq5*HTc+~rbA%E+<3EI~zuhukd}TP1>LAQHd34oc&t5%7oXFh;0P^-0l3*A~izCq-Xtv4HPw694)> zK{NitfWo(rn*yoqU#A;XLN5N)@%gqNa1F|81RvncOFqf|CBIXD%s)KHbkU2=0Mgm_ zeDXh$EWf)%+QCO20zu%z?Fe}`XG@hc55kP<6`%H&OJqg_J099no62D7eUrs%-~mX0 z9spQvDy|x%^&VU+VB2&R8mY2xOYNDzwj!+b&A@?=29pv^N;#%A<= zqAFE}C0$MPeH#6G#Ssu3mtjqwD8RGARHj69t;GdQp|~$S)$0C^{I}E5JiVSZ`YeW) zicTF}-2S{scS|{tI5D%ks;{vl9K&iTbry!9F(3C|t1R)GX{{_4(HB>5sdcM#OqT&S z_Va-lbpHDcS4kVVahgOmf7C=~YGf}KR2cq&zL-BbpBG|DxbyBdGFv~aQN&t_UUw-2 z26n#%S5KPoU;3t|ikSo7CthU{l!Weqq%_K*lBCEe`wrKhD{+HBx{f07qr;1NW$LlKyb8oKGQPedUIPv^-z1tHvdb*zdhFcNZ;aa|%G+xnhv#4P z-PClkHvu{VsG1iT-FMv$&O!ulFfHMaWgv^c;tFFm3~})uTatS$Qp{30 z;#?TpTr>&WjnjfIjNWolEQpm|LpHl;6t2euU#a^^)&}x{Ioon8 zx~x*yssAA^Ze_Y8v&n+(c)s~qb`k3iD|pY#J;m|XSK5RQK1=r~2p7ae-xz&wU4pHA zpwI%8Y?a))Wn{sdIN~AaqFSI$bDgW8*}4ck;3q*cjy^o!NTli+;5)oU^2J! z>_z`Xc{k*4-dLf=jMC_DT+hs> z7=uq?t~nlrPAfj}kg4aR)1wTDemUQ~v=EByFY2GX zc^#1~>zTU))X`ep{2FZ!ip)op&ipjtawW?{M2VZy%9F*{`Gb!IX>CE*QK-EB=(r5b zLG^@BhHo^M_3Lu>YV(&(Mf$*C>@{L9-k>-1Tj`w|%RH}y45p_3egzK^B8abrr2W%4 z8ofO+)dOPMO3wO0dWtNPz1zaV=+kzRScr~Dc;MEobC$W_$bOQ5`Qbh)t7dDY2vbdAFrO zhmDQnSBM1OFo?q-v<25k0@+etZLiJ|*w2FJ7dfSV^ektuB1 zvRSjzpaT8;)3ht!W6MiG4!#X&bqcOJf_bl?rRPL-t>&k7oNn@zywz0tN}yt_@k`~} z8ap@C8jTG8n#x&9J}n`6?W&g$LI*1bSK7&^Edv+1o!=xQeb50bc|9#QXdAqa1jj-Efk@fT z2q(nNRU;oAlQ71og|&rK4Vx*6z-a_8V|Mt|1v*xUmm7%1VWX?bzR_gWy1V&WH{ z8)n|oPD1+Wm#UCWb|l?Dl@otTZWErq5*ppQU*2!Ab#a}1S4;%7K)8Mb) zY|}t#eB_jQCS<=4@eni@Ij0MMjgQ8jvBwcV+%h5Z@FPO1Io+UG#m^RGU}7hcp4g`y9hEeF{Z|@8LsIC(t4}B_ zxeVdjN(A0mxK(eC^x*K2AGn4bZokfKWisWicf;;{$TFwVlY(r3?_$0W>&w2IP;Lx3 ze)`Qd)fI>c3wFxv5HBt}MZAB?*UaW*s1pBebgVjJEzxZ*rI)zAe>XmJATYBH@eR`_ zIFH*qI(D|xr6)N_wH7^Q!)?{30d7gqk&dAac)x8`k(wwc6i{3~8I!F-I$9H@~74^W5{ z)uR(RX-}J~Y~&=k;P;#lFQIh0e0vvK?+;k+-Gjr zZZ{hGy%%yjuH6(%D`*R-#jO=Zw6gPnQ@mg&Y>#76g?g{#m5x|)KI5|+99D>(tDwog4jzT{sRJG+L46_i&GwH~iK5vt}!mFZWJZ<+Fbp`HkmW_?C(J7?}wV$hPj0&*-N(GaNj;)MK0%g8)TW1O_|;vhsY(q8TXNW~iYBEh+6Gq_>9yAoRy zqgN7DpqgjEBgAsk0r0aw?H;2N(2)h=jt5N|Rk*%C2FK+3+fM7*4KcL9H)h?Cfch@F zYJhE$b{VLi$VGA&01DnDwdC)YwUtLba@b*#s#y8ELP*o+q*8=2nXo(Oc2DviHGwg* zPe94`pGgChgWz2q&~<&(7$3>OYyiGa(%gwLQ19@RpAXRhSN(Pu+bGt6QY&i_NQl0u zUnj^288vwi@fa3KU#7O6yZmWxGpzR;x{I9N&X~S|=Kz0_2Dg43Z*~WT;yNGm2I|XS zl$zh)L*@OFFMF%t0j??YrHfHurY*sqo#9HPR#%emE z^ZEgqb{P6yf)A$$d#LPfoSU?VcD>wIJTmS*u?9c(z8QR&3J`Sqz}7%p%6&Zc`f=Ar z&M+{NAsmOk0xDI+3AVO}+mT|OtU)XLakZyy7<0RvTd^ro$c>fR#l6bAozxT@bwh-b zPYDpk6RU5EVY&>_h`P2-vbIVXF+vQ~yusPP)MU#-&G|GgzQVryajlNYhbgHFMXOVj z-&+0TXOj2!&72u9qJ0P(9gCy;zbKi!F(vzP!T8KX$t0Y*>%+nhklMyW--ZJ&YMA$^ zQK)f?xcUVodBtWwnax_UcrHX!qvt}8kA0|So!hOW_Baw6C4q)}!sww5=JTwjM7Sh4 zkHkf9P(*d*>a?bv2Z&@5Pu8Lt#3g(_FIVidU@o;$C6HOEdKdfXF^}Y!K#XbEIeVN( z+2|Mh9io~-n0-Z zCYh+7eh?-tV2Aess*B#qB5@%Bu$N$aTrKC*#s#0`zm+wKDB+4!;3MHdPM~WhaNF2? z%B0t*_hayI9n6>RL#drMPt-%rx)jnU?uy>l(@~c2J2{yGS$mQ6#H(PK9X*&0k%Ppo z%IX$w;3Ak@d^n-wD>rBv8umU)scQ-iCxi337wi6#I-N}Ht58%u%Apo~!Ym-ACjsxq3|d_!x)igYpcelds^xzTVV;0p+gcugWI;ev?T~q5ca? z#fN3h)K->KCe06Ilegj%p6QzS`^iGIuSY$I9(FAwQ_HTkLHE#+47G2OeI_p1eo@9} z3fvd^zU1IJy#_2_{WiIz}l2&@c9VG7e;epwLvAtbIPoeSAS?od2`RneIbj(l3#XKvyEyuQ3HA5Fu*P4Ak% zf=pVKk3VqnxXxZ7!?aW3hKH(maePM`&L0XRsSeh!)^x>2c96Fkvsjs*{-aTERtnfj zhDEi^OsBcVO3Bq?0nVg-0(Lp&(9qnIDti9vM5vAUh$ z6mqxbtUziWk!CmhE+2WNIN)n7QlO7aR(WI+Z<%CUrb-qesg;KFE|cR4su8q`9YW^j zvOD*bg5?(NX?7_kFq`PZaj-a==`GrP?2Sj&*}z?}$yTS+F1;V`(Lu@pU0sJ}^O}x9 zqzAz#S00dv*E=p^dRl!va-dgaZ&QjgZ}|?((_+w5nS3Zm^;_g`JZ*Rhk|+>t)`#^S zAZZF*?CLum)UNcV&%RDCMx0ewQS3CjE2jK8RCz>O$4U|AGDL6JG8@fDk7^!hvkZwQ zJ={)^u6w^H)hTpQKV@qFZ1b$OhbdeaO&{bLH~I8Z<_BtMq1#1l_P~Ld3Mx;#jI8F z-(lO!*TgQ8Z9@WaNdnnh6YpmtML&Oe4I@sY~|aPJ*Wn_z|NE2(mfHt)fZW zNueDM(GGn!qf6%k(*~xY)ERE3PTt`)EZSFa5I|Wr2n^WThc;P_ch>jneQz19)aYa& zEi7Vzyb$Mhb|>qt7UUWpD8}2&$HJ_YllPn~Sb!6C;Tm^5I=t?j^hgKv*xfA(3w{0l za?g)>fBN7sorUr;kN`;JJNJ%;a|`hE+`rGm zNMeG&l6Rk}p)UKbwy;Uc93axnIu<*$ zctSc*JhB>j-o7{X6Dtg6uRepLk;2wxJZYEPrl8Qk%(r=apvI$J{c+!2HxGlP9iqvc zQAYwN-4Mf_4f=iX&`x6>Rby3lJ|R;sA}eoZMYK<$ra!dXfs#CwD+=SzM7xgDGLKsg zcbrZg<9=$1jnh0CStybo|IPTFhG?npax5M;Fgm*TUH1Zg0@`p)bZ=xAWJt&*3(iPj zU$~(kU61LzCUg0=%zHsed%uO(aa}ec{*BNrBQ06HO_`|@oifb9vsal3i_uu;8!jWi z781h(;g{P-TcHvPlfrL;33{%m7s)^mzWjB(#`(h(sboquJ|Iit?Sk%nafbEp7biot zS#A=7WxS4AA9dP8 zy*hdCkeK6@r5>ru;a}*bb0wP}Z-54x{{B~*fg z7MTK#fo2^8SVJ%fC!}v~SJUMD#dOw3ej5L5JY_4A8LjcAdQSyXKA77b$U7$u&cf7x z)=wWZtyjDJYid@uQv{;KPY9%vxb|+AOMzW$U2C1gYb!~nJS(KGWjoT2n=Qs3$#)J7 zp?jzwX(a#g5Lpq_Z8ZoJ0tp4^NVkArA1{*i-ly4ENZR!v5N%t{$0kIvI5uPFWVhMj zk=h?4(_)t)=nH~~Ffr(DdcfpUV*wQjssF>$l?Foje(m;6QQ5M$3sI6iRFX=TBHLI( zQH`B3vi>B5(1x-{h%tkhu~Wn(F;vWC%{mw}_NB4C=kb5P^r5Di=YH;UpZlEaoO4}c z114cFFuD2Xk;$%bnM>%@LRE~G*1U(Nc-USPj%=p@sfe#6dB2_Kgx<0i$2N%RA7^`C zeWon11Ft2OpZ6?ed*SCaCG(=DqjbLdLf>UzHz7Tu0X?ZB1O*P~9o4E;uF=e~=H@@H zBY2D%Cn{dgGH>2vm$sc9wq*+)Ne$uYs4JwRwA%#&o)K8OKq9%o>@0?1c?iN7~F(-%!sExbo!BZE^ONa zz#eSnQi`mtWO`b1Ss>-BOoTeE_%v5 z{=Yj&ZM{V?ham~1bV!TN4|kf+#F$PMUyc#KUVI|6(>Vd>;m-K?HxvuvaN9(=foU5; zP!<8lN49-kb@t*Zlv^HZsmw*=aR4=f)eR#qCyV!?B1N9I*P0S_&)u{9kbDjv`~1{W zHOm;7Dx*<;O^Lr$x#Tc-PqapU<`P9?nW-we78baoxKqtsZN%-sCz+qJpW**J_ZFDTruYJJ$W3scXI-8RI22JgK$-Ch!Dv|oMvSRe4`Qbw{ zMi8xnG^{1+)~dQ#>HIOGM-sAlUUG^O$;ZRu2)a+CqfDD1hj@#c0wSw8qLum<=b+eE zh~7IX1g`=d-2}GPyg1#yI)LdPWrKEnZ#~b`J5}6MZIUEnYL1$YMs}Zi(xIeNm?%oh z+H}tN5H1w2wR2xxM;*C^sl2Di@9>x)$?Ne83GDt305~gR0ccfU( z@_(uedj|x$q_g)&(Gug8D{YhOKUyxo7?5XI1uifKD-EkoNy>EBal_I$R_3?@)O|Pi zO|Eyu`^NON5195;xrm#j2qf1mq^NNihFZM2?eoqfLhR1-}@;9%;#@VN-9eLb(KO2Mj`Kr@j`1OT}wEJD^4Ni

Frw|;8le6Mixg{ul8bur-WS%mY ze<0mi!&Y5yR=V7=EF>gEV%n_BcIe{8zLYe{CcHvRmP(Uh10uG!(t zjc{o_0ry+q#cJkr)Kr_6pSP*Of3LUILEdqZzPE~j`~y6zoHMv1JytAo`}UB);q~=z z4(m-|jRAaQcYaMS$Tge;`#}r`Cq0wS2d_Z1wj(#&5;#fpvKpKx0e1{vd8RDy%oZt%p`BvoLcHi5!$BD(mI=BVF@Ka5KJ0PG1_@#{NoW^vvMvWANt9;A* zKdC2>MF58yI*)ivk52fB*YD%~YdemJ+Q+4I3X%AjeSX9AusvpCeA-H9X1oD~Y}s?B zYH1}H=>Gc(eI44dVTKa!NfYqVLF{;+2CM#YjAjQ?M--nTz*4#cz$I>O(|bZ@PWD+qpMXlPm==qM7lH$a|fR0ru$N35iy`cq)JpJu~XL6 z=M(~k#eh1e2HP^D8z*^t&_B;Ug)zi>?c0&;2|XHHV#B{BLxkX5YY7?O6+R zUk*SPd0Ocs+DTs-tx9Q>ipKYdJy8GiZ(AftzeElpBZZST=!xGEXYY!nLfI0osbAcr zP!l?z-bksSO7fr`(b=kaAOUnsN~%!s{tOKFGs-gxn%eqc(|^mnLz0$DI462^OSWQ> z6&I2xD_iqmkLh{P1k0(JN(w_no@|O$9_E90m1w{}`m1Q^nMqYJ96d{?s%QC>JLmlQ zGv8Q6FB?Uq$L4>TTrILrHTvdb@)C*o^lM)S)us`B@S1w9=E?NE{@=}%DUG`hu;#}4 zl&Puv;00MvI?$~F>y?LSbDJSec zPsnyIcIfs&zqbNM9h?2%Htt4I@+_XS-B&}@9=`;*-7y*mDqu* z$p9xhafxdEuf8xWZ`MnT2hN9@GgT&mz=1L(=Tk%Q{TIYZ-^%o#8JGy8_Z)C1_zGcZ zf(yapj3k@VKcovZYY^Z1>m4x#0qbo(G(i={u7Y>CXn$q)tmz348`U&Ywuv5<> zv+hJjLALXEdK;5vpo$M0Pt#h?qO5(>!|AQu#@>UQl-BcBS!B+zZ>jJ>kkkbkkI@&z zw-@=Piufm5F2c4*j#i*tg}LO)sJD&O7(%2_KwvNFui0qYI)-DbKZ*1n_oMh=0$qf zAV*6YNd*!;O<&BOg$z=cmt1b8^U~+7azQca_QK#%$KBXXyi95!oAR4IA0AU#T_yF= z+kbsHKH%y#XgFv&8^dpTb1pXmZf(pH%JFFO>4wR1#&qB+mxdY*a{)9e2;f6G&NRINoV52YwDJHOk2gNa<9qI3hK6W&((cLpB$(q@c*yXT*7BCu>VgIaoB#)w)VXS8 zljn_>%AZurkb`$KYxi&U;a*h5#L)>KNv$7^?ekG;`Pa(^J260$d)!>fUlrTJvxCs@ z8z)DWpet*J>}prmvwYUNs5B4ngD-Am8=+9Oqs|U#=+kT2;i5sRWMCxo@gFOykMi+6 zolkq8l-Cj58{qDrK6wHQ;lkHPBlo3}*q=-MtwAP|EpHQ*gL@qoli#z5#EBOpZE2+} z?r6-5}U(sE!#zrI;*eZ=)LN=*g^j^W3!2hiOdw`}!BEOgpD<+b8r ziBi?L`ocP>hMuoXQLJUCjay~+tr5>CsleP_l3T9$KhLt+!cz?>G@d*)L@Szp(YB+|L51@snMbM zel!Z}qt%97G)IN4)ipX6&v~90)^q!*?{?#V?F@(S$OX=iV6}ma^3U7+LKVXl{Og+k;-Lfyx0D z4&)q`wNkd?vF79_9pl2{n9EwuG{MBdq39m*7K>5gJd&Ed+G6Qkw}HZ5WKKb^g^!%7 zqS{tKL_c$7Pt+I6j6Re0+`UeiGP^j1ymztw#t2>cSt*m$MwP;&Barnhh*WSvF`U^0 zb(8n5t+uZeq;1fwT(kH~@wMID za^GxAo7hSg*Sqt`;nOR(iI)a1FDs@vbI_g@?Nyy!J z8*ArPmT_!vj$Quy4W!|pZO0WX$B6g4ic|MB2$@Qrj`MtII1@uwcVr0#@}BPB?4Cke z=7oAQ)3Ick^od(ERv10$Pu0oTfDrf z8g6|)W}j%TF^V`E@0;%%i9X9GgRpec!{z85SCuIoIrV(9;<)*=YUtg-=(qSLvMbA7 z<$-3~UzCD$UL5Bw?jSZ%tn`5awIviYD`U49lu6`8hLyv$&WLu?D9If*HmBQf;kZr| z?zVQOCHTCMU^V>cxnwGQgh#aAVjmEDgGsKil?VlCjg4Tj=kZIT=}PwU$KWf-gkC4# zJM~I+9dF|`Wp0eQPj(I3jZJ=ym`h#y#^^eNo-SWq;18T>t6BL;d3$zaTitHx^2alh zoXv-l;69@2%t=SDuGUN!1#ib;#NUT#2afE>D%*_CRD+91Sy`2bm4~-}dyUpfZHyF( zH$OA?%-?Fs0mESdDA6ND1z6;tYz)nZnOv3JjQRBOoe64ww$cL}9Z&5!4x7OXH%eV- z=1hZry5~L=L*>Dvo&AHmCo{$w2SU%+qnRy7z_pI}Rm$UlBim4dZKczXbaGy)Z(nw* z`>)#WpF!m98{%Xy$@=hiMYL6ZC&TZ1j7yD|HCuw52e{!kud+ru;4JcF0ToBQj5}wt z@HtZ_AXc$j&bm84T|3?tqyNhknWs@k!2{G$1HNfV6#5wCaSiXtEwucV!!1+$>*Q^d zySot9)PL_WGS`qvsUx--WUFqqtgLgZE=)kEPTLnD1gErSZ02v_rOwu$O(8a3p^hx zEbg>*w72Gu_qh1S9N;9+xTV~<#T-On@B~VpnShHb8tb{b3l3Uih{vaS=Qy{Ur$d!u zZNCA_;Mt-P(Yp}%YRUR!0(A^_#o7H6BmGTxk1Y7m1eU*t3c?XXP=~+*H=6`!EptS9 zcqNNLTMZJL6uV&RR4!Ik??H>QeJRg@EcN(aRNdl)#tJ16Jtr2pEOwl6%PDCu1I7jd z804Bvw`>n6ANN=$&s4Jp2hII9C=~)BoUHqI{YO{ds(1~FQ56*xT$u3KRPhX5LEZ-U z8k(Z6pI$l6>^;vchWiPpY7wDukM?LM^ge}uZq!z`x%9pH{YigKOPyQvVFL)=CierA zLRsnFLT=Zedd5}4KDQ!#``}BS_diafK8Z7O%TuAikcI*;*;YLO@RR#_Umk6YoecRE zd9K`ax;S;FdhT^b;B0IvWsgFb=Q+NkEAJ+k>l%Rw&mf9PaQ67AHSW<}0T188h2ePP zQQJZ9oBl59vOaGTAnO}+P2RQH&7H#Q5RUdhdR`BlbdXxE`lT{a&@LjQ8HOLGLu(@Q zFhuP9F=Ufd&)K1P&82rmr%ot3Hdn=^`@FdoS$JyW;zxQhaH6ZPB^!7#)%ps4<$5IARt60Fi}en& z)@L==O7ME&r%>a+yJbw0paJ%4cTri{zmfA{`1V*;aD)o|O`vwiYB;T4k`wGqtU%~I z`DISih^T_n*M*K{uOqLA;xW|QZ%hoqZ?&ua_#L)uV~BDnbyTheqNk&KG0$B`KWyyI zP1@K_r)195%?W(UTtKYEM_yxFFTJ+oG8TCUZ#q5Nut|zof%n)_uK-U!g?KwY zwJYAGecJeJ6~{*oH!(BR6OQ|0_D63o^V$zyH&VCs6ml4-bs*K+O1=Hzq`xk97nEdq zwme5)pzK45S4FlWHT2^R=dtA)S7?H$p>Ak+FdIq|tf*mgXmltW@#eu7jT&;82l&k6 zxg~n%e=Z2)bZF)~2$sn|b|2{6mO8l0$dG9>Z0d6fNgKsPp(5J1*cLNc*?}bUqu9W~ zctI%ZS=!0ZTC&O&ARYR8w5YJq4c~mAcChoIh!^dX2iQ?p-aSV#Qs*T^7{T?ySzbtJ zZR|gyB`%-oveL2HxOZCH2;@!lB>~k1r%}k3Cy)9K(8hH`Arl;JDy{2K(E#o&@0O;%Xrs-kT>YmK$>NImP4v-GLF#F|CB)b4;}jg>W%qN-8%ZNB$B zEE#A3izNfe8Me2?xWR|~`1y6BZNK&|u0LjQ>_4^hHkPvv-xQ%bZ@8m`OI~^XmlDI? zxj}-ZI_41u*;n|B=H})^K#ob4Z*E8T!0Y#vMCxE}w|V^GIzOpaIBTy%L9u z%pOs~*kRkg3kIUZ%X{msss{4Ls`Q@X_#)x$zD=D<6D-yn*wt@J2kNIT)~knrbW{*G zywEMh(Gm5-Pr0^RstKQS6qzLQu=XPpkT*BAb~IH37|WkIu~tb8+Y85AR@y2%!VVLe zw4CG~mq0hFTAd^JEp^rm>uB7EhHP=!w*UH>Fz2Qs$OlQUl|GVX7ERM}=ypNWQsGgk#df>4-`cpZ-R_S4j)Go| zwp{tyX2zs1u4<{bO^#yKG?U)c!pQ2O<|O~hxl3eCe#F(6MIv%^H$!&jEC(BM7Xuj8 z&RLFo?M#fXSsT$qAd74H1;o7;O~#_(0_xvr$k|RGH(?$BfXgUD3Zv0cv*vrSyTEe2 zg*RRJv2W95MGx|{Oyup`6}y&YZtSkQnRLS~>zS z&HDBbDR>9m*(%Z2k6HD`pp8`^Z_M%CZ3c48doMsfp~-l)^6Z1=WK?Jcj#&)GK(8%B z-I?r2^~HP8e8$SK#a^}_kI@pjI$7+)+z`?D%5E538??EUcQ&;B{@yTiD&t6g=Ep7(+QR=Y>7$2-1@u|@OKK&* zw$#gf(5>ZdJHO$r4m}xoOMVZn8p7GYxK#Y@F@@&;o4|{#goF2Lq1#Fs*5B3h-}l(U zzA90Vb9cD*=qr5RZB>U;sG}fgPJUDYQtH;_lu0fZ3B}*%NdEE1X>}rU(ov*zLG4ME z#Ccu+7^9v%nUDC1N-sQge}(^%4&8_O%{JDqgi>Ruv_d~akfaWspvlHJIlKOUYi2-0 zO;E}`^Q1q-U!~}RmZtal08<;&eEgUP48ek*R;=f0B_GkxeqjFQHZ`vo z2jSomWq&>8E;)*<7veDY_rI(qV$$MW_6AJ&Sc`Lk?=x6gsXtJIq9~PgZp#P2q^bMU zQVF@X1DQ_3$|F7WMRh4EkB>S=5nU&$*LqzJsd+H#!=Dm#D?ZuvKRQ$#rL#qcIk}<}YOhc@l6%o`7BX2`) zYCD_xPRT`w#8~Q``>xmqowN7r>QeB?*J_ zX_ugUOz)Z;MveCS*sf*cA@cMho{7d)L3 zehqhgALo1X;j)Dd0uGk#;p!9?usDHvbL)^GFd0M|Gr!RZl@3Tb5WfV6jz0!}{d2Qx z8dRDZ^zhz{OT#(Z(3I7d8+5s)?#E1LW?MVfziyOG4YX})q(oQGEUr};*B8dwFr1Jp z^;#4YAl=_pE*L#8F9OWa0im7_6y-SWOS13{O3LNq1 zlPjNQFYi=);y)V4UKU2eV_W+@)=tr!ERX!JU2!Qsa*AMbwDb_}Y7R<`iqCLH-#b7M zq)nTvdh(F<9^fH3(|HKxq_;)z;N{7(+WIMfex+Ddo%La^DqiiIf2SW~6|k()c=;V%7CMxZ{r3)dlKwEeL4U;j=!1D=0Jr5(VVXSb z@Kr05K^gNyq&T|;vGV!kjCqbkLy_{V@dy5d6OeF(ABnVF%yseZ%Lrcn{$}>DA=QTB zR9%`q8@IW3_Dsz=_EL%eIRR3GiXSca%TwMyxV8q^%F&Qh7(L@H>x4l0653FehZvB|v0NeW}VIW5*BZ8`KJPHT9e~$^5 zySRZ<%xJi7X++OC%L}L1mq&AmBK&n7C%o~bV`ROk-nAjajA4*QXtDBnSnNLEvk`~1 zCMn>N0P(wdrAL=ei#q_%nNRg?MvXgYz^G?cRdn}3;KGTMU_Uheh(XWWw;@co^VRZy(}6=K+7j9 zR_%E}T~vPD5CIW}d(hS=M_4BLY)gLO3u}|AWuhItUybvth4-PzytRChs0gp2uVvb( zfIf4TfbR$1!QS{hPL#Y#6v#JJ-Fc?c^;lEYFi|Ii-)eaZ`cV|sRj-2l+}D6}tOCsN zjOtaBzS*|q`j(tHk7hHKE2aT|MIbOQw7ztSrBvTHU|8&e`RU6wvnJYfMZ#Y9ZOf&#v?K1jkQ38%So!OX zH|mQ7tn{no3ePG-SA(YnZM~!}PD?wfZ*|72K0Dx*Mb;zp1Ev>S+bICJL?*sJ#-9>M z#L!eo`xl00>THje&exQL0OQQi<(S3fN{Hk-i@nbbcm8v*60{8LBb(z7<*SKu!wcA9 z4}E_2tjb&`nh)z|q_1Bd-)dh1Wr(-slb&*-!N%aTKjRWZ{>a6y&+?0>7HaDUYQ)am zC{z97kQGZ##C{4k!E(Yi8p(K6YC1X5z|keX@ZnKUPP1Fr;93aImr(X#kL7xYHQTUD zI?p#&h!e;|#R8ygf}#o|L~#v#f_wd4TvL6iiK5P4lgIt&518*vNGK{a3e9wm&UFq? z6cBgqH3eQy8NPb8yO7McUkW&-$ndIrqdwyEuB&%xj!r_QZi)jXyrF?MYL|j`Jm4?N zc33t~s+TsINuEZSIQho~`me@^v=?q!C&lxph~OOrz2JCXT%IM5_H$x~KC+|7Qbj(!@kWBp*rb(%42ZUOV}4O zx+0VZpQdCRN7SHkYCJMvqmep=m+-=8>I%=_SuUF)aK*?}PxUgTjwLn>Sz1@jpLU)8 zKHFG9gCPqVS1qHDeeb{%gfQoq(WuY)7HH`Ba`#(m%|tQI#EQi${54{ote4z1UP;M{ z-b)$)9vh3w^!8QguOyBCRr!2}7w^^I9c5*kBZ_Wn}^^DbR=F1`4F+L)gLGv zgifsZgTtHtC)Y?Fnckg>jrbcYf!I(%v8PX_iq!~YinJa{#~!oMnVAR7m5_$dM3$ZA zHiDNq5;h9fR!~Dtb#JSkD}8wXFPqJNS-l>bUZ;*>4IH+)#8Rt8$M;p$io&zHZ>%YJS<=%uW(&X&O@AoMDd)4t~XSa(*^nR`I)?q4Ej{A`<>k z(x*p+{q676`y-@*{H2QJwUzr}_zF$$r1y+zIW$+q9nHM}!Sd!+Pidz1wTJFS1z-B7 zCw4|(-T#Qx6{a9u;Cij);*PvZU?#IF4SmikGbNNKH8R=DZ=f))IAUPu)uXgJl;c69 zF443g$FjXl*&So6t?Q*cPy$fRX>|!g`U7qfYo^TtVF2cNExE?8x-PS?V6a?wlMv%f zuLM}q>$_t^GgZ*%Q0S(n;B_X|QpCyGDx$oXr(&!I}Nlh`Re3GP38UHe-3K>Kmr-t#tCUiygUH;>+=C>~x zi{b}JBNL@E>y=KlaZ3OkWu1z5A8fI%>RqPIchjTQISwG^nIuC}epDrMrCCi{aitQD zrJPE|r)s9gHr9T95>T{6%cr`F zyRx_Z#d6Och_j@E>AOh>Hx zN9wfa>pb1Ul@LG}o_BCw6e+2&8Z`8)oZ#Mo93-e7bsb6cAW{(HPcvOega;`@zV(XJ zODT)vK50ZAk7}Y^-AX;VzPzoVP=(eJh#E!s&As_!r2C$iy;Z3%eAx063gjA#E^8+1 zW}d7#a~|#{!Er#Oc;%HhjLkpelzRP^V54iT7y~hKP5k8Ui!&2kRrIZSn z**0!B3w-|~82Sv!?aPhRj?(7igyJLoc}6iM&xx&#FsDU;1}he`L*DT|V6e)4&YW&F zKI2bQ$NOSEs`P(dex)F;Tio;5$!#~7_jLm`=D^?gnYZFY&Omi_#5OTRJf}x?c)))0 zDExB{2M;J9@Nl5eE7>&W7^2oO=9hI*n}G zH~9`{Qj{W9D`>8yzgL5A2fn=lvA$)|gI~S&j!ba=P)l(VUJp&0N&^fLBT^+;JaSVo zawlPcKhjPP(EIv5T$f#%>ZM?6_uwKf=H%FY%Sc^eNEJT~vsyM(*gYnPzaOvbIO0F? z$@PqvkNzB6bP%fO;j)HL^X?~B0ZipT2`U8PIc|%8e=-rt1QF!`_9eZv0x&r2#5+5f z#Y*4jw%2#!-G>pQlCIuc@O+xLPrpJlY~l-u6c$r#t$OmNI_fFqcn&(EE+$M~NtJ;3 z8dc@R?Ij|Axi{CE8qX4yIZJg<3H5RacZDP?MXVB%&x5b*4&9jn5r|4boHVGuvmKm- z5<(X@kwqP0uIj#O#k3!@D&YsX40;TL$U!GDgY^=D8w)EQ_FMG~RFT9Nl?suQZdwo-Avh&FK4Aq0t4211s#$75R)^>!)u8`VJ*=>1=j&?C^1K_6A#Pa<0PH+ETSZCxbOCZSZQ5;~U&*Lz+bLm; z#H-qcukA)5(v=XbZO)P{YbH#TPb>S_>bqemphoc=?wGdttvlnKjkb2=uYJW%7FTCm z!+gAMebMkd&aA>QqW;vzCj7cQHuYXSMHsV>S4P7_T6r--WU}joWAn#wH4AI&lD{yK z_0<$TP)20lTZb}h4JjC3rtuIpoR00b>D%6$A{f5U$8N*aX-i0vpq(jOAzjFAHK+jlcQkdi%RZ=fO%6WV% zG0LNVaa|j`UMngdIP0?R_eqbh%S>dgL`xbzoF#Mk8I$Kn)tS<8z5L(3LCQv;cO!(vW-UFmwYxuU z7#)XF{WVyhm)`oL%GoylTY@)h-Q;4BS-}Ja>$-*($c_idLw6jq8W<|j~e*3rn?vG~p~abJ_&EEWCHQE~>W z>|R=_S*kNCc>z96k0<`hHZi8i^jWHvtbEje)`@-cn%mWQ@}jj>%_or$>i>TK8KoM< z?Ctd%o5!yQ+UdW~YgW6aYl9O(hS>cK6(s~9;CFawT^OM%?@Z=nVay7sOnM!8s&*ahye$}WivL$*DjiUbw?%3072`6Xp z=%Pvl&D-LKve$^#7d4hsx3l1E;234~bIR%Wo`tj{Rl_UENuTBO$}ncz5Rw({Gfy+4 zISAacCyfhL?!QVd)qR*E!2wRu=EX=L8do*P{LRqV+s?=1M zTmJ2%m6kHirs>PWrr+O<*OC83(M#5r|Fpry-1WNR=rg?Up~ih?C6gQk;mH4q$tQwj z9J+A&!fDYvTdCDrYv6GdD^@DIw9Dm_hJM+%S;cevCS8QfHyx`4Fhp-a7(S6wRf$w3 z%TubCk`Scwt7p0IgRy`gJ&ZGc%+fji>gkqSte2l97Ecxq`dCn_p(1z1u;&DJy76cD za7BO8sXK=G6?>!=Moelbu~H^pPN$wHC6(QNnq^7&)y-C+Aj1d?slRhyo(u{t9ds8C z(sc7g(RMf8QMlhEkr1+33sMT!GsKi52U3V7A{IWTHw&Nz(XoCT?m@c-E+FQ89aUlb zdiVBYmRmZKUl8rJ(^RR*y^*D4o~KJQFPT;0tv>06!lwML#Jr-+^i)%C3_WkNX=V4i ztSsQ^A-rqgvJRn?&O%7N5H-H|UD`cl(9vy?-Hr{U9RhUDHn#`wgDN($e(aSUJ4-O4 zB^WO0ZzuQ%ca#_0*%1Hi#!UYfKE7Ct11WbIaTvFMCaM&&*Z)*>ovI)#S5F2E60iLyDRXVpw$M!uXAjG6H8_6l zR{E)zJdWlcL`ANB;*}uTD!ECUJrq*Fqa6OY-4(}(?|B(sK$zbJV?CE?07kR1)~fSYgZZK?&$+$lA%UTlStZgcd)Vhgblh&kDp6} zO7W)44z zqCS0du>ga%Vu=t_k7=PAz)CJ`S&L=N-@9km9 z-A&ztsZSX5-n$&gY%5=Ual~+CyMl-P^<+ zb%{!jx*`s;_tvdGJvqx?+Rl_=l5J5|^1+m!R4wcl_8SY_)np)QFoxcJ_-$Ef*%;=3VsF@cW7CLZ)Vw78K zza1@fDmYDd`?Y$n9(kEZB%uE`sjzo`Z=W|~UOk$GCjqTjczC(5r>B3X4I@N6<-(NT zEl|f*`{{M_7OGVeDW}Vhxy`)7QDTnM`q9C8Ce`MY(Id9N`m-cgVXLi>+ypAURD>dw<02u!Cha|M4vW;cqgT%NA8F51TpUX`HDHboSX)46oHx35oN{Z`+H;hhKy z%oRiC!e9iFXPv;30rI3L7_X?UjM{Yx2_-fzXH;v~-l4$`@Kk4|pezt%`n9ms8MWmL z;|?zIYnGteXtGQwZCP1uXaP(5d)DPQ0i^6nwYpy}S4K^h(zkLIUWN>2=m(Ek37f~v zDa2Tq6q<5A1g{%i&s+_h>iTpEt$xq4j8{)ZU`DjDhyMw5=ez%V0G;D&dMb|1$+5k~ z8T!sme|<;`r9n7eh&7I@s2>yFwR5c&8!-6(DW0C_+PD=f>e<*cS7~n+&6~34)a|bsbBTvP=K4fq%J^FL(6Vo%Bi) zifYLd?a<_N04FePXJ&W{3Fd1AlxFOz^p--uaOkbic2F_^*-_iz=hCDh3kb zVIl4pyzhBd=+F`b)3_*15FS%6pYdkMUF|iaTfvSfUBSjgv!FjNk^N7dz6MFBfpDop zk7~}b=N5O6oe&kDJlA%dASJ4Sol+tSGZ+lA*M-hUdn~%5>AJdXT*HR}t;dLINlc9n z>U(usRsCHdF)Ra>5sJ7FBC6VufD& z{kLnqy1OQ-2%a_u=e5#rsKsqoK4JTEkA)7qQ@bV4KC&n-ZQl9&eJLb)ySe=Dugl8c z`GGsWnxXi*n-2Q^K~B{!Og!0ba{LI!87+;510QE)v3h z&-`1=v9XY^*AE9}WH2(N2o;XeI0}1vjk4G%r>oFo98y59er_Z`#P9X2VC28fZ7^=MKtDL^e1P5waG+Tkj zddT*H9ec})Vvjtp^XQUd#792q7-6<2n$#3Sl+|Jm6rp8H!6r^pgh2+sRd)CE{!FsA z=WbI5Q&L-8&pLTwwTr51qI~MW(3xLvKU)2Bidu;1p`9HTB8om$Ssse5zQn+nUz1Xs z{WN#vTRWuM@oBX0d3zi=c0m8B-@Y&|GZSZBkI*#a8?W$-df)XVP9BdVsG7|o*1YK1 z+F5m2YB#D3x#gzDMRfix&!NtU?_^{jAjNfyld2E|OUiG)tu0oavNdO|l=8i<+{q$9 zMW|F^djZJ|`cK^64i5W^zkQ<@>a40KJ-?dWqSl7b54<;=fCF-QTM1K*fE8M2SuAS$ zF~7e{<yCVHXT`UQi()FrH3q(FT~YY#^gOv-74n@x5mrUUj?6Z;MH-PyG~|}_QA%#d6oG2 zTzCQT_+62su9*AqH$OlLGZbG|6qYEg=Ek0Yz-c6C`2>Hp%En!06IC|EZb#gu^P@6A z)93Z_@`wxb)6p6P5N!+(p|99w6Y|um-4!p)9##C-bAGhvyulm63z8Dwa~H<7t1}PZ z^LLa=5%{%u`rbw?cTD?gNvNq?&xwo7nX~86TxMlOQEawQ@1kzaRtN_5THe*!Io^jM z;^vV2oQ0)^t_XXZ#pG~HLG|ap`e0Z|Je+Ufad~}n_?B-Al2WXCXvx24mPTePoLwph z8Kg5cOV!L0XrAg4H#TmE^yWAxr3X%&fAqE+?c8MnL}^ES=l3$Af3!&-wRnr_8V%fQ zRkBw*FLL+cW#dWLF-~^Z%Z{}tuovEY88vMqC~jOS98IuMXmm`zV|{R^*!q;J(9UwW z3Jq-+-$jX}_^$n~=&M;}E3Unq_%p8CwRf?HAcyffr~^knQ}C;~^u8Ss&u~2^wC1VZ zoA0rI*r%4d%fusyaV}&JY+U8+-?p}7H-weTNwqc|4Z~?Y;=TR07H2$G1NwaPny(|i zmScnkhw6sO&XE?D2(X+BRjWiG2vOb()kk=s8{jzHd2+5D;COMbRdvjQRM&QD3$>5G zhogi_rN)#cz{|)|?)^!|$#Ege8vi5*mBaYeKkx~=N z@LX>4-p_Q(5Aa+LPF-0DzQo9h?aGlpqf>H0Qeen^5cZ=SI9b2Us*Mfn=jPuqi#&2~x}{u!C?;sS-2p3cli;$o;is~&Ir68XomjQqrC7h(D} z;?LwW7D(0}>4y`>)jfrDA`~~BYIp=K;vC0g3xd9qdCyELziz#r>9Cortoa1uwvUv= z-fx^>sN=HfV?N|XR9{h?d;dl680sa)xiCZ){@l~8mN5kn_Mmh$JIkx)Gr34EMZE<@ z`tbwBl&5dH{izBPCl+Qds`|2_i=(lz471n)1Wc^c^CvZyw-Gi$LJo3caNpIwF*ni~2tkq321a z|01d>zgT^?p|t+tLs}=FdaH{|TfWfuJxoq6XCdKH*=JMQ0YX@}G0 zX38Ro6m}S!5S>;N876hEBxfYDE%$dLZq39YC6Av#Cltp@=vcf)oSLUt`Yl|nD*8BR z3;XKo+A4Lbb$n;!(vfsd^TACD^M?TF8>-aG7!mlB(Uur2FsCfSklPqD`dlihTK9h%{Kp;g*Y^mY50Hdnp zG_cGlhKKCs*F9dIp1I(DK=U(g7G`M;KX>xMugH{TPSv^~ ztwS=s{~1%&tIsT7#u}_p{w=q*VnHyQiQI{9klv4iS5fG7Gd~tEHD*< z6?5$zNArZ_p&%s2=5~zeJfyL~#hO#<{#V7I)Bht4iUSvx)8;FWOb(mCV9?jE+V6el zQU~>-^|li%Pi}UuTy6LK=JRN{cl2qYARHo{i}CHjy1`Z_=%${#&2>s7^!6!Wl*yVe zq3V%N+|-nGz{32Qv^gzdrXnZJu^bCC#IFu32#8KtoI!?t>^yr)HWRQ%DPr2P)+ThjM*6z?F^qyvPf~g>(A`=5;M86v!zxrTYvQLIQ;!v zK5KtZ&-=pIL7!Zh7!f>oJZAfiiEF#z=``JFHfXBle+#-PG8Y;)81l*u7~G{^yUjeh z9NrKL2rVI}|JZ*z? zK)=}})3Sg$ywaPz#qq`db8D)#(8uF(aaHug3S+=txYRf}3Jg}9J|d8|G#W9bHu-B2 zi(Sauh+8g~t1=7b!9j_QzOGAaZ-=8Is|&b?wfCAk%-^A}q0YZ7-(#ka?>^+9D32tX zLIdr={w)V&cAFc@ZBKN5Wzp)h_TydqE9MCuurLhIQwu2yb zYl4&S27`FZK2lGE&?OoNcjc>49b6YzlN}Ux6G|_@xk#!wElmDxw2X$|I zqaJ-#iZBU3nPidYdKgl%g;js?{I51>XIH&uSo?rMx0*`1`iF`^=Mqs8MAcrM50Pl| zWTTP|TnipM8}74rWceF=nQUf^4t%8 zZ?&G89d23MP-!^ia90WnkFumwQiSECs0*H@2^^f!!U724ud=f5P;|cO&~+)NV3#tF z!O)bXgZiY(NqW!yqcOi_$?Y>LsMYT8_@4#xM9IqYj+P%h zUczhLt5nMC$lZ6sXJMv2Hb7R;{+e8J`(3%V*!sqEhawyX5K z{Qd9uuaf;Lc4TbpP6m2VWj6p zBcZ2o8Ixvj^B?-)P;}X7(H7TM-u5z5g*zZ3z(TPwZKy2n-H{~Xz|pe%XNf zaW>}XvHv*j2Krb6aRT`pswnp1KO27o*>R%PV6y>c*qAprS}&=3+z*+<`E~DEHSid9 z&O3Ny!X=!RcekQreqvrGh*4T(-J;<&eq&6b#?pa#o|si|2bo5+Ejg@uuDs-?6oJ~3 zT-M`|9hnn`yY$U``>yr~y^Z7ENj`InCfMiT6oh7(-TjDf#|_4L`FVB-!&c|72JGj2 zqqmZ1pK7h5@Cu;-)RfyisZSa)s@pABJuMR_QS?(c`v*G{Wo? z(l>o5X`X%HlksFl_$hdCw#$MlY_i7ebd^FgzQY5RmkoL@2$Q&`TZ#6*_8|hISC%e| zFK9PaP}+U-Ww)_rPU11%QqIRCT13eYWAyQ&pZQIPjpL_c)!^%XUT_y~61i3Q0P;PS zm+Y7;21{Ii*@l0_@WpM1llgD5%fT)4Z|hgpJ8xKPazpRN+rMg!Ao$27f`UpO(1%^r z+o&jsc1K|kAtd&u5ic`;5bmDvcNly71|DV`=OjrbuIonWz500rsl1GxY53n1L!a4^ zC)D5c!Pr;2!TtdPaH@4o-|(h*m{}J+%=Z#VNKVB_@t5j(bIju()#~!{>@tCe37MY1 zN-dJ6W62T0+IM~jp~wH+|0dUt>p3-X1!@B_Z}YeJf4%_HFFU|A!WvD)L@Wi!J%j*d z`z;WI%HE3tg>4^oK}otIUK6eTr;*p)uYW^DW1;*dM3gnj~7SlNr! z)%G{IoHhT>F1!h|HWoWc{Cz|7e<(4=1Ss-t1q6WC?}D+@%V^`R;z9rXMwL{`d%QGxTNmE4W2T@|Ax8T%dxXK14IwOi6*Q}p(v-csge<}ls%ZD#`qZ-AS*LMaA zi25~s%Ju>tklrupo3W5vzx^WU3uHyLil(n@@GN2 z5@L#r{evv<#H~T-v5RXT>Zn;$U(X;g)$W~@(a%}L?K>jRNgP`%@#<8sV)q`)K(#;j z>PPyCOV>}o%R5Jb`Mk+@7r&Y7-Yu&KW;*wWkKPOAEUGQI0TXmqY}gZoTvP6r&J~WE z5U42BARPZA@7(G-mO;g-@og1iiS~mEs)&2IzJt*Iy>dM0BO`6S^$X4eiZa)Yik&nA zXgI4-nX8LssaQWWJ*CvLN~2{N;=-4u0a*4^{OrsmTE(GC+Lh^%F zY9A__d1p)@S#ulLjzMrkd;d(5S8I@i`01=?jerI}m>3Ds9@jkHE17}*+j$;s|4b-b z@N?fjmEOwmk}Te8nNEc?@Wc&AG>&ABJqQgEm{2WEXL}L1e+&wQg=uZIP^CH~@yZlg z7Nk^*YS`@+{8U{QTrdBB?7ewBlAeFrHp-#hGa`_ zRI;xn#F())V_%|3$x>#1H)t6Z+@T#oZNkM;dN zgoH9iA4|yLZoeqtpv|JtxhR$i(+-$I%Y9KmJt7fb@wKoQGe!()t!uj zyK$@BUc}B)Si6L4p}u66VrK#RU2>qA(P$2JVhl6e zsMN5BG9FVqdl0_&(B&B}6XV#YqSGXIrPZod(w<}BpT>#MW(66Kl-PPgiDxS~wfNe` zPP*bEcsYGbajJ5dPII8WQMJYaLmktNgn`=r-aN`n%40@cU!$qrPo<3f_7sB{y(&a! zT^VbO;yYZa)+@?jY-3I-l`nR+9fIKOqO49A4#}K9{GKv;GN_o9mrx@Wcf7Gu?MC># zWkZ%;_(-e*{i6$Bl59rmw4X{P!=uUowMy7kqvvGF9FSz+OZT9j_2@eF1y z&Y)OcBHKOEMaudmCvPCBpZx2;lZ{WEm>wm72*%L0Kg zJKW5}%yxw}dCaA3TGrwlY+Db@9jHbTJ5H3!RRo6A1B)HRFN9Ugm(z=VSO1pIWU>o( zwbqb1VmaN-vO0b|r6hD5DM*9BMU1H0(vsxR1MW8~1~tnzbSL)YdfAFRVsYphZuD@<(Lwhtc*^rSB_0>*!n zuyw+H6!Y;Zt-+$P@38ZugAt%q1_zIMoS?G~EtoIG&pq1d$WvG&-SXb%$S2Q@wK$A# zX77_=MEtjHdsO?H2h^Z%0&UdRM40#QLc@YI-tK-v0dsqEGp{~0LthaFBMa7zvpMCY zwPL+j{{3H_wsET#WVj+OeI$IfmiJUF_fa^yMbs>@dc)!s?!+~OzcTuxepphuSG12G zqUcH&V-OL$bJta$yI==SLpscj4G3SiZF|=CV6ro&1I;)Vu;&(lx42#gqq(^aQ>$-V zZ*}x_$NSa@`PMa)?G#}Ere}0nqT{`FQ0r{u6&HO#(@PEBv8tMaA(F_ zX7WC2uc_^bMHb{lWa2V2pcY!4sfiG%xfyW}^-OvoTesdrTplTvc1I5*Zm10VEZ{98Zp@CWX5*Umg9HcpPi z7My$#yI(yZKDr;-k8cPwxhxZl{tI4S6FWIi#kKjkj)z&DhRU{!l3OIZl15s1fT?D? zg<B>HFq!_;q}#`*V?hW(%A%iy@^`o`(q1=rjazhcZc+aZ?-%_5rb4PdT}~B{ zb>7zf!O#F*v0OaVwQXxnH*zlndH8!e>s8QVxf{n%+cHqu%F+pK#9oj%K9KZ0bFmQMTAnpp;8C^;+x)!e|Q{Gf!GjEqBKd zHQ#gc`&S}*lIo_2Cu{#TDeXPuk3O>&zZdwT|K}LyENtnTKi|u_8LxB}$is%afU*0> z|M8=LJW1J3&p;(SM>*JY?Rwu=Tb)lBtn8>m&qm=guDU>ct8|J zf3pYrTqaiS?M<*l-^(sroA_F$=OHwM?8+H7QB!ZSj^~+!O#vee`miIGh%xY#t}+*Vm1;nnTFEzT5|H&wtt13lQpEjvwRy$DY@F_`oC5NY%B${B3%Z z5yHq9cNGGEg1csU)JwZuaI zp71>nENZLgpI1*a`Ra!vcCTL`L>bmL#5cYwmy!D^e7mwl($$5BY_hNu_+_UIOCRH9 zlr_}g>|o0nm5f8G(!qcLaj@~C+duCC#0^2q{&!&P{#g2j{a-w>U|`yFFb~n0pg&x^ zgvjQbz$!f)eE-?!v-F4_JOVGJzddNDJ)OGRF-C!9wc0rO6<2iQPAKK{wFuKeKOK)b zy3}sIoAU7*Jg>6QEIVD54e0j{>eQ5?y%*MsduXUls_BoNxf!0q&Qcqm+WYldVKufZ z+O;kV9Dl34wp?2OZ~SYDlzcRZm3eVF~;k#;) zxqv?hF-S@}eJlP*WzbWT86vPj_*d1 zlV^4B(SxCSXB6^|9X#+Q8%?!|^E~r(a$R8RD>?*`f*O}C{_ew+&qCB!bGY=RR@Cf8 z{c%t2d`>_G*Ud7Ts?q#eRsZwhfl~O|f35fMyBdTsweGclZ(EGSJ9u=wiW9a}j z_P?^Ahm#|m>m*%64${YZqIi)^KV|WMD1$G)IEo~sKGT_~LFi%MzuchFi8+Jj_HM~B zs2wC$_J7^=DU}@~2(HZF{T11&*=JsLPd%tOQl+HuGw&l4d~s)Ba9V&sjWX)v#`5a&ualhDV=aF;%G|hg1j; zokc!zce|=tQk!%JV`R=XjA74{bz-8YF;B7{HtBQXOyp;iNV=4T6FEu+7Fk>%`p`2{+1IlRlsACLKSvt?dgyC=xc1LMg(E>n1>YWM z{O9(f>m$1AgT>!E&0qHZD=cvI>3Uzr?|t@yxe%WWirL)h4As!YR9x!CLwm?O{PzUK zr8M=GojzZ}MFi|Lr)!}|pi+l5cg(XgPv)9x+7Fe&U7n7biw2di9i^XkNo@OQnB*^z z(dCD%zgUKE%si+No)S}^I<#=v4aV9er{c7^hou81#GM^(Nf41B}N#?@T zMT48xG#ZD^lOWJ#WSk--}a&-)S{-vcLD2&Y-72OW8s-eyN26W0l%J zl>e~VZ|#TYztZQi)YVtJMeuC$M{t8>W$18E$WkD(u%)n#WlnDCgV8P+4kz7!bo~!C zxF3?Bq@Mt~QbC3tuPUsAey~>bgJQX4IL@^QI9HD2eQ29+In>tgb!CfT-qff?Fmbit z?SWq$+?{RE3ER@wMxkq_=z+kPoE*=|uRlD`h|#JVBMzZ67*mx-G6S=@H-C+KlzR{r z>Ji0rY&QbNj_5K7pOn?8?L45;A~T!ItpVG(wV5G1k&sgu{Z^K61LXxF2B0tcHhDca zOEc1Xm9CYLM`6^_(_B{(jq2!l2vh|ZGt{y*v(tC^?$k?Ak%)W&xftF5uO+y#qqE!gx@#Jp#7QZ|khyi-${zUUK|LrAIHg(<3e?SVEbMx}Zh> z#2$WK8F~i`*hH`lhlPP2l)ip{$mfMj80k(=6>IDA-8Y`@MWtS@*{S8}TFpz5I_%RZ zl|$%SJ>tAy#(uxQ9aoq#Qb8Ch4J^5~egaG4r>=LE1AY9J} zj?qcA>1x1{} zNEG1z@~Fiz#E6m&nl(X#_YGHn+hy3XU2GHgCEcVZ@@;&6T6d!IFIEl_V?D#O{ zJ<^eQTH)hi;N1Q9vcKt-=>Y4{-+Sj3eUvrRjRU;LXf2n`HpZsKt!Un|ws`oG=3R~J`YleYJhv-4;pmW`h zj_49wjr9WhZ`k*K7Gg6~=f4|pdZDU9Qva1lG~6}j_Vvgsm|zLw{kX1%Fn~0}S7ryf4L%cI`GSxmXWur=6?8U4#c4nhvpFxz| z{1-H=_&}r3{#)0DA{LlTp*A>DN6gY7`mDb=*!@!SPsAW@_#1`?bTac^WDan3(pS4UW@1T)CmM zdrOK=D>&ayJ-X|Y3gm(c9sJ6tyS3_n$7Py z`ej8vS3haP$E@AP#vDbJ0+_4Et%g#_;+~|j9YFV0tB*0%M|sm$gAK<&|NRcKA6324 zpAm+33Vk}qdfaM1`ye|sc&K$Zld0c#ra=CbvX)HExQ!$1-$2)Bqym# zwTsQ^h`&Y=KNgXR=&vSW+Z0KstAO^ zHh*CwNdIeD+}b)jON)O`&BVi!mt)0uxkteM zl9r6$Fa|Hl=;xXLwOZSSDVt`ygxyRnT++KV%Y>#u?R+v8M@z%VoU>}*1(9%Xg} z+8oBSsGUnCT#!Y*B3*zerW27Jb-J%(_K0>O1%LO%Innf`bau%ZTT`dM`a$35=vqWd zSeA+R=SZ7FyBiHepc8j>nz(SE*kI}FJo`}2tcI8x4SSB83lA8-#Tq7UzuAnyMsx%7=3a9+ zNaGDlT^b4Le1TaR!`<*k*(0l4@kL}lYUhijg8)C-qwg=7peIK;KLtSZ$4GYRT3?r* zr_186AFD{9afia-fh6+}$Rxd%wy11%>pIAolHY55rDy~Ag%HOd}NS!P@&YftuyRX09R3Egc|Z8nV7iJf{!4j zBQ`Y8foTgsur4apg?83h+K8Bx=Gc_76%Xi*U&^(gFIl;mtF>~i9%d}4Vu1haz4u#> zl7aL~nyr6JUj&du=ne?I49amkbES$f30FS!Wd+E#vjO%sx;uj^UG|jRiSU^}*C3z#j3pCVTTK4+6_QUlaD(dH|dh1@PYYSnGj5$K2|6)f`nipxLE~ zRl={=*=_FcP@ex`_IAwp(;|2zY!CnydJ(Bpwwn| zIds(I4;&Y9#9({oa~tnhlUlZO3=BgK*ixDTTW*)mXI1Qn1$%}gxSkA1 z8roo17qW7mc*bGbkP&wqw1C_rv_~y5ox!Ynky5d-Qg&!*iC*DTKg*!;Tkmf{c4hjQ z=OpHvf~ef=2@2i?*o*2YPrL_xodMKKr0c!O&#+L*z7|ceL#ipQnH)G%t;D~Mxj4AwxlK=4$ z7&}=H96-Z{v{!&Ump$3>b;UE)D1YdoLwfwgegfa{>MvK42l*A=cJ|0*#uix)3n!ZR zEUWQIlXsPCg44#Xl|5hLODf%%2qkLS*@anNqubO19p z=n40xh^)RM%f9wQUW3s8qi}5}Jy~+rNUC9MGLY{{sf%TYyZ+1NHLBeGvb8FVr%flY zPUbuMBf=cOZyQTEZRPP%Ex`g&>}SI!I{q$`Fb?UW>?bV7ymgG8)`^OE4z{73{ra4i z_ogkN6e50D!$~_^tXKX|{2L}wDj93)Q9JddN(1w8M8Nu|4TeukOavnO5OHXbW>2_N zV%Trgi*|*D$GzDsR9h({kQ-l zh1ha;(lW{u>zMZhPo=Ty1BuFxhi?Hvfb-LZoj61!=I5Vjmxp-R8vPL3)W$G#ey)4h zXc*>8lCd{Qy9;Jsyu2m9K?$E7mQV9q9ktQsuL-=}#*JnWi@3Mi@-cDIzaW^o6SuVK z9Sn8%gVs7W$}tq3xLuXwm-4jj=z1N$>pNJa(Kk=YoNS8(;NBCD|umgf(<}ybvjN6o``9YZ_6BUIXNm`#*mDjF+6P^LZ`$nbX62Qc0{y+dqoWpeG zb-#SR^xO78uD1xk4#QpLoq!m=A$C`C ziFFE}lKlq)o`r$zZuwGsIen%;B1*X@V8dK0f3oMLMA|aLwVHVL?H~Vi4LK z#Zwp{7Jx3O18BMv64E>G%01FZK%ECV9nPmz)^V$6;fDi*ImJy8bJ$_*S89p*&8U(o z@7~`%1!Qnzgf<;-jy-&wp@9|bpwCm_(R zA(l_0{IDj^{S55$#?U-g5iVWYBUz13O>mOMIAD_!yK|4>kE>>cX;@aexSUIj1_hx% zF)Sk%fXM=ukOPEnBn%;IbRPT3cD%$1dXB3|`BA3b?o>Z?k5AQOwff)n-=K{7rI+l zrYAdJ_UZ!LDHgzjL{0;m>#!b2;+?WL)Y+Vb8(6LhjzW@vl^R?{PdXn$3fTBcXri&_ zz!~8NyVTIM7iHHcuQe0;z`9!B#PF}Qlt%(;I2gfnw@6or#GIXZgd zp!-9&sI1zk%hTh@E(0r=5^M$`qv4JnyAj!rr)KpNAS&Rkh?jXt;2m6K(7-%&%rA4o zVBI{6-&ykC>sn`rz2}*JMq_10sPCE*0Es8>HDW1 z*)Z?x-zL>9S9tzW!VtI_@y5EDSRy~T;Jo24S*Y z>gAvA_pVPqB&&%Osh#TUk=6=daxBsLXFnlr?H_#vn=(Eg?~(Q-)#dm1&$>D7=i6j) zPqgJ}_1biENASx!dTMvRaVzah1SDzJ4Jld`@}4^kq48$@DGsRPgVdaq_jdBy8OoLr z#I4bdwMyY^hLpvbwwhQGV|xyOxJ&9ldU!QpE&O0DD!@CniVuB&xTFDHHs`td?vEeC zIj6ZPU~;`G>l7SyTttd`|q0 zgxo}C*4V0NX-B2l*f<0zW#fO*8AcAQ_JEO+PSCS!e~+EK^RlJ)&e)-<`Mj4BRL{Ge z5v1H&4QLqR{0DBv(z(jfHLD5R-?;}ef8FBG}+)Bzh$hT-mu&SrpT)VZ{BF{esKt=cF}%271o+ ziVM* zr4V_H#mFg9irRxNji=uBgRO`&)=bDRzovQ|gnW8XkLAM7wA4PU9%xL-c(7}F-Rjls zL#lk`GYEYaEklv|LdYqej~kmvC?GyPqwb{nGDun9P`=4pSLGcVGXlc#*Mh^)SbHj1bq9$E#t5>8j4+F>?A z`YPn5Wd-rSinZKdb$m{5JXK}DWE9x`u&iz<&56W0Nx#zewI(#hf3&J_81JD(ckYxNDOP7G)rcbSbOE}gnX#6u_ zrEB5ntt0_mMy!Sp>Q3R;@awd!S3!)mfQyl_YVj>OdGhlIK&HjqCG77)i*#B!r5D?f=sc%2&m%BK4j+zxx`r*QBK;6A zEhcBqCKmf=<2_cs)+i}ByX)z3AYL?|_9ep`zF{@V7^30EDFY{M zwTjC{jtJ8^>?`%9k~SkDJh&?_*6{bCs~Lgu#iQ!}y8~y-CpzyIQ2Mh`NCezbrhHAZ zXR}87X)keddN~c%;Y|xeXUg3D$*MV>^Z@N*26jE>*qKFP1aZS0R{MA59U`m}ns<^T zFLDPXk+f)1nzfb~C3zkut=hK{de%*QTK)Dlshv2DTJ1qSW9cVH7;|Qq(k}Y}Z+Pvj z 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 z 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 OpViPkO*(b$pZ^1&BAUwp diff --git a/example/game/easeljs/image/spritesheet_grant.png b/example/game/easeljs/image/spritesheet_grant.png new file mode 100644 index 0000000000000000000000000000000000000000..b80fce19d6953134c63d99a42e9729f35a15a4e5 GIT binary patch literal 105262 zcmbTdXH-*N)GbU^dJnyY&?8-X2k9N920<`@w9va0sfv^U0@9T#B{T^kR0WaH1?fcu z0t%rhRjOZn-gkUI?vMN9oN*qIq9DClXJIE93Tsi;{* zL`3MA+5cx0-{t@?-lk^xH^jt8K}ko&1f*qRrvq>Z2nymy1q21~ZE^}aGDHl z4Fjhz-U5IfZ;muM5`0$7{jI2D| z?7W<;)Bqqa7aP8xl8%)Uz{|_c&cprR5Es6|g&+EfD(2y2=jCGWY<;^si1<DR55gt*O z9*XNN{TCxMBRw+*-VOZq<27jL1J;eCA1!Xi=+g^htl;pI{VD45TaymvTVxoMUItrqH|Nb>~i8z$^W^jL?Dj=mQ zDyJoXho4VeRZCX*0E3`q2MF=9yLx-@i7C5>#k2AVa|uati`?ZEl@k;c25^9=n0Oi4 zc$v8bK>YZqKvWD|46NLAtOAtu>@rf~>>x=Yumlqqn2Z08o`xD&$xu{LkDZg3gGYdc zo!i~cOjKNEzA0PiuGa4fl!}pUwC6)vMO6tI1z#sC3w_P4&Z6bkJXsAxEoFuG*-;U0 z_D+_Ds`9dL5(8s`yk7)9#+1J>uzsZH7_O#k(p#Kp>gZKa*Va*y^9UBMVEkCe$n;^< zTWjB!>%A3@j~)ibXV{qul8p2`W`r~mQFO%W|-Z`f<9jy zOcqDj|0q3}nDCrvjG362u-gQ!5D?}i8r;)-5VpAc@fjYIAok654NDEa4*y?|N2lL4 z{+o;Wi==;G_5XY%KJ2vd0g;tUc427(o^7MZ8c2X1Z3aRB&*=&ZvXyG}Z~@x5hmSe> zOJsgTy}Z&c(HSjyK~DdFKRiwzztt3jR1|$BGPrlos2QQFuUJi*_569R3nUF5U`mP2 zJB~tYic(@xiMNn<;P)(N>SB6V|29N_yL9pxiw7STzbRMAO+5n+Buu4-rAl>9#zKeV`-GemP!qHYW+g&1(PEQ+(Q4Q&mNuKGlz7aU`<0< z9jRp)y@oDOdD)thpCxu?-kPNX+eQIe+9oEqq+S@qyMZQ9$vv;&;uAAn-O_)lL$ILS zai96$QFxp{9bBCmRh?Ly&Ee+m#^f`XM6$>GhY0Bjv z%7V2ob_*ZFgNG!P*#1c4lZ{jDT5%$bFg~ETQ62j`M3{!m_rG>TO`;;ZRVDyF1(B*+ zdsov7cFA#9tO3_N!TFeF9Rjw*R}T0{FynZLA=2-T7ksg)T897G`GL2NC6c7dH}ibf zx@_$Xy=>QvTV_}=9lI~v6QopJRU3Vm(pRFqHrl0_C-;D zk&>Vvoko|N50T$T??rTv4rD5tvB$P5MAczh|GC{dKTCz}g9tO$G?Ov^=jr!WGTw4H z+kb6dWDF<;CWvJFHsLTFkf zEw)wzs|>m{{xn#h-EcrZV5C-39`V;8$STGSW#P|Pe(~W^QBw-J*JNsHr|aBPvk{G_H^Fs zuBS@H<9SD`lH8F(7i; zS8J00qxZcfbJoIaI;LYKSh!T@ z_g-f{KFg7DS2WReHZFSn;z}jT1eC@E0~0O0`!9KG`k(g8dFgc|1KKdb#=t;B1y%Em z$M2Tq(|J{~_bGU^#hEEVE7o*bQ}_rT{);Qb2Tb(hUy|_AzQU($FC|u^Cn|l$q3E$r znv)y!FTU?zYL&n`y!4&EN&5HbQxiag^h_OlA)Vv2iKE??*?BBdC)b0}V!3p|faU!` z`0tAg)zSj}H2gFfZ@g)5HoOFA{;_6Rj!zvGUIO^kT@c2`e`*Cho3;}nRjh8i0W54j ze?EtTg_1Ga=}1mt^xOC>LSYD>;+ z?5z^CY(R8p;&Vlk^?(Fa3Gc=O@Zs~dgSUPU|Ka~9O6bA=ABg}k60er0J^r1P;Xn3F zvG_@8SF{{Lp_o4h&4&Y|hoPg?*xzASfWTl90}y?3xG%mg==DEs$P>K~j?1*vw}eFE zDS$#VH2)U?FJipx@mb@q!skI3FTHyZ1I)`68;o*jX{K&1K8ybosz)Th%NY>L2cVjBJmgr5>wziA`FQWZC=+rub#7h9y22ivNYe0^WiT z(Xdd{l*r=8|Kagh{+Ihp5PjzXZRAuY0+2TW9oPEg~ z&y*eldIUdQ!IR1k)Ccp|)5o=HDFuOvL{|Ta^50qCzk!Mg!-34h6+`)Vp&a3l1cn@mvmA#DEt74 zw_=FmgA4w1cZ-$ug+i3(1uy--v$n#xW4jtP2LB5>{ZApcJyMp#{~CYYHG(HIRv7D7 zo3Xz5i6_2!MYDhp$wBz+6W&LU;EROJ=P*3vQkur;-fRh;@k%^`F&;q;oTJBQTB^n{ z`7e&@AoqARb@jX$Y4VKQx7e^XQaHTad;ci`MBKKOS%Cq!S4=J?=0aIpgU^(Q6isocgrVRM0u!RiECt=inmeVddi8ey3Vme!$4S=I|EA|! zmu!kcaf1^qyVo4$%S3A#o(_bA`-+W8EMwBQLCMZ!()uD;hw6j=AHO}lXG@|scT%uj z1l8%&>i@D32};fX)}(N$=k^Q()JGPDUG#kGc0BQndiv^$nBbX;sOGJ310YE_8vdU& zess-Qd>#q$?N()!kmxi^6w3NSMuydB|EsH+D>rBjUQn#csPA)fB zN>`7%2Aq^;h)KvUseez$6U7V7RFC4t@?q-kYMH#xDWT`W+F@2TJ+bwXT$QS=%R93- zjI{E26^%>bmqkP$W-U1V1>PDt&e|EPfsg($rB_C1qWNaLW3wgHOJXh;a-aVV{(dI0 zckCfgM1)oyjO%)Eeq8a5i~yVA%z-8g_;w6a4X?aTJlTYyPtESFM1pcUb7HS_{~U2V z+wBxn8x+PYl9{b6z)xyT@=dmSL6zxO-_p3yWQX;m(Ty7tk?vpZ^#FrwkwClGuLN6l zB*hIo=~_HIx1|-7W zR^l)(;R)EJLi$+&6A4AyayJNJ&wy3JU4EZ=YbD*;S^N@l^434ye{>9?z3*H#)>bfM zECBNLqR8qG{uX6{k|iHX*Iz0~z&^RlpuF@197AVB&j9Cid|RP#(RP|8^g?at z=gM3(VngXk72xM?gov3zb80)8h(3)(a>i-{Su>(n0I1k*IP{29MzBT1nIX%bq^FHy8>|Xf`!a77QMa;RczLB~*_5oxrT7wyM-K&- zPiDNIUHud9c=+yY>{2P6)Cc*y9$LkxSVwm7EGz|{0+oVHon|!_ZU%mw$lp?M%VVeV zd}3dijU$H-oQ(3{j+ZwadW}kBfOkELxf<{J9v~sd+RAG-^zr+kkXcW&wSY%e7Jb@d z1O3CEb0V#c-wLyQ{QPzgvfA=gfJu4ZT0?G-H2V$7%Ov`Bt+GM}YYvaE#fJI#d57Mg zw1uNLM70>Qo|;)qwq?C@OEA#)q`&jWU1b)`{g9p^o6{zX-f922fKxgp2aK*T1`*$h zqi*jM_Zib;FcUdg9FaTqDd*?k^p2XJW##G3hLapDruet|m}oKRG*vEqZ6O=gmQW0Z z{IxJxGU{>5ZS3(fSesKyznjkXq4icfS{9=_O6N0=+~M`zh@L3d1@vRPDEuR4sq>pihYFGXp{>r1r|<7(L)1@ z6DtCS@)PTHCr!w+;n;->gjgH$3*QHYT0VXt`MoKRL(ljC-FYK!>X&>3&lhWnCjr1{ z1GN8l{WnSNxmg>IhqAxN?H&)e5H0&WHh{6E}It~@~Vhin#0_OW^ypLaE0ChLmSeg7)z-#yeq;q{U$@3<%s^)Sa;`fu&z z&hUVyzFby3Wi%O>)0N&O;>uLZvgrdP#h(5lWFv3+`=)a^ ze)yWSyf5G+)}JF=Zkv4YtOBsRw}(}l$I9cTHp-_t3}rV}ChfP(n9%90xRw<=|RZC`(x zom!1B&>!!vHQis0A@BtI&MwVzsd55YK zyg;??u`$*0QUb~CSG@jYN%z*D$CR!RJffViWn~T}fcakQO>RO(zx*>6hw21+q%7$W zkc4%HK#0uNI;+#{8DR9{?mb=rh_|qNx7! zx%sC+qXC3mtQ#f~KHW;B;NkGn@$f{_VX{f|Oo(xutg-<)=v$HF6GcVCIY?E*(=gXU zQT=VZ1&Y~W$Pi6{^ohP~^>paf6=k!+7wI$$Ag)bL05s2N zs(mO;@`>gr%2QI*%i=gI+5dA~bDNbI<+=bKFsJE5lc)-{Q2#tlHl24bbCJqCVslZ6*3JiB|;_6J=qM2pV|>Fd4_r# z^}Vron`^U|uB*Q{LXkS8B~7R1MZ#^hyuxLNTN;k1P^o#O`I7HllX~l$$}tT~tGPIo zS`8*DrR;ennSnmT4}EPVxxwZop&tL@1gup-m>yT08gZzLh}LeFvDe9BYBrW``c-Q; zw)y=Vk85IQ0mhQX)rA@q^4(%bZ?BVAos_d(e?IcgY`hA8e|&J9a_u{>zP4Wm-_;UJ z9(cHFPf3qPO>?LR- zkG>2#x*%ynF#EVNUae&|`{L4#dl2Mk)7E+#5SDjA#da`}6!svs*1$PDC}^qpzJ~qB zx5W8@)=MURZ3Qr+-1_#`I38iXlnC4&;c^uHznaLR_UC^v-L{h|8P_HVJYT*%8PDon z5{`=s{E|M(fBw<#Ym{k2FuhH0m;oeDMP4C6MZhTnHYVQD#@^q0QK~f7w%>#}%!`O? zVTi7R-O3t^50+0P_sar_cC_t0-=Yz1K_oLho2un(Lw?N?@XZkd+|hZyZ>bMKTu-b- zN!(Ak!*7%uOvBY0Jb^mN<-l(Mv{@HD52YHYM%vbCZ|SrvJ<)N?Dwy34a>6Q{e39@g z5({_sQ(*m)2i<9JYH4qOoroP7M?~Sv*oSoU)@5X@di*INOrvVX-v(cRwDgqAyQYyH^Xh~ zulTO6R^($CI>hb#Pb1r`@)8H=5_~olPCvg9V>5Jo|FMj1X;HW@nI{^vAv1Rifibeg z@6jx`-;UINJ@yrtv=EqR^#FgDhsR_6#}H|8AGtkpoNOAsajf5CVk-a`jz5dmX*j%o zs#k}!TA*XqGd$LucF8i+sv)Y?WHhUC48EfB?sGhAX2l2Zpx552OG?eBFXS|xK5k0s zc;I>mEfUg=W)Fn_W(vAs+AsW#IYrPaPYlwt7;eER>)y2H9PR4TFFNhl^XJd5tccjm z5t4WadycgwNqlMb^}3ZcD1(wqkeiy_o>po_Ts~4lAcOnb9DQHq{B+;h0@_)Y+ELOH z2+pn6ycN#%A#FgM!hJx$OJ-&Zc?ciRDv8{^M4#Wb*5f4tZg$54b8M}vx+8+YCUj`L8apU5nHm}l_;fjMKUe-pYo!u0lQR!OFmSzj9r z$38H3;=ik(+$a62YiEffD6vdR;L`yH+=`G0wa#)+14uqtb#~aa_K(ZZg*Zd3vhq3~ zLa5(arz(qw7X^Cli7rK)jqrF=R{)yotd}TgY;Dz%S!qz}tN0i+>ipyF-Zdx1wb^+6 z8xy^}8EM3$L5kZx9Bk5of!&@sLmPqcww{hFkX~4Yf#dyl!rHdDJYlUo0k00ptE#)4 zU(J^;TAPKQx_-&x6qrNHs0i98X3{Yew)QM58kEQ;`FDeM<9(dXNWHS!vOXPLshB}J z#loKk;+~b-uF_R~?Jo8``{$XT`*n{OuKMj`vM z^xcm-J7+j7`mJp|{jPTqJMO!+Y?td#NiH}yJ@zG_{Pt5d!i5=x3JX2Vg#EC6Yqk$T zHj`SrGm*@Di>3wutNhY?ZSCzAwRM%s3xes~8rI}iyCr#)PBg;QY>`=}m(L>KZJ*KW zz(X~U_)$T&opD2i>ah#6elwU!gk0Y)93|VwFl}2(c4JmT z*A&ySVtQ;!cM_I)_?!5qhJ4dn=U41n@(X{~L;uRpLEsMb17JoBj2iVV=I`}5qDYAM6NXwPYpnCVc-22_kWyoV5;Q?)ng)7LSHJTQIo)i6l5!6@RIVP$Z7a!=+>iR`fpnO?`AzRSPVg zdBWsa_GEe3%tgz-#k*rn5a0xK{!EIbl?WLKI5PWu@bNKTMSyR6*tO9$F9? zc}Y5f_zq6-OqQnR*u5c!yR!(|vR5taq;aq6rTIBGYPUSQ>p39HPn_#z@p@J^NU!(c z0n@hi-LsJ>0qH4(0{pH4hTJ7jeDKHYj9e-KvcvwidQ^=1)%wffO~C`>m0jM4ZWRzI zLvkQ$k530G$&0jnm8#J8CIs9Q?~t7coi5~jCl%*$AoMnoYk$_9u_P$|;W}JyWOsJS ze4UV|6G=a^&DR5jom98#$Ip*kV1{ixjfs+Y7ia!Recmmg~E1ph6%5A9> zuA`SE4EL-ne{ppxJk%dvE}*5rq#Sn760ykP#8RH@leZ-bP_w1qP+@5u)|^q66cC0R zo`4|cSE8?BzO+vg)l4rHkJZ0Q8RqL^j>4DfX=s38_?{0n3et7FXIcpP>*-fVhiigl z#~0n9Gzs+Do)tSXNQCSOb%(j`aq5IqyYD#W04sO~DIExh%3mF*zgscN#U2p({< z$cQ0BiSpy!I;Rp{x!5y0DKy!c6i==zP*Iup=cHrDhpCZqDdw**3k(s-pR+E;A56d3wlB80dKU_6?3E3=$)@YV| zUoJ>9|44RYe%q|{HKs^ic>;gmB~$D}FfbgXHI14&=kd{qGC2Zzg$lp9+;R;Zw{L;N zt_H_w_4{r6DBB*F8^aPRfGcJ8xLKi(KYraaXg`|#Wv32+cdzfUT5iP*mg7 za968gdvG(v8r*4>C-Uq26O<=X8oH^S8@nqHji1_?o#r)z!o*fOC_#7Ul*DTXjq40I z$wi*)bpYU~?nkG>zoc}OChcUk)HlQgEsA970?D;^>LXwX(X-<@S{XVv+rt|n(KCH57!Qr0gO4*mP ze8cwOK1%RbcuSzyT*g{xRmzMK_MV^-M)JrXMI_Bxx%{_&-AC|>y!-je zvHgeruaB*}+h565+-bZ$cAc8z^-OrPq~~`UTn$>Bh!;#5Ow4b0<0qC3jp6u2$?=ua z=NzVbQdn9=A21MU59@l|-vADQ=}7Re?99&j&IbkHqN4=z4XF;HKW2a1Cx=~Ni>vIk zXwX*YFfQ)OM|EZ6w;Qz^3Sa3q@+~4x|Gssf+14ID><~9=-`biXpRFH9Y&5uzlT2|~ zmVd!79zQImwH{#_^!nY&!*9U^WJq8F(2Kw)B!(ypLuR;pS42KdT~6T=dM25w7JUFq zWogd|1yz%TyWkf;fHv2fwH=NuG~JDS;UfZ))|lpq1aHB-8Ndurk1Ox+x`ubR^!rku zQ%RTx2{B!RL0DqDLG;N;nYr=c@5^R?=ETk0=!$wsz6q;ljQmz&qMgRYru4n-@78A! zkKNtn4lf`vD!Ofw`&$fCFiuMgE_4^AD{6sjzuy5cE1g#?5U9Yk1bJP0l?!pZqi^`~ zzJ^=qyTK1FsFGJ3nNDzH9|>SqTiaf;eM&K7^iyt8?~@)F4_XZ8Caf&x!-iNf1;i1#X33Xj_7`(X^JF^x z|0o|GmFvs_4hV1RxgOr=zPHT`l#YM389ce%s7E$qZIdAy+&56TJv!(e9vYtB;4o0y1-?mkE0c39S*H|E8gD)QL5%L4Nne^VzhXb zsr%jO?LZ|b@S5v1R;9&n909rS7kz!KJ?x0Qqa@XTfa>Xe`Y{lJl%jhTz3pEdB z+~Tlh5*%ZBEjhe)CO)d+`Js}y1j5ms;sm6!atnyRmqLU<0M-4<8QX(j23-7@`+J)= zub3~)!6tW4_owWq&K&;R7^EM}r!VT9(2_zwe5ao=WoqBrRCVNZS*ef)Tk(5k@qiMk z>&11P98}l!^)9~7UiKl19XUMEJ+lgR<4jXda3iYQYET`;1U5hO+X{=Yg|#Ef<52w& zxFGvf0&nBSb zWl=mlc(#I9DBZHezS04l5`E!xDtfBJr_}!MpoEjq-ny>uev;qp3rWhWkoOsy%pr!BY)CP^ur}Q7Rlug+fB4-$GSheqE-9?FSNShuf1m9W!Ja0UPS9lar7k^E zIb8Pq{$(-D@3XCPHXAl8E9Hys8yCA#vZu=4D_h_4)Z%*YhL~^#)Oa|Bx~@d{a9TF} zD9A4?gya_&7nhbgJ@KzIa)A%-S_71!PCdJ^G>b{Ac3LS#tNYd(eFz{{An-pQaP_vR zfb%h}Xjiq*(W`Dhooju?TVRPP=k9^=L9or}UGekSw>-D557q`JWpr&zIQ<&3LrGy%8?FT=Q5m{Cw(S4vz8E8KR!* z2rdNnzUVla4ka{I=2s;yW#e7S?f6IxdbDTkk>y7*pUiyqvIdkBUI?m|T za`oHeg3otmPN1+(#L|N-9_Y%88Q3-YMzwtd0Ys$-j+i>aZ!{NqmA<>XV-T)Gu%EZr zJ~MBYV1aYx1Hs#~45@D+go>YW4vI&nl!vy{hW^*7J1;WOD~Q=Op9kX%En^5PBv4m` z9%Bjt93=#82H!nfd+QBT?Y!}e2VL)sIsc?(I|89KPa|ZpYlNGNrMm~3Cij{AaP4~i zKS)GOC!eE(joMG1FRfgzbJe&C6f0m`UPFvf+@DtLZ87_iY7EIm{72)68ye;Fs5TG&MF;tw2Ngt4_1M>vDfF8?=#P z+5V8?GRllGSY2+Puz*cdoJPb&Sx%s9i(QTgmW))}#7E41m7JCI>Jrya&Lw*$H=vap zO9IkPpIkQ3HtisA7)PAP8=}(R1&94ZRy=HoA|yu{VoV#;4ij1x9|JdkT~b!U7Arno z53lMqu6}B~4}*^*9(|&S+;T?e{v7=5pqx#Qb@)z(nBD8#?=Ye*AqJTnA9-Oy<#hEd zvXUHjzt48A!{>+tQs>Zk$Qu}0pjTl}N;}dB5%0TzFSW#n9l=v`y5U-K#^mv9XSf}& z(633yUYFNPDOo_Q_`vbwg5SiIYRnuyfMq3^dM;x{P@N0NZ%mK%t#=QXwRPlFlFC;H zhddZ5R0P<0aIVjBsBkOEuTE(0ZM5-$JASW{^44B27w!WaAp8u{6Zxy1j9COba{&*5;!EknSM5< zC@XMr`O`ZmI?CPXig}pfWMeirU)DSL z7+RzP`w;Xay0mRp(nkrcy5`RMzJE*-M|}-bj=kz3@8cY9^Am{pfk`FP9VQoL#Qs1@ z64_9EPDK>Y5tfhoBN!X1_l)%GhFik}6p*dp0L9g|$)f>~s!R1!Eu|$S}Z*=D{A4 z%=yQ9h_r4Qunx2(u70m6Pd98c$3_KIRBwMR0Nc@klsA7(EbB#?+#N7~ zbTIf}AMz}-e_Ih5SNfH6D0PKv13Ub(xur;=EQ>!%a;FJ9jrVYG)pn%H#1GgtZ;)I9c+I3z$JARW~NDr>KQ% z&W6r=IeK2sInlDO1;P&VgpXY*$wv`i6L-b#?lwR`NWOaOq`NRu5bp*H5Z|kY%B{l{ zK1C0(t404DjziKg#Jvl~k}qVnOu!|z!d|%m%hN@-$QOt~V8YaN$Vr$E;grW^sX^mZ zV}}G7MFd-^dZnnz-2~GKGx?L3u@jI8IVf@NmKV~mXG&f%1Uh&maM0$GAzM?Pcy7!l z04L6tCX^?sn<-EXj|p0y8~4Fu`j^@Bo=h7`>6Fc-Le7c*I6OuWclI46cpIEQqun+o zKO1YAj3JVSl2D#=lA0jKMb%EGnN)%h`reYIXx1+y}o{o^-qZD9%Ecji{%+rG^DFNsfozpGyEL zk0Vg19Qzunhp6?*3{Np1@3h!2q*FO+3+6ZsQ;V3(tGEwjK+L=HlyEJVKVqq|Tg|R`oxv8! z;I1bRf!B13OGbcKA3S+xsmMh>h{Y-a@=Kd+r(D|szej!GiO>{BpjK2x%`n4cs;gwn%N$H=)+gJYPiXG5 z^~!v;9Jq1Ym_0g*pKk299S;%d#XA*4)FK^_9c2o4NyfhkBm&tA)B{L&hcB>I4N7v3 zdmvN#%#4L{xIF@5Lh?AK`?=8+ytr)I&>0!fH9$j>C$ik}Y(BgEI=6yqVaJ-D zB};hCnk67OqK3~*KgRH#dgvlqEdI^->JORrZuHv%dPj5s8EnQm+ke z0`HKo`}IxTM1m*zbbc}>>;(uz9ze+701=w5nEoJiI~a5a|1e2qI*=ujIf7g}>7cp4 zx%kVVd-5x_%`qh`6_;5boa;6L)24Nb{IsI&yu0|Ktv9n9o$e|k&n<>&dW)-=7v9IeV(Y!!{~m=MWlL1@>xYBP#ZPu@QvWdK8w0~X zg%ndcIByX2RSe!tzpxEp6}-=U!2`lLkAA`!@S- zgn@RZs6_j zQE6|`pi4|Fe++gSXqUCav^|rzj0;F8ilQE%AV>Fmd(VNHwM$!ed8<1C4h&Nv0WA#j z>Y>fWcM7oNc3s^zNI8YmTP}$!;1*DAWY@bVrn+!FtT8?O^+RP?<-36r``ygT+NOpd zvm)9TX8^L*9zxF(tS3;fJhJhQOSUw$`ju#h6!M`Dz^BIm0rzU>k;ymLJrPD#Q7FzJ zwoHy=^%S83)5{$r2SU}DXcJ&I7gWp{mClLDeo8n$d*^HCVW0LCVnHhcrYcfBw`+Za zWg8M_8XF>OY3u*?_NlLavu-Q|m)~1|uNKK&01=`Zsw8PHHzM&Q<(KT;f#_erj(>uj zG5Z|a-eG@sClC*jeA$F9J;~9#-T$0m`!SpMOp!qsKB7BgR{c*R$NkjesgH!D3x1op z=Q8&APOgE*+b&grA{s562h>e{;@A}1Aye03vX-9yZyr+{$DYy^OlzDyO?NFu4YX6x z!G6!K%OanfVP>?_H5Lk{ft{7|sP8Lb2@=gkjiD}|bNkoq)~wq!UqS9CdXJ{yX4NYo zIQVM@zA{X7y!`Swjr2GIM7d2T+EOMPt~Kj6HxI_`x9FKaPKKTsNy)Nlrf{9w1Kf%Z zJvL`4x?aQPJda#z;mH*cfQ3F{dfBpp8UKjZKs$tX*Z$pW+4owvJS$(%mf6}Az5Ld%5~N75J{CUkv#@YFk=b{Z#Q)*!9IM0?OOK@}kI z)A~_?t{ZANZEdQ7RLBZL$wmwdW|{XQ<(aIG54@L3WoK-*1CNP`gCTZarQ4@LGF=i9 zR)$B8{+tl!Yb32)fNpYLfD=?%0^UT^=(-mZB{Mq%izN>?dGe{+ zY1J9s!(?6;&N-*`BrnPhu15qD^Em^FviNhjS|&QsZOG>7VgS_Qn;jcWqZFpO@V~~# zk)YP$-v^y1>V)BH<73_ya=kLJ;GNec5JkXaSG!7UiixJ*OeMR#5d6bm8EsJN}+OjSt+=zzT~-JWWNc;>3pJZXCXZn{iCFFao3vaqKi3Q!+^yyRQ7{kxd*no zI;-yITqxUAu1HJ5m3v?Ds|R39^XWPjpy1;b`*-+VX`|WL2ZW2kybBF=?fcb+mOEuL zhBeVL>KHi`U&NA4j8zfEi%a1xay!YvPlFZWO@DO+<^p7RZKm(_X9!`)4uL6A0ri39 zTqBBF>s~6`T8@I&vxO}4b?DFc#&^G|sX?(`6#Pb*7=E|ULeo2^zy4kjJaW?RfUPVa z%S+pthSp_2Kk2t1=`H1fj@&3Elv+f8%aWLLe(+Gn4CBJaS~e8S@&~kRzb^Ny1Tp}c zx+fh6Mdg-2>>5YI8NP45bN9+hRJqeOD=*O`(Yc}&62pp)PHB{9!hd__nzBNS3_RN$ zz|CC@+^`bt`s(9meGCo$rpD}#go5KG%UW@hqQ`~jnr$5?od>;_W%d=2yXu1n&pY>$ zvxT7kj_-cHk2U@EU}%9!wG63GZ>S3&MhH2ehD}ZjmNg^*^ajj_WcJ3enRm7{iJM9v z49hcd->Ub0-XA9H!pA+SE6)8RrVwmexxc{6i#&fodq*_OO}3zE&zulsgjK4d#?h%WvL%X8Tb+socp_0Od)%RZ0yOP%gjBC@XYMq;- zWm`Wv=Dwz}-#RH16VZ0$48aMm=6%)cQaC&)qAQ_4;nR3`f{#$C2J9_Hn zf+v)QW63H-1=zXSwY1+Ad<$tR*kIq;E~|)HSlKywkyrWg?`QuX7PxLWfCcDR0Nz^Ci3b=c_mv#aUGCqQH}s$Vls)|0pRt{U|&lh3&MakAaQ~N zM?BczP=;S!|UAF9nf5OjBK8h>-w!$yo;>>s@!c|rU@g(XCma&J%#DUkXKSTh&#yjsjmh5o68t+}7LT(9Pz zSgj`yveclQ;(_d6HrL+-gR!DB7rWP@c3Ot0S~AokBNFJ-N6LRf&m3;lh);@>z5+hAt7~LIwX0U z%x5bE-^~uk>raw}Q#U|HA$;_ivMsN)(B|JTcMbSq4(I?8TxIA7q^yx)7QcaGTo+(s z^vplkecaFObH-88k=V#V>1O|E(S%(|pdis_tl=wRkqvS@CcKD2L6Yl`9PFCI%y~1eR66a@=X_w|C<$>P4P!>o)#e%qx5P- z1hjO~fT{1MD}|BG$tqB4yH3j8GRl^&b#O)%52E*pU0A_ro>wNEF_2uIs1xvu*t2rf zvJT~&tOmWMSmkYTVb6+BhA(kvOW=c`zgJ_rs7a$!ti2%i zRc!IcV)vJSF8Anb0Do!9XY>CBX}RD6Dr^LmYlw{hRDxjgVL8scXRX&*B?5Z*-(f`V zamAUentSr-GwaD(q&`Lp){RNK@7*izrQe=&h$AYNd5m*4^55(>TAhE>O^ZPqV?-9n zLwZxT~FlYYV8mLTBj?EcdJM&I*>P`ur!>pJB{6{#tu77ps^3ZA$9t`9QS$1 z=c$F~j;~DMID)coUfSIYBc!}{jp?NMNO z*h3T$*;jWwGh-Dz?{(4badHcYTtC6yIG4L>rB8@|6z?<1e4SDB#+sxUsGL{C2z}>G zzmcQfk&}1lgR*;2u@IICl`?hihrsw6?j9zk4v^Le*ltE`7v^{g*?Mxlo#g{Y!Vq5V zRtYoDQhs3q3PyoAaX;`t7c@rOii`5@wSp5>fGiplfKd1cSkMId2;-I<28GIl?ntg8 z6g6+Eyy@9Iv130;0mgy4b0)cPnH8lwHlcYB1Gr+HF)=u6DZ4c_t^;11gz1R*8GC-{ z1j2U#A?=4dlghgrh<_0x$~mH52RHe4tR#-~udACI3^U$+Y|W2N;5=TiXwh&+v7i3f z57#xvJw@TSR!IlXpSKJwF~QcW?@+&B=)B^M=Wa^=aAczKBCt-N4>tMH(PS3h+PwBc$NBWG184ZMWu3_kvVFbn_4x0AI+gLd{EliLG4@%AscabhVg1Uba` z4%RPqG2wH1!=3cGX#|Ch>mGZ6%yNV(hFim7ArT*TttFFIQUqRZWP_Q%oVt=JE+RB? zMsN)Jx#>d;on6546;b7WBT-7T^XcJ}Byv;=p0yxcC+^kXUP@j7CQW&E34Q8!ZKM7B zn{-MQkJCpMj#9k5n-zz5*SA}CnRN3!iw|b&dG&I{l7u);jh~(YZ({EN-8)Xq64R_3 z>auVIqe(>>ID}Tv+&5FF)?*(0innSpYyFB3m+$-y?<&Kzvo;E zPI}^(8D66guu}2cJVvZVLaNB|P%mq^zw1leR&5Hq?Q;vl>?zGLc*%|3tuONlWL-}~-i&Sax^ zUc{Ku!25{Tsz)KWBlvUYk~c4|&d&!kdY_(OoUHY$Pb<3KQe;1qI@6$Og5W!~R1n^0 z9f=l&%E(;u1>agnG%V4<*BMHU`W(75oN$jO;w$dy?=jU6E|triZ)c@}w_92U#WyJ~ zF6ljsH?2?LZE<_%hB_P-|xK( z&V|fq)8vVj=s_3Cp015#Zr9;d(Q&yw9?3-qvwnAj2x^a&31Im_10oET9XXV{bbn?# zPWnjOWe@Q=d%?*S1XlCcrACY-Fl9!vUhKl_hl<(mM`DDd$;b$#_ZMv<{9n8Bn+kW(duX^q%mNV^=e|Od|*ft*yM6FXx z?^;(df;V4m)96(gW6ZDf$}LmQoFQHIBMF?t&WhdRnLO<8f-_-OG}~29Z9i!s1#oiH z2aM}1KV=*2o-IWym$4nLwj-y$5Wa)|-LOtcqWN$FRU)tny99P3x0)apwA?n9_XVLp zcjVjOab6x}irvqL6DtZ-S-z|w49EyD0p`Dw>I{n8J2+|fMn#{T1JRd=4*Y?MGT+w%VD&ORSNe;Zx*O({HWktp2&$mk| zZ^p1qz)z*fEx$V}Y4ML2M|8x@&dlo>w};rI1Zkk6QGa1hZHPi~s*RP#&ACq}f7iFV zHn;VDgv||8`P}^iplgQC195c!|Hs-}heh>$@xO$mqIA~)(%l_{q?E)U3?VRp)X*Rx zJ*31?(iTV$DGVW~ATl%(Lk>zyD*{U2gP-5`-v90&_qor*!^0f*?6uZ=t-a4VbM}4> z{e-7V6tuk4e^7~tVwi0*881&aNHBhK4MK;c!Oaoye8Yd74;Zrn9_J<&CGHvIUXRJ0 zqrN6}u|9pB8bQtyBgAhT_sGl9g(@b=r#gQ{a)hBzVIyMsTM+wNL;}-IVqW6YI%p-M zX%5sv-N;9%i~mVC$>(gc6D4%=gQFk%Z-F`O$o^Gl=n^vs^KExK?uKRtHT4J|xrs zjJ?|xpewd&e&<|P>b5-gjsivSHoPYbPVzC@;4PsE8JbsI)*Sz&uuP3k+8G%cIxm`8 z0Yr1T{`9f;x}^1uUv+a@wXF_|ve2~6IP-tv`4|_KdKFX#<0)cpDB;!FeTXpD&Azu# zMKHda$!cp!rcJc!ZG^bLh!W)N@t*f`eV;HuKkYdm{%9mCXewKIC7&WMr!g|gMb{8+ zfv-T%u%TAIi2sArYzI#|1yRZg{a#W_`=EAy6zM1%C{ zMMb_FvtI)zzQ_qpwmYW6b(ip!9kN4csF!_~F))0lXr%-|HW0c@<1N*=G4)8l`migvnLF?f?+P!5{dVtvCaZ5q* z_cAp-bX63qubK&UU^Tfe-+jjc`i*Z9Pr|6GW$J6YOw~$xf&ZJY1Mh#6-<<{;MUjc1 zs-xa{yLQ05qgKnNffxjY7>2tf74HXXwk!O-GXVa36lWQ)jZJvIidTsNJj!VUY61xr z@bS=Z4&2n-Yjrnr^(ru*2HyJxmPH&yhlE2!7g6iy%k@^4!o!4q_;8un;%p^6V#$o# zQA>JlgpWAQw(v~qc$ffRlyS*9ec1lmy6UKu0eXsU20_k*kpw$Z@v@h-@5l^mu3-C~ zkYeIxepL`9!7N?-ds{M*x1w|m5pPD9z=(`D0c$L+R5qDO$i*CT^#naRz94bR$Gz2 zpv`>X$%GZ-=g}FU_uw7CHW(hY42@?T`hTQ=nl$Br{q8ZyKm~YWXScKy9?cGLo{U-T zvUy*o*Wz|x^BbzgtEwtMAduJ$%geaj|Y!2iJ`p@>&}$A{!q z7GekQJ(1!g2D^i|9U`#(ziOSA4a60j<;awh1Kfjhz=7~RW83C219hUHsWmsf1DH@8 zk5!AQZknq{@GahZz+bBShAdr|ZXIvpteHx8fp@Ns)RAk@l_L)y8oZa83=h=Q*(&4R z+)$tH&>n)2_fy&8aoFkEx2%t$?%Zjj<764T+Z6GxrEq5+M)V|}HM7BU&Pev>0#RJ) zsNeX}Q9?q&_l)*UJv)AA=cZBQJO7_;Ata9o`sJ^?0e1TxdC&RHhMql9&s8oqZuwJ> z6Tzz;0eRR=RBO4dc-;iOYh+4qs#2@w_oNhFkSYDYv=Oo&ZzMn$_BkZ96Y4YJ z4b#4UCsVQ)2@~o>4jhbeFzIbsXmp$a4)S@<*c z?L$^0OqZc2!BX-N8+@y&IYZI-F(i}Y>G9cqA7tzB_B%&B33X5i_URYbAGdGD!M?x3 zmElX~@`i=_EO{AwRt4O(`d=uqvx=Yn!80Q9!khGy&_%iZD5>}-p~9KIJ4I*1u5bU| zB~*Fdza9f=DNDizzG&pR49|SfXK`K+Ysa7OXk-9;x89tL>DFGnUW&leSH!zdk1c6AGrM~7XBS;g zR?n0IK6tOTzPDCA^c@Te8E))dXoo+@zbhKDnOrW8E5&KjXdYxfR+Y}g)%z$rj@kwk z=ECggBi>*BJ?je&aFnxmxURf+gTqylGbXxewBm*R^;$VyuuKVjv844L9yc`v6U<}x z5c645tlu-(+e_&*W>@VnUm+m`_!vjzmMU##^n6f5H9bF%St^;Qo-_xq-Zo?U3}iDd z$vGl(7Va;XS(iFPm83*e*(XknWpt&btD8Q_0U8&*~2%ot+&p)6#4#! zY{A0k%=bX!V%Uq^Kgmig-Mxh1zCv&#uh?`;-^h0jkih2!^)#}FfRB)VExYHvbHw8E z;=1hHdsLl&dE)ZuZb(G)0U8N~ycyWf)pAfFCnR|fgXAuNLVxLzORyX~mZZ6VE&lsV zRjV#Rw5TJRn9j4`z1eDR{E;R|071EYy4oQr_v5?1sQRh@c_x??grNL?|8+GJONf6B z(c!$B);9V7jL@;5`~Qo@)2Za*#ghC+9^MYyBRRB|Mi>x$6^CN zmDINz_1K8^u8RHRsoUI6aDPwOmzcNY(^js3?6b;GYD|fu16ccf_cqQ9AhR**qM1ie zA(b)eiopN>#LldemKp)O`+*lmL;y8l3!ng;c=1+yYH+gkRZ2EAqvv-=F~2{YC#}xy zkggtN8THEu6X>$Sob-bAYE|j|W0B5qb#ZB=} zA_tYbq#{>JPfxHjKsS}p)Jb(CF;?!>p?HG@00D9Bb|TP{oXq1I9FYWo25ewM8@faO z%Ir=vqSOo${u9y@GiMiFNkvBG@|F?@I5(M$Y^hjvF2GfUOiV^IH`O3(^khEme~x3S z8PYPeT{K;6*8wt2={4)&nuPMtbF6ckx~R;$2hVMtbLOm;yAnHPu%ZxV`S{L@x}5^u zfqadB&;_6|rYa*{?DxEh;Xenn;WDNS`HfWS7&oH35$##r*Jy@ok&`@ca1$Z>S^j}E z0Bk}rAdN;UKu3`b;RZk`!gU3?y8iu3J~Q_QwD1y|*^|Dx=`R;*J`KzF;G!{5RI8Dc zJTWW*;2ih3Ig$I8CIjUxNd~h3M7>L)+sUGEUC6W$l;#} zXF$69sa87^^*uhe(-bfJL|n_>3(2W0XuHHu-7_7zMf#5ofhE<(K07~@eCg}X}>O;6&H0(vvzZ%G}So(zloR zejOjv-;ulft9$w=)oMGV~)o)Au(xj8^a-{cO zn*ug6c~`GF)Fz#OG~{sdL)p~0urKE281`lq+eX5%^@#pgNm@X4%>pcz)#0W=8UKm$JZGrKr_CoUXVxD3f6g|%rtUeu zkTU;AiKzixr9WBhc?w)N{s+ogZDAIOdV2DuKOZMQ75CTK_S*AtF}zE*PJmnU{+b1} zpna|3DbYth14^e}0Em;VHd)qYV`#V7H*}e4t85psQX$-UiR{*?- z?zP;3!y2jnDofg{^MGgE5&?^_9812Dpq(Vr=QM>Q|aoGKu#q%HX=Q{J(VeQKwu?;k#M04+}JcKiQ zzi+K%rv6prmVPbde@)lLNkD^{g8)HN>sbn|1{VNqYP>EM(^4SVWmYLu zay^B<6zOrybgCmz*Y~I{>w`(!3^g?v`%)+2f|K=o#7Q0wtNJ;V4=m}nYXy&P6~$=D zB}(})jC_>;UEr!@E}!JKUgxdNsq2~a4HNO(K`Hv4K1je{I3vkmwQ?&fC-~H_u%+Qh z@Zz$>(2!@jC@K9O44A;>7m~8UbDUR>bYXeiNYmM5^)L3}N#>ed^hR8P$V5-zlsLjf zPMtvtH2Z&!<$ic=Re1FL67pM#PLped=|*NIFlnFP(=Fwf{3%|}snrMw2=n05%1DgM z(#7Yw3&fNG^yQF*1dvOPOFX7{di?;UMeTESa9CvIH>0W+g%9^7{<(#4{?9F1b<=nS zvdRfJPuRJqApqRUASHzA5bdK~f7SIh&+gb&a`&B*;C;bLw;9+u>?VlnNK!lQ1}bI&U%CIkpVR{fLzpr!*#cpEMK8fAnVn>dy>7zy=sZ`>Lmh&W*l2CC!! zTMf5K!N=vKrBe_5hgc43824T!c~WwmkfuL<;gon!ol}#KfOOW1h#k;$d6xO8NP{zM z?e(Ytz?VzyM2UQ*tpdyuTOCN>Po}oj05|Pd~n6%fkhX=pTTq z?z$}N>osWqu!iC14#k&?c28GhX4^ZxCqv5(D~zZx>)$tMFWZkin^lNA61neu$ZBgZ zcn^B^E{^7WmWh-}nTiwxf3{PT!sH8h-!~mZTY#z^7u*j-D2`f`-QxqGG2A)c^WRIxB%%wQlFeQx6HkhAHg0t+Lcc{ zC`)2Rsop_c05|Z$9m>`xss)%HZ?j46&ffxBDywsKq~-p?4}lZk1!?jNQr6PVA%%OV zVGLRB>p8rBUp+-!hvlJ#Ar?AT6IYY>tPMA2R2d}K`~%S(eM@uFjhK;)1ZR(nD)0rv z%^Mk`H(imWN5m%Y{*##KWOsV_5jn-3V46}&%$iaDc;!{Ctm20W>~=`D0GFITgVFj- zisun$YgcoDoh^D-pQ7zII=gcZ)}_Gm)WV@Li@A{p>}%9`^wf0ty{T3ZZgjtgWe1-o zI_mt_;bdXFN1r{<0qxqex)+koy9|wiSbiEU`Ze6*sDLt5lh00j=COthm?OB|Ck9`p5 z@KluN*;C{Vk+>gRKfph(hfvO&aFqn*PU!3qmDl^PyKq_r8- z`$`_b5%KNKL`VTHMxw@a>AD54DCNKxa=<-=Y9H$S^EZ^Iv+nDhK+=PZo1;9LR?`Bs z!+}C;?O!Q$s~0YkPvq3l`hjsigNqe2RG7PLeXsI=HTZ_t&>=}dn+Rf-*F?zVnc#(F zW9IIe+n9+BDrN_mf`dESU1+}1+RBpi<&$H-Zb~!P)H17b&H_5h+x~4q_~RnM){cSI z!5mrP>}#pXZtVnZWW=V8`Ae@uu6s_SVfIAOs|#|?M!B(%f<~1)Hze=y6r4p?vb{?U zX>OeHa%PMAT-5G(bhfHdW?%mOp~;)Xp55I^)F(~I^Fp<=pMP>YaaF%*kF~W>fjXQe zaVZo`+(n8W4>>%Dc)*N^*lri**L28D$2;UWSIKw&7^%^TTz&+VY3s*n8le~d+c`Qt z;Dl_2z+yBHFG+k5N1<;Zo4eM~jG`xoX5hkI6}e;!ER@!tvg%!{U_m|zc#te;WHQIg z1azu}PNrdYLqODTV}7(-_#JI2tj@wVxy0hZ;%WgDMq-EVesd7)O}g;{vr*T1M5fsb8F5Yf!E;B?6a4f#F7%A1oHlp2&N0hF0Vy+~ ztfr;G&N0sE4ffbAY8P*BF@GV(zEU0@#w=mJfQGy_(}6K-+dC9~$$s;}0#XZQKlI|J z#z1XG4wF?>e8_r<>ms0XuPxD-tr(N%en*fAr_&AGmH^p@tmXJ)nlR%os&`XTs5YHW zvcA~xb1^917n&c2&f4fAJImQ^lc?H{Q0PTqpYO838so2hr-15Zw-zc34_%~L&V1P+ ze^9R~5u(|SjHOY&Mf+BX>SGQM1eG;@ek#cnsqRY37#HU99_H%eog<)XSPWA%gmj-n<_o-4lMpn>!9hfX`30B+`t=041?@lh2NVY*QI>{r&DjktuPcg0j0Sm9jCs9 zAbLq=$RDi4>1w!dWkuH&_fVTs=x1Zd+b(Z6>u&={N=}LLE>>5jz5RU-&Mzn>CC*Z) zLS?PC`uVhg<6zAYW&conYuYzjf>q%);x|q=VDWN7*(J&Nnu<;yJob0K+>s$*Ec}jz zs4w#v_M;Npo0+s96TuEsOd+jwZryT`?nJAbM&kQ)8;D<=o7`zo*Kq$C-1{6N{7Ofy zV*$&QnqW#cs&P~tzN}HgEc|Hp6&^3mB~*HQ;3|?+i9lD;lNnzW} z;AoBUP^t1wCyxgLwo#L3*)dR-$3V2&47mC1d9?S+@19$YRNpQd=#Wy*;Szd1S`Jm5 z-+Hn;j(+~69Qf&5-O`9Uh0xz9O}1Ed$D^7?g*yb;h0_4heo-_RyJ8(~XO_@VAA#&0 zAjj-c$-+8xgmJ>_v)zhip*is4u5?r#To^(fh-Zou%myd2%J!pBQ8%2|A(gTVc@%<_! zB8C08kGAW$1y-B6KQs3;>H_N{E2XNJo!!^!;Iu=`1gj})#~jqu6RMRTb!v}qkh{4` z;cEENA&3q`v~~E-=gOwu_n(DZh_GasAyml_Dx3;DaXno<9R z@ErOw_?o}=f?%a}A^-9&L%gIhJyu#1*y6n)9a9cv8}Z@^hdJ`x!n4W=f zHWNJLL@rAT7U^^F{7&(fuaRK=xEleYhM9uiMNnN3zQ!QT&2yy9S-n`-YQq*4fU8nv zloo?q97YWgNdLA_LlWz)l@@U$a!s-}n)=wuAR*E0vu@E7 zui9@ewGUCkc$hwaG~7$&>Elac%|sjHOcqjHD2*N!e!nWD!6^E(Zn0Hc$OmFRJj~|c z#erR~Ejgp{BD9=t1TD<Lmy0F7%p=@V@!!YVFZxF64zz@>3h~2sLm6* z*L+L&b;gJMF>x3<9O7_z#pCNr(dX4q;h!Fzg@{SOpeU6yg6vhRn*OVJoq^2EcmIu;)4pWC)L}2Xvr5Wrh5uM zH5L@r)o9S)$p{G3xS0X8j=QN~mqif+%V zahG_In($?Zxn)8p-gLlsiAz^$+M7!W)n)sD8oPJaWjP#@h4ftiv7XEQEr7?0;!amL2^|#+G z#Hq^mlL`n8*6tUxaoa`C6>)7OQ_E~}Au z^=HE-#__K+d~Neex>qql+fRn#h9dT`_9%&$N^-&iEs}XMte6vhG<{2oHW{IbdKEOV z_|3}>y8FL37oMW522GaK8yDQMWNRZ9<1p;25pbb2u)$?#?Q-oQple$eNvpoyIclH@= z_s9BqzxWOr7G0a8!i1vBvfPLp6@YVSsqeO}4*B#?AsigK{=nm5qAX;`Db8(4 zDOPhm_Ks@(!hq~?z9`xB-mUvMX5LZ)?5;RFPw-ykS!R-w;Zm)ca+G!5WIqF5<8$^L+&QE9(y^b&wrSP8y+7D?pp3qmsF`4v9ed$r5D~ev86`5mKNs8# z<8Aj(n2&1Zgxm-dYC5QtDOnhsxx~H_eRwOz+Uft|sc;Inhg<;Qk}WzWvF6@|k2*J} zp*Wa@lLRBfIflYB)SKwX9XvN44WJp9s@`!t{wj{}^2BRqMn^dEN(2XaqOFbdN#-k| zXhF0DMRP6@x!y-II9mmjDpnU{e%P>o{3qegeVezx?W4hEA)4NQ*{#=HIPNoiSB<2} zPJ_NpUz?!i|8uX2OUOYJ0yA7}8N;Xt2@~{G9J!x%gEm&9Z#D3?(uGJq!6^TMp$WJo z)o(dxT~Du*sBbQ%Q}E8Ys4Vi~gu@}HkuUWkOq_hPIgU*~io*!o16?1Pu0c{r>q_r; zXALLcAZuI4`||Y$dTxUDZD8^ZceV(#HWXY%kXIKYE%ww^1oF5ouwZ#lCu&H*A3dl2 z_fyIsnm0etSH=_5p2XROPdhmv@{G(c5kED1z9fB9C14h%8S%R&=R4>bT+0)!h`hSO z?|`UZ-d}7(XqzH@-;>CaIHi0_WcGiE(@Y}|r99;Qi+9Ac_2~;gH%6SHPyHvQh86AX zAT@Vm3;=tzQRZ)5CUp4K{49OSmJawvmwU!Bi=BV>FD?H}9|c+%8`2t_o~>|qZ2k3c zuZlR@5oGzjVQrh!H#gBX?NZr5rVvZ}KG0z_Dqx$`{Vmj)wd8|jg4}{mKtZ5GNM$b4 zLjaBgC(_%Ozk(_>)S#y}DUv!7u)SZns$`aINyD#*Nw~_;mFnDR;md6m*yA;VS>Jg& zeROU5Prmwy+!wzmEgxrzNH;z|Ya&reIJ`3hg15&M(^2k;aPQp2G?JYf(hJ$l5{|_d zZMG8>BHa`!7OEz#JB|cOgQ}H(th*eQsJ z?F;ZUG4lVcu~?)j$NoV6JioxX$lx)tL-#qiGc)!SwwJqvgRC6Np&OyMnf$gVjEJ?4 z^QexAc(x6rtxD*}U^RBH$S_v5LiJ?%&wIzd{!DoQ57cA=Cf)E==y{5O%dW`kYg#n* zxOX4HHZ4akC!=k!!x6n?D-=KJ*i@aVxQx-sSJef(ra*&4)hIMS_ZE4STrlxMQFF#0 z+t)2$#||t$Z`VNA9FBz?izNB^6@5ttVY-%=@~($%=(ia zlyLaFb>ru$3ZSb$W>H}reheGim5_^9Yg%O`R6_P^knoaOj=ea3swUCe+o2SdB(YXP zi;BIv9l-r>s!y**m*d_9`OcY=lvroHaMRox_RwxX;OUpPdMlLrmphXf+c9DIw7+&@ z<$QyUmWM?Lo!_n;Oo|VSaBtT|EtTeG28>RDgY-TW*DtCEat8 zRQuvu|qrXf%N;iK1FGv772~|M6}K!k)OJ0F&abvgin; z6$ii2YN~(#oXCkR6Llid=#H)ud70EemcKXwNzDr#FX@8vnQIQB_;7s1Wckg1kREz) zqK9F{1lgC0y^0*6s;<~CD`8EFoe8k@tcBBTS45B)(VA^q?U7*mUEN|r(|q!_^~7p< z3<6ojCd8?N+9G_$VsLRkt>*U&P1)Zs78_08X)sd@fSMk@k&oxZkA3sPGYM){uhp}v zS!Qqfh(=Q2_os&D2-9~kF?aNG`EeYt)2hv24KXLp@${e~5rg2NB2m~kO@$aKw2es6 zLO~m26pUUmNGJtKK#eeqN9_D`YnqGM$upc+S4JCAPWwZ&pIE+Qme=5h;~xFMMrekH zL;-t_lZhf8Xu5NMKQx%EzP<5Xzs!+zTxR{lSCo>B5VVZ>Ao4@)qkYXXnA_Zp^+GZ& z9nwBO3JM~aJ4%U6bQ`__>sAUnQY7MnQ*eB;>Q)TnmB7~{e4@oZf1rVBfrgAmsPG)h zg)qkMutLpH(8PTRgmr&xBUW+IPqBN{tF?I_X}1VG9sgSB$_*#-8F@*s(peB~W1st# z)v6cOCb)N)MNSVg^M6E-9td4GSrGJ2%YzO*tB@Mf=41ebAe3x1ie3ypRFXnU>1$t0 z^9 z6pM@yb>TpMMvSnSx!$;CSbR}gQ&l_S@+I-S>KoDlJ&;MnIZG^n_M32e#C z%8xF!&Yu`T$?W)~+gR3%aR!HXsd{wed_p5~j2E`LBnu_EZ1T&^imi6lzmUZK3M4=7 z%0L*Euwf7Y6q`o?+DY4tCnukmdvf~o@9X(nVC~zY$7`!n-GqA?nvId#$`w3}F_=MdA{`OmrHRC3UP4z%QuZ53XFH4OGm>cn zws}E>)?V#0PJ*Zrj)%}K1z0ZB|DGn+i;_dPG`Y1;(4NFgOj@H1apy9-52~CEZ+!e0_t+~rUEkM!WL<@iPA7c38SC9&fFn|NPww9 z>So`2_5AKbaW3cH*&?sVP8G~MR#O?&Jc{OChm1IvG?@TjcT)a$h|a8aIr7?gkJCp{ zT@!t=w@&yYJge`lp1oPFUw;D62}((M8Q(lGgE&0E%XnGYEPxy!wO4+qBP#fjL-btL zSKaM);|~8cTm?Gzg6|#^c+Z8UQ2}H7vd(e|b9WWn|JlDfh13vy`-UXexH3#&8T)!t z)weo;*$}KvFC-1C$UT_Jb|cS1Zo&iUbXcNyXDs!rGkY~j)(yZdxX|^Y1q=GPr=L1f zvLihbUOG{X4`+LMdzZ{9pBhGorBNyne!04c!gWO%47z7RsbrmMp5{Q?G8Jmr58H=& zc~)7CV;5e2ht!%GWJ7VmU*;5}vPQ}7{;uz1W`$ts4n7_y4V(?2=88RkG^-0tmDek5ZFR1*5jgN|}#X{|d z4Z|Pp#n%>v$l(;#fykL(3k5>D_gzk|B5IpDciaCWN%X7cwD zCD>xp7Y#4Ds}y9=mII!t!G-F5$wSnHtLv^oE{d0Q%bJ0?RPK#YS^*-(23phcjq}zm zvXXxxE<9rO-@eDRWLrM9HZ^A2ZisPNRLV!MF(b~yYYxEe}y@-AnQSt&J5ZJ+72-$U=Vg zcorxY2kZ|;+%hoBLlkxS`-a_Az>2~rSq1jwew*3j*ruugv)bMPtvO!E*mI|$M7us; zv~>(jXe7C3S@rooDWXw`Q*8Kmyk&+c{e7g=4fiRtZeO%)g5)wJP(j#{+LRa3pY#L) zLf>J9@s(fG8dcJn9PoD_F=Az*AgY~W1`BgG z+klk?eUn{Ce%aVIZB!}r;(B0q98b$}mhYZSu6a@Woeth)?zJs`#s9SK_m;h zkR?^x=@HriHp`yux9zB-FvMJTIsJi}NCs(Kd)$}v&2oEHL-K>upq$BIT9CQd;~X62 zs&IdXKwozyM0s;!RP}7<>&GuY`#3mGxxrb;ySyHW#BV9zLGhWa%S}AGc|mKd2|YX| zTW>jE+mQ?WGTV06;swzxSRWQ;VC}T(TD?aU9cfIPHOjSW4bhEcrocV@eR98w9JlMU z(tV_5)L!d8mO$3ia-X8N_vI}^7HenpjT3tjGW+xd6<=`M(T}fRLR{J{KK#V+mbOmC zy;@}Lg*+-I_=OdiEU4GR%-o9$s%Cusk^ImUK2QM6i39o=RE_)#=-UnDqEm9OLZpQ@ zoK8}{onCjEm~CJiBN8`<+VdiQ&M79i5PJTXw31}nHHoswvD~<~dTQ{mz(Vg(`dy6G z_)%Ih%T4rihqd3h)A9RahJSOuLi4@AF{TTGD;|Lc(cki&UTYrbKs&GVu;MM8X{Vom zjI8%4=;ndx1dhXMN=f|E_2iQ#TB@LK9mp#PBA|b`u2|(HBf-{c0@dD zkYm$qDA{Hm**s$P$aoHw??b@SrTGlfJh#9Kj{wHkz$-7<}a2=lDl@DAKjki z@PFdw$wG46zzHH7DfA8tK+USM3lU)mxNY+d1#sg~@HQ4J$AQ=x_|RQVeYsKr717w6 zLxt4xrLt>hL+yLGKa?&Ac6vWUt|j^0$?A^|RX}`HCqD{aKf3dBzWwdjv`?f}$FqpT zWZSl!n?49nBQwsV30hf@#kwXuC%I&y00P8*1=_c<6B2kMzQ|CL$0!wR#j{mWBJpOV z8{f8-@?6tXaD1KGF}tR*;O*a!#qAG#R!nsb9G3|>?)5Re0Uj*d@W&`=_=5Is7#~?$ zly3!C1Pdjn|JLx6njYS_MxR>lgZE%)yP>06rp#PWgWU?~jxL>8`bSi`j0W8F=eTrg z;b?R3MG2#$7||6fz^;ZDqb9{E%r~>|h+giIZ8_-tN!AfKtliRO0Y3E_l#DXOB}b$* zgk1G;bUisHc;QqWN3ICcbZ_gsP2(d_>c5SS6Md~*qszDY3aT~8B(srDhc?oM-Bpey zpWne^lab{mBT@@ngw2bk?vo-l_LLCk}~yf$xJ#{+w&r!y*N zA*m-ju9hcQurAHx@M^@nA_a6Ko$UN)xQy@ZbdJBfe3oZVj2`mAbc=CL({68-b%wqD zbyd0_*n)GAv3)x&bbRcJD+Pp@CGK~DU}El{w5u9elt=R#>%(|+vlvU;Z>QOUx(FQe zT3())_F!}7S5k#1GRmh|Rt2$!q}HXhqazv2cjwdkZj>B^HU}v?{c3E@1bFst18!{# zdAIl_@qNPy_Ws1;@~YxvOVuTFZNAm9yJvn{59frFrrJrk z>up(B_ObqST6baX2GJ{W{aCrr@V7g4IugYTEh+f&#mG#^PQ!i9%|AEsz5i75y?EHP z$wY%C1ITz{ogH242k#k`pq0dLXe6ge6gCIwzTH%RvFY~mtTnBf?VTCPrd7I~hvy8c zzM9dIA&oAc@++BwPfp0~s*yh^dq=j9wT7e@O^px8Hq%5Ln#s}a_0WD2Np0BCP|jcz zGe|+eYXp_u$>??UOvWfEyweEtNhu|9!l`yvF&4pB7)=#gLL+&0OA+a}rV(UT*kmD5 zUYB~PuOabu?=OV>OZi|eDwdcMn#O73d$NwsF_D?O#^sgdX+g87 zY9RR1VF5k@foV~f`J{Z)_J~fOPo-Z;`}fP#d^FtjB*=1 z8F1%R1a-i}S5Tc7lc?8y;J<-}$UvD2%LVolYDqsKm8fI;IgiXDo<5p`A3p2JTuEg# zjozsg6<<&W;=_yCTsxsZcDAg)34**_@Cu;zxmF5|Y7}}4`mY&eYqT-1X`XE{N(#WI z7o3`12B3FW`O(;x_iRhshJC2PDfIxbKKEEjJZY>=Z=UlRm5aoRtQmHD2)sj-imd)3 zoh{(^D=wT?Vlkvc+ef*WX%ol5I4p5Dj5RZAcz1^~Yf<^1=esCoVbE>o< za#az-Ddv#Dz3eHwr$`l6A@QY8Fs=1>9^8bYU)0?*2j3R6tr2*1<2%(0rwnL znWYuc25qQUAUvD!#@<6W5K!YXu5{BMcUyCIL$%ppKQ5dH?AqxjXxTd0H~J73;Iv>N zZbilS8dvqmEO&lIkU#t_Y+)cmODyc2%8|w*5!w$Ga-erM(0hTu)86}srrz>qxJNN^ zO?W*%7R~?oLL}%6`y_2`H? zYo`!&y~OvX!fom*#E>g{Y}NuEu)Mot2U197p~DB$uASKV8_F}I)_x9UTP+SjznOfn zu+N5v83Z9`nvF1yMpjG#39(`D;1?x#gxV3CjX!gobC6!O zanMit_1PGr+<}q6tkx-4L8q{UInFhS`XUkUXb&)h&GR6|jV8OhfN6y?gFAk;WMS ze(p~J`)(k<9MF9q_nU)5zV&rrHF|q1hb9~e`aA%C`;H5@V8VEJM;RUFP3y6EH$NW4%S9=qu%sfxXFhL*_dGDXd!w5;Ny5a*7Up&!ZN3C z9z1FhejDiV!{KGI1qm6zHqI`fUa)p{G(~gmKw#eP{LG++vyy!b*lMA+Eg>%X*Arvq zxe{u>8feIKl>!I!N1yHDsl*?M6kjFHe(=OF9j#s^0?5SQwC=c{zO1=HTgur)Gf;9ngL;)?&*-Z>bv# z1lX@QO$Z-7-g9`L5JTQJz_43^7+RyIzGkZIR6P&yI8^rdxseynt_Yf-^mUIzdmttS zaa(GbZuJ#ozS4(w#vg@RdOE{~_Lq0-&TWXknUFRIk%$I>ZwC|ihSr~7h9cskrXSXQ zEfWt!X13h!|3yKvu!sVRM)2jsY=T&BedR^Mju#4+AVJVoHuO&qb4R2v;rDNN{cRCW z+(ANq4YjFMI$DXw

7Mwmy_pHY@0%#V!C+9F&*AL^(Mt9OlCrryx_wTfXTK1KM1 zH`G755e0seS-JkzPVK#!;==rEMG4?8bkKbVSU^ z@(0((QGR|Rtw$BktW96d_+TV|rUJbGx+12;rmOfAK_#;Ot5|<8nS-9k=a)*CtY%%W z#x6%FD7O(i6w!FZa0(rDT&88;L6rvcRkHGnnViLG61}$N#W2JJ=U%eqcm6+g>Q*?U zSE5M z7j}HI2#B$-bGOwZSk5B}Om`Y|n8X~$Rl1Mku8y2UmRI9BEq845s$l`(v`u@oi3nHy z`ru1OJ%%_HBfZ=4Rs|KYHKJ`{^XpT+v7sFtL!ZX}IMvOnD92a|L}WQy+=W{Jt|}@v zRBU5Cs^u+3^ZE0cI95)i!7l!1NT^z^n;xsKs zb9(XfdEDjAWDD@Ivu_tMb0fHd#1$=Q+Rd3FWY}9976K_1hUzjJ(J% zD)?>g<6-}Vkns)|*`o{hYVI(?(9!vpv8W{^Tq{ zzTt6~IUN}@GUC{={p$JSSHL(8{SN9L;HJ+=#8Zz%nG(rdmNZ$oH^ z9?SOqx=jU8&3eezezr?u7Lv3Ypi)Uyg&N{ZO(e?CfjQEM7fYxVf_6;a#ruYbmS0+- za^2ZPtlAKvRcF2gQU`3eSH>^^?S1Xo&o<)ZAoL~TV|SKWaNWa#O%$h zc1yNNr2H$}OIM`SbT?;Tm)@ijVd`ev?%F21ffB^jK&iH|yLM<(o0ClIbQKP?i8**Z zcn0{63HsykGaZJJIhF^u0pPM$n~v4h`cDdBc2&D|OWWTA!E=nG>o`Rgwk~JWwzTlP zZN&Ngse!^xaGlSlwghd;)t!=qtLV>Zcb|L6i>Hr{{q_|5)!P2hoDVlZXGT>zCbYmz zJ#0-orJocO9TYY#2wYr zmRwRVRoUi@(Wv*+<8~x|=B8~mVn~`OlFi3Mz4Or*&wQY&ed3^nV`oY~p*!^tVK-ga zOskDB3zzLmC1-Zq*6-fxsE!1JFGbub%5#hJVP!G7)elbWH5LbCgsQCJ0^rcxML7ma zJ9A5SE62u%Ot2Bucac^)_qT|pM+2#*wc2v9FN7Zs+vz-|ST|{V1E!$) z$T7L3PXjX_wdR9GM6!)mi6q|*a=H_ZB|FIthlE53+-W=MI#TPR+TcLE=V7xm{`2+B zBMI*(+0b0Di0?AQ8R-kpx2j*s{95()FmEFTDgaN=*@9dbkThBcjvILC^jBj-d?%00 zpcq+fcJpaZfd|Q$opW0Y$3}*P`xIG!=S_B%zBFf;z=B+lm@qlrUm-@{Eh8TYN@01TFZ^jUcvVQGDS|?IdmRef11(b-|o=^%V6UMZg z_<&Sn)0YA6Qw^UYpgFf?ze_gd!u{JpT%apxc4)sV_D^wTd$e>% z*D+Ppkp_F&qD=EG+{c=l3Q<-qJBVU8CwJC!JQuiyh3bj_CztN-ZQGj(HQo(o!PQp1 zk4c0d)6x9W=Ay}ztZSp|q4B9^v+w(okse4r1kgB07@o)T?u{ioZ%`?EiFWE@u4vwe zw~=hVA|ymFua-35!K-09KsMmPMK7|d@=0|wKMy?HdP4isI+J+QMQ9cBelzSo!~5m- zn<-7FMlM{`xLwC0*r%`+do)$2$_Ci%%{Zwq*>#l;kC37{MkMR!a##?r( zyk3}#9D}x;4+NF+kylOad(XLT~x+TLa8@dZpHeCs)W-cO%)s0wClCW;?MJ zZ!7KGE{B|A1I+5`^s~7MXhc9CzrBKcr#hR5H?_cTZc@o_+uv-n&-71RROAeqtjQ1P zd;c%i-a0C(sQnkGloX^JW&lY=QVBs)M;cG9pCqR@A}=f?w^;n&SK5kXFs{0XPJ z!ZX!a3X?~uFlrUVP50jQg~A&>G4r1Ivn_4UV)pTw+r}BFpd-&nlg~Q{lj9+?vmPTa zDd6MT`XiICFLfeG6_w@62^MU%dy3oMB>affYd+B@mFD?rZ&i}k(>xqoHQ9+#h{*T& zr$H}D=StpiW?g*EOOXTcrH<}N0sGUyEZYMww>M5U_Qz*9i2_35YqEO*-K^6#_x~uK z?DiG6aOwu9Qaa!rd-^|R*yBxkjm8{IZG{-6Br#P?3NdOz1ug@d?1tr??N^m{xZ%b- zAdQLZ!9}V%Pe{jGpto~+(iV*vFT2ClA8n@v#qhFu6PnJnG(YH%sIVYG1X*f@A7bue zA5p8FJOXO^f_SuZVn7C+_x!>nGNACcv|O6Kb|PhlZERV^?z&>yqU2V=Ln$z$`$#T* z0^K#Ni(*eDt)E5vqoEBQ-XCIQ#_XCrtBvdv6F*3F+o-(`C{2K|_*Z^b6>< z$pwek+#!Z1^tyD{NWS+=fkcu&!J5owD{~UBKgpP|An^!!p}I*ogFY))bZxL51Xu@c zo!9O!EVTO?>Cd6@9O+QffC5unwc=a6!}(D6M-_LfG$H7^B`>Qv4ihSIdSqAlWE-t# zOrH7Y>04Ol;lB=BIPHj7Z&R%wKR@_~m^u-hryPVTP2Q(qZ_%St42Ut-Q0^UpNgRUt zI=l0Wv793v*UO)4{U;m4mRon{M?on4JpD((wrXd74GuKzFWIS^Z_c(L8h=ZH$KHoC zYx+Fk;--(tpxL3@DD_O(jz|3;%{kP5}w$zWV~VfKxt z3Ey`e-oZK=exC`s%Nz-p`0@-r{+fF(ZEDgAuk1X zLd1-w^oy6-a0f9y*b;mvDP`3KTUyC2~l56h54^gHQ?3P4<%xszhg>&}gTZbzu zH=G&zNV!*_E0b~IG_2yY5*X1O%Y54gmESngH!Dm(og^2Mh@QxAwUb1Df>|!?E<#OE zDLw_T)D7H8j~%zyX`1(eEjq z#O$a{e|rb=o->V}Xso{=!&uC~AwoQN+{-^c@CohqJW}I+i>{O;Fwm#dZTxC$BExEx=<-gsxAO7l4f zr~6||Q+uKh=EoZuV>KXN%Yj0eV9xtRqt%FRAwo#sBX#}b>wb3{$$jE`Sj4t}XoU3? zct!s$IlAiAB7qN(hQ+8gmAG;Z)0*gOsLt$AE}j7!4GFkXi80hnqmQY%I&|IJ#rS~G z%BACZBeZ?$I9TK4Rsr<8#*SjXXzw-8;a<(`DjQSz0z@Yo?3!)tGL# zD!2k;=Son4gn1L*LtMXdv{R4y-EStN@E1&-}BMN zN%J&@IdV+4e5lX=7g)QYk=$Bq(NXEGAbFA$<&qR|w<)QqhQps7sKz;6#&*8bdKNfJ zPr@857qWf)#H>3($2 z-o^TXXea*C+<1aY$%uhfcoEt|HpJl~^puo*)P)X&Fj=LW1Q3X^*8XlXK`B&WV%@|{ zgbKE$$rBFCc&wo|%BSeN;;2+dd-$qqW_{I8{krJ;NLlW*8?U9zRCJK^C}*lqrKcEb z!#i`LR7p|@q*%7wPi)xk)}$Utpe1_%ozXY5w(u6~b)Fu&_MKD0Ug8+0>635%j6MT3 zWnbd7eq8z;x<>PmxA71q^T%f`=L8h$WcZ=#xny&I=v zr6H;TcJ48bn@y%6sWGwxHVy!N^_m#Z)6w+ZL5bAviztCuMzq;TN$Xg?1|PR#D@G{TFaC8;s*L71l-7_gRg z`7QR`Az48(Q)cY%&b0I_Y9<@gaYO~Lh*>d zIw#=%s*B=sVTZ><=#Y2LITtqx=KMjsIyWt=hQ!?}O*Pe;V|GmUBm9bzoVv>WbX~Qt zsrK}L8$HKSn^pl7^VU9sGRQ~gGMBGMq3-#yA-cmV%q!G`Xqr-4CXY2LL*8ASaJ1-u z)_ilHXO%cXiL&RfY$9qbn%>c61$z5sEO)ZI zKM>tE#^t9_$RkVc#(Z??ePE^~#K6$!RPe1&GJx=-wOIuMFOP#6ltgF(Gb0b;Er(!d z@G9bnb@CYgCg3Kp0RU{bYfa%X^pEG#LJb3$j-CB0nafp~rIxXeks!R4=XP7Gc;lzP zhT;sPzAE;8Q=7QeGl@iCkP~n`aauIgfP&-hN8kUc_kv^o_GGQ}$=t(2<9px4=^4~r z#>Wwf?1sVC3SW{e_ynYm@iVsle9Bdo)XW-cY4Vx~bIoqd)UWoegUC>is&<{cxtX`v zuM-~LA=|w_&p;qWdpb@_I^%v_y1W_A6ER-WREms!PtkORqgxv#PTd}S;5K*Aj74>M zn9kRVh#@-#K5+j)PlQ5~=b9h~A5dgNg0ZZpBn_r9AM6asvg9ROz4}z`ls+<5D|>wO zw3=~8o=22^bfISS_d#ku9j@NyP&uuc_hL;{=VwPAtLX$K$ZhuFUTJ{kXBgHs-h19=t14%e zdI>CuGUi-Ek$gHu;Z6vnDB zouZXQrEJDODRXb4Wx~rSmB=rt=y-gvlXva#nMG+p<9Dg}nU%>2V+Lz|uSEJ_W(fD{aWU&hyv7w%&xFmf#N!vc2I}(nBk=^viuBvjjjLmR_Ebb-iDt} zLb|fKQjJIk@}a@-4=G)1%9Hte z25a5J^Od~SK>EJiNBsew!h2aOky^PWP6kLT%ixzEeuYl^rU=JEa{VD@8B~<-q$D3a ziFPhRX_?!c%+&r)`0Q}vYs=5C_0&${N9N0qA$(i4p5b8rx6U6Kk?3e$*C=($ClXD4*u_c zL~HE>Nf|Wk_a8U+6MZEkGC1smX_HD4e@!mL0++)Lw>i64_MAST2H=fv*b_Y7vl}`^ zbwsX8@(J*?$1vz7@c}4W+)tc#Pyk|?RC0dDwJuv8Zq)xs20v|oEM^TzC)lyCwXIs| z_>az~Plle#dg@Sy5c(&rfSMlD3dExy8N=W+9EuAfe@#^Kfs4|Gm18{=)WMQ$i4|#~ zp--8v3y1(!~a_DX+b>n-9I{w zKODT)+RLIzKES}mfSX1kj<<_6Yz#&df#Uc#Ra{hkTH#a`vjL({;vRjJ1U*Rv#=_Q% zi896CLIkFytEuV`4k9bz$YAYlB4)YHFQhbXuP7*6wqk?5XaB0Dwz_{2lyZfM@rgCm z^Bt=9dd9zDPJF(0^{iPII1S_9DEK@)AB~+1=E1Ecex+TnsdgTQ`~y?^zx^TpUm+v~ zD2{8hQFTh-2ekG{HpD2R;q1kBv}C@HluODd5!WTcwC`-p`tXd*V78q`dH!#r{O@yr z9$Tc{(2j~Edk3oO4=>ixAW=a@y2SnaO+U*)Pf0{+VLv9b>(z2n)BHy?&e=snfQT$= z3Kt0>qF|^-(T>{o$C7I1PA2 z^7F+*Ko0i*uzG+SZg`~e$k_=H!u!Zuyy5_RI(ya}Yd_JHVYDsNQn}+|O)%NpIA-@5 z>G!jF0WW{MxT>kf$+3Wo#QxK&b<-7Q!ykdu&``e1X39w4cmLe0BJ0sjO)IvdCpjC> zpi(!GiKF_fq6}?YpZJm(c%;b}CUjI{G;gDZAD+w$etxn;_igWCjeQFOz?^s`Mk23W zpBik|s0}s%JNbUOJHY$zq|bR`+Z~Qsxe87z0NH~ogFMRoUKR-0G)!f?MI<$;t~K6j zLcB$f%Vpx%#@1&lKf_^|JD;VHC9D(@llSES6$v0Q^Z;lh|9bEN=p;RcFfimx1B(>r zXgz=c_4Xg$2LO1`vcuW5EbYGbY#=I>IUhxdT5stPhIGX(0T?4d5kY@{3{5Yt#~Cxb zxtUzKrSPD^yUl{&#&qJ)lfl^ZqR`1H0&>}}mIN?4!!QTQxc*n8($a?I#Cjs(RXiL( zi*c9-aC}CfWXS4I4Tp)m7NKg#@xQN%Bmh_vKv|!8sFEcb8uG~M#&3ziB{w#i1Nt|y z8BG-%8uNsmUoaUKDe%AEqhJ1iVmoUJ!@<Q%yA22XIRGO3qbpxu z?}=nCc#Qt+TW2O7k^V;hqjHb+8a{*3XO?yLIL_?LtJaH*z9psdrO#1Pw)D#-?G%FZzrq!`}YU_gTM0>AomMk^%qd87O+>H zvlE!wVG8hR>wkTU-2qx!MAZI805MVP-2t9cTZW#HeP3Q(RMwy!X7+NlOL8#ekYzQ*x2Em$FRj_$?Z^g&_-mA6 zYA9t0+T2Q@@NeAGA-1`-UA~)uJ-<{wI(?zDRIJb=7f|6`YbvBN!67Wcr2HXckMWLSiPLOg)9PznTc(gcu) zHUWJj`N$l?1nP}Afn-4wve$X*bQNSt*w_yhho)}H*24G)2QOFQ>3Yv4d=R3X4^259jC zj;rx)VDt?A)x8I5XveV_Kz+@n6%DVwx zmBQ)){c8Yo1phOMKNqzW7W5d1Jj!Ok=y1U35B}tiEZh%P;fuFXH3f^bbo~BL`1Mcv zi*EOywI%fI$S`%ahB`+K^E+qr%L~JQ^FhN|UE;$jML%YdU}3704vs$| z-}$Z!ew-E*iv}$hd`gkvqY)gt6Zs*Xg369Vgzc0FXbif$2#c&9UMy{&m{4k~osw?w z9hz7Ete`md4I_j3QkHp^DA7T-#gz2tnH41j?P)a*6xG`kf7=~8vTCI9enF1xf*A5D zt-8R2f3HI+AyKp1G^I;WN^B);zq;9oWHcFe3v@cCpxPXq;#N*p7!Lfbh3(U~{I8}s ziT~9!-r?qmeV1a(ev~;EjiFJDcu4|MT1{WdlPe?Ya}A{&@jbHNFrs7SqaSgv3fh*z*Hm1nrRdrAi?&j$fa4#{n zR%x2Mt3$Wk2?J-7eQ4t9lLkML>s>JycLfls@3amK1D>KVf)HH{ z3|Oe`<*x3<8eZFEM1&+btFXlMps6?OJjFT|0V~~GG3H%sr8j~MZKN|4h62VZEeUf{ zdAdWRPGeHeoB=+r(Wrruh5-#(Z_1Pzm~u7Ih8)!rmhx&pQC+`^+91f8HT;)nr7S2PCtB)R{c0{#VeX%> zu?I#0YN)r1xG~n&z;=a2JqSSrbyT0+Hm=FJpJf%bzl6cIc2!Cn8Do7gTu(V(&eVAj_2qsOsK3R@K=MM#UqZv^0JZbU1 z!FAtdj6LrDq%^5RGc{alrGN^EQ7Yzgt0+akJmqk=#UY8SIWz~VUOiFtMopHUJCBmD z;l&k1g%7Y&6U+#d2+LB*eTvl1=^kPh2P@T`T!-&CEHSRyy-8aOTXI(H{Gpy{3ZB@+ z*~OceLqmxSNNW0)EamyAn~Le_V}BQylYDrTC4)pFeKuGy9kUbmK?&D0eJT*C67g)V=LKUQLboB24{;gC$M!K8-r< z^gxNaV{f}A2S(Zd&rQc$FW`5H9oT)Ag_~fup!?26g~XozDdIl4;s=zc8|EDbLMH)> z3`hr4IrpWT>KzrSP4(t%Iv8mhCAjZT(Be*`tVEL$$>F|H-VvOQP8k<01FqPB`bnD~ za#cI|tNmSimyl8a@Yx9O>I130hZ8B~ZkyncCgyLuc603EybL!ToVmYIV~-}pTD1^s zY-aD@amk96Cjj*?C_J^r?N zS!IQ_8%QHR*EeFePA#>D`QC~5v1{ss6mz1)8A9Q`pZ93^iA)#;>q+(oIk89GKmZ6h zF$;hmf48{8cLx6QYk9wXazGh100WYSfjsSNvDlg9au>>iz{eIt z;;y+pj5PMx>uMl-cUO7znWXR@Xs}`$9nVb40J5k>1bk00y4T z+V^kdyuU8;8Bmgz$^p(`evTB03;FBh>97M`u}OQ1uFtzvhp#Zt8o#Cg{9Z(*87+pL zLFZpTQ#c>Gf5(hO3e<?7#}<1KTmQ9LhI1bPJlSSE#dI+Tkoxv@AQ<| zk8!if z5LQ5J(gn79wgTMl;5&SAPa_s6?*%YZ)?wBAlUC7arY0|-wN6RsO+{$-Rv1rITn z6Ag3vx(cn#u@V3!o?aBBLIPS?CHLvmW!JaHN)jA*r2osymz;OZh*!2SuC#=x?~i`( zXY!_L4B@#L!#OU3v!-tz5h>aA$Hu1>7bw`2QR9eSj_M$X>t$cl;L|8eJHBF#XIj-k zIvJJZ*y`3x$C9iX$>c~*uec+A-m$j$5)QM>G^OuseNGdri?v+MdG<;`ldV?>CGQ;j zL?VX6J(BKbtFSNqk>DSd?&RR~9+r<-R7}P@3UMjbk4gO>661p3GwV{df1NBNoY%KA zFYJf--Xv@DJ+M5wIxFAH-2NR)J5~C3MUc~b^0Iqx+tLUq%U{VgpA1Pbo?3TY#GR=F zfLWgUByX-qAur8CC79q0ZUj+lJe8ORO{x6)n_yE7t5wpSs*y9l4|QW0)DHp&=TfR4EJ3 zr0k2mT(se~e&#q%{E2-P?~KslzEA!J_d;6#L(6^jig2wuF8q4{s7n_m2X@bx%F8Rd z*(09!GK*i=fJ~J6MX|(KG|%X|Sw3omMB+3VSSk(SrwHdzFRdMVI{8=5XO8waBrwfh-X>};@N!<4AGH@N*FZ9OQ`>rUw z+u*iU8hK4-n|T654JrT?C|-oCfFUQn@fhZsBd0h+}sFOcZ$%!Vmm{c`Qem^-YqI0I!vGZ76Z=bc0!O;973 zf1hTM<-_*d&-Vt?k)u!;EuGlOsXowFv|!NM9+B z8kPOahsk=zqF>S3C6Sz?F7{>A8L})hD!8KC{<CIqUjg{-D#G)^FBt|;0ohleDN!ku-6syfl+pK!F8 znJpVPlKOdV3||K99BosEAlx$lk=sG zXZk*FJ6J;QYv^0nL4~n+@){4LfQMJPBzXe2&NB=zbcu>tF@};BkoPt;l|H&bQ-r~a zi-?+^UxkY)QT}Aic*oeK)V9e3LN&dW_D_ zaf(=Ty#s0m5d@4Efww;oEQ^mOK9D}Ah6q6u%kix3uozP3fOu7kH58@63&Xo_xd#56V2D!7|F}r3h-x*C=x?*wyq!ZMex$=vg zx9SCk54pFL`0$aLywqfFSFap6$JllV<{K`2quQV&JKe4RNHp~O#)}TOS9cg7Z0Am6 z$&7lcEYgx0Rfc3XBji#m(j9?`Hpr}eubU}||mP2?rhh$HVqXOlla5$032Ok-q_ zX?8)ezb`9bgNr}s5EvlJ$2mvKJdc`!VSbngsZT%QLdZpo(?n>NprH?)ZVE`@G2Bko(x%**{E{ye#km*aPUS~Llfxqk$c?Bt#2+F;NuN z2#S#pcr+=>H}hX&ivQgW=~neb&B9S`Prad7)|Q+0jx!q%$7+>B!OQw?-Vx#|PI_qpz0(St$op8J?e zq&ck5x+K2FCL#QVg73Cr{!u+&XzTV0W}dZLijYDOw4OUdE#<>_Z;DJ|Ik+~UyyF=Y zTQ6ZE-;`Kc;gaqKHKyP@DWbvDDUmyL&-iJ!pb75W)p;3YQS?%EUnKyAOQDL4| zkO`dbp~z1rCn9)*^nlGa&X0ZtO2&vyF~|chWT|rq{EMY+3yjf1qJ7It`-r!8jDn)EOoQtw?3m5k*_;I?f0ct-SZL4QkB{n4GMNg znP3sIjxO{CD}M!bt*~up`gN7ebWbZBy5Zlt4WxEUn*|1zoMYukBY!vb$wC?I{w9ta zX7m0fPM#3@7CS_Pw=FQ?)4{cr0 zyqiVuUPsO-$d;wu<}=vc1a;atv54{22t3$;zBQlnL66c5*sRa$T%ZJd*)j9BRynZU z;?HhQ!?WymbuuJU285CYH`BHSZ^WgGbbT9P*F~B#?dUD3XEbGjx%~#TXSrat>T-w~5+PfSC^D1A%)7DjA$C{(ezQ0KvC|}*NG6CY zdSkh?95SvoAau{HB0W{K1ASPm1}B2(cc6{b)xvI|4N*y9r(PbYpzN$Dm9lS*LRuJt zxVQJG8`^KS`eNQBR12zP?$j!FKBy9MbOyn;aU?4l=#fz}h!J7LSPFBz`)8)nb0dK@ z7KTamRAl!G=p%b!Q4za=yRIT-lM}S!y~XQ4&|bh2UuoF7_w#%K0!JC-!sxw+XoV3f zo4CJ9ksCO1umf3I;+dThJ4mw*3#z@1v^HlIrG?`lGv+lNwj1epXjB}@;Zk3XIxT&@ea*93@NaQIB19mo&Z zADhzvsY_2xoaV(D&0KT1v-1Oursc!1xor;Z4A{OF>N@Z!oCBcs+)sb7ljA=y#BU!b zYRa3Hw{W%`oV~ca^tVu8B7~}tBM4zm-DCtddBh=AUgjw(6x0ZM(p+e#NfpEVq6}0e z3NcX@@KOp=;VVdzW;}+U-A_A4e><^*-{)Z!I@|zy%6KKw1_-=)qhe!Z5yO$FqC_|EE(g3}O z@ANz0TeUIqF|Jp1{xm}$MODM?;k5UO@4|-kX=~r@Mx)Gy=zCv|Jkt`x2RKBDVyH$R z3E`riVbm)1E3g^Sb-tO)4uKK3(5_ix%!ZqiYH8e`3szJ_uD|DAQV@jSuAo+IZ=L1x za#9D~68eh98nCck!TmbCV-T0dM@QQ41~^7GfCXdzE`eNu3QmqE=KH;a&_mZ=TV_8LGpZgL$>ExxOOwNAQCyzPXudk!B;Xr4@MVrHT1; ze6yaalutdM8TzYpUpdvqxQZ|0R-ujonc~7zCp?EDTsS#2#pk67joqB@3&GF>>acKk zFU`)^P04qF+uecC3hEG8Vk@jAFlTwQWJiXG!TZ#^fjxk@2aRqwDsN^sY1+Nz;FM=! znYl)VxkrqQ&FCcRZ9YO##=6}nJWk{(Nw_Bl<6XvYW7wF@+;0qK9F9a@NZctxS#q-I>3D2S`pC zx(%rRLBR6-xA#q{BA!m9pxz9TmRb|wZbRvm?T(c9&!t`e__+DAkHJ77j(U@`B*o^! zh@XNfR#^#zlhm|{uzTYPR8m(p%Q|}Ho?-!C9ir8}ikB150|3~UL$41yBl{H^v?e(E z2g0-xj+*e!3SKXsfZuwgTkpg2^#3m3z5qD^*nt|a2}|P%jYllvr=XR{DBi=4{(R_c zTKh-SEgUVf{|*j~C8y*=4;Ia!y|*V2M5}DI*tWrJdXy!;ulJ8ieesji(GfBc*8n}$ zL)=t1I)`MHRt-#+YqMXF^83}FHs3~~2cnQHMYH-2J(J4F=V&*l-o_)W`G?>5?Oppr zmVT!1gV6(BH`uY+&ahYGqRcU0B^=v4dmB@;TdJs^r5}ceWOFFN(`;<5{?OHMo0V<- zbS#JU>rR^}1iZI!Uq!K6oRbWm3Z4o3V5sybS37}+ix3faF}@A^dql|CyF{O$#{fq2 zA|R~GRn1X1nf%84$$BqOLi~+9n{DWwD(PoW<|)%A?$iZGQI4*EKe@a??NLwCajC^a zUZ`INi+S`18{1#CFj!$w`&vCsn{0$gO1uX>_x{bb~nN5uHq;cdLqk2&qmgPs&LsiO~b+ta{18OGToXe zELgV0Rl4@mgWsdy?;?4$%{91x0o_ zuJ=i#!E8*i@CDfe@j0gZo&Ggm%bMLvb zDHELT1&Y=3x7wiso5@cTHz!sT(iLr2!9MTu7C5IKMx3tMvzZ=cgMCudcG@i65ze+G zF%ezZ6hb#QI%Q)&tf5nz~D2*il#V$r_~Ni{E-t<+=U?&nwT9)yl3< zj-JgVs!%=saZQUJ`2&psIR^@fzm93bNYVTIXgWn|kT}$`AqkspDaMVS_Sg#TATF%4 z7pvQakfRZ%68!b|WZ13&+VMK);MaoN2;gaJZb-tF003~#dFBWE*1Iv7^y^B4SSweI zSTKCsIN9c-4LU|`mD)0>Cus+@Hs;>7!!Nd~Co;JE8K*dJpa{dJuz6Rq{B-ZcnF~do zy5^~hm8JUT7tcMG`6BxXYWU7_?`-+|x^M^=D##|LA3(tF;bcH&2Kyo3*mWb$27`V} zOBT$j_}sTk7#(Pta62P(0l@)s(&C6@EG*EA{u%{iE_NZaD1IqS{a5<)=TondTJeGK=rWcYp?H zgg??C;N#sCh)`#mWS?}6I1bA$a?y-e{vpwHhU1?a-NA3lhR_Blxe5WU+Rdz{8xdVP zF?~X*0E`T5W1c!v4Anh={)I=6l~+FmKJf5kdTwf?NNt0^S3M)=wK=dlx_rg!pI-5D zIm}+F@4GIra)tx7^w*d4iQ4CVn+#Y9T2`(^mS(fNZJt{%!;q9=On41P&dpDuD?+~F z;h}9U8%LE1@^Li0S88Sx=~)IOLk@7zZzi4moW9tKm1uR-rh5zQ>*Z=T5UZzSW(t{obB5ctTvhL;h$D(kKnD^-?n<&ZxY?QVBJ5^XeMT>WrDffRfAN3Ja) z!29OfQ>pwKcYYS$!7tsfJwct9N8*LMP}7hQM9~V>wmtl0J+JBAV zyX7u+p^UF+2AMp1g#O0c^_sv%=5X5lSzT=layc;6RxyJLGw}L>UKn+8C|!h_J+N6u z=r87~Ge}F^L6t}V$U-^0(6UVa*D}CoPsbL{xZ+KyO37joj!ZtAm1q@e5pdUKS)V+q zoXfz!bwx67?-LEYRLRTWQE=DK^K^H!Z*r~n3EzvPP_KwAF(fVc0kp@E@(s$}%imsc z!Xdxo(R%2Zn|nBU9CO31lsE#e!`W^EygQ}X$t7#lkaFk7t_l|YrHkoT73CPR{5;&8 zZk4UcGZm=+Cv>54Hnp<}urG~J#exwOK3ea(&nSE8q)x+4XzQ;C`&}SL zw4Dy0JSjUYCeN_#L#GBgUq2@pKqk?4&J=g7111+^Q_Kqt*|BbK+y1n^Z?6BG*LQ8I z5dj|MJEuMJ6L1ZBOm_eG>vAbpqN%!z8t>+3Ffoi@zdtO+j68p~uy z210xe3=Ni$S0g1zsvConMKdU!p$6~pQ-w=)Wi@~P$?Svu7A+*EhUrRqE2x!a{3*gb zT;);%>A7kETV61Or zTP1}<=#L!gif@!9YN%WBcf4{>h;%s^MtdaqTUKOxdA8>QYSkd^ZqgJH*`6 zGln*#ZSDSdP{bZtvQjdPJ2s$_QnZO)m5|E?<|l1HVQwh2Y$o^&}- z;fD+7yB0opXFYiT^k6d1b z3{$h+AN%u<;P)f?G6fO+{uPaahH_;KFvR``gCG7W>Q^u<2&NFppG~D&%zkn_sV;>r z=>mhb4YD)a>|;Qp;L8nF8}9(1x>wfo?g_zqw~OuB9KRz-NwM=bQJ`KW=sLVG6kkSn z=!|q?C1w3n7m82|+dRnQf(#^fQU z`tjz@`IM~QsUcmB;ajD*^J29KalOJ8xzbD ztLtD#s`11txk`SE8zQsl{+n)2EiO$*jPJzTX!UqkCCaMe5JlTr;!xho+Lb8kQiWB> zz#P?9Eya7hBPMPJp(K4+xQ+Vzo|#NUsR+-RUi_TWWE4GWD(GiE<+bqL!Qy#&dFaj; z>4Ae6X#^RGKoA%8tb5y2*U2MQi_{k8PP}8%kzWdr86kx0(UGSMW}e@80Typ&10L+z zGe0U*$Gsj~>iYnrtmy~6zCp_d{$Xk9iCwJj23{|Phc>~gB6mK8u4XL8#nAau3GEyF z`IrD5+wuTbOasxjC7kSJH<^;SjCi=5tCrSoZcM=*Wa@%xko*9JWQ{s1CH%NWDWgXF z4Lv1Oqwhgz^EpEIpaS*L6N7$(W$Js@2wMdR_#1@L%kwnMRLsfn!o|XnvE&zbDsqKHd_$> z`+~uzP@24#w|Sk0@V?krM>GeT89I=5=>ZFS`}CD0vz*431UUfU9oAc~`iMT-(}lan zb)ntfZnE#Q0h1enyw3)!b4K{BN_+h0PK&2SWjiT(g4up*83{K1RKnqM&j#ys9vBLnCs|r)l&U*|Z?0#=Aol z9B_GbEAQmz*hC_CD$2_7+;A*Z@4>`xOs;E$S`KPH$BJcR;}Th7 z{6!Km_ZNFxU0BRG2PL$Nd*6}_Co4Z&FWMHfBD;nfKsPXOVU6e+*hbKMB7k=Q9xR2c zP!+;?YYBr?t51+ynTR<8Nhrdc=?MRz+}fk5EoqbWAbIr=?_p}jncvX9FlmPVJ1?|U2EXHldBs2 zj~fy*q_Q~KM?Q;|?y1aLn<%@9yos5&$4B3<&dBIiJF>d#Zo)78ZeZ@I)5AYJ*%`38 z9ycUGM(q*QQ0+S-^Px;w5ZUb|k+o)Q{8OwO!FrxK9Ccwh#x%O{yozxY_;kQICyJfm zwpk(f_lix1BQ))0CRBa#(aPF$nSn9BbGJ*Oaj1~SBkFZ%Mf*qC5-F2q<5?ML9?s!$Hf>uiUnRu$P@ z!fqeSJtlNQCba@BLK&apsh)i4-&KIF=TLFOlAATNT<^6a%EuOAUTDq ztZ-ElevY8IUc7gQ0{CFcdJk%!84Oy}Jl?wd$4(Q7wMNgoYKI2e-X2Y!YH22HfnQV0 zrF(kl*4eY~&wVpi01s8p?-%BiqXa+CkKeIGqjLVY7@6yz22|bhF1XlSWG>vw?b1pp|y)BvCQo~ zf{H0(g%&ZwXP~=k7!pv^(MR;G>!X6$x76F(6Tbd__{AGEB%-JQ7O8IRsr;F8$Yi#M!`1#;3l9|qhs^F2 zyLWU{ucK%Ve`9%bP!D=23PVZlto~S4nfaldr{`XE70}ffc@TW){p;=82OrI&u0gD) zKK%1}AKGDy+cCtn56#vXp&exU%*e7HJot^Q0zS}IPVXtwr{w&_N3!cs|0MOugaCLS z`;|jc9fG)~p};5Ox=%1H3pmu~+PTo)s`7 zH7bTpO`FpU+YBKS9FhyS^hN1Cfg@b? zliIr1UYK1dwkI|f3Vxp*_lrpZtZ8a$v!T{8JbZJ0=KCR1G0OfQAe;%N@{8oyy(M4( zvRwlJNbIBU(D;o2Rbt2h5-E{{YKMI8n5Ph%Q9Sx5f31_aiB=hIpi=K@GxR~}c+PVF z-#k0ZYMlojb2GtYJWirFd}!}fG6GY23$y>%G3%yHe08nv2t`J3Q7WEl+P=Vr%XNeP zoB+Vw4NGi$Q8JdT%9BPIg@m~ym?Cu`Y0Dqna=zQyNQVm`y4!w}HAROwp@DR3UoTM# zYcglmxR?{vxdG=i)3s}O7$Xncv-t-z|0HFTQ2Jch! zb0d_N&vgX6O+HIF=~RJ*swp1CZj-*qf7OkeLVsdjdJ(F%|3V`QS)jNlM#U- zGjwMa_YDnv%I~bsguz@nvQT;rzL-a1ouZidTC;MrhY`l^wX+&-?kQ1zhj z!~%LG=o&(fB!u;X3u+&^~V? z)9ippnm!9v1fv#ioS030o3(=XRo;Bb`YXxA01#jsmq2HYiBI?+ZLHI_T( zK;B!p(+n%2#waH{9w|QlicU3upBd8ixZLpeQ_P`^=3wQ?Z%F`Q%7ob>X~Tns zx7zEqu?ycn9?q-3=FX)PVZGafDALfLHTAS|&jSn9!kXTiyA!xxYnvtDqfZ;PC7|Ta#_W-Sog0H)RIRB~8ap|@Z^rm@2!b(qm#ek^|qkfKM0$w4!mkDfK3XNWd zW})WM%=v#K{D1r?;pERk@#i8Bi?XFYs-Rg9=kkN6l*`i?Z8+Q1ABcVbnxm19rgpa>Fq4k z_J!}Fo_}}1(asytq)jT6(XpP=q?!3$22bPBI$KeZs|zD?RYZ>OFO5uLg zgjYZ~7tJD+^=(oEvc-(|mpo?~^V&y<&l8gnt-TjAYyDLjdmrkc<01WW(18c+R zose1bd`l0`qR*72Lshkqk(PD0bF!x8fNCh`gd-y`CLw*wfyX8UwVPR}g2~0j*YvI) zw~H7%^TS|-8|BtM%4vQ-4-c(3XMv4uT8|i>}$x^ znNecd{0fYNm?TBq&YV134tg3 zq=#y>oU$o5>(MLDXBS$K3eGO%GinB5;H1cU^VCSb`na5>Rysvzx%3n6{T-yfglcTS z6|VtH2e=IK8i41~Z^i#XBW9Ejik6}6f$%8uelW&TGk8y~LTk_9Wyx|d4&kzdNwN=Q zK#ZMPxrk22FVpp8Ydi_;oZDM5_orN3gjw7B{bB-Vy-~;sZ1YmB zfKT%cIw}{%L!Sr@?1X>f>i*hbH&veenljWxY5h>K&}-5GiJPpQu@KGY9=o7S?#83P z?ke!8>04Fvu0b6Elf{YzEuPkLxw^EbLNreZ_)XS?I+a1C3)cQFrm%k$w(DBUpJX!+{&z0QW91!ua5_wK_YF~HP5sLzO5B?=WS)28YiN)7N znx<^@X6x2ZiwGhZBMzDxp`=~}F;d^WeEEm$<0Tb!BY*eKoJxAl!uZj1hK4CFu!pJx zdGGu3n!%}-=6_ZjlWH3eXN`c#&!?^j?p#)CE^wVG>D%Xg}$F?@`^iBOt>kH;!6 z!AS+l+3!hFXK7+04t8d}M#8Ee zrp+Et&+a03K-rc3z^XrM^5iEq*2MyAll6Wyb3J>``!Dk9&C}&mj!1}=jMh0jl5I^D z0`CnO$wTlt5N^yJbTW-!_yjT&r7FJ$$~IrJPQjK|Qy98=tf#j$4j z7GKG6jNggMw^Y64J)zg};4Z#+8v$%o?4?fm8c4+T=5}60qRW@P)abY`@~B0hf#Rhl(#4LW2ZuxovA;oQiWg8Zu?N5p zF82PtdnO1KuQ$v#bg=^|o#LiTekDFjh@i5r?H4L-z2x@m z9BmGX&}gt(eG@tU&$%76lLC84fUZ->Ax1LT#las0?YemqsTBD5O>N;OAR%x0UP}N{op!-SHw9V8_VvL+5C1Xa2 zWjJl)Z;*bAl6ga*h1Fu-kGAxXHP5ey!YY2VZqk7=(i#}gzp7n&>^@CI^LuLNv z*Y5+7P~WL#sQ&$7!I6Qj@C@1i2%LKaz3#TJ9#`IkT{}yxf29RPz{ST`K9g*SN0br+v z`U+N6czlM>G&_)#X87Yk%m(N$B050udn(HdR6%5p%)>L@h zBe3~mY%~tU*>QWWkGi3RvNj1bSYE%S_&u^dNR~r@JGzIHNX{rj7 z+NL{goy{fSckf>b($-16fE?nCr;Au;K>uL2bx|SK=F2axWXBqBUocG?*0k8!CSDJC z1xtiuWB=pY)GRtHqFo@ry65O5puNkW~ea&M>#1( zEBB5s6b{PfqV6yRlQmmt&O>u{BSIkWzM`l*hWpuNgS(dv;KnPvd_{6_Po@xM&)dXv z)pSGcchif&cUqCKuZ>PmAy&8?Hl07=5AXFpIF*SNe7iuS7Zljx%2GcXtBHK&F4MhL zLTB0$C75w20-lwJvorUY=l6-{8s9x^1pFVRG4qqQGvayIXL9VH$H6XFv(E$3i`Mm5 zpXzmtW3ZFg$b_Jw;<6JzK9SR~#0^L1Nl0syRWec&UK3G2e7&To>fU^;+2JG)C;cXx zDli+2X+H-qH0WcR28(7F=KOV35P8N?(|@o)-STmDZ{BOVf;@9!zuSH>-6Kj_Rhz1d zo^rNhgtKF8W+v2eq+42yCiZ40EZW|?1DQ)_)*}0T?4~IIDWuw(>!?*aA{_P0{&5ZR z@oWp>LGF)oL-5-ddPr_J8?r8Ei|I-dLO6Yq1E9A7q^da7uQKlwxT`O%8zwQM^E79 z;c1pmseuCFp4_eFfg`9WJeNOHkYfiy@)%Q_jJ${OsnW-l7e3SzVH{ZUH9G_K-@Se- zM{-2^F8b&eiEq#U)6^6Uwu^glMG&1MvpRHQmyk$`m}hv)r^kw}$?G z>fH_BZ<;eSF~5|zXTMf3`7v^49+okW%K_ioPkVr+-^HnJYuV`kELS^ z<2d;H`B&45aESXNUQ+<=H~fVG9Kmev6l0S{BM*@@lNE3IhP`+1Ej7`O6`xie*yJmu zm?vM$`|Ro4d4-Dx3r~G#jDVrM=v>3&ievT8lpOjuW>{ZAlfH_!?LR3Iy5)_UV0YzS zE6cva-b2+Z?k|4WM4T2TGZvuUGaAsMd)2-_dbZAouL^y&c;)vaKwtyL&Sk6p16weA zZ{)`BA-Ztj0XXOm9iI6ZwM5)3>gBsTcQ+1TNCXA{n5M1O$^Eyb@A&v5(Y$BQ57SBi^#rEl7As`FZ_+*j_MY^-$0H0($EYuRiP5x!tUtApo|WI1{@4NR+?Q~- ze}_nB_#I*a3(u^nwafa7=LE&~73Ef_uy*DEYB-rKdMrL8gw9m{ZaR&`k(13A*El#x_zTbM!>sG8ii`Xw z%<)dYL21%8A`oRJ{nof8TSht);R5GJ2=c0SuyVOMZgUSf-{H?A_Wo0{N2-){=leHC zFMze#scj1T_9`GfkoqVkqX-I&Dfbsc!p1p4ua5D%(p!H zH%MYZsgE6>+?^KGe-PJ~b@=^~ueDcQ)8S|QqLD1x2)=omQ|_j|JESuHIry04k*Zf& z-hpqb5Xma4HGEWq>8^^~-H5#+cfTV*l~db*%$Z+8w&#`^Ey6U65K>O#I+|T&j6yAzKhWqa=h9C~b{nfLf)ta6~J3x3)vR4)5w5~&?a@dAdrm5e)8Masu;HxG(J>ER)gvX$A3-ETtIB+z=_PG_vw zp%#QLu%tv|Fy7~%K2F@<O3%Xmn2r~&d~g99aE^Y86?_w+@U}oVaeB_2 zhVbfVLnFMx&NAd+mE=edU@ufGJ%6(dYhh-FPK5r8MOze6RO&J}F87u`zXgh$RtD8A>z|6~EM34=|KB#3}!sK^IGxik^eP(HyXyPfmaQ&*nx3#&&(`^uE zBE5nm6ArEE3+Rb7YRm&}^_(FxW%|@v9S05-HV)LOpI^L2{e?2EBAt3u+S3s`dgkI;KDaOJ^&RY78pG z{(fdHXzZ_08Mk5JY~7)l{22P>SExVI1HGhqY9qSKv;rc5T|8n>C+mB|m4ac8leUSX zIe4)1x!^`9);PXSze*hSRe;vYTY;f&bjjg~ewH!i!|mqJulRK~2!~dC+c)9}e^)YEC=Hg){jU8xMFj}OS6NaV+lfX+U*iW$*7=(}Gf;&l% z4y{|rF7?+2h$rSPRqT^zmjQUxl}DlOTA@52VOQB(MOQF_*Q#ZDLmy!YFkaj!18x-_ zX3F2FFu4iX9(u}nGd_v)%Irds<;u=VX>fhL__gjt5%1AC!ggC zo-VOh$3hBi21#6RziYUAK7LvlE&h3qsfGDt+nI!#(!9ghZ-Cun{%0q^>w(;lr+Jv$ zWF)QbddF=A=-;S9Q-<`UQgp)6JAI*quT>w`7d21ShCUXC^gOtxRzX@JJaC~|{j}X) z4tEFho4goD?7TFVl@P43XKT=5Yq!mjEZ?ZS zD&BD|N-1Dn(nBazg_bYFV?H~Mm~3n0dBXF;ZdsTHL;TNDz=LaZZ(yoC%;PpHg|3Z! z7!z~VpVczTW3l#|uU>sI$4yHeC*cw+z+rB*->7Agb_jPL5I5@n{Py-T>QGMs5|@=V z=|I1^^#bGQxBpqhAbHFH4|7l%Yt91slr=F_qR@+L{#wTq)!f|n2nhZZPM4FkeB6S- z{6yWERtS=7v6&31tM3(W=!vY4H6LJMigBGv<~F^^g-h4Q#?zg#Jsf?y>tQ~(K)>zh3|p`sNYAKM63>q~&yC1S7kAZFi6q~)(H z)&WBb6fq^{Tbu51nZUf~Z%%ZOd;*QlDINqW?2x6fvzYdnhp`Bt!^>yj_(5MP>+~Cb zwBsOm7pfMFM5JV}n$(lAcf39+=v1Ht6I(v1E=Hoa>McY?tj@(0ltw4laXHnmNQa}6 zCnD?0X%ouCHy^bv5v!SFQ-kgF#kk1n^BZxH6M+AB@U?lSD?*G66>i^HZF}M)#!H`& z^yTPobT_}=!))?I&fRk{qu$c%&9T$Z!sJ%7Xt+33m=xw(m`O~Q0=+xVXp=-~vjB;^ z{D#=k?C$I-4$2tvTf96PCnDuGcneOdU*^YVHOC$pGd3STmn0j{nl-jk^U$dc)C!~Vkktm%_? zVw`(RR>-Em`4#c=q0N6}UmY|b;5RZB#6>&iU+)q(q5C`njgG&NnZuTH4#RwROkU*J z?!2h6h2J!6P*W3JSKgMZvBWzusKz=IF;-0BUe^G!*Jl?7FA30l$npBs7eKPHNaSkb znf&1sV($@`>(I>294jTI=g2Vr*S4%= zgmf^S-gb<5{%vJ^epFGPF$T(xS82_Z{L4BjZF8{8tM)CP#Wp_=rw4Q}vZ*hkRDjcK z>-J>@EyMUy2XnOlH~?2En(1U;dhv`|C3?(>q0sG4otBt0c#PRtJyMleqFdTSsUR{E zXZZZ_Pul++;d}rS$Fs1oFx~SO9U1v{CU(TS*37!~boye>=>Hed8R2{i$WM%%O7drE zJx}aUyfjH0-6Ud%>@iw&)Xzsrv6|0EN0Jf8a|{AKb~ca`UpB}eJ|^Z&U}%~6XXf9| zN(`K5%hF|H;jGjF`r5AM9=@B}l)R@+b)tcVh4cP;wYUSPQ${;#3k%6ABe42HnM@FbPdImg^50hfvg57Tg?!k%J933&$A1T~Cji(v z6DT$TIQPyXse?xkap|y0`<{oknf~t{Gw<#AFW|fT$O|JXD(6WZEal_|f#Hrlw?*Z% zvJKu;85<}m)_b{o2tXgVjpW2pGXPvGFnO9@!9R=5*pKs%gC9hbGzE>O;zZK?R91hq zKlPdtCn;${KCB?&H+)gE-0mYssE8g!135x zftMTefL8e5wnnw}d452pVmdUwPe4Xz9E3IDk);q6np4ODwfOv~L%=v_tx+%NU7cQ# zd%a#zC~!>oi0%`ZTr~hpj^z6yo~8A7%3|_(A$)i1^+NU2jQR7AQVbTyZX>VA>{(2l z^q5wF*7pE=33Lw<3(!DJ(yoy!*F2*08!1q?vP@MWXZ>)=pUxL?POcOUfbE?BAHcZ; z9ROgUtu@2{-nxkGy6XI+Nz8C=oabW?!~|088&$i5Uj6^#1ttHn^N}H*_+zm{+AeZr zTqSN}TU=Z75_A>w#}`bq;Yj z_ozt#^hW_)Qgo*OVc?#Ldq&n8J(yyc4mKxcX-0zYsqypG{B-M)u_zTIywZ5y{zp|A zAZpSB4~t|Lgyove;#b@Ll0l#$HX*HsH6k-vjFzr zW{?21T>|Z%LUN#K0xceBcUoyGU7XN=Ko4MtPVv8Glp^4&!KlESLopHHe+Qty(PVf9 z+dNoNnMDeK{D1VJ0O@F;{RY|^&?evAQv@(uP!E5e#b7lp@FmPpFGqb*~PmXh61l$Lq>r26|zLDy8BJHa_UDBrm zA{2wu0fx~JG{a&*3k+y^@ONvvc&n2!qnFPxco4 zg0XE6!%%aAVcd6P2SLjPm|A85peyb@*$3DRkZU?~;hYqPjzInaO!S}TBvZWyD*=4D z=d097m|5tn><4Qb$=IyX&B65}A?xtKxTx0NN!$qP26F>?W=`;(T}n0(Fmb;LF#KU6$n|u23*UE1`^~UWjLv7DI8PK6O79? z4#H5YOP1TP=MH+Z48q{77Z$1EJx7>N<vX{opY7Xu(F$SAsQlz=`Ky6MH4l!NV8YqGs6E=@Dmu<^4~pTr)R*4 z1LQkoffGUO7k_iHAjgCD%k`+BI9wHF5+^I@N=Gr%{k4|OfcVUR#BtXwuOwJYBoqPj z!kxK;*yhxkChL>sdLjQkPWw;CZLE{bZVNP83cV0mC|fLUp9+an7_{3J8~A(%EuEvG zRWqj2V!9WW*mDCrpg$Ny-0h-Y?uY{!533h`#@{QA{lE5w0$QTh31jcI0sY3x-FGu1 zVE!MLNd`5ULITx;pbpNk&@X|28KGwa|L05;po0yN{yVSEl_kgQ#_bl)dY#sdAK7I?9<8r3MNXvy+$9IRVU>?P>gf927S^oYn zEFFM$V~_v(y1xPNujZgbJ&;#0K;*0Ml!T4KJwkQBig3xU?pOC;Ou@KoPEP(ieBU$x zw|QA|tkS++{QRb5A4kcw}?Nfwc1fUzSmlg0!wv zjX=&i4FJU2BIR{CKbE%#7;H2cQVTZvKa{VP0VK7Ns{AK_4U2d_dBo1oj-IE%U0$Qz zZftO~NY!|}-0!2iX$N4T5(qv3Uu!PhLJrbs^4DYnRXpqq#=kb0mq1?k?RTvKo*2IOVmuV>#2r+}_vATr zHMMi)y!sHi=jm$)2EV#aN14ZVojA37uKrj0E8yAFhGaP-fLzgi3(5sLcE+0e)0eBs zXZYAJu0@35ycK&db{Tu8hoUU!%9vIgljSN-P%fAg4ghEm#_O8P3?WL_t(`$(r@c9~ z(-y`=1Owr-ikv}*4JEA<-@p9I(D|S0$ip0+Kdkz|xQqg_QZZG^a+ePmJFm<8v#&Lw z@5pB7u8wNxHzpb=_8_8B=>4~=&744n(94)sA%l-BIGu->C*KLVxH>Da$Gd_lm0z&P zL_caHAy(i^#8es!VcGekjKb1BT$`nQ>W957cPK1nXrec{IGL6`tfb$fBdhxB(?x;T z270@qlrTclt1(h7(eO1lI6)49Nf;ktM|^S7pkc}B|2^m-cDQxmE$Z2s$0sJBhq zI*Jo>eV|H$`B@WCW&$Ym@vx~s%Unqg&lQG){HbUDb7}zAwb*^dlm%w2SVLLcWKHcX zHdndw0@Wo$Rz~LGEKG&NIyK=7miJmuKOk_BRb0D0D-NA>FS!fUhYWwo(;yv1Xyf!< zxx27VS`jiPJpa0Y@>eG=HvEPZIEG}GqdH1*5Cm9RZs1;L=aW*rklpX#CUK22@k|L- zPnd6eL(-vS!67aukMTSlinXSETBFWK05|6#9E0hj<|m}TqkFcD z8vGZ1MKoecUW=XdcZPSP!c&Po5Yc7`(ey5`krsk*^Mc{1(rVWxl{44Zg_AzCTTH)! zrp+ZsAAW+qc=77iVOYsOf+H=8y8|Fw+Xt72nEv{_nkH0h)OUM(e68bVZsu; zv%({WrUM-7jAgJIDiZSIZ~B{OH`cAs)rF5^_d`xcr*pw^%I0#RF(0Pp5PHwoCR}WG zL7Y&zv|0eZJz%oxLjb*aIS*aeGmpvG4VU#u^9Dm+`G>7uuBFE@zQQZ=tl%48O9(!(ss)K{qucT5daB^CP9X~L!o{MuSWUMseb#%9x8<~g4uIF+tpj0p*&-aM zYD~J%h0j=gV6nZ#&!eviEgmb{tazwF@D~!swm_q)ZA?+uFk-*R#gxu8O}npEtB}_| zD#4s;!|4s!Q;>~vVPRT7iAB;(q=t>A40gVGrRIp=2hqdwj&L-3^dztfyeWIBCJ6^+ zpmgiADxgM<)vEI3mOcnyZt~TntR+2syXK{S;$Ww^p0k^nCQzOHy^Kof2r~!{y}3!J z$^r5$PZ!mfYS~Mhy?rUK@T&1Eb3Gvg#8lsFb^lG^TUjf$L zc&QzN*Rt?*zY{$s5G`JVSxxu2mW75!^(sHw&K5rw?754>QH>M<+~nTII&>rNgwWEb zxu=RENi$_MGjG%njq;(LPl~D0x?P0YMlXKxf z=XuVdvUo{rtbXM7iVWm0lTmtfhZU14zeVb`CKaSb&fIfC<%>wIF?;}q0 zoo~tsCmst#)e5_f3;>SE=ddMsj^VlmY?ZFnzw{H+n1*>7F}=akJ!pD?Us)|QlzT4l zL+vEI>qtTwiU{vd3J6&&BR``4mG16fwR+h+T!u5ztIzd?IKH5&2JCGjZTqhqGKFm? z6!9QOlOB=GuFdAChnq4fx(WTF8aW zb4ilYG|zVxoHe0*=uOt&bgyk`iP-;+6*D$vnIn}5Q1{ z!~gOad29=coXz<3jGwdV^zwM~D;OqIufQ`6B7Q|wKzmrCL%iu5@N*NN@ce1xRV^b= z6OAehTmVPSpYhA($+m7jN(xv$1P9_z!-v0DS3E!h1={O5#4Y7Y|Cnc`BD zw>j|xpQeVLcTmS#uN%{oCk;o?nZTK_vDZ-jp`3evC6umW7p{)hU%!KCRvNDMUfDB= z7ehkB@NiU*rKjOr<13J_!+2>|#SYJ)-{R#}3)ZagT(~i*3FNG+e(+%&;e0r92P{UP zJQASxEBC(g6AS#iSMphELnKVsYUL9vdfvp#KI{VJVpSzuy$#KG(&0vuQ!#&*hh$B8 ztfFj!z?{3Pg;zK!~GoI){DVu4mKB>R3>lH=q&tr_=g@&VKk?iWFCF*w6E+ zWAZQa;IPqfMM$nuF*X#ddFp+yP~<6B%js-wFZ_U8OC6pX!|%i7Uz)e_OBgmadT!fi zgE|1Q0Pi>k1Ft$ycm&|taGpHgyIp7!j_3g%C~L(cdpLdxmRg}%G-yYz!|I3RR z6^@vC(4>1*RF#WpOiM$hhLJiBQRq+C8s$4mtfgT6i?#ZQzX=-n;)PmH0H2?onHtqA zP}tR9C7U@x%}ZIjn$r23gR2aQJ-K&ybDW^5lCo|$5hSVunhHww3eb;?f;p?Cs`pEZ z+BlHQ7HZB2`Nx!BF(;X~v-BB!cmjUNHWkYFR?i@WIyDU3NE2D8SyKN{YK!5HAVLZ< zb>-ki*@iGMXuSP&JM8jcwE1*z-ewJ?2r-ePuWG3^Tba>P5Bi6ZR^}OTm*&MM=WXuB22+DT=rzbMWrNvuWL(D zC{*PYZr5n?3Rg5^l)4N>uW>XLjEI0F$$27j#_7X^5sxvs~bg_n%k*vo{K+*nL*J5pU?`feN%i# zX;zKq9e*(?Rf@2#${^YY4!;W4h%)=b;S62tlAl*GuB$XBD2l{MQ#7UHwe`LQGAfP~h@tPAO@oXkh5o}N#sZU!EZ-C^K}y6rVI2Q_Q3nPYaefcEjg62P-sP~flDKo{H5X~6(~#yY=~v+lzaHX zB+QBA*5dWIF*z5kkTz$P-F>B6@h`ae!P}Qt1N-%C{v$oJwi-1)qoCW_ zet@k~tRHhPy`9);v;cH!D^E+{-W~{fzcF?dtgW%1k5z}ax>5db=B!qPIJoe!8(1j( zD7&7}>|hnH$Y*H0`~E!~t&0S`OPsZrHg~g=cFA8?gzfQ&ByPu!;$D|^hP*4WU3|B8 z!w}VJXj@Qzpa@gc+3?U@?eP!F&=5uz;?=3zg&-~;EoDzRo;vGR*>4qg*e1kvTRQ7; z_lGAtte0EBGs>MNY=^D8xaxujYFIJ30w37GJGz9`qFfHrwl<~@IchIwycqdBx$!BP z?h-xzwq3bsa^(#2KAO&X0$yo(o&>FMZevnYcwiI+XQG5dbUU{+bgUL9qFyQ91QL2l zh%Ll9C35`X+B?@UxRySgSB{E*UuY@pwd4LEiHZSl(eg38HX1&hI{8f9M?L7T;o9{| z5}fsxmu*$DnmneT0l(y}IBkQmqE9WWNMb#A%v}1x6epboO@%rZ;X%i^dM3%AM>DAo&qT(@V#=%2NTUPMAFL5NIHLbq*^;9&fxhF{-VpdL{FZ4 z4xYUN+gbVhv6t3Bw%`#@sLH^%2MWkY<~9S+%rjXX**E{ruu z8G9S^t+OAheE_PhPqMiy_gh)Uz|$+ozwK7@B{21X=pQFqIjnz(_!)Eh;kihnM8u>N zcz(9ZQ>?WZL1>lp!|>V}Z4Zh8<)yz&hng0>;~_2urBoR+^`ZB5AuM zoxy0?-^8yPq68hCf_wWmhvE%me(zM4$BnUVNWbt$Fc)!RUv~b(7voupX3k*+*!4Z@?Xhs+Hm79ZJPcN6+uuX}08ovE8V)GU#W7 zoHsJM^bJ!01$A^+L6+W_LIXr`g|p`gIj74f6q#(s?gKUNv`y(2M`eJ&X`1-&ABRDo zo;5VjR;{<}pr{2Z=~)Hs)?L(r=K6%P*yYn}@-UqZOf4!CsU%DY$p)>n;V05rbL7gxDo5_pV;j^8t{5c zO?OKwZ8cC=S#(I5D8Lc6np*L15#*`Hfdt^rPyx4F! zpTBvRXldQ$e)6yF)NnZeN8t>^1|!Ykr8LTtb!TLTuYiDh;z86A43CJ!q;!U~UBdWq z{4kz;1}}OH7{ocWiDs(MGVLF0Psa9nz@pw=NTj{UkuXVOv9euDK3VkyE#X0g!<8-k zk|w4K~* z)=pD$YFd9fY>90PUNmTD<|)-DZAIs5Jt98H1h_VEGhG$8xfZkx+$Qc#%KK-Spd4DGZU23naHRGMDH6P{@rXd)mc+* zZT2ur^k~7&%VY9yLXKGV+IVoLYraVK)JMWUe%oytVQ6AcByjMEh*u9xb2O+#Nb&Rmb0T3z zWWq>%9sII8kL}~j-7n-_x%n%?hH9P!T0zCXHJ3aJJ{XGew&(aNPI{2gUCwv**d+XV zF83Q7G2m!b*BNu7 zW*tA7_cOyPC5^Y(b2&6}swAye*cy5KcDK(rhwJ(8+O94%(#In7qu@lr8yj>D4f7M$ z=%RvX7NMqf+BR1{`u%P1+RpaE$ns98uvVhlQSy?hv&1|ZzRutp89DDob2TsqrGFI` z?NwXW1#{4NI#);=Z?8z`ONkwTek@OQ3O5DFEz?|<1UU)|7?a^yx%_fJn%KP^B{3yy}C1aPKN(6p7h__S8EZO=-89cLJt zx5rXg8DAj1bsM#67q$pgzBoG12n9utXjw!TBuzhWI8jPUZPqAjj*q$ht$C)Zm`{u8 z5JygcPxCsX>vPHR$MlBzbrpW^mh? zX;#f)loU7!#|IICBEZp}(0i_xSb$Fk*0vA8Tqk5Xu0?#{#wjX1)I3vwM#bb+^d%9rm_&4S zajRCJQd`2xe}G1PuveO8j1xh88rn}%mGx_@WABC;0ub!l^%4QMDR={&&w*8_ z<$+C=*{_@F&it2Z%_CLh*~RjbM~-3scnjjNvMr52!Ic9pvVAVnGg;-t=?i{D&Poi` z`ka~iFWE1mF=Tu`E5*|k2sWTt`MtURIMk(=Gg+eZ?OyWObaDT{Fp{V9F)%Wnez3k= zvGjL_s;r;Q&QKsTyJ5rk9PF4iHGA0p9DSs5cMTQ6vZ;6M#Q=7v<#DHrKbX^LLne;1cXA$Je{pB!0ERSP?s!ozT1^h zWpFrL)OIhsl(AgRt#dyqY&1C~%q-*G+f4RkM3T4Tm)SBg^_;A%@7OvG15;JPGKuv* z>nj144AkRU1RYbymW#r=vhNaK z-Q-pAv>Fbf(1~2pla>jYuPui6YJX7pzxoCz`kbU9qupiO^V#m@+OnwSu}iGfZw{S*cMCEYPPw* z3l&UH)b<+}RZvDEiU3a?wU6lt92z-)7Ry3R`K*P85_5EabW`a2IzY{X}*pU$aND0`<>3o8BVXzoHg1D)9zW!$LsX z6b!}v_-XLp+ACA$+~mJpvM>E~v;j;N;9-~ZXE%C4R_XqSFa7;d8=t(>l1k6q6R*GNqg3Nusn9|l2)EPxuPIi zYE{;m>HUQ$Ow;f}PfbtRj>J(j@WPyx?8$X zG@cb#CxJ2eiGD6wa)08KX6|{d6z@Nng8ll+%|Icr4G+? z(|FQ)|LH~co*+w{X$adBb{vGvpDIRgKLUeH3iiL)dj75 z9%*L7Xfn!z=dSr2#t3H7GymasHn#X(h3Ia^6|apOIwn}2>1zEC(x8QIyRSG+bw9QW0ZP~%wWkkA69Nd`GIbT^=M#VT6pkDyiDi;%^+Hmkm(y>yR!tjmbBrfHQy zbgGN<%%Z4bOSlnGSwz*4rMlO3>UQsMpu(W1>An7CqqA5SSyZd^jIi??e+;O3Z<^JL zgOk+?8k5zHKn*F<39qsT!EhV@aHn1Db{t^vNLyyFoSAT{DKxY^XL1@OtKw~HR;XhZ z__NBNT%?&Hd~B<5Ye&(lREzdqS&UtxyS>hOTcH5^<1*vFwfkt00*6ud#CE>U-$W6> z*$($ox~krIua6Q`dE?Ilm3ovp*!f&w8XB6J*Hqs?TI1{WLC*kEHTl9IS>%y{y{&=- zkyrM$bOO|r@`mqOlScJLz%EGknNu2dIy5j{e13fQDrkw;vja)G=OX3;`{HEEOG+t? z6plmDXG}@58JX#~v1Y~zJ0Hx2#5}b$rf7fG!n5EXLa(MOX0-{VFNH)!E%*q#I>0Jc zn=$2o=qQp3_POL(RpjEPHKC77b5c@xGeqbeGhR=I{+r}E8J_ik?h>@zT}aj_!&Yt8uvjEX&l2wt!6!^ zDzvE2Tc*zcDqB8J1KTPHK5XLkpWaN3_{6tZ6FA90AR|?bd)c>L*+iZ&L3{R6ANGPM zg8ZPqvJBR&qA9Gz^!4}`$QM$MQ>*NSmWXsk z`v-PkWCz8!4^iC5?{z@anQjun#3XY(_}SWobG+{L597HNK~2)5(a9kL)12bdaN+c> zgJ!PS@Q@#1Z@&x!tM~SrL=y<}CeV?^FfG1i#!1cLsgL1B;44Z7r_1n@J4kjlr&exia3amA67)Lj@^yEluP2^&?~GIc0)oRmepid}UA4P8?Z zb6rD5lNW)#6n?;CR@93YXnge^%h3Jg0bFK-80GI93)NUYZDQEFazDtC2lV-D)uQ(r zHV&UI(cc13es))XdDr_qQ6SQJJ^gEm7*KcK@+twEQggV-X|U8;)O zI6Neh&Tpo^ll!1-9Tw~p4BhWbSA6Ha$gx3{01dfFuhKRAWb@Z~XZ~3Q-v8q4z2n&o z+xKC#YHv}a_9{^=tyR>nJ!-^=QL9G8-qfnSDb;Fet5l2FN$jmfwYCs@wTMlu7VpjT ze82DS{rvuW{o|J0*Kr-^aUSP&-jUo__Fqf*QOZ>J%~)(ch~y`7&2|UTNv^oAxSM3u ztULB0esC+@i(p;0VR1j&CwEpB*ft!W^ndP+7RL-mi)5x^H%?LBrLS#1{octLovb`G z@f*{Q6DVA&`VB2Da;C!E=0cX-(>AX=HwdKMZ%Cy`_H`T|y<3R+DqQ^x>joBBjy5jM zf6-u}?^!DPBEr;h-Xx7_*@k)RBCN#lgqtM7V#fb@!_mM8GIPF}2k6r}8M$?;ki(C_ zQd??fa+f_f-Q|031#H#K=T8!oT8~zNNa&BPl*8(sUlzJ`mJA%<-M-rQMDD~uDsCW^ z1=1=TvP1Bre#_(hJRJya#S+W%dE=jmGiRmq>;?b1r|JyiFpSgk_{Hqs-rU5N<4zC6WDC-h zdv9bno3e#D0Nk^8plKi5tV%rVP5yc82QuFDZ)TLSkmU5upW#78HWt}Lx;zaTh$xxm6{44B|kE^&=LvuF0s%(Q`~1nAcI3lWW(Fm67AL zD5~p?aedj~dMHaD=_8+5Qpfy<>?e%%c!RPr2EkwXD=&AA1f!HdTIs^wv9eve!r7AW zZ}?lI2CY1~>49&Ql?A3x=iY{9aa6B{RXY1OW3X&Y5^-}2`)(eACV2u5srEm4(W#E9 zU!gr2W5RVHar*+iD#IsXN~`axJm_2#+no++!*pF~PE)W$XKW!<9p)Y*(ioyK-)G8$ z&QI=du-D`|zfRjp63vBYWN|Mt20f$E?O7EizH3CP5kx1fQe?cwP4QX(L1P%dMJKT0 z&sKW*9JB45PqCD)Kj5wjR-c!&boB6CxMAKT;3n~J83%0Wkt#ybnrXrm)@=cLOkRD{ z$=H3S&GUHtnl6HN1rka0l{nJUXs+s7eKxJb<6CH9vrfZ&BZFww#z(v2YRqfnkbbcT zz?{!(d$*7(9uvCh6qT4QpU%tq*i$9$YQyTP6{*XV3)F!x@tgS3G3H1~k`uF3a!)zE zIi=pu+kYlIY1k82ZnXpUh9Ly3wHmUi9Z;5P;<3=Q!~SBynpm!7MqK&8CsZTjZ`Ry& zwGqPxd{L29nJ0LQDn!iZQr11Q{o%vZ+awNgt`GPv83cmZ8=2y_n@0pU9T#?ZY#4sK z>q26NA`c#_B`cSc{mNI)k|=^Kj5~I`>p=W~MFIPv-<#IDAug+2Civ=|T+mtYsi(@a zHSwoad)k^5KB;YXrLWwFGk{Sa^WpTz^T3)&}<@$XE) zmR}(&5aD$9#|BCC#Q|f~MN|R9h_A`M+`Q;ni*sj|7HvBBpP0o20f(x1@ zC@Zx!y`$~f{j2FW*uBO$`=<@xr#F{Y(H|$?(=IHyOaA^5ad5U+g}ors1^I}dGF}m7 zm`uy|$N4SvS|_5XbONEu#cnTGTuBp<0yU{0`)EZcudy_NDGAUS{=c{vo2 znTzPEpj%RAa);P}Z=FgOaQHP#=ftLRGc}xK?PKn}B+HP3;tu4?XC`J3fOn^CdjQzD z@5!qt4@=5lv_oL)u8=$7N_J}Q{6uT%Ve}03Aey6c$1l)GPuOK&5pSZjk|ncC(Ry^v zS}SQr`2H8Cw_&2${tvj5OedQAoT)4Dv3|EL3&_@{WqJO{Ydu#+8A#Zs8<4=g;zz0G z$cTkz5{G>bjzt~L#}7ZJuDN9&Q2Nf7xuA@04_Ix46%FU3-8oDSdst!@Y=bEwg0;@o!hpyN(Ji zDg!Fv!4E3urpqz!5jAK>?#$i0|J3qr>~(FRi{0=+w`2et!P#;L!=$&a|EA4N4`wUh zn5Db<#(tgNTRN9sKoG+_s$vT>59I0tK1cI<3&NWIBs=Or_+RwX{vGZ0n^mG5u-1R0 zn&-JhNiKHb22rEKO==9EiRX4c3N5%inEsIs4N#QEXZIkMx%TVvBHlRhH$Q1Hv1)+2 zg?D=JnLa+pn*IC_xUGWKzu5mAIPSlLC!M^GiB`H-R3z+{W6qS?lsK(LWH@JaQ?cM~ z)N~?zGACS{#Sy=#{}fFhHF~WM_N+g5vr4t$%Wmq7E2R{l!0bmqaNV`WN5Ppd`n|y| zx(lu3in<6dhC3uc3PdtF<{?#gDJ?p)kT0Hpis&DcEy$#-`OLwMUwrs?9}n5fG*&UO z{pQzC3-$+-X*>_eJ5I{5!Xx*Xy{;=bL8ZW9jiFN98h3!kkk3N-y>6j~3SEFig4e~} zFJUOYMP?gyHP@ZA@VduO@b1p(yr+$p<{fkUUF#I?9h1#Tz`{2G(L7eqRZW6Xy#!QP({_wxhFtV)%FP- zgb6*IxOld$11XM=yf>Rdk=hw(pxRB0e&R)_MoedVK-{Fwse1B>>-lh!6U)JG-oSuv ze93$}TKr9ymWf}{OOzEjtSR5-zy@)vMl1YX>U?t^ ztRa01o<989ps|vMuibVOo0&s#avX^9x{P#r zo780UVSJOGtrx}U{l}#`Jww=Po!B6rXPrDA?8Y_~jNU8r=T^;Zl>5n5zomZW#G}{a zC{Ipj>CE1kUVPjk48CdqZN1jPV^n3BFrs9zVM4>=+dtG-PxG3w z{PbbyR#0E`tPX;BARwaO!Wz6hy{b!Wws6;eify0%hwLwMPr<(dk1ds z{xxj;H$$<3Fd<7n@Xg~>I0z|aBc?F5*m6^ywV-vdkTB?Y#f&oYmL??3)wg+Vlkf+W zLv{kLw%xvflO2W=E?aCPwDWL6Y!Y_%KQ;Zk5F9`h^?F!(YVP{HXV1QaX8kHACEc4) z?>4@Yk5Ko%NMskNgH1zmb!ZggVx}ER5uu7DtF79l`PZD*`9tq{D_V$DTtzU)LwA;) zu`F9Z?DXJsT9r;u2G;e{LK#{B$Zzq6bF`(`CK_Q>;N10^$V@nCVSOL6nLbb2Lv6t2 z!hbWS9m_h?^Skj#Bcx*Jm^DB9X;wG@-2Vl=#d{$& z(OSaQa|;e<4Kt&=-ZTy6=2eDdr1MIsOjiDW>ntQd!hjr?Ke7MG9Yf)u z@DVG&_XmBbai_R^w;OlDc7BM<2KBwZmjuVb5HQNG(j)f+?D2A99vncJM;3 zytW$M!A~;G{@n>Gs9qQ&v6m9X)H=}Z|h+~9hBuxCMD(agjx58*ZxA0{DRA4lh@uo$UM!M`SN&%S;pX( zf8@Wpo_}v+{nqy;$zP*TWfYos+9bho$OB3PU4L_@#e8>VtZ_0mh{WFDlieF&d-kTW zQU+>;iW?eie513KK2r5}Z*_ZCZ;);w!e}u`f5xHNDtn=4u}m=;ZSQPDI(}09Ml^5- zAm%AH)j?8v4#q;GKTeoZjjlC=wE6kQ_2%Ilm=FJ0t`8;Z?}d!1oVTrGYuvHVVA}#j zE@7YSGSZit#>mP*WMS(in)^jm^p65Pw**S=%PlVV-XZg#x_}?9#aarwk?{t^MBddc zzU`LVC`dV5!dmT*VX;}2bWbPBpqt5+&u@=|s7f*{*(XP?UP72ch=oZx2 zHkOlgAA({M^*7Ty(U=g?mUh;_3n2#YGIU45P7zDJM;JX>-23f&*?cCkSxOw6OmmRT zx;yX6lF?CyKt%L=_yry2X$ij0K_vc~8MOFS^fXjLMNf(X2D=-Vn3*&?ubU{(GD{wH zp$19gkQd)BpvrU(pRknT`D-I4_`3W3A=4Q#X9;&)2>9Ja|H_=$s&BJSj~CW6Z-YE8 z-hPttFz?-_Cbg^~asB)69<`5I8r7gR%}B9fO0tvFRgF5Ys2M+FMt@$$n7p#Er}}1M z%iIIb1Tje)vxL+5H%`$J&0@19REEq@#SzY%kF}MzuJ5|WjNi^XDP!IHj>6c+<~LcG zhxwl$D|OFN$mo^Y&nA|>=ae#*^&b!z5f(N{hY@?E$bqXF^-A--g1dm&II>XDHHjSp zDu7uymyhDIidOuZ#}MUf-#;mIpIA=KDy{EA9Me@LEKdjjx-^5Fn0$C&YhbWuum(!~ z`wpffo7r3${@=pI63zLR^>gHu_o`^AxA7l7Vhwu@Z`5}*dhCslHyX`qF=2AK(-0ca zjvdqj8TFVzeQqVYymm(|di{kZj-`F?HL~N+hb6?wDnnmh*1wRos0|q_^!R#=g+frL z-ArUOEKm5@n6lUSee3kT%{$JbO@?IC4iUP&o0|FD&HrXw8Oz2};>5J{;xWYaiSNq4 z=h1&t?=Y_6o-JX{T*lRaKKfjzh#v`YzAG<|{He2Uv4ZyIJ-uD*_fia*adWE{3 zJ>XL#!CYU*$!5v7w3PJa-6 z#JN=wNN~)a{(XmJAXF()^)YkIem~ilbr^>UWj!YmrsnIHbdBq#?oYm_e5X!}6B}X=-3g$nb~YWO2=OtG^R<|A3_MII z>b;2JWEAQh4zhJYv86b4>LJ7={TZlk(i^pvM)+y9{4OOg&BV)QiK2N#B3Hud+Cx&# zzv=e`TcBROA*CkyXxEs+rg2LZ8C`HlDX=Fg*Qs`3#H(%*`pmT)V5OZ$SdT(+TIr%a zKb4Pu@;u@^w|&U=ICW!~Tr(|Nb}V5-Rr&|rFVc{XYII4|gA#a*{Beod?}b_o2qv<0 zx%b~Mzg(^iNXF@#I&|1UZBu)>`(zEr-gwW73Hjt3U5;NP^YW}hY4Ouvr(TscY8pPt zNN?4<$Ax-J?ZG}4*ZBf{Bgi8gykV>~{O^u9KTvTg^USLV3vO;3n@9A|1UtIuP!M~X z7^rT#9vdduW^)EzwU*k{;NFB@kGhUnBCeGq!r~-cE2ld3FtWPj=c1s=>rcovYl(;@ zYQKIi{_ak59i&>yq80rw8{6J2!Ac!o`swwHFHzIoFpqRJYxiHAQq?M{MeHXKeQI>` zGOw*Q!;Lp=OQjvZoFk*5Coz&I(~>@2wGDdXTE^@iV>g6QgOYPA%@Wrgno=H2SbYSx z2~bGR4iSz~CBGw4+2;OkkZ5XeaXM^z=5ywlw zx|RO7Xc4-B@D6{Tr(JR#H*jzS9GBiBi=!h}>EVV$CE7LC(yvmY zBrxwz049d9UgF%qjA5DUj_E|uVRfHN-pEI!UKCn5n(|KVEYxL&WI!ZpN6?*@J-i5? z-v#wkw%cU90h6G$jBjA-`LjlG1Ud0-zTIOZdQLM*XT3DJLvgXUSby@lqQ#nOS$G|x z{1?t}sx&OvDOb)LSnA%h`R6!Kt(@!=40n)u?>p2_iQ3B6bjc*-kKcuvU%LNxTyn&R znfF{9i0?6lN)#=uG;Q@Gd|Di4*0lLJ|wYnp10`MxMB3X|?(68?0y)2{V?U6KtAq8^S|sC4CuS%mID z-nH#gD&%dH($Dra;-Vb_ zIaBJ|5&cHZep|CJixqHIY=Vicqw+as-uhmAl#=W9H#dW1P9D~MsBTr>`1DL;x4aAb zQqlJBzZ0p$UmnN=F7hR+$V$hx6a&TwN>#(OP}+Ylq#)f#uPG9)6IGi&ii%HLXtpM` z4&o(k$$9DE{d?foM!782uU{u&X4Au2VUglCfBN6;XE=YiAhSv1;mn{@4FoTc#p$oo zL|jXHH`(p?63&56kPs2SMdJ}%n%Se|;N-40C-M=zloR8yG%TkUC90z`t2Np*_CtEP z!vBHyn~EOM=3cB_PPDLOItyI6As_BBHd+x>UkhERU%2fExIeW}3zHL>?UikcA zt7rjnOO+^{r${gISf?1r;r>YOQIM~Cc9?QyQ1e?v|-igaWek*63Kyg z$Fyhommn}_2FYWOLu?cB?^>`Z&w!POgy<}NIeHeh50OerdZ9sJsG2?SQ2oBVoI4n2 zdE?9v34E>#JnXofg&{jjnAn})k`G2Yzzdqj7>0Y*3p+nH;~~e6dHR_9bTY1Wp^Xnt z_=_YCF=-tx)7d<*37HD4#RG^7XXq=(FtRlhx% zZ8;V6kayqeoVtmTiNA%mY_SsdJ<`1$GH(uY=M?KT;Umy2=yP%>HJzVXsfqgkI3c{bIn@0o|GL@c@$z`=lg~Va8gxMo z-9CZ8kSpgl#6+>3tW z2P|&#gip<;Y@N`e7#~qdNs9;ie}@XM701 zyCAd(n84gx(8J0#iN7o0J5*biDYmj;K_)@&-g4D`udm51{(df1B7)(kAJwz9J#>AQ zIHG&%hQEDdCUYr2y>F{H$GkI+EEHehp(h|vRQ;gUAXD&ycJf6A)Y^1aKRQL?X&Bs2 z5coi2UHo+dfmHG2 zU<|Eqa`Y|T5fl{s-7Qy;PpUq&6ABO^Se1Puzjld{EKkRLf5ew4x<-NVuEI(wRCw9t8eY8znx z-zSF;QGCtRG|CP-LC@8X&{AY^?aZ^nSAn%D+@A@-;Xe7YME88zdl&>eV%aa&J=Y@H z@CXFrifG-Kk#+A-WF$5)$kp)G$SSOMD4gf#)2+T)!IktBvtZ9f_@qlu%+x0}+Swyu zMe0!Q+op-f-0zwwwdh;6AtQ(!@4VTHKkjE`ynF<_?jatH^r)roxLfuT?oDCHz{xVs zL)=H`pX})C^A!y%WubK3>Jygl%ePJ0^|moB9xyU80wokiYUA@vGI~OC)2emr;;n@; zkz(c;5*k;G+x?9`Yq)@yUY_Ru4X0ACw}$y+^M3B<)gv6qnBt&@0~l0agFs`?x#>}} z4bA&G2~f=S2(F)LyQf?4kJ#@vI;wFKa`o)VSu0p48m%_Gh)*X-cX%$0S+M@6{8oa8 zkKnpXtozIq=&u7i9X&zRyYDy~{(*7cOA@wC)`tthsu~2O;>nmFk1W$j0Up1W@C7uO ztLH}oo9~9ya$FAcJ$o`4hoifksz4#=A}|jG2B7(5HojX)#mvRCU7bVL%?kYfzkXUK zUtA-+e3a_~^Vq=T|Mw5bf6D-AOOV{LYF+!NK!^C7tKDylC-NZDpaCl;XF-(M{Z;-y z@#%HAN4qNj7m5Gx110P&M+XMNkBJn4omL>p*CTj9a0D|M!5#Xc{gZ#J-z$Cxg?$+R zKb}w%##)Hc6C@hfBJKDH9!R@=c47U#%jof5H0OuUw8dYJsVUCAhJg$M17JTG5HH~e zV6zx70H5T$$1Jp3Ez*nAUgphak6qxv;_wf<8p>tb1*==FCy!+Q7nJd?< zz@UgXiI;G^5qG1z=$$B9qLbIp*DgHubFX`mO~>v3d-Z$PI7pC_@Aq{vU_YWR4NXJJ z%U`oDYVjGFg}5)MN8b(xrlzJUz9cQznn>>T8}Ge0nux1=hY?fX!zMBdX}Ugk1KaUc zATG~;)`jAE9Hj?VPR`;}lX8I4@hZX9fMYBD7^LguKGr)|3X7H-ox`l0*3Xr%TRV5Y z<~6@M!%qbT63ZOBV(_1V-$6W&wKB^~T2UN#@7^7GfN%}S08Zfn=!Cq~=|B_8FxHrN!&OKv+pVB@ol z%+YBGbqVPd!06O028l}bFKjMo4L&lOrBaAXHaGKqQhFt;*X==m{|uLS%v}W{X43m6wqk3cgk4*Me26#ASz8b@ht4UOTtERMRgj0J_wvy_zqIL zlkowdp*8$wN`?eKZyOfV3|heB@n>ge`o?BU>U_mP0s&LqKQqMCFR7AUQ4s^^C%6Ej zeYp(vygER#6n^aq^H1=>$vSQIK9BE+qDC9@@S}*E*2qDo8o)}anqkp zsJl?h*HguY2vZ)|zlN)6>^%ebiA)Bykk+q1fj_6r!Z;3^padX6^3UH`z0Lf_`~nVE zrXPVs^A#aTHSLpS)B-*qK~@*HCsvX8VrCaySnCD%V=T7J;T*-o2be~K)t<5$LE8Hd zID`z)f^rKzh3r&h?qq|4oj6u=OeRRg@-dS9DPpm+y2556(GLFqE%fsF;Mh0cn<=8Xv!6`P&1mJj`sr z3V<5|;2Q`tMtf>vs$z9@&L!8uVe99&HuFhNVKXocTd}jz)tS0?6J8@oxdG`fM~cei z{*1zoGuwtA0gNt50vWm_>HS}lV!%Uy7WD|`-h&!Y244uA-8_3oGx~hNvu^WtkcnBG zHq#a3gZ~QmUrM67Dz$iDGyHFnRq_x?5?#$pe*JTh=t8k?gHws=g|#4V8Oy3KTH_rz z&US9FhH#>gxfugGTaSrG*Co zEJOk7^ml1YL!z%Tr;fGAQ#P2*=9$sn@a!&-y~q#7aQOl@C541? z4B?J_^^6>O@EiiI9 z8yoz-4v?}Rpm-_ShB0R}dBda|aC^i@DicUCm#edB>6oP(8fx{TxF=t}11aQ^dNmRx zEucixOwpwf@DJlM|C{gre+ki#0)&EIGCWG~I91fJPH1dw+yKCzxx<2cX=cvwMWi#N zAs*cY+jb7!Je%w%TT@xlND%kQ+vXY=k~?wf9uI$zes7+v)Uwu|2?~vX%Bc&NbWh8 z?E+&y&DQ^l!Uyo{g);h!OupIK4gM*p?0su=OzRlP%CHAiEOTwE{!DIHVxU_Q zYSSEy*P#r2C8P-yQRXnVS^-EaiCljq#*hARh-NkMJL@MAf zJ~y*@8}T`1Dn^bam$dmV_ml^nt?J& z2(+#W*VKaMX2n}&-wF!@ZOM!eWapryI8otrq%fQQ-`}#{B{C&FjHdb9H;Xhi)@raf)f zgW6HQVnn+>@FdV$`S5oh_`ZyTOjrRxS0(sAIUd43%o|4zTax$j*GeV(%tNG# zT5JB3)XOepy6j9{`h~UZ3*Ais(7*C8<2w(ti1dS*|JYiyub?vgO109VmMYYjZ#jXC z^q6uhXj!?V)}Ew@qQ>LXQU<1>RJh{b$*bfPeVAiW6%Zm=KqE2Xz5fkHnC#a1RcU@ z^2wVmy#|4j>8GNIZu|q{<-0UJkR$Ek{de~ahaG{if7CdtJ6C=Aj2hPubHQbUUyTP% zS$tkLfaYBV2J|4lQosp@(C6CzkWg0NEDG4gU~zQ)ucoz6I=zmQNZn3-TCtJ>6iSlL zd3gN;;Mp(>BWUZ%OeF!g%xhEIzaYKf)s5CUi=m<`q)Sib1NC8#SW;LjCH11bcHKM1d)RE4C|#dOLS~ z_vI~Sc!h}<2tAd0o+VU&odl&Tf}l}xEp1?(3Pz8NYxTd37Uyr=aJi+d>bf}Vn@24*xAb`kLGQneXHm z><|m=O4>IuWT2!Kjmz`7bl;j z{492Ov?c#%I_|N!{*pj?cy_()8xrbU(mucYg}A<1(}zdt&(N&!sDd>|A>^7r;YI0X z?PdYCcgm*!3BYl-qhl!ib!p#KgK>yC$06JbOG;n7oQ}jld(2i?(RYK%K;uS)el8>i z80X*ujww7>vlaahN~At+DFxh4fq`g`dGg8MaAC%T8*Q47 z*C=lDT~q8qlx^>kY#Ph`OH7^D^+gpeW4wbz|`1gh4BKBIy(N?zL=5_4DDmnqZ-odsg>Q#$S zI}nw~hxA)r1bM)aLT7Lc-%oj4rvCu6i-yBf!WHx%X+UX;m*L$`XYlT~56C-T(iS_o zJZ(3*hMgQCS27|mb$&`1;}9RJ9NB;})G(~gR?hs2XyBi*39#)}H+C&Mj)yI0;?2AU zte~=EPA!P}e?f&3aGam4z-QbPdF)n2no+e}<$SKJGR7s!%`W3}Br#)VE3A}oPd?jW zzPb8>z&Y!Rni^DyPYA2UZJs6*WT7_3Ttl-Amv8movdQAJ0 zdNq^L%S9w!7XvZ&6&%h*#gd^9k9RKw&67mWXV*$7JUwcBvEZe} zM8YH|&IR0kg(!ZX?nSIibs2j26eOX<#`Z|T`KmeqTNauzKFbtQC@{lNagz74>Im6D zuW5p@4I$_Z)Z&kgOgIcZI!>HIa0PhlehdkS3qjyAcFDBb5ITcL0(S&Cl9OxBTng$6 zl-w5JD2P-4^5XA?F7J&AF$^T+?F`DK!@?Pt&e0`ge#@-#r26baGuZ2nmwbk|#&C&a zNz}96kI70FKj0FtQuBfF!OF4>yTE^GfJ1R)wz6RWU?W(!;;@B#sn|2Abicz_9;LX* zT8Zfw()>x+DDoTsGE}!v2g|>KjIQO&0eARa0=if^3__Nsum^DBhk#(3gAi8DL^WG{ z=4Ecm`bRa}VX&v(v?gW5e^I9t9Xo`L(){e@h%_C4o!!c!nQL*1#Ut!zZA9d~_ePl7 zKJtgGDNco|Sv`mPxfvJ!$2_NidDg9WKW3D59Sr||xX_c)QoEIf@{brb85V|9;kopB zJKVdE5|GLk?Y5q?k4l&UPpK;a+KKll^Qvtw$u5#J0s#&$p#uJ*VmsI0+ZinM5?5(f z1HLv4zl{2QInDz|rz6Da45Rn}YC*JLYRGK1vu3@xNd7W!?*mUQNKq7C8vB*JkN<^8 zb}gzV$9VHRtqgHbl6+W;yLSWvM0^x2#OHEZhcRReFqjKYEFA^%)q-c^+IOCPmgfIU z!W0_%)b#fBm_+}wW{f{X=|{oSk|^(9TKi{O7LmTj)8(PDc|*g%LiOr@7K~@zaoW}6 zYYiudFUt^Q6J)fIrq3?KXCxa;5`F)nczdd#j;6;aapPs;5vyz&>Fw7gA1uY&YSn&q z0ZRBr5*F`jYXdP}64M+4uv-A^@rPDYf)xlDOnZ18izN(#s>lOXe6RAUX^YwuYN4%Z znsFlD8uGT)V&U64l=s3S3r#$|)O0D_5SVdk{?5|Q70vEF_zKGjf&I__#9eIvKTioR{a?a8I$YbIvV?H&ZGe zIsAO(QENEZPZEW1LYm_M%fw5ALO<-r(!6)b8}TzbQ+I|fVuh{naJ;)?Pvl1NqM^0E*f2(w1Hg zzeMY%(um-2h%|@;fLd!%4~r}48jHx^j56QX#Xj8oN{;2%*2$}ByYpTfIx~iRF6InQ zH{$%d6yDp)pCMW2HxHje@$*B-{S0Xn_%2uAD+QK(tt9=9R$rPNi@;$uAa__DiI>*l zHe`AwIs?)*HiSd!P?(#gvaPdz27(t65AV?Bbs^TBUv#||Vu*EhMM>ys_MyBr4MoUt zIldu}kh447nPol=)D|y?2ROFP9W|>_pGnr?(C0L$h)b7FqM^I^W}S(AgPvjR%b0`* z2=Xgr(zLvH)74Rjw%y()GkyLi#p@(UAg`7_2|GS2P9I3K5 z@|RU0UI11Y78^$({%(?ekEk`-GN7y-i~qe7N$jN+{7pA*T}2b@Je7|cnOiP$q3hKv zwty~Wl|?m5En~@1*~~#_cUNpURW@6>Wr)PZGIH~pMBVGqvboE+*1>UGl8wczet+<+iq)K^#SEF+;QB#u z=J*f|(9!!3M|HK@#$*j4wMeSv#fB7{rymeM6>25)dc!ZTKu)Ln_`Zg9$0_fjz3{HI zZ!I2qbGqZU4>8|`*8IVVlRxCaX*>unLVqiE7e!0;N5CRu_?oLk|L%{bf-;16?Jv#> z*?9DKLb;1+pioK)Ip1DyVw8;c`1NFmlz~Vy7qFrv{R-g0TaQ~=A||8T?;o`wthfX> z-gc^Yb_<;(HTwjyb0;ny-)5Rso?QX)uUK__(>uATb7LvPjgnuDC&+;}OMNn(YEPqz zYg@zccH+izcqKkBWGheB$&!-okMyIHpq#XOoB_XQWmP5$QPt@ChQd`k3sS_+yHq?fiXq=Pg5J?`3d9Aw39+x8= z%_B!m`akn+LYA%DiY0(9V@$l38TpPBJ`*n9h2NO0(ZI=c0iP(0zf&}ZMqXDqs1-WV zuQiD&OhlEW^R33FEek#h=4*{Z5KoeY_^+4Gj3*)`yvS;V*7Py*f)#oe=z`J-TT}FZ zfiq;1z}U5=h9ePal5|MKwpaKD0(Cw(@_D&JDB=KsG#-M0G8fW-|0$bj2x#V2a%Kl^ zQx9X^aj)*QAiiGnm*hWdi;`+W$S`kAkq;7*8G#D5gLg`ZqHZv47o&K})8#@AyU5}p zWeC}xeWy5(o7N$LsDp7?MS|1=VpYYQ!b~e$VZLl20*Ay~8`G21Rs)*uu6BM_5>vSK zS|SWq_>w%!4JK7^CK1CIL>7e32o$Xy40+z8^v*QCjzc=4)_NN1L-g(iD?8dAewI+I z+dBsX2Xi42|HTzJk43 zHjfpyEs65g97ujAtp+D1Y3oh8Nr&N8*BgBR-^95X?V+&^=AM8O!jquSio-NxuVw&s zdW)VqgO?ZAPt`{PPFNa0BQ^loOe&FM4Z{ub+Sgd}KEp0!V&GL`BsbzgC9{jXFR9^o z(J0>eF7rbCU(_pw{aT^PIG(2W5m+rRzj>S?wnW)b9he2>aU2gXCGR~jOh+Iz2XQGH zi1Nm`jewEu5Jjd+q23!zP3yHtNM1s1EGqGJ372K{enZqfUiYR8E5I2nOuFo zC``s}(Tl)aI&hGfi4uzMgPe|12SmyqA+^A_-1BwEOD_x)BN$8+w4sw&~E(+KVJU!ovB7K8}vl zyX9QY;PA68<7KEtyPl#~_xCD$wJJKsc{?|75Yy;*Es)k(c#)dU$oO$elgc>F+e}w% ziBjgwP6igp!JL?^XnuW>>8%DyufB2@7;!F2v`e0oH}^d+5AU2bZGoWc$V3HAS| z2TlPKm@18oa|UCxHr|X6j^F)RL}^?AB)A%Hzzi{*Dp97th;`MA4_o}CEZ(k&suI;A z^0utTyW9CaKN0trF@mBae)0DgIwajH#5P2rMjMN9Q%2V)4$lIgM(Xww0y{%Y-SjL( zoz_vuIYqvS>3)IOM4jUC`f_lsLl1DUK?M8z9}|#>yEpuMf^Cfq2QK3p9rx^v%LiT( zU3v?dgvCbkeI?OvRd9@}Z9p+ed_;V@-%;rB)?y{dE@Wm8c+1VC&6s#M^X1a}b!`R2 z&Vy!GOwg8}N)q>r72g8H+T|h;-fNafh{6PMgd$2NAS~CCj5UO(m_#kBNnKL(LvIxo z0-nI5#ixLvG?|F3@~=pb^z}Y z#AYM$A^I;fTkYBmrQN=(Kd16>j}Ub{$fF-FQQrH07fgF;1q5pG1rkX+0vswxTLlav zv&TSl9~5?W0+%GgF)w2C;S-hIg?^h^$@hdNpWE)b%tD-Gq*0*G1(e4H?s9$9>xV|E z?r%FiKuR=ytsEIAYP(;x4H)pQxp7_e;FLh~|ShkWqu+i2NoWOAZ#F|ce-!HY;k z@9Y*0TG@8+pK*e30~Ye{bTWwBFrCQy$9BXc=4*z$R826!M3w7#rj$X zemqae#6Qy(^%?PX)35U@f=wzGb;x4&6u8Ry)QI4Hl`Z%2+f<^*wO|`t>}8W-en@fy zzd|AEE3^bBZoCKv)(%O^S*)8$(^fE789)UJ=SP|DxgUQ?*ICkvs3o$nB(a3<+J8DO z4g87_D<3tz&IEVt&lL|nwY1L+eX6w1-k78Um0IMllKxQHye?DOmhT|_Pctl{7^L$F zW#_&NX~U9hDmYzSCEB4y8%#$Zl8Q8GdqND#{AV^ny+_}8$FkOeumSF;mOTpOKwe;D z9F4)KT2eCKZzzTF6t@*1(3nS)b+7I_wr95c^PRLsg(PhH{m2-ffO!53xWQzW$u~5L zeMr$(jg|98NF?<-z3AR=1r(!{cn5{KDDNt{g=udxkIyzwze-bq%o%KhiS znqc6Hdt3=RMjdjRJyoxMX6Oo^(Ym|*6m|0*t~OiLW)!mJVpNS;Xdus$b+xl|@w)Q~ z$RvBx4({*U4#wy@un5XeBW~l5S=PH8XIwpzMlevb)#{e*wgvbmr{SZdyx@tG0QKFo z?CrsC{!n&}QtsZvwy05Af07y$k?+D@`Rp|cO3iV_xU~!$g8VAP9|O~6kjrK*^0G&p ziii+cod-N{J2HJRJ6?8IlAqnj^+~9!k!FZ_BvEgb!43_FIdtIKrTUXg$?QEom~p>d zEy;M!fR^{bwK=MT`lO9&Nms%dTqLnPmdM9umX5V)y^cB4&JlfLp#oI`N(sW3FgceN z(8r^l3;gfv{GI%573heOzmC?Stfgso#Q2M20$(*BijLML3j_DUm(1^8s&f*N4Bz_zW|z*2NQw2%7efzZj1PCs8TGX#H=n{ueybvPa0 z`Pre#M9Hq5#&Fmg@0^A>%7Lt>EMWFpl19@2X zW;OXvN+gTDgoWq*0jYX02WNi`)u2-2TQ*6*cCQeIOQY+BE-^kw)^z71B|KXI3JjU~ zVqcMd4ot&+*!48wMI$%x{H65gr=ByK25d3quRgfrSRzKq!kALsCOsb8; zb_-k<_{ag*;$IYfUTsv^H3}UK`cGjflz?Wg>GBk-I@2bJF7$*@_GPAmT+kK5h2MhuRU3Q&*Ekx;69*XVadB@cAjuga)uLks*?*V=O@B^&V1nV)gJ|F z{pzSRB`fFs3J@$X9P<0tSeF=rN};NXd+m7guis)8d#m?X;o0#!AHo_^QK%!#RMtNh z2AmUa;&Y(*bhBIt(@im=IVBe=IPr6LlZh<1pWt#We?!9BfEZBt#m7okO|$G7R6d~{ z_B5s0hb*O(eCe27<0jmm{tGi31&WTCuIuI(Ql2`xfb!;P@Ec0;hQU(i>opqb6S=wu z+{pRIYmaqdW2ZON)G+Q{d37VrY&quxC%=}$oPIU?sEg-?4D6~;$qC#GX94zaI{p># zkj|UOwL#v&9P+9ZYG2`m@x&FqcyaCD{K}6U8r2{xKJFO`ijo=OaiK89Jo)@1?a)W- z<7^BHPog*YKcL#nn;qlAb{{u_t{GVeI1v?4%Dn1M^Qk29m5?qEuXHb>|CnTxh2m&GvN=bK1g8~9Fgpo=}Y&6m! z(jg^ChZ4dVAhFRU!swFGNGZbTZoV6z=Xl@m?{~++v9Voe|IX{W>pIU@>InT|-Yve9 zgY&z#u_7z1iA1pw_=+!qf(Q7rpz`)#&J=taU^oi_&Fc3bb+645-n|#ArPg!9rg!R6 zv&I+J0{1zjOTW%|&Yt0N5if#QgUvp&c7HqZxuXJqRNr)G{+4so6Ng&6js9!`vQ(ZW zQv15O!SiQ^bc}}H#c~70(v*9#%iyLJ=LASLL2iMRYq%_jj!n|pl&9KD6z026sl;c0+&A+zWc5jvs%AB%ONDwOaAme`u?lHW*f2S}9&vdzaN_@lp2qUk21@2>Dwq z2Z1P{03Xbhzh_*Gm%eiubGFw2T<#{S3ZN*>C1FQWKm63))kUu1g5?RR~Y2;;pGd0OcV2s>o5G&y8wu|5 zB=g(sLLA7s7zr$PQn=Zhn;g>WMg-iNGj^J5SbPg-@=>R&YA5P4#YOSdw>+Bl#jIlF ze@3Vu>}Y*s{HKC|Bvvh;k%lHCm}Ti=XB_QjDK%AbRez+;C`L z`2;40+EAgb$|+2tUP*df*-Td3ayenFDiAA z2ibwhCN$o}h(A8@U|-31`{kB;GQFYqR{r4UQ(JjZnxRIZ)jP=h=cSc?)}T7m)_%e> zaF`i8p^pgX*;F>9(M`_83p=yUc6SRyhGO9>PdGfd$Fh$bri%DD*{n7edU7OkstM;B34ffm1RL6c?*Igf4?KEO=3+J>twh z>eN*^$-La(TFFtk#-%KC4g9lbwXVFUiuJW#k3pz#*--ij=NK4bL38QEdrpW7Q~g!dJr8{7{)UzhT$>h4qYw`-zK zc?#Iv)H{=QX~m4q{eDE8m+&%aPrdp{TWV-YhTu$D9*xanHer+m&-g`;E0)%&+pa@= z8b}9^)EbGeNu)spC6+9v!;arUmbX|3!U)V!)9y!(xK_{Eje1>JO1E}`{Z+ow2sVZ@ zRiTu8C?adQIJ^UzU3uNI@cceN)_RqO0yA!FLiE3YYHRHK`6&orv`E`2Npq;$^ zd683HGQFKf`1;GQv!yz`9f&65cIz2=*YJXSGOJ$?#_Gf(AZrrc4W3CzT|g&)m^duV zRI`#>2+iSeCK(06Bl1~EYi6^pA;YOpS!rNj;N8eIXCh6|l-nU*aNNj`Fco_*Ua$c3 zL`^uqGpPrfOuPuo_T=4(Yhovqx>E>FAfX_?-uh!1*?OIITM3bOs$-kQI=6r5hqOwR zMzm$n1ovdnbkZl)8~zL&ZX0Saw3$sSi}T82CC{C2N`zCF3BjLZOHxTew)Ad4HtyVg zM)hj{$&{yc{3Vs2VuPV}rL*et+=6n^&*J9=9mRzz-0gQJ13qV5Sd6w z!t0l!umGV?Z3q>;l^|!IS?Q}_vn4Rg*1xMR*2WvGD343 zDBXzr*NiC!DoZ|->Qlhv=96&R_>_}OcxQe4XN?2};cI1!OmtiYkT|pN}lL*Wdw_n)13$@CFr~Su6Yw#ubYG&JUw$)tT$vf z>fdjDfYKSh5E@LFMg-Rz#vhwhEsrH8j9EUZGxYd~cM@Dteuuw=cWGJ}lxBuzFKxbq zXOYYS8w^h6h1NjomvCScMvJXjKpS(054L2?+HcfWcw9xjI zUrl;D%937Cj|JpvmeD=je@0>>;7$Zq`49NwVG<L8ct^9ennIb~`n7MFAXo@qSuk=& zqkHE{9n&Sw@@#LANGkM-5>}Y1s)ShZ&$+&0_0H$~PauAJVo&$CJ`D9kXn=L(<4Y~Y zQhYxfC?W+9xSDPH>TzTmWPtSB+X`B zxaW@xq_Vw<6s$QVsv)r{5E3l-xkjkTljQ7vN#zeefBsDkQ}pEf>Hr=tJAIwSI&de! zkT;AkIC3(YAa^h{OI#597MX9}cnefb~p-l*Y@ZEjA2kSO+T5X??n-YgkehU|FF z%%+Nj|5>|})Jq6L<#3kxPc9;E=I1Q&srcu?^JYOGLWdi0+Qi7DipiN35no_(NrGC9 zYfg`{r^d_7@R|0+9j?ni1j_ZSWW?r;pYi7yc^_Dk)xqSFPl#l#$!uyvsL}TbG8Z}s zfY6V=xshy>>NNI>W!A(2yueG+szCoVi#6&tFlXVkSi%ZplaV7IL{>z5I36>DO!pJu zD`2r!ues^{KX+lj-OL6fb^At?$+-oBSKr0rQ89bZ_u=`PC-KsOmN7C^3i%ObD@9=@ zDD#AU$FC`kwO6Uxz_D59O33BxaL2#HBiW6H@z`UeBFVJ8=ff3hp-qoBdlU0GZMAoZ zY8_B555GBE@3#bl96VQ|Z&MdedH!WJ^6_Jvx0~1oH$|J4<7ukRetJRSi*8t#HbP7z zXoIEg$j<`Yut0f1NoC=Cu_SJ)hSec|z60Q;%FVpS(?DPl1aG=o3K>|737SvclUojw z(jBlyE6gY(l7%qFrH<%Ece1^dtt48M-9()Q@_!!GRn9!+*1)Jea zmlEV|g=SGr!+Q}}1S6>bAqS!Y?+>_2xzH3ryRtDYyJBokF1A911?#9*&PTf&E|Twk zapRRI=(}P(YEuS(L(gUq3uD3k#h0)!s#3>}CDI;AE4b2%b>#+l_`^ScW}TAir9*7= ze`8W-tHz=d48D7fIbVVnOd>c?R3#vwqM~Qd?DwO>s2XQ4#y9ABSpmcQdHY@RZ>YJJuM1Pe1shm5EEIC(us%=7liX_yg9~Cric_lFp`4v`l&Cv930`J6?pJc0YW? ztbQl#=x>Irqh>kkEbuzyjXiQy(81l0i-kYn#5Jve;YiLGdr*Qt0CR>0I5*VOyl z_ulH7u{&KWM47bSvXp9;gm^_@QmMn|!O&kc4QUOqTwXrfe1Au(ed!FSxG3Ki=c3v^ zcP2`){hDDs&T5%-&8(_2rX5xtf|!!HIhFds{gzClY1V}ovXj2k(gDnfB!*O&Fq}3g zC6h1WF7P1sW-lMPwuBfB%Rx>Tl-3`r2(et#ifBI)oKM)tZ#npJBC@PqFJoP?`ygSK zT45As%esrcs$bt8rVX2G5_E$6TlcJ)Q0t#EXQfX=bhB8CaXGku62E{3FaWbYS^WZ? zn08l(<68E%<6DjlkaFn^gSOwR%E?e3#{xDHpgXVXja~IW;4^)4}ab@ zet=kjR9R=GVK*6nUG>(sLWaQV0kd({-JX^T<7htCr~H>>IuU$PNfbt=Ce9oZXtH`% zh>CtynA@6GZ^|Bdq~nm(5Z@|2@F3Snd%ur=?-2Ibyy=%k#jo>pAKO3aJO*(Pn+c`y zGM3NKMa|HUq~5QuXr1#Deh5^tCe@_7eA?6D0N%kOccwn${q{Y2SU-!~%03-EfCGK9EpT1eJMZ{f&s;FF4%223wY=%F z%4h0)^R@&}&apn>FJea@d+DGn$3t`f#akRgYaG2zg& zs?MBh474y5+8_K`gp!41Lk;hJ*g$Ei>9^r8E77_j{qnQ2IV#pQAN0b~8OQ_cx-eS! z6bU)T?H)#m{Z}No8n+v{(*^PJ4u4S=L~4aY`gBf^@>>U zocZ3Vo4Y@c6f8-oQgFRR?LeRr#F%OS+c7iF%k4h2r&guU^RvrvYXa+yEJqJs4rw2% zIS0lnBbaB!KkSLTIU%8<3-QjR!Jn=AE>iI7K|@OK;Y7$#zW9v;8*RR~zdv8o^nC$e zFJcITBonT=^L}mfg3I?1a#gdj-rXorvMrFxUoX$JF$hb>agQ-#FZ3`}lkgHVqQgrY z)NEA>r=D1JGU$x4vrak@zov6Oe6llDjM#-uB0oqFOY zze^vEBo~+pW%&Mi_TJ>2O1QEvM~Hhn47k)(mzSaa1n&8-vpU zxHMYtJZDy5Y5LH!|8(2Pf0Ss7+aL;JFVOtnFx)%+5zh|kS~!!*Np0r0lGiNiL%5Rd z^IQ%Z0xOfdrBXt;LFelJ((k5p1(f>--P4~LO)C7d&oDiHWUb-aym32-WEdt_G3QGo z845#ek`9S**u0aob`|A4S)J)fCM-#--PXJ{=~hUPn|e&M2S6$2XiF8vQ)b)H>YmFq zlmK%Jeo$oeD+R{#mUeyc2N{%vid4#SSi``c7Uy|=2F2Y^T=k`PIxS93rFpunbIq2T zu9uVzwS?6bp>>B8_e8KW>AR$w^iGXpUA6?8p)V9?ir>QOM?-Wok-DYbVeOFdFoPe9_RZu#F)1d zy#aePVIKD2{HbfR_YRSKH*B`EC&&gZy) zS*#;|95RBw8aB{y+xXrcCx#jR?6RU8wJqAjB!4m;AU1)LtkP2%8-6&}s-K3%Z zM-NWLJorlEM9RCN8S0Vo?m?jeY@9L9J-D}aw87<@OFM7DypBZ*mJdfo68B_=^|p1e zq3P{~?SM!yyuFS_om*!z>>}*R(bpfqH53>4n@~FqYwCOcZpRzGGQq4sS@$J+sx=dY zPWveKKt)nk`Bo!M)ji1i!XHT@A-F#8LRo+?Nr~5((Qh976h{c^h;xNb-IbAfqH)}x z8wheA!Xw}^ubmxixk!3En_;HG zGl3=Fmp!9Ye1qPK!Jd5s^ENr;kIdLe_aUlP8Jm>EnZDuO2O2os9oQi)nKRk@Dc0EK zKz`4E-jbwT&^!D>g!F;5b%=W9@AT~;9V%8ihK)O5u9-E=0DN_vUwD_KoY)|Ck;<6ES^@$3UiNv~ zJ^Zz$TSJ6m&SA}5Yx!yJKOZ9rtj<#!x|wSlF73E3gYbxc3Nb*j6<;F(U~`RN{TuZ& z)|mMpv;v<^^l)bSUwiO2@ua{VPC^MKHk58X_$C4)V6z7&sA()=9vvUmtu%=AeT1}@ zIM#JV+Ioj?JZStWA9^yrar_~IT8Rn&V0Nf3MVuehVo9CJr&mca@Ri9kU1txlxuJs=x2+Za0QGRyHhZ2R(A*=FH>v~TRDDbhvs=5jlwKq z+?3*Am!J8Ua@aZ+=&Rf}^v{=wIxBYU(j#Nh$~-9CUPO&&ewO96;y1RKRAOe}xZ!AY z3_?mea7cNKY45|9^}kft1>*mG6kfbHn55975pZ!UAy zjIz_v^UGpF2}rI)YqK^5YRg-Xyz2fsUPoic`$Z4&qFm~8i;yP%7&ZY%ePe4qn7q=c zz111;CYrde<@LnG0FU35kO*A)-45v~itaggZOqFkVGi@GM=6RG0-dcd!pt~xE8k?j z3ARI1O>ATw2|a|#eSO#Ms6rMM@gQ^2?qfQH0o5@!w98py>TW&c+*@1BI#<7T$B$6s zw@I{8y=Ng|u$=~^+$+G0oHP+SQ#r{bJFq~%=NwXa#LDLIiiF#FkRboheRw8pN*6WY zBMl(QbZw*IK!qsX%}7VEZCU&ChZ<#_0Z?Nfe=zKaR?*`LnMWgtR_=+Ma8k)v>c8)+ zSBI!5U9n9hPt=%d+G~{8u)C{p$tqvjbPYt7)a59mI}luY4&ZYQxtwAKR;2}c{Z~Wf zYpPvmja_AmyEIJY_i76sxZODoWwYB5ITX5;RkIR(eWhK0BvNoqjJFP!EwgO&EGGm2 zL3}dfy0;<|VLG5CLoDtQ!8nv~9reIeS>Ws8daFWxf{I3%qgNa*D>Qb1UJXRhI8hBt zgrRYa+Y{MOaDWw`dV0JsN7lY)Jja>*F7)qfbS1kN-R*tZ_O~97sG1BD?KG6{g4=Pa7hXzDU3XkR|-zYW0b=xhW7`aT;-A6e6K9sW?5In zT(m=EC1}Z(#1%dSUp!s|Kma!_WXHGUUy}HfU`uecEY*c~HI~mEanUoMUadi?f>U>k zT&3xG=j&z~8gdF*!RObJs_fq*m+%?sbR_E@K73`%c3*(0EczWA;jOBL){)7H!-k^u z@fUB6D)I~sw!a@elV{u!uX38&8j%h7Nzu!9i;mOLG880Y0`qthQf$SIx z{UN5S`TaCNy1ZKZXb9%lR(n*b?d78-tXCZxgEcc#9SnV3zRJDUWhhXXEJ43sckhT> ztu9QDnPTcqZWTun&5XmnNvx};-n+XS)}mxh6}RWUcmmCmIc1o?Wm>!niq91(5)&-< z(K30E8!-PJ#Z$f>8M!+Ng_q4Va5VH7Bt@k=+8BFT(@ZtlyeH())l{-#Dy9XSuKm5w zY~E%^*YEr%>kW%uk6F?OM50U)qWE~m^~XpJgHfT#8p8xZvePTYq99L*wkhRbxR2>> z^j{WT%}n0IRWjPNC3?NT&cV3}VlpZqz#t(5Tt>4wzpYoT<$t*C^qD+s*m13VDSpG5&SUF@hU<$oqv{zeK%t$C^8O%jgGhCRgI)D^=f3iypm zC*<98eP>SG)^`y=m7sZ?4%Fl-cTZ=ZVO_pNc@cAzrIZ}K=4y(x#*-xzaIBh*=iB`v zPxt+8PQYnrIGoWi-p|X#v|WatIIpyprSBg`VLxk%yN66-k)w4yuUT$nG&F96DOU6v zCdsiy9=`bgAx~FUSM#B{cp5Tk{J?;g?W{2=w17ZPSDmZ(vnX}2oppdpO+wL%zNh+U zsOk$-f++YfrJ~RS?boJyHR`6cx>f0MlBd`jPcB#K>@J!KZsLWyH|)Ba|atYf6tJqSSFM?9`EM0e5{$dD$34lHi8X zEgjP*aa}akF2){J!AS!fqR_(34Q3qC@?N^Xv!!Xp1>`^1qv3y5bCRCLX1(j1*PQ6(C(D-}Iy=@#~7>*|ao9x$Q21vAEcNvI>WBB8r{RNj5EHr9B4R z(D|YJUV2@UamL$ z<_)J|PxgwJ$}#76flX@a`$i&nn@r$3N=prCNl*>$0=xLR=e_FF@m*pIZ6UIp@0WaM zRMmDGE;%^TCEp=DXg_Z|P$iM+j=eTcoQi5_MFe=78Qd??%4usH0Wt+Y^!SbN+bG7y z%8>Gt<)b?OuhzGdw!VqLH~ubnify1j%W`HepV2L^8*@kJBQ!OH^{7_C4b+@8h}-KW zb)`kAtp_a)F`tt~IS*H)XAeKkebH=yS;yO(W;0t*1>Q5P>elo-C}aFdA2(Zf>%q%} z;)2^hORs8QT+MHK^7ROkO6f*0eJvg>Z5e;RzM6({#~abkNRq7o03|>lo!N>sCDywZ zeupmFS#c^)uS@;NYfy~f|Mtc5t?B+pryK#iKg{>c%vuRcB6W=*d1;G+v8p zXg(U}1Dx7!NbJC1s+HT^oXHUK>s?2D3 zNb~%(8sOv+l~#}&Yc=bKi-L>C+#g2}=ya-LS!D!5A)!@|kp3gR6_%D;J=v0j{u43-k z`>T>)L>g6DdbD)DAzlwnZzm~sh)?O633YcoMY7{qKq8cd)A&m@W32LQa*_gx+hkwe zPFB5NVyPK!C5ZU#+&^R<2dS9v<=aL0tr(?nGQ_KaaVBhi|jK@&0;5c_NM zBQXkrxA;i6r=0w(IOlOl4bM#|sEiE3+vR7TIVHI@1uvcz#u2g>AdEG|tGH_r!Nw@d z9;P?h0-mNq2>mJm65$R`o4k$>GOw@Ruap%nS^>NGFQ5ZYs}k`ZR|F^TvAgmK-UU4^ z|AP2ciLmX6&_X{2;(Z>s7sDtX{>+M$iXVGR99N0o28a zFXU7n)|Xz(6@V+A4J@b`r|Os>o`_|YFym-ysEuJbI8Yh1_i%Pid?s&A0ax~2GkrSS z*F((f^b=i8w{pZzfazt%_P#Zu4*;$@GKQCj6?y7>E4;;;|+~Fgaw^?|A zWo3mHju;J1kqp1bs@vm3d{7;*KdS(k2p$gS|KgiTm$;BOZ@RhuhS;BqSl zU5B{TObEh}bho|`Wq}Fa+hfKx$Ry?I(fHy3V|bpq)LY7Pnn%DEtFJ@?8Lj zQ*1qQqq8O8`MK1662OAltPW8wWl1C;g(lDW`Q zJqOcevc1P%=nRiWm&sQERqFVhfR9Y99!^hQ9qT0mBv1N7`0f}tWP$y0Z(fg>i-XXbv$iUsJRPsJG?lzu@H97InG z0wvKv9sR*O1T6BrN4N_;tsw6ZRINQwLT)+0d8kBV30WFxN_scbpqk?DoZcU{)vy2+ z+&1ssG_CuvwTdQaE!}DD*WHE14$kzLrpN2&Gv2_@)H7#xbJZpYo=?_7Zk@>a+=ee{ zF?=(apsQ;XUbHN+53Wfhb15HL27E_)I(;Cwp zh5mwXzLvSQw+Ey8`ksdWxA{jqE!=^(k%`W0ave!!p-=T6Hns|%`Ap&8(r(X zy3=F${<_1=Z>%?rpZlqq(q|(qJaST~<0i9RntAsJhV5=Z?s`G}{!IYM;)e@eEduy%$1YS^~=NT7hm;~ zc~}l|q`awh-Ju~?3r<@mVOLLbO9yNy{>PMmABHDU?}}k;Y(VX~=I(y>OU8^oeqNhj3)()y=ulI`&rl%t{Ku0x?m9E*Xw5+fHjk6vF-Zokhl!>6& zXAOurc4o2eeP#1Pp3`ZXH2Ffx76G=&qUjltgW9z=N5T zQ{E7EHXOP%e@LSmW@U)zVu4%P|-*&qtP~Rqqfrk zwmaWl4Y#ryN{v+g>&vmh3{)<=QGEafyixw6o%9FZ>S5TY#`C5X6R%6u9T#8QJZ-Kn zTmNo&VcL}q&_{=TB%rXO5Nt+~T2+r-27Q)= z^I6S>vd(h|T)^Y`E=k|Sw&j3GN0eU8%gQb1N-nO9D9O|)9^Z-{WE%?XuSQ=abdY|x zd*s^~^$$>OvOCkY* z+T_R{hjb#fRNR1)f_26DstJ=A8uraguSV@bgI}@CxkIbg7bv>8{f3#%-odm)P;m6` zdsb(3X`=PUp{Ecfw#+$jlmy3*wo?{9)e@dXvcTTENF@^AYtXufjmL z^A+`X)N$W|b5|@r=mp<5LjH7ntAIO6eqz^+oE%kC&=er)UQ{AX662t7z&Uv#P@3qP z47=+3y=f-{rt{)^^G=TafTSO8G0z9vZI||?t5mt1iK3jmAe=y9P#Pz=wKeYy50Knn zEg_ll8_zy?^hoixc$`1oI=a1iqZil|-+;dZUfqi6b<+H2@XNXPH^P8Zr0%Qo<0;F-F;0~r$$=w*mAR))5He&XKZ4{B8CE*r2V2`CCG z$UY0uYdPKMZmCuWHH<#6zpyG&ry1%pIX=JK^}eu|o%NT%*ay8TUe4TGCVs7k3z9cz z;cPO-|AisvQ*wPuC!%lr&z8bSzz*(eAY7ne{mvU!x2bv#0=AuDY(be?D{CHSHX8$D z7Owyf_max@*iMxEohW-D9o~sl{~VA;2?O~2uU_k_<|jt4hZkKYB^A(3V>;bS#Y%uH z+g7=qiOd=t94R^2Z2lSXJh~1LD*TTLm+CAK*>vdT_j$%Ib!1_BblLK7bPJz~AgR5! zgV9vXM7jh!J1cj%eSy!X>j#3eF8iLJA`%|}*$w^yB!ns7Hj62N98>&hQ;gH?L{JtS zYJVL=K}lb8lXYbuf%HM={Y#v}6(ErZ`I9-_&PtRxKyuM9@e>Q#a3zK-q4064yW(_j&L#eS1PRKc{pP)8N(e-qh`QazL`##9a= zIDP@F89K;Ts-tE?%0%veNe=D-q&}Ov$zG%u44~<~nNBJV-GF4I9UA052yC?wPwl9< zjfury&`=(`mA|bT8F|4%6-;q6OZ@-(`#`RdLn2l6&i;N@S{xuhG1@2AB^sa)Z|wsQ zTmC8U5)v=;H<0o(+po;}{h_k>YfMZe{=%DO$)nc)F-|2l8h^q2bqAZZs(9aBlIEs7 zE^eyeFSTNI<`vljA!z+X&;zJ(Xc5_yiWruv7ym0qXSitLsGe|}Q9$XHHQe99E)jHK z;{-#^tRgCBR4I&ksDi&=p49Vo?1Lq}P=EuRo!M~EJMr1)My_nc-v#9%FC#-Lqx0^) zva(uMz}Iu;+@ZM}({AfUJjKR0rNlOaF3%&He8WBYl8cRyZ9Z}#;3Q{%z*d}%j^UW$ z&#Bnd)cR&lRyqectaV5?6a|j4yjMaP0Bn0U(K9qWjYvHGOow>sydbEK3%a`PZsW&u zz?SCC^olzFHv6`{I*gYc2Nd8^fS4;0G@pOtiufZ70=Pu`zVRE|Xw7QRGsT18U? zto$)cZa6|-`K(0!q7D-32eRV&`$voo1nXN%_)rxjM`y1elM0j*rLdR)kHq8>zo!8t zh;`6Dv<2px&Ogw{*|hmG%xXkR%xY(lk6!sVLo>&xoS|YPsvp@7EDMa;Bk+KUGP1wl zVO4L(F~%^oCAOyPQ4uYWVQkpxY0;ceBwk|l@TbH-44j;)fC6>TsB!IO%fT^^q0Y|C zK~%m%Rd2@D8J=2kfLO|3;H}zqs76C+@rhh`HhyU6I?ktA+#>;)DK$WC%^)*ue}gJG zo>BS=>F@Om!&U9g1Obgk-`hYK?0IKu4}lsvO!&MQiT*?_NBxJJyq*wpX`6wOW z=fy0EYW8D{(M$uUO)%TRD{I#uWvRAO?m5%aBCi3Rv;682kiv^^h{6YcfL?B61xLm< zkKLzo2W%fI0F_(`e@8#6aRgez3UEG$oC~@wXJ~S3a|hPt=-M((0IM4)KTC_~FudqK z+6q!UR?@w6qCky#pU5EbY>#@tY2eY_AD*(}H-gd{nI?|d7bBpxJufcYtqQ5Ht%KQz z9JTK}pYcfK8DW)HuTv?z1-W*3N8vo-vHO%=V0G;SXP# zZKk2Ry1F?#+NJ#EuVFQFI$#g6p<#eSgt(`dOCEA7{RSMp*`-|i>V=MQg*)?o&^gL$ zXj<}*jBts)jk=7g zJ!`JY6JPt-C6$(@_iW|d#36syh;rTsB1d2bx!mMV1)si>AK%>K zDZfE&sGH#vZ%5mq961@uQE*D$+BA=?M6@RvbY&`0_BtTjixGlJmjIhmBw#kiVgHkasg!*X#I}&rIjCayZTe#ZVe;36G*Lon|o1r zO4k+(uNerNbNl8XF)}X>j@eVsQ|So%e9=FI*U=tdC*``IF?24npOa3rEPQVN=a9?d z*SJ5{bI-}ku0`2=${~g#h(-2(KK?YO964@AjTGT3F=m%2tF({PDS-ZvpfYOo5|t); zpsAu_ZX88%a4um6;VkEJyiH-G3nSV0S-GDH_I{;4jqLbAp*GkvEPOMvW%5;wOIH}E zIAlvj5ax)&4iXj;#)Kqgh>p%fj>V&M=7ON=N4qqwua9SkW~wm!sa3e@RFsL2j#vpT zl_{=AkX|Ct>}#{&mJhSGE3*ybzO3wpi1+Ok!>;z(8FV*8nWgnZdCT$E?Ap!HHJ)1% zINs83*_t!cJt$9?$J7R=(zUL?HQ3npI@q|Cy2C8-^HT~8XBv39O7z&tREB;3sC5h@ zYu!1c9O#aG4FsQit^65hxG$a*8ChEMlV&kI=e7f6KYj|r{PE}4M1~|}OMi{0Waost zc=^~%@+E;=S|2(Saro>90THF6TLpyqLI#9)i%62d6Bxu3&A9vZ(mw8&+S8bPM{Ip= zK55PY)h)p)e@NU^9dtKIEtZ4rGY{gU?)&a#NSCdm0?`(l@n{-Tdqa6DXpe z>$h(eB@-=8JFp_4c-Kt!p@9>Ti7F~D3IjALnKU7k!6itsQ;#{M7#CcRJ$L=^P!sa| zLK=ombiVa)IK;g1u`8KY%{UVS-N=8)HVH!>D;cp3YPn)KT`Dm-aH*%*^1(DI3likQ zzSt2)@)cg=={={2KMmeJev5H+DS(De$KN;wsvYC9maa_l%F5$ zQKu95`?=%#O}dWUMCni{=N|uz?5!oaV;#fCkQJ~2KJ^iH8_mUl|B|N4T3uUGr{J7TZSrhw|^C@ z0k0X4P{;9+a!Z%DQCGjpM?~bBF<1WknB@ous0cDG$|B1SR)%;nh}V_PWO`9|`?xOs!*I##q3O4jQzidOXv z2!L@=Pv38e53<+$IKrbkW3qjN;t~Lk_ZHuoTYiedQl8`%Z;0BjBzg36G8(^uKO>=K zva&9?GM(hgAaZo`F>AgFLZOSA_x-Z~NNBt!w`h5=X#XX@qJ=t4t9wPA4Iu(GQ-s7F zerj7%C3myKoS^QWl>GB54pz&`B?FWwfemoU&5sc zh1lrm8bs<-xFa^IuH2L92E)@PTp>?xuLPZ5oF2|H6Rcp-2WMxRumW?dPtI6B0}31M zyh#k#42Dze-*6LdRmn(}0@cV@)vjjuZ)T0P-<}m$g8D-hiC~}I-Mu+D{MnNtMA!P0 ztvRm=jM#t3rkA2!b{2Y)AE|$-Bg|z_3y6?2W%~HDAn{Db%Ys&YaNatIE089fuHJgA zA+AVqhUc>rL^oK7*FhGD6HhJqlVP^DI;?}x`5nLK`pIfr8Wrl^LLzRm7(d`1+}69W zcVTTXb6esn;0_e)48{f!dXU*HW8?!Ia!Ll`n*3e8MeK?vQS(i&hN=n2x&1pA>l2O? zLh)~j3n6ilmNuN?(dXe@Y_Q45xVqp4f=ORI`PC+o{lSb*+gpER6+{E?sxmWN4_dbf zsQmnT)sqaAOdDY{m2%8p-*>D|OHku~I&;<{DGbHNF{C5!DHvFdP5WEMB}3ula7W%8 z6U-ujgr5cTniip~3+zUrzbsZe4Vl6`e@z@ed!op0M(e6=IuAhf-n8#BbpdqFIU2KR zjC4yu8oq&WmYqCBZ0-Pw;4m6(O1XmVybiF*-vX*If7{))O{N`1i)lhy4P#{u<}hSx zG`Njw)=CiDRG~7aWxbEkP4$X{4Cq25Z$)x zCW}Nv4PK8xV5SkXs|EHXLA)Q33ag&HYIZZdeD7tLBRDKlGOX6yyz>jLZk~kv{B;^b zb3Fxi>7Kip2;-y*RCm;z3ki*&hcrhk91v*|SIB0D_CuOUjr1J@HF=-Cl^mecqG>sz zmyhGv*xTx6Wq4>aefCF~{|@thOG|k}M~?Q!$jM|El8)x5#-;Q*UDP}F#4;6=YG~Z& zIa@v7>i|0TsK~FHkDg5XI*a08V3`@;lmFhwe#tXVc}+q!nJt%0=m1RcT2LB1ZO5AN zuc~+qT{kZHfIOVXqs5Q>{C8K#`$Z&txIB7SGGHViMKe@XxP@%KmgY<8jI>4_a!X{N zKnj4{ea}(9U6#j6`1+v{KX^B6UTeTwL`o9W93U3=W_YfjzI#Hf%P8s|_HXQjA7Hws zw{$S&()vIo{F*2V-a}$j(84>o8jZZuq=!WC_M2LL0L(3dN>R~1S(Z-FkWFJSYCavz zD6>@K{|RP=nhF1xnMANZB$s38Bdn$(ye6cF(8k)|)odoZqDtUy3^cCE%x?f!>E^g& zfZ^j{`4IWC-8}a6P^>=7oN+?m1dp!1tD_%zMqY!MZ^=o2RCj|pTwubk_!O4A)K0I; zoIJBp-cCo6loSoe&M{9towsAQtr4S-+TPpUVzfmrr~#7?um4>RVw13#M7le_0;>ka zTplMH^n{F(d9lWt@7i9-1;t%O4DE;{X6IIfoJdjjpjQXtFx_kp)L7Aezh|v0`GNgc3D(fylP-k zgC#520aqhRh4q(-8^LMxxD0@;h?k5{PVY799a*1CNxL0^KVN4h()x^PK_ zpAAQE)9&ZrDCD&fnN+uwnL|IX3nAG$JhE70z}i%qBxAPXO(j|p5VAXrzc4tX#L8*U z*zB-LB~;Tlpy~tLhaAx0L^^--Tkr+Bkxs<;>yWK=+FzRHRDrhHyY_VN{ZuS@#-?`@9Saaw zLy9K6y5*mc4?R=VEE9w;-!UHW z`>taD9c`~wSa9EHEv)l!=YAAcG(6r2A>t`53si7!ZA2QDuFdc)F|#jDXTTlv5&z+D zqc8mvfaiMhH%HCEib8G!62E7NJMsOsG(fE&wrw`+ipu3yUNr)#J!ZeR)k`WAVODh^ z4bSmu`7a0vnnASdTGS(bgtc#MDR4*O_4t&{xF}afnkVgHAuRk&yt<`4Ia?n3_7Vn< zN{-*<-FbY8__O(J^e#xz%G^V%fob9;ZjhbZYaV^0ACEt|4zrJOcGV#r%ow&?#eOMV zqz_pLkT-4nmOdZ?arMOP>^ZM1|NQ$2?Aq)Vz+>wFdd~Bc`!IX)lQR)H*TLHH!f&oF zXEQI z{NM;*M|m!V|5HwVyK1a1aI?8*uv5-TTz$Q?Zf*Soy8*;ZCmSFyc0Pe01?u{_*6#Q% zI(;~JYEgq&eT?)J0Iog|?|eSqIP2hC{joZfoB8KE{M6qn@AgCWv%FJLBtrf5w8@Pz zIL&qwO4XFUmdl)0$?Qg}*Kg_(e!yAr^ET~m+8A4Y-Osc!$4QZfq|Xl9R?yzQyW$fV zm*JCi!w>i%>b&hso!O*sB%oyW<`#!5{$Jor(VT1%_>EUBn-OnKEzfb=I?-EGK`)_L zbKpdmde|A8a{kbQ3MoG7C^|OvSj*m6uw)!~GPsURD6lubI zDr#NpiO~4w^dWh62=jYq6N+%-0JRZc5;TSjfQaM$Th`Y#9SYIKz!{&X?@b_Woi66L z4PN32@R@_MrqMlL0AOTg)hw1xgSW*H*W;KQWjE+XFng+8GJD2ohmSh8VeDK zgnL+xbn|l!P%tIK7SO;0=eh67_ve~IPwi}vd0#RBDkjjYWzhdSG5yyV4Y4M*5@(SRnTJ^8Q zV60D%k?`^x-r~qwD8wL_%)+;zz|ccRsuWR82947R0lyFjJokiGN$If#D2;9^4o+TW zPotX(rKv}@P`bS|1RQjWl*-`%cR|4KZRLFlQdO&$?JP}qJPd7VH3-LSwC5$;)f;HUW3t_Xr`&Es&D0gu9!Ju(iW;^c z@_mDeTzuV756FOkOq%r|CV`KJ*tzhHdq;;;3?Xr_ILy&uW=;YqxS?14;NV4C|LtHi zrJ{3bE$0+3$MqtJ0xvOe>)|i-CNCh#VB6G zZ{FU{2@DJ-ORY^lK$xg=qd?w=>9!V-8PiYoxh!Pgt`!=Z$j=9!MsD~MFYQQyIX9?u z-PgAV4q(ro_`g*!gnak3js_3Dz@t|1WI|I9%g<>3B36u4ic`RvaZa9lTB=VLKS+tE LtDnm{r-UW|EF>hy literal 0 HcmV?d00001 diff --git a/example/game/easeljs/js/createjs-2013.02.12.min.js b/example/game/easeljs/js/createjs-2013.02.12.min.js deleted file mode 100644 index 25317f8..0000000 --- a/example/game/easeljs/js/createjs-2013.02.12.min.js +++ /dev/null @@ -1,246 +0,0 @@ -/* -* EaselJS -* Visit http://createjs.com/ for documentation, updates and examples. -* -* Copyright (c) 2011 gskinner.com, inc. -* -* Distributed under the terms of the MIT license. -* http://www.opensource.org/licenses/mit-license.html -* -* This notice shall be included in all copies or substantial portions of the Software. -*/ -this.createjs=this.createjs||{};(function(){var c=function(){throw"UID cannot be instantiated";};c._nextID=0;c.get=function(){return c._nextID++};createjs.UID=c})();this.createjs=this.createjs||{}; -(function(){var c=function(){this.initialize()},a=c.prototype;c.initialize=function(b){b.addEventListener=a.addEventListener;b.removeEventListener=a.removeEventListener;b.removeAllEventListeners=a.removeAllEventListeners;b.hasEventListener=a.hasEventListener;b.dispatchEvent=a.dispatchEvent};a._listeners=null;a.initialize=function(){};a.addEventListener=function(b,g){var d=this._listeners;d?this.removeEventListener(b,g):d=this._listeners={};var a=d[b];a||(a=d[b]=[]);a.push(g);return g};a.removeEventListener= -function(b,g){var d=this._listeners;if(d){var a=d[b];if(a)for(var c=0,f=a.length;cc._times.length)return-1;null==b&&(b=c.getFPS()|0);b=Math.min(c._times.length-1,b);return 1E3/((c._times[0]-c._times[b])/b)};c.setPaused=function(b){c._paused=b};c.getPaused=function(){return c._paused};c.getTime=function(b){return c._getTime()-c._startTime-(b?c._pausedTime:0)};c.getTicks=function(b){return c._ticks-(b? -c._pausedTicks:0)};c._handleAF=function(){c._rafActive=!1;c._setupTick();c._getTime()-c._lastTime>=0.97*(c._interval-1)&&c._tick()};c._handleTimeout=function(){c.timeoutID=null;c._setupTick();c._tick()};c._setupTick=function(){if(!(c._rafActive||null!=c.timeoutID)){if(c.useRAF){var b=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame;if(b){b(c._handleAF);c._rafActive=!0;return}}c.timeoutID= -setTimeout(c._handleTimeout,c._interval)}};c._tick=function(){var b=c._getTime();c._ticks++;var g=b-c._lastTime,d=c._paused;d&&(c._pausedTicks++,c._pausedTime+=g);c._lastTime=b;for(var a=c._pauseable,e=c._listeners.slice(),f=e?e.length:0,h=0;hthis.a&&0<=this.d&&(b.rotation+=0>=b.rotation?180:-180),b.skewX=b.skewY=0):(b.skewX=g/c.DEG_TO_RAD, -b.skewY=d/c.DEG_TO_RAD);return b};a.reinitialize=function(b,g,d,a,c,f,h,k,m){this.initialize(b,g,d,a,c,f);this.alpha=h||1;this.shadow=k;this.compositeOperation=m;return this};a.appendProperties=function(b,g,d){this.alpha*=b;this.shadow=g||this.shadow;this.compositeOperation=d||this.compositeOperation;return this};a.prependProperties=function(b,g,d){this.alpha*=b;this.shadow=this.shadow||g;this.compositeOperation=this.compositeOperation||d;return this};a.clone=function(){var b=new c(this.a,this.b, -this.c,this.d,this.tx,this.ty);b.shadow=this.shadow;b.alpha=this.alpha;b.compositeOperation=this.compositeOperation;return b};a.toString=function(){return"[Matrix2D (a="+this.a+" b="+this.b+" c="+this.c+" d="+this.d+" tx="+this.tx+" ty="+this.ty+")]"};c.identity=new c(1,0,0,1,0,0);createjs.Matrix2D=c})();this.createjs=this.createjs||{};(function(){var c=function(b,g){this.initialize(b,g)},a=c.prototype;a.x=0;a.y=0;a.initialize=function(b,g){this.x=null==b?0:b;this.y=null==g?0:g};a.clone=function(){return new c(this.x,this.y)};a.toString=function(){return"[Point (x="+this.x+" y="+this.y+")]"};createjs.Point=c})();this.createjs=this.createjs||{};(function(){var c=function(b,g,d,a){this.initialize(b,g,d,a)},a=c.prototype;a.x=0;a.y=0;a.width=0;a.height=0;a.initialize=function(b,g,d,a){this.x=null==b?0:b;this.y=null==g?0:g;this.width=null==d?0:d;this.height=null==a?0:a};a.clone=function(){return new c(this.x,this.y,this.width,this.height)};a.toString=function(){return"[Rectangle (x="+this.x+" y="+this.y+" width="+this.width+" height="+this.height+")]"};createjs.Rectangle=c})();this.createjs=this.createjs||{}; -(function(){var c=function(b,g,d,a,c,f,h){this.initialize(b,g,d,a,c,f,h)},a=c.prototype;a.target=null;a.overLabel=null;a.outLabel=null;a.downLabel=null;a.play=!1;a._isPressed=!1;a._isOver=!1;a.initialize=function(b,g,d,a,c,f,h){b.addEventListener&&(this.target=b,b.cursor="pointer",this.overLabel=null==d?"over":d,this.outLabel=null==g?"out":g,this.downLabel=null==a?"down":a,this.play=c,this.setEnabled(!0),this.handleEvent({}),f&&(h&&(f.actionsEnabled=!1,f.gotoAndStop&&f.gotoAndStop(h)),b.hitArea=f))}; -a.setEnabled=function(b){var g=this.target;b?(g.addEventListener("mouseover",this),g.addEventListener("mouseout",this),g.addEventListener("mousedown",this)):(g.removeEventListener("mouseover",this),g.removeEventListener("mouseout",this),g.removeEventListener("mousedown",this))};a.toString=function(){return"[ButtonHelper]"};a.handleEvent=function(b){var g=this.target,d=b.type;"mousedown"==d?(b.addEventListener("mouseup",this),this._isPressed=!0,b=this.downLabel):"mouseup"==d?(this._isPressed=!1,b= -this._isOver?this.overLabel:this.outLabel):"mouseover"==d?(this._isOver=!0,b=this._isPressed?this.downLabel:this.overLabel):(this._isOver=!1,b=this._isPressed?this.overLabel:this.outLabel);this.play?g.gotoAndPlay&&g.gotoAndPlay(b):g.gotoAndStop&&g.gotoAndStop(b)};createjs.ButtonHelper=c})();this.createjs=this.createjs||{};(function(){var c=function(b,g,d,a){this.initialize(b,g,d,a)},a=c.prototype;c.identity=null;a.color=null;a.offsetX=0;a.offsetY=0;a.blur=0;a.initialize=function(b,g,d,a){this.color=b;this.offsetX=g;this.offsetY=d;this.blur=a};a.toString=function(){return"[Shadow]"};a.clone=function(){return new c(this.color,this.offsetX,this.offsetY,this.blur)};c.identity=new c("transparent",0,0,0);createjs.Shadow=c})();this.createjs=this.createjs||{}; -(function(){var c=function(b){this.initialize(b)},a=c.prototype;a.complete=!0;a.onComplete=null;a.addEventListener=null;a.removeEventListener=null;a.removeAllEventListeners=null;a.dispatchEvent=null;a.hasEventListener=null;a._listeners=null;createjs.EventDispatcher.initialize(a);a._animations=null;a._frames=null;a._images=null;a._data=null;a._loadCount=0;a._frameHeight=0;a._frameWidth=0;a._numFrames=0;a._regX=0;a._regY=0;a.initialize=function(b){var g,d,a;if(null!=b){if(b.images&&0<(d=b.images.length)){a= -this._images=[];for(g=0;ga.length||!1==b.next?null:null==b.next||!0==b.next?h:b.next;b.frequency||(b.frequency=1);this._animations.push(h);this._data[h]=b}}}};a.getNumFrames=function(b){if(null==b)return this._frames?this._frames.length:this._numFrames;b=this._data[b];return null==b?0:b.frames.length};a.getAnimations=function(){return this._animations.slice(0)};a.getAnimation=function(b){return this._data[b]};a.getFrame=function(b){var g;return this.complete&&this._frames&&(g=this._frames[b])?g:null}; -a.getFrameBounds=function(b){return(b=this.getFrame(b))?new createjs.Rectangle(-b.regX,-b.regY,b.rect.width,b.rect.height):null};a.toString=function(){return"[SpriteSheet]"};a.clone=function(){var b=new c;b.complete=this.complete;b._animations=this._animations;b._frames=this._frames;b._images=this._images;b._data=this._data;b._frameHeight=this._frameHeight;b._frameWidth=this._frameWidth;b._numFrames=this._numFrames;b._loadCount=this._loadCount;return b};a._handleImageLoad=function(){0==--this._loadCount&& -(this._calculateFrames(),this.complete=!0,this.onComplete&&this.onComplete(),this.dispatchEvent("complete"))};a._calculateFrames=function(){if(!(this._frames||0==this._frameWidth)){this._frames=[];for(var b=0,g=this._frameWidth,d=this._frameHeight,a=0,c=this._images;a>8&255,b=b>>16&255);return null==c?"rgb("+b+","+d+","+a+")":"rgba("+b+","+d+","+a+","+c+")"};a.getHSL=function(b,d,a,c){return null==c?"hsl("+b%360+","+d+"%,"+a+"%)":"hsla("+b%360+","+d+"%,"+a+"%,"+c+")"};a.BASE_64={A:0,B:1,C:2,D:3,E:4,F:5,G:6,H:7,I:8,J:9, -K:10,L:11,M:12,N:13,O:14,P:15,Q:16,R:17,S:18,T:19,U:20,V:21,W:22,X:23,Y:24,Z:25,a:26,b:27,c:28,d:29,e:30,f:31,g:32,h:33,i:34,j:35,k:36,l:37,m:38,n:39,o:40,p:41,q:42,r:43,s:44,t:45,u:46,v:47,w:48,x:49,y:50,z:51,"0":52,1:53,2:54,3:55,4:56,5:57,6:58,7:59,8:60,9:61,"+":62,"/":63};a.STROKE_CAPS_MAP=["butt","round","square"];a.STROKE_JOINTS_MAP=["miter","round","bevel"];a._ctx=(createjs.createCanvas?createjs.createCanvas():document.createElement("canvas")).getContext("2d");a.beginCmd=new c(a._ctx.beginPath, -[],!1);a.fillCmd=new c(a._ctx.fill,[],!1);a.strokeCmd=new c(a._ctx.stroke,[],!1);b._strokeInstructions=null;b._strokeStyleInstructions=null;b._ignoreScaleStroke=!1;b._fillInstructions=null;b._instructions=null;b._oldInstructions=null;b._activeInstructions=null;b._active=!1;b._dirty=!1;b.initialize=function(){this.clear();this._ctx=a._ctx};b.isEmpty=function(){return!(this._instructions.length||this._oldInstructions.length||this._activeInstructions.length)};b.draw=function(b){this._dirty&&this._updateInstructions(); -for(var d=this._instructions,a=0,c=d.length;af&&(f*=q=-1);f>p&&(f=p);0>h&&(h*=s=-1);h>p&&(h=p);0>k&&(k*=t=-1);k>p&&(k=p);0>m&&(m*=u=-1);m>p&&(m=p);this._dirty=this._active=!0;var p=this._ctx.arcTo,r=this._ctx.lineTo;this._activeInstructions.push(new c(this._ctx.moveTo,[b+a-h,d]),new c(p,[b+a+h*s,d-h*s,b+a,d+h,h]),new c(r,[b+a,d+e-k]),new c(p,[b+a+k*t,d+e+k*t,b+a-k,d+e,k]),new c(r,[b+m,d+e]),new c(p,[b-m*u,d+e+m*u,b,d+e-m,m]),new c(r,[b,d+f]),new c(p,[b-f*q,d-f*q,b+f,d,f]),new c(this._ctx.closePath));return this};b.drawCircle= -function(b,d,a){this.arc(b,d,a,0,2*Math.PI);return this};b.drawEllipse=function(b,d,a,e){this._dirty=this._active=!0;var f=0.5522848*(a/2),h=0.5522848*(e/2),k=b+a,m=d+e;a=b+a/2;e=d+e/2;this._activeInstructions.push(new c(this._ctx.moveTo,[b,e]),new c(this._ctx.bezierCurveTo,[b,e-h,a-f,d,a,d]),new c(this._ctx.bezierCurveTo,[a+f,d,k,e-h,k,e]),new c(this._ctx.bezierCurveTo,[k,e+h,a+f,m,a,m]),new c(this._ctx.bezierCurveTo,[a-f,m,b,e+h,b,e]));return this};b.drawPolyStar=function(b,d,a,e,f,h){this._dirty= -this._active=!0;null==f&&(f=0);f=1-f;h=null==h?0:h/(180/Math.PI);var k=Math.PI/e;this._activeInstructions.push(new c(this._ctx.moveTo,[b+Math.cos(h)*a,d+Math.sin(h)*a]));for(var m=0;m>3,u=d[t];if(!u||s&3)throw"bad path data (@"+e+"): "+q;q=c[t];t||(k=m=0);h.length=0;e++;s=(s>>2&1)+2;for(t=0;t>5?-1:1,r=(r&31)<<6|p[b.charAt(e+1)];3==s&&(r=r<<6|p[b.charAt(e+2)]);r=v*r/10;t%2?k=r+=k:m=r+=m;h[t]=r;e+=s}u.apply(this,h)}return this};b.clone=function(){var b=new a;b._instructions=this._instructions.slice();b._activeInstructions=this._activeInstructions.slice(); -b._oldInstructions=this._oldInstructions.slice();this._fillInstructions&&(b._fillInstructions=this._fillInstructions.slice());this._strokeInstructions&&(b._strokeInstructions=this._strokeInstructions.slice());this._strokeStyleInstructions&&(b._strokeStyleInstructions=this._strokeStyleInstructions.slice());b._active=this._active;b._dirty=this._dirty;return b};b.toString=function(){return"[Graphics]"};b.mt=b.moveTo;b.lt=b.lineTo;b.at=b.arcTo;b.bt=b.bezierCurveTo;b.qt=b.quadraticCurveTo;b.a=b.arc;b.r= -b.rect;b.cp=b.closePath;b.c=b.clear;b.f=b.beginFill;b.lf=b.beginLinearGradientFill;b.rf=b.beginRadialGradientFill;b.bf=b.beginBitmapFill;b.ef=b.endFill;b.ss=b.setStrokeStyle;b.s=b.beginStroke;b.ls=b.beginLinearGradientStroke;b.rs=b.beginRadialGradientStroke;b.bs=b.beginBitmapStroke;b.es=b.endStroke;b.dr=b.drawRect;b.rr=b.drawRoundRect;b.rc=b.drawRoundRectComplex;b.dc=b.drawCircle;b.de=b.drawEllipse;b.dp=b.drawPolyStar;b.p=b.decodePath;b._updateInstructions=function(){this._instructions=this._oldInstructions.slice(); -this._instructions.push(a.beginCmd);this._instructions.push.apply(this._instructions,this._activeInstructions);this._fillInstructions&&this._instructions.push.apply(this._instructions,this._fillInstructions);this._strokeInstructions&&(this._strokeStyleInstructions&&this._instructions.push.apply(this._instructions,this._strokeStyleInstructions),this._instructions.push.apply(this._instructions,this._strokeInstructions),this._ignoreScaleStroke?this._instructions.push(new c(this._ctx.save,[],!1),new c(this._ctx.setTransform, -[1,0,0,1,0,0],!1),a.strokeCmd,new c(this._ctx.restore,[],!1)):this._instructions.push(a.strokeCmd))};b._newPath=function(){this._dirty&&this._updateInstructions();this._oldInstructions=this._instructions;this._activeInstructions=[];this._active=this._dirty=!1};b._setProp=function(b,a){this[b]=a};createjs.Graphics=a})();this.createjs=this.createjs||{}; -(function(){var c=function(){this.initialize()},a=c.prototype;c.suppressCrossDomainErrors=!1;c._hitTestCanvas=createjs.createCanvas?createjs.createCanvas():document.createElement("canvas");c._hitTestCanvas.width=c._hitTestCanvas.height=1;c._hitTestContext=c._hitTestCanvas.getContext("2d");c._nextCacheID=1;a.alpha=1;a.cacheCanvas=null;a.id=-1;a.mouseEnabled=!0;a.name=null;a.parent=null;a.regX=0;a.regY=0;a.rotation=0;a.scaleX=1;a.scaleY=1;a.skewX=0;a.skewY=0;a.shadow=null;a.visible=!0;a.x=0;a.y=0;a.compositeOperation= -null;a.snapToPixel=!1;a.onPress=null;a.onClick=null;a.onDoubleClick=null;a.onMouseOver=null;a.onMouseOut=null;a.onTick=null;a.filters=null;a.cacheID=0;a.mask=null;a.hitArea=null;a.cursor=null;a.addEventListener=null;a.removeEventListener=null;a.removeAllEventListeners=null;a.dispatchEvent=null;a.hasEventListener=null;a._listeners=null;createjs.EventDispatcher.initialize(a);a._cacheOffsetX=0;a._cacheOffsetY=0;a._cacheScale=1;a._cacheDataURLID=0;a._cacheDataURL=null;a._matrix=null;a.initialize=function(){this.id= -createjs.UID.get();this._matrix=new createjs.Matrix2D};a.isVisible=function(){return!(!this.visible||!(0c||c>this.children.length)return arguments[d-2];if(2b||b>this.children.length- -1)return!1;if(a=this.children[b])a.parent=null;this.children.splice(b,1);return!0};a.removeAllChildren=function(){for(var b=this.children;b.length;)b.pop().parent=null};a.getChildAt=function(b){return this.children[b]};a.getChildByName=function(b){for(var a=this.children,d=0,c=a.length;da||a>=c)){for(var e=0;e=b)return;var a=this;this._mouseOverIntervalID=setInterval(function(){a._testMouseOver()},1E3/Math.min(50,b))};a.enableDOMEvents=function(b){null==b&&(b=!0);var a,d=this._eventListeners;if(!b&&d){for(a in d)b=d[a],b.t.removeEventListener(a,b.f);this._eventListeners=null}else if(b&&!d){b=window.addEventListener?window:document;var c=this,d=this._eventListeners={};d.mouseup={t:b,f:function(b){c._handleMouseUp(b)}}; -d.mousemove={t:b,f:function(b){c._handleMouseMove(b)}};d.dblclick={t:b,f:function(b){c._handleDoubleClick(b)}};(b=this.canvas)&&(d.mousedown={t:b,f:function(b){c._handleMouseDown(b)}});for(a in d)b=d[a],b.t.addEventListener(a,b.f)}};a.clone=function(){var b=new c(null);this.cloneProps(b);return b};a.toString=function(){return"[Stage (name="+this.name+")]"};a._getPointerData=function(b){var a=this._pointerData[b];a||(a=this._pointerData[b]={x:0,y:0},null==this._primaryPointerID&&(this._primaryPointerID= -b));return a};a._handleMouseMove=function(b){b||(b=window.event);this._handlePointerMove(-1,b,b.pageX,b.pageY)};a._handlePointerMove=function(b,a,d,c){if(this.canvas){var e=this._getPointerData(b),f=e.inBounds;this._updatePointerPosition(b,d,c);if(f||e.inBounds||this.mouseMoveOutside){if(this.onMouseMove||this.hasEventListener("stagemousemove"))d=new createjs.MouseEvent("stagemousemove",e.x,e.y,this,a,b,b==this._primaryPointerID,e.rawX,e.rawY),this.onMouseMove&&this.onMouseMove(d),this.dispatchEvent(d); -if((c=e.event)&&(c.onMouseMove||c.hasEventListener("mousemove")))d=new createjs.MouseEvent("mousemove",e.x,e.y,c.target,a,b,b==this._primaryPointerID,e.rawX,e.rawY),c.onMouseMove&&c.onMouseMove(d),c.dispatchEvent(d,c.target)}}};a._updatePointerPosition=function(b,a,d){var c=this._getElementRect(this.canvas);a-=c.left;d-=c.top;var e=this.canvas.width,f=this.canvas.height;a/=(c.right-c.left)/e;d/=(c.bottom-c.top)/f;c=this._getPointerData(b);(c.inBounds=0<=a&&0<=d&&a<=e-1&&d<=f-1)?(c.x=a,c.y=d):this.mouseMoveOutside&& -(c.x=0>a?0:a>e-1?e-1:a,c.y=0>d?0:d>f-1?f-1:d);c.rawX=a;c.rawY=d;b==this._primaryPointerID&&(this.mouseX=c.x,this.mouseY=c.y,this.mouseInBounds=c.inBounds)};a._getElementRect=function(b){var a;try{a=b.getBoundingClientRect()}catch(d){a={top:b.offsetTop,left:b.offsetLeft,width:b.offsetWidth,height:b.offsetHeight}}var c=(window.pageXOffset||document.scrollLeft||0)-(document.clientLeft||document.body.clientLeft||0),e=(window.pageYOffset||document.scrollTop||0)-(document.clientTop||document.body.clientTop|| -0),f=window.getComputedStyle?getComputedStyle(b):b.currentStyle;b=parseInt(f.paddingLeft)+parseInt(f.borderLeftWidth);var h=parseInt(f.paddingTop)+parseInt(f.borderTopWidth),k=parseInt(f.paddingRight)+parseInt(f.borderRightWidth),f=parseInt(f.paddingBottom)+parseInt(f.borderBottomWidth);return{left:a.left+c+b,right:a.right+c-k,top:a.top+e+h,bottom:a.bottom+e-f}};a._handleMouseUp=function(b){this._handlePointerUp(-1,b,!1)};a._handlePointerUp=function(b,a,d){var c=this._getPointerData(b),e;if(this.onMouseMove|| -this.hasEventListener("stagemouseup"))e=new createjs.MouseEvent("stagemouseup",c.x,c.y,this,a,b,b==this._primaryPointerID,c.rawX,c.rawY),this.onMouseUp&&this.onMouseUp(e),this.dispatchEvent(e);var f=c.event;if(f&&(f.onMouseUp||f.hasEventListener("mouseup")))e=new createjs.MouseEvent("mouseup",c.x,c.y,f.target,a,b,b==this._primaryPointerID,c.rawX,c.rawY),f.onMouseUp&&f.onMouseUp(e),f.dispatchEvent(e,f.target);if((f=c.target)&&(f.onClick||f.hasEventListener("click"))&&this._getObjectsUnderPoint(c.x, -c.y,null,!0,this._mouseOverIntervalID?3:1)==f)e=new createjs.MouseEvent("click",c.x,c.y,f,a,b,b==this._primaryPointerID,c.rawX,c.rawY),f.onClick&&f.onClick(e),f.dispatchEvent(e);d?(b==this._primaryPointerID&&(this._primaryPointerID=null),delete this._pointerData[b]):c.event=c.target=null};a._handleMouseDown=function(b){this._handlePointerDown(-1,b,!1)};a._handlePointerDown=function(b,a,d,c){var e=this._getPointerData(b);null!=c&&this._updatePointerPosition(b,d,c);if(this.onMouseDown||this.hasEventListener("stagemousedown"))d= -new createjs.MouseEvent("stagemousedown",e.x,e.y,this,a,b,b==this._primaryPointerID,e.rawX,e.rawY),this.onMouseDown&&this.onMouseDown(d),this.dispatchEvent(d);if(c=this._getObjectsUnderPoint(e.x,e.y,null,this._mouseOverIntervalID?3:1))if(e.target=c,c.onPress||c.hasEventListener("mousedown"))if(d=new createjs.MouseEvent("mousedown",e.x,e.y,c,a,b,b==this._primaryPointerID,e.rawX,e.rawY),c.onPress&&c.onPress(d),c.dispatchEvent(d),d.onMouseMove||d.onMouseUp||d.hasEventListener("mousemove")||d.hasEventListener("mouseup"))e.event= -d};a._testMouseOver=function(){if(-1==this._primaryPointerID&&!(this.mouseX==this._mouseOverX&&this.mouseY==this._mouseOverY&&this.mouseInBounds)){var b=null;this.mouseInBounds&&(b=this._getObjectsUnderPoint(this.mouseX,this.mouseY,null,3),this._mouseOverX=this.mouseX,this._mouseOverY=this.mouseY);var a=this._mouseOverTarget;if(a!=b){var d=this._getPointerData(-1);if(a&&(a.onMouseOut||a.hasEventListener("mouseout"))){var c=new createjs.MouseEvent("mouseout",d.x,d.y,a,null,-1,d.rawX,d.rawY);a.onMouseOut&& -a.onMouseOut(c);a.dispatchEvent(c)}a&&(this.canvas.style.cursor="");if(b&&(b.onMouseOver||b.hasEventListener("mouseover")))c=new createjs.MouseEvent("mouseover",d.x,d.y,b,null,-1,d.rawX,d.rawY),b.onMouseOver&&b.onMouseOver(c),b.dispatchEvent(c);b&&(this.canvas.style.cursor=b.cursor||"");this._mouseOverTarget=b}}};a._handleDoubleClick=function(b){var a=this._getPointerData(-1),d=this._getObjectsUnderPoint(a.x,a.y,null,this._mouseOverIntervalID?3:1);if(d&&(d.onDoubleClick||d.hasEventListener("dblclick")))evt= -new createjs.MouseEvent("dblclick",a.x,a.y,d,b,-1,!0,a.rawX,a.rawY),d.onDoubleClick&&d.onDoubleClick(evt),d.dispatchEvent(evt)};createjs.Stage=c})();this.createjs=this.createjs||{}; -(function(){var c=function(b){this.initialize(b)},a=c.prototype=new createjs.DisplayObject;a.image=null;a.snapToPixel=!0;a.sourceRect=null;a.DisplayObject_initialize=a.initialize;a.initialize=function(b){this.DisplayObject_initialize();"string"==typeof b?(this.image=new Image,this.image.src=b):this.image=b};a.isVisible=function(){var b=this.cacheCanvas||this.image&&(this.image.complete||this.image.getContext||2<=this.image.readyState);return!(!this.visible||!(0=c){var e=b.next;this._dispatchAnimationEnd(b,a,d,e,c-1)||(e?this._goto(e):(this.paused=!0,this.currentAnimationFrame=b.frames.length-1,this.currentFrame= -b.frames[this.currentAnimationFrame]))}else this.currentFrame=b.frames[this.currentAnimationFrame];else c=this.spriteSheet.getNumFrames(),a>=c&&!this._dispatchAnimationEnd(b,a,d,c-1)&&(this.currentFrame=0)};a._dispatchAnimationEnd=function(b,a,d,c,e){var f=b?b.name:null;this.onAnimationEnd&&this.onAnimationEnd(this,f,c);this.dispatchEvent({type:"animationend",name:f,next:c});!d&&this.paused&&(this.currentAnimationFrame=e);return this.paused!=d||this._animation!=b||this.currentFrame!=a};a.DisplayObject_cloneProps= -a.cloneProps;a.cloneProps=function(b){this.DisplayObject_cloneProps(b);b.onAnimationEnd=this.onAnimationEnd;b.currentFrame=this.currentFrame;b.currentAnimation=this.currentAnimation;b.paused=this.paused;b.offset=this.offset;b._animation=this._animation;b.currentAnimationFrame=this.currentAnimationFrame};a._goto=function(b){if(isNaN(b)){var a=this.spriteSheet.getAnimation(b);a&&(this.currentAnimationFrame=0,this._animation=a,this.currentAnimation=b,this._normalizeFrame())}else this.currentAnimation= -this._animation=null,this.currentFrame=b};createjs.BitmapAnimation=c})();this.createjs=this.createjs||{}; -(function(){var c=function(b){this.initialize(b)},a=c.prototype=new createjs.DisplayObject;a.graphics=null;a.DisplayObject_initialize=a.initialize;a.initialize=function(b){this.DisplayObject_initialize();this.graphics=b?b:new createjs.Graphics};a.isVisible=function(){var b=this.cacheCanvas||this.graphics&&!this.graphics.isEmpty();return!(!this.visible||!(0this.lineWidth?(a&&this._drawTextLine(b,m,e*c),e++,m=k[p+1]):m+=k[p]+k[p+1];a&&this._drawTextLine(b,m,e*c)}e++}return e};a._drawTextLine=function(b,a,d){this.outline?b.strokeText(a,0,d,this.maxWidth||65535):b.fillText(a,0,d,this.maxWidth||65535)};createjs.Text=c})();this.createjs=this.createjs||{}; -(function(){var c=function(){throw"SpriteSheetUtils cannot be instantiated";};c._workingCanvas=createjs.createCanvas?createjs.createCanvas():document.createElement("canvas");c._workingContext=c._workingCanvas.getContext("2d");c.addFlippedFrames=function(a,b,g,d){if(b||g||d){var j=0;b&&c._flip(a,++j,!0,!1);g&&c._flip(a,++j,!1,!0);d&&c._flip(a,++j,!0,!0)}};c.extractFrame=function(a,b){isNaN(b)&&(b=a.getAnimation(b).frames[0]);var g=a.getFrame(b);if(!g)return null;var d=g.rect,j=c._workingCanvas;j.width= -d.width;j.height=d.height;c._workingContext.drawImage(g.image,d.x,d.y,d.width,d.height,0,0,d.width,d.height);g=new Image;g.src=j.toDataURL("image/png");return g};c.mergeAlpha=function(a,b,c){c||(c=createjs.createCanvas?createjs.createCanvas():document.createElement("canvas"));c.width=Math.max(b.width,a.width);c.height=Math.max(b.height,a.height);var d=c.getContext("2d");d.save();d.drawImage(a,0,0);d.globalCompositeOperation="destination-in";d.drawImage(b,0,0);d.restore();return c};c._flip=function(a, -b,g,d){for(var j=a._images,e=c._workingCanvas,f=c._workingContext,h=j.length/b,k=0;kthis.maxHeight)throw c.ERR_DIMENSIONS;for(var j=0,e=0,f=0;d.length;){var h=this._fillRow(d,j,f,a,b);h.w>e&&(e=h.w);j+=h.h;if(!h.h||!d.length){var k=createjs.createCanvas?createjs.createCanvas():document.createElement("canvas");k.width=this._getSize(e,this.maxWidth);k.height=this._getSize(j,this.maxHeight);this._data.images[f]=k;h.h||(e=j=0,f++)}}};a._getSize=function(b,a){for(var d=4;Math.pow(2,++d)f)throw c.ERR_DIMENSIONS;w>h||k+t>f||(q.img=d,q.rect=new createjs.Rectangle(k,a,t,w),m=m||w,b.splice(p,1),j[q.index]=[k,a,t,w,d,Math.round(-r+s*u.regX-e),Math.round(-v+s*u.regY-e)],k+=t)}return{w:k,h:m}};a._endBuild=function(){this.spriteSheet=new createjs.SpriteSheet(this._data); -this._data=null;this.progress=1;this.onComplete&&this.onComplete(this);this.dispatchEvent("complete")};a._run=function(){for(var b=50*Math.max(0.01,Math.min(0.99,this.timeSlice||0.3)),a=(new Date).getTime()+b,d=!1;a>(new Date).getTime();)if(!this._drawNext()){d=!0;break}if(d)this._endBuild();else{var c=this;this._timerID=setTimeout(function(){c._run()},50-b)}b=this.progress=this._index/this._frames.length;this.onProgress&&this.onProgress(this,b);this.dispatchEvent({type:"progress",progress:b})};a._drawNext= -function(){var b=this._frames[this._index],a=b.scale*this._scale,d=b.rect,c=b.sourceRect,e=this._data.images[b.img].getContext("2d");b.funct&&b.funct.apply(b.scope,b.params);e.save();e.beginPath();e.rect(d.x,d.y,d.width,d.height);e.clip();e.translate(Math.ceil(d.x-c.x*a),Math.ceil(d.y-c.y*a));e.scale(a,a);b.source.draw(e);e.restore();return++this._index=b)return this;var a=this._cloneProps(this._curQueueProps); -return this._addStep({d:b,p0:a,e:this._linearEase,p1:a})};a.to=function(b,a,d){if(isNaN(a)||0>a)a=0;return this._addStep({d:a||0,p0:this._cloneProps(this._curQueueProps),e:d,p1:this._cloneProps(this._appendQueueProps(b))})};a.call=function(b,a,d){return this._addAction({f:b,p:a?a:[this],o:d?d:this._target})};a.set=function(b,a){return this._addAction({f:this._set,o:this,p:[b,a?a:this._target]})};a.play=function(b){return this.call(b.setPaused,[!1],b)};a.pause=function(b){b||(b=this);return this.call(b.setPaused, -[!0],b)};a.setPosition=function(b,a){0>b&&(b=0);null==a&&(a=1);var d=b,c=!1;d>=this.duration&&(this.loop?d%=this.duration:(d=this.duration,c=!0));if(d==this._prevPos)return c;var e=this._prevPos;this.position=this._prevPos=d;this._prevPosition=b;if(this._target)if(c)this._updateTargetProps(null,1);else if(0d);f++);f=this._steps[f-1];this._updateTargetProps(f,(this._stepPosition=d-f.t)/f.d)}0!=a&&0c&&(j=c,e=a,f=h,h=k=-1);for(;(f+=k)!=h;){c=this._actions[f];var m=c.t;(m==e||m>j&&mthis.duration&&(this.duration=a.duration);0<=this._prevPos&&a.setPosition(this._prevPos,createjs.Tween.NONE);return a};a.removeTween=function(a){var c=arguments.length;if(1=this.duration&&this.updateDuration(),!0):!1};a.addLabel=function(a,c){this._labels[a]=c};a.setLabels=function(a){this._labels=a?a:{}};a.gotoAndPlay=function(a){this.setPaused(!1);this._goto(a)};a.gotoAndStop=function(a){this.setPaused(!0);this._goto(a)};a.setPosition=function(a,c){0>a&&(a=0);var d=this.loop?a%this.duration:a,j=!this.loop&&a>=this.duration; -if(d==this._prevPos)return j;this._prevPosition=a;this.position=this._prevPos=d;for(var e=0,f=this._tweens.length;ethis.duration&&(this.duration=tween.duration)};a.tick= -function(a){this.setPosition(this._prevPosition+a)};a.resolve=function(a){var c=parseFloat(a);isNaN(c)&&(c=this._labels[a]);return c};a.toString=function(){return"[Timeline]"};a.clone=function(){throw"Timeline can not be cloned.";};a._goto=function(a){a=this.resolve(a);null!=a&&this.setPosition(a)};createjs.Timeline=c})();this.createjs=this.createjs||{}; -(function(){var c=function(){throw"Ease cannot be instantiated.";};c.linear=function(a){return a};c.none=c.linear;c.get=function(a){-1>a&&(a=-1);1a?b*(b*-a+1+a):b*((2-b)*a+(1-a))}};c.getPowIn=function(a){return function(b){return Math.pow(b,a)}};c.getPowOut=function(a){return function(b){return 1-Math.pow(1-b,a)}};c.getPowInOut=function(a){return function(b){return 1>(b*=2)?0.5*Math.pow(b,a):1-0.5*Math.abs(Math.pow(2-b,a))}};c.quadIn=c.getPowIn(2);c.quadOut= -c.getPowOut(2);c.quadInOut=c.getPowInOut(2);c.cubicIn=c.getPowIn(3);c.cubicOut=c.getPowOut(3);c.cubicInOut=c.getPowInOut(3);c.quartIn=c.getPowIn(4);c.quartOut=c.getPowOut(4);c.quartInOut=c.getPowInOut(4);c.quintIn=c.getPowIn(5);c.quintOut=c.getPowOut(5);c.quintInOut=c.getPowInOut(5);c.sineIn=function(a){return 1-Math.cos(a*Math.PI/2)};c.sineOut=function(a){return Math.sin(a*Math.PI/2)};c.sineInOut=function(a){return-0.5*(Math.cos(Math.PI*a)-1)};c.getBackIn=function(a){return function(b){return b* -b*((a+1)*b-a)}};c.backIn=c.getBackIn(1.7);c.getBackOut=function(a){return function(b){return--b*b*((a+1)*b+a)+1}};c.backOut=c.getBackOut(1.7);c.getBackInOut=function(a){a*=1.525;return function(b){return 1>(b*=2)?0.5*b*b*((a+1)*b-a):0.5*((b-=2)*b*((a+1)*b+a)+2)}};c.backInOut=c.getBackInOut(1.7);c.circIn=function(a){return-(Math.sqrt(1-a*a)-1)};c.circOut=function(a){return Math.sqrt(1- --a*a)};c.circInOut=function(a){return 1>(a*=2)?-0.5*(Math.sqrt(1-a*a)-1):0.5*(Math.sqrt(1-(a-=2)*a)+1)};c.bounceIn= -function(a){return 1-c.bounceOut(1-a)};c.bounceOut=function(a){return a<1/2.75?7.5625*a*a:a<2/2.75?7.5625*(a-=1.5/2.75)*a+0.75:a<2.5/2.75?7.5625*(a-=2.25/2.75)*a+0.9375:7.5625*(a-=2.625/2.75)*a+0.984375};c.bounceInOut=function(a){return 0.5>a?0.5*c.bounceIn(2*a):0.5*c.bounceOut(2*a-1)+0.5};c.getElasticIn=function(a,b){var c=2*Math.PI;return function(d){if(0==d||1==d)return d;var j=b/c*Math.asin(1/a);return-(a*Math.pow(2,10*(d-=1))*Math.sin((d-j)*c/b))}};c.elasticIn=c.getElasticIn(1,0.3);c.getElasticOut= -function(a,b){var c=2*Math.PI;return function(d){if(0==d||1==d)return d;var j=b/c*Math.asin(1/a);return a*Math.pow(2,-10*d)*Math.sin((d-j)*c/b)+1}};c.elasticOut=c.getElasticOut(1,0.3);c.getElasticInOut=function(a,b){var c=2*Math.PI;return function(d){var j=b/c*Math.asin(1/a);return 1>(d*=2)?-0.5*a*Math.pow(2,10*(d-=1))*Math.sin((d-j)*c/b):0.5*a*Math.pow(2,-10*(d-=1))*Math.sin((d-j)*c/b)+1}};c.elasticInOut=c.getElasticInOut(1,0.3*1.5);createjs.Ease=c})();this.createjs=this.createjs||{}; -(function(){var c=function(){throw"MotionGuidePlugin cannot be instantiated.";};c.priority=0;c.install=function(){createjs.Tween.installPlugin(c,["guide","x","y","rotation"]);return createjs.Tween.IGNORE};c.init=function(a,b,c){a=a.target;a.hasOwnProperty("x")||(a.x=0);a.hasOwnProperty("y")||(a.y=0);a.hasOwnProperty("rotation")||(a.rotation=0);return"guide"==b?null:c};c.step=function(a,b,g,d,j){if("guide"!=b)return d;var e;d.hasOwnProperty("path")||(d.path=[]);a=d.path;d.hasOwnProperty("end")||(d.end= -1);d.hasOwnProperty("start")||(d.start=g&&g.hasOwnProperty("end")&&g.path===a?g.end:0);if(d.hasOwnProperty("_segments")&&d._length)return d;g=a.length;if(6<=g&&0==(g-2)%4){d._segments=[];d._length=0;for(b=2;b=y;y++){r=y/10;var x=1-r;u=x*x*f+2*x*r*k+r*r*p;r=x*x*h+2*x*r*m+r*r*q;v+=w[w.push(Math.sqrt((e=u-s)*e+(e=r-t)*e))-1];s=u;t=r}d._segments.push(v);d._segments.push(w);d._length+=v}}else throw"invalid 'path' data, please see documentation for valid paths"; -e=d.orient;d.orient=!1;c.calc(d,d.end,j);d.orient=e;return d};c.tween=function(a,b,g,d,j,e,f){j=j.guide;if(void 0==j||j===d.guide)return g;j.lastRatio!=e&&(c.calc(j,(j.end-j.start)*(f?j.end:e)+j.start,a.target),j.orient&&(a.target.rotation+=d.rotation||0),j.lastRatio=e);return!j.orient&&"rotation"==b?g:a.target[b]};c.calc=function(a,b,g){void 0==a._segments&&c.validate(a);void 0==g&&(g={x:0,y:0,rotation:0});var d=a._segments,j=a.path,e=a._length*b,f=d.length-2;for(b=0;e>d[b]&&bd[h]&&hg.getPosition())g=b}return null!=g?(g.interrupt(),this.remove(g),!0):!1},toString:function(){return"[Sound SoundChannel]"}};c.defaultSoundInstance=new function(){this.isDefault=!0;this.addEventListener=this.removeEventListener=this.removeAllEventListener=this.dispatchEvent=this.hasEventListener=this._listeners=this.interrupt= -this.playFailed=this.pause=this.resume=this.play=this.beginPlaying=this.cleanUp=this.stop=this.setMasterVolume=this.setVolume=this.mute=this.setMute=this.getMute=this.setPan=this.getPosition=this.setPosition=function(){return!1};this.getVolume=this.getPan=this.getDuration=function(){return 0};this.playState=c.PLAY_FAILED;this.toString=function(){return"[Sound Default Sound Instance]"}};b.init=function(){var a=navigator.userAgent;b.isFirefox=-1c.context.destination.numberOfChannels&&(c.capabilities.panning=!1);c.dynamicsCompressorNode=c.context.createDynamicsCompressor();c.dynamicsCompressorNode.connect(c.context.destination); -c.gainNode=c.context.createGainNode();c.gainNode.connect(c.dynamicsCompressorNode)}};c.prototype={capabilities:null,volume:1,context:null,dynamicsCompressorNode:null,gainNode:null,arrayBuffers:null,init:function(){this.capabilities=c.capabilities;this.arrayBuffers={};this.context=c.context;this.gainNode=c.gainNode;this.dynamicsCompressorNode=c.dynamicsCompressorNode},register:function(a){this.arrayBuffers[a]=!0;return{tag:new b(a,this)}},isPreloadStarted:function(a){return null!=this.arrayBuffers[a]}, -isPreloadComplete:function(a){return!(null==this.arrayBuffers[a]||!0==this.arrayBuffers[a])},removeFromPreload:function(a){delete this.arrayBuffers[a]},addPreloadResults:function(a,b){this.arrayBuffers[a]=b},handlePreloadComplete:function(){createjs.Sound.sendLoadComplete(this.src)},preload:function(a){this.arrayBuffers[a]=!0;a=new b(a,this);a.onload=this.handlePreloadComplete;a.load()},create:function(b){this.isPreloadStarted(b)||this.preload(b);return new a(b,this)},setVolume:function(a){this.volume= -a;this.updateVolume();return!0},updateVolume:function(){var a=createjs.Sound.masterMute?0:this.volume;a!=this.gainNode.gain.value&&(this.gainNode.gain.value=a)},getVolume:function(){return this.volume},setMute:function(){this.updateVolume();return!0},toString:function(){return"[WebAudioPlugin]"}};createjs.WebAudioPlugin=c;a.prototype={src:null,uniqueId:-1,playState:null,owner:null,offset:0,delay:0,volume:1,pan:0,duration:0,remainingLoops:0,delayTimeoutId:null,soundCompleteTimeout:null,panNode:null, -gainNode:null,sourceNode:null,muted:!1,paused:!1,startTime:0,addEventListener:null,removeEventListener:null,removeAllEventListeners:null,dispatchEvent:null,hasEventListener:null,_listeners:null,endedHandler:null,readyHandler:null,stalledHandler:null,onReady:null,onPlaySucceeded:null,onPlayInterrupted:null,onPlayFailed:null,onComplete:null,onLoop:null,sendEvent:function(a){this.dispatchEvent({target:this,type:a})},init:function(a,b){this.owner=b;this.src=a;this.panNode=this.owner.context.createPanner(); -this.gainNode=this.owner.context.createGainNode();this.gainNode.connect(this.panNode);this.owner.isPreloadComplete(this.src)&&(this.duration=1E3*this.owner.arrayBuffers[this.src].duration);this.endedHandler=createjs.proxy(this.handleSoundComplete,this);this.readyHandler=createjs.proxy(this.handleSoundReady,this);this.stalledHandler=createjs.proxy(this.handleSoundStalled,this)},cleanUp:function(){this.sourceNode&&this.sourceNode.playbackState!=this.sourceNode.UNSCHEDULED_STATE&&(this.sourceNode.noteOff(0), -this.sourceNode=null);0!=this.panNode.numberOfOutputs&&this.panNode.disconnect(0);clearTimeout(this.delayTimeoutId);clearTimeout(this.soundCompleteTimeout);null!=window.createjs&&createjs.Sound.playFinished(this)},interrupt:function(){this.playState=createjs.Sound.PLAY_INTERRUPTED;if(this.onPlayInterrupted)this.onPlayInterrupted(this);this.sendEvent("interrupted");this.cleanUp();this.paused=!1},handleSoundStalled:function(){if(null!=this.onPlayFailed)this.onPlayFailed(this);this.sendEvent("failed")}, -handleSoundReady:function(){null!=window.createjs&&(this.offset>this.getDuration()?this.playFailed():(0>this.offset&&(this.offset=0),this.playState=createjs.Sound.PLAY_SUCCEEDED,this.paused=!1,this.panNode.connect(this.owner.gainNode),this.sourceNode=this.owner.context.createBufferSource(),this.sourceNode.buffer=this.owner.arrayBuffers[this.src],this.duration=1E3*this.owner.arrayBuffers[this.src].duration,this.sourceNode.connect(this.gainNode),this.soundCompleteTimeout=setTimeout(this.endedHandler, -1E3*(this.sourceNode.buffer.duration-this.offset)),this.startTime=this.owner.context.currentTime-this.offset,this.sourceNode.noteGrainOn(0,this.offset,this.sourceNode.buffer.duration-this.offset)))},play:function(a,b,c,e,f,h){this.cleanUp();createjs.Sound.playInstance(this,a,b,c,e,f,h)},beginPlaying:function(a,b,c,e){if(null!=window.createjs&&this.src){this.offset=a/1E3;this.remainingLoops=b;this.setVolume(c);this.setPan(e);if(this.owner.isPreloadComplete(this.src))return this.handleSoundReady(null), -this.onPlaySucceeded&&this.onPlaySucceeded(this),this.sendEvent("succeeded"),1;this.playFailed()}},pause:function(){return!this.paused&&this.playState==createjs.Sound.PLAY_SUCCEEDED?(this.paused=!0,this.offset=this.owner.context.currentTime-this.startTime,this.sourceNode.noteOff(0),0!=this.panNode.numberOfOutputs&&this.panNode.disconnect(),clearTimeout(this.delayTimeoutId),clearTimeout(this.soundCompleteTimeout),!0):!1},resume:function(){if(!this.paused)return!1;this.handleSoundReady(null);return!0}, -stop:function(){this.playState=createjs.Sound.PLAY_FINISHED;this.cleanUp();this.offset=0;return!0},setVolume:function(a){if(null==Number(a))return!1;this.volume=a=Math.max(0,Math.min(1,a));this.updateVolume();return!0},updateVolume:function(){var a=this.muted?0:this.volume;return a!=this.gainNode.gain.value?(this.gainNode.gain.value=a,!0):!1},getVolume:function(){return this.volume},mute:function(a){this.muted=a;this.updateVolume();return!0},setMute:function(a){if(null==a||void 0==a)return!1;this.muted= -a;this.updateVolume();return!0},getMute:function(){return this.muted},setPan:function(a){if(this.owner.capabilities.panning)this.panNode.setPosition(a,0,-0.5),this.pan=a;else return!1},getPan:function(){return this.pan},getPosition:function(){return 1E3*(this.paused||null==this.sourceNode?this.offset:this.owner.context.currentTime-this.startTime)},setPosition:function(a){this.offset=a/1E3;this.sourceNode&&this.sourceNode.playbackState!=this.sourceNode.UNSCHEDULED_STATE&&(this.sourceNode.noteOff(0), -clearTimeout(this.soundCompleteTimeout));!this.paused&&this.playState==createjs.Sound.PLAY_SUCCEEDED&&this.handleSoundReady(null);return!0},getDuration:function(){return this.duration},handleSoundComplete:function(){this.offset=0;if(0!=this.remainingLoops){this.remainingLoops--;this.handleSoundReady(null);if(null!=this.onLoop)this.onLoop(this);this.sendEvent("loop")}else if(null!=window.createjs){this.playState=createjs.Sound.PLAY_FINISHED;if(null!=this.onComplete)this.onComplete(this);this.sendEvent("complete"); -this.cleanUp()}},playFailed:function(){if(null!=window.createjs){this.playState=createjs.Sound.PLAY_FAILED;if(null!=this.onPlayFailed)this.onPlayFailed(this);this.sendEvent("failed");this.cleanUp()}},toString:function(){return"[WebAudioPlugin SoundInstance]"}};createjs.EventDispatcher.initialize(a.prototype);b.prototype={request:null,owner:null,progress:-1,src:null,result:null,onload:null,onprogress:null,onError:null,init:function(a,b){this.src=a;this.owner=b},load:function(a){null!=a&&(this.src= -a);this.request=new XMLHttpRequest;this.request.open("GET",this.src,!0);this.request.responseType="arraybuffer";this.request.onload=createjs.proxy(this.handleLoad,this);this.request.onError=createjs.proxy(this.handleError,this);this.request.onprogress=createjs.proxy(this.handleProgress,this);this.request.send()},handleProgress:function(a,b){this.progress=a/b;if(null!=this.onprogress)this.onprogress({loaded:a,total:b,progress:this.progress})},handleLoad:function(){c.context.decodeAudioData(this.request.response, -createjs.proxy(this.handleAudioDecoded,this),createjs.proxy(this.handleError,this))},handleAudioDecoded:function(a){this.progress=1;this.result=a;this.owner.addPreloadResults(this.src,this.result);this.onload&&this.onload()},handleError:function(a){this.owner.removeFromPreload(this.src);this.onerror&&this.onerror(a)},toString:function(){return"[WebAudioPlugin WebAudioLoader]"}}})();this.createjs=this.createjs||{}; -(function(){function c(){this.init()}function a(a,b){this.init(a,b)}function b(a,b){this.init(a,b)}function g(a){this.init(a)}c.MAX_INSTANCES=30;c.capabilities=null;c.AUDIO_READY="canplaythrough";c.AUDIO_ENDED="ended";c.AUDIO_ERROR="error";c.AUDIO_STALLED="stalled";c.isSupported=function(){if(createjs.Sound.BrowserDetect.isIOS)return!1;c.generateCapabilities();return null==c.tag||null==c.capabilities?!1:!0};c.generateCapabilities=function(){if(null==c.capabilities){var a=c.tag=document.createElement("audio"); -if(null==a.canPlayType)return null;c.capabilities={panning:!0,volume:!0,tracks:-1};for(var b=createjs.Sound.SUPPORTED_EXTENSIONS,g=createjs.Sound.EXTENSION_MAP,f=0,h=b.length;f=this.getDuration()?this.playFailed(): -(0=b-1&&this.handleTagLoaded()},handleTagLoaded:function(){clearInterval(this.preloadTimer)},sendLoadedEvent:function(){this.tag.removeEventListener&&this.tag.removeEventListener("canplaythrough",this.loadedHandler);this.tag.onreadystatechange=null;createjs.Sound.sendLoadComplete(this.src)},toString:function(){return"[HTMLAudioPlugin HTMLAudioLoader]"}};g.tags={};g.get=function(a){var b=g.tags[a];null==b&&(b=g.tags[a]=new g(a));return b};g.getInstance=function(a){a= -g.tags[a];return null==a?null:a.get()};g.setInstance=function(a,b){var c=g.tags[a];return null==c?null:c.set(b)};g.prototype={src:null,length:0,available:0,tags:null,init:function(a){this.src=a;this.tags=[]},add:function(a){this.tags.push(a);this.length++;this.available++},get:function(){if(0==this.tags.length)return null;this.available=this.tags.length;var a=this.tags.pop();null==a.parentNode&&document.body.appendChild(a);return a},set:function(a){-1==this.tags.indexOf(a)&&this.tags.push(a);this.available= -this.tags.length},toString:function(){return"[HTMLAudioPlugin TagPool]"}}})();this.createjs=this.createjs||{}; -(function(){var c=function(){this.init()};c.prototype={};var a=c.prototype;c.FILE_PATTERN=/(\w+:\/{2})?((?:\w+\.){2}\w+)?(\/?[\S]+\/|\/)?([\w\-%\.]+)(?:\.)(\w+)?(\?\S+)?/i;a.loaded=!1;a.canceled=!1;a.progress=0;a._item=null;a.onProgress=null;a.onLoadStart=null;a.onComplete=null;a.onError=null;a.addEventListener=null;a.removeEventListener=null;a.removeAllEventListeners=null;a.dispatchEvent=null;a.hasEventListener=null;a._listeners=null;createjs.EventDispatcher.initialize(a);a.getItem=function(){return this._item}; -a.init=function(){};a.load=function(){};a.close=function(){};a._sendLoadStart=function(){this._isCanceled()||(this.onLoadStart&&this.onLoadStart({target:this}),this.dispatchEvent("loadStart"))};a._sendProgress=function(a){if(!this._isCanceled()){var c=null;if("number"==typeof a)this.progress=a,c={loaded:this.progress,total:1};else if(c=a,this.progress=a.loaded/a.total,isNaN(this.progress)||Infinity==this.progress)this.progress=0;c.target=this;c.type="progress";this.onProgress&&this.onProgress(c); -this.dispatchEvent(c)}};a._sendComplete=function(){this._isCanceled()||(this.onComplete&&this.onComplete({target:this}),this.dispatchEvent("complete"))};a._sendError=function(a){this._isCanceled()||(null==a&&(a={}),a.target=this,a.type="error",this.onError&&this.onError(a),this.dispatchEvent(a))};a._isCanceled=function(){return null==window.createjs||this.canceled?!0:!1};a._parseURI=function(a){return!a?null:a.match(c.FILE_PATTERN)};a.toString=function(){return"[PreloadJS AbstractLoader]"};createjs.AbstractLoader= -c})();this.createjs=this.createjs||{}; -(function(){var c=function(a){this.init(a)},a=c.prototype=new createjs.AbstractLoader;c.LOAD_TIMEOUT=8E3;c.BINARY="binary";c.CSS="css";c.IMAGE="image";c.JAVASCRIPT="javascript";c.JSON="json";c.SOUND="sound";c.SVG="svg";c.TEXT="text";c.XML="xml";a.useXHR=!0;a.stopOnError=!1;a.maintainScriptOrder=!0;a.next=null;a.onFileLoad=null;a.onFileProgress=null;a._typeCallbacks=null;a._extensionCallbacks=null;a._loadStartWasDispatched=!1;a._maxConnections=1;a._currentlyLoadingScript=null;a._currentLoads=null; -a._loadQueue=null;a._loadQueueBackup=null;a._loadItemsById=null;a._loadItemsBySrc=null;a._loadedResults=null;a._loadedRawResults=null;a._numItems=0;a._numItemsLoaded=0;a._scriptOrder=null;a._loadedScripts=null;a.init=function(a){this._numItems=this._numItemsLoaded=0;this._loadStartWasDispatched=this._paused=!1;this._currentLoads=[];this._loadQueue=[];this._loadQueueBackup=[];this._scriptOrder=[];this._loadedScripts=[];this._loadItemsById={};this._loadItemsBySrc={};this._loadedResults={};this._loadedRawResults= -{};this._typeCallbacks={};this._extensionCallbacks={};this.setUseXHR(a)};a.setUseXHR=function(a){return this.useXHR=!1!=a&&null!=window.XMLHttpRequest};a.removeAll=function(){this.remove()};a.remove=function(a){var b=null;a&&!(a instanceof Array)?b=[a]:a&&(b=a);a=!1;if(b){for(;b.length;){for(var c=b.pop(),e=this.getResult(c),f=this._loadQueue.length-1;0<=f;f--)if(h=this._loadQueue[f].getItem(),h.id==c||h.src==c){this._loadQueue.splice(f,1)[0].cancel();break}for(f=this._loadQueueBackup.length-1;0<= -f;f--)if(h=this._loadQueueBackup[f].getItem(),h.id==c||h.src==c){this._loadQueueBackup.splice(f,1)[0].cancel();break}if(e)delete this._loadItemsById[e.id],delete this._loadItemsBySrc[e.src],this._disposeItem(e);else for(var f=this._currentLoads.length-1;0<=f;f--){var h=this._currentLoads[f].getItem();if(h.id==c||h.src==c){this._currentLoads.splice(f,1)[0].cancel();a=!0;break}}}a&&this._loadNext()}else{this.close();for(c in this._loadItemsById)this._disposeItem(this._loadItemsById[c]);this.initialize(this.useXHR)}}; -a.reset=function(){this.close();for(var a in this._loadItemsById)this._disposeItem(this._loadItemsById[a]);a=[];i=0;for(l=this._loadQueueBackup.length;i=this._maxConnections);a++){var c=this._loadQueue[a];if(this.maintainScriptOrder&&c instanceof createjs.TagLoader&&c.getItem().type==createjs.LoadQueue.JAVASCRIPT){if(this._currentlyLoadingScript)continue; -this._currentlyLoadingScript=!0}this._loadQueue.splice(a,1);this._loadItem(c);a--;b--}}};a._loadItem=function(a){a.addEventListener("progress",createjs.proxy(this._handleProgress,this));a.addEventListener("complete",createjs.proxy(this._handleFileComplete,this));a.addEventListener("error",createjs.proxy(this._handleFileError,this));this._currentLoads.push(a);a.load()};a._handleFileError=function(a){var b=a.target;this._numItemsLoaded++;this._updateProgress();a={item:b.getItem()};this._sendError(a); -this.stopOnError||(this._removeLoadItem(b),this._loadNext())};a._handleFileComplete=function(a){a=a.target;var b=a.getItem();this._loadedResults[b.id]=a.getResult();a instanceof createjs.XHRLoader&&(this._loadedRawResults[b.id]=a.getResult(!0));this._removeLoadItem(a);if(this.maintainScriptOrder&&b.type==createjs.LoadQueue.JAVASCRIPT)if(a instanceof createjs.TagLoader)this._currentlyLoadingScript=!1;else{this._loadedScripts[this._scriptOrder.indexOf(b)]=b;this._checkScriptLoadOrder(a);return}this._processFinishedLoad(b)}; -a._processFinishedLoad=function(a){this._numItemsLoaded++;this._updateProgress();this._sendFileComplete(a);this._loadNext()};a._checkScriptLoadOrder=function(){for(var a=this._loadedScripts.length,b=0;b>>0;if(0===c)return-1;var e=0;1=c)return-1;for(e=0<=e?e:Math.max(c-Math.abs(e),0);e=0;c--)if(h=this._loadQueue[c].getItem(),h.id==d||h.src==d){this._loadQueue.splice(c,1)[0].cancel();break}for(c=this._loadQueueBackup.length- -1;c>=0;c--)if(h=this._loadQueueBackup[c].getItem(),h.id==d||h.src==d){this._loadQueueBackup.splice(c,1)[0].cancel();break}if(e)delete this._loadItemsById[e.id],delete this._loadItemsBySrc[e.src],this._disposeItem(e);else for(var c=this._currentLoads.length-1;c>=0;c--){var h=this._currentLoads[c].getItem();if(h.id==d||h.src==d){this._currentLoads.splice(c,1)[0].cancel();b=true;break}}}b&&this._loadNext()}else{this.close();for(d in this._loadItemsById)this._disposeItem(this._loadItemsById[d]);this.initialize(this.useXHR)}}; -a.reset=function(){this.close();for(var b in this._loadItemsById)this._disposeItem(this._loadItemsById[b]);b=[];for(i=0,l=this._loadQueueBackup.length;i=this._maxConnections)break;var c=this._loadQueue[a];if(this.maintainScriptOrder&& -c instanceof createjs.TagLoader&&c.getItem().type==createjs.LoadQueue.JAVASCRIPT){if(this._currentlyLoadingScript)continue;this._currentlyLoadingScript=true}this._loadQueue.splice(a,1);this._loadItem(c);a--;d--}}};a._loadItem=function(a){a.addEventListener("progress",createjs.proxy(this._handleProgress,this));a.addEventListener("complete",createjs.proxy(this._handleFileComplete,this));a.addEventListener("error",createjs.proxy(this._handleFileError,this));this._currentLoads.push(a);a.load()};a._handleFileError= -function(a){var d=a.target;this._numItemsLoaded++;this._updateProgress();a={item:d.getItem()};this._sendError(a);this.stopOnError||(this._removeLoadItem(d),this._loadNext())};a._handleFileComplete=function(a){var a=a.target,d=a.getItem();this._loadedResults[d.id]=a.getResult();a instanceof createjs.XHRLoader&&(this._loadedRawResults[d.id]=a.getResult(true));this._removeLoadItem(a);if(this.maintainScriptOrder&&d.type==createjs.LoadQueue.JAVASCRIPT)if(a instanceof createjs.TagLoader)this._currentlyLoadingScript= -false;else{this._loadedScripts[this._scriptOrder.indexOf(d)]=d;this._checkScriptLoadOrder(a);return}this._processFinishedLoad(d)};a._processFinishedLoad=function(a){this._numItemsLoaded++;this._updateProgress();this._sendFileComplete(a);this._loadNext()};a._checkScriptLoadOrder=function(){for(var a=this._loadedScripts.length,d=0;d0){for(var c=0,e=0,o=this._currentLoads.length;e-1;d.isOpera=window.opera!=null;d.isChrome=a.indexOf("Chrome")>-1;d.isIOS=a.indexOf("iPod")>-1||a.indexOf("iPhone")>-1||a.indexOf("iPad")>-1};d.init();createjs.LoadQueue.BrowserDetect=d;if(!Array.prototype.indexOf)Array.prototype.indexOf=function(a){if(this==null)throw new TypeError;var d=Object(this),c=d.length>>>0;if(c===0)return-1;var e=0;arguments.length>1&&(e=Number(arguments[1]),e!=e?e=0:e!=0&&e!=Infinity&&e!=-Infinity&&(e=(e>0||-1)*Math.floor(Math.abs(e))));if(e>=c)return-1; -for(e=e>=0?e:Math.max(c-Math.abs(e),0);e0&&a.total==0||this._sendProgress({loaded:a.loaded,total:a.total})};a._handleLoadStart=function(){clearTimeout(this._loadTimeout);this._sendLoadStart()};a._handleAbort=function(){this._clean();this._sendError()};a._handleError=function(){this._clean();this._sendError()};a._handleReadyStateChange=function(){this._request.readyState==4&&this._handleLoad()};a._handleLoad= -function(){if(!this.loaded)this.loaded=true,this._checkError()?(this._response=this._getResponse(),this._clean(),this._generateTag()&&this._sendComplete()):this._handleError()};a._handleTimeout=function(){this._clean();this._sendError({reason:"PRELOAD_TIMEOUT"})};a._checkError=function(){switch(parseInt(this._request.status)){case 404:case 0:return false}return true};a._getResponse=function(){if(this._response!=null)return this._response;if(this._request.response!=null)return this._request.response; -try{if(this._request.responseText!=null)return this._request.responseText}catch(a){}try{if(this._request.responseXML!=null)return this._request.responseXML}catch(b){}return null};a._createXHR=function(a){var b=document.createElement("a");b.href=a.src;var c=document.createElement("a");c.href=location.href;b=b.hostname!=""&&(b.port!=c.port||b.protocol!=c.protocol||b.hostname!=c.hostname);c=null;if(b&&window.XDomainRequest)c=new XDomainRequest;else if(window.XMLHttpRequest)c=new XMLHttpRequest;else try{c= -new ActiveXObject("Msxml2.XMLHTTP.6.0")}catch(f){try{c=new ActiveXObject("Msxml2.XMLHTTP.3.0")}catch(e){try{c=new ActiveXObject("Msxml2.XMLHTTP")}catch(o){return false}}}a.type==createjs.LoadQueue.TEXT&&c.overrideMimeType&&c.overrideMimeType("text/plain; charset=x-user-defined");this._xhrLevel=typeof c.responseType==="string"?2:1;c.open("GET",a.src,true);b&&c instanceof XMLHttpRequest&&this._xhrLevel==1&&c.setRequestHeader("Origin",location.origin);if(createjs.LoadQueue.isBinary(a.type))c.responseType= -"arraybuffer";this._request=c;return true};a._clean=function(){clearTimeout(this._loadTimeout);var a=this._request;a.onloadstart=null;a.onprogress=null;a.onabort=null;a.onerror=null;a.onload=null;a.ontimeout=null;a.onloadend=null;a.onreadystatechange=null};a._generateTag=function(){var a=this._item.tag;switch(this._item.type){case createjs.LoadQueue.IMAGE:return a.onload=createjs.proxy(this._handleTagReady,this),a.src=this._item.src,this._rawResponse=this._response,this._response=a,false;case createjs.LoadQueue.JAVASCRIPT:a= -document.createElement("script");this._rawResponse=a.text=this._response;this._response=a;break;case createjs.LoadQueue.CSS:document.getElementsByTagName("head")[0].appendChild(a);if(a.styleSheet)a.styleSheet.cssText=this._response;else{var b=document.createTextNode(this._response);a.appendChild(b)}this._rawResponse=this._response;this._response=a;break;case createjs.LoadQueue.XML:this._response=b=this._parseXML(this._response,"text/xml");break;case createjs.LoadQueue.SVG:b=this._parseXML(this._response, -"image/svg+xml");this._rawResponse=this._response;a.appendChild(b.documentElement);this._response=a;break;case createjs.LoadQueue.JSON:a={};try{a=JSON.parse(this._response)}catch(c){a=null}this._rawResponse=this._response;this._response=a}return true};a._parseXML=function(a,b){var c=null;window.DOMParser?c=(new DOMParser).parseFromString(a,b):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async=false,c.loadXML(a));return c};a._handleTagReady=function(){this._sendComplete()};a.toString=function(){return"[PreloadJS XHRLoader]"}; -createjs.XHRLoader=c})();typeof JSON!=="object"&&(JSON={}); -(function(){function c(a){return a<10?"0"+a:a}function a(a){g.lastIndex=0;return g.test(a)?'"'+a.replace(g,function(a){var b=o[a];return typeof b==="string"?b:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+a+'"'}function d(b,c){var g,n,m,p,q=f,k,j=c[b];j&&typeof j==="object"&&typeof j.toJSON==="function"&&(j=j.toJSON(b));typeof h==="function"&&(j=h.call(c,b,j));switch(typeof j){case "string":return a(j);case "number":return isFinite(j)?String(j):"null";case "boolean":case "null":return String(j); -case "object":if(!j)return"null";f+=e;k=[];if(Object.prototype.toString.apply(j)==="[object Array]"){p=j.length;for(g=0;gSCmY+^;LHD4UsX@no!jS} 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 literal 0 HcmV?d00001 diff --git a/example/game/pixijs/assets/iP4_ground.png b/example/game/pixijs/assets/iP4_ground.png new file mode 100644 index 0000000000000000000000000000000000000000..241ad09091c5d46aafc169692ae67b3a55d4102e GIT binary patch literal 43321 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 Z{|jmwyaC$qYr+5k002ovPDHLkV1l=49lHPk literal 0 HcmV?d00001 diff --git a/example/game/pixijs/image/gold_anim.json b/example/game/pixijs/image/gold_anim.json new file mode 100755 index 0000000..f3bdfda --- /dev/null +++ b/example/game/pixijs/image/gold_anim.json @@ -0,0 +1,66 @@ +{"frames": { + +"gold_1.png": +{ + "frame": {"x":1,"y":1,"w":84,"h":84}, + "rotated": false, + "trimmed": false, + "spriteSourceSize": {"x":0,"y":0,"w":84,"h":84}, + "sourceSize": {"w":84,"h":84}, + "pivot": {"x":0.5,"y":0.5} +}, +"gold_2.png": +{ + "frame": {"x":1,"y":86,"w":66,"h":84}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":0,"w":66,"h":84}, + "sourceSize": {"w":84,"h":84}, + "pivot": {"x":0.5,"y":0.5} +}, +"gold_3.png": +{ + "frame": {"x":68,"y":86,"w":50,"h":84}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":0,"w":50,"h":84}, + "sourceSize": {"w":84,"h":84}, + "pivot": {"x":0.5,"y":0.5} +}, +"gold_4.png": +{ + "frame": {"x":86,"y":1,"w":15,"h":84}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":34,"y":0,"w":15,"h":84}, + "sourceSize": {"w":84,"h":84}, + "pivot": {"x":0.5,"y":0.5} +}, +"gold_5.png": +{ + "frame": {"x":68,"y":171,"w":50,"h":84}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":17,"y":0,"w":50,"h":84}, + "sourceSize": {"w":84,"h":84}, + "pivot": {"x":0.5,"y":0.5} +}, +"gold_6.png": +{ + "frame": {"x":1,"y":171,"w":66,"h":84}, + "rotated": false, + "trimmed": true, + "spriteSourceSize": {"x":9,"y":0,"w":66,"h":84}, + "sourceSize": {"w":84,"h":84}, + "pivot": {"x":0.5,"y":0.5} +}}, +"meta": { + "app": "http://www.codeandweb.com/texturepacker", + "version": "1.0", + "image": "gold_anim.png", + "format": "RGBA8888", + "size": {"w":128,"h":256}, + "scale": "1", + "smartupdate": "$TexturePacker:SmartUpdate:da6353dcec564c38e81610d1de48d2a3:7fa5a79bbb30632cbe73f0fd8029dfc6:0772c5e092b65556291c493f15308808$" +} +} diff --git a/example/game/pixijs/image/gold_anim.png b/example/game/pixijs/image/gold_anim.png new file mode 100755 index 0000000000000000000000000000000000000000..c64d6980c87ef3b2c9ad384ed0ed9558532bf89f GIT binary patch literal 5177 zcmXw-X*d+#7sv068H|0&$W90q21T-sea*g>WwIsvL`asgON1gqp~w=EvSi<~XGz93 zGGxs@mXu}welPwn?sGoR`F_v2=eaNLeV+T+*if6EhLZ*WK(DK#VR{yE06+jW#Tglh zJWW3f2wxo=KLBW1|634{m2>{g!D(z@u6ZWTl!DC$usI;}vmE^S3jW~LetrUfd%@pP ztzT8(s1F?BHRr3raSu42(4PAYj(frJxYn;~aMA}(CUpOUesD6WGyfT!^qyt3|1asB z!D&A@J*ztN{3q!wob~Ag$CJ9h&ib6e#D7))dB*h?Yr#?-So#86`2toN5UcfIwTXVM z5v;YaY&3z5HulYCu-VDA-3qq5_(^Sm)FZsx4tD#*_B+A;fW*O9a4;l&*aZ$p=z2ImJ{ojz|n&bgM9)OX*A;^RDNz_d34c>VGr-8m$j8SgDJiLoSU0l zQBl#-(lRtOG&?)HwY7B;Sy&7J%M)D!F}u4~T)ix8P& }+7C3>U&FqEl1= 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 oBA2+pS9H?M^HlS% + + + + pixi.js game + + + + + + +
+
+ + + + + + + + + \ No newline at end of file diff --git a/example/game/quarkjs/images/body_walk.png b/example/game/quarkjs/images/body_walk.png index 690b728a2dd2617d2454ddd2300227d2ec9abffa..f2782fd792df5cc387a3b14ae131499aca963ff0 100644 GIT binary patch literal 19114 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∾qZ?Ei-o>x&wNMkU-gz$0*%24w1F@ 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 diff --git a/example/game/quarkjs/images/head_idle.png b/example/game/quarkjs/images/head_idle.png index 78abebd2f69ff5ba0f0a3567daabb7cfcc52ad73..343cd712aeb7a73904f8913d04b7ba65d09eb439 100644 GIT binary patch literal 6189 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 diff --git a/example/game/quarkjs/squirrel.html b/example/game/quarkjs/squirrel.html index c356911..734533e 100644 --- a/example/game/quarkjs/squirrel.html +++ b/example/game/quarkjs/squirrel.html @@ -1,211 +1,228 @@ - - - - Squirrel - Quark Framework Tutorials - - - - - - - - - - - - -
-
- - - - - - - + + + + + Squirrel - Quark Framework Tutorials + + + + + + + + + + + + +
+
+ + + + + + + + \ No newline at end of file diff --git a/example/helloworld/emitter/emitter.html b/example/helloworld/emitter/emitter.html index 6323e01..6952e74 100644 --- a/example/helloworld/emitter/emitter.html +++ b/example/helloworld/emitter/emitter.html @@ -19,7 +19,7 @@ - + - - + + + - stats.begin(); - proton.update(); - stats.end(); - } - - \ No newline at end of file diff --git a/example/initialize/imagetarget/fire2.html b/example/initialize/imagetarget/fire2.html index c1d9c27..a1eef48 100644 --- a/example/initialize/imagetarget/fire2.html +++ b/example/initialize/imagetarget/fire2.html @@ -1,101 +1,147 @@ - - proton.js-emitter-fire - - - - - -
- -
- - - - + + + proton.js-emitter-fire + + + + + + +
+ +
+ + + + + \ No newline at end of file diff --git a/example/initialize/imagetarget/image/pt.jpg b/example/initialize/imagetarget/image/pt.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4943ce0b48ce4cd7471b7e6c7a0ac7bb2bfbc5af GIT binary patch literal 17893 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
1GC?A)KC|d<1<=5}k9)JkM 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 literal 0 HcmV?d00001 diff --git a/example/initialize/imagetarget/imagetarget.html b/example/initialize/imagetarget/imagetarget.html index 3a4b26e..52e4684 100644 --- a/example/initialize/imagetarget/imagetarget.html +++ b/example/initialize/imagetarget/imagetarget.html @@ -1,84 +1,104 @@ - - proton.js-emitter-ImageTarget - - - - - - - - - + + + + - stats.begin(); - emitter.rotation += 1.5; - proton.update(); - stats.end(); - } - - \ No newline at end of file diff --git a/example/lib/TweenLite.min.js b/example/lib/TweenLite.min.js new file mode 100644 index 0000000..024ddaa --- /dev/null +++ b/example/lib/TweenLite.min.js @@ -0,0 +1,12 @@ +/*! + * VERSION: 1.20.3 + * DATE: 2017-10-02 + * UPDATES AND DOCS AT: http://greensock.com + * + * @license Copyright (c) 2008-2017, GreenSock. All rights reserved. + * This work is subject to the terms at http://greensock.com/standard-license or for + * Club GreenSock members, the software agreement that was issued with your membership. + * + * @author: Jack Doyle, jack@greensock.com + */ +!function(a,b){"use strict";var c={},d=a.document,e=a.GreenSockGlobals=a.GreenSockGlobals||a;if(!e.TweenLite){var f,g,h,i,j,k=function(a){var b,c=a.split("."),d=e;for(b=0;b-1;)(l=q[f[p]]||new r(f[p],[])).gsClass?(i[p]=l.gsClass,s--):j&&l.sc.push(this);if(0===s&&g){if(m=("com.greensock."+d).split("."),n=m.pop(),o=k(m.join("."))[n]=this.gsClass=g.apply(g,i),h)if(e[n]=c[n]=o,"undefined"!=typeof module&&module.exports)if(d===b){module.exports=c[b]=o;for(p in c)o[p]=c[p]}else c[b]&&(c[b][n]=o);else"function"==typeof define&&define.amd&&define((a.GreenSockAMDPath?a.GreenSockAMDPath+"/":"")+d.split(".").pop(),[],function(){return o});for(p=0;p-1;)for(f=i[j],e=d?t("easing."+f,null,!0):l.easing[f]||{},g=k.length;--g>-1;)h=k[g],w[f+"."+h]=w[h+f]=e[h]=a.getRatio?a:a[h]||new a};for(h=v.prototype,h._calcEnd=!1,h.getRatio=function(a){if(this._func)return this._params[0]=a,this._func.apply(null,this._params);var b=this._type,c=this._power,d=1===b?1-a:2===b?a:.5>a?2*a:2*(1-a);return 1===c?d*=d:2===c?d*=d*d:3===c?d*=d*d*d:4===c&&(d*=d*d*d*d),1===b?1-d:2===b?d:.5>a?d/2:1-d/2},f=["Linear","Quad","Cubic","Quart","Quint,Strong"],g=f.length;--g>-1;)h=f[g]+",Power"+g,x(new v(null,null,1,g),h,"easeOut",!0),x(new v(null,null,2,g),h,"easeIn"+(0===g?",easeNone":"")),x(new v(null,null,3,g),h,"easeInOut");w.linear=l.easing.Linear.easeIn,w.swing=l.easing.Quad.easeInOut;var y=t("events.EventDispatcher",function(a){this._listeners={},this._eventTarget=a||this});h=y.prototype,h.addEventListener=function(a,b,c,d,e){e=e||0;var f,g,h=this._listeners[a],k=0;for(this!==i||j||i.wake(),null==h&&(this._listeners[a]=h=[]),g=h.length;--g>-1;)f=h[g],f.c===b&&f.s===c?h.splice(g,1):0===k&&f.pr-1;)if(d[c].c===b)return void d.splice(c,1)},h.dispatchEvent=function(a){var b,c,d,e=this._listeners[a];if(e)for(b=e.length,b>1&&(e=e.slice(0)),c=this._eventTarget;--b>-1;)d=e[b],d&&(d.up?d.c.call(d.s||c,{type:a,target:c}):d.c.call(d.s||c))};var z=a.requestAnimationFrame,A=a.cancelAnimationFrame,B=Date.now||function(){return(new Date).getTime()},C=B();for(f=["ms","moz","webkit","o"],g=f.length;--g>-1&&!z;)z=a[f[g]+"RequestAnimationFrame"],A=a[f[g]+"CancelAnimationFrame"]||a[f[g]+"CancelRequestAnimationFrame"];t("Ticker",function(a,b){var c,e,f,g,h,k=this,l=B(),n=b!==!1&&z?"auto":!1,p=500,q=33,r="tick",s=function(a){var b,d,i=B()-C;i>p&&(l+=i-q),C+=i,k.time=(C-l)/1e3,b=k.time-h,(!c||b>0||a===!0)&&(k.frame++,h+=b+(b>=g?.004:g-b),d=!0),a!==!0&&(f=e(s)),d&&k.dispatchEvent(r)};y.call(k),k.time=k.frame=0,k.tick=function(){s(!0)},k.lagSmoothing=function(a,b){return arguments.length?(p=a||1/m,void(q=Math.min(b,p,0))):1/m>p},k.sleep=function(){null!=f&&(n&&A?A(f):clearTimeout(f),e=o,f=null,k===i&&(j=!1))},k.wake=function(a){null!==f?k.sleep():a?l+=-C+(C=B()):k.frame>10&&(C=B()-p+5),e=0===c?o:n&&z?z:function(a){return setTimeout(a,1e3*(h-k.time)+1|0)},k===i&&(j=!0),s(2)},k.fps=function(a){return arguments.length?(c=a,g=1/(c||60),h=this.time+g,void k.wake()):c},k.useRAF=function(a){return arguments.length?(k.sleep(),n=a,void k.fps(c)):n},k.fps(a),setTimeout(function(){"auto"===n&&k.frame<5&&"hidden"!==d.visibilityState&&k.useRAF(!1)},1500)}),h=l.Ticker.prototype=new l.events.EventDispatcher,h.constructor=l.Ticker;var D=t("core.Animation",function(a,b){if(this.vars=b=b||{},this._duration=this._totalDuration=a||0,this._delay=Number(b.delay)||0,this._timeScale=1,this._active=b.immediateRender===!0,this.data=b.data,this._reversed=b.reversed===!0,X){j||i.wake();var c=this.vars.useFrames?W:X;c.add(this,c._time),this.vars.paused&&this.paused(!0)}});i=D.ticker=new l.Ticker,h=D.prototype,h._dirty=h._gc=h._initted=h._paused=!1,h._totalTime=h._time=0,h._rawPrevTime=-1,h._next=h._last=h._onUpdate=h._timeline=h.timeline=null,h._paused=!1;var E=function(){j&&B()-C>2e3&&("hidden"!==d.visibilityState||!i.lagSmoothing())&&i.wake();var a=setTimeout(E,2e3);a.unref&&a.unref()};E(),h.play=function(a,b){return null!=a&&this.seek(a,b),this.reversed(!1).paused(!1)},h.pause=function(a,b){return null!=a&&this.seek(a,b),this.paused(!0)},h.resume=function(a,b){return null!=a&&this.seek(a,b),this.paused(!1)},h.seek=function(a,b){return this.totalTime(Number(a),b!==!1)},h.restart=function(a,b){return this.reversed(!1).paused(!1).totalTime(a?-this._delay:0,b!==!1,!0)},h.reverse=function(a,b){return null!=a&&this.seek(a||this.totalDuration(),b),this.reversed(!0).paused(!1)},h.render=function(a,b,c){},h.invalidate=function(){return this._time=this._totalTime=0,this._initted=this._gc=!1,this._rawPrevTime=-1,(this._gc||!this.timeline)&&this._enabled(!0),this},h.isActive=function(){var a,b=this._timeline,c=this._startTime;return!b||!this._gc&&!this._paused&&b.isActive()&&(a=b.rawTime(!0))>=c&&a-1;)"{self}"===a[b]&&(c[b]=this);return c},h._callback=function(a){var b=this.vars,c=b[a],d=b[a+"Params"],e=b[a+"Scope"]||b.callbackScope||this,f=d?d.length:0;switch(f){case 0:c.call(e);break;case 1:c.call(e,d[0]);break;case 2:c.call(e,d[0],d[1]);break;default:c.apply(e,d)}},h.eventCallback=function(a,b,c,d){if("on"===(a||"").substr(0,2)){var e=this.vars;if(1===arguments.length)return e[a];null==b?delete e[a]:(e[a]=b,e[a+"Params"]=p(c)&&-1!==c.join("").indexOf("{self}")?this._swapSelfInParams(c):c,e[a+"Scope"]=d),"onUpdate"===a&&(this._onUpdate=b)}return this},h.delay=function(a){return arguments.length?(this._timeline.smoothChildTiming&&this.startTime(this._startTime+a-this._delay),this._delay=a,this):this._delay},h.duration=function(a){return arguments.length?(this._duration=this._totalDuration=a,this._uncache(!0),this._timeline.smoothChildTiming&&this._time>0&&this._timethis._duration?this._duration:a,b)):this._time},h.totalTime=function(a,b,c){if(j||i.wake(),!arguments.length)return this._totalTime;if(this._timeline){if(0>a&&!c&&(a+=this.totalDuration()),this._timeline.smoothChildTiming){this._dirty&&this.totalDuration();var d=this._totalDuration,e=this._timeline;if(a>d&&!c&&(a=d),this._startTime=(this._paused?this._pauseTime:e._time)-(this._reversed?d-a:a)/this._timeScale,e._dirty||this._uncache(!1),e._timeline)for(;e._timeline;)e._timeline._time!==(e._startTime+e._totalTime)/e._timeScale&&e.totalTime(e._totalTime,!0),e=e._timeline}this._gc&&this._enabled(!0,!1),(this._totalTime!==a||0===this._duration)&&(J.length&&Z(),this.render(a,b,!1),J.length&&Z())}return this},h.progress=h.totalProgress=function(a,b){var c=this.duration();return arguments.length?this.totalTime(c*a,b):c?this._time/c:this.ratio},h.startTime=function(a){return arguments.length?(a!==this._startTime&&(this._startTime=a,this.timeline&&this.timeline._sortChildren&&this.timeline.add(this,a-this._delay)),this):this._startTime},h.endTime=function(a){return this._startTime+(0!=a?this.totalDuration():this.duration())/this._timeScale},h.timeScale=function(a){if(!arguments.length)return this._timeScale;var b,c;for(a=a||m,this._timeline&&this._timeline.smoothChildTiming&&(b=this._pauseTime,c=b||0===b?b:this._timeline.totalTime(),this._startTime=c-(c-this._startTime)*this._timeScale/a),this._timeScale=a,c=this.timeline;c&&c.timeline;)c._dirty=!0,c.totalDuration(),c=c.timeline;return this},h.reversed=function(a){return arguments.length?(a!=this._reversed&&(this._reversed=a,this.totalTime(this._timeline&&!this._timeline.smoothChildTiming?this.totalDuration()-this._totalTime:this._totalTime,!0)),this):this._reversed},h.paused=function(a){if(!arguments.length)return this._paused;var b,c,d=this._timeline;return a!=this._paused&&d&&(j||a||i.wake(),b=d.rawTime(),c=b-this._pauseTime,!a&&d.smoothChildTiming&&(this._startTime+=c,this._uncache(!1)),this._pauseTime=a?b:null,this._paused=a,this._active=this.isActive(),!a&&0!==c&&this._initted&&this.duration()&&(b=d.smoothChildTiming?this._totalTime:(b-this._startTime)/this._timeScale,this.render(b,b===this._totalTime,!0))),this._gc&&!a&&this._enabled(!0,!1),this};var F=t("core.SimpleTimeline",function(a){D.call(this,0,a),this.autoRemoveChildren=this.smoothChildTiming=!0});h=F.prototype=new D,h.constructor=F,h.kill()._gc=!1,h._first=h._last=h._recent=null,h._sortChildren=!1,h.add=h.insert=function(a,b,c,d){var e,f;if(a._startTime=Number(b||0)+a._delay,a._paused&&this!==a._timeline&&(a._pauseTime=a._startTime+(this.rawTime()-a._startTime)/a._timeScale),a.timeline&&a.timeline._remove(a,!0),a.timeline=a._timeline=this,a._gc&&a._enabled(!0,!0),e=this._last,this._sortChildren)for(f=a._startTime;e&&e._startTime>f;)e=e._prev;return e?(a._next=e._next,e._next=a):(a._next=this._first,this._first=a),a._next?a._next._prev=a:this._last=a,a._prev=e,this._recent=a,this._timeline&&this._uncache(!0),this},h._remove=function(a,b){return a.timeline===this&&(b||a._enabled(!1,!0),a._prev?a._prev._next=a._next:this._first===a&&(this._first=a._next),a._next?a._next._prev=a._prev:this._last===a&&(this._last=a._prev),a._next=a._prev=a.timeline=null,a===this._recent&&(this._recent=this._last),this._timeline&&this._uncache(!0)),this},h.render=function(a,b,c){var d,e=this._first;for(this._totalTime=this._time=this._rawPrevTime=a;e;)d=e._next,(e._active||a>=e._startTime&&!e._paused&&!e._gc)&&(e._reversed?e.render((e._dirty?e.totalDuration():e._totalDuration)-(a-e._startTime)*e._timeScale,b,c):e.render((a-e._startTime)*e._timeScale,b,c)),e=d},h.rawTime=function(){return j||i.wake(),this._totalTime};var G=t("TweenLite",function(b,c,d){if(D.call(this,c,d),this.render=G.prototype.render,null==b)throw"Cannot tween a null target.";this.target=b="string"!=typeof b?b:G.selector(b)||b;var e,f,g,h=b.jquery||b.length&&b!==a&&b[0]&&(b[0]===a||b[0].nodeType&&b[0].style&&!b.nodeType),i=this.vars.overwrite;if(this._overwrite=i=null==i?V[G.defaultOverwrite]:"number"==typeof i?i>>0:V[i],(h||b instanceof Array||b.push&&p(b))&&"number"!=typeof b[0])for(this._targets=g=n(b),this._propLookup=[],this._siblings=[],e=0;e1&&aa(f,this,null,1,this._siblings[e])):(f=g[e--]=G.selector(f),"string"==typeof f&&g.splice(e+1,1)):g.splice(e--,1);else this._propLookup={},this._siblings=$(b,this,!1),1===i&&this._siblings.length>1&&aa(b,this,null,1,this._siblings);(this.vars.immediateRender||0===c&&0===this._delay&&this.vars.immediateRender!==!1)&&(this._time=-m,this.render(Math.min(0,-this._delay)))},!0),H=function(b){return b&&b.length&&b!==a&&b[0]&&(b[0]===a||b[0].nodeType&&b[0].style&&!b.nodeType)},I=function(a,b){var c,d={};for(c in a)U[c]||c in b&&"transform"!==c&&"x"!==c&&"y"!==c&&"width"!==c&&"height"!==c&&"className"!==c&&"border"!==c||!(!R[c]||R[c]&&R[c]._autoCSS)||(d[c]=a[c],delete a[c]);a.css=d};h=G.prototype=new D,h.constructor=G,h.kill()._gc=!1,h.ratio=0,h._firstPT=h._targets=h._overwrittenProps=h._startAt=null,h._notifyPluginsOfEnabled=h._lazy=!1,G.version="1.20.3",G.defaultEase=h._ease=new v(null,null,1,1),G.defaultOverwrite="auto",G.ticker=i,G.autoSleep=120,G.lagSmoothing=function(a,b){i.lagSmoothing(a,b)},G.selector=a.$||a.jQuery||function(b){var c=a.$||a.jQuery;return c?(G.selector=c,c(b)):"undefined"==typeof d?b:d.querySelectorAll?d.querySelectorAll(b):d.getElementById("#"===b.charAt(0)?b.substr(1):b)};var J=[],K={},L=/(?:(-|-=|\+=)?\d*\.?\d*(?:e[\-+]?\d+)?)[0-9]/gi,M=/[\+-]=-?[\.\d]/,N=function(a){for(var b,c=this._firstPT,d=1e-6;c;)b=c.blob?1===a&&null!=this.end?this.end:a?this.join(""):this.start:c.c*a+c.s,c.m?b=c.m(b,this._target||c.t):d>b&&b>-d&&!c.blob&&(b=0),c.f?c.fp?c.t[c.p](c.fp,b):c.t[c.p](b):c.t[c.p]=b,c=c._next},O=function(a,b,c,d){var e,f,g,h,i,j,k,l=[],m=0,n="",o=0;for(l.start=a,l.end=b,a=l[0]=a+"",b=l[1]=b+"",c&&(c(l),a=l[0],b=l[1]),l.length=0,e=a.match(L)||[],f=b.match(L)||[],d&&(d._next=null,d.blob=1,l._firstPT=l._applyPT=d),i=f.length,h=0;i>h;h++)k=f[h],j=b.substr(m,b.indexOf(k,m)-m),n+=j||!h?j:",",m+=j.length,o?o=(o+1)%5:"rgba("===j.substr(-5)&&(o=1),k===e[h]||e.length<=h?n+=k:(n&&(l.push(n),n=""),g=parseFloat(e[h]),l.push(g),l._firstPT={_next:l._firstPT,t:l,p:l.length-1,s:g,c:("="===k.charAt(1)?parseInt(k.charAt(0)+"1",10)*parseFloat(k.substr(2)):parseFloat(k)-g)||0,f:0,m:o&&4>o?Math.round:0}),m+=k.length;return n+=b.substr(m),n&&l.push(n),l.setRatio=N,M.test(b)&&(l.end=null),l},P=function(a,b,c,d,e,f,g,h,i){"function"==typeof d&&(d=d(i||0,a));var j,k=typeof a[b],l="function"!==k?"":b.indexOf("set")||"function"!=typeof a["get"+b.substr(3)]?b:"get"+b.substr(3),m="get"!==c?c:l?g?a[l](g):a[l]():a[b],n="string"==typeof d&&"="===d.charAt(1),o={t:a,p:b,s:m,f:"function"===k,pg:0,n:e||b,m:f?"function"==typeof f?f:Math.round:0,pr:0,c:n?parseInt(d.charAt(0)+"1",10)*parseFloat(d.substr(2)):parseFloat(d)-m||0};return("number"!=typeof m||"number"!=typeof d&&!n)&&(g||isNaN(m)||!n&&isNaN(d)||"boolean"==typeof m||"boolean"==typeof d?(o.fp=g,j=O(m,n?parseFloat(o.s)+o.c:d,h||G.defaultStringFilter,o),o={t:j,p:"setRatio",s:0,c:1,f:2,pg:0,n:e||b,pr:0,m:0}):(o.s=parseFloat(m),n||(o.c=parseFloat(d)-o.s||0))),o.c?((o._next=this._firstPT)&&(o._next._prev=o),this._firstPT=o,o):void 0},Q=G._internals={isArray:p,isSelector:H,lazyTweens:J,blobDif:O},R=G._plugins={},S=Q.tweenLookup={},T=0,U=Q.reservedProps={ease:1,delay:1,overwrite:1,onComplete:1,onCompleteParams:1,onCompleteScope:1,useFrames:1,runBackwards:1,startAt:1,onUpdate:1,onUpdateParams:1,onUpdateScope:1,onStart:1,onStartParams:1,onStartScope:1,onReverseComplete:1,onReverseCompleteParams:1,onReverseCompleteScope:1,onRepeat:1,onRepeatParams:1,onRepeatScope:1,easeParams:1,yoyo:1,immediateRender:1,repeat:1,repeatDelay:1,data:1,paused:1,reversed:1,autoCSS:1,lazy:1,onOverwrite:1,callbackScope:1,stringFilter:1,id:1,yoyoEase:1},V={none:0,all:1,auto:2,concurrent:3,allOnStart:4,preexisting:5,"true":1,"false":0},W=D._rootFramesTimeline=new F,X=D._rootTimeline=new F,Y=30,Z=Q.lazyRender=function(){var a,b=J.length;for(K={};--b>-1;)a=J[b],a&&a._lazy!==!1&&(a.render(a._lazy[0],a._lazy[1],!0),a._lazy=!1);J.length=0};X._startTime=i.time,W._startTime=i.frame,X._active=W._active=!0,setTimeout(Z,1),D._updateRoot=G.render=function(){var a,b,c;if(J.length&&Z(),X.render((i.time-X._startTime)*X._timeScale,!1,!1),W.render((i.frame-W._startTime)*W._timeScale,!1,!1),J.length&&Z(),i.frame>=Y){Y=i.frame+(parseInt(G.autoSleep,10)||120);for(c in S){for(b=S[c].tweens,a=b.length;--a>-1;)b[a]._gc&&b.splice(a,1);0===b.length&&delete S[c]}if(c=X._first,(!c||c._paused)&&G.autoSleep&&!W._first&&1===i._listeners.tick.length){for(;c&&c._paused;)c=c._next;c||i.sleep()}}},i.addEventListener("tick",D._updateRoot);var $=function(a,b,c){var d,e,f=a._gsTweenID;if(S[f||(a._gsTweenID=f="t"+T++)]||(S[f]={target:a,tweens:[]}),b&&(d=S[f].tweens,d[e=d.length]=b,c))for(;--e>-1;)d[e]===b&&d.splice(e,1);return S[f].tweens},_=function(a,b,c,d){var e,f,g=a.vars.onOverwrite;return g&&(e=g(a,b,c,d)),g=G.onOverwrite,g&&(f=g(a,b,c,d)),e!==!1&&f!==!1},aa=function(a,b,c,d,e){var f,g,h,i;if(1===d||d>=4){for(i=e.length,f=0;i>f;f++)if((h=e[f])!==b)h._gc||h._kill(null,a,b)&&(g=!0);else if(5===d)break;return g}var j,k=b._startTime+m,l=[],n=0,o=0===b._duration;for(f=e.length;--f>-1;)(h=e[f])===b||h._gc||h._paused||(h._timeline!==b._timeline?(j=j||ba(b,0,o),0===ba(h,j,o)&&(l[n++]=h)):h._startTime<=k&&h._startTime+h.totalDuration()/h._timeScale>k&&((o||!h._initted)&&k-h._startTime<=2e-10||(l[n++]=h)));for(f=n;--f>-1;)if(h=l[f],2===d&&h._kill(c,a,b)&&(g=!0),2!==d||!h._firstPT&&h._initted){if(2!==d&&!_(h,b))continue;h._enabled(!1,!1)&&(g=!0)}return g},ba=function(a,b,c){for(var d=a._timeline,e=d._timeScale,f=a._startTime;d._timeline;){if(f+=d._startTime,e*=d._timeScale,d._paused)return-100;d=d._timeline}return f/=e,f>b?f-b:c&&f===b||!a._initted&&2*m>f-b?m:(f+=a.totalDuration()/a._timeScale/e)>b+m?0:f-b-m};h._init=function(){var a,b,c,d,e,f,g=this.vars,h=this._overwrittenProps,i=this._duration,j=!!g.immediateRender,k=g.ease;if(g.startAt){this._startAt&&(this._startAt.render(-1,!0),this._startAt.kill()),e={};for(d in g.startAt)e[d]=g.startAt[d];if(e.data="isStart",e.overwrite=!1,e.immediateRender=!0,e.lazy=j&&g.lazy!==!1,e.startAt=e.delay=null,e.onUpdate=g.onUpdate,e.onUpdateParams=g.onUpdateParams,e.onUpdateScope=g.onUpdateScope||g.callbackScope||this,this._startAt=G.to(this.target,0,e),j)if(this._time>0)this._startAt=null;else if(0!==i)return}else if(g.runBackwards&&0!==i)if(this._startAt)this._startAt.render(-1,!0),this._startAt.kill(),this._startAt=null;else{0!==this._time&&(j=!1),c={};for(d in g)U[d]&&"autoCSS"!==d||(c[d]=g[d]);if(c.overwrite=0,c.data="isFromStart",c.lazy=j&&g.lazy!==!1,c.immediateRender=j,this._startAt=G.to(this.target,0,c),j){if(0===this._time)return}else this._startAt._init(),this._startAt._enabled(!1),this.vars.immediateRender&&(this._startAt=null)}if(this._ease=k=k?k instanceof v?k:"function"==typeof k?new v(k,g.easeParams):w[k]||G.defaultEase:G.defaultEase,g.easeParams instanceof Array&&k.config&&(this._ease=k.config.apply(k,g.easeParams)),this._easeType=this._ease._type,this._easePower=this._ease._power,this._firstPT=null,this._targets)for(f=this._targets.length,a=0;f>a;a++)this._initProps(this._targets[a],this._propLookup[a]={},this._siblings[a],h?h[a]:null,a)&&(b=!0);else b=this._initProps(this.target,this._propLookup,this._siblings,h,0);if(b&&G._onPluginEvent("_onInitAllProps",this),h&&(this._firstPT||"function"!=typeof this.target&&this._enabled(!1,!1)),g.runBackwards)for(c=this._firstPT;c;)c.s+=c.c,c.c=-c.c,c=c._next;this._onUpdate=g.onUpdate,this._initted=!0},h._initProps=function(b,c,d,e,f){var g,h,i,j,k,l;if(null==b)return!1;K[b._gsTweenID]&&Z(),this.vars.css||b.style&&b!==a&&b.nodeType&&R.css&&this.vars.autoCSS!==!1&&I(this.vars,b);for(g in this.vars)if(l=this.vars[g],U[g])l&&(l instanceof Array||l.push&&p(l))&&-1!==l.join("").indexOf("{self}")&&(this.vars[g]=l=this._swapSelfInParams(l,this));else if(R[g]&&(j=new R[g])._onInitTween(b,this.vars[g],this,f)){for(this._firstPT=k={_next:this._firstPT,t:j,p:"setRatio",s:0,c:1,f:1,n:g,pg:1,pr:j._priority,m:0},h=j._overwriteProps.length;--h>-1;)c[j._overwriteProps[h]]=this._firstPT;(j._priority||j._onInitAllProps)&&(i=!0),(j._onDisable||j._onEnable)&&(this._notifyPluginsOfEnabled=!0),k._next&&(k._next._prev=k)}else c[g]=P.call(this,b,g,"get",l,g,0,null,this.vars.stringFilter,f);return e&&this._kill(e,b)?this._initProps(b,c,d,e,f):this._overwrite>1&&this._firstPT&&d.length>1&&aa(b,this,c,this._overwrite,d)?(this._kill(c,b),this._initProps(b,c,d,e,f)):(this._firstPT&&(this.vars.lazy!==!1&&this._duration||this.vars.lazy&&!this._duration)&&(K[b._gsTweenID]=!0),i)},h.render=function(a,b,c){var d,e,f,g,h=this._time,i=this._duration,j=this._rawPrevTime;if(a>=i-1e-7&&a>=0)this._totalTime=this._time=i,this.ratio=this._ease._calcEnd?this._ease.getRatio(1):1,this._reversed||(d=!0,e="onComplete",c=c||this._timeline.autoRemoveChildren),0===i&&(this._initted||!this.vars.lazy||c)&&(this._startTime===this._timeline._duration&&(a=0),(0>j||0>=a&&a>=-1e-7||j===m&&"isPause"!==this.data)&&j!==a&&(c=!0,j>m&&(e="onReverseComplete")),this._rawPrevTime=g=!b||a||j===a?a:m);else if(1e-7>a)this._totalTime=this._time=0,this.ratio=this._ease._calcEnd?this._ease.getRatio(0):0,(0!==h||0===i&&j>0)&&(e="onReverseComplete",d=this._reversed),0>a&&(this._active=!1,0===i&&(this._initted||!this.vars.lazy||c)&&(j>=0&&(j!==m||"isPause"!==this.data)&&(c=!0),this._rawPrevTime=g=!b||a||j===a?a:m)),(!this._initted||this._startAt&&this._startAt.progress())&&(c=!0);else if(this._totalTime=this._time=a,this._easeType){var k=a/i,l=this._easeType,n=this._easePower;(1===l||3===l&&k>=.5)&&(k=1-k),3===l&&(k*=2),1===n?k*=k:2===n?k*=k*k:3===n?k*=k*k*k:4===n&&(k*=k*k*k*k),1===l?this.ratio=1-k:2===l?this.ratio=k:.5>a/i?this.ratio=k/2:this.ratio=1-k/2}else this.ratio=this._ease.getRatio(a/i);if(this._time!==h||c){if(!this._initted){if(this._init(),!this._initted||this._gc)return;if(!c&&this._firstPT&&(this.vars.lazy!==!1&&this._duration||this.vars.lazy&&!this._duration))return this._time=this._totalTime=h,this._rawPrevTime=j,J.push(this),void(this._lazy=[a,b]);this._time&&!d?this.ratio=this._ease.getRatio(this._time/i):d&&this._ease._calcEnd&&(this.ratio=this._ease.getRatio(0===this._time?0:1))}for(this._lazy!==!1&&(this._lazy=!1),this._active||!this._paused&&this._time!==h&&a>=0&&(this._active=!0),0===h&&(this._startAt&&(a>=0?this._startAt.render(a,!0,c):e||(e="_dummyGS")),this.vars.onStart&&(0!==this._time||0===i)&&(b||this._callback("onStart"))),f=this._firstPT;f;)f.f?f.t[f.p](f.c*this.ratio+f.s):f.t[f.p]=f.c*this.ratio+f.s,f=f._next;this._onUpdate&&(0>a&&this._startAt&&a!==-1e-4&&this._startAt.render(a,!0,c),b||(this._time!==h||d||c)&&this._callback("onUpdate")),e&&(!this._gc||c)&&(0>a&&this._startAt&&!this._onUpdate&&a!==-1e-4&&this._startAt.render(a,!0,c),d&&(this._timeline.autoRemoveChildren&&this._enabled(!1,!1),this._active=!1),!b&&this.vars[e]&&this._callback(e),0===i&&this._rawPrevTime===m&&g!==m&&(this._rawPrevTime=0))}},h._kill=function(a,b,c){if("all"===a&&(a=null),null==a&&(null==b||b===this.target))return this._lazy=!1,this._enabled(!1,!1);b="string"!=typeof b?b||this._targets||this.target:G.selector(b)||b;var d,e,f,g,h,i,j,k,l,m=c&&this._time&&c._startTime===this._startTime&&this._timeline===c._timeline;if((p(b)||H(b))&&"number"!=typeof b[0])for(d=b.length;--d>-1;)this._kill(a,b[d],c)&&(i=!0);else{if(this._targets){for(d=this._targets.length;--d>-1;)if(b===this._targets[d]){h=this._propLookup[d]||{},this._overwrittenProps=this._overwrittenProps||[],e=this._overwrittenProps[d]=a?this._overwrittenProps[d]||{}:"all";break}}else{if(b!==this.target)return!1;h=this._propLookup,e=this._overwrittenProps=a?this._overwrittenProps||{}:"all"}if(h){if(j=a||h,k=a!==e&&"all"!==e&&a!==h&&("object"!=typeof a||!a._tempKill),c&&(G.onOverwrite||this.vars.onOverwrite)){for(f in j)h[f]&&(l||(l=[]),l.push(f));if((l||!a)&&!_(this,c,b,l))return!1}for(f in j)(g=h[f])&&(m&&(g.f?g.t[g.p](g.s):g.t[g.p]=g.s,i=!0),g.pg&&g.t._kill(j)&&(i=!0),g.pg&&0!==g.t._overwriteProps.length||(g._prev?g._prev._next=g._next:g===this._firstPT&&(this._firstPT=g._next),g._next&&(g._next._prev=g._prev),g._next=g._prev=null),delete h[f]),k&&(e[f]=1);!this._firstPT&&this._initted&&this._enabled(!1,!1)}}return i},h.invalidate=function(){return this._notifyPluginsOfEnabled&&G._onPluginEvent("_onDisable",this),this._firstPT=this._overwrittenProps=this._startAt=this._onUpdate=null,this._notifyPluginsOfEnabled=this._active=this._lazy=!1,this._propLookup=this._targets?{}:[],D.prototype.invalidate.call(this),this.vars.immediateRender&&(this._time=-m,this.render(Math.min(0,-this._delay))),this},h._enabled=function(a,b){if(j||i.wake(),a&&this._gc){var c,d=this._targets;if(d)for(c=d.length;--c>-1;)this._siblings[c]=$(d[c],this,!0);else this._siblings=$(this.target,this,!0)}return D.prototype._enabled.call(this,a,b),this._notifyPluginsOfEnabled&&this._firstPT?G._onPluginEvent(a?"_onEnable":"_onDisable",this):!1},G.to=function(a,b,c){return new G(a,b,c)},G.from=function(a,b,c){return c.runBackwards=!0,c.immediateRender=0!=c.immediateRender,new G(a,b,c)},G.fromTo=function(a,b,c,d){return d.startAt=c,d.immediateRender=0!=d.immediateRender&&0!=c.immediateRender,new G(a,b,d)},G.delayedCall=function(a,b,c,d,e){return new G(b,0,{delay:a,onComplete:b,onCompleteParams:c,callbackScope:d,onReverseComplete:b,onReverseCompleteParams:c,immediateRender:!1,lazy:!1,useFrames:e,overwrite:0})},G.set=function(a,b){return new G(a,0,b)},G.getTweensOf=function(a,b){if(null==a)return[];a="string"!=typeof a?a:G.selector(a)||a;var c,d,e,f;if((p(a)||H(a))&&"number"!=typeof a[0]){for(c=a.length,d=[];--c>-1;)d=d.concat(G.getTweensOf(a[c],b));for(c=d.length;--c>-1;)for(f=d[c],e=c;--e>-1;)f===d[e]&&d.splice(c,1)}else if(a._gsTweenID)for(d=$(a).concat(),c=d.length;--c>-1;)(d[c]._gc||b&&!d[c].isActive())&&d.splice(c,1);return d||[]},G.killTweensOf=G.killDelayedCallsTo=function(a,b,c){"object"==typeof b&&(c=b,b=!1);for(var d=G.getTweensOf(a,b),e=d.length;--e>-1;)d[e]._kill(c,a)};var ca=t("plugins.TweenPlugin",function(a,b){this._overwriteProps=(a||"").split(","),this._propName=this._overwriteProps[0],this._priority=b||0,this._super=ca.prototype},!0);if(h=ca.prototype,ca.version="1.19.0",ca.API=2,h._firstPT=null,h._addTween=P,h.setRatio=N,h._kill=function(a){var b,c=this._overwriteProps,d=this._firstPT;if(null!=a[this._propName])this._overwriteProps=[];else for(b=c.length;--b>-1;)null!=a[c[b]]&&c.splice(b,1);for(;d;)null!=a[d.n]&&(d._next&&(d._next._prev=d._prev),d._prev?(d._prev._next=d._next,d._prev=null):this._firstPT===d&&(this._firstPT=d._next)),d=d._next;return!1},h._mod=h._roundProps=function(a){for(var b,c=this._firstPT;c;)b=a[this._propName]||null!=c.n&&a[c.n.split(this._propName+"_").join("")],b&&"function"==typeof b&&(2===c.f?c.t._applyPT.m=b:c.m=b),c=c._next},G._onPluginEvent=function(a,b){var c,d,e,f,g,h=b._firstPT;if("_onInitAllProps"===a){for(;h;){for(g=h._next,d=e;d&&d.pr>h.pr;)d=d._next;(h._prev=d?d._prev:f)?h._prev._next=h:e=h,(h._next=d)?d._prev=h:f=h,h=g}h=b._firstPT=e}for(;h;)h.pg&&"function"==typeof h.t[a]&&h.t[a]()&&(c=!0),h=h._next;return c},ca.activate=function(a){for(var b=a.length;--b>-1;)a[b].API===ca.API&&(R[(new a[b])._propName]=a[b]);return!0},s.plugin=function(a){if(!(a&&a.propName&&a.init&&a.API))throw"illegal plugin definition.";var b,c=a.propName,d=a.priority||0,e=a.overwriteProps,f={init:"_onInitTween",set:"setRatio",kill:"_kill",round:"_mod",mod:"_mod",initAll:"_onInitAllProps"},g=t("plugins."+c.charAt(0).toUpperCase()+c.substr(1)+"Plugin",function(){ca.call(this,c,d),this._overwriteProps=e||[]},a.global===!0),h=g.prototype=new ca(c);h.constructor=g,g.API=a.API;for(b in f)"function"==typeof a[b]&&(h[f[b]]=a[b]);return g.version=a.version,ca.activate([g]),g},f=a._gsQueue){for(g=0;g>>16}if(!(j instanceof f)){return new f(n,m,h,i)}this.channels=[typeof n===g&&k(n)||n,typeof m===g&&k(m)||m,typeof h===g&&k(h)||h,(typeof i!==g&&typeof i!=="number")&&1||typeof i===g&&parseFloat(i)||i]},d=f.prototype,b="undefined",a="toLowerCase",c=Math,e;f.RGBtoHSL=function(p){var i=p[0],n=p[1],q=p[2];i/=255;n/=255;q/=255;var t=c.max(i,n,q),k=c.min(i,n,q),m,u,j=(t+k)/2;if(t===k){m=u=0}else{var o=t-k;u=j>0.5?o/(2-t-k):o/(t+k);switch(t){case i:m=(n-q)/o+(n1){h-=1}if(h<1/6){return r+(l-r)*6*h}if(h<1/2){return l}if(h<2/3){return r+(l-r)*(2/3-h)*6}return r};if(w===0){i=t=u=n}else{var j=n<0.5?n*(1+w):n+w-n*w,k=2*n-j;i=m(k,j,o+1/3);t=m(k,j,o);u=m(k,j,o-1/3)}return[i*255,t*255,u*255]};f.rgb=function(k,j,h,i){return new f(k,j,h,typeof i!==b?i:1)};f.hsl=function(o,n,j,i){var k=f.HSLtoRGB([o,n,j]),m=c.ceil;return new f(m(k[0]),m(k[1]),m(k[2]),typeof i!==b?i:1)};f.TO_STRING_METHOD="hexTriplet";f.parse=function(h){h=h.replace(/^\s+/g,"")[a]();if(h[0]==="#"){return new f(h)}var k=h.substr(0,3),j;h=h.replace(/[^\d,.]/g,"").split(",");j=h.length;while(j--){h[j]=h[j]&&parseFloat(h[j])||0}switch(k){case"rgb":return f.rgb.apply(f,h);case"hsl":h[0]/=360;h[1]/=100;h[2]/=100;return f.hsl.apply(f,h)}return null};(f.clearColors=function(){e={transparent:[0,0,0,0]}})();f.define=function(h,i){e[h[a]()]=i};f.get=function(h){h=h[a]();if(Object.prototype.hasOwnProperty.call(e,h)){return f.apply(null,[].concat(e[h]))}return null};f.del=function(h){return delete e[h[a]()]};f.random=function(k,j){typeof k===g&&(k=f.get(k))&&(k=k.getValue());typeof j===g&&(j=f.get(j))&&(j=j.getValue());var i=c.floor,h=c.random;j=(j||16777215)+1;if(!isNaN(k)){return new f(i((h()*(j-k))+k))}return new f(i(h()*j))};d.toString=function(){return this[f.TO_STRING_METHOD]()};d.valueOf=d.getValue=function(){var h=this.channels;return((h[0]*65536)|(h[1]*256)|h[2])};d.setValue=function(h){this.channels.splice(0,3,h>>>16,(h&65280)/256,h&255)};d.hexTriplet=("01".substr(-1)==="1"?function(){return"#"+("00000"+this.getValue().toString(16)).substr(-6)}:function(){var h=this.getValue().toString(16);return"#"+(new Array(h.length<6?6-h.length+1:0)).join("0")+h});d.css=function(){var h=this;return h.channels[3]===1?h.hexTriplet():h.rgba()};d.rgbData=function(){return this.channels.slice(0,3)};d.hslData=function(){return f.RGBtoHSL(this.rgbData())};d.rgb=function(){return"rgb("+this.rgbData().join(",")+")"};d.rgba=function(){return"rgba("+this.channels.join(",")+")"};d.hsl=function(){var h=this.hslData();return"hsl("+h[0]*360+","+(h[1]*100)+"%,"+(h[2]*100)+"%)"};d.hsla=function(){var h=this.hslData();return"hsla("+h[0]*360+","+(h[1]*100)+"%,"+(h[2]*100)+"%,"+this.channels[3]+")"};return f}()); diff --git a/example/lib/config.js b/example/lib/config.js deleted file mode 100644 index 6a73c50..0000000 --- a/example/lib/config.js +++ /dev/null @@ -1,217 +0,0 @@ -var configArr = ["domReady"]; -var configObj = { - baseUrl : "../../../src/", -}; -var shim = {}; -var paths = { - "Proton" : "core/Proton", - "EventDispatcher" : "events/EventDispatcher", - "Util" : "utils/Util", - "WebGLUtil" : "utils/WebGLUtil", - "DomUtil" : "utils/DomUtil", - "MStack" : "utils/MStack", - "Particle" : "core/Particle", - "Pool" : "core/Pool", - - "MathUtils" : "math/MathUtils", - "NumericalIntegration" : "math/NumericalIntegration", - "Vector2D" : "math/Vector2D", - "Polar2D" : "math/Polar2D", - "Span" : "math/Span", - "ColorSpan" : "math/ColorSpan", - "Rectangle" : "math/Rectangle", - "Mat3" : "math/Mat3", - "Behaviour" : "behaviour/Behaviour", - - "Rate" : "initialize/Rate", - "Initialize" : "initialize/Initialize", - "InitializeUtil" : "initialize/InitializeUtil", - "Life" : "initialize/Life", - "Position" : "initialize/Position", - "Velocity" : "initialize/Velocity", - "Mass" : "initialize/Mass", - "Radius" : "initialize/Radius", - "ImageTarget" : "initialize/ImageTarget", - - "Force" : "behaviour/Force", - "Attraction" : "behaviour/Attraction", - "RandomDrift" : "behaviour/RandomDrift", - "Repulsion" : "behaviour/Repulsion", - "Gravity" : "behaviour/Gravity", - "Collision" : "behaviour/Collision", - "CrossZone" : "behaviour/CrossZone", - "Alpha" : "behaviour/Alpha", - "Scale" : "behaviour/Scale", - "Rotate" : "behaviour/Rotate", - "Color" : "behaviour/Color", - "GravityWell" : "behaviour/GravityWell", - - "Emitter" : "emitter/Emitter", - "BehaviourEmitter" : "emitter/BehaviourEmitter", - "FollowEmitter" : "emitter/FollowEmitter", - - "ease" : "plus/ease", - "requestAnimationFrame" : "plus/requestAnimationFrame", - - "Renderer" : "render/Renderer", - "BaseRender" : "render/BaseRender", - "DomRender" : "render/DomRender", - "EaselRender" : "render/EaselRender", - "CanvasRender" : "render/CanvasRender", - "PixelRender" : "render/PixelRender", - "WebGLRender" : "render/WebGLRender", - - "Zone" : "zone/Zone", - "LineZone" : "zone/LineZone", - "CircleZone" : "zone/CircleZone", - "PointZone" : "zone/PointZone", - "RectZone" : "zone/RectZone", - "ImageZone" : "zone/ImageZone", - - "log" : "debug/log", - "Debug" : "debug/Debug" -} - -for (var index in paths) { - configArr.push(index); - - //*****************Proton*****************// - if (index == "Proton") { - shim[index] = { - exports : "Proton" - }; - } - //*****************math*****************// - else if (index == "Span") { - shim[index] = { - deps : ["Proton", "MathUtils"] - }; - } else if (index == "ColorSpan" || index == "SpanAB") { - shim[index] = { - deps : ["Proton", "Util", "Span"] - }; - } else if (index == "Polar2D") { - shim[index] = { - deps : ["Proton", "Vector2D"] - }; - } else if (index == "NumericalIntegration") { - shim[index] = { - deps : ["Proton", "Util"] - }; - } - //*****************util*****************// - else if (index == "Util") { - shim[index] = { - deps : ["Proton", "Vector2D", "DomUtil"] - }; - } else if (index == "MStack") { - shim[index] = { - deps : ["Proton", "Mat3"] - }; - } - //*****************core*****************// - else if (index == "Particle") { - shim[index] = { - deps : ["Proton", "Vector2D", "Util"] - }; - } else if (index == "ParticlePool") { - shim[index] = { - deps : ["Proton", "Particle"] - }; - } - //*****************events*****************// - else if (index == "Event") { - shim[index] = { - deps : ["Proton", "Util"] - }; - } - //*****************emitter*****************// - else if (index == "Emitter") { - shim[index] = { - deps : ["Proton", "InitializeUtil", "Event", "Util", "EventDispatcher", "Particle", "Rate"] - }; - } else if (index == "BehaviourEmitter" || index == "FollowEmitter") { - shim[index] = { - deps : ["Proton", "Util", "Emitter"] - }; - } - //*****************initialize*****************// - else if (index == "InitializeUtil") { - shim[index] = { - deps : ["Proton", "Util"] - }; - } else if (index == "Initialize") { - shim[index] = { - deps : ["Proton", "InitializeUtil"] - }; - } else if (index == "Color" || index == "Radius" || index == "Life" || index == "Mass" || index == "Position" || index == "Rate" || index == "ImageTarget" || index == "Velocity") { - shim[index] = { - deps : ["Proton", "Util", "Initialize"] - }; - } else if (index == "GravityWell") { - shim[index] = { - deps : ["Proton", "Util", "Initialize"] - }; - } - //*****************behaviour*****************// - else if (index == "Behaviour") { - shim[index] = { - deps : ["Proton", "Util"] - }; - } else if (index == "CrossZone" || index == "Attraction" || index == "Collision" || index == "Force" || index == "CrossZone" || index == "RandomDrift" || index == "Scale" || index == "Alpha" || index == "Rotate") { - shim[index] = { - deps : ["Proton", "Util", "Behaviour", "Vector2D"] - }; - } else if (index == "Gravity") { - shim[index] = { - deps : ["Proton", "Util", "Force"] - }; - } else if (index == "Repulsion") { - shim[index] = { - deps : ["Proton", "Util", "Attraction"] - }; - } - //*****************zone*****************// - else if (index == "Zone") { - shim[index] = { - deps : ["Proton", "Vector2D"] - }; - } else if (index == "CircleZone" || index == "LineZone" || index == "PointZone" || index == "ImageZone" || index == "RectZone") { - shim[index] = { - deps : ["Proton", "Util", "Zone"] - }; - } - //*****************render*****************// - else if (index == "DomRender" || index == "CanvasRender" || index == "EaselRender" || index == "PixelRender") { - shim[index] = { - deps : ["Proton", "Util", "BaseRender", "DomUtil"] - }; - } else if (index == "WebGLRender") { - shim[index] = { - deps : ["Proton", "Util", "BaseRender", "MStack", "Mat3", "WebGLUtil"] - }; - } else if (index == "Renderer") { - shim[index] = { - deps : ["Proton", "BaseRender", "CanvasRender", "DomRender", "EaselRender", "PixelRender", "WebGLRender"] - }; - } else if (index == "Debug") { - shim[index] = { - deps : ["Proton", "Util"] - }; - } else { - //EventDispatcher\Vector2D\MathUtils\BaseRender\Rectangle\all-plus - shim[index] = { - deps : ["Proton"] - }; - } -} - -configObj.paths = paths; -configObj.shim = shim; -configObj.out = 'abc.js'; -require.config(configObj); -require(configArr, function(domReady, Proton) { - domReady(function() { - Main(Proton); - }); -}); diff --git a/example/lib/domReady.js b/example/lib/domReady.js deleted file mode 100644 index 31bd0d7..0000000 --- a/example/lib/domReady.js +++ /dev/null @@ -1,129 +0,0 @@ -/** - * @license RequireJS domReady 2.0.1 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved. - * Available via the MIT or new BSD license. - * see: http://github.com/requirejs/domReady for details - */ -/*jslint */ -/*global require: false, define: false, requirejs: false, - window: false, clearInterval: false, document: false, - self: false, setInterval: false */ - - -define(function () { - 'use strict'; - - var isTop, testDiv, scrollIntervalId, - isBrowser = typeof window !== "undefined" && window.document, - isPageLoaded = !isBrowser, - doc = isBrowser ? document : null, - readyCalls = []; - - function runCallbacks(callbacks) { - var i; - for (i = 0; i < callbacks.length; i += 1) { - callbacks[i](doc); - } - } - - function callReady() { - var callbacks = readyCalls; - - if (isPageLoaded) { - //Call the DOM ready callbacks - if (callbacks.length) { - readyCalls = []; - runCallbacks(callbacks); - } - } - } - - /** - * Sets the page as loaded. - */ - function pageLoaded() { - if (!isPageLoaded) { - isPageLoaded = true; - if (scrollIntervalId) { - clearInterval(scrollIntervalId); - } - - callReady(); - } - } - - if (isBrowser) { - if (document.addEventListener) { - //Standards. Hooray! Assumption here that if standards based, - //it knows about DOMContentLoaded. - document.addEventListener("DOMContentLoaded", pageLoaded, false); - window.addEventListener("load", pageLoaded, false); - } else if (window.attachEvent) { - window.attachEvent("onload", pageLoaded); - - testDiv = document.createElement('div'); - try { - isTop = window.frameElement === null; - } catch (e) {} - - //DOMContentLoaded approximation that uses a doScroll, as found by - //Diego Perini: http://javascript.nwbox.com/IEContentLoaded/, - //but modified by other contributors, including jdalton - if (testDiv.doScroll && isTop && window.external) { - scrollIntervalId = setInterval(function () { - try { - testDiv.doScroll(); - pageLoaded(); - } catch (e) {} - }, 30); - } - } - - //Check if document already complete, and if so, just trigger page load - //listeners. Latest webkit browsers also use "interactive", and - //will fire the onDOMContentLoaded before "interactive" but not after - //entering "interactive" or "complete". More details: - //http://dev.w3.org/html5/spec/the-end.html#the-end - //http://stackoverflow.com/questions/3665561/document-readystate-of-interactive-vs-ondomcontentloaded - //Hmm, this is more complicated on further use, see "firing too early" - //bug: https://github.com/requirejs/domReady/issues/1 - //so removing the || document.readyState === "interactive" test. - //There is still a window.onload binding that should get fired if - //DOMContentLoaded is missed. - if (document.readyState === "complete") { - pageLoaded(); - } - } - - /** START OF PUBLIC API **/ - - /** - * Registers a callback for DOM ready. If DOM is already ready, the - * callback is called immediately. - * @param {Function} callback - */ - function domReady(callback) { - if (isPageLoaded) { - callback(doc); - } else { - readyCalls.push(callback); - } - return domReady; - } - - domReady.version = '2.0.1'; - - /** - * Loader Plugin API method - */ - domReady.load = function (name, req, onLoad, config) { - if (config.isBuild) { - onLoad(null); - } else { - domReady(onLoad); - } - }; - - /** END OF PUBLIC API **/ - - return domReady; -}); \ No newline at end of file diff --git a/example/lib/easeljs-0.8.2.min.js b/example/lib/easeljs-0.8.2.min.js new file mode 100644 index 0000000..8054fee --- /dev/null +++ b/example/lib/easeljs-0.8.2.min.js @@ -0,0 +1,14 @@ +/*! +* @license EaselJS +* Visit http://createjs.com/ for documentation, updates and examples. +* +* Copyright (c) 2011-2015 gskinner.com, inc. +* +* Distributed under the terms of the MIT license. +* http://www.opensource.org/licenses/mit-license.html +* +* This notice shall be included in all copies or substantial portions of the Software. +*/ +this.createjs=this.createjs||{},createjs.extend=function(a,b){"use strict";function c(){this.constructor=a}return c.prototype=b.prototype,a.prototype=new c},this.createjs=this.createjs||{},createjs.promote=function(a,b){"use strict";var c=a.prototype,d=Object.getPrototypeOf&&Object.getPrototypeOf(c)||c.__proto__;if(d){c[(b+="_")+"constructor"]=d.constructor;for(var e in d)c.hasOwnProperty(e)&&"function"==typeof d[e]&&(c[b+e]=d[e])}return a},this.createjs=this.createjs||{},createjs.indexOf=function(a,b){"use strict";for(var c=0,d=a.length;d>c;c++)if(b===a[c])return c;return-1},this.createjs=this.createjs||{},function(){"use strict";function a(a,b,c){this.type=a,this.target=null,this.currentTarget=null,this.eventPhase=0,this.bubbles=!!b,this.cancelable=!!c,this.timeStamp=(new Date).getTime(),this.defaultPrevented=!1,this.propagationStopped=!1,this.immediatePropagationStopped=!1,this.removed=!1}var b=a.prototype;b.preventDefault=function(){this.defaultPrevented=this.cancelable&&!0},b.stopPropagation=function(){this.propagationStopped=!0},b.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},b.remove=function(){this.removed=!0},b.clone=function(){return new a(this.type,this.bubbles,this.cancelable)},b.set=function(a){for(var b in a)this[b]=a[b];return this},b.toString=function(){return"[Event (type="+this.type+")]"},createjs.Event=a}(),this.createjs=this.createjs||{},function(){"use strict";function a(){this._listeners=null,this._captureListeners=null}var b=a.prototype;a.initialize=function(a){a.addEventListener=b.addEventListener,a.on=b.on,a.removeEventListener=a.off=b.removeEventListener,a.removeAllEventListeners=b.removeAllEventListeners,a.hasEventListener=b.hasEventListener,a.dispatchEvent=b.dispatchEvent,a._dispatchEvent=b._dispatchEvent,a.willTrigger=b.willTrigger},b.addEventListener=function(a,b,c){var d;d=c?this._captureListeners=this._captureListeners||{}:this._listeners=this._listeners||{};var e=d[a];return e&&this.removeEventListener(a,b,c),e=d[a],e?e.push(b):d[a]=[b],b},b.on=function(a,b,c,d,e,f){return b.handleEvent&&(c=c||b,b=b.handleEvent),c=c||this,this.addEventListener(a,function(a){b.call(c,a,e),d&&a.remove()},f)},b.removeEventListener=function(a,b,c){var d=c?this._captureListeners:this._listeners;if(d){var e=d[a];if(e)for(var f=0,g=e.length;g>f;f++)if(e[f]==b){1==g?delete d[a]:e.splice(f,1);break}}},b.off=b.removeEventListener,b.removeAllEventListeners=function(a){a?(this._listeners&&delete this._listeners[a],this._captureListeners&&delete this._captureListeners[a]):this._listeners=this._captureListeners=null},b.dispatchEvent=function(a,b,c){if("string"==typeof a){var d=this._listeners;if(!(b||d&&d[a]))return!0;a=new createjs.Event(a,b,c)}else a.target&&a.clone&&(a=a.clone());try{a.target=this}catch(e){}if(a.bubbles&&this.parent){for(var f=this,g=[f];f.parent;)g.push(f=f.parent);var h,i=g.length;for(h=i-1;h>=0&&!a.propagationStopped;h--)g[h]._dispatchEvent(a,1+(0==h));for(h=1;i>h&&!a.propagationStopped;h++)g[h]._dispatchEvent(a,3)}else this._dispatchEvent(a,2);return!a.defaultPrevented},b.hasEventListener=function(a){var b=this._listeners,c=this._captureListeners;return!!(b&&b[a]||c&&c[a])},b.willTrigger=function(a){for(var b=this;b;){if(b.hasEventListener(a))return!0;b=b.parent}return!1},b.toString=function(){return"[EventDispatcher]"},b._dispatchEvent=function(a,b){var c,d=1==b?this._captureListeners:this._listeners;if(a&&d){var e=d[a.type];if(!e||!(c=e.length))return;try{a.currentTarget=this}catch(f){}try{a.eventPhase=b}catch(f){}a.removed=!1,e=e.slice();for(var g=0;c>g&&!a.immediatePropagationStopped;g++){var h=e[g];h.handleEvent?h.handleEvent(a):h(a),a.removed&&(this.off(a.type,h,1==b),a.removed=!1)}}},createjs.EventDispatcher=a}(),this.createjs=this.createjs||{},function(){"use strict";function a(){throw"Ticker cannot be instantiated."}a.RAF_SYNCHED="synched",a.RAF="raf",a.TIMEOUT="timeout",a.useRAF=!1,a.timingMode=null,a.maxDelta=0,a.paused=!1,a.removeEventListener=null,a.removeAllEventListeners=null,a.dispatchEvent=null,a.hasEventListener=null,a._listeners=null,createjs.EventDispatcher.initialize(a),a._addEventListener=a.addEventListener,a.addEventListener=function(){return!a._inited&&a.init(),a._addEventListener.apply(a,arguments)},a._inited=!1,a._startTime=0,a._pausedTime=0,a._ticks=0,a._pausedTicks=0,a._interval=50,a._lastTime=0,a._times=null,a._tickTimes=null,a._timerId=null,a._raf=!0,a.setInterval=function(b){a._interval=b,a._inited&&a._setupTick()},a.getInterval=function(){return a._interval},a.setFPS=function(b){a.setInterval(1e3/b)},a.getFPS=function(){return 1e3/a._interval};try{Object.defineProperties(a,{interval:{get:a.getInterval,set:a.setInterval},framerate:{get:a.getFPS,set:a.setFPS}})}catch(b){console.log(b)}a.init=function(){a._inited||(a._inited=!0,a._times=[],a._tickTimes=[],a._startTime=a._getTime(),a._times.push(a._lastTime=0),a.interval=a._interval)},a.reset=function(){if(a._raf){var b=window.cancelAnimationFrame||window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||window.oCancelAnimationFrame||window.msCancelAnimationFrame;b&&b(a._timerId)}else clearTimeout(a._timerId);a.removeAllEventListeners("tick"),a._timerId=a._times=a._tickTimes=null,a._startTime=a._lastTime=a._ticks=0,a._inited=!1},a.getMeasuredTickTime=function(b){var c=0,d=a._tickTimes;if(!d||d.length<1)return-1;b=Math.min(d.length,b||0|a.getFPS());for(var e=0;b>e;e++)c+=d[e];return c/b},a.getMeasuredFPS=function(b){var c=a._times;return!c||c.length<2?-1:(b=Math.min(c.length-1,b||0|a.getFPS()),1e3/((c[0]-c[b])/b))},a.setPaused=function(b){a.paused=b},a.getPaused=function(){return a.paused},a.getTime=function(b){return a._startTime?a._getTime()-(b?a._pausedTime:0):-1},a.getEventTime=function(b){return a._startTime?(a._lastTime||a._startTime)-(b?a._pausedTime:0):-1},a.getTicks=function(b){return a._ticks-(b?a._pausedTicks:0)},a._handleSynch=function(){a._timerId=null,a._setupTick(),a._getTime()-a._lastTime>=.97*(a._interval-1)&&a._tick()},a._handleRAF=function(){a._timerId=null,a._setupTick(),a._tick()},a._handleTimeout=function(){a._timerId=null,a._setupTick(),a._tick()},a._setupTick=function(){if(null==a._timerId){var b=a.timingMode||a.useRAF&&a.RAF_SYNCHED;if(b==a.RAF_SYNCHED||b==a.RAF){var c=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame;if(c)return a._timerId=c(b==a.RAF?a._handleRAF:a._handleSynch),void(a._raf=!0)}a._raf=!1,a._timerId=setTimeout(a._handleTimeout,a._interval)}},a._tick=function(){var b=a.paused,c=a._getTime(),d=c-a._lastTime;if(a._lastTime=c,a._ticks++,b&&(a._pausedTicks++,a._pausedTime+=d),a.hasEventListener("tick")){var e=new createjs.Event("tick"),f=a.maxDelta;e.delta=f&&d>f?f:d,e.paused=b,e.time=c,e.runTime=c-a._pausedTime,a.dispatchEvent(e)}for(a._tickTimes.unshift(a._getTime()-c);a._tickTimes.length>100;)a._tickTimes.pop();for(a._times.unshift(c);a._times.length>100;)a._times.pop()};var c=window.performance&&(performance.now||performance.mozNow||performance.msNow||performance.oNow||performance.webkitNow);a._getTime=function(){return(c&&c.call(performance)||(new Date).getTime())-a._startTime},createjs.Ticker=a}(),this.createjs=this.createjs||{},function(){"use strict";function a(){throw"UID cannot be instantiated"}a._nextID=0,a.get=function(){return a._nextID++},createjs.UID=a}(),this.createjs=this.createjs||{},function(){"use strict";function a(a,b,c,d,e,f,g,h,i,j,k){this.Event_constructor(a,b,c),this.stageX=d,this.stageY=e,this.rawX=null==i?d:i,this.rawY=null==j?e:j,this.nativeEvent=f,this.pointerID=g,this.primary=!!h,this.relatedTarget=k}var b=createjs.extend(a,createjs.Event);b._get_localX=function(){return this.currentTarget.globalToLocal(this.rawX,this.rawY).x},b._get_localY=function(){return this.currentTarget.globalToLocal(this.rawX,this.rawY).y},b._get_isTouch=function(){return-1!==this.pointerID};try{Object.defineProperties(b,{localX:{get:b._get_localX},localY:{get:b._get_localY},isTouch:{get:b._get_isTouch}})}catch(c){}b.clone=function(){return new a(this.type,this.bubbles,this.cancelable,this.stageX,this.stageY,this.nativeEvent,this.pointerID,this.primary,this.rawX,this.rawY)},b.toString=function(){return"[MouseEvent (type="+this.type+" stageX="+this.stageX+" stageY="+this.stageY+")]"},createjs.MouseEvent=createjs.promote(a,"Event")}(),this.createjs=this.createjs||{},function(){"use strict";function a(a,b,c,d,e,f){this.setValues(a,b,c,d,e,f)}var b=a.prototype;a.DEG_TO_RAD=Math.PI/180,a.identity=null,b.setValues=function(a,b,c,d,e,f){return this.a=null==a?1:a,this.b=b||0,this.c=c||0,this.d=null==d?1:d,this.tx=e||0,this.ty=f||0,this},b.append=function(a,b,c,d,e,f){var g=this.a,h=this.b,i=this.c,j=this.d;return(1!=a||0!=b||0!=c||1!=d)&&(this.a=g*a+i*b,this.b=h*a+j*b,this.c=g*c+i*d,this.d=h*c+j*d),this.tx=g*e+i*f+this.tx,this.ty=h*e+j*f+this.ty,this},b.prepend=function(a,b,c,d,e,f){var g=this.a,h=this.c,i=this.tx;return this.a=a*g+c*this.b,this.b=b*g+d*this.b,this.c=a*h+c*this.d,this.d=b*h+d*this.d,this.tx=a*i+c*this.ty+e,this.ty=b*i+d*this.ty+f,this},b.appendMatrix=function(a){return this.append(a.a,a.b,a.c,a.d,a.tx,a.ty)},b.prependMatrix=function(a){return this.prepend(a.a,a.b,a.c,a.d,a.tx,a.ty)},b.appendTransform=function(b,c,d,e,f,g,h,i,j){if(f%360)var k=f*a.DEG_TO_RAD,l=Math.cos(k),m=Math.sin(k);else l=1,m=0;return g||h?(g*=a.DEG_TO_RAD,h*=a.DEG_TO_RAD,this.append(Math.cos(h),Math.sin(h),-Math.sin(g),Math.cos(g),b,c),this.append(l*d,m*d,-m*e,l*e,0,0)):this.append(l*d,m*d,-m*e,l*e,b,c),(i||j)&&(this.tx-=i*this.a+j*this.c,this.ty-=i*this.b+j*this.d),this},b.prependTransform=function(b,c,d,e,f,g,h,i,j){if(f%360)var k=f*a.DEG_TO_RAD,l=Math.cos(k),m=Math.sin(k);else l=1,m=0;return(i||j)&&(this.tx-=i,this.ty-=j),g||h?(g*=a.DEG_TO_RAD,h*=a.DEG_TO_RAD,this.prepend(l*d,m*d,-m*e,l*e,0,0),this.prepend(Math.cos(h),Math.sin(h),-Math.sin(g),Math.cos(g),b,c)):this.prepend(l*d,m*d,-m*e,l*e,b,c),this},b.rotate=function(b){b*=a.DEG_TO_RAD;var c=Math.cos(b),d=Math.sin(b),e=this.a,f=this.b;return this.a=e*c+this.c*d,this.b=f*c+this.d*d,this.c=-e*d+this.c*c,this.d=-f*d+this.d*c,this},b.skew=function(b,c){return b*=a.DEG_TO_RAD,c*=a.DEG_TO_RAD,this.append(Math.cos(c),Math.sin(c),-Math.sin(b),Math.cos(b),0,0),this},b.scale=function(a,b){return this.a*=a,this.b*=a,this.c*=b,this.d*=b,this},b.translate=function(a,b){return this.tx+=this.a*a+this.c*b,this.ty+=this.b*a+this.d*b,this},b.identity=function(){return this.a=this.d=1,this.b=this.c=this.tx=this.ty=0,this},b.invert=function(){var a=this.a,b=this.b,c=this.c,d=this.d,e=this.tx,f=a*d-b*c;return this.a=d/f,this.b=-b/f,this.c=-c/f,this.d=a/f,this.tx=(c*this.ty-d*e)/f,this.ty=-(a*this.ty-b*e)/f,this},b.isIdentity=function(){return 0===this.tx&&0===this.ty&&1===this.a&&0===this.b&&0===this.c&&1===this.d},b.equals=function(a){return this.tx===a.tx&&this.ty===a.ty&&this.a===a.a&&this.b===a.b&&this.c===a.c&&this.d===a.d},b.transformPoint=function(a,b,c){return c=c||{},c.x=a*this.a+b*this.c+this.tx,c.y=a*this.b+b*this.d+this.ty,c},b.decompose=function(b){null==b&&(b={}),b.x=this.tx,b.y=this.ty,b.scaleX=Math.sqrt(this.a*this.a+this.b*this.b),b.scaleY=Math.sqrt(this.c*this.c+this.d*this.d);var c=Math.atan2(-this.c,this.d),d=Math.atan2(this.b,this.a),e=Math.abs(1-c/d);return 1e-5>e?(b.rotation=d/a.DEG_TO_RAD,this.a<0&&this.d>=0&&(b.rotation+=b.rotation<=0?180:-180),b.skewX=b.skewY=0):(b.skewX=c/a.DEG_TO_RAD,b.skewY=d/a.DEG_TO_RAD),b},b.copy=function(a){return this.setValues(a.a,a.b,a.c,a.d,a.tx,a.ty)},b.clone=function(){return new a(this.a,this.b,this.c,this.d,this.tx,this.ty)},b.toString=function(){return"[Matrix2D (a="+this.a+" b="+this.b+" c="+this.c+" d="+this.d+" tx="+this.tx+" ty="+this.ty+")]"},a.identity=new a,createjs.Matrix2D=a}(),this.createjs=this.createjs||{},function(){"use strict";function a(a,b,c,d,e){this.setValues(a,b,c,d,e)}var b=a.prototype;b.setValues=function(a,b,c,d,e){return this.visible=null==a?!0:!!a,this.alpha=null==b?1:b,this.shadow=c,this.compositeOperation=d,this.matrix=e||this.matrix&&this.matrix.identity()||new createjs.Matrix2D,this},b.append=function(a,b,c,d,e){return this.alpha*=b,this.shadow=c||this.shadow,this.compositeOperation=d||this.compositeOperation,this.visible=this.visible&&a,e&&this.matrix.appendMatrix(e),this},b.prepend=function(a,b,c,d,e){return this.alpha*=b,this.shadow=this.shadow||c,this.compositeOperation=this.compositeOperation||d,this.visible=this.visible&&a,e&&this.matrix.prependMatrix(e),this},b.identity=function(){return this.visible=!0,this.alpha=1,this.shadow=this.compositeOperation=null,this.matrix.identity(),this},b.clone=function(){return new a(this.alpha,this.shadow,this.compositeOperation,this.visible,this.matrix.clone())},createjs.DisplayProps=a}(),this.createjs=this.createjs||{},function(){"use strict";function a(a,b){this.setValues(a,b)}var b=a.prototype;b.setValues=function(a,b){return this.x=a||0,this.y=b||0,this},b.copy=function(a){return this.x=a.x,this.y=a.y,this},b.clone=function(){return new a(this.x,this.y)},b.toString=function(){return"[Point (x="+this.x+" y="+this.y+")]"},createjs.Point=a}(),this.createjs=this.createjs||{},function(){"use strict";function a(a,b,c,d){this.setValues(a,b,c,d)}var b=a.prototype;b.setValues=function(a,b,c,d){return this.x=a||0,this.y=b||0,this.width=c||0,this.height=d||0,this},b.extend=function(a,b,c,d){return c=c||0,d=d||0,a+c>this.x+this.width&&(this.width=a+c-this.x),b+d>this.y+this.height&&(this.height=b+d-this.y),a=this.x&&a+c<=this.x+this.width&&b>=this.y&&b+d<=this.y+this.height},b.union=function(a){return this.clone().extend(a.x,a.y,a.width,a.height)},b.intersection=function(b){var c=b.x,d=b.y,e=c+b.width,f=d+b.height;return this.x>c&&(c=this.x),this.y>d&&(d=this.y),this.x+this.width=e||d>=f?null:new a(c,d,e-c,f-d)},b.intersects=function(a){return a.x<=this.x+this.width&&this.x<=a.x+a.width&&a.y<=this.y+this.height&&this.y<=a.y+a.height},b.isEmpty=function(){return this.width<=0||this.height<=0},b.clone=function(){return new a(this.x,this.y,this.width,this.height)},b.toString=function(){return"[Rectangle (x="+this.x+" y="+this.y+" width="+this.width+" height="+this.height+")]"},createjs.Rectangle=a}(),this.createjs=this.createjs||{},function(){"use strict";function a(a,b,c,d,e,f,g){a.addEventListener&&(this.target=a,this.overLabel=null==c?"over":c,this.outLabel=null==b?"out":b,this.downLabel=null==d?"down":d,this.play=e,this._isPressed=!1,this._isOver=!1,this._enabled=!1,a.mouseChildren=!1,this.enabled=!0,this.handleEvent({}),f&&(g&&(f.actionsEnabled=!1,f.gotoAndStop&&f.gotoAndStop(g)),a.hitArea=f))}var b=a.prototype;b.setEnabled=function(a){if(a!=this._enabled){var b=this.target;this._enabled=a,a?(b.cursor="pointer",b.addEventListener("rollover",this),b.addEventListener("rollout",this),b.addEventListener("mousedown",this),b.addEventListener("pressup",this),b._reset&&(b.__reset=b._reset,b._reset=this._reset)):(b.cursor=null,b.removeEventListener("rollover",this),b.removeEventListener("rollout",this),b.removeEventListener("mousedown",this),b.removeEventListener("pressup",this),b.__reset&&(b._reset=b.__reset,delete b.__reset))}},b.getEnabled=function(){return this._enabled};try{Object.defineProperties(b,{enabled:{get:b.getEnabled,set:b.setEnabled}})}catch(c){}b.toString=function(){return"[ButtonHelper]"},b.handleEvent=function(a){var b,c=this.target,d=a.type;"mousedown"==d?(this._isPressed=!0,b=this.downLabel):"pressup"==d?(this._isPressed=!1,b=this._isOver?this.overLabel:this.outLabel):"rollover"==d?(this._isOver=!0,b=this._isPressed?this.downLabel:this.overLabel):(this._isOver=!1,b=this._isPressed?this.overLabel:this.outLabel),this.play?c.gotoAndPlay&&c.gotoAndPlay(b):c.gotoAndStop&&c.gotoAndStop(b)},b._reset=function(){var a=this.paused;this.__reset(),this.paused=a},createjs.ButtonHelper=a}(),this.createjs=this.createjs||{},function(){"use strict";function a(a,b,c,d){this.color=a||"black",this.offsetX=b||0,this.offsetY=c||0,this.blur=d||0}var b=a.prototype;a.identity=new a("transparent",0,0,0),b.toString=function(){return"[Shadow]"},b.clone=function(){return new a(this.color,this.offsetX,this.offsetY,this.blur)},createjs.Shadow=a}(),this.createjs=this.createjs||{},function(){"use strict";function a(a){this.EventDispatcher_constructor(),this.complete=!0,this.framerate=0,this._animations=null,this._frames=null,this._images=null,this._data=null,this._loadCount=0,this._frameHeight=0,this._frameWidth=0,this._numFrames=0,this._regX=0,this._regY=0,this._spacing=0,this._margin=0,this._parseData(a)}var b=createjs.extend(a,createjs.EventDispatcher);b.getAnimations=function(){return this._animations.slice()};try{Object.defineProperties(b,{animations:{get:b.getAnimations}})}catch(c){}b.getNumFrames=function(a){if(null==a)return this._frames?this._frames.length:this._numFrames||0;var b=this._data[a];return null==b?0:b.frames.length},b.getAnimation=function(a){return this._data[a]},b.getFrame=function(a){var b;return this._frames&&(b=this._frames[a])?b:null},b.getFrameBounds=function(a,b){var c=this.getFrame(a);return c?(b||new createjs.Rectangle).setValues(-c.regX,-c.regY,c.rect.width,c.rect.height):null},b.toString=function(){return"[SpriteSheet]"},b.clone=function(){throw"SpriteSheet cannot be cloned."},b._parseData=function(a){var b,c,d,e;if(null!=a){if(this.framerate=a.framerate||0,a.images&&(c=a.images.length)>0)for(e=this._images=[],b=0;c>b;b++){var f=a.images[b];if("string"==typeof f){var g=f;f=document.createElement("img"),f.src=g}e.push(f),f.getContext||f.naturalWidth||(this._loadCount++,this.complete=!1,function(a,b){f.onload=function(){a._handleImageLoad(b)}}(this,g),function(a,b){f.onerror=function(){a._handleImageError(b)}}(this,g))}if(null==a.frames);else if(Array.isArray(a.frames))for(this._frames=[],e=a.frames,b=0,c=e.length;c>b;b++){var h=e[b];this._frames.push({image:this._images[h[4]?h[4]:0],rect:new createjs.Rectangle(h[0],h[1],h[2],h[3]),regX:h[5]||0,regY:h[6]||0})}else d=a.frames,this._frameWidth=d.width,this._frameHeight=d.height,this._regX=d.regX||0,this._regY=d.regY||0,this._spacing=d.spacing||0,this._margin=d.margin||0,this._numFrames=d.count,0==this._loadCount&&this._calculateFrames();if(this._animations=[],null!=(d=a.animations)){this._data={};var i;for(i in d){var j={name:i},k=d[i];if("number"==typeof k)e=j.frames=[k];else if(Array.isArray(k))if(1==k.length)j.frames=[k[0]];else for(j.speed=k[3],j.next=k[2],e=j.frames=[],b=k[0];b<=k[1];b++)e.push(b);else{j.speed=k.speed,j.next=k.next;var l=k.frames;e=j.frames="number"==typeof l?[l]:l.slice(0)}(j.next===!0||void 0===j.next)&&(j.next=i),(j.next===!1||e.length<2&&j.next==i)&&(j.next=null),j.speed||(j.speed=1),this._animations.push(i),this._data[i]=j}}}},b._handleImageLoad=function(){0==--this._loadCount&&(this._calculateFrames(),this.complete=!0,this.dispatchEvent("complete"))},b._handleImageError=function(a){var b=new createjs.Event("error");b.src=a,this.dispatchEvent(b),0==--this._loadCount&&this.dispatchEvent("complete")},b._calculateFrames=function(){if(!this._frames&&0!=this._frameWidth){this._frames=[];var a=this._numFrames||1e5,b=0,c=this._frameWidth,d=this._frameHeight,e=this._spacing,f=this._margin;a:for(var g=0,h=this._images;g=l;){for(var m=f;j-f-c>=m;){if(b>=a)break a;b++,this._frames.push({image:i,rect:new createjs.Rectangle(m,l,c,d),regX:this._regX,regY:this._regY}),m+=c+e}l+=d+e}this._numFrames=b}},createjs.SpriteSheet=createjs.promote(a,"EventDispatcher")}(),this.createjs=this.createjs||{},function(){"use strict";function a(){this.command=null,this._stroke=null,this._strokeStyle=null,this._oldStrokeStyle=null,this._strokeDash=null,this._oldStrokeDash=null,this._strokeIgnoreScale=!1,this._fill=null,this._instructions=[],this._commitIndex=0,this._activeInstructions=[],this._dirty=!1,this._storeIndex=0,this.clear()}var b=a.prototype,c=a;a.getRGB=function(a,b,c,d){return null!=a&&null==c&&(d=b,c=255&a,b=a>>8&255,a=a>>16&255),null==d?"rgb("+a+","+b+","+c+")":"rgba("+a+","+b+","+c+","+d+")"},a.getHSL=function(a,b,c,d){return null==d?"hsl("+a%360+","+b+"%,"+c+"%)":"hsla("+a%360+","+b+"%,"+c+"%,"+d+")"},a.BASE_64={A:0,B:1,C:2,D:3,E:4,F:5,G:6,H:7,I:8,J:9,K:10,L:11,M:12,N:13,O:14,P:15,Q:16,R:17,S:18,T:19,U:20,V:21,W:22,X:23,Y:24,Z:25,a:26,b:27,c:28,d:29,e:30,f:31,g:32,h:33,i:34,j:35,k:36,l:37,m:38,n:39,o:40,p:41,q:42,r:43,s:44,t:45,u:46,v:47,w:48,x:49,y:50,z:51,0:52,1:53,2:54,3:55,4:56,5:57,6:58,7:59,8:60,9:61,"+":62,"/":63},a.STROKE_CAPS_MAP=["butt","round","square"],a.STROKE_JOINTS_MAP=["miter","round","bevel"];var d=createjs.createCanvas?createjs.createCanvas():document.createElement("canvas");d.getContext&&(a._ctx=d.getContext("2d"),d.width=d.height=1),b.getInstructions=function(){return this._updateInstructions(),this._instructions};try{Object.defineProperties(b,{instructions:{get:b.getInstructions}})}catch(e){}b.isEmpty=function(){return!(this._instructions.length||this._activeInstructions.length)},b.draw=function(a,b){this._updateInstructions();for(var c=this._instructions,d=this._storeIndex,e=c.length;e>d;d++)c[d].exec(a,b)},b.drawAsPath=function(a){this._updateInstructions();for(var b,c=this._instructions,d=this._storeIndex,e=c.length;e>d;d++)(b=c[d]).path!==!1&&b.exec(a)},b.moveTo=function(a,b){return this.append(new c.MoveTo(a,b),!0)},b.lineTo=function(a,b){return this.append(new c.LineTo(a,b))},b.arcTo=function(a,b,d,e,f){return this.append(new c.ArcTo(a,b,d,e,f))},b.arc=function(a,b,d,e,f,g){return this.append(new c.Arc(a,b,d,e,f,g))},b.quadraticCurveTo=function(a,b,d,e){return this.append(new c.QuadraticCurveTo(a,b,d,e))},b.bezierCurveTo=function(a,b,d,e,f,g){return this.append(new c.BezierCurveTo(a,b,d,e,f,g))},b.rect=function(a,b,d,e){return this.append(new c.Rect(a,b,d,e))},b.closePath=function(){return this._activeInstructions.length?this.append(new c.ClosePath):this},b.clear=function(){return this._instructions.length=this._activeInstructions.length=this._commitIndex=0,this._strokeStyle=this._oldStrokeStyle=this._stroke=this._fill=this._strokeDash=this._oldStrokeDash=null,this._dirty=this._strokeIgnoreScale=!1,this},b.beginFill=function(a){return this._setFill(a?new c.Fill(a):null)},b.beginLinearGradientFill=function(a,b,d,e,f,g){return this._setFill((new c.Fill).linearGradient(a,b,d,e,f,g))},b.beginRadialGradientFill=function(a,b,d,e,f,g,h,i){return this._setFill((new c.Fill).radialGradient(a,b,d,e,f,g,h,i))},b.beginBitmapFill=function(a,b,d){return this._setFill(new c.Fill(null,d).bitmap(a,b))},b.endFill=function(){return this.beginFill()},b.setStrokeStyle=function(a,b,d,e,f){return this._updateInstructions(!0),this._strokeStyle=this.command=new c.StrokeStyle(a,b,d,e,f),this._stroke&&(this._stroke.ignoreScale=f),this._strokeIgnoreScale=f,this},b.setStrokeDash=function(a,b){return this._updateInstructions(!0),this._strokeDash=this.command=new c.StrokeDash(a,b),this},b.beginStroke=function(a){return this._setStroke(a?new c.Stroke(a):null)},b.beginLinearGradientStroke=function(a,b,d,e,f,g){return this._setStroke((new c.Stroke).linearGradient(a,b,d,e,f,g))},b.beginRadialGradientStroke=function(a,b,d,e,f,g,h,i){return this._setStroke((new c.Stroke).radialGradient(a,b,d,e,f,g,h,i))},b.beginBitmapStroke=function(a,b){return this._setStroke((new c.Stroke).bitmap(a,b))},b.endStroke=function(){return this.beginStroke()},b.curveTo=b.quadraticCurveTo,b.drawRect=b.rect,b.drawRoundRect=function(a,b,c,d,e){return this.drawRoundRectComplex(a,b,c,d,e,e,e,e)},b.drawRoundRectComplex=function(a,b,d,e,f,g,h,i){return this.append(new c.RoundRect(a,b,d,e,f,g,h,i))},b.drawCircle=function(a,b,d){return this.append(new c.Circle(a,b,d))},b.drawEllipse=function(a,b,d,e){return this.append(new c.Ellipse(a,b,d,e))},b.drawPolyStar=function(a,b,d,e,f,g){return this.append(new c.PolyStar(a,b,d,e,f,g))},b.append=function(a,b){return this._activeInstructions.push(a),this.command=a,b||(this._dirty=!0),this},b.decodePath=function(b){for(var c=[this.moveTo,this.lineTo,this.quadraticCurveTo,this.bezierCurveTo,this.closePath],d=[2,2,4,6,0],e=0,f=b.length,g=[],h=0,i=0,j=a.BASE_64;f>e;){var k=b.charAt(e),l=j[k],m=l>>3,n=c[m];if(!n||3&l)throw"bad path data (@"+e+"): "+k;var o=d[m];m||(h=i=0),g.length=0,e++;for(var p=(l>>2&1)+2,q=0;o>q;q++){var r=j[b.charAt(e)],s=r>>5?-1:1;r=(31&r)<<6|j[b.charAt(e+1)],3==p&&(r=r<<6|j[b.charAt(e+2)]),r=s*r/10,q%2?h=r+=h:i=r+=i,g[q]=r,e+=p}n.apply(this,g)}return this},b.store=function(){return this._updateInstructions(!0),this._storeIndex=this._instructions.length,this},b.unstore=function(){return this._storeIndex=0,this},b.clone=function(){var b=new a;return b.command=this.command,b._stroke=this._stroke,b._strokeStyle=this._strokeStyle,b._strokeDash=this._strokeDash,b._strokeIgnoreScale=this._strokeIgnoreScale,b._fill=this._fill,b._instructions=this._instructions.slice(),b._commitIndex=this._commitIndex,b._activeInstructions=this._activeInstructions.slice(),b._dirty=this._dirty,b._storeIndex=this._storeIndex,b},b.toString=function(){return"[Graphics]"},b.mt=b.moveTo,b.lt=b.lineTo,b.at=b.arcTo,b.bt=b.bezierCurveTo,b.qt=b.quadraticCurveTo,b.a=b.arc,b.r=b.rect,b.cp=b.closePath,b.c=b.clear,b.f=b.beginFill,b.lf=b.beginLinearGradientFill,b.rf=b.beginRadialGradientFill,b.bf=b.beginBitmapFill,b.ef=b.endFill,b.ss=b.setStrokeStyle,b.sd=b.setStrokeDash,b.s=b.beginStroke,b.ls=b.beginLinearGradientStroke,b.rs=b.beginRadialGradientStroke,b.bs=b.beginBitmapStroke,b.es=b.endStroke,b.dr=b.drawRect,b.rr=b.drawRoundRect,b.rc=b.drawRoundRectComplex,b.dc=b.drawCircle,b.de=b.drawEllipse,b.dp=b.drawPolyStar,b.p=b.decodePath,b._updateInstructions=function(b){var c=this._instructions,d=this._activeInstructions,e=this._commitIndex;if(this._dirty&&d.length){c.length=e,c.push(a.beginCmd);var f=d.length,g=c.length;c.length=g+f;for(var h=0;f>h;h++)c[h+g]=d[h];this._fill&&c.push(this._fill),this._stroke&&(this._strokeDash!==this._oldStrokeDash&&(this._oldStrokeDash=this._strokeDash,c.push(this._strokeDash)),this._strokeStyle!==this._oldStrokeStyle&&(this._oldStrokeStyle=this._strokeStyle,c.push(this._strokeStyle)),c.push(this._stroke)),this._dirty=!1}b&&(d.length=0,this._commitIndex=c.length)},b._setFill=function(a){return this._updateInstructions(!0),this.command=this._fill=a,this},b._setStroke=function(a){return this._updateInstructions(!0),(this.command=this._stroke=a)&&(a.ignoreScale=this._strokeIgnoreScale),this},(c.LineTo=function(a,b){this.x=a,this.y=b}).prototype.exec=function(a){a.lineTo(this.x,this.y)},(c.MoveTo=function(a,b){this.x=a,this.y=b}).prototype.exec=function(a){a.moveTo(this.x,this.y)},(c.ArcTo=function(a,b,c,d,e){this.x1=a,this.y1=b,this.x2=c,this.y2=d,this.radius=e}).prototype.exec=function(a){a.arcTo(this.x1,this.y1,this.x2,this.y2,this.radius)},(c.Arc=function(a,b,c,d,e,f){this.x=a,this.y=b,this.radius=c,this.startAngle=d,this.endAngle=e,this.anticlockwise=!!f}).prototype.exec=function(a){a.arc(this.x,this.y,this.radius,this.startAngle,this.endAngle,this.anticlockwise)},(c.QuadraticCurveTo=function(a,b,c,d){this.cpx=a,this.cpy=b,this.x=c,this.y=d}).prototype.exec=function(a){a.quadraticCurveTo(this.cpx,this.cpy,this.x,this.y)},(c.BezierCurveTo=function(a,b,c,d,e,f){this.cp1x=a,this.cp1y=b,this.cp2x=c,this.cp2y=d,this.x=e,this.y=f}).prototype.exec=function(a){a.bezierCurveTo(this.cp1x,this.cp1y,this.cp2x,this.cp2y,this.x,this.y)},(c.Rect=function(a,b,c,d){this.x=a,this.y=b,this.w=c,this.h=d}).prototype.exec=function(a){a.rect(this.x,this.y,this.w,this.h)},(c.ClosePath=function(){}).prototype.exec=function(a){a.closePath()},(c.BeginPath=function(){}).prototype.exec=function(a){a.beginPath()},b=(c.Fill=function(a,b){this.style=a,this.matrix=b}).prototype,b.exec=function(a){if(this.style){a.fillStyle=this.style;var b=this.matrix;b&&(a.save(),a.transform(b.a,b.b,b.c,b.d,b.tx,b.ty)),a.fill(),b&&a.restore()}},b.linearGradient=function(b,c,d,e,f,g){for(var h=this.style=a._ctx.createLinearGradient(d,e,f,g),i=0,j=b.length;j>i;i++)h.addColorStop(c[i],b[i]);return h.props={colors:b,ratios:c,x0:d,y0:e,x1:f,y1:g,type:"linear"},this},b.radialGradient=function(b,c,d,e,f,g,h,i){for(var j=this.style=a._ctx.createRadialGradient(d,e,f,g,h,i),k=0,l=b.length;l>k;k++)j.addColorStop(c[k],b[k]);return j.props={colors:b,ratios:c,x0:d,y0:e,r0:f,x1:g,y1:h,r1:i,type:"radial"},this},b.bitmap=function(b,c){if(b.naturalWidth||b.getContext||b.readyState>=2){var d=this.style=a._ctx.createPattern(b,c||"");d.props={image:b,repetition:c,type:"bitmap"}}return this},b.path=!1,b=(c.Stroke=function(a,b){this.style=a,this.ignoreScale=b}).prototype,b.exec=function(a){this.style&&(a.strokeStyle=this.style,this.ignoreScale&&(a.save(),a.setTransform(1,0,0,1,0,0)),a.stroke(),this.ignoreScale&&a.restore())},b.linearGradient=c.Fill.prototype.linearGradient,b.radialGradient=c.Fill.prototype.radialGradient,b.bitmap=c.Fill.prototype.bitmap,b.path=!1,b=(c.StrokeStyle=function(a,b,c,d,e){this.width=a,this.caps=b,this.joints=c,this.miterLimit=d,this.ignoreScale=e}).prototype,b.exec=function(b){b.lineWidth=null==this.width?"1":this.width,b.lineCap=null==this.caps?"butt":isNaN(this.caps)?this.caps:a.STROKE_CAPS_MAP[this.caps],b.lineJoin=null==this.joints?"miter":isNaN(this.joints)?this.joints:a.STROKE_JOINTS_MAP[this.joints],b.miterLimit=null==this.miterLimit?"10":this.miterLimit,b.ignoreScale=null==this.ignoreScale?!1:this.ignoreScale},b.path=!1,(c.StrokeDash=function(a,b){this.segments=a,this.offset=b||0}).prototype.exec=function(a){a.setLineDash&&(a.setLineDash(this.segments||c.StrokeDash.EMPTY_SEGMENTS),a.lineDashOffset=this.offset||0)},c.StrokeDash.EMPTY_SEGMENTS=[],(c.RoundRect=function(a,b,c,d,e,f,g,h){this.x=a,this.y=b,this.w=c,this.h=d,this.radiusTL=e,this.radiusTR=f,this.radiusBR=g,this.radiusBL=h}).prototype.exec=function(a){var b=(j>i?i:j)/2,c=0,d=0,e=0,f=0,g=this.x,h=this.y,i=this.w,j=this.h,k=this.radiusTL,l=this.radiusTR,m=this.radiusBR,n=this.radiusBL;0>k&&(k*=c=-1),k>b&&(k=b),0>l&&(l*=d=-1),l>b&&(l=b),0>m&&(m*=e=-1),m>b&&(m=b),0>n&&(n*=f=-1),n>b&&(n=b),a.moveTo(g+i-l,h),a.arcTo(g+i+l*d,h-l*d,g+i,h+l,l),a.lineTo(g+i,h+j-m),a.arcTo(g+i+m*e,h+j+m*e,g+i-m,h+j,m),a.lineTo(g+n,h+j),a.arcTo(g-n*f,h+j+n*f,g,h+j-n,n),a.lineTo(g,h+k),a.arcTo(g-k*c,h-k*c,g+k,h,k),a.closePath()},(c.Circle=function(a,b,c){this.x=a,this.y=b,this.radius=c}).prototype.exec=function(a){a.arc(this.x,this.y,this.radius,0,2*Math.PI)},(c.Ellipse=function(a,b,c,d){this.x=a,this.y=b,this.w=c,this.h=d}).prototype.exec=function(a){var b=this.x,c=this.y,d=this.w,e=this.h,f=.5522848,g=d/2*f,h=e/2*f,i=b+d,j=c+e,k=b+d/2,l=c+e/2;a.moveTo(b,l),a.bezierCurveTo(b,l-h,k-g,c,k,c),a.bezierCurveTo(k+g,c,i,l-h,i,l),a.bezierCurveTo(i,l+h,k+g,j,k,j),a.bezierCurveTo(k-g,j,b,l+h,b,l)},(c.PolyStar=function(a,b,c,d,e,f){this.x=a,this.y=b,this.radius=c,this.sides=d,this.pointSize=e,this.angle=f}).prototype.exec=function(a){var b=this.x,c=this.y,d=this.radius,e=(this.angle||0)/180*Math.PI,f=this.sides,g=1-(this.pointSize||0),h=Math.PI/f;a.moveTo(b+Math.cos(e)*d,c+Math.sin(e)*d);for(var i=0;f>i;i++)e+=h,1!=g&&a.lineTo(b+Math.cos(e)*d*g,c+Math.sin(e)*d*g),e+=h,a.lineTo(b+Math.cos(e)*d,c+Math.sin(e)*d);a.closePath()},a.beginCmd=new c.BeginPath,createjs.Graphics=a}(),this.createjs=this.createjs||{},function(){"use strict";function a(){this.EventDispatcher_constructor(),this.alpha=1,this.cacheCanvas=null,this.cacheID=0,this.id=createjs.UID.get(),this.mouseEnabled=!0,this.tickEnabled=!0,this.name=null,this.parent=null,this.regX=0,this.regY=0,this.rotation=0,this.scaleX=1,this.scaleY=1,this.skewX=0,this.skewY=0,this.shadow=null,this.visible=!0,this.x=0,this.y=0,this.transformMatrix=null,this.compositeOperation=null,this.snapToPixel=!0,this.filters=null,this.mask=null,this.hitArea=null,this.cursor=null,this._cacheOffsetX=0,this._cacheOffsetY=0,this._filterOffsetX=0,this._filterOffsetY=0,this._cacheScale=1,this._cacheDataURLID=0,this._cacheDataURL=null,this._props=new createjs.DisplayProps,this._rectangle=new createjs.Rectangle,this._bounds=null +}var b=createjs.extend(a,createjs.EventDispatcher);a._MOUSE_EVENTS=["click","dblclick","mousedown","mouseout","mouseover","pressmove","pressup","rollout","rollover"],a.suppressCrossDomainErrors=!1,a._snapToPixelEnabled=!1;var c=createjs.createCanvas?createjs.createCanvas():document.createElement("canvas");c.getContext&&(a._hitTestCanvas=c,a._hitTestContext=c.getContext("2d"),c.width=c.height=1),a._nextCacheID=1,b.getStage=function(){for(var a=this,b=createjs.Stage;a.parent;)a=a.parent;return a instanceof b?a:null};try{Object.defineProperties(b,{stage:{get:b.getStage}})}catch(d){}b.isVisible=function(){return!!(this.visible&&this.alpha>0&&0!=this.scaleX&&0!=this.scaleY)},b.draw=function(a,b){var c=this.cacheCanvas;if(b||!c)return!1;var d=this._cacheScale;return a.drawImage(c,this._cacheOffsetX+this._filterOffsetX,this._cacheOffsetY+this._filterOffsetY,c.width/d,c.height/d),!0},b.updateContext=function(b){var c=this,d=c.mask,e=c._props.matrix;d&&d.graphics&&!d.graphics.isEmpty()&&(d.getMatrix(e),b.transform(e.a,e.b,e.c,e.d,e.tx,e.ty),d.graphics.drawAsPath(b),b.clip(),e.invert(),b.transform(e.a,e.b,e.c,e.d,e.tx,e.ty)),this.getMatrix(e);var f=e.tx,g=e.ty;a._snapToPixelEnabled&&c.snapToPixel&&(f=f+(0>f?-.5:.5)|0,g=g+(0>g?-.5:.5)|0),b.transform(e.a,e.b,e.c,e.d,f,g),b.globalAlpha*=c.alpha,c.compositeOperation&&(b.globalCompositeOperation=c.compositeOperation),c.shadow&&this._applyShadow(b,c.shadow)},b.cache=function(a,b,c,d,e){e=e||1,this.cacheCanvas||(this.cacheCanvas=createjs.createCanvas?createjs.createCanvas():document.createElement("canvas")),this._cacheWidth=c,this._cacheHeight=d,this._cacheOffsetX=a,this._cacheOffsetY=b,this._cacheScale=e,this.updateCache()},b.updateCache=function(b){var c=this.cacheCanvas;if(!c)throw"cache() must be called before updateCache()";var d=this._cacheScale,e=this._cacheOffsetX*d,f=this._cacheOffsetY*d,g=this._cacheWidth,h=this._cacheHeight,i=c.getContext("2d"),j=this._getFilterBounds();e+=this._filterOffsetX=j.x,f+=this._filterOffsetY=j.y,g=Math.ceil(g*d)+j.width,h=Math.ceil(h*d)+j.height,g!=c.width||h!=c.height?(c.width=g,c.height=h):b||i.clearRect(0,0,g+1,h+1),i.save(),i.globalCompositeOperation=b,i.setTransform(d,0,0,d,-e,-f),this.draw(i,!0),this._applyFilters(),i.restore(),this.cacheID=a._nextCacheID++},b.uncache=function(){this._cacheDataURL=this.cacheCanvas=null,this.cacheID=this._cacheOffsetX=this._cacheOffsetY=this._filterOffsetX=this._filterOffsetY=0,this._cacheScale=1},b.getCacheDataURL=function(){return this.cacheCanvas?(this.cacheID!=this._cacheDataURLID&&(this._cacheDataURL=this.cacheCanvas.toDataURL()),this._cacheDataURL):null},b.localToGlobal=function(a,b,c){return this.getConcatenatedMatrix(this._props.matrix).transformPoint(a,b,c||new createjs.Point)},b.globalToLocal=function(a,b,c){return this.getConcatenatedMatrix(this._props.matrix).invert().transformPoint(a,b,c||new createjs.Point)},b.localToLocal=function(a,b,c,d){return d=this.localToGlobal(a,b,d),c.globalToLocal(d.x,d.y,d)},b.setTransform=function(a,b,c,d,e,f,g,h,i){return this.x=a||0,this.y=b||0,this.scaleX=null==c?1:c,this.scaleY=null==d?1:d,this.rotation=e||0,this.skewX=f||0,this.skewY=g||0,this.regX=h||0,this.regY=i||0,this},b.getMatrix=function(a){var b=this,c=a&&a.identity()||new createjs.Matrix2D;return b.transformMatrix?c.copy(b.transformMatrix):c.appendTransform(b.x,b.y,b.scaleX,b.scaleY,b.rotation,b.skewX,b.skewY,b.regX,b.regY)},b.getConcatenatedMatrix=function(a){for(var b=this,c=this.getMatrix(a);b=b.parent;)c.prependMatrix(b.getMatrix(b._props.matrix));return c},b.getConcatenatedDisplayProps=function(a){a=a?a.identity():new createjs.DisplayProps;var b=this,c=b.getMatrix(a.matrix);do a.prepend(b.visible,b.alpha,b.shadow,b.compositeOperation),b!=this&&c.prependMatrix(b.getMatrix(b._props.matrix));while(b=b.parent);return a},b.hitTest=function(b,c){var d=a._hitTestContext;d.setTransform(1,0,0,1,-b,-c),this.draw(d);var e=this._testHit(d);return d.setTransform(1,0,0,1,0,0),d.clearRect(0,0,2,2),e},b.set=function(a){for(var b in a)this[b]=a[b];return this},b.getBounds=function(){if(this._bounds)return this._rectangle.copy(this._bounds);var a=this.cacheCanvas;if(a){var b=this._cacheScale;return this._rectangle.setValues(this._cacheOffsetX,this._cacheOffsetY,a.width/b,a.height/b)}return null},b.getTransformedBounds=function(){return this._getBounds()},b.setBounds=function(a,b,c,d){null==a&&(this._bounds=a),this._bounds=(this._bounds||new createjs.Rectangle).setValues(a,b,c,d)},b.clone=function(){return this._cloneProps(new a)},b.toString=function(){return"[DisplayObject (name="+this.name+")]"},b._cloneProps=function(a){return a.alpha=this.alpha,a.mouseEnabled=this.mouseEnabled,a.tickEnabled=this.tickEnabled,a.name=this.name,a.regX=this.regX,a.regY=this.regY,a.rotation=this.rotation,a.scaleX=this.scaleX,a.scaleY=this.scaleY,a.shadow=this.shadow,a.skewX=this.skewX,a.skewY=this.skewY,a.visible=this.visible,a.x=this.x,a.y=this.y,a.compositeOperation=this.compositeOperation,a.snapToPixel=this.snapToPixel,a.filters=null==this.filters?null:this.filters.slice(0),a.mask=this.mask,a.hitArea=this.hitArea,a.cursor=this.cursor,a._bounds=this._bounds,a},b._applyShadow=function(a,b){b=b||Shadow.identity,a.shadowColor=b.color,a.shadowOffsetX=b.offsetX,a.shadowOffsetY=b.offsetY,a.shadowBlur=b.blur},b._tick=function(a){var b=this._listeners;b&&b.tick&&(a.target=null,a.propagationStopped=a.immediatePropagationStopped=!1,this.dispatchEvent(a))},b._testHit=function(b){try{var c=b.getImageData(0,0,1,1).data[3]>1}catch(d){if(!a.suppressCrossDomainErrors)throw"An error has occurred. This is most likely due to security restrictions on reading canvas pixel data with local or cross-domain images."}return c},b._applyFilters=function(){if(this.filters&&0!=this.filters.length&&this.cacheCanvas)for(var a=this.filters.length,b=this.cacheCanvas.getContext("2d"),c=this.cacheCanvas.width,d=this.cacheCanvas.height,e=0;a>e;e++)this.filters[e].applyFilter(b,0,0,c,d)},b._getFilterBounds=function(){var a,b=this.filters,c=this._rectangle.setValues(0,0,0,0);if(!b||!(a=b.length))return c;for(var d=0;a>d;d++){var e=this.filters[d];e.getBounds&&e.getBounds(c)}return c},b._getBounds=function(a,b){return this._transformBounds(this.getBounds(),a,b)},b._transformBounds=function(a,b,c){if(!a)return a;var d=a.x,e=a.y,f=a.width,g=a.height,h=this._props.matrix;h=c?h.identity():this.getMatrix(h),(d||e)&&h.appendTransform(0,0,1,1,0,0,0,-d,-e),b&&h.prependMatrix(b);var i=f*h.a,j=f*h.b,k=g*h.c,l=g*h.d,m=h.tx,n=h.ty,o=m,p=m,q=n,r=n;return(d=i+m)p&&(p=d),(d=i+k+m)p&&(p=d),(d=k+m)p&&(p=d),(e=j+n)r&&(r=e),(e=j+l+n)r&&(r=e),(e=l+n)r&&(r=e),a.setValues(o,q,p-o,r-q)},b._hasMouseEventListener=function(){for(var b=a._MOUSE_EVENTS,c=0,d=b.length;d>c;c++)if(this.hasEventListener(b[c]))return!0;return!!this.cursor},createjs.DisplayObject=createjs.promote(a,"EventDispatcher")}(),this.createjs=this.createjs||{},function(){"use strict";function a(){this.DisplayObject_constructor(),this.children=[],this.mouseChildren=!0,this.tickChildren=!0}var b=createjs.extend(a,createjs.DisplayObject);b.getNumChildren=function(){return this.children.length};try{Object.defineProperties(b,{numChildren:{get:b.getNumChildren}})}catch(c){}b.initialize=a,b.isVisible=function(){var a=this.cacheCanvas||this.children.length;return!!(this.visible&&this.alpha>0&&0!=this.scaleX&&0!=this.scaleY&&a)},b.draw=function(a,b){if(this.DisplayObject_draw(a,b))return!0;for(var c=this.children.slice(),d=0,e=c.length;e>d;d++){var f=c[d];f.isVisible()&&(a.save(),f.updateContext(a),f.draw(a),a.restore())}return!0},b.addChild=function(a){if(null==a)return a;var b=arguments.length;if(b>1){for(var c=0;b>c;c++)this.addChild(arguments[c]);return arguments[b-1]}return a.parent&&a.parent.removeChild(a),a.parent=this,this.children.push(a),a.dispatchEvent("added"),a},b.addChildAt=function(a,b){var c=arguments.length,d=arguments[c-1];if(0>d||d>this.children.length)return arguments[c-2];if(c>2){for(var e=0;c-1>e;e++)this.addChildAt(arguments[e],d+e);return arguments[c-2]}return a.parent&&a.parent.removeChild(a),a.parent=this,this.children.splice(b,0,a),a.dispatchEvent("added"),a},b.removeChild=function(a){var b=arguments.length;if(b>1){for(var c=!0,d=0;b>d;d++)c=c&&this.removeChild(arguments[d]);return c}return this.removeChildAt(createjs.indexOf(this.children,a))},b.removeChildAt=function(a){var b=arguments.length;if(b>1){for(var c=[],d=0;b>d;d++)c[d]=arguments[d];c.sort(function(a,b){return b-a});for(var e=!0,d=0;b>d;d++)e=e&&this.removeChildAt(c[d]);return e}if(0>a||a>this.children.length-1)return!1;var f=this.children[a];return f&&(f.parent=null),this.children.splice(a,1),f.dispatchEvent("removed"),!0},b.removeAllChildren=function(){for(var a=this.children;a.length;)this.removeChildAt(0)},b.getChildAt=function(a){return this.children[a]},b.getChildByName=function(a){for(var b=this.children,c=0,d=b.length;d>c;c++)if(b[c].name==a)return b[c];return null},b.sortChildren=function(a){this.children.sort(a)},b.getChildIndex=function(a){return createjs.indexOf(this.children,a)},b.swapChildrenAt=function(a,b){var c=this.children,d=c[a],e=c[b];d&&e&&(c[a]=e,c[b]=d)},b.swapChildren=function(a,b){for(var c,d,e=this.children,f=0,g=e.length;g>f&&(e[f]==a&&(c=f),e[f]==b&&(d=f),null==c||null==d);f++);f!=g&&(e[c]=b,e[d]=a)},b.setChildIndex=function(a,b){var c=this.children,d=c.length;if(!(a.parent!=this||0>b||b>=d)){for(var e=0;d>e&&c[e]!=a;e++);e!=d&&e!=b&&(c.splice(e,1),c.splice(b,0,a))}},b.contains=function(a){for(;a;){if(a==this)return!0;a=a.parent}return!1},b.hitTest=function(a,b){return null!=this.getObjectUnderPoint(a,b)},b.getObjectsUnderPoint=function(a,b,c){var d=[],e=this.localToGlobal(a,b);return this._getObjectsUnderPoint(e.x,e.y,d,c>0,1==c),d},b.getObjectUnderPoint=function(a,b,c){var d=this.localToGlobal(a,b);return this._getObjectsUnderPoint(d.x,d.y,null,c>0,1==c)},b.getBounds=function(){return this._getBounds(null,!0)},b.getTransformedBounds=function(){return this._getBounds()},b.clone=function(b){var c=this._cloneProps(new a);return b&&this._cloneChildren(c),c},b.toString=function(){return"[Container (name="+this.name+")]"},b._tick=function(a){if(this.tickChildren)for(var b=this.children.length-1;b>=0;b--){var c=this.children[b];c.tickEnabled&&c._tick&&c._tick(a)}this.DisplayObject__tick(a)},b._cloneChildren=function(a){a.children.length&&a.removeAllChildren();for(var b=a.children,c=0,d=this.children.length;d>c;c++){var e=this.children[c].clone(!0);e.parent=a,b.push(e)}},b._getObjectsUnderPoint=function(b,c,d,e,f,g){if(g=g||0,!g&&!this._testMask(this,b,c))return null;var h,i=createjs.DisplayObject._hitTestContext;f=f||e&&this._hasMouseEventListener();for(var j=this.children,k=j.length,l=k-1;l>=0;l--){var m=j[l],n=m.hitArea;if(m.visible&&(n||m.isVisible())&&(!e||m.mouseEnabled)&&(n||this._testMask(m,b,c)))if(!n&&m instanceof a){var o=m._getObjectsUnderPoint(b,c,d,e,f,g+1);if(!d&&o)return e&&!this.mouseChildren?this:o}else{if(e&&!f&&!m._hasMouseEventListener())continue;var p=m.getConcatenatedDisplayProps(m._props);if(h=p.matrix,n&&(h.appendMatrix(n.getMatrix(n._props.matrix)),p.alpha=n.alpha),i.globalAlpha=p.alpha,i.setTransform(h.a,h.b,h.c,h.d,h.tx-b,h.ty-c),(n||m).draw(i),!this._testHit(i))continue;if(i.setTransform(1,0,0,1,0,0),i.clearRect(0,0,2,2),!d)return e&&!this.mouseChildren?this:m;d.push(m)}}return null},b._testMask=function(a,b,c){var d=a.mask;if(!d||!d.graphics||d.graphics.isEmpty())return!0;var e=this._props.matrix,f=a.parent;e=f?f.getConcatenatedMatrix(e):e.identity(),e=d.getMatrix(d._props.matrix).prependMatrix(e);var g=createjs.DisplayObject._hitTestContext;return g.setTransform(e.a,e.b,e.c,e.d,e.tx-b,e.ty-c),d.graphics.drawAsPath(g),g.fillStyle="#000",g.fill(),this._testHit(g)?(g.setTransform(1,0,0,1,0,0),g.clearRect(0,0,2,2),!0):!1},b._getBounds=function(a,b){var c=this.DisplayObject_getBounds();if(c)return this._transformBounds(c,a,b);var d=this._props.matrix;d=b?d.identity():this.getMatrix(d),a&&d.prependMatrix(a);for(var e=this.children.length,f=null,g=0;e>g;g++){var h=this.children[g];h.visible&&(c=h._getBounds(d))&&(f?f.extend(c.x,c.y,c.width,c.height):f=c.clone())}return f},createjs.Container=createjs.promote(a,"DisplayObject")}(),this.createjs=this.createjs||{},function(){"use strict";function a(a){this.Container_constructor(),this.autoClear=!0,this.canvas="string"==typeof a?document.getElementById(a):a,this.mouseX=0,this.mouseY=0,this.drawRect=null,this.snapToPixelEnabled=!1,this.mouseInBounds=!1,this.tickOnUpdate=!0,this.mouseMoveOutside=!1,this.preventSelection=!0,this._pointerData={},this._pointerCount=0,this._primaryPointerID=null,this._mouseOverIntervalID=null,this._nextStage=null,this._prevStage=null,this.enableDOMEvents(!0)}var b=createjs.extend(a,createjs.Container);b._get_nextStage=function(){return this._nextStage},b._set_nextStage=function(a){this._nextStage&&(this._nextStage._prevStage=null),a&&(a._prevStage=this),this._nextStage=a};try{Object.defineProperties(b,{nextStage:{get:b._get_nextStage,set:b._set_nextStage}})}catch(c){}b.update=function(a){if(this.canvas&&(this.tickOnUpdate&&this.tick(a),this.dispatchEvent("drawstart",!1,!0)!==!1)){createjs.DisplayObject._snapToPixelEnabled=this.snapToPixelEnabled;var b=this.drawRect,c=this.canvas.getContext("2d");c.setTransform(1,0,0,1,0,0),this.autoClear&&(b?c.clearRect(b.x,b.y,b.width,b.height):c.clearRect(0,0,this.canvas.width+1,this.canvas.height+1)),c.save(),this.drawRect&&(c.beginPath(),c.rect(b.x,b.y,b.width,b.height),c.clip()),this.updateContext(c),this.draw(c,!1),c.restore(),this.dispatchEvent("drawend")}},b.tick=function(a){if(this.tickEnabled&&this.dispatchEvent("tickstart",!1,!0)!==!1){var b=new createjs.Event("tick");if(a)for(var c in a)a.hasOwnProperty(c)&&(b[c]=a[c]);this._tick(b),this.dispatchEvent("tickend")}},b.handleEvent=function(a){"tick"==a.type&&this.update(a)},b.clear=function(){if(this.canvas){var a=this.canvas.getContext("2d");a.setTransform(1,0,0,1,0,0),a.clearRect(0,0,this.canvas.width+1,this.canvas.height+1)}},b.toDataURL=function(a,b){var c,d=this.canvas.getContext("2d"),e=this.canvas.width,f=this.canvas.height;if(a){c=d.getImageData(0,0,e,f);var g=d.globalCompositeOperation;d.globalCompositeOperation="destination-over",d.fillStyle=a,d.fillRect(0,0,e,f)}var h=this.canvas.toDataURL(b||"image/png");return a&&(d.putImageData(c,0,0),d.globalCompositeOperation=g),h},b.enableMouseOver=function(a){if(this._mouseOverIntervalID&&(clearInterval(this._mouseOverIntervalID),this._mouseOverIntervalID=null,0==a&&this._testMouseOver(!0)),null==a)a=20;else if(0>=a)return;var b=this;this._mouseOverIntervalID=setInterval(function(){b._testMouseOver()},1e3/Math.min(50,a))},b.enableDOMEvents=function(a){null==a&&(a=!0);var b,c,d=this._eventListeners;if(!a&&d){for(b in d)c=d[b],c.t.removeEventListener(b,c.f,!1);this._eventListeners=null}else if(a&&!d&&this.canvas){var e=window.addEventListener?window:document,f=this;d=this._eventListeners={},d.mouseup={t:e,f:function(a){f._handleMouseUp(a)}},d.mousemove={t:e,f:function(a){f._handleMouseMove(a)}},d.dblclick={t:this.canvas,f:function(a){f._handleDoubleClick(a)}},d.mousedown={t:this.canvas,f:function(a){f._handleMouseDown(a)}};for(b in d)c=d[b],c.t.addEventListener(b,c.f,!1)}},b.clone=function(){throw"Stage cannot be cloned."},b.toString=function(){return"[Stage (name="+this.name+")]"},b._getElementRect=function(a){var b;try{b=a.getBoundingClientRect()}catch(c){b={top:a.offsetTop,left:a.offsetLeft,width:a.offsetWidth,height:a.offsetHeight}}var d=(window.pageXOffset||document.scrollLeft||0)-(document.clientLeft||document.body.clientLeft||0),e=(window.pageYOffset||document.scrollTop||0)-(document.clientTop||document.body.clientTop||0),f=window.getComputedStyle?getComputedStyle(a,null):a.currentStyle,g=parseInt(f.paddingLeft)+parseInt(f.borderLeftWidth),h=parseInt(f.paddingTop)+parseInt(f.borderTopWidth),i=parseInt(f.paddingRight)+parseInt(f.borderRightWidth),j=parseInt(f.paddingBottom)+parseInt(f.borderBottomWidth);return{left:b.left+d+g,right:b.right+d-i,top:b.top+e+h,bottom:b.bottom+e-j}},b._getPointerData=function(a){var b=this._pointerData[a];return b||(b=this._pointerData[a]={x:0,y:0}),b},b._handleMouseMove=function(a){a||(a=window.event),this._handlePointerMove(-1,a,a.pageX,a.pageY)},b._handlePointerMove=function(a,b,c,d,e){if((!this._prevStage||void 0!==e)&&this.canvas){var f=this._nextStage,g=this._getPointerData(a),h=g.inBounds;this._updatePointerPosition(a,b,c,d),(h||g.inBounds||this.mouseMoveOutside)&&(-1===a&&g.inBounds==!h&&this._dispatchMouseEvent(this,h?"mouseleave":"mouseenter",!1,a,g,b),this._dispatchMouseEvent(this,"stagemousemove",!1,a,g,b),this._dispatchMouseEvent(g.target,"pressmove",!0,a,g,b)),f&&f._handlePointerMove(a,b,c,d,null)}},b._updatePointerPosition=function(a,b,c,d){var e=this._getElementRect(this.canvas);c-=e.left,d-=e.top;var f=this.canvas.width,g=this.canvas.height;c/=(e.right-e.left)/f,d/=(e.bottom-e.top)/g;var h=this._getPointerData(a);(h.inBounds=c>=0&&d>=0&&f-1>=c&&g-1>=d)?(h.x=c,h.y=d):this.mouseMoveOutside&&(h.x=0>c?0:c>f-1?f-1:c,h.y=0>d?0:d>g-1?g-1:d),h.posEvtObj=b,h.rawX=c,h.rawY=d,(a===this._primaryPointerID||-1===a)&&(this.mouseX=h.x,this.mouseY=h.y,this.mouseInBounds=h.inBounds)},b._handleMouseUp=function(a){this._handlePointerUp(-1,a,!1)},b._handlePointerUp=function(a,b,c,d){var e=this._nextStage,f=this._getPointerData(a);if(!this._prevStage||void 0!==d){var g=null,h=f.target;d||!h&&!e||(g=this._getObjectsUnderPoint(f.x,f.y,null,!0)),f.down&&(this._dispatchMouseEvent(this,"stagemouseup",!1,a,f,b,g),f.down=!1),g==h&&this._dispatchMouseEvent(h,"click",!0,a,f,b),this._dispatchMouseEvent(h,"pressup",!0,a,f,b),c?(a==this._primaryPointerID&&(this._primaryPointerID=null),delete this._pointerData[a]):f.target=null,e&&e._handlePointerUp(a,b,c,d||g&&this)}},b._handleMouseDown=function(a){this._handlePointerDown(-1,a,a.pageX,a.pageY)},b._handlePointerDown=function(a,b,c,d,e){this.preventSelection&&b.preventDefault(),(null==this._primaryPointerID||-1===a)&&(this._primaryPointerID=a),null!=d&&this._updatePointerPosition(a,b,c,d);var f=null,g=this._nextStage,h=this._getPointerData(a);e||(f=h.target=this._getObjectsUnderPoint(h.x,h.y,null,!0)),h.inBounds&&(this._dispatchMouseEvent(this,"stagemousedown",!1,a,h,b,f),h.down=!0),this._dispatchMouseEvent(f,"mousedown",!0,a,h,b),g&&g._handlePointerDown(a,b,c,d,e||f&&this)},b._testMouseOver=function(a,b,c){if(!this._prevStage||void 0!==b){var d=this._nextStage;if(!this._mouseOverIntervalID)return void(d&&d._testMouseOver(a,b,c));var e=this._getPointerData(-1);if(e&&(a||this.mouseX!=this._mouseOverX||this.mouseY!=this._mouseOverY||!this.mouseInBounds)){var f,g,h,i=e.posEvtObj,j=c||i&&i.target==this.canvas,k=null,l=-1,m="";!b&&(a||this.mouseInBounds&&j)&&(k=this._getObjectsUnderPoint(this.mouseX,this.mouseY,null,!0),this._mouseOverX=this.mouseX,this._mouseOverY=this.mouseY);var n=this._mouseOverTarget||[],o=n[n.length-1],p=this._mouseOverTarget=[];for(f=k;f;)p.unshift(f),m||(m=f.cursor),f=f.parent;for(this.canvas.style.cursor=m,!b&&c&&(c.canvas.style.cursor=m),g=0,h=p.length;h>g&&p[g]==n[g];g++)l=g;for(o!=k&&this._dispatchMouseEvent(o,"mouseout",!0,-1,e,i,k),g=n.length-1;g>l;g--)this._dispatchMouseEvent(n[g],"rollout",!1,-1,e,i,k);for(g=p.length-1;g>l;g--)this._dispatchMouseEvent(p[g],"rollover",!1,-1,e,i,o);o!=k&&this._dispatchMouseEvent(k,"mouseover",!0,-1,e,i,o),d&&d._testMouseOver(a,b||k&&this,c||j&&this)}}},b._handleDoubleClick=function(a,b){var c=null,d=this._nextStage,e=this._getPointerData(-1);b||(c=this._getObjectsUnderPoint(e.x,e.y,null,!0),this._dispatchMouseEvent(c,"dblclick",!0,-1,e,a)),d&&d._handleDoubleClick(a,b||c&&this)},b._dispatchMouseEvent=function(a,b,c,d,e,f,g){if(a&&(c||a.hasEventListener(b))){var h=new createjs.MouseEvent(b,c,!1,e.x,e.y,f,d,d===this._primaryPointerID||-1===d,e.rawX,e.rawY,g);a.dispatchEvent(h)}},createjs.Stage=createjs.promote(a,"Container")}(),this.createjs=this.createjs||{},function(){function a(a){this.DisplayObject_constructor(),"string"==typeof a?(this.image=document.createElement("img"),this.image.src=a):this.image=a,this.sourceRect=null}var b=createjs.extend(a,createjs.DisplayObject);b.initialize=a,b.isVisible=function(){var a=this.image,b=this.cacheCanvas||a&&(a.naturalWidth||a.getContext||a.readyState>=2);return!!(this.visible&&this.alpha>0&&0!=this.scaleX&&0!=this.scaleY&&b)},b.draw=function(a,b){if(this.DisplayObject_draw(a,b)||!this.image)return!0;var c=this.image,d=this.sourceRect;if(d){var e=d.x,f=d.y,g=e+d.width,h=f+d.height,i=0,j=0,k=c.width,l=c.height;0>e&&(i-=e,e=0),g>k&&(g=k),0>f&&(j-=f,f=0),h>l&&(h=l),a.drawImage(c,e,f,g-e,h-f,i,j,g-e,h-f)}else a.drawImage(c,0,0);return!0},b.getBounds=function(){var a=this.DisplayObject_getBounds();if(a)return a;var b=this.image,c=this.sourceRect||b,d=b&&(b.naturalWidth||b.getContext||b.readyState>=2);return d?this._rectangle.setValues(0,0,c.width,c.height):null},b.clone=function(){var b=new a(this.image);return this.sourceRect&&(b.sourceRect=this.sourceRect.clone()),this._cloneProps(b),b},b.toString=function(){return"[Bitmap (name="+this.name+")]"},createjs.Bitmap=createjs.promote(a,"DisplayObject")}(),this.createjs=this.createjs||{},function(){"use strict";function a(a,b){this.DisplayObject_constructor(),this.currentFrame=0,this.currentAnimation=null,this.paused=!0,this.spriteSheet=a,this.currentAnimationFrame=0,this.framerate=0,this._animation=null,this._currentFrame=null,this._skipAdvance=!1,null!=b&&this.gotoAndPlay(b)}var b=createjs.extend(a,createjs.DisplayObject);b.initialize=a,b.isVisible=function(){var a=this.cacheCanvas||this.spriteSheet.complete;return!!(this.visible&&this.alpha>0&&0!=this.scaleX&&0!=this.scaleY&&a)},b.draw=function(a,b){if(this.DisplayObject_draw(a,b))return!0;this._normalizeFrame();var c=this.spriteSheet.getFrame(0|this._currentFrame);if(!c)return!1;var d=c.rect;return d.width&&d.height&&a.drawImage(c.image,d.x,d.y,d.width,d.height,-c.regX,-c.regY,d.width,d.height),!0},b.play=function(){this.paused=!1},b.stop=function(){this.paused=!0},b.gotoAndPlay=function(a){this.paused=!1,this._skipAdvance=!0,this._goto(a)},b.gotoAndStop=function(a){this.paused=!0,this._goto(a)},b.advance=function(a){var b=this.framerate||this.spriteSheet.framerate,c=b&&null!=a?a/(1e3/b):1;this._normalizeFrame(c)},b.getBounds=function(){return this.DisplayObject_getBounds()||this.spriteSheet.getFrameBounds(this.currentFrame,this._rectangle)},b.clone=function(){return this._cloneProps(new a(this.spriteSheet))},b.toString=function(){return"[Sprite (name="+this.name+")]"},b._cloneProps=function(a){return this.DisplayObject__cloneProps(a),a.currentFrame=this.currentFrame,a.currentAnimation=this.currentAnimation,a.paused=this.paused,a.currentAnimationFrame=this.currentAnimationFrame,a.framerate=this.framerate,a._animation=this._animation,a._currentFrame=this._currentFrame,a._skipAdvance=this._skipAdvance,a},b._tick=function(a){this.paused||(this._skipAdvance||this.advance(a&&a.delta),this._skipAdvance=!1),this.DisplayObject__tick(a)},b._normalizeFrame=function(a){a=a||0;var b,c=this._animation,d=this.paused,e=this._currentFrame;if(c){var f=c.speed||1,g=this.currentAnimationFrame;if(b=c.frames.length,g+a*f>=b){var h=c.next;if(this._dispatchAnimationEnd(c,e,d,h,b-1))return;if(h)return this._goto(h,a-(b-g)/f);this.paused=!0,g=c.frames.length-1}else g+=a*f;this.currentAnimationFrame=g,this._currentFrame=c.frames[0|g]}else if(e=this._currentFrame+=a,b=this.spriteSheet.getNumFrames(),e>=b&&b>0&&!this._dispatchAnimationEnd(c,e,d,b-1)&&(this._currentFrame-=b)>=b)return this._normalizeFrame();e=0|this._currentFrame,this.currentFrame!=e&&(this.currentFrame=e,this.dispatchEvent("change"))},b._dispatchAnimationEnd=function(a,b,c,d,e){var f=a?a.name:null;if(this.hasEventListener("animationend")){var g=new createjs.Event("animationend");g.name=f,g.next=d,this.dispatchEvent(g)}var h=this._animation!=a||this._currentFrame!=b;return h||c||!this.paused||(this.currentAnimationFrame=e,h=!0),h},b._goto=function(a,b){if(this.currentAnimationFrame=0,isNaN(a)){var c=this.spriteSheet.getAnimation(a);c&&(this._animation=c,this.currentAnimation=a,this._normalizeFrame(b))}else this.currentAnimation=this._animation=null,this._currentFrame=a,this._normalizeFrame()},createjs.Sprite=createjs.promote(a,"DisplayObject")}(),this.createjs=this.createjs||{},function(){"use strict";function a(a){this.DisplayObject_constructor(),this.graphics=a?a:new createjs.Graphics}var b=createjs.extend(a,createjs.DisplayObject);b.isVisible=function(){var a=this.cacheCanvas||this.graphics&&!this.graphics.isEmpty();return!!(this.visible&&this.alpha>0&&0!=this.scaleX&&0!=this.scaleY&&a)},b.draw=function(a,b){return this.DisplayObject_draw(a,b)?!0:(this.graphics.draw(a,this),!0)},b.clone=function(b){var c=b&&this.graphics?this.graphics.clone():this.graphics;return this._cloneProps(new a(c))},b.toString=function(){return"[Shape (name="+this.name+")]"},createjs.Shape=createjs.promote(a,"DisplayObject")}(),this.createjs=this.createjs||{},function(){"use strict";function a(a,b,c){this.DisplayObject_constructor(),this.text=a,this.font=b,this.color=c,this.textAlign="left",this.textBaseline="top",this.maxWidth=null,this.outline=0,this.lineHeight=0,this.lineWidth=null}var b=createjs.extend(a,createjs.DisplayObject),c=createjs.createCanvas?createjs.createCanvas():document.createElement("canvas");c.getContext&&(a._workingContext=c.getContext("2d"),c.width=c.height=1),a.H_OFFSETS={start:0,left:0,center:-.5,end:-1,right:-1},a.V_OFFSETS={top:0,hanging:-.01,middle:-.4,alphabetic:-.8,ideographic:-.85,bottom:-1},b.isVisible=function(){var a=this.cacheCanvas||null!=this.text&&""!==this.text;return!!(this.visible&&this.alpha>0&&0!=this.scaleX&&0!=this.scaleY&&a)},b.draw=function(a,b){if(this.DisplayObject_draw(a,b))return!0;var c=this.color||"#000";return this.outline?(a.strokeStyle=c,a.lineWidth=1*this.outline):a.fillStyle=c,this._drawText(this._prepContext(a)),!0},b.getMeasuredWidth=function(){return this._getMeasuredWidth(this.text)},b.getMeasuredLineHeight=function(){return 1.2*this._getMeasuredWidth("M")},b.getMeasuredHeight=function(){return this._drawText(null,{}).height},b.getBounds=function(){var b=this.DisplayObject_getBounds();if(b)return b;if(null==this.text||""===this.text)return null;var c=this._drawText(null,{}),d=this.maxWidth&&this.maxWidthj;j++){var l=i[j],m=null;if(null!=this.lineWidth&&(m=b.measureText(l).width)>this.lineWidth){var n=l.split(/(\s)/);l=n[0],m=b.measureText(l).width;for(var o=1,p=n.length;p>o;o+=2){var q=b.measureText(n[o]+n[o+1]).width;m+q>this.lineWidth?(e&&this._drawTextLine(b,l,h*f),d&&d.push(l),m>g&&(g=m),l=n[o+1],m=b.measureText(l).width,h++):(l+=n[o]+n[o+1],m+=q)}}e&&this._drawTextLine(b,l,h*f),d&&d.push(l),c&&null==m&&(m=b.measureText(l).width),m>g&&(g=m),h++}return c&&(c.width=g,c.height=h*f),e||b.restore(),c},b._drawTextLine=function(a,b,c){this.outline?a.strokeText(b,0,c,this.maxWidth||65535):a.fillText(b,0,c,this.maxWidth||65535)},b._getMeasuredWidth=function(b){var c=a._workingContext;c.save();var d=this._prepContext(c).measureText(b).width;return c.restore(),d},createjs.Text=createjs.promote(a,"DisplayObject")}(),this.createjs=this.createjs||{},function(){"use strict";function a(a,b){this.Container_constructor(),this.text=a||"",this.spriteSheet=b,this.lineHeight=0,this.letterSpacing=0,this.spaceWidth=0,this._oldProps={text:0,spriteSheet:0,lineHeight:0,letterSpacing:0,spaceWidth:0}}var b=createjs.extend(a,createjs.Container);a.maxPoolSize=100,a._spritePool=[],b.draw=function(a,b){this.DisplayObject_draw(a,b)||(this._updateText(),this.Container_draw(a,b))},b.getBounds=function(){return this._updateText(),this.Container_getBounds()},b.isVisible=function(){var a=this.cacheCanvas||this.spriteSheet&&this.spriteSheet.complete&&this.text;return!!(this.visible&&this.alpha>0&&0!==this.scaleX&&0!==this.scaleY&&a)},b.clone=function(){return this._cloneProps(new a(this.text,this.spriteSheet))},b.addChild=b.addChildAt=b.removeChild=b.removeChildAt=b.removeAllChildren=function(){},b._cloneProps=function(a){return this.Container__cloneProps(a),a.lineHeight=this.lineHeight,a.letterSpacing=this.letterSpacing,a.spaceWidth=this.spaceWidth,a},b._getFrameIndex=function(a,b){var c,d=b.getAnimation(a);return d||(a!=(c=a.toUpperCase())||a!=(c=a.toLowerCase())||(c=null),c&&(d=b.getAnimation(c))),d&&d.frames[0]},b._getFrame=function(a,b){var c=this._getFrameIndex(a,b);return null==c?c:b.getFrame(c)},b._getLineHeight=function(a){var b=this._getFrame("1",a)||this._getFrame("T",a)||this._getFrame("L",a)||a.getFrame(0);return b?b.rect.height:1},b._getSpaceWidth=function(a){var b=this._getFrame("1",a)||this._getFrame("l",a)||this._getFrame("e",a)||this._getFrame("a",a)||a.getFrame(0);return b?b.rect.width:1},b._updateText=function(){var b,c=0,d=0,e=this._oldProps,f=!1,g=this.spaceWidth,h=this.lineHeight,i=this.spriteSheet,j=a._spritePool,k=this.children,l=0,m=k.length;for(var n in e)e[n]!=this[n]&&(e[n]=this[n],f=!0);if(f){var o=!!this._getFrame(" ",i);o||g||(g=this._getSpaceWidth(i)),h||(h=this._getLineHeight(i));for(var p=0,q=this.text.length;q>p;p++){var r=this.text.charAt(p);if(" "!=r||o)if("\n"!=r&&"\r"!=r){var s=this._getFrameIndex(r,i);null!=s&&(m>l?b=k[l]:(k.push(b=j.length?j.pop():new createjs.Sprite),b.parent=this,m++),b.spriteSheet=i,b.gotoAndStop(s),b.x=c,b.y=d,l++,c+=b.getBounds().width+this.letterSpacing)}else"\r"==r&&"\n"==this.text.charAt(p+1)&&p++,c=0,d+=h;else c+=g}for(;m>l;)j.push(b=k.pop()),b.parent=null,m--;j.length>a.maxPoolSize&&(j.length=a.maxPoolSize)}},createjs.BitmapText=createjs.promote(a,"Container")}(),this.createjs=this.createjs||{},function(){"use strict";function a(b,c,d,e){this.Container_constructor(),!a.inited&&a.init(),this.mode=b||a.INDEPENDENT,this.startPosition=c||0,this.loop=d,this.currentFrame=0,this.timeline=new createjs.Timeline(null,e,{paused:!0,position:c,useTicks:!0}),this.paused=!1,this.actionsEnabled=!0,this.autoReset=!0,this.frameBounds=this.frameBounds||null,this.framerate=null,this._synchOffset=0,this._prevPos=-1,this._prevPosition=0,this._t=0,this._managed={}}function b(){throw"MovieClipPlugin cannot be instantiated."}var c=createjs.extend(a,createjs.Container);a.INDEPENDENT="independent",a.SINGLE_FRAME="single",a.SYNCHED="synched",a.inited=!1,a.init=function(){a.inited||(b.install(),a.inited=!0)},c.getLabels=function(){return this.timeline.getLabels()},c.getCurrentLabel=function(){return this._updateTimeline(),this.timeline.getCurrentLabel()},c.getDuration=function(){return this.timeline.duration};try{Object.defineProperties(c,{labels:{get:c.getLabels},currentLabel:{get:c.getCurrentLabel},totalFrames:{get:c.getDuration},duration:{get:c.getDuration}})}catch(d){}c.initialize=a,c.isVisible=function(){return!!(this.visible&&this.alpha>0&&0!=this.scaleX&&0!=this.scaleY)},c.draw=function(a,b){return this.DisplayObject_draw(a,b)?!0:(this._updateTimeline(),this.Container_draw(a,b),!0) +},c.play=function(){this.paused=!1},c.stop=function(){this.paused=!0},c.gotoAndPlay=function(a){this.paused=!1,this._goto(a)},c.gotoAndStop=function(a){this.paused=!0,this._goto(a)},c.advance=function(b){var c=a.INDEPENDENT;if(this.mode==c){for(var d=this,e=d.framerate;(d=d.parent)&&null==e;)d.mode==c&&(e=d._framerate);this._framerate=e;var f=null!=e&&-1!=e&&null!=b?b/(1e3/e)+this._t:1,g=0|f;for(this._t=f-g;!this.paused&&g--;)this._prevPosition=this._prevPos<0?0:this._prevPosition+1,this._updateTimeline()}},c.clone=function(){throw"MovieClip cannot be cloned."},c.toString=function(){return"[MovieClip (name="+this.name+")]"},c._tick=function(a){this.advance(a&&a.delta),this.Container__tick(a)},c._goto=function(a){var b=this.timeline.resolve(a);null!=b&&(-1==this._prevPos&&(this._prevPos=0/0),this._prevPosition=b,this._t=0,this._updateTimeline())},c._reset=function(){this._prevPos=-1,this._t=this.currentFrame=0,this.paused=!1},c._updateTimeline=function(){var b=this.timeline,c=this.mode!=a.INDEPENDENT;b.loop=null==this.loop?!0:this.loop;var d=c?this.startPosition+(this.mode==a.SINGLE_FRAME?0:this._synchOffset):this._prevPos<0?0:this._prevPosition,e=c||!this.actionsEnabled?createjs.Tween.NONE:null;if(this.currentFrame=b._calcPosition(d),b.setPosition(d,e),this._prevPosition=b._prevPosition,this._prevPos!=b._prevPos){this.currentFrame=this._prevPos=b._prevPos;for(var f in this._managed)this._managed[f]=1;for(var g=b._tweens,h=0,i=g.length;i>h;h++){var j=g[h],k=j._target;if(k!=this&&!j.passive){var l=j._stepPosition;k instanceof createjs.DisplayObject?this._addManagedChild(k,l):this._setState(k.state,l)}}var m=this.children;for(h=m.length-1;h>=0;h--){var n=m[h].id;1==this._managed[n]&&(this.removeChildAt(h),delete this._managed[n])}}},c._setState=function(a,b){if(a)for(var c=a.length-1;c>=0;c--){var d=a[c],e=d.t,f=d.p;for(var g in f)e[g]=f[g];this._addManagedChild(e,b)}},c._addManagedChild=function(b,c){b._off||(this.addChildAt(b,0),b instanceof a&&(b._synchOffset=c,b.mode==a.INDEPENDENT&&b.autoReset&&!this._managed[b.id]&&b._reset()),this._managed[b.id]=2)},c._getBounds=function(a,b){var c=this.DisplayObject_getBounds();return c||(this._updateTimeline(),this.frameBounds&&(c=this._rectangle.copy(this.frameBounds[this.currentFrame]))),c?this._transformBounds(c,a,b):this.Container__getBounds(a,b)},createjs.MovieClip=createjs.promote(a,"Container"),b.priority=100,b.install=function(){createjs.Tween.installPlugin(b,["startPosition"])},b.init=function(a,b,c){return c},b.step=function(){},b.tween=function(b,c,d,e,f,g){return b.target instanceof a?1==g?f[c]:e[c]:d}}(),this.createjs=this.createjs||{},function(){"use strict";function a(){throw"SpriteSheetUtils cannot be instantiated"}var b=createjs.createCanvas?createjs.createCanvas():document.createElement("canvas");b.getContext&&(a._workingCanvas=b,a._workingContext=b.getContext("2d"),b.width=b.height=1),a.addFlippedFrames=function(b,c,d,e){if(c||d||e){var f=0;c&&a._flip(b,++f,!0,!1),d&&a._flip(b,++f,!1,!0),e&&a._flip(b,++f,!0,!0)}},a.extractFrame=function(b,c){isNaN(c)&&(c=b.getAnimation(c).frames[0]);var d=b.getFrame(c);if(!d)return null;var e=d.rect,f=a._workingCanvas;f.width=e.width,f.height=e.height,a._workingContext.drawImage(d.image,e.x,e.y,e.width,e.height,0,0,e.width,e.height);var g=document.createElement("img");return g.src=f.toDataURL("image/png"),g},a.mergeAlpha=function(a,b,c){c||(c=createjs.createCanvas?createjs.createCanvas():document.createElement("canvas")),c.width=Math.max(b.width,a.width),c.height=Math.max(b.height,a.height);var d=c.getContext("2d");return d.save(),d.drawImage(a,0,0),d.globalCompositeOperation="destination-in",d.drawImage(b,0,0),d.restore(),c},a._flip=function(b,c,d,e){for(var f=b._images,g=a._workingCanvas,h=a._workingContext,i=f.length/c,j=0;i>j;j++){var k=f[j];k.__tmp=j,h.setTransform(1,0,0,1,0,0),h.clearRect(0,0,g.width+1,g.height+1),g.width=k.width,g.height=k.height,h.setTransform(d?-1:1,0,0,e?-1:1,d?k.width:0,e?k.height:0),h.drawImage(k,0,0);var l=document.createElement("img");l.src=g.toDataURL("image/png"),l.width=k.width,l.height=k.height,f.push(l)}var m=b._frames,n=m.length/c;for(j=0;n>j;j++){k=m[j];var o=k.rect.clone();l=f[k.image.__tmp+i*c];var p={image:l,rect:o,regX:k.regX,regY:k.regY};d&&(o.x=l.width-o.x-o.width,p.regX=o.width-k.regX),e&&(o.y=l.height-o.y-o.height,p.regY=o.height-k.regY),m.push(p)}var q="_"+(d?"h":"")+(e?"v":""),r=b._animations,s=b._data,t=r.length/c;for(j=0;t>j;j++){var u=r[j];k=s[u];var v={name:u+q,speed:k.speed,next:k.next,frames:[]};k.next&&(v.next+=q),m=k.frames;for(var w=0,x=m.length;x>w;w++)v.frames.push(m[w]+n*c);s[v.name]=v,r.push(v.name)}},createjs.SpriteSheetUtils=a}(),this.createjs=this.createjs||{},function(){"use strict";function a(a){this.EventDispatcher_constructor(),this.maxWidth=2048,this.maxHeight=2048,this.spriteSheet=null,this.scale=1,this.padding=1,this.timeSlice=.3,this.progress=-1,this.framerate=a||0,this._frames=[],this._animations={},this._data=null,this._nextFrameIndex=0,this._index=0,this._timerID=null,this._scale=1}var b=createjs.extend(a,createjs.EventDispatcher);a.ERR_DIMENSIONS="frame dimensions exceed max spritesheet dimensions",a.ERR_RUNNING="a build is already running",b.addFrame=function(b,c,d,e,f){if(this._data)throw a.ERR_RUNNING;var g=c||b.bounds||b.nominalBounds;return!g&&b.getBounds&&(g=b.getBounds()),g?(d=d||1,this._frames.push({source:b,sourceRect:g,scale:d,funct:e,data:f,index:this._frames.length,height:g.height*d})-1):null},b.addAnimation=function(b,c,d,e){if(this._data)throw a.ERR_RUNNING;this._animations[b]={frames:c,next:d,speed:e}},b.addMovieClip=function(b,c,d,e,f,g){if(this._data)throw a.ERR_RUNNING;var h=b.frameBounds,i=c||b.bounds||b.nominalBounds;if(!i&&b.getBounds&&(i=b.getBounds()),i||h){var j,k,l=this._frames.length,m=b.timeline.duration;for(j=0;m>j;j++){var n=h&&h[j]?h[j]:i;this.addFrame(b,n,d,this._setupMovieClipFrame,{i:j,f:e,d:f})}var o=b.timeline._labels,p=[];for(var q in o)p.push({index:o[q],label:q});if(p.length)for(p.sort(function(a,b){return a.index-b.index}),j=0,k=p.length;k>j;j++){for(var r=p[j].label,s=l+p[j].index,t=l+(j==k-1?m:p[j+1].index),u=[],v=s;t>v;v++)u.push(v);(!g||(r=g(r,b,s,t)))&&this.addAnimation(r,u,!0)}}},b.build=function(){if(this._data)throw a.ERR_RUNNING;for(this._startBuild();this._drawNext(););return this._endBuild(),this.spriteSheet},b.buildAsync=function(b){if(this._data)throw a.ERR_RUNNING;this.timeSlice=b,this._startBuild();var c=this;this._timerID=setTimeout(function(){c._run()},50-50*Math.max(.01,Math.min(.99,this.timeSlice||.3)))},b.stopAsync=function(){clearTimeout(this._timerID),this._data=null},b.clone=function(){throw"SpriteSheetBuilder cannot be cloned."},b.toString=function(){return"[SpriteSheetBuilder]"},b._startBuild=function(){var b=this.padding||0;this.progress=0,this.spriteSheet=null,this._index=0,this._scale=this.scale;var c=[];this._data={images:[],frames:c,framerate:this.framerate,animations:this._animations};var d=this._frames.slice();if(d.sort(function(a,b){return a.height<=b.height?-1:1}),d[d.length-1].height+2*b>this.maxHeight)throw a.ERR_DIMENSIONS;for(var e=0,f=0,g=0;d.length;){var h=this._fillRow(d,e,g,c,b);if(h.w>f&&(f=h.w),e+=h.h,!h.h||!d.length){var i=createjs.createCanvas?createjs.createCanvas():document.createElement("canvas");i.width=this._getSize(f,this.maxWidth),i.height=this._getSize(e,this.maxHeight),this._data.images[g]=i,h.h||(f=e=0,g++)}}},b._setupMovieClipFrame=function(a,b){var c=a.actionsEnabled;a.actionsEnabled=!1,a.gotoAndStop(b.i),a.actionsEnabled=c,b.f&&b.f(a,b.d,b.i)},b._getSize=function(a,b){for(var c=4;Math.pow(2,++c)=0;l--){var m=b[l],n=this._scale*m.scale,o=m.sourceRect,p=m.source,q=Math.floor(n*o.x-f),r=Math.floor(n*o.y-f),s=Math.ceil(n*o.height+2*f),t=Math.ceil(n*o.width+2*f);if(t>g)throw a.ERR_DIMENSIONS;s>i||j+t>g||(m.img=d,m.rect=new createjs.Rectangle(j,c,t,s),k=k||s,b.splice(l,1),e[m.index]=[j,c,t,s,d,Math.round(-q+n*p.regX-f),Math.round(-r+n*p.regY-f)],j+=t)}return{w:j,h:k}},b._endBuild=function(){this.spriteSheet=new createjs.SpriteSheet(this._data),this._data=null,this.progress=1,this.dispatchEvent("complete")},b._run=function(){for(var a=50*Math.max(.01,Math.min(.99,this.timeSlice||.3)),b=(new Date).getTime()+a,c=!1;b>(new Date).getTime();)if(!this._drawNext()){c=!0;break}if(c)this._endBuild();else{var d=this;this._timerID=setTimeout(function(){d._run()},50-a)}var e=this.progress=this._index/this._frames.length;if(this.hasEventListener("progress")){var f=new createjs.Event("progress");f.progress=e,this.dispatchEvent(f)}},b._drawNext=function(){var a=this._frames[this._index],b=a.scale*this._scale,c=a.rect,d=a.sourceRect,e=this._data.images[a.img],f=e.getContext("2d");return a.funct&&a.funct(a.source,a.data),f.save(),f.beginPath(),f.rect(c.x,c.y,c.width,c.height),f.clip(),f.translate(Math.ceil(c.x-d.x*b),Math.ceil(c.y-d.y*b)),f.scale(b,b),a.source.draw(f),f.restore(),++this._indexa)&&(a=0),(isNaN(b)||0>b)&&(b=0),(isNaN(c)||1>c)&&(c=1),this.blurX=0|a,this.blurY=0|b,this.quality=0|c}var b=createjs.extend(a,createjs.Filter);a.MUL_TABLE=[1,171,205,293,57,373,79,137,241,27,391,357,41,19,283,265,497,469,443,421,25,191,365,349,335,161,155,149,9,278,269,261,505,245,475,231,449,437,213,415,405,395,193,377,369,361,353,345,169,331,325,319,313,307,301,37,145,285,281,69,271,267,263,259,509,501,493,243,479,118,465,459,113,446,55,435,429,423,209,413,51,403,199,393,97,3,379,375,371,367,363,359,355,351,347,43,85,337,333,165,327,323,5,317,157,311,77,305,303,75,297,294,73,289,287,71,141,279,277,275,68,135,67,133,33,262,260,129,511,507,503,499,495,491,61,121,481,477,237,235,467,232,115,457,227,451,7,445,221,439,218,433,215,427,425,211,419,417,207,411,409,203,202,401,399,396,197,49,389,387,385,383,95,189,47,187,93,185,23,183,91,181,45,179,89,177,11,175,87,173,345,343,341,339,337,21,167,83,331,329,327,163,81,323,321,319,159,79,315,313,39,155,309,307,153,305,303,151,75,299,149,37,295,147,73,291,145,289,287,143,285,71,141,281,35,279,139,69,275,137,273,17,271,135,269,267,133,265,33,263,131,261,130,259,129,257,1],a.SHG_TABLE=[0,9,10,11,9,12,10,11,12,9,13,13,10,9,13,13,14,14,14,14,10,13,14,14,14,13,13,13,9,14,14,14,15,14,15,14,15,15,14,15,15,15,14,15,15,15,15,15,14,15,15,15,15,15,15,12,14,15,15,13,15,15,15,15,16,16,16,15,16,14,16,16,14,16,13,16,16,16,15,16,13,16,15,16,14,9,16,16,16,16,16,16,16,16,16,13,14,16,16,15,16,16,10,16,15,16,14,16,16,14,16,16,14,16,16,14,15,16,16,16,14,15,14,15,13,16,16,15,17,17,17,17,17,17,14,15,17,17,16,16,17,16,15,17,16,17,11,17,16,17,16,17,16,17,17,16,17,17,16,17,17,16,16,17,17,17,16,14,17,17,17,17,15,16,14,16,15,16,13,16,15,16,14,16,15,16,12,16,15,16,17,17,17,17,17,13,16,15,17,17,17,16,15,17,17,17,16,15,17,17,14,16,17,17,16,17,17,16,15,17,16,14,17,16,15,17,16,17,17,16,17,15,16,17,14,17,16,15,17,16,17,13,17,16,17,17,16,17,14,17,16,17,16,17,16,17,9],b.getBounds=function(a){var b=0|this.blurX,c=0|this.blurY;if(0>=b&&0>=c)return a;var d=Math.pow(this.quality,.2);return(a||new createjs.Rectangle).pad(b*d+1,c*d+1,b*d+1,c*d+1)},b.clone=function(){return new a(this.blurX,this.blurY,this.quality)},b.toString=function(){return"[BlurFilter]"},b._applyFilter=function(b){var c=this.blurX>>1;if(isNaN(c)||0>c)return!1;var d=this.blurY>>1;if(isNaN(d)||0>d)return!1;if(0==c&&0==d)return!1;var e=this.quality;(isNaN(e)||1>e)&&(e=1),e|=0,e>3&&(e=3),1>e&&(e=1);var f=b.data,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=c+c+1|0,w=d+d+1|0,x=0|b.width,y=0|b.height,z=x-1|0,A=y-1|0,B=c+1|0,C=d+1|0,D={r:0,b:0,g:0,a:0},E=D;for(i=1;v>i;i++)E=E.n={r:0,b:0,g:0,a:0};E.n=D;var F={r:0,b:0,g:0,a:0},G=F;for(i=1;w>i;i++)G=G.n={r:0,b:0,g:0,a:0};G.n=F;for(var H=null,I=0|a.MUL_TABLE[c],J=0|a.SHG_TABLE[c],K=0|a.MUL_TABLE[d],L=0|a.SHG_TABLE[d];e-->0;){m=l=0;var M=I,N=J;for(h=y;--h>-1;){for(n=B*(r=f[0|l]),o=B*(s=f[l+1|0]),p=B*(t=f[l+2|0]),q=B*(u=f[l+3|0]),E=D,i=B;--i>-1;)E.r=r,E.g=s,E.b=t,E.a=u,E=E.n;for(i=1;B>i;i++)j=l+((i>z?z:i)<<2)|0,n+=E.r=f[j],o+=E.g=f[j+1],p+=E.b=f[j+2],q+=E.a=f[j+3],E=E.n;for(H=D,g=0;x>g;g++)f[l++]=n*M>>>N,f[l++]=o*M>>>N,f[l++]=p*M>>>N,f[l++]=q*M>>>N,j=m+((j=g+c+1)g;g++){for(l=g<<2|0,n=C*(r=f[l])|0,o=C*(s=f[l+1|0])|0,p=C*(t=f[l+2|0])|0,q=C*(u=f[l+3|0])|0,G=F,i=0;C>i;i++)G.r=r,G.g=s,G.b=t,G.a=u,G=G.n;for(k=x,i=1;d>=i;i++)l=k+g<<2,n+=G.r=f[l],o+=G.g=f[l+1],p+=G.b=f[l+2],q+=G.a=f[l+3],G=G.n,A>i&&(k+=x);if(l=g,H=F,e>0)for(h=0;y>h;h++)j=l<<2,f[j+3]=u=q*M>>>N,u>0?(f[j]=n*M>>>N,f[j+1]=o*M>>>N,f[j+2]=p*M>>>N):f[j]=f[j+1]=f[j+2]=0,j=g+((j=h+C)h;h++)j=l<<2,f[j+3]=u=q*M>>>N,u>0?(u=255/u,f[j]=(n*M>>>N)*u,f[j+1]=(o*M>>>N)*u,f[j+2]=(p*M>>>N)*u):f[j]=f[j+1]=f[j+2]=0,j=g+((j=h+C)d;d+=4)b[d+3]=c[d]||0;return!0},b._prepAlphaMap=function(){if(!this.alphaMap)return!1;if(this.alphaMap==this._alphaMap&&this._mapData)return!0;this._mapData=null;var a,b=this._alphaMap=this.alphaMap,c=b;b instanceof HTMLCanvasElement?a=c.getContext("2d"):(c=createjs.createCanvas?createjs.createCanvas():document.createElement("canvas"),c.width=b.width,c.height=b.height,a=c.getContext("2d"),a.drawImage(b,0,0));try{var d=a.getImageData(0,0,b.width,b.height)}catch(e){return!1}return this._mapData=d.data,!0},createjs.AlphaMapFilter=createjs.promote(a,"Filter")}(),this.createjs=this.createjs||{},function(){"use strict";function a(a){this.mask=a}var b=createjs.extend(a,createjs.Filter);b.applyFilter=function(a,b,c,d,e,f,g,h){return this.mask?(f=f||a,null==g&&(g=b),null==h&&(h=c),f.save(),a!=f?!1:(f.globalCompositeOperation="destination-in",f.drawImage(this.mask,g,h),f.restore(),!0)):!0},b.clone=function(){return new a(this.mask)},b.toString=function(){return"[AlphaMaskFilter]"},createjs.AlphaMaskFilter=createjs.promote(a,"Filter")}(),this.createjs=this.createjs||{},function(){"use strict";function a(a,b,c,d,e,f,g,h){this.redMultiplier=null!=a?a:1,this.greenMultiplier=null!=b?b:1,this.blueMultiplier=null!=c?c:1,this.alphaMultiplier=null!=d?d:1,this.redOffset=e||0,this.greenOffset=f||0,this.blueOffset=g||0,this.alphaOffset=h||0}var b=createjs.extend(a,createjs.Filter);b.toString=function(){return"[ColorFilter]"},b.clone=function(){return new a(this.redMultiplier,this.greenMultiplier,this.blueMultiplier,this.alphaMultiplier,this.redOffset,this.greenOffset,this.blueOffset,this.alphaOffset)},b._applyFilter=function(a){for(var b=a.data,c=b.length,d=0;c>d;d+=4)b[d]=b[d]*this.redMultiplier+this.redOffset,b[d+1]=b[d+1]*this.greenMultiplier+this.greenOffset,b[d+2]=b[d+2]*this.blueMultiplier+this.blueOffset,b[d+3]=b[d+3]*this.alphaMultiplier+this.alphaOffset;return!0},createjs.ColorFilter=createjs.promote(a,"Filter")}(),this.createjs=this.createjs||{},function(){"use strict";function a(a,b,c,d){this.setColor(a,b,c,d)}var b=a.prototype;a.DELTA_INDEX=[0,.01,.02,.04,.05,.06,.07,.08,.1,.11,.12,.14,.15,.16,.17,.18,.2,.21,.22,.24,.25,.27,.28,.3,.32,.34,.36,.38,.4,.42,.44,.46,.48,.5,.53,.56,.59,.62,.65,.68,.71,.74,.77,.8,.83,.86,.89,.92,.95,.98,1,1.06,1.12,1.18,1.24,1.3,1.36,1.42,1.48,1.54,1.6,1.66,1.72,1.78,1.84,1.9,1.96,2,2.12,2.25,2.37,2.5,2.62,2.75,2.87,3,3.2,3.4,3.6,3.8,4,4.3,4.7,4.9,5,5.5,6,6.5,6.8,7,7.3,7.5,7.8,8,8.4,8.7,9,9.4,9.6,9.8,10],a.IDENTITY_MATRIX=[1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1],a.LENGTH=a.IDENTITY_MATRIX.length,b.setColor=function(a,b,c,d){return this.reset().adjustColor(a,b,c,d)},b.reset=function(){return this.copy(a.IDENTITY_MATRIX)},b.adjustColor=function(a,b,c,d){return this.adjustHue(d),this.adjustContrast(b),this.adjustBrightness(a),this.adjustSaturation(c)},b.adjustBrightness=function(a){return 0==a||isNaN(a)?this:(a=this._cleanValue(a,255),this._multiplyMatrix([1,0,0,0,a,0,1,0,0,a,0,0,1,0,a,0,0,0,1,0,0,0,0,0,1]),this)},b.adjustContrast=function(b){if(0==b||isNaN(b))return this;b=this._cleanValue(b,100);var c;return 0>b?c=127+b/100*127:(c=b%1,c=0==c?a.DELTA_INDEX[b]:a.DELTA_INDEX[b<<0]*(1-c)+a.DELTA_INDEX[(b<<0)+1]*c,c=127*c+127),this._multiplyMatrix([c/127,0,0,0,.5*(127-c),0,c/127,0,0,.5*(127-c),0,0,c/127,0,.5*(127-c),0,0,0,1,0,0,0,0,0,1]),this},b.adjustSaturation=function(a){if(0==a||isNaN(a))return this;a=this._cleanValue(a,100);var b=1+(a>0?3*a/100:a/100),c=.3086,d=.6094,e=.082;return this._multiplyMatrix([c*(1-b)+b,d*(1-b),e*(1-b),0,0,c*(1-b),d*(1-b)+b,e*(1-b),0,0,c*(1-b),d*(1-b),e*(1-b)+b,0,0,0,0,0,1,0,0,0,0,0,1]),this},b.adjustHue=function(a){if(0==a||isNaN(a))return this;a=this._cleanValue(a,180)/180*Math.PI;var b=Math.cos(a),c=Math.sin(a),d=.213,e=.715,f=.072;return this._multiplyMatrix([d+b*(1-d)+c*-d,e+b*-e+c*-e,f+b*-f+c*(1-f),0,0,d+b*-d+.143*c,e+b*(1-e)+.14*c,f+b*-f+c*-.283,0,0,d+b*-d+c*-(1-d),e+b*-e+c*e,f+b*(1-f)+c*f,0,0,0,0,0,1,0,0,0,0,0,1]),this},b.concat=function(b){return b=this._fixMatrix(b),b.length!=a.LENGTH?this:(this._multiplyMatrix(b),this)},b.clone=function(){return(new a).copy(this)},b.toArray=function(){for(var b=[],c=0,d=a.LENGTH;d>c;c++)b[c]=this[c];return b},b.copy=function(b){for(var c=a.LENGTH,d=0;c>d;d++)this[d]=b[d];return this},b.toString=function(){return"[ColorMatrix]"},b._multiplyMatrix=function(a){var b,c,d,e=[];for(b=0;5>b;b++){for(c=0;5>c;c++)e[c]=this[c+5*b];for(c=0;5>c;c++){var f=0;for(d=0;5>d;d++)f+=a[c+5*d]*e[d];this[c+5*b]=f}}},b._cleanValue=function(a,b){return Math.min(b,Math.max(-b,a))},b._fixMatrix=function(b){return b instanceof a&&(b=b.toArray()),b.lengtha.LENGTH&&(b=b.slice(0,a.LENGTH)),b},createjs.ColorMatrix=a}(),this.createjs=this.createjs||{},function(){"use strict";function a(a){this.matrix=a}var b=createjs.extend(a,createjs.Filter);b.toString=function(){return"[ColorMatrixFilter]"},b.clone=function(){return new a(this.matrix)},b._applyFilter=function(a){for(var b,c,d,e,f=a.data,g=f.length,h=this.matrix,i=h[0],j=h[1],k=h[2],l=h[3],m=h[4],n=h[5],o=h[6],p=h[7],q=h[8],r=h[9],s=h[10],t=h[11],u=h[12],v=h[13],w=h[14],x=h[15],y=h[16],z=h[17],A=h[18],B=h[19],C=0;g>C;C+=4)b=f[C],c=f[C+1],d=f[C+2],e=f[C+3],f[C]=b*i+c*j+d*k+e*l+m,f[C+1]=b*n+c*o+d*p+e*q+r,f[C+2]=b*s+c*t+d*u+e*v+w,f[C+3]=b*x+c*y+d*z+e*A+B;return!0},createjs.ColorMatrixFilter=createjs.promote(a,"Filter")}(),this.createjs=this.createjs||{},function(){"use strict";function a(){throw"Touch cannot be instantiated"}a.isSupported=function(){return!!("ontouchstart"in window||window.navigator.msPointerEnabled&&window.navigator.msMaxTouchPoints>0||window.navigator.pointerEnabled&&window.navigator.maxTouchPoints>0)},a.enable=function(b,c,d){return b&&b.canvas&&a.isSupported()?b.__touch?!0:(b.__touch={pointers:{},multitouch:!c,preventDefault:!d,count:0},"ontouchstart"in window?a._IOS_enable(b):(window.navigator.msPointerEnabled||window.navigator.pointerEnabled)&&a._IE_enable(b),!0):!1},a.disable=function(b){b&&("ontouchstart"in window?a._IOS_disable(b):(window.navigator.msPointerEnabled||window.navigator.pointerEnabled)&&a._IE_disable(b),delete b.__touch)},a._IOS_enable=function(b){var c=b.canvas,d=b.__touch.f=function(c){a._IOS_handleEvent(b,c)};c.addEventListener("touchstart",d,!1),c.addEventListener("touchmove",d,!1),c.addEventListener("touchend",d,!1),c.addEventListener("touchcancel",d,!1)},a._IOS_disable=function(a){var b=a.canvas;if(b){var c=a.__touch.f;b.removeEventListener("touchstart",c,!1),b.removeEventListener("touchmove",c,!1),b.removeEventListener("touchend",c,!1),b.removeEventListener("touchcancel",c,!1)}},a._IOS_handleEvent=function(a,b){if(a){a.__touch.preventDefault&&b.preventDefault&&b.preventDefault();for(var c=b.changedTouches,d=b.type,e=0,f=c.length;f>e;e++){var g=c[e],h=g.identifier;g.target==a.canvas&&("touchstart"==d?this._handleStart(a,h,b,g.pageX,g.pageY):"touchmove"==d?this._handleMove(a,h,b,g.pageX,g.pageY):("touchend"==d||"touchcancel"==d)&&this._handleEnd(a,h,b))}}},a._IE_enable=function(b){var c=b.canvas,d=b.__touch.f=function(c){a._IE_handleEvent(b,c)};void 0===window.navigator.pointerEnabled?(c.addEventListener("MSPointerDown",d,!1),window.addEventListener("MSPointerMove",d,!1),window.addEventListener("MSPointerUp",d,!1),window.addEventListener("MSPointerCancel",d,!1),b.__touch.preventDefault&&(c.style.msTouchAction="none")):(c.addEventListener("pointerdown",d,!1),window.addEventListener("pointermove",d,!1),window.addEventListener("pointerup",d,!1),window.addEventListener("pointercancel",d,!1),b.__touch.preventDefault&&(c.style.touchAction="none")),b.__touch.activeIDs={}},a._IE_disable=function(a){var b=a.__touch.f;void 0===window.navigator.pointerEnabled?(window.removeEventListener("MSPointerMove",b,!1),window.removeEventListener("MSPointerUp",b,!1),window.removeEventListener("MSPointerCancel",b,!1),a.canvas&&a.canvas.removeEventListener("MSPointerDown",b,!1)):(window.removeEventListener("pointermove",b,!1),window.removeEventListener("pointerup",b,!1),window.removeEventListener("pointercancel",b,!1),a.canvas&&a.canvas.removeEventListener("pointerdown",b,!1))},a._IE_handleEvent=function(a,b){if(a){a.__touch.preventDefault&&b.preventDefault&&b.preventDefault();var c=b.type,d=b.pointerId,e=a.__touch.activeIDs;if("MSPointerDown"==c||"pointerdown"==c){if(b.srcElement!=a.canvas)return;e[d]=!0,this._handleStart(a,d,b,b.pageX,b.pageY)}else e[d]&&("MSPointerMove"==c||"pointermove"==c?this._handleMove(a,d,b,b.pageX,b.pageY):("MSPointerUp"==c||"MSPointerCancel"==c||"pointerup"==c||"pointercancel"==c)&&(delete e[d],this._handleEnd(a,d,b)))}},a._handleStart=function(a,b,c,d,e){var f=a.__touch;if(f.multitouch||!f.count){var g=f.pointers;g[b]||(g[b]=!0,f.count++,a._handlePointerDown(b,c,d,e))}},a._handleMove=function(a,b,c,d,e){a.__touch.pointers[b]&&a._handlePointerMove(b,c,d,e)},a._handleEnd=function(a,b,c){var d=a.__touch,e=d.pointers;e[b]&&(d.count--,a._handlePointerUp(b,c,!0),delete e[b])},createjs.Touch=a}(),this.createjs=this.createjs||{},function(){"use strict";var a=createjs.EaselJS=createjs.EaselJS||{};a.version="0.8.2",a.buildDate="Thu, 26 Nov 2015 20:44:34 GMT"}(); \ No newline at end of file diff --git a/example/lib/pixi-spine.js b/example/lib/pixi-spine.js new file mode 100755 index 0000000..c8d31f6 --- /dev/null +++ b/example/lib/pixi-spine.js @@ -0,0 +1,7183 @@ +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var pixi_spine; +(function (pixi_spine) { + var core; + (function (core) { + var Animation = (function () { + function Animation(name, timelines, duration) { + if (name == null) + throw new Error("name cannot be null."); + if (timelines == null) + throw new Error("timelines cannot be null."); + this.name = name; + this.timelines = timelines; + this.duration = duration; + } + Animation.prototype.apply = function (skeleton, lastTime, time, loop, events, alpha, pose, direction) { + if (skeleton == null) + throw new Error("skeleton cannot be null."); + if (loop && this.duration != 0) { + time %= this.duration; + if (lastTime > 0) + lastTime %= this.duration; + } + var timelines = this.timelines; + for (var i = 0, n = timelines.length; i < n; i++) + timelines[i].apply(skeleton, lastTime, time, events, alpha, pose, direction); + }; + Animation.binarySearch = function (values, target, step) { + if (step === void 0) { step = 1; } + var low = 0; + var high = values.length / step - 2; + if (high == 0) + return step; + var current = high >>> 1; + while (true) { + if (values[(current + 1) * step] <= target) + low = current + 1; + else + high = current; + if (low == high) + return (low + 1) * step; + current = (low + high) >>> 1; + } + }; + Animation.linearSearch = function (values, target, step) { + for (var i = 0, last = values.length - step; i <= last; i += step) + if (values[i] > target) + return i; + return -1; + }; + return Animation; + }()); + core.Animation = Animation; + var MixPose; + (function (MixPose) { + MixPose[MixPose["setup"] = 0] = "setup"; + MixPose[MixPose["current"] = 1] = "current"; + MixPose[MixPose["currentLayered"] = 2] = "currentLayered"; + })(MixPose = core.MixPose || (core.MixPose = {})); + var MixDirection; + (function (MixDirection) { + MixDirection[MixDirection["in"] = 0] = "in"; + MixDirection[MixDirection["out"] = 1] = "out"; + })(MixDirection = core.MixDirection || (core.MixDirection = {})); + var TimelineType; + (function (TimelineType) { + TimelineType[TimelineType["rotate"] = 0] = "rotate"; + TimelineType[TimelineType["translate"] = 1] = "translate"; + TimelineType[TimelineType["scale"] = 2] = "scale"; + TimelineType[TimelineType["shear"] = 3] = "shear"; + TimelineType[TimelineType["attachment"] = 4] = "attachment"; + TimelineType[TimelineType["color"] = 5] = "color"; + TimelineType[TimelineType["deform"] = 6] = "deform"; + TimelineType[TimelineType["event"] = 7] = "event"; + TimelineType[TimelineType["drawOrder"] = 8] = "drawOrder"; + TimelineType[TimelineType["ikConstraint"] = 9] = "ikConstraint"; + TimelineType[TimelineType["transformConstraint"] = 10] = "transformConstraint"; + TimelineType[TimelineType["pathConstraintPosition"] = 11] = "pathConstraintPosition"; + TimelineType[TimelineType["pathConstraintSpacing"] = 12] = "pathConstraintSpacing"; + TimelineType[TimelineType["pathConstraintMix"] = 13] = "pathConstraintMix"; + TimelineType[TimelineType["twoColor"] = 14] = "twoColor"; + })(TimelineType = core.TimelineType || (core.TimelineType = {})); + var CurveTimeline = (function () { + function CurveTimeline(frameCount) { + if (frameCount <= 0) + throw new Error("frameCount must be > 0: " + frameCount); + this.curves = core.Utils.newFloatArray((frameCount - 1) * CurveTimeline.BEZIER_SIZE); + } + CurveTimeline.prototype.getFrameCount = function () { + return this.curves.length / CurveTimeline.BEZIER_SIZE + 1; + }; + CurveTimeline.prototype.setLinear = function (frameIndex) { + this.curves[frameIndex * CurveTimeline.BEZIER_SIZE] = CurveTimeline.LINEAR; + }; + CurveTimeline.prototype.setStepped = function (frameIndex) { + this.curves[frameIndex * CurveTimeline.BEZIER_SIZE] = CurveTimeline.STEPPED; + }; + CurveTimeline.prototype.getCurveType = function (frameIndex) { + var index = frameIndex * CurveTimeline.BEZIER_SIZE; + if (index == this.curves.length) + return CurveTimeline.LINEAR; + var type = this.curves[index]; + if (type == CurveTimeline.LINEAR) + return CurveTimeline.LINEAR; + if (type == CurveTimeline.STEPPED) + return CurveTimeline.STEPPED; + return CurveTimeline.BEZIER; + }; + CurveTimeline.prototype.setCurve = function (frameIndex, cx1, cy1, cx2, cy2) { + var tmpx = (-cx1 * 2 + cx2) * 0.03, tmpy = (-cy1 * 2 + cy2) * 0.03; + var dddfx = ((cx1 - cx2) * 3 + 1) * 0.006, dddfy = ((cy1 - cy2) * 3 + 1) * 0.006; + var ddfx = tmpx * 2 + dddfx, ddfy = tmpy * 2 + dddfy; + var dfx = cx1 * 0.3 + tmpx + dddfx * 0.16666667, dfy = cy1 * 0.3 + tmpy + dddfy * 0.16666667; + var i = frameIndex * CurveTimeline.BEZIER_SIZE; + var curves = this.curves; + curves[i++] = CurveTimeline.BEZIER; + var x = dfx, y = dfy; + for (var n = i + CurveTimeline.BEZIER_SIZE - 1; i < n; i += 2) { + curves[i] = x; + curves[i + 1] = y; + dfx += ddfx; + dfy += ddfy; + ddfx += dddfx; + ddfy += dddfy; + x += dfx; + y += dfy; + } + }; + CurveTimeline.prototype.getCurvePercent = function (frameIndex, percent) { + percent = core.MathUtils.clamp(percent, 0, 1); + var curves = this.curves; + var i = frameIndex * CurveTimeline.BEZIER_SIZE; + var type = curves[i]; + if (type == CurveTimeline.LINEAR) + return percent; + if (type == CurveTimeline.STEPPED) + return 0; + i++; + var x = 0; + for (var start = i, n = i + CurveTimeline.BEZIER_SIZE - 1; i < n; i += 2) { + x = curves[i]; + if (x >= percent) { + var prevX = void 0, prevY = void 0; + if (i == start) { + prevX = 0; + prevY = 0; + } + else { + prevX = curves[i - 2]; + prevY = curves[i - 1]; + } + return prevY + (curves[i + 1] - prevY) * (percent - prevX) / (x - prevX); + } + } + var y = curves[i - 1]; + return y + (1 - y) * (percent - x) / (1 - x); + }; + CurveTimeline.LINEAR = 0; + CurveTimeline.STEPPED = 1; + CurveTimeline.BEZIER = 2; + CurveTimeline.BEZIER_SIZE = 10 * 2 - 1; + return CurveTimeline; + }()); + core.CurveTimeline = CurveTimeline; + var RotateTimeline = (function (_super) { + __extends(RotateTimeline, _super); + function RotateTimeline(frameCount) { + var _this = _super.call(this, frameCount) || this; + _this.frames = core.Utils.newFloatArray(frameCount << 1); + return _this; + } + RotateTimeline.prototype.getPropertyId = function () { + return (TimelineType.rotate << 24) + this.boneIndex; + }; + RotateTimeline.prototype.setFrame = function (frameIndex, time, degrees) { + frameIndex <<= 1; + this.frames[frameIndex] = time; + this.frames[frameIndex + RotateTimeline.ROTATION] = degrees; + }; + RotateTimeline.prototype.apply = function (skeleton, lastTime, time, events, alpha, pose, direction) { + var frames = this.frames; + var bone = skeleton.bones[this.boneIndex]; + if (time < frames[0]) { + switch (pose) { + case MixPose.setup: + bone.rotation = bone.data.rotation; + return; + case MixPose.current: + var r_1 = bone.data.rotation - bone.rotation; + r_1 -= (16384 - ((16384.499999999996 - r_1 / 360) | 0)) * 360; + bone.rotation += r_1 * alpha; + } + return; + } + if (time >= frames[frames.length - RotateTimeline.ENTRIES]) { + if (pose == MixPose.setup) + bone.rotation = bone.data.rotation + frames[frames.length + RotateTimeline.PREV_ROTATION] * alpha; + else { + var r_2 = bone.data.rotation + frames[frames.length + RotateTimeline.PREV_ROTATION] - bone.rotation; + r_2 -= (16384 - ((16384.499999999996 - r_2 / 360) | 0)) * 360; + bone.rotation += r_2 * alpha; + } + return; + } + var frame = Animation.binarySearch(frames, time, RotateTimeline.ENTRIES); + var prevRotation = frames[frame + RotateTimeline.PREV_ROTATION]; + var frameTime = frames[frame]; + var percent = this.getCurvePercent((frame >> 1) - 1, 1 - (time - frameTime) / (frames[frame + RotateTimeline.PREV_TIME] - frameTime)); + var r = frames[frame + RotateTimeline.ROTATION] - prevRotation; + r -= (16384 - ((16384.499999999996 - r / 360) | 0)) * 360; + r = prevRotation + r * percent; + if (pose == MixPose.setup) { + r -= (16384 - ((16384.499999999996 - r / 360) | 0)) * 360; + bone.rotation = bone.data.rotation + r * alpha; + } + else { + r = bone.data.rotation + r - bone.rotation; + r -= (16384 - ((16384.499999999996 - r / 360) | 0)) * 360; + bone.rotation += r * alpha; + } + }; + RotateTimeline.ENTRIES = 2; + RotateTimeline.PREV_TIME = -2; + RotateTimeline.PREV_ROTATION = -1; + RotateTimeline.ROTATION = 1; + return RotateTimeline; + }(CurveTimeline)); + core.RotateTimeline = RotateTimeline; + var TranslateTimeline = (function (_super) { + __extends(TranslateTimeline, _super); + function TranslateTimeline(frameCount) { + var _this = _super.call(this, frameCount) || this; + _this.frames = core.Utils.newFloatArray(frameCount * TranslateTimeline.ENTRIES); + return _this; + } + TranslateTimeline.prototype.getPropertyId = function () { + return (TimelineType.translate << 24) + this.boneIndex; + }; + TranslateTimeline.prototype.setFrame = function (frameIndex, time, x, y) { + frameIndex *= TranslateTimeline.ENTRIES; + this.frames[frameIndex] = time; + this.frames[frameIndex + TranslateTimeline.X] = x; + this.frames[frameIndex + TranslateTimeline.Y] = y; + }; + TranslateTimeline.prototype.apply = function (skeleton, lastTime, time, events, alpha, pose, direction) { + var frames = this.frames; + var bone = skeleton.bones[this.boneIndex]; + if (time < frames[0]) { + switch (pose) { + case MixPose.setup: + bone.x = bone.data.x; + bone.y = bone.data.y; + return; + case MixPose.current: + bone.x += (bone.data.x - bone.x) * alpha; + bone.y += (bone.data.y - bone.y) * alpha; + } + return; + } + var x = 0, y = 0; + if (time >= frames[frames.length - TranslateTimeline.ENTRIES]) { + x = frames[frames.length + TranslateTimeline.PREV_X]; + y = frames[frames.length + TranslateTimeline.PREV_Y]; + } + else { + var frame = Animation.binarySearch(frames, time, TranslateTimeline.ENTRIES); + x = frames[frame + TranslateTimeline.PREV_X]; + y = frames[frame + TranslateTimeline.PREV_Y]; + var frameTime = frames[frame]; + var percent = this.getCurvePercent(frame / TranslateTimeline.ENTRIES - 1, 1 - (time - frameTime) / (frames[frame + TranslateTimeline.PREV_TIME] - frameTime)); + x += (frames[frame + TranslateTimeline.X] - x) * percent; + y += (frames[frame + TranslateTimeline.Y] - y) * percent; + } + if (pose == MixPose.setup) { + bone.x = bone.data.x + x * alpha; + bone.y = bone.data.y + y * alpha; + } + else { + bone.x += (bone.data.x + x - bone.x) * alpha; + bone.y += (bone.data.y + y - bone.y) * alpha; + } + }; + TranslateTimeline.ENTRIES = 3; + TranslateTimeline.PREV_TIME = -3; + TranslateTimeline.PREV_X = -2; + TranslateTimeline.PREV_Y = -1; + TranslateTimeline.X = 1; + TranslateTimeline.Y = 2; + return TranslateTimeline; + }(CurveTimeline)); + core.TranslateTimeline = TranslateTimeline; + var ScaleTimeline = (function (_super) { + __extends(ScaleTimeline, _super); + function ScaleTimeline(frameCount) { + return _super.call(this, frameCount) || this; + } + ScaleTimeline.prototype.getPropertyId = function () { + return (TimelineType.scale << 24) + this.boneIndex; + }; + ScaleTimeline.prototype.apply = function (skeleton, lastTime, time, events, alpha, pose, direction) { + var frames = this.frames; + var bone = skeleton.bones[this.boneIndex]; + if (time < frames[0]) { + switch (pose) { + case MixPose.setup: + bone.scaleX = bone.data.scaleX; + bone.scaleY = bone.data.scaleY; + return; + case MixPose.current: + bone.scaleX += (bone.data.scaleX - bone.scaleX) * alpha; + bone.scaleY += (bone.data.scaleY - bone.scaleY) * alpha; + } + return; + } + var x = 0, y = 0; + if (time >= frames[frames.length - ScaleTimeline.ENTRIES]) { + x = frames[frames.length + ScaleTimeline.PREV_X] * bone.data.scaleX; + y = frames[frames.length + ScaleTimeline.PREV_Y] * bone.data.scaleY; + } + else { + var frame = Animation.binarySearch(frames, time, ScaleTimeline.ENTRIES); + x = frames[frame + ScaleTimeline.PREV_X]; + y = frames[frame + ScaleTimeline.PREV_Y]; + var frameTime = frames[frame]; + var percent = this.getCurvePercent(frame / ScaleTimeline.ENTRIES - 1, 1 - (time - frameTime) / (frames[frame + ScaleTimeline.PREV_TIME] - frameTime)); + x = (x + (frames[frame + ScaleTimeline.X] - x) * percent) * bone.data.scaleX; + y = (y + (frames[frame + ScaleTimeline.Y] - y) * percent) * bone.data.scaleY; + } + if (alpha == 1) { + bone.scaleX = x; + bone.scaleY = y; + } + else { + var bx = 0, by = 0; + if (pose == MixPose.setup) { + bx = bone.data.scaleX; + by = bone.data.scaleY; + } + else { + bx = bone.scaleX; + by = bone.scaleY; + } + if (direction == MixDirection.out) { + x = Math.abs(x) * core.MathUtils.signum(bx); + y = Math.abs(y) * core.MathUtils.signum(by); + } + else { + bx = Math.abs(bx) * core.MathUtils.signum(x); + by = Math.abs(by) * core.MathUtils.signum(y); + } + bone.scaleX = bx + (x - bx) * alpha; + bone.scaleY = by + (y - by) * alpha; + } + }; + return ScaleTimeline; + }(TranslateTimeline)); + core.ScaleTimeline = ScaleTimeline; + var ShearTimeline = (function (_super) { + __extends(ShearTimeline, _super); + function ShearTimeline(frameCount) { + return _super.call(this, frameCount) || this; + } + ShearTimeline.prototype.getPropertyId = function () { + return (TimelineType.shear << 24) + this.boneIndex; + }; + ShearTimeline.prototype.apply = function (skeleton, lastTime, time, events, alpha, pose, direction) { + var frames = this.frames; + var bone = skeleton.bones[this.boneIndex]; + if (time < frames[0]) { + switch (pose) { + case MixPose.setup: + bone.shearX = bone.data.shearX; + bone.shearY = bone.data.shearY; + return; + case MixPose.current: + bone.shearX += (bone.data.shearX - bone.shearX) * alpha; + bone.shearY += (bone.data.shearY - bone.shearY) * alpha; + } + return; + } + var x = 0, y = 0; + if (time >= frames[frames.length - ShearTimeline.ENTRIES]) { + x = frames[frames.length + ShearTimeline.PREV_X]; + y = frames[frames.length + ShearTimeline.PREV_Y]; + } + else { + var frame = Animation.binarySearch(frames, time, ShearTimeline.ENTRIES); + x = frames[frame + ShearTimeline.PREV_X]; + y = frames[frame + ShearTimeline.PREV_Y]; + var frameTime = frames[frame]; + var percent = this.getCurvePercent(frame / ShearTimeline.ENTRIES - 1, 1 - (time - frameTime) / (frames[frame + ShearTimeline.PREV_TIME] - frameTime)); + x = x + (frames[frame + ShearTimeline.X] - x) * percent; + y = y + (frames[frame + ShearTimeline.Y] - y) * percent; + } + if (pose == MixPose.setup) { + bone.shearX = bone.data.shearX + x * alpha; + bone.shearY = bone.data.shearY + y * alpha; + } + else { + bone.shearX += (bone.data.shearX + x - bone.shearX) * alpha; + bone.shearY += (bone.data.shearY + y - bone.shearY) * alpha; + } + }; + return ShearTimeline; + }(TranslateTimeline)); + core.ShearTimeline = ShearTimeline; + var ColorTimeline = (function (_super) { + __extends(ColorTimeline, _super); + function ColorTimeline(frameCount) { + var _this = _super.call(this, frameCount) || this; + _this.frames = core.Utils.newFloatArray(frameCount * ColorTimeline.ENTRIES); + return _this; + } + ColorTimeline.prototype.getPropertyId = function () { + return (TimelineType.color << 24) + this.slotIndex; + }; + ColorTimeline.prototype.setFrame = function (frameIndex, time, r, g, b, a) { + frameIndex *= ColorTimeline.ENTRIES; + this.frames[frameIndex] = time; + this.frames[frameIndex + ColorTimeline.R] = r; + this.frames[frameIndex + ColorTimeline.G] = g; + this.frames[frameIndex + ColorTimeline.B] = b; + this.frames[frameIndex + ColorTimeline.A] = a; + }; + ColorTimeline.prototype.apply = function (skeleton, lastTime, time, events, alpha, pose, direction) { + var slot = skeleton.slots[this.slotIndex]; + var frames = this.frames; + if (time < frames[0]) { + switch (pose) { + case MixPose.setup: + slot.color.setFromColor(slot.data.color); + return; + case MixPose.current: + var color = slot.color, setup = slot.data.color; + color.add((setup.r - color.r) * alpha, (setup.g - color.g) * alpha, (setup.b - color.b) * alpha, (setup.a - color.a) * alpha); + } + return; + } + var r = 0, g = 0, b = 0, a = 0; + if (time >= frames[frames.length - ColorTimeline.ENTRIES]) { + var i = frames.length; + r = frames[i + ColorTimeline.PREV_R]; + g = frames[i + ColorTimeline.PREV_G]; + b = frames[i + ColorTimeline.PREV_B]; + a = frames[i + ColorTimeline.PREV_A]; + } + else { + var frame = Animation.binarySearch(frames, time, ColorTimeline.ENTRIES); + r = frames[frame + ColorTimeline.PREV_R]; + g = frames[frame + ColorTimeline.PREV_G]; + b = frames[frame + ColorTimeline.PREV_B]; + a = frames[frame + ColorTimeline.PREV_A]; + var frameTime = frames[frame]; + var percent = this.getCurvePercent(frame / ColorTimeline.ENTRIES - 1, 1 - (time - frameTime) / (frames[frame + ColorTimeline.PREV_TIME] - frameTime)); + r += (frames[frame + ColorTimeline.R] - r) * percent; + g += (frames[frame + ColorTimeline.G] - g) * percent; + b += (frames[frame + ColorTimeline.B] - b) * percent; + a += (frames[frame + ColorTimeline.A] - a) * percent; + } + if (alpha == 1) + slot.color.set(r, g, b, a); + else { + var color = slot.color; + if (pose == MixPose.setup) + color.setFromColor(slot.data.color); + color.add((r - color.r) * alpha, (g - color.g) * alpha, (b - color.b) * alpha, (a - color.a) * alpha); + } + }; + ColorTimeline.ENTRIES = 5; + ColorTimeline.PREV_TIME = -5; + ColorTimeline.PREV_R = -4; + ColorTimeline.PREV_G = -3; + ColorTimeline.PREV_B = -2; + ColorTimeline.PREV_A = -1; + ColorTimeline.R = 1; + ColorTimeline.G = 2; + ColorTimeline.B = 3; + ColorTimeline.A = 4; + return ColorTimeline; + }(CurveTimeline)); + core.ColorTimeline = ColorTimeline; + var TwoColorTimeline = (function (_super) { + __extends(TwoColorTimeline, _super); + function TwoColorTimeline(frameCount) { + var _this = _super.call(this, frameCount) || this; + _this.frames = core.Utils.newFloatArray(frameCount * TwoColorTimeline.ENTRIES); + return _this; + } + TwoColorTimeline.prototype.getPropertyId = function () { + return (TimelineType.twoColor << 24) + this.slotIndex; + }; + TwoColorTimeline.prototype.setFrame = function (frameIndex, time, r, g, b, a, r2, g2, b2) { + frameIndex *= TwoColorTimeline.ENTRIES; + this.frames[frameIndex] = time; + this.frames[frameIndex + TwoColorTimeline.R] = r; + this.frames[frameIndex + TwoColorTimeline.G] = g; + this.frames[frameIndex + TwoColorTimeline.B] = b; + this.frames[frameIndex + TwoColorTimeline.A] = a; + this.frames[frameIndex + TwoColorTimeline.R2] = r2; + this.frames[frameIndex + TwoColorTimeline.G2] = g2; + this.frames[frameIndex + TwoColorTimeline.B2] = b2; + }; + TwoColorTimeline.prototype.apply = function (skeleton, lastTime, time, events, alpha, pose, direction) { + var slot = skeleton.slots[this.slotIndex]; + var frames = this.frames; + if (time < frames[0]) { + switch (pose) { + case MixPose.setup: + slot.color.setFromColor(slot.data.color); + slot.darkColor.setFromColor(slot.data.darkColor); + return; + case MixPose.current: + var light = slot.color, dark = slot.darkColor, setupLight = slot.data.color, setupDark = slot.data.darkColor; + light.add((setupLight.r - light.r) * alpha, (setupLight.g - light.g) * alpha, (setupLight.b - light.b) * alpha, (setupLight.a - light.a) * alpha); + dark.add((setupDark.r - dark.r) * alpha, (setupDark.g - dark.g) * alpha, (setupDark.b - dark.b) * alpha, 0); + } + return; + } + var r = 0, g = 0, b = 0, a = 0, r2 = 0, g2 = 0, b2 = 0; + if (time >= frames[frames.length - TwoColorTimeline.ENTRIES]) { + var i = frames.length; + r = frames[i + TwoColorTimeline.PREV_R]; + g = frames[i + TwoColorTimeline.PREV_G]; + b = frames[i + TwoColorTimeline.PREV_B]; + a = frames[i + TwoColorTimeline.PREV_A]; + r2 = frames[i + TwoColorTimeline.PREV_R2]; + g2 = frames[i + TwoColorTimeline.PREV_G2]; + b2 = frames[i + TwoColorTimeline.PREV_B2]; + } + else { + var frame = Animation.binarySearch(frames, time, TwoColorTimeline.ENTRIES); + r = frames[frame + TwoColorTimeline.PREV_R]; + g = frames[frame + TwoColorTimeline.PREV_G]; + b = frames[frame + TwoColorTimeline.PREV_B]; + a = frames[frame + TwoColorTimeline.PREV_A]; + r2 = frames[frame + TwoColorTimeline.PREV_R2]; + g2 = frames[frame + TwoColorTimeline.PREV_G2]; + b2 = frames[frame + TwoColorTimeline.PREV_B2]; + var frameTime = frames[frame]; + var percent = this.getCurvePercent(frame / TwoColorTimeline.ENTRIES - 1, 1 - (time - frameTime) / (frames[frame + TwoColorTimeline.PREV_TIME] - frameTime)); + r += (frames[frame + TwoColorTimeline.R] - r) * percent; + g += (frames[frame + TwoColorTimeline.G] - g) * percent; + b += (frames[frame + TwoColorTimeline.B] - b) * percent; + a += (frames[frame + TwoColorTimeline.A] - a) * percent; + r2 += (frames[frame + TwoColorTimeline.R2] - r2) * percent; + g2 += (frames[frame + TwoColorTimeline.G2] - g2) * percent; + b2 += (frames[frame + TwoColorTimeline.B2] - b2) * percent; + } + if (alpha == 1) { + slot.color.set(r, g, b, a); + slot.darkColor.set(r2, g2, b2, 1); + } + else { + var light = slot.color, dark = slot.darkColor; + if (pose == MixPose.setup) { + light.setFromColor(slot.data.color); + dark.setFromColor(slot.data.darkColor); + } + light.add((r - light.r) * alpha, (g - light.g) * alpha, (b - light.b) * alpha, (a - light.a) * alpha); + dark.add((r2 - dark.r) * alpha, (g2 - dark.g) * alpha, (b2 - dark.b) * alpha, 0); + } + }; + TwoColorTimeline.ENTRIES = 8; + TwoColorTimeline.PREV_TIME = -8; + TwoColorTimeline.PREV_R = -7; + TwoColorTimeline.PREV_G = -6; + TwoColorTimeline.PREV_B = -5; + TwoColorTimeline.PREV_A = -4; + TwoColorTimeline.PREV_R2 = -3; + TwoColorTimeline.PREV_G2 = -2; + TwoColorTimeline.PREV_B2 = -1; + TwoColorTimeline.R = 1; + TwoColorTimeline.G = 2; + TwoColorTimeline.B = 3; + TwoColorTimeline.A = 4; + TwoColorTimeline.R2 = 5; + TwoColorTimeline.G2 = 6; + TwoColorTimeline.B2 = 7; + return TwoColorTimeline; + }(CurveTimeline)); + core.TwoColorTimeline = TwoColorTimeline; + var AttachmentTimeline = (function () { + function AttachmentTimeline(frameCount) { + this.frames = core.Utils.newFloatArray(frameCount); + this.attachmentNames = new Array(frameCount); + } + AttachmentTimeline.prototype.getPropertyId = function () { + return (TimelineType.attachment << 24) + this.slotIndex; + }; + AttachmentTimeline.prototype.getFrameCount = function () { + return this.frames.length; + }; + AttachmentTimeline.prototype.setFrame = function (frameIndex, time, attachmentName) { + this.frames[frameIndex] = time; + this.attachmentNames[frameIndex] = attachmentName; + }; + AttachmentTimeline.prototype.apply = function (skeleton, lastTime, time, events, alpha, pose, direction) { + var slot = skeleton.slots[this.slotIndex]; + if (direction == MixDirection.out && pose == MixPose.setup) { + var attachmentName_1 = slot.data.attachmentName; + slot.setAttachment(attachmentName_1 == null ? null : skeleton.getAttachment(this.slotIndex, attachmentName_1)); + return; + } + var frames = this.frames; + if (time < frames[0]) { + if (pose == MixPose.setup) { + var attachmentName_2 = slot.data.attachmentName; + slot.setAttachment(attachmentName_2 == null ? null : skeleton.getAttachment(this.slotIndex, attachmentName_2)); + } + return; + } + var frameIndex = 0; + if (time >= frames[frames.length - 1]) + frameIndex = frames.length - 1; + else + frameIndex = Animation.binarySearch(frames, time, 1) - 1; + var attachmentName = this.attachmentNames[frameIndex]; + skeleton.slots[this.slotIndex] + .setAttachment(attachmentName == null ? null : skeleton.getAttachment(this.slotIndex, attachmentName)); + }; + return AttachmentTimeline; + }()); + core.AttachmentTimeline = AttachmentTimeline; + var zeros = null; + var DeformTimeline = (function (_super) { + __extends(DeformTimeline, _super); + function DeformTimeline(frameCount) { + var _this = _super.call(this, frameCount) || this; + _this.frames = core.Utils.newFloatArray(frameCount); + _this.frameVertices = new Array(frameCount); + if (zeros == null) + zeros = core.Utils.newFloatArray(64); + return _this; + } + DeformTimeline.prototype.getPropertyId = function () { + return (TimelineType.deform << 27) + +this.attachment.id + this.slotIndex; + }; + DeformTimeline.prototype.setFrame = function (frameIndex, time, vertices) { + this.frames[frameIndex] = time; + this.frameVertices[frameIndex] = vertices; + }; + DeformTimeline.prototype.apply = function (skeleton, lastTime, time, firedEvents, alpha, pose, direction) { + var slot = skeleton.slots[this.slotIndex]; + var slotAttachment = slot.getAttachment(); + if (!(slotAttachment instanceof core.VertexAttachment) || !slotAttachment.applyDeform(this.attachment)) + return; + var verticesArray = slot.attachmentVertices; + var frameVertices = this.frameVertices; + var vertexCount = frameVertices[0].length; + var vertices = core.Utils.setArraySize(verticesArray, vertexCount); + var frames = this.frames; + if (time < frames[0]) { + var vertexAttachment = slotAttachment; + switch (pose) { + case MixPose.setup: + var zeroVertices = void 0; + if (vertexAttachment.bones == null) { + zeroVertices = vertexAttachment.vertices; + } + else { + zeroVertices = zeros; + if (zeroVertices.length < vertexCount) + zeros = zeroVertices = core.Utils.newFloatArray(vertexCount); + } + core.Utils.arrayCopy(zeroVertices, 0, vertices, 0, vertexCount); + return; + case MixPose.current: + if (alpha == 1) + break; + if (vertexAttachment.bones == null) { + var setupVertices = vertexAttachment.vertices; + for (var i_1 = 0; i_1 < vertexCount; i_1++) + vertices[i_1] += (setupVertices[i_1] - vertices[i_1]) * alpha; + } + else { + alpha = 1 - alpha; + for (var i = 0; i < vertexCount; i++) + vertices[i] *= alpha; + } + } + return; + } + if (time >= frames[frames.length - 1]) { + var lastVertices = frameVertices[frames.length - 1]; + if (alpha == 1) { + core.Utils.arrayCopy(lastVertices, 0, vertices, 0, vertexCount); + } + else if (pose == MixPose.setup) { + var vertexAttachment = slotAttachment; + if (vertexAttachment.bones == null) { + var setupVertices = vertexAttachment.vertices; + for (var i_2 = 0; i_2 < vertexCount; i_2++) { + var setup = setupVertices[i_2]; + vertices[i_2] = setup + (lastVertices[i_2] - setup) * alpha; + } + } + else { + for (var i_3 = 0; i_3 < vertexCount; i_3++) + vertices[i_3] = lastVertices[i_3] * alpha; + } + } + else { + for (var i_4 = 0; i_4 < vertexCount; i_4++) + vertices[i_4] += (lastVertices[i_4] - vertices[i_4]) * alpha; + } + return; + } + var frame = Animation.binarySearch(frames, time); + var prevVertices = frameVertices[frame - 1]; + var nextVertices = frameVertices[frame]; + var frameTime = frames[frame]; + var percent = this.getCurvePercent(frame - 1, 1 - (time - frameTime) / (frames[frame - 1] - frameTime)); + if (alpha == 1) { + for (var i_5 = 0; i_5 < vertexCount; i_5++) { + var prev = prevVertices[i_5]; + vertices[i_5] = prev + (nextVertices[i_5] - prev) * percent; + } + } + else if (pose == MixPose.setup) { + var vertexAttachment = slotAttachment; + if (vertexAttachment.bones == null) { + var setupVertices = vertexAttachment.vertices; + for (var i_6 = 0; i_6 < vertexCount; i_6++) { + var prev = prevVertices[i_6], setup = setupVertices[i_6]; + vertices[i_6] = setup + (prev + (nextVertices[i_6] - prev) * percent - setup) * alpha; + } + } + else { + for (var i_7 = 0; i_7 < vertexCount; i_7++) { + var prev = prevVertices[i_7]; + vertices[i_7] = (prev + (nextVertices[i_7] - prev) * percent) * alpha; + } + } + } + else { + for (var i_8 = 0; i_8 < vertexCount; i_8++) { + var prev = prevVertices[i_8]; + vertices[i_8] += (prev + (nextVertices[i_8] - prev) * percent - vertices[i_8]) * alpha; + } + } + }; + return DeformTimeline; + }(CurveTimeline)); + core.DeformTimeline = DeformTimeline; + var EventTimeline = (function () { + function EventTimeline(frameCount) { + this.frames = core.Utils.newFloatArray(frameCount); + this.events = new Array(frameCount); + } + EventTimeline.prototype.getPropertyId = function () { + return TimelineType.event << 24; + }; + EventTimeline.prototype.getFrameCount = function () { + return this.frames.length; + }; + EventTimeline.prototype.setFrame = function (frameIndex, event) { + this.frames[frameIndex] = event.time; + this.events[frameIndex] = event; + }; + EventTimeline.prototype.apply = function (skeleton, lastTime, time, firedEvents, alpha, pose, direction) { + if (firedEvents == null) + return; + var frames = this.frames; + var frameCount = this.frames.length; + if (lastTime > time) { + this.apply(skeleton, lastTime, Number.MAX_VALUE, firedEvents, alpha, pose, direction); + lastTime = -1; + } + else if (lastTime >= frames[frameCount - 1]) + return; + if (time < frames[0]) + return; + var frame = 0; + if (lastTime < frames[0]) + frame = 0; + else { + frame = Animation.binarySearch(frames, lastTime); + var frameTime = frames[frame]; + while (frame > 0) { + if (frames[frame - 1] != frameTime) + break; + frame--; + } + } + for (; frame < frameCount && time >= frames[frame]; frame++) + firedEvents.push(this.events[frame]); + }; + return EventTimeline; + }()); + core.EventTimeline = EventTimeline; + var DrawOrderTimeline = (function () { + function DrawOrderTimeline(frameCount) { + this.frames = core.Utils.newFloatArray(frameCount); + this.drawOrders = new Array(frameCount); + } + DrawOrderTimeline.prototype.getPropertyId = function () { + return TimelineType.drawOrder << 24; + }; + DrawOrderTimeline.prototype.getFrameCount = function () { + return this.frames.length; + }; + DrawOrderTimeline.prototype.setFrame = function (frameIndex, time, drawOrder) { + this.frames[frameIndex] = time; + this.drawOrders[frameIndex] = drawOrder; + }; + DrawOrderTimeline.prototype.apply = function (skeleton, lastTime, time, firedEvents, alpha, pose, direction) { + var drawOrder = skeleton.drawOrder; + var slots = skeleton.slots; + if (direction == MixDirection.out && pose == MixPose.setup) { + core.Utils.arrayCopy(skeleton.slots, 0, skeleton.drawOrder, 0, skeleton.slots.length); + return; + } + var frames = this.frames; + if (time < frames[0]) { + if (pose == MixPose.setup) + core.Utils.arrayCopy(skeleton.slots, 0, skeleton.drawOrder, 0, skeleton.slots.length); + return; + } + var frame = 0; + if (time >= frames[frames.length - 1]) + frame = frames.length - 1; + else + frame = Animation.binarySearch(frames, time) - 1; + var drawOrderToSetupIndex = this.drawOrders[frame]; + if (drawOrderToSetupIndex == null) + core.Utils.arrayCopy(slots, 0, drawOrder, 0, slots.length); + else { + for (var i = 0, n = drawOrderToSetupIndex.length; i < n; i++) + drawOrder[i] = slots[drawOrderToSetupIndex[i]]; + } + }; + return DrawOrderTimeline; + }()); + core.DrawOrderTimeline = DrawOrderTimeline; + var IkConstraintTimeline = (function (_super) { + __extends(IkConstraintTimeline, _super); + function IkConstraintTimeline(frameCount) { + var _this = _super.call(this, frameCount) || this; + _this.frames = core.Utils.newFloatArray(frameCount * IkConstraintTimeline.ENTRIES); + return _this; + } + IkConstraintTimeline.prototype.getPropertyId = function () { + return (TimelineType.ikConstraint << 24) + this.ikConstraintIndex; + }; + IkConstraintTimeline.prototype.setFrame = function (frameIndex, time, mix, bendDirection) { + frameIndex *= IkConstraintTimeline.ENTRIES; + this.frames[frameIndex] = time; + this.frames[frameIndex + IkConstraintTimeline.MIX] = mix; + this.frames[frameIndex + IkConstraintTimeline.BEND_DIRECTION] = bendDirection; + }; + IkConstraintTimeline.prototype.apply = function (skeleton, lastTime, time, firedEvents, alpha, pose, direction) { + var frames = this.frames; + var constraint = skeleton.ikConstraints[this.ikConstraintIndex]; + if (time < frames[0]) { + switch (pose) { + case MixPose.setup: + constraint.mix = constraint.data.mix; + constraint.bendDirection = constraint.data.bendDirection; + return; + case MixPose.current: + constraint.mix += (constraint.data.mix - constraint.mix) * alpha; + constraint.bendDirection = constraint.data.bendDirection; + } + return; + } + if (time >= frames[frames.length - IkConstraintTimeline.ENTRIES]) { + if (pose == MixPose.setup) { + constraint.mix = constraint.data.mix + (frames[frames.length + IkConstraintTimeline.PREV_MIX] - constraint.data.mix) * alpha; + constraint.bendDirection = direction == MixDirection.out ? constraint.data.bendDirection + : frames[frames.length + IkConstraintTimeline.PREV_BEND_DIRECTION]; + } + else { + constraint.mix += (frames[frames.length + IkConstraintTimeline.PREV_MIX] - constraint.mix) * alpha; + if (direction == MixDirection.in) + constraint.bendDirection = frames[frames.length + IkConstraintTimeline.PREV_BEND_DIRECTION]; + } + return; + } + var frame = Animation.binarySearch(frames, time, IkConstraintTimeline.ENTRIES); + var mix = frames[frame + IkConstraintTimeline.PREV_MIX]; + var frameTime = frames[frame]; + var percent = this.getCurvePercent(frame / IkConstraintTimeline.ENTRIES - 1, 1 - (time - frameTime) / (frames[frame + IkConstraintTimeline.PREV_TIME] - frameTime)); + if (pose == MixPose.setup) { + constraint.mix = constraint.data.mix + (mix + (frames[frame + IkConstraintTimeline.MIX] - mix) * percent - constraint.data.mix) * alpha; + constraint.bendDirection = direction == MixDirection.out ? constraint.data.bendDirection : frames[frame + IkConstraintTimeline.PREV_BEND_DIRECTION]; + } + else { + constraint.mix += (mix + (frames[frame + IkConstraintTimeline.MIX] - mix) * percent - constraint.mix) * alpha; + if (direction == MixDirection.in) + constraint.bendDirection = frames[frame + IkConstraintTimeline.PREV_BEND_DIRECTION]; + } + }; + IkConstraintTimeline.ENTRIES = 3; + IkConstraintTimeline.PREV_TIME = -3; + IkConstraintTimeline.PREV_MIX = -2; + IkConstraintTimeline.PREV_BEND_DIRECTION = -1; + IkConstraintTimeline.MIX = 1; + IkConstraintTimeline.BEND_DIRECTION = 2; + return IkConstraintTimeline; + }(CurveTimeline)); + core.IkConstraintTimeline = IkConstraintTimeline; + var TransformConstraintTimeline = (function (_super) { + __extends(TransformConstraintTimeline, _super); + function TransformConstraintTimeline(frameCount) { + var _this = _super.call(this, frameCount) || this; + _this.frames = core.Utils.newFloatArray(frameCount * TransformConstraintTimeline.ENTRIES); + return _this; + } + TransformConstraintTimeline.prototype.getPropertyId = function () { + return (TimelineType.transformConstraint << 24) + this.transformConstraintIndex; + }; + TransformConstraintTimeline.prototype.setFrame = function (frameIndex, time, rotateMix, translateMix, scaleMix, shearMix) { + frameIndex *= TransformConstraintTimeline.ENTRIES; + this.frames[frameIndex] = time; + this.frames[frameIndex + TransformConstraintTimeline.ROTATE] = rotateMix; + this.frames[frameIndex + TransformConstraintTimeline.TRANSLATE] = translateMix; + this.frames[frameIndex + TransformConstraintTimeline.SCALE] = scaleMix; + this.frames[frameIndex + TransformConstraintTimeline.SHEAR] = shearMix; + }; + TransformConstraintTimeline.prototype.apply = function (skeleton, lastTime, time, firedEvents, alpha, pose, direction) { + var frames = this.frames; + var constraint = skeleton.transformConstraints[this.transformConstraintIndex]; + if (time < frames[0]) { + var data = constraint.data; + switch (pose) { + case MixPose.setup: + constraint.rotateMix = data.rotateMix; + constraint.translateMix = data.translateMix; + constraint.scaleMix = data.scaleMix; + constraint.shearMix = data.shearMix; + return; + case MixPose.current: + constraint.rotateMix += (data.rotateMix - constraint.rotateMix) * alpha; + constraint.translateMix += (data.translateMix - constraint.translateMix) * alpha; + constraint.scaleMix += (data.scaleMix - constraint.scaleMix) * alpha; + constraint.shearMix += (data.shearMix - constraint.shearMix) * alpha; + } + return; + } + var rotate = 0, translate = 0, scale = 0, shear = 0; + if (time >= frames[frames.length - TransformConstraintTimeline.ENTRIES]) { + var i = frames.length; + rotate = frames[i + TransformConstraintTimeline.PREV_ROTATE]; + translate = frames[i + TransformConstraintTimeline.PREV_TRANSLATE]; + scale = frames[i + TransformConstraintTimeline.PREV_SCALE]; + shear = frames[i + TransformConstraintTimeline.PREV_SHEAR]; + } + else { + var frame = Animation.binarySearch(frames, time, TransformConstraintTimeline.ENTRIES); + rotate = frames[frame + TransformConstraintTimeline.PREV_ROTATE]; + translate = frames[frame + TransformConstraintTimeline.PREV_TRANSLATE]; + scale = frames[frame + TransformConstraintTimeline.PREV_SCALE]; + shear = frames[frame + TransformConstraintTimeline.PREV_SHEAR]; + var frameTime = frames[frame]; + var percent = this.getCurvePercent(frame / TransformConstraintTimeline.ENTRIES - 1, 1 - (time - frameTime) / (frames[frame + TransformConstraintTimeline.PREV_TIME] - frameTime)); + rotate += (frames[frame + TransformConstraintTimeline.ROTATE] - rotate) * percent; + translate += (frames[frame + TransformConstraintTimeline.TRANSLATE] - translate) * percent; + scale += (frames[frame + TransformConstraintTimeline.SCALE] - scale) * percent; + shear += (frames[frame + TransformConstraintTimeline.SHEAR] - shear) * percent; + } + if (pose == MixPose.setup) { + var data = constraint.data; + constraint.rotateMix = data.rotateMix + (rotate - data.rotateMix) * alpha; + constraint.translateMix = data.translateMix + (translate - data.translateMix) * alpha; + constraint.scaleMix = data.scaleMix + (scale - data.scaleMix) * alpha; + constraint.shearMix = data.shearMix + (shear - data.shearMix) * alpha; + } + else { + constraint.rotateMix += (rotate - constraint.rotateMix) * alpha; + constraint.translateMix += (translate - constraint.translateMix) * alpha; + constraint.scaleMix += (scale - constraint.scaleMix) * alpha; + constraint.shearMix += (shear - constraint.shearMix) * alpha; + } + }; + TransformConstraintTimeline.ENTRIES = 5; + TransformConstraintTimeline.PREV_TIME = -5; + TransformConstraintTimeline.PREV_ROTATE = -4; + TransformConstraintTimeline.PREV_TRANSLATE = -3; + TransformConstraintTimeline.PREV_SCALE = -2; + TransformConstraintTimeline.PREV_SHEAR = -1; + TransformConstraintTimeline.ROTATE = 1; + TransformConstraintTimeline.TRANSLATE = 2; + TransformConstraintTimeline.SCALE = 3; + TransformConstraintTimeline.SHEAR = 4; + return TransformConstraintTimeline; + }(CurveTimeline)); + core.TransformConstraintTimeline = TransformConstraintTimeline; + var PathConstraintPositionTimeline = (function (_super) { + __extends(PathConstraintPositionTimeline, _super); + function PathConstraintPositionTimeline(frameCount) { + var _this = _super.call(this, frameCount) || this; + _this.frames = core.Utils.newFloatArray(frameCount * PathConstraintPositionTimeline.ENTRIES); + return _this; + } + PathConstraintPositionTimeline.prototype.getPropertyId = function () { + return (TimelineType.pathConstraintPosition << 24) + this.pathConstraintIndex; + }; + PathConstraintPositionTimeline.prototype.setFrame = function (frameIndex, time, value) { + frameIndex *= PathConstraintPositionTimeline.ENTRIES; + this.frames[frameIndex] = time; + this.frames[frameIndex + PathConstraintPositionTimeline.VALUE] = value; + }; + PathConstraintPositionTimeline.prototype.apply = function (skeleton, lastTime, time, firedEvents, alpha, pose, direction) { + var frames = this.frames; + var constraint = skeleton.pathConstraints[this.pathConstraintIndex]; + if (time < frames[0]) { + switch (pose) { + case MixPose.setup: + constraint.position = constraint.data.position; + return; + case MixPose.current: + constraint.position += (constraint.data.position - constraint.position) * alpha; + } + return; + } + var position = 0; + if (time >= frames[frames.length - PathConstraintPositionTimeline.ENTRIES]) + position = frames[frames.length + PathConstraintPositionTimeline.PREV_VALUE]; + else { + var frame = Animation.binarySearch(frames, time, PathConstraintPositionTimeline.ENTRIES); + position = frames[frame + PathConstraintPositionTimeline.PREV_VALUE]; + var frameTime = frames[frame]; + var percent = this.getCurvePercent(frame / PathConstraintPositionTimeline.ENTRIES - 1, 1 - (time - frameTime) / (frames[frame + PathConstraintPositionTimeline.PREV_TIME] - frameTime)); + position += (frames[frame + PathConstraintPositionTimeline.VALUE] - position) * percent; + } + if (pose == MixPose.setup) + constraint.position = constraint.data.position + (position - constraint.data.position) * alpha; + else + constraint.position += (position - constraint.position) * alpha; + }; + PathConstraintPositionTimeline.ENTRIES = 2; + PathConstraintPositionTimeline.PREV_TIME = -2; + PathConstraintPositionTimeline.PREV_VALUE = -1; + PathConstraintPositionTimeline.VALUE = 1; + return PathConstraintPositionTimeline; + }(CurveTimeline)); + core.PathConstraintPositionTimeline = PathConstraintPositionTimeline; + var PathConstraintSpacingTimeline = (function (_super) { + __extends(PathConstraintSpacingTimeline, _super); + function PathConstraintSpacingTimeline(frameCount) { + return _super.call(this, frameCount) || this; + } + PathConstraintSpacingTimeline.prototype.getPropertyId = function () { + return (TimelineType.pathConstraintSpacing << 24) + this.pathConstraintIndex; + }; + PathConstraintSpacingTimeline.prototype.apply = function (skeleton, lastTime, time, firedEvents, alpha, pose, direction) { + var frames = this.frames; + var constraint = skeleton.pathConstraints[this.pathConstraintIndex]; + if (time < frames[0]) { + switch (pose) { + case MixPose.setup: + constraint.spacing = constraint.data.spacing; + return; + case MixPose.current: + constraint.spacing += (constraint.data.spacing - constraint.spacing) * alpha; + } + return; + } + var spacing = 0; + if (time >= frames[frames.length - PathConstraintSpacingTimeline.ENTRIES]) + spacing = frames[frames.length + PathConstraintSpacingTimeline.PREV_VALUE]; + else { + var frame = Animation.binarySearch(frames, time, PathConstraintSpacingTimeline.ENTRIES); + spacing = frames[frame + PathConstraintSpacingTimeline.PREV_VALUE]; + var frameTime = frames[frame]; + var percent = this.getCurvePercent(frame / PathConstraintSpacingTimeline.ENTRIES - 1, 1 - (time - frameTime) / (frames[frame + PathConstraintSpacingTimeline.PREV_TIME] - frameTime)); + spacing += (frames[frame + PathConstraintSpacingTimeline.VALUE] - spacing) * percent; + } + if (pose == MixPose.setup) + constraint.spacing = constraint.data.spacing + (spacing - constraint.data.spacing) * alpha; + else + constraint.spacing += (spacing - constraint.spacing) * alpha; + }; + return PathConstraintSpacingTimeline; + }(PathConstraintPositionTimeline)); + core.PathConstraintSpacingTimeline = PathConstraintSpacingTimeline; + var PathConstraintMixTimeline = (function (_super) { + __extends(PathConstraintMixTimeline, _super); + function PathConstraintMixTimeline(frameCount) { + var _this = _super.call(this, frameCount) || this; + _this.frames = core.Utils.newFloatArray(frameCount * PathConstraintMixTimeline.ENTRIES); + return _this; + } + PathConstraintMixTimeline.prototype.getPropertyId = function () { + return (TimelineType.pathConstraintMix << 24) + this.pathConstraintIndex; + }; + PathConstraintMixTimeline.prototype.setFrame = function (frameIndex, time, rotateMix, translateMix) { + frameIndex *= PathConstraintMixTimeline.ENTRIES; + this.frames[frameIndex] = time; + this.frames[frameIndex + PathConstraintMixTimeline.ROTATE] = rotateMix; + this.frames[frameIndex + PathConstraintMixTimeline.TRANSLATE] = translateMix; + }; + PathConstraintMixTimeline.prototype.apply = function (skeleton, lastTime, time, firedEvents, alpha, pose, direction) { + var frames = this.frames; + var constraint = skeleton.pathConstraints[this.pathConstraintIndex]; + if (time < frames[0]) { + switch (pose) { + case MixPose.setup: + constraint.rotateMix = constraint.data.rotateMix; + constraint.translateMix = constraint.data.translateMix; + return; + case MixPose.current: + constraint.rotateMix += (constraint.data.rotateMix - constraint.rotateMix) * alpha; + constraint.translateMix += (constraint.data.translateMix - constraint.translateMix) * alpha; + } + return; + } + var rotate = 0, translate = 0; + if (time >= frames[frames.length - PathConstraintMixTimeline.ENTRIES]) { + rotate = frames[frames.length + PathConstraintMixTimeline.PREV_ROTATE]; + translate = frames[frames.length + PathConstraintMixTimeline.PREV_TRANSLATE]; + } + else { + var frame = Animation.binarySearch(frames, time, PathConstraintMixTimeline.ENTRIES); + rotate = frames[frame + PathConstraintMixTimeline.PREV_ROTATE]; + translate = frames[frame + PathConstraintMixTimeline.PREV_TRANSLATE]; + var frameTime = frames[frame]; + var percent = this.getCurvePercent(frame / PathConstraintMixTimeline.ENTRIES - 1, 1 - (time - frameTime) / (frames[frame + PathConstraintMixTimeline.PREV_TIME] - frameTime)); + rotate += (frames[frame + PathConstraintMixTimeline.ROTATE] - rotate) * percent; + translate += (frames[frame + PathConstraintMixTimeline.TRANSLATE] - translate) * percent; + } + if (pose == MixPose.setup) { + constraint.rotateMix = constraint.data.rotateMix + (rotate - constraint.data.rotateMix) * alpha; + constraint.translateMix = constraint.data.translateMix + (translate - constraint.data.translateMix) * alpha; + } + else { + constraint.rotateMix += (rotate - constraint.rotateMix) * alpha; + constraint.translateMix += (translate - constraint.translateMix) * alpha; + } + }; + PathConstraintMixTimeline.ENTRIES = 3; + PathConstraintMixTimeline.PREV_TIME = -3; + PathConstraintMixTimeline.PREV_ROTATE = -2; + PathConstraintMixTimeline.PREV_TRANSLATE = -1; + PathConstraintMixTimeline.ROTATE = 1; + PathConstraintMixTimeline.TRANSLATE = 2; + return PathConstraintMixTimeline; + }(CurveTimeline)); + core.PathConstraintMixTimeline = PathConstraintMixTimeline; + })(core = pixi_spine.core || (pixi_spine.core = {})); +})(pixi_spine || (pixi_spine = {})); +var pixi_spine; +(function (pixi_spine) { + var core; + (function (core) { + var AnimationState = (function () { + function AnimationState(data) { + this.tracks = new Array(); + this.events = new Array(); + this.listeners = new Array(); + this.queue = new EventQueue(this); + this.propertyIDs = new core.IntSet(); + this.mixingTo = new Array(); + this.animationsChanged = false; + this.timeScale = 1; + this.trackEntryPool = new core.Pool(function () { return new TrackEntry(); }); + this.data = data; + } + AnimationState.prototype.update = function (delta) { + delta *= this.timeScale; + var tracks = this.tracks; + for (var i = 0, n = tracks.length; i < n; i++) { + var current = tracks[i]; + if (current == null) + continue; + current.animationLast = current.nextAnimationLast; + current.trackLast = current.nextTrackLast; + var currentDelta = delta * current.timeScale; + if (current.delay > 0) { + current.delay -= currentDelta; + if (current.delay > 0) + continue; + currentDelta = -current.delay; + current.delay = 0; + } + var next = current.next; + if (next != null) { + var nextTime = current.trackLast - next.delay; + if (nextTime >= 0) { + next.delay = 0; + next.trackTime = nextTime + delta * next.timeScale; + current.trackTime += currentDelta; + this.setCurrent(i, next, true); + while (next.mixingFrom != null) { + next.mixTime += currentDelta; + next = next.mixingFrom; + } + continue; + } + } + else if (current.trackLast >= current.trackEnd && current.mixingFrom == null) { + tracks[i] = null; + this.queue.end(current); + this.disposeNext(current); + continue; + } + if (current.mixingFrom != null && this.updateMixingFrom(current, delta)) { + var from = current.mixingFrom; + current.mixingFrom = null; + while (from != null) { + this.queue.end(from); + from = from.mixingFrom; + } + } + current.trackTime += currentDelta; + } + this.queue.drain(); + }; + AnimationState.prototype.updateMixingFrom = function (to, delta) { + var from = to.mixingFrom; + if (from == null) + return true; + var finished = this.updateMixingFrom(from, delta); + if (to.mixTime > 0 && (to.mixTime >= to.mixDuration || to.timeScale == 0)) { + if (from.totalAlpha == 0) { + to.mixingFrom = from.mixingFrom; + to.interruptAlpha = from.interruptAlpha; + this.queue.end(from); + } + return finished; + } + from.animationLast = from.nextAnimationLast; + from.trackLast = from.nextTrackLast; + from.trackTime += delta * from.timeScale; + to.mixTime += delta * to.timeScale; + return false; + }; + AnimationState.prototype.apply = function (skeleton) { + if (skeleton == null) + throw new Error("skeleton cannot be null."); + if (this.animationsChanged) + this._animationsChanged(); + var events = this.events; + var tracks = this.tracks; + var applied = false; + for (var i = 0, n = tracks.length; i < n; i++) { + var current = tracks[i]; + if (current == null || current.delay > 0) + continue; + applied = true; + var currentPose = i == 0 ? core.MixPose.current : core.MixPose.currentLayered; + var mix = current.alpha; + if (current.mixingFrom != null) + mix *= this.applyMixingFrom(current, skeleton, currentPose); + else if (current.trackTime >= current.trackEnd && current.next == null) + mix = 0; + var animationLast = current.animationLast, animationTime = current.getAnimationTime(); + var timelineCount = current.animation.timelines.length; + var timelines = current.animation.timelines; + if (mix == 1) { + for (var ii = 0; ii < timelineCount; ii++) + timelines[ii].apply(skeleton, animationLast, animationTime, events, 1, core.MixPose.setup, core.MixDirection.in); + } + else { + var timelineData = current.timelineData; + var firstFrame = current.timelinesRotation.length == 0; + if (firstFrame) + core.Utils.setArraySize(current.timelinesRotation, timelineCount << 1, null); + var timelinesRotation = current.timelinesRotation; + for (var ii = 0; ii < timelineCount; ii++) { + var timeline = timelines[ii]; + var pose = timelineData[ii] >= AnimationState.FIRST ? core.MixPose.setup : currentPose; + if (timeline instanceof core.RotateTimeline) { + this.applyRotateTimeline(timeline, skeleton, animationTime, mix, pose, timelinesRotation, ii << 1, firstFrame); + } + else + timeline.apply(skeleton, animationLast, animationTime, events, mix, pose, core.MixDirection.in); + } + } + this.queueEvents(current, animationTime); + events.length = 0; + current.nextAnimationLast = animationTime; + current.nextTrackLast = current.trackTime; + } + this.queue.drain(); + return applied; + }; + AnimationState.prototype.applyMixingFrom = function (to, skeleton, currentPose) { + var from = to.mixingFrom; + if (from.mixingFrom != null) + this.applyMixingFrom(from, skeleton, currentPose); + var mix = 0; + if (to.mixDuration == 0) + mix = 1; + else { + mix = to.mixTime / to.mixDuration; + if (mix > 1) + mix = 1; + } + var events = mix < from.eventThreshold ? this.events : null; + var attachments = mix < from.attachmentThreshold, drawOrder = mix < from.drawOrderThreshold; + var animationLast = from.animationLast, animationTime = from.getAnimationTime(); + var timelineCount = from.animation.timelines.length; + var timelines = from.animation.timelines; + var timelineData = from.timelineData; + var timelineDipMix = from.timelineDipMix; + var firstFrame = from.timelinesRotation.length == 0; + if (firstFrame) + core.Utils.setArraySize(from.timelinesRotation, timelineCount << 1, null); + var timelinesRotation = from.timelinesRotation; + var pose; + var alphaDip = from.alpha * to.interruptAlpha, alphaMix = alphaDip * (1 - mix), alpha = 0; + from.totalAlpha = 0; + for (var i = 0; i < timelineCount; i++) { + var timeline = timelines[i]; + switch (timelineData[i]) { + case AnimationState.SUBSEQUENT: + if (!attachments && timeline instanceof core.AttachmentTimeline) + continue; + if (!drawOrder && timeline instanceof core.DrawOrderTimeline) + continue; + pose = currentPose; + alpha = alphaMix; + break; + case AnimationState.FIRST: + pose = core.MixPose.setup; + alpha = alphaMix; + break; + case AnimationState.DIP: + pose = core.MixPose.setup; + alpha = alphaDip; + break; + default: + pose = core.MixPose.setup; + alpha = alphaDip; + var dipMix = timelineDipMix[i]; + alpha *= Math.max(0, 1 - dipMix.mixTime / dipMix.mixDuration); + break; + } + from.totalAlpha += alpha; + if (timeline instanceof core.RotateTimeline) + this.applyRotateTimeline(timeline, skeleton, animationTime, alpha, pose, timelinesRotation, i << 1, firstFrame); + else { + timeline.apply(skeleton, animationLast, animationTime, events, alpha, pose, core.MixDirection.out); + } + } + if (to.mixDuration > 0) + this.queueEvents(from, animationTime); + this.events.length = 0; + from.nextAnimationLast = animationTime; + from.nextTrackLast = from.trackTime; + return mix; + }; + AnimationState.prototype.applyRotateTimeline = function (timeline, skeleton, time, alpha, pose, timelinesRotation, i, firstFrame) { + if (firstFrame) + timelinesRotation[i] = 0; + if (alpha == 1) { + timeline.apply(skeleton, 0, time, null, 1, pose, core.MixDirection.in); + return; + } + var rotateTimeline = timeline; + var frames = rotateTimeline.frames; + var bone = skeleton.bones[rotateTimeline.boneIndex]; + if (time < frames[0]) { + if (pose == core.MixPose.setup) + bone.rotation = bone.data.rotation; + return; + } + var r2 = 0; + if (time >= frames[frames.length - core.RotateTimeline.ENTRIES]) + r2 = bone.data.rotation + frames[frames.length + core.RotateTimeline.PREV_ROTATION]; + else { + var frame = core.Animation.binarySearch(frames, time, core.RotateTimeline.ENTRIES); + var prevRotation = frames[frame + core.RotateTimeline.PREV_ROTATION]; + var frameTime = frames[frame]; + var percent = rotateTimeline.getCurvePercent((frame >> 1) - 1, 1 - (time - frameTime) / (frames[frame + core.RotateTimeline.PREV_TIME] - frameTime)); + r2 = frames[frame + core.RotateTimeline.ROTATION] - prevRotation; + r2 -= (16384 - ((16384.499999999996 - r2 / 360) | 0)) * 360; + r2 = prevRotation + r2 * percent + bone.data.rotation; + r2 -= (16384 - ((16384.499999999996 - r2 / 360) | 0)) * 360; + } + var r1 = pose == core.MixPose.setup ? bone.data.rotation : bone.rotation; + var total = 0, diff = r2 - r1; + if (diff == 0) { + total = timelinesRotation[i]; + } + else { + diff -= (16384 - ((16384.499999999996 - diff / 360) | 0)) * 360; + var lastTotal = 0, lastDiff = 0; + if (firstFrame) { + lastTotal = 0; + lastDiff = diff; + } + else { + lastTotal = timelinesRotation[i]; + lastDiff = timelinesRotation[i + 1]; + } + var current = diff > 0, dir = lastTotal >= 0; + if (core.MathUtils.signum(lastDiff) != core.MathUtils.signum(diff) && Math.abs(lastDiff) <= 90) { + if (Math.abs(lastTotal) > 180) + lastTotal += 360 * core.MathUtils.signum(lastTotal); + dir = current; + } + total = diff + lastTotal - lastTotal % 360; + if (dir != current) + total += 360 * core.MathUtils.signum(lastTotal); + timelinesRotation[i] = total; + } + timelinesRotation[i + 1] = diff; + r1 += total * alpha; + bone.rotation = r1 - (16384 - ((16384.499999999996 - r1 / 360) | 0)) * 360; + }; + AnimationState.prototype.queueEvents = function (entry, animationTime) { + var animationStart = entry.animationStart, animationEnd = entry.animationEnd; + var duration = animationEnd - animationStart; + var trackLastWrapped = entry.trackLast % duration; + var events = this.events; + var i = 0, n = events.length; + for (; i < n; i++) { + var event_1 = events[i]; + if (event_1.time < trackLastWrapped) + break; + if (event_1.time > animationEnd) + continue; + this.queue.event(entry, event_1); + } + if (entry.loop ? (trackLastWrapped > entry.trackTime % duration) + : (animationTime >= animationEnd && entry.animationLast < animationEnd)) { + this.queue.complete(entry); + } + for (; i < n; i++) { + var event_2 = events[i]; + if (event_2.time < animationStart) + continue; + this.queue.event(entry, events[i]); + } + }; + AnimationState.prototype.clearTracks = function () { + var oldDrainDisabled = this.queue.drainDisabled; + this.queue.drainDisabled = true; + for (var i = 0, n = this.tracks.length; i < n; i++) + this.clearTrack(i); + this.tracks.length = 0; + this.queue.drainDisabled = oldDrainDisabled; + this.queue.drain(); + }; + AnimationState.prototype.clearTrack = function (trackIndex) { + if (trackIndex >= this.tracks.length) + return; + var current = this.tracks[trackIndex]; + if (current == null) + return; + this.queue.end(current); + this.disposeNext(current); + var entry = current; + while (true) { + var from = entry.mixingFrom; + if (from == null) + break; + this.queue.end(from); + entry.mixingFrom = null; + entry = from; + } + this.tracks[current.trackIndex] = null; + this.queue.drain(); + }; + AnimationState.prototype.setCurrent = function (index, current, interrupt) { + var from = this.expandToIndex(index); + this.tracks[index] = current; + if (from != null) { + if (interrupt) + this.queue.interrupt(from); + current.mixingFrom = from; + current.mixTime = 0; + if (from.mixingFrom != null && from.mixDuration > 0) + current.interruptAlpha *= Math.min(1, from.mixTime / from.mixDuration); + from.timelinesRotation.length = 0; + } + this.queue.start(current); + }; + AnimationState.prototype.setAnimation = function (trackIndex, animationName, loop) { + var animation = this.data.skeletonData.findAnimation(animationName); + if (animation == null) + throw new Error("Animation not found: " + animationName); + return this.setAnimationWith(trackIndex, animation, loop); + }; + AnimationState.prototype.setAnimationWith = function (trackIndex, animation, loop) { + if (animation == null) + throw new Error("animation cannot be null."); + var interrupt = true; + var current = this.expandToIndex(trackIndex); + if (current != null) { + if (current.nextTrackLast == -1) { + this.tracks[trackIndex] = current.mixingFrom; + this.queue.interrupt(current); + this.queue.end(current); + this.disposeNext(current); + current = current.mixingFrom; + interrupt = false; + } + else + this.disposeNext(current); + } + var entry = this.trackEntry(trackIndex, animation, loop, current); + this.setCurrent(trackIndex, entry, interrupt); + this.queue.drain(); + return entry; + }; + AnimationState.prototype.addAnimation = function (trackIndex, animationName, loop, delay) { + var animation = this.data.skeletonData.findAnimation(animationName); + if (animation == null) + throw new Error("Animation not found: " + animationName); + return this.addAnimationWith(trackIndex, animation, loop, delay); + }; + AnimationState.prototype.addAnimationWith = function (trackIndex, animation, loop, delay) { + if (animation == null) + throw new Error("animation cannot be null."); + var last = this.expandToIndex(trackIndex); + if (last != null) { + while (last.next != null) + last = last.next; + } + var entry = this.trackEntry(trackIndex, animation, loop, last); + if (last == null) { + this.setCurrent(trackIndex, entry, true); + this.queue.drain(); + } + else { + last.next = entry; + if (delay <= 0) { + var duration = last.animationEnd - last.animationStart; + if (duration != 0) + delay += duration * (1 + ((last.trackTime / duration) | 0)) - this.data.getMix(last.animation, animation); + else + delay = 0; + } + } + entry.delay = delay; + return entry; + }; + AnimationState.prototype.setEmptyAnimation = function (trackIndex, mixDuration) { + var entry = this.setAnimationWith(trackIndex, AnimationState.emptyAnimation, false); + entry.mixDuration = mixDuration; + entry.trackEnd = mixDuration; + return entry; + }; + AnimationState.prototype.addEmptyAnimation = function (trackIndex, mixDuration, delay) { + if (delay <= 0) + delay -= mixDuration; + var entry = this.addAnimationWith(trackIndex, AnimationState.emptyAnimation, false, delay); + entry.mixDuration = mixDuration; + entry.trackEnd = mixDuration; + return entry; + }; + AnimationState.prototype.setEmptyAnimations = function (mixDuration) { + var oldDrainDisabled = this.queue.drainDisabled; + this.queue.drainDisabled = true; + for (var i = 0, n = this.tracks.length; i < n; i++) { + var current = this.tracks[i]; + if (current != null) + this.setEmptyAnimation(current.trackIndex, mixDuration); + } + this.queue.drainDisabled = oldDrainDisabled; + this.queue.drain(); + }; + AnimationState.prototype.expandToIndex = function (index) { + if (index < this.tracks.length) + return this.tracks[index]; + core.Utils.ensureArrayCapacity(this.tracks, index - this.tracks.length + 1, null); + this.tracks.length = index + 1; + return null; + }; + AnimationState.prototype.trackEntry = function (trackIndex, animation, loop, last) { + var entry = this.trackEntryPool.obtain(); + entry.trackIndex = trackIndex; + entry.animation = animation; + entry.loop = loop; + entry.eventThreshold = 0; + entry.attachmentThreshold = 0; + entry.drawOrderThreshold = 0; + entry.animationStart = 0; + entry.animationEnd = animation.duration; + entry.animationLast = -1; + entry.nextAnimationLast = -1; + entry.delay = 0; + entry.trackTime = 0; + entry.trackLast = -1; + entry.nextTrackLast = -1; + entry.trackEnd = Number.MAX_VALUE; + entry.timeScale = 1; + entry.alpha = 1; + entry.interruptAlpha = 1; + entry.mixTime = 0; + entry.mixDuration = last == null ? 0 : this.data.getMix(last.animation, animation); + return entry; + }; + AnimationState.prototype.disposeNext = function (entry) { + var next = entry.next; + while (next != null) { + this.queue.dispose(next); + next = next.next; + } + entry.next = null; + }; + AnimationState.prototype._animationsChanged = function () { + this.animationsChanged = false; + var propertyIDs = this.propertyIDs; + propertyIDs.clear(); + var mixingTo = this.mixingTo; + var lastEntry = null; + for (var i = 0, n = this.tracks.length; i < n; i++) { + var entry = this.tracks[i]; + if (entry != null) + entry.setTimelineData(null, mixingTo, propertyIDs); + } + }; + AnimationState.prototype.getCurrent = function (trackIndex) { + if (trackIndex >= this.tracks.length) + return null; + return this.tracks[trackIndex]; + }; + AnimationState.prototype.addListener = function (listener) { + if (listener == null) + throw new Error("listener cannot be null."); + this.listeners.push(listener); + }; + AnimationState.prototype.removeListener = function (listener) { + var index = this.listeners.indexOf(listener); + if (index >= 0) + this.listeners.splice(index, 1); + }; + AnimationState.prototype.clearListeners = function () { + this.listeners.length = 0; + }; + AnimationState.prototype.clearListenerNotifications = function () { + this.queue.clear(); + }; + AnimationState.prototype.setAnimationByName = function (trackIndex, animationName, loop) { + if (!AnimationState.deprecatedWarning1) { + AnimationState.deprecatedWarning1 = true; + console.warn("Deprecation Warning: AnimationState.setAnimationByName is deprecated, please use setAnimation from now on."); + } + this.setAnimation(trackIndex, animationName, loop); + }; + AnimationState.prototype.addAnimationByName = function (trackIndex, animationName, loop, delay) { + if (!AnimationState.deprecatedWarning2) { + AnimationState.deprecatedWarning2 = true; + console.warn("Deprecation Warning: AnimationState.addAnimationByName is deprecated, please use addAnimation from now on."); + } + this.addAnimation(trackIndex, animationName, loop, delay); + }; + AnimationState.prototype.hasAnimation = function (animationName) { + var animation = this.data.skeletonData.findAnimation(animationName); + return animation !== null; + }; + AnimationState.prototype.hasAnimationByName = function (animationName) { + if (!AnimationState.deprecatedWarning3) { + AnimationState.deprecatedWarning3 = true; + console.warn("Deprecation Warning: AnimationState.hasAnimationByName is deprecated, please use hasAnimation from now on."); + } + return this.hasAnimation(animationName); + }; + AnimationState.emptyAnimation = new core.Animation("", [], 0); + AnimationState.SUBSEQUENT = 0; + AnimationState.FIRST = 1; + AnimationState.DIP = 2; + AnimationState.DIP_MIX = 3; + AnimationState.deprecatedWarning1 = false; + AnimationState.deprecatedWarning2 = false; + AnimationState.deprecatedWarning3 = false; + return AnimationState; + }()); + core.AnimationState = AnimationState; + var TrackEntry = (function () { + function TrackEntry() { + this.timelineData = new Array(); + this.timelineDipMix = new Array(); + this.timelinesRotation = new Array(); + } + TrackEntry.prototype.reset = function () { + this.next = null; + this.mixingFrom = null; + this.animation = null; + this.listener = null; + this.timelineData.length = 0; + this.timelineDipMix.length = 0; + this.timelinesRotation.length = 0; + }; + TrackEntry.prototype.setTimelineData = function (to, mixingToArray, propertyIDs) { + if (to != null) + mixingToArray.push(to); + var lastEntry = this.mixingFrom != null ? this.mixingFrom.setTimelineData(this, mixingToArray, propertyIDs) : this; + if (to != null) + mixingToArray.pop(); + var mixingTo = mixingToArray; + var mixingToLast = mixingToArray.length - 1; + var timelines = this.animation.timelines; + var timelinesCount = this.animation.timelines.length; + var timelineData = core.Utils.setArraySize(this.timelineData, timelinesCount); + this.timelineDipMix.length = 0; + var timelineDipMix = core.Utils.setArraySize(this.timelineDipMix, timelinesCount); + outer: for (var i = 0; i < timelinesCount; i++) { + var id = timelines[i].getPropertyId(); + if (!propertyIDs.add(id)) + timelineData[i] = AnimationState.SUBSEQUENT; + else if (to == null || !to.hasTimeline(id)) + timelineData[i] = AnimationState.FIRST; + else { + for (var ii = mixingToLast; ii >= 0; ii--) { + var entry = mixingTo[ii]; + if (!entry.hasTimeline(id)) { + if (entry.mixDuration > 0) { + timelineData[i] = AnimationState.DIP_MIX; + timelineDipMix[i] = entry; + continue outer; + } + } + } + timelineData[i] = AnimationState.DIP; + } + } + return lastEntry; + }; + TrackEntry.prototype.hasTimeline = function (id) { + var timelines = this.animation.timelines; + for (var i = 0, n = timelines.length; i < n; i++) + if (timelines[i].getPropertyId() == id) + return true; + return false; + }; + TrackEntry.prototype.getAnimationTime = function () { + if (this.loop) { + var duration = this.animationEnd - this.animationStart; + if (duration == 0) + return this.animationStart; + return (this.trackTime % duration) + this.animationStart; + } + return Math.min(this.trackTime + this.animationStart, this.animationEnd); + }; + TrackEntry.prototype.setAnimationLast = function (animationLast) { + this.animationLast = animationLast; + this.nextAnimationLast = animationLast; + }; + TrackEntry.prototype.isComplete = function () { + return this.trackTime >= this.animationEnd - this.animationStart; + }; + TrackEntry.prototype.resetRotationDirections = function () { + this.timelinesRotation.length = 0; + }; + Object.defineProperty(TrackEntry.prototype, "time", { + get: function () { + if (!TrackEntry.deprecatedWarning1) { + TrackEntry.deprecatedWarning1 = true; + console.warn("Deprecation Warning: TrackEntry.time is deprecated, please use trackTime from now on."); + } + return this.trackTime; + }, + set: function (value) { + if (!TrackEntry.deprecatedWarning1) { + TrackEntry.deprecatedWarning1 = true; + console.warn("Deprecation Warning: TrackEntry.time is deprecated, please use trackTime from now on."); + } + this.trackTime = value; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(TrackEntry.prototype, "endTime", { + get: function () { + if (!TrackEntry.deprecatedWarning2) { + TrackEntry.deprecatedWarning2 = true; + console.warn("Deprecation Warning: TrackEntry.endTime is deprecated, please use trackEnd from now on."); + } + return this.trackTime; + }, + set: function (value) { + if (!TrackEntry.deprecatedWarning2) { + TrackEntry.deprecatedWarning2 = true; + console.warn("Deprecation Warning: TrackEntry.endTime is deprecated, please use trackEnd from now on."); + } + this.trackTime = value; + }, + enumerable: true, + configurable: true + }); + TrackEntry.prototype.loopsCount = function () { + return Math.floor(this.trackTime / this.trackEnd); + }; + TrackEntry.deprecatedWarning1 = false; + TrackEntry.deprecatedWarning2 = false; + return TrackEntry; + }()); + core.TrackEntry = TrackEntry; + var EventQueue = (function () { + function EventQueue(animState) { + this.objects = []; + this.drainDisabled = false; + this.animState = animState; + } + EventQueue.prototype.start = function (entry) { + this.objects.push(EventType.start); + this.objects.push(entry); + this.animState.animationsChanged = true; + }; + EventQueue.prototype.interrupt = function (entry) { + this.objects.push(EventType.interrupt); + this.objects.push(entry); + }; + EventQueue.prototype.end = function (entry) { + this.objects.push(EventType.end); + this.objects.push(entry); + this.animState.animationsChanged = true; + }; + EventQueue.prototype.dispose = function (entry) { + this.objects.push(EventType.dispose); + this.objects.push(entry); + }; + EventQueue.prototype.complete = function (entry) { + this.objects.push(EventType.complete); + this.objects.push(entry); + }; + EventQueue.prototype.event = function (entry, event) { + this.objects.push(EventType.event); + this.objects.push(entry); + this.objects.push(event); + }; + EventQueue.prototype.deprecateStuff = function () { + if (!EventQueue.deprecatedWarning1) { + EventQueue.deprecatedWarning1 = true; + console.warn("Deprecation Warning: onComplete, onStart, onEnd, onEvent art deprecated, please use listeners from now on. 'state.addListener({ complete: function(track, event) { } })'"); + } + return true; + }; + EventQueue.prototype.drain = function () { + if (this.drainDisabled) + return; + this.drainDisabled = true; + var objects = this.objects; + var listeners = this.animState.listeners; + for (var i = 0; i < objects.length; i += 2) { + var type = objects[i]; + var entry = objects[i + 1]; + switch (type) { + case EventType.start: + if (entry.listener != null && entry.listener.start) + entry.listener.start(entry); + for (var ii = 0; ii < listeners.length; ii++) + if (listeners[ii].start) + listeners[ii].start(entry); + entry.onStart && this.deprecateStuff() && entry.onStart(entry.trackIndex); + this.animState.onStart && this.deprecateStuff() && this.deprecateStuff && this.animState.onStart(entry.trackIndex); + break; + case EventType.interrupt: + if (entry.listener != null && entry.listener.interrupt) + entry.listener.interrupt(entry); + for (var ii = 0; ii < listeners.length; ii++) + if (listeners[ii].interrupt) + listeners[ii].interrupt(entry); + break; + case EventType.end: + if (entry.listener != null && entry.listener.end) + entry.listener.end(entry); + for (var ii = 0; ii < listeners.length; ii++) + if (listeners[ii].end) + listeners[ii].end(entry); + entry.onEnd && this.deprecateStuff() && entry.onEnd(entry.trackIndex); + this.animState.onEnd && this.deprecateStuff() && this.animState.onEnd(entry.trackIndex); + case EventType.dispose: + if (entry.listener != null && entry.listener.dispose) + entry.listener.dispose(entry); + for (var ii = 0; ii < listeners.length; ii++) + if (listeners[ii].dispose) + listeners[ii].dispose(entry); + this.animState.trackEntryPool.free(entry); + break; + case EventType.complete: + if (entry.listener != null && entry.listener.complete) + entry.listener.complete(entry); + for (var ii = 0; ii < listeners.length; ii++) + if (listeners[ii].complete) + listeners[ii].complete(entry); + var count = core.MathUtils.toInt(entry.loopsCount()); + entry.onComplete && this.deprecateStuff() && entry.onComplete(entry.trackIndex, count); + this.animState.onComplete && this.deprecateStuff() && this.animState.onComplete(entry.trackIndex, count); + break; + case EventType.event: + var event_3 = objects[i++ + 2]; + if (entry.listener != null && entry.listener.event) + entry.listener.event(entry, event_3); + for (var ii = 0; ii < listeners.length; ii++) + if (listeners[ii].event) + listeners[ii].event(entry, event_3); + entry.onEvent && this.deprecateStuff() && entry.onEvent(entry.trackIndex, event_3); + this.animState.onEvent && this.deprecateStuff() && this.animState.onEvent(entry.trackIndex, event_3); + break; + } + } + this.clear(); + this.drainDisabled = false; + }; + EventQueue.prototype.clear = function () { + this.objects.length = 0; + }; + EventQueue.deprecatedWarning1 = false; + return EventQueue; + }()); + core.EventQueue = EventQueue; + var EventType; + (function (EventType) { + EventType[EventType["start"] = 0] = "start"; + EventType[EventType["interrupt"] = 1] = "interrupt"; + EventType[EventType["end"] = 2] = "end"; + EventType[EventType["dispose"] = 3] = "dispose"; + EventType[EventType["complete"] = 4] = "complete"; + EventType[EventType["event"] = 5] = "event"; + })(EventType = core.EventType || (core.EventType = {})); + var AnimationStateAdapter2 = (function () { + function AnimationStateAdapter2() { + } + AnimationStateAdapter2.prototype.start = function (entry) { + }; + AnimationStateAdapter2.prototype.interrupt = function (entry) { + }; + AnimationStateAdapter2.prototype.end = function (entry) { + }; + AnimationStateAdapter2.prototype.dispose = function (entry) { + }; + AnimationStateAdapter2.prototype.complete = function (entry) { + }; + AnimationStateAdapter2.prototype.event = function (entry, event) { + }; + return AnimationStateAdapter2; + }()); + core.AnimationStateAdapter2 = AnimationStateAdapter2; + })(core = pixi_spine.core || (pixi_spine.core = {})); +})(pixi_spine || (pixi_spine = {})); +var pixi_spine; +(function (pixi_spine) { + var core; + (function (core) { + var AnimationStateData = (function () { + function AnimationStateData(skeletonData) { + this.animationToMixTime = {}; + this.defaultMix = 0; + if (skeletonData == null) + throw new Error("skeletonData cannot be null."); + this.skeletonData = skeletonData; + } + AnimationStateData.prototype.setMix = function (fromName, toName, duration) { + var from = this.skeletonData.findAnimation(fromName); + if (from == null) + throw new Error("Animation not found: " + fromName); + var to = this.skeletonData.findAnimation(toName); + if (to == null) + throw new Error("Animation not found: " + toName); + this.setMixWith(from, to, duration); + }; + AnimationStateData.prototype.setMixByName = function (fromName, toName, duration) { + if (!AnimationStateData.deprecatedWarning1) { + AnimationStateData.deprecatedWarning1 = true; + console.warn("Deprecation Warning: AnimationStateData.setMixByName is deprecated, please use setMix from now on."); + } + this.setMix(fromName, toName, duration); + }; + AnimationStateData.prototype.setMixWith = function (from, to, duration) { + if (from == null) + throw new Error("from cannot be null."); + if (to == null) + throw new Error("to cannot be null."); + var key = from.name + to.name; + this.animationToMixTime[key] = duration; + }; + AnimationStateData.prototype.getMix = function (from, to) { + var key = from.name + to.name; + var value = this.animationToMixTime[key]; + return value === undefined ? this.defaultMix : value; + }; + AnimationStateData.deprecatedWarning1 = false; + return AnimationStateData; + }()); + core.AnimationStateData = AnimationStateData; + })(core = pixi_spine.core || (pixi_spine.core = {})); +})(pixi_spine || (pixi_spine = {})); +var pixi_spine; +(function (pixi_spine) { + var core; + (function (core) { + var AtlasAttachmentLoader = (function () { + function AtlasAttachmentLoader(atlas) { + this.atlas = atlas; + } + AtlasAttachmentLoader.prototype.newRegionAttachment = function (skin, name, path) { + var region = this.atlas.findRegion(path); + if (region == null) + throw new Error("Region not found in atlas: " + path + " (region attachment: " + name + ")"); + var attachment = new core.RegionAttachment(name); + attachment.region = region; + return attachment; + }; + AtlasAttachmentLoader.prototype.newMeshAttachment = function (skin, name, path) { + var region = this.atlas.findRegion(path); + if (region == null) + throw new Error("Region not found in atlas: " + path + " (mesh attachment: " + name + ")"); + var attachment = new core.MeshAttachment(name); + attachment.region = region; + return attachment; + }; + AtlasAttachmentLoader.prototype.newBoundingBoxAttachment = function (skin, name) { + return new core.BoundingBoxAttachment(name); + }; + AtlasAttachmentLoader.prototype.newPathAttachment = function (skin, name) { + return new core.PathAttachment(name); + }; + AtlasAttachmentLoader.prototype.newPointAttachment = function (skin, name) { + return new core.PointAttachment(name); + }; + AtlasAttachmentLoader.prototype.newClippingAttachment = function (skin, name) { + return new core.ClippingAttachment(name); + }; + return AtlasAttachmentLoader; + }()); + core.AtlasAttachmentLoader = AtlasAttachmentLoader; + })(core = pixi_spine.core || (pixi_spine.core = {})); +})(pixi_spine || (pixi_spine = {})); +var pixi_spine; +(function (pixi_spine) { + var core; + (function (core) { + var BlendMode; + (function (BlendMode) { + BlendMode[BlendMode["Normal"] = 0] = "Normal"; + BlendMode[BlendMode["Additive"] = 1] = "Additive"; + BlendMode[BlendMode["Multiply"] = 2] = "Multiply"; + BlendMode[BlendMode["Screen"] = 3] = "Screen"; + })(BlendMode = core.BlendMode || (core.BlendMode = {})); + })(core = pixi_spine.core || (pixi_spine.core = {})); +})(pixi_spine || (pixi_spine = {})); +var pixi_spine; +(function (pixi_spine) { + var core; + (function (core) { + var Bone = (function () { + function Bone(data, skeleton, parent) { + this.matrix = new PIXI.Matrix(); + this.children = new Array(); + this.x = 0; + this.y = 0; + this.rotation = 0; + this.scaleX = 0; + this.scaleY = 0; + this.shearX = 0; + this.shearY = 0; + this.ax = 0; + this.ay = 0; + this.arotation = 0; + this.ascaleX = 0; + this.ascaleY = 0; + this.ashearX = 0; + this.ashearY = 0; + this.appliedValid = false; + this.sorted = false; + if (data == null) + throw new Error("data cannot be null."); + if (skeleton == null) + throw new Error("skeleton cannot be null."); + this.data = data; + this.skeleton = skeleton; + this.parent = parent; + this.setToSetupPose(); + } + Object.defineProperty(Bone.prototype, "worldX", { + get: function () { + return this.matrix.tx; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Bone.prototype, "worldY", { + get: function () { + return this.matrix.ty; + }, + enumerable: true, + configurable: true + }); + Bone.prototype.update = function () { + this.updateWorldTransformWith(this.x, this.y, this.rotation, this.scaleX, this.scaleY, this.shearX, this.shearY); + }; + Bone.prototype.updateWorldTransform = function () { + this.updateWorldTransformWith(this.x, this.y, this.rotation, this.scaleX, this.scaleY, this.shearX, this.shearY); + }; + Bone.prototype.updateWorldTransformWith = function (x, y, rotation, scaleX, scaleY, shearX, shearY) { + this.ax = x; + this.ay = y; + this.arotation = rotation; + this.ascaleX = scaleX; + this.ascaleY = scaleY; + this.ashearX = shearX; + this.ashearY = shearY; + this.appliedValid = true; + var parent = this.parent; + var m = this.matrix; + if (parent == null) { + var rotationY = rotation + 90 + shearY; + var la = core.MathUtils.cosDeg(rotation + shearX) * scaleX; + var lb = core.MathUtils.cosDeg(rotationY) * scaleY; + var lc = core.MathUtils.sinDeg(rotation + shearX) * scaleX; + var ld = core.MathUtils.sinDeg(rotationY) * scaleY; + var skeleton = this.skeleton; + if (skeleton.flipX) { + x = -x; + la = -la; + lb = -lb; + } + if (skeleton.flipY !== Bone.yDown) { + y = -y; + lc = -lc; + ld = -ld; + } + m.a = la; + m.c = lb; + m.b = lc; + m.d = ld; + m.tx = x + skeleton.x; + m.ty = y + skeleton.y; + return; + } + var pa = parent.matrix.a, pb = parent.matrix.c, pc = parent.matrix.b, pd = parent.matrix.d; + m.tx = pa * x + pb * y + parent.matrix.tx; + m.ty = pc * x + pd * y + parent.matrix.ty; + switch (this.data.transformMode) { + case core.TransformMode.Normal: { + var rotationY = rotation + 90 + shearY; + var la = core.MathUtils.cosDeg(rotation + shearX) * scaleX; + var lb = core.MathUtils.cosDeg(rotationY) * scaleY; + var lc = core.MathUtils.sinDeg(rotation + shearX) * scaleX; + var ld = core.MathUtils.sinDeg(rotationY) * scaleY; + m.a = pa * la + pb * lc; + m.c = pa * lb + pb * ld; + m.b = pc * la + pd * lc; + m.d = pc * lb + pd * ld; + return; + } + case core.TransformMode.OnlyTranslation: { + var rotationY = rotation + 90 + shearY; + m.a = core.MathUtils.cosDeg(rotation + shearX) * scaleX; + m.c = core.MathUtils.cosDeg(rotationY) * scaleY; + m.b = core.MathUtils.sinDeg(rotation + shearX) * scaleX; + m.d = core.MathUtils.sinDeg(rotationY) * scaleY; + break; + } + case core.TransformMode.NoRotationOrReflection: { + var s = pa * pa + pc * pc; + var prx = 0; + if (s > 0.0001) { + s = Math.abs(pa * pd - pb * pc) / s; + pb = pc * s; + pd = pa * s; + prx = Math.atan2(pc, pa) * core.MathUtils.radDeg; + } + else { + pa = 0; + pc = 0; + prx = 90 - Math.atan2(pd, pb) * core.MathUtils.radDeg; + } + var rx = rotation + shearX - prx; + var ry = rotation + shearY - prx + 90; + var la = core.MathUtils.cosDeg(rx) * scaleX; + var lb = core.MathUtils.cosDeg(ry) * scaleY; + var lc = core.MathUtils.sinDeg(rx) * scaleX; + var ld = core.MathUtils.sinDeg(ry) * scaleY; + m.a = pa * la - pb * lc; + m.c = pa * lb - pb * ld; + m.b = pc * la + pd * lc; + m.d = pc * lb + pd * ld; + break; + } + case core.TransformMode.NoScale: + case core.TransformMode.NoScaleOrReflection: { + var cos = core.MathUtils.cosDeg(rotation); + var sin = core.MathUtils.sinDeg(rotation); + var za = pa * cos + pb * sin; + var zc = pc * cos + pd * sin; + var s = Math.sqrt(za * za + zc * zc); + if (s > 0.00001) + s = 1 / s; + za *= s; + zc *= s; + s = Math.sqrt(za * za + zc * zc); + var r = Math.PI / 2 + Math.atan2(zc, za); + var zb = Math.cos(r) * s; + var zd = Math.sin(r) * s; + var la = core.MathUtils.cosDeg(shearX) * scaleX; + var lb = core.MathUtils.cosDeg(90 + shearY) * scaleY; + var lc = core.MathUtils.sinDeg(shearX) * scaleX; + var ld = core.MathUtils.sinDeg(90 + shearY) * scaleY; + m.a = za * la + zb * lc; + m.c = za * lb + zb * ld; + m.b = zc * la + zd * lc; + m.d = zc * lb + zd * ld; + if (this.data.transformMode != core.TransformMode.NoScaleOrReflection ? pa * pd - pb * pc < 0 : ((this.skeleton.flipX != this.skeleton.flipY) != Bone.yDown)) { + m.c = -m.c; + m.d = -m.d; + } + return; + } + } + if (this.skeleton.flipX) { + m.a = -m.a; + m.c = -m.c; + } + if (this.skeleton.flipY != Bone.yDown) { + m.b = -m.b; + m.d = -m.d; + } + }; + Bone.prototype.setToSetupPose = function () { + var data = this.data; + this.x = data.x; + this.y = data.y; + this.rotation = data.rotation; + this.scaleX = data.scaleX; + this.scaleY = data.scaleY; + this.shearX = data.shearX; + this.shearY = data.shearY; + }; + Bone.prototype.getWorldRotationX = function () { + return Math.atan2(this.matrix.b, this.matrix.a) * core.MathUtils.radDeg; + }; + Bone.prototype.getWorldRotationY = function () { + return Math.atan2(this.matrix.d, this.matrix.c) * core.MathUtils.radDeg; + }; + Bone.prototype.getWorldScaleX = function () { + var m = this.matrix; + return Math.sqrt(m.a * m.a + m.c * m.c); + }; + Bone.prototype.getWorldScaleY = function () { + var m = this.matrix; + return Math.sqrt(m.b * m.b + m.d * m.d); + }; + Bone.prototype.updateAppliedTransform = function () { + this.appliedValid = true; + var parent = this.parent; + var m = this.matrix; + if (parent == null) { + this.ax = m.tx; + this.ay = m.ty; + this.arotation = Math.atan2(m.b, m.a) * core.MathUtils.radDeg; + this.ascaleX = Math.sqrt(m.a * m.a + m.b * m.b); + this.ascaleY = Math.sqrt(m.c * m.c + m.d * m.d); + this.ashearX = 0; + this.ashearY = Math.atan2(m.a * m.c + m.b * m.d, m.a * m.d - m.b * m.c) * core.MathUtils.radDeg; + return; + } + var pm = parent.matrix; + var pid = 1 / (pm.a * pm.d - pm.b * pm.c); + var dx = m.tx - pm.tx, dy = m.ty - pm.ty; + this.ax = (dx * pm.d * pid - dy * pm.c * pid); + this.ay = (dy * pm.a * pid - dx * pm.b * pid); + var ia = pid * pm.d; + var id = pid * pm.a; + var ib = pid * pm.c; + var ic = pid * pm.b; + var ra = ia * m.a - ib * m.b; + var rb = ia * m.c - ib * m.d; + var rc = id * m.b - ic * m.a; + var rd = id * m.d - ic * m.c; + this.ashearX = 0; + this.ascaleX = Math.sqrt(ra * ra + rc * rc); + if (this.ascaleX > 0.0001) { + var det = ra * rd - rb * rc; + this.ascaleY = det / this.ascaleX; + this.ashearY = Math.atan2(ra * rb + rc * rd, det) * core.MathUtils.radDeg; + this.arotation = Math.atan2(rc, ra) * core.MathUtils.radDeg; + } + else { + this.ascaleX = 0; + this.ascaleY = Math.sqrt(rb * rb + rd * rd); + this.ashearY = 0; + this.arotation = 90 - Math.atan2(rd, rb) * core.MathUtils.radDeg; + } + }; + Bone.prototype.worldToLocal = function (world) { + var m = this.matrix; + var a = m.a, b = m.c, c = m.b, d = m.d; + var invDet = 1 / (a * d - b * c); + var x = world.x - m.tx, y = world.y - m.ty; + world.x = (x * d * invDet - y * b * invDet); + world.y = (y * a * invDet - x * c * invDet); + return world; + }; + Bone.prototype.localToWorld = function (local) { + var m = this.matrix; + var x = local.x, y = local.y; + local.x = x * m.a + y * m.c + m.tx; + local.y = x * m.b + y * m.d + m.ty; + return local; + }; + Bone.prototype.worldToLocalRotation = function (worldRotation) { + var sin = core.MathUtils.sinDeg(worldRotation), cos = core.MathUtils.cosDeg(worldRotation); + var mat = this.matrix; + return Math.atan2(mat.a * sin - mat.b * cos, mat.d * cos - mat.c * sin) * core.MathUtils.radDeg; + }; + Bone.prototype.localToWorldRotation = function (localRotation) { + var sin = core.MathUtils.sinDeg(localRotation), cos = core.MathUtils.cosDeg(localRotation); + var mat = this.matrix; + return Math.atan2(cos * mat.b + sin * mat.d, cos * mat.a + sin * mat.c) * core.MathUtils.radDeg; + }; + Bone.prototype.rotateWorld = function (degrees) { + var mat = this.matrix; + var a = mat.a, b = mat.c, c = mat.b, d = mat.d; + var cos = core.MathUtils.cosDeg(degrees), sin = core.MathUtils.sinDeg(degrees); + mat.a = cos * a - sin * c; + mat.c = cos * b - sin * d; + mat.b = sin * a + cos * c; + mat.d = sin * b + cos * d; + this.appliedValid = false; + }; + Bone.yDown = false; + return Bone; + }()); + core.Bone = Bone; + })(core = pixi_spine.core || (pixi_spine.core = {})); +})(pixi_spine || (pixi_spine = {})); +var pixi_spine; +(function (pixi_spine) { + var core; + (function (core) { + var BoneData = (function () { + function BoneData(index, name, parent) { + this.x = 0; + this.y = 0; + this.rotation = 0; + this.scaleX = 1; + this.scaleY = 1; + this.shearX = 0; + this.shearY = 0; + this.transformMode = TransformMode.Normal; + if (index < 0) + throw new Error("index must be >= 0."); + if (name == null) + throw new Error("name cannot be null."); + this.index = index; + this.name = name; + this.parent = parent; + } + return BoneData; + }()); + core.BoneData = BoneData; + var TransformMode; + (function (TransformMode) { + TransformMode[TransformMode["Normal"] = 0] = "Normal"; + TransformMode[TransformMode["OnlyTranslation"] = 1] = "OnlyTranslation"; + TransformMode[TransformMode["NoRotationOrReflection"] = 2] = "NoRotationOrReflection"; + TransformMode[TransformMode["NoScale"] = 3] = "NoScale"; + TransformMode[TransformMode["NoScaleOrReflection"] = 4] = "NoScaleOrReflection"; + })(TransformMode = core.TransformMode || (core.TransformMode = {})); + })(core = pixi_spine.core || (pixi_spine.core = {})); +})(pixi_spine || (pixi_spine = {})); +var pixi_spine; +(function (pixi_spine) { + var core; + (function (core) { + var Event = (function () { + function Event(time, data) { + if (data == null) + throw new Error("data cannot be null."); + this.time = time; + this.data = data; + } + return Event; + }()); + core.Event = Event; + })(core = pixi_spine.core || (pixi_spine.core = {})); +})(pixi_spine || (pixi_spine = {})); +var pixi_spine; +(function (pixi_spine) { + var core; + (function (core) { + var EventData = (function () { + function EventData(name) { + this.name = name; + } + return EventData; + }()); + core.EventData = EventData; + })(core = pixi_spine.core || (pixi_spine.core = {})); +})(pixi_spine || (pixi_spine = {})); +var pixi_spine; +(function (pixi_spine) { + var core; + (function (core) { + var IkConstraint = (function () { + function IkConstraint(data, skeleton) { + this.mix = 1; + this.bendDirection = 0; + if (data == null) + throw new Error("data cannot be null."); + if (skeleton == null) + throw new Error("skeleton cannot be null."); + this.data = data; + this.mix = data.mix; + this.bendDirection = data.bendDirection; + this.bones = new Array(); + for (var i = 0; i < data.bones.length; i++) + this.bones.push(skeleton.findBone(data.bones[i].name)); + this.target = skeleton.findBone(data.target.name); + } + IkConstraint.prototype.getOrder = function () { + return this.data.order; + }; + IkConstraint.prototype.apply = function () { + this.update(); + }; + IkConstraint.prototype.update = function () { + var target = this.target; + var bones = this.bones; + switch (bones.length) { + case 1: + this.apply1(bones[0], target.worldX, target.worldY, this.mix); + break; + case 2: + this.apply2(bones[0], bones[1], target.worldX, target.worldY, this.bendDirection, this.mix); + break; + } + }; + IkConstraint.prototype.apply1 = function (bone, targetX, targetY, alpha) { + if (!bone.appliedValid) + bone.updateAppliedTransform(); + var p = bone.parent.matrix; + var id = 1 / (p.a * p.d - p.b * p.c); + var x = targetX - p.tx, y = targetY - p.ty; + var tx = (x * p.d - y * p.c) * id - bone.ax, ty = (y * p.a - x * p.b) * id - bone.ay; + var rotationIK = Math.atan2(ty, tx) * core.MathUtils.radDeg - bone.ashearX - bone.arotation; + if (bone.ascaleX < 0) + rotationIK += 180; + if (rotationIK > 180) + rotationIK -= 360; + else if (rotationIK < -180) + rotationIK += 360; + bone.updateWorldTransformWith(bone.ax, bone.ay, bone.arotation + rotationIK * alpha, bone.ascaleX, bone.ascaleY, bone.ashearX, bone.ashearY); + }; + IkConstraint.prototype.apply2 = function (parent, child, targetX, targetY, bendDir, alpha) { + if (alpha == 0) { + child.updateWorldTransform(); + return; + } + if (!parent.appliedValid) + parent.updateAppliedTransform(); + if (!child.appliedValid) + child.updateAppliedTransform(); + var px = parent.ax, py = parent.ay, psx = parent.ascaleX, psy = parent.ascaleY, csx = child.ascaleX; + var pmat = parent.matrix; + var os1 = 0, os2 = 0, s2 = 0; + if (psx < 0) { + psx = -psx; + os1 = 180; + s2 = -1; + } + else { + os1 = 0; + s2 = 1; + } + if (psy < 0) { + psy = -psy; + s2 = -s2; + } + if (csx < 0) { + csx = -csx; + os2 = 180; + } + else + os2 = 0; + var cx = child.ax, cy = 0, cwx = 0, cwy = 0, a = pmat.a, b = pmat.c, c = pmat.b, d = pmat.d; + var u = Math.abs(psx - psy) <= 0.0001; + if (!u) { + cy = 0; + cwx = a * cx + pmat.tx; + cwy = c * cx + pmat.ty; + } + else { + cy = child.ay; + cwx = a * cx + b * cy + pmat.tx; + cwy = c * cx + d * cy + pmat.ty; + } + var pp = parent.parent.matrix; + a = pp.a; + b = pp.c; + c = pp.b; + d = pp.d; + var id = 1 / (a * d - b * c), x = targetX - pp.tx, y = targetY - pp.ty; + var tx = (x * d - y * b) * id - px, ty = (y * a - x * c) * id - py; + x = cwx - pp.tx; + y = cwy - pp.ty; + var dx = (x * d - y * b) * id - px, dy = (y * a - x * c) * id - py; + var l1 = Math.sqrt(dx * dx + dy * dy), l2 = child.data.length * csx, a1 = 0, a2 = 0; + outer: if (u) { + l2 *= psx; + var cos = (tx * tx + ty * ty - l1 * l1 - l2 * l2) / (2 * l1 * l2); + if (cos < -1) + cos = -1; + else if (cos > 1) + cos = 1; + a2 = Math.acos(cos) * bendDir; + a = l1 + l2 * cos; + b = l2 * Math.sin(a2); + a1 = Math.atan2(ty * a - tx * b, tx * a + ty * b); + } + else { + a = psx * l2; + b = psy * l2; + var aa = a * a, bb = b * b, dd = tx * tx + ty * ty, ta = Math.atan2(ty, tx); + c = bb * l1 * l1 + aa * dd - aa * bb; + var c1 = -2 * bb * l1, c2 = bb - aa; + d = c1 * c1 - 4 * c2 * c; + if (d >= 0) { + var q = Math.sqrt(d); + if (c1 < 0) + q = -q; + q = -(c1 + q) / 2; + var r0 = q / c2, r1 = c / q; + var r = Math.abs(r0) < Math.abs(r1) ? r0 : r1; + if (r * r <= dd) { + y = Math.sqrt(dd - r * r) * bendDir; + a1 = ta - Math.atan2(y, r); + a2 = Math.atan2(y / psy, (r - l1) / psx); + break outer; + } + } + var minAngle = core.MathUtils.PI, minX = l1 - a, minDist = minX * minX, minY = 0; + var maxAngle = 0, maxX = l1 + a, maxDist = maxX * maxX, maxY = 0; + c = -a * l1 / (aa - bb); + if (c >= -1 && c <= 1) { + c = Math.acos(c); + x = a * Math.cos(c) + l1; + y = b * Math.sin(c); + d = x * x + y * y; + if (d < minDist) { + minAngle = c; + minDist = d; + minX = x; + minY = y; + } + if (d > maxDist) { + maxAngle = c; + maxDist = d; + maxX = x; + maxY = y; + } + } + if (dd <= (minDist + maxDist) / 2) { + a1 = ta - Math.atan2(minY * bendDir, minX); + a2 = minAngle * bendDir; + } + else { + a1 = ta - Math.atan2(maxY * bendDir, maxX); + a2 = maxAngle * bendDir; + } + } + var os = Math.atan2(cy, cx) * s2; + var rotation = parent.arotation; + a1 = (a1 - os) * core.MathUtils.radDeg + os1 - rotation; + if (a1 > 180) + a1 -= 360; + else if (a1 < -180) + a1 += 360; + parent.updateWorldTransformWith(px, py, rotation + a1 * alpha, parent.ascaleX, parent.ascaleY, 0, 0); + rotation = child.arotation; + a2 = ((a2 + os) * core.MathUtils.radDeg - child.ashearX) * s2 + os2 - rotation; + if (a2 > 180) + a2 -= 360; + else if (a2 < -180) + a2 += 360; + child.updateWorldTransformWith(cx, cy, rotation + a2 * alpha, child.ascaleX, child.ascaleY, child.ashearX, child.ashearY); + }; + return IkConstraint; + }()); + core.IkConstraint = IkConstraint; + })(core = pixi_spine.core || (pixi_spine.core = {})); +})(pixi_spine || (pixi_spine = {})); +var pixi_spine; +(function (pixi_spine) { + var core; + (function (core) { + var IkConstraintData = (function () { + function IkConstraintData(name) { + this.order = 0; + this.bones = new Array(); + this.bendDirection = 1; + this.mix = 1; + this.name = name; + } + return IkConstraintData; + }()); + core.IkConstraintData = IkConstraintData; + })(core = pixi_spine.core || (pixi_spine.core = {})); +})(pixi_spine || (pixi_spine = {})); +var pixi_spine; +(function (pixi_spine) { + var core; + (function (core) { + var PathConstraint = (function () { + function PathConstraint(data, skeleton) { + this.position = 0; + this.spacing = 0; + this.rotateMix = 0; + this.translateMix = 0; + this.spaces = new Array(); + this.positions = new Array(); + this.world = new Array(); + this.curves = new Array(); + this.lengths = new Array(); + this.segments = new Array(); + if (data == null) + throw new Error("data cannot be null."); + if (skeleton == null) + throw new Error("skeleton cannot be null."); + this.data = data; + this.bones = new Array(); + for (var i = 0, n = data.bones.length; i < n; i++) + this.bones.push(skeleton.findBone(data.bones[i].name)); + this.target = skeleton.findSlot(data.target.name); + this.position = data.position; + this.spacing = data.spacing; + this.rotateMix = data.rotateMix; + this.translateMix = data.translateMix; + } + PathConstraint.prototype.apply = function () { + this.update(); + }; + PathConstraint.prototype.update = function () { + var attachment = this.target.getAttachment(); + if (!(attachment instanceof core.PathAttachment)) + return; + var rotateMix = this.rotateMix, translateMix = this.translateMix; + var translate = translateMix > 0, rotate = rotateMix > 0; + if (!translate && !rotate) + return; + var data = this.data; + var spacingMode = data.spacingMode; + var lengthSpacing = spacingMode == core.SpacingMode.Length; + var rotateMode = data.rotateMode; + var tangents = rotateMode == core.RotateMode.Tangent, scale = rotateMode == core.RotateMode.ChainScale; + var boneCount = this.bones.length, spacesCount = tangents ? boneCount : boneCount + 1; + var bones = this.bones; + var spaces = core.Utils.setArraySize(this.spaces, spacesCount), lengths = null; + var spacing = this.spacing; + if (scale || lengthSpacing) { + if (scale) + lengths = core.Utils.setArraySize(this.lengths, boneCount); + for (var i = 0, n = spacesCount - 1; i < n;) { + var bone = bones[i]; + var setupLength = bone.data.length, x = setupLength * bone.matrix.a, y = setupLength * bone.matrix.b; + var length_1 = Math.sqrt(x * x + y * y); + if (scale) + lengths[i] = length_1; + spaces[++i] = (lengthSpacing ? setupLength + spacing : spacing) * length_1 / setupLength; + } + } + else { + for (var i = 1; i < spacesCount; i++) + spaces[i] = spacing; + } + var positions = this.computeWorldPositions(attachment, spacesCount, tangents, data.positionMode == core.PositionMode.Percent, spacingMode == core.SpacingMode.Percent); + var boneX = positions[0], boneY = positions[1], offsetRotation = data.offsetRotation; + var tip = false; + if (offsetRotation == 0) + tip = rotateMode == core.RotateMode.Chain; + else { + tip = false; + var p = this.target.bone.matrix; + offsetRotation *= p.a * p.d - p.b * p.c > 0 ? core.MathUtils.degRad : -core.MathUtils.degRad; + } + for (var i = 0, p = 3; i < boneCount; i++, p += 3) { + var bone = bones[i]; + var mat = bone.matrix; + mat.tx += (boneX - mat.tx) * translateMix; + mat.ty += (boneY - mat.ty) * translateMix; + var x = positions[p], y = positions[p + 1], dx = x - boneX, dy = y - boneY; + if (scale) { + var length_2 = lengths[i]; + if (length_2 != 0) { + var s = (Math.sqrt(dx * dx + dy * dy) / length_2 - 1) * rotateMix + 1; + mat.a *= s; + mat.b *= s; + } + } + boneX = x; + boneY = y; + if (rotate) { + var a = mat.a, b = mat.c, c = mat.b, d = mat.d, r = 0, cos = 0, sin = 0; + if (tangents) + r = positions[p - 1]; + else if (spaces[i + 1] == 0) + r = positions[p + 2]; + else + r = Math.atan2(dy, dx); + r -= Math.atan2(c, a); + if (tip) { + cos = Math.cos(r); + sin = Math.sin(r); + var length_3 = bone.data.length; + boneX += (length_3 * (cos * a - sin * c) - dx) * rotateMix; + boneY += (length_3 * (sin * a + cos * c) - dy) * rotateMix; + } + else { + r += offsetRotation; + } + if (r > core.MathUtils.PI) + r -= core.MathUtils.PI2; + else if (r < -core.MathUtils.PI) + r += core.MathUtils.PI2; + r *= rotateMix; + cos = Math.cos(r); + sin = Math.sin(r); + mat.a = cos * a - sin * c; + mat.c = cos * b - sin * d; + mat.b = sin * a + cos * c; + mat.d = sin * b + cos * d; + } + bone.appliedValid = false; + } + }; + PathConstraint.prototype.computeWorldPositions = function (path, spacesCount, tangents, percentPosition, percentSpacing) { + var target = this.target; + var position = this.position; + var spaces = this.spaces, out = core.Utils.setArraySize(this.positions, spacesCount * 3 + 2), world = null; + var closed = path.closed; + var verticesLength = path.worldVerticesLength, curveCount = verticesLength / 6, prevCurve = PathConstraint.NONE; + if (!path.constantSpeed) { + var lengths = path.lengths; + curveCount -= closed ? 1 : 2; + var pathLength_1 = lengths[curveCount]; + if (percentPosition) + position *= pathLength_1; + if (percentSpacing) { + for (var i = 0; i < spacesCount; i++) + spaces[i] *= pathLength_1; + } + world = core.Utils.setArraySize(this.world, 8); + for (var i = 0, o = 0, curve = 0; i < spacesCount; i++, o += 3) { + var space = spaces[i]; + position += space; + var p = position; + if (closed) { + p %= pathLength_1; + if (p < 0) + p += pathLength_1; + curve = 0; + } + else if (p < 0) { + if (prevCurve != PathConstraint.BEFORE) { + prevCurve = PathConstraint.BEFORE; + path.computeWorldVertices(target, 2, 4, world, 0, 2); + } + this.addBeforePosition(p, world, 0, out, o); + continue; + } + else if (p > pathLength_1) { + if (prevCurve != PathConstraint.AFTER) { + prevCurve = PathConstraint.AFTER; + path.computeWorldVertices(target, verticesLength - 6, 4, world, 0, 2); + } + this.addAfterPosition(p - pathLength_1, world, 0, out, o); + continue; + } + for (;; curve++) { + var length_4 = lengths[curve]; + if (p > length_4) + continue; + if (curve == 0) + p /= length_4; + else { + var prev = lengths[curve - 1]; + p = (p - prev) / (length_4 - prev); + } + break; + } + if (curve != prevCurve) { + prevCurve = curve; + if (closed && curve == curveCount) { + path.computeWorldVertices(target, verticesLength - 4, 4, world, 0, 2); + path.computeWorldVertices(target, 0, 4, world, 4, 2); + } + else + path.computeWorldVertices(target, curve * 6 + 2, 8, world, 0, 2); + } + this.addCurvePosition(p, world[0], world[1], world[2], world[3], world[4], world[5], world[6], world[7], out, o, tangents || (i > 0 && space == 0)); + } + return out; + } + if (closed) { + verticesLength += 2; + world = core.Utils.setArraySize(this.world, verticesLength); + path.computeWorldVertices(target, 2, verticesLength - 4, world, 0, 2); + path.computeWorldVertices(target, 0, 2, world, verticesLength - 4, 2); + world[verticesLength - 2] = world[0]; + world[verticesLength - 1] = world[1]; + } + else { + curveCount--; + verticesLength -= 4; + world = core.Utils.setArraySize(this.world, verticesLength); + path.computeWorldVertices(target, 2, verticesLength, world, 0, 2); + } + var curves = core.Utils.setArraySize(this.curves, curveCount); + var pathLength = 0; + var x1 = world[0], y1 = world[1], cx1 = 0, cy1 = 0, cx2 = 0, cy2 = 0, x2 = 0, y2 = 0; + var tmpx = 0, tmpy = 0, dddfx = 0, dddfy = 0, ddfx = 0, ddfy = 0, dfx = 0, dfy = 0; + for (var i = 0, w = 2; i < curveCount; i++, w += 6) { + cx1 = world[w]; + cy1 = world[w + 1]; + cx2 = world[w + 2]; + cy2 = world[w + 3]; + x2 = world[w + 4]; + y2 = world[w + 5]; + tmpx = (x1 - cx1 * 2 + cx2) * 0.1875; + tmpy = (y1 - cy1 * 2 + cy2) * 0.1875; + dddfx = ((cx1 - cx2) * 3 - x1 + x2) * 0.09375; + dddfy = ((cy1 - cy2) * 3 - y1 + y2) * 0.09375; + ddfx = tmpx * 2 + dddfx; + ddfy = tmpy * 2 + dddfy; + dfx = (cx1 - x1) * 0.75 + tmpx + dddfx * 0.16666667; + dfy = (cy1 - y1) * 0.75 + tmpy + dddfy * 0.16666667; + pathLength += Math.sqrt(dfx * dfx + dfy * dfy); + dfx += ddfx; + dfy += ddfy; + ddfx += dddfx; + ddfy += dddfy; + pathLength += Math.sqrt(dfx * dfx + dfy * dfy); + dfx += ddfx; + dfy += ddfy; + pathLength += Math.sqrt(dfx * dfx + dfy * dfy); + dfx += ddfx + dddfx; + dfy += ddfy + dddfy; + pathLength += Math.sqrt(dfx * dfx + dfy * dfy); + curves[i] = pathLength; + x1 = x2; + y1 = y2; + } + if (percentPosition) + position *= pathLength; + if (percentSpacing) { + for (var i = 0; i < spacesCount; i++) + spaces[i] *= pathLength; + } + var segments = this.segments; + var curveLength = 0; + for (var i = 0, o = 0, curve = 0, segment = 0; i < spacesCount; i++, o += 3) { + var space = spaces[i]; + position += space; + var p = position; + if (closed) { + p %= pathLength; + if (p < 0) + p += pathLength; + curve = 0; + } + else if (p < 0) { + this.addBeforePosition(p, world, 0, out, o); + continue; + } + else if (p > pathLength) { + this.addAfterPosition(p - pathLength, world, verticesLength - 4, out, o); + continue; + } + for (;; curve++) { + var length_5 = curves[curve]; + if (p > length_5) + continue; + if (curve == 0) + p /= length_5; + else { + var prev = curves[curve - 1]; + p = (p - prev) / (length_5 - prev); + } + break; + } + if (curve != prevCurve) { + prevCurve = curve; + var ii = curve * 6; + x1 = world[ii]; + y1 = world[ii + 1]; + cx1 = world[ii + 2]; + cy1 = world[ii + 3]; + cx2 = world[ii + 4]; + cy2 = world[ii + 5]; + x2 = world[ii + 6]; + y2 = world[ii + 7]; + tmpx = (x1 - cx1 * 2 + cx2) * 0.03; + tmpy = (y1 - cy1 * 2 + cy2) * 0.03; + dddfx = ((cx1 - cx2) * 3 - x1 + x2) * 0.006; + dddfy = ((cy1 - cy2) * 3 - y1 + y2) * 0.006; + ddfx = tmpx * 2 + dddfx; + ddfy = tmpy * 2 + dddfy; + dfx = (cx1 - x1) * 0.3 + tmpx + dddfx * 0.16666667; + dfy = (cy1 - y1) * 0.3 + tmpy + dddfy * 0.16666667; + curveLength = Math.sqrt(dfx * dfx + dfy * dfy); + segments[0] = curveLength; + for (ii = 1; ii < 8; ii++) { + dfx += ddfx; + dfy += ddfy; + ddfx += dddfx; + ddfy += dddfy; + curveLength += Math.sqrt(dfx * dfx + dfy * dfy); + segments[ii] = curveLength; + } + dfx += ddfx; + dfy += ddfy; + curveLength += Math.sqrt(dfx * dfx + dfy * dfy); + segments[8] = curveLength; + dfx += ddfx + dddfx; + dfy += ddfy + dddfy; + curveLength += Math.sqrt(dfx * dfx + dfy * dfy); + segments[9] = curveLength; + segment = 0; + } + p *= curveLength; + for (;; segment++) { + var length_6 = segments[segment]; + if (p > length_6) + continue; + if (segment == 0) + p /= length_6; + else { + var prev = segments[segment - 1]; + p = segment + (p - prev) / (length_6 - prev); + } + break; + } + this.addCurvePosition(p * 0.1, x1, y1, cx1, cy1, cx2, cy2, x2, y2, out, o, tangents || (i > 0 && space == 0)); + } + return out; + }; + PathConstraint.prototype.addBeforePosition = function (p, temp, i, out, o) { + var x1 = temp[i], y1 = temp[i + 1], dx = temp[i + 2] - x1, dy = temp[i + 3] - y1, r = Math.atan2(dy, dx); + out[o] = x1 + p * Math.cos(r); + out[o + 1] = y1 + p * Math.sin(r); + out[o + 2] = r; + }; + PathConstraint.prototype.addAfterPosition = function (p, temp, i, out, o) { + var x1 = temp[i + 2], y1 = temp[i + 3], dx = x1 - temp[i], dy = y1 - temp[i + 1], r = Math.atan2(dy, dx); + out[o] = x1 + p * Math.cos(r); + out[o + 1] = y1 + p * Math.sin(r); + out[o + 2] = r; + }; + PathConstraint.prototype.addCurvePosition = function (p, x1, y1, cx1, cy1, cx2, cy2, x2, y2, out, o, tangents) { + if (p == 0 || isNaN(p)) + p = 0.0001; + var tt = p * p, ttt = tt * p, u = 1 - p, uu = u * u, uuu = uu * u; + var ut = u * p, ut3 = ut * 3, uut3 = u * ut3, utt3 = ut3 * p; + var x = x1 * uuu + cx1 * uut3 + cx2 * utt3 + x2 * ttt, y = y1 * uuu + cy1 * uut3 + cy2 * utt3 + y2 * ttt; + out[o] = x; + out[o + 1] = y; + if (tangents) + out[o + 2] = Math.atan2(y - (y1 * uu + cy1 * ut * 2 + cy2 * tt), x - (x1 * uu + cx1 * ut * 2 + cx2 * tt)); + }; + PathConstraint.prototype.getOrder = function () { + return this.data.order; + }; + PathConstraint.NONE = -1; + PathConstraint.BEFORE = -2; + PathConstraint.AFTER = -3; + return PathConstraint; + }()); + core.PathConstraint = PathConstraint; + })(core = pixi_spine.core || (pixi_spine.core = {})); +})(pixi_spine || (pixi_spine = {})); +var pixi_spine; +(function (pixi_spine) { + var core; + (function (core) { + var PathConstraintData = (function () { + function PathConstraintData(name) { + this.order = 0; + this.bones = new Array(); + this.name = name; + } + return PathConstraintData; + }()); + core.PathConstraintData = PathConstraintData; + var PositionMode; + (function (PositionMode) { + PositionMode[PositionMode["Fixed"] = 0] = "Fixed"; + PositionMode[PositionMode["Percent"] = 1] = "Percent"; + })(PositionMode = core.PositionMode || (core.PositionMode = {})); + var SpacingMode; + (function (SpacingMode) { + SpacingMode[SpacingMode["Length"] = 0] = "Length"; + SpacingMode[SpacingMode["Fixed"] = 1] = "Fixed"; + SpacingMode[SpacingMode["Percent"] = 2] = "Percent"; + })(SpacingMode = core.SpacingMode || (core.SpacingMode = {})); + var RotateMode; + (function (RotateMode) { + RotateMode[RotateMode["Tangent"] = 0] = "Tangent"; + RotateMode[RotateMode["Chain"] = 1] = "Chain"; + RotateMode[RotateMode["ChainScale"] = 2] = "ChainScale"; + })(RotateMode = core.RotateMode || (core.RotateMode = {})); + })(core = pixi_spine.core || (pixi_spine.core = {})); +})(pixi_spine || (pixi_spine = {})); +var pixi_spine; +(function (pixi_spine) { + var core; + (function (core) { + var Skeleton = (function () { + function Skeleton(data) { + this._updateCache = new Array(); + this.updateCacheReset = new Array(); + this.time = 0; + this.flipX = false; + this.flipY = false; + this.x = 0; + this.y = 0; + if (data == null) + throw new Error("data cannot be null."); + this.data = data; + this.bones = new Array(); + for (var i = 0; i < data.bones.length; i++) { + var boneData = data.bones[i]; + var bone = void 0; + if (boneData.parent == null) + bone = new core.Bone(boneData, this, null); + else { + var parent_1 = this.bones[boneData.parent.index]; + bone = new core.Bone(boneData, this, parent_1); + parent_1.children.push(bone); + } + this.bones.push(bone); + } + this.slots = new Array(); + this.drawOrder = new Array(); + for (var i = 0; i < data.slots.length; i++) { + var slotData = data.slots[i]; + var bone = this.bones[slotData.boneData.index]; + var slot = new core.Slot(slotData, bone); + this.slots.push(slot); + this.drawOrder.push(slot); + } + this.ikConstraints = new Array(); + for (var i = 0; i < data.ikConstraints.length; i++) { + var ikConstraintData = data.ikConstraints[i]; + this.ikConstraints.push(new core.IkConstraint(ikConstraintData, this)); + } + this.transformConstraints = new Array(); + for (var i = 0; i < data.transformConstraints.length; i++) { + var transformConstraintData = data.transformConstraints[i]; + this.transformConstraints.push(new core.TransformConstraint(transformConstraintData, this)); + } + this.pathConstraints = new Array(); + for (var i = 0; i < data.pathConstraints.length; i++) { + var pathConstraintData = data.pathConstraints[i]; + this.pathConstraints.push(new core.PathConstraint(pathConstraintData, this)); + } + this.color = new core.Color(1, 1, 1, 1); + this.updateCache(); + } + Skeleton.prototype.updateCache = function () { + var updateCache = this._updateCache; + updateCache.length = 0; + this.updateCacheReset.length = 0; + var bones = this.bones; + for (var i = 0, n = bones.length; i < n; i++) + bones[i].sorted = false; + var ikConstraints = this.ikConstraints; + var transformConstraints = this.transformConstraints; + var pathConstraints = this.pathConstraints; + var ikCount = ikConstraints.length, transformCount = transformConstraints.length, pathCount = pathConstraints.length; + var constraintCount = ikCount + transformCount + pathCount; + outer: for (var i = 0; i < constraintCount; i++) { + for (var ii = 0; ii < ikCount; ii++) { + var constraint = ikConstraints[ii]; + if (constraint.data.order == i) { + this.sortIkConstraint(constraint); + continue outer; + } + } + for (var ii = 0; ii < transformCount; ii++) { + var constraint = transformConstraints[ii]; + if (constraint.data.order == i) { + this.sortTransformConstraint(constraint); + continue outer; + } + } + for (var ii = 0; ii < pathCount; ii++) { + var constraint = pathConstraints[ii]; + if (constraint.data.order == i) { + this.sortPathConstraint(constraint); + continue outer; + } + } + } + for (var i = 0, n = bones.length; i < n; i++) + this.sortBone(bones[i]); + }; + Skeleton.prototype.sortIkConstraint = function (constraint) { + var target = constraint.target; + this.sortBone(target); + var constrained = constraint.bones; + var parent = constrained[0]; + this.sortBone(parent); + if (constrained.length > 1) { + var child = constrained[constrained.length - 1]; + if (!(this._updateCache.indexOf(child) > -1)) + this.updateCacheReset.push(child); + } + this._updateCache.push(constraint); + this.sortReset(parent.children); + constrained[constrained.length - 1].sorted = true; + }; + Skeleton.prototype.sortPathConstraint = function (constraint) { + var slot = constraint.target; + var slotIndex = slot.data.index; + var slotBone = slot.bone; + if (this.skin != null) + this.sortPathConstraintAttachment(this.skin, slotIndex, slotBone); + if (this.data.defaultSkin != null && this.data.defaultSkin != this.skin) + this.sortPathConstraintAttachment(this.data.defaultSkin, slotIndex, slotBone); + for (var i = 0, n = this.data.skins.length; i < n; i++) + this.sortPathConstraintAttachment(this.data.skins[i], slotIndex, slotBone); + var attachment = slot.getAttachment(); + if (attachment instanceof core.PathAttachment) + this.sortPathConstraintAttachmentWith(attachment, slotBone); + var constrained = constraint.bones; + var boneCount = constrained.length; + for (var i = 0; i < boneCount; i++) + this.sortBone(constrained[i]); + this._updateCache.push(constraint); + for (var i = 0; i < boneCount; i++) + this.sortReset(constrained[i].children); + for (var i = 0; i < boneCount; i++) + constrained[i].sorted = true; + }; + Skeleton.prototype.sortTransformConstraint = function (constraint) { + this.sortBone(constraint.target); + var constrained = constraint.bones; + var boneCount = constrained.length; + if (constraint.data.local) { + for (var i = 0; i < boneCount; i++) { + var child = constrained[i]; + this.sortBone(child.parent); + if (!(this._updateCache.indexOf(child) > -1)) + this.updateCacheReset.push(child); + } + } + else { + for (var i = 0; i < boneCount; i++) { + this.sortBone(constrained[i]); + } + } + this._updateCache.push(constraint); + for (var ii = 0; ii < boneCount; ii++) + this.sortReset(constrained[ii].children); + for (var ii = 0; ii < boneCount; ii++) + constrained[ii].sorted = true; + }; + Skeleton.prototype.sortPathConstraintAttachment = function (skin, slotIndex, slotBone) { + var attachments = skin.attachments[slotIndex]; + if (!attachments) + return; + for (var key in attachments) { + this.sortPathConstraintAttachmentWith(attachments[key], slotBone); + } + }; + Skeleton.prototype.sortPathConstraintAttachmentWith = function (attachment, slotBone) { + if (!(attachment instanceof core.PathAttachment)) + return; + var pathBones = attachment.bones; + if (pathBones == null) + this.sortBone(slotBone); + else { + var bones = this.bones; + var i = 0; + while (i < pathBones.length) { + var boneCount = pathBones[i++]; + for (var n = i + boneCount; i < n; i++) { + var boneIndex = pathBones[i]; + this.sortBone(bones[boneIndex]); + } + } + } + }; + Skeleton.prototype.sortBone = function (bone) { + if (bone.sorted) + return; + var parent = bone.parent; + if (parent != null) + this.sortBone(parent); + bone.sorted = true; + this._updateCache.push(bone); + }; + Skeleton.prototype.sortReset = function (bones) { + for (var i = 0, n = bones.length; i < n; i++) { + var bone = bones[i]; + if (bone.sorted) + this.sortReset(bone.children); + bone.sorted = false; + } + }; + Skeleton.prototype.updateWorldTransform = function () { + var updateCacheReset = this.updateCacheReset; + for (var i = 0, n = updateCacheReset.length; i < n; i++) { + var bone = updateCacheReset[i]; + bone.ax = bone.x; + bone.ay = bone.y; + bone.arotation = bone.rotation; + bone.ascaleX = bone.scaleX; + bone.ascaleY = bone.scaleY; + bone.ashearX = bone.shearX; + bone.ashearY = bone.shearY; + bone.appliedValid = true; + } + var updateCache = this._updateCache; + for (var i = 0, n = updateCache.length; i < n; i++) + updateCache[i].update(); + }; + Skeleton.prototype.setToSetupPose = function () { + this.setBonesToSetupPose(); + this.setSlotsToSetupPose(); + }; + Skeleton.prototype.setBonesToSetupPose = function () { + var bones = this.bones; + for (var i = 0, n = bones.length; i < n; i++) + bones[i].setToSetupPose(); + var ikConstraints = this.ikConstraints; + for (var i = 0, n = ikConstraints.length; i < n; i++) { + var constraint = ikConstraints[i]; + constraint.bendDirection = constraint.data.bendDirection; + constraint.mix = constraint.data.mix; + } + var transformConstraints = this.transformConstraints; + for (var i = 0, n = transformConstraints.length; i < n; i++) { + var constraint = transformConstraints[i]; + var data = constraint.data; + constraint.rotateMix = data.rotateMix; + constraint.translateMix = data.translateMix; + constraint.scaleMix = data.scaleMix; + constraint.shearMix = data.shearMix; + } + var pathConstraints = this.pathConstraints; + for (var i = 0, n = pathConstraints.length; i < n; i++) { + var constraint = pathConstraints[i]; + var data = constraint.data; + constraint.position = data.position; + constraint.spacing = data.spacing; + constraint.rotateMix = data.rotateMix; + constraint.translateMix = data.translateMix; + } + }; + Skeleton.prototype.setSlotsToSetupPose = function () { + var slots = this.slots; + core.Utils.arrayCopy(slots, 0, this.drawOrder, 0, slots.length); + for (var i = 0, n = slots.length; i < n; i++) + slots[i].setToSetupPose(); + }; + Skeleton.prototype.getRootBone = function () { + if (this.bones.length == 0) + return null; + return this.bones[0]; + }; + Skeleton.prototype.findBone = function (boneName) { + if (boneName == null) + throw new Error("boneName cannot be null."); + var bones = this.bones; + for (var i = 0, n = bones.length; i < n; i++) { + var bone = bones[i]; + if (bone.data.name == boneName) + return bone; + } + return null; + }; + Skeleton.prototype.findBoneIndex = function (boneName) { + if (boneName == null) + throw new Error("boneName cannot be null."); + var bones = this.bones; + for (var i = 0, n = bones.length; i < n; i++) + if (bones[i].data.name == boneName) + return i; + return -1; + }; + Skeleton.prototype.findSlot = function (slotName) { + if (slotName == null) + throw new Error("slotName cannot be null."); + var slots = this.slots; + for (var i = 0, n = slots.length; i < n; i++) { + var slot = slots[i]; + if (slot.data.name == slotName) + return slot; + } + return null; + }; + Skeleton.prototype.findSlotIndex = function (slotName) { + if (slotName == null) + throw new Error("slotName cannot be null."); + var slots = this.slots; + for (var i = 0, n = slots.length; i < n; i++) + if (slots[i].data.name == slotName) + return i; + return -1; + }; + Skeleton.prototype.setSkinByName = function (skinName) { + var skin = this.data.findSkin(skinName); + if (skin == null) + throw new Error("Skin not found: " + skinName); + this.setSkin(skin); + }; + Skeleton.prototype.setSkin = function (newSkin) { + if (newSkin != null) { + if (this.skin != null) + newSkin.attachAll(this, this.skin); + else { + var slots = this.slots; + for (var i = 0, n = slots.length; i < n; i++) { + var slot = slots[i]; + var name_1 = slot.data.attachmentName; + if (name_1 != null) { + var attachment = newSkin.getAttachment(i, name_1); + if (attachment != null) + slot.setAttachment(attachment); + } + } + } + } + this.skin = newSkin; + }; + Skeleton.prototype.getAttachmentByName = function (slotName, attachmentName) { + return this.getAttachment(this.data.findSlotIndex(slotName), attachmentName); + }; + Skeleton.prototype.getAttachment = function (slotIndex, attachmentName) { + if (attachmentName == null) + throw new Error("attachmentName cannot be null."); + if (this.skin != null) { + var attachment = this.skin.getAttachment(slotIndex, attachmentName); + if (attachment != null) + return attachment; + } + if (this.data.defaultSkin != null) + return this.data.defaultSkin.getAttachment(slotIndex, attachmentName); + return null; + }; + Skeleton.prototype.setAttachment = function (slotName, attachmentName) { + if (slotName == null) + throw new Error("slotName cannot be null."); + var slots = this.slots; + for (var i = 0, n = slots.length; i < n; i++) { + var slot = slots[i]; + if (slot.data.name == slotName) { + var attachment = null; + if (attachmentName != null) { + attachment = this.getAttachment(i, attachmentName); + if (attachment == null) + throw new Error("Attachment not found: " + attachmentName + ", for slot: " + slotName); + } + slot.setAttachment(attachment); + return; + } + } + throw new Error("Slot not found: " + slotName); + }; + Skeleton.prototype.findIkConstraint = function (constraintName) { + if (constraintName == null) + throw new Error("constraintName cannot be null."); + var ikConstraints = this.ikConstraints; + for (var i = 0, n = ikConstraints.length; i < n; i++) { + var ikConstraint = ikConstraints[i]; + if (ikConstraint.data.name == constraintName) + return ikConstraint; + } + return null; + }; + Skeleton.prototype.findTransformConstraint = function (constraintName) { + if (constraintName == null) + throw new Error("constraintName cannot be null."); + var transformConstraints = this.transformConstraints; + for (var i = 0, n = transformConstraints.length; i < n; i++) { + var constraint = transformConstraints[i]; + if (constraint.data.name == constraintName) + return constraint; + } + return null; + }; + Skeleton.prototype.findPathConstraint = function (constraintName) { + if (constraintName == null) + throw new Error("constraintName cannot be null."); + var pathConstraints = this.pathConstraints; + for (var i = 0, n = pathConstraints.length; i < n; i++) { + var constraint = pathConstraints[i]; + if (constraint.data.name == constraintName) + return constraint; + } + return null; + }; + Skeleton.prototype.getBounds = function (offset, size, temp) { + if (offset == null) + throw new Error("offset cannot be null."); + if (size == null) + throw new Error("size cannot be null."); + var drawOrder = this.drawOrder; + var minX = Number.POSITIVE_INFINITY, minY = Number.POSITIVE_INFINITY, maxX = Number.NEGATIVE_INFINITY, maxY = Number.NEGATIVE_INFINITY; + for (var i = 0, n = drawOrder.length; i < n; i++) { + var slot = drawOrder[i]; + var verticesLength = 0; + var vertices = null; + var attachment = slot.getAttachment(); + if (attachment instanceof core.RegionAttachment) { + verticesLength = 8; + vertices = core.Utils.setArraySize(temp, verticesLength, 0); + attachment.computeWorldVertices(slot.bone, vertices, 0, 2); + } + else if (attachment instanceof core.MeshAttachment) { + var mesh = attachment; + verticesLength = mesh.worldVerticesLength; + vertices = core.Utils.setArraySize(temp, verticesLength, 0); + mesh.computeWorldVertices(slot, 0, verticesLength, vertices, 0, 2); + } + if (vertices != null) { + for (var ii = 0, nn = vertices.length; ii < nn; ii += 2) { + var x = vertices[ii], y = vertices[ii + 1]; + minX = Math.min(minX, x); + minY = Math.min(minY, y); + maxX = Math.max(maxX, x); + maxY = Math.max(maxY, y); + } + } + } + offset.set(minX, minY); + size.set(maxX - minX, maxY - minY); + }; + Skeleton.prototype.update = function (delta) { + this.time += delta; + }; + return Skeleton; + }()); + core.Skeleton = Skeleton; + })(core = pixi_spine.core || (pixi_spine.core = {})); +})(pixi_spine || (pixi_spine = {})); +var pixi_spine; +(function (pixi_spine) { + var core; + (function (core) { + var SkeletonBounds = (function () { + function SkeletonBounds() { + this.minX = 0; + this.minY = 0; + this.maxX = 0; + this.maxY = 0; + this.boundingBoxes = new Array(); + this.polygons = new Array(); + this.polygonPool = new core.Pool(function () { + return core.Utils.newFloatArray(16); + }); + } + SkeletonBounds.prototype.update = function (skeleton, updateAabb) { + if (skeleton == null) + throw new Error("skeleton cannot be null."); + var boundingBoxes = this.boundingBoxes; + var polygons = this.polygons; + var polygonPool = this.polygonPool; + var slots = skeleton.slots; + var slotCount = slots.length; + boundingBoxes.length = 0; + polygonPool.freeAll(polygons); + polygons.length = 0; + for (var i = 0; i < slotCount; i++) { + var slot = slots[i]; + var attachment = slot.getAttachment(); + if (attachment instanceof core.BoundingBoxAttachment) { + var boundingBox = attachment; + boundingBoxes.push(boundingBox); + var polygon = polygonPool.obtain(); + if (polygon.length != boundingBox.worldVerticesLength) { + polygon = core.Utils.newFloatArray(boundingBox.worldVerticesLength); + } + polygons.push(polygon); + boundingBox.computeWorldVertices(slot, 0, boundingBox.worldVerticesLength, polygon, 0, 2); + } + } + if (updateAabb) { + this.aabbCompute(); + } + else { + this.minX = Number.POSITIVE_INFINITY; + this.minY = Number.POSITIVE_INFINITY; + this.maxX = Number.NEGATIVE_INFINITY; + this.maxY = Number.NEGATIVE_INFINITY; + } + }; + SkeletonBounds.prototype.aabbCompute = function () { + var minX = Number.POSITIVE_INFINITY, minY = Number.POSITIVE_INFINITY, maxX = Number.NEGATIVE_INFINITY, maxY = Number.NEGATIVE_INFINITY; + var polygons = this.polygons; + for (var i = 0, n = polygons.length; i < n; i++) { + var polygon = polygons[i]; + var vertices = polygon; + for (var ii = 0, nn = polygon.length; ii < nn; ii += 2) { + var x = vertices[ii]; + var y = vertices[ii + 1]; + minX = Math.min(minX, x); + minY = Math.min(minY, y); + maxX = Math.max(maxX, x); + maxY = Math.max(maxY, y); + } + } + this.minX = minX; + this.minY = minY; + this.maxX = maxX; + this.maxY = maxY; + }; + SkeletonBounds.prototype.aabbContainsPoint = function (x, y) { + return x >= this.minX && x <= this.maxX && y >= this.minY && y <= this.maxY; + }; + SkeletonBounds.prototype.aabbIntersectsSegment = function (x1, y1, x2, y2) { + var minX = this.minX; + var minY = this.minY; + var maxX = this.maxX; + var maxY = this.maxY; + if ((x1 <= minX && x2 <= minX) || (y1 <= minY && y2 <= minY) || (x1 >= maxX && x2 >= maxX) || (y1 >= maxY && y2 >= maxY)) + return false; + var m = (y2 - y1) / (x2 - x1); + var y = m * (minX - x1) + y1; + if (y > minY && y < maxY) + return true; + y = m * (maxX - x1) + y1; + if (y > minY && y < maxY) + return true; + var x = (minY - y1) / m + x1; + if (x > minX && x < maxX) + return true; + x = (maxY - y1) / m + x1; + if (x > minX && x < maxX) + return true; + return false; + }; + SkeletonBounds.prototype.aabbIntersectsSkeleton = function (bounds) { + return this.minX < bounds.maxX && this.maxX > bounds.minX && this.minY < bounds.maxY && this.maxY > bounds.minY; + }; + SkeletonBounds.prototype.containsPoint = function (x, y) { + var polygons = this.polygons; + for (var i = 0, n = polygons.length; i < n; i++) + if (this.containsPointPolygon(polygons[i], x, y)) + return this.boundingBoxes[i]; + return null; + }; + SkeletonBounds.prototype.containsPointPolygon = function (polygon, x, y) { + var vertices = polygon; + var nn = polygon.length; + var prevIndex = nn - 2; + var inside = false; + for (var ii = 0; ii < nn; ii += 2) { + var vertexY = vertices[ii + 1]; + var prevY = vertices[prevIndex + 1]; + if ((vertexY < y && prevY >= y) || (prevY < y && vertexY >= y)) { + var vertexX = vertices[ii]; + if (vertexX + (y - vertexY) / (prevY - vertexY) * (vertices[prevIndex] - vertexX) < x) + inside = !inside; + } + prevIndex = ii; + } + return inside; + }; + SkeletonBounds.prototype.intersectsSegment = function (x1, y1, x2, y2) { + var polygons = this.polygons; + for (var i = 0, n = polygons.length; i < n; i++) + if (this.intersectsSegmentPolygon(polygons[i], x1, y1, x2, y2)) + return this.boundingBoxes[i]; + return null; + }; + SkeletonBounds.prototype.intersectsSegmentPolygon = function (polygon, x1, y1, x2, y2) { + var vertices = polygon; + var nn = polygon.length; + var width12 = x1 - x2, height12 = y1 - y2; + var det1 = x1 * y2 - y1 * x2; + var x3 = vertices[nn - 2], y3 = vertices[nn - 1]; + for (var ii = 0; ii < nn; ii += 2) { + var x4 = vertices[ii], y4 = vertices[ii + 1]; + var det2 = x3 * y4 - y3 * x4; + var width34 = x3 - x4, height34 = y3 - y4; + var det3 = width12 * height34 - height12 * width34; + var x = (det1 * width34 - width12 * det2) / det3; + if (((x >= x3 && x <= x4) || (x >= x4 && x <= x3)) && ((x >= x1 && x <= x2) || (x >= x2 && x <= x1))) { + var y = (det1 * height34 - height12 * det2) / det3; + if (((y >= y3 && y <= y4) || (y >= y4 && y <= y3)) && ((y >= y1 && y <= y2) || (y >= y2 && y <= y1))) + return true; + } + x3 = x4; + y3 = y4; + } + return false; + }; + SkeletonBounds.prototype.getPolygon = function (boundingBox) { + if (boundingBox == null) + throw new Error("boundingBox cannot be null."); + var index = this.boundingBoxes.indexOf(boundingBox); + return index == -1 ? null : this.polygons[index]; + }; + SkeletonBounds.prototype.getWidth = function () { + return this.maxX - this.minX; + }; + SkeletonBounds.prototype.getHeight = function () { + return this.maxY - this.minY; + }; + return SkeletonBounds; + }()); + core.SkeletonBounds = SkeletonBounds; + })(core = pixi_spine.core || (pixi_spine.core = {})); +})(pixi_spine || (pixi_spine = {})); +var pixi_spine; +(function (pixi_spine) { + var core; + (function (core) { + var SkeletonClipping = (function () { + function SkeletonClipping() { + this.triangulator = new core.Triangulator(); + this.clippingPolygon = new Array(); + this.clipOutput = new Array(); + this.clippedVertices = new Array(); + this.clippedTriangles = new Array(); + this.scratch = new Array(); + } + SkeletonClipping.prototype.clipStart = function (slot, clip) { + if (this.clipAttachment != null) + return 0; + this.clipAttachment = clip; + var n = clip.worldVerticesLength; + var vertices = core.Utils.setArraySize(this.clippingPolygon, n); + clip.computeWorldVertices(slot, 0, n, vertices, 0, 2); + var clippingPolygon = this.clippingPolygon; + SkeletonClipping.makeClockwise(clippingPolygon); + var clippingPolygons = this.clippingPolygons = this.triangulator.decompose(clippingPolygon, this.triangulator.triangulate(clippingPolygon)); + for (var i = 0, n_1 = clippingPolygons.length; i < n_1; i++) { + var polygon = clippingPolygons[i]; + SkeletonClipping.makeClockwise(polygon); + polygon.push(polygon[0]); + polygon.push(polygon[1]); + } + return clippingPolygons.length; + }; + SkeletonClipping.prototype.clipEndWithSlot = function (slot) { + if (this.clipAttachment != null && this.clipAttachment.endSlot == slot.data) + this.clipEnd(); + }; + SkeletonClipping.prototype.clipEnd = function () { + if (this.clipAttachment == null) + return; + this.clipAttachment = null; + this.clippingPolygons = null; + this.clippedVertices.length = 0; + this.clippedTriangles.length = 0; + this.clippingPolygon.length = 0; + }; + SkeletonClipping.prototype.isClipping = function () { + return this.clipAttachment != null; + }; + SkeletonClipping.prototype.clipTriangles = function (vertices, verticesLength, triangles, trianglesLength, uvs, light, dark, twoColor) { + var clipOutput = this.clipOutput, clippedVertices = this.clippedVertices; + var clippedTriangles = this.clippedTriangles; + var polygons = this.clippingPolygons; + var polygonsCount = this.clippingPolygons.length; + var vertexSize = twoColor ? 12 : 8; + var index = 0; + clippedVertices.length = 0; + clippedTriangles.length = 0; + outer: for (var i = 0; i < trianglesLength; i += 3) { + var vertexOffset = triangles[i] << 1; + var x1 = vertices[vertexOffset], y1 = vertices[vertexOffset + 1]; + var u1 = uvs[vertexOffset], v1 = uvs[vertexOffset + 1]; + vertexOffset = triangles[i + 1] << 1; + var x2 = vertices[vertexOffset], y2 = vertices[vertexOffset + 1]; + var u2 = uvs[vertexOffset], v2 = uvs[vertexOffset + 1]; + vertexOffset = triangles[i + 2] << 1; + var x3 = vertices[vertexOffset], y3 = vertices[vertexOffset + 1]; + var u3 = uvs[vertexOffset], v3 = uvs[vertexOffset + 1]; + for (var p = 0; p < polygonsCount; p++) { + var s = clippedVertices.length; + if (this.clip(x1, y1, x2, y2, x3, y3, polygons[p], clipOutput)) { + var clipOutputLength = clipOutput.length; + if (clipOutputLength == 0) + continue; + var d0 = y2 - y3, d1 = x3 - x2, d2 = x1 - x3, d4 = y3 - y1; + var d = 1 / (d0 * d2 + d1 * (y1 - y3)); + var clipOutputCount = clipOutputLength >> 1; + var clipOutputItems = this.clipOutput; + var clippedVerticesItems = core.Utils.setArraySize(clippedVertices, s + clipOutputCount * vertexSize); + for (var ii = 0; ii < clipOutputLength; ii += 2) { + var x = clipOutputItems[ii], y = clipOutputItems[ii + 1]; + clippedVerticesItems[s] = x; + clippedVerticesItems[s + 1] = y; + clippedVerticesItems[s + 2] = light.r; + clippedVerticesItems[s + 3] = light.g; + clippedVerticesItems[s + 4] = light.b; + clippedVerticesItems[s + 5] = light.a; + var c0 = x - x3, c1 = y - y3; + var a = (d0 * c0 + d1 * c1) * d; + var b = (d4 * c0 + d2 * c1) * d; + var c = 1 - a - b; + clippedVerticesItems[s + 6] = u1 * a + u2 * b + u3 * c; + clippedVerticesItems[s + 7] = v1 * a + v2 * b + v3 * c; + if (twoColor) { + clippedVerticesItems[s + 8] = dark.r; + clippedVerticesItems[s + 9] = dark.g; + clippedVerticesItems[s + 10] = dark.b; + clippedVerticesItems[s + 11] = dark.a; + } + s += vertexSize; + } + s = clippedTriangles.length; + var clippedTrianglesItems = core.Utils.setArraySize(clippedTriangles, s + 3 * (clipOutputCount - 2)); + clipOutputCount--; + for (var ii = 1; ii < clipOutputCount; ii++) { + clippedTrianglesItems[s] = index; + clippedTrianglesItems[s + 1] = (index + ii); + clippedTrianglesItems[s + 2] = (index + ii + 1); + s += 3; + } + index += clipOutputCount + 1; + } + else { + var clippedVerticesItems = core.Utils.setArraySize(clippedVertices, s + 3 * vertexSize); + clippedVerticesItems[s] = x1; + clippedVerticesItems[s + 1] = y1; + clippedVerticesItems[s + 2] = light.r; + clippedVerticesItems[s + 3] = light.g; + clippedVerticesItems[s + 4] = light.b; + clippedVerticesItems[s + 5] = light.a; + if (!twoColor) { + clippedVerticesItems[s + 6] = u1; + clippedVerticesItems[s + 7] = v1; + clippedVerticesItems[s + 8] = x2; + clippedVerticesItems[s + 9] = y2; + clippedVerticesItems[s + 10] = light.r; + clippedVerticesItems[s + 11] = light.g; + clippedVerticesItems[s + 12] = light.b; + clippedVerticesItems[s + 13] = light.a; + clippedVerticesItems[s + 14] = u2; + clippedVerticesItems[s + 15] = v2; + clippedVerticesItems[s + 16] = x3; + clippedVerticesItems[s + 17] = y3; + clippedVerticesItems[s + 18] = light.r; + clippedVerticesItems[s + 19] = light.g; + clippedVerticesItems[s + 20] = light.b; + clippedVerticesItems[s + 21] = light.a; + clippedVerticesItems[s + 22] = u3; + clippedVerticesItems[s + 23] = v3; + } + else { + clippedVerticesItems[s + 6] = u1; + clippedVerticesItems[s + 7] = v1; + clippedVerticesItems[s + 8] = dark.r; + clippedVerticesItems[s + 9] = dark.g; + clippedVerticesItems[s + 10] = dark.b; + clippedVerticesItems[s + 11] = dark.a; + clippedVerticesItems[s + 12] = x2; + clippedVerticesItems[s + 13] = y2; + clippedVerticesItems[s + 14] = light.r; + clippedVerticesItems[s + 15] = light.g; + clippedVerticesItems[s + 16] = light.b; + clippedVerticesItems[s + 17] = light.a; + clippedVerticesItems[s + 18] = u2; + clippedVerticesItems[s + 19] = v2; + clippedVerticesItems[s + 20] = dark.r; + clippedVerticesItems[s + 21] = dark.g; + clippedVerticesItems[s + 22] = dark.b; + clippedVerticesItems[s + 23] = dark.a; + clippedVerticesItems[s + 24] = x3; + clippedVerticesItems[s + 25] = y3; + clippedVerticesItems[s + 26] = light.r; + clippedVerticesItems[s + 27] = light.g; + clippedVerticesItems[s + 28] = light.b; + clippedVerticesItems[s + 29] = light.a; + clippedVerticesItems[s + 30] = u3; + clippedVerticesItems[s + 31] = v3; + clippedVerticesItems[s + 32] = dark.r; + clippedVerticesItems[s + 33] = dark.g; + clippedVerticesItems[s + 34] = dark.b; + clippedVerticesItems[s + 35] = dark.a; + } + s = clippedTriangles.length; + var clippedTrianglesItems = core.Utils.setArraySize(clippedTriangles, s + 3); + clippedTrianglesItems[s] = index; + clippedTrianglesItems[s + 1] = (index + 1); + clippedTrianglesItems[s + 2] = (index + 2); + index += 3; + continue outer; + } + } + } + }; + SkeletonClipping.prototype.clip = function (x1, y1, x2, y2, x3, y3, clippingArea, output) { + var originalOutput = output; + var clipped = false; + var input = null; + if (clippingArea.length % 4 >= 2) { + input = output; + output = this.scratch; + } + else + input = this.scratch; + input.length = 0; + input.push(x1); + input.push(y1); + input.push(x2); + input.push(y2); + input.push(x3); + input.push(y3); + input.push(x1); + input.push(y1); + output.length = 0; + var clippingVertices = clippingArea; + var clippingVerticesLast = clippingArea.length - 4; + for (var i = 0;; i += 2) { + var edgeX = clippingVertices[i], edgeY = clippingVertices[i + 1]; + var edgeX2 = clippingVertices[i + 2], edgeY2 = clippingVertices[i + 3]; + var deltaX = edgeX - edgeX2, deltaY = edgeY - edgeY2; + var inputVertices = input; + var inputVerticesLength = input.length - 2, outputStart = output.length; + for (var ii = 0; ii < inputVerticesLength; ii += 2) { + var inputX = inputVertices[ii], inputY = inputVertices[ii + 1]; + var inputX2 = inputVertices[ii + 2], inputY2 = inputVertices[ii + 3]; + var side2 = deltaX * (inputY2 - edgeY2) - deltaY * (inputX2 - edgeX2) > 0; + if (deltaX * (inputY - edgeY2) - deltaY * (inputX - edgeX2) > 0) { + if (side2) { + output.push(inputX2); + output.push(inputY2); + continue; + } + var c0 = inputY2 - inputY, c2 = inputX2 - inputX; + var ua = (c2 * (edgeY - inputY) - c0 * (edgeX - inputX)) / (c0 * (edgeX2 - edgeX) - c2 * (edgeY2 - edgeY)); + output.push(edgeX + (edgeX2 - edgeX) * ua); + output.push(edgeY + (edgeY2 - edgeY) * ua); + } + else if (side2) { + var c0 = inputY2 - inputY, c2 = inputX2 - inputX; + var ua = (c2 * (edgeY - inputY) - c0 * (edgeX - inputX)) / (c0 * (edgeX2 - edgeX) - c2 * (edgeY2 - edgeY)); + output.push(edgeX + (edgeX2 - edgeX) * ua); + output.push(edgeY + (edgeY2 - edgeY) * ua); + output.push(inputX2); + output.push(inputY2); + } + clipped = true; + } + if (outputStart == output.length) { + originalOutput.length = 0; + return true; + } + output.push(output[0]); + output.push(output[1]); + if (i == clippingVerticesLast) + break; + var temp = output; + output = input; + output.length = 0; + input = temp; + } + if (originalOutput != output) { + originalOutput.length = 0; + for (var i = 0, n = output.length - 2; i < n; i++) + originalOutput[i] = output[i]; + } + else + originalOutput.length = originalOutput.length - 2; + return clipped; + }; + SkeletonClipping.makeClockwise = function (polygon) { + var vertices = polygon; + var verticeslength = polygon.length; + var area = vertices[verticeslength - 2] * vertices[1] - vertices[0] * vertices[verticeslength - 1], p1x = 0, p1y = 0, p2x = 0, p2y = 0; + for (var i = 0, n = verticeslength - 3; i < n; i += 2) { + p1x = vertices[i]; + p1y = vertices[i + 1]; + p2x = vertices[i + 2]; + p2y = vertices[i + 3]; + area += p1x * p2y - p2x * p1y; + } + if (area < 0) + return; + for (var i = 0, lastX = verticeslength - 2, n = verticeslength >> 1; i < n; i += 2) { + var x = vertices[i], y = vertices[i + 1]; + var other = lastX - i; + vertices[i] = vertices[other]; + vertices[i + 1] = vertices[other + 1]; + vertices[other] = x; + vertices[other + 1] = y; + } + }; + return SkeletonClipping; + }()); + core.SkeletonClipping = SkeletonClipping; + })(core = pixi_spine.core || (pixi_spine.core = {})); +})(pixi_spine || (pixi_spine = {})); +var pixi_spine; +(function (pixi_spine) { + var core; + (function (core) { + var SkeletonData = (function () { + function SkeletonData() { + this.bones = new Array(); + this.slots = new Array(); + this.skins = new Array(); + this.events = new Array(); + this.animations = new Array(); + this.ikConstraints = new Array(); + this.transformConstraints = new Array(); + this.pathConstraints = new Array(); + this.fps = 0; + } + SkeletonData.prototype.findBone = function (boneName) { + if (boneName == null) + throw new Error("boneName cannot be null."); + var bones = this.bones; + for (var i = 0, n = bones.length; i < n; i++) { + var bone = bones[i]; + if (bone.name == boneName) + return bone; + } + return null; + }; + SkeletonData.prototype.findBoneIndex = function (boneName) { + if (boneName == null) + throw new Error("boneName cannot be null."); + var bones = this.bones; + for (var i = 0, n = bones.length; i < n; i++) + if (bones[i].name == boneName) + return i; + return -1; + }; + SkeletonData.prototype.findSlot = function (slotName) { + if (slotName == null) + throw new Error("slotName cannot be null."); + var slots = this.slots; + for (var i = 0, n = slots.length; i < n; i++) { + var slot = slots[i]; + if (slot.name == slotName) + return slot; + } + return null; + }; + SkeletonData.prototype.findSlotIndex = function (slotName) { + if (slotName == null) + throw new Error("slotName cannot be null."); + var slots = this.slots; + for (var i = 0, n = slots.length; i < n; i++) + if (slots[i].name == slotName) + return i; + return -1; + }; + SkeletonData.prototype.findSkin = function (skinName) { + if (skinName == null) + throw new Error("skinName cannot be null."); + var skins = this.skins; + for (var i = 0, n = skins.length; i < n; i++) { + var skin = skins[i]; + if (skin.name == skinName) + return skin; + } + return null; + }; + SkeletonData.prototype.findEvent = function (eventDataName) { + if (eventDataName == null) + throw new Error("eventDataName cannot be null."); + var events = this.events; + for (var i = 0, n = events.length; i < n; i++) { + var event_4 = events[i]; + if (event_4.name == eventDataName) + return event_4; + } + return null; + }; + SkeletonData.prototype.findAnimation = function (animationName) { + if (animationName == null) + throw new Error("animationName cannot be null."); + var animations = this.animations; + for (var i = 0, n = animations.length; i < n; i++) { + var animation = animations[i]; + if (animation.name == animationName) + return animation; + } + return null; + }; + SkeletonData.prototype.findIkConstraint = function (constraintName) { + if (constraintName == null) + throw new Error("constraintName cannot be null."); + var ikConstraints = this.ikConstraints; + for (var i = 0, n = ikConstraints.length; i < n; i++) { + var constraint = ikConstraints[i]; + if (constraint.name == constraintName) + return constraint; + } + return null; + }; + SkeletonData.prototype.findTransformConstraint = function (constraintName) { + if (constraintName == null) + throw new Error("constraintName cannot be null."); + var transformConstraints = this.transformConstraints; + for (var i = 0, n = transformConstraints.length; i < n; i++) { + var constraint = transformConstraints[i]; + if (constraint.name == constraintName) + return constraint; + } + return null; + }; + SkeletonData.prototype.findPathConstraint = function (constraintName) { + if (constraintName == null) + throw new Error("constraintName cannot be null."); + var pathConstraints = this.pathConstraints; + for (var i = 0, n = pathConstraints.length; i < n; i++) { + var constraint = pathConstraints[i]; + if (constraint.name == constraintName) + return constraint; + } + return null; + }; + SkeletonData.prototype.findPathConstraintIndex = function (pathConstraintName) { + if (pathConstraintName == null) + throw new Error("pathConstraintName cannot be null."); + var pathConstraints = this.pathConstraints; + for (var i = 0, n = pathConstraints.length; i < n; i++) + if (pathConstraints[i].name == pathConstraintName) + return i; + return -1; + }; + return SkeletonData; + }()); + core.SkeletonData = SkeletonData; + })(core = pixi_spine.core || (pixi_spine.core = {})); +})(pixi_spine || (pixi_spine = {})); +var pixi_spine; +(function (pixi_spine) { + var core; + (function (core) { + var SkeletonJson = (function () { + function SkeletonJson(attachmentLoader) { + this.scale = 1; + this.linkedMeshes = new Array(); + this.attachmentLoader = attachmentLoader; + } + SkeletonJson.prototype.readSkeletonData = function (json) { + var scale = this.scale; + var skeletonData = new core.SkeletonData(); + var root = typeof (json) === "string" ? JSON.parse(json) : json; + var skeletonMap = root.skeleton; + if (skeletonMap != null) { + skeletonData.hash = skeletonMap.hash; + skeletonData.version = skeletonMap.spine; + skeletonData.width = skeletonMap.width; + skeletonData.height = skeletonMap.height; + skeletonData.fps = skeletonMap.fps; + skeletonData.imagesPath = skeletonMap.images; + } + if (root.bones) { + for (var i = 0; i < root.bones.length; i++) { + var boneMap = root.bones[i]; + var parent_2 = null; + var parentName = this.getValue(boneMap, "parent", null); + if (parentName != null) { + parent_2 = skeletonData.findBone(parentName); + if (parent_2 == null) + throw new Error("Parent bone not found: " + parentName); + } + var data = new core.BoneData(skeletonData.bones.length, boneMap.name, parent_2); + data.length = this.getValue(boneMap, "length", 0) * scale; + data.x = this.getValue(boneMap, "x", 0) * scale; + data.y = this.getValue(boneMap, "y", 0) * scale; + data.rotation = this.getValue(boneMap, "rotation", 0); + data.scaleX = this.getValue(boneMap, "scaleX", 1); + data.scaleY = this.getValue(boneMap, "scaleY", 1); + data.shearX = this.getValue(boneMap, "shearX", 0); + data.shearY = this.getValue(boneMap, "shearY", 0); + data.transformMode = SkeletonJson.transformModeFromString(this.getValue(boneMap, "transform", "normal")); + skeletonData.bones.push(data); + } + } + if (root.slots) { + for (var i = 0; i < root.slots.length; i++) { + var slotMap = root.slots[i]; + var slotName = slotMap.name; + var boneName = slotMap.bone; + var boneData = skeletonData.findBone(boneName); + if (boneData == null) + throw new Error("Slot bone not found: " + boneName); + var data = new core.SlotData(skeletonData.slots.length, slotName, boneData); + var color = this.getValue(slotMap, "color", null); + if (color != null) + data.color.setFromString(color); + var dark = this.getValue(slotMap, "dark", null); + if (dark != null) { + data.darkColor = new core.Color(1, 1, 1, 1); + data.darkColor.setFromString(dark); + } + data.attachmentName = this.getValue(slotMap, "attachment", null); + data.blendMode = SkeletonJson.blendModeFromString(this.getValue(slotMap, "blend", "normal")); + skeletonData.slots.push(data); + } + } + if (root.ik) { + for (var i = 0; i < root.ik.length; i++) { + var constraintMap = root.ik[i]; + var data = new core.IkConstraintData(constraintMap.name); + data.order = this.getValue(constraintMap, "order", 0); + for (var j = 0; j < constraintMap.bones.length; j++) { + var boneName = constraintMap.bones[j]; + var bone = skeletonData.findBone(boneName); + if (bone == null) + throw new Error("IK bone not found: " + boneName); + data.bones.push(bone); + } + var targetName = constraintMap.target; + data.target = skeletonData.findBone(targetName); + if (data.target == null) + throw new Error("IK target bone not found: " + targetName); + data.bendDirection = this.getValue(constraintMap, "bendPositive", true) ? 1 : -1; + data.mix = this.getValue(constraintMap, "mix", 1); + skeletonData.ikConstraints.push(data); + } + } + if (root.transform) { + for (var i = 0; i < root.transform.length; i++) { + var constraintMap = root.transform[i]; + var data = new core.TransformConstraintData(constraintMap.name); + data.order = this.getValue(constraintMap, "order", 0); + for (var j = 0; j < constraintMap.bones.length; j++) { + var boneName = constraintMap.bones[j]; + var bone = skeletonData.findBone(boneName); + if (bone == null) + throw new Error("Transform constraint bone not found: " + boneName); + data.bones.push(bone); + } + var targetName = constraintMap.target; + data.target = skeletonData.findBone(targetName); + if (data.target == null) + throw new Error("Transform constraint target bone not found: " + targetName); + data.local = this.getValue(constraintMap, "local", false); + data.relative = this.getValue(constraintMap, "relative", false); + data.offsetRotation = this.getValue(constraintMap, "rotation", 0); + data.offsetX = this.getValue(constraintMap, "x", 0) * scale; + data.offsetY = this.getValue(constraintMap, "y", 0) * scale; + data.offsetScaleX = this.getValue(constraintMap, "scaleX", 0); + data.offsetScaleY = this.getValue(constraintMap, "scaleY", 0); + data.offsetShearY = this.getValue(constraintMap, "shearY", 0); + data.rotateMix = this.getValue(constraintMap, "rotateMix", 1); + data.translateMix = this.getValue(constraintMap, "translateMix", 1); + data.scaleMix = this.getValue(constraintMap, "scaleMix", 1); + data.shearMix = this.getValue(constraintMap, "shearMix", 1); + skeletonData.transformConstraints.push(data); + } + } + if (root.path) { + for (var i = 0; i < root.path.length; i++) { + var constraintMap = root.path[i]; + var data = new core.PathConstraintData(constraintMap.name); + data.order = this.getValue(constraintMap, "order", 0); + for (var j = 0; j < constraintMap.bones.length; j++) { + var boneName = constraintMap.bones[j]; + var bone = skeletonData.findBone(boneName); + if (bone == null) + throw new Error("Transform constraint bone not found: " + boneName); + data.bones.push(bone); + } + var targetName = constraintMap.target; + data.target = skeletonData.findSlot(targetName); + if (data.target == null) + throw new Error("Path target slot not found: " + targetName); + data.positionMode = SkeletonJson.positionModeFromString(this.getValue(constraintMap, "positionMode", "percent")); + data.spacingMode = SkeletonJson.spacingModeFromString(this.getValue(constraintMap, "spacingMode", "length")); + data.rotateMode = SkeletonJson.rotateModeFromString(this.getValue(constraintMap, "rotateMode", "tangent")); + data.offsetRotation = this.getValue(constraintMap, "rotation", 0); + data.position = this.getValue(constraintMap, "position", 0); + if (data.positionMode == core.PositionMode.Fixed) + data.position *= scale; + data.spacing = this.getValue(constraintMap, "spacing", 0); + if (data.spacingMode == core.SpacingMode.Length || data.spacingMode == core.SpacingMode.Fixed) + data.spacing *= scale; + data.rotateMix = this.getValue(constraintMap, "rotateMix", 1); + data.translateMix = this.getValue(constraintMap, "translateMix", 1); + skeletonData.pathConstraints.push(data); + } + } + if (root.skins) { + for (var skinName in root.skins) { + var skinMap = root.skins[skinName]; + var skin = new core.Skin(skinName); + for (var slotName in skinMap) { + var slotIndex = skeletonData.findSlotIndex(slotName); + if (slotIndex == -1) + throw new Error("Slot not found: " + slotName); + var slotMap = skinMap[slotName]; + for (var entryName in slotMap) { + var attachment = this.readAttachment(slotMap[entryName], skin, slotIndex, entryName, skeletonData); + if (attachment != null) + skin.addAttachment(slotIndex, entryName, attachment); + } + } + skeletonData.skins.push(skin); + if (skin.name == "default") + skeletonData.defaultSkin = skin; + } + } + for (var i = 0, n = this.linkedMeshes.length; i < n; i++) { + var linkedMesh = this.linkedMeshes[i]; + var skin = linkedMesh.skin == null ? skeletonData.defaultSkin : skeletonData.findSkin(linkedMesh.skin); + if (skin == null) + throw new Error("Skin not found: " + linkedMesh.skin); + var parent_3 = skin.getAttachment(linkedMesh.slotIndex, linkedMesh.parent); + if (parent_3 == null) + throw new Error("Parent mesh not found: " + linkedMesh.parent); + linkedMesh.mesh.setParentMesh(parent_3); + } + this.linkedMeshes.length = 0; + if (root.events) { + for (var eventName in root.events) { + var eventMap = root.events[eventName]; + var data = new core.EventData(eventName); + data.intValue = this.getValue(eventMap, "int", 0); + data.floatValue = this.getValue(eventMap, "float", 0); + data.stringValue = this.getValue(eventMap, "string", ""); + skeletonData.events.push(data); + } + } + if (root.animations) { + for (var animationName in root.animations) { + var animationMap = root.animations[animationName]; + this.readAnimation(animationMap, animationName, skeletonData); + } + } + return skeletonData; + }; + SkeletonJson.prototype.readAttachment = function (map, skin, slotIndex, name, skeletonData) { + var scale = this.scale; + name = this.getValue(map, "name", name); + var type = this.getValue(map, "type", "region"); + switch (type) { + case "region": { + var path = this.getValue(map, "path", name); + var region = this.attachmentLoader.newRegionAttachment(skin, name, path); + if (region == null) + return null; + region.path = path; + region.x = this.getValue(map, "x", 0) * scale; + region.y = this.getValue(map, "y", 0) * scale; + region.scaleX = this.getValue(map, "scaleX", 1); + region.scaleY = this.getValue(map, "scaleY", 1); + region.rotation = this.getValue(map, "rotation", 0); + region.width = map.width * scale; + region.height = map.height * scale; + var color = this.getValue(map, "color", null); + if (color != null) + region.color.setFromString(color); + return region; + } + case "boundingbox": { + var box = this.attachmentLoader.newBoundingBoxAttachment(skin, name); + if (box == null) + return null; + this.readVertices(map, box, map.vertexCount << 1); + var color = this.getValue(map, "color", null); + if (color != null) + box.color.setFromString(color); + return box; + } + case "mesh": + case "linkedmesh": { + var path = this.getValue(map, "path", name); + var mesh = this.attachmentLoader.newMeshAttachment(skin, name, path); + if (mesh == null) + return null; + mesh.path = path; + var color = this.getValue(map, "color", null); + if (color != null) + mesh.color.setFromString(color); + var parent_4 = this.getValue(map, "parent", null); + if (parent_4 != null) { + mesh.inheritDeform = this.getValue(map, "deform", true); + this.linkedMeshes.push(new LinkedMesh(mesh, this.getValue(map, "skin", null), slotIndex, parent_4)); + return mesh; + } + var uvs = map.uvs; + this.readVertices(map, mesh, uvs.length); + mesh.triangles = map.triangles; + mesh.regionUVs = uvs; + mesh.hullLength = this.getValue(map, "hull", 0) * 2; + return mesh; + } + case "path": { + var path = this.attachmentLoader.newPathAttachment(skin, name); + if (path == null) + return null; + path.closed = this.getValue(map, "closed", false); + path.constantSpeed = this.getValue(map, "constantSpeed", true); + var vertexCount = map.vertexCount; + this.readVertices(map, path, vertexCount << 1); + var lengths = core.Utils.newArray(vertexCount / 3, 0); + for (var i = 0; i < map.lengths.length; i++) + lengths[i] = map.lengths[i] * scale; + path.lengths = lengths; + var color = this.getValue(map, "color", null); + if (color != null) + path.color.setFromString(color); + return path; + } + case "point": { + var point = this.attachmentLoader.newPointAttachment(skin, name); + if (point == null) + return null; + point.x = this.getValue(map, "x", 0) * scale; + point.y = this.getValue(map, "y", 0) * scale; + point.rotation = this.getValue(map, "rotation", 0); + var color = this.getValue(map, "color", null); + if (color != null) + point.color.setFromString(color); + return point; + } + case "clipping": { + var clip = this.attachmentLoader.newClippingAttachment(skin, name); + if (clip == null) + return null; + var end = this.getValue(map, "end", null); + if (end != null) { + var slot = skeletonData.findSlot(end); + if (slot == null) + throw new Error("Clipping end slot not found: " + end); + clip.endSlot = slot; + } + var vertexCount = map.vertexCount; + this.readVertices(map, clip, vertexCount << 1); + var color = this.getValue(map, "color", null); + if (color != null) + clip.color.setFromString(color); + return clip; + } + } + return null; + }; + SkeletonJson.prototype.readVertices = function (map, attachment, verticesLength) { + var scale = this.scale; + attachment.worldVerticesLength = verticesLength; + var vertices = map.vertices; + if (verticesLength == vertices.length) { + var scaledVertices = core.Utils.toFloatArray(vertices); + if (scale != 1) { + for (var i = 0, n = vertices.length; i < n; i++) + scaledVertices[i] *= scale; + } + attachment.vertices = scaledVertices; + return; + } + var weights = new Array(); + var bones = new Array(); + for (var i = 0, n = vertices.length; i < n;) { + var boneCount = vertices[i++]; + bones.push(boneCount); + for (var nn = i + boneCount * 4; i < nn; i += 4) { + bones.push(vertices[i]); + weights.push(vertices[i + 1] * scale); + weights.push(vertices[i + 2] * scale); + weights.push(vertices[i + 3]); + } + } + attachment.bones = bones; + attachment.vertices = core.Utils.toFloatArray(weights); + }; + SkeletonJson.prototype.readAnimation = function (map, name, skeletonData) { + var scale = this.scale; + var timelines = new Array(); + var duration = 0; + if (map.slots) { + for (var slotName in map.slots) { + var slotMap = map.slots[slotName]; + var slotIndex = skeletonData.findSlotIndex(slotName); + if (slotIndex == -1) + throw new Error("Slot not found: " + slotName); + for (var timelineName in slotMap) { + var timelineMap = slotMap[timelineName]; + if (timelineName == "attachment") { + var timeline = new core.AttachmentTimeline(timelineMap.length); + timeline.slotIndex = slotIndex; + var frameIndex = 0; + for (var i = 0; i < timelineMap.length; i++) { + var valueMap = timelineMap[i]; + timeline.setFrame(frameIndex++, valueMap.time, valueMap.name); + } + timelines.push(timeline); + duration = Math.max(duration, timeline.frames[timeline.getFrameCount() - 1]); + } + else if (timelineName == "color") { + var timeline = new core.ColorTimeline(timelineMap.length); + timeline.slotIndex = slotIndex; + var frameIndex = 0; + for (var i = 0; i < timelineMap.length; i++) { + var valueMap = timelineMap[i]; + var color = new core.Color(); + color.setFromString(valueMap.color); + timeline.setFrame(frameIndex, valueMap.time, color.r, color.g, color.b, color.a); + this.readCurve(valueMap, timeline, frameIndex); + frameIndex++; + } + timelines.push(timeline); + duration = Math.max(duration, timeline.frames[(timeline.getFrameCount() - 1) * core.ColorTimeline.ENTRIES]); + } + else if (timelineName == "twoColor") { + var timeline = new core.TwoColorTimeline(timelineMap.length); + timeline.slotIndex = slotIndex; + var frameIndex = 0; + for (var i = 0; i < timelineMap.length; i++) { + var valueMap = timelineMap[i]; + var light = new core.Color(); + var dark = new core.Color(); + light.setFromString(valueMap.light); + dark.setFromString(valueMap.dark); + timeline.setFrame(frameIndex, valueMap.time, light.r, light.g, light.b, light.a, dark.r, dark.g, dark.b); + this.readCurve(valueMap, timeline, frameIndex); + frameIndex++; + } + timelines.push(timeline); + duration = Math.max(duration, timeline.frames[(timeline.getFrameCount() - 1) * core.TwoColorTimeline.ENTRIES]); + } + else + throw new Error("Invalid timeline type for a slot: " + timelineName + " (" + slotName + ")"); + } + } + } + if (map.bones) { + for (var boneName in map.bones) { + var boneMap = map.bones[boneName]; + var boneIndex = skeletonData.findBoneIndex(boneName); + if (boneIndex == -1) + throw new Error("Bone not found: " + boneName); + for (var timelineName in boneMap) { + var timelineMap = boneMap[timelineName]; + if (timelineName === "rotate") { + var timeline = new core.RotateTimeline(timelineMap.length); + timeline.boneIndex = boneIndex; + var frameIndex = 0; + for (var i = 0; i < timelineMap.length; i++) { + var valueMap = timelineMap[i]; + timeline.setFrame(frameIndex, valueMap.time, valueMap.angle); + this.readCurve(valueMap, timeline, frameIndex); + frameIndex++; + } + timelines.push(timeline); + duration = Math.max(duration, timeline.frames[(timeline.getFrameCount() - 1) * core.RotateTimeline.ENTRIES]); + } + else if (timelineName === "translate" || timelineName === "scale" || timelineName === "shear") { + var timeline = null; + var timelineScale = 1; + if (timelineName === "scale") + timeline = new core.ScaleTimeline(timelineMap.length); + else if (timelineName === "shear") + timeline = new core.ShearTimeline(timelineMap.length); + else { + timeline = new core.TranslateTimeline(timelineMap.length); + timelineScale = scale; + } + timeline.boneIndex = boneIndex; + var frameIndex = 0; + for (var i = 0; i < timelineMap.length; i++) { + var valueMap = timelineMap[i]; + var x = this.getValue(valueMap, "x", 0), y = this.getValue(valueMap, "y", 0); + timeline.setFrame(frameIndex, valueMap.time, x * timelineScale, y * timelineScale); + this.readCurve(valueMap, timeline, frameIndex); + frameIndex++; + } + timelines.push(timeline); + duration = Math.max(duration, timeline.frames[(timeline.getFrameCount() - 1) * core.TranslateTimeline.ENTRIES]); + } + else + throw new Error("Invalid timeline type for a bone: " + timelineName + " (" + boneName + ")"); + } + } + } + if (map.ik) { + for (var constraintName in map.ik) { + var constraintMap = map.ik[constraintName]; + var constraint = skeletonData.findIkConstraint(constraintName); + var timeline = new core.IkConstraintTimeline(constraintMap.length); + timeline.ikConstraintIndex = skeletonData.ikConstraints.indexOf(constraint); + var frameIndex = 0; + for (var i = 0; i < constraintMap.length; i++) { + var valueMap = constraintMap[i]; + timeline.setFrame(frameIndex, valueMap.time, this.getValue(valueMap, "mix", 1), this.getValue(valueMap, "bendPositive", true) ? 1 : -1); + this.readCurve(valueMap, timeline, frameIndex); + frameIndex++; + } + timelines.push(timeline); + duration = Math.max(duration, timeline.frames[(timeline.getFrameCount() - 1) * core.IkConstraintTimeline.ENTRIES]); + } + } + if (map.transform) { + for (var constraintName in map.transform) { + var constraintMap = map.transform[constraintName]; + var constraint = skeletonData.findTransformConstraint(constraintName); + var timeline = new core.TransformConstraintTimeline(constraintMap.length); + timeline.transformConstraintIndex = skeletonData.transformConstraints.indexOf(constraint); + var frameIndex = 0; + for (var i = 0; i < constraintMap.length; i++) { + var valueMap = constraintMap[i]; + timeline.setFrame(frameIndex, valueMap.time, this.getValue(valueMap, "rotateMix", 1), this.getValue(valueMap, "translateMix", 1), this.getValue(valueMap, "scaleMix", 1), this.getValue(valueMap, "shearMix", 1)); + this.readCurve(valueMap, timeline, frameIndex); + frameIndex++; + } + timelines.push(timeline); + duration = Math.max(duration, timeline.frames[(timeline.getFrameCount() - 1) * core.TransformConstraintTimeline.ENTRIES]); + } + } + if (map.paths) { + for (var constraintName in map.paths) { + var constraintMap = map.paths[constraintName]; + var index = skeletonData.findPathConstraintIndex(constraintName); + if (index == -1) + throw new Error("Path constraint not found: " + constraintName); + var data = skeletonData.pathConstraints[index]; + for (var timelineName in constraintMap) { + var timelineMap = constraintMap[timelineName]; + if (timelineName === "position" || timelineName === "spacing") { + var timeline = null; + var timelineScale = 1; + if (timelineName === "spacing") { + timeline = new core.PathConstraintSpacingTimeline(timelineMap.length); + if (data.spacingMode == core.SpacingMode.Length || data.spacingMode == core.SpacingMode.Fixed) + timelineScale = scale; + } + else { + timeline = new core.PathConstraintPositionTimeline(timelineMap.length); + if (data.positionMode == core.PositionMode.Fixed) + timelineScale = scale; + } + timeline.pathConstraintIndex = index; + var frameIndex = 0; + for (var i = 0; i < timelineMap.length; i++) { + var valueMap = timelineMap[i]; + timeline.setFrame(frameIndex, valueMap.time, this.getValue(valueMap, timelineName, 0) * timelineScale); + this.readCurve(valueMap, timeline, frameIndex); + frameIndex++; + } + timelines.push(timeline); + duration = Math.max(duration, timeline.frames[(timeline.getFrameCount() - 1) * core.PathConstraintPositionTimeline.ENTRIES]); + } + else if (timelineName === "mix") { + var timeline = new core.PathConstraintMixTimeline(timelineMap.length); + timeline.pathConstraintIndex = index; + var frameIndex = 0; + for (var i = 0; i < timelineMap.length; i++) { + var valueMap = timelineMap[i]; + timeline.setFrame(frameIndex, valueMap.time, this.getValue(valueMap, "rotateMix", 1), this.getValue(valueMap, "translateMix", 1)); + this.readCurve(valueMap, timeline, frameIndex); + frameIndex++; + } + timelines.push(timeline); + duration = Math.max(duration, timeline.frames[(timeline.getFrameCount() - 1) * core.PathConstraintMixTimeline.ENTRIES]); + } + } + } + } + if (map.deform) { + for (var deformName in map.deform) { + var deformMap = map.deform[deformName]; + var skin = skeletonData.findSkin(deformName); + if (skin == null) + throw new Error("Skin not found: " + deformName); + for (var slotName in deformMap) { + var slotMap = deformMap[slotName]; + var slotIndex = skeletonData.findSlotIndex(slotName); + if (slotIndex == -1) + throw new Error("Slot not found: " + slotMap.name); + for (var timelineName in slotMap) { + var timelineMap = slotMap[timelineName]; + var attachment = skin.getAttachment(slotIndex, timelineName); + if (attachment == null) + throw new Error("Deform attachment not found: " + timelineMap.name); + var weighted = attachment.bones != null; + var vertices = attachment.vertices; + var deformLength = weighted ? vertices.length / 3 * 2 : vertices.length; + var timeline = new core.DeformTimeline(timelineMap.length); + timeline.slotIndex = slotIndex; + timeline.attachment = attachment; + var frameIndex = 0; + for (var j = 0; j < timelineMap.length; j++) { + var valueMap = timelineMap[j]; + var deform = void 0; + var verticesValue = this.getValue(valueMap, "vertices", null); + if (verticesValue == null) + deform = weighted ? core.Utils.newFloatArray(deformLength) : vertices; + else { + deform = core.Utils.newFloatArray(deformLength); + var start = this.getValue(valueMap, "offset", 0); + core.Utils.arrayCopy(verticesValue, 0, deform, start, verticesValue.length); + if (scale != 1) { + for (var i = start, n = i + verticesValue.length; i < n; i++) + deform[i] *= scale; + } + if (!weighted) { + for (var i = 0; i < deformLength; i++) + deform[i] += vertices[i]; + } + } + timeline.setFrame(frameIndex, valueMap.time, deform); + this.readCurve(valueMap, timeline, frameIndex); + frameIndex++; + } + timelines.push(timeline); + duration = Math.max(duration, timeline.frames[timeline.getFrameCount() - 1]); + } + } + } + } + var drawOrderNode = map.drawOrder; + if (drawOrderNode == null) + drawOrderNode = map.draworder; + if (drawOrderNode != null) { + var timeline = new core.DrawOrderTimeline(drawOrderNode.length); + var slotCount = skeletonData.slots.length; + var frameIndex = 0; + for (var j = 0; j < drawOrderNode.length; j++) { + var drawOrderMap = drawOrderNode[j]; + var drawOrder = null; + var offsets = this.getValue(drawOrderMap, "offsets", null); + if (offsets != null) { + drawOrder = core.Utils.newArray(slotCount, -1); + var unchanged = core.Utils.newArray(slotCount - offsets.length, 0); + var originalIndex = 0, unchangedIndex = 0; + for (var i = 0; i < offsets.length; i++) { + var offsetMap = offsets[i]; + var slotIndex = skeletonData.findSlotIndex(offsetMap.slot); + if (slotIndex == -1) + throw new Error("Slot not found: " + offsetMap.slot); + while (originalIndex != slotIndex) + unchanged[unchangedIndex++] = originalIndex++; + drawOrder[originalIndex + offsetMap.offset] = originalIndex++; + } + while (originalIndex < slotCount) + unchanged[unchangedIndex++] = originalIndex++; + for (var i = slotCount - 1; i >= 0; i--) + if (drawOrder[i] == -1) + drawOrder[i] = unchanged[--unchangedIndex]; + } + timeline.setFrame(frameIndex++, drawOrderMap.time, drawOrder); + } + timelines.push(timeline); + duration = Math.max(duration, timeline.frames[timeline.getFrameCount() - 1]); + } + if (map.events) { + var timeline = new core.EventTimeline(map.events.length); + var frameIndex = 0; + for (var i = 0; i < map.events.length; i++) { + var eventMap = map.events[i]; + var eventData = skeletonData.findEvent(eventMap.name); + if (eventData == null) + throw new Error("Event not found: " + eventMap.name); + var event_5 = new core.Event(core.Utils.toSinglePrecision(eventMap.time), eventData); + event_5.intValue = this.getValue(eventMap, "int", eventData.intValue); + event_5.floatValue = this.getValue(eventMap, "float", eventData.floatValue); + event_5.stringValue = this.getValue(eventMap, "string", eventData.stringValue); + timeline.setFrame(frameIndex++, event_5); + } + timelines.push(timeline); + duration = Math.max(duration, timeline.frames[timeline.getFrameCount() - 1]); + } + if (isNaN(duration)) { + throw new Error("Error while parsing animation, duration is NaN"); + } + skeletonData.animations.push(new core.Animation(name, timelines, duration)); + }; + SkeletonJson.prototype.readCurve = function (map, timeline, frameIndex) { + if (!map.curve) + return; + if (map.curve === "stepped") + timeline.setStepped(frameIndex); + else if (Object.prototype.toString.call(map.curve) === '[object Array]') { + var curve = map.curve; + timeline.setCurve(frameIndex, curve[0], curve[1], curve[2], curve[3]); + } + }; + SkeletonJson.prototype.getValue = function (map, prop, defaultValue) { + return map[prop] !== undefined ? map[prop] : defaultValue; + }; + SkeletonJson.blendModeFromString = function (str) { + str = str.toLowerCase(); + if (str == "normal") + return core.BlendMode.Normal; + if (str == "additive") + return core.BlendMode.Additive; + if (str == "multiply") + return core.BlendMode.Multiply; + if (str == "screen") + return core.BlendMode.Screen; + throw new Error("Unknown blend mode: " + str); + }; + SkeletonJson.positionModeFromString = function (str) { + str = str.toLowerCase(); + if (str == "fixed") + return core.PositionMode.Fixed; + if (str == "percent") + return core.PositionMode.Percent; + throw new Error("Unknown position mode: " + str); + }; + SkeletonJson.spacingModeFromString = function (str) { + str = str.toLowerCase(); + if (str == "length") + return core.SpacingMode.Length; + if (str == "fixed") + return core.SpacingMode.Fixed; + if (str == "percent") + return core.SpacingMode.Percent; + throw new Error("Unknown position mode: " + str); + }; + SkeletonJson.rotateModeFromString = function (str) { + str = str.toLowerCase(); + if (str == "tangent") + return core.RotateMode.Tangent; + if (str == "chain") + return core.RotateMode.Chain; + if (str == "chainscale") + return core.RotateMode.ChainScale; + throw new Error("Unknown rotate mode: " + str); + }; + SkeletonJson.transformModeFromString = function (str) { + str = str.toLowerCase(); + if (str == "normal") + return core.TransformMode.Normal; + if (str == "onlytranslation") + return core.TransformMode.OnlyTranslation; + if (str == "norotationorreflection") + return core.TransformMode.NoRotationOrReflection; + if (str == "noscale") + return core.TransformMode.NoScale; + if (str == "noscaleorreflection") + return core.TransformMode.NoScaleOrReflection; + throw new Error("Unknown transform mode: " + str); + }; + return SkeletonJson; + }()); + core.SkeletonJson = SkeletonJson; + var LinkedMesh = (function () { + function LinkedMesh(mesh, skin, slotIndex, parent) { + this.mesh = mesh; + this.skin = skin; + this.slotIndex = slotIndex; + this.parent = parent; + } + return LinkedMesh; + }()); + })(core = pixi_spine.core || (pixi_spine.core = {})); +})(pixi_spine || (pixi_spine = {})); +var pixi_spine; +(function (pixi_spine) { + var core; + (function (core) { + var Skin = (function () { + function Skin(name) { + this.attachments = new Array(); + if (name == null) + throw new Error("name cannot be null."); + this.name = name; + } + Skin.prototype.addAttachment = function (slotIndex, name, attachment) { + if (attachment == null) + throw new Error("attachment cannot be null."); + var attachments = this.attachments; + if (slotIndex >= attachments.length) + attachments.length = slotIndex + 1; + if (!attachments[slotIndex]) + attachments[slotIndex] = {}; + attachments[slotIndex][name] = attachment; + }; + Skin.prototype.getAttachment = function (slotIndex, name) { + var dictionary = this.attachments[slotIndex]; + return dictionary ? dictionary[name] : null; + }; + Skin.prototype.attachAll = function (skeleton, oldSkin) { + var slotIndex = 0; + for (var i = 0; i < skeleton.slots.length; i++) { + var slot = skeleton.slots[i]; + var slotAttachment = slot.getAttachment(); + if (slotAttachment && slotIndex < oldSkin.attachments.length) { + var dictionary = oldSkin.attachments[slotIndex]; + for (var key in dictionary) { + var skinAttachment = dictionary[key]; + if (slotAttachment == skinAttachment) { + var attachment = this.getAttachment(slotIndex, name); + if (attachment != null) + slot.setAttachment(attachment); + break; + } + } + } + slotIndex++; + } + }; + return Skin; + }()); + core.Skin = Skin; + })(core = pixi_spine.core || (pixi_spine.core = {})); +})(pixi_spine || (pixi_spine = {})); +var pixi_spine; +(function (pixi_spine) { + var core; + (function (core) { + var Slot = (function () { + function Slot(data, bone) { + this.attachmentVertices = new Array(); + if (data == null) + throw new Error("data cannot be null."); + if (bone == null) + throw new Error("bone cannot be null."); + this.data = data; + this.bone = bone; + this.color = new core.Color(); + this.darkColor = data.darkColor == null ? null : new core.Color(); + this.setToSetupPose(); + this.blendMode = this.data.blendMode; + } + Slot.prototype.getAttachment = function () { + return this.attachment; + }; + Slot.prototype.setAttachment = function (attachment) { + if (this.attachment == attachment) + return; + this.attachment = attachment; + this.attachmentTime = this.bone.skeleton.time; + this.attachmentVertices.length = 0; + }; + Slot.prototype.setAttachmentTime = function (time) { + this.attachmentTime = this.bone.skeleton.time - time; + }; + Slot.prototype.getAttachmentTime = function () { + return this.bone.skeleton.time - this.attachmentTime; + }; + Slot.prototype.setToSetupPose = function () { + this.color.setFromColor(this.data.color); + if (this.darkColor != null) + this.darkColor.setFromColor(this.data.darkColor); + if (this.data.attachmentName == null) + this.attachment = null; + else { + this.attachment = null; + this.setAttachment(this.bone.skeleton.getAttachment(this.data.index, this.data.attachmentName)); + } + }; + return Slot; + }()); + core.Slot = Slot; + })(core = pixi_spine.core || (pixi_spine.core = {})); +})(pixi_spine || (pixi_spine = {})); +var pixi_spine; +(function (pixi_spine) { + var core; + (function (core) { + var SlotData = (function () { + function SlotData(index, name, boneData) { + this.color = new core.Color(1, 1, 1, 1); + if (index < 0) + throw new Error("index must be >= 0."); + if (name == null) + throw new Error("name cannot be null."); + if (boneData == null) + throw new Error("boneData cannot be null."); + this.index = index; + this.name = name; + this.boneData = boneData; + } + return SlotData; + }()); + core.SlotData = SlotData; + })(core = pixi_spine.core || (pixi_spine.core = {})); +})(pixi_spine || (pixi_spine = {})); +var pixi_spine; +(function (pixi_spine) { + var core; + (function (core) { + var Texture = (function () { + function Texture(image) { + this._image = image; + } + Texture.prototype.getImage = function () { + return this._image; + }; + Texture.filterFromString = function (text) { + switch (text.toLowerCase()) { + case "nearest": return TextureFilter.Nearest; + case "linear": return TextureFilter.Linear; + case "mipmap": return TextureFilter.MipMap; + case "mipmapnearestnearest": return TextureFilter.MipMapNearestNearest; + case "mipmaplinearnearest": return TextureFilter.MipMapLinearNearest; + case "mipmapnearestlinear": return TextureFilter.MipMapNearestLinear; + case "mipmaplinearlinear": return TextureFilter.MipMapLinearLinear; + default: throw new Error("Unknown texture filter " + text); + } + }; + Texture.wrapFromString = function (text) { + switch (text.toLowerCase()) { + case "mirroredtepeat": return TextureWrap.MirroredRepeat; + case "clamptoedge": return TextureWrap.ClampToEdge; + case "repeat": return TextureWrap.Repeat; + default: throw new Error("Unknown texture wrap " + text); + } + }; + return Texture; + }()); + core.Texture = Texture; + var TextureFilter; + (function (TextureFilter) { + TextureFilter[TextureFilter["Nearest"] = 9728] = "Nearest"; + TextureFilter[TextureFilter["Linear"] = 9729] = "Linear"; + TextureFilter[TextureFilter["MipMap"] = 9987] = "MipMap"; + TextureFilter[TextureFilter["MipMapNearestNearest"] = 9984] = "MipMapNearestNearest"; + TextureFilter[TextureFilter["MipMapLinearNearest"] = 9985] = "MipMapLinearNearest"; + TextureFilter[TextureFilter["MipMapNearestLinear"] = 9986] = "MipMapNearestLinear"; + TextureFilter[TextureFilter["MipMapLinearLinear"] = 9987] = "MipMapLinearLinear"; + })(TextureFilter = core.TextureFilter || (core.TextureFilter = {})); + var TextureWrap; + (function (TextureWrap) { + TextureWrap[TextureWrap["MirroredRepeat"] = 33648] = "MirroredRepeat"; + TextureWrap[TextureWrap["ClampToEdge"] = 33071] = "ClampToEdge"; + TextureWrap[TextureWrap["Repeat"] = 10497] = "Repeat"; + })(TextureWrap = core.TextureWrap || (core.TextureWrap = {})); + var TextureRegion = (function () { + function TextureRegion() { + this.size = null; + } + Object.defineProperty(TextureRegion.prototype, "width", { + get: function () { + var tex = this.texture; + if (PIXI.VERSION[0] == '3') { + return tex.crop.width; + } + if (tex.trim) { + return tex.trim.width; + } + return tex.orig.width; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(TextureRegion.prototype, "height", { + get: function () { + var tex = this.texture; + if (PIXI.VERSION[0] == '3') { + return tex.crop.height; + } + if (tex.trim) { + return tex.trim.height; + } + return tex.orig.height; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(TextureRegion.prototype, "u", { + get: function () { + return this.texture._uvs.x0; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(TextureRegion.prototype, "v", { + get: function () { + return this.texture._uvs.y0; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(TextureRegion.prototype, "u2", { + get: function () { + return this.texture._uvs.x2; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(TextureRegion.prototype, "v2", { + get: function () { + return this.texture._uvs.y2; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(TextureRegion.prototype, "offsetX", { + get: function () { + var tex = this.texture; + return tex.trim ? tex.trim.x : 0; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(TextureRegion.prototype, "offsetY", { + get: function () { + console.warn("Deprecation Warning: @Hackerham: I guess, if you are using PIXI-SPINE ATLAS region.offsetY, you want a texture, right? Use region.texture from now on."); + return this.spineOffsetY; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(TextureRegion.prototype, "pixiOffsetY", { + get: function () { + var tex = this.texture; + return tex.trim ? tex.trim.y : 0; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(TextureRegion.prototype, "spineOffsetY", { + get: function () { + var tex = this.texture; + return this.originalHeight - this.height - (tex.trim ? tex.trim.y : 0); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(TextureRegion.prototype, "originalWidth", { + get: function () { + var tex = this.texture; + if (PIXI.VERSION[0] == '3') { + if (tex.trim) { + return tex.trim.width; + } + return tex.crop.width; + } + return tex.orig.width; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(TextureRegion.prototype, "originalHeight", { + get: function () { + var tex = this.texture; + if (PIXI.VERSION[0] == '3') { + if (tex.trim) { + return tex.trim.height; + } + return tex.crop.height; + } + return tex.orig.height; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(TextureRegion.prototype, "x", { + get: function () { + return this.texture.frame.x; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(TextureRegion.prototype, "y", { + get: function () { + return this.texture.frame.y; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(TextureRegion.prototype, "rotate", { + get: function () { + return this.texture.rotate !== 0; + }, + enumerable: true, + configurable: true + }); + return TextureRegion; + }()); + core.TextureRegion = TextureRegion; + })(core = pixi_spine.core || (pixi_spine.core = {})); +})(pixi_spine || (pixi_spine = {})); +var pixi_spine; +(function (pixi_spine) { + var core; + (function (core) { + var TextureAtlas = (function () { + function TextureAtlas(atlasText, textureLoader, callback) { + this.pages = new Array(); + this.regions = new Array(); + if (atlasText) { + this.addSpineAtlas(atlasText, textureLoader, callback); + } + } + TextureAtlas.prototype.addTexture = function (name, texture) { + var pages = this.pages; + var page = null; + for (var i = 0; i < pages.length; i++) { + if (pages[i].baseTexture === texture.baseTexture) { + page = pages[i]; + break; + } + } + if (page === null) { + page = new TextureAtlasPage(); + page.name = 'texturePage'; + var baseTexture = texture.baseTexture; + page.width = baseTexture.realWidth; + page.height = baseTexture.realHeight; + page.baseTexture = baseTexture; + page.minFilter = page.magFilter = core.TextureFilter.Nearest; + page.uWrap = core.TextureWrap.ClampToEdge; + page.vWrap = core.TextureWrap.ClampToEdge; + pages.push(page); + } + var region = new TextureAtlasRegion(); + region.name = name; + region.page = page; + region.texture = texture; + region.index = -1; + this.regions.push(region); + return region; + }; + TextureAtlas.prototype.addTextureHash = function (textures, stripExtension) { + for (var key in textures) { + if (textures.hasOwnProperty(key)) { + this.addTexture(stripExtension && key.indexOf('.') !== -1 ? key.substr(0, key.lastIndexOf('.')) : key, textures[key]); + } + } + }; + TextureAtlas.prototype.addSpineAtlas = function (atlasText, textureLoader, callback) { + return this.load(atlasText, textureLoader, callback); + }; + TextureAtlas.prototype.load = function (atlasText, textureLoader, callback) { + var _this = this; + if (textureLoader == null) + throw new Error("textureLoader cannot be null."); + var reader = new TextureAtlasReader(atlasText); + var tuple = new Array(4); + var page = null; + var iterateParser = function () { + while (true) { + var line = reader.readLine(); + if (line == null) { + return callback && callback(_this); + } + line = line.trim(); + if (line.length == 0) + page = null; + else if (!page) { + page = new TextureAtlasPage(); + page.name = line; + if (reader.readTuple(tuple) == 2) { + page.width = parseInt(tuple[0]); + page.height = parseInt(tuple[1]); + reader.readTuple(tuple); + } + reader.readTuple(tuple); + page.minFilter = core.Texture.filterFromString(tuple[0]); + page.magFilter = core.Texture.filterFromString(tuple[1]); + var direction = reader.readValue(); + page.uWrap = core.TextureWrap.ClampToEdge; + page.vWrap = core.TextureWrap.ClampToEdge; + if (direction == "x") + page.uWrap = core.TextureWrap.Repeat; + else if (direction == "y") + page.vWrap = core.TextureWrap.Repeat; + else if (direction == "xy") + page.uWrap = page.vWrap = core.TextureWrap.Repeat; + textureLoader(line, function (texture) { + page.baseTexture = texture; + if (!texture.hasLoaded) { + texture.width = page.width; + texture.height = page.height; + } + _this.pages.push(page); + page.setFilters(); + if (!page.width || !page.height) { + page.width = texture.realWidth; + page.height = texture.realHeight; + if (!page.width || !page.height) { + console.log("ERROR spine atlas page " + page.name + ": meshes wont work if you dont specify size in atlas (http://www.html5gamedevs.com/topic/18888-pixi-spines-and-meshes/?p=107121)"); + } + } + iterateParser(); + }); + _this.pages.push(page); + break; + } + else { + var region = new TextureAtlasRegion(); + region.name = line; + region.page = page; + var rotate = reader.readValue() == "true" ? 6 : 0; + reader.readTuple(tuple); + var x = parseInt(tuple[0]); + var y = parseInt(tuple[1]); + reader.readTuple(tuple); + var width = parseInt(tuple[0]); + var height = parseInt(tuple[1]); + var resolution = page.baseTexture.resolution; + x /= resolution; + y /= resolution; + width /= resolution; + height /= resolution; + var frame = new PIXI.Rectangle(x, y, rotate ? height : width, rotate ? width : height); + if (reader.readTuple(tuple) == 4) { + if (reader.readTuple(tuple) == 4) { + reader.readTuple(tuple); + } + } + var originalWidth = parseInt(tuple[0]) / resolution; + var originalHeight = parseInt(tuple[1]) / resolution; + reader.readTuple(tuple); + var offsetX = parseInt(tuple[0]) / resolution; + var offsetY = parseInt(tuple[1]) / resolution; + var orig = new PIXI.Rectangle(0, 0, originalWidth, originalHeight); + var trim = new PIXI.Rectangle(offsetX, originalHeight - height - offsetY, width, height); + if (PIXI.VERSION[0] != '3') { + region.texture = new PIXI.Texture(region.page.baseTexture, frame, orig, trim, rotate); + } + else { + var frame2 = new PIXI.Rectangle(x, y, width, height); + var crop = frame2.clone(); + trim.width = originalWidth; + trim.height = originalHeight; + region.texture = new PIXI.Texture(region.page.baseTexture, frame2, crop, trim, rotate); + } + region.index = parseInt(reader.readValue()); + region.texture._updateUvs(); + _this.regions.push(region); + } + } + }; + iterateParser(); + }; + TextureAtlas.prototype.findRegion = function (name) { + for (var i = 0; i < this.regions.length; i++) { + if (this.regions[i].name == name) { + return this.regions[i]; + } + } + return null; + }; + TextureAtlas.prototype.dispose = function () { + for (var i = 0; i < this.pages.length; i++) { + this.pages[i].baseTexture.dispose(); + } + }; + return TextureAtlas; + }()); + core.TextureAtlas = TextureAtlas; + var TextureAtlasReader = (function () { + function TextureAtlasReader(text) { + this.index = 0; + this.lines = text.split(/\r\n|\r|\n/); + } + TextureAtlasReader.prototype.readLine = function () { + if (this.index >= this.lines.length) + return null; + return this.lines[this.index++]; + }; + TextureAtlasReader.prototype.readValue = function () { + var line = this.readLine(); + var colon = line.indexOf(":"); + if (colon == -1) + throw new Error("Invalid line: " + line); + return line.substring(colon + 1).trim(); + }; + TextureAtlasReader.prototype.readTuple = function (tuple) { + var line = this.readLine(); + var colon = line.indexOf(":"); + if (colon == -1) + throw new Error("Invalid line: " + line); + var i = 0, lastMatch = colon + 1; + for (; i < 3; i++) { + var comma = line.indexOf(",", lastMatch); + if (comma == -1) + break; + tuple[i] = line.substr(lastMatch, comma - lastMatch).trim(); + lastMatch = comma + 1; + } + tuple[i] = line.substring(lastMatch).trim(); + return i + 1; + }; + return TextureAtlasReader; + }()); + var TextureAtlasPage = (function () { + function TextureAtlasPage() { + } + TextureAtlasPage.prototype.setFilters = function () { + var tex = this.baseTexture; + var filter = this.minFilter; + if (filter == core.TextureFilter.Linear) { + tex.scaleMode = PIXI.SCALE_MODES.LINEAR; + } + else if (this.minFilter == core.TextureFilter.Nearest) { + tex.scaleMode = PIXI.SCALE_MODES.NEAREST; + } + else { + tex.mipmap = true; + if (filter == core.TextureFilter.MipMapNearestNearest) { + tex.scaleMode = PIXI.SCALE_MODES.NEAREST; + } + else { + tex.scaleMode = PIXI.SCALE_MODES.LINEAR; + } + } + }; + return TextureAtlasPage; + }()); + core.TextureAtlasPage = TextureAtlasPage; + var TextureAtlasRegion = (function (_super) { + __extends(TextureAtlasRegion, _super); + function TextureAtlasRegion() { + return _super !== null && _super.apply(this, arguments) || this; + } + return TextureAtlasRegion; + }(core.TextureRegion)); + core.TextureAtlasRegion = TextureAtlasRegion; + })(core = pixi_spine.core || (pixi_spine.core = {})); +})(pixi_spine || (pixi_spine = {})); +var pixi_spine; +(function (pixi_spine) { + var core; + (function (core) { + var TransformConstraint = (function () { + function TransformConstraint(data, skeleton) { + this.rotateMix = 0; + this.translateMix = 0; + this.scaleMix = 0; + this.shearMix = 0; + this.temp = new core.Vector2(); + if (data == null) + throw new Error("data cannot be null."); + if (skeleton == null) + throw new Error("skeleton cannot be null."); + this.data = data; + this.rotateMix = data.rotateMix; + this.translateMix = data.translateMix; + this.scaleMix = data.scaleMix; + this.shearMix = data.shearMix; + this.bones = new Array(); + for (var i = 0; i < data.bones.length; i++) + this.bones.push(skeleton.findBone(data.bones[i].name)); + this.target = skeleton.findBone(data.target.name); + } + TransformConstraint.prototype.apply = function () { + this.update(); + }; + TransformConstraint.prototype.update = function () { + if (this.data.local) { + if (this.data.relative) + this.applyRelativeLocal(); + else + this.applyAbsoluteLocal(); + } + else { + if (this.data.relative) + this.applyRelativeWorld(); + else + this.applyAbsoluteWorld(); + } + }; + TransformConstraint.prototype.applyAbsoluteWorld = function () { + var rotateMix = this.rotateMix, translateMix = this.translateMix, scaleMix = this.scaleMix, shearMix = this.shearMix; + var target = this.target; + var targetMat = target.matrix; + var ta = targetMat.a, tb = targetMat.c, tc = targetMat.b, td = targetMat.d; + var degRadReflect = ta * td - tb * tc > 0 ? core.MathUtils.degRad : -core.MathUtils.degRad; + var offsetRotation = this.data.offsetRotation * degRadReflect; + var offsetShearY = this.data.offsetShearY * degRadReflect; + var bones = this.bones; + for (var i = 0, n = bones.length; i < n; i++) { + var bone = bones[i]; + var modified = false; + var mat = bone.matrix; + if (rotateMix != 0) { + var a = mat.a, b = mat.c, c = mat.b, d = mat.d; + var r = Math.atan2(tc, ta) - Math.atan2(c, a) + offsetRotation; + if (r > core.MathUtils.PI) + r -= core.MathUtils.PI2; + else if (r < -core.MathUtils.PI) + r += core.MathUtils.PI2; + r *= rotateMix; + var cos = Math.cos(r), sin = Math.sin(r); + mat.a = cos * a - sin * c; + mat.c = cos * b - sin * d; + mat.b = sin * a + cos * c; + mat.d = sin * b + cos * d; + modified = true; + } + if (translateMix != 0) { + var temp = this.temp; + target.localToWorld(temp.set(this.data.offsetX, this.data.offsetY)); + mat.tx += (temp.x - mat.tx) * translateMix; + mat.ty += (temp.y - mat.ty) * translateMix; + modified = true; + } + if (scaleMix > 0) { + var s = Math.sqrt(mat.a * mat.a + mat.b * mat.b); + var ts = Math.sqrt(ta * ta + tc * tc); + if (s > 0.00001) + s = (s + (ts - s + this.data.offsetScaleX) * scaleMix) / s; + mat.a *= s; + mat.b *= s; + s = Math.sqrt(mat.c * mat.c + mat.d * mat.d); + ts = Math.sqrt(tb * tb + td * td); + if (s > 0.00001) + s = (s + (ts - s + this.data.offsetScaleY) * scaleMix) / s; + mat.c *= s; + mat.d *= s; + modified = true; + } + if (shearMix > 0) { + var b = mat.c, d = mat.d; + var by = Math.atan2(d, b); + var r = Math.atan2(td, tb) - Math.atan2(tc, ta) - (by - Math.atan2(mat.b, mat.a)); + if (r > core.MathUtils.PI) + r -= core.MathUtils.PI2; + else if (r < -core.MathUtils.PI) + r += core.MathUtils.PI2; + r = by + (r + offsetShearY) * shearMix; + var s = Math.sqrt(b * b + d * d); + mat.c = Math.cos(r) * s; + mat.d = Math.sin(r) * s; + modified = true; + } + if (modified) + bone.appliedValid = false; + } + }; + TransformConstraint.prototype.applyRelativeWorld = function () { + var rotateMix = this.rotateMix, translateMix = this.translateMix, scaleMix = this.scaleMix, shearMix = this.shearMix; + var target = this.target; + var targetMat = target.matrix; + var ta = targetMat.a, tb = targetMat.c, tc = targetMat.b, td = targetMat.d; + var degRadReflect = ta * td - tb * tc > 0 ? core.MathUtils.degRad : -core.MathUtils.degRad; + var offsetRotation = this.data.offsetRotation * degRadReflect, offsetShearY = this.data.offsetShearY * degRadReflect; + var bones = this.bones; + for (var i = 0, n = bones.length; i < n; i++) { + var bone = bones[i]; + var modified = false; + var mat = bone.matrix; + if (rotateMix != 0) { + var a = mat.a, b = mat.c, c = mat.b, d = mat.d; + var r = Math.atan2(tc, ta) + offsetRotation; + if (r > core.MathUtils.PI) + r -= core.MathUtils.PI2; + else if (r < -core.MathUtils.PI) + r += core.MathUtils.PI2; + r *= rotateMix; + var cos = Math.cos(r), sin = Math.sin(r); + mat.a = cos * a - sin * c; + mat.c = cos * b - sin * d; + mat.b = sin * a + cos * c; + mat.d = sin * b + cos * d; + modified = true; + } + if (translateMix != 0) { + var temp = this.temp; + target.localToWorld(temp.set(this.data.offsetX, this.data.offsetY)); + mat.tx += temp.x * translateMix; + mat.ty += temp.y * translateMix; + modified = true; + } + if (scaleMix > 0) { + var s = (Math.sqrt(ta * ta + tc * tc) - 1 + this.data.offsetScaleX) * scaleMix + 1; + mat.a *= s; + mat.b *= s; + s = (Math.sqrt(tb * tb + td * td) - 1 + this.data.offsetScaleY) * scaleMix + 1; + mat.c *= s; + mat.d *= s; + modified = true; + } + if (shearMix > 0) { + var r = Math.atan2(td, tb) - Math.atan2(tc, ta); + if (r > core.MathUtils.PI) + r -= core.MathUtils.PI2; + else if (r < -core.MathUtils.PI) + r += core.MathUtils.PI2; + var b = mat.c, d = mat.d; + r = Math.atan2(d, b) + (r - core.MathUtils.PI / 2 + offsetShearY) * shearMix; + var s = Math.sqrt(b * b + d * d); + mat.c = Math.cos(r) * s; + mat.d = Math.sin(r) * s; + modified = true; + } + if (modified) + bone.appliedValid = false; + } + }; + TransformConstraint.prototype.applyAbsoluteLocal = function () { + var rotateMix = this.rotateMix, translateMix = this.translateMix, scaleMix = this.scaleMix, shearMix = this.shearMix; + var target = this.target; + if (!target.appliedValid) + target.updateAppliedTransform(); + var bones = this.bones; + for (var i = 0, n = bones.length; i < n; i++) { + var bone = bones[i]; + if (!bone.appliedValid) + bone.updateAppliedTransform(); + var rotation = bone.arotation; + if (rotateMix != 0) { + var r = target.arotation - rotation + this.data.offsetRotation; + r -= (16384 - ((16384.499999999996 - r / 360) | 0)) * 360; + rotation += r * rotateMix; + } + var x = bone.ax, y = bone.ay; + if (translateMix != 0) { + x += (target.ax - x + this.data.offsetX) * translateMix; + y += (target.ay - y + this.data.offsetY) * translateMix; + } + var scaleX = bone.ascaleX, scaleY = bone.ascaleY; + if (scaleMix > 0) { + if (scaleX > 0.00001) + scaleX = (scaleX + (target.ascaleX - scaleX + this.data.offsetScaleX) * scaleMix) / scaleX; + if (scaleY > 0.00001) + scaleY = (scaleY + (target.ascaleY - scaleY + this.data.offsetScaleY) * scaleMix) / scaleY; + } + var shearY = bone.ashearY; + if (shearMix > 0) { + var r = target.ashearY - shearY + this.data.offsetShearY; + r -= (16384 - ((16384.499999999996 - r / 360) | 0)) * 360; + bone.shearY += r * shearMix; + } + bone.updateWorldTransformWith(x, y, rotation, scaleX, scaleY, bone.ashearX, shearY); + } + }; + TransformConstraint.prototype.applyRelativeLocal = function () { + var rotateMix = this.rotateMix, translateMix = this.translateMix, scaleMix = this.scaleMix, shearMix = this.shearMix; + var target = this.target; + if (!target.appliedValid) + target.updateAppliedTransform(); + var bones = this.bones; + for (var i = 0, n = bones.length; i < n; i++) { + var bone = bones[i]; + if (!bone.appliedValid) + bone.updateAppliedTransform(); + var rotation = bone.arotation; + if (rotateMix != 0) + rotation += (target.arotation + this.data.offsetRotation) * rotateMix; + var x = bone.ax, y = bone.ay; + if (translateMix != 0) { + x += (target.ax + this.data.offsetX) * translateMix; + y += (target.ay + this.data.offsetY) * translateMix; + } + var scaleX = bone.ascaleX, scaleY = bone.ascaleY; + if (scaleMix > 0) { + if (scaleX > 0.00001) + scaleX *= ((target.ascaleX - 1 + this.data.offsetScaleX) * scaleMix) + 1; + if (scaleY > 0.00001) + scaleY *= ((target.ascaleY - 1 + this.data.offsetScaleY) * scaleMix) + 1; + } + var shearY = bone.ashearY; + if (shearMix > 0) + shearY += (target.ashearY + this.data.offsetShearY) * shearMix; + bone.updateWorldTransformWith(x, y, rotation, scaleX, scaleY, bone.ashearX, shearY); + } + }; + TransformConstraint.prototype.getOrder = function () { + return this.data.order; + }; + return TransformConstraint; + }()); + core.TransformConstraint = TransformConstraint; + })(core = pixi_spine.core || (pixi_spine.core = {})); +})(pixi_spine || (pixi_spine = {})); +var pixi_spine; +(function (pixi_spine) { + var core; + (function (core) { + var TransformConstraintData = (function () { + function TransformConstraintData(name) { + this.order = 0; + this.bones = new Array(); + this.rotateMix = 0; + this.translateMix = 0; + this.scaleMix = 0; + this.shearMix = 0; + this.offsetRotation = 0; + this.offsetX = 0; + this.offsetY = 0; + this.offsetScaleX = 0; + this.offsetScaleY = 0; + this.offsetShearY = 0; + this.relative = false; + this.local = false; + if (name == null) + throw new Error("name cannot be null."); + this.name = name; + } + return TransformConstraintData; + }()); + core.TransformConstraintData = TransformConstraintData; + })(core = pixi_spine.core || (pixi_spine.core = {})); +})(pixi_spine || (pixi_spine = {})); +var pixi_spine; +(function (pixi_spine) { + var core; + (function (core) { + var Triangulator = (function () { + function Triangulator() { + this.convexPolygons = new Array(); + this.convexPolygonsIndices = new Array(); + this.indicesArray = new Array(); + this.isConcaveArray = new Array(); + this.triangles = new Array(); + this.polygonPool = new core.Pool(function () { + return new Array(); + }); + this.polygonIndicesPool = new core.Pool(function () { + return new Array(); + }); + } + Triangulator.prototype.triangulate = function (verticesArray) { + var vertices = verticesArray; + var vertexCount = verticesArray.length >> 1; + var indices = this.indicesArray; + indices.length = 0; + for (var i = 0; i < vertexCount; i++) + indices[i] = i; + var isConcave = this.isConcaveArray; + isConcave.length = 0; + for (var i = 0, n = vertexCount; i < n; ++i) + isConcave[i] = Triangulator.isConcave(i, vertexCount, vertices, indices); + var triangles = this.triangles; + triangles.length = 0; + while (vertexCount > 3) { + var previous = vertexCount - 1, i = 0, next = 1; + while (true) { + outer: if (!isConcave[i]) { + var p1 = indices[previous] << 1, p2 = indices[i] << 1, p3 = indices[next] << 1; + var p1x = vertices[p1], p1y = vertices[p1 + 1]; + var p2x = vertices[p2], p2y = vertices[p2 + 1]; + var p3x = vertices[p3], p3y = vertices[p3 + 1]; + for (var ii = (next + 1) % vertexCount; ii != previous; ii = (ii + 1) % vertexCount) { + if (!isConcave[ii]) + continue; + var v = indices[ii] << 1; + var vx = vertices[v], vy = vertices[v + 1]; + if (Triangulator.positiveArea(p3x, p3y, p1x, p1y, vx, vy)) { + if (Triangulator.positiveArea(p1x, p1y, p2x, p2y, vx, vy)) { + if (Triangulator.positiveArea(p2x, p2y, p3x, p3y, vx, vy)) + break outer; + } + } + } + break; + } + if (next == 0) { + do { + if (!isConcave[i]) + break; + i--; + } while (i > 0); + break; + } + previous = i; + i = next; + next = (next + 1) % vertexCount; + } + triangles.push(indices[(vertexCount + i - 1) % vertexCount]); + triangles.push(indices[i]); + triangles.push(indices[(i + 1) % vertexCount]); + indices.splice(i, 1); + isConcave.splice(i, 1); + vertexCount--; + var previousIndex = (vertexCount + i - 1) % vertexCount; + var nextIndex = i == vertexCount ? 0 : i; + isConcave[previousIndex] = Triangulator.isConcave(previousIndex, vertexCount, vertices, indices); + isConcave[nextIndex] = Triangulator.isConcave(nextIndex, vertexCount, vertices, indices); + } + if (vertexCount == 3) { + triangles.push(indices[2]); + triangles.push(indices[0]); + triangles.push(indices[1]); + } + return triangles; + }; + Triangulator.prototype.decompose = function (verticesArray, triangles) { + var vertices = verticesArray; + var convexPolygons = this.convexPolygons; + this.polygonPool.freeAll(convexPolygons); + convexPolygons.length = 0; + var convexPolygonsIndices = this.convexPolygonsIndices; + this.polygonIndicesPool.freeAll(convexPolygonsIndices); + convexPolygonsIndices.length = 0; + var polygonIndices = this.polygonIndicesPool.obtain(); + polygonIndices.length = 0; + var polygon = this.polygonPool.obtain(); + polygon.length = 0; + var fanBaseIndex = -1, lastWinding = 0; + for (var i = 0, n = triangles.length; i < n; i += 3) { + var t1 = triangles[i] << 1, t2 = triangles[i + 1] << 1, t3 = triangles[i + 2] << 1; + var x1 = vertices[t1], y1 = vertices[t1 + 1]; + var x2 = vertices[t2], y2 = vertices[t2 + 1]; + var x3 = vertices[t3], y3 = vertices[t3 + 1]; + var merged = false; + if (fanBaseIndex == t1) { + var o = polygon.length - 4; + var winding1 = Triangulator.winding(polygon[o], polygon[o + 1], polygon[o + 2], polygon[o + 3], x3, y3); + var winding2 = Triangulator.winding(x3, y3, polygon[0], polygon[1], polygon[2], polygon[3]); + if (winding1 == lastWinding && winding2 == lastWinding) { + polygon.push(x3); + polygon.push(y3); + polygonIndices.push(t3); + merged = true; + } + } + if (!merged) { + if (polygon.length > 0) { + convexPolygons.push(polygon); + convexPolygonsIndices.push(polygonIndices); + } + else { + this.polygonPool.free(polygon); + this.polygonIndicesPool.free(polygonIndices); + } + polygon = this.polygonPool.obtain(); + polygon.length = 0; + polygon.push(x1); + polygon.push(y1); + polygon.push(x2); + polygon.push(y2); + polygon.push(x3); + polygon.push(y3); + polygonIndices = this.polygonIndicesPool.obtain(); + polygonIndices.length = 0; + polygonIndices.push(t1); + polygonIndices.push(t2); + polygonIndices.push(t3); + lastWinding = Triangulator.winding(x1, y1, x2, y2, x3, y3); + fanBaseIndex = t1; + } + } + if (polygon.length > 0) { + convexPolygons.push(polygon); + convexPolygonsIndices.push(polygonIndices); + } + for (var i = 0, n = convexPolygons.length; i < n; i++) { + polygonIndices = convexPolygonsIndices[i]; + if (polygonIndices.length == 0) + continue; + var firstIndex = polygonIndices[0]; + var lastIndex = polygonIndices[polygonIndices.length - 1]; + polygon = convexPolygons[i]; + var o = polygon.length - 4; + var prevPrevX = polygon[o], prevPrevY = polygon[o + 1]; + var prevX = polygon[o + 2], prevY = polygon[o + 3]; + var firstX = polygon[0], firstY = polygon[1]; + var secondX = polygon[2], secondY = polygon[3]; + var winding = Triangulator.winding(prevPrevX, prevPrevY, prevX, prevY, firstX, firstY); + for (var ii = 0; ii < n; ii++) { + if (ii == i) + continue; + var otherIndices = convexPolygonsIndices[ii]; + if (otherIndices.length != 3) + continue; + var otherFirstIndex = otherIndices[0]; + var otherSecondIndex = otherIndices[1]; + var otherLastIndex = otherIndices[2]; + var otherPoly = convexPolygons[ii]; + var x3 = otherPoly[otherPoly.length - 2], y3 = otherPoly[otherPoly.length - 1]; + if (otherFirstIndex != firstIndex || otherSecondIndex != lastIndex) + continue; + var winding1 = Triangulator.winding(prevPrevX, prevPrevY, prevX, prevY, x3, y3); + var winding2 = Triangulator.winding(x3, y3, firstX, firstY, secondX, secondY); + if (winding1 == winding && winding2 == winding) { + otherPoly.length = 0; + otherIndices.length = 0; + polygon.push(x3); + polygon.push(y3); + polygonIndices.push(otherLastIndex); + prevPrevX = prevX; + prevPrevY = prevY; + prevX = x3; + prevY = y3; + ii = 0; + } + } + } + for (var i = convexPolygons.length - 1; i >= 0; i--) { + polygon = convexPolygons[i]; + if (polygon.length == 0) { + convexPolygons.splice(i, 1); + this.polygonPool.free(polygon); + polygonIndices = convexPolygonsIndices[i]; + convexPolygonsIndices.splice(i, 1); + this.polygonIndicesPool.free(polygonIndices); + } + } + return convexPolygons; + }; + Triangulator.isConcave = function (index, vertexCount, vertices, indices) { + var previous = indices[(vertexCount + index - 1) % vertexCount] << 1; + var current = indices[index] << 1; + var next = indices[(index + 1) % vertexCount] << 1; + return !this.positiveArea(vertices[previous], vertices[previous + 1], vertices[current], vertices[current + 1], vertices[next], vertices[next + 1]); + }; + Triangulator.positiveArea = function (p1x, p1y, p2x, p2y, p3x, p3y) { + return p1x * (p3y - p2y) + p2x * (p1y - p3y) + p3x * (p2y - p1y) >= 0; + }; + Triangulator.winding = function (p1x, p1y, p2x, p2y, p3x, p3y) { + var px = p2x - p1x, py = p2y - p1y; + return p3x * py - p3y * px + px * p1y - p1x * py >= 0 ? 1 : -1; + }; + return Triangulator; + }()); + core.Triangulator = Triangulator; + })(core = pixi_spine.core || (pixi_spine.core = {})); +})(pixi_spine || (pixi_spine = {})); +var pixi_spine; +(function (pixi_spine) { + var core; + (function (core) { + var IntSet = (function () { + function IntSet() { + this.array = new Array(); + } + IntSet.prototype.add = function (value) { + var contains = this.contains(value); + this.array[value | 0] = value | 0; + return !contains; + }; + IntSet.prototype.contains = function (value) { + return this.array[value | 0] != undefined; + }; + IntSet.prototype.remove = function (value) { + this.array[value | 0] = undefined; + }; + IntSet.prototype.clear = function () { + this.array.length = 0; + }; + return IntSet; + }()); + core.IntSet = IntSet; + var Color = (function () { + function Color(r, g, b, a) { + if (r === void 0) { r = 0; } + if (g === void 0) { g = 0; } + if (b === void 0) { b = 0; } + if (a === void 0) { a = 0; } + this.r = r; + this.g = g; + this.b = b; + this.a = a; + } + Color.prototype.set = function (r, g, b, a) { + this.r = r; + this.g = g; + this.b = b; + this.a = a; + this.clamp(); + return this; + }; + Color.prototype.setFromColor = function (c) { + this.r = c.r; + this.g = c.g; + this.b = c.b; + this.a = c.a; + return this; + }; + Color.prototype.setFromString = function (hex) { + hex = hex.charAt(0) == '#' ? hex.substr(1) : hex; + this.r = parseInt(hex.substr(0, 2), 16) / 255.0; + this.g = parseInt(hex.substr(2, 2), 16) / 255.0; + this.b = parseInt(hex.substr(4, 2), 16) / 255.0; + this.a = (hex.length != 8 ? 255 : parseInt(hex.substr(6, 2), 16)) / 255.0; + return this; + }; + Color.prototype.add = function (r, g, b, a) { + this.r += r; + this.g += g; + this.b += b; + this.a += a; + this.clamp(); + return this; + }; + Color.prototype.clamp = function () { + if (this.r < 0) + this.r = 0; + else if (this.r > 1) + this.r = 1; + if (this.g < 0) + this.g = 0; + else if (this.g > 1) + this.g = 1; + if (this.b < 0) + this.b = 0; + else if (this.b > 1) + this.b = 1; + if (this.a < 0) + this.a = 0; + else if (this.a > 1) + this.a = 1; + return this; + }; + Color.WHITE = new Color(1, 1, 1, 1); + Color.RED = new Color(1, 0, 0, 1); + Color.GREEN = new Color(0, 1, 0, 1); + Color.BLUE = new Color(0, 0, 1, 1); + Color.MAGENTA = new Color(1, 0, 1, 1); + return Color; + }()); + core.Color = Color; + var MathUtils = (function () { + function MathUtils() { + } + MathUtils.clamp = function (value, min, max) { + if (value < min) + return min; + if (value > max) + return max; + return value; + }; + MathUtils.cosDeg = function (degrees) { + return Math.cos(degrees * MathUtils.degRad); + }; + MathUtils.sinDeg = function (degrees) { + return Math.sin(degrees * MathUtils.degRad); + }; + MathUtils.signum = function (value) { + return value > 0 ? 1 : value < 0 ? -1 : 0; + }; + MathUtils.toInt = function (x) { + return x > 0 ? Math.floor(x) : Math.ceil(x); + }; + MathUtils.cbrt = function (x) { + var y = Math.pow(Math.abs(x), 1 / 3); + return x < 0 ? -y : y; + }; + MathUtils.randomTriangular = function (min, max) { + return MathUtils.randomTriangularWith(min, max, (min + max) * 0.5); + }; + MathUtils.randomTriangularWith = function (min, max, mode) { + var u = Math.random(); + var d = max - min; + if (u <= (mode - min) / d) + return min + Math.sqrt(u * d * (mode - min)); + return max - Math.sqrt((1 - u) * d * (max - mode)); + }; + MathUtils.PI = 3.1415927; + MathUtils.PI2 = MathUtils.PI * 2; + MathUtils.radiansToDegrees = 180 / MathUtils.PI; + MathUtils.radDeg = MathUtils.radiansToDegrees; + MathUtils.degreesToRadians = MathUtils.PI / 180; + MathUtils.degRad = MathUtils.degreesToRadians; + return MathUtils; + }()); + core.MathUtils = MathUtils; + var Interpolation = (function () { + function Interpolation() { + } + Interpolation.prototype.apply = function (start, end, a) { + return start + (end - start) * this.applyInternal(a); + }; + return Interpolation; + }()); + core.Interpolation = Interpolation; + var Pow = (function (_super) { + __extends(Pow, _super); + function Pow(power) { + var _this = _super.call(this) || this; + _this.power = 2; + _this.power = power; + return _this; + } + Pow.prototype.applyInternal = function (a) { + if (a <= 0.5) + return Math.pow(a * 2, this.power) / 2; + return Math.pow((a - 1) * 2, this.power) / (this.power % 2 == 0 ? -2 : 2) + 1; + }; + return Pow; + }(Interpolation)); + core.Pow = Pow; + var PowOut = (function (_super) { + __extends(PowOut, _super); + function PowOut(power) { + return _super.call(this, power) || this; + } + PowOut.prototype.applyInternal = function (a) { + return Math.pow(a - 1, this.power) * (this.power % 2 == 0 ? -1 : 1) + 1; + }; + return PowOut; + }(Pow)); + core.PowOut = PowOut; + var Utils = (function () { + function Utils() { + } + Utils.arrayCopy = function (source, sourceStart, dest, destStart, numElements) { + for (var i = sourceStart, j = destStart; i < sourceStart + numElements; i++, j++) { + dest[j] = source[i]; + } + }; + Utils.setArraySize = function (array, size, value) { + if (value === void 0) { value = 0; } + var oldSize = array.length; + if (oldSize == size) + return array; + array.length = size; + if (oldSize < size) { + for (var i = oldSize; i < size; i++) + array[i] = value; + } + return array; + }; + Utils.ensureArrayCapacity = function (array, size, value) { + if (value === void 0) { value = 0; } + if (array.length >= size) + return array; + return Utils.setArraySize(array, size, value); + }; + Utils.newArray = function (size, defaultValue) { + var array = new Array(size); + for (var i = 0; i < size; i++) + array[i] = defaultValue; + return array; + }; + Utils.newFloatArray = function (size) { + if (Utils.SUPPORTS_TYPED_ARRAYS) { + return new Float32Array(size); + } + else { + var array = new Array(size); + for (var i = 0; i < array.length; i++) + array[i] = 0; + return array; + } + }; + Utils.newShortArray = function (size) { + if (Utils.SUPPORTS_TYPED_ARRAYS) { + return new Int16Array(size); + } + else { + var array = new Array(size); + for (var i = 0; i < array.length; i++) + array[i] = 0; + return array; + } + }; + Utils.toFloatArray = function (array) { + return Utils.SUPPORTS_TYPED_ARRAYS ? new Float32Array(array) : array; + }; + Utils.toSinglePrecision = function (value) { + return Utils.SUPPORTS_TYPED_ARRAYS ? Math.fround(value) : value; + }; + Utils.SUPPORTS_TYPED_ARRAYS = typeof (Float32Array) !== "undefined"; + return Utils; + }()); + core.Utils = Utils; + var DebugUtils = (function () { + function DebugUtils() { + } + DebugUtils.logBones = function (skeleton) { + for (var i = 0; i < skeleton.bones.length; i++) { + var bone = skeleton.bones[i]; + var mat = bone.matrix; + console.log(bone.data.name + ", " + mat.a + ", " + mat.b + ", " + mat.c + ", " + mat.d + ", " + mat.tx + ", " + mat.ty); + } + }; + return DebugUtils; + }()); + core.DebugUtils = DebugUtils; + var Pool = (function () { + function Pool(instantiator) { + this.items = new Array(); + this.instantiator = instantiator; + } + Pool.prototype.obtain = function () { + return this.items.length > 0 ? this.items.pop() : this.instantiator(); + }; + Pool.prototype.free = function (item) { + if (item.reset) + item.reset(); + this.items.push(item); + }; + Pool.prototype.freeAll = function (items) { + for (var i = 0; i < items.length; i++) { + if (items[i].reset) + items[i].reset(); + this.items[i] = items[i]; + } + }; + Pool.prototype.clear = function () { + this.items.length = 0; + }; + return Pool; + }()); + core.Pool = Pool; + var Vector2 = (function () { + function Vector2(x, y) { + if (x === void 0) { x = 0; } + if (y === void 0) { y = 0; } + this.x = x; + this.y = y; + } + Vector2.prototype.set = function (x, y) { + this.x = x; + this.y = y; + return this; + }; + Vector2.prototype.length = function () { + var x = this.x; + var y = this.y; + return Math.sqrt(x * x + y * y); + }; + Vector2.prototype.normalize = function () { + var len = this.length(); + if (len != 0) { + this.x /= len; + this.y /= len; + } + return this; + }; + return Vector2; + }()); + core.Vector2 = Vector2; + var TimeKeeper = (function () { + function TimeKeeper() { + this.maxDelta = 0.064; + this.framesPerSecond = 0; + this.delta = 0; + this.totalTime = 0; + this.lastTime = Date.now() / 1000; + this.frameCount = 0; + this.frameTime = 0; + } + TimeKeeper.prototype.update = function () { + var now = Date.now() / 1000; + this.delta = now - this.lastTime; + this.frameTime += this.delta; + this.totalTime += this.delta; + if (this.delta > this.maxDelta) + this.delta = this.maxDelta; + this.lastTime = now; + this.frameCount++; + if (this.frameTime > 1) { + this.framesPerSecond = this.frameCount / this.frameTime; + this.frameTime = 0; + this.frameCount = 0; + } + }; + return TimeKeeper; + }()); + core.TimeKeeper = TimeKeeper; + var WindowedMean = (function () { + function WindowedMean(windowSize) { + if (windowSize === void 0) { windowSize = 32; } + this.addedValues = 0; + this.lastValue = 0; + this.mean = 0; + this.dirty = true; + this.values = new Array(windowSize); + } + WindowedMean.prototype.hasEnoughData = function () { + return this.addedValues >= this.values.length; + }; + WindowedMean.prototype.addValue = function (value) { + if (this.addedValues < this.values.length) + this.addedValues++; + this.values[this.lastValue++] = value; + if (this.lastValue > this.values.length - 1) + this.lastValue = 0; + this.dirty = true; + }; + WindowedMean.prototype.getMean = function () { + if (this.hasEnoughData()) { + if (this.dirty) { + var mean = 0; + for (var i = 0; i < this.values.length; i++) { + mean += this.values[i]; + } + this.mean = mean / this.values.length; + this.dirty = false; + } + return this.mean; + } + else { + return 0; + } + }; + return WindowedMean; + }()); + core.WindowedMean = WindowedMean; + })(core = pixi_spine.core || (pixi_spine.core = {})); +})(pixi_spine || (pixi_spine = {})); +var pixi_spine; +(function (pixi_spine) { + var core; + (function (core) { + var Attachment = (function () { + function Attachment(name) { + if (name == null) + throw new Error("name cannot be null."); + this.name = name; + } + return Attachment; + }()); + core.Attachment = Attachment; + var VertexAttachment = (function (_super) { + __extends(VertexAttachment, _super); + function VertexAttachment(name) { + var _this = _super.call(this, name) || this; + _this.id = (VertexAttachment.nextID++ & 65535) << 11; + _this.worldVerticesLength = 0; + return _this; + } + VertexAttachment.prototype.computeWorldVerticesOld = function (slot, worldVertices) { + this.computeWorldVertices(slot, 0, this.worldVerticesLength, worldVertices, 0, 2); + }; + VertexAttachment.prototype.computeWorldVertices = function (slot, start, count, worldVertices, offset, stride) { + count = offset + (count >> 1) * stride; + var skeleton = slot.bone.skeleton; + var deformArray = slot.attachmentVertices; + var vertices = this.vertices; + var bones = this.bones; + if (bones == null) { + if (deformArray.length > 0) + vertices = deformArray; + var mat = slot.bone.matrix; + var x = mat.tx; + var y = mat.ty; + var a = mat.a, b = mat.c, c = mat.b, d = mat.d; + for (var v_1 = start, w = offset; w < count; v_1 += 2, w += stride) { + var vx = vertices[v_1], vy = vertices[v_1 + 1]; + worldVertices[w] = vx * a + vy * b + x; + worldVertices[w + 1] = vx * c + vy * d + y; + } + return; + } + var v = 0, skip = 0; + for (var i = 0; i < start; i += 2) { + var n = bones[v]; + v += n + 1; + skip += n; + } + var skeletonBones = skeleton.bones; + if (deformArray.length == 0) { + for (var w = offset, b = skip * 3; w < count; w += stride) { + var wx = 0, wy = 0; + var n = bones[v++]; + n += v; + for (; v < n; v++, b += 3) { + var mat = skeletonBones[bones[v]].matrix; + var vx = vertices[b], vy = vertices[b + 1], weight = vertices[b + 2]; + wx += (vx * mat.a + vy * mat.c + mat.tx) * weight; + wy += (vx * mat.b + vy * mat.d + mat.ty) * weight; + } + worldVertices[w] = wx; + worldVertices[w + 1] = wy; + } + } + else { + var deform = deformArray; + for (var w = offset, b = skip * 3, f = skip << 1; w < count; w += stride) { + var wx = 0, wy = 0; + var n = bones[v++]; + n += v; + for (; v < n; v++, b += 3, f += 2) { + var mat = skeletonBones[bones[v]].matrix; + var vx = vertices[b] + deform[f], vy = vertices[b + 1] + deform[f + 1], weight = vertices[b + 2]; + wx += (vx * mat.a + vy * mat.c + mat.tx) * weight; + wy += (vx * mat.b + vy * mat.d + mat.ty) * weight; + } + worldVertices[w] = wx; + worldVertices[w + 1] = wy; + } + } + }; + VertexAttachment.prototype.applyDeform = function (sourceAttachment) { + return this == sourceAttachment; + }; + VertexAttachment.nextID = 0; + return VertexAttachment; + }(Attachment)); + core.VertexAttachment = VertexAttachment; + })(core = pixi_spine.core || (pixi_spine.core = {})); +})(pixi_spine || (pixi_spine = {})); +var pixi_spine; +(function (pixi_spine) { + var core; + (function (core) { + var AttachmentType; + (function (AttachmentType) { + AttachmentType[AttachmentType["Region"] = 0] = "Region"; + AttachmentType[AttachmentType["BoundingBox"] = 1] = "BoundingBox"; + AttachmentType[AttachmentType["Mesh"] = 2] = "Mesh"; + AttachmentType[AttachmentType["LinkedMesh"] = 3] = "LinkedMesh"; + AttachmentType[AttachmentType["Path"] = 4] = "Path"; + AttachmentType[AttachmentType["Point"] = 5] = "Point"; + })(AttachmentType = core.AttachmentType || (core.AttachmentType = {})); + })(core = pixi_spine.core || (pixi_spine.core = {})); +})(pixi_spine || (pixi_spine = {})); +var pixi_spine; +(function (pixi_spine) { + var core; + (function (core) { + var BoundingBoxAttachment = (function (_super) { + __extends(BoundingBoxAttachment, _super); + function BoundingBoxAttachment(name) { + var _this = _super.call(this, name) || this; + _this.color = new core.Color(1, 1, 1, 1); + return _this; + } + return BoundingBoxAttachment; + }(core.VertexAttachment)); + core.BoundingBoxAttachment = BoundingBoxAttachment; + })(core = pixi_spine.core || (pixi_spine.core = {})); +})(pixi_spine || (pixi_spine = {})); +var pixi_spine; +(function (pixi_spine) { + var core; + (function (core) { + var ClippingAttachment = (function (_super) { + __extends(ClippingAttachment, _super); + function ClippingAttachment(name) { + var _this = _super.call(this, name) || this; + _this.color = new core.Color(0.2275, 0.2275, 0.8078, 1); + return _this; + } + return ClippingAttachment; + }(core.VertexAttachment)); + core.ClippingAttachment = ClippingAttachment; + })(core = pixi_spine.core || (pixi_spine.core = {})); +})(pixi_spine || (pixi_spine = {})); +var pixi_spine; +(function (pixi_spine) { + var core; + (function (core) { + var MeshAttachment = (function (_super) { + __extends(MeshAttachment, _super); + function MeshAttachment(name) { + var _this = _super.call(this, name) || this; + _this.color = new core.Color(1, 1, 1, 1); + _this.inheritDeform = false; + _this.tempColor = new core.Color(0, 0, 0, 0); + return _this; + } + MeshAttachment.prototype.updateUVs = function (region, uvs) { + var regionUVs = this.regionUVs; + var n = regionUVs.length; + if (!uvs || uvs.length != n) { + uvs = core.Utils.newFloatArray(n); + } + if (region == null) { + return; + } + var texture = region.texture; + var r = texture._uvs; + var w1 = region.width, h1 = region.height, w2 = region.originalWidth, h2 = region.originalHeight; + var x = region.offsetX, y = region.pixiOffsetY; + for (var i = 0; i < n; i += 2) { + var u = this.regionUVs[i], v = this.regionUVs[i + 1]; + u = (u * w2 - x) / w1; + v = (v * h2 - y) / h1; + uvs[i] = (r.x0 * (1 - u) + r.x1 * u) * (1 - v) + (r.x3 * (1 - u) + r.x2 * u) * v; + uvs[i + 1] = (r.y0 * (1 - u) + r.y1 * u) * (1 - v) + (r.y3 * (1 - u) + r.y2 * u) * v; + } + return uvs; + }; + MeshAttachment.prototype.applyDeform = function (sourceAttachment) { + return this == sourceAttachment || (this.inheritDeform && this.parentMesh == sourceAttachment); + }; + MeshAttachment.prototype.getParentMesh = function () { + return this.parentMesh; + }; + MeshAttachment.prototype.setParentMesh = function (parentMesh) { + this.parentMesh = parentMesh; + if (parentMesh != null) { + this.bones = parentMesh.bones; + this.vertices = parentMesh.vertices; + this.worldVerticesLength = parentMesh.worldVerticesLength; + this.regionUVs = parentMesh.regionUVs; + this.triangles = parentMesh.triangles; + this.hullLength = parentMesh.hullLength; + this.worldVerticesLength = parentMesh.worldVerticesLength; + } + }; + return MeshAttachment; + }(core.VertexAttachment)); + core.MeshAttachment = MeshAttachment; + })(core = pixi_spine.core || (pixi_spine.core = {})); +})(pixi_spine || (pixi_spine = {})); +var pixi_spine; +(function (pixi_spine) { + var core; + (function (core) { + var PathAttachment = (function (_super) { + __extends(PathAttachment, _super); + function PathAttachment(name) { + var _this = _super.call(this, name) || this; + _this.closed = false; + _this.constantSpeed = false; + _this.color = new core.Color(1, 1, 1, 1); + return _this; + } + return PathAttachment; + }(core.VertexAttachment)); + core.PathAttachment = PathAttachment; + })(core = pixi_spine.core || (pixi_spine.core = {})); +})(pixi_spine || (pixi_spine = {})); +var pixi_spine; +(function (pixi_spine) { + var core; + (function (core) { + var PointAttachment = (function (_super) { + __extends(PointAttachment, _super); + function PointAttachment(name) { + var _this = _super.call(this, name) || this; + _this.color = new core.Color(0.38, 0.94, 0, 1); + return _this; + } + PointAttachment.prototype.computeWorldPosition = function (bone, point) { + var mat = bone.matrix; + point.x = this.x * mat.a + this.y * mat.c + bone.worldX; + point.y = this.x * mat.b + this.y * mat.d + bone.worldY; + return point; + }; + PointAttachment.prototype.computeWorldRotation = function (bone) { + var mat = bone.matrix; + var cos = core.MathUtils.cosDeg(this.rotation), sin = core.MathUtils.sinDeg(this.rotation); + var x = cos * mat.a + sin * mat.c; + var y = cos * mat.b + sin * mat.d; + return Math.atan2(y, x) * core.MathUtils.radDeg; + }; + return PointAttachment; + }(core.VertexAttachment)); + core.PointAttachment = PointAttachment; + })(core = pixi_spine.core || (pixi_spine.core = {})); +})(pixi_spine || (pixi_spine = {})); +var pixi_spine; +(function (pixi_spine) { + var core; + (function (core) { + var RegionAttachment = (function (_super) { + __extends(RegionAttachment, _super); + function RegionAttachment(name) { + var _this = _super.call(this, name) || this; + _this.x = 0; + _this.y = 0; + _this.scaleX = 1; + _this.scaleY = 1; + _this.rotation = 0; + _this.width = 0; + _this.height = 0; + _this.color = new core.Color(1, 1, 1, 1); + _this.offset = core.Utils.newFloatArray(8); + _this.uvs = core.Utils.newFloatArray(8); + _this.tempColor = new core.Color(1, 1, 1, 1); + return _this; + } + RegionAttachment.prototype.updateOffset = function () { + var regionScaleX = this.width / this.region.originalWidth * this.scaleX; + var regionScaleY = this.height / this.region.originalHeight * this.scaleY; + var localX = -this.width / 2 * this.scaleX + this.region.offsetX * regionScaleX; + var localY = -this.height / 2 * this.scaleY + this.region.offsetY * regionScaleY; + var localX2 = localX + this.region.width * regionScaleX; + var localY2 = localY + this.region.height * regionScaleY; + var radians = this.rotation * Math.PI / 180; + var cos = Math.cos(radians); + var sin = Math.sin(radians); + var localXCos = localX * cos + this.x; + var localXSin = localX * sin; + var localYCos = localY * cos + this.y; + var localYSin = localY * sin; + var localX2Cos = localX2 * cos + this.x; + var localX2Sin = localX2 * sin; + var localY2Cos = localY2 * cos + this.y; + var localY2Sin = localY2 * sin; + var offset = this.offset; + offset[RegionAttachment.OX1] = localXCos - localYSin; + offset[RegionAttachment.OY1] = localYCos + localXSin; + offset[RegionAttachment.OX2] = localXCos - localY2Sin; + offset[RegionAttachment.OY2] = localY2Cos + localXSin; + offset[RegionAttachment.OX3] = localX2Cos - localY2Sin; + offset[RegionAttachment.OY3] = localY2Cos + localX2Sin; + offset[RegionAttachment.OX4] = localX2Cos - localYSin; + offset[RegionAttachment.OY4] = localYCos + localX2Sin; + }; + RegionAttachment.prototype.setRegion = function (region) { + this.region = region; + var uvs = this.uvs; + if (region.rotate) { + uvs[2] = region.u; + uvs[3] = region.v2; + uvs[4] = region.u; + uvs[5] = region.v; + uvs[6] = region.u2; + uvs[7] = region.v; + uvs[0] = region.u2; + uvs[1] = region.v2; + } + else { + uvs[0] = region.u; + uvs[1] = region.v2; + uvs[2] = region.u; + uvs[3] = region.v; + uvs[4] = region.u2; + uvs[5] = region.v; + uvs[6] = region.u2; + uvs[7] = region.v2; + } + }; + RegionAttachment.prototype.computeWorldVertices = function (bone, worldVertices, offset, stride) { + var vertexOffset = this.offset; + var mat = bone.matrix; + var x = mat.tx, y = mat.ty; + var a = mat.a, b = mat.c, c = mat.b, d = mat.d; + var offsetX = 0, offsetY = 0; + offsetX = vertexOffset[RegionAttachment.OX1]; + offsetY = vertexOffset[RegionAttachment.OY1]; + worldVertices[offset] = offsetX * a + offsetY * b + x; + worldVertices[offset + 1] = offsetX * c + offsetY * d + y; + offset += stride; + offsetX = vertexOffset[RegionAttachment.OX2]; + offsetY = vertexOffset[RegionAttachment.OY2]; + worldVertices[offset] = offsetX * a + offsetY * b + x; + worldVertices[offset + 1] = offsetX * c + offsetY * d + y; + offset += stride; + offsetX = vertexOffset[RegionAttachment.OX3]; + offsetY = vertexOffset[RegionAttachment.OY3]; + worldVertices[offset] = offsetX * a + offsetY * b + x; + worldVertices[offset + 1] = offsetX * c + offsetY * d + y; + offset += stride; + offsetX = vertexOffset[RegionAttachment.OX4]; + offsetY = vertexOffset[RegionAttachment.OY4]; + worldVertices[offset] = offsetX * a + offsetY * b + x; + worldVertices[offset + 1] = offsetX * c + offsetY * d + y; + }; + RegionAttachment.OX1 = 0; + RegionAttachment.OY1 = 1; + RegionAttachment.OX2 = 2; + RegionAttachment.OY2 = 3; + RegionAttachment.OX3 = 4; + RegionAttachment.OY3 = 5; + RegionAttachment.OX4 = 6; + RegionAttachment.OY4 = 7; + RegionAttachment.X1 = 0; + RegionAttachment.Y1 = 1; + RegionAttachment.C1R = 2; + RegionAttachment.C1G = 3; + RegionAttachment.C1B = 4; + RegionAttachment.C1A = 5; + RegionAttachment.U1 = 6; + RegionAttachment.V1 = 7; + RegionAttachment.X2 = 8; + RegionAttachment.Y2 = 9; + RegionAttachment.C2R = 10; + RegionAttachment.C2G = 11; + RegionAttachment.C2B = 12; + RegionAttachment.C2A = 13; + RegionAttachment.U2 = 14; + RegionAttachment.V2 = 15; + RegionAttachment.X3 = 16; + RegionAttachment.Y3 = 17; + RegionAttachment.C3R = 18; + RegionAttachment.C3G = 19; + RegionAttachment.C3B = 20; + RegionAttachment.C3A = 21; + RegionAttachment.U3 = 22; + RegionAttachment.V3 = 23; + RegionAttachment.X4 = 24; + RegionAttachment.Y4 = 25; + RegionAttachment.C4R = 26; + RegionAttachment.C4G = 27; + RegionAttachment.C4B = 28; + RegionAttachment.C4A = 29; + RegionAttachment.U4 = 30; + RegionAttachment.V4 = 31; + return RegionAttachment; + }(core.Attachment)); + core.RegionAttachment = RegionAttachment; + })(core = pixi_spine.core || (pixi_spine.core = {})); +})(pixi_spine || (pixi_spine = {})); +var pixi_spine; +(function (pixi_spine) { + var core; + (function (core) { + var JitterEffect = (function () { + function JitterEffect(jitterX, jitterY) { + this.jitterX = 0; + this.jitterY = 0; + this.jitterX = jitterX; + this.jitterY = jitterY; + } + JitterEffect.prototype.begin = function (skeleton) { + }; + JitterEffect.prototype.transform = function (position, uv, light, dark) { + position.x += core.MathUtils.randomTriangular(-this.jitterX, this.jitterY); + position.y += core.MathUtils.randomTriangular(-this.jitterX, this.jitterY); + }; + JitterEffect.prototype.end = function () { + }; + return JitterEffect; + }()); + core.JitterEffect = JitterEffect; + })(core = pixi_spine.core || (pixi_spine.core = {})); +})(pixi_spine || (pixi_spine = {})); +var pixi_spine; +(function (pixi_spine) { + var core; + (function (core) { + var SwirlEffect = (function () { + function SwirlEffect(radius) { + this.centerX = 0; + this.centerY = 0; + this.radius = 0; + this.angle = 0; + this.worldX = 0; + this.worldY = 0; + this.radius = radius; + } + SwirlEffect.prototype.begin = function (skeleton) { + this.worldX = skeleton.x + this.centerX; + this.worldY = skeleton.y + this.centerY; + }; + SwirlEffect.prototype.transform = function (position, uv, light, dark) { + var radAngle = this.angle * core.MathUtils.degreesToRadians; + var x = position.x - this.worldX; + var y = position.y - this.worldY; + var dist = Math.sqrt(x * x + y * y); + if (dist < this.radius) { + var theta = SwirlEffect.interpolation.apply(0, radAngle, (this.radius - dist) / this.radius); + var cos = Math.cos(theta); + var sin = Math.sin(theta); + position.x = cos * x - sin * y + this.worldX; + position.y = sin * x + cos * y + this.worldY; + } + }; + SwirlEffect.prototype.end = function () { + }; + SwirlEffect.interpolation = new core.PowOut(2); + return SwirlEffect; + }()); + core.SwirlEffect = SwirlEffect; + })(core = pixi_spine.core || (pixi_spine.core = {})); +})(pixi_spine || (pixi_spine = {})); +var pixi_spine; +(function (pixi_spine) { + function isJson(resource) { + return resource.type === PIXI.loaders.Resource.TYPE.JSON; + } + function atlasParser() { + return function (resource, next) { + if (!resource.data || + !isJson(resource) || + !resource.data.bones) { + return next(); + } + var metadata = resource.metadata || {}; + var metadataSkeletonScale = metadata ? resource.metadata.spineSkeletonScale : null; + var metadataAtlas = metadata ? resource.metadata.spineAtlas : null; + if (metadataAtlas === false) { + return next(); + } + if (metadataAtlas && metadataAtlas.pages) { + var spineJsonParser = new pixi_spine.core.SkeletonJson(new pixi_spine.core.AtlasAttachmentLoader(metadataAtlas)); + var skeletonData = spineJsonParser.readSkeletonData(resource.data); + resource.spineData = skeletonData; + resource.spineAtlas = metadataAtlas; + return next(); + } + var metadataAtlasSuffix = metadata.spineAtlasSuffix || '.atlas'; + var atlasPath = resource.url.substr(0, resource.url.lastIndexOf('.')) + metadataAtlasSuffix; + atlasPath = atlasPath.replace(this.baseUrl, ''); + var atlasOptions = { + crossOrigin: resource.crossOrigin, + xhrType: PIXI.loaders.Resource.XHR_RESPONSE_TYPE.TEXT, + metadata: metadata.spineMetadata || null, + parentResource: resource + }; + var imageOptions = { + crossOrigin: resource.crossOrigin, + metadata: metadata.imageMetadata || null, + parentResource: resource + }; + var baseUrl = resource.url.substr(0, resource.url.lastIndexOf('/') + 1); + baseUrl = baseUrl.replace(this.baseUrl, ''); + var adapter = metadata.images ? staticImageLoader(metadata.images) + : metadata.image ? staticImageLoader({ 'default': metadata.image }) + : metadata.imageLoader ? metadata.imageLoader(this, resource.name + '_atlas_page_', baseUrl, imageOptions) + : imageLoaderAdapter(this, resource.name + '_atlas_page_', baseUrl, imageOptions); + this.add(resource.name + '_atlas', atlasPath, atlasOptions, function (atlasResource) { + new pixi_spine.core.TextureAtlas(atlasResource.xhr.responseText, adapter, function (spineAtlas) { + var spineJsonParser = new pixi_spine.core.SkeletonJson(new pixi_spine.core.AtlasAttachmentLoader(spineAtlas)); + if (metadataSkeletonScale) { + spineJsonParser.scale = metadataSkeletonScale; + } + resource.spineData = spineJsonParser.readSkeletonData(resource.data); + resource.spineAtlas = spineAtlas; + next(); + }); + }); + }; + } + pixi_spine.atlasParser = atlasParser; + function imageLoaderAdapter(loader, namePrefix, baseUrl, imageOptions) { + if (baseUrl && baseUrl.lastIndexOf('/') !== (baseUrl.length - 1)) { + baseUrl += '/'; + } + return function (line, callback) { + var name = namePrefix + line; + var url = baseUrl + line; + loader.add(name, url, imageOptions, function (resource) { + callback(resource.texture.baseTexture); + }); + }; + } + pixi_spine.imageLoaderAdapter = imageLoaderAdapter; + function syncImageLoaderAdapter(baseUrl, crossOrigin) { + if (baseUrl && baseUrl.lastIndexOf('/') !== (baseUrl.length - 1)) { + baseUrl += '/'; + } + return function (line, callback) { + callback(PIXI.BaseTexture.fromImage(line, crossOrigin)); + }; + } + pixi_spine.syncImageLoaderAdapter = syncImageLoaderAdapter; + function staticImageLoader(pages) { + return function (line, callback) { + var page = pages[line] || pages['default']; + if (page && page.baseTexture) + callback(page.baseTexture); + else + callback(page); + }; + } + pixi_spine.staticImageLoader = staticImageLoader; + PIXI.loaders.Loader.addPixiMiddleware(atlasParser); + PIXI.loader.use(atlasParser()); +})(pixi_spine || (pixi_spine = {})); +(function () { + if (!Math.fround) { + Math.fround = Math.fround = (function (array) { + return function (x) { + return array[0] = x, array[0]; + }; + })(new Float32Array(1)); + } +})(); +var pixi_spine; +(function (pixi_spine) { + pixi_spine.core.Bone.yDown = true; + var tempRgb = [0, 0, 0]; + var SpineSprite = (function (_super) { + __extends(SpineSprite, _super); + function SpineSprite() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.region = null; + return _this; + } + return SpineSprite; + }(PIXI.Sprite)); + pixi_spine.SpineSprite = SpineSprite; + var SpineMesh = (function (_super) { + __extends(SpineMesh, _super); + function SpineMesh(texture, vertices, uvs, indices, drawMode) { + return _super.call(this, texture, vertices, uvs, indices, drawMode) || this; + } + return SpineMesh; + }(PIXI.mesh.Mesh)); + pixi_spine.SpineMesh = SpineMesh; + var Spine = (function (_super) { + __extends(Spine, _super); + function Spine(spineData) { + var _this = _super.call(this) || this; + if (!spineData) { + throw new Error('The spineData param is required.'); + } + if ((typeof spineData) === "string") { + throw new Error('spineData param cant be string. Please use spine.Spine.fromAtlas("YOUR_RESOURCE_NAME") from now on.'); + } + _this.spineData = spineData; + _this.skeleton = new pixi_spine.core.Skeleton(spineData); + _this.skeleton.updateWorldTransform(); + _this.stateData = new pixi_spine.core.AnimationStateData(spineData); + _this.state = new pixi_spine.core.AnimationState(_this.stateData); + _this.slotContainers = []; + _this.tempClipContainers = []; + for (var i = 0, n = _this.skeleton.slots.length; i < n; i++) { + var slot = _this.skeleton.slots[i]; + var attachment = slot.attachment; + var slotContainer = _this.newContainer(); + _this.slotContainers.push(slotContainer); + _this.addChild(slotContainer); + _this.tempClipContainers.push(null); + if (attachment instanceof pixi_spine.core.RegionAttachment) { + var spriteName = attachment.region.name; + var sprite = _this.createSprite(slot, attachment, spriteName); + slot.currentSprite = sprite; + slot.currentSpriteName = spriteName; + slotContainer.addChild(sprite); + } + else if (attachment instanceof pixi_spine.core.MeshAttachment) { + var mesh = _this.createMesh(slot, attachment); + slot.currentMesh = mesh; + slot.currentMeshName = attachment.name; + slotContainer.addChild(mesh); + } + else if (attachment instanceof pixi_spine.core.ClippingAttachment) { + _this.createGraphics(slot, attachment); + slotContainer.addChild(slot.clippingContainer); + slotContainer.addChild(slot.currentGraphics); + } + else { + continue; + } + } + _this.autoUpdate = true; + _this.tintRgb = new Float32Array([1, 1, 1]); + return _this; + } + Object.defineProperty(Spine.prototype, "autoUpdate", { + get: function () { + return (this.updateTransform === Spine.prototype.autoUpdateTransform); + }, + set: function (value) { + this.updateTransform = value ? Spine.prototype.autoUpdateTransform : PIXI.Container.prototype.updateTransform; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Spine.prototype, "tint", { + get: function () { + return PIXI.utils.rgb2hex(this.tintRgb); + }, + set: function (value) { + this.tintRgb = PIXI.utils.hex2rgb(value, this.tintRgb); + }, + enumerable: true, + configurable: true + }); + Spine.prototype.update = function (dt) { + this.state.update(dt); + this.state.apply(this.skeleton); + this.skeleton.updateWorldTransform(); + var slots = this.skeleton.slots; + var globalClr = this.color; + var light = null, dark = null; + if (globalClr) { + light = globalClr.light; + dark = globalClr.dark; + } + else { + light = this.tintRgb; + } + var thack = PIXI.TransformBase && (this.transformHack() == 1); + for (var i = 0, n = slots.length; i < n; i++) { + var slot = slots[i]; + var attachment = slot.attachment; + var slotContainer = this.slotContainers[i]; + if (!attachment) { + slotContainer.visible = false; + continue; + } + var spriteColor = null; + var attColor = attachment.color; + if (attachment instanceof pixi_spine.core.RegionAttachment) { + var region = attachment.region; + if (region) { + if (slot.currentMesh) { + slot.currentMesh.visible = false; + slot.currentMesh = null; + slot.currentMeshName = undefined; + } + var ar = region; + if (!slot.currentSpriteName || slot.currentSpriteName !== ar.name) { + var spriteName = ar.name; + if (slot.currentSprite) { + slot.currentSprite.visible = false; + } + slot.sprites = slot.sprites || {}; + if (slot.sprites[spriteName] !== undefined) { + slot.sprites[spriteName].visible = true; + } + else { + var sprite = this.createSprite(slot, attachment, spriteName); + slotContainer.addChild(sprite); + } + slot.currentSprite = slot.sprites[spriteName]; + slot.currentSpriteName = spriteName; + } + } + if (slotContainer.transform) { + var transform = slotContainer.transform; + var transAny = transform; + var lt = null; + if (transAny.matrix2d) { + lt = transAny.matrix2d; + transAny._dirtyVersion++; + transAny.version = transAny._dirtyVersion; + transAny.isStatic = true; + transAny.operMode = 0; + } + else { + if (thack) { + if (transAny.position) { + transform = new PIXI.TransformBase(); + slotContainer.transform = transform; + } + lt = transform.localTransform; + } + else { + transAny.setFromMatrix(slot.bone.matrix); + } + } + if (lt) { + slot.bone.matrix.copy(lt); + } + } + else { + var lt = slotContainer.localTransform || new PIXI.Matrix(); + slot.bone.matrix.copy(lt); + slotContainer.localTransform = lt; + slotContainer.displayObjectUpdateTransform = SlotContainerUpdateTransformV3; + } + if (slot.currentSprite.color) { + spriteColor = slot.currentSprite.color; + } + else { + tempRgb[0] = light[0] * slot.color.r * attColor.r; + tempRgb[1] = light[1] * slot.color.g * attColor.g; + tempRgb[2] = light[2] * slot.color.b * attColor.b; + slot.currentSprite.tint = PIXI.utils.rgb2hex(tempRgb); + } + slot.currentSprite.blendMode = slot.blendMode; + } + else if (attachment instanceof pixi_spine.core.MeshAttachment) { + if (slot.currentSprite) { + slot.currentSprite.visible = false; + slot.currentSprite = null; + slot.currentSpriteName = undefined; + if (slotContainer.transform) { + slotContainer.transform = new PIXI.TransformStatic(); + } + else { + slotContainer.localTransform = new PIXI.Matrix(); + slotContainer.displayObjectUpdateTransform = PIXI.DisplayObject.prototype.updateTransform; + } + } + if (!slot.currentMeshName || slot.currentMeshName !== attachment.name) { + var meshName = attachment.name; + if (slot.currentMesh) { + slot.currentMesh.visible = false; + } + slot.meshes = slot.meshes || {}; + if (slot.meshes[meshName] !== undefined) { + slot.meshes[meshName].visible = true; + } + else { + var mesh = this.createMesh(slot, attachment); + slotContainer.addChild(mesh); + } + slot.currentMesh = slot.meshes[meshName]; + slot.currentMeshName = meshName; + } + attachment.computeWorldVerticesOld(slot, slot.currentMesh.vertices); + if (slot.currentMesh.color) { + spriteColor = slot.currentMesh.color; + } + else if (PIXI.VERSION[0] !== '3') { + var tintRgb = slot.currentMesh.tintRgb; + tintRgb[0] = light[0] * slot.color.r * attColor.r; + tintRgb[1] = light[1] * slot.color.g * attColor.g; + tintRgb[2] = light[2] * slot.color.b * attColor.b; + } + slot.currentMesh.blendMode = slot.blendMode; + } + else if (attachment instanceof pixi_spine.core.ClippingAttachment) { + if (!slot.currentGraphics) { + this.createGraphics(slot, attachment); + slotContainer.addChild(slot.clippingContainer); + slotContainer.addChild(slot.currentGraphics); + } + this.updateGraphics(slot, attachment); + } + else { + slotContainer.visible = false; + continue; + } + slotContainer.visible = true; + if (spriteColor) { + var r0 = slot.color.r * attColor.r; + var g0 = slot.color.g * attColor.g; + var b0 = slot.color.b * attColor.b; + spriteColor.setLight(light[0] * r0 + dark[0] * (1.0 - r0), light[1] * g0 + dark[1] * (1.0 - g0), light[2] * b0 + dark[2] * (1.0 - b0)); + if (slot.darkColor) { + r0 = slot.darkColor.r; + g0 = slot.darkColor.g; + b0 = slot.darkColor.b; + } + else { + r0 = 0.0; + g0 = 0.0; + b0 = 0.0; + } + spriteColor.setDark(light[0] * r0 + dark[0] * (1 - r0), light[1] * g0 + dark[1] * (1 - g0), light[2] * b0 + dark[2] * (1 - b0)); + } + slotContainer.alpha = slot.color.a; + } + var drawOrder = this.skeleton.drawOrder; + var clippingAttachment = null; + var clippingContainer = null; + for (var i = 0, n = drawOrder.length; i < n; i++) { + var slot = slots[drawOrder[i].data.index]; + var slotContainer = this.slotContainers[drawOrder[i].data.index]; + if (!clippingContainer) { + if (slotContainer.parent !== this) { + slotContainer.parent.removeChild(slotContainer); + slotContainer.parent = this; + } + } + if (slot.currentGraphics && slot.attachment) { + clippingContainer = slot.clippingContainer; + clippingAttachment = slot.attachment; + clippingContainer.children.length = 0; + this.children[i] = slotContainer; + if (clippingAttachment.endSlot == slot.data) { + clippingContainer.renderable = false; + clippingContainer = null; + clippingAttachment = null; + } + } + else { + if (clippingContainer) { + var c = this.tempClipContainers[i]; + if (!c) { + c = this.tempClipContainers[i] = this.newContainer(); + c.visible = false; + } + this.children[i] = c; + slotContainer.parent = null; + clippingContainer.addChild(slotContainer); + if (clippingAttachment.endSlot == slot.data) { + clippingContainer.renderable = true; + clippingContainer = null; + clippingAttachment = null; + } + } + else { + this.children[i] = slotContainer; + } + } + } + }; + ; + Spine.prototype.setSpriteRegion = function (attachment, sprite, region) { + sprite.region = region; + sprite.texture = region.texture; + if (!region.size) { + sprite.scale.x = attachment.scaleX * attachment.width / region.originalWidth; + sprite.scale.y = -attachment.scaleY * attachment.height / region.originalHeight; + } + else { + sprite.scale.x = region.size.width / region.originalWidth; + sprite.scale.y = -region.size.height / region.originalHeight; + } + }; + Spine.prototype.setMeshRegion = function (attachment, mesh, region) { + mesh.region = region; + mesh.texture = region.texture; + region.texture._updateUvs(); + attachment.updateUVs(region, mesh.uvs); + mesh.dirty++; + }; + Spine.prototype.autoUpdateTransform = function () { + if (Spine.globalAutoUpdate) { + this.lastTime = this.lastTime || Date.now(); + var timeDelta = (Date.now() - this.lastTime) * 0.001; + this.lastTime = Date.now(); + this.update(timeDelta); + } + else { + this.lastTime = 0; + } + PIXI.Container.prototype.updateTransform.call(this); + }; + ; + Spine.prototype.createSprite = function (slot, attachment, defName) { + var region = attachment.region; + if (slot.tempAttachment === attachment) { + region = slot.tempRegion; + slot.tempAttachment = null; + slot.tempRegion = null; + } + var texture = region.texture; + var sprite = this.newSprite(texture); + sprite.rotation = attachment.rotation * pixi_spine.core.MathUtils.degRad; + sprite.anchor.x = 0.5; + sprite.anchor.y = 0.5; + sprite.position.x = attachment.x; + sprite.position.y = attachment.y; + sprite.alpha = attachment.color.a; + sprite.region = attachment.region; + this.setSpriteRegion(attachment, sprite, attachment.region); + slot.sprites = slot.sprites || {}; + slot.sprites[defName] = sprite; + return sprite; + }; + ; + Spine.prototype.createMesh = function (slot, attachment) { + var region = attachment.region; + if (slot.tempAttachment === attachment) { + region = slot.tempRegion; + slot.tempAttachment = null; + slot.tempRegion = null; + } + var strip = this.newMesh(region.texture, new Float32Array(attachment.regionUVs.length), new Float32Array(attachment.regionUVs.length), new Uint16Array(attachment.triangles), PIXI.mesh.Mesh.DRAW_MODES.TRIANGLES); + strip.canvasPadding = 1.5; + strip.alpha = attachment.color.a; + strip.region = attachment.region; + this.setMeshRegion(attachment, strip, region); + slot.meshes = slot.meshes || {}; + slot.meshes[attachment.name] = strip; + return strip; + }; + ; + Spine.prototype.createGraphics = function (slot, clip) { + var graphics = this.newGraphics(); + var poly = new PIXI.Polygon([]); + graphics.clear(); + graphics.beginFill(0xffffff, 1); + graphics.drawPolygon(poly); + graphics.renderable = false; + slot.currentGraphics = graphics; + slot.clippingContainer = this.newContainer(); + slot.clippingContainer.mask = slot.currentGraphics; + return graphics; + }; + Spine.prototype.updateGraphics = function (slot, clip) { + var vertices = slot.currentGraphics.graphicsData[0].shape.points; + var n = clip.worldVerticesLength; + vertices.length = n; + clip.computeWorldVertices(slot, 0, n, vertices, 0, 2); + slot.currentGraphics.dirty++; + slot.currentGraphics.clearDirty++; + }; + Spine.prototype.hackTextureBySlotIndex = function (slotIndex, texture, size) { + if (texture === void 0) { texture = null; } + if (size === void 0) { size = null; } + var slot = this.skeleton.slots[slotIndex]; + if (!slot) { + return false; + } + var attachment = slot.attachment; + var region = attachment.region; + if (texture) { + region = new pixi_spine.core.TextureRegion(); + region.texture = texture; + region.size = size; + } + if (slot.currentSprite && slot.currentSprite.region != region) { + this.setSpriteRegion(attachment, slot.currentSprite, region); + slot.currentSprite.region = region; + } + else if (slot.currentMesh && slot.currentMesh.region != region) { + this.setMeshRegion(attachment, slot.currentMesh, region); + } + else { + slot.tempRegion = region; + slot.tempAttachment = attachment; + } + return true; + }; + Spine.prototype.hackTextureBySlotName = function (slotName, texture, size) { + if (texture === void 0) { texture = null; } + if (size === void 0) { size = null; } + var index = this.skeleton.findSlotIndex(slotName); + if (index == -1) { + return false; + } + return this.hackTextureBySlotIndex(index, texture, size); + }; + Spine.prototype.newContainer = function () { + return new PIXI.Container(); + }; + Spine.prototype.newSprite = function (tex) { + return new SpineSprite(tex); + }; + Spine.prototype.newGraphics = function () { + return new PIXI.Graphics(); + }; + Spine.prototype.newMesh = function (texture, vertices, uvs, indices, drawMode) { + return new SpineMesh(texture, vertices, uvs, indices, drawMode); + }; + Spine.prototype.transformHack = function () { + return 1; + }; + Spine.globalAutoUpdate = true; + Spine.clippingPolygon = []; + return Spine; + }(PIXI.Container)); + pixi_spine.Spine = Spine; + function SlotContainerUpdateTransformV3() { + var pt = this.parent.worldTransform; + var wt = this.worldTransform; + var lt = this.localTransform; + wt.a = lt.a * pt.a + lt.b * pt.c; + wt.b = lt.a * pt.b + lt.b * pt.d; + wt.c = lt.c * pt.a + lt.d * pt.c; + wt.d = lt.c * pt.b + lt.d * pt.d; + wt.tx = lt.tx * pt.a + lt.ty * pt.c + pt.tx; + wt.ty = lt.tx * pt.b + lt.ty * pt.d + pt.ty; + this.worldAlpha = this.alpha * this.parent.worldAlpha; + this._currentBounds = null; + } +})(pixi_spine || (pixi_spine = {})); +PIXI.spine = pixi_spine; +//# sourceMappingURL=pixi-spine.js.map \ No newline at end of file diff --git a/example/lib/pixi.min.js b/example/lib/pixi.min.js new file mode 100644 index 0000000..8c199ac --- /dev/null +++ b/example/lib/pixi.min.js @@ -0,0 +1,22 @@ +/*! + * pixi.js - v4.6.0 + * Compiled Fri, 27 Oct 2017 13:14:24 UTC + * + * pixi.js is licensed under the MIT License. + * http://www.opensource.org/licenses/mit-license + */ +!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.PIXI=t()}}(function(){var t;return function t(e,r,n){function i(s,a){if(!r[s]){if(!e[s]){var u="function"==typeof require&&require;if(!a&&u)return u(s,!0);if(o)return o(s,!0);var h=new Error("Cannot find module '"+s+"'");throw h.code="MODULE_NOT_FOUND",h}var l=r[s]={exports:{}};e[s][0].call(l.exports,function(t){var r=e[s][1][t];return i(r||t)},l,l.exports,t,e,r,n)}return r[s].exports}for(var o="function"==typeof require&&require,s=0;s0)-(t<0)},r.abs=function(t){var e=t>>31;return(t^e)-e},r.min=function(t,e){return e^(t^e)&-(t65535)<<4,t>>>=e,r=(t>255)<<3,t>>>=r,e|=r,r=(t>15)<<2,t>>>=r,e|=r,r=(t>3)<<1,t>>>=r,(e|=r)|t>>1},r.log10=function(t){return t>=1e9?9:t>=1e8?8:t>=1e7?7:t>=1e6?6:t>=1e5?5:t>=1e4?4:t>=1e3?3:t>=100?2:t>=10?1:0},r.popCount=function(t){return t-=t>>>1&1431655765,16843009*((t=(858993459&t)+(t>>>2&858993459))+(t>>>4)&252645135)>>>24},r.countTrailingZeros=n,r.nextPow2=function(t){return t+=0===t,--t,t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,(t|=t>>>16)+1},r.prevPow2=function(t){return t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,(t|=t>>>16)-(t>>>1)},r.parity=function(t){return t^=t>>>16,t^=t>>>8,t^=t>>>4,27030>>>(t&=15)&1};var i=new Array(256);!function(t){for(var e=0;e<256;++e){var r=e,n=e,i=7;for(r>>>=1;r;r>>>=1)n<<=1,n|=1&r,--i;t[e]=n<>>8&255]<<16|i[t>>>16&255]<<8|i[t>>>24&255]},r.interleave2=function(t,e){return t&=65535,t=16711935&(t|t<<8),t=252645135&(t|t<<4),t=858993459&(t|t<<2),t=1431655765&(t|t<<1),e&=65535,e=16711935&(e|e<<8),e=252645135&(e|e<<4),e=858993459&(e|e<<2),e=1431655765&(e|e<<1),t|e<<1},r.deinterleave2=function(t,e){return t=t>>>e&1431655765,t=858993459&(t|t>>>1),t=252645135&(t|t>>>2),t=16711935&(t|t>>>4),(t=65535&(t|t>>>16))<<16>>16},r.interleave3=function(t,e,r){return t&=1023,t=4278190335&(t|t<<16),t=251719695&(t|t<<8),t=3272356035&(t|t<<4),t=1227133513&(t|t<<2),e&=1023,e=4278190335&(e|e<<16),e=251719695&(e|e<<8),e=3272356035&(e|e<<4),e=1227133513&(e|e<<2),t|=e<<1,r&=1023,r=4278190335&(r|r<<16),r=251719695&(r|r<<8),r=3272356035&(r|r<<4),r=1227133513&(r|r<<2),t|r<<2},r.deinterleave3=function(t,e){return t=t>>>e&1227133513,t=3272356035&(t|t>>>2),t=251719695&(t|t>>>4),t=4278190335&(t|t>>>8),(t=1023&(t|t>>>16))<<22>>22},r.nextCombination=function(t){var e=t|t-1;return e+1|(~e&-~e)-1>>>n(t)+1}},{}],2:[function(t,e,r){"use strict";function n(t,e,r){r=r||2;var n=e&&e.length,o=n?e[0]*r:t.length,a=i(t,0,o,r,!0),u=[];if(!a)return u;var h,l,d,f,p,v,y;if(n&&(a=c(t,e,a,r)),t.length>80*r){h=d=t[0],l=f=t[1];for(var g=r;gd&&(d=p),v>f&&(f=v);y=Math.max(d-h,f-l),y=0!==y?1/y:0}return s(a,u,r,h,l,y),u}function i(t,e,r,n,i){var o,s;if(i===A(t,e,r,n)>0)for(o=e;o=e;o-=n)s=P(o,t[o],t[o+1],s);return s&&T(s,s.next)&&(C(s),s=s.next),s}function o(t,e){if(!t)return t;e||(e=t);var r,n=t;do{if(r=!1,n.steiner||!T(n,n.next)&&0!==x(n.prev,n,n.next))n=n.next;else{if(C(n),(n=e=n.prev)===n.next)break;r=!0}}while(r||n!==e);return e}function s(t,e,r,n,i,c,d){if(t){!d&&c&&v(t,n,i,c);for(var f,p,y=t;t.prev!==t.next;)if(f=t.prev,p=t.next,c?u(t,n,i,c):a(t))e.push(f.i/r),e.push(t.i/r),e.push(p.i/r),C(t),t=p.next,y=p.next;else if((t=p)===y){d?1===d?(t=h(t,e,r),s(t,e,r,n,i,c,2)):2===d&&l(t,e,r,n,i,c):s(o(t),e,r,n,i,c,1);break}}}function a(t){var e=t.prev,r=t,n=t.next;if(x(e,r,n)>=0)return!1;for(var i=t.next.next;i!==t.prev;){if(_(e.x,e.y,r.x,r.y,n.x,n.y,i.x,i.y)&&x(i.prev,i,i.next)>=0)return!1;i=i.next}return!0}function u(t,e,r,n){var i=t.prev,o=t,s=t.next;if(x(i,o,s)>=0)return!1;for(var a=i.xo.x?i.x>s.x?i.x:s.x:o.x>s.x?o.x:s.x,l=i.y>o.y?i.y>s.y?i.y:s.y:o.y>s.y?o.y:s.y,c=g(a,u,e,r,n),d=g(h,l,e,r,n),f=t.nextZ;f&&f.z<=d;){if(f!==t.prev&&f!==t.next&&_(i.x,i.y,o.x,o.y,s.x,s.y,f.x,f.y)&&x(f.prev,f,f.next)>=0)return!1;f=f.nextZ}for(f=t.prevZ;f&&f.z>=c;){if(f!==t.prev&&f!==t.next&&_(i.x,i.y,o.x,o.y,s.x,s.y,f.x,f.y)&&x(f.prev,f,f.next)>=0)return!1;f=f.prevZ}return!0}function h(t,e,r){var n=t;do{var i=n.prev,o=n.next.next;!T(i,o)&&w(i,n,n.next,o)&&S(i,o)&&S(o,i)&&(e.push(i.i/r),e.push(n.i/r),e.push(o.i/r),C(n),C(n.next),n=t=o),n=n.next}while(n!==t);return n}function l(t,e,r,n,i,a){var u=t;do{for(var h=u.next.next;h!==u.prev;){if(u.i!==h.i&&b(u,h)){var l=M(u,h);return u=o(u,u.next),l=o(l,l.next),s(u,e,r,n,i,a),void s(l,e,r,n,i,a)}h=h.next}u=u.next}while(u!==t)}function c(t,e,r,n){var s,a,u,h,l,c=[];for(s=0,a=e.length;s=n.next.y&&n.next.y!==n.y){var a=n.x+(o-n.y)*(n.next.x-n.x)/(n.next.y-n.y);if(a<=i&&a>s){if(s=a,a===i){if(o===n.y)return n;if(o===n.next.y)return n.next}r=n.x=n.x&&n.x>=l&&i!==n.x&&_(or.x)&&S(n,t)&&(r=n,d=u),n=n.next;return r}function v(t,e,r,n){var i=t;do{null===i.z&&(i.z=g(i.x,i.y,e,r,n)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next}while(i!==t);i.prevZ.nextZ=null,i.prevZ=null,y(i)}function y(t){var e,r,n,i,o,s,a,u,h=1;do{for(r=t,t=null,o=null,s=0;r;){for(s++,n=r,a=0,e=0;e0||u>0&&n;)0!==a&&(0===u||!n||r.z<=n.z)?(i=r,r=r.nextZ,a--):(i=n,n=n.nextZ,u--),o?o.nextZ=i:t=i,i.prevZ=o,o=i;r=n}o.nextZ=null,h*=2}while(s>1);return t}function g(t,e,r,n,i){return t=32767*(t-r)*i,e=32767*(e-n)*i,t=16711935&(t|t<<8),t=252645135&(t|t<<4),t=858993459&(t|t<<2),t=1431655765&(t|t<<1),e=16711935&(e|e<<8),e=252645135&(e|e<<4),e=858993459&(e|e<<2),e=1431655765&(e|e<<1),t|e<<1}function m(t){var e=t,r=t;do{e.x=0&&(t-s)*(n-a)-(r-s)*(e-a)>=0&&(r-s)*(o-a)-(i-s)*(n-a)>=0}function b(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!E(t,e)&&S(t,e)&&S(e,t)&&O(t,e)}function x(t,e,r){return(e.y-t.y)*(r.x-e.x)-(e.x-t.x)*(r.y-e.y)}function T(t,e){return t.x===e.x&&t.y===e.y}function w(t,e,r,n){return!!(T(t,e)&&T(r,n)||T(t,n)&&T(r,e))||x(t,e,r)>0!=x(t,e,n)>0&&x(r,n,t)>0!=x(r,n,e)>0}function E(t,e){var r=t;do{if(r.i!==t.i&&r.next.i!==t.i&&r.i!==e.i&&r.next.i!==e.i&&w(r,r.next,t,e))return!0;r=r.next}while(r!==t);return!1}function S(t,e){return x(t.prev,t,t.next)<0?x(t,e,t.next)>=0&&x(t,t.prev,e)>=0:x(t,e,t.prev)<0||x(t,t.next,e)<0}function O(t,e){var r=t,n=!1,i=(t.x+e.x)/2,o=(t.y+e.y)/2;do{r.y>o!=r.next.y>o&&r.next.y!==r.y&&i<(r.next.x-r.x)*(o-r.y)/(r.next.y-r.y)+r.x&&(n=!n),r=r.next}while(r!==t);return n}function M(t,e){var r=new R(t.i,t.x,t.y),n=new R(e.i,e.x,e.y),i=t.next,o=e.prev;return t.next=e,e.prev=t,r.next=i,i.prev=r,n.next=r,r.prev=n,o.next=n,n.prev=o,n}function P(t,e,r,n){var i=new R(t,e,r);return n?(i.next=n.next,i.prev=n,n.next.prev=i,n.next=i):(i.prev=i,i.next=i),i}function C(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function R(t,e,r){this.i=t,this.x=e,this.y=r,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}function A(t,e,r,n){for(var i=0,o=e,s=r-n;o0&&(n+=t[i-1].length,r.holes.push(n))}return r}},{}],3:[function(t,e,r){"use strict";function n(){}function i(t,e,r){this.fn=t,this.context=e,this.once=r||!1}function o(){this._events=new n,this._eventsCount=0}var s=Object.prototype.hasOwnProperty,a="~";Object.create&&(n.prototype=Object.create(null),(new n).__proto__||(a=!1)),o.prototype.eventNames=function(){var t,e,r=[];if(0===this._eventsCount)return r;for(e in t=this._events)s.call(t,e)&&r.push(a?e.slice(1):e);return Object.getOwnPropertySymbols?r.concat(Object.getOwnPropertySymbols(t)):r},o.prototype.listeners=function(t,e){var r=a?a+t:t,n=this._events[r];if(e)return!!n;if(!n)return[];if(n.fn)return[n.fn];for(var i=0,o=n.length,s=new Array(o);i=0;n--){var i=t[n];"."===i?t.splice(n,1):".."===i?(t.splice(n,1),r++):r&&(t.splice(n,1),r--)}if(e)for(;r--;r)t.unshift("..");return t}function n(t,e){if(t.filter)return t.filter(e);for(var r=[],n=0;n=-1&&!i;o--){var s=o>=0?arguments[o]:t.cwd();if("string"!=typeof s)throw new TypeError("Arguments to path.resolve must be strings");s&&(r=s+"/"+r,i="/"===s.charAt(0))}return r=e(n(r.split("/"),function(t){return!!t}),!i).join("/"),(i?"/":"")+r||"."},r.normalize=function(t){var i=r.isAbsolute(t),o="/"===s(t,-1);return t=e(n(t.split("/"),function(t){return!!t}),!i).join("/"),t||i||(t="."),t&&o&&(t+="/"),(i?"/":"")+t},r.isAbsolute=function(t){return"/"===t.charAt(0)},r.join=function(){var t=Array.prototype.slice.call(arguments,0);return r.normalize(n(t,function(t,e){if("string"!=typeof t)throw new TypeError("Arguments to path.join must be strings");return t}).join("/"))},r.relative=function(t,e){function n(t){for(var e=0;e=0&&""===t[r];r--);return e>r?[]:t.slice(e,r-e+1)}t=r.resolve(t).substr(1),e=r.resolve(e).substr(1);for(var i=n(t.split("/")),o=n(e.split("/")),s=Math.min(i.length,o.length),a=s,u=0;u=t.byteLength?n.bufferSubData(this.type,e,t):n.bufferData(this.type,t,this.drawType),this.data=t},i.prototype.bind=function(){this.gl.bindBuffer(this.type,this.buffer)},i.createVertexBuffer=function(t,e,r){return new i(t,t.ARRAY_BUFFER,e,r)},i.createIndexBuffer=function(t,e,r){return new i(t,t.ELEMENT_ARRAY_BUFFER,e,r)},i.create=function(t,e,r,n){return new i(t,e,r,n)},i.prototype.destroy=function(){this.gl.deleteBuffer(this.buffer)},e.exports=i},{}],10:[function(t,e,r){var n=t("./GLTexture"),i=function(t,e,r){this.gl=t,this.framebuffer=t.createFramebuffer(),this.stencil=null,this.texture=null,this.width=e||100,this.height=r||100};i.prototype.enableTexture=function(t){var e=this.gl;this.texture=t||new n(e),this.texture.bind(),this.bind(),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,this.texture.texture,0)},i.prototype.enableStencil=function(){if(!this.stencil){var t=this.gl;this.stencil=t.createRenderbuffer(),t.bindRenderbuffer(t.RENDERBUFFER,this.stencil),t.framebufferRenderbuffer(t.FRAMEBUFFER,t.DEPTH_STENCIL_ATTACHMENT,t.RENDERBUFFER,this.stencil),t.renderbufferStorage(t.RENDERBUFFER,t.DEPTH_STENCIL,this.width,this.height)}},i.prototype.clear=function(t,e,r,n){this.bind();var i=this.gl;i.clearColor(t,e,r,n),i.clear(i.COLOR_BUFFER_BIT|i.DEPTH_BUFFER_BIT)},i.prototype.bind=function(){var t=this.gl;t.bindFramebuffer(t.FRAMEBUFFER,this.framebuffer)},i.prototype.unbind=function(){var t=this.gl;t.bindFramebuffer(t.FRAMEBUFFER,null)},i.prototype.resize=function(t,e){var r=this.gl;this.width=t,this.height=e,this.texture&&this.texture.uploadData(null,t,e),this.stencil&&(r.bindRenderbuffer(r.RENDERBUFFER,this.stencil),r.renderbufferStorage(r.RENDERBUFFER,r.DEPTH_STENCIL,t,e))},i.prototype.destroy=function(){var t=this.gl;this.texture&&this.texture.destroy(),t.deleteFramebuffer(this.framebuffer),this.gl=null,this.stencil=null,this.texture=null},i.createRGBA=function(t,e,r,o){var s=n.fromData(t,null,e,r);s.enableNearestScaling(),s.enableWrapClamp();var a=new i(t,e,r);return a.enableTexture(s),a.unbind(),a},i.createFloat32=function(t,e,r,o){var s=new n.fromData(t,o,e,r);s.enableNearestScaling(),s.enableWrapClamp();var a=new i(t,e,r);return a.enableTexture(s),a.unbind(),a},e.exports=i},{"./GLTexture":12}],11:[function(t,e,r){var n=t("./shader/compileProgram"),i=t("./shader/extractAttributes"),o=t("./shader/extractUniforms"),s=t("./shader/setPrecision"),a=t("./shader/generateUniformAccessObject"),u=function(t,e,r,u,h){this.gl=t,u&&(e=s(e,u),r=s(r,u)),this.program=n(t,e,r,h),this.attributes=i(t,this.program),this.uniformData=o(t,this.program),this.uniforms=a(t,this.uniformData)};u.prototype.bind=function(){this.gl.useProgram(this.program)},u.prototype.destroy=function(){this.attributes=null,this.uniformData=null,this.uniforms=null,this.gl.deleteProgram(this.program)},e.exports=u},{"./shader/compileProgram":17,"./shader/extractAttributes":19,"./shader/extractUniforms":20,"./shader/generateUniformAccessObject":21,"./shader/setPrecision":25}],12:[function(t,e,r){var n=function(t,e,r,n,i){this.gl=t,this.texture=t.createTexture(),this.mipmap=!1,this.premultiplyAlpha=!1,this.width=e||-1,this.height=r||-1,this.format=n||t.RGBA,this.type=i||t.UNSIGNED_BYTE};n.prototype.upload=function(t){this.bind();var e=this.gl;e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,this.premultiplyAlpha);var r=t.videoWidth||t.width,n=t.videoHeight||t.height;n!==this.height||r!==this.width?e.texImage2D(e.TEXTURE_2D,0,this.format,this.format,this.type,t):e.texSubImage2D(e.TEXTURE_2D,0,0,0,this.format,this.type,t),this.width=r,this.height=n};var i=!1;n.prototype.uploadData=function(t,e,r){this.bind();var n=this.gl;if(t instanceof Float32Array){if(!i){if(!n.getExtension("OES_texture_float"))throw new Error("floating point textures not available");i=!0}this.type=n.FLOAT}else this.type=this.type||n.UNSIGNED_BYTE;n.pixelStorei(n.UNPACK_PREMULTIPLY_ALPHA_WEBGL,this.premultiplyAlpha),e!==this.width||r!==this.height?n.texImage2D(n.TEXTURE_2D,0,this.format,e,r,0,this.format,this.type,t||null):n.texSubImage2D(n.TEXTURE_2D,0,0,0,e,r,this.format,this.type,t||null),this.width=e,this.height=r},n.prototype.bind=function(t){var e=this.gl;void 0!==t&&e.activeTexture(e.TEXTURE0+t),e.bindTexture(e.TEXTURE_2D,this.texture)},n.prototype.unbind=function(){var t=this.gl;t.bindTexture(t.TEXTURE_2D,null)},n.prototype.minFilter=function(t){var e=this.gl;this.bind(),this.mipmap?e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,t?e.LINEAR_MIPMAP_LINEAR:e.NEAREST_MIPMAP_NEAREST):e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,t?e.LINEAR:e.NEAREST)},n.prototype.magFilter=function(t){var e=this.gl;this.bind(),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,t?e.LINEAR:e.NEAREST)},n.prototype.enableMipmap=function(){var t=this.gl;this.bind(),this.mipmap=!0,t.generateMipmap(t.TEXTURE_2D)},n.prototype.enableLinearScaling=function(){this.minFilter(!0),this.magFilter(!0)},n.prototype.enableNearestScaling=function(){this.minFilter(!1),this.magFilter(!1)},n.prototype.enableWrapClamp=function(){var t=this.gl;this.bind(),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE)},n.prototype.enableWrapRepeat=function(){var t=this.gl;this.bind(),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.REPEAT),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.REPEAT)},n.prototype.enableWrapMirrorRepeat=function(){var t=this.gl;this.bind(),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.MIRRORED_REPEAT),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.MIRRORED_REPEAT)},n.prototype.destroy=function(){this.gl.deleteTexture(this.texture)},n.fromSource=function(t,e,r){var i=new n(t);return i.premultiplyAlpha=r||!1,i.upload(e),i},n.fromData=function(t,e,r,i){var o=new n(t);return o.uploadData(e,r,i),o},e.exports=n},{}],13:[function(t,e,r){function n(t,e){if(this.nativeVaoExtension=null,n.FORCE_NATIVE||(this.nativeVaoExtension=t.getExtension("OES_vertex_array_object")||t.getExtension("MOZ_OES_vertex_array_object")||t.getExtension("WEBKIT_OES_vertex_array_object")),this.nativeState=e,this.nativeVaoExtension){this.nativeVao=this.nativeVaoExtension.createVertexArrayOES();var r=t.getParameter(t.MAX_VERTEX_ATTRIBS);this.nativeState={tempAttribState:new Array(r),attribState:new Array(r)}}this.gl=t,this.attributes=[],this.indexBuffer=null,this.dirty=!1}var i=t("./setVertexAttribArrays");n.prototype.constructor=n,e.exports=n,n.FORCE_NATIVE=!1,n.prototype.bind=function(){return this.nativeVao?(this.nativeVaoExtension.bindVertexArrayOES(this.nativeVao),this.dirty&&(this.dirty=!1,this.activate())):this.activate(),this},n.prototype.unbind=function(){return this.nativeVao&&this.nativeVaoExtension.bindVertexArrayOES(null),this},n.prototype.activate=function(){for(var t=this.gl,e=null,r=0;r1)for(var r=1;r1&&(n=r[0]+"@",t=r[1]),t=t.replace(D,"."),n+s(t.split("."),e).join(".")}function u(t){for(var e,r,n=[],i=0,o=t.length;i=55296&&e<=56319&&i65535&&(t-=65536,e+=B(t>>>10&1023|55296),t=56320|1023&t),e+=B(t)}).join("")}function l(t){return t-48<10?t-22:t-65<26?t-65:t-97<26?t-97:w}function c(t,e){return t+22+75*(t<26)-((0!=e)<<5)}function d(t,e,r){var n=0;for(t=r?F(t/M):t>>1,t+=F(t/e);t>N*S>>1;n+=w)t=F(t/N);return F(n+(N+1)*t/(t+O))}function f(t){var e,r,n,i,s,a,u,c,f,p,v=[],y=t.length,g=0,m=C,_=P;for(r=t.lastIndexOf(R),r<0&&(r=0),n=0;n=128&&o("not-basic"),v.push(t.charCodeAt(n));for(i=r>0?r+1:0;i=y&&o("invalid-input"),c=l(t.charCodeAt(i++)),(c>=w||c>F((T-g)/a))&&o("overflow"),g+=c*a,f=u<=_?E:u>=_+S?S:u-_,!(cF(T/p)&&o("overflow"),a*=p;e=v.length+1,_=d(g-s,e,0==s),F(g/e)>T-m&&o("overflow"),m+=F(g/e),g%=e,v.splice(g++,0,m)}return h(v)}function p(t){var e,r,n,i,s,a,h,l,f,p,v,y,g,m,_,b=[];for(t=u(t),y=t.length,e=C,r=0,s=P,a=0;a=e&&vF((T-r)/g)&&o("overflow"),r+=(h-e)*g,e=h,a=0;aT&&o("overflow"),v==e){for(l=r,f=w;p=f<=s?E:f>=s+S?S:f-s,!(l= 0x80 (not a basic code point)","invalid-input":"Invalid input"},N=w-E,F=Math.floor,B=String.fromCharCode;if(b={version:"1.4.1",ucs2:{decode:u,encode:h},decode:f,encode:p,toASCII:y,toUnicode:v},"function"==typeof t&&"object"==typeof t.amd&&t.amd)t("punycode",function(){return b});else if(g&&m)if(r.exports==g)m.exports=b;else for(x in b)b.hasOwnProperty(x)&&(g[x]=b[x]);else i.punycode=b}(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],28:[function(t,e,r){"use strict";function n(t,e){return Object.prototype.hasOwnProperty.call(t,e)}e.exports=function(t,e,r,o){e=e||"&",r=r||"=";var s={};if("string"!=typeof t||0===t.length)return s;var a=/\+/g;t=t.split(e);var u=1e3;o&&"number"==typeof o.maxKeys&&(u=o.maxKeys);var h=t.length;u>0&&h>u&&(h=u);for(var l=0;l=0?(c=v.substr(0,y),d=v.substr(y+1)):(c=v,d=""),f=decodeURIComponent(c),p=decodeURIComponent(d),n(s,f)?i(s[f])?s[f].push(p):s[f]=[s[f],p]:s[f]=p}return s};var i=Array.isArray||function(t){return"[object Array]"===Object.prototype.toString.call(t)}},{}],29:[function(t,e,r){"use strict";function n(t,e){if(t.map)return t.map(e);for(var r=[],n=0;n=i||0===r)){r=e+r>i?i-e:r;var o=i-r;for(n=e;n0&&void 0!==arguments[0]?arguments[0]:"",n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:10;i(this,t),this.baseUrl=r,this.progress=0,this.loading=!1,this.defaultQueryString="",this._beforeMiddleware=[],this._afterMiddleware=[],this._resourcesParsing=[],this._boundLoadResource=function(t,r){return e._loadResource(t,r)},this._queue=c.queue(this._boundLoadResource,n),this._queue.pause(),this.resources={},this.onProgress=new a.default,this.onError=new a.default,this.onLoad=new a.default,this.onStart=new a.default,this.onComplete=new a.default}return t.prototype.add=function(t,e,r,n){if(Array.isArray(t)){for(var i=0;i0?n=200:1223===n&&(n=204),2!=(n/100|0))return void this.abort("["+e.status+"] "+e.statusText+": "+e.responseURL);if(this.xhrType===t.XHR_RESPONSE_TYPE.TEXT)this.data=r,this.type=t.TYPE.TEXT;else if(this.xhrType===t.XHR_RESPONSE_TYPE.JSON)try{this.data=JSON.parse(r),this.type=t.TYPE.JSON}catch(t){return void this.abort("Error trying to parse loaded json: "+t)}else if(this.xhrType===t.XHR_RESPONSE_TYPE.DOCUMENT)try{if(window.DOMParser){var i=new DOMParser;this.data=i.parseFromString(r,"text/xml")}else{var o=document.createElement("div");o.innerHTML=r,this.data=o}this.type=t.TYPE.XML}catch(t){return void this.abort("Error trying to parse loaded xml: "+t)}else this.data=e.response||r;this.complete()},t.prototype._determineCrossOrigin=function(t,e){if(0===t.indexOf("data:"))return"";e=e||window.location,p||(p=document.createElement("a")),p.href=t,t=(0,l.default)(p.href,{strictMode:!0});var r=!t.port&&""===e.port||t.port===e.port,n=t.protocol?t.protocol+":":"";return t.host===e.hostname&&r&&n===e.protocol?"":"anonymous"},t.prototype._determineXhrType=function(){return t._xhrTypeMap[this.extension]||t.XHR_RESPONSE_TYPE.TEXT},t.prototype._determineLoadType=function(){return t._loadTypeMap[this.extension]||t.LOAD_TYPE.XHR},t.prototype._getExtension=function(){var t=this.url,e="";if(this.isDataUrl){var r=t.indexOf("/");e=t.substring(r+1,t.indexOf(";",r))}else{var n=t.indexOf("?"),i=t.indexOf("#"),o=Math.min(n>-1?n:t.length,i>-1?i:t.length);t=t.substring(0,o),e=t.substring(t.lastIndexOf(".")+1)}return e.toLowerCase()},t.prototype._getMimeFromXhrType=function(e){switch(e){case t.XHR_RESPONSE_TYPE.BUFFER:return"application/octet-binary";case t.XHR_RESPONSE_TYPE.BLOB:return"application/blob";case t.XHR_RESPONSE_TYPE.DOCUMENT:return"application/xml";case t.XHR_RESPONSE_TYPE.JSON:return"application/json";case t.XHR_RESPONSE_TYPE.DEFAULT:case t.XHR_RESPONSE_TYPE.TEXT:default:return"text/plain"}},u(t,[{key:"isDataUrl",get:function(){return this._hasFlag(t.STATUS_FLAGS.DATA_URL)}},{key:"isComplete",get:function(){return this._hasFlag(t.STATUS_FLAGS.COMPLETE)}},{key:"isLoading",get:function(){return this._hasFlag(t.STATUS_FLAGS.LOADING)}}]),t}();r.default=v,v.STATUS_FLAGS={NONE:0,DATA_URL:1,COMPLETE:2,LOADING:4},v.TYPE={UNKNOWN:0,JSON:1,XML:2,IMAGE:3,AUDIO:4,VIDEO:5,TEXT:6},v.LOAD_TYPE={XHR:1,IMAGE:2,AUDIO:3,VIDEO:4},v.XHR_RESPONSE_TYPE={DEFAULT:"text",BUFFER:"arraybuffer",BLOB:"blob",DOCUMENT:"document",JSON:"json",TEXT:"text"},v._loadTypeMap={gif:v.LOAD_TYPE.IMAGE,png:v.LOAD_TYPE.IMAGE,bmp:v.LOAD_TYPE.IMAGE,jpg:v.LOAD_TYPE.IMAGE,jpeg:v.LOAD_TYPE.IMAGE,tif:v.LOAD_TYPE.IMAGE,tiff:v.LOAD_TYPE.IMAGE,webp:v.LOAD_TYPE.IMAGE,tga:v.LOAD_TYPE.IMAGE,svg:v.LOAD_TYPE.IMAGE,"svg+xml":v.LOAD_TYPE.IMAGE,mp3:v.LOAD_TYPE.AUDIO,ogg:v.LOAD_TYPE.AUDIO,wav:v.LOAD_TYPE.AUDIO,mp4:v.LOAD_TYPE.VIDEO,webm:v.LOAD_TYPE.VIDEO},v._xhrTypeMap={xhtml:v.XHR_RESPONSE_TYPE.DOCUMENT,html:v.XHR_RESPONSE_TYPE.DOCUMENT,htm:v.XHR_RESPONSE_TYPE.DOCUMENT,xml:v.XHR_RESPONSE_TYPE.DOCUMENT,tmx:v.XHR_RESPONSE_TYPE.DOCUMENT,svg:v.XHR_RESPONSE_TYPE.DOCUMENT,tsx:v.XHR_RESPONSE_TYPE.DOCUMENT,gif:v.XHR_RESPONSE_TYPE.BLOB,png:v.XHR_RESPONSE_TYPE.BLOB,bmp:v.XHR_RESPONSE_TYPE.BLOB,jpg:v.XHR_RESPONSE_TYPE.BLOB,jpeg:v.XHR_RESPONSE_TYPE.BLOB,tif:v.XHR_RESPONSE_TYPE.BLOB,tiff:v.XHR_RESPONSE_TYPE.BLOB,webp:v.XHR_RESPONSE_TYPE.BLOB,tga:v.XHR_RESPONSE_TYPE.BLOB,json:v.XHR_RESPONSE_TYPE.JSON,text:v.XHR_RESPONSE_TYPE.TEXT,txt:v.XHR_RESPONSE_TYPE.TEXT,ttf:v.XHR_RESPONSE_TYPE.BUFFER,otf:v.XHR_RESPONSE_TYPE.BUFFER},v.EMPTY_GIF="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=="},{"mini-signals":5,"parse-uri":7}],34:[function(t,e,r){"use strict";function n(){}function i(t,e,r,n){var i=0,o=t.length;!function s(a){if(a||i===o)return void(r&&r(a));n?setTimeout(function(){e(t[i++],s)},1):e(t[i++],s)}()}function o(t){return function(){if(null===t)throw new Error("Callback was already called.");var e=t;t=null,e.apply(this,arguments)}}function s(t,e){function r(t,e,r){if(null!=r&&"function"!=typeof r)throw new Error("task callback must be a function");if(a.started=!0,null==t&&a.idle())return void setTimeout(function(){return a.drain()},1);var i={data:t,callback:"function"==typeof r?r:n};e?a._tasks.unshift(i):a._tasks.push(i),setTimeout(function(){return a.process()},1)}function i(t){return function(){s-=1,t.callback.apply(t,arguments),null!=arguments[0]&&a.error(arguments[0],t.data),s<=a.concurrency-a.buffer&&a.unsaturated(),a.idle()&&a.drain(),a.process()}}if(null==e)e=1;else if(0===e)throw new Error("Concurrency must not be zero");var s=0,a={_tasks:[],concurrency:e,saturated:n,unsaturated:n,buffer:e/4,empty:n,drain:n,error:n,started:!1,paused:!1,push:function(t,e){r(t,!1,e)},kill:function(){s=0,a.drain=n,a.started=!1,a._tasks=[]},unshift:function(t,e){r(t,!0,e)},process:function(){for(;!a.paused&&s>2,o[1]=(3&n[0])<<4|n[1]>>4,o[2]=(15&n[1])<<2|n[2]>>6,o[3]=63&n[2];switch(r-(t.length-1)){case 2:o[3]=64,o[2]=64;break;case 1:o[3]=64}for(var a=0;a",'"',"`"," ","\r","\n","\t"],p=["{","}","|","\\","^","`"].concat(f),v=["'"].concat(p),y=["%","/","?",";","#"].concat(v),g=["/","?","#"],m=/^[+a-z0-9A-Z_-]{0,63}$/,_=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,b={javascript:!0,"javascript:":!0},x={javascript:!0,"javascript:":!0},T={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0},w=t("querystring");n.prototype.parse=function(t,e,r){if(!h.isString(t))throw new TypeError("Parameter 'url' must be a string, not "+typeof t);var n=t.indexOf("?"),i=-1!==n&&n127?L+="x":L+=D[N];if(!L.match(m)){var B=A.slice(0,O),k=A.slice(O+1),j=D.match(_);j&&(B.push(j[1]),k.unshift(j[2])),k.length&&(a="/"+k.join(".")+a),this.hostname=B.join(".");break}}}this.hostname.length>255?this.hostname="":this.hostname=this.hostname.toLowerCase(),R||(this.hostname=u.toASCII(this.hostname));var U=this.port?":"+this.port:"",X=this.hostname||"";this.host=X+U,this.href+=this.host,R&&(this.hostname=this.hostname.substr(1,this.hostname.length-2),"/"!==a[0]&&(a="/"+a))}if(!b[p])for(var O=0,I=v.length;O0)&&r.host.split("@");S&&(r.auth=S.shift(),r.host=r.hostname=S.shift())}return r.search=t.search,r.query=t.query,h.isNull(r.pathname)&&h.isNull(r.search)||(r.path=(r.pathname?r.pathname:"")+(r.search?r.search:"")),r.href=r.format(),r}if(!w.length)return r.pathname=null,r.search?r.path="/"+r.search:r.path=null,r.href=r.format(),r;for(var O=w.slice(-1)[0],M=(r.host||t.host||w.length>1)&&("."===O||".."===O)||""===O,P=0,C=w.length;C>=0;C--)O=w[C],"."===O?w.splice(C,1):".."===O?(w.splice(C,1),P++):P&&(w.splice(C,1),P--);if(!_&&!b)for(;P--;P)w.unshift("..");!_||""===w[0]||w[0]&&"/"===w[0].charAt(0)||w.unshift(""),M&&"/"!==w.join("/").substr(-1)&&w.push("");var R=""===w[0]||w[0]&&"/"===w[0].charAt(0);if(E){r.hostname=r.host=R?"":w.length?w.shift():"";var S=!!(r.host&&r.host.indexOf("@")>0)&&r.host.split("@");S&&(r.auth=S.shift(),r.host=r.hostname=S.shift())}return _=_||r.host&&w.length,_&&!R&&w.unshift(""),w.length?r.pathname=w.join("/"):(r.pathname=null,r.path=null),h.isNull(r.pathname)&&h.isNull(r.search)||(r.path=(r.pathname?r.pathname:"")+(r.search?r.search:"")),r.auth=t.auth||r.auth,r.slashes=r.slashes||t.slashes,r.href=r.format(),r},n.prototype.parseHost=function(){var t=this.host,e=c.exec(t);e&&(e=e[0],":"!==e&&(this.port=e.substr(1)),t=t.substr(0,t.length-e.length)),t&&(this.hostname=t)}},{"./util":39,punycode:27,querystring:30}],39:[function(t,e,r){"use strict";e.exports={isString:function(t){return"string"==typeof t},isObject:function(t){return"object"==typeof t&&null!==t},isNull:function(t){return null===t},isNullOrUndefined:function(t){return null==t}}},{}],40:[function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.__esModule=!0;var o=t("../core"),s=function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e.default=t,e}(o),a=t("ismobilejs"),u=n(a),h=t("./accessibleTarget"),l=n(h);s.utils.mixins.delayMixin(s.DisplayObject.prototype,l.default);var c=100,d=0,f=0,p=2,v=function(){function t(e){i(this,t),!u.default.tablet&&!u.default.phone||navigator.isCocoonJS||this.createTouchHook();var r=document.createElement("div");r.style.width=c+"px",r.style.height=c+"px",r.style.position="absolute",r.style.top=d+"px",r.style.left=f+"px",r.style.zIndex=p,this.div=r,this.pool=[],this.renderId=0,this.debug=!1,this.renderer=e,this.children=[],this._onKeyDown=this._onKeyDown.bind(this),this._onMouseMove=this._onMouseMove.bind(this),this.isActive=!1,this.isMobileAccessabillity=!1,window.addEventListener("keydown",this._onKeyDown,!1)}return t.prototype.createTouchHook=function(){var t=this,e=document.createElement("button");e.style.width="1px",e.style.height="1px",e.style.position="absolute",e.style.top="-1000px",e.style.left="-1000px",e.style.zIndex=2,e.style.backgroundColor="#FF0000",e.title="HOOK DIV",e.addEventListener("focus",function(){t.isMobileAccessabillity=!0,t.activate(),document.body.removeChild(e)}),document.body.appendChild(e)},t.prototype.activate=function(){this.isActive||(this.isActive=!0,window.document.addEventListener("mousemove",this._onMouseMove,!0),window.removeEventListener("keydown",this._onKeyDown,!1),this.renderer.on("postrender",this.update,this),this.renderer.view.parentNode&&this.renderer.view.parentNode.appendChild(this.div))},t.prototype.deactivate=function(){this.isActive&&!this.isMobileAccessabillity&&(this.isActive=!1,window.document.removeEventListener("mousemove",this._onMouseMove),window.addEventListener("keydown",this._onKeyDown,!1),this.renderer.off("postrender",this.update),this.div.parentNode&&this.div.parentNode.removeChild(this.div))},t.prototype.updateAccessibleObjects=function(t){if(t.visible){t.accessible&&t.interactive&&(t._accessibleActive||this.addChild(t),t.renderId=this.renderId);for(var e=t.children,r=e.length-1;r>=0;r--)this.updateAccessibleObjects(e[r])}},t.prototype.update=function(){if(this.renderer.renderingToScreen){this.updateAccessibleObjects(this.renderer._lastObjectRendered);var t=this.renderer.view.getBoundingClientRect(),e=t.width/this.renderer.width,r=t.height/this.renderer.height,n=this.div;n.style.left=t.left+"px",n.style.top=t.top+"px",n.style.width=this.renderer.width+"px",n.style.height=this.renderer.height+"px";for(var i=0;ithis.renderer.width&&(t.width=this.renderer.width-t.x),t.y+t.height>this.renderer.height&&(t.height=this.renderer.height-t.y)},t.prototype.addChild=function(t){var e=this.pool.pop();e||(e=document.createElement("button"),e.style.width=c+"px",e.style.height=c+"px",e.style.backgroundColor=this.debug?"rgba(255,0,0,0.5)":"transparent",e.style.position="absolute",e.style.zIndex=p,e.style.borderStyle="none",e.addEventListener("click",this._onClick.bind(this)),e.addEventListener("focus",this._onFocus.bind(this)),e.addEventListener("focusout",this._onFocusOut.bind(this))),t.accessibleTitle?e.title=t.accessibleTitle:t.accessibleTitle||t.accessibleHint||(e.title="displayObject "+this.tabIndex),t.accessibleHint&&e.setAttribute("aria-label",t.accessibleHint),t._accessibleActive=!0,t._accessibleDiv=e,e.displayObject=t,this.children.push(t),this.div.appendChild(t._accessibleDiv),t._accessibleDiv.tabIndex=t.tabIndex},t.prototype._onClick=function(t){var e=this.renderer.plugins.interaction;e.dispatchEvent(t.target.displayObject,"click",e.eventData)},t.prototype._onFocus=function(t){var e=this.renderer.plugins.interaction;e.dispatchEvent(t.target.displayObject,"mouseover",e.eventData)},t.prototype._onFocusOut=function(t){var e=this.renderer.plugins.interaction;e.dispatchEvent(t.target.displayObject,"mouseout",e.eventData)},t.prototype._onKeyDown=function(t){9===t.keyCode&&this.activate()},t.prototype._onMouseMove=function(){this.deactivate()},t.prototype.destroy=function(){this.div=null;for(var t=0;t]*(?:\s(width|height)=('|")(\d*(?:\.\d+)?)(?:px)?('|"))[^>]*(?:\s(width|height)=('|")(\d*(?:\.\d+)?)(?:px)?('|"))[^>]*>/i,r.SHAPES={POLY:0,RECT:1,CIRC:2,ELIP:3,RREC:4},r.PRECISION={LOW:"lowp",MEDIUM:"mediump",HIGH:"highp"},r.TRANSFORM_MODE={STATIC:0,DYNAMIC:1},r.TEXT_GRADIENT={LINEAR_VERTICAL:0,LINEAR_HORIZONTAL:1},r.UPDATE_PRIORITY={INTERACTION:50,HIGH:25,NORMAL:0,LOW:-25,UTILITY:-50}},{}],47:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.__esModule=!0;var i=t("../math"),o=function(){function t(){n(this,t),this.minX=1/0,this.minY=1/0,this.maxX=-1/0,this.maxY=-1/0,this.rect=null}return t.prototype.isEmpty=function(){return this.minX>this.maxX||this.minY>this.maxY},t.prototype.clear=function(){this.updateID++,this.minX=1/0,this.minY=1/0,this.maxX=-1/0,this.maxY=-1/0},t.prototype.getRectangle=function(t){return this.minX>this.maxX||this.minY>this.maxY?i.Rectangle.EMPTY:(t=t||new i.Rectangle(0,0,1,1),t.x=this.minX,t.y=this.minY,t.width=this.maxX-this.minX,t.height=this.maxY-this.minY,t)},t.prototype.addPoint=function(t){this.minX=Math.min(this.minX,t.x),this.maxX=Math.max(this.maxX,t.x),this.minY=Math.min(this.minY,t.y),this.maxY=Math.max(this.maxY,t.y)},t.prototype.addQuad=function(t){var e=this.minX,r=this.minY,n=this.maxX,i=this.maxY,o=t[0],s=t[1];e=on?o:n,i=s>i?s:i,o=t[2],s=t[3],e=on?o:n,i=s>i?s:i,o=t[4],s=t[5],e=on?o:n,i=s>i?s:i,o=t[6],s=t[7],e=on?o:n,i=s>i?s:i,this.minX=e,this.minY=r,this.maxX=n,this.maxY=i},t.prototype.addFrame=function(t,e,r,n,i){var o=t.worldTransform,s=o.a,a=o.b,u=o.c,h=o.d,l=o.tx,c=o.ty,d=this.minX,f=this.minY,p=this.maxX,v=this.maxY,y=s*e+u*r+l,g=a*e+h*r+c;d=yp?y:p,v=g>v?g:v,y=s*n+u*r+l,g=a*n+h*r+c,d=yp?y:p,v=g>v?g:v,y=s*e+u*i+l,g=a*e+h*i+c,d=yp?y:p,v=g>v?g:v,y=s*n+u*i+l,g=a*n+h*i+c,d=yp?y:p,v=g>v?g:v,this.minX=d,this.minY=f,this.maxX=p,this.maxY=v},t.prototype.addVertices=function(t,e,r,n){for(var i=t.worldTransform,o=i.a,s=i.b,a=i.c,u=i.d,h=i.tx,l=i.ty,c=this.minX,d=this.minY,f=this.maxX,p=this.maxY,v=r;vf?m:f,p=_>p?_:p}this.minX=c,this.minY=d,this.maxX=f,this.maxY=p},t.prototype.addBounds=function(t){var e=this.minX,r=this.minY,n=this.maxX,i=this.maxY;this.minX=t.minXn?t.maxX:n,this.maxY=t.maxY>i?t.maxY:i},t.prototype.addBoundsMask=function(t,e){var r=t.minX>e.minX?t.minX:e.minX,n=t.minY>e.minY?t.minY:e.minY,i=t.maxXu?i:u,this.maxY=o>h?o:h}},t.prototype.addBoundsArea=function(t,e){var r=t.minX>e.x?t.minX:e.x,n=t.minY>e.y?t.minY:e.y,i=t.maxXu?i:u,this.maxY=o>h?o:h}},t}();r.default=o},{"../math":70}],48:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}r.__esModule=!0;var s=function(){function t(t,e){for(var r=0;r1)for(var r=0;rthis.children.length)throw new Error(t+"addChildAt: The index "+e+" supplied is out of bounds "+this.children.length);return t.parent&&t.parent.removeChild(t),t.parent=this,t.transform._parentID=-1,this.children.splice(e,0,t),this._boundsID++,this.onChildrenChange(e),t.emit("added",this),t},e.prototype.swapChildren=function(t,e){if(t!==e){var r=this.getChildIndex(t),n=this.getChildIndex(e);this.children[r]=e,this.children[n]=t,this.onChildrenChange(r=this.children.length)throw new Error("The supplied index is out of bounds");var r=this.getChildIndex(t);(0,a.removeItems)(this.children,r,1),this.children.splice(e,0,t),this.onChildrenChange(e)},e.prototype.getChildAt=function(t){if(t<0||t>=this.children.length)throw new Error("getChildAt: Index ("+t+") does not exist.");return this.children[t]},e.prototype.removeChild=function(t){var e=arguments.length;if(e>1)for(var r=0;r0&&void 0!==arguments[0]?arguments[0]:0,e=arguments[1],r=t,n="number"==typeof e?e:this.children.length,i=n-r,o=void 0;if(i>0&&i<=n){o=this.children.splice(r,i);for(var s=0;s2&&void 0!==arguments[2]&&arguments[2]||(this._recursivePostUpdateTransform(),this.parent?this.displayObjectUpdateTransform():(this.parent=this._tempDisplayObjectParent,this.displayObjectUpdateTransform(),this.parent=null)),this.worldTransform.apply(t,e)},e.prototype.toLocal=function(t,e,r,n){return e&&(t=e.toGlobal(t,r,n)),n||(this._recursivePostUpdateTransform(),this.parent?this.displayObjectUpdateTransform():(this.parent=this._tempDisplayObjectParent,this.displayObjectUpdateTransform(),this.parent=null)),this.worldTransform.applyInverse(t,r)},e.prototype.renderWebGL=function(t){},e.prototype.renderCanvas=function(t){},e.prototype.setParent=function(t){if(!t||!t.addChild)throw new Error("setParent: Argument must be a Container");return t.addChild(this),t},e.prototype.setTransform=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1,n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:1,i=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,o=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,s=arguments.length>6&&void 0!==arguments[6]?arguments[6]:0,a=arguments.length>7&&void 0!==arguments[7]?arguments[7]:0,u=arguments.length>8&&void 0!==arguments[8]?arguments[8]:0;return this.position.x=t,this.position.y=e,this.scale.x=r||1,this.scale.y=n||1,this.rotation=i,this.skew.x=o,this.skew.y=s,this.pivot.x=a,this.pivot.y=u,this},e.prototype.destroy=function(){this.removeAllListeners(),this.parent&&this.parent.removeChild(this),this.transform=null,this.parent=null,this._bounds=null,this._currentBounds=null,this._mask=null,this.filterArea=null,this.interactive=!1,this.interactiveChildren=!1,this._destroyed=!0},a(e,[{key:"_tempDisplayObjectParent",get:function(){return null===this.tempDisplayObjectParent&&(this.tempDisplayObjectParent=new e),this.tempDisplayObjectParent}},{key:"x",get:function(){return this.position.x},set:function(t){this.transform.position.x=t}},{key:"y",get:function(){return this.position.y},set:function(t){this.transform.position.y=t}},{key:"worldTransform",get:function(){return this.transform.worldTransform}},{key:"localTransform",get:function(){return this.transform.localTransform}},{key:"position",get:function(){return this.transform.position},set:function(t){this.transform.position.copy(t)}},{key:"scale",get:function(){return this.transform.scale},set:function(t){this.transform.scale.copy(t)}},{key:"pivot",get:function(){return this.transform.pivot},set:function(t){this.transform.pivot.copy(t)}},{key:"skew",get:function(){return this.transform.skew},set:function(t){this.transform.skew.copy(t)}},{key:"rotation",get:function(){return this.transform.rotation},set:function(t){this.transform.rotation=t}},{key:"worldVisible",get:function(){var t=this;do{if(!t.visible)return!1;t=t.parent}while(t);return!0}},{key:"mask",get:function(){return this._mask},set:function(t){this._mask&&(this._mask.renderable=!0),this._mask=t,this._mask&&(this._mask.renderable=!1)}},{key:"filters",get:function(){return this._filters&&this._filters.slice()},set:function(t){this._filters=t&&t.slice()}}]),e}(h.default);r.default=b,b.prototype.displayObjectUpdateTransform=b.prototype.updateTransform},{"../const":46,"../math":70,"../settings":101,"./Bounds":47,"./Transform":50,"./TransformStatic":52,eventemitter3:3}],50:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}r.__esModule=!0;var s=function(){function t(t,e){for(var r=0;r0&&void 0!==arguments[0]&&arguments[0];i(this,e);var n=o(this,t.call(this));return n.fillAlpha=1,n.lineWidth=0,n.nativeLines=r,n.lineColor=0,n.graphicsData=[],n.tint=16777215,n._prevTint=16777215,n.blendMode=_.BLEND_MODES.NORMAL,n.currentPath=null,n._webGL={},n.isMask=!1,n.boundsPadding=0,n._localBounds=new x.default,n.dirty=0,n.fastRectDirty=-1,n.clearDirty=0,n.boundsDirty=-1,n.cachedSpriteDirty=!1,n._spriteRect=null,n._fastRect=!1,n}return s(e,t),e.prototype.clone=function(){var t=new e;t.renderable=this.renderable,t.fillAlpha=this.fillAlpha,t.lineWidth=this.lineWidth,t.lineColor=this.lineColor,t.tint=this.tint,t.blendMode=this.blendMode,t.isMask=this.isMask,t.boundsPadding=this.boundsPadding,t.dirty=0,t.cachedSpriteDirty=this.cachedSpriteDirty;for(var r=0;r0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1;if(this.lineWidth=t,this.lineColor=e,this.lineAlpha=r,this.currentPath)if(this.currentPath.shape.points.length){var n=new g.Polygon(this.currentPath.shape.points.slice(-2));n.closed=!1,this.drawShape(n)}else this.currentPath.lineWidth=this.lineWidth,this.currentPath.lineColor=this.lineColor,this.currentPath.lineAlpha=this.lineAlpha;return this},e.prototype.moveTo=function(t,e){var r=new g.Polygon([t,e]);return r.closed=!1,this.drawShape(r),this},e.prototype.lineTo=function(t,e){return this.currentPath.shape.points.push(t,e),this.dirty++,this},e.prototype.quadraticCurveTo=function(t,e,r,n){this.currentPath?0===this.currentPath.shape.points.length&&(this.currentPath.shape.points=[0,0]):this.moveTo(0,0);var i=this.currentPath.shape.points,o=0,s=0;0===i.length&&this.moveTo(0,0);for(var a=i[i.length-2],u=i[i.length-1],h=1;h<=20;++h){var l=h/20;o=a+(t-a)*l,s=u+(e-u)*l,i.push(o+(t+(r-t)*l-o)*l,s+(e+(n-e)*l-s)*l)}return this.dirty++,this},e.prototype.bezierCurveTo=function(t,e,r,n,i,o){this.currentPath?0===this.currentPath.shape.points.length&&(this.currentPath.shape.points=[0,0]):this.moveTo(0,0);var s=this.currentPath.shape.points,a=s[s.length-2],u=s[s.length-1];return s.length-=2,(0,w.default)(a,u,t,e,r,n,i,o,s),this.dirty++,this},e.prototype.arcTo=function(t,e,r,n,i){this.currentPath?0===this.currentPath.shape.points.length&&this.currentPath.shape.points.push(t,e):this.moveTo(t,e);var o=this.currentPath.shape.points,s=o[o.length-2],a=o[o.length-1],u=a-e,h=s-t,l=n-e,c=r-t,d=Math.abs(u*c-h*l);if(d<1e-8||0===i)o[o.length-2]===t&&o[o.length-1]===e||o.push(t,e);else{var f=u*u+h*h,p=l*l+c*c,v=u*l+h*c,y=i*Math.sqrt(f)/d,g=i*Math.sqrt(p)/d,m=y*v/f,_=g*v/p,b=y*c+g*h,x=y*l+g*u,T=h*(g+m),w=u*(g+m),E=c*(y+_),S=l*(y+_),O=Math.atan2(w-x,T-b),M=Math.atan2(S-x,E-b);this.arc(b+t,x+e,i,O,M,h*l>c*u)}return this.dirty++,this},e.prototype.arc=function(t,e,r,n,i){var o=arguments.length>5&&void 0!==arguments[5]&&arguments[5];if(n===i)return this;!o&&i<=n?i+=2*Math.PI:o&&n<=i&&(n+=2*Math.PI);var s=i-n,a=40*Math.ceil(Math.abs(s)/(2*Math.PI));if(0===s)return this;var u=t+Math.cos(n)*r,h=e+Math.sin(n)*r,l=this.currentPath?this.currentPath.shape.points:null;l?l[l.length-2]===u&&l[l.length-1]===h||l.push(u,h):(this.moveTo(u,h),l=this.currentPath.shape.points);for(var c=s/(2*a),d=2*c,f=Math.cos(c),p=Math.sin(c),v=a-1,y=v%1/v,g=0;g<=v;++g){var m=g+y*g,_=c+n+d*m,b=Math.cos(_),x=-Math.sin(_);l.push((f*b+p*x)*r+t,(f*-x+p*b)*r+e)}return this.dirty++,this},e.prototype.beginFill=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return this.filling=!0,this.fillColor=t,this.fillAlpha=e,this.currentPath&&this.currentPath.shape.points.length<=2&&(this.currentPath.fill=this.filling,this.currentPath.fillColor=this.fillColor,this.currentPath.fillAlpha=this.fillAlpha),this},e.prototype.endFill=function(){return this.filling=!1,this.fillColor=null,this.fillAlpha=1,this},e.prototype.drawRect=function(t,e,r,n){return this.drawShape(new g.Rectangle(t,e,r,n)),this},e.prototype.drawRoundedRect=function(t,e,r,n,i){return this.drawShape(new g.RoundedRectangle(t,e,r,n,i)),this},e.prototype.drawCircle=function(t,e,r){return this.drawShape(new g.Circle(t,e,r)),this},e.prototype.drawEllipse=function(t,e,r,n){return this.drawShape(new g.Ellipse(t,e,r,n)),this},e.prototype.drawPolygon=function(t){var e=t,r=!0;if(e instanceof g.Polygon&&(r=e.closed,e=e.points),!Array.isArray(e)){e=new Array(arguments.length);for(var n=0;n0)&&(this.lineWidth=0,this.filling=!1,this.boundsDirty=-1,this.dirty++,this.clearDirty++,this.graphicsData.length=0),this.currentPath=null,this._spriteRect=null,this},e.prototype.isFastRect=function(){return 1===this.graphicsData.length&&this.graphicsData[0].shape.type===_.SHAPES.RECT&&!this.graphicsData[0].lineWidth},e.prototype._renderWebGL=function(t){this.dirty!==this.fastRectDirty&&(this.fastRectDirty=this.dirty,this._fastRect=this.isFastRect()),this._fastRect?this._renderSpriteRect(t):(t.setObjectRenderer(t.plugins.graphics),t.plugins.graphics.render(this))},e.prototype._renderSpriteRect=function(t){var e=this.graphicsData[0].shape;this._spriteRect||(this._spriteRect=new y.default(new d.default(d.default.WHITE)));var r=this._spriteRect;if(16777215===this.tint)r.tint=this.graphicsData[0].fillColor;else{var n=C,i=R;(0,m.hex2rgb)(this.graphicsData[0].fillColor,n),(0,m.hex2rgb)(this.tint,i),n[0]*=i[0],n[1]*=i[1],n[2]*=i[2],r.tint=(0,m.rgb2hex)(n)}r.alpha=this.graphicsData[0].fillAlpha,r.worldAlpha=this.worldAlpha*r.alpha,r.blendMode=this.blendMode,r._texture._frame.width=e.width,r._texture._frame.height=e.height,r.transform.worldTransform=this.transform.worldTransform,r.anchor.set(-e.x/e.width,-e.y/e.height),r._onAnchorUpdate(),r._renderWebGL(t)},e.prototype._renderCanvas=function(t){!0!==this.isMask&&t.plugins.graphics.render(this)},e.prototype._calculateBounds=function(){this.boundsDirty!==this.dirty&&(this.boundsDirty=this.dirty,this.updateLocalBounds(),this.cachedSpriteDirty=!0);var t=this._localBounds;this._bounds.addFrame(this.transform,t.minX,t.minY,t.maxX,t.maxY)},e.prototype.containsPoint=function(t){this.worldTransform.applyInverse(t,P);for(var e=this.graphicsData,r=0;re?o+a:e,r=sn?s+u:n;else if(c===_.SHAPES.CIRC)o=i.x,s=i.y,a=i.radius+d/2,u=i.radius+d/2,t=o-ae?o+a:e,r=s-un?s+u:n;else if(c===_.SHAPES.ELIP)o=i.x,s=i.y,a=i.width+d/2,u=i.height+d/2,t=o-ae?o+a:e,r=s-un?s+u:n;else for(var f=i.points,p=0,v=0,y=0,g=0,m=0,b=0,x=0,T=0,w=0;w+2e?x+m:e,r=T-bn?T+b:n)}else t=0,e=0,r=0,n=0;var E=this.boundsPadding;this._localBounds.minX=t-E,this._localBounds.maxX=e+E,this._localBounds.minY=r-E,this._localBounds.maxY=n+E},e.prototype.drawShape=function(t){this.currentPath&&this.currentPath.shape.points.length<=2&&this.graphicsData.pop(),this.currentPath=null;var e=new p.default(this.lineWidth,this.lineColor,this.lineAlpha,this.fillColor,this.fillAlpha,this.filling,this.nativeLines,t);return this.graphicsData.push(e),e.type===_.SHAPES.POLY&&(e.shape.closed=e.shape.closed||this.filling,this.currentPath=e),this.dirty++,e},e.prototype.generateCanvasTexture=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,r=this.getLocalBounds(),n=l.default.create(r.width,r.height,t,e);O||(O=new S.default),this.transform.updateLocalTransform(),this.transform.localTransform.copy(M),M.invert(),M.tx-=r.x,M.ty-=r.y,O.render(this,n,!0,M);var i=d.default.fromCanvas(n.baseTexture._canvasRenderTarget.canvas,t,"graphics");return i.baseTexture.resolution=e,i.baseTexture.update(),i},e.prototype.closePath=function(){var t=this.currentPath;return t&&t.shape&&t.shape.close(),this},e.prototype.addHole=function(){var t=this.graphicsData.pop();return this.currentPath=this.graphicsData[this.graphicsData.length-1],this.currentPath.addHole(t.shape),this.currentPath=null,this},e.prototype.destroy=function(e){t.prototype.destroy.call(this,e);for(var r=0;rP?P:M,r.beginPath(),r.moveTo(w,E+M),r.lineTo(w,E+O-M),r.quadraticCurveTo(w,E+O,w+M,E+O),r.lineTo(w+S-M,E+O),r.quadraticCurveTo(w+S,E+O,w+S,E+O-M),r.lineTo(w+S,E+M),r.quadraticCurveTo(w+S,E,w+S-M,E),r.lineTo(w+M,E),r.quadraticCurveTo(w,E,w,E+M),r.closePath(),(u.fillColor||0===u.fillColor)&&(r.globalAlpha=u.fillAlpha*n,r.fillStyle="#"+("00000"+(0|l).toString(16)).substr(-6),r.fill()),u.lineWidth&&(r.globalAlpha=u.lineAlpha*n,r.strokeStyle="#"+("00000"+(0|c).toString(16)).substr(-6),r.stroke())}}},t.prototype.updateGraphicsTint=function(t){t._prevTint=t.tint;for(var e=(t.tint>>16&255)/255,r=(t.tint>>8&255)/255,n=(255&t.tint)/255,i=0;i>16&255)/255*e*255<<16)+((s>>8&255)/255*r*255<<8)+(255&s)/255*n*255,o._lineTint=((a>>16&255)/255*e*255<<16)+((a>>8&255)/255*r*255<<8)+(255&a)/255*n*255}},t.prototype.renderPolygon=function(t,e,r){r.moveTo(t[0],t[1]);for(var n=1;n8&&void 0!==arguments[8]?arguments[8]:[],h=0,l=0,c=0,d=0,f=0;u.push(t,e);for(var p=1,v=0;p<=20;++p)v=p/20,h=1-v,l=h*h,c=l*h,d=v*v,f=d*v,u.push(c*t+3*l*v*r+3*h*d*i+f*s,c*e+3*l*v*n+3*h*d*o+f*a);return u}r.__esModule=!0,r.default=n},{}],57:[function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}r.__esModule=!0;var a=t("../../utils"),u=t("../../const"),h=t("../../renderers/webgl/utils/ObjectRenderer"),l=n(h),c=t("../../renderers/webgl/WebGLRenderer"),d=n(c),f=t("./WebGLGraphicsData"),p=n(f),v=t("./shaders/PrimitiveShader"),y=n(v),g=t("./utils/buildPoly"),m=n(g),_=t("./utils/buildRectangle"),b=n(_),x=t("./utils/buildRoundedRectangle"),T=n(x),w=t("./utils/buildCircle"),E=n(w),S=function(t){function e(r){i(this,e);var n=o(this,t.call(this,r));return n.graphicsDataPool=[],n.primitiveShader=null,n.gl=r.gl,n.CONTEXT_UID=0,n}return s(e,t),e.prototype.onContextChange=function(){this.gl=this.renderer.gl,this.CONTEXT_UID=this.renderer.CONTEXT_UID,this.primitiveShader=new y.default(this.gl)},e.prototype.destroy=function(){l.default.prototype.destroy.call(this);for(var t=0;t32e4)&&(n=this.graphicsDataPool.pop()||new p.default(this.renderer.gl,this.primitiveShader,this.renderer.state.attribsState),n.nativeLines=r,n.reset(e),t.data.push(n)),n.dirty=!0,n},e}(l.default);r.default=S,d.default.registerPlugin("graphics",S)},{"../../const":46,"../../renderers/webgl/WebGLRenderer":84,"../../renderers/webgl/utils/ObjectRenderer":94,"../../utils":125,"./WebGLGraphicsData":58,"./shaders/PrimitiveShader":59,"./utils/buildCircle":60,"./utils/buildPoly":62,"./utils/buildRectangle":63,"./utils/buildRoundedRectangle":64}],58:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.__esModule=!0;var i=t("pixi-gl-core"),o=function(t){return t&&t.__esModule?t:{default:t}}(i),s=function(){function t(e,r,i){n(this,t),this.gl=e,this.color=[0,0,0],this.points=[],this.indices=[],this.buffer=o.default.GLBuffer.createVertexBuffer(e),this.indexBuffer=o.default.GLBuffer.createIndexBuffer(e),this.dirty=!0,this.nativeLines=!1,this.glPoints=null,this.glIndices=null,this.shader=r,this.vao=new o.default.VertexArrayObject(e,i).addIndex(this.indexBuffer).addAttribute(this.buffer,r.attributes.aVertexPosition,e.FLOAT,!1,24,0).addAttribute(this.buffer,r.attributes.aColor,e.FLOAT,!1,24,8)}return t.prototype.reset=function(){this.points.length=0,this.indices.length=0},t.prototype.upload=function(){this.glPoints=new Float32Array(this.points),this.buffer.upload(this.glPoints),this.glIndices=new Uint16Array(this.indices),this.indexBuffer.upload(this.glIndices),this.dirty=!1},t.prototype.destroy=function(){this.color=null,this.points=null,this.indices=null,this.vao.destroy(),this.buffer.destroy(),this.indexBuffer.destroy(),this.gl=null,this.buffer=null,this.indexBuffer=null,this.glPoints=null,this.glIndices=null},t}();r.default=s},{"pixi-gl-core":15}],59:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}r.__esModule=!0;var s=t("../../../Shader"),a=function(t){return t&&t.__esModule?t:{default:t}}(s),u=function(t){function e(r){return n(this,e),i(this,t.call(this,r,["attribute vec2 aVertexPosition;","attribute vec4 aColor;","uniform mat3 translationMatrix;","uniform mat3 projectionMatrix;","uniform float alpha;","uniform vec3 tint;","varying vec4 vColor;","void main(void){"," gl_Position = vec4((projectionMatrix * translationMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);"," vColor = aColor * vec4(tint * alpha, alpha);","}"].join("\n"),["varying vec4 vColor;","void main(void){"," gl_FragColor = vColor;","}"].join("\n")))}return o(e,t),e}(a.default);r.default=u},{"../../../Shader":44}],60:[function(t,e,r){"use strict";function n(t,e,r){var n=t.shape,i=n.x,u=n.y,h=void 0,l=void 0;if(t.type===s.SHAPES.CIRC?(h=n.radius,l=n.radius):(h=n.width,l=n.height),0!==h&&0!==l){var c=Math.floor(30*Math.sqrt(n.radius))||Math.floor(15*Math.sqrt(n.width+n.height)),d=2*Math.PI/c;if(t.fill){var f=(0,a.hex2rgb)(t.fillColor),p=t.fillAlpha,v=f[0]*p,y=f[1]*p,g=f[2]*p,m=e.points,_=e.indices,b=m.length/6;_.push(b);for(var x=0;x196*p*p?(R=O-P,A=M-C,I=Math.sqrt(R*R+A*A),R/=I,A/=I,R*=p,A*=p,h.push(T-R,w-A),h.push(g,m,_,y),h.push(T+R,w+A),h.push(g,m,_,y),h.push(T-R,w-A),h.push(g,m,_,y),d++):(h.push(X,G),h.push(g,m,_,y),h.push(T-(X-T),w-(G-w)),h.push(g,m,_,y))}}b=r[2*(c-2)],x=r[2*(c-2)+1],T=r[2*(c-1)],w=r[2*(c-1)+1],O=-(x-w),M=b-T,I=Math.sqrt(O*O+M*M),O/=I,M/=I,O*=p,M*=p,h.push(T-O,w-M),h.push(g,m,_,y),h.push(T+O,w+M),h.push(g,m,_,y),l.push(f);for(var W=0;W=6){for(var i=[],o=t.holes,u=0;u0&&(0,s.default)(t,e,r)}r.__esModule=!0,r.default=i;var o=t("./buildLine"),s=n(o),a=t("../../../utils"),u=t("earcut"),h=n(u)},{"../../../utils":125,"./buildLine":61,earcut:2}],63:[function(t,e,r){"use strict";function n(t,e,r){var n=t.shape,i=n.x,a=n.y,u=n.width,h=n.height;if(t.fill){var l=(0,s.hex2rgb)(t.fillColor),c=t.fillAlpha,d=l[0]*c,f=l[1]*c,p=l[2]*c,v=e.points,y=e.indices,g=v.length/6;v.push(i,a),v.push(d,f,p,c),v.push(i+u,a),v.push(d,f,p,c),v.push(i,a+h),v.push(d,f,p,c),v.push(i+u,a+h),v.push(d,f,p,c),y.push(g,g,g+1,g+2,g+3,g+3)}if(t.lineWidth){var m=t.points;t.points=[i,a,i+u,a,i+u,a+h,i,a+h,i,a],(0,o.default)(t,e,r),t.points=m}}r.__esModule=!0,r.default=n;var i=t("./buildLine"),o=function(t){return t&&t.__esModule?t:{default:t}}(i),s=t("../../../utils")},{"../../../utils":125,"./buildLine":61}],64:[function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}function i(t,e,r){var n=t.shape,i=n.x,o=n.y,a=n.width,h=n.height,d=n.radius,f=[];if(f.push(i,o+d),s(i,o+h-d,i,o+h,i+d,o+h,f),s(i+a-d,o+h,i+a,o+h,i+a,o+h-d,f),s(i+a,o+d,i+a,o,i+a-d,o,f),s(i+d,o,i,o,i,o+d+1e-10,f),t.fill){for(var p=(0,c.hex2rgb)(t.fillColor),v=t.fillAlpha,y=p[0]*v,g=p[1]*v,m=p[2]*v,_=e.points,b=e.indices,x=_.length/6,T=(0,u.default)(f,null,2),w=0,E=T.length;w6&&void 0!==arguments[6]?arguments[6]:[],u=a,h=0,l=0,c=0,d=0,f=0,p=0,v=0,y=0;v<=20;++v)y=v/20,h=o(t,r,y),l=o(e,n,y),c=o(r,i,y),d=o(n,s,y),f=o(h,c,y),p=o(l,d,y),u.push(f,p);return u}r.__esModule=!0,r.default=i;var a=t("earcut"),u=n(a),h=t("./buildLine"),l=n(h),c=t("../../../utils")},{"../../../utils":125,"./buildLine":61,earcut:2}],65:[function(t,e,r){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e.default=t,e}function i(t){return t&&t.__esModule?t:{default:t}}r.__esModule=!0,r.autoDetectRenderer=r.Application=r.Filter=r.SpriteMaskFilter=r.Quad=r.RenderTarget=r.ObjectRenderer=r.WebGLManager=r.Shader=r.CanvasRenderTarget=r.TextureUvs=r.VideoBaseTexture=r.BaseRenderTexture=r.RenderTexture=r.BaseTexture=r.TextureMatrix=r.Texture=r.Spritesheet=r.CanvasGraphicsRenderer=r.GraphicsRenderer=r.GraphicsData=r.Graphics=r.TextMetrics=r.TextStyle=r.Text=r.SpriteRenderer=r.CanvasTinter=r.CanvasSpriteRenderer=r.Sprite=r.TransformBase=r.TransformStatic=r.Transform=r.Container=r.DisplayObject=r.Bounds=r.glCore=r.WebGLRenderer=r.CanvasRenderer=r.ticker=r.utils=r.settings=void 0;var o=t("./const");Object.keys(o).forEach(function(t){"default"!==t&&"__esModule"!==t&&Object.defineProperty(r,t,{enumerable:!0,get:function(){return o[t]}})});var s=t("./math");Object.keys(s).forEach(function(t){"default"!==t&&"__esModule"!==t&&Object.defineProperty(r,t,{enumerable:!0,get:function(){return s[t]}})});var a=t("pixi-gl-core");Object.defineProperty(r,"glCore",{enumerable:!0,get:function(){return i(a).default}});var u=t("./display/Bounds");Object.defineProperty(r,"Bounds",{enumerable:!0,get:function(){ +return i(u).default}});var h=t("./display/DisplayObject");Object.defineProperty(r,"DisplayObject",{enumerable:!0,get:function(){return i(h).default}});var l=t("./display/Container");Object.defineProperty(r,"Container",{enumerable:!0,get:function(){return i(l).default}});var c=t("./display/Transform");Object.defineProperty(r,"Transform",{enumerable:!0,get:function(){return i(c).default}});var d=t("./display/TransformStatic");Object.defineProperty(r,"TransformStatic",{enumerable:!0,get:function(){return i(d).default}});var f=t("./display/TransformBase");Object.defineProperty(r,"TransformBase",{enumerable:!0,get:function(){return i(f).default}});var p=t("./sprites/Sprite");Object.defineProperty(r,"Sprite",{enumerable:!0,get:function(){return i(p).default}});var v=t("./sprites/canvas/CanvasSpriteRenderer");Object.defineProperty(r,"CanvasSpriteRenderer",{enumerable:!0,get:function(){return i(v).default}});var y=t("./sprites/canvas/CanvasTinter");Object.defineProperty(r,"CanvasTinter",{enumerable:!0,get:function(){return i(y).default}});var g=t("./sprites/webgl/SpriteRenderer");Object.defineProperty(r,"SpriteRenderer",{enumerable:!0,get:function(){return i(g).default}});var m=t("./text/Text");Object.defineProperty(r,"Text",{enumerable:!0,get:function(){return i(m).default}});var _=t("./text/TextStyle");Object.defineProperty(r,"TextStyle",{enumerable:!0,get:function(){return i(_).default}});var b=t("./text/TextMetrics");Object.defineProperty(r,"TextMetrics",{enumerable:!0,get:function(){return i(b).default}});var x=t("./graphics/Graphics");Object.defineProperty(r,"Graphics",{enumerable:!0,get:function(){return i(x).default}});var T=t("./graphics/GraphicsData");Object.defineProperty(r,"GraphicsData",{enumerable:!0,get:function(){return i(T).default}});var w=t("./graphics/webgl/GraphicsRenderer");Object.defineProperty(r,"GraphicsRenderer",{enumerable:!0,get:function(){return i(w).default}});var E=t("./graphics/canvas/CanvasGraphicsRenderer");Object.defineProperty(r,"CanvasGraphicsRenderer",{enumerable:!0,get:function(){return i(E).default}});var S=t("./textures/Spritesheet");Object.defineProperty(r,"Spritesheet",{enumerable:!0,get:function(){return i(S).default}});var O=t("./textures/Texture");Object.defineProperty(r,"Texture",{enumerable:!0,get:function(){return i(O).default}});var M=t("./textures/TextureMatrix");Object.defineProperty(r,"TextureMatrix",{enumerable:!0,get:function(){return i(M).default}});var P=t("./textures/BaseTexture");Object.defineProperty(r,"BaseTexture",{enumerable:!0,get:function(){return i(P).default}});var C=t("./textures/RenderTexture");Object.defineProperty(r,"RenderTexture",{enumerable:!0,get:function(){return i(C).default}});var R=t("./textures/BaseRenderTexture");Object.defineProperty(r,"BaseRenderTexture",{enumerable:!0,get:function(){return i(R).default}});var A=t("./textures/VideoBaseTexture");Object.defineProperty(r,"VideoBaseTexture",{enumerable:!0,get:function(){return i(A).default}});var I=t("./textures/TextureUvs");Object.defineProperty(r,"TextureUvs",{enumerable:!0,get:function(){return i(I).default}});var D=t("./renderers/canvas/utils/CanvasRenderTarget");Object.defineProperty(r,"CanvasRenderTarget",{enumerable:!0,get:function(){return i(D).default}});var L=t("./Shader");Object.defineProperty(r,"Shader",{enumerable:!0,get:function(){return i(L).default}});var N=t("./renderers/webgl/managers/WebGLManager");Object.defineProperty(r,"WebGLManager",{enumerable:!0,get:function(){return i(N).default}});var F=t("./renderers/webgl/utils/ObjectRenderer");Object.defineProperty(r,"ObjectRenderer",{enumerable:!0,get:function(){return i(F).default}});var B=t("./renderers/webgl/utils/RenderTarget");Object.defineProperty(r,"RenderTarget",{enumerable:!0,get:function(){return i(B).default}});var k=t("./renderers/webgl/utils/Quad");Object.defineProperty(r,"Quad",{enumerable:!0,get:function(){return i(k).default}});var j=t("./renderers/webgl/filters/spriteMask/SpriteMaskFilter");Object.defineProperty(r,"SpriteMaskFilter",{enumerable:!0,get:function(){return i(j).default}});var U=t("./renderers/webgl/filters/Filter");Object.defineProperty(r,"Filter",{enumerable:!0,get:function(){return i(U).default}});var X=t("./Application");Object.defineProperty(r,"Application",{enumerable:!0,get:function(){return i(X).default}});var G=t("./autoDetectRenderer");Object.defineProperty(r,"autoDetectRenderer",{enumerable:!0,get:function(){return G.autoDetectRenderer}});var W=t("./utils"),H=n(W),Y=t("./ticker"),V=n(Y),z=t("./settings"),q=i(z),K=t("./renderers/canvas/CanvasRenderer"),Z=i(K),J=t("./renderers/webgl/WebGLRenderer"),Q=i(J);r.settings=q.default,r.utils=H,r.ticker=V,r.CanvasRenderer=Z.default,r.WebGLRenderer=Q.default},{"./Application":43,"./Shader":44,"./autoDetectRenderer":45,"./const":46,"./display/Bounds":47,"./display/Container":48,"./display/DisplayObject":49,"./display/Transform":50,"./display/TransformBase":51,"./display/TransformStatic":52,"./graphics/Graphics":53,"./graphics/GraphicsData":54,"./graphics/canvas/CanvasGraphicsRenderer":55,"./graphics/webgl/GraphicsRenderer":57,"./math":70,"./renderers/canvas/CanvasRenderer":77,"./renderers/canvas/utils/CanvasRenderTarget":79,"./renderers/webgl/WebGLRenderer":84,"./renderers/webgl/filters/Filter":86,"./renderers/webgl/filters/spriteMask/SpriteMaskFilter":89,"./renderers/webgl/managers/WebGLManager":93,"./renderers/webgl/utils/ObjectRenderer":94,"./renderers/webgl/utils/Quad":95,"./renderers/webgl/utils/RenderTarget":96,"./settings":101,"./sprites/Sprite":102,"./sprites/canvas/CanvasSpriteRenderer":103,"./sprites/canvas/CanvasTinter":104,"./sprites/webgl/SpriteRenderer":106,"./text/Text":108,"./text/TextMetrics":109,"./text/TextStyle":110,"./textures/BaseRenderTexture":111,"./textures/BaseTexture":112,"./textures/RenderTexture":113,"./textures/Spritesheet":114,"./textures/Texture":115,"./textures/TextureMatrix":116,"./textures/TextureUvs":117,"./textures/VideoBaseTexture":118,"./ticker":121,"./utils":125,"pixi-gl-core":15}],66:[function(t,e,r){"use strict";function n(t){return t<0?-1:t>0?1:0}r.__esModule=!0;var i=t("./Matrix"),o=function(t){return t&&t.__esModule?t:{default:t}}(i),s=[1,1,0,-1,-1,-1,0,1,1,1,0,-1,-1,-1,0,1],a=[0,1,1,1,0,-1,-1,-1,0,1,1,1,0,-1,-1,-1],u=[0,-1,-1,-1,0,1,1,1,0,1,1,1,0,-1,-1,-1],h=[1,1,0,-1,-1,-1,0,1,-1,-1,0,1,1,1,0,-1],l=[],c=[];!function(){for(var t=0;t<16;t++){var e=[];c.push(e);for(var r=0;r<16;r++)for(var i=n(s[t]*s[r]+u[t]*a[r]),d=n(a[t]*s[r]+h[t]*a[r]),f=n(s[t]*u[r]+u[t]*h[r]),p=n(a[t]*u[r]+h[t]*h[r]),v=0;v<16;v++)if(s[v]===i&&a[v]===d&&u[v]===f&&h[v]===p){e.push(v);break}}for(var y=0;y<16;y++){var g=new o.default;g.set(s[y],a[y],u[y],h[y],0,0),l.push(g)}}();var d={E:0,SE:1,S:2,SW:3,W:4,NW:5,N:6,NE:7,MIRROR_VERTICAL:8,MIRROR_HORIZONTAL:12,uX:function(t){return s[t]},uY:function(t){return a[t]},vX:function(t){return u[t]},vY:function(t){return h[t]},inv:function(t){return 8&t?15&t:7&-t},add:function(t,e){return c[t][e]},sub:function(t,e){return c[t][d.inv(e)]},rotate180:function(t){return 4^t},isVertical:function(t){return 2==(3&t)},byDirection:function(t,e){return 2*Math.abs(t)<=Math.abs(e)?e>=0?d.S:d.N:2*Math.abs(e)<=Math.abs(t)?t>0?d.E:d.W:e>0?t>0?d.SE:d.SW:t>0?d.NE:d.NW},matrixAppendRotationInv:function(t,e){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,i=l[d.inv(e)];i.tx=r,i.ty=n,t.append(i)}};r.default=d},{"./Matrix":67}],67:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.__esModule=!0;var i=function(){function t(t,e){for(var r=0;r0&&void 0!==arguments[0]?arguments[0]:1,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:1,s=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,a=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0;n(this,t),this.a=e,this.b=r,this.c=i,this.d=o,this.tx=s,this.ty=a,this.array=null}return t.prototype.fromArray=function(t){this.a=t[0],this.b=t[1],this.c=t[3],this.d=t[4],this.tx=t[2],this.ty=t[5]},t.prototype.set=function(t,e,r,n,i,o){return this.a=t,this.b=e,this.c=r,this.d=n,this.tx=i,this.ty=o,this},t.prototype.toArray=function(t,e){this.array||(this.array=new Float32Array(9));var r=e||this.array;return t?(r[0]=this.a,r[1]=this.b,r[2]=0,r[3]=this.c,r[4]=this.d,r[5]=0,r[6]=this.tx,r[7]=this.ty,r[8]=1):(r[0]=this.a,r[1]=this.c,r[2]=this.tx,r[3]=this.b,r[4]=this.d,r[5]=this.ty,r[6]=0,r[7]=0,r[8]=1),r},t.prototype.apply=function(t,e){e=e||new s.default;var r=t.x,n=t.y;return e.x=this.a*r+this.c*n+this.tx,e.y=this.b*r+this.d*n+this.ty,e},t.prototype.applyInverse=function(t,e){e=e||new s.default;var r=1/(this.a*this.d+this.c*-this.b),n=t.x,i=t.y;return e.x=this.d*r*n+-this.c*r*i+(this.ty*this.c-this.tx*this.d)*r,e.y=this.a*r*i+-this.b*r*n+(-this.ty*this.a+this.tx*this.b)*r,e},t.prototype.translate=function(t,e){return this.tx+=t,this.ty+=e,this},t.prototype.scale=function(t,e){return this.a*=t,this.d*=e,this.c*=t,this.b*=e,this.tx*=t,this.ty*=e,this},t.prototype.rotate=function(t){var e=Math.cos(t),r=Math.sin(t),n=this.a,i=this.c,o=this.tx;return this.a=n*e-this.b*r,this.b=n*r+this.b*e,this.c=i*e-this.d*r,this.d=i*r+this.d*e,this.tx=o*e-this.ty*r,this.ty=o*r+this.ty*e,this},t.prototype.append=function(t){var e=this.a,r=this.b,n=this.c,i=this.d;return this.a=t.a*e+t.b*n,this.b=t.a*r+t.b*i,this.c=t.c*e+t.d*n,this.d=t.c*r+t.d*i,this.tx=t.tx*e+t.ty*n+this.tx,this.ty=t.tx*r+t.ty*i+this.ty,this},t.prototype.setTransform=function(t,e,r,n,i,o,s,a,u){var h=Math.sin(s),l=Math.cos(s),c=Math.cos(u),d=Math.sin(u),f=-Math.sin(a),p=Math.cos(a),v=l*i,y=h*i,g=-h*o,m=l*o;return this.a=c*v+d*g,this.b=c*y+d*m,this.c=f*v+p*g,this.d=f*y+p*m,this.tx=t+(r*v+n*g),this.ty=e+(r*y+n*m),this},t.prototype.prepend=function(t){var e=this.tx;if(1!==t.a||0!==t.b||0!==t.c||1!==t.d){var r=this.a,n=this.c;this.a=r*t.a+this.b*t.c,this.b=r*t.b+this.b*t.d,this.c=n*t.a+this.d*t.c,this.d=n*t.b+this.d*t.d}return this.tx=e*t.a+this.ty*t.c+t.tx,this.ty=e*t.b+this.ty*t.d+t.ty,this},t.prototype.decompose=function(t){var e=this.a,r=this.b,n=this.c,i=this.d,o=-Math.atan2(-n,i),s=Math.atan2(r,e);return Math.abs(o+s)<1e-5?(t.rotation=s,e<0&&i>=0&&(t.rotation+=t.rotation<=0?Math.PI:-Math.PI),t.skew.x=t.skew.y=0):(t.skew.x=o,t.skew.y=s),t.scale.x=Math.sqrt(e*e+r*r),t.scale.y=Math.sqrt(n*n+i*i),t.position.x=this.tx,t.position.y=this.ty,t},t.prototype.invert=function(){var t=this.a,e=this.b,r=this.c,n=this.d,i=this.tx,o=t*n-e*r;return this.a=n/o,this.b=-e/o,this.c=-r/o,this.d=t/o,this.tx=(r*this.ty-n*i)/o,this.ty=-(t*this.ty-e*i)/o,this},t.prototype.identity=function(){return this.a=1,this.b=0,this.c=0,this.d=1,this.tx=0,this.ty=0,this},t.prototype.clone=function(){var e=new t;return e.a=this.a,e.b=this.b,e.c=this.c,e.d=this.d,e.tx=this.tx,e.ty=this.ty,e},t.prototype.copy=function(t){return t.a=this.a,t.b=this.b,t.c=this.c,t.d=this.d,t.tx=this.tx,t.ty=this.ty,t},i(t,null,[{key:"IDENTITY",get:function(){return new t}},{key:"TEMP_MATRIX",get:function(){return new t}}]),t}();r.default=a},{"./Point":69}],68:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.__esModule=!0;var i=function(){function t(t,e){for(var r=0;r2&&void 0!==arguments[2]?arguments[2]:0,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0;n(this,t),this._x=i,this._y=o,this.cb=e,this.scope=r}return t.prototype.set=function(t,e){var r=t||0,n=e||(0!==e?r:0);this._x===r&&this._y===n||(this._x=r,this._y=n,this.cb.call(this.scope))},t.prototype.copy=function(t){this._x===t.x&&this._y===t.y||(this._x=t.x,this._y=t.y,this.cb.call(this.scope))},i(t,[{key:"x",get:function(){return this._x},set:function(t){this._x!==t&&(this._x=t,this.cb.call(this.scope))}},{key:"y",get:function(){return this._y},set:function(t){this._y!==t&&(this._y=t,this.cb.call(this.scope))}}]),t}();r.default=o},{}],69:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.__esModule=!0;var i=function(){function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;n(this,t),this.x=e,this.y=r}return t.prototype.clone=function(){return new t(this.x,this.y)},t.prototype.copy=function(t){this.set(t.x,t.y)},t.prototype.equals=function(t){return t.x===this.x&&t.y===this.y},t.prototype.set=function(t,e){this.x=t||0,this.y=e||(0!==e?this.x:0)},t}();r.default=i},{}],70:[function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}r.__esModule=!0;var i=t("./Point");Object.defineProperty(r,"Point",{enumerable:!0,get:function(){return n(i).default}});var o=t("./ObservablePoint");Object.defineProperty(r,"ObservablePoint",{enumerable:!0,get:function(){return n(o).default}});var s=t("./Matrix");Object.defineProperty(r,"Matrix",{enumerable:!0,get:function(){return n(s).default}});var a=t("./GroupD8");Object.defineProperty(r,"GroupD8",{enumerable:!0,get:function(){return n(a).default}});var u=t("./shapes/Circle");Object.defineProperty(r,"Circle",{enumerable:!0,get:function(){return n(u).default}});var h=t("./shapes/Ellipse");Object.defineProperty(r,"Ellipse",{enumerable:!0,get:function(){return n(h).default}});var l=t("./shapes/Polygon");Object.defineProperty(r,"Polygon",{enumerable:!0,get:function(){return n(l).default}});var c=t("./shapes/Rectangle");Object.defineProperty(r,"Rectangle",{enumerable:!0,get:function(){return n(c).default}});var d=t("./shapes/RoundedRectangle");Object.defineProperty(r,"RoundedRectangle",{enumerable:!0,get:function(){return n(d).default}})},{"./GroupD8":66,"./Matrix":67,"./ObservablePoint":68,"./Point":69,"./shapes/Circle":71,"./shapes/Ellipse":72,"./shapes/Polygon":73,"./shapes/Rectangle":74,"./shapes/RoundedRectangle":75}],71:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.__esModule=!0;var i=t("./Rectangle"),o=function(t){return t&&t.__esModule?t:{default:t}}(i),s=t("../../const"),a=function(){function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;n(this,t),this.x=e,this.y=r,this.radius=i,this.type=s.SHAPES.CIRC}return t.prototype.clone=function(){return new t(this.x,this.y,this.radius)},t.prototype.contains=function(t,e){if(this.radius<=0)return!1;var r=this.radius*this.radius,n=this.x-t,i=this.y-e;return n*=n,i*=i,n+i<=r},t.prototype.getBounds=function(){return new o.default(this.x-this.radius,this.y-this.radius,2*this.radius,2*this.radius)},t}();r.default=a},{"../../const":46,"./Rectangle":74}],72:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.__esModule=!0;var i=t("./Rectangle"),o=function(t){return t&&t.__esModule?t:{default:t}}(i),s=t("../../const"),a=function(){function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0;n(this,t),this.x=e,this.y=r,this.width=i,this.height=o,this.type=s.SHAPES.ELIP}return t.prototype.clone=function(){return new t(this.x,this.y,this.width,this.height)},t.prototype.contains=function(t,e){if(this.width<=0||this.height<=0)return!1;var r=(t-this.x)/this.width,n=(e-this.y)/this.height;return r*=r,n*=n,r+n<=1},t.prototype.getBounds=function(){return new o.default(this.x-this.width,this.y-this.height,this.width,this.height)},t}();r.default=a},{"../../const":46,"./Rectangle":74}],73:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.__esModule=!0;var i=t("../Point"),o=function(t){return t&&t.__esModule?t:{default:t}}(i),s=t("../../const"),a=function(){function t(){for(var e=arguments.length,r=Array(e),i=0;ie!=h>e&&t<(e-a)/(h-a)*(u-s)+s&&(r=!r)}return r},t}();r.default=a},{"../../const":46,"../Point":69}],74:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.__esModule=!0;var i=function(){function t(t,e){for(var r=0;r0&&void 0!==arguments[0]?arguments[0]:0,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,s=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0;n(this,t),this.x=Number(e),this.y=Number(r),this.width=Number(i),this.height=Number(s),this.type=o.SHAPES.RECT}return t.prototype.clone=function(){return new t(this.x,this.y,this.width,this.height)},t.prototype.copy=function(t){return this.x=t.x,this.y=t.y,this.width=t.width,this.height=t.height,this},t.prototype.contains=function(t,e){return!(this.width<=0||this.height<=0)&&(t>=this.x&&t=this.y&&et.x+t.width&&(this.width=t.width-this.x,this.width<0&&(this.width=0)),this.y+this.height>t.y+t.height&&(this.height=t.height-this.y,this.height<0&&(this.height=0))},t.prototype.enlarge=function(t){var e=Math.min(this.x,t.x),r=Math.max(this.x+this.width,t.x+t.width),n=Math.min(this.y,t.y),i=Math.max(this.y+this.height,t.y+t.height);this.x=e,this.width=r-e,this.y=n,this.height=i-n},i(t,[{key:"left",get:function(){return this.x}},{key:"right",get:function(){return this.x+this.width}},{key:"top",get:function(){return this.y}},{key:"bottom",get:function(){return this.y+this.height}}],[{key:"EMPTY",get:function(){return new t(0,0,0,0)}}]),t}();r.default=s},{"../../const":46}],75:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.__esModule=!0;var i=t("../../const"),o=function(){function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,s=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,a=arguments.length>4&&void 0!==arguments[4]?arguments[4]:20;n(this,t),this.x=e,this.y=r,this.width=o,this.height=s,this.radius=a,this.type=i.SHAPES.RREC}return t.prototype.clone=function(){return new t(this.x,this.y,this.width,this.height,this.radius)},t.prototype.contains=function(t,e){if(this.width<=0||this.height<=0)return!1;if(t>=this.x&&t<=this.x+this.width&&e>=this.y&&e<=this.y+this.height){if(e>=this.y+this.radius&&e<=this.y+this.height-this.radius||t>=this.x+this.radius&&t<=this.x+this.width-this.radius)return!0;var r=t-(this.x+this.radius),n=e-(this.y+this.radius),i=this.radius*this.radius;if(r*r+n*n<=i)return!0;if((r=t-(this.x+this.width-this.radius))*r+n*n<=i)return!0;if(n=e-(this.y+this.height-this.radius),r*r+n*n<=i)return!0;if((r=t-(this.x+this.radius))*r+n*n<=i)return!0}return!1},t}();r.default=o},{"../../const":46}],76:[function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}r.__esModule=!0;var a=function(){function t(t,e){for(var r=0;rE?E:w,e.moveTo(_,b+w),e.lineTo(_,b+T-w),e.quadraticCurveTo(_,b+T,_+w,b+T),e.lineTo(_+x-w,b+T),e.quadraticCurveTo(_+x,b+T,_+x,b+T-w),e.lineTo(_+x,b+w),e.quadraticCurveTo(_+x,b,_+x-w,b),e.lineTo(_+w,b),e.quadraticCurveTo(_,b,_,b+w),e.closePath()}}}},t.prototype.popMask=function(t){t.context.restore(),t.invalidateBlendMode()},t.prototype.destroy=function(){},t}();r.default=o},{"../../../const":46}],79:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.__esModule=!0;var i=function(){function t(t,e){for(var r=0;r0&&void 0!==arguments[0]?arguments[0]:[];return(0,s.default)()?(t[i.BLEND_MODES.NORMAL]="source-over",t[i.BLEND_MODES.ADD]="lighter",t[i.BLEND_MODES.MULTIPLY]="multiply",t[i.BLEND_MODES.SCREEN]="screen", +t[i.BLEND_MODES.OVERLAY]="overlay",t[i.BLEND_MODES.DARKEN]="darken",t[i.BLEND_MODES.LIGHTEN]="lighten",t[i.BLEND_MODES.COLOR_DODGE]="color-dodge",t[i.BLEND_MODES.COLOR_BURN]="color-burn",t[i.BLEND_MODES.HARD_LIGHT]="hard-light",t[i.BLEND_MODES.SOFT_LIGHT]="soft-light",t[i.BLEND_MODES.DIFFERENCE]="difference",t[i.BLEND_MODES.EXCLUSION]="exclusion",t[i.BLEND_MODES.HUE]="hue",t[i.BLEND_MODES.SATURATION]="saturate",t[i.BLEND_MODES.COLOR]="color",t[i.BLEND_MODES.LUMINOSITY]="luminosity"):(t[i.BLEND_MODES.NORMAL]="source-over",t[i.BLEND_MODES.ADD]="lighter",t[i.BLEND_MODES.MULTIPLY]="source-over",t[i.BLEND_MODES.SCREEN]="source-over",t[i.BLEND_MODES.OVERLAY]="source-over",t[i.BLEND_MODES.DARKEN]="source-over",t[i.BLEND_MODES.LIGHTEN]="source-over",t[i.BLEND_MODES.COLOR_DODGE]="source-over",t[i.BLEND_MODES.COLOR_BURN]="source-over",t[i.BLEND_MODES.HARD_LIGHT]="source-over",t[i.BLEND_MODES.SOFT_LIGHT]="source-over",t[i.BLEND_MODES.DIFFERENCE]="source-over",t[i.BLEND_MODES.EXCLUSION]="source-over",t[i.BLEND_MODES.HUE]="source-over",t[i.BLEND_MODES.SATURATION]="source-over",t[i.BLEND_MODES.COLOR]="source-over",t[i.BLEND_MODES.LUMINOSITY]="source-over"),t[i.BLEND_MODES.NORMAL_NPM]=t[i.BLEND_MODES.NORMAL],t[i.BLEND_MODES.ADD_NPM]=t[i.BLEND_MODES.ADD],t[i.BLEND_MODES.SCREEN_NPM]=t[i.BLEND_MODES.SCREEN],t}r.__esModule=!0,r.default=n;var i=t("../../../const"),o=t("./canUseNewCanvasBlendModes"),s=function(t){return t&&t.__esModule?t:{default:t}}(o)},{"../../../const":46,"./canUseNewCanvasBlendModes":80}],82:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.__esModule=!0;var i=t("../../const"),o=t("../../settings"),s=function(t){return t&&t.__esModule?t:{default:t}}(o),a=function(){function t(e){n(this,t),this.renderer=e,this.count=0,this.checkCount=0,this.maxIdle=s.default.GC_MAX_IDLE,this.checkCountMax=s.default.GC_MAX_CHECK_COUNT,this.mode=s.default.GC_MODE}return t.prototype.update=function(){this.count++,this.mode!==i.GC_MODES.MANUAL&&++this.checkCount>this.checkCountMax&&(this.checkCount=0,this.run())},t.prototype.run=function(){for(var t=this.renderer.textureManager,e=t._managedTextures,r=!1,n=0;nthis.maxIdle&&(t.destroyTexture(i,!0),e[n]=null,r=!0)}if(r){for(var o=0,s=0;s=0;r--)this.unload(t.children[r])},t}();r.default=a},{"../../const":46,"../../settings":101}],83:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.__esModule=!0;var i=t("pixi-gl-core"),o=t("../../const"),s=t("./utils/RenderTarget"),a=function(t){return t&&t.__esModule?t:{default:t}}(s),u=t("../../utils"),h=function(){function t(e){n(this,t),this.renderer=e,this.gl=e.gl,this._managedTextures=[]}return t.prototype.bindTexture=function(){},t.prototype.getTexture=function(){},t.prototype.updateTexture=function(t,e){var r=this.gl,n=!!t._glRenderTargets;if(!t.hasLoaded)return null;var s=this.renderer.boundTextures;if(void 0===e){e=0;for(var u=0;u 0.5)"," {"," color = vec4(1.0, 0.0, 0.0, 1.0);"," }"," else"," {"," color = vec4(0.0, 1.0, 0.0, 1.0);"," }"," gl_FragColor = mix(sample, masky, 0.5);"," gl_FragColor *= sample.a;","}"].join("\n")}}]),t}();r.default=f},{"../../../const":46,"../../../settings":101,"../../../utils":125,"./extractUniformsFromSrc":87}],87:[function(t,e,r){"use strict";function n(t,e,r){var n=i(t),o=i(e);return Object.assign(n,o)}function i(t){for(var e=new RegExp("^(projectionMatrix|uSampler|filterArea|filterClamp)$"),r={},n=void 0,i=t.replace(/\s+/g," ").split(/\s*;\s*/),o=0;o-1){var u=s.split(" "),h=u[1],l=u[2],c=1;l.indexOf("[")>-1&&(n=l.split(/\[|]/),l=n[0],c*=Number(n[1])),l.match(e)||(r[l]={value:a(h,c),name:l,type:h})}}return r}r.__esModule=!0,r.default=n;var o=t("pixi-gl-core"),s=function(t){return t&&t.__esModule?t:{default:t}}(o),a=s.default.shader.defaultValue},{"pixi-gl-core":15}],88:[function(t,e,r){"use strict";function n(t,e,r){var n=t.identity();return n.translate(e.x/r.width,e.y/r.height),n.scale(r.width,r.height),n}function i(t,e,r){var n=t.identity();n.translate(e.x/r.width,e.y/r.height);var i=r.width/e.width,o=r.height/e.height;return n.scale(i,o),n}function o(t,e,r,n){var i=n._texture.orig,o=t.set(r.width,0,0,r.height,e.x,e.y),a=n.worldTransform.copy(s.Matrix.TEMP_MATRIX);return a.invert(),o.prepend(a),o.scale(1/i.width,1/i.height),o.translate(n.anchor.x,n.anchor.y),o}r.__esModule=!0,r.calculateScreenSpaceMatrix=n,r.calculateNormalizedScreenSpaceMatrix=i,r.calculateSpriteMatrix=o;var s=t("../../../math")},{"../../../math":70}],89:[function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}r.__esModule=!0;var a=t("../Filter"),u=n(a),h=t("../../../../math"),l=(t("path"),t("../../../../textures/TextureMatrix")),c=n(l),d=function(t){function e(r){i(this,e);var n=new h.Matrix,s=o(this,t.call(this,"attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\nuniform mat3 otherMatrix;\n\nvarying vec2 vMaskCoord;\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n\n vTextureCoord = aTextureCoord;\n vMaskCoord = ( otherMatrix * vec3( aTextureCoord, 1.0) ).xy;\n}\n","varying vec2 vMaskCoord;\nvarying vec2 vTextureCoord;\n\nuniform sampler2D uSampler;\nuniform sampler2D mask;\nuniform float alpha;\nuniform vec4 maskClamp;\n\nvoid main(void)\n{\n float clip = step(3.5,\n step(maskClamp.x, vMaskCoord.x) +\n step(maskClamp.y, vMaskCoord.y) +\n step(vMaskCoord.x, maskClamp.z) +\n step(vMaskCoord.y, maskClamp.w));\n\n vec4 original = texture2D(uSampler, vTextureCoord);\n vec4 masky = texture2D(mask, vMaskCoord);\n\n original *= (masky.r * masky.a * alpha * clip);\n\n gl_FragColor = original;\n}\n"));return r.renderable=!1,s.maskSprite=r,s.maskMatrix=n,s}return s(e,t),e.prototype.apply=function(t,e,r){var n=this.maskSprite,i=this.maskSprite.texture;i.valid&&(i.transform||(i.transform=new c.default(i,0)),i.transform.update(),this.uniforms.mask=i,this.uniforms.otherMatrix=t.calculateSpriteMatrix(this.maskMatrix,n).prepend(i.transform.mapCoord),this.uniforms.alpha=n.worldAlpha,this.uniforms.maskClamp=i.transform.uClampFrame,t.applyFilter(this,e,r))},e}(u.default);r.default=d},{"../../../../math":70,"../../../../textures/TextureMatrix":116,"../Filter":86,path:8}],90:[function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function s(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.__esModule=!0;var a=t("./WebGLManager"),u=n(a),h=t("../utils/RenderTarget"),l=n(h),c=t("../utils/Quad"),d=n(c),f=t("../../../math"),p=t("../../../Shader"),v=n(p),y=t("../filters/filterTransforms"),g=function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e.default=t,e}(y),m=t("bit-twiddle"),_=n(m),b=function t(){s(this,t),this.renderTarget=null,this.sourceFrame=new f.Rectangle,this.destinationFrame=new f.Rectangle,this.filters=[],this.target=null,this.resolution=1},x=function(t){function e(r){s(this,e);var n=i(this,t.call(this,r));return n.gl=n.renderer.gl,n.quad=new d.default(n.gl,r.state.attribState),n.shaderCache={},n.pool={},n.filterData=null,n.managedFilters=[],n}return o(e,t),e.prototype.pushFilter=function(t,e){var r=this.renderer,n=this.filterData;if(!n){n=this.renderer._activeRenderTarget.filterStack;var i=new b;i.sourceFrame=i.destinationFrame=this.renderer._activeRenderTarget.size,i.renderTarget=r._activeRenderTarget,this.renderer._activeRenderTarget.filterData=n={index:0,stack:[i]},this.filterData=n}var o=n.stack[++n.index];o||(o=n.stack[n.index]=new b);var s=e[0].resolution,a=0|e[0].padding,u=t.filterArea||t.getBounds(!0),h=o.sourceFrame,l=o.destinationFrame;h.x=(u.x*s|0)/s,h.y=(u.y*s|0)/s,h.width=(u.width*s|0)/s,h.height=(u.height*s|0)/s,n.stack[0].renderTarget.transform||e[0].autoFit&&h.fit(n.stack[0].destinationFrame),h.pad(a),l.width=h.width,l.height=h.height;var c=this.getPotRenderTarget(r.gl,h.width,h.height,s);o.target=t,o.filters=e,o.resolution=s,o.renderTarget=c,c.setFrame(l,h),r.bindRenderTarget(c),c.clear()},e.prototype.popFilter=function(){var t=this.filterData,e=t.stack[t.index-1],r=t.stack[t.index];this.quad.map(r.renderTarget.size,r.sourceFrame).upload();var n=r.filters;if(1===n.length)n[0].apply(this,r.renderTarget,e.renderTarget,!1,r),this.freePotRenderTarget(r.renderTarget);else{var i=r.renderTarget,o=this.getPotRenderTarget(this.renderer.gl,r.sourceFrame.width,r.sourceFrame.height,r.resolution);o.setFrame(r.destinationFrame,r.sourceFrame),o.clear();var s=0;for(s=0;s0&&void 0!==arguments[0]&&arguments[0],e=this.renderer,r=this.managedFilters,n=0;n0&&(e+="\nelse "),r1&&void 0!==arguments[1]?arguments[1]:[];return e[i.BLEND_MODES.NORMAL]=[t.ONE,t.ONE_MINUS_SRC_ALPHA],e[i.BLEND_MODES.ADD]=[t.ONE,t.DST_ALPHA],e[i.BLEND_MODES.MULTIPLY]=[t.DST_COLOR,t.ONE_MINUS_SRC_ALPHA],e[i.BLEND_MODES.SCREEN]=[t.ONE,t.ONE_MINUS_SRC_COLOR],e[i.BLEND_MODES.OVERLAY]=[t.ONE,t.ONE_MINUS_SRC_ALPHA],e[i.BLEND_MODES.DARKEN]=[t.ONE,t.ONE_MINUS_SRC_ALPHA],e[i.BLEND_MODES.LIGHTEN]=[t.ONE,t.ONE_MINUS_SRC_ALPHA],e[i.BLEND_MODES.COLOR_DODGE]=[t.ONE,t.ONE_MINUS_SRC_ALPHA],e[i.BLEND_MODES.COLOR_BURN]=[t.ONE,t.ONE_MINUS_SRC_ALPHA],e[i.BLEND_MODES.HARD_LIGHT]=[t.ONE,t.ONE_MINUS_SRC_ALPHA],e[i.BLEND_MODES.SOFT_LIGHT]=[t.ONE,t.ONE_MINUS_SRC_ALPHA],e[i.BLEND_MODES.DIFFERENCE]=[t.ONE,t.ONE_MINUS_SRC_ALPHA],e[i.BLEND_MODES.EXCLUSION]=[t.ONE,t.ONE_MINUS_SRC_ALPHA],e[i.BLEND_MODES.HUE]=[t.ONE,t.ONE_MINUS_SRC_ALPHA],e[i.BLEND_MODES.SATURATION]=[t.ONE,t.ONE_MINUS_SRC_ALPHA],e[i.BLEND_MODES.COLOR]=[t.ONE,t.ONE_MINUS_SRC_ALPHA],e[i.BLEND_MODES.LUMINOSITY]=[t.ONE,t.ONE_MINUS_SRC_ALPHA],e[i.BLEND_MODES.NORMAL_NPM]=[t.SRC_ALPHA,t.ONE_MINUS_SRC_ALPHA,t.ONE,t.ONE_MINUS_SRC_ALPHA],e[i.BLEND_MODES.ADD_NPM]=[t.SRC_ALPHA,t.DST_ALPHA,t.ONE,t.DST_ALPHA],e[i.BLEND_MODES.SCREEN_NPM]=[t.SRC_ALPHA,t.ONE_MINUS_SRC_COLOR,t.ONE,t.ONE_MINUS_SRC_COLOR],e}r.__esModule=!0,r.default=n;var i=t("../../../const")},{"../../../const":46}],99:[function(t,e,r){"use strict";function n(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return e[i.DRAW_MODES.POINTS]=t.POINTS,e[i.DRAW_MODES.LINES]=t.LINES,e[i.DRAW_MODES.LINE_LOOP]=t.LINE_LOOP,e[i.DRAW_MODES.LINE_STRIP]=t.LINE_STRIP,e[i.DRAW_MODES.TRIANGLES]=t.TRIANGLES,e[i.DRAW_MODES.TRIANGLE_STRIP]=t.TRIANGLE_STRIP,e[i.DRAW_MODES.TRIANGLE_FAN]=t.TRIANGLE_FAN,e}r.__esModule=!0,r.default=n;var i=t("../../../const")},{"../../../const":46}],100:[function(t,e,r){"use strict";function n(t){t.getContextAttributes().stencil||console.warn("Provided WebGL context does not have a stencil buffer, masks may not render correctly")}r.__esModule=!0,r.default=n},{}],101:[function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}r.__esModule=!0;var i=t("./utils/maxRecommendedTextures"),o=n(i),s=t("./utils/canUploadSameBuffer"),a=n(s);r.default={TARGET_FPMS:.06,MIPMAP_TEXTURES:!0,RESOLUTION:1,FILTER_RESOLUTION:1,SPRITE_MAX_TEXTURES:(0,o.default)(32),SPRITE_BATCH_SIZE:4096,RETINA_PREFIX:/@([0-9\.]+)x/,RENDER_OPTIONS:{view:null,antialias:!1,forceFXAA:!1,autoResize:!1,transparent:!1,backgroundColor:0,clearBeforeRender:!0,preserveDrawingBuffer:!1,roundPixels:!1,width:800,height:600,legacy:!1},TRANSFORM_MODE:0,GC_MODE:0,GC_MAX_IDLE:3600,GC_MAX_CHECK_COUNT:600,WRAP_MODE:0,SCALE_MODE:0,PRECISION_VERTEX:"highp",PRECISION_FRAGMENT:"mediump",CAN_UPLOAD_SAME_BUFFER:(0,a.default)()}},{"./utils/canUploadSameBuffer":122,"./utils/maxRecommendedTextures":127}],102:[function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}r.__esModule=!0;var a=function(){function t(t,e){for(var r=0;r=n&&v.x=i&&v.y>16)+(65280&t)+((255&t)<<16)}},{key:"texture",get:function(){return this._texture},set:function(t){this._texture!==t&&(this._texture=t,this.cachedTint=16777215,this._textureID=-1,this._textureTrimmedID=-1,t&&(t.baseTexture.hasLoaded?this._onTextureUpdate():t.once("update",this._onTextureUpdate,this)))}}]),e}(p.default);r.default=y},{"../const":46,"../display/Container":48,"../math":70,"../textures/Texture":115,"../utils":125}],103:[function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.__esModule=!0;var o=t("../../renderers/canvas/CanvasRenderer"),s=n(o),a=t("../../const"),u=t("../../math"),h=t("./CanvasTinter"),l=n(h),c=new u.Matrix,d=function(){function t(e){i(this,t),this.renderer=e}return t.prototype.render=function(t){var e=t._texture,r=this.renderer,n=e._frame.width,i=e._frame.height,o=t.transform.worldTransform,s=0,h=0;if(!(e.orig.width<=0||e.orig.height<=0)&&e.baseTexture.source&&(r.setBlendMode(t.blendMode),e.valid)){r.context.globalAlpha=t.worldAlpha;var d=e.baseTexture.scaleMode===a.SCALE_MODES.LINEAR;r.smoothProperty&&r.context[r.smoothProperty]!==d&&(r.context[r.smoothProperty]=d),e.trim?(s=e.trim.width/2+e.trim.x-t.anchor.x*e.orig.width,h=e.trim.height/2+e.trim.y-t.anchor.y*e.orig.height):(s=(.5-t.anchor.x)*e.orig.width,h=(.5-t.anchor.y)*e.orig.height),e.rotate&&(o.copy(c),o=c,u.GroupD8.matrixAppendRotationInv(o,e.rotate,s,h),s=0,h=0),s-=n/2,h-=i/2,r.roundPixels?(r.context.setTransform(o.a,o.b,o.c,o.d,o.tx*r.resolution|0,o.ty*r.resolution|0),s|=0,h|=0):r.context.setTransform(o.a,o.b,o.c,o.d,o.tx*r.resolution,o.ty*r.resolution);var f=e.baseTexture.resolution;16777215!==t.tint?(t.cachedTint===t.tint&&t.tintedTexture.tintId===t._texture._updateID||(t.cachedTint=t.tint,t.tintedTexture=l.default.getTintedTexture(t,t.tint)),r.context.drawImage(t.tintedTexture,0,0,n*f,i*f,s*r.resolution,h*r.resolution,n*r.resolution,i*r.resolution)):r.context.drawImage(e.baseTexture.source,e._frame.x*f,e._frame.y*f,n*f,i*f,s*r.resolution,h*r.resolution,n*r.resolution,i*r.resolution)}},t.prototype.destroy=function(){this.renderer=null},t}();r.default=d,s.default.registerPlugin("sprite",d)},{"../../const":46,"../../math":70,"../../renderers/canvas/CanvasRenderer":77,"./CanvasTinter":104}],104:[function(t,e,r){"use strict";r.__esModule=!0;var n=t("../../utils"),i=t("../../renderers/canvas/utils/canUseNewCanvasBlendModes"),o=function(t){return t&&t.__esModule?t:{default:t}}(i),s={getTintedTexture:function(t,e){var r=t._texture;e=s.roundColor(e);var n="#"+("00000"+(0|e).toString(16)).substr(-6);r.tintCache=r.tintCache||{};var i=r.tintCache[n],o=void 0;if(i){if(i.tintId===r._updateID)return r.tintCache[n];o=r.tintCache[n]}else o=s.canvas||document.createElement("canvas");if(s.tintMethod(r,e,o),o.tintId=r._updateID,s.convertTintToImage){var a=new Image;a.src=o.toDataURL(),r.tintCache[n]=a}else r.tintCache[n]=o,s.canvas=null;return o},tintWithMultiply:function(t,e,r){var n=r.getContext("2d"),i=t._frame.clone(),o=t.baseTexture.resolution;i.x*=o,i.y*=o,i.width*=o,i.height*=o,r.width=Math.ceil(i.width),r.height=Math.ceil(i.height),n.save(),n.fillStyle="#"+("00000"+(0|e).toString(16)).substr(-6),n.fillRect(0,0,i.width,i.height),n.globalCompositeOperation="multiply",n.drawImage(t.baseTexture.source,i.x,i.y,i.width,i.height,0,0,i.width,i.height),n.globalCompositeOperation="destination-atop",n.drawImage(t.baseTexture.source,i.x,i.y,i.width,i.height,0,0,i.width,i.height),n.restore()},tintWithOverlay:function(t,e,r){var n=r.getContext("2d"),i=t._frame.clone(),o=t.baseTexture.resolution;i.x*=o,i.y*=o,i.width*=o,i.height*=o,r.width=Math.ceil(i.width),r.height=Math.ceil(i.height),n.save(),n.globalCompositeOperation="copy",n.fillStyle="#"+("00000"+(0|e).toString(16)).substr(-6),n.fillRect(0,0,i.width,i.height),n.globalCompositeOperation="destination-atop",n.drawImage(t.baseTexture.source,i.x,i.y,i.width,i.height,0,0,i.width,i.height),n.restore()},tintWithPerPixel:function(t,e,r){var i=r.getContext("2d"),o=t._frame.clone(),s=t.baseTexture.resolution;o.x*=s,o.y*=s,o.width*=s,o.height*=s,r.width=Math.ceil(o.width),r.height=Math.ceil(o.height),i.save(),i.globalCompositeOperation="copy",i.drawImage(t.baseTexture.source,o.x,o.y,o.width,o.height,0,0,o.width,o.height),i.restore();for(var a=(0,n.hex2rgb)(e),u=a[0],h=a[1],l=a[2],c=i.getImageData(0,0,o.width,o.height),d=c.data,f=0;f=this.size&&this.flush(),t._texture._uvs&&(this.sprites[this.currentIndex++]=t)},e.prototype.flush=function(){if(0!==this.currentIndex){var t=this.renderer.gl,e=this.MAX_TEXTURES,r=S.default.nextPow2(this.currentIndex),n=S.default.log2(r),i=this.buffers[n],o=this.sprites,s=this.groups,a=i.float32View,u=i.uint32View,h=this.boundTextures,l=this.renderer.boundTextures,c=this.renderer.textureGC.count,d=0,f=void 0,p=void 0,v=1,y=0,g=s[0],m=void 0,_=void 0,T=x.premultiplyBlendMode[o[0]._texture.baseTexture.premultipliedAlpha?1:0][o[0].blendMode];g.textureCount=0,g.start=0,g.blend=T,O++;var E=void 0;for(E=0;E0&&(e+="\nelse "),r0&&(r.shadowColor=e.dropShadowColor);for(var f=Math.cos(e.dropShadowAngle)*e.dropShadowDistance,p=Math.sin(e.dropShadowAngle)*e.dropShadowDistance,v=0;v3&&void 0!==arguments[3]&&arguments[3],i=this._style,o=i.letterSpacing;if(0===o)return void(n?this.context.strokeText(t,e,r):this.context.fillText(t,e,r));for(var s=String.prototype.split.call(t,""),a=e,u=0,h="";u3&&void 0!==arguments[3]?arguments[3]:t._canvas;n=n||r.wordWrap;var o=r.toFontString(),s=t.measureFont(o),a=i.getContext("2d");a.font=o;for(var u=n?t.wordWrap(e,r,i):e,h=u.split(/(?:\r\n|\r|\n)/),l=new Array(h.length),c=0,d=0;d2&&void 0!==arguments[2]?arguments[2]:t._canvas,i=n.getContext("2d"),o="",s=e.split("\n"),a=r.wordWrapWidth,u={},h=0;ha)for(var p=c[d].split(""),v=0;vl?(o+="\n"+y,l=a-g):(0===v&&(o+=" "),o+=y,l-=g)}else{var m=f+i.measureText(" ").width;0===d||m>l?(d>0&&(o+="\n"),o+=c[d],l=a-f):(l-=m,o+=" "+c[d])}}hs;--c){for(var v=0;v=0;r--){var n=e[r].trim();/([\"\'])[^\'\"]+\1/.test(n)||(n='"'+n+'"'),e[r]=n}return this.fontStyle+" "+this.fontVariant+" "+this.fontWeight+" "+t+" "+e.join(",")},a(t,[{key:"align",get:function(){return this._align},set:function(t){this._align!==t&&(this._align=t,this.styleID++)}},{key:"breakWords",get:function(){return this._breakWords},set:function(t){this._breakWords!==t&&(this._breakWords=t,this.styleID++)}},{key:"dropShadow",get:function(){return this._dropShadow},set:function(t){this._dropShadow!==t&&(this._dropShadow=t,this.styleID++)}},{key:"dropShadowAlpha",get:function(){return this._dropShadowAlpha},set:function(t){this._dropShadowAlpha!==t&&(this._dropShadowAlpha=t,this.styleID++)}},{key:"dropShadowAngle",get:function(){return this._dropShadowAngle},set:function(t){this._dropShadowAngle!==t&&(this._dropShadowAngle=t,this.styleID++)}},{key:"dropShadowBlur",get:function(){return this._dropShadowBlur},set:function(t){this._dropShadowBlur!==t&&(this._dropShadowBlur=t,this.styleID++)}},{key:"dropShadowColor",get:function(){return this._dropShadowColor},set:function(t){var e=o(t);this._dropShadowColor!==e&&(this._dropShadowColor=e,this.styleID++)}},{key:"dropShadowDistance",get:function(){return this._dropShadowDistance},set:function(t){this._dropShadowDistance!==t&&(this._dropShadowDistance=t,this.styleID++)}},{key:"fill",get:function(){return this._fill},set:function(t){var e=o(t);this._fill!==e&&(this._fill=e,this.styleID++)}},{key:"fillGradientType",get:function(){return this._fillGradientType},set:function(t){this._fillGradientType!==t&&(this._fillGradientType=t,this.styleID++)}},{key:"fillGradientStops",get:function(){return this._fillGradientStops},set:function(t){s(this._fillGradientStops,t)||(this._fillGradientStops=t,this.styleID++)}},{key:"fontFamily",get:function(){return this._fontFamily},set:function(t){this.fontFamily!==t&&(this._fontFamily=t,this.styleID++)}},{key:"fontSize",get:function(){return this._fontSize},set:function(t){this._fontSize!==t&&(this._fontSize=t,this.styleID++)}},{key:"fontStyle",get:function(){return this._fontStyle},set:function(t){this._fontStyle!==t&&(this._fontStyle=t,this.styleID++)}},{key:"fontVariant",get:function(){return this._fontVariant},set:function(t){this._fontVariant!==t&&(this._fontVariant=t,this.styleID++)}},{key:"fontWeight",get:function(){return this._fontWeight},set:function(t){this._fontWeight!==t&&(this._fontWeight=t,this.styleID++)}},{key:"letterSpacing",get:function(){return this._letterSpacing},set:function(t){this._letterSpacing!==t&&(this._letterSpacing=t,this.styleID++)}},{key:"lineHeight",get:function(){return this._lineHeight},set:function(t){this._lineHeight!==t&&(this._lineHeight=t,this.styleID++)}},{key:"leading",get:function(){return this._leading},set:function(t){this._leading!==t&&(this._leading=t,this.styleID++)}},{key:"lineJoin",get:function(){return this._lineJoin},set:function(t){this._lineJoin!==t&&(this._lineJoin=t,this.styleID++)}},{key:"miterLimit",get:function(){return this._miterLimit},set:function(t){this._miterLimit!==t&&(this._miterLimit=t,this.styleID++)}},{key:"padding",get:function(){return this._padding},set:function(t){this._padding!==t&&(this._padding=t,this.styleID++)}},{key:"stroke",get:function(){return this._stroke},set:function(t){var e=o(t);this._stroke!==e&&(this._stroke=e,this.styleID++)}},{key:"strokeThickness",get:function(){return this._strokeThickness},set:function(t){this._strokeThickness!==t&&(this._strokeThickness=t,this.styleID++)}},{key:"textBaseline",get:function(){return this._textBaseline},set:function(t){this._textBaseline!==t&&(this._textBaseline=t,this.styleID++)}},{key:"trim",get:function(){return this._trim},set:function(t){this._trim!==t&&(this._trim=t,this.styleID++)}},{key:"wordWrap",get:function(){return this._wordWrap},set:function(t){this._wordWrap!==t&&(this._wordWrap=t,this.styleID++)}},{key:"wordWrapWidth",get:function(){return this._wordWrapWidth},set:function(t){this._wordWrapWidth!==t&&(this._wordWrapWidth=t,this.styleID++)}}]),t}();r.default=c},{"../const":46,"../utils":125}],111:[function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}r.__esModule=!0;var a=t("./BaseTexture"),u=n(a),h=t("../settings"),l=n(h),c=function(t){function e(){var r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:100,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:100,s=arguments[2],a=arguments[3];i(this,e);var u=o(this,t.call(this,null,s));return u.resolution=a||l.default.RESOLUTION,u.width=Math.ceil(r),u.height=Math.ceil(n),u.realWidth=u.width*u.resolution,u.realHeight=u.height*u.resolution,u.scaleMode=void 0!==s?s:l.default.SCALE_MODE,u.hasLoaded=!0,u._glRenderTargets={},u._canvasRenderTarget=null,u.valid=!1,u}return s(e,t),e.prototype.resize=function(t,e){t=Math.ceil(t),e=Math.ceil(e),t===this.width&&e===this.height||(this.valid=t>0&&e>0,this.width=t,this.height=e,this.realWidth=this.width*this.resolution,this.realHeight=this.height*this.resolution,this.valid&&this.emit("update",this))},e.prototype.destroy=function(){t.prototype.destroy.call(this,!0),this.renderer=null},e}(u.default);r.default=c},{"../settings":101,"./BaseTexture":112}],112:[function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}r.__esModule=!0;var a=t("../utils"),u=t("../settings"),h=n(u),l=t("eventemitter3"),c=n(l),d=t("../utils/determineCrossOrigin"),f=n(d),p=t("bit-twiddle"),v=n(p),y=function(t){function e(r,n,s){i(this,e);var u=o(this,t.call(this));return u.uid=(0,a.uid)(),u.touched=0,u.resolution=s||h.default.RESOLUTION,u.width=100,u.height=100,u.realWidth=100,u.realHeight=100,u.scaleMode=void 0!==n?n:h.default.SCALE_MODE,u.hasLoaded=!1,u.isLoading=!1,u.source=null,u.origSource=null,u.imageType=null,u.sourceScale=1,u.premultipliedAlpha=!0,u.imageUrl=null,u.isPowerOfTwo=!1,u.mipmap=h.default.MIPMAP_TEXTURES,u.wrapMode=h.default.WRAP_MODE,u._glTextures={},u._enabled=0,u._virtalBoundId=-1,u._destroyed=!1,u.textureCacheIds=[],r&&u.loadSource(r),u}return s(e,t),e.prototype.update=function(){"svg"!==this.imageType&&(this.realWidth=this.source.naturalWidth||this.source.videoWidth||this.source.width,this.realHeight=this.source.naturalHeight||this.source.videoHeight||this.source.height,this._updateDimensions()),this.emit("update",this)},e.prototype._updateDimensions=function(){this.width=this.realWidth/this.resolution,this.height=this.realHeight/this.resolution,this.isPowerOfTwo=v.default.isPow2(this.realWidth)&&v.default.isPow2(this.realHeight)},e.prototype.loadSource=function(t){var e=this.isLoading;this.hasLoaded=!1,this.isLoading=!1,e&&this.source&&(this.source.onload=null,this.source.onerror=null);var r=!this.source;if(this.source=t,(t.src&&t.complete||t.getContext)&&t.width&&t.height)this._updateImageType(),"svg"===this.imageType?this._loadSvgSource():this._sourceLoaded(),r&&this.emit("loaded",this);else if(!t.getContext){this.isLoading=!0;var n=this;if(t.onload=function(){if(n._updateImageType(),t.onload=null,t.onerror=null,n.isLoading){if(n.isLoading=!1,n._sourceLoaded(),"svg"===n.imageType)return void n._loadSvgSource();n.emit("loaded",n)}},t.onerror=function(){t.onload=null,t.onerror=null,n.isLoading&&(n.isLoading=!1,n.emit("error",n))},t.complete&&t.src){if(t.onload=null,t.onerror=null,"svg"===n.imageType)return void n._loadSvgSource();this.isLoading=!1,t.width&&t.height?(this._sourceLoaded(),e&&this.emit("loaded",this)):e&&this.emit("error",this)}}},e.prototype._updateImageType=function(){if(this.imageUrl){var t=(0,a.decomposeDataUri)(this.imageUrl),e=void 0;if(t&&"image"===t.mediaType){var r=t.subType.split("+")[0];if(!(e=(0,a.getUrlFileExtension)("."+r)))throw new Error("Invalid image type in data URI.")}else(e=(0,a.getUrlFileExtension)(this.imageUrl))||(e="png");this.imageType=e}},e.prototype._loadSvgSource=function(){if("svg"===this.imageType){var t=(0,a.decomposeDataUri)(this.imageUrl);t?this._loadSvgSourceUsingDataUri(t):this._loadSvgSourceUsingXhr()}},e.prototype._loadSvgSourceUsingDataUri=function(t){var e=void 0;if("base64"===t.encoding){if(!atob)throw new Error("Your browser doesn't support base64 conversions.");e=atob(t.data)}else e=t.data;this._loadSvgSourceUsingString(e)},e.prototype._loadSvgSourceUsingXhr=function(){var t=this,e=new XMLHttpRequest;e.onload=function(){if(e.readyState!==e.DONE||200!==e.status)throw new Error("Failed to load SVG using XHR.");t._loadSvgSourceUsingString(e.response)},e.onerror=function(){return t.emit("error",t)},e.open("GET",this.imageUrl,!0),e.send()},e.prototype._loadSvgSourceUsingString=function(t){var r=(0,a.getSvgSize)(t),n=r.width,i=r.height;if(!n||!i)throw new Error("The SVG image must have width and height defined (in pixels), canvas API needs them.");this.realWidth=Math.round(n*this.sourceScale),this.realHeight=Math.round(i*this.sourceScale),this._updateDimensions();var o=document.createElement("canvas");o.width=this.realWidth,o.height=this.realHeight,o._pixiId="canvas_"+(0,a.uid)(),o.getContext("2d").drawImage(this.source,0,0,n,i,0,0,this.realWidth,this.realHeight),this.origSource=this.source,this.source=o,e.addToCache(this,o._pixiId),this.isLoading=!1,this._sourceLoaded(),this.emit("loaded",this)},e.prototype._sourceLoaded=function(){this.hasLoaded=!0,this.update()},e.prototype.destroy=function(){this.imageUrl&&(delete a.TextureCache[this.imageUrl],this.imageUrl=null,navigator.isCocoonJS||(this.source.src="")),this.source=null,this.dispose(),e.removeFromCache(this),this.textureCacheIds=null,this._destroyed=!0},e.prototype.dispose=function(){this.emit("dispose",this)},e.prototype.updateSourceImage=function(t){this.source.src=t,this.loadSource(this.source)},e.fromImage=function(t,r,n,i){var o=a.BaseTextureCache[t];if(!o){var s=new Image;void 0===r&&0!==t.indexOf("data:")?s.crossOrigin=(0,f.default)(t):r&&(s.crossOrigin="string"==typeof r?r:"anonymous"),o=new e(s,n),o.imageUrl=t,i&&(o.sourceScale=i),o.resolution=(0,a.getResolutionOfUrl)(t),s.src=t,e.addToCache(o,t)}return o},e.fromCanvas=function(t,r){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"canvas";t._pixiId||(t._pixiId=n+"_"+(0,a.uid)());var i=a.BaseTextureCache[t._pixiId];return i||(i=new e(t,r),e.addToCache(i,t._pixiId)),i},e.from=function(t,r,n){if("string"==typeof t)return e.fromImage(t,void 0,r,n);if(t instanceof HTMLImageElement){var i=t.src,o=a.BaseTextureCache[i];return o||(o=new e(t,r),o.imageUrl=i,n&&(o.sourceScale=n),o.resolution=(0,a.getResolutionOfUrl)(i),e.addToCache(o,i)),o}return t instanceof HTMLCanvasElement?e.fromCanvas(t,r):t},e.addToCache=function(t,e){e&&(-1===t.textureCacheIds.indexOf(e)&&t.textureCacheIds.push(e),a.BaseTextureCache[e]=t)},e.removeFromCache=function(t){if("string"==typeof t){var e=a.BaseTextureCache[t];if(e){var r=e.textureCacheIds.indexOf(t);return r>-1&&e.textureCacheIds.splice(r,1),delete a.BaseTextureCache[t],e}}else if(t&&t.textureCacheIds){for(var n=0;n0&&e>0,this._frame.width=this.orig.width=t,this._frame.height=this.orig.height=e,r||this.baseTexture.resize(t,e),this._updateUvs()},e.create=function(t,r,n,i){return new e(new u.default(t,r,n,i))},e}(l.default);r.default=c},{"./BaseRenderTexture":111,"./Texture":115}],114:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.__esModule=!0;var i=function(){function t(t,e){for(var r=0;r2&&void 0!==arguments[2]?arguments[2]:null;n(this,t),this.baseTexture=e,this.textures={},this.data=r,this.resolution=this._updateResolution(i||this.baseTexture.imageUrl),this._frames=this.data.frames,this._frameKeys=Object.keys(this._frames),this._batchIndex=0,this._callback=null}return i(t,null,[{key:"BATCH_SIZE",get:function(){return 1e3}}]),t.prototype._updateResolution=function(t){var e=this.data.meta.scale,r=(0,s.getResolutionOfUrl)(t,null);return null===r&&(r=void 0!==e?parseFloat(e):1),1!==r&&(this.baseTexture.resolution=r,this.baseTexture.update()),r},t.prototype.parse=function(e){this._batchIndex=0,this._callback=e,this._frameKeys.length<=t.BATCH_SIZE?(this._processFrames(0),this._parseComplete()):this._nextBatch()},t.prototype._processFrames=function(e){for(var r=e,n=t.BATCH_SIZE,i=this.baseTexture.sourceScale;r-e0&&void 0!==arguments[0]&&arguments[0];for(var e in this.textures)this.textures[e].destroy();this._frames=null,this._frameKeys=null,this.data=null,this.textures=null,t&&this.baseTexture.destroy(),this.baseTexture=null},t}();r.default=a},{"../":65,"../utils":125}],115:[function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function o(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function a(t){t.destroy=function(){},t.on=function(){},t.once=function(){},t.emit=function(){}}r.__esModule=!0;var u=function(){function t(t,e){for(var r=0;r2&&void 0!==arguments[2]?arguments[2]:"canvas";return new e(l.default.fromCanvas(t,r,n))},e.fromVideo=function(t,r){return"string"==typeof t?e.fromVideoUrl(t,r):new e(d.default.fromVideo(t,r))},e.fromVideoUrl=function(t,r){return new e(d.default.fromUrl(t,r))},e.from=function(t){if("string"==typeof t){var r=m.TextureCache[t];if(!r){return null!==t.match(/\.(mp4|webm|ogg|h264|avi|mov)$/)?e.fromVideoUrl(t):e.fromImage(t)}return r}return t instanceof HTMLImageElement?new e(l.default.from(t)):t instanceof HTMLCanvasElement?e.fromCanvas(t,b.default.SCALE_MODE,"HTMLCanvasElement"):t instanceof HTMLVideoElement?e.fromVideo(t):t instanceof l.default?new e(t):t},e.fromLoader=function(t,r,n){var i=new l.default(t,void 0,(0,m.getResolutionOfUrl)(r)),o=new e(i);return i.imageUrl=r,n||(n=r),l.default.addToCache(o.baseTexture,n),e.addToCache(o,n),n!==r&&(l.default.addToCache(o.baseTexture,r), +e.addToCache(o,r)),o},e.addToCache=function(t,e){e&&(-1===t.textureCacheIds.indexOf(e)&&t.textureCacheIds.push(e),m.TextureCache[e]=t)},e.removeFromCache=function(t){if("string"==typeof t){var e=m.TextureCache[t];if(e){var r=e.textureCacheIds.indexOf(t);return r>-1&&e.textureCacheIds.splice(r,1),delete m.TextureCache[t],e}}else if(t&&t.textureCacheIds){for(var n=0;nthis.baseTexture.width,s=r+i>this.baseTexture.height;if(o||s){var a=o&&s?"and":"or",u="X: "+e+" + "+n+" = "+(e+n)+" > "+this.baseTexture.width,h="Y: "+r+" + "+i+" = "+(r+i)+" > "+this.baseTexture.height;throw new Error("Texture Error: frame does not fit inside the base Texture dimensions: "+u+" "+a+" "+h)}this.valid=n&&i&&this.baseTexture.hasLoaded,this.trim||this.rotate||(this.orig=t),this.valid&&this._updateUvs()}},{key:"rotate",get:function(){return this._rotate},set:function(t){this._rotate=t,this.valid&&this._updateUvs()}},{key:"width",get:function(){return this.orig.width}},{key:"height",get:function(){return this.orig.height}}]),e}(y.default);r.default=x,x.EMPTY=new x(new l.default),a(x.EMPTY),a(x.EMPTY.baseTexture),x.WHITE=function(){var t=document.createElement("canvas");t.width=10,t.height=10;var e=t.getContext("2d");return e.fillStyle="white",e.fillRect(0,0,10,10),new x(new l.default(t))}(),a(x.WHITE),a(x.WHITE.baseTexture)},{"../math":70,"../settings":101,"../utils":125,"./BaseTexture":112,"./TextureUvs":117,"./VideoBaseTexture":118,eventemitter3:3}],116:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.__esModule=!0;var i=function(){function t(t,e){for(var r=0;r0&&!1===t.paused&&!1===t.ended&&t.readyState>2},e.prototype._isSourceReady=function(){return 3===this.source.readyState||4===this.source.readyState},e.prototype._onPlayStart=function(){this.hasLoaded||this._onCanPlay(),!this._isAutoUpdating&&this.autoUpdate&&(d.shared.add(this.update,this,f.UPDATE_PRIORITY.HIGH),this._isAutoUpdating=!0)},e.prototype._onPlayStop=function(){this._isAutoUpdating&&(d.shared.remove(this.update,this),this._isAutoUpdating=!1)},e.prototype._onCanPlay=function(){this.hasLoaded=!0,this.source&&(this.source.removeEventListener("canplay",this._onCanPlay),this.source.removeEventListener("canplaythrough",this._onCanPlay),this.width=this.source.videoWidth,this.height=this.source.videoHeight,this.__loaded||(this.__loaded=!0,this.emit("loaded",this)),this._isSourcePlaying()?this._onPlayStart():this.autoPlay&&this.source.play())},e.prototype.destroy=function(){this._isAutoUpdating&&d.shared.remove(this.update,this),this.source&&this.source._pixiId&&(l.default.removeFromCache(this.source._pixiId),delete this.source._pixiId),t.prototype.destroy.call(this)},e.fromVideo=function(t,r){t._pixiId||(t._pixiId="video_"+(0,c.uid)());var n=c.BaseTextureCache[t._pixiId];return n||(n=new e(t,r),l.default.addToCache(n,t._pixiId)),n},e.fromUrl=function(t,r,n){var i=document.createElement("video");i.setAttribute("webkit-playsinline",""),i.setAttribute("playsinline","");var o=Array.isArray(t)?t[0].src||t[0]:t.src||t;if(void 0===n&&0!==o.indexOf("data:")?i.crossOrigin=(0,v.default)(o):n&&(i.crossOrigin="string"==typeof n?n:"anonymous"),Array.isArray(t))for(var s=0;s2&&void 0!==arguments[2]?arguments[2]:u.UPDATE_PRIORITY.NORMAL;return this._addListener(new l.default(t,e,r))},t.prototype.addOnce=function(t,e){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:u.UPDATE_PRIORITY.NORMAL;return this._addListener(new l.default(t,e,r,!0))},t.prototype._addListener=function(t){var e=this._head.next,r=this._head;if(e){for(;e;){if(t.priority>e.priority){t.connect(r);break}r=e,e=e.next}t.previous||t.connect(r)}else t.connect(r);return this._startIfPossible(),this},t.prototype.remove=function(t,e){for(var r=this._head.next;r;)r=r.match(t,e)?r.destroy():r.next;return this._head.next||this._cancelIfNeeded(),this},t.prototype.start=function(){this.started||(this.started=!0,this._requestIfNeeded())},t.prototype.stop=function(){this.started&&(this.started=!1,this._cancelIfNeeded())},t.prototype.destroy=function(){this.stop();for(var t=this._head.next;t;)t=t.destroy(!0);this._head.destroy(),this._head=null},t.prototype.update=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:performance.now(),e=void 0;if(t>this.lastTime){e=this.elapsedMS=t-this.lastTime,e>this._maxElapsedMS&&(e=this._maxElapsedMS),this.deltaTime=e*a.default.TARGET_FPMS*this.speed;for(var r=this._head,n=r.next;n;)n=n.emit(this.deltaTime);r.next||this._cancelIfNeeded()}else this.deltaTime=this.elapsedMS=0;this.lastTime=t},o(t,[{key:"FPS",get:function(){return 1e3/this.elapsedMS}},{key:"minFPS",get:function(){return 1e3/this._maxElapsedMS},set:function(t){var e=Math.min(Math.max(0,t)/1e3,a.default.TARGET_FPMS);this._maxElapsedMS=1/e}}]),t}();r.default=c},{"../const":46,"../settings":101,"./TickerListener":120}],120:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.__esModule=!0;var i=function(){function t(e){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,o=arguments.length>3&&void 0!==arguments[3]&&arguments[3];n(this,t),this.fn=e,this.context=r,this.priority=i,this.once=o,this.next=null,this.previous=null,this._destroyed=!1}return t.prototype.match=function(t,e){return e=e||null,this.fn===t&&this.context===e},t.prototype.emit=function(t){this.fn&&(this.context?this.fn.call(this.context,t):this.fn(t));var e=this.next;return this.once&&this.destroy(!0),this._destroyed&&(this.next=null),e},t.prototype.connect=function(t){this.previous=t,t.next&&(t.next.previous=this),this.next=t.next,t.next=this},t.prototype.destroy=function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this._destroyed=!0,this.fn=null,this.context=null,this.previous&&(this.previous.next=this.next),this.next&&(this.next.previous=this.previous);var e=this.previous;return this.next=t?null:e,this.previous=null,e},t}();r.default=i},{}],121:[function(t,e,r){"use strict";r.__esModule=!0,r.Ticker=r.shared=void 0;var n=t("./Ticker"),i=function(t){return t&&t.__esModule?t:{default:t}}(n),o=new i.default;o.autoStart=!0,o.destroy=function(){},r.shared=o,r.Ticker=i.default},{"./Ticker":119}],122:[function(t,e,r){"use strict";function n(){return!(!!navigator.platform&&/iPad|iPhone|iPod/.test(navigator.platform))}r.__esModule=!0,r.default=n},{}],123:[function(t,e,r){"use strict";function n(t){for(var e=6*t,r=new Uint16Array(e),n=0,i=0;n1&&void 0!==arguments[1]?arguments[1]:window.location;if(0===t.indexOf("data:"))return"";e=e||window.location,s||(s=document.createElement("a")),s.href=t,t=o.default.parse(s.href);var r=!t.port&&""===e.port||t.port===e.port;return t.hostname===e.hostname&&r&&t.protocol===e.protocol?"":"anonymous"}r.__esModule=!0,r.default=n;var i=t("url"),o=function(t){return t&&t.__esModule?t:{default:t}}(i),s=void 0},{url:38}],125:[function(t,e,r){"use strict";function n(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e.default=t,e}function i(t){return t&&t.__esModule?t:{default:t}}function o(){return++k}function s(t,e){return e=e||[],e[0]=(t>>16&255)/255,e[1]=(t>>8&255)/255,e[2]=(255&t)/255,e}function a(t){return t=t.toString(16),"#"+(t="000000".substr(0,6-t.length)+t)}function u(t){return(255*t[0]<<16)+(255*t[1]<<8)+(255*t[2]|0)}function h(t,e){var r=S.default.RETINA_PREFIX.exec(t);return r?parseFloat(r[1]):void 0!==e?e:1}function l(t){var e=w.DATA_URI.exec(t);if(e)return{mediaType:e[1]?e[1].toLowerCase():void 0,subType:e[2]?e[2].toLowerCase():void 0,encoding:e[3]?e[3].toLowerCase():void 0,data:e[4]}}function c(t){var e=w.URL_FILE_EXTENSION.exec(t);if(e)return e[1].toLowerCase()}function d(t){var e=w.SVG_SIZE.exec(t),r={};return e&&(r[e[1]]=Math.round(parseFloat(e[3])),r[e[5]]=Math.round(parseFloat(e[7]))),r}function f(){j=!0}function p(t){if(!j){if(navigator.userAgent.toLowerCase().indexOf("chrome")>-1){var e=["\n %c %c %c PixiJS "+w.VERSION+" - ✰ "+t+" ✰ %c %c http://www.pixijs.com/ %c %c ♥%c♥%c♥ \n\n","background: #ff66a5; padding:5px 0;","background: #ff66a5; padding:5px 0;","color: #ff66a5; background: #030307; padding:5px 0;","background: #ff66a5; padding:5px 0;","background: #ffc3dc; padding:5px 0;","background: #ff66a5; padding:5px 0;","color: #ff2424; background: #fff; padding:5px 0;","color: #ff2424; background: #fff; padding:5px 0;","color: #ff2424; background: #fff; padding:5px 0;"];window.console.log.apply(console,e)}else window.console&&window.console.log("PixiJS "+w.VERSION+" - "+t+" - http://www.pixijs.com/");j=!0}}function v(){var t={stencil:!0,failIfMajorPerformanceCaveat:!0};try{if(!window.WebGLRenderingContext)return!1;var e=document.createElement("canvas"),r=e.getContext("webgl",t)||e.getContext("experimental-webgl",t),n=!(!r||!r.getContextAttributes().stencil);if(r){var i=r.getExtension("WEBGL_lose_context");i&&i.loseContext()}return r=null,n}catch(t){return!1}}function y(t){return 0===t?0:t<0?-1:1}function g(){var t=void 0;for(t in U)U[t].destroy();for(t in X)X[t].destroy()}function m(){var t=void 0;for(t in U)delete U[t];for(t in X)delete X[t]}function _(t,e){return G[e?1:0][t]}function b(t,e){if(1===e)return(255*e<<24)+t;if(0===e)return 0;var r=t>>16&255,n=t>>8&255,i=255&t;return r=r*e+.5|0,n=n*e+.5|0,i=i*e+.5|0,(255*e<<24)+(r<<16)+(n<<8)+i}function x(t,e,r,n){return r=r||new Float32Array(4),n||void 0===n?(r[0]=t[0]*e,r[1]=t[1]*e,r[2]=t[2]*e):(r[0]=t[0],r[1]=t[1],r[2]=t[2]),r[3]=e,r}function T(t,e,r,n){return r=r||new Float32Array(4),r[0]=(t>>16&255)/255,r[1]=(t>>8&255)/255,r[2]=(255&t)/255,(n||void 0===n)&&(r[0]*=e,r[1]*=e,r[2]*=e),r[3]=e,r}r.__esModule=!0,r.premultiplyBlendMode=r.BaseTextureCache=r.TextureCache=r.mixins=r.pluginTarget=r.EventEmitter=r.removeItems=r.isMobile=void 0,r.uid=o,r.hex2rgb=s,r.hex2string=a,r.rgb2hex=u,r.getResolutionOfUrl=h,r.decomposeDataUri=l,r.getUrlFileExtension=c,r.getSvgSize=d,r.skipHello=f,r.sayHello=p,r.isWebGLSupported=v,r.sign=y,r.destroyTextureCache=g,r.clearTextureCache=m,r.correctBlendMode=_,r.premultiplyTint=b,r.premultiplyRgba=x,r.premultiplyTintToRgba=T;var w=t("../const"),E=t("../settings"),S=i(E),O=t("eventemitter3"),M=i(O),P=t("./pluginTarget"),C=i(P),R=t("./mixin"),A=n(R),I=t("ismobilejs"),D=n(I),L=t("remove-array-items"),N=i(L),F=t("./mapPremultipliedBlendModes"),B=i(F),k=0,j=!1;r.isMobile=D,r.removeItems=N.default,r.EventEmitter=M.default,r.pluginTarget=C.default,r.mixins=A;var U=r.TextureCache=Object.create(null),X=r.BaseTextureCache=Object.create(null),G=r.premultiplyBlendMode=(0,B.default)()},{"../const":46,"../settings":101,"./mapPremultipliedBlendModes":126,"./mixin":128,"./pluginTarget":129,eventemitter3:3,ismobilejs:4,"remove-array-items":31}],126:[function(t,e,r){"use strict";function n(){for(var t=[],e=[],r=0;r<32;r++)t[r]=r,e[r]=r;t[i.BLEND_MODES.NORMAL_NPM]=i.BLEND_MODES.NORMAL,t[i.BLEND_MODES.ADD_NPM]=i.BLEND_MODES.ADD,t[i.BLEND_MODES.SCREEN_NPM]=i.BLEND_MODES.SCREEN,e[i.BLEND_MODES.NORMAL]=i.BLEND_MODES.NORMAL_NPM,e[i.BLEND_MODES.ADD]=i.BLEND_MODES.ADD_NPM,e[i.BLEND_MODES.SCREEN]=i.BLEND_MODES.SCREEN_NPM;var n=[];return n.push(e),n.push(t),n}r.__esModule=!0,r.default=n;var i=t("../const")},{"../const":46}],127:[function(t,e,r){"use strict";function n(t){return o.default.tablet||o.default.phone?4:t}r.__esModule=!0,r.default=n;var i=t("ismobilejs"),o=function(t){return t&&t.__esModule?t:{default:t}}(i)},{ismobilejs:4}],128:[function(t,e,r){"use strict";function n(t,e){if(t&&e)for(var r=Object.keys(e),n=0;n1?this._fontStyle="italic":t.indexOf("oblique")>-1?this._fontStyle="oblique":this._fontStyle="normal",t.indexOf("small-caps")>-1?this._fontVariant="small-caps":this._fontVariant="normal";var e=t.split(" "),r=-1;this._fontSize=26;for(var i=0;i-1&&r=this._durations[this.currentFrame];)n-=this._durations[this.currentFrame]*i,this._currentTime+=i;this._currentTime+=n/this._durations[this.currentFrame]}else this._currentTime+=e;this._currentTime<0&&!this.loop?(this.gotoAndStop(0),this.onComplete&&this.onComplete()):this._currentTime>=this._textures.length&&!this.loop?(this.gotoAndStop(this._textures.length-1),this.onComplete&&this.onComplete()):r!==this.currentFrame&&(this.loop&&this.onLoop&&(this.animationSpeed>0&&this.currentFramer&&this.onLoop()),this.updateTexture())},e.prototype.updateTexture=function(){this._texture=this._textures[this.currentFrame],this._textureID=-1,this.cachedTint=16777215,this.onFrameChange&&this.onFrameChange(this.currentFrame)},e.prototype.destroy=function(e){this.stop(),t.prototype.destroy.call(this,e)},e.fromFrames=function(t){for(var r=[],n=0;n1&&void 0!==arguments[1]?arguments[1]:{};i(this,e);var s=o(this,t.call(this));return s._textWidth=0,s._textHeight=0,s._glyphs=[],s._font={tint:void 0!==n.tint?n.tint:16777215,align:n.align||"left",name:null,size:0},s.font=n.font,s._text=r,s._maxWidth=0,s._maxLineHeight=0,s._anchor=new c.default(function(){s.dirty=!0},s,0,0),s.dirty=!1,s.updateText(),s}return s(e,t),e.prototype.updateText=function(){for(var t=e.fonts[this._font.name],r=this._font.size/t.size,n=new h.Point,i=[],o=[],s=null,a=0,u=0,l=0,c=-1,d=0,f=0,p=0,v=0;v0&&n.x*r>this._maxWidth)h.utils.removeItems(i,c-f,v-c),v=c,c=-1,++f,o.push(d),u=Math.max(u,d),l++,n.x=0,n.y+=t.lineHeight,s=null;else{var g=t.chars[y];g&&(s&&g.kerning[s]&&(n.x+=g.kerning[s]),i.push({texture:g.texture,line:l,charCode:y,position:new h.Point(n.x+g.xOffset,n.y+g.yOffset)}),a=n.x+(g.texture.width+g.xOffset),n.x+=g.xAdvance,p=Math.max(p,g.yOffset+g.texture.height),s=y)}}o.push(a),u=Math.max(u,a);for(var m=[],_=0;_<=l;_++){var b=0;"right"===this._font.align?b=u-o[_]:"center"===this._font.align&&(b=(u-o[_])/2),m.push(b)}for(var x=i.length,T=this.tint,w=0;w=0?t:16777215,this.dirty=!0}},{key:"align",get:function(){return this._font.align},set:function(t){this._font.align=t||"left",this.dirty=!0}},{key:"anchor",get:function(){return this._anchor},set:function(t){"number"==typeof t?this._anchor.set(t):this._anchor.copy(t)}},{key:"font",get:function(){return this._font},set:function(t){t&&("string"==typeof t?(t=t.split(" "),this._font.name=1===t.length?t[0]:t.slice(1).join(" "),this._font.size=t.length>=2?parseInt(t[0],10):e.fonts[this._font.name].size):(this._font.name=t.name,this._font.size="number"==typeof t.size?t.size:parseInt(t.size,10)),this.dirty=!0)}},{key:"text",get:function(){return this._text},set:function(t){t=t.toString()||" ",this._text!==t&&(this._text=t,this.dirty=!0)}},{key:"maxWidth",get:function(){return this._maxWidth},set:function(t){this._maxWidth!==t&&(this._maxWidth=t,this.dirty=!0)}},{key:"maxLineHeight",get:function(){return this.validate(),this._maxLineHeight}},{key:"textWidth",get:function(){return this.validate(),this._textWidth}},{key:"textHeight",get:function(){return this.validate(),this._textHeight}}]),e}(h.Container);r.default=v,v.fonts={}},{"../core":65,"../core/math/ObservablePoint":68,"../core/settings":101,"../core/utils":125}],137:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}r.__esModule=!0;var s=function(){function t(t,e){for(var r=0;r1&&void 0!==arguments[1]?arguments[1]:100,s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:100;n(this,e);var a=i(this,t.call(this,r));return a.tileTransform=new u.TransformStatic,a._width=o,a._height=s,a._canvasPattern=null,a.uvTransform=r.transform||new u.TextureMatrix(r),a.pluginName="tilingSprite",a.uvRespectAnchor=!1,a}return o(e,t),e.prototype._onTextureUpdate=function(){this.uvTransform&&(this.uvTransform.texture=this._texture),this.cachedTint=16777215},e.prototype._renderWebGL=function(t){var e=this._texture;e&&e.valid&&(this.tileTransform.updateLocalTransform(),this.uvTransform.update(),t.setObjectRenderer(t.plugins[this.pluginName]),t.plugins[this.pluginName].render(this))},e.prototype._renderCanvas=function(t){var e=this._texture;if(e.baseTexture.hasLoaded){var r=t.context,n=this.worldTransform,i=t.resolution,o=e.baseTexture,s=o.resolution,a=this.tilePosition.x/this.tileScale.x%e._frame.width*s,h=this.tilePosition.y/this.tileScale.y%e._frame.height*s;if(this._textureID!==this._texture._updateID||this.cachedTint!==this.tint){this._textureID=this._texture._updateID;var c=new u.CanvasRenderTarget(e._frame.width,e._frame.height,s);16777215!==this.tint?(this.tintedTexture=l.default.getTintedTexture(this,this.tint),c.context.drawImage(this.tintedTexture,0,0)):c.context.drawImage(o.source,-e._frame.x*s,-e._frame.y*s),this.cachedTint=this.tint,this._canvasPattern=c.context.createPattern(c.canvas,"repeat")}r.globalAlpha=this.worldAlpha,r.setTransform(n.a*i,n.b*i,n.c*i,n.d*i,n.tx*i,n.ty*i),t.setBlendMode(this.blendMode),r.fillStyle=this._canvasPattern,r.scale(this.tileScale.x/s,this.tileScale.y/s);var d=this.anchor.x*-this._width,f=this.anchor.y*-this._height;this.uvRespectAnchor?(r.translate(a,h),r.fillRect(-a+d,-h+f,this._width/this.tileScale.x*s,this._height/this.tileScale.y*s)):(r.translate(a+d,h+f),r.fillRect(-a,-h,this._width/this.tileScale.x*s,this._height/this.tileScale.y*s))}},e.prototype._calculateBounds=function(){var t=this._width*-this._anchor._x,e=this._height*-this._anchor._y,r=this._width*(1-this._anchor._x),n=this._height*(1-this._anchor._y);this._bounds.addFrame(this.transform,t,e,r,n)},e.prototype.getLocalBounds=function(e){return 0===this.children.length?(this._bounds.minX=this._width*-this._anchor._x,this._bounds.minY=this._height*-this._anchor._y,this._bounds.maxX=this._width*(1-this._anchor._x),this._bounds.maxY=this._height*(1-this._anchor._x),e||(this._localBoundsRect||(this._localBoundsRect=new u.Rectangle),e=this._localBoundsRect),this._bounds.getRectangle(e)):t.prototype.getLocalBounds.call(this,e)},e.prototype.containsPoint=function(t){this.worldTransform.applyInverse(t,c);var e=this._width,r=this._height,n=-e*this.anchor._x;if(c.x>=n&&c.x=i&&c.y0&&void 0!==arguments[0]?arguments[0]:new i.Point,e=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return this.parent?this.parent.toGlobal(this.position,t,e):(t.x=this.position.x,t.y=this.position.y),t}},{"../core":65}],141:[function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}r.__esModule=!0,r.BitmapText=r.TilingSpriteRenderer=r.TilingSprite=r.AnimatedSprite=void 0;var i=t("./AnimatedSprite");Object.defineProperty(r,"AnimatedSprite",{enumerable:!0,get:function(){return n(i).default}});var o=t("./TilingSprite");Object.defineProperty(r,"TilingSprite",{enumerable:!0,get:function(){return n(o).default}});var s=t("./webgl/TilingSpriteRenderer");Object.defineProperty(r,"TilingSpriteRenderer",{enumerable:!0,get:function(){return n(s).default}});var a=t("./BitmapText");Object.defineProperty(r,"BitmapText",{enumerable:!0,get:function(){return n(a).default}}),t("./cacheAsBitmap"),t("./getChildByName"),t("./getGlobalPosition")},{"./AnimatedSprite":135,"./BitmapText":136,"./TilingSprite":137,"./cacheAsBitmap":138,"./getChildByName":139,"./getGlobalPosition":140,"./webgl/TilingSpriteRenderer":142}],142:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}r.__esModule=!0;var s=t("../../core"),a=function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e.default=t,e}(s),u=t("../../core/const"),h=(t("path"),new a.Matrix),l=function(t){function e(r){n(this,e);var o=i(this,t.call(this,r));return o.shader=null,o.simpleShader=null,o.quad=null,o}return o(e,t),e.prototype.onContextChange=function(){var t=this.renderer.gl;this.shader=new a.Shader(t,"attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\nuniform mat3 translationMatrix;\nuniform mat3 uTransform;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * translationMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n\n vTextureCoord = (uTransform * vec3(aTextureCoord, 1.0)).xy;\n}\n","varying vec2 vTextureCoord;\n\nuniform sampler2D uSampler;\nuniform vec4 uColor;\nuniform mat3 uMapCoord;\nuniform vec4 uClampFrame;\nuniform vec2 uClampOffset;\n\nvoid main(void)\n{\n vec2 coord = mod(vTextureCoord - uClampOffset, vec2(1.0, 1.0)) + uClampOffset;\n coord = (uMapCoord * vec3(coord, 1.0)).xy;\n coord = clamp(coord, uClampFrame.xy, uClampFrame.zw);\n\n vec4 sample = texture2D(uSampler, coord);\n gl_FragColor = sample * uColor;\n}\n"),this.simpleShader=new a.Shader(t,"attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\nuniform mat3 translationMatrix;\nuniform mat3 uTransform;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * translationMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n\n vTextureCoord = (uTransform * vec3(aTextureCoord, 1.0)).xy;\n}\n","varying vec2 vTextureCoord;\n\nuniform sampler2D uSampler;\nuniform vec4 uColor;\n\nvoid main(void)\n{\n vec4 sample = texture2D(uSampler, vTextureCoord);\n gl_FragColor = sample * uColor;\n}\n"),this.renderer.bindVao(null),this.quad=new a.Quad(t,this.renderer.state.attribState),this.quad.initVao(this.shader)}, +e.prototype.render=function(t){var e=this.renderer,r=this.quad;e.bindVao(r.vao);var n=r.vertices;n[0]=n[6]=t._width*-t.anchor.x,n[1]=n[3]=t._height*-t.anchor.y,n[2]=n[4]=t._width*(1-t.anchor.x),n[5]=n[7]=t._height*(1-t.anchor.y),t.uvRespectAnchor&&(n=r.uvs,n[0]=n[6]=-t.anchor.x,n[1]=n[3]=-t.anchor.y,n[2]=n[4]=1-t.anchor.x,n[5]=n[7]=1-t.anchor.y),r.upload();var i=t._texture,o=i.baseTexture,s=t.tileTransform.localTransform,l=t.uvTransform,c=o.isPowerOfTwo&&i.frame.width===o.width&&i.frame.height===o.height;c&&(o._glTextures[e.CONTEXT_UID]?c=o.wrapMode!==u.WRAP_MODES.CLAMP:o.wrapMode===u.WRAP_MODES.CLAMP&&(o.wrapMode=u.WRAP_MODES.REPEAT));var d=c?this.simpleShader:this.shader;e.bindShader(d);var f=i.width,p=i.height,v=t._width,y=t._height;h.set(s.a*f/v,s.b*f/y,s.c*p/v,s.d*p/y,s.tx/v,s.ty/y),h.invert(),c?h.prepend(l.mapCoord):(d.uniforms.uMapCoord=l.mapCoord.toArray(!0),d.uniforms.uClampFrame=l.uClampFrame,d.uniforms.uClampOffset=l.uClampOffset),d.uniforms.uTransform=h.toArray(!0),d.uniforms.uColor=a.utils.premultiplyTintToRgba(t.tint,t.worldAlpha,d.uniforms.uColor,o.premultipliedAlpha),d.uniforms.translationMatrix=t.transform.worldTransform.toArray(!0),d.uniforms.uSampler=e.bindTexture(i),e.setBlendMode(a.utils.correctBlendMode(t.blendMode,o.premultipliedAlpha)),r.vao.draw(this.renderer.gl.TRIANGLES,6,0)},e}(a.ObjectRenderer);r.default=l,a.WebGLRenderer.registerPlugin("tilingSprite",l)},{"../../core":65,"../../core/const":46,path:8}],143:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}r.__esModule=!0;var s=function(){function t(t,e){for(var r=0;r=r&&(u=t-h-1),l=l.replace("%value%",e[u]),s+=l,s+="\n"}return n=n.replace("%blur%",s),n=n.replace("%size%",t)}r.__esModule=!0,r.default=n;var i={5:[.153388,.221461,.250301],7:[.071303,.131514,.189879,.214607],9:[.028532,.067234,.124009,.179044,.20236],11:[.0093,.028002,.065984,.121703,.175713,.198596],13:[.002406,.009255,.027867,.065666,.121117,.174868,.197641],15:[489e-6,.002403,.009246,.02784,.065602,.120999,.174697,.197448]},o=["varying vec2 vBlurTexCoords[%size%];","uniform sampler2D uSampler;","void main(void)","{"," gl_FragColor = vec4(0.0);"," %blur%","}"].join("\n")},{}],148:[function(t,e,r){"use strict";function n(t,e){var r=Math.ceil(t/2),n=i,o="",s=void 0;s=e?"vBlurTexCoords[%index%] = aTextureCoord + vec2(%sampleIndex% * strength, 0.0);":"vBlurTexCoords[%index%] = aTextureCoord + vec2(0.0, %sampleIndex% * strength);";for(var a=0;ae;)r-=2;return r}r.__esModule=!0,r.default=n},{}],150:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}r.__esModule=!0;var s=function(){function t(t,e){for(var r=0;r 0.0) {\n c.rgb /= c.a;\n }\n\n vec4 result;\n\n result.r = (m[0] * c.r);\n result.r += (m[1] * c.g);\n result.r += (m[2] * c.b);\n result.r += (m[3] * c.a);\n result.r += m[4];\n\n result.g = (m[5] * c.r);\n result.g += (m[6] * c.g);\n result.g += (m[7] * c.b);\n result.g += (m[8] * c.a);\n result.g += m[9];\n\n result.b = (m[10] * c.r);\n result.b += (m[11] * c.g);\n result.b += (m[12] * c.b);\n result.b += (m[13] * c.a);\n result.b += m[14];\n\n result.a = (m[15] * c.r);\n result.a += (m[16] * c.g);\n result.a += (m[17] * c.b);\n result.a += (m[18] * c.a);\n result.a += m[19];\n\n vec3 rgb = mix(c.rgb, result.rgb, uAlpha);\n\n // Premultiply alpha again.\n rgb *= result.a;\n\n gl_FragColor = vec4(rgb, result.a);\n}\n"));return r.uniforms.m=[1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0],r.alpha=1,r}return o(e,t),e.prototype._loadMatrix=function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=t;e&&(this._multiply(r,this.uniforms.m,t),r=this._colorMatrix(r)),this.uniforms.m=r},e.prototype._multiply=function(t,e,r){return t[0]=e[0]*r[0]+e[1]*r[5]+e[2]*r[10]+e[3]*r[15],t[1]=e[0]*r[1]+e[1]*r[6]+e[2]*r[11]+e[3]*r[16],t[2]=e[0]*r[2]+e[1]*r[7]+e[2]*r[12]+e[3]*r[17],t[3]=e[0]*r[3]+e[1]*r[8]+e[2]*r[13]+e[3]*r[18],t[4]=e[0]*r[4]+e[1]*r[9]+e[2]*r[14]+e[3]*r[19]+e[4],t[5]=e[5]*r[0]+e[6]*r[5]+e[7]*r[10]+e[8]*r[15],t[6]=e[5]*r[1]+e[6]*r[6]+e[7]*r[11]+e[8]*r[16],t[7]=e[5]*r[2]+e[6]*r[7]+e[7]*r[12]+e[8]*r[17],t[8]=e[5]*r[3]+e[6]*r[8]+e[7]*r[13]+e[8]*r[18],t[9]=e[5]*r[4]+e[6]*r[9]+e[7]*r[14]+e[8]*r[19]+e[9],t[10]=e[10]*r[0]+e[11]*r[5]+e[12]*r[10]+e[13]*r[15],t[11]=e[10]*r[1]+e[11]*r[6]+e[12]*r[11]+e[13]*r[16],t[12]=e[10]*r[2]+e[11]*r[7]+e[12]*r[12]+e[13]*r[17],t[13]=e[10]*r[3]+e[11]*r[8]+e[12]*r[13]+e[13]*r[18],t[14]=e[10]*r[4]+e[11]*r[9]+e[12]*r[14]+e[13]*r[19]+e[14],t[15]=e[15]*r[0]+e[16]*r[5]+e[17]*r[10]+e[18]*r[15],t[16]=e[15]*r[1]+e[16]*r[6]+e[17]*r[11]+e[18]*r[16],t[17]=e[15]*r[2]+e[16]*r[7]+e[17]*r[12]+e[18]*r[17],t[18]=e[15]*r[3]+e[16]*r[8]+e[17]*r[13]+e[18]*r[18],t[19]=e[15]*r[4]+e[16]*r[9]+e[17]*r[14]+e[18]*r[19]+e[19],t},e.prototype._colorMatrix=function(t){var e=new Float32Array(t);return e[4]/=255,e[9]/=255,e[14]/=255,e[19]/=255,e},e.prototype.brightness=function(t,e){var r=[t,0,0,0,0,0,t,0,0,0,0,0,t,0,0,0,0,0,1,0];this._loadMatrix(r,e)},e.prototype.greyscale=function(t,e){var r=[t,t,t,0,0,t,t,t,0,0,t,t,t,0,0,0,0,0,1,0];this._loadMatrix(r,e)},e.prototype.blackAndWhite=function(t){var e=[.3,.6,.1,0,0,.3,.6,.1,0,0,.3,.6,.1,0,0,0,0,0,1,0];this._loadMatrix(e,t)},e.prototype.hue=function(t,e){t=(t||0)/180*Math.PI;var r=Math.cos(t),n=Math.sin(t),i=Math.sqrt,o=1/3,s=i(o),a=r+(1-r)*o,u=o*(1-r)-s*n,h=o*(1-r)+s*n,l=o*(1-r)+s*n,c=r+o*(1-r),d=o*(1-r)-s*n,f=o*(1-r)-s*n,p=o*(1-r)+s*n,v=r+o*(1-r),y=[a,u,h,0,0,l,c,d,0,0,f,p,v,0,0,0,0,0,1,0];this._loadMatrix(y,e)},e.prototype.contrast=function(t,e){var r=(t||0)+1,n=-.5*(r-1),i=[r,0,0,0,n,0,r,0,0,n,0,0,r,0,n,0,0,0,1,0];this._loadMatrix(i,e)},e.prototype.saturate=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments[1],r=2*t/3+1,n=-.5*(r-1),i=[r,n,n,0,0,n,r,n,0,0,n,n,r,0,0,0,0,0,1,0];this._loadMatrix(i,e)},e.prototype.desaturate=function(){this.saturate(-1)},e.prototype.negative=function(t){var e=[0,1,1,0,0,1,0,1,0,0,1,1,0,0,0,0,0,0,1,0];this._loadMatrix(e,t)},e.prototype.sepia=function(t){var e=[.393,.7689999,.18899999,0,0,.349,.6859999,.16799999,0,0,.272,.5339999,.13099999,0,0,0,0,0,1,0];this._loadMatrix(e,t)},e.prototype.technicolor=function(t){var e=[1.9125277891456083,-.8545344976951645,-.09155508482755585,0,11.793603434377337,-.3087833385928097,1.7658908555458428,-.10601743074722245,0,-70.35205161461398,-.231103377548616,-.7501899197440212,1.847597816108189,0,30.950940869491138,0,0,0,1,0];this._loadMatrix(e,t)},e.prototype.polaroid=function(t){var e=[1.438,-.062,-.062,0,0,-.122,1.378,-.122,0,0,-.016,-.016,1.483,0,0,0,0,0,1,0];this._loadMatrix(e,t)},e.prototype.toBGR=function(t){var e=[0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0];this._loadMatrix(e,t)},e.prototype.kodachrome=function(t){var e=[1.1285582396593525,-.3967382283601348,-.03992559172921793,0,63.72958762196502,-.16404339962244616,1.0835251566291304,-.05498805115633132,0,24.732407896706203,-.16786010706155763,-.5603416277695248,1.6014850761964943,0,35.62982807460946,0,0,0,1,0];this._loadMatrix(e,t)},e.prototype.browni=function(t){var e=[.5997023498159715,.34553243048391263,-.2708298674538042,0,47.43192855600873,-.037703249837783157,.8609577587992641,.15059552388459913,0,-36.96841498319127,.24113635128153335,-.07441037908422492,.44972182064877153,0,-7.562075277591283,0,0,0,1,0];this._loadMatrix(e,t)},e.prototype.vintage=function(t){var e=[.6279345635605994,.3202183420819367,-.03965408211312453,0,9.651285835294123,.02578397704808868,.6441188644374771,.03259127616149294,0,7.462829176470591,.0466055556782719,-.0851232987247891,.5241648018700465,0,5.159190588235296,0,0,0,1,0];this._loadMatrix(e,t)},e.prototype.colorTone=function(t,e,r,n,i){t=t||.2,e=e||.15,r=r||16770432,n=n||3375104;var o=(r>>16&255)/255,s=(r>>8&255)/255,a=(255&r)/255,u=(n>>16&255)/255,h=(n>>8&255)/255,l=(255&n)/255,c=[.3,.59,.11,0,0,o,s,a,t,0,u,h,l,e,0,o-u,s-h,a-l,0,0];this._loadMatrix(c,i)},e.prototype.night=function(t,e){t=t||.1;var r=[-2*t,-t,0,0,0,-t,0,t,0,0,0,t,2*t,0,0,0,0,0,1,0];this._loadMatrix(r,e)},e.prototype.predator=function(t,e){var r=[11.224130630493164*t,-4.794486999511719*t,-2.8746118545532227*t,0*t,.40342438220977783*t,-3.6330697536468506*t,9.193157196044922*t,-2.951810836791992*t,0*t,-1.316135048866272*t,-3.2184197902679443*t,-4.2375030517578125*t,7.476448059082031*t,0*t,.8044459223747253*t,0,0,0,1,0];this._loadMatrix(r,e)},e.prototype.lsd=function(t){var e=[2,-.4,.5,0,0,-.5,2,-.4,0,0,-.4,-.5,3,0,0,0,0,0,1,0];this._loadMatrix(e,t)},e.prototype.reset=function(){var t=[1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0];this._loadMatrix(t,!1)},s(e,[{key:"matrix",get:function(){return this.uniforms.m},set:function(t){this.uniforms.m=t}},{key:"alpha",get:function(){return this.uniforms.uAlpha},set:function(t){this.uniforms.uAlpha=t}}]),e}(u.Filter));r.default=h,h.prototype.grayscale=h.prototype.greyscale},{"../../core":65,path:8}],151:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}r.__esModule=!0;var s=function(){function t(t,e){for(var r=0;r lumaMax))\n color = vec4(rgbA, texColor.a);\n else\n color = vec4(rgbB, texColor.a);\n return color;\n}\n\nvoid main() {\n\n vec2 fragCoord = vTextureCoord * filterArea.xy;\n\n vec4 color;\n\n color = fxaa(uSampler, fragCoord, filterArea.xy, v_rgbNW, v_rgbNE, v_rgbSW, v_rgbSE, v_rgbM);\n\n gl_FragColor = color;\n}\n'))}return o(e,t),e}(a.Filter));r.default=u},{"../../core":65,path:8}],153:[function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}r.__esModule=!0;var i=t("./fxaa/FXAAFilter");Object.defineProperty(r,"FXAAFilter",{enumerable:!0,get:function(){return n(i).default}});var o=t("./noise/NoiseFilter");Object.defineProperty(r,"NoiseFilter",{enumerable:!0,get:function(){return n(o).default}});var s=t("./displacement/DisplacementFilter");Object.defineProperty(r,"DisplacementFilter",{enumerable:!0,get:function(){return n(s).default}});var a=t("./blur/BlurFilter");Object.defineProperty(r,"BlurFilter",{enumerable:!0,get:function(){return n(a).default}});var u=t("./blur/BlurXFilter");Object.defineProperty(r,"BlurXFilter",{enumerable:!0,get:function(){return n(u).default}});var h=t("./blur/BlurYFilter");Object.defineProperty(r,"BlurYFilter",{enumerable:!0,get:function(){return n(h).default}});var l=t("./colormatrix/ColorMatrixFilter");Object.defineProperty(r,"ColorMatrixFilter",{enumerable:!0,get:function(){return n(l).default}});var c=t("./alpha/AlphaFilter");Object.defineProperty(r,"AlphaFilter",{enumerable:!0,get:function(){return n(c).default}})},{"./alpha/AlphaFilter":143,"./blur/BlurFilter":144,"./blur/BlurXFilter":145,"./blur/BlurYFilter":146,"./colormatrix/ColorMatrixFilter":150,"./displacement/DisplacementFilter":151,"./fxaa/FXAAFilter":152,"./noise/NoiseFilter":154}],154:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}r.__esModule=!0;var s=function(){function t(t,e){for(var r=0;r0&&void 0!==arguments[0]?arguments[0]:.5,o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Math.random();n(this,e);var s=i(this,t.call(this,"attribute vec2 aVertexPosition;\nattribute vec2 aTextureCoord;\n\nuniform mat3 projectionMatrix;\n\nvarying vec2 vTextureCoord;\n\nvoid main(void)\n{\n gl_Position = vec4((projectionMatrix * vec3(aVertexPosition, 1.0)).xy, 0.0, 1.0);\n vTextureCoord = aTextureCoord;\n}","precision highp float;\n\nvarying vec2 vTextureCoord;\nvarying vec4 vColor;\n\nuniform float uNoise;\nuniform float uSeed;\nuniform sampler2D uSampler;\n\nfloat rand(vec2 co)\n{\n return fract(sin(dot(co.xy, vec2(12.9898, 78.233))) * 43758.5453);\n}\n\nvoid main()\n{\n vec4 color = texture2D(uSampler, vTextureCoord);\n float randomValue = rand(gl_FragCoord.xy * uSeed);\n float diff = (randomValue - 0.5) * uNoise;\n\n // Un-premultiply alpha before applying the color matrix. See issue #3539.\n if (color.a > 0.0) {\n color.rgb /= color.a;\n }\n\n color.r += diff;\n color.g += diff;\n color.b += diff;\n\n // Premultiply alpha again.\n color.rgb *= color.a;\n\n gl_FragColor = color;\n}\n"));return s.noise=r,s.seed=o,s}return o(e,t),s(e,[{key:"noise",get:function(){return this.uniforms.uNoise},set:function(t){this.uniforms.uNoise=t}},{key:"seed",get:function(){return this.uniforms.uSeed},set:function(t){this.uniforms.uSeed=t}}]),e}(u.Filter));r.default=h},{"../../core":65,path:8}],155:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.__esModule=!0;var i=function(){function t(t,e){for(var r=0;r1&&void 0!==arguments[1]?arguments[1]:1;this.removeEvents(),this.interactionDOMElement=t,this.resolution=e,this.addEvents()},e.prototype.addEvents=function(){this.interactionDOMElement&&(h.ticker.shared.add(this.update,this,h.UPDATE_PRIORITY.INTERACTION),window.navigator.msPointerEnabled?(this.interactionDOMElement.style["-ms-content-zooming"]="none",this.interactionDOMElement.style["-ms-touch-action"]="none"):this.supportsPointerEvents&&(this.interactionDOMElement.style["touch-action"]="none"),this.supportsPointerEvents?(window.document.addEventListener("pointermove",this.onPointerMove,!0),this.interactionDOMElement.addEventListener("pointerdown",this.onPointerDown,!0),this.interactionDOMElement.addEventListener("pointerleave",this.onPointerOut,!0),this.interactionDOMElement.addEventListener("pointerover",this.onPointerOver,!0),window.addEventListener("pointercancel",this.onPointerCancel,!0),window.addEventListener("pointerup",this.onPointerUp,!0)):(window.document.addEventListener("mousemove",this.onPointerMove,!0),this.interactionDOMElement.addEventListener("mousedown",this.onPointerDown,!0),this.interactionDOMElement.addEventListener("mouseout",this.onPointerOut,!0),this.interactionDOMElement.addEventListener("mouseover",this.onPointerOver,!0),window.addEventListener("mouseup",this.onPointerUp,!0)),this.supportsTouchEvents&&(this.interactionDOMElement.addEventListener("touchstart",this.onPointerDown,!0),this.interactionDOMElement.addEventListener("touchcancel",this.onPointerCancel,!0),this.interactionDOMElement.addEventListener("touchend",this.onPointerUp,!0),this.interactionDOMElement.addEventListener("touchmove",this.onPointerMove,!0)),this.eventsAdded=!0)},e.prototype.removeEvents=function(){this.interactionDOMElement&&(h.ticker.shared.remove(this.update,this),window.navigator.msPointerEnabled?(this.interactionDOMElement.style["-ms-content-zooming"]="",this.interactionDOMElement.style["-ms-touch-action"]=""):this.supportsPointerEvents&&(this.interactionDOMElement.style["touch-action"]=""),this.supportsPointerEvents?(window.document.removeEventListener("pointermove",this.onPointerMove,!0),this.interactionDOMElement.removeEventListener("pointerdown",this.onPointerDown,!0),this.interactionDOMElement.removeEventListener("pointerleave",this.onPointerOut,!0),this.interactionDOMElement.removeEventListener("pointerover",this.onPointerOver,!0),window.removeEventListener("pointercancel",this.onPointerCancel,!0),window.removeEventListener("pointerup",this.onPointerUp,!0)):(window.document.removeEventListener("mousemove",this.onPointerMove,!0),this.interactionDOMElement.removeEventListener("mousedown",this.onPointerDown,!0),this.interactionDOMElement.removeEventListener("mouseout",this.onPointerOut,!0),this.interactionDOMElement.removeEventListener("mouseover",this.onPointerOver,!0),window.removeEventListener("mouseup",this.onPointerUp,!0)),this.supportsTouchEvents&&(this.interactionDOMElement.removeEventListener("touchstart",this.onPointerDown,!0),this.interactionDOMElement.removeEventListener("touchcancel",this.onPointerCancel,!0),this.interactionDOMElement.removeEventListener("touchend",this.onPointerUp,!0),this.interactionDOMElement.removeEventListener("touchmove",this.onPointerMove,!0)),this.interactionDOMElement=null,this.eventsAdded=!1)},e.prototype.update=function(t){if(this._deltaTime+=t,!(this._deltaTime=0;h--){var l=u[h],c=this.processInteractive(t,l,r,n,a);if(c){if(!l.parent)continue;a=!1,c&&(t.target&&(n=!1),s=!0)}}return i&&(n&&!t.target&&(e.hitArea?(e.worldTransform.applyInverse(o,this._tempPoint),e.hitArea.contains(this._tempPoint.x,this._tempPoint.y)&&(s=!0)):e.containsPoint&&e.containsPoint(o)&&(s=!0)),e.interactive&&(s&&!t.target&&(t.target=e),r&&r(t,e,!!s))),s},e.prototype.onPointerDown=function(t){if(!this.supportsTouchEvents||"touch"!==t.pointerType){var e=this.normalizeToPointerData(t);this.autoPreventDefault&&e[0].isNormalized&&t.preventDefault();for(var r=e.length,n=0;n1&&(l=1);var c=Math.sqrt(n*n+i*i),d=this._texture.height/2;n/=c,i/=c,n*=d,i*=d,o[h]=u.x+n,o[h+1]=u.y+i,o[h+2]=u.x-n,o[h+3]=u.y-i,e=u}},e.prototype.updateTransform=function(){this.autoUpdate&&this.refreshVertices(),this.containerUpdateTransform()},e}(a.default);r.default=u},{"./Mesh":166}],170:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.__esModule=!0;var i=t("../../core"),o=function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e.default=t,e}(i),s=t("../Mesh"),a=function(t){return t&&t.__esModule?t:{default:t}}(s),u=function(){function t(e){n(this,t),this.renderer=e}return t.prototype.render=function(t){var e=this.renderer,r=e.context,n=t.worldTransform,i=e.resolution;e.roundPixels?r.setTransform(n.a*i,n.b*i,n.c*i,n.d*i,n.tx*i|0,n.ty*i|0):r.setTransform(n.a*i,n.b*i,n.c*i,n.d*i,n.tx*i,n.ty*i),e.setBlendMode(t.blendMode),t.drawMode===a.default.DRAW_MODES.TRIANGLE_MESH?this._renderTriangleMesh(t):this._renderTriangles(t)},t.prototype._renderTriangleMesh=function(t){for(var e=t.vertices.length/2,r=0;r0){var S=t.canvasPadding/t.worldTransform.a,O=t.canvasPadding/t.worldTransform.d,M=(_+b+x)/3,P=(T+w+E)/3,C=_-M,R=T-P,A=Math.sqrt(C*C+R*R);_=M+C/A*(A+S),T=P+R/A*(A+O),C=b-M,R=w-P,A=Math.sqrt(C*C+R*R),b=M+C/A*(A+S),w=P+R/A*(A+O),C=x-M,R=E-P,A=Math.sqrt(C*C+R*R),x=M+C/A*(A+S),E=P+R/A*(A+O)}i.save(),i.beginPath(),i.moveTo(_,T),i.lineTo(b,w),i.lineTo(x,E),i.closePath(),i.clip();var I=d*y+v*p+f*g-y*p-v*f-d*g,D=_*y+v*x+b*g-y*x-v*b-_*g,L=d*b+_*p+f*x-b*p-_*f-d*x,N=d*y*x+v*b*p+_*f*g-_*y*p-v*f*x-d*b*g,F=T*y+v*E+w*g-y*E-v*w-T*g,B=d*w+T*p+f*E-w*p-T*f-d*E,k=d*y*E+v*w*p+T*f*g-T*y*p-v*f*E-d*w*g;i.transform(D/I,F/I,L/I,B/I,N/I,k/I),i.drawImage(h,0,0,l*u.resolution,c*u.resolution,0,0,l,c),i.restore(),this.renderer.invalidateBlendMode()}},t.prototype.renderMeshFlat=function(t){var e=this.renderer.context,r=t.vertices,n=r.length/2;e.beginPath();for(var i=1;i0&&void 0!==arguments[0]?arguments[0]:1500,o=arguments[1],s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:16384,a=arguments.length>3&&void 0!==arguments[3]&&arguments[3];n(this,e);var h=i(this,t.call(this));return s>16384&&(s=16384),s>r&&(s=r),h._properties=[!1,!0,!1,!1,!1],h._maxSize=r,h._batchSize=s,h._glBuffers={},h._bufferToUpdate=0,h.interactiveChildren=!1,h.blendMode=u.BLEND_MODES.NORMAL,h.autoResize=a,h.roundPixels=!0,h.baseTexture=null,h.setProperties(o),h._tint=0,h.tintRgb=new Float32Array(4),h.tint=16777215,h}return o(e,t),e.prototype.setProperties=function(t){t&&(this._properties[0]="scale"in t?!!t.scale:this._properties[0],this._properties[1]="position"in t?!!t.position:this._properties[1],this._properties[2]="rotation"in t?!!t.rotation:this._properties[2],this._properties[3]="uvs"in t?!!t.uvs:this._properties[3],this._properties[4]="alpha"in t||"tint"in t?!!t.alpha||!!t.tint:this._properties[4])},e.prototype.updateTransform=function(){this.displayObjectUpdateTransform()},e.prototype.renderWebGL=function(t){var e=this;this.visible&&!(this.worldAlpha<=0)&&this.children.length&&this.renderable&&(this.baseTexture||(this.baseTexture=this.children[0]._texture.baseTexture,this.baseTexture.hasLoaded||this.baseTexture.once("update",function(){return e.onChildrenChange(0)})),t.setObjectRenderer(t.plugins.particle),t.plugins.particle.render(this))},e.prototype.onChildrenChange=function(t){var e=Math.floor(t/this._batchSize);er&&(o=r);var s=t._glBuffers[i.CONTEXT_UID];s||(s=t._glBuffers[i.CONTEXT_UID]=this.generateBuffers(t));var a=e[0]._texture.baseTexture;this.renderer.setBlendMode(u.utils.correctBlendMode(t.blendMode,a.premultipliedAlpha));var h=i.gl,l=t.worldTransform.copy(this.tempMatrix);l.prepend(i._activeRenderTarget.projectionMatrix),this.shader.uniforms.projectionMatrix=l.toArray(!0),this.shader.uniforms.uColor=u.utils.premultiplyRgba(t.tintRgb,t.worldAlpha,this.shader.uniforms.uColor,a.premultipliedAlpha),this.shader.uniforms.uSampler=i.bindTexture(a);for(var c=0,d=0;cn&&(f=n),d>=s.length){if(!t.autoResize)break;s.push(this._generateOneMoreBuffer(t))}var p=s[d];p.uploadDynamic(e,c,f),t._bufferToUpdate===d&&(p.uploadStatic(e,c,f),t._bufferToUpdate=d+1),i.bindVao(p.vao),p.vao.draw(h.TRIANGLES,6*f)}}},e.prototype.generateBuffers=function(t){for(var e=this.renderer.gl,r=[],n=t._maxSize,i=t._batchSize,o=t._properties,s=0;s0?1:-1})},{}],179:[function(t,e,r){"use strict";var n=t("object-assign"),i=function(t){return t&&t.__esModule?t:{default:t}}(n);Object.assign||(Object.assign=i.default)},{"object-assign":6}],180:[function(t,e,r){"use strict";t("./Object.assign"),t("./requestAnimationFrame"),t("./Math.sign"),window.ArrayBuffer||(window.ArrayBuffer=Array),window.Float32Array||(window.Float32Array=Array),window.Uint32Array||(window.Uint32Array=Array),window.Uint16Array||(window.Uint16Array=Array)},{"./Math.sign":178,"./Object.assign":179,"./requestAnimationFrame":181}],181:[function(t,e,r){(function(t){"use strict";if(Date.now&&Date.prototype.getTime||(Date.now=function(){return(new Date).getTime()}),!t.performance||!t.performance.now){var e=Date.now();t.performance||(t.performance={}),t.performance.now=function(){return Date.now()-e}}for(var r=Date.now(),n=["ms","moz","webkit","o"],i=0;i=0;n--)this.add(t.children[n]);return this},t.prototype.destroy=function(){this.ticking&&v.remove(this.tick,this),this.ticking=!1,this.addHooks=null,this.uploadHooks=null,this.renderer=null,this.completes=null,this.queue=null,this.limiter=null,this.uploadHookHelper=null},t}();r.default=y},{"../core":65,"./limiters/CountLimiter":185}],183:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function s(t,e){if(e instanceof u.BaseTexture){var r=e.source,n=0===r.width?t.canvas.width:Math.min(t.canvas.width,r.width),i=0===r.height?t.canvas.height:Math.min(t.canvas.height,r.height);return t.ctx.drawImage(r,0,0,n,i,0,0,t.canvas.width,t.canvas.height),!0}return!1}r.__esModule=!0;var a=t("../../core"),u=function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e.default=t,e}(a),h=t("../BasePrepare"),l=function(t){return t&&t.__esModule?t:{default:t}}(h),c=16,d=function(t){function e(r){n(this,e);var o=i(this,t.call(this,r));return o.uploadHookHelper=o,o.canvas=document.createElement("canvas"),o.canvas.width=c,o.canvas.height=c,o.ctx=o.canvas.getContext("2d"),o.registerUploadHook(s),o}return o(e,t),e.prototype.destroy=function(){t.prototype.destroy.call(this),this.ctx=null,this.canvas=null},e}(l.default);r.default=d,u.CanvasRenderer.registerPlugin("prepare",d)},{"../../core":65,"../BasePrepare":182}],184:[function(t,e,r){"use strict";function n(t){return t&&t.__esModule?t:{default:t}}r.__esModule=!0;var i=t("./webgl/WebGLPrepare");Object.defineProperty(r,"webgl",{enumerable:!0,get:function(){return n(i).default}});var o=t("./canvas/CanvasPrepare");Object.defineProperty(r,"canvas",{enumerable:!0,get:function(){return n(o).default}});var s=t("./BasePrepare");Object.defineProperty(r,"BasePrepare",{enumerable:!0,get:function(){return n(s).default}});var a=t("./limiters/CountLimiter");Object.defineProperty(r,"CountLimiter",{enumerable:!0,get:function(){return n(a).default}});var u=t("./limiters/TimeLimiter");Object.defineProperty(r,"TimeLimiter",{enumerable:!0,get:function(){return n(u).default}})},{"./BasePrepare":182,"./canvas/CanvasPrepare":183,"./limiters/CountLimiter":185,"./limiters/TimeLimiter":186,"./webgl/WebGLPrepare":187}],185:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.__esModule=!0;var i=function(){function t(e){n(this,t),this.maxItemsPerFrame=e,this.itemsLeft=0}return t.prototype.beginFrame=function(){this.itemsLeft=this.maxItemsPerFrame},t.prototype.allowedToUpload=function(){return this.itemsLeft-- >0},t}();r.default=i},{}],186:[function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.__esModule=!0;var i=function(){function t(e){n(this,t),this.maxMilliseconds=e,this.frameStart=0}return t.prototype.beginFrame=function(){this.frameStart=Date.now()},t.prototype.allowedToUpload=function(){return Date.now()-this.frameStartc;c++)if(b===a[c])return c;return-1},this.createjs=this.createjs||{},function(){"use strict";function Event(a,b,c){this.type=a,this.target=null,this.currentTarget=null,this.eventPhase=0,this.bubbles=!!b,this.cancelable=!!c,this.timeStamp=(new Date).getTime(),this.defaultPrevented=!1,this.propagationStopped=!1,this.immediatePropagationStopped=!1,this.removed=!1}var a=Event.prototype;a.preventDefault=function(){this.defaultPrevented=this.cancelable&&!0},a.stopPropagation=function(){this.propagationStopped=!0},a.stopImmediatePropagation=function(){this.immediatePropagationStopped=this.propagationStopped=!0},a.remove=function(){this.removed=!0},a.clone=function(){return new Event(this.type,this.bubbles,this.cancelable)},a.set=function(a){for(var b in a)this[b]=a[b];return this},a.toString=function(){return"[Event (type="+this.type+")]"},createjs.Event=Event}(),this.createjs=this.createjs||{},function(){"use strict";function ErrorEvent(a,b,c){this.Event_constructor("error"),this.title=a,this.message=b,this.data=c}var a=createjs.extend(ErrorEvent,createjs.Event);a.clone=function(){return new createjs.ErrorEvent(this.title,this.message,this.data)},createjs.ErrorEvent=createjs.promote(ErrorEvent,"Event")}(),this.createjs=this.createjs||{},function(){"use strict";function EventDispatcher(){this._listeners=null,this._captureListeners=null}var a=EventDispatcher.prototype;EventDispatcher.initialize=function(b){b.addEventListener=a.addEventListener,b.on=a.on,b.removeEventListener=b.off=a.removeEventListener,b.removeAllEventListeners=a.removeAllEventListeners,b.hasEventListener=a.hasEventListener,b.dispatchEvent=a.dispatchEvent,b._dispatchEvent=a._dispatchEvent,b.willTrigger=a.willTrigger},a.addEventListener=function(a,b,c){var d;d=c?this._captureListeners=this._captureListeners||{}:this._listeners=this._listeners||{};var e=d[a];return e&&this.removeEventListener(a,b,c),e=d[a],e?e.push(b):d[a]=[b],b},a.on=function(a,b,c,d,e,f){return b.handleEvent&&(c=c||b,b=b.handleEvent),c=c||this,this.addEventListener(a,function(a){b.call(c,a,e),d&&a.remove()},f)},a.removeEventListener=function(a,b,c){var d=c?this._captureListeners:this._listeners;if(d){var e=d[a];if(e)for(var f=0,g=e.length;g>f;f++)if(e[f]==b){1==g?delete d[a]:e.splice(f,1);break}}},a.off=a.removeEventListener,a.removeAllEventListeners=function(a){a?(this._listeners&&delete this._listeners[a],this._captureListeners&&delete this._captureListeners[a]):this._listeners=this._captureListeners=null},a.dispatchEvent=function(a,b,c){if("string"==typeof a){var d=this._listeners;if(!(b||d&&d[a]))return!0;a=new createjs.Event(a,b,c)}else a.target&&a.clone&&(a=a.clone());try{a.target=this}catch(e){}if(a.bubbles&&this.parent){for(var f=this,g=[f];f.parent;)g.push(f=f.parent);var h,i=g.length;for(h=i-1;h>=0&&!a.propagationStopped;h--)g[h]._dispatchEvent(a,1+(0==h));for(h=1;i>h&&!a.propagationStopped;h++)g[h]._dispatchEvent(a,3)}else this._dispatchEvent(a,2);return!a.defaultPrevented},a.hasEventListener=function(a){var b=this._listeners,c=this._captureListeners;return!!(b&&b[a]||c&&c[a])},a.willTrigger=function(a){for(var b=this;b;){if(b.hasEventListener(a))return!0;b=b.parent}return!1},a.toString=function(){return"[EventDispatcher]"},a._dispatchEvent=function(a,b){var c,d=1==b?this._captureListeners:this._listeners;if(a&&d){var e=d[a.type];if(!e||!(c=e.length))return;try{a.currentTarget=this}catch(f){}try{a.eventPhase=b}catch(f){}a.removed=!1,e=e.slice();for(var g=0;c>g&&!a.immediatePropagationStopped;g++){var h=e[g];h.handleEvent?h.handleEvent(a):h(a),a.removed&&(this.off(a.type,h,1==b),a.removed=!1)}}},createjs.EventDispatcher=EventDispatcher}(),this.createjs=this.createjs||{},function(){"use strict";function ProgressEvent(a,b){this.Event_constructor("progress"),this.loaded=a,this.total=null==b?1:b,this.progress=0==b?0:this.loaded/this.total}var a=createjs.extend(ProgressEvent,createjs.Event);a.clone=function(){return new createjs.ProgressEvent(this.loaded,this.total)},createjs.ProgressEvent=createjs.promote(ProgressEvent,"Event")}(window),function(){function a(b,d){function f(a){if(f[a]!==q)return f[a];var b;if("bug-string-char-index"==a)b="a"!="a"[0];else if("json"==a)b=f("json-stringify")&&f("json-parse");else{var c,e='{"a":[1,true,false,null,"\\u0000\\b\\n\\f\\r\\t"]}';if("json-stringify"==a){var i=d.stringify,k="function"==typeof i&&t;if(k){(c=function(){return 1}).toJSON=c;try{k="0"===i(0)&&"0"===i(new g)&&'""'==i(new h)&&i(s)===q&&i(q)===q&&i()===q&&"1"===i(c)&&"[1]"==i([c])&&"[null]"==i([q])&&"null"==i(null)&&"[null,null,null]"==i([q,s,null])&&i({a:[c,!0,!1,null,"\x00\b\n\f\r "]})==e&&"1"===i(null,c)&&"[\n 1,\n 2\n]"==i([1,2],null,1)&&'"-271821-04-20T00:00:00.000Z"'==i(new j(-864e13))&&'"+275760-09-13T00:00:00.000Z"'==i(new j(864e13))&&'"-000001-01-01T00:00:00.000Z"'==i(new j(-621987552e5))&&'"1969-12-31T23:59:59.999Z"'==i(new j(-1))}catch(l){k=!1}}b=k}if("json-parse"==a){var m=d.parse;if("function"==typeof m)try{if(0===m("0")&&!m(!1)){c=m(e);var n=5==c.a.length&&1===c.a[0];if(n){try{n=!m('" "')}catch(l){}if(n)try{n=1!==m("01")}catch(l){}if(n)try{n=1!==m("1.")}catch(l){}}}}catch(l){n=!1}b=n}}return f[a]=!!b}b||(b=e.Object()),d||(d=e.Object());var g=b.Number||e.Number,h=b.String||e.String,i=b.Object||e.Object,j=b.Date||e.Date,k=b.SyntaxError||e.SyntaxError,l=b.TypeError||e.TypeError,m=b.Math||e.Math,n=b.JSON||e.JSON;"object"==typeof n&&n&&(d.stringify=n.stringify,d.parse=n.parse);var o,p,q,r=i.prototype,s=r.toString,t=new j(-0xc782b5b800cec);try{t=-109252==t.getUTCFullYear()&&0===t.getUTCMonth()&&1===t.getUTCDate()&&10==t.getUTCHours()&&37==t.getUTCMinutes()&&6==t.getUTCSeconds()&&708==t.getUTCMilliseconds()}catch(u){}if(!f("json")){var v="[object Function]",w="[object Date]",x="[object Number]",y="[object String]",z="[object Array]",A="[object Boolean]",B=f("bug-string-char-index");if(!t)var C=m.floor,D=[0,31,59,90,120,151,181,212,243,273,304,334],E=function(a,b){return D[b]+365*(a-1970)+C((a-1969+(b=+(b>1)))/4)-C((a-1901+b)/100)+C((a-1601+b)/400)};if((o=r.hasOwnProperty)||(o=function(a){var b,c={};return(c.__proto__=null,c.__proto__={toString:1},c).toString!=s?o=function(a){var b=this.__proto__,c=a in(this.__proto__=null,this);return this.__proto__=b,c}:(b=c.constructor,o=function(a){var c=(this.constructor||b).prototype;return a in this&&!(a in c&&this[a]===c[a])}),c=null,o.call(this,a)}),p=function(a,b){var d,e,f,g=0;(d=function(){this.valueOf=0}).prototype.valueOf=0,e=new d;for(f in e)o.call(e,f)&&g++;return d=e=null,g?p=2==g?function(a,b){var c,d={},e=s.call(a)==v;for(c in a)e&&"prototype"==c||o.call(d,c)||!(d[c]=1)||!o.call(a,c)||b(c)}:function(a,b){var c,d,e=s.call(a)==v;for(c in a)e&&"prototype"==c||!o.call(a,c)||(d="constructor"===c)||b(c);(d||o.call(a,c="constructor"))&&b(c)}:(e=["valueOf","toString","toLocaleString","propertyIsEnumerable","isPrototypeOf","hasOwnProperty","constructor"],p=function(a,b){var d,f,g=s.call(a)==v,h=!g&&"function"!=typeof a.constructor&&c[typeof a.hasOwnProperty]&&a.hasOwnProperty||o;for(d in a)g&&"prototype"==d||!h.call(a,d)||b(d);for(f=e.length;d=e[--f];h.call(a,d)&&b(d));}),p(a,b)},!f("json-stringify")){var F={92:"\\\\",34:'\\"',8:"\\b",12:"\\f",10:"\\n",13:"\\r",9:"\\t"},G="000000",H=function(a,b){return(G+(b||0)).slice(-a)},I="\\u00",J=function(a){for(var b='"',c=0,d=a.length,e=!B||d>10,f=e&&(B?a.split(""):a);d>c;c++){var g=a.charCodeAt(c);switch(g){case 8:case 9:case 10:case 12:case 13:case 34:case 92:b+=F[g];break;default:if(32>g){b+=I+H(2,g.toString(16));break}b+=e?f[c]:a.charAt(c)}}return b+'"'},K=function(a,b,c,d,e,f,g){var h,i,j,k,m,n,r,t,u,v,B,D,F,G,I,L;try{h=b[a]}catch(M){}if("object"==typeof h&&h)if(i=s.call(h),i!=w||o.call(h,"toJSON"))"function"==typeof h.toJSON&&(i!=x&&i!=y&&i!=z||o.call(h,"toJSON"))&&(h=h.toJSON(a));else if(h>-1/0&&1/0>h){if(E){for(m=C(h/864e5),j=C(m/365.2425)+1970-1;E(j+1,0)<=m;j++);for(k=C((m-E(j,0))/30.42);E(j,k+1)<=m;k++);m=1+m-E(j,k),n=(h%864e5+864e5)%864e5,r=C(n/36e5)%24,t=C(n/6e4)%60,u=C(n/1e3)%60,v=n%1e3}else j=h.getUTCFullYear(),k=h.getUTCMonth(),m=h.getUTCDate(),r=h.getUTCHours(),t=h.getUTCMinutes(),u=h.getUTCSeconds(),v=h.getUTCMilliseconds();h=(0>=j||j>=1e4?(0>j?"-":"+")+H(6,0>j?-j:j):H(4,j))+"-"+H(2,k+1)+"-"+H(2,m)+"T"+H(2,r)+":"+H(2,t)+":"+H(2,u)+"."+H(3,v)+"Z"}else h=null;if(c&&(h=c.call(b,a,h)),null===h)return"null";if(i=s.call(h),i==A)return""+h;if(i==x)return h>-1/0&&1/0>h?""+h:"null";if(i==y)return J(""+h);if("object"==typeof h){for(G=g.length;G--;)if(g[G]===h)throw l();if(g.push(h),B=[],I=f,f+=e,i==z){for(F=0,G=h.length;G>F;F++)D=K(F,h,c,d,e,f,g),B.push(D===q?"null":D);L=B.length?e?"[\n"+f+B.join(",\n"+f)+"\n"+I+"]":"["+B.join(",")+"]":"[]"}else p(d||h,function(a){var b=K(a,h,c,d,e,f,g);b!==q&&B.push(J(a)+":"+(e?" ":"")+b)}),L=B.length?e?"{\n"+f+B.join(",\n"+f)+"\n"+I+"}":"{"+B.join(",")+"}":"{}";return g.pop(),L}};d.stringify=function(a,b,d){var e,f,g,h;if(c[typeof b]&&b)if((h=s.call(b))==v)f=b;else if(h==z){g={};for(var i,j=0,k=b.length;k>j;i=b[j++],h=s.call(i),(h==y||h==x)&&(g[i]=1));}if(d)if((h=s.call(d))==x){if((d-=d%1)>0)for(e="",d>10&&(d=10);e.lengthL;)switch(e=f.charCodeAt(L)){case 9:case 10:case 13:case 32:L++;break;case 123:case 125:case 91:case 93:case 58:case 44:return a=B?f.charAt(L):f[L],L++,a;case 34:for(a="@",L++;g>L;)if(e=f.charCodeAt(L),32>e)P();else if(92==e)switch(e=f.charCodeAt(++L)){case 92:case 34:case 47:case 98:case 116:case 110:case 102:case 114:a+=O[e],L++;break;case 117:for(b=++L,c=L+4;c>L;L++)e=f.charCodeAt(L),e>=48&&57>=e||e>=97&&102>=e||e>=65&&70>=e||P();a+=N("0x"+f.slice(b,L));break;default:P()}else{if(34==e)break;for(e=f.charCodeAt(L),b=L;e>=32&&92!=e&&34!=e;)e=f.charCodeAt(++L);a+=f.slice(b,L)}if(34==f.charCodeAt(L))return L++,a;P();default:if(b=L,45==e&&(d=!0,e=f.charCodeAt(++L)),e>=48&&57>=e){for(48==e&&(e=f.charCodeAt(L+1),e>=48&&57>=e)&&P(),d=!1;g>L&&(e=f.charCodeAt(L),e>=48&&57>=e);L++);if(46==f.charCodeAt(L)){for(c=++L;g>c&&(e=f.charCodeAt(c),e>=48&&57>=e);c++);c==L&&P(),L=c}if(e=f.charCodeAt(L),101==e||69==e){for(e=f.charCodeAt(++L),(43==e||45==e)&&L++,c=L;g>c&&(e=f.charCodeAt(c),e>=48&&57>=e);c++);c==L&&P(),L=c}return+f.slice(b,L)}if(d&&P(),"true"==f.slice(L,L+4))return L+=4,!0;if("false"==f.slice(L,L+5))return L+=5,!1;if("null"==f.slice(L,L+4))return L+=4,null;P()}return"$"},R=function(a){var b,c;if("$"==a&&P(),"string"==typeof a){if("@"==(B?a.charAt(0):a[0]))return a.slice(1);if("["==a){for(b=[];a=Q(),"]"!=a;c||(c=!0))c&&(","==a?(a=Q(),"]"==a&&P()):P()),","==a&&P(),b.push(R(a));return b}if("{"==a){for(b={};a=Q(),"}"!=a;c||(c=!0))c&&(","==a?(a=Q(),"}"==a&&P()):P()),(","==a||"string"!=typeof a||"@"!=(B?a.charAt(0):a[0])||":"!=Q())&&P(),b[a.slice(1)]=R(Q());return b}P()}return a},S=function(a,b,c){var d=T(a,b,c);d===q?delete a[b]:a[b]=d},T=function(a,b,c){var d,e=a[b];if("object"==typeof e&&e)if(s.call(e)==z)for(d=e.length;d--;)S(e,d,c);else p(e,function(a){S(e,a,c)});return c.call(a,b,e)};d.parse=function(a,b){var c,d;return L=0,M=""+a,c=R(Q()),"$"!=Q()&&P(),L=M=null,b&&s.call(b)==v?T((d={},d[""]=c,d),"",b):c}}}return d.runInContext=a,d}var b="function"==typeof define&&define.amd,c={"function":!0,object:!0},d=c[typeof exports]&&exports&&!exports.nodeType&&exports,e=c[typeof window]&&window||this,f=d&&c[typeof module]&&module&&!module.nodeType&&"object"==typeof global&&global;if(!f||f.global!==f&&f.window!==f&&f.self!==f||(e=f),d&&!b)a(e,d);else{var g=e.JSON,h=e.JSON3,i=!1,j=a(e,e.JSON3={noConflict:function(){return i||(i=!0,e.JSON=g,e.JSON3=h,g=h=null),j}});e.JSON={parse:j.parse,stringify:j.stringify}}b&&define(function(){return j})}.call(this),function(){var a={};a.appendToHead=function(b){a.getHead().appendChild(b)},a.getHead=function(){return document.head||document.getElementsByTagName("head")[0]},a.getBody=function(){return document.body||document.getElementsByTagName("body")[0]},createjs.DomUtils=a}(),function(){var a={};a.parseXML=function(a,b){var c=null;try{if(window.DOMParser){var d=new DOMParser;c=d.parseFromString(a,b)}}catch(e){}if(!c)try{c=new ActiveXObject("Microsoft.XMLDOM"),c.async=!1,c.loadXML(a)}catch(e){c=null}return c},a.parseJSON=function(a){if(null==a)return null;try{return JSON.parse(a)}catch(b){throw b}},createjs.DataUtils=a}(),this.createjs=this.createjs||{},function(){"use strict";function LoadItem(){this.src=null,this.type=null,this.id=null,this.maintainOrder=!1,this.callback=null,this.data=null,this.method=createjs.LoadItem.GET,this.values=null,this.headers=null,this.withCredentials=!1,this.mimeType=null,this.crossOrigin=null,this.loadTimeout=b.LOAD_TIMEOUT_DEFAULT}var a=LoadItem.prototype={},b=LoadItem;b.LOAD_TIMEOUT_DEFAULT=8e3,b.create=function(a){if("string"==typeof a){var c=new LoadItem;return c.src=a,c}if(a instanceof b)return a;if(a instanceof Object&&a.src)return null==a.loadTimeout&&(a.loadTimeout=b.LOAD_TIMEOUT_DEFAULT),a;throw new Error("Type not recognized.")},a.set=function(a){for(var b in a)this[b]=a[b];return this},createjs.LoadItem=b}(),function(){var a={};a.ABSOLUTE_PATT=/^(?:\w+:)?\/{2}/i,a.RELATIVE_PATT=/^[.\/]*?\//i,a.EXTENSION_PATT=/\/?[^\/]+\.(\w{1,5})$/i,a.parseURI=function(b){var c={absolute:!1,relative:!1};if(null==b)return c;var d=b.indexOf("?");d>-1&&(b=b.substr(0,d));var e;return a.ABSOLUTE_PATT.test(b)?c.absolute=!0:a.RELATIVE_PATT.test(b)&&(c.relative=!0),(e=b.match(a.EXTENSION_PATT))&&(c.extension=e[1].toLowerCase()),c},a.formatQueryString=function(a,b){if(null==a)throw new Error("You must specify data.");var c=[];for(var d in a)c.push(d+"="+escape(a[d]));return b&&(c=c.concat(b)),c.join("&")},a.buildPath=function(a,b){if(null==b)return a;var c=[],d=a.indexOf("?");if(-1!=d){var e=a.slice(d+1);c=c.concat(e.split("&"))}return-1!=d?a.slice(0,d)+"?"+this.formatQueryString(b,c):a+"?"+this.formatQueryString(b,c)},a.isCrossDomain=function(a){var b=document.createElement("a");b.href=a.src;var c=document.createElement("a");c.href=location.href;var d=""!=b.hostname&&(b.port!=c.port||b.protocol!=c.protocol||b.hostname!=c.hostname);return d},a.isLocal=function(a){var b=document.createElement("a");return b.href=a.src,""==b.hostname&&"file:"==b.protocol},a.isBinary=function(a){switch(a){case createjs.AbstractLoader.IMAGE:case createjs.AbstractLoader.BINARY:return!0;default:return!1}},a.isImageTag=function(a){return a instanceof HTMLImageElement},a.isAudioTag=function(a){return window.HTMLAudioElement?a instanceof HTMLAudioElement:!1},a.isVideoTag=function(a){return window.HTMLVideoElement?a instanceof HTMLVideoElement:!1},a.isText=function(a){switch(a){case createjs.AbstractLoader.TEXT:case createjs.AbstractLoader.JSON:case createjs.AbstractLoader.MANIFEST:case createjs.AbstractLoader.XML:case createjs.AbstractLoader.CSS:case createjs.AbstractLoader.SVG:case createjs.AbstractLoader.JAVASCRIPT:case createjs.AbstractLoader.SPRITESHEET:return!0;default:return!1}},a.getTypeByExtension=function(a){if(null==a)return createjs.AbstractLoader.TEXT;switch(a.toLowerCase()){case"jpeg":case"jpg":case"gif":case"png":case"webp":case"bmp":return createjs.AbstractLoader.IMAGE;case"ogg":case"mp3":case"webm":return createjs.AbstractLoader.SOUND;case"mp4":case"webm":case"ts":return createjs.AbstractLoader.VIDEO;case"json":return createjs.AbstractLoader.JSON;case"xml":return createjs.AbstractLoader.XML;case"css":return createjs.AbstractLoader.CSS;case"js":return createjs.AbstractLoader.JAVASCRIPT;case"svg":return createjs.AbstractLoader.SVG;default:return createjs.AbstractLoader.TEXT}},createjs.RequestUtils=a}(),this.createjs=this.createjs||{},function(){"use strict";function AbstractLoader(a,b,c){this.EventDispatcher_constructor(),this.loaded=!1,this.canceled=!1,this.progress=0,this.type=c,this.resultFormatter=null,this._item=a?createjs.LoadItem.create(a):null,this._preferXHR=b,this._result=null,this._rawResult=null,this._loadedItems=null,this._tagSrcAttribute=null,this._tag=null}var a=createjs.extend(AbstractLoader,createjs.EventDispatcher),b=AbstractLoader;b.POST="POST",b.GET="GET",b.BINARY="binary",b.CSS="css",b.IMAGE="image",b.JAVASCRIPT="javascript",b.JSON="json",b.JSONP="jsonp",b.MANIFEST="manifest",b.SOUND="sound",b.VIDEO="video",b.SPRITESHEET="spritesheet",b.SVG="svg",b.TEXT="text",b.XML="xml",a.getItem=function(){return this._item},a.getResult=function(a){return a?this._rawResult:this._result},a.getTag=function(){return this._tag},a.setTag=function(a){this._tag=a},a.load=function(){this._createRequest(),this._request.on("complete",this,this),this._request.on("progress",this,this),this._request.on("loadStart",this,this),this._request.on("abort",this,this),this._request.on("timeout",this,this),this._request.on("error",this,this);var a=new createjs.Event("initialize");a.loader=this._request,this.dispatchEvent(a),this._request.load()},a.cancel=function(){this.canceled=!0,this.destroy()},a.destroy=function(){this._request&&(this._request.removeAllEventListeners(),this._request.destroy()),this._request=null,this._item=null,this._rawResult=null,this._result=null,this._loadItems=null,this.removeAllEventListeners()},a.getLoadedItems=function(){return this._loadedItems},a._createRequest=function(){this._request=this._preferXHR?new createjs.XHRRequest(this._item):new createjs.TagRequest(this._item,this._tag||this._createTag(),this._tagSrcAttribute)},a._createTag=function(){return null},a._sendLoadStart=function(){this._isCanceled()||this.dispatchEvent("loadstart")},a._sendProgress=function(a){if(!this._isCanceled()){var b=null;"number"==typeof a?(this.progress=a,b=new createjs.ProgressEvent(this.progress)):(b=a,this.progress=a.loaded/a.total,b.progress=this.progress,(isNaN(this.progress)||1/0==this.progress)&&(this.progress=0)),this.hasEventListener("progress")&&this.dispatchEvent(b)}},a._sendComplete=function(){if(!this._isCanceled()){this.loaded=!0;var a=new createjs.Event("complete");a.rawResult=this._rawResult,null!=this._result&&(a.result=this._result),this.dispatchEvent(a)}},a._sendError=function(a){!this._isCanceled()&&this.hasEventListener("error")&&(null==a&&(a=new createjs.ErrorEvent("PRELOAD_ERROR_EMPTY")),this.dispatchEvent(a))},a._isCanceled=function(){return null==window.createjs||this.canceled?!0:!1},a.resultFormatter=null,a.handleEvent=function(a){switch(a.type){case"complete":this._rawResult=a.target._response;var b=this.resultFormatter&&this.resultFormatter(this);b instanceof Function?b.call(this,createjs.proxy(this._resultFormatSuccess,this),createjs.proxy(this._resultFormatFailed,this)):(this._result=b||this._rawResult,this._sendComplete());break;case"progress":this._sendProgress(a);break;case"error":this._sendError(a);break;case"loadstart":this._sendLoadStart();break;case"abort":case"timeout":this._isCanceled()||this.dispatchEvent(new createjs.ErrorEvent("PRELOAD_"+a.type.toUpperCase()+"_ERROR"))}},a._resultFormatSuccess=function(a){this._result=a,this._sendComplete()},a._resultFormatFailed=function(a){this._sendError(a)},a.buildPath=function(a,b){return createjs.RequestUtils.buildPath(a,b)},a.toString=function(){return"[PreloadJS AbstractLoader]"},createjs.AbstractLoader=createjs.promote(AbstractLoader,"EventDispatcher")}(),this.createjs=this.createjs||{},function(){"use strict";function AbstractMediaLoader(a,b,c){this.AbstractLoader_constructor(a,b,c),this.resultFormatter=this._formatResult,this._tagSrcAttribute="src",this.on("initialize",this._updateXHR,this)}var a=createjs.extend(AbstractMediaLoader,createjs.AbstractLoader);a.load=function(){this._tag||(this._tag=this._createTag(this._item.src)),this._tag.preload="auto",this._tag.load(),this.AbstractLoader_load()},a._createTag=function(){},a._createRequest=function(){this._request=this._preferXHR?new createjs.XHRRequest(this._item):new createjs.MediaTagRequest(this._item,this._tag||this._createTag(),this._tagSrcAttribute)},a._updateXHR=function(a){a.loader.setResponseType&&a.loader.setResponseType("blob")},a._formatResult=function(a){if(this._tag.removeEventListener&&this._tag.removeEventListener("canplaythrough",this._loadedHandler),this._tag.onstalled=null,this._preferXHR){var b=window.URL||window.webkitURL,c=a.getResult(!0);a.getTag().src=b.createObjectURL(c)}return a.getTag()},createjs.AbstractMediaLoader=createjs.promote(AbstractMediaLoader,"AbstractLoader")}(),this.createjs=this.createjs||{},function(){"use strict";var AbstractRequest=function(a){this._item=a},a=createjs.extend(AbstractRequest,createjs.EventDispatcher);a.load=function(){},a.destroy=function(){},a.cancel=function(){},createjs.AbstractRequest=createjs.promote(AbstractRequest,"EventDispatcher")}(),this.createjs=this.createjs||{},function(){"use strict";function TagRequest(a,b,c){this.AbstractRequest_constructor(a),this._tag=b,this._tagSrcAttribute=c,this._loadedHandler=createjs.proxy(this._handleTagComplete,this),this._addedToDOM=!1,this._startTagVisibility=null}var a=createjs.extend(TagRequest,createjs.AbstractRequest);a.load=function(){this._tag.onload=createjs.proxy(this._handleTagComplete,this),this._tag.onreadystatechange=createjs.proxy(this._handleReadyStateChange,this),this._tag.onerror=createjs.proxy(this._handleError,this);var a=new createjs.Event("initialize");a.loader=this._tag,this.dispatchEvent(a),this._hideTag(),this._loadTimeout=setTimeout(createjs.proxy(this._handleTimeout,this),this._item.loadTimeout),this._tag[this._tagSrcAttribute]=this._item.src,null==this._tag.parentNode&&(window.document.body.appendChild(this._tag),this._addedToDOM=!0)},a.destroy=function(){this._clean(),this._tag=null,this.AbstractRequest_destroy()},a._handleReadyStateChange=function(){clearTimeout(this._loadTimeout);var a=this._tag;("loaded"==a.readyState||"complete"==a.readyState)&&this._handleTagComplete()},a._handleError=function(){this._clean(),this.dispatchEvent("error")},a._handleTagComplete=function(){this._rawResult=this._tag,this._result=this.resultFormatter&&this.resultFormatter(this)||this._rawResult,this._clean(),this._showTag(),this.dispatchEvent("complete")},a._handleTimeout=function(){this._clean(),this.dispatchEvent(new createjs.Event("timeout"))},a._clean=function(){this._tag.onload=null,this._tag.onreadystatechange=null,this._tag.onerror=null,this._addedToDOM&&null!=this._tag.parentNode&&this._tag.parentNode.removeChild(this._tag),clearTimeout(this._loadTimeout)},a._hideTag=function(){this._startTagVisibility=this._tag.style.visibility,this._tag.style.visibility="hidden"},a._showTag=function(){this._tag.style.visibility=this._startTagVisibility},a._handleStalled=function(){},createjs.TagRequest=createjs.promote(TagRequest,"AbstractRequest")}(),this.createjs=this.createjs||{},function(){"use strict";function MediaTagRequest(a,b,c){this.AbstractRequest_constructor(a),this._tag=b,this._tagSrcAttribute=c,this._loadedHandler=createjs.proxy(this._handleTagComplete,this)}var a=createjs.extend(MediaTagRequest,createjs.TagRequest);a.load=function(){var a=createjs.proxy(this._handleStalled,this);this._stalledCallback=a;var b=createjs.proxy(this._handleProgress,this);this._handleProgress=b,this._tag.addEventListener("stalled",a),this._tag.addEventListener("progress",b),this._tag.addEventListener&&this._tag.addEventListener("canplaythrough",this._loadedHandler,!1),this.TagRequest_load()},a._handleReadyStateChange=function(){clearTimeout(this._loadTimeout);var a=this._tag;("loaded"==a.readyState||"complete"==a.readyState)&&this._handleTagComplete()},a._handleStalled=function(){},a._handleProgress=function(a){if(a&&!(a.loaded>0&&0==a.total)){var b=new createjs.ProgressEvent(a.loaded,a.total);this.dispatchEvent(b)}},a._clean=function(){this._tag.removeEventListener&&this._tag.removeEventListener("canplaythrough",this._loadedHandler),this._tag.removeEventListener("stalled",this._stalledCallback),this._tag.removeEventListener("progress",this._progressCallback),this.TagRequest__clean()},createjs.MediaTagRequest=createjs.promote(MediaTagRequest,"TagRequest")}(),this.createjs=this.createjs||{},function(){"use strict";function XHRRequest(a){this.AbstractRequest_constructor(a),this._request=null,this._loadTimeout=null,this._xhrLevel=1,this._response=null,this._rawResponse=null,this._canceled=!1,this._handleLoadStartProxy=createjs.proxy(this._handleLoadStart,this),this._handleProgressProxy=createjs.proxy(this._handleProgress,this),this._handleAbortProxy=createjs.proxy(this._handleAbort,this),this._handleErrorProxy=createjs.proxy(this._handleError,this),this._handleTimeoutProxy=createjs.proxy(this._handleTimeout,this),this._handleLoadProxy=createjs.proxy(this._handleLoad,this),this._handleReadyStateChangeProxy=createjs.proxy(this._handleReadyStateChange,this),!this._createXHR(a)}var a=createjs.extend(XHRRequest,createjs.AbstractRequest);XHRRequest.ACTIVEX_VERSIONS=["Msxml2.XMLHTTP.6.0","Msxml2.XMLHTTP.5.0","Msxml2.XMLHTTP.4.0","MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP","Microsoft.XMLHTTP"],a.getResult=function(a){return a&&this._rawResponse?this._rawResponse:this._response},a.cancel=function(){this.canceled=!0,this._clean(),this._request.abort()},a.load=function(){if(null==this._request)return void this._handleError();null!=this._request.addEventListener?(this._request.addEventListener("loadstart",this._handleLoadStartProxy,!1),this._request.addEventListener("progress",this._handleProgressProxy,!1),this._request.addEventListener("abort",this._handleAbortProxy,!1),this._request.addEventListener("error",this._handleErrorProxy,!1),this._request.addEventListener("timeout",this._handleTimeoutProxy,!1),this._request.addEventListener("load",this._handleLoadProxy,!1),this._request.addEventListener("readystatechange",this._handleReadyStateChangeProxy,!1)):(this._request.onloadstart=this._handleLoadStartProxy,this._request.onprogress=this._handleProgressProxy,this._request.onabort=this._handleAbortProxy,this._request.onerror=this._handleErrorProxy,this._request.ontimeout=this._handleTimeoutProxy,this._request.onload=this._handleLoadProxy,this._request.onreadystatechange=this._handleReadyStateChangeProxy),1==this._xhrLevel&&(this._loadTimeout=setTimeout(createjs.proxy(this._handleTimeout,this),this._item.loadTimeout));try{this._item.values&&this._item.method!=createjs.AbstractLoader.GET?this._item.method==createjs.AbstractLoader.POST&&this._request.send(createjs.RequestUtils.formatQueryString(this._item.values)):this._request.send()}catch(a){this.dispatchEvent(new createjs.ErrorEvent("XHR_SEND",null,a))}},a.setResponseType=function(a){"blob"===a&&(a=window.URL?"blob":"arraybuffer",this._responseType=a),this._request.responseType=a},a.getAllResponseHeaders=function(){return this._request.getAllResponseHeaders instanceof Function?this._request.getAllResponseHeaders():null},a.getResponseHeader=function(a){return this._request.getResponseHeader instanceof Function?this._request.getResponseHeader(a):null},a._handleProgress=function(a){if(a&&!(a.loaded>0&&0==a.total)){var b=new createjs.ProgressEvent(a.loaded,a.total);this.dispatchEvent(b)}},a._handleLoadStart=function(){clearTimeout(this._loadTimeout),this.dispatchEvent("loadstart")},a._handleAbort=function(a){this._clean(),this.dispatchEvent(new createjs.ErrorEvent("XHR_ABORTED",null,a))},a._handleError=function(a){this._clean(),this.dispatchEvent(new createjs.ErrorEvent(a.message))},a._handleReadyStateChange=function(){4==this._request.readyState&&this._handleLoad()},a._handleLoad=function(){if(!this.loaded){this.loaded=!0;var a=this._checkError();if(a)return void this._handleError(a);if(this._response=this._getResponse(),"arraybuffer"===this._responseType)try{this._response=new Blob([this._response])}catch(b){if(window.BlobBuilder=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder||window.MSBlobBuilder,"TypeError"===b.name&&window.BlobBuilder){var c=new BlobBuilder;c.append(this._response),this._response=c.getBlob()}}this._clean(),this.dispatchEvent(new createjs.Event("complete"))}},a._handleTimeout=function(a){this._clean(),this.dispatchEvent(new createjs.ErrorEvent("PRELOAD_TIMEOUT",null,a))},a._checkError=function(){var a=parseInt(this._request.status);switch(a){case 404:case 0:return new Error(a)}return null},a._getResponse=function(){if(null!=this._response)return this._response;if(null!=this._request.response)return this._request.response;try{if(null!=this._request.responseText)return this._request.responseText}catch(a){}try{if(null!=this._request.responseXML)return this._request.responseXML}catch(a){}return null},a._createXHR=function(a){var b=createjs.RequestUtils.isCrossDomain(a),c={},d=null;if(window.XMLHttpRequest)d=new XMLHttpRequest,b&&void 0===d.withCredentials&&window.XDomainRequest&&(d=new XDomainRequest);else{for(var e=0,f=s.ACTIVEX_VERSIONS.length;f>e;e++){var g=s.ACTIVEX_VERSIONS[e];try{d=new ActiveXObject(g);break}catch(h){}}if(null==d)return!1}null==a.mimeType&&createjs.RequestUtils.isText(a.type)&&(a.mimeType="text/plain; charset=utf-8"),a.mimeType&&d.overrideMimeType&&d.overrideMimeType(a.mimeType),this._xhrLevel="string"==typeof d.responseType?2:1;var i=null;if(i=a.method==createjs.AbstractLoader.GET?createjs.RequestUtils.buildPath(a.src,a.values):a.src,d.open(a.method||createjs.AbstractLoader.GET,i,!0),b&&d instanceof XMLHttpRequest&&1==this._xhrLevel&&(c.Origin=location.origin),a.values&&a.method==createjs.AbstractLoader.POST&&(c["Content-Type"]="application/x-www-form-urlencoded"),b||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest"),a.headers)for(var j in a.headers)c[j]=a.headers[j];for(j in c)d.setRequestHeader(j,c[j]);return d instanceof XMLHttpRequest&&void 0!==a.withCredentials&&(d.withCredentials=a.withCredentials),this._request=d,!0},a._clean=function(){clearTimeout(this._loadTimeout),null!=this._request.removeEventListener?(this._request.removeEventListener("loadstart",this._handleLoadStartProxy),this._request.removeEventListener("progress",this._handleProgressProxy),this._request.removeEventListener("abort",this._handleAbortProxy),this._request.removeEventListener("error",this._handleErrorProxy),this._request.removeEventListener("timeout",this._handleTimeoutProxy),this._request.removeEventListener("load",this._handleLoadProxy),this._request.removeEventListener("readystatechange",this._handleReadyStateChangeProxy)):(this._request.onloadstart=null,this._request.onprogress=null,this._request.onabort=null,this._request.onerror=null,this._request.ontimeout=null,this._request.onload=null,this._request.onreadystatechange=null)},a.toString=function(){return"[PreloadJS XHRRequest]"},createjs.XHRRequest=createjs.promote(XHRRequest,"AbstractRequest")}(),this.createjs=this.createjs||{},function(){"use strict";function LoadQueue(a,b,c){this.AbstractLoader_constructor(),this._plugins=[],this._typeCallbacks={},this._extensionCallbacks={},this.next=null,this.maintainScriptOrder=!0,this.stopOnError=!1,this._maxConnections=1,this._availableLoaders=[createjs.ImageLoader,createjs.JavaScriptLoader,createjs.CSSLoader,createjs.JSONLoader,createjs.JSONPLoader,createjs.SoundLoader,createjs.ManifestLoader,createjs.SpriteSheetLoader,createjs.XMLLoader,createjs.SVGLoader,createjs.BinaryLoader,createjs.VideoLoader,createjs.TextLoader],this._defaultLoaderLength=this._availableLoaders.length,this.init(a,b,c) +}var a=createjs.extend(LoadQueue,createjs.AbstractLoader),b=LoadQueue;a.init=function(a,b,c){this.useXHR=!0,this.preferXHR=!0,this._preferXHR=!0,this.setPreferXHR(a),this._paused=!1,this._basePath=b,this._crossOrigin=c,this._loadStartWasDispatched=!1,this._currentlyLoadingScript=null,this._currentLoads=[],this._loadQueue=[],this._loadQueueBackup=[],this._loadItemsById={},this._loadItemsBySrc={},this._loadedResults={},this._loadedRawResults={},this._numItems=0,this._numItemsLoaded=0,this._scriptOrder=[],this._loadedScripts=[],this._lastProgress=0/0},b.loadTimeout=8e3,b.LOAD_TIMEOUT=0,b.BINARY=createjs.AbstractLoader.BINARY,b.CSS=createjs.AbstractLoader.CSS,b.IMAGE=createjs.AbstractLoader.IMAGE,b.JAVASCRIPT=createjs.AbstractLoader.JAVASCRIPT,b.JSON=createjs.AbstractLoader.JSON,b.JSONP=createjs.AbstractLoader.JSONP,b.MANIFEST=createjs.AbstractLoader.MANIFEST,b.SOUND=createjs.AbstractLoader.SOUND,b.VIDEO=createjs.AbstractLoader.VIDEO,b.SVG=createjs.AbstractLoader.SVG,b.TEXT=createjs.AbstractLoader.TEXT,b.XML=createjs.AbstractLoader.XML,b.POST=createjs.AbstractLoader.POST,b.GET=createjs.AbstractLoader.GET,a.registerLoader=function(a){if(!a||!a.canLoadItem)throw new Error("loader is of an incorrect type.");if(-1!=this._availableLoaders.indexOf(a))throw new Error("loader already exists.");this._availableLoaders.unshift(a)},a.unregisterLoader=function(a){var b=this._availableLoaders.indexOf(a);-1!=b&&b0)return;var c=!1;if(b){for(;b.length;){var d=b.pop(),e=this.getResult(d);for(f=this._loadQueue.length-1;f>=0;f--)if(g=this._loadQueue[f].getItem(),g.id==d||g.src==d){this._loadQueue.splice(f,1)[0].cancel();break}for(f=this._loadQueueBackup.length-1;f>=0;f--)if(g=this._loadQueueBackup[f].getItem(),g.id==d||g.src==d){this._loadQueueBackup.splice(f,1)[0].cancel();break}if(e)this._disposeItem(this.getItem(d));else for(var f=this._currentLoads.length-1;f>=0;f--){var g=this._currentLoads[f].getItem();if(g.id==d||g.src==d){this._currentLoads.splice(f,1)[0].cancel(),c=!0;break}}}c&&this._loadNext()}else{this.close();for(var h in this._loadItemsById)this._disposeItem(this._loadItemsById[h]);this.init(this.preferXHR,this._basePath)}},a.reset=function(){this.close();for(var a in this._loadItemsById)this._disposeItem(this._loadItemsById[a]);for(var b=[],c=0,d=this._loadQueueBackup.length;d>c;c++)b.push(this._loadQueueBackup[c].getItem());this.loadManifest(b,!1)},a.installPlugin=function(a){if(null!=a&&null!=a.getPreloadHandlers){this._plugins.push(a);var b=a.getPreloadHandlers();if(b.scope=a,null!=b.types)for(var c=0,d=b.types.length;d>c;c++)this._typeCallbacks[b.types[c]]=b;if(null!=b.extensions)for(c=0,d=b.extensions.length;d>c;c++)this._extensionCallbacks[b.extensions[c]]=b}},a.setMaxConnections=function(a){this._maxConnections=a,!this._paused&&this._loadQueue.length>0&&this._loadNext()},a.loadFile=function(a,b,c){if(null==a){var d=new createjs.ErrorEvent("PRELOAD_NO_FILE");return void this._sendError(d)}this._addItem(a,null,c),this.setPaused(b!==!1?!1:!0)},a.loadManifest=function(a,c,d){var e=null,f=null;if(Array.isArray(a)){if(0==a.length){var g=new createjs.ErrorEvent("PRELOAD_MANIFEST_EMPTY");return void this._sendError(g)}e=a}else if("string"==typeof a)e=[{src:a,type:b.MANIFEST}];else{if("object"!=typeof a){var g=new createjs.ErrorEvent("PRELOAD_MANIFEST_NULL");return void this._sendError(g)}if(void 0!==a.src){if(null==a.type)a.type=b.MANIFEST;else if(a.type!=b.MANIFEST){var g=new createjs.ErrorEvent("PRELOAD_MANIFEST_TYPE");this._sendError(g)}e=[a]}else void 0!==a.manifest&&(e=a.manifest,f=a.path)}for(var h=0,i=e.length;i>h;h++)this._addItem(e[h],f,d);this.setPaused(c!==!1?!1:!0)},a.load=function(){this.setPaused(!1)},a.getItem=function(a){return this._loadItemsById[a]||this._loadItemsBySrc[a]},a.getResult=function(a,b){var c=this._loadItemsById[a]||this._loadItemsBySrc[a];if(null==c)return null;var d=c.id;return b&&this._loadedRawResults[d]?this._loadedRawResults[d]:this._loadedResults[d]},a.getItems=function(a){var b=[];for(var c in this._loadItemsById){var d=this._loadItemsById[c],e=this.getResult(c);(a!==!0||null!=e)&&b.push({item:d,result:e,rawResult:this.getResult(c,!0)})}return b},a.setPaused=function(a){this._paused=a,this._paused||this._loadNext()},a.close=function(){for(;this._currentLoads.length;)this._currentLoads.pop().cancel();this._scriptOrder.length=0,this._loadedScripts.length=0,this.loadStartWasDispatched=!1,this._itemCount=0,this._lastProgress=0/0},a._addItem=function(a,b,c){var d=this._createLoadItem(a,b,c);if(null!=d){var e=this._createLoader(d);null!=e&&("plugins"in e&&(e.plugins=this._plugins),d._loader=e,this._loadQueue.push(e),this._loadQueueBackup.push(e),this._numItems++,this._updateProgress(),(this.maintainScriptOrder&&d.type==createjs.LoadQueue.JAVASCRIPT||d.maintainOrder===!0)&&(this._scriptOrder.push(d),this._loadedScripts.push(null)))}},a._createLoadItem=function(a,b,c){var d=createjs.LoadItem.create(a);if(null==d)return null;var e="",f=c||this._basePath;if(d.src instanceof Object){if(!d.type)return null;if(b){e=b;var g=createjs.RequestUtils.parseURI(b);null==f||g.absolute||g.relative||(e=f+e)}else null!=f&&(e=f)}else{var h=createjs.RequestUtils.parseURI(d.src);h.extension&&(d.ext=h.extension),null==d.type&&(d.type=createjs.RequestUtils.getTypeByExtension(d.ext));var i=d.src;if(!h.absolute&&!h.relative)if(b){e=b;var g=createjs.RequestUtils.parseURI(b);i=b+i,null==f||g.absolute||g.relative||(e=f+e)}else null!=f&&(e=f);d.src=e+d.src}d.path=e,(void 0===d.id||null===d.id||""===d.id)&&(d.id=i);var j=this._typeCallbacks[d.type]||this._extensionCallbacks[d.ext];if(j){var k=j.callback.call(j.scope,d,this);if(k===!1)return null;k===!0||null!=k&&(d._loader=k),h=createjs.RequestUtils.parseURI(d.src),null!=h.extension&&(d.ext=h.extension)}return this._loadItemsById[d.id]=d,this._loadItemsBySrc[d.src]=d,null==d.crossOrigin&&(d.crossOrigin=this._crossOrigin),d},a._createLoader=function(a){if(null!=a._loader)return a._loader;for(var b=this.preferXHR,c=0;c=this._maxConnections);a++){var b=this._loadQueue[a];this._canStartLoad(b)&&(this._loadQueue.splice(a,1),a--,this._loadItem(b))}}},a._loadItem=function(a){a.on("fileload",this._handleFileLoad,this),a.on("progress",this._handleProgress,this),a.on("complete",this._handleFileComplete,this),a.on("error",this._handleError,this),a.on("fileerror",this._handleFileError,this),this._currentLoads.push(a),this._sendFileStart(a.getItem()),a.load()},a._handleFileLoad=function(a){a.target=null,this.dispatchEvent(a)},a._handleFileError=function(a){var b=new createjs.ErrorEvent("FILE_LOAD_ERROR",null,a.item);this._sendError(b)},a._handleError=function(a){var b=a.target;this._numItemsLoaded++,this._finishOrderedItem(b,!0),this._updateProgress();var c=new createjs.ErrorEvent("FILE_LOAD_ERROR",null,b.getItem());this._sendError(c),this.stopOnError?this.setPaused(!0):(this._removeLoadItem(b),this._cleanLoadItem(b),this._loadNext())},a._handleFileComplete=function(a){var b=a.target,c=b.getItem(),d=b.getResult();this._loadedResults[c.id]=d;var e=b.getResult(!0);null!=e&&e!==d&&(this._loadedRawResults[c.id]=e),this._saveLoadedItems(b),this._removeLoadItem(b),this._finishOrderedItem(b)||this._processFinishedLoad(c,b),this._cleanLoadItem(b)},a._saveLoadedItems=function(a){var b=a.getLoadedItems();if(null!==b)for(var c=0;cb;b++){var c=this._loadedScripts[b];if(null===c)break;if(c!==!0){var d=this._loadedResults[c.id];c.type==createjs.LoadQueue.JAVASCRIPT&&createjs.DomUtils.appendToHead(d);var e=c._loader;this._processFinishedLoad(c,e),this._loadedScripts[b]=!0}}},a._processFinishedLoad=function(a,b){if(this._numItemsLoaded++,!this.maintainScriptOrder&&a.type==createjs.LoadQueue.JAVASCRIPT){var c=b.getTag();createjs.DomUtils.appendToHead(c)}this._updateProgress(),this._sendFileComplete(a,b),this._loadNext()},a._canStartLoad=function(a){if(!this.maintainScriptOrder||a.preferXHR)return!0;var b=a.getItem();if(b.type!=createjs.LoadQueue.JAVASCRIPT)return!0;if(this._currentlyLoadingScript)return!1;for(var c=this._scriptOrder.indexOf(b),d=0;c>d;){var e=this._loadedScripts[d];if(null==e)return!1;d++}return this._currentlyLoadingScript=!0,!0},a._removeLoadItem=function(a){for(var b=this._currentLoads.length,c=0;b>c;c++)if(this._currentLoads[c]==a){this._currentLoads.splice(c,1);break}},a._cleanLoadItem=function(a){var b=a.getItem();b&&delete b._loader},a._handleProgress=function(a){var b=a.target;this._sendFileProgress(b.getItem(),b.progress),this._updateProgress()},a._updateProgress=function(){var a=this._numItemsLoaded/this._numItems,b=this._numItems-this._numItemsLoaded;if(b>0){for(var c=0,d=0,e=this._currentLoads.length;e>d;d++)c+=this._currentLoads[d].progress;a+=c/b*(b/this._numItems)}this._lastProgress!=a&&(this._sendProgress(a),this._lastProgress=a)},a._disposeItem=function(a){delete this._loadedResults[a.id],delete this._loadedRawResults[a.id],delete this._loadItemsById[a.id],delete this._loadItemsBySrc[a.src]},a._sendFileProgress=function(a,b){if(!this._isCanceled()&&!this._paused&&this.hasEventListener("fileprogress")){var c=new createjs.Event("fileprogress");c.progress=b,c.loaded=b,c.total=1,c.item=a,this.dispatchEvent(c)}},a._sendFileComplete=function(a,b){if(!this._isCanceled()&&!this._paused){var c=new createjs.Event("fileload");c.loader=b,c.item=a,c.result=this._loadedResults[a.id],c.rawResult=this._loadedRawResults[a.id],a.completeHandler&&a.completeHandler(c),this.hasEventListener("fileload")&&this.dispatchEvent(c)}},a._sendFileStart=function(a){var b=new createjs.Event("filestart");b.item=a,this.hasEventListener("filestart")&&this.dispatchEvent(b)},a.toString=function(){return"[PreloadJS LoadQueue]"},createjs.LoadQueue=createjs.promote(LoadQueue,"AbstractLoader")}(),this.createjs=this.createjs||{},function(){"use strict";function TextLoader(a){this.AbstractLoader_constructor(a,!0,createjs.AbstractLoader.TEXT)}var a=(createjs.extend(TextLoader,createjs.AbstractLoader),TextLoader);a.canLoadItem=function(a){return a.type==createjs.AbstractLoader.TEXT},createjs.TextLoader=createjs.promote(TextLoader,"AbstractLoader")}(),this.createjs=this.createjs||{},function(){"use strict";function BinaryLoader(a){this.AbstractLoader_constructor(a,!0,createjs.AbstractLoader.BINARY),this.on("initialize",this._updateXHR,this)}var a=createjs.extend(BinaryLoader,createjs.AbstractLoader),b=BinaryLoader;b.canLoadItem=function(a){return a.type==createjs.AbstractLoader.BINARY},a._updateXHR=function(a){a.loader.setResponseType("arraybuffer")},createjs.BinaryLoader=createjs.promote(BinaryLoader,"AbstractLoader")}(),this.createjs=this.createjs||{},function(){"use strict";function CSSLoader(a,b){this.AbstractLoader_constructor(a,b,createjs.AbstractLoader.CSS),this.resultFormatter=this._formatResult,this._tagSrcAttribute="href",this._tag=document.createElement(b?"style":"link"),this._tag.rel="stylesheet",this._tag.type="text/css"}var a=createjs.extend(CSSLoader,createjs.AbstractLoader),b=CSSLoader;b.canLoadItem=function(a){return a.type==createjs.AbstractLoader.CSS},a._formatResult=function(a){if(this._preferXHR){var b=a.getTag();if(b.styleSheet)b.styleSheet.cssText=a.getResult(!0);else{var c=document.createTextNode(a.getResult(!0));b.appendChild(c)}}else b=this._tag;return createjs.DomUtils.appendToHead(b),b},createjs.CSSLoader=createjs.promote(CSSLoader,"AbstractLoader")}(),this.createjs=this.createjs||{},function(){"use strict";function ImageLoader(a,b){this.AbstractLoader_constructor(a,b,createjs.AbstractLoader.IMAGE),this.resultFormatter=this._formatResult,this._tagSrcAttribute="src",createjs.RequestUtils.isImageTag(a)?this._tag=a:createjs.RequestUtils.isImageTag(a.src)?this._tag=a.src:createjs.RequestUtils.isImageTag(a.tag)&&(this._tag=a.tag),null!=this._tag?this._preferXHR=!1:this._tag=document.createElement("img"),this.on("initialize",this._updateXHR,this)}var a=createjs.extend(ImageLoader,createjs.AbstractLoader),b=ImageLoader;b.canLoadItem=function(a){return a.type==createjs.AbstractLoader.IMAGE},a.load=function(){if(""!=this._tag.src&&this._tag.complete)return void this._sendComplete();var a=this._item.crossOrigin;1==a&&(a="Anonymous"),null==a||createjs.RequestUtils.isLocal(this._item.src)||(this._tag.crossOrigin=a),this.AbstractLoader_load()},a._updateXHR=function(a){a.loader.mimeType="text/plain; charset=x-user-defined-binary",a.loader.setResponseType&&a.loader.setResponseType("blob")},a._formatResult=function(){return this._formatImage},a._formatImage=function(a,b){var c=this._tag,d=window.URL||window.webkitURL;if(this._preferXHR)if(d){var e=d.createObjectURL(this.getResult(!0));c.src=e,c.addEventListener("load",this._cleanUpURL,!1),c.addEventListener("error",this._cleanUpURL,!1)}else c.src=this._item.src;else;c.complete?a(c):(c.onload=createjs.proxy(function(){a(this._tag)},this),c.onerror=createjs.proxy(function(){b(_this._tag)},this))},a._cleanUpURL=function(a){var b=window.URL||window.webkitURL;b.revokeObjectURL(a.target.src)},createjs.ImageLoader=createjs.promote(ImageLoader,"AbstractLoader")}(),this.createjs=this.createjs||{},function(){"use strict";function JavaScriptLoader(a,b){this.AbstractLoader_constructor(a,b,createjs.AbstractLoader.JAVASCRIPT),this.resultFormatter=this._formatResult,this._tagSrcAttribute="src",this.setTag(document.createElement("script"))}var a=createjs.extend(JavaScriptLoader,createjs.AbstractLoader),b=JavaScriptLoader;b.canLoadItem=function(a){return a.type==createjs.AbstractLoader.JAVASCRIPT},a._formatResult=function(a){var b=a.getTag();return this._preferXHR&&(b.text=a.getResult(!0)),b},createjs.JavaScriptLoader=createjs.promote(JavaScriptLoader,"AbstractLoader")}(),this.createjs=this.createjs||{},function(){"use strict";function JSONLoader(a){this.AbstractLoader_constructor(a,!0,createjs.AbstractLoader.JSON),this.resultFormatter=this._formatResult}var a=createjs.extend(JSONLoader,createjs.AbstractLoader),b=JSONLoader;b.canLoadItem=function(a){return a.type==createjs.AbstractLoader.JSON},a._formatResult=function(a){var b=null;try{b=createjs.DataUtils.parseJSON(a.getResult(!0))}catch(c){var d=new createjs.ErrorEvent("JSON_FORMAT",null,c);return this._sendError(d),c}return b},createjs.JSONLoader=createjs.promote(JSONLoader,"AbstractLoader")}(),this.createjs=this.createjs||{},function(){"use strict";function JSONPLoader(a){this.AbstractLoader_constructor(a,!1,createjs.AbstractLoader.JSONP),this.setTag(document.createElement("script")),this.getTag().type="text/javascript"}var a=createjs.extend(JSONPLoader,createjs.AbstractLoader),b=JSONPLoader;b.canLoadItem=function(a){return a.type==createjs.AbstractLoader.JSONP},a.cancel=function(){this.AbstractLoader_cancel(),this._dispose()},a.load=function(){if(null==this._item.callback)throw new Error("callback is required for loading JSONP requests.");if(null!=window[this._item.callback])throw new Error("JSONP callback '"+this._item.callback+"' already exists on window. You need to specify a different callback or re-name the current one.");window[this._item.callback]=createjs.proxy(this._handleLoad,this),window.document.body.appendChild(this._tag),this._loadTimeout=setTimeout(createjs.proxy(this._handleTimeout,this),this._item.loadTimeout),this._tag.src=this._item.src},a._handleLoad=function(a){this._result=this._rawResult=a,this._sendComplete(),this._dispose()},a._handleTimeout=function(){this._dispose(),this.dispatchEvent(new createjs.ErrorEvent("timeout"))},a._dispose=function(){window.document.body.removeChild(this._tag),delete window[this._item.callback],clearTimeout(this._loadTimeout)},createjs.JSONPLoader=createjs.promote(JSONPLoader,"AbstractLoader")}(),this.createjs=this.createjs||{},function(){"use strict";function ManifestLoader(a){this.AbstractLoader_constructor(a,null,createjs.AbstractLoader.MANIFEST),this.plugins=null,this._manifestQueue=null}var a=createjs.extend(ManifestLoader,createjs.AbstractLoader),b=ManifestLoader;b.MANIFEST_PROGRESS=.25,b.canLoadItem=function(a){return a.type==createjs.AbstractLoader.MANIFEST},a.load=function(){this.AbstractLoader_load()},a._createRequest=function(){var a=this._item.callback;this._request=null!=a?new createjs.JSONPLoader(this._item):new createjs.JSONLoader(this._item)},a.handleEvent=function(a){switch(a.type){case"complete":return this._rawResult=a.target.getResult(!0),this._result=a.target.getResult(),this._sendProgress(b.MANIFEST_PROGRESS),void this._loadManifest(this._result);case"progress":return a.loaded*=b.MANIFEST_PROGRESS,this.progress=a.loaded/a.total,(isNaN(this.progress)||1/0==this.progress)&&(this.progress=0),void this._sendProgress(a)}this.AbstractLoader_handleEvent(a)},a.destroy=function(){this.AbstractLoader_destroy(),this._manifestQueue.close()},a._loadManifest=function(a){if(a&&a.manifest){var b=this._manifestQueue=new createjs.LoadQueue;b.on("fileload",this._handleManifestFileLoad,this),b.on("progress",this._handleManifestProgress,this),b.on("complete",this._handleManifestComplete,this,!0),b.on("error",this._handleManifestError,this,!0);for(var c=0,d=this.plugins.length;d>c;c++)b.installPlugin(this.plugins[c]);b.loadManifest(a)}else this._sendComplete()},a._handleManifestFileLoad=function(a){a.target=null,this.dispatchEvent(a)},a._handleManifestComplete=function(){this._loadedItems=this._manifestQueue.getItems(!0),this._sendComplete()},a._handleManifestProgress=function(a){this.progress=a.progress*(1-b.MANIFEST_PROGRESS)+b.MANIFEST_PROGRESS,this._sendProgress(this.progress)},a._handleManifestError=function(a){var b=new createjs.Event("fileerror");b.item=a.data,this.dispatchEvent(b)},createjs.ManifestLoader=createjs.promote(ManifestLoader,"AbstractLoader")}(),this.createjs=this.createjs||{},function(){"use strict";function SoundLoader(a,b){this.AbstractMediaLoader_constructor(a,b,createjs.AbstractLoader.SOUND),createjs.RequestUtils.isAudioTag(a)?this._tag=a:createjs.RequestUtils.isAudioTag(a.src)?this._tag=a:createjs.RequestUtils.isAudioTag(a.tag)&&(this._tag=createjs.RequestUtils.isAudioTag(a)?a:a.src),null!=this._tag&&(this._preferXHR=!1)}var a=createjs.extend(SoundLoader,createjs.AbstractMediaLoader),b=SoundLoader;b.canLoadItem=function(a){return a.type==createjs.AbstractLoader.SOUND},a._createTag=function(a){var b=document.createElement("audio");return b.autoplay=!1,b.preload="none",b.src=a,b},createjs.SoundLoader=createjs.promote(SoundLoader,"AbstractMediaLoader")}(),this.createjs=this.createjs||{},function(){"use strict";function VideoLoader(a,b){this.AbstractMediaLoader_constructor(a,b,createjs.AbstractLoader.VIDEO),createjs.RequestUtils.isVideoTag(a)||createjs.RequestUtils.isVideoTag(a.src)?(this.setTag(createjs.RequestUtils.isVideoTag(a)?a:a.src),this._preferXHR=!1):this.setTag(this._createTag())}var a=createjs.extend(VideoLoader,createjs.AbstractMediaLoader),b=VideoLoader;a._createTag=function(){return document.createElement("video")},b.canLoadItem=function(a){return a.type==createjs.AbstractLoader.VIDEO},createjs.VideoLoader=createjs.promote(VideoLoader,"AbstractMediaLoader")}(),this.createjs=this.createjs||{},function(){"use strict";function SpriteSheetLoader(a,b){this.AbstractLoader_constructor(a,b,createjs.AbstractLoader.SPRITESHEET),this._manifestQueue=null}var a=createjs.extend(SpriteSheetLoader,createjs.AbstractLoader),b=SpriteSheetLoader;b.SPRITESHEET_PROGRESS=.25,b.canLoadItem=function(a){return a.type==createjs.AbstractLoader.SPRITESHEET},a.destroy=function(){this.AbstractLoader_destroy,this._manifestQueue.close()},a._createRequest=function(){var a=this._item.callback;this._request=null!=a?new createjs.JSONPLoader(this._item):new createjs.JSONLoader(this._item)},a.handleEvent=function(a){switch(a.type){case"complete":return this._rawResult=a.target.getResult(!0),this._result=a.target.getResult(),this._sendProgress(b.SPRITESHEET_PROGRESS),void this._loadManifest(this._result);case"progress":return a.loaded*=b.SPRITESHEET_PROGRESS,this.progress=a.loaded/a.total,(isNaN(this.progress)||1/0==this.progress)&&(this.progress=0),void this._sendProgress(a)}this.AbstractLoader_handleEvent(a)},a._loadManifest=function(a){if(a&&a.images){var b=this._manifestQueue=new createjs.LoadQueue(this._preferXHR,this._item.path,this._item.crossOrigin);b.on("complete",this._handleManifestComplete,this,!0),b.on("fileload",this._handleManifestFileLoad,this),b.on("progress",this._handleManifestProgress,this),b.on("error",this._handleManifestError,this,!0),b.loadManifest(a.images)}},a._handleManifestFileLoad=function(a){var b=a.result;if(null!=b){var c=this.getResult().images,d=c.indexOf(a.item.src);c[d]=b}},a._handleManifestComplete=function(){this._result=new createjs.SpriteSheet(this._result),this._loadedItems=this._manifestQueue.getItems(!0),this._sendComplete()},a._handleManifestProgress=function(a){this.progress=a.progress*(1-b.SPRITESHEET_PROGRESS)+b.SPRITESHEET_PROGRESS,this._sendProgress(this.progress)},a._handleManifestError=function(a){var b=new createjs.Event("fileerror");b.item=a.data,this.dispatchEvent(b)},createjs.SpriteSheetLoader=createjs.promote(SpriteSheetLoader,"AbstractLoader")}(),this.createjs=this.createjs||{},function(){"use strict";function SVGLoader(a,b){this.AbstractLoader_constructor(a,b,createjs.AbstractLoader.SVG),this.resultFormatter=this._formatResult,this._tagSrcAttribute="data",b?this.setTag(document.createElement("svg")):(this.setTag(document.createElement("object")),this.getTag().type="image/svg+xml")}var a=createjs.extend(SVGLoader,createjs.AbstractLoader),b=SVGLoader;b.canLoadItem=function(a){return a.type==createjs.AbstractLoader.SVG},a._formatResult=function(a){var b=createjs.DataUtils.parseXML(a.getResult(!0),"text/xml"),c=a.getTag();return!this._preferXHR&&document.body.contains(c)&&document.body.removeChild(c),null!=b.documentElement?(c.appendChild(b.documentElement),c.style.visibility="visible",c):b},createjs.SVGLoader=createjs.promote(SVGLoader,"AbstractLoader")}(),this.createjs=this.createjs||{},function(){"use strict";function XMLLoader(a){this.AbstractLoader_constructor(a,!0,createjs.AbstractLoader.XML),this.resultFormatter=this._formatResult}var a=createjs.extend(XMLLoader,createjs.AbstractLoader),b=XMLLoader;b.canLoadItem=function(a){return a.type==createjs.AbstractLoader.XML},a._formatResult=function(a){return createjs.DataUtils.parseXML(a.getResult(!0),"text/xml")},createjs.XMLLoader=createjs.promote(XMLLoader,"AbstractLoader")}(); \ No newline at end of file diff --git a/example/lib/profiler.js b/example/lib/profiler.js new file mode 100644 index 0000000..6cc91bf --- /dev/null +++ b/example/lib/profiler.js @@ -0,0 +1,137 @@ +(function (root, factory) { + if (typeof define === 'function' && define.amd) { + define(factory); + } else if (typeof module === 'object' && module.exports) { + module.exports = factory(); + } else { + root.pf = root.profiler = factory(); + } +}(this, function (b) { + var cache = {}; + + return { + showAll: false, + + set: function (config) { + if (config.showAll !== undefined) this.showAll = config.showAll; + if (config.count !== undefined) this.count(config.count, "_ALL_"); + if (config.delay !== undefined) this.delay(config.delay, "_ALL_"); + if (config.keydown !== undefined) this.keydown("_ALL_"); + }, + + count: function (count, name) { + name = name || 'default'; + this.create(name); + cache[name].count = count; + cache[name].useC = true; + }, + + delay: function (begin, name) { + name = name || 'default'; + this.create(name); + cache[name].begin = begin * 1000; + }, + + keydown: function (name) { + + }, + + a: function (name) { + name = name || 'default'; + this.create(name); + + if (cache[name].out) return; + + cache[name].t++; + + cache[name].start = (performance || Date).now(); + }, + + b: function (name) { + name = name || 'default'; + this.create(name); + + if (cache[name].out) return; + if (cache[name].t < cache[name].begin) return; + + cache[name].end = (performance || Date).now(); + cache[name].m = performance.memory.usedJSHeapSize / 1048576; + cache[name].index++; + + this.c(name); + + if (!cache[name].useC) { + this.log(name); + } else { + if (this.out(name)) { + this.log(name); + cache[name].out = true; + } + } + }, + + c: function (name) { + var time = cache[name].end - (cache[name].start || cache[name].end); + time = this.floor(time); + cache[name].times.push(time); + + cache[name].memorys.push(cache[name].m); + }, + + floor: function (val) { + return Math.floor(val * Math.pow(10, 5)) / Math.pow(10, 5); + }, + + log: function (name) { + var char = "------------------------------------ PROFILER ------------------------------------"; + console.log("%c " + char, "color:#34a900"); + console.log("%c name: " + name, "color:#34a900"); + console.log("%c average time: " + this.averageTime(name), "color:#2490ff"); + console.log("%c average memory: " + this.averageMemory(name), "color:#ff8041"); + + if (this.showAll) { + console.log("%c all time: " + cache[name].times.toString(), "color:#2490ff"); + console.log("%c all memory: " + cache[name].memorys.toString(), "color:#ff8041"); + } + + console.log("%c " + char, "color:#34a900"); + }, + + out: function (name) { + if (cache[name].count && cache[name].count <= cache[name].index) { + return true; + } else { + return false; + } + }, + + create: function (name) { + if (!cache[name]) cache[name] = {}; + if (!cache[name].times) cache[name].times = []; + if (!cache[name].memorys) cache[name].memorys = []; + if (!cache[name].index) cache[name].index = 0; + if (!cache[name].t) cache[name].t = 0; + if (!cache[name].begin) cache[name].begin = 0; + }, + + averageTime: function (name) { + var total = 0; + for (var i = 0; i < cache[name].times.length; i++) { + var time = cache[name].times[i]; + total += time; + } + + return this.floor(total / (cache[name].count || 1)); + }, + + averageMemory: function (name) { + var total = 0; + for (var i = 0; i < cache[name].memorys.length; i++) { + var m = cache[name].memorys[i]; + total += m; + } + + return this.floor(total / (cache[name].count || 1)); + } + }; +})); \ No newline at end of file diff --git a/example/lib/require.js b/example/lib/require.js deleted file mode 100644 index d58ca20..0000000 --- a/example/lib/require.js +++ /dev/null @@ -1,35 +0,0 @@ -/* - RequireJS 2.1.4 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved. - Available via the MIT or new BSD license. - see: http://github.com/jrburke/requirejs for details -*/ -var requirejs,require,define; -(function(Y){function I(b){return"[object Function]"===L.call(b)}function J(b){return"[object Array]"===L.call(b)}function x(b,c){if(b){var d;for(d=0;dthis.depCount&&!this.defined){if(I(n)){if(this.events.error)try{e=k.execCb(c,n,b,e)}catch(d){a=d}else e=k.execCb(c,n,b,e);this.map.isDefine&&((b=this.module)&&void 0!==b.exports&&b.exports!==this.exports?e=b.exports:void 0===e&&this.usingExports&&(e=this.exports));if(a)return a.requireMap=this.map,a.requireModules=[this.map.id],a.requireType="define",A(this.error=a)}else e=n;this.exports=e;if(this.map.isDefine&& -!this.ignore&&(p[c]=e,l.onResourceLoad))l.onResourceLoad(k,this.map,this.depMaps);delete j[c];this.defined=!0}this.defining=!1;this.defined&&!this.defineEmitted&&(this.defineEmitted=!0,this.emit("defined",this.exports),this.defineEmitComplete=!0)}}else this.fetch()}},callPlugin:function(){var a=this.map,b=a.id,d=h(a.prefix);this.depMaps.push(d);s(d,"defined",t(this,function(e){var n,d;d=this.map.name;var v=this.map.parentMap?this.map.parentMap.name:null,g=k.makeRequire(a.parentMap,{enableBuildCallback:!0}); -if(this.map.unnormalized){if(e.normalize&&(d=e.normalize(d,function(a){return c(a,v,!0)})||""),e=h(a.prefix+"!"+d,this.map.parentMap),s(e,"defined",t(this,function(a){this.init([],function(){return a},null,{enabled:!0,ignore:!0})})),d=i(j,e.id)){this.depMaps.push(e);if(this.events.error)d.on("error",t(this,function(a){this.emit("error",a)}));d.enable()}}else n=t(this,function(a){this.init([],function(){return a},null,{enabled:!0})}),n.error=t(this,function(a){this.inited=!0;this.error=a;a.requireModules= -[b];E(j,function(a){0===a.map.id.indexOf(b+"_unnormalized")&&delete j[a.map.id]});A(a)}),n.fromText=t(this,function(e,c){var d=a.name,u=h(d),v=O;c&&(e=c);v&&(O=!1);q(u);r(m.config,b)&&(m.config[d]=m.config[b]);try{l.exec(e)}catch(j){return A(F("fromtexteval","fromText eval for "+b+" failed: "+j,j,[b]))}v&&(O=!0);this.depMaps.push(u);k.completeLoad(d);g([d],n)}),e.load(a.name,g,n,m)}));k.enable(d,this);this.pluginMaps[d.id]=d},enable:function(){this.enabling=this.enabled=!0;x(this.depMaps,t(this,function(a, -b){var c,e;if("string"===typeof a){a=h(a,this.map.isDefine?this.map:this.map.parentMap,!1,!this.skipMap);this.depMaps[b]=a;if(c=i(N,a.id)){this.depExports[b]=c(this);return}this.depCount+=1;s(a,"defined",t(this,function(a){this.defineDep(b,a);this.check()}));this.errback&&s(a,"error",this.errback)}c=a.id;e=j[c];!r(N,c)&&(e&&!e.enabled)&&k.enable(a,this)}));E(this.pluginMaps,t(this,function(a){var b=i(j,a.id);b&&!b.enabled&&k.enable(a,this)}));this.enabling=!1;this.check()},on:function(a,b){var c= -this.events[a];c||(c=this.events[a]=[]);c.push(b)},emit:function(a,b){x(this.events[a],function(a){a(b)});"error"===a&&delete this.events[a]}};k={config:m,contextName:b,registry:j,defined:p,urlFetched:S,defQueue:G,Module:W,makeModuleMap:h,nextTick:l.nextTick,configure:function(a){a.baseUrl&&"/"!==a.baseUrl.charAt(a.baseUrl.length-1)&&(a.baseUrl+="/");var b=m.pkgs,c=m.shim,e={paths:!0,config:!0,map:!0};E(a,function(a,b){e[b]?"map"===b?Q(m[b],a,!0,!0):Q(m[b],a,!0):m[b]=a});a.shim&&(E(a.shim,function(a, -b){J(a)&&(a={deps:a});if((a.exports||a.init)&&!a.exportsFn)a.exportsFn=k.makeShimExports(a);c[b]=a}),m.shim=c);a.packages&&(x(a.packages,function(a){a="string"===typeof a?{name:a}:a;b[a.name]={name:a.name,location:a.location||a.name,main:(a.main||"main").replace(ga,"").replace(aa,"")}}),m.pkgs=b);E(j,function(a,b){!a.inited&&!a.map.unnormalized&&(a.map=h(b))});if(a.deps||a.callback)k.require(a.deps||[],a.callback)},makeShimExports:function(a){return function(){var b;a.init&&(b=a.init.apply(Y,arguments)); -return b||a.exports&&Z(a.exports)}},makeRequire:function(a,d){function g(e,c,u){var i,m;d.enableBuildCallback&&(c&&I(c))&&(c.__requireJsBuild=!0);if("string"===typeof e){if(I(c))return A(F("requireargs","Invalid require call"),u);if(a&&r(N,e))return N[e](j[a.id]);if(l.get)return l.get(k,e,a);i=h(e,a,!1,!0);i=i.id;return!r(p,i)?A(F("notloaded",'Module name "'+i+'" has not been loaded yet for context: '+b+(a?"":". Use require([])"))):p[i]}K();k.nextTick(function(){K();m=q(h(null,a));m.skipMap=d.skipMap; -m.init(e,c,u,{enabled:!0});C()});return g}d=d||{};Q(g,{isBrowser:z,toUrl:function(b){var d,f=b.lastIndexOf("."),h=b.split("/")[0];if(-1!==f&&(!("."===h||".."===h)||1g.attachEvent.toString().indexOf("[native code"))&& -!V?(O=!0,g.attachEvent("onreadystatechange",b.onScriptLoad)):(g.addEventListener("load",b.onScriptLoad,!1),g.addEventListener("error",b.onScriptError,!1)),g.src=d,K=g,D?B.insertBefore(g,D):B.appendChild(g),K=null,g;$&&(importScripts(d),b.completeLoad(c))};z&&M(document.getElementsByTagName("script"),function(b){B||(B=b.parentNode);if(s=b.getAttribute("data-main"))return q.baseUrl||(H=s.split("/"),ba=H.pop(),ca=H.length?H.join("/")+"/":"./",q.baseUrl=ca,s=ba),s=s.replace(aa,""),q.deps=q.deps?q.deps.concat(s): -[s],!0});define=function(b,c,d){var i,g;"string"!==typeof b&&(d=c,c=b,b=null);J(c)||(d=c,c=[]);!c.length&&I(d)&&d.length&&(d.toString().replace(ia,"").replace(ja,function(b,d){c.push(d)}),c=(1===d.length?["require"]:["require","exports","module"]).concat(c));if(O){if(!(i=K))P&&"interactive"===P.readyState||M(document.getElementsByTagName("script"),function(b){if("interactive"===b.readyState)return P=b}),i=P;i&&(b||(b=i.getAttribute("data-requiremodule")),g=C[i.getAttribute("data-requirecontext")])}(g? -g.defQueue:R).push([b,c,d])};define.amd={jQuery:!0};l.exec=function(b){return eval(b)};l(q)}})(this); diff --git a/example/render/custom/custom-renderer.html b/example/render/custom/custom-renderer.html new file mode 100644 index 0000000..9ebcd15 --- /dev/null +++ b/example/render/custom/custom-renderer.html @@ -0,0 +1,107 @@ + + + + + proton.js-render-custom + + + + + + + + + + + + \ No newline at end of file diff --git a/example/render/custom/pixi.js b/example/render/custom/pixi.js deleted file mode 100755 index 3478cf4..0000000 --- a/example/render/custom/pixi.js +++ /dev/null @@ -1,5702 +0,0 @@ -/** - * @license - * Pixi.JS - v1.0.0 - * Copyright (c) 2012, Mat Groves - * http://goodboydigital.com/ - * - * Compiled: 2013-05-24 - * - * Pixi.JS is licensed under the MIT License. - * http://www.opensource.org/licenses/mit-license.php - */ -/** - * @author Mat Groves http://matgroves.com/ @Doormat23 - */ - -(function(){ - - var root = this; - -/** - * @author Mat Groves http://matgroves.com/ @Doormat23 - */ - -/** -@module PIXI - */ -var PIXI = PIXI || {}; - -/** - * @author Mat Groves http://matgroves.com/ @Doormat23 - */ - -/** - * The Point object represents a location in a two-dimensional coordinate system, where x represents the horizontal axis and y represents the vertical axis. - * @class Point - * @constructor - * @param x {Number} position of the point - * @param y {Number} position of the point - */ -PIXI.Point = function(x, y) -{ - /** - * @property x - * @type Number - * @default 0 - */ - this.x = x || 0; - - /** - * @property y - * @type Number - * @default 0 - */ - this.y = y || 0; -} - -/** - * @method clone - * @return a copy of the point - */ -PIXI.Point.prototype.clone = function() -{ - return new PIXI.Point(this.x, this.y); -} - -// constructor -PIXI.Point.constructor = PIXI.Point; - - -/** - * @author Mat Groves http://matgroves.com/ - */ - -/** - * the Rectangle object is an area defined by its position, as indicated by its top-left corner point (x, y) and by its width and its height. - * @class Rectangle - * @constructor - * @param x {Number} position of the rectangle - * @param y {Number} position of the rectangle - * @param width {Number} of the rectangle - * @param height {Number} of the rectangle - */ -PIXI.Rectangle = function(x, y, width, height) -{ - /** - * @property x - * @type Number - * @default 0 - */ - this.x = x || 0; - - /** - * @property y - * @type Number - * @default 0 - */ - this.y = y || 0; - - /** - * @property width - * @type Number - * @default 0 - */ - this.width = width || 0; - - /** - * @property height - * @type Number - * @default 0 - */ - this.height = height || 0; -} - -/** - * @method clone - * @return a copy of the rectangle - */ -PIXI.Rectangle.prototype.clone = function() -{ - return new PIXI.Rectangle(this.x, this.y, this.width, this.height); -} - -// constructor -PIXI.Rectangle.constructor = PIXI.Rectangle; - - -/** - * @author Mat Groves http://matgroves.com/ @Doormat23 - */ - -/** - * this is the base class for all objects that are rendered on the screen. - * @class DisplayObject - * @constructor - */ -PIXI.DisplayObject = function() -{ - /** - * The coordinate of the object relative to the local coordinates of the parent. - * @property position - * @type Point - */ - this.position = new PIXI.Point(); - - /** - * The scale factor of the object. - * @property scale - * @type Point - */ - this.scale = new PIXI.Point(1,1);//{x:1, y:1}; - - /** - * The pivot point of the displayObject that it rotates around - * @property pivot - * @type Point - */ - this.pivot = new PIXI.Point(0,0); - - /** - * The rotation of the object in radians. - * @property rotation - * @type Number - */ - this.rotation = 0; - - /** - * The opacity of the object. - * @property alpha - * @type Number - */ - this.alpha = 1; - - /** - * The visibility of the object. - * @property visible - * @type Boolean - */ - this.visible = true; - this.worldVisible = false; - - /** - * [read-only] The display object container that contains this display object. - * @property parent - * @type DisplayObjectContainer - */ - this.parent = null; - - /** - * [read-only] The stage the display object is connected to, or undefined if it is not connected to the stage. - * @property stage - * @type Stage - */ - this.stage = null; - - /** - * This is the defined area that will pick up mouse / touch events. It is null by default. - * Setting it is a neat way of optimising the hitTest function that the interactionManager will use (as it will not need to hit test all the children) - * @property hitArea - * @type Rectangle - */ - this.hitArea = null; - - this.worldAlpha = 1; - this.color = []; - - this.worldTransform = PIXI.mat3.create()//mat3.identity(); - this.localTransform = PIXI.mat3.create()//mat3.identity(); - - this.dynamic = true; - // chach that puppy! - this._sr = 0; - this._cr = 1; - - this.childIndex = 0; - - this.renderable = false; - - // [readonly] best not to toggle directly! use setInteractive() - this.interactive = false; - - /** - * This is used to indicate if the displayObject should display a mouse hand cursor on rollover - * @property buttonMode - * @type Boolean - */ - this.buttonMode = false; - - /* - * MOUSE Callbacks - */ - - /** - * A callback that is used when the users clicks on the displayObject with their mouse - * @method click - * @param interactionData {InteractionData} - */ - - /** - * A callback that is used when the user clicks the mouse down over the sprite - * @method mousedown - * @param interactionData {InteractionData} - */ - - /** - * A callback that is used when the user releases the mouse that was over the displayObject - * for this callback to be fired the mouse must have been pressed down over the displayObject - * @method mouseup - * @param interactionData {InteractionData} - */ - - /** - * A callback that is used when the user releases the mouse that was over the displayObject but is no longer over the displayObject - * for this callback to be fired, The touch must have started over the displayObject - * @method mouseupoutside - * @param interactionData {InteractionData} - */ - - /** - * A callback that is used when the users mouse rolls over the displayObject - * @method mouseover - * @param interactionData {InteractionData} - */ - - /** - * A callback that is used when the users mouse leaves the displayObject - * @method mouseout - * @param interactionData {InteractionData} - */ - - - /* - * TOUCH Callbacks - */ - - /** - * A callback that is used when the users taps on the sprite with their finger - * basically a touch version of click - * @method tap - * @param interactionData {InteractionData} - */ - - /** - * A callback that is used when the user touch's over the displayObject - * @method touchstart - * @param interactionData {InteractionData} - */ - - /** - * A callback that is used when the user releases a touch over the displayObject - * @method touchend - * @param interactionData {InteractionData} - */ - - /** - * A callback that is used when the user releases the touch that was over the displayObject - * for this callback to be fired, The touch must have started over the sprite - * @method touchendoutside - * @param interactionData {InteractionData} - */ -} - -// constructor -PIXI.DisplayObject.constructor = PIXI.DisplayObject; - -//TODO make visible a getter setter -/* -Object.defineProperty(PIXI.DisplayObject.prototype, 'visible', { - get: function() { - return this._visible; - }, - set: function(value) { - this._visible = value; - } -});*/ - -/** - * Indicates if the sprite will have touch and mouse interactivity. It is false by default - * @method setInteractive - * @param interactive {Boolean} - */ -PIXI.DisplayObject.prototype.setInteractive = function(interactive) -{ - this.interactive = interactive; - // TODO more to be done here.. - // need to sort out a re-crawl! - if(this.stage)this.stage.dirty = true; -} - - -/** - * @private - */ -PIXI.DisplayObject.prototype.updateTransform = function() -{ - // TODO OPTIMIZE THIS!! with dirty - if(this.rotation != this.rotationCache) - { - this.rotationCache = this.rotation; - this._sr = Math.sin(this.rotation); - this._cr = Math.cos(this.rotation); - } - - var localTransform = this.localTransform; - var parentTransform = this.parent.worldTransform; - var worldTransform = this.worldTransform; - //console.log(localTransform) - localTransform[0] = this._cr * this.scale.x; - localTransform[1] = -this._sr * this.scale.y - localTransform[3] = this._sr * this.scale.x; - localTransform[4] = this._cr * this.scale.y; - - ///AAARR GETTER SETTTER! - //localTransform[2] = this.position.x; - //localTransform[5] = this.position.y; - - var px = this.pivot.x; - var py = this.pivot.y; - - ///AAARR GETTER SETTTER! - localTransform[2] = this.position.x - localTransform[0] * px - py * localTransform[1]; - localTransform[5] = this.position.y - localTransform[4] * py - px * localTransform[3]; - - // Cache the matrix values (makes for huge speed increases!) - var a00 = localTransform[0], a01 = localTransform[1], a02 = localTransform[2], - a10 = localTransform[3], a11 = localTransform[4], a12 = localTransform[5], - - b00 = parentTransform[0], b01 = parentTransform[1], b02 = parentTransform[2], - b10 = parentTransform[3], b11 = parentTransform[4], b12 = parentTransform[5]; - - worldTransform[0] = b00 * a00 + b01 * a10; - worldTransform[1] = b00 * a01 + b01 * a11; - worldTransform[2] = b00 * a02 + b01 * a12 + b02; - - worldTransform[3] = b10 * a00 + b11 * a10; - worldTransform[4] = b10 * a01 + b11 * a11; - worldTransform[5] = b10 * a02 + b11 * a12 + b12; - - // because we are using affine transformation, we can optimise the matrix concatenation process.. wooo! - // mat3.multiply(this.localTransform, this.parent.worldTransform, this.worldTransform); - this.worldAlpha = this.alpha * this.parent.worldAlpha; - - -} - -/** - * @author Mat Groves http://matgroves.com/ @Doormat23 - */ - - -/** - * A DisplayObjectContainer represents a collection of display objects. It is the base class of all display objects that act as a container for other objects. - * @class DisplayObjectContainer - * @extends DisplayObject - * @constructor - */ -PIXI.DisplayObjectContainer = function() -{ - PIXI.DisplayObject.call( this ); - - /** - * [read-only] The of children of this container. - * @property children {Array} - */ - this.children = []; - //s - this.renderable = false; -} - -// constructor -PIXI.DisplayObjectContainer.constructor = PIXI.DisplayObjectContainer; -PIXI.DisplayObjectContainer.prototype = Object.create( PIXI.DisplayObject.prototype ); - -//TODO make visible a getter setter -/* -Object.defineProperty(PIXI.DisplayObjectContainer.prototype, 'visible', { - get: function() { - return this._visible; - }, - set: function(value) { - this._visible = value; - - } -});*/ - -/** - * Adds a child to the container. - * @method addChild - * @param DisplayObject {DisplayObject} - */ -PIXI.DisplayObjectContainer.prototype.addChild = function(child) -{ - if(child.parent != undefined) - { - child.parent.removeChild(child); - } - - child.parent = this; - child.childIndex = this.children.length; - - this.children.push(child); - - if(this.stage) - { - this.stage.__addChild(child); - } - - // need to remove any render groups.. - if(this.__renderGroup) - { - // being used by a renderTexture.. if it exists then it must be from a render texture; - if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); - // add them to the new render group.. - this.__renderGroup.addDisplayObjectAndChildren(child); - } -} - -/** - * Adds a child to the container at a specified index. If the index is out of bounds an error will be thrown - * @method addChildAt - * @param DisplayObject {DisplayObject} - * @param index {Number} - */ -PIXI.DisplayObjectContainer.prototype.addChildAt = function(child, index) -{ - if(index >= 0 && index <= this.children.length) - { - if(child.parent != undefined) - { - child.parent.removeChild(child); - } - - if (index == this.children.length) - { - this.children.push(child); - } - else - { - this.children.splice(index, 0, child); - } - - child.parent = this; - child.childIndex = index; - - var length = this.children.length; - for (var i=index; i < length; i++) - { - this.children[i].childIndex = i; - } - - if(this.stage) - { - this.stage.__addChild(child); - } - - // need to remove any render groups.. - if(this.__renderGroup) - { - // being used by a renderTexture.. if it exists then it must be from a render texture; - if(child.__renderGroup)child.__renderGroup.removeDisplayObjectAndChildren(child); - // add them to the new render group.. - this.__renderGroup.addDisplayObjectAndChildren(child); - } - } - else - { - // error! - - throw new Error(child + " The index "+ index +" supplied is out of bounds " + this.children.length); - } -} - -/** - * Swaps the depth of 2 displayObjects - * @method swapChildren - * @param DisplayObject {DisplayObject} - * @param DisplayObject2 {DisplayObject} - */ -PIXI.DisplayObjectContainer.prototype.swapChildren = function(child, child2) -{ - // TODO I already know this?? - var index = this.children.indexOf( child ); - var index2 = this.children.indexOf( child2 ); - - if ( index !== -1 && index2 !== -1 ) - { - // cool - if(this.stage) - { - // this is to satisfy the webGL batching.. - // TODO sure there is a nicer way to achieve this! - this.stage.__removeChild(child); - this.stage.__removeChild(child2); - - this.stage.__addChild(child); - this.stage.__addChild(child2); - } - - // swap the indexes.. - child.childIndex = index2; - child2.childIndex = index; - // swap the positions.. - this.children[index] = child2; - this.children[index2] = child; - - } - else - { - throw new Error(child + " Both the supplied DisplayObjects must be a child of the caller " + this); - } -} - -/** - * Returns the Child at the specified index - * @method getChildAt - * @param index {Number} - */ -PIXI.DisplayObjectContainer.prototype.getChildAt = function(index) -{ - if(index >= 0 && index < this.children.length) - { - return this.children[index]; - } - else - { - throw new Error(child + " Both the supplied DisplayObjects must be a child of the caller " + this); - - } -} - -/** - * Removes a child from the container. - * @method removeChild - * @param DisplayObject {DisplayObject} - */ -PIXI.DisplayObjectContainer.prototype.removeChild = function(child) -{ - var index = this.children.indexOf( child ); - - if ( index !== -1 ) - { - if(this.stage) - { - this.stage.__removeChild(child); - } - - // webGL trim - if(child.__renderGroup) - { - child.__renderGroup.removeDisplayObjectAndChildren(child); - } - - // console.log(">" + child.__renderGroup) - child.parent = undefined; - - this.children.splice( index, 1 ); - - // update in dexs! - for(var i=index,j=this.children.length; i= this.textures.length) - { - this.gotoAndStop(this.textures.length - 1); - if(this.onComplete) - { - this.onComplete(); - } - } -} -/** - * @author Mat Groves http://matgroves.com/ @Doormat23 - */ - -/** - * A Text Object will create a line(s) of text to split a line you can use "\n" - * @class Text - * @extends Sprite - * @constructor - * @param {String} text The copy that you would like the text to display - * @param {Object} [style] The style parameters - * @param {String} [style.font] default "bold 20pt Arial" The style and size of the font - * @param {Object} [style.fill="black"] A canvas fillstyle that will be used on the text eg "red", "#00FF00" - * @param {String} [style.align="left"] An alignment of the multiline text ("left", "center" or "right") - * @param {String} [style.stroke] A canvas fillstyle that will be used on the text stroke eg "blue", "#FCFF00" - * @param {Number} [style.strokeThickness=0] A number that represents the thickness of the stroke. Default is 0 (no stroke) - */ -PIXI.Text = function(text, style) -{ - this.canvas = document.createElement("canvas"); - this.context = this.canvas.getContext("2d"); - PIXI.Sprite.call(this, PIXI.Texture.fromCanvas(this.canvas)); - - this.setText(text); - this.setStyle(style); - - this.updateText(); - this.dirty = false; -}; - -// constructor -PIXI.Text.constructor = PIXI.Text; -PIXI.Text.prototype = Object.create(PIXI.Sprite.prototype); - -/** - * Set the style of the text - * @method setStyle - * @param {Object} [style] The style parameters - * @param {String} [style.font="bold 20pt Arial"] The style and size of the font - * @param {Object} [style.fill="black"] A canvas fillstyle that will be used on the text eg "red", "#00FF00" - * @param {String} [style.align="left"] An alignment of the multiline text ("left", "center" or "right") - * @param {String} [style.stroke] A canvas fillstyle that will be used on the text stroke eg "blue", "#FCFF00" - * @param {Number} [style.strokeThickness=0] A number that represents the thickness of the stroke. Default is 0 (no stroke) - */ -PIXI.Text.prototype.setStyle = function(style) -{ - style = style || {}; - style.font = style.font || "bold 20pt Arial"; - style.fill = style.fill || "black"; - style.align = style.align || "left"; - style.strokeThickness = style.strokeThickness || 0; - this.style = style; - this.dirty = true; -}; - -/** - * Set the copy for the text object. To split a line you can use "\n" - * @methos setText - * @param {String} text The copy that you would like the text to display - */ -PIXI.Sprite.prototype.setText = function(text) -{ - this.text = text || " "; - this.dirty = true; -}; - -/** - * Renders text - * @private - */ -PIXI.Text.prototype.updateText = function() -{ - this.context.font = this.style.font; - - //split text into lines - var lines = this.text.split(/(?:\r\n|\r|\n)/); - - //calculate text width - var lineWidths = []; - var maxLineWidth = 0; - for (var i = 0; i < lines.length; i++) - { - var lineWidth = this.context.measureText(lines[i]).width; - lineWidths[i] = lineWidth; - maxLineWidth = Math.max(maxLineWidth, lineWidth); - } - this.canvas.width = maxLineWidth + this.style.strokeThickness; - - //calculate text height - var lineHeight = this.determineFontHeight("font: " + this.style.font + ";") + this.style.strokeThickness; - this.canvas.height = lineHeight * lines.length; - - //set canvas text styles - this.context.fillStyle = this.style.fill; - this.context.font = this.style.font; - - this.context.strokeStyle = this.style.stroke; - this.context.lineWidth = this.style.strokeThickness; - - this.context.textBaseline = "top"; - - //draw lines line by line - for (i = 0; i < lines.length; i++) - { - var linePosition = new PIXI.Point(this.style.strokeThickness / 2, this.style.strokeThickness / 2 + i * lineHeight); - - if(this.style.align == "right") - { - linePosition.x += maxLineWidth - lineWidths[i]; - } - else if(this.style.align == "center") - { - linePosition.x += (maxLineWidth - lineWidths[i]) / 2; - } - - if(this.style.stroke && this.style.strokeThickness) - { - this.context.strokeText(lines[i], linePosition.x, linePosition.y); - } - - if(this.style.fill) - { - this.context.fillText(lines[i], linePosition.x, linePosition.y); - } - } - - this.updateTexture(); -}; - -/** - * Updates texture size based on canvas size - * @private - */ -PIXI.Text.prototype.updateTexture = function() -{ - - this.texture.baseTexture.width = this.canvas.width; - this.texture.baseTexture.height = this.canvas.height; - this.texture.frame.width = this.canvas.width; - this.texture.frame.height = this.canvas.height; - - this._width = this.canvas.width; - this._height = this.canvas.height; - - PIXI.texturesToUpdate.push(this.texture.baseTexture); -}; - -/** - * @private - */ -PIXI.Text.prototype.updateTransform = function() -{ - if(this.dirty) - { - this.updateText(); - this.dirty = false; - } - - PIXI.Sprite.prototype.updateTransform.call(this); -}; - -/* - * http://stackoverflow.com/users/34441/ellisbben - * great solution to the problem! - */ -PIXI.Text.prototype.determineFontHeight = function(fontStyle) -{ - // build a little reference dictionary so if the font style has been used return a - // cached version... - var result = PIXI.Text.heightCache[fontStyle]; - - if(!result) - { - var body = document.getElementsByTagName("body")[0]; - var dummy = document.createElement("div"); - var dummyText = document.createTextNode("M"); - dummy.appendChild(dummyText); - dummy.setAttribute("style", fontStyle); - body.appendChild(dummy); - - result = dummy.offsetHeight; - PIXI.Text.heightCache[fontStyle] = result; - - body.removeChild(dummy); - } - - return result; -}; - -PIXI.Text.prototype.destroy = function(destroyTexture) -{ - if(destroyTexture) - { - this.texture.destroy(); - } - -}; - -PIXI.Text.heightCache = {}; - -/** - * @author Mat Groves http://matgroves.com/ @Doormat23 - */ - -/** - * A Text Object will create a line(s) of text using bitmap font. To split a line you can use "\n", "\r" or "\r\n" - * You can generate the fnt files using - * http://www.angelcode.com/products/bmfont/ for windows or - * http://www.bmglyph.com/ for mac. - * @class BitmapText - * @extends DisplayObjectContainer - * @constructor - * @param {String} text The copy that you would like the text to display - * @param {Object} style The style parameters - * @param {String} style.font The size (optional) and bitmap font id (required) eq "Arial" or "20px Arial" (must have loaded previously) - * @param {String} [style.align="left"] An alignment of the multiline text ("left", "center" or "right") - */ -PIXI.BitmapText = function(text, style) -{ - PIXI.DisplayObjectContainer.call(this); - - this.setText(text); - this.setStyle(style); - this.updateText(); - this.dirty = false - -}; - -// constructor -PIXI.BitmapText.constructor = PIXI.BitmapText; -PIXI.BitmapText.prototype = Object.create(PIXI.DisplayObjectContainer.prototype); - -/** - * Set the copy for the text object - * @method setText - * @param {String} text The copy that you would like the text to display - */ -PIXI.BitmapText.prototype.setText = function(text) -{ - this.text = text || " "; - this.dirty = true; -}; - -/** - * Set the style of the text - * @method setStyle - * @param {Object} style The style parameters - * @param {String} style.font The size (optional) and bitmap font id (required) eq "Arial" or "20px Arial" (must have loaded previously) - * @param {String} [style.align="left"] An alignment of the multiline text ("left", "center" or "right") - */ -PIXI.BitmapText.prototype.setStyle = function(style) -{ - style = style || {}; - style.align = style.align || "left"; - this.style = style; - - var font = style.font.split(" "); - this.fontName = font[font.length - 1]; - this.fontSize = font.length >= 2 ? parseInt(font[font.length - 2], 10) : PIXI.BitmapText.fonts[this.fontName].size; - - this.dirty = true; -}; - -/** - * Renders text - * @private - */ -PIXI.BitmapText.prototype.updateText = function() -{ - var data = PIXI.BitmapText.fonts[this.fontName]; - var pos = new PIXI.Point(); - var prevCharCode = null; - var chars = []; - var maxLineWidth = 0; - var lineWidths = []; - var line = 0; - var scale = this.fontSize / data.size; - for(var i = 0; i < this.text.length; i++) - { - var charCode = this.text.charCodeAt(i); - if(/(?:\r\n|\r|\n)/.test(this.text.charAt(i))) - { - lineWidths.push(pos.x); - maxLineWidth = Math.max(maxLineWidth, pos.x); - line++; - - pos.x = 0; - pos.y += data.lineHeight; - prevCharCode = null; - continue; - } - - var charData = data.chars[charCode]; - if(!charData) continue; - - if(prevCharCode && charData[prevCharCode]) - { - pos.x += charData.kerning[prevCharCode]; - } - chars.push({line: line, charCode: charCode, position: new PIXI.Point(pos.x + charData.xOffset, pos.y + charData.yOffset)}); - pos.x += charData.xAdvance; - - prevCharCode = charCode; - } - - lineWidths.push(pos.x); - maxLineWidth = Math.max(maxLineWidth, pos.x); - - var lineAlignOffsets = []; - for(i = 0; i <= line; i++) - { - var alignOffset = 0; - if(this.style.align == "right") - { - alignOffset = maxLineWidth - lineWidths[i]; - } - else if(this.style.align == "center") - { - alignOffset = (maxLineWidth - lineWidths[i]) / 2; - } - lineAlignOffsets.push(alignOffset); - } - - for(i = 0; i < chars.length; i++) - { - var char = PIXI.Sprite.fromFrame(chars[i].charCode); - char.position.x = (chars[i].position.x + lineAlignOffsets[chars[i].line]) * scale; - char.position.y = chars[i].position.y * scale; - char.scale.x = char.scale.y = scale; - this.addChild(char); - } - - this.width = pos.x * scale; - this.height = (pos.y + data.lineHeight) * scale; -}; - -/** - * @private - */ -PIXI.BitmapText.prototype.updateTransform = function() -{ - if(this.dirty) - { - while(this.children.length > 0) - { - this.removeChild(this.getChildAt(0)); - } - this.updateText(); - - this.dirty = false; - } - - PIXI.DisplayObjectContainer.prototype.updateTransform.call(this); -}; - -PIXI.BitmapText.fonts = {}; -/** - * @author Mat Groves http://matgroves.com/ @Doormat23 - */ - - - -/** -The interaction manager deals with mouse and touch events. Any DisplayObject can be interactive -This manager also supports multitouch. -@class InteractionManager -@constructor -@param stage {Stage} -@type Stage -*/ -PIXI.InteractionManager = function(stage) -{ - /** - * a refference to the stage - * @property stage - * @type Stage - */ - this.stage = stage; - - // helpers - this.tempPoint = new PIXI.Point(); - //this.tempMatrix = mat3.create(); - - this.mouseoverEnabled = true; - - /** - * the mouse data - * @property mouse - * @type InteractionData - */ - this.mouse = new PIXI.InteractionData(); - - /** - * an object that stores current touches (InteractionData) by id reference - * @property touchs - * @type Object - */ - this.touchs = {}; - - //tiny little interactiveData pool! - this.pool = []; - - this.interactiveItems = []; - - this.last = 0; -} - -// constructor -PIXI.InteractionManager.constructor = PIXI.InteractionManager; - -PIXI.InteractionManager.prototype.collectInteractiveSprite = function(displayObject, iParent) -{ - var children = displayObject.children; - var length = children.length; - - //this.interactiveItems = []; - /// make an interaction tree... {item.__interactiveParent} - for (var i = length-1; i >= 0; i--) - { - var child = children[i]; - - // push all interactive bits - if(child.interactive) - { - iParent.interactiveChildren = true; - //child.__iParent = iParent; - this.interactiveItems.push(child); - - if(child.children.length > 0) - { - this.collectInteractiveSprite(child, child); - } - } - else - { - child.__iParent = null; - - if(child.children.length > 0) - { - this.collectInteractiveSprite(child, iParent); - } - } - } -} - -PIXI.InteractionManager.prototype.setTarget = function(target) -{ - if (window.navigator.msPointerEnabled) - { - // time to remove some of that zoom in ja.. - target.view.style["-ms-content-zooming"] = "none"; - target.view.style["-ms-touch-action"] = "none" - - // DO some window specific touch! - } - - this.target = target; - target.view.addEventListener('mousemove', this.onMouseMove.bind(this), true); - target.view.addEventListener('mousedown', this.onMouseDown.bind(this), true); - document.body.addEventListener('mouseup', this.onMouseUp.bind(this), true); - target.view.addEventListener('mouseout', this.onMouseUp.bind(this), true); - - // aint no multi touch just yet! - target.view.addEventListener("touchstart", this.onTouchStart.bind(this), true); - target.view.addEventListener("touchend", this.onTouchEnd.bind(this), true); - target.view.addEventListener("touchmove", this.onTouchMove.bind(this), true); -} - -PIXI.InteractionManager.prototype.update = function() -{ - if(!this.target)return; - - // frequency of 30fps?? - var now = Date.now(); - var diff = now - this.last; - diff = (diff * 30) / 1000; - if(diff < 1)return; - this.last = now; - // - - // ok.. so mouse events?? - // yes for now :) - // OPTIMSE - how often to check?? - if(this.dirty) - { - this.dirty = false; - - var len = this.interactiveItems.length; - - for (var i=0; i < this.interactiveItems.length; i++) { - this.interactiveItems[i].interactiveChildren = false; - } - - this.interactiveItems = []; - - if(this.stage.interactive)this.interactiveItems.push(this.stage); - // go through and collect all the objects that are interactive.. - this.collectInteractiveSprite(this.stage, this.stage); - } - - // loop through interactive objects! - var length = this.interactiveItems.length; - - this.target.view.style.cursor = "default"; - - for (var i = 0; i < length; i++) - { - var item = this.interactiveItems[i]; - if(!item.visible)continue; - - // OPTIMISATION - only calculate every time if the mousemove function exists.. - // OK so.. does the object have any other interactive functions? - // hit-test the clip! - - - if(item.mouseover || item.mouseout || item.buttonMode) - { - // ok so there are some functions so lets hit test it.. - item.__hit = this.hitTest(item, this.mouse); - // ok so deal with interactions.. - // loks like there was a hit! - if(item.__hit) - { - if(item.buttonMode)this.target.view.style.cursor = "pointer"; - - if(!item.__isOver) - { - - if(item.mouseover)item.mouseover(this.mouse); - item.__isOver = true; - } - } - else - { - if(item.__isOver) - { - // roll out! - if(item.mouseout)item.mouseout(this.mouse); - item.__isOver = false; - } - } - } - - // ---> - } -} - -PIXI.InteractionManager.prototype.onMouseMove = function(event) -{ - event.preventDefault(); - - // TODO optimize by not check EVERY TIME! maybe half as often? // - var rect = this.target.view.getBoundingClientRect(); - - this.mouse.global.x = (event.clientX - rect.left) * (this.target.width / rect.width); - this.mouse.global.y = (event.clientY - rect.top) * ( this.target.height / rect.height); - - var length = this.interactiveItems.length; - var global = this.mouse.global; - - - for (var i = 0; i < length; i++) - { - var item = this.interactiveItems[i]; - - if(item.mousemove) - { - //call the function! - item.mousemove(this.mouse); - } - } -} - -PIXI.InteractionManager.prototype.onMouseDown = function(event) -{ - event.preventDefault(); - - // loop through inteaction tree... - // hit test each item! -> - // get interactive items under point?? - //stage.__i - var length = this.interactiveItems.length; - var global = this.mouse.global; - - var index = 0; - var parent = this.stage; - - // while - // hit test - for (var i = 0; i < length; i++) - { - var item = this.interactiveItems[i]; - - if(item.mousedown || item.click) - { - item.__mouseIsDown = true; - item.__hit = this.hitTest(item, this.mouse); - - if(item.__hit) - { - //call the function! - if(item.mousedown)item.mousedown(this.mouse); - item.__isDown = true; - - // just the one! - if(!item.interactiveChildren)break; - } - } - } -} - -PIXI.InteractionManager.prototype.onMouseUp = function(event) -{ - event.preventDefault(); - var global = this.mouse.global; - - - var length = this.interactiveItems.length; - var up = false; - - for (var i = 0; i < length; i++) - { - var item = this.interactiveItems[i]; - - if(item.mouseup || item.mouseupoutside || item.click) - { - item.__hit = this.hitTest(item, this.mouse); - - if(item.__hit && !up) - { - //call the function! - if(item.mouseup) - { - item.mouseup(this.mouse); - } - if(item.__isDown) - { - if(item.click)item.click(this.mouse); - } - - if(!item.interactiveChildren)up = true; - } - else - { - if(item.__isDown) - { - if(item.mouseupoutside)item.mouseupoutside(this.mouse); - } - } - - item.__isDown = false; - } - } -} - -PIXI.InteractionManager.prototype.hitTest = function(item, interactionData) -{ - var global = interactionData.global; - - if(!item.visible)return false; - - if(item instanceof PIXI.Sprite) - { - var worldTransform = item.worldTransform; - - var a00 = worldTransform[0], a01 = worldTransform[1], a02 = worldTransform[2], - a10 = worldTransform[3], a11 = worldTransform[4], a12 = worldTransform[5], - id = 1 / (a00 * a11 + a01 * -a10); - - var x = a11 * id * global.x + -a01 * id * global.y + (a12 * a01 - a02 * a11) * id; - var y = a00 * id * global.y + -a10 * id * global.x + (-a12 * a00 + a02 * a10) * id; - - var width = item.texture.frame.width; - var height = item.texture.frame.height; - - var x1 = -width * item.anchor.x; - - if(x > x1 && x < x1 + width) - { - var y1 = -height * item.anchor.y; - - if(y > y1 && y < y1 + height) - { - // set the target property if a hit is true! - interactionData.target = item - return true; - } - } - } - else if(item.hitArea) - { - var worldTransform = item.worldTransform; - var hitArea = item.hitArea; - - var a00 = worldTransform[0], a01 = worldTransform[1], a02 = worldTransform[2], - a10 = worldTransform[3], a11 = worldTransform[4], a12 = worldTransform[5], - id = 1 / (a00 * a11 + a01 * -a10); - - var x = a11 * id * global.x + -a01 * id * global.y + (a12 * a01 - a02 * a11) * id; - var y = a00 * id * global.y + -a10 * id * global.x + (-a12 * a00 + a02 * a10) * id; - - var x1 = hitArea.x; - if(x > x1 && x < x1 + hitArea.width) - { - var y1 = hitArea.y; - - if(y > y1 && y < y1 + hitArea.height) - { - return true; - } - } - } - - var length = item.children.length; - - for (var i = 0; i < length; i++) - { - var tempItem = item.children[i]; - var hit = this.hitTest(tempItem, interactionData); - if(hit)return true; - } - - return false; -} - - - -PIXI.InteractionManager.prototype.onTouchMove = function(event) -{ - event.preventDefault(); - - var rect = this.target.view.getBoundingClientRect(); - var changedTouches = event.changedTouches; - - for (var i=0; i < changedTouches.length; i++) - { - var touchEvent = changedTouches[i]; - var touchData = this.touchs[touchEvent.identifier]; - - // update the touch position - touchData.global.x = (touchEvent.clientX - rect.left) * (this.target.width / rect.width); - touchData.global.y = (touchEvent.clientY - rect.top) * (this.target.height / rect.height); - } - - var length = this.interactiveItems.length; - for (var i = 0; i < length; i++) - { - var item = this.interactiveItems[i]; - if(item.touchmove)item.touchmove(touchData); - } -} - -PIXI.InteractionManager.prototype.onTouchStart = function(event) -{ - event.preventDefault(); - var rect = this.target.view.getBoundingClientRect(); - - var changedTouches = event.changedTouches; - for (var i=0; i < changedTouches.length; i++) - { - var touchEvent = changedTouches[i]; - - var touchData = this.pool.pop(); - if(!touchData)touchData = new PIXI.InteractionData(); - - this.touchs[touchEvent.identifier] = touchData; - touchData.global.x = (touchEvent.clientX - rect.left) * (this.target.width / rect.width); - touchData.global.y = (touchEvent.clientY - rect.top) * (this.target.height / rect.height); - - var length = this.interactiveItems.length; - - for (var j = 0; j < length; j++) - { - var item = this.interactiveItems[j]; - - if(item.touchstart || item.tap) - { - item.__hit = this.hitTest(item, touchData); - - if(item.__hit) - { - //call the function! - if(item.touchstart)item.touchstart(touchData); - item.__isDown = true; - item.__touchData = touchData; - - if(!item.interactiveChildren)break; - } - } - } - } - -} - -PIXI.InteractionManager.prototype.onTouchEnd = function(event) -{ - event.preventDefault(); - - - var rect = this.target.view.getBoundingClientRect(); - var changedTouches = event.changedTouches; - - for (var i=0; i < changedTouches.length; i++) - { - - var touchEvent = changedTouches[i]; - var touchData = this.touchs[touchEvent.identifier]; - var up = false; - touchData.global.x = (touchEvent.clientX - rect.left) * (this.target.width / rect.width); - touchData.global.y = (touchEvent.clientY - rect.top) * (this.target.height / rect.height); - - var length = this.interactiveItems.length; - for (var j = 0; j < length; j++) - { - var item = this.interactiveItems[j]; - var itemTouchData = item.__touchData; // <-- Here! - item.__hit = this.hitTest(item, touchData); - - if(itemTouchData == touchData) - { - // so this one WAS down... - - // hitTest?? - - if(item.touchend || item.tap) - { - if(item.__hit && !up) - { - if(item.touchend)item.touchend(touchData); - if(item.__isDown) - { - if(item.tap)item.tap(touchData); - } - - if(!item.interactiveChildren)up = true; - } - else - { - if(item.__isDown) - { - if(item.touchendoutside)item.touchendoutside(touchData); - } - } - - item.__isDown = false; - } - - item.__touchData = null; - - } - else - { - - } - } - // remove the touch.. - this.pool.push(touchData); - this.touchs[touchEvent.identifier] = null; - } -} - -/** -@class InteractionData -@constructor -*/ -PIXI.InteractionData = function() -{ - /** - * This point stores the global coords of where the touch/mouse event happened - * @property global - * @type Point - */ - this.global = new PIXI.Point(); - - // this is here for legacy... but will remove - this.local = new PIXI.Point(); - - /** - * The target Sprite that was interacted with - * @property target - * @type Sprite - */ - this.target; -} - -/** - * This will return the local coords of the specified displayObject for this InteractionData - * @method getLocalPosition - * @param displayObject {DisplayObject} The DisplayObject that you would like the local coords off - * @return {Point} A point containing the coords of the InteractionData position relative to the DisplayObject - */ -PIXI.InteractionData.prototype.getLocalPosition = function(displayObject) -{ - var worldTransform = displayObject.worldTransform; - var global = this.global; - - // do a cheeky transform to get the mouse coords; - var a00 = worldTransform[0], a01 = worldTransform[1], a02 = worldTransform[2], - a10 = worldTransform[3], a11 = worldTransform[4], a12 = worldTransform[5], - id = 1 / (a00 * a11 + a01 * -a10); - // set the mouse coords... - return new PIXI.Point(a11 * id * global.x + -a01 * id * global.y + (a12 * a01 - a02 * a11) * id, - a00 * id * global.y + -a10 * id * global.x + (-a12 * a00 + a02 * a10) * id) -} - -// constructor -PIXI.InteractionData.constructor = PIXI.InteractionData; - - - -/** - * @author Mat Groves http://matgroves.com/ @Doormat23 - */ - -/** -A Stage represents the root of the display tree. Everything connected to the stage is rendered -@class Stage -@extends DisplayObjectContainer -@constructor -@param backgroundColor {Number} the background color of the stage -@param interactive {Boolean} enable / disable interaction (default is false) -*/ -PIXI.Stage = function(backgroundColor, interactive) -{ - - PIXI.DisplayObjectContainer.call( this ); - this.worldTransform = PIXI.mat3.create() - this.__childrenAdded = []; - this.__childrenRemoved = []; - this.childIndex = 0; - this.stage= this; - - this.stage.hitArea = new PIXI.Rectangle(0,0,100000, 100000); - - // interaction! - this.interactive = !!interactive; - this.interactionManager = new PIXI.InteractionManager(this); - - this.setBackgroundColor(backgroundColor); - this.worldVisible = true; -} - -// constructor -PIXI.Stage.constructor = PIXI.Stage; - -PIXI.Stage.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); - -/** -@method updateTransform -@internal -*/ -PIXI.Stage.prototype.updateTransform = function() -{ - this.worldAlpha = 1; - - for(var i=0,j=this.children.length; i> 16 & 0xFF) / 255, ( hex >> 8 & 0xFF) / 255, (hex & 0xFF)/ 255]; -} - -/** - * Provides bind in a cross browser way. - */ -if (typeof Function.prototype.bind != 'function') { - Function.prototype.bind = (function () { - var slice = Array.prototype.slice; - return function (thisArg) { - var target = this, boundArgs = slice.call(arguments, 1); - - if (typeof target != 'function') throw new TypeError(); - - function bound() { - var args = boundArgs.concat(slice.call(arguments)); - target.apply(this instanceof bound ? this : thisArg, args); - } - - bound.prototype = (function F(proto) { - proto && (F.prototype = proto); - if (!(this instanceof F)) return new F; - })(target.prototype); - - return bound; - }; - })(); -} - -var AjaxRequest = function() -{ - var activexmodes = ["Msxml2.XMLHTTP", "Microsoft.XMLHTTP"] //activeX versions to check for in IE - - if (window.ActiveXObject) - { //Test for support for ActiveXObject in IE first (as XMLHttpRequest in IE7 is broken) - for (var i=0; i 0) - { - for (var i=0; i < PIXI.Texture.frameUpdates.length; i++) - { - PIXI.Texture.frameUpdates[i].updateFrame = false; - }; - - PIXI.Texture.frameUpdates = []; - } -} - -/** - * @private - */ - -PIXI.WebGLRenderer.updateTextures = function() -{ - for (var i=0; i < PIXI.texturesToUpdate.length; i++) this.updateTexture(PIXI.texturesToUpdate[i]); - for (var i=0; i < PIXI.texturesToDestroy.length; i++) this.destroyTexture(PIXI.texturesToDestroy[i]); - PIXI.texturesToUpdate = []; - PIXI.texturesToDestroy = []; -} - -PIXI.WebGLRenderer.updateTexture = function(texture) -{ - var gl = PIXI.gl; - - if(!texture._glTexture) - { - texture._glTexture = gl.createTexture(); - } - - if(texture.hasLoaded) - { - gl.bindTexture(gl.TEXTURE_2D, texture._glTexture); - gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); - - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, texture.source); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); - - // reguler... - - if(!texture._powerOf2) - { - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - } - else - { - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT); - } - - gl.bindTexture(gl.TEXTURE_2D, null); - } - -} - -PIXI.WebGLRenderer.prototype.destroyTexture = function(texture) -{ - var gl = this.gl; - - if(texture._glTexture) - { - texture._glTexture = gl.createTexture(); - gl.deleteTexture(gl.TEXTURE_2D, texture._glTexture); - } -} - -/** - * resizes the webGL view to the specified width and height - * @method resize - * @param width {Number} the new width of the webGL view - * @param height {Number} the new height of the webGL view - */ -PIXI.WebGLRenderer.prototype.resize = function(width, height) -{ - this.width = width; - this.height = height; - - this.view.width = width; - this.view.height = height; - - this.gl.viewport(0, 0, this.width, this.height); - - var projectionMatrix = this.projectionMatrix; - - projectionMatrix[0] = 2/this.width; - projectionMatrix[5] = -2/this.height; - projectionMatrix[12] = -1; - projectionMatrix[13] = 1; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.handleContextLost = function(event) -{ - event.preventDefault(); - this.contextLost = true; -} - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.handleContextRestored = function(event) -{ - this.gl = this.view.getContext("experimental-webgl", { - alpha: true - }); - - this.initShaders(); - - for (var i=0; i < PIXI.TextureCache.length; i++) - { - this.updateTexture(PIXI.TextureCache[i]); - }; - - for (var i=0; i < this.batchs.length; i++) - { - this.batchs[i].restoreLostContext(this.gl)// - this.batchs[i].dirty = true; - }; - - PIXI._restoreBatchs(this.gl); - - this.contextLost = false; -} - - -/** - * @author Mat Groves http://matgroves.com/ @Doormat23 - */ - -PIXI._batchs = []; - -/** - * @private - */ -PIXI._getBatch = function(gl) -{ - if(PIXI._batchs.length == 0) - { - return new PIXI.WebGLBatch(gl); - } - else - { - return PIXI._batchs.pop(); - } -} - -/** - * @private - */ -PIXI._returnBatch = function(batch) -{ - batch.clean(); - PIXI._batchs.push(batch); -} - -/** - * @private - */ -PIXI._restoreBatchs = function(gl) -{ - for (var i=0; i < PIXI._batchs.length; i++) - { - PIXI._batchs[i].restoreLostContext(gl); - }; -} - -/** - * A WebGLBatch Enables a group of sprites to be drawn using the same settings. - * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. - * @class WebGLBatch - * @param an instance of the webGL context - * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} - */ -PIXI.WebGLBatch = function(gl) -{ - this.gl = gl; - - this.size = 0; - - this.vertexBuffer = gl.createBuffer(); - this.indexBuffer = gl.createBuffer(); - this.uvBuffer = gl.createBuffer(); - this.colorBuffer = gl.createBuffer(); - this.blendMode = PIXI.blendModes.NORMAL; - this.dynamicSize = 1; -} - - -// constructor -PIXI.WebGLBatch.constructor = PIXI.WebGLBatch; - -/** - * Cleans the batch so that is can be returned to an object pool and reused - */ -PIXI.WebGLBatch.prototype.clean = function() -{ - this.verticies = []; - this.uvs = []; - this.indices = []; - this.colors = []; - //this.sprites = []; - this.dynamicSize = 1; - this.texture = null; - this.last = null; - this.size = 0; - - this.head; - this.tail; -} - -/* - * recreates the buffers in the event of a context loss - */ -PIXI.WebGLBatch.prototype.restoreLostContext = function(gl) -{ - this.gl = gl; - this.vertexBuffer = gl.createBuffer(); - this.indexBuffer = gl.createBuffer(); - this.uvBuffer = gl.createBuffer(); - this.colorBuffer = gl.createBuffer(); -} - -/** - * inits the batch's texture and blend mode based if the supplied sprite - * @method init - * @param sprite {Sprite} the first sprite to be added to the batch. Only sprites with the same base texture and blend mode will be allowed to be added to this batch - */ -PIXI.WebGLBatch.prototype.init = function(sprite) -{ - sprite.batch = this; - this.dirty = true; - this.blendMode = sprite.blendMode; - this.texture = sprite.texture.baseTexture; -// this.sprites.push(sprite); - this.head = sprite; - this.tail = sprite; - this.size = 1; - - this.growBatch(); -} - -/** - * inserts a sprite before the specified sprite - * @method insertBefore - * @param sprite {Sprite} the sprite to be added - * @param nextSprite {nextSprite} the first sprite will be inserted before this sprite - */ -PIXI.WebGLBatch.prototype.insertBefore = function(sprite, nextSprite) -{ - this.size++; - - sprite.batch = this; - this.dirty = true; - var tempPrev = nextSprite.__prev; - nextSprite.__prev = sprite; - sprite.__next = nextSprite; - - if(tempPrev) - { - sprite.__prev = tempPrev; - tempPrev.__next = sprite; - } - else - { - this.head = sprite; - //this.head.__prev = null - } -} - -/** - * inserts a sprite after the specified sprite - * @method insertAfter - * @param sprite {Sprite} the sprite to be added - * @param previousSprite {Sprite} the first sprite will be inserted after this sprite - */ -PIXI.WebGLBatch.prototype.insertAfter = function(sprite, previousSprite) -{ - this.size++; - - - sprite.batch = this; - this.dirty = true; - - var tempNext = previousSprite.__next; - previousSprite.__next = sprite; - sprite.__prev = previousSprite; - - if(tempNext) - { - sprite.__next = tempNext; - tempNext.__prev = sprite; - } - else - { - this.tail = sprite - } - -} - -/** - * removes a sprite from the batch - * @method remove - * @param sprite {Sprite} the sprite to be removed - */ -PIXI.WebGLBatch.prototype.remove = function(sprite) -{ - this.size--; - - if(this.size == 0) - { - sprite.batch = null; - sprite.__prev = null; - sprite.__next = null; - return; - } - - if(sprite.__prev) - { - sprite.__prev.__next = sprite.__next; - } - else - { - this.head = sprite.__next; - this.head.__prev = null; - } - - if(sprite.__next) - { - sprite.__next.__prev = sprite.__prev; - } - else - { - this.tail = sprite.__prev; - this.tail.__next = null - } - - sprite.batch = null; - sprite.__next = null; - sprite.__prev = null; - this.dirty = true; -} - -/** - * Splits the batch into two with the specified sprite being the start of the new batch. - * @method split - * @param sprite {Sprite} the sprite that indicates where the batch should be split - * @return {WebGLBatch} the new batch - */ -PIXI.WebGLBatch.prototype.split = function(sprite) -{ - - //console.log("Splitting batch :" + this.size) -// console.log(sprite) -// console.log("-------") - this.dirty = true; - - //var val = (this.tail == this.head) - //console.log(val + " SAME?"); - var batch = new PIXI.WebGLBatch(this.gl)//PIXI._getBatch(this.gl); - batch.init(sprite); - batch.tail = this.tail; - //console.log("id is " +batcheee.id) - - this.tail = sprite.__prev; - this.tail.__next = null; - - sprite.__prev = null; - // return a splite batch! - //sprite.__prev.__next = null; - //sprite.__prev = null; - - - // TODO this size is wrong! - // need to recalculate :/ problem with a linked list! - // unless it gets calculated in the "clean"? - - // need to loop through items as there is no way to know the length on a linked list :/ - var tempSize = 0; - while(sprite) - { - tempSize++; - sprite.batch = batch; - sprite = sprite.__next; - } - - batch.size = tempSize; - this.size -= tempSize; - - return batch; -} - -/** - * Merges two batchs together - * @method merge - * @param batch {WebGLBatch} the batch that will be merged - */ -PIXI.WebGLBatch.prototype.merge = function(batch) -{ - this.dirty = true; - - this.tail.__next = batch.head; - batch.head.__prev = this.tail; - - this.size += batch.size; - - this.tail = batch.tail; - - var sprite = batch.head; - while(sprite) - { - sprite.batch = this; - sprite = sprite.__next; - } - -} - -/** - * Grows the size of the batch. As the elements in the batch cannot have a dynamic size this function is used to increase the size of the batch. It also creates a little extra room so that the batch does not need to be resized every time a sprite is added - * @methos growBatch - */ -PIXI.WebGLBatch.prototype.growBatch = function() -{ - var gl = this.gl; - if( this.size == 1) - { - this.dynamicSize = 1; - } - else - { - this.dynamicSize = this.size * 1.5 - } - // grow verts - this.verticies = new Float32Array(this.dynamicSize * 8); - - gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); - gl.bufferData(gl.ARRAY_BUFFER,this.verticies , gl.DYNAMIC_DRAW); - - this.uvs = new Float32Array( this.dynamicSize * 8 ) - gl.bindBuffer(gl.ARRAY_BUFFER, this.uvBuffer); - gl.bufferData(gl.ARRAY_BUFFER, this.uvs , gl.DYNAMIC_DRAW); - - this.dirtyUVS = true; - - this.colors = new Float32Array( this.dynamicSize * 4 ) - gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer); - gl.bufferData(gl.ARRAY_BUFFER, this.colors , gl.DYNAMIC_DRAW); - - this.dirtyColors = true; - - this.indices = new Uint16Array(this.dynamicSize * 6); - var length = this.indices.length/6; - - for (var i=0; i < length; i++) - { - var index2 = i * 6; - var index3 = i * 4; - this.indices[index2 + 0] = index3 + 0; - this.indices[index2 + 1] = index3 + 1; - this.indices[index2 + 2] = index3 + 2; - this.indices[index2 + 3] = index3 + 0; - this.indices[index2 + 4] = index3 + 2; - this.indices[index2 + 5] = index3 + 3; - }; - - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, this.indices, gl.STATIC_DRAW); - -} - -/** - * Refresh's all the data in the batch and sync's it with the webGL buffers - * @method refresh - */ -PIXI.WebGLBatch.prototype.refresh = function() -{ - var gl = this.gl; - - if (this.dynamicSize < this.size) - { - this.growBatch(); - } - - var indexRun = 0; - var worldTransform, width, height, aX, aY, w0, w1, h0, h1, index - var a, b, c, d, tx, ty - - var displayObject = this.head - - while(displayObject) - { - index = indexRun * 8; - - var texture = displayObject.texture; - - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; - - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; - - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; - - colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - - displayObject = displayObject.__next; - - indexRun ++; - } - - this.dirtyUVS = true; - this.dirtyColors = true; -} - -/** - * Updates all the relevant geometry and uploads the data to the GPU - * @method update - */ -PIXI.WebGLBatch.prototype.update = function() -{ - var gl = this.gl; - var worldTransform, width, height, aX, aY, w0, w1, h0, h1, index, index2, index3 - - var a, b, c, d, tx, ty; - - var indexRun = 0; - - var displayObject = this.head; - - while(displayObject) - { - if(displayObject.worldVisible) - { - width = displayObject.texture.frame.width; - height = displayObject.texture.frame.height; - - // TODO trim?? - aX = displayObject.anchor.x;// - displayObject.texture.trim.x - aY = displayObject.anchor.y; //- displayObject.texture.trim.y - w0 = width * (1-aX); - w1 = width * -aX; - - h0 = height * (1-aY); - h1 = height * -aY; - - index = indexRun * 8; - - worldTransform = displayObject.worldTransform; - - a = worldTransform[0]; - b = worldTransform[3]; - c = worldTransform[1]; - d = worldTransform[4]; - tx = worldTransform[2]; - ty = worldTransform[5]; - - - this.verticies[index + 0 ] = a * w1 + c * h1 + tx; - this.verticies[index + 1 ] = d * h1 + b * w1 + ty; - - this.verticies[index + 2 ] = a * w0 + c * h1 + tx; - this.verticies[index + 3 ] = d * h1 + b * w0 + ty; - - this.verticies[index + 4 ] = a * w0 + c * h0 + tx; - this.verticies[index + 5 ] = d * h0 + b * w0 + ty; - - this.verticies[index + 6] = a * w1 + c * h0 + tx; - this.verticies[index + 7] = d * h0 + b * w1 + ty; - - - if(displayObject.updateFrame || displayObject.texture.updateFrame) - { - this.dirtyUVS = true; - - var texture = displayObject.texture; - - var frame = texture.frame; - var tw = texture.baseTexture.width; - var th = texture.baseTexture.height; - - this.uvs[index + 0] = frame.x / tw; - this.uvs[index +1] = frame.y / th; - - this.uvs[index +2] = (frame.x + frame.width) / tw; - this.uvs[index +3] = frame.y / th; - - this.uvs[index +4] = (frame.x + frame.width) / tw; - this.uvs[index +5] = (frame.y + frame.height) / th; - - this.uvs[index +6] = frame.x / tw; - this.uvs[index +7] = (frame.y + frame.height) / th; - - displayObject.updateFrame = false; - } - - // TODO this probably could do with some optimisation.... - if(displayObject.cacheAlpha != displayObject.worldAlpha) - { - displayObject.cacheAlpha = displayObject.worldAlpha; - - var colorIndex = indexRun * 4; - this.colors[colorIndex] = this.colors[colorIndex + 1] = this.colors[colorIndex + 2] = this.colors[colorIndex + 3] = displayObject.worldAlpha; - this.dirtyColors = true; - } - } - else - { - index = indexRun * 8; - - this.verticies[index + 0 ] = 0; - this.verticies[index + 1 ] = 0; - - this.verticies[index + 2 ] = 0; - this.verticies[index + 3 ] = 0; - - this.verticies[index + 4 ] = 0; - this.verticies[index + 5 ] = 0; - - this.verticies[index + 6] = 0; - this.verticies[index + 7] = 0; - } - - indexRun++; - displayObject = displayObject.__next; - } -} - -/** - * Draws the batch to the frame buffer - * @method render - */ -PIXI.WebGLBatch.prototype.render = function(start, end) -{ -// console.log(start + " :: " + end + " : " + this.size); - start = start || 0; - //end = end || this.size; - if(end == undefined)end = this.size; - - if(this.dirty) - { - this.refresh(); - this.dirty = false; - } - - if (this.size == 0)return; - - this.update(); - var gl = this.gl; - - //TODO optimize this! - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - - var shaderProgram = PIXI.shaderProgram; - gl.useProgram(shaderProgram); - - // update the verts.. - gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer); - // ok.. - gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.verticies) - gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 0, 0); - - // update the uvs - gl.bindBuffer(gl.ARRAY_BUFFER, this.uvBuffer); - - if(this.dirtyUVS) - { - this.dirtyUVS = false; - gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.uvs); - } - - gl.vertexAttribPointer(shaderProgram.textureCoordAttribute, 2, gl.FLOAT, false, 0, 0); - - gl.activeTexture(gl.TEXTURE0); - gl.bindTexture(gl.TEXTURE_2D, this.texture._glTexture); - - // update color! - gl.bindBuffer(gl.ARRAY_BUFFER, this.colorBuffer); - - if(this.dirtyColors) - { - this.dirtyColors = false; - gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.colors); - } - - gl.vertexAttribPointer(shaderProgram.colorAttribute, 1, gl.FLOAT, false, 0, 0); - - // dont need to upload! - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer); - - - //var startIndex = 0//1; - var len = end - start; - // console.log(this.size) - // DRAW THAT this! - gl.drawElements(gl.TRIANGLES, len * 6, gl.UNSIGNED_SHORT, start * 2 * 6 ); -} - - -/** - * @author Mat Groves http://matgroves.com/ @Doormat23 - */ - - - - -/** - * A WebGLBatch Enables a group of sprites to be drawn using the same settings. - * if a group of sprites all have the same baseTexture and blendMode then they can be grouped into a batch. All the sprites in a batch can then be drawn in one go by the GPU which is hugely efficient. ALL sprites in the webGL renderer are added to a batch even if the batch only contains one sprite. Batching is handled automatically by the webGL renderer. A good tip is: the smaller the number of batchs there are, the faster the webGL renderer will run. - * @class WebGLBatch - * @param an instance of the webGL context - * @return {PIXI.renderers.WebGLBatch} WebGLBatch {@link PIXI.renderers.WebGLBatch} - */ -PIXI.WebGLRenderGroup = function(gl) -{ - this.gl = gl; - this.root; - - this.backgroundColor; - this.batchs = []; - this.toRemove = []; -} - - -// constructor -PIXI.WebGLRenderGroup.constructor = PIXI.WebGLRenderGroup; - -PIXI.WebGLRenderGroup.prototype.setRenderable = function(displayObject) -{ - // has this changed?? - if(this.root)this.removeDisplayObjectAndChildren(this.root); - - displayObject.worldVisible = displayObject.visible; - - // soooooo // - // to check if any batchs exist already?? - - // TODO what if its already has an object? should remove it - this.root = displayObject; - //displayObject.__renderGroup = this; - this.addDisplayObjectAndChildren(displayObject); - //displayObject -} - -PIXI.WebGLRenderGroup.prototype.render = function(projectionMatrix) -{ - - PIXI.WebGLRenderer.updateTextures(); - - var gl = this.gl; - - // set the flipped matrix.. - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); - - // TODO remove this by replacing visible with getter setters.. - this.checkVisibility(this.root, this.root.visible); - - // will render all the elements in the group - var renderable; - - - for (var i=0; i < this.batchs.length; i++) - { - renderable = this.batchs[i]; - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - } - -} - -PIXI.WebGLRenderGroup.prototype.renderSpecific = function(displayObject, projectionMatrix) -{ - PIXI.WebGLRenderer.updateTextures(); - - var gl = this.gl; - this.checkVisibility(displayObject, displayObject.visible); - gl.uniformMatrix4fv(PIXI.shaderProgram.mvMatrixUniform, false, projectionMatrix); - - - //console.log("SPECIFIC"); - // to do! - // render part of the scene... - - var startIndex; - var startBatchIndex; - - var endIndex; - var endBatchIndex; - - // get NEXT Renderable! - var nextRenderable = displayObject.renderable ? displayObject : this.getNextRenderable(displayObject); - var startBatch = nextRenderable.batch; - - if(nextRenderable instanceof PIXI.Sprite) - { - startBatch = nextRenderable.batch; - - var head = startBatch.head; - var next = head; - - // ok now we have the batch.. need to find the start index! - if(head == nextRenderable) - { - startIndex = 0; - } - else - { - startIndex = 1; - - while(head.__next != nextRenderable) - { - startIndex++; - head = head.__next; - } - } - } - else - { - startBatch = nextRenderable; - } - - // Get the LAST renderable object - var lastRenderable = displayObject; - var endBatch; - var lastItem = displayObject; - while(lastItem.children.length > 0) - { - lastItem = lastItem.children[lastItem.children.length-1]; - if(lastItem.renderable)lastRenderable = lastItem; - } - - if(lastRenderable instanceof PIXI.Sprite) - { - endBatch = lastRenderable.batch; - - var head = endBatch.head; - - if(head == lastRenderable) - { - endIndex = 0; - } - else - { - endIndex = 1; - - while(head.__next != lastRenderable) - { - endIndex++; - head = head.__next; - } - } - } - else - { - endBatch = lastRenderable; - } - - // TODO - need to fold this up a bit! - - - if(startBatch == endBatch) - { - if(startBatch instanceof PIXI.WebGLBatch) - { - startBatch.render(startIndex, endIndex+1); - } - else if(startBatch instanceof PIXI.TilingSprite) - { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - - return; - } - - // now we have first and last! - startBatchIndex = this.batchs.indexOf(startBatch); - endBatchIndex = this.batchs.indexOf(endBatch); - - // DO the first batch - if(startBatch instanceof PIXI.WebGLBatch) - { - startBatch.render(startIndex); - } - else if(startBatch instanceof PIXI.TilingSprite) - { - if(startBatch.visible)this.renderTilingSprite(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.Strip) - { - if(startBatch.visible)this.renderStrip(startBatch, projectionMatrix); - } - else if(startBatch instanceof PIXI.CustomRenderable) - { - if(startBatch.visible) startBatch.renderWebGL(this, projectionMatrix); - } - - // DO the middle batchs.. - for (var i=startBatchIndex+1; i < endBatchIndex; i++) - { - renderable = this.batchs[i]; - - if(renderable instanceof PIXI.WebGLBatch) - { - this.batchs[i].render(); - } - else if(renderable instanceof PIXI.TilingSprite) - { - if(renderable.visible)this.renderTilingSprite(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.Strip) - { - if(renderable.visible)this.renderStrip(renderable, projectionMatrix); - } - else if(renderable instanceof PIXI.CustomRenderable) - { - if(renderable.visible) renderable.renderWebGL(this, projectionMatrix); - } - - } - - // DO the last batch.. - if(endBatch instanceof PIXI.WebGLBatch) - { - endBatch.render(0, endIndex+1); - } - else if(endBatch instanceof PIXI.TilingSprite) - { - if(endBatch.visible)this.renderTilingSprite(endBatch); - } - else if(endBatch instanceof PIXI.Strip) - { - if(endBatch.visible)this.renderStrip(endBatch); - } - else if(endBatch instanceof PIXI.CustomRenderable) - { - if(endBatch.visible) endBatch.renderWebGL(this, projectionMatrix); - } -} - -PIXI.WebGLRenderGroup.prototype.checkVisibility = function(displayObject, globalVisible) -{ - // give the dp a refference to its renderGroup... - var children = displayObject.children; - //displayObject.worldVisible = globalVisible; - for (var i=0; i < children.length; i++) - { - var child = children[i]; - - // TODO optimize... shouldt need to loop through everything all the time - child.worldVisible = child.visible && globalVisible; - - // everything should have a batch! - // time to see whats new! - if(child.textureChange) - { - child.textureChange = false; - if(child.worldVisible) - { - this.removeDisplayObject(child) - this.addDisplayObject(child) - } - // update texture!! - } - - if(child.children.length > 0) - { - this.checkVisibility(child, child.worldVisible); - } - }; -} - -PIXI.WebGLRenderGroup.prototype.addDisplayObject = function(displayObject) -{ - // add a child to the render group.. - if(displayObject.__renderGroup)displayObject.__renderGroup.removeDisplayObjectAndChildren(displayObject); - - // DONT htink this is needed? - // displayObject.batch = null; - - displayObject.__renderGroup = this; - - //displayObject.cacheVisible = true; - if(!displayObject.renderable)return; - - // while looping below THE OBJECT MAY NOT HAVE BEEN ADDED - //displayObject.__inWebGL = true; - - var previousSprite = this.getPreviousRenderable(displayObject); - var nextSprite = this.getNextRenderable(displayObject); - - - /* - * so now we have the next renderable and the previous renderable - * - */ - - if(displayObject instanceof PIXI.Sprite) - { - var previousBatch - var nextBatch - - //console.log( previousSprite) - if(previousSprite instanceof PIXI.Sprite) - { - previousBatch = previousSprite.batch; - if(previousBatch) - { - if(previousBatch.texture == displayObject.texture.baseTexture && previousBatch.blendMode == displayObject.blendMode) - { - previousBatch.insertAfter(displayObject, previousSprite); - return; - } - } - } - else - { - // TODO reword! - previousBatch = previousSprite; - } - - if(nextSprite) - { - if(nextSprite instanceof PIXI.Sprite) - { - nextBatch = nextSprite.batch; - - //batch may not exist if item was added to the display list but not to the webGL - if(nextBatch) - { - if(nextBatch.texture == displayObject.texture.baseTexture && nextBatch.blendMode == displayObject.blendMode) - { - nextBatch.insertBefore(displayObject, nextSprite); - return; - } - else - { - if(nextBatch == previousBatch) - { - // THERE IS A SPLIT IN THIS BATCH! // - var splitBatch = previousBatch.split(nextSprite); - // COOL! - // add it back into the array - /* - * OOPS! - * seems the new sprite is in the middle of a batch - * lets split it.. - */ - var batch = PIXI.WebGLRenderer.getBatch(); - - var index = this.batchs.indexOf( previousBatch ); - batch.init(displayObject); - this.batchs.splice(index+1, 0, batch, splitBatch); - - return; - } - } - } - } - else - { - // TODO re-word! - nextBatch = nextSprite; - } - } - - /* - * looks like it does not belong to any batch! - * but is also not intersecting one.. - * time to create anew one! - */ - - var batch = PIXI.WebGLRenderer.getBatch(); - batch.init(displayObject); - - if(previousBatch) // if this is invalid it means - { - var index = this.batchs.indexOf( previousBatch ); - this.batchs.splice(index+1, 0, batch); - } - else - { - this.batchs.push(batch); - } - - } - else if(displayObject instanceof PIXI.TilingSprite) - { - // add to a batch!! - this.initTilingSprite(displayObject); - this.batchs.push(displayObject); - - } - else if(displayObject instanceof PIXI.Strip) - { - // add to a batch!! - this.initStrip(displayObject); - this.batchs.push(displayObject); - } - - // if its somthing else... then custom codes! - this.batchUpdate = true; -} - -PIXI.WebGLRenderGroup.prototype.addDisplayObjectAndChildren = function(displayObject) -{ - // TODO - this can be faster - but not as important right now - - this.addDisplayObject(displayObject); - var children = displayObject.children; - - for (var i=0; i < children.length; i++) - { - this.addDisplayObjectAndChildren(children[i]); - }; -} - -PIXI.WebGLRenderGroup.prototype.removeDisplayObject = function(displayObject) -{ - // loop through children.. - // display object // - - // add a child from the render group.. - // remove it and all its children! - //displayObject.cacheVisible = false;//displayObject.visible; - displayObject.__renderGroup = null; - - if(!displayObject.renderable)return; - - /* - * removing is a lot quicker.. - * - */ - var batchToRemove; - - if(displayObject instanceof PIXI.Sprite) - { - // should always have a batch! - var batch = displayObject.batch; - if(!batch)return; // this means the display list has been altered befre rendering - - batch.remove(displayObject); - - if(batch.size==0) - { - batchToRemove = batch; - } - } - else - { - batchToRemove = displayObject; - } - - /* - * Looks like there is somthing that needs removing! - */ - if(batchToRemove) - { - var index = this.batchs.indexOf( batchToRemove ); - if(index == -1)return;// this means it was added then removed before rendered - - // ok so.. check to see if you adjacent batchs should be joined. - // TODO may optimise? - if(index == 0 || index == this.batchs.length-1) - { - // wha - eva! just get of the empty batch! - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); - - return; - } - - if(this.batchs[index-1] instanceof PIXI.WebGLBatch && this.batchs[index+1] instanceof PIXI.WebGLBatch) - { - if(this.batchs[index-1].texture == this.batchs[index+1].texture && this.batchs[index-1].blendMode == this.batchs[index+1].blendMode) - { - //console.log("MERGE") - this.batchs[index-1].merge(this.batchs[index+1]); - - if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); - PIXI.WebGLRenderer.returnBatch(this.batchs[index+1]); - this.batchs.splice(index, 2); - return; - } - } - - - this.batchs.splice(index, 1); - if(batchToRemove instanceof PIXI.WebGLBatch)PIXI.WebGLRenderer.returnBatch(batchToRemove); - } -} - -PIXI.WebGLRenderGroup.prototype.removeDisplayObjectAndChildren = function(displayObject) -{ - // TODO - this can be faster - but not as important right now - if(displayObject.__renderGroup != this)return; - - this.removeDisplayObject(displayObject); - var children = displayObject.children; - - for (var i=0; i < children.length; i++) - { - this.removeDisplayObjectAndChildren(children[i]); - }; -} - -/** - * @private - */ - -PIXI.WebGLRenderGroup.prototype.getNextRenderable = function(displayObject) -{ - /* - * LOOK FOR THE NEXT SPRITE - * This part looks for the closest next sprite that can go into a batch - * it keeps looking until it finds a sprite or gets to the end of the display - * scene graph - * - * These look a lot scarier than the actually are... - */ - - var nextSprite = displayObject; - do - { - // moving forward! - // if it has no children.. - if(nextSprite.children.length == 0) - { - //maynot have a parent - if(!nextSprite.parent)return null; - - // go along to the parent.. - while(nextSprite.childIndex == nextSprite.parent.children.length-1) - { - nextSprite = nextSprite.parent; - //console.log(">" + nextSprite); -// console.log(">-" + this.root); - if(nextSprite == this.root || !nextSprite.parent)//displayObject.stage) - { - nextSprite = null - break; - } - } - - if(nextSprite)nextSprite = nextSprite.parent.children[nextSprite.childIndex+1]; - } - else - { - nextSprite = nextSprite.children[0]; - } - - if(!nextSprite)break; - } - while(!nextSprite.renderable || !nextSprite.__renderGroup) - - return nextSprite; -} - -PIXI.WebGLRenderGroup.prototype.getPreviousRenderable = function(displayObject) -{ - /* - * LOOK FOR THE PREVIOUS SPRITE - * This part looks for the closest previous sprite that can go into a batch - * It keeps going back until it finds a sprite or the stage - */ - var previousSprite = displayObject; - do - { - if(previousSprite.childIndex == 0) - { - previousSprite = previousSprite.parent; - if(!previousSprite)return null; - } - else - { - - previousSprite = previousSprite.parent.children[previousSprite.childIndex-1]; - // what if the bloop has children??? - while(previousSprite.children.length != 0) - { - // keep diggin till we get to the last child - previousSprite = previousSprite.children[previousSprite.children.length-1]; - } - } - - if(previousSprite == this.root)break; - } - while(!previousSprite.renderable || !previousSprite.__renderGroup); - - return previousSprite; -} - -/** - * @private - */ -PIXI.WebGLRenderGroup.prototype.initTilingSprite = function(sprite) -{ - var gl = this.gl; - - // make the texture tilable.. - - sprite.verticies = new Float32Array([0, 0, - sprite.width, 0, - sprite.width, sprite.height, - 0, sprite.height]); - - sprite.uvs = new Float32Array([0, 0, - 1, 0, - 1, 1, - 0, 1]); - - sprite.colors = new Float32Array([1,1,1,1]); - - sprite.indices = new Uint16Array([0, 1, 3,2])//, 2]); - - - sprite._vertexBuffer = gl.createBuffer(); - sprite._indexBuffer = gl.createBuffer(); - sprite._uvBuffer = gl.createBuffer(); - sprite._colorBuffer = gl.createBuffer(); - - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._vertexBuffer); - gl.bufferData(gl.ARRAY_BUFFER, sprite.verticies, gl.STATIC_DRAW); - - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); - gl.bufferData(gl.ARRAY_BUFFER, sprite.uvs, gl.DYNAMIC_DRAW); - - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._colorBuffer); - gl.bufferData(gl.ARRAY_BUFFER, sprite.colors, gl.STATIC_DRAW); - - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, sprite._indexBuffer); - gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, sprite.indices, gl.STATIC_DRAW); - -// return ( (x > 0) && ((x & (x - 1)) == 0) ); - - if(sprite.texture.baseTexture._glTexture) - { - gl.bindTexture(gl.TEXTURE_2D, sprite.texture.baseTexture._glTexture); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT); - sprite.texture.baseTexture._powerOf2 = true; - } - else - { - sprite.texture.baseTexture._powerOf2 = true; - } -} - -/** - * @private - */ -PIXI.WebGLRenderGroup.prototype.renderStrip = function(strip, projectionMatrix) -{ - var gl = this.gl; - var shaderProgram = PIXI.shaderProgram; -// mat - var mat4Real = PIXI.mat3.toMat4(strip.worldTransform); - PIXI.mat4.transpose(mat4Real); - PIXI.mat4.multiply(projectionMatrix, mat4Real, mat4Real ) - - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mat4Real); - - if(strip.blendMode == PIXI.blendModes.NORMAL) - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA); - } - else - { - gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_COLOR); - } - - if(!strip.dirty) - { - - gl.bindBuffer(gl.ARRAY_BUFFER, strip._vertexBuffer); - gl.bufferSubData(gl.ARRAY_BUFFER, 0, strip.verticies) - gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 0, 0); - - // update the uvs - gl.bindBuffer(gl.ARRAY_BUFFER, strip._uvBuffer); - gl.vertexAttribPointer(shaderProgram.textureCoordAttribute, 2, gl.FLOAT, false, 0, 0); - - gl.activeTexture(gl.TEXTURE0); - gl.bindTexture(gl.TEXTURE_2D, strip.texture.baseTexture._glTexture); - - gl.bindBuffer(gl.ARRAY_BUFFER, strip._colorBuffer); - gl.vertexAttribPointer(shaderProgram.colorAttribute, 1, gl.FLOAT, false, 0, 0); - - // dont need to upload! - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - - - } - else - { - strip.dirty = false; - gl.bindBuffer(gl.ARRAY_BUFFER, strip._vertexBuffer); - gl.bufferData(gl.ARRAY_BUFFER, strip.verticies, gl.STATIC_DRAW) - gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 0, 0); - - // update the uvs - gl.bindBuffer(gl.ARRAY_BUFFER, strip._uvBuffer); - gl.bufferData(gl.ARRAY_BUFFER, strip.uvs, gl.STATIC_DRAW) - gl.vertexAttribPointer(shaderProgram.textureCoordAttribute, 2, gl.FLOAT, false, 0, 0); - - gl.activeTexture(gl.TEXTURE0); - gl.bindTexture(gl.TEXTURE_2D, strip.texture.baseTexture._glTexture); - - gl.bindBuffer(gl.ARRAY_BUFFER, strip._colorBuffer); - gl.bufferData(gl.ARRAY_BUFFER, strip.colors, gl.STATIC_DRAW) - gl.vertexAttribPointer(shaderProgram.colorAttribute, 1, gl.FLOAT, false, 0, 0); - - // dont need to upload! - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); - - } - //console.log(gl.TRIANGLE_STRIP) - gl.drawElements(gl.TRIANGLE_STRIP, strip.indices.length, gl.UNSIGNED_SHORT, 0); - - gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, projectionMatrix); - -} - - -/** - * @private - */ -PIXI.WebGLRenderGroup.prototype.renderTilingSprite = function(sprite, projectionMatrix) -{ - var gl = this.gl; - var shaderProgram = PIXI.shaderProgram; - - var tilePosition = sprite.tilePosition; - var tileScale = sprite.tileScale; - - var offsetX = tilePosition.x/sprite.texture.baseTexture.width; - var offsetY = tilePosition.y/sprite.texture.baseTexture.height; - - var scaleX = (sprite.width / sprite.texture.baseTexture.width) / tileScale.x; - var scaleY = (sprite.height / sprite.texture.baseTexture.height) / tileScale.y; - - sprite.uvs[0] = 0 - offsetX; - sprite.uvs[1] = 0 - offsetY; - - sprite.uvs[2] = (1 * scaleX) -offsetX; - sprite.uvs[3] = 0 - offsetY; - - sprite.uvs[4] = (1 *scaleX) - offsetX; - sprite.uvs[5] = (1 *scaleY) - offsetY; - - sprite.uvs[6] = 0 - offsetX; - sprite.uvs[7] = (1 *scaleY) - offsetY; - - gl.bindBuffer(gl.ARRAY_BUFFER, sprite._uvBuffer); - gl.bufferSubData(gl.ARRAY_BUFFER, 0, sprite.uvs) - - this.renderStrip(sprite, projectionMatrix); -} - - - -/** - * @private - */ -PIXI.WebGLRenderer.prototype.initStrip = function(strip) -{ - // build the strip! - var gl = this.gl; - var shaderProgram = this.shaderProgram; - - strip._vertexBuffer = gl.createBuffer(); - strip._indexBuffer = gl.createBuffer(); - strip._uvBuffer = gl.createBuffer(); - strip._colorBuffer = gl.createBuffer(); - - gl.bindBuffer(gl.ARRAY_BUFFER, strip._vertexBuffer); - gl.bufferData(gl.ARRAY_BUFFER, strip.verticies, gl.DYNAMIC_DRAW); - - gl.bindBuffer(gl.ARRAY_BUFFER, strip._uvBuffer); - gl.bufferData(gl.ARRAY_BUFFER, strip.uvs, gl.STATIC_DRAW); - - gl.bindBuffer(gl.ARRAY_BUFFER, strip._colorBuffer); - gl.bufferData(gl.ARRAY_BUFFER, strip.colors, gl.STATIC_DRAW); - - - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, strip._indexBuffer); - gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, strip.indices, gl.STATIC_DRAW); -} - - -/** - * @author Mat Groves http://matgroves.com/ @Doormat23 - */ - - -/** - * the CanvasRenderer draws the stage and all its content onto a 2d canvas. This renderer should be used for browsers that do not support webGL. - * Dont forget to add the view to your DOM or you will not see anything :) - * @class CanvasRenderer - * @constructor - * @param width {Number} the width of the canvas view - * @default 0 - * @param height {Number} the height of the canvas view - * @default 0 - * @param view {Canvas} the canvas to use as a view, optional - * @param transparent {Boolean} the transparency of the render view, default false - * @default false - * - */ -PIXI.CanvasRenderer = function(width, height, view, transparent) -{ - this.transparent = transparent; - - /** - * The width of the canvas view - * @property width - * @type Number - * @default 800 - */ - this.width = width || 800; - /** - * The height of the canvas view - * @property height - * @type Number - * @default 600 - */ - this.height = height || 600; - - this.refresh = true; - - /** - * The canvas element that the everything is drawn to - * @property view - * @type Canvas - */ - this.view = view || document.createElement( 'canvas' ); - - // hack to enable some hardware acceleration! - //this.view.style["transform"] = "translatez(0)"; - - this.view.width = this.width; - this.view.height = this.height; - this.count = 0; - - /** - * The canvas context that the everything is drawn to - * @property context - * @type Canvas 2d Context - */ - this.context = this.view.getContext("2d"); -} - -// constructor -PIXI.CanvasRenderer.constructor = PIXI.CanvasRenderer; - -/** - * Renders the stage to its canvas view - * @method render - * @param stage {Stage} the Stage element to be rendered - */ -PIXI.CanvasRenderer.prototype.render = function(stage) -{ - // update children if need be - - //stage.__childrenAdded = []; - //stage.__childrenRemoved = []; - - // update textures if need be - PIXI.texturesToUpdate = []; - PIXI.texturesToDestroy = []; - - stage.updateTransform(); - - // update the background color - if(this.view.style.backgroundColor!=stage.backgroundColorString && !this.transparent)this.view.style.backgroundColor = stage.backgroundColorString; - - this.context.setTransform(1,0,0,1,0,0); - this.context.clearRect(0, 0, this.width, this.height) - this.renderDisplayObject(stage); - //as - - // run interaction! - if(stage.interactive) - { - //need to add some events! - if(!stage._interactiveEventsAdded) - { - stage._interactiveEventsAdded = true; - stage.interactionManager.setTarget(this); - } - } - - // remove frame updates.. - if(PIXI.Texture.frameUpdates.length > 0) - { - PIXI.Texture.frameUpdates = []; - } -} - -/** - * resizes the canvas view to the specified width and height - * @param the new width of the canvas view - * @param the new height of the canvas view - */ -PIXI.CanvasRenderer.prototype.resize = function(width, height) -{ - this.width = width; - this.height = height; - - this.view.width = width; - this.view.height = height; -} - -/** - * @private - */ - -PIXI.CanvasRenderer.prototype.renderDisplayObject = function(displayObject) -{ - var transform = displayObject.worldTransform; - var context = this.context; - //context.globalCompositeOperation = "source-over" - var blit = false; - - if(!displayObject.visible)return; - - if(displayObject instanceof PIXI.Sprite) - { - var frame = displayObject.texture.frame; - - if(frame) - { - context.globalAlpha = displayObject.worldAlpha; - - // BLITZ!!! - /* - * if the rotation is 0 then we can blitz it - * meaning we dont need to do a transform and also we - * can round to the nearest round number for a little extra speed! - */ - /*if(displayObject.rotation == 0) - { - if(!blit)this.context.setTransform(1,0,0,1,0,0); - blit = true; - context.drawImage(displayObject.texture.baseTexture.image, - frame.x, - frame.y, - frame.width, - frame.height, - (transform[2]+ ((displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width) * transform[0]), - (transform[5]+ ((displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height)* transform[4]), - (displayObject.width * transform[0]), - (displayObject.height * transform[4])); - - } - else - {*/ - // blit = false; - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]); - - context.drawImage(displayObject.texture.baseTexture.source, - frame.x, - frame.y, - frame.width, - frame.height, - (displayObject.anchor.x) * -frame.width, - (displayObject.anchor.y) * -frame.height, - // (displayObject.anchor.x - displayObject.texture.trim.x) * -frame.width, - // (displayObject.anchor.y - displayObject.texture.trim.y) * -frame.height, - - frame.width, - frame.height); - //} - } - } - else if(displayObject instanceof PIXI.Strip) - { - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) - this.renderStrip(displayObject); - } - else if(displayObject instanceof PIXI.TilingSprite) - { - context.setTransform(transform[0], transform[3], transform[1], transform[4], transform[2], transform[5]) - this.renderTilingSprite(displayObject); - } - else if(displayObject instanceof PIXI.CustomRenderable) - { - displayObject.renderCanvas(this); - } - - // render! - for (var i=0; i < displayObject.children.length; i++) - { - this.renderDisplayObject(displayObject.children[i]); - } - - this.context.setTransform(1,0,0,1,0,0); -} - -/** - * @private - */ -PIXI.CanvasRenderer.prototype.renderStripFlat = function(strip) -{ - var context = this.context; - var verticies = strip.verticies; - var uvs = strip.uvs; - - var length = verticies.length/2; - this.count++; - - context.beginPath(); - for (var i=1; i < length-2; i++) - { - - // draw some triangles! - var index = i*2; - - var x0 = verticies[index], x1 = verticies[index+2], x2 = verticies[index+4]; - var y0 = verticies[index+1], y1 = verticies[index+3], y2 = verticies[index+5]; - - context.moveTo(x0, y0); - context.lineTo(x1, y1); - context.lineTo(x2, y2); - - }; - -// context.globalCompositeOperation = 'lighter'; - context.fillStyle = "#FF0000"; - context.fill(); - context.closePath(); - //context.globalCompositeOperation = 'source-over'; -} - -/** - * @private - */ -PIXI.CanvasRenderer.prototype.renderTilingSprite = function(sprite) -{ - var context = this.context; - - if(!sprite.__tilePattern) sprite.__tilePattern = context.createPattern(sprite.texture.baseTexture.source, "repeat"); - - context.beginPath(); - - var tilePosition = sprite.tilePosition; - var tileScale = sprite.tileScale; - - // offset - context.scale(tileScale.x,tileScale.y); - context.translate(tilePosition.x, tilePosition.y); - - context.fillStyle = sprite.__tilePattern; - context.fillRect(-tilePosition.x,-tilePosition.y,sprite.width / tileScale.x, sprite.height / tileScale.y); - - context.scale(1/tileScale.x, 1/tileScale.y); - context.translate(-tilePosition.x, -tilePosition.y); - - context.closePath(); -} - - - -/** - * @private - */ -PIXI.CanvasRenderer.prototype.renderStrip = function(strip) -{ - var context = this.context; - //context.globalCompositeOperation = 'lighter'; - // draw triangles!! - var verticies = strip.verticies; - var uvs = strip.uvs; - - var length = verticies.length/2; - this.count++; - for (var i=1; i < length-2; i++) - { - - // draw some triangles! - var index = i*2; - - var x0 = verticies[index], x1 = verticies[index+2], x2 = verticies[index+4]; - var y0 = verticies[index+1], y1 = verticies[index+3], y2 = verticies[index+5]; - - var u0 = uvs[index] * strip.texture.width, u1 = uvs[index+2] * strip.texture.width, u2 = uvs[index+4]* strip.texture.width; - var v0 = uvs[index+1]* strip.texture.height, v1 = uvs[index+3] * strip.texture.height, v2 = uvs[index+5]* strip.texture.height; - - - context.save(); - context.beginPath(); - context.moveTo(x0, y0); - context.lineTo(x1, y1); - context.lineTo(x2, y2); - context.closePath(); - - // context.fillStyle = "white"//rgb(1, 1, 1,1)); - // context.fill(); - context.clip(); - - - // Compute matrix transform - var delta = u0*v1 + v0*u2 + u1*v2 - v1*u2 - v0*u1 - u0*v2; - var delta_a = x0*v1 + v0*x2 + x1*v2 - v1*x2 - v0*x1 - x0*v2; - var delta_b = u0*x1 + x0*u2 + u1*x2 - x1*u2 - x0*u1 - u0*x2; - var delta_c = u0*v1*x2 + v0*x1*u2 + x0*u1*v2 - x0*v1*u2 - v0*u1*x2 - u0*x1*v2; - var delta_d = y0*v1 + v0*y2 + y1*v2 - v1*y2 - v0*y1 - y0*v2; - var delta_e = u0*y1 + y0*u2 + u1*y2 - y1*u2 - y0*u1 - u0*y2; - var delta_f = u0*v1*y2 + v0*y1*u2 + y0*u1*v2 - y0*v1*u2 - v0*u1*y2 - u0*y1*v2; - - - - - context.transform(delta_a/delta, delta_d/delta, - delta_b/delta, delta_e/delta, - delta_c/delta, delta_f/delta); - - context.drawImage(strip.texture.baseTexture.source, 0, 0); - context.restore(); - }; - -// context.globalCompositeOperation = 'source-over'; -} - - - - - - - - - -/** - * @author Mat Groves http://matgroves.com/ - */ - -PIXI.Strip = function(texture, width, height) -{ - PIXI.DisplayObjectContainer.call( this ); - this.texture = texture; - this.blendMode = PIXI.blendModes.NORMAL; - - try - { - this.uvs = new Float32Array([0, 1, - 1, 1, - 1, 0, 0,1]); - - this.verticies = new Float32Array([0, 0, - 0,0, - 0,0, 0, - 0, 0]); - - this.colors = new Float32Array([1, 1, 1, 1]); - - this.indices = new Uint16Array([0, 1, 2, 3]); - } - catch(error) - { - this.uvs = [0, 1, - 1, 1, - 1, 0, 0,1]; - - this.verticies = [0, 0, - 0,0, - 0,0, 0, - 0, 0]; - - this.colors = [1, 1, 1, 1]; - - this.indices = [0, 1, 2, 3]; - } - - - /* - this.uvs = new Float32Array() - this.verticies = new Float32Array() - this.colors = new Float32Array() - this.indices = new Uint16Array() -*/ - this.width = width; - this.height = height; - - // load the texture! - if(texture.baseTexture.hasLoaded) - { - this.width = this.texture.frame.width; - this.height = this.texture.frame.height; - this.updateFrame = true; - } - else - { - this.onTextureUpdateBind = this.onTextureUpdate.bind(this); - this.texture.addEventListener( 'update', this.onTextureUpdateBind ); - } - - this.renderable = true; -} - -// constructor -PIXI.Strip.constructor = PIXI.Strip; -PIXI.Strip.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); - -PIXI.Strip.prototype.setTexture = function(texture) -{ - //TODO SET THE TEXTURES - //TODO VISIBILITY - - // stop current texture - this.texture = texture; - this.width = texture.frame.width; - this.height = texture.frame.height; - this.updateFrame = true; -} - -PIXI.Strip.prototype.onTextureUpdate = function(event) -{ - this.updateFrame = true; -} -// some helper functions.. - - -/** - * @author Mat Groves http://matgroves.com/ - */ - - -PIXI.Rope = function(texture, points) -{ - PIXI.Strip.call( this, texture ); - this.points = points; - - try - { - this.verticies = new Float32Array( points.length * 4); - this.uvs = new Float32Array( points.length * 4); - this.colors = new Float32Array( points.length * 2); - this.indices = new Uint16Array( points.length * 2); - } - catch(error) - { - this.verticies = verticies - - this.uvs = uvs - this.colors = colors - this.indices = indices - } - - this.refresh(); -} - - -// constructor -PIXI.Rope.constructor = PIXI.Rope; -PIXI.Rope.prototype = Object.create( PIXI.Strip.prototype ); - -PIXI.Rope.prototype.refresh = function() -{ - var points = this.points; - if(points.length < 1)return; - - var uvs = this.uvs - var indices = this.indices; - var colors = this.colors; - - var lastPoint = points[0]; - var nextPoint; - var perp = {x:0, y:0}; - var point = points[0]; - - this.count-=0.2; - - - uvs[0] = 0 - uvs[1] = 1 - uvs[2] = 0 - uvs[3] = 1 - - colors[0] = 1; - colors[1] = 1; - - indices[0] = 0; - indices[1] = 1; - - var total = points.length; - - for (var i = 1; i < total; i++) - { - - var point = points[i]; - var index = i * 4; - // time to do some smart drawing! - var amount = i/(total-1) - - if(i%2) - { - uvs[index] = amount; - uvs[index+1] = 0; - - uvs[index+2] = amount - uvs[index+3] = 1 - - } - else - { - uvs[index] = amount - uvs[index+1] = 0 - - uvs[index+2] = amount - uvs[index+3] = 1 - } - - index = i * 2; - colors[index] = 1; - colors[index+1] = 1; - - index = i * 2; - indices[index] = index; - indices[index + 1] = index + 1; - - lastPoint = point; - } -} - -PIXI.Rope.prototype.updateTransform = function() -{ - - var points = this.points; - if(points.length < 1)return; - - var verticies = this.verticies - - var lastPoint = points[0]; - var nextPoint; - var perp = {x:0, y:0}; - var point = points[0]; - - this.count-=0.2; - - verticies[0] = point.x + perp.x - verticies[1] = point.y + perp.y //+ 200 - verticies[2] = point.x - perp.x - verticies[3] = point.y - perp.y//+200 - // time to do some smart drawing! - - var total = points.length; - - for (var i = 1; i < total; i++) - { - - var point = points[i]; - var index = i * 4; - - if(i < points.length-1) - { - nextPoint = points[i+1]; - } - else - { - nextPoint = point - } - - perp.y = -(nextPoint.x - lastPoint.x); - perp.x = nextPoint.y - lastPoint.y; - - var ratio = (1 - (i / (total-1))) * 10; - if(ratio > 1)ratio = 1; - - var perpLength = Math.sqrt(perp.x * perp.x + perp.y * perp.y); - var num = this.texture.height/2//(20 + Math.abs(Math.sin((i + this.count) * 0.3) * 50) )* ratio; - perp.x /= perpLength; - perp.y /= perpLength; - - perp.x *= num; - perp.y *= num; - - verticies[index] = point.x + perp.x - verticies[index+1] = point.y + perp.y - verticies[index+2] = point.x - perp.x - verticies[index+3] = point.y - perp.y - - lastPoint = point; - } - - PIXI.DisplayObjectContainer.prototype.updateTransform.call( this ); -} - -PIXI.Rope.prototype.setTexture = function(texture) -{ - // stop current texture - this.texture = texture; - this.updateFrame = true; -} - - - - - -/** - * @author Mat Groves http://matgroves.com/ - */ - -/** - * A tiling sprite is a fast way of rendering a tiling image - * @class TilingSprite - * @extends DisplayObjectContainer - * @constructor - * @param texture {Texture} the texture of the tiling sprite - * @param width {Number} the width of the tiling sprite - * @param height {Number} the height of the tiling sprite - */ -PIXI.TilingSprite = function(texture, width, height) -{ - PIXI.DisplayObjectContainer.call( this ); - - this.texture = texture; - this.width = width; - this.height = height; - this.renderable = true; - - /** - * The scaling of the image that is being tiled - * @property tileScale - * @type Point - */ - this.tileScale = new PIXI.Point(1,1); - /** - * The offset position of the image that is being tiled - * @property tilePosition - * @type Point - */ - this.tilePosition = new PIXI.Point(0,0); - - this.blendMode = PIXI.blendModes.NORMAL -} - -// constructor -PIXI.TilingSprite.constructor = PIXI.TilingSprite; -PIXI.TilingSprite.prototype = Object.create( PIXI.DisplayObjectContainer.prototype ); - -PIXI.TilingSprite.prototype.setTexture = function(texture) -{ - //TODO SET THE TEXTURES - //TODO VISIBILITY - - // stop current texture - this.texture = texture; - this.updateFrame = true; -} - -PIXI.TilingSprite.prototype.onTextureUpdate = function(event) -{ - this.updateFrame = true; -} - - -/** - * @author Mat Groves http://matgroves.com/ @Doormat23 - */ - - -/** - * Need to finalize this a bit more but works! Its in but will be working on this feature properly next..:) - * @class CustomRenderable - * @extends DisplayObject - * @constructor - */ -PIXI.CustomRenderable = function() -{ - PIXI.DisplayObject.call( this ); - -} - -// constructor -PIXI.CustomRenderable.constructor = PIXI.CustomRenderable; -PIXI.CustomRenderable.prototype = Object.create( PIXI.DisplayObject.prototype ); - -PIXI.CustomRenderable.prototype.renderCanvas = function(renderer) -{ - // override! -} - - -PIXI.CustomRenderable.prototype.initWebGL = function(renderer) -{ - // override! -} - - -PIXI.CustomRenderable.prototype.renderWebGL = function(renderGroup, projectionMatrix) -{ - // not sure if both needed? but ya have for now! - // override! -} - - -/** - * @author Mat Groves http://matgroves.com/ @Doormat23 - */ - -PIXI.BaseTextureCache = {}; -PIXI.texturesToUpdate = []; -PIXI.texturesToDestroy = []; - -/** - * A texture stores the information that represents an image. All textures have a base texture - * @class BaseTexture - * @extends EventTarget - * @constructor - * @param source {String} the source object (image or canvas) - */ -PIXI.BaseTexture = function(source) -{ - PIXI.EventTarget.call( this ); - - /* - * The url of the texture - * @property imageUrl - * @type String - */ - //this.imageUrl = source.src; - - /** - * [read only] The width of the base texture set when the image has loaded - * @property width - * @type Number - */ - this.width = 100; - /** - * [read only] The height of the base texture set when the image has loaded - * @property height - * @type Number - */ - this.height = 100; - - /** - * The source that is loaded to create the texture - * @property source - * @type Image - */ - this.source = source//new Image(); - - if(!source)return; - - if(this.source instanceof Image) - { - if(this.source.complete) - { - this.hasLoaded = true; - this.width = this.source.width; - this.height = this.source.height; - - PIXI.texturesToUpdate.push(this); - } - else - { - - var scope = this; - this.source.onload = function(){ - - scope.hasLoaded = true; - scope.width = scope.source.width; - scope.height = scope.source.height; - - // add it to somewhere... - PIXI.texturesToUpdate.push(scope); - scope.dispatchEvent( { type: 'loaded', content: scope } ); - } - // this.image.src = imageUrl; - } - } - else - { - this.hasLoaded = true; - this.width = this.source.width; - this.height = this.source.height; - - PIXI.texturesToUpdate.push(this); - } - - this._powerOf2 = false; - -} - -PIXI.BaseTexture.constructor = PIXI.BaseTexture; - -PIXI.BaseTexture.prototype.destroy = function() -{ - - if(this.source instanceof Image) - { - this.source.src = null; - } - this.source = null; - PIXI.texturesToDestroy.push(this); -} - - -/** - * - * Helper function that returns a base texture based on an image url - * If the image is not in the base texture cache it will be created and loaded - * @static - * @method fromImage - * @param imageUrl {String} The image url of the texture - * @return BaseTexture - */ -PIXI.BaseTexture.fromImage = function(imageUrl, crossorigin) -{ - var baseTexture = PIXI.BaseTextureCache[imageUrl]; - if(!baseTexture) - { - var image = new Image(); - if (crossorigin) - { - image.crossOrigin = ''; - } - image.src = imageUrl; - baseTexture = new PIXI.BaseTexture(image); - PIXI.BaseTextureCache[imageUrl] = baseTexture; - } - - return baseTexture; -} - -/** - * @author Mat Groves http://matgroves.com/ @Doormat23 - */ - -PIXI.TextureCache = {}; -PIXI.FrameCache = {}; - -/** - * A texture stores the information that represents an image or part of an image. It cannot be added to the display list directly. To do this use PIXI.Sprite. If no frame is provided then the whole image is used - * @class Texture - * @extends EventTarget - * @constructor - * @param baseTexture {BaseTexture} - * @param frmae {Rectangle} - */ -PIXI.Texture = function(baseTexture, frame) -{ - PIXI.EventTarget.call( this ); - - if(!frame) - { - this.noFrame = true; - frame = new PIXI.Rectangle(0,0,1,1); - } - - this.trim = new PIXI.Point(); - - if(baseTexture instanceof PIXI.Texture) - baseTexture = baseTexture.baseTexture; - - /** - * The base texture of this texture - * @property baseTexture - * @type BaseTexture - */ - this.baseTexture = baseTexture; - - - - /** - * The frame specifies the region of the base texture that this texture uses - * @property frame - * @type #Rectangle - */ - this.frame = frame; - - this.scope = this; - - if(baseTexture.hasLoaded) - { - if(this.noFrame)frame = new PIXI.Rectangle(0,0, baseTexture.width, baseTexture.height); - //console.log(frame) - - this.setFrame(frame); - } - else - { - var scope = this; - baseTexture.addEventListener( 'loaded', function(){ scope.onBaseTextureLoaded()} ); - } -} - -PIXI.Texture.constructor = PIXI.Texture; - -PIXI.Texture.prototype.onBaseTextureLoaded = function(event) -{ - var baseTexture = this.baseTexture; - baseTexture.removeEventListener( 'loaded', this.onLoaded ); - - if(this.noFrame)this.frame = new PIXI.Rectangle(0,0, baseTexture.width, baseTexture.height); - this.noFrame = false; - this.width = this.frame.width; - this.height = this.frame.height; - - this.scope.dispatchEvent( { type: 'update', content: this } ); -} - -PIXI.Texture.prototype.destroy = function(destroyBase) -{ - if(destroyBase)this.baseTexture.destroy(); -} - -/** - * Specifies the rectangle region of the baseTexture - * @method setFrame - * @param frame {Rectangle} - */ -PIXI.Texture.prototype.setFrame = function(frame) -{ - this.frame = frame; - this.width = frame.width; - this.height = frame.height; - - if(frame.x + frame.width > this.baseTexture.width || frame.y + frame.height > this.baseTexture.height) - { - throw new Error("Texture Error: frame does not fit inside the base Texture dimensions " + this); - } - - this.updateFrame = true; - - PIXI.Texture.frameUpdates.push(this); - //this.dispatchEvent( { type: 'update', content: this } ); -} - -/** - * - * Helper function that returns a texture based on an image url - * If the image is not in the texture cache it will be created and loaded - * @static - * @method fromImage - * @param imageUrl {String} The image url of the texture - * @return Texture - */ -PIXI.Texture.fromImage = function(imageUrl, crossorigin) -{ - var texture = PIXI.TextureCache[imageUrl]; - - if(!texture) - { - texture = new PIXI.Texture(PIXI.BaseTexture.fromImage(imageUrl, crossorigin)); - PIXI.TextureCache[imageUrl] = texture; - } - - return texture; -} - -/** - * - * Helper function that returns a texture based on a frame id - * If the frame id is not in the texture cache an error will be thrown - * @method fromFrame - * @param frameId {String} The frame id of the texture - * @return Texture - */ -PIXI.Texture.fromFrame = function(frameId) -{ - var texture = PIXI.TextureCache[frameId]; - if(!texture)throw new Error("The frameId '"+ frameId +"' does not exist in the texture cache " + this); - return texture; -} - -/** - * - * Helper function that returns a texture based on a canvas element - * If the canvas is not in the texture cache it will be created and loaded - * @static - * @method fromCanvas - * @param canvas {Canvas} The canvas element source of the texture - * @return Texture - */ -PIXI.Texture.fromCanvas = function(canvas) -{ - var baseTexture = new PIXI.BaseTexture(canvas); - return new PIXI.Texture(baseTexture); -} - - -/** - * - * Adds a texture to the textureCache. - * @static - * @method addTextureToCache - * @param texture {Texture} - * @param id {String} the id that the texture will be stored against. - */ -PIXI.Texture.addTextureToCache = function(texture, id) -{ - PIXI.TextureCache[id] = texture; -} - -/** - * - * Remove a texture from the textureCache. - * @static - * @method removeTextureFromCache - * @param id {String} the id of the texture to be removed - * @return {Texture} the texture that was removed - */ -PIXI.Texture.removeTextureFromCache = function(id) -{ - var texture = PIXI.TextureCache[id] - PIXI.TextureCache[id] = null; - return texture; -} - -// this is more for webGL.. it contains updated frames.. -PIXI.Texture.frameUpdates = []; - - -/** - * @author Mat Groves http://matgroves.com/ @Doormat23 - */ - -/** - * A RenderTexture is a special texture that allows any pixi displayObject to be rendered to it. - * @class RenderTexture - * @extends Texture - * @constructor - * @param width {Number} - * @param height {Number} - */ -PIXI.RenderTexture = function(width, height) -{ - PIXI.EventTarget.call( this ); - - this.width = width || 100; - this.height = height || 100; - - this.indetityMatrix = PIXI.mat3.create(); - - this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); - - if(PIXI.gl) - { - this.initWebGL(); - } - else - { - this.initCanvas(); - } -} - -PIXI.RenderTexture.constructor = PIXI.RenderTexture; -PIXI.RenderTexture.prototype = Object.create( PIXI.Texture.prototype ); - -PIXI.RenderTexture.prototype.initWebGL = function() -{ - var gl = PIXI.gl; - this.glFramebuffer = gl.createFramebuffer(); - - gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); - - this.glFramebuffer.width = this.width; - this.glFramebuffer.height = this.height; - - this.baseTexture = new PIXI.BaseTexture(); - - this.baseTexture.width = this.width; - this.baseTexture.height = this.height; - - this.baseTexture._glTexture = gl.createTexture(); - gl.bindTexture(gl.TEXTURE_2D, this.baseTexture._glTexture); - - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.width, this.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); - - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - - this.baseTexture.isRender = true; - - gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.baseTexture._glTexture, 0); - - // create a projection matrix.. - this.projectionMatrix = PIXI.mat4.create(); - - this.projectionMatrix[5] = 2/this.height// * 0.5; - this.projectionMatrix[13] = -1; - - this.projectionMatrix[0] = 2/this.width; - this.projectionMatrix[12] = -1; - - // set the correct render function.. - this.render = this.renderWebGL; -} - -PIXI.RenderTexture.prototype.initCanvas = function() -{ - this.renderer = new PIXI.CanvasRenderer(this.width, this.height, null, 0); - - this.baseTexture = new PIXI.BaseTexture(this.renderer.view); - this.frame = new PIXI.Rectangle(0, 0, this.width, this.height); - - this.render = this.renderCanvas; -} - -/** - * This function will draw the display object to the texture. - * @method render - * @param displayObject {DisplayObject} - * @param clear {Boolean} If true the texture will not be cleared before the displayObject is drawn - */ -PIXI.RenderTexture.prototype.renderWebGL = function(displayObject, clear) -{ - var gl = PIXI.gl; - - // enable the alpha color mask.. - gl.colorMask(true, true, true, true); - - gl.viewport(0, 0, this.width, this.height); - - gl.bindFramebuffer(gl.FRAMEBUFFER, this.glFramebuffer ); - - if(clear) - { - gl.clearColor(0,0,0, 0); - gl.clear(gl.COLOR_BUFFER_BIT); - } - - // THIS WILL MESS WITH HIT TESTING! - var children = displayObject.children; - - //TODO -? create a new one??? dont think so! - displayObject.worldTransform = PIXI.mat3.create();//sthis.indetityMatrix; - - for(var i=0,j=children.length; i - - - proton.js-render-custom-pixi.js - - - - - -
- -
- - - - - - \ No newline at end of file diff --git a/example/render/custom/popup.html b/example/render/custom/popup.html new file mode 100644 index 0000000..d9c41bf --- /dev/null +++ b/example/render/custom/popup.html @@ -0,0 +1,30 @@ + + + + + popup + + + + + + +
+ + + \ No newline at end of file diff --git a/example/render/dom/canvasVSdom.html b/example/render/dom/canvasVSdom.html index 4e22c28..13f4721 100644 --- a/example/render/dom/canvasVSdom.html +++ b/example/render/dom/canvasVSdom.html @@ -1,113 +1,127 @@ - - proton.js-render-domrender - - - - - -
- -
- - - + + + - stats.begin(); - proton.update(); - stats.end(); - } - - \ No newline at end of file diff --git a/example/render/dom/domrender.html b/example/render/dom/domrender.html index ed61c88..28171d8 100644 --- a/example/render/dom/domrender.html +++ b/example/render/dom/domrender.html @@ -1,110 +1,129 @@ - - proton.js-render-domrender - - - - - -
- -
- - - - + + + proton.js-render-domrender + + + + + + +
+ +
+ + + + + \ No newline at end of file diff --git a/example/render/dom/image/8.png b/example/render/dom/image/8.png index 8b1a63aa7e0aa85a249abb0800880f69597e0b2c..f123dedc85499a47a0fb5407c3123509317953b1 100644 GIT binary patch literal 16275 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

(*t~+}&;TmNyqID{@$92{}!9PFrxtc3e78IzrKq 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 diff --git a/example/render/dom/image/fox.png b/example/render/dom/image/fox.png index 8ad8d26fa83e2dff1be166f3cf5e87c5e0c0b4fb..8c6b75d434801af6e6ab3680c7dddbb4f0e8a735 100644 GIT binary patch literal 5694 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 literal 20094 zcmV)5K*_&}P)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z002X&NklLN)>?0o{yL0a8$q|?#BOpmpRKP$ooP)|S9RUMg zih5MOqab<^5wnQO;i#Y^(;Syh) zV${^MGKGIXNH=T;NrTZpl**ZHxFOA&lVBoUhqN?>zN^I}X*VNkT36IS*`J!M~ zbEY@1qEo^43n(o(kYq z8)RGzZHeWZ(CT_K8*i@7M!S=zY&pQ>riso?Lk_>ANB?YwWHlsD(5NCwibHYDoD?HO zZS}Fz=5I!d4)RqXA^)jv4)7k)a;2*Ca*5<|66qVfQBmAfG_Hz}gPS>bW6WoN>u!#I zaDlvMX#$B7(zHfo+EFR(i&Yd~JT+rJKf9m%T34=iYIBSDevb1RKg_{;5J9}>D+Sb7 z4Itioln6o{Obx^bDHy*AZ6bcqGl*a^g- z2Fy2lY;Bb6n#kDO9P-R-x*vVa!Nm{Sn*Ty$b6J`iKZToW*-Wn>YEk;xX)=Gv^|Qki z!@~7fk)#1h!ha+>Uj={&Sc{%Wk$4-WJ-aJAd1QAK#j~39jC099BTS3(Z%5e|dad!I zutQ)7sxHKdXX1dOUrci4V=v;+of#w@>RWQI-?PM%FBx*l?t*sP)1L55wyfJesji!7 zL{BQpNSB4ddyOcA))AmE2&ft`y(-8#H#l_@#p?g^Wqu1qhIh&TzX0*h;~h|Ds2y|P zjA_66&~N|l6`jBPr^#8HGl+I#%MLTGL&tEmoMXy+K}xVHs1nlvg(DGxH06~)J;};F zhk5s_&T++V%Z^z`V~dBHhCG5y;Rgjp*QsonHdmq)9SIT(5_|9^VjQY&zzCvqkbYbA zOk4Ts{XT2H94jk6UwtDhy#W{LHqZ$g`t|5^|B7-zyhz+3e2w)KuFau0YLh(yU zw)l(reJ6jYIJfpTNt>VyU#esO6G%ug@YHAJvgVxoKjxa*ONRFx<&JOu1(wb^erx6% zx$#WI_w4@^-*n(KQ2}dRi0TlvH1UKXYDegrLZ=!PYa~*XTGLRT`Mr)|C#6`E;F21J z7(pq8D36MVsJ6!ICKPpisgT6rvJQS_h_vfCSHt%dN;`0%G@M#Yc*lD^^`pmm(PJN= zanUS(+a}e%eA{ow^#8j(^1!za9$3D^yZAp3AReFu9rN<(-SQ{uQU{A);8Wl7MgHda zW&HN^bIH#g0PJktC@kp#~&SfVP6`bx^*C?RLoyFHoErponPBPqDRWdDb4qZ~UX@ z4}R|u*YOFSt6}2VyEyp0k3X>EDLZa&USI#-^2YOjRQ4S@(f@iS;=TX(2n=O>-K(D; zB)@<9V@+QA9gUwaP8Y9_+A-Wv@DJbPdG&k0jk{;BWsm(oy#I+GV$VDra*F!2!PG%w zg@{6wLbO664N3)2B89GNbj_e@5h@XMs?cc?KuBvyvju4bYAIL^8Q?WuG`JY=Qy@ij zjO`1>N=B3pP_ZLBH^eTTAf`vWuK_z+-1O-d|Kn%Qu=2r=@j@2a1(<8L@witXWcCXE z#_T+=9iFndyg-zE#Q~8Eu7?WWTw>ssH@1KMvP;c>&z2$iI?Maty_M(u*!RIi&MUXS zoi|^91U~_1O-!6h^#(5N_(-FS0uz8xu|_vEre!d#7)hg`nzYB%6jE?{X$Dy???0otR7kx+LPbRLI`EE=DUzT4{K-2}7euxk*2kZxaq4oM_ zJT3nD&b=kAD>PXo%s%Y}bbF3Je%4>}iYr!GREkv>p>c>7M1vSmMx!E)r~rtrE24(R zGz^kNpfwU3bVCzO2%-%|M`8Qm1{PnIsK}Eq2)!d2rU~(E6J1l7rol`Yq^6NXqf&)5 zHNJqgLw(ln&d3)v@uoWQgduK6q|*&*+iI|-%_ooU7j9G0tZ@Sslde z{x4g9cc+df_m$`d)NY9Q_E#U| zqkofg(Zy-4IM&p^QOk1&Ki=5xQkib%X6Wid9G1 zbtom6x{+6wkjx}RlL@A&F>Qls8>AMYQw`G**ogl9nzg%n z6w3=F(=|*pC7!I4&NVT6rpVaE^L}E;$v=26e{uQE>^wNZpuXkZuAY3mYDP#b{~}QS zrGUtoG(^EF5?A+T3=jeCyuc}hZ&NnATce2X-DYE2;GR#O%1IUK5Nsxy=3sfJxJWgw5EufG4V{3c;6Avh(TCwQceyQ=H z-P_dOb7vfJOEGa-jfIbPkemBt)55?CN`n1Yk)RVHYHCa~>~0kYk4e`QqII>nmHN_x zXhq&L3{D5tq-z$FI-;pMy447VJu;vTW_kjt*B}w7Pve$ix}Q5tzOaBw;{cuxn?ThR zrWv896ZE7(O&HMIDb8)7d+X=%`5|;`8kHF0$vVl-c}TC|=ik@n7hd`?esSsTyy$wE z`JRLCY|X2e^_M;J9{`9{QV~}`)T=A4o*Mz;fqQ@ZCCM9q@SEb7ojv9dCDb-+;z`ZX z_pXvHTTETRgGv-hTNAYurlv5>0E~(wRHRUm0;8+P!Jdo^ycodL@oEYy4ZJk)xrJ;I zq=#x4^vnchKcas$Ctu1DrD(M@(Vz>IxLSe}jTgaMkHg`$4pNvJ%tV5kPSH~yNp|6j zE9idV)7Z7!F|8?-7R+RWc-uUr*YQg?PVuup@>zc4*jsqc!IJscUH+?++vF#E$1I}% z{Q!|_!N&XYz!IR4#rG#WcnAoK`@sR;bcN8?XLOiL6+A%6g@kNF< zAh85}AFFjqkVs>ihIq!H>jqmWT&XB}p0XE$Lr_o(IENUEP7JzHM@0gZC?lAO7}?x{ z#x!?)ex6tT(twZu<1uFUHQ2s6rWTb^}l>_%Dv(E=taKt?ts16HnRZhq36pWXW2r#P-)zxdi)p%uey9Xc6w`cP)j%9x)|c;>Y=e(;-O zp7?|qHl2f&4&(~v_OaU8&JTS5r+C?OJ3Q}YG5(~**#y1w5@0Kj`(evxKke`M&Gv_0 z{$I@GwqDQ4GbtB+PfkCZ{Kc=Ec;NLrRYuS2e-j|Ol8%whm*U?!^9#`F_Y~&+vXF#=~-9s;d_L4eDDQL9ZfGt1!UVcgm>nHbI;>)?+sGP7gI z>%ZIcL$8dH=6>KQ{LvrZ$@hNGr+D^vHu%domNd6^VL67WC-L47boiDZTZS91dkvRf z`X=%LJVNQ!BLOlB{?bYsCP(~p1x5>4dBZo=fAFWa?ReT>d}Nl|RmXVZ*5h=_2=Nw) z6w&5QNKyk^kj}@b)UfoC!<3zzcq&H3<6Vgok7+5QW`x8Mq?0J)i0T%TMo1MPiYStX zz;wwMZm#i`_fPWI|2)IWi8eGn)D6T5L>iO?!%y|tdngJh%5e1u;Gl8kex|m~hu01U zv~PGK?Q5^4Jad}v=ReQj)JdXNonkQL)O|~2w=Z(}4L#oTo0IIn>RG^LeCJR7J@0zU zB3mw9(G^ znNO3SJr5RCn&8B7?`O`yxug8SuWsRcU-sP`KHldkKXWrDjv36t7x~!RHIIL)0GD#; zu;PkWevv`exbM53I(fxqTWi^3uY5>{%RCA_G9Gu-#_WawyMO(~6ECp$E%MtZo#7vd-;aoP>TG^aL`W(A*5lYXluOn4${Cg4#lY zgCVM7jwMhqffgXVSOR%jo?T$&Q=cSiG}!hH-@yEnpTcnAEIu33KYf<6GvK=CY~sZI zoB6&Uxs4NN{*<44&5QW1r|ssQU(j@?VxI7_&+(7Hqj>i7dhFYC9k2T4HQw~rV+YRn z+W+(T`QeYM4K33iZk_7i7u9$K3Xt!)!Tn_4&>L86IwP6C?Mf4-Y?d5yVC z6Ox0laCnlpeQ<(5zp2IjUz`X6s}h(?(5;vxjt~VH`h@=$!$C>U%2OlmIvk>{jO;!u~jE`K|lTjzLQ`vDeIgc3)TCfLppoI^Jh%303e zwo2B4nSBxMxdg;gobRIADal+LyVzmrlZR=VoGnlGEH5Yg#G7~W_J636btXWkFrT7p zNkuLiv@wVdq9C#%3E}6_^MuDJ#0S9_V^B)tl>~}hD{8y{@?_y?}UpB&S$c>MFf}DzV>nZG7d9 zi}U!VkL=*@S1;q2cD|j>2jPw*P>&PHOT2Z6fhZBW4|M39%$VF6QJ+dFGK&mKRMQjH zQ_96I=RSXyxrrgIgNnER!(LwdH`miSS%>5#Y^{TeQA&qhk3y*`vLC4=RV}utkQh?3 z4%E8-Qi8W7(bO!G*2qsDMc13OuD*_R`!0N*v3k=-@Oh3a9dWD0rmHU_iX5UqM*_nk zTdv-W&mFzfeRSP0ziSGKFX4}G?XmA7OFgk*BCdY&PHq}@dDf49o-;S@;upW~GXDJI zC;0ehPCe#^HaS1>O-8$ zK=mPRM1fE89%TgQVD(s^T3b__tWgX+Wd;sGB_7uua_;6c%qBxxTNTgv%_r~!zx^CK z<$l=Fho%CFHzWW87$Y@X*$K67D@LWUqo37-?1zeD+@MFfd>%I#lJ43|vTX-tcMWY6 z@zgXbikZIpDz-lP@l5XBinxp@f+QBSK-$#odBSEI6A?;TbSiAyJIn4%w-Ze?n43%4 zvbDjsJ+nOf#aFX5eUQh#{QVfEc+uBi2EM?@&0m>rxAeA6lWd-8uV3a7++8z9t*6yh zK7CJg@zXDf=U9O|@9*>9wtavd2jGq`Dr&W8thxkDsu`Tia0Rrs)+mM!r9wfRss(Rn z?MN3r%!s$cbAR^0cxbG)R=T^NDBl| zTs}mlby||t>Ho9gxa3{=*XZIL}`q|lQbJ7?KZZzhOz^qNQmMPh?+=98wT6WIeqJS zR3yX=jY)*Krb+4w9Rnt?#=SvCSrqKOXe&SP+Hd4nKU#3dy~p{s7hjH5u(VSCM5k{V zW}ZQHsYl2Lj^{nn>gTDa?9#hk-;(t_&)9mN$xV*6vw}gROep^pKpP?J)r!&SsPato316eT`pv@n_jFaRyd0XwHK#Vf8qolTg&41hu}~RaoSaG>jxu zRcgwQ8+xk86+mf{=~#t4ytG!fR0cX5TI zJ{c3Inz(L=62Xc`B83--jAH9l%1q6W=LLHX&hyl7{5t;j^BG%r#LQm4mELN0u#uW) zUbef=-YqG6x1G^Vl=z#o{_JD#{J+On`XM3lUe&ZlL>x+cq8N+`oMaLU zZdj0aa%xjCCJ}T5h$l9RW;3R+j@T%S5q3=0XeWkVVOhv5*FI(k-E(cu=N)!jzlGi% zCpdb1@cn}Sz({SGhmjC7rn2G+9Dn83X!CRp?pt;^2etqP5Q`>CG~PKxc|-}WunapM zkHL-iN(dA=3|0!7Q<{kx&D0e&ZvEl}*Zq`*+6kDOhO$yYX&Z_@5+#U>@I{Vl%^*6$ z4?BoTK}Bq&i0| zj8Z{0=Os}R?Aai*H0lvoT{O$W`7Z6$P&!!YpQ=^%g-W#rFqBqk9SZ7{(HIklMj*g;JDBMv$|}Tr z#5p2kP~H=1hzuw%ctxegG~RorCsKBAYY~gEW4aL*O@-97b&kRdb)z`Yj2I$ps@G}P zx3jo&2geU}=7)!mzI^AF#_wgNe@LS~9u$r)1Jn+*)eM=(<=}FUv!1dC;sihPrhQ-| zYzfxts;D}+zs^H3^e8O#3B$}5_^VGOT=p|{x_JsF0W$;r(@=Df+B7JG+O!|D^-|2X zOEKFn0TJ}%Ea}BJ5O3WdD!BSxB&lJhHW5v20_SkUKE5cbZxxKX);gqzCBzisEIJ7h zdjEkVxNesyjW9;QdbARZ7PJ<$2$2>hXA(@LFj^5Aq27onou}8&iIt#y=%$EOsG>I_ zSm&t;%p2Gp!wu6l=9J~)=U;={we=g-`9SPm)Fqh9$@PIg5>m%Qv@} zsYT#@$Z1P>k4Pk}nf1h4Xc%F4Jz~eC=ETLjue$Xvh+^}QUX~hjdq)>7EfZU6((3gs z6b?#HIjsEis9Hbo5v}kR@GY+1x&2D_G%^;nHxu-&X z7Rtef2Zcw8$4Si6TEgOyA>Dz-7(v%tr28(%OwZwq9K0vqwv%N0Zd^9R7e(N@ln&J^ z9!!$byz~;LuDO=D-oOn8q|j^;n3j< z@I_ETI#LLgyX!sLD9RFSsnAit)@V;U31taUqR_Eo(1%6}?|q>9RkZ@wg~yqV*0^9F0Jajj{$k9<8 z$Va0wwHoE}62qg%NGIDgc5FpNVIqUz&{|=%jABiU7L3~1>Eb-YL4j6*!kL*!*f-Z; z&s3d6tKbz0LEViW%b2tg`bitWzNwU{x?sD#=g{jtY#btERU{fvHA50PkIg;41YbJ5 zt2)nI)xV*F(R3C(f|n2+rjvl=6x}=+c~R6g96GDHW5H|$b$S9$e-e(|2vMVQS3}$) zT9K_pe5ZaNuY2N6yy9oK@sXc9M0@Ez&J;7~NCy=+^0J&m#R=)|0~=AhQ7F++6r|g? zQ`@oyyS7SwZWD7iTtjQue6T4Bv=*eQP9E70EfN3{VQw--N1DPyVl)@ewn&u1I!7!J zBSGJbVDK0T9+dV0lu>SD&t#3wlL?5wROG=%T^_=Yj4o*yiDC~$?(o*(t;gH-6hbf` zDg+QZAlHnUKt?%}iDt zS*VoJBR0VMAT5<0(MoX6Gue#Ux4A(QX&RBnIfr;pDncxRQ9)G&DGOZNNaDs9cP5J1 z+>D8gY_H94dPFa4ypUQFMXasEmQ^d71BF6Y#>#six>X4VA1^57Fxumt!WM!uA%gcd zfc1sbBYJ}%X0CwE&xB1^K;8kVD*hy>0m_nr)ZpA1?C}ML3x*dytKd5hex5Tc$wnfo zk`nJNct>sbK2(|#&u$`_pF=dbVMccH^g1u*i%=Cmk^)t!NEc4|$2H#i2s6 z64KEQ4k_M>RrZxpeh?_31lC$lD>ft|nCf*hB0R-czlLnYLW~gx1RIPlkNm;`C5)SCB|0cQh@>d!b?AP><@KT*34MX|o?r20#-!MKdxW8A1~C1_Q-wz2`3RQDs*gqIBf zE(E0t2^=sTYl_n=sid3uMvLS9b1Zyh^ykIA9q*OxGUH$tg&>PtpGjfBG4FJ~{P{u&0 zJhlsVydQNmdB@pPOPJv6JaXS)=@~qKPF=sZ#@zDIV_oVvapu@^$r3^OBjnIPNBxYy}tCiNX&C zNOz6STF&{hiB9a;PXE&FB^wVmh~Lr6)^&fCSrkUr7&Z3#b-r?>$~Jt#p!&wNtz7U~ z7uJ&K&-o~| z%h8WfC3WXYADWB3i`1iaG6S3%`nA{t1rk)1!lAH5NIH25cEnkavuxxaMk=e4nqc&U zomuRAuH6!`X?`9Cp&6562(ARBam4_Zd%Sw)GhC8%IaxGlO{hRqASkVI)=}%7u)s4eWpOq758TJY$_DwLkyGA?#s;0hVzOV zj-&GCy!T=r=5;dGE2t0m{n}yWiE^wFR0bq*b`&J@j)XTCuRb$I9JIDP9UxNwhJW#ejxaxjGS8V_>qG85?i6uzLuqY|A9Gol7 zqe!&})JjReTY4IiqO^*9V2SFX4Q$veY0kuWA6Q;jf~s=RdA=T?Zg}Uu0!4&j5%J8O z9X@bmft{O{_`k=dAoW3Y6x;%@8!O%{`dXK_m zE2FIZMlYYQnr=rL!h7&CCOMVuDLkAnp%KH{AS3JMc;^P{AsYStSX;9P%$dxuof`Pn zh6x4BMINe0L}~h~Wk}^J6=)Uf@qVQ1S+^VOZ!R15Gwd2=!vMVj!g>x*P zTEzD)fAIZt?40+U`fsn}=xrTNNQ<54S9$uezoM_9MB!ZUHp_J>@whPw@gqqP|DZ*! z9Mkpvau^bQW{%&$|87M zqp=br8s$rrs6gQY7xvogPjmHb7kn0UK+r!;< zJJV`yeGwSD-xves)>Fu?S}^BBz>#<$38^%zzNiR4VRa6 z1X^VWQ-NT;U%v|PDc0ZDSGvCX<7Hh+-1_H-$8`ns5p+D9KD&nP4Dni))x(X$7_%cD zu($O5@j+Hm?gB+_L4>@3tnbmW37%HrD03gG%hd+W<;T3Nk@zYRmNUa->e<`Q5SLes ztYeGm(NqOl8Q9fPUVLOajaZi41P}+_%a2)!>Mt3oE$^!|iC>Rq1;JTI=hPV%j-G=- zkDvRl%|M&8fAJU9ZVrx0n441-c2G%11xV>V`8p`0xA#~j*f`i$zy4c~-YclIMg%J* zESy=x^)du^L_N$@Lpye5z{IL!^~}&>5L9Hy2bQt~ho-xnS0y-#vh=~wBcYUZOx}E@ z!h*<#JiJzLrWZ5c%-LJ(KsWF*HJ4)xur4?Xo(tz5dh+$`@|e+HSKJ#rY_xm5_f_l! zUJ1jsE^9}RaqiwOKm52JPk6zVK!zPIW22C6E$zrg+n}Z@6=f^6Wjz$$lU2Yt=Ws@2 zjfc(}PN_;dg0vWc^97tNU=0|0$I4QVvX>VgcgLgIkP;Xktjo-?j zR5(;KP z9$Sp-qM*KFipn^IY~_R0)_RPg)(bR!70`+(Tv5ytCJVGbI35XQr9_|@J0W1$P zmKIj9S$>!I{-k;scXwP$)S-btvon@v2_ZNV!2#LOqKu-~^>kMXqFRi%U~?B1a8yL- zHgvZimzFWRa=x4LV~;z^Me|4Dyh5q4(AIj2%##mChBzd9N{N|MYv4<4wfi1~^tj@# z40*@KoGm6;9%xpMpXT_ThhU-4Z#}oiOtVA2cp9DTr1_X<5P3@ydFpAXBFU5@i@;g8 z0fq~gt&%3zC|25r=yM-q(@(q<&YvTzc6H%GZoXqZONB=Z3>@5bbb-#1vv}mBcVAit zJV;;^( zb>I;XO9R7X?0Cnw+zHWu^NS5if^-zQXV4EI3t>Yn`ZiCf-NWPJdpTcDZS18H=pwk` zfa1&vmhL^m-CsD3I)9W){oTY1cXRhm_powjmsfv%&Wo<>v3gIJa-|pQk?+5m-U18? zLs57-fI4(Pai>ex)FB4*U2l8D9$O$S<1Xc>iZC%f@ zg^2`K9UQv<6#1z&&~lgZ_CfUMxFRVpxN5g_{4qq4c*nphw9#b4f}*fQv0-JgV9+hm zv7s2|xYA+^sm4k8;CXqefC(<3jP3!WJohf8T)(};J6?JRZ+Lgi!Xiit`Owl`DH#qd zQKZ4bKqu@@PVw@_hxyFX6Od%FQd54NKeO3@Q}-NaXSB#GukG=jmoIR|Y?l+~Qa)a9 zQeN-))=S$Aml84+V}^>}7eB+f_r0IKfa+E`AC)kD%Skr>JHcI{p zbiaRWL z4Ng4DZR9Y$6TI?>7mRrBJJaB0`%bg}TQwhkZ$vvU(MDKXD(S6RnypcVi)GQx@#5yk z`Q834+*Vx1c6~kssFeW`6Dr$}EEGI{?`f{seh#;svc1vgJ1;s1Vp%x{EB!grOP+_Q zS$emBn5C0vgAMHYb*jgvaP`|>%iU@RH$DB^*jD5$uR6}1SYpRL@8f0ny^SX<+{{_i zAk&)3sKYJEehjcT)pT=9O@|5{ZJ<-a7Y?1EcmEm6!k+TF{E$L@2_WMxZ&}gxc?HnQ z2bSGk&u;0>J~;7V8c*&}MW|z1I5A{uQz%BWWeMVf`x{k(q4j}!a6w{5M&J7lR#f3Q zx*%M;$C5m^$&G)z8Y)2|#qzn5=}nHvgo?;j)nIROo;OYY9$$a{&2)U7rq8Pwz@tpU zp`5= ziuPj3vtIi`{^4ma;kGNkm21n}c;49$@`UaunXr~4@ibXqvw8U(N3VMhpWOEh_TArM zP}4ZT7!6L5rf}!!H4fi-g7Ww>&gffkdGTlxGO{5fP$u5L><+zhPCt3tIJ1ydHCd%2 z&n;16=ynSh&kWhLwMLO!#8xhFNK6N{<)n%W1V1Wb@KO~?gqkPkVd0!-?_R^Rp5Nle zzwdB%p`bODvuSh0>?T2+LMzKryPan?zrbsHf6N;@KSVlnmPAISqY)}?!sHq5TsGWw zD&~?JoIZY@Xu1_RwQdf?*kiX+-gOgoDcSk>O_YTt?-zm5uBz$Po`_l3=f{`+jFo%- zft|H3^|IiEw7G9!u-%ecWXXU}JpTI;1Iy?7EcYT>^-!KV*-lvLIX-*W2|9Nkqqo?@ z5xsAu&dtLFhV}w5GC(hv9Q&Ikcl(cTl50*6JVLM~dG3&PDan|eiP0+bp<5Lwgi)uH zcRpkt)d-Y|d8>E@@r1fu535U-{kt@+7dH6FhX>q$Pe$C(G#i?<2G$Bz6pMZnzqaYm zI5n*E=O@0MWHx7plE_Ht@{KkznVeu|c$zG&gD8e)R#5c_mlfEe#Jd_8!_>|&Qr4Fx z_+*{_5f$?0UK(I6Te>|K2Q5w%nzB=12PKlkOq@E$&DXz>JFkBM+fJRvM}|ZR&W6Hs z6Tv6GaDs*V7RVnsO@W;EzWfuZNXv&K7wwqJ%BuSzP=C*oz3WAj=9)a|9$@TizhRWdo2(++YPo?KeA%uWi=e{RC+$>X zMq#_5Qr_m_^48+5qa5T_7uYC`yHO@GN?BX$Df5_e=qLsSWdW#&xZ6by;NFYB0p9^T zuqdx6#i6yK(M-7Q_EX$(>jK5S$LXD2qm<|)sIu>?@BL^-eFVgyx^ExLIP|VXf9sFV z$W>>v;K~{k5>$B}hIE}inK3yXqm06q7Q~~p$0>o*Z?vRU(YLBnzRr!(qk>pBYLsGS z*-?w(`m2R~=Sr5=*2tC|iK!up!YI!<-zL)uuiy24UfldFA6wYOT}L94rA00;PBHA3 z+hbu~4X#*%_Xjl!>JeGQ`0$ghyWdY^TQ;yvJQiy!cron&@ ze*Jgz*^6Jo{E6e(L{Q?9L{qEPxbxN%-152OlxsaY_ua?PDtuY~PUt4~4+)4L%fFYE zbd0VMFzLIO>>c0SGFNRfa59IobSR_93yaZ0r|UR%e8BGg4QwIn(RS5ohAYFc0xzNZ z(N~onew5}_Aye)0G7K&gPd=~|BGgl8MJ0p53d09hDV3olqy^6Ao;!w+mS=eE;0#x- z!DV{ZEDy;$Lwp|8lr2hp>9B>xmE{H)Rjygq3ur1r(t<5KWfra?59-%w*q^WQ z(aWCAJD&V|Y+gH$(mA9xq9mp)Jh$F-Klj~z8mF7|AGnkLT93k}_j%k0H>RT#x*J;k6P%OJ~OSU_PFE2SbYh0J<}P8gPu z#FqK(DRz)k4hn2m;)+T-3X3Z(*dU_5`dvn0v#XffQ3B3chx39q3Z+UW$_^i!xsu=9 z{(AhWlaQ=3Xr<)EfHTKdSUj`J+Hwa~pJjOJ5Z#l9$ZQ>37XNcy{2pa+zzCH5Apq$E zwRbGLTb|cYm+Y;p`WFjNo`tDBS!Rh0WQFH}LqjgRLSszGm4HKOK`R|57!>|X1XBS{ z3sln@e39X782bv~OB>S1g`&tpMSWFJxn788OHWyPN*kEv(puuWX3Ned<*=X}<^hDf z4AN1QRqBs*`qQhiRNp$)Q941QM~=53-j`iln+@a7b_5YW0$j@lYh8uKh+RVt7dRjeNdDb z^1@SVXjax74;&g|s#+Q60&Q>eaN2-#L47&v*NeBE4OYyF!d0_Kd}*fQQQ)!?mzV3HxWeJw#_xd(_pYLR0F)1#Md=_J z+ISk9Vm4iW3Fi9CxuJQOXz?gnUXpc(4A+Jf1B*C~EmL|c8J!~^XV_UK%Ob4Je^&5r z)IKq~)FViUyTGuIgVF(__jUb0|KqAXa(P`aiDA$$iDQiuMP7KC6NZzg3QnHPsl_UM zriC(d>!5@hYhP8Yj20pgi{2Pq6o(+RbYbzlP!>YAW+{daZv?4pB-L1fq6kT{qJ+E* z^trX3MpKi-Lf)^Wq5((_xA6=c!P%x#I3u)wMlgjKoko}4H~VSiLEil z0H@EhU!S6Gm&gWd*sO!idz8Z-#n6)VGI}RI#-MYOtV}72;tSya)O*W?mw6OGMuxp# z4G!py^{gwvzj4|9!&OQ7%KgpA+&;AA!-BMCSY6ARFp7FhbN4+1l0-4TIi{aEyg)Iu zc<(W(0UvbpIt>+it5I68X^giP)3x}*QDSjQ;gzDyJbB?LoKU!GK)(r$fb~J0l|`Te zHgB&{t0}Thjw^$N_|jEGC+lSAdd5Z`oK#XG)qMFdfg2oUw~tDC_+g!<^hjNotRD^u zKom|Q@^Zjn=}xllNiv&~WhD;(1EC4^p<54l6gyIkfzkuI)wKq&=(z2zOZM+)#Ib22 zW-zd!;W5>$c7w!3iQ=}~dn_-OG-^787+xrIN153WC|3S`$jiGRG0x*eV{0j8nqs|B zWRMRXrT6$)@FwIb^4yaR9D{*lICSKB@PeH8%*;h>+m+%=OPLqzV5~d&BNn(-o(&mvSLvPk9D~*4|+@TuKHH0m>>6|NYSa^?R1`TQ5(c-iYY;3+k}}Ev$A5n#~B&!e>9%VQHzP zSvMh3gu>>IGAlzPsjY&?k}5t3o|MxD+pJSIYLrSsa%||x`z~aBy~3hGHm@X9#*`tM zG(8(};F3C1(-C>Uz~yeE;LVN}J4lICES^*a%j-Fo5m{M*yqsJiD~nFtIdSdYdN(+J;Nl2o-Xcxyvphj^$J964?2pIxTj z9E1vg?{K3HhWwTD(Jy(+qaGagKb0qSv7jTn*Hvl-j(?`9$YC7KEItjY1oKZ z8x+KmLLuZ?*rBz$rpPQ09O~2Wmh9PAr!}cV%~KIRQk$wUp$yd>zB-`GIgcMrWr!4} zn!d9hUX4nAN*{o*zN*dINFA?BhWG0oR2x<4e!VSWqv^+2J(E?Ia|G4lHY!Uu zc8}Z8^&{2f-I($A8zK-6HXc(~veDc_HS$-g|EFtFsJJi6Fa}s@Osr{5csf1HXTCTD zTjHvLU|tj=Zb6iKx&vEwJwB61J)iqudR&DX8`)GFoBcjIu3`kr-7~P~cPI4+=Nr+) zojpr`P~rr%38k2&b;MeTBSleo`hCYtTeD+Njj8!Cf2u4i1~jgYz^huCHX38(!HqCu zrHiBZ!uwE>5F`agHK4u-s!O6!2CK$c-5?mjc8Lemh>%2Ak`eMirk)T@L2avIVtL5_ z{zuD8k3AKnjcS#6?^nH*YgslAPzpN^=IoiW3=8>pKVfHlxLG=O%1$&E*C^ojZNlZh zKW#oaSu@SM`j%e54B}Le!g1IAg2=$kOpGXD@q9tQ@0gwtw(YJly(K2C2ZQe%;czg$ z(QYQAX23CnJSzWj)`eC&>#I7Nu{zFCEteJ~s*JN=F92R2h^Mqe)pgY)KN>vX(Iz6A zPKer$bbHLg2NpSarq72brg{43o(RkBLzv++sH>w_A9TFt30=PZnjF)rbj*Li8C2?m z;WY6DXHbpk`!kz`ZGSMMKRsVF+wLAZ1_R5$dg6M7QbMnj5i16wa$^3e8;!y|Y8keRzr4mSM|Q&*z6Tykm9WOAlN!`Dc%7uJM@b z1X>o(N8wZj<^MxYX_E^E46ILlcqm6;PMCV@wEFP2)LeC<^z<`FKXa(mU=l;tFX*n7 zOtuyKFKRM59gz=878i!}J0)>lGrg@wqiw>(1ljP2{3xKSRLp~73Kb3+L#k>?=N}wX z_>D8K6qV67f)|JP4xbfB3A$+@@)$AbW*t?7#%x|1HPnUD(qu7XaeND zymJgX1$pL~-yE@ZXPx$xMtMgzw3N=HV~we*;Fb8Ga+GYew2vBdJb@e>0Z`>Ml;3FP z4?3@!kh;-0fwM>_tx_O(9V=L?F@VG@`M!MQd-wiI1M+{KwYVvO|+hM94%9Guc45 zQdA?w%uU`a_2g|;{PFqg6IlV6C;UGo2xOoJ7w|yB~ISdVWzE#<1m(7nHVJo zrNZQFDcwcl+?y*vUL{&T>iNb09%tb`Qjg`Ah?MvIQ2{p^#k*4NpO{QW3=3H66(PwL zDW*5YWJAlTV+Bj63nphZt;vYSgd%OIFu=w;e93zKu&Z*cp*A8+Ss0rXyPg2EmAtHX zJdO$(e2L2~%6X(Z?Z;Dw%vTZnW<4 zqGG*>E8psow~DBpz`4_w#nYDdq%biR5hYM-DQZoPiNdKoN-4zakW?BY4M#?Q6ncve89y0i0&|Bi zY#d#VJ=l$Q=g5Q+*M=wc$ZJU<1BIJncQR0zUp7Aj`c$v5_u$%_h8(Q z;yGR!vMM1>PW$C~`tYj_02hSDUeB$(2{Mg$kwqax6;Mk$3# z6zOzC)DYr^;>@vvoB#4Wu@!dgiJ8%kW>e$l8mM}LX{Yy^cKSX^qTiD^zEjmAPzq0Y zKfVl=_0<4Kn3a#8RPcr*k{>W>=*H@;l}IeKHz!QYrw|E6zr^-SZ0;$_Fib7XG@RmBPf(Uo#*5&>t=Qy(-1fL&u9xGrLD&D~fPBRdxPRE4A+qA(2aD4G zwC@)`VT`=C-B!kV=${%eSQt{9GBh_QG`FR}pLY&l1me(*d^!Tv9 zDzqw(rtnbN12LhV7!{6H)s^=p3RLV-aW%HD096WVPUBl(`$K2;?SDhmtp74ovjb75 zKt^+3z zv$1Q3r9XgPr{Y%s<8NPGfLw^rMxW=Rhd+1l=Mr)v^Ko52!LOE=x&CmU7!Kx^>vBb` z>xyV9#WW&x!;sF_NM;fw_DJNr63Z7pz3RYRJGYE3^T^LXy)s8Psc5D z2He|~_P^|%x3(-HFLBm}7{gXQk%?AX$yL>O%s=$b7wc6eGM4}R|JsZ`T8{T?x3BC? leQgQ82FTZLk8t~c2LNw}5(uYa!_EKz002ovPDHLkV1m`w)eisw diff --git a/example/render/dom/jpgmove.html b/example/render/dom/jpgmove.html index ab7d1d6..638662f 100644 --- a/example/render/dom/jpgmove.html +++ b/example/render/dom/jpgmove.html @@ -1,91 +1,101 @@ - - proton.js-render-domrender - - - - - -

- - - - + + + proton.js-render-domrender + + + + + + +
+ +
+ + + + + \ No newline at end of file diff --git a/example/render/dom/webglVSdom.html b/example/render/dom/webglVSdom.html index 68624f5..e375718 100644 --- a/example/render/dom/webglVSdom.html +++ b/example/render/dom/webglVSdom.html @@ -1,120 +1,131 @@ - - proton.js-render-domrender - - - - - -
- -
- - - + + + - stats.begin(); - proton.update(); - stats.end(); - } - - \ No newline at end of file diff --git a/example/render/easeljs/easeljs.html b/example/render/easeljs/easeljs.html index 91f5e68..fd775f5 100644 --- a/example/render/easeljs/easeljs.html +++ b/example/render/easeljs/easeljs.html @@ -1,94 +1,102 @@ - - proton.js-render-EaseljsRender - - - - - - - - -
- -
- + + + + - createProton(); - createjs.Ticker.setFPS(60); - createjs.Ticker.addListener(window); - } + +
+ +
+ + - function tick() { - stats.begin(); - proton.update(); - stage.update(); - stats.end(); - } - - \ No newline at end of file diff --git a/example/render/easeljs/js/createjs-2013.02.12.min.js b/example/render/easeljs/js/createjs-2013.02.12.min.js deleted file mode 100644 index 25317f8..0000000 --- a/example/render/easeljs/js/createjs-2013.02.12.min.js +++ /dev/null @@ -1,246 +0,0 @@ -/* -* EaselJS -* Visit http://createjs.com/ for documentation, updates and examples. -* -* Copyright (c) 2011 gskinner.com, inc. -* -* Distributed under the terms of the MIT license. -* http://www.opensource.org/licenses/mit-license.html -* -* This notice shall be included in all copies or substantial portions of the Software. -*/ -this.createjs=this.createjs||{};(function(){var c=function(){throw"UID cannot be instantiated";};c._nextID=0;c.get=function(){return c._nextID++};createjs.UID=c})();this.createjs=this.createjs||{}; -(function(){var c=function(){this.initialize()},a=c.prototype;c.initialize=function(b){b.addEventListener=a.addEventListener;b.removeEventListener=a.removeEventListener;b.removeAllEventListeners=a.removeAllEventListeners;b.hasEventListener=a.hasEventListener;b.dispatchEvent=a.dispatchEvent};a._listeners=null;a.initialize=function(){};a.addEventListener=function(b,g){var d=this._listeners;d?this.removeEventListener(b,g):d=this._listeners={};var a=d[b];a||(a=d[b]=[]);a.push(g);return g};a.removeEventListener= -function(b,g){var d=this._listeners;if(d){var a=d[b];if(a)for(var c=0,f=a.length;cc._times.length)return-1;null==b&&(b=c.getFPS()|0);b=Math.min(c._times.length-1,b);return 1E3/((c._times[0]-c._times[b])/b)};c.setPaused=function(b){c._paused=b};c.getPaused=function(){return c._paused};c.getTime=function(b){return c._getTime()-c._startTime-(b?c._pausedTime:0)};c.getTicks=function(b){return c._ticks-(b? -c._pausedTicks:0)};c._handleAF=function(){c._rafActive=!1;c._setupTick();c._getTime()-c._lastTime>=0.97*(c._interval-1)&&c._tick()};c._handleTimeout=function(){c.timeoutID=null;c._setupTick();c._tick()};c._setupTick=function(){if(!(c._rafActive||null!=c.timeoutID)){if(c.useRAF){var b=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame;if(b){b(c._handleAF);c._rafActive=!0;return}}c.timeoutID= -setTimeout(c._handleTimeout,c._interval)}};c._tick=function(){var b=c._getTime();c._ticks++;var g=b-c._lastTime,d=c._paused;d&&(c._pausedTicks++,c._pausedTime+=g);c._lastTime=b;for(var a=c._pauseable,e=c._listeners.slice(),f=e?e.length:0,h=0;hthis.a&&0<=this.d&&(b.rotation+=0>=b.rotation?180:-180),b.skewX=b.skewY=0):(b.skewX=g/c.DEG_TO_RAD, -b.skewY=d/c.DEG_TO_RAD);return b};a.reinitialize=function(b,g,d,a,c,f,h,k,m){this.initialize(b,g,d,a,c,f);this.alpha=h||1;this.shadow=k;this.compositeOperation=m;return this};a.appendProperties=function(b,g,d){this.alpha*=b;this.shadow=g||this.shadow;this.compositeOperation=d||this.compositeOperation;return this};a.prependProperties=function(b,g,d){this.alpha*=b;this.shadow=this.shadow||g;this.compositeOperation=this.compositeOperation||d;return this};a.clone=function(){var b=new c(this.a,this.b, -this.c,this.d,this.tx,this.ty);b.shadow=this.shadow;b.alpha=this.alpha;b.compositeOperation=this.compositeOperation;return b};a.toString=function(){return"[Matrix2D (a="+this.a+" b="+this.b+" c="+this.c+" d="+this.d+" tx="+this.tx+" ty="+this.ty+")]"};c.identity=new c(1,0,0,1,0,0);createjs.Matrix2D=c})();this.createjs=this.createjs||{};(function(){var c=function(b,g){this.initialize(b,g)},a=c.prototype;a.x=0;a.y=0;a.initialize=function(b,g){this.x=null==b?0:b;this.y=null==g?0:g};a.clone=function(){return new c(this.x,this.y)};a.toString=function(){return"[Point (x="+this.x+" y="+this.y+")]"};createjs.Point=c})();this.createjs=this.createjs||{};(function(){var c=function(b,g,d,a){this.initialize(b,g,d,a)},a=c.prototype;a.x=0;a.y=0;a.width=0;a.height=0;a.initialize=function(b,g,d,a){this.x=null==b?0:b;this.y=null==g?0:g;this.width=null==d?0:d;this.height=null==a?0:a};a.clone=function(){return new c(this.x,this.y,this.width,this.height)};a.toString=function(){return"[Rectangle (x="+this.x+" y="+this.y+" width="+this.width+" height="+this.height+")]"};createjs.Rectangle=c})();this.createjs=this.createjs||{}; -(function(){var c=function(b,g,d,a,c,f,h){this.initialize(b,g,d,a,c,f,h)},a=c.prototype;a.target=null;a.overLabel=null;a.outLabel=null;a.downLabel=null;a.play=!1;a._isPressed=!1;a._isOver=!1;a.initialize=function(b,g,d,a,c,f,h){b.addEventListener&&(this.target=b,b.cursor="pointer",this.overLabel=null==d?"over":d,this.outLabel=null==g?"out":g,this.downLabel=null==a?"down":a,this.play=c,this.setEnabled(!0),this.handleEvent({}),f&&(h&&(f.actionsEnabled=!1,f.gotoAndStop&&f.gotoAndStop(h)),b.hitArea=f))}; -a.setEnabled=function(b){var g=this.target;b?(g.addEventListener("mouseover",this),g.addEventListener("mouseout",this),g.addEventListener("mousedown",this)):(g.removeEventListener("mouseover",this),g.removeEventListener("mouseout",this),g.removeEventListener("mousedown",this))};a.toString=function(){return"[ButtonHelper]"};a.handleEvent=function(b){var g=this.target,d=b.type;"mousedown"==d?(b.addEventListener("mouseup",this),this._isPressed=!0,b=this.downLabel):"mouseup"==d?(this._isPressed=!1,b= -this._isOver?this.overLabel:this.outLabel):"mouseover"==d?(this._isOver=!0,b=this._isPressed?this.downLabel:this.overLabel):(this._isOver=!1,b=this._isPressed?this.overLabel:this.outLabel);this.play?g.gotoAndPlay&&g.gotoAndPlay(b):g.gotoAndStop&&g.gotoAndStop(b)};createjs.ButtonHelper=c})();this.createjs=this.createjs||{};(function(){var c=function(b,g,d,a){this.initialize(b,g,d,a)},a=c.prototype;c.identity=null;a.color=null;a.offsetX=0;a.offsetY=0;a.blur=0;a.initialize=function(b,g,d,a){this.color=b;this.offsetX=g;this.offsetY=d;this.blur=a};a.toString=function(){return"[Shadow]"};a.clone=function(){return new c(this.color,this.offsetX,this.offsetY,this.blur)};c.identity=new c("transparent",0,0,0);createjs.Shadow=c})();this.createjs=this.createjs||{}; -(function(){var c=function(b){this.initialize(b)},a=c.prototype;a.complete=!0;a.onComplete=null;a.addEventListener=null;a.removeEventListener=null;a.removeAllEventListeners=null;a.dispatchEvent=null;a.hasEventListener=null;a._listeners=null;createjs.EventDispatcher.initialize(a);a._animations=null;a._frames=null;a._images=null;a._data=null;a._loadCount=0;a._frameHeight=0;a._frameWidth=0;a._numFrames=0;a._regX=0;a._regY=0;a.initialize=function(b){var g,d,a;if(null!=b){if(b.images&&0<(d=b.images.length)){a= -this._images=[];for(g=0;ga.length||!1==b.next?null:null==b.next||!0==b.next?h:b.next;b.frequency||(b.frequency=1);this._animations.push(h);this._data[h]=b}}}};a.getNumFrames=function(b){if(null==b)return this._frames?this._frames.length:this._numFrames;b=this._data[b];return null==b?0:b.frames.length};a.getAnimations=function(){return this._animations.slice(0)};a.getAnimation=function(b){return this._data[b]};a.getFrame=function(b){var g;return this.complete&&this._frames&&(g=this._frames[b])?g:null}; -a.getFrameBounds=function(b){return(b=this.getFrame(b))?new createjs.Rectangle(-b.regX,-b.regY,b.rect.width,b.rect.height):null};a.toString=function(){return"[SpriteSheet]"};a.clone=function(){var b=new c;b.complete=this.complete;b._animations=this._animations;b._frames=this._frames;b._images=this._images;b._data=this._data;b._frameHeight=this._frameHeight;b._frameWidth=this._frameWidth;b._numFrames=this._numFrames;b._loadCount=this._loadCount;return b};a._handleImageLoad=function(){0==--this._loadCount&& -(this._calculateFrames(),this.complete=!0,this.onComplete&&this.onComplete(),this.dispatchEvent("complete"))};a._calculateFrames=function(){if(!(this._frames||0==this._frameWidth)){this._frames=[];for(var b=0,g=this._frameWidth,d=this._frameHeight,a=0,c=this._images;a>8&255,b=b>>16&255);return null==c?"rgb("+b+","+d+","+a+")":"rgba("+b+","+d+","+a+","+c+")"};a.getHSL=function(b,d,a,c){return null==c?"hsl("+b%360+","+d+"%,"+a+"%)":"hsla("+b%360+","+d+"%,"+a+"%,"+c+")"};a.BASE_64={A:0,B:1,C:2,D:3,E:4,F:5,G:6,H:7,I:8,J:9, -K:10,L:11,M:12,N:13,O:14,P:15,Q:16,R:17,S:18,T:19,U:20,V:21,W:22,X:23,Y:24,Z:25,a:26,b:27,c:28,d:29,e:30,f:31,g:32,h:33,i:34,j:35,k:36,l:37,m:38,n:39,o:40,p:41,q:42,r:43,s:44,t:45,u:46,v:47,w:48,x:49,y:50,z:51,"0":52,1:53,2:54,3:55,4:56,5:57,6:58,7:59,8:60,9:61,"+":62,"/":63};a.STROKE_CAPS_MAP=["butt","round","square"];a.STROKE_JOINTS_MAP=["miter","round","bevel"];a._ctx=(createjs.createCanvas?createjs.createCanvas():document.createElement("canvas")).getContext("2d");a.beginCmd=new c(a._ctx.beginPath, -[],!1);a.fillCmd=new c(a._ctx.fill,[],!1);a.strokeCmd=new c(a._ctx.stroke,[],!1);b._strokeInstructions=null;b._strokeStyleInstructions=null;b._ignoreScaleStroke=!1;b._fillInstructions=null;b._instructions=null;b._oldInstructions=null;b._activeInstructions=null;b._active=!1;b._dirty=!1;b.initialize=function(){this.clear();this._ctx=a._ctx};b.isEmpty=function(){return!(this._instructions.length||this._oldInstructions.length||this._activeInstructions.length)};b.draw=function(b){this._dirty&&this._updateInstructions(); -for(var d=this._instructions,a=0,c=d.length;af&&(f*=q=-1);f>p&&(f=p);0>h&&(h*=s=-1);h>p&&(h=p);0>k&&(k*=t=-1);k>p&&(k=p);0>m&&(m*=u=-1);m>p&&(m=p);this._dirty=this._active=!0;var p=this._ctx.arcTo,r=this._ctx.lineTo;this._activeInstructions.push(new c(this._ctx.moveTo,[b+a-h,d]),new c(p,[b+a+h*s,d-h*s,b+a,d+h,h]),new c(r,[b+a,d+e-k]),new c(p,[b+a+k*t,d+e+k*t,b+a-k,d+e,k]),new c(r,[b+m,d+e]),new c(p,[b-m*u,d+e+m*u,b,d+e-m,m]),new c(r,[b,d+f]),new c(p,[b-f*q,d-f*q,b+f,d,f]),new c(this._ctx.closePath));return this};b.drawCircle= -function(b,d,a){this.arc(b,d,a,0,2*Math.PI);return this};b.drawEllipse=function(b,d,a,e){this._dirty=this._active=!0;var f=0.5522848*(a/2),h=0.5522848*(e/2),k=b+a,m=d+e;a=b+a/2;e=d+e/2;this._activeInstructions.push(new c(this._ctx.moveTo,[b,e]),new c(this._ctx.bezierCurveTo,[b,e-h,a-f,d,a,d]),new c(this._ctx.bezierCurveTo,[a+f,d,k,e-h,k,e]),new c(this._ctx.bezierCurveTo,[k,e+h,a+f,m,a,m]),new c(this._ctx.bezierCurveTo,[a-f,m,b,e+h,b,e]));return this};b.drawPolyStar=function(b,d,a,e,f,h){this._dirty= -this._active=!0;null==f&&(f=0);f=1-f;h=null==h?0:h/(180/Math.PI);var k=Math.PI/e;this._activeInstructions.push(new c(this._ctx.moveTo,[b+Math.cos(h)*a,d+Math.sin(h)*a]));for(var m=0;m>3,u=d[t];if(!u||s&3)throw"bad path data (@"+e+"): "+q;q=c[t];t||(k=m=0);h.length=0;e++;s=(s>>2&1)+2;for(t=0;t>5?-1:1,r=(r&31)<<6|p[b.charAt(e+1)];3==s&&(r=r<<6|p[b.charAt(e+2)]);r=v*r/10;t%2?k=r+=k:m=r+=m;h[t]=r;e+=s}u.apply(this,h)}return this};b.clone=function(){var b=new a;b._instructions=this._instructions.slice();b._activeInstructions=this._activeInstructions.slice(); -b._oldInstructions=this._oldInstructions.slice();this._fillInstructions&&(b._fillInstructions=this._fillInstructions.slice());this._strokeInstructions&&(b._strokeInstructions=this._strokeInstructions.slice());this._strokeStyleInstructions&&(b._strokeStyleInstructions=this._strokeStyleInstructions.slice());b._active=this._active;b._dirty=this._dirty;return b};b.toString=function(){return"[Graphics]"};b.mt=b.moveTo;b.lt=b.lineTo;b.at=b.arcTo;b.bt=b.bezierCurveTo;b.qt=b.quadraticCurveTo;b.a=b.arc;b.r= -b.rect;b.cp=b.closePath;b.c=b.clear;b.f=b.beginFill;b.lf=b.beginLinearGradientFill;b.rf=b.beginRadialGradientFill;b.bf=b.beginBitmapFill;b.ef=b.endFill;b.ss=b.setStrokeStyle;b.s=b.beginStroke;b.ls=b.beginLinearGradientStroke;b.rs=b.beginRadialGradientStroke;b.bs=b.beginBitmapStroke;b.es=b.endStroke;b.dr=b.drawRect;b.rr=b.drawRoundRect;b.rc=b.drawRoundRectComplex;b.dc=b.drawCircle;b.de=b.drawEllipse;b.dp=b.drawPolyStar;b.p=b.decodePath;b._updateInstructions=function(){this._instructions=this._oldInstructions.slice(); -this._instructions.push(a.beginCmd);this._instructions.push.apply(this._instructions,this._activeInstructions);this._fillInstructions&&this._instructions.push.apply(this._instructions,this._fillInstructions);this._strokeInstructions&&(this._strokeStyleInstructions&&this._instructions.push.apply(this._instructions,this._strokeStyleInstructions),this._instructions.push.apply(this._instructions,this._strokeInstructions),this._ignoreScaleStroke?this._instructions.push(new c(this._ctx.save,[],!1),new c(this._ctx.setTransform, -[1,0,0,1,0,0],!1),a.strokeCmd,new c(this._ctx.restore,[],!1)):this._instructions.push(a.strokeCmd))};b._newPath=function(){this._dirty&&this._updateInstructions();this._oldInstructions=this._instructions;this._activeInstructions=[];this._active=this._dirty=!1};b._setProp=function(b,a){this[b]=a};createjs.Graphics=a})();this.createjs=this.createjs||{}; -(function(){var c=function(){this.initialize()},a=c.prototype;c.suppressCrossDomainErrors=!1;c._hitTestCanvas=createjs.createCanvas?createjs.createCanvas():document.createElement("canvas");c._hitTestCanvas.width=c._hitTestCanvas.height=1;c._hitTestContext=c._hitTestCanvas.getContext("2d");c._nextCacheID=1;a.alpha=1;a.cacheCanvas=null;a.id=-1;a.mouseEnabled=!0;a.name=null;a.parent=null;a.regX=0;a.regY=0;a.rotation=0;a.scaleX=1;a.scaleY=1;a.skewX=0;a.skewY=0;a.shadow=null;a.visible=!0;a.x=0;a.y=0;a.compositeOperation= -null;a.snapToPixel=!1;a.onPress=null;a.onClick=null;a.onDoubleClick=null;a.onMouseOver=null;a.onMouseOut=null;a.onTick=null;a.filters=null;a.cacheID=0;a.mask=null;a.hitArea=null;a.cursor=null;a.addEventListener=null;a.removeEventListener=null;a.removeAllEventListeners=null;a.dispatchEvent=null;a.hasEventListener=null;a._listeners=null;createjs.EventDispatcher.initialize(a);a._cacheOffsetX=0;a._cacheOffsetY=0;a._cacheScale=1;a._cacheDataURLID=0;a._cacheDataURL=null;a._matrix=null;a.initialize=function(){this.id= -createjs.UID.get();this._matrix=new createjs.Matrix2D};a.isVisible=function(){return!(!this.visible||!(0c||c>this.children.length)return arguments[d-2];if(2b||b>this.children.length- -1)return!1;if(a=this.children[b])a.parent=null;this.children.splice(b,1);return!0};a.removeAllChildren=function(){for(var b=this.children;b.length;)b.pop().parent=null};a.getChildAt=function(b){return this.children[b]};a.getChildByName=function(b){for(var a=this.children,d=0,c=a.length;da||a>=c)){for(var e=0;e=b)return;var a=this;this._mouseOverIntervalID=setInterval(function(){a._testMouseOver()},1E3/Math.min(50,b))};a.enableDOMEvents=function(b){null==b&&(b=!0);var a,d=this._eventListeners;if(!b&&d){for(a in d)b=d[a],b.t.removeEventListener(a,b.f);this._eventListeners=null}else if(b&&!d){b=window.addEventListener?window:document;var c=this,d=this._eventListeners={};d.mouseup={t:b,f:function(b){c._handleMouseUp(b)}}; -d.mousemove={t:b,f:function(b){c._handleMouseMove(b)}};d.dblclick={t:b,f:function(b){c._handleDoubleClick(b)}};(b=this.canvas)&&(d.mousedown={t:b,f:function(b){c._handleMouseDown(b)}});for(a in d)b=d[a],b.t.addEventListener(a,b.f)}};a.clone=function(){var b=new c(null);this.cloneProps(b);return b};a.toString=function(){return"[Stage (name="+this.name+")]"};a._getPointerData=function(b){var a=this._pointerData[b];a||(a=this._pointerData[b]={x:0,y:0},null==this._primaryPointerID&&(this._primaryPointerID= -b));return a};a._handleMouseMove=function(b){b||(b=window.event);this._handlePointerMove(-1,b,b.pageX,b.pageY)};a._handlePointerMove=function(b,a,d,c){if(this.canvas){var e=this._getPointerData(b),f=e.inBounds;this._updatePointerPosition(b,d,c);if(f||e.inBounds||this.mouseMoveOutside){if(this.onMouseMove||this.hasEventListener("stagemousemove"))d=new createjs.MouseEvent("stagemousemove",e.x,e.y,this,a,b,b==this._primaryPointerID,e.rawX,e.rawY),this.onMouseMove&&this.onMouseMove(d),this.dispatchEvent(d); -if((c=e.event)&&(c.onMouseMove||c.hasEventListener("mousemove")))d=new createjs.MouseEvent("mousemove",e.x,e.y,c.target,a,b,b==this._primaryPointerID,e.rawX,e.rawY),c.onMouseMove&&c.onMouseMove(d),c.dispatchEvent(d,c.target)}}};a._updatePointerPosition=function(b,a,d){var c=this._getElementRect(this.canvas);a-=c.left;d-=c.top;var e=this.canvas.width,f=this.canvas.height;a/=(c.right-c.left)/e;d/=(c.bottom-c.top)/f;c=this._getPointerData(b);(c.inBounds=0<=a&&0<=d&&a<=e-1&&d<=f-1)?(c.x=a,c.y=d):this.mouseMoveOutside&& -(c.x=0>a?0:a>e-1?e-1:a,c.y=0>d?0:d>f-1?f-1:d);c.rawX=a;c.rawY=d;b==this._primaryPointerID&&(this.mouseX=c.x,this.mouseY=c.y,this.mouseInBounds=c.inBounds)};a._getElementRect=function(b){var a;try{a=b.getBoundingClientRect()}catch(d){a={top:b.offsetTop,left:b.offsetLeft,width:b.offsetWidth,height:b.offsetHeight}}var c=(window.pageXOffset||document.scrollLeft||0)-(document.clientLeft||document.body.clientLeft||0),e=(window.pageYOffset||document.scrollTop||0)-(document.clientTop||document.body.clientTop|| -0),f=window.getComputedStyle?getComputedStyle(b):b.currentStyle;b=parseInt(f.paddingLeft)+parseInt(f.borderLeftWidth);var h=parseInt(f.paddingTop)+parseInt(f.borderTopWidth),k=parseInt(f.paddingRight)+parseInt(f.borderRightWidth),f=parseInt(f.paddingBottom)+parseInt(f.borderBottomWidth);return{left:a.left+c+b,right:a.right+c-k,top:a.top+e+h,bottom:a.bottom+e-f}};a._handleMouseUp=function(b){this._handlePointerUp(-1,b,!1)};a._handlePointerUp=function(b,a,d){var c=this._getPointerData(b),e;if(this.onMouseMove|| -this.hasEventListener("stagemouseup"))e=new createjs.MouseEvent("stagemouseup",c.x,c.y,this,a,b,b==this._primaryPointerID,c.rawX,c.rawY),this.onMouseUp&&this.onMouseUp(e),this.dispatchEvent(e);var f=c.event;if(f&&(f.onMouseUp||f.hasEventListener("mouseup")))e=new createjs.MouseEvent("mouseup",c.x,c.y,f.target,a,b,b==this._primaryPointerID,c.rawX,c.rawY),f.onMouseUp&&f.onMouseUp(e),f.dispatchEvent(e,f.target);if((f=c.target)&&(f.onClick||f.hasEventListener("click"))&&this._getObjectsUnderPoint(c.x, -c.y,null,!0,this._mouseOverIntervalID?3:1)==f)e=new createjs.MouseEvent("click",c.x,c.y,f,a,b,b==this._primaryPointerID,c.rawX,c.rawY),f.onClick&&f.onClick(e),f.dispatchEvent(e);d?(b==this._primaryPointerID&&(this._primaryPointerID=null),delete this._pointerData[b]):c.event=c.target=null};a._handleMouseDown=function(b){this._handlePointerDown(-1,b,!1)};a._handlePointerDown=function(b,a,d,c){var e=this._getPointerData(b);null!=c&&this._updatePointerPosition(b,d,c);if(this.onMouseDown||this.hasEventListener("stagemousedown"))d= -new createjs.MouseEvent("stagemousedown",e.x,e.y,this,a,b,b==this._primaryPointerID,e.rawX,e.rawY),this.onMouseDown&&this.onMouseDown(d),this.dispatchEvent(d);if(c=this._getObjectsUnderPoint(e.x,e.y,null,this._mouseOverIntervalID?3:1))if(e.target=c,c.onPress||c.hasEventListener("mousedown"))if(d=new createjs.MouseEvent("mousedown",e.x,e.y,c,a,b,b==this._primaryPointerID,e.rawX,e.rawY),c.onPress&&c.onPress(d),c.dispatchEvent(d),d.onMouseMove||d.onMouseUp||d.hasEventListener("mousemove")||d.hasEventListener("mouseup"))e.event= -d};a._testMouseOver=function(){if(-1==this._primaryPointerID&&!(this.mouseX==this._mouseOverX&&this.mouseY==this._mouseOverY&&this.mouseInBounds)){var b=null;this.mouseInBounds&&(b=this._getObjectsUnderPoint(this.mouseX,this.mouseY,null,3),this._mouseOverX=this.mouseX,this._mouseOverY=this.mouseY);var a=this._mouseOverTarget;if(a!=b){var d=this._getPointerData(-1);if(a&&(a.onMouseOut||a.hasEventListener("mouseout"))){var c=new createjs.MouseEvent("mouseout",d.x,d.y,a,null,-1,d.rawX,d.rawY);a.onMouseOut&& -a.onMouseOut(c);a.dispatchEvent(c)}a&&(this.canvas.style.cursor="");if(b&&(b.onMouseOver||b.hasEventListener("mouseover")))c=new createjs.MouseEvent("mouseover",d.x,d.y,b,null,-1,d.rawX,d.rawY),b.onMouseOver&&b.onMouseOver(c),b.dispatchEvent(c);b&&(this.canvas.style.cursor=b.cursor||"");this._mouseOverTarget=b}}};a._handleDoubleClick=function(b){var a=this._getPointerData(-1),d=this._getObjectsUnderPoint(a.x,a.y,null,this._mouseOverIntervalID?3:1);if(d&&(d.onDoubleClick||d.hasEventListener("dblclick")))evt= -new createjs.MouseEvent("dblclick",a.x,a.y,d,b,-1,!0,a.rawX,a.rawY),d.onDoubleClick&&d.onDoubleClick(evt),d.dispatchEvent(evt)};createjs.Stage=c})();this.createjs=this.createjs||{}; -(function(){var c=function(b){this.initialize(b)},a=c.prototype=new createjs.DisplayObject;a.image=null;a.snapToPixel=!0;a.sourceRect=null;a.DisplayObject_initialize=a.initialize;a.initialize=function(b){this.DisplayObject_initialize();"string"==typeof b?(this.image=new Image,this.image.src=b):this.image=b};a.isVisible=function(){var b=this.cacheCanvas||this.image&&(this.image.complete||this.image.getContext||2<=this.image.readyState);return!(!this.visible||!(0=c){var e=b.next;this._dispatchAnimationEnd(b,a,d,e,c-1)||(e?this._goto(e):(this.paused=!0,this.currentAnimationFrame=b.frames.length-1,this.currentFrame= -b.frames[this.currentAnimationFrame]))}else this.currentFrame=b.frames[this.currentAnimationFrame];else c=this.spriteSheet.getNumFrames(),a>=c&&!this._dispatchAnimationEnd(b,a,d,c-1)&&(this.currentFrame=0)};a._dispatchAnimationEnd=function(b,a,d,c,e){var f=b?b.name:null;this.onAnimationEnd&&this.onAnimationEnd(this,f,c);this.dispatchEvent({type:"animationend",name:f,next:c});!d&&this.paused&&(this.currentAnimationFrame=e);return this.paused!=d||this._animation!=b||this.currentFrame!=a};a.DisplayObject_cloneProps= -a.cloneProps;a.cloneProps=function(b){this.DisplayObject_cloneProps(b);b.onAnimationEnd=this.onAnimationEnd;b.currentFrame=this.currentFrame;b.currentAnimation=this.currentAnimation;b.paused=this.paused;b.offset=this.offset;b._animation=this._animation;b.currentAnimationFrame=this.currentAnimationFrame};a._goto=function(b){if(isNaN(b)){var a=this.spriteSheet.getAnimation(b);a&&(this.currentAnimationFrame=0,this._animation=a,this.currentAnimation=b,this._normalizeFrame())}else this.currentAnimation= -this._animation=null,this.currentFrame=b};createjs.BitmapAnimation=c})();this.createjs=this.createjs||{}; -(function(){var c=function(b){this.initialize(b)},a=c.prototype=new createjs.DisplayObject;a.graphics=null;a.DisplayObject_initialize=a.initialize;a.initialize=function(b){this.DisplayObject_initialize();this.graphics=b?b:new createjs.Graphics};a.isVisible=function(){var b=this.cacheCanvas||this.graphics&&!this.graphics.isEmpty();return!(!this.visible||!(0this.lineWidth?(a&&this._drawTextLine(b,m,e*c),e++,m=k[p+1]):m+=k[p]+k[p+1];a&&this._drawTextLine(b,m,e*c)}e++}return e};a._drawTextLine=function(b,a,d){this.outline?b.strokeText(a,0,d,this.maxWidth||65535):b.fillText(a,0,d,this.maxWidth||65535)};createjs.Text=c})();this.createjs=this.createjs||{}; -(function(){var c=function(){throw"SpriteSheetUtils cannot be instantiated";};c._workingCanvas=createjs.createCanvas?createjs.createCanvas():document.createElement("canvas");c._workingContext=c._workingCanvas.getContext("2d");c.addFlippedFrames=function(a,b,g,d){if(b||g||d){var j=0;b&&c._flip(a,++j,!0,!1);g&&c._flip(a,++j,!1,!0);d&&c._flip(a,++j,!0,!0)}};c.extractFrame=function(a,b){isNaN(b)&&(b=a.getAnimation(b).frames[0]);var g=a.getFrame(b);if(!g)return null;var d=g.rect,j=c._workingCanvas;j.width= -d.width;j.height=d.height;c._workingContext.drawImage(g.image,d.x,d.y,d.width,d.height,0,0,d.width,d.height);g=new Image;g.src=j.toDataURL("image/png");return g};c.mergeAlpha=function(a,b,c){c||(c=createjs.createCanvas?createjs.createCanvas():document.createElement("canvas"));c.width=Math.max(b.width,a.width);c.height=Math.max(b.height,a.height);var d=c.getContext("2d");d.save();d.drawImage(a,0,0);d.globalCompositeOperation="destination-in";d.drawImage(b,0,0);d.restore();return c};c._flip=function(a, -b,g,d){for(var j=a._images,e=c._workingCanvas,f=c._workingContext,h=j.length/b,k=0;kthis.maxHeight)throw c.ERR_DIMENSIONS;for(var j=0,e=0,f=0;d.length;){var h=this._fillRow(d,j,f,a,b);h.w>e&&(e=h.w);j+=h.h;if(!h.h||!d.length){var k=createjs.createCanvas?createjs.createCanvas():document.createElement("canvas");k.width=this._getSize(e,this.maxWidth);k.height=this._getSize(j,this.maxHeight);this._data.images[f]=k;h.h||(e=j=0,f++)}}};a._getSize=function(b,a){for(var d=4;Math.pow(2,++d)f)throw c.ERR_DIMENSIONS;w>h||k+t>f||(q.img=d,q.rect=new createjs.Rectangle(k,a,t,w),m=m||w,b.splice(p,1),j[q.index]=[k,a,t,w,d,Math.round(-r+s*u.regX-e),Math.round(-v+s*u.regY-e)],k+=t)}return{w:k,h:m}};a._endBuild=function(){this.spriteSheet=new createjs.SpriteSheet(this._data); -this._data=null;this.progress=1;this.onComplete&&this.onComplete(this);this.dispatchEvent("complete")};a._run=function(){for(var b=50*Math.max(0.01,Math.min(0.99,this.timeSlice||0.3)),a=(new Date).getTime()+b,d=!1;a>(new Date).getTime();)if(!this._drawNext()){d=!0;break}if(d)this._endBuild();else{var c=this;this._timerID=setTimeout(function(){c._run()},50-b)}b=this.progress=this._index/this._frames.length;this.onProgress&&this.onProgress(this,b);this.dispatchEvent({type:"progress",progress:b})};a._drawNext= -function(){var b=this._frames[this._index],a=b.scale*this._scale,d=b.rect,c=b.sourceRect,e=this._data.images[b.img].getContext("2d");b.funct&&b.funct.apply(b.scope,b.params);e.save();e.beginPath();e.rect(d.x,d.y,d.width,d.height);e.clip();e.translate(Math.ceil(d.x-c.x*a),Math.ceil(d.y-c.y*a));e.scale(a,a);b.source.draw(e);e.restore();return++this._index=b)return this;var a=this._cloneProps(this._curQueueProps); -return this._addStep({d:b,p0:a,e:this._linearEase,p1:a})};a.to=function(b,a,d){if(isNaN(a)||0>a)a=0;return this._addStep({d:a||0,p0:this._cloneProps(this._curQueueProps),e:d,p1:this._cloneProps(this._appendQueueProps(b))})};a.call=function(b,a,d){return this._addAction({f:b,p:a?a:[this],o:d?d:this._target})};a.set=function(b,a){return this._addAction({f:this._set,o:this,p:[b,a?a:this._target]})};a.play=function(b){return this.call(b.setPaused,[!1],b)};a.pause=function(b){b||(b=this);return this.call(b.setPaused, -[!0],b)};a.setPosition=function(b,a){0>b&&(b=0);null==a&&(a=1);var d=b,c=!1;d>=this.duration&&(this.loop?d%=this.duration:(d=this.duration,c=!0));if(d==this._prevPos)return c;var e=this._prevPos;this.position=this._prevPos=d;this._prevPosition=b;if(this._target)if(c)this._updateTargetProps(null,1);else if(0d);f++);f=this._steps[f-1];this._updateTargetProps(f,(this._stepPosition=d-f.t)/f.d)}0!=a&&0c&&(j=c,e=a,f=h,h=k=-1);for(;(f+=k)!=h;){c=this._actions[f];var m=c.t;(m==e||m>j&&mthis.duration&&(this.duration=a.duration);0<=this._prevPos&&a.setPosition(this._prevPos,createjs.Tween.NONE);return a};a.removeTween=function(a){var c=arguments.length;if(1=this.duration&&this.updateDuration(),!0):!1};a.addLabel=function(a,c){this._labels[a]=c};a.setLabels=function(a){this._labels=a?a:{}};a.gotoAndPlay=function(a){this.setPaused(!1);this._goto(a)};a.gotoAndStop=function(a){this.setPaused(!0);this._goto(a)};a.setPosition=function(a,c){0>a&&(a=0);var d=this.loop?a%this.duration:a,j=!this.loop&&a>=this.duration; -if(d==this._prevPos)return j;this._prevPosition=a;this.position=this._prevPos=d;for(var e=0,f=this._tweens.length;ethis.duration&&(this.duration=tween.duration)};a.tick= -function(a){this.setPosition(this._prevPosition+a)};a.resolve=function(a){var c=parseFloat(a);isNaN(c)&&(c=this._labels[a]);return c};a.toString=function(){return"[Timeline]"};a.clone=function(){throw"Timeline can not be cloned.";};a._goto=function(a){a=this.resolve(a);null!=a&&this.setPosition(a)};createjs.Timeline=c})();this.createjs=this.createjs||{}; -(function(){var c=function(){throw"Ease cannot be instantiated.";};c.linear=function(a){return a};c.none=c.linear;c.get=function(a){-1>a&&(a=-1);1a?b*(b*-a+1+a):b*((2-b)*a+(1-a))}};c.getPowIn=function(a){return function(b){return Math.pow(b,a)}};c.getPowOut=function(a){return function(b){return 1-Math.pow(1-b,a)}};c.getPowInOut=function(a){return function(b){return 1>(b*=2)?0.5*Math.pow(b,a):1-0.5*Math.abs(Math.pow(2-b,a))}};c.quadIn=c.getPowIn(2);c.quadOut= -c.getPowOut(2);c.quadInOut=c.getPowInOut(2);c.cubicIn=c.getPowIn(3);c.cubicOut=c.getPowOut(3);c.cubicInOut=c.getPowInOut(3);c.quartIn=c.getPowIn(4);c.quartOut=c.getPowOut(4);c.quartInOut=c.getPowInOut(4);c.quintIn=c.getPowIn(5);c.quintOut=c.getPowOut(5);c.quintInOut=c.getPowInOut(5);c.sineIn=function(a){return 1-Math.cos(a*Math.PI/2)};c.sineOut=function(a){return Math.sin(a*Math.PI/2)};c.sineInOut=function(a){return-0.5*(Math.cos(Math.PI*a)-1)};c.getBackIn=function(a){return function(b){return b* -b*((a+1)*b-a)}};c.backIn=c.getBackIn(1.7);c.getBackOut=function(a){return function(b){return--b*b*((a+1)*b+a)+1}};c.backOut=c.getBackOut(1.7);c.getBackInOut=function(a){a*=1.525;return function(b){return 1>(b*=2)?0.5*b*b*((a+1)*b-a):0.5*((b-=2)*b*((a+1)*b+a)+2)}};c.backInOut=c.getBackInOut(1.7);c.circIn=function(a){return-(Math.sqrt(1-a*a)-1)};c.circOut=function(a){return Math.sqrt(1- --a*a)};c.circInOut=function(a){return 1>(a*=2)?-0.5*(Math.sqrt(1-a*a)-1):0.5*(Math.sqrt(1-(a-=2)*a)+1)};c.bounceIn= -function(a){return 1-c.bounceOut(1-a)};c.bounceOut=function(a){return a<1/2.75?7.5625*a*a:a<2/2.75?7.5625*(a-=1.5/2.75)*a+0.75:a<2.5/2.75?7.5625*(a-=2.25/2.75)*a+0.9375:7.5625*(a-=2.625/2.75)*a+0.984375};c.bounceInOut=function(a){return 0.5>a?0.5*c.bounceIn(2*a):0.5*c.bounceOut(2*a-1)+0.5};c.getElasticIn=function(a,b){var c=2*Math.PI;return function(d){if(0==d||1==d)return d;var j=b/c*Math.asin(1/a);return-(a*Math.pow(2,10*(d-=1))*Math.sin((d-j)*c/b))}};c.elasticIn=c.getElasticIn(1,0.3);c.getElasticOut= -function(a,b){var c=2*Math.PI;return function(d){if(0==d||1==d)return d;var j=b/c*Math.asin(1/a);return a*Math.pow(2,-10*d)*Math.sin((d-j)*c/b)+1}};c.elasticOut=c.getElasticOut(1,0.3);c.getElasticInOut=function(a,b){var c=2*Math.PI;return function(d){var j=b/c*Math.asin(1/a);return 1>(d*=2)?-0.5*a*Math.pow(2,10*(d-=1))*Math.sin((d-j)*c/b):0.5*a*Math.pow(2,-10*(d-=1))*Math.sin((d-j)*c/b)+1}};c.elasticInOut=c.getElasticInOut(1,0.3*1.5);createjs.Ease=c})();this.createjs=this.createjs||{}; -(function(){var c=function(){throw"MotionGuidePlugin cannot be instantiated.";};c.priority=0;c.install=function(){createjs.Tween.installPlugin(c,["guide","x","y","rotation"]);return createjs.Tween.IGNORE};c.init=function(a,b,c){a=a.target;a.hasOwnProperty("x")||(a.x=0);a.hasOwnProperty("y")||(a.y=0);a.hasOwnProperty("rotation")||(a.rotation=0);return"guide"==b?null:c};c.step=function(a,b,g,d,j){if("guide"!=b)return d;var e;d.hasOwnProperty("path")||(d.path=[]);a=d.path;d.hasOwnProperty("end")||(d.end= -1);d.hasOwnProperty("start")||(d.start=g&&g.hasOwnProperty("end")&&g.path===a?g.end:0);if(d.hasOwnProperty("_segments")&&d._length)return d;g=a.length;if(6<=g&&0==(g-2)%4){d._segments=[];d._length=0;for(b=2;b=y;y++){r=y/10;var x=1-r;u=x*x*f+2*x*r*k+r*r*p;r=x*x*h+2*x*r*m+r*r*q;v+=w[w.push(Math.sqrt((e=u-s)*e+(e=r-t)*e))-1];s=u;t=r}d._segments.push(v);d._segments.push(w);d._length+=v}}else throw"invalid 'path' data, please see documentation for valid paths"; -e=d.orient;d.orient=!1;c.calc(d,d.end,j);d.orient=e;return d};c.tween=function(a,b,g,d,j,e,f){j=j.guide;if(void 0==j||j===d.guide)return g;j.lastRatio!=e&&(c.calc(j,(j.end-j.start)*(f?j.end:e)+j.start,a.target),j.orient&&(a.target.rotation+=d.rotation||0),j.lastRatio=e);return!j.orient&&"rotation"==b?g:a.target[b]};c.calc=function(a,b,g){void 0==a._segments&&c.validate(a);void 0==g&&(g={x:0,y:0,rotation:0});var d=a._segments,j=a.path,e=a._length*b,f=d.length-2;for(b=0;e>d[b]&&bd[h]&&hg.getPosition())g=b}return null!=g?(g.interrupt(),this.remove(g),!0):!1},toString:function(){return"[Sound SoundChannel]"}};c.defaultSoundInstance=new function(){this.isDefault=!0;this.addEventListener=this.removeEventListener=this.removeAllEventListener=this.dispatchEvent=this.hasEventListener=this._listeners=this.interrupt= -this.playFailed=this.pause=this.resume=this.play=this.beginPlaying=this.cleanUp=this.stop=this.setMasterVolume=this.setVolume=this.mute=this.setMute=this.getMute=this.setPan=this.getPosition=this.setPosition=function(){return!1};this.getVolume=this.getPan=this.getDuration=function(){return 0};this.playState=c.PLAY_FAILED;this.toString=function(){return"[Sound Default Sound Instance]"}};b.init=function(){var a=navigator.userAgent;b.isFirefox=-1c.context.destination.numberOfChannels&&(c.capabilities.panning=!1);c.dynamicsCompressorNode=c.context.createDynamicsCompressor();c.dynamicsCompressorNode.connect(c.context.destination); -c.gainNode=c.context.createGainNode();c.gainNode.connect(c.dynamicsCompressorNode)}};c.prototype={capabilities:null,volume:1,context:null,dynamicsCompressorNode:null,gainNode:null,arrayBuffers:null,init:function(){this.capabilities=c.capabilities;this.arrayBuffers={};this.context=c.context;this.gainNode=c.gainNode;this.dynamicsCompressorNode=c.dynamicsCompressorNode},register:function(a){this.arrayBuffers[a]=!0;return{tag:new b(a,this)}},isPreloadStarted:function(a){return null!=this.arrayBuffers[a]}, -isPreloadComplete:function(a){return!(null==this.arrayBuffers[a]||!0==this.arrayBuffers[a])},removeFromPreload:function(a){delete this.arrayBuffers[a]},addPreloadResults:function(a,b){this.arrayBuffers[a]=b},handlePreloadComplete:function(){createjs.Sound.sendLoadComplete(this.src)},preload:function(a){this.arrayBuffers[a]=!0;a=new b(a,this);a.onload=this.handlePreloadComplete;a.load()},create:function(b){this.isPreloadStarted(b)||this.preload(b);return new a(b,this)},setVolume:function(a){this.volume= -a;this.updateVolume();return!0},updateVolume:function(){var a=createjs.Sound.masterMute?0:this.volume;a!=this.gainNode.gain.value&&(this.gainNode.gain.value=a)},getVolume:function(){return this.volume},setMute:function(){this.updateVolume();return!0},toString:function(){return"[WebAudioPlugin]"}};createjs.WebAudioPlugin=c;a.prototype={src:null,uniqueId:-1,playState:null,owner:null,offset:0,delay:0,volume:1,pan:0,duration:0,remainingLoops:0,delayTimeoutId:null,soundCompleteTimeout:null,panNode:null, -gainNode:null,sourceNode:null,muted:!1,paused:!1,startTime:0,addEventListener:null,removeEventListener:null,removeAllEventListeners:null,dispatchEvent:null,hasEventListener:null,_listeners:null,endedHandler:null,readyHandler:null,stalledHandler:null,onReady:null,onPlaySucceeded:null,onPlayInterrupted:null,onPlayFailed:null,onComplete:null,onLoop:null,sendEvent:function(a){this.dispatchEvent({target:this,type:a})},init:function(a,b){this.owner=b;this.src=a;this.panNode=this.owner.context.createPanner(); -this.gainNode=this.owner.context.createGainNode();this.gainNode.connect(this.panNode);this.owner.isPreloadComplete(this.src)&&(this.duration=1E3*this.owner.arrayBuffers[this.src].duration);this.endedHandler=createjs.proxy(this.handleSoundComplete,this);this.readyHandler=createjs.proxy(this.handleSoundReady,this);this.stalledHandler=createjs.proxy(this.handleSoundStalled,this)},cleanUp:function(){this.sourceNode&&this.sourceNode.playbackState!=this.sourceNode.UNSCHEDULED_STATE&&(this.sourceNode.noteOff(0), -this.sourceNode=null);0!=this.panNode.numberOfOutputs&&this.panNode.disconnect(0);clearTimeout(this.delayTimeoutId);clearTimeout(this.soundCompleteTimeout);null!=window.createjs&&createjs.Sound.playFinished(this)},interrupt:function(){this.playState=createjs.Sound.PLAY_INTERRUPTED;if(this.onPlayInterrupted)this.onPlayInterrupted(this);this.sendEvent("interrupted");this.cleanUp();this.paused=!1},handleSoundStalled:function(){if(null!=this.onPlayFailed)this.onPlayFailed(this);this.sendEvent("failed")}, -handleSoundReady:function(){null!=window.createjs&&(this.offset>this.getDuration()?this.playFailed():(0>this.offset&&(this.offset=0),this.playState=createjs.Sound.PLAY_SUCCEEDED,this.paused=!1,this.panNode.connect(this.owner.gainNode),this.sourceNode=this.owner.context.createBufferSource(),this.sourceNode.buffer=this.owner.arrayBuffers[this.src],this.duration=1E3*this.owner.arrayBuffers[this.src].duration,this.sourceNode.connect(this.gainNode),this.soundCompleteTimeout=setTimeout(this.endedHandler, -1E3*(this.sourceNode.buffer.duration-this.offset)),this.startTime=this.owner.context.currentTime-this.offset,this.sourceNode.noteGrainOn(0,this.offset,this.sourceNode.buffer.duration-this.offset)))},play:function(a,b,c,e,f,h){this.cleanUp();createjs.Sound.playInstance(this,a,b,c,e,f,h)},beginPlaying:function(a,b,c,e){if(null!=window.createjs&&this.src){this.offset=a/1E3;this.remainingLoops=b;this.setVolume(c);this.setPan(e);if(this.owner.isPreloadComplete(this.src))return this.handleSoundReady(null), -this.onPlaySucceeded&&this.onPlaySucceeded(this),this.sendEvent("succeeded"),1;this.playFailed()}},pause:function(){return!this.paused&&this.playState==createjs.Sound.PLAY_SUCCEEDED?(this.paused=!0,this.offset=this.owner.context.currentTime-this.startTime,this.sourceNode.noteOff(0),0!=this.panNode.numberOfOutputs&&this.panNode.disconnect(),clearTimeout(this.delayTimeoutId),clearTimeout(this.soundCompleteTimeout),!0):!1},resume:function(){if(!this.paused)return!1;this.handleSoundReady(null);return!0}, -stop:function(){this.playState=createjs.Sound.PLAY_FINISHED;this.cleanUp();this.offset=0;return!0},setVolume:function(a){if(null==Number(a))return!1;this.volume=a=Math.max(0,Math.min(1,a));this.updateVolume();return!0},updateVolume:function(){var a=this.muted?0:this.volume;return a!=this.gainNode.gain.value?(this.gainNode.gain.value=a,!0):!1},getVolume:function(){return this.volume},mute:function(a){this.muted=a;this.updateVolume();return!0},setMute:function(a){if(null==a||void 0==a)return!1;this.muted= -a;this.updateVolume();return!0},getMute:function(){return this.muted},setPan:function(a){if(this.owner.capabilities.panning)this.panNode.setPosition(a,0,-0.5),this.pan=a;else return!1},getPan:function(){return this.pan},getPosition:function(){return 1E3*(this.paused||null==this.sourceNode?this.offset:this.owner.context.currentTime-this.startTime)},setPosition:function(a){this.offset=a/1E3;this.sourceNode&&this.sourceNode.playbackState!=this.sourceNode.UNSCHEDULED_STATE&&(this.sourceNode.noteOff(0), -clearTimeout(this.soundCompleteTimeout));!this.paused&&this.playState==createjs.Sound.PLAY_SUCCEEDED&&this.handleSoundReady(null);return!0},getDuration:function(){return this.duration},handleSoundComplete:function(){this.offset=0;if(0!=this.remainingLoops){this.remainingLoops--;this.handleSoundReady(null);if(null!=this.onLoop)this.onLoop(this);this.sendEvent("loop")}else if(null!=window.createjs){this.playState=createjs.Sound.PLAY_FINISHED;if(null!=this.onComplete)this.onComplete(this);this.sendEvent("complete"); -this.cleanUp()}},playFailed:function(){if(null!=window.createjs){this.playState=createjs.Sound.PLAY_FAILED;if(null!=this.onPlayFailed)this.onPlayFailed(this);this.sendEvent("failed");this.cleanUp()}},toString:function(){return"[WebAudioPlugin SoundInstance]"}};createjs.EventDispatcher.initialize(a.prototype);b.prototype={request:null,owner:null,progress:-1,src:null,result:null,onload:null,onprogress:null,onError:null,init:function(a,b){this.src=a;this.owner=b},load:function(a){null!=a&&(this.src= -a);this.request=new XMLHttpRequest;this.request.open("GET",this.src,!0);this.request.responseType="arraybuffer";this.request.onload=createjs.proxy(this.handleLoad,this);this.request.onError=createjs.proxy(this.handleError,this);this.request.onprogress=createjs.proxy(this.handleProgress,this);this.request.send()},handleProgress:function(a,b){this.progress=a/b;if(null!=this.onprogress)this.onprogress({loaded:a,total:b,progress:this.progress})},handleLoad:function(){c.context.decodeAudioData(this.request.response, -createjs.proxy(this.handleAudioDecoded,this),createjs.proxy(this.handleError,this))},handleAudioDecoded:function(a){this.progress=1;this.result=a;this.owner.addPreloadResults(this.src,this.result);this.onload&&this.onload()},handleError:function(a){this.owner.removeFromPreload(this.src);this.onerror&&this.onerror(a)},toString:function(){return"[WebAudioPlugin WebAudioLoader]"}}})();this.createjs=this.createjs||{}; -(function(){function c(){this.init()}function a(a,b){this.init(a,b)}function b(a,b){this.init(a,b)}function g(a){this.init(a)}c.MAX_INSTANCES=30;c.capabilities=null;c.AUDIO_READY="canplaythrough";c.AUDIO_ENDED="ended";c.AUDIO_ERROR="error";c.AUDIO_STALLED="stalled";c.isSupported=function(){if(createjs.Sound.BrowserDetect.isIOS)return!1;c.generateCapabilities();return null==c.tag||null==c.capabilities?!1:!0};c.generateCapabilities=function(){if(null==c.capabilities){var a=c.tag=document.createElement("audio"); -if(null==a.canPlayType)return null;c.capabilities={panning:!0,volume:!0,tracks:-1};for(var b=createjs.Sound.SUPPORTED_EXTENSIONS,g=createjs.Sound.EXTENSION_MAP,f=0,h=b.length;f=this.getDuration()?this.playFailed(): -(0=b-1&&this.handleTagLoaded()},handleTagLoaded:function(){clearInterval(this.preloadTimer)},sendLoadedEvent:function(){this.tag.removeEventListener&&this.tag.removeEventListener("canplaythrough",this.loadedHandler);this.tag.onreadystatechange=null;createjs.Sound.sendLoadComplete(this.src)},toString:function(){return"[HTMLAudioPlugin HTMLAudioLoader]"}};g.tags={};g.get=function(a){var b=g.tags[a];null==b&&(b=g.tags[a]=new g(a));return b};g.getInstance=function(a){a= -g.tags[a];return null==a?null:a.get()};g.setInstance=function(a,b){var c=g.tags[a];return null==c?null:c.set(b)};g.prototype={src:null,length:0,available:0,tags:null,init:function(a){this.src=a;this.tags=[]},add:function(a){this.tags.push(a);this.length++;this.available++},get:function(){if(0==this.tags.length)return null;this.available=this.tags.length;var a=this.tags.pop();null==a.parentNode&&document.body.appendChild(a);return a},set:function(a){-1==this.tags.indexOf(a)&&this.tags.push(a);this.available= -this.tags.length},toString:function(){return"[HTMLAudioPlugin TagPool]"}}})();this.createjs=this.createjs||{}; -(function(){var c=function(){this.init()};c.prototype={};var a=c.prototype;c.FILE_PATTERN=/(\w+:\/{2})?((?:\w+\.){2}\w+)?(\/?[\S]+\/|\/)?([\w\-%\.]+)(?:\.)(\w+)?(\?\S+)?/i;a.loaded=!1;a.canceled=!1;a.progress=0;a._item=null;a.onProgress=null;a.onLoadStart=null;a.onComplete=null;a.onError=null;a.addEventListener=null;a.removeEventListener=null;a.removeAllEventListeners=null;a.dispatchEvent=null;a.hasEventListener=null;a._listeners=null;createjs.EventDispatcher.initialize(a);a.getItem=function(){return this._item}; -a.init=function(){};a.load=function(){};a.close=function(){};a._sendLoadStart=function(){this._isCanceled()||(this.onLoadStart&&this.onLoadStart({target:this}),this.dispatchEvent("loadStart"))};a._sendProgress=function(a){if(!this._isCanceled()){var c=null;if("number"==typeof a)this.progress=a,c={loaded:this.progress,total:1};else if(c=a,this.progress=a.loaded/a.total,isNaN(this.progress)||Infinity==this.progress)this.progress=0;c.target=this;c.type="progress";this.onProgress&&this.onProgress(c); -this.dispatchEvent(c)}};a._sendComplete=function(){this._isCanceled()||(this.onComplete&&this.onComplete({target:this}),this.dispatchEvent("complete"))};a._sendError=function(a){this._isCanceled()||(null==a&&(a={}),a.target=this,a.type="error",this.onError&&this.onError(a),this.dispatchEvent(a))};a._isCanceled=function(){return null==window.createjs||this.canceled?!0:!1};a._parseURI=function(a){return!a?null:a.match(c.FILE_PATTERN)};a.toString=function(){return"[PreloadJS AbstractLoader]"};createjs.AbstractLoader= -c})();this.createjs=this.createjs||{}; -(function(){var c=function(a){this.init(a)},a=c.prototype=new createjs.AbstractLoader;c.LOAD_TIMEOUT=8E3;c.BINARY="binary";c.CSS="css";c.IMAGE="image";c.JAVASCRIPT="javascript";c.JSON="json";c.SOUND="sound";c.SVG="svg";c.TEXT="text";c.XML="xml";a.useXHR=!0;a.stopOnError=!1;a.maintainScriptOrder=!0;a.next=null;a.onFileLoad=null;a.onFileProgress=null;a._typeCallbacks=null;a._extensionCallbacks=null;a._loadStartWasDispatched=!1;a._maxConnections=1;a._currentlyLoadingScript=null;a._currentLoads=null; -a._loadQueue=null;a._loadQueueBackup=null;a._loadItemsById=null;a._loadItemsBySrc=null;a._loadedResults=null;a._loadedRawResults=null;a._numItems=0;a._numItemsLoaded=0;a._scriptOrder=null;a._loadedScripts=null;a.init=function(a){this._numItems=this._numItemsLoaded=0;this._loadStartWasDispatched=this._paused=!1;this._currentLoads=[];this._loadQueue=[];this._loadQueueBackup=[];this._scriptOrder=[];this._loadedScripts=[];this._loadItemsById={};this._loadItemsBySrc={};this._loadedResults={};this._loadedRawResults= -{};this._typeCallbacks={};this._extensionCallbacks={};this.setUseXHR(a)};a.setUseXHR=function(a){return this.useXHR=!1!=a&&null!=window.XMLHttpRequest};a.removeAll=function(){this.remove()};a.remove=function(a){var b=null;a&&!(a instanceof Array)?b=[a]:a&&(b=a);a=!1;if(b){for(;b.length;){for(var c=b.pop(),e=this.getResult(c),f=this._loadQueue.length-1;0<=f;f--)if(h=this._loadQueue[f].getItem(),h.id==c||h.src==c){this._loadQueue.splice(f,1)[0].cancel();break}for(f=this._loadQueueBackup.length-1;0<= -f;f--)if(h=this._loadQueueBackup[f].getItem(),h.id==c||h.src==c){this._loadQueueBackup.splice(f,1)[0].cancel();break}if(e)delete this._loadItemsById[e.id],delete this._loadItemsBySrc[e.src],this._disposeItem(e);else for(var f=this._currentLoads.length-1;0<=f;f--){var h=this._currentLoads[f].getItem();if(h.id==c||h.src==c){this._currentLoads.splice(f,1)[0].cancel();a=!0;break}}}a&&this._loadNext()}else{this.close();for(c in this._loadItemsById)this._disposeItem(this._loadItemsById[c]);this.initialize(this.useXHR)}}; -a.reset=function(){this.close();for(var a in this._loadItemsById)this._disposeItem(this._loadItemsById[a]);a=[];i=0;for(l=this._loadQueueBackup.length;i=this._maxConnections);a++){var c=this._loadQueue[a];if(this.maintainScriptOrder&&c instanceof createjs.TagLoader&&c.getItem().type==createjs.LoadQueue.JAVASCRIPT){if(this._currentlyLoadingScript)continue; -this._currentlyLoadingScript=!0}this._loadQueue.splice(a,1);this._loadItem(c);a--;b--}}};a._loadItem=function(a){a.addEventListener("progress",createjs.proxy(this._handleProgress,this));a.addEventListener("complete",createjs.proxy(this._handleFileComplete,this));a.addEventListener("error",createjs.proxy(this._handleFileError,this));this._currentLoads.push(a);a.load()};a._handleFileError=function(a){var b=a.target;this._numItemsLoaded++;this._updateProgress();a={item:b.getItem()};this._sendError(a); -this.stopOnError||(this._removeLoadItem(b),this._loadNext())};a._handleFileComplete=function(a){a=a.target;var b=a.getItem();this._loadedResults[b.id]=a.getResult();a instanceof createjs.XHRLoader&&(this._loadedRawResults[b.id]=a.getResult(!0));this._removeLoadItem(a);if(this.maintainScriptOrder&&b.type==createjs.LoadQueue.JAVASCRIPT)if(a instanceof createjs.TagLoader)this._currentlyLoadingScript=!1;else{this._loadedScripts[this._scriptOrder.indexOf(b)]=b;this._checkScriptLoadOrder(a);return}this._processFinishedLoad(b)}; -a._processFinishedLoad=function(a){this._numItemsLoaded++;this._updateProgress();this._sendFileComplete(a);this._loadNext()};a._checkScriptLoadOrder=function(){for(var a=this._loadedScripts.length,b=0;b>>0;if(0===c)return-1;var e=0;1=c)return-1;for(e=0<=e?e:Math.max(c-Math.abs(e),0);e - - proton.js-render-pixelrender - - - - - -
- -
- - - - - - + + + proton.js-render-pixelrender + + + + + + +
+ +
+ + + + + + + \ No newline at end of file diff --git a/example/render/pixel/pixelrender.html b/example/render/pixel/pixelrender.html index 74d9ba3..1aa43b7 100644 --- a/example/render/pixel/pixelrender.html +++ b/example/render/pixel/pixelrender.html @@ -1,180 +1,188 @@ - - proton.js-render-pixelrender - - - - - -
- -
- - - - - - + + + proton.js-render-pixelrender + + + + + + +
+ +
+ + + + + + + \ No newline at end of file diff --git a/example/render/pixel/thousand.html b/example/render/pixel/thousand.html index cd18318..fe0e160 100644 --- a/example/render/pixel/thousand.html +++ b/example/render/pixel/thousand.html @@ -1,135 +1,141 @@ - - proton.js-render-pixelrender - - - - - -
- -
-
- - - - + + + proton.js-render-pixelrender + + + + + + +
+ +
+ + + + + \ No newline at end of file diff --git a/example/render/custom/image/bunny.png b/example/render/pixi/image/bunny.png similarity index 100% rename from example/render/custom/image/bunny.png rename to example/render/pixi/image/bunny.png diff --git a/example/render/pixi/image/eggHead.png b/example/render/pixi/image/eggHead.png new file mode 100644 index 0000000000000000000000000000000000000000..d2edbc6c65754eb1404982968b3fd8e21ca1455f GIT binary patch literal 9067 zcmV-xBb3~UP)6*g1H*(E^ukxeF?~=Oai__te&hClg^R2A%ox<{$ zzQa?q_NmFYRiw~%wD_^k`K+Vhj=YN?VdRF(^t7?RUa8D(yV-lRzdv=|e!a$asD2$| z-G;T4Hh|%P&iv2E>2}@dgxPdksHZMzoj!_O6jJy8>g1Hc>XF;pdCS_I!Q6Ja@%V)C ztI*ty$n}-*>!HYPR-T_OX8qR8jWKgKPzCh5xzu;2xnQD!99F(hp=UyJD`TJaOmwPVarJ*l)nveyrkc(zQf&x{H}VX=fOYEu(R<%hHTwyuOUe(?Hg@|ft$RKo0NG8(XdsU`NP|_VUnFu zinUdLw`-oKRF#lFipo)h{@m31$I9}LkNW$p?4qgI_$147n9E;_uvUw2*!tpmr5PYy z?xnd*JaPEE#^_>Ut6`ThNCBNxcY&xH*J_q{M{VYnrr+;$qs1>&XdJ{>pTB96KD7DV zjh@?Al`1ZG;%%NiFjt6luHbHQaX?+t>{yz9&~Jz)?E3wh?EUKM*R{iSz~DSs$oqi3 z=%kUQg=&n}^ZWkl;@HyF*FHV}|G`0Dq@Q<+*;iA-yve%g`ZA&JtE0q(S2mp0_3q>9 zK#|vslf>8En{-o3Tw_IyKVfTWV2hkhS%JRV<-EP2uCF-4MF0Q*9&}PpQveYDBmVkq zQaS$UlRvT4Tj1E7j;?lszp={w#@5lhvbbdc03ZKJL_t(|+QipUYf@nt2k_;hf)=i! zkrav&EMj;u;k1imN5Ufq&OAs+8+ow{K?p?02|L)093;dTQCD8@)bD5G(|KR9aGJ2vNz z|I)(0h&R9#WY9CETzQgQE+=J1{UdvaNz1n`evTMJwcs&4>2!pnOCb#>GalF_7F{d| z$HcX?J?(Eu7aV}Px<+X>HHSPKlw`kADxsvi-i3>cpDfw-sQmdGr903>aU8|1NXEnGyr%fMv6 zn4NOxUirRGG5s@;3of6LM_66*ipQ{;RlRBcEc9k_EZb#%%HF!>E zXwROpb;KbRg`Xy;&O`e{#U~?th<+H zUn*$YP2y)0;b9MH?$$r;bLc_D;G*gL`iYS^cTZVC5R4^QJ zRVENVBr_!!6$PFyZM)0a-w#^wyq#@)0ywHcO-GtdCr1|#-W;`-Ku7Q>_>wD+G;lb> zjA@!f8No2?jzVKoq&IN#&e%Y1&w5mzdWyzI$EI*3WVn|=LyG|= z*PtCoIwH@N8Mo?tO+z(ZU?htX8W4N)f5Bq^dEc&?mptuAA765#yS4X5|| z-dZeZR}f=07>U3G5hsm=X~2ahDU!kGBV%i8>m2ng;;7Fe=lU)|Y9{I3TU(7qBGE$Oseu8C6p&~%91Vxx zkY>FK32Q`Xx9}62Jk#DiUL2LDhO@%|bm2icf8eaGt*%BQp-`c)x{HDep(s3v=w=-j zASN7m;Oi6T#yLKx-@)nnpZpLUSxn`d2hIkjPiIA=jU z(lDohysYd3MLDe}-E%d=p`4c~#r^cdXHT}K-t~ZcR+``>615+c*M z=<_1jHydlG5t}jkS{Z1y%8|=8cVk8xNJy}l<{#F8!~iMr}W`ajQmj;Fq?H114(nUpX?d?Cg6@BkIWuPK5{i5OL1p^^`p~ zQBT8j;^<$kT_^{8AdSvxm2*G?KLmGrR_s>Jhbz5xmhA!s~iu4W|)Hzr}GZgqx0P2 z(V>ItqTq0Di;q(giOZ?fFb7|%#={zf|BQe`@dblHtQB&dI0y9aItk{mhB3rpkEc?@ z94!@Vh0vx04ae8*^F*8d2yH{ao&`<90N36 z+z)fAj*hC~Ps`Md(6m6p<+%Ee*{xR7Mjf-ffjCc4&Ro;!RSjbh4|ClAEXPaj2#kj{ z!g3;j^rM`X{uY<(h!q|^v%I~ouKiS6;b_kmnG9`$;Lwv+m&LNC#*8mbBc?_PAb3$b zu5(Vi-EP$}%lqrv+pj((4vjD{3I`bW2#&+>k8)HEFwBVsY$~WF+rsU*o^^n;O&@1H z4lL&IQl$~*gm6F@m}7KU)-FfY5QRKiI{~sFE>~Y0IQ9cN?sIS^!I_(DY9tOnvL_M= z;?N0U0SC7_Jcc#mHgn)WwAB)#ENjm79VL#Aefc1Mx;vwCG)*#z%uu3wgjfMjZQw+6O3euvRloq{(n1;3PvK$tKPR=2)tCgN<0xNU8^xaM&O4 zKLF?fFIK(lh@G;z_O=7gbo$BM%!fEI2_%!qWWb5VVm1j1tP^t_)io*J2E8^)h&iM| z9#DFF;c+47Hc~yCYHvI3J>X2w%uFWYu&@U!6-pAwk2nOUdOhxxnK-Or5S8Nxrgvz-(a~5W6iV7+Vc}s;wdpY{kApCXu!b>j zMaIXUUpe8@eW!zSzbAvqnH(*}CMdCFX_P&L3!C5T_7*&%)Mkw&q<4zwO zz+&yF`Lsiv#56Rcg;J@M$M-~`0M7(-!lYS~<3?Dc1@BQc!%9ZRFVxoyPR&DfA2^Q_ zG1B}hAh}#AC&M!}HDQbSmC!s>j8!;%Oi@Ci5Fei4V5LYS7b!A(Tx|m#IyRpDr`nqz zCuSz0k(X9h%1ecuEX#%5RDP;gES8NqqMpAzM&dXelFbhdMYIzhBTZ5MQZAR5iu1+c zk>^JQXXA#NoSu7+QO>X2w;P8kUzg@(dAN|v=ksH%LEuq1#wr|%yWvRK8vNlg!W7G2 z`FcNBWO$C%w+&#mtXpcG5yY7oEvy_~&B}a{J!AP^VA!K^jFp_O3QjA1m`68M4Pyl8 z%d_F}Bj9w{t($dmNTcN&JO%cI)jP&u5FAS7@L0f6HLW4Zfyv1Y%ks}ZFSzt<Va=^ut*x!19J$EdX#L19k2A-)ttJPf zTvGlmpFWA-7BM|ye8S3vdOXbe+hYXBt8s3%N;JpA#qwe8g7oY6!J~s6107afoE{6m zX?bC2XlP*(n#J?o5kfHxVLgsQ}2kw9_C2kSSmTc3AY!Rw#q0D;L&Y9 z5{-}e))*3`wls!rf)yGKthlDwQH!z%QXWcOBB7#!OrQi3EHy)%q$P|kk+3nG9i3%n zF&l$5PUDu0m7sM|N3v3durZbelDVMqf6jL=mu?LIq0?rg`}Lf2FSp-!hw|WeZsc5) z-X6c?@$m7>SLeG+)_h(H&IA9m)WjU_6uzC>bs>E9^3?<2^fM=a8$kKXa(E3FoGsAE z$sx`JzdcTrUr^$x6ErI?FyD7ObMRiG(|vu@(evl=-QlZIjPm{}KRB3AK4ic_m=o`z z6@q-3)4VNbyQt1(#w_&p^)289!O2+jxk|0ktX!VQZ(r@Ku0HtO`Dh;}N}SoK;EW*o z`OxTP&hzAn(_pC!oP1f+oMRBP!(JIGgWSaRZb%@BD%9OgF27e5NCKU9E}a=G{iwx*q(TZIJwnl z|BR0HiA0ZwXJ@0a!2Y1wW-yF2TlLU@gNMSQhr-#i4!;jFb6i^6$$jT0{=9JExKy06 z;pq$W0~sdG=W4aOZKWmDRdiz&IQ{QL$Ao8W4w~@%zF+_vt#%~es)qy?=B#55Fp^0s z4lwkGph2{Ts{IGf%^ZgZ6kvwIiInJYu?$X0KX57*4TmpG4+DcN%m*_}TIQr>+2Nr_z}HJItx4;0VU^md=d8o{AmGT=SsWd`;1o1ByE~gZ;R)_L)ioCm&kb|N zB2~d8tyZl9C&SQo%kn&oyBvmEik;PiZ|4{SAuelpE`qCDGbCC(9N1GpghwxPmR3i2 zC{{g+LvguMQJ+)ObF*_)olvZ5dxpuCszx;ayfihYXZcegiqi^C?vK0kw;8H}6_NQ! zBrs?;>$EPd&*$nS4tel*Vcn59ysE1NPgx^44hJx9H$bW8ATBa078dI20w){uwx|1C zsVd@_4Td(g=7C%74%fCGF2=?3ZmT}WU@+MHezVQ2qb~V;^giun@DK;#X*&hs^JlWWon&)UVxjJ>Ff}^GK+_~H-5PNEwwa1F_L2GxJ z6$ge^YtW{e2!n#V>7~mk@T^CHz`@lgbChs-V0jl}$>XMAjdE9>6ovShErwZ?R zvs!cS@>>x@8)|<7r$+Ckji-WU7s79_$6bh5wo9BWq1pC2)&gFZvXldmRe0D^NGWj0 zDRlUHI^F5SX#>Ylg7Vz8%w_57H#TI}{@j9Y<;ks3D-epc1-jkdL>A%K8XgnQTiL;eBhOKJNO&_=(#;#H3 zE8t+3oh|k7c#RDWy_62bQ|PTHjS-vzM}8|=lCxiX5y5RJ*k5PT>C?6G)v?|tT4$&+(dFzq#l#~=1)PUz)9J{^1+KRhWK6vl1w?x(= z<6n=DzxiS|-?*}qJu(M1Cc~0=kPi1|;smgMfK=jGzj=^ru`-FJ6k5ZuGN-&;cshE^ z@stY&&Bw_{Ebl22%H+(~BJaI`P2}%3#&J;OrJ!Eo^mb~X(F6s@ueouUAEb?l4aE5w z{~o0#Cne5P&(CO{?AGs&B)>_N@wKw%>$MXTponxGIBNOgL>woDGz3zL(`!;AZGvO7 zwPBd!&&ag$p9v0z2lpWlrpTHUXbuVuaiIBNEmvmpir|1SUKf)!6JLfx2S&fh-e^T+ z&XSZjbWnQJiBlQ$R}sgMcEd2=he2+|qAhWb;a2%3))0qlBc4ICI~k=BjPW9PL?-s^ znG~9Tzx*{Lhj!NtDq zwphMp4Rb24h<;tEtJ@QkYJ>cON6eC~ho^u!-V`OGI37Hh^h;Wxg!$2+ms1kRv*n0GWBl>27PPL34KaCI;{SBgFZsG_K=uB!{> z35ECz9O1cW$t=iP^eBgw;Ls$ix^W#<1r4P;k#^gZULE5VcIF&)=H@z$q#T<{sNh3}>acl;g*=)9@sS+MldbN7> z5HtvL=qBxE;y}|;F4v|Z%koWE1?myGGBfkrUW7dWDV`8KQo|0RJk&1sG~ndJ#gWpj zN>r%^(r{si%9xS#gv7;e-NU_VWe!$vj~)WYAJ6d`k?c`minuI$_wIlvo>Rx3kTlND zBba8nI>OT+Yka_zt^p?_-3(1qQj)G+MctBjX^xR*CqkUFxDT+>D>$AM8ftHf5y`ZS zGKI2Z2YVPKJS37q$lu?iTh;>haQLTH4?ogN!Ra0tNCQWwV@{f~oblx9;-O4nYLP9( zp*u+(%?f{=5Ul0T-MYH+0SDI^T1ojC37#7WZW zk~kW4OJ4YIX=M%a32_cpSF8QyMk8NafWyTpgJ%PIpaF+HTpz)Kha)Nk&eV}shkmK2 zM~*L{R8^{yIq)dm5=+~MGob+mAx?j8wYm}-=6ET@L9$MK@hoW+PJDTk0x@S7ab%F& zCoI06q*59knPXy((ya%vWz@=>G6=4rHl6LKtC2i#+-{FYXv$bap6!AYSDyI#kSTO- z>eth|goiZ+J~=&Gd2|#Gd(yF!eVeqSR*Tv|Lt#z;oHXXRdyHO6neeP%|Jrx5MwuSj z!y=B%!L_keAgymP2`Z!=oRTFRU3VfcGp}mG=E)c%(*z@<)_qBQK;epng1ciEqRXEie;tXVDfFpHlK%AKGD|Q}k+QAle((G5kWDsi|L|$;*L+L^oGr~H7t z|NhL07j-KAle~M5dG41Y3kC4A8iMR(wLquIPm<}yxoM%5XW%< zH*K@8cBL(}k;!BjFSW9xcD5X(v<_!LXHnBQ?c?g*!D*|C2E?o1#? zQUiw?8|B$2S5h`fWr$fNm^(LbKfQz;JGOW4)7v*eg75vIgRfq_x(^FEXGhN-tlz$K zXA?Qvth(@!gRnT{SSFi?9O-5J-Zybe&onI5H{euTG~2du0kX}b#kLo=7W02~YfV`2 z!1F!+;o)sa7-05Zy7ct+?VCd&2k+nT{Nkn5=;XE0=rS~Gn@r99%qgQd)MT^t=;y~A z#^=faqx?XBC~TiW)qf8a2C*t`bcK zrMYxWVaQ=+K0f~VVMx%ErPPS$3N)kjUy8F8ntQm%L0OQ+byso9RYMg=k|-#T^fJ@?T%9&K4N&^^Di+ly zHRKf0%;#!Sp1Jc%;T@4oDh>@KOpqh66&J2udvN;tb!rqx21{`cN5zq7d3p?I4Wimg z^-k+qX6^kAKa~78*Q5^gL zL(XnTX=7tXpS$yK18G4QNbigp&rR!@p>Z&;MTug{yz`HqDoI4qQ(cUJ0uMQ5w`!;}bKqP&e*E|tgy->LSn81yfdbQm2D=`o>VDJBj;T1YJxLVD zX;8zI!l7{R6Jd@|WWsLG*7Y$c2oAg85acwzc-TF4;b`E*FOJRHsM(8NK28rY3|?J) z5{AjNB$dqNv+N<9dpqQ`J-;fPa;36H#tTaY%yV$!7pK#x!@_oOPKARf7vW)OA!iuQ z`P!e#WjSCyhn#lXuh2scIlInVCeNd^*u}9euiST{lm>S$MjpYSIGN-(bFrwKLAU3F zgE)~!M$2U{7vpwLswEs(SgF$BE zIY7ibM{P3rtUvX%TAhyVd^!0<_ZZkQ6|{fg1Ri($)Og&PJcQ@TbIHVq3^hOGh^Hf- zj!O?gh@oyWjhCctn?bwkQp1^o&=U@yOiVl>hHd;akJ;_o^tAAKqWYA{(Gzi78Jw<7 zjPxZM)ARIhh-5N+7O~-VXKtR6s~D;Epwt`&cxvpgm}Hj5*ez|3iXGZ(UW zJ3(@U$33R;_sWt4jzAbMNx(v<{__2KIiy-PCV^)M7CG2Nd{2SfgG3f`$-f`=v^u9_ zWFw}Wp2zp76An`^<`WM(pcRozjhX-e002ovPDHLkV1f)8y4wH% literal 0 HcmV?d00001 diff --git a/example/render/pixi/image/flowerTop.png b/example/render/pixi/image/flowerTop.png new file mode 100644 index 0000000000000000000000000000000000000000..c5038ca5d1dc36e442bee1bf1bd453d3e04fd740 GIT binary patch literal 5424 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 o + + + + proton.js-render-custom-pixidemo + + + + + + +
space key control behaviour | A/S key control emitter | enter key control destroy +
+ Add Behaviours: Gravity + Alpha +
+
+ + + + + + + \ No newline at end of file diff --git a/example/render/pixi/pixirender.html b/example/render/pixi/pixirender.html new file mode 100644 index 0000000..65a0910 --- /dev/null +++ b/example/render/pixi/pixirender.html @@ -0,0 +1,125 @@ + + + + + proton.js-render-custom-pixi.js + + + + + + +
+ +
+ + + + + + + \ No newline at end of file diff --git a/example/render/webgl/webglrender.html b/example/render/webgl/webglrender.html index 8ded933..9e5b33d 100644 --- a/example/render/webgl/webglrender.html +++ b/example/render/webgl/webglrender.html @@ -1,121 +1,132 @@ - - proton.js-render-webglrender - - - - - -
- -
- - - - + + + proton.js-render-webglrender + + + + + + +
+ +
+ + + + + \ No newline at end of file diff --git a/example/sparks/bigfire/bigfire.html b/example/sparks/bigfire/bigfire.html index aaee901..d1d2f78 100644 --- a/example/sparks/bigfire/bigfire.html +++ b/example/sparks/bigfire/bigfire.html @@ -1,87 +1,96 @@ - - sparks-bigfire - - - - - - - - - + + + - stats.begin(); - proton.update(); - stats.end(); - } - - \ No newline at end of file diff --git a/example/sparks/bomb/bomb.html b/example/sparks/bomb/bomb.html index 023208a..fab2dba 100644 --- a/example/sparks/bomb/bomb.html +++ b/example/sparks/bomb/bomb.html @@ -1,115 +1,123 @@ - - sparks-bomb - - - - - -
- -
- - - - + + + sparks-bomb + + + + + + +
+ +
+ + + + + \ No newline at end of file diff --git a/example/sparks/drugs/drugs.html b/example/sparks/drugs/drugs.html index 7653d83..6cbddd2 100644 --- a/example/sparks/drugs/drugs.html +++ b/example/sparks/drugs/drugs.html @@ -1,99 +1,128 @@ - - sparks-drugs - - - - - -
- -
- - - - + + + sparks-drugs + + + + + + +
+ +
+ + + + + + \ No newline at end of file diff --git a/example/sparks/eightDiagrams/eightDiagrams.html b/example/sparks/eightDiagrams/eightDiagrams.html index 3e369ff..c8de5e3 100644 --- a/example/sparks/eightDiagrams/eightDiagrams.html +++ b/example/sparks/eightDiagrams/eightDiagrams.html @@ -1,132 +1,155 @@ - - eightDiagrams - - - - - -
- -
- - - - + + + eightDiagrams + + + + + + +
+ +
+ + + + + + \ No newline at end of file diff --git a/example/sparks/firework/bg.jpg b/example/sparks/firework/bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f1dfe06b6b8f2bc5cbeb1f81bdb1f5399400c872 GIT binary patch literal 88333 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

|iP_)XGY@rYe(8_Pe_ghn` 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Πz_!9^~)` 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 literal 0 HcmV?d00001 diff --git a/example/sparks/firework/fireworks.html b/example/sparks/firework/fireworks.html index ebf8bd9..7414bdd 100644 --- a/example/sparks/firework/fireworks.html +++ b/example/sparks/firework/fireworks.html @@ -11,6 +11,7 @@ margin: 0px; overflow: hidden; } + #testCanvas { background: #000000; } @@ -19,7 +20,7 @@ - + - - - + + + sparks-fireball + + + + + + + + + + + + + \ No newline at end of file diff --git a/example/sparks/sun/sun.html b/example/sparks/sun/sun.html index c72d299..e78da0d 100644 --- a/example/sparks/sun/sun.html +++ b/example/sparks/sun/sun.html @@ -1,105 +1,152 @@ - - sparks-sun - - - - - - - - - - + + + sparks-sun + + + + + + +

+ +
+ + + + + + \ No newline at end of file diff --git a/example/zone/circlezone/circlezone.html b/example/zone/circlezone/circlezone.html index a192619..f5a9713 100644 --- a/example/zone/circlezone/circlezone.html +++ b/example/zone/circlezone/circlezone.html @@ -1,104 +1,109 @@ - - proton.js-zone-dead - - - - - -
- -
- - - + + + - stats.begin(); - proton.update(); - stats.end(); - } - - \ No newline at end of file diff --git a/example/zone/imagezone/imagezone.html b/example/zone/imagezone/imagezone.html index 830afae..2730898 100644 --- a/example/zone/imagezone/imagezone.html +++ b/example/zone/imagezone/imagezone.html @@ -1,148 +1,151 @@ - - proton.js-zone-ImageZone-emitter - - - - - -
- -
- - - + + + - function tick() { - requestAnimationFrame(tick); - stats.begin(); - proton.update(); - stats.end(); - } - - \ No newline at end of file diff --git a/example/zone/linezone/bound.html b/example/zone/linezone/bound.html index 5614abe..045f899 100644 --- a/example/zone/linezone/bound.html +++ b/example/zone/linezone/bound.html @@ -28,7 +28,7 @@ - + - - - - + + + proton.js-zone-PointZone + + + + + + +
+ +
+ + + + + + \ No newline at end of file diff --git a/home.md b/home.md deleted file mode 100644 index d14e081..0000000 --- a/home.md +++ /dev/null @@ -1,107 +0,0 @@ -# Proton Documentation - -> Proton is an easily customizable html5 particle engine including six different types of renderers. - -## Proton overview - -- [Utils](#utils) -- [Behaviour](#behaviour) -- [Particle initializations](#particle-initializations) -- [Emitter](#emitter) -- [Renderer](#renderer) - -## Proton parts - -### Utils - -> all Utils are static, there is no need to create an instance - -#### Available utils - -- [Proton.Util]{@link Proton#Proton.Util} -- [Proton.DomUtil]{@link Proton#Proton.DomUtil} -- [Proton.WebGLUtil]{@link Proton#Proton.WebGLUtil} -- [Proton.CanvasUtil]{@link Proton#Proton.CanvasUtil} -- [Proton.MStack]{@link Proton#Proton.MStack} - - ---- - - - -### Behaviour - -> Note: you can add more than just one behaviour to the emitter - -Behaviours will manipulate the particles. You can add as much behaviours as you want. - -#### Example - -```js -// this example shows how to add a specific behaviour to the Proton instance -var proton = new Proton; -var emitter = new Proton.Emitter(); -var attractionBehaviour = new.Proton.Attraction(new Proton.Vector2D()) - -emitter.addBehaviour(attractionBehaviour); -emitter.emit('once'); -proton.addEmmiter(emitter); -``` - -#### Available behaviours - -- [Proton.Alpha]{@link Proton#Proton.Alpha} -- [Proton.Attraction]{@link Proton#Proton.Attraction} -- [Proton.Collision]{@link Proton#Proton.Collision} -- [Proton.Color]{@link Proton#Proton.Color} -- [Proton.CrossZone]{@link Proton#Proton.CrossZone} -- [Proton.Force]{@link Proton#Proton.Force} -- [Proton.Gravity]{@link Proton#Proton.Gravity} -- [Proton.GravityWell]{@link Proton#Proton.GravityWell} -- [Proton.RandomDrift]{@link Proton#Proton.RandomDrift} -- [Proton.Repulsion]{@link Proton#Proton.Repulsion} -- [Proton.Rotate]{@link Proton#Proton.Rotate} -- [Proton.Scale]{@link Proton#Proton.Scale} - - ---- - - - -### Particle initializations - -These settings are for manipulating the particle. Giving more mass or even another radius. - -#### Example - -```js -var emitter = new Proton.Emitter(); - -// add one or more -emitter.addInitialize(new Proton.Mass(1)); -emitter.addInitialize(new Proton.Radius(0.4, 1)); -``` - -#### Available initializations - -Todo add documentation in `./src/initialize` - - ---- - - -### Emitter - -#### Example - -#### Available emitter - - ---- - - -### Renderer - -#### Example - -#### Available renderer diff --git a/jsdoc.json b/jsdoc.json deleted file mode 100644 index 8525a50..0000000 --- a/jsdoc.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "source": { - "include": ["home.md", "src"], - "includePattern": ".+\\.js(doc)?$" - }, - "opts": { - "recurse": true, - "destination": "./build/docs", - "template": "node_modules/minami" - }, - "plugins": [ - "plugins/markdown" - ], - "markdown": { - "idInHeadings": true - } -} \ No newline at end of file diff --git a/package.json b/package.json index 2a863e0..0491fc4 100644 --- a/package.json +++ b/package.json @@ -1,13 +1,12 @@ { "name": "proton-js", - "version": "2.2.2", + "version": "3.0.5", "description": "Proton is an easily customizable html5 particle engine including six different types of renderers.", "main": "./build/proton.min.js", "scripts": { - "doc": "jsdoc -c jsdoc.json", - "doc:watch": "npm run clean && npm run doc && watch -p 'src/**/*.js' -c 'npm run doc'", - "clean": "rm -rf ./build/docs", - "build": "cd ./build && node build.js" + "start": "concurrently --names \"ROLLUP,HTTP\" -c \"bgBlue.bold,bgGreen.bold\" \"rollup -c -w -m inline\" \"serve --port 3001\"", + "page": "node ./script/makeexamplepage", + "build": "rollup -c --pub" }, "repository": { "type": "git", @@ -22,6 +21,16 @@ }, "homepage": "http://a-jie.github.io/Proton", "devDependencies": { - "minami": "^1.1.1" + "babel-core": "^6.26.0", + "babel-preset-es2015": "^6.24.1", + "babel-preset-es2015-rollup": "^3.0.0", + "babel-preset-stage-0": "^6.24.1", + "concurrently": "^3.5.1", + "rollup": "^0.54.0", + "rollup-plugin-babel": "^3.0.3", + "rollup-plugin-license": "^0.5.0", + "rollup-plugin-uglify": "^2.0.1", + "rollup-watch": "^4.3.1", + "serve": "^6.4.8" } } diff --git a/rollup.config.js b/rollup.config.js new file mode 100644 index 0000000..95eed7c --- /dev/null +++ b/rollup.config.js @@ -0,0 +1,44 @@ +// Rollup plugins +import babel from 'rollup-plugin-babel'; +import uglify from 'rollup-plugin-uglify'; +import license from 'rollup-plugin-license'; + +import pkjson from './package.json'; + +const banner = `/*! +* Proton v${pkjson.version} +* https://github.com/a-jie/Proton +* +* Copyright 2013-${new Date().getFullYear()}, A-JIE +* Licensed under the MIT license +* http://www.opensource.org/licenses/mit-license +* +*/`; + +const isDev = process.argv.splice(2).indexOf('--pub') < 0; +const plugins = isDev ? + [ + babel({ + exclude: 'node_modules/**', + }) + ] : [ + babel({ + exclude: 'node_modules/**', + }), + uglify(), + license({ banner: banner }) + ]; + +const output = isDev ? { file: 'build/proton.js' } : { file: 'build/proton.min.js' }; + + +export default { + input: 'src/index.js', + output: { + ...output, + format: 'umd', + name: 'Proton', + sourcemap: true, + }, + plugins: plugins +}; \ No newline at end of file diff --git a/script/makeexamplepage.js b/script/makeexamplepage.js new file mode 100644 index 0000000..51fc95f --- /dev/null +++ b/script/makeexamplepage.js @@ -0,0 +1,59 @@ +const fs = require("fs"); +const path = require("path"); + +const src = './example'; +const filesArr = []; + +writePage(); + +// write content to html +function writePage() { + readFiles(src); + + const page = src + '/index.html'; + fs.readFile(page, 'utf-8', (err, data) => { + if (err) throw err; + + const content = getContent(data, filesArr); + data = data.replace('<% code %>', content); + + fs.writeFile(page, data, (err) => { + if (err) throw err; + console.log('It\'s saved!'); + }); + }); +} + +function getContent(data, filesArr) { + let content = ``; + filesArr.forEach(val => { + content += `
+ `; + }); + + return content; +} + +// read all html file +function readFiles(src, parent) { + const files = fs.readdirSync(src); + + files.forEach(function (filename) { + const filepath = path.join(src, filename); + const stats = fs.statSync(filepath); + + if (stats.isFile()) { + if (/\.html$/.test(filename) && parent) { + filesArr.push({ + filename: filename, + path: filepath, + parent: parent + }); + } + } else if (stats.isDirectory()) { + readFiles(filepath, filename); + } + }); +} \ No newline at end of file diff --git a/src/behaviour/Alpha.js b/src/behaviour/Alpha.js index ead33f4..a0ad3cd 100644 --- a/src/behaviour/Alpha.js +++ b/src/behaviour/Alpha.js @@ -1,4 +1,7 @@ -(function(Proton, undefined) { +import Util from '../utils/Util'; +import Behaviour from './Behaviour'; + +export default class Alpha extends Behaviour { /** * @memberof! Proton# @@ -11,19 +14,17 @@ * @param {Number} a * @param {String} b * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=Proton.easeLinear] this behaviour's easing + * @param {String} [easing=ease.easeLinear] this behaviour's easing * * @property {String} name The Behaviour name */ - function Alpha(a, b, life, easing) { - Alpha._super_.call(this, life, easing); + constructor(a, b, life, easing) { + super(life, easing); + this.reset(a, b); this.name = "Alpha"; } - - Proton.Util.inherits(Alpha, Proton.Behaviour); - /** * Reset this behaviour's parameters * @@ -36,19 +37,16 @@ * @param {Number} a * @param {String} b * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=Proton.easeLinear] this behaviour's easing + * @param {String} [easing=ease.easeLinear] this behaviour's easing */ - Alpha.prototype.reset = function(a, b, life, easing) { - if (b == null || b == undefined) - this.same = true; - else - this.same = false; - this.a = Proton.Util.setSpanValue(Proton.Util.initValue(a, 1)); - this.b = Proton.Util.setSpanValue(b); - if (life) - Alpha._super_.prototype.reset.call(this, life, easing); - } + reset(a, b, life, easing) { + this.same = b === null || b === undefined ? true : false; + this.a = Util.setSpanValue(Util.initValue(a, 1)); + this.b = Util.setSpanValue(b); + life && super.reset(life, easing); + } + /** * Sets the new alpha value of the particle * @@ -58,13 +56,14 @@ * * @param {Proton.Particle} particle A single Proton generated particle */ - Alpha.prototype.initialize = function(particle) { + initialize(particle) { particle.transform.alphaA = this.a.getValue(); + if (this.same) particle.transform.alphaB = particle.transform.alphaA; else particle.transform.alphaB = this.b.getValue(); - }; + } /** * @method applyBehaviour @@ -75,12 +74,10 @@ * @param {Number} time the integrate time 1/ms * @param {Int} index the particle index */ - Alpha.prototype.applyBehaviour = function(particle, time, index) { - Alpha._super_.prototype.applyBehaviour.call(this, particle, time, index); + applyBehaviour(particle, time, index) { + this.calculate(particle, time, index); + particle.alpha = particle.transform.alphaB + (particle.transform.alphaA - particle.transform.alphaB) * this.energy; - if (particle.alpha < 0.001) - particle.alpha = 0; - }; - - Proton.Alpha = Alpha; -})(Proton); + if (particle.alpha < 0.001) particle.alpha = 0; + } +} diff --git a/src/behaviour/Attraction.js b/src/behaviour/Attraction.js index e1f46e3..60cb0a9 100644 --- a/src/behaviour/Attraction.js +++ b/src/behaviour/Attraction.js @@ -1,4 +1,9 @@ -(function(Proton, undefined) { +import Util from '../utils/Util'; +import Vector2D from '../math/Vector2D'; +import Behaviour from './Behaviour'; + +export default class Attraction extends Behaviour { + /** * This behaviour let the particles follow one specific Proton.Vector2D * @@ -13,7 +18,7 @@ * @param {Number} [force=100] * @param {Number} [radius=1000] * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=Proton.easeLinear] this behaviour's easing + * @param {String} [easing=ease.easeLinear] this behaviour's easing * * @property {Proton.Vector2D} targetPosition * @property {Number} radius @@ -23,21 +28,20 @@ * @property {Number} lengthSq * @property {String} name The Behaviour name */ - function Attraction(targetPosition, force, radius, life, easing) { - Attraction._super_.call(this, life, easing); + constructor(targetPosition, force, radius, life, easing) { + super(life, easing); + + this.targetPosition = Util.initValue(targetPosition, new Vector2D); + this.radius = Util.initValue(radius, 1000); + this.force = Util.initValue(this.normalizeValue(force), 100); - this.targetPosition = Proton.Util.initValue(targetPosition, new Proton.Vector2D); - this.radius = Proton.Util.initValue(radius, 1000); - this.force = Proton.Util.initValue(this.normalizeValue(force), 100); this.radiusSq = this.radius * this.radius - this.attractionForce = new Proton.Vector2D(); + this.attractionForce = new Vector2D(); this.lengthSq = 0; + this.name = "Attraction"; } - - Proton.Util.inherits(Attraction, Proton.Behaviour); - /** * Reset this behaviour's parameters * @@ -51,17 +55,18 @@ * @param {Number} [force=100] * @param {Number} [radius=1000] * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=Proton.easeLinear] this behaviour's easing + * @param {String} [easing=ease.easeLinear] this behaviour's easing */ - Attraction.prototype.reset = function(targetPosition, force, radius, life, easing) { - this.targetPosition = Proton.Util.initValue(targetPosition, new Proton.Vector2D); - this.radius = Proton.Util.initValue(radius, 1000); - this.force = Proton.Util.initValue(this.normalizeValue(force), 100); + reset(targetPosition, force, radius, life, easing) { + this.targetPosition = Util.initValue(targetPosition, new Vector2D); + this.radius = Util.initValue(radius, 1000); + this.force = Util.initValue(this.normalizeValue(force), 100); + this.radiusSq = this.radius * this.radius - this.attractionForce = new Proton.Vector2D(); + this.attractionForce = new Vector2D(); this.lengthSq = 0; - if (life) - Attraction._super_.prototype.reset.call(this, life, easing); + + life && super.reset(life, easing); } /** @@ -75,19 +80,20 @@ * @param {Number} time the integrate time 1/ms * @param {Int} index the particle index */ - Attraction.prototype.applyBehaviour = function(particle, time, index) { - Attraction._super_.prototype.applyBehaviour.call(this, particle, time, index); + applyBehaviour(particle, time, index) { + this.calculate(particle, time, index); + this.attractionForce.copy(this.targetPosition); this.attractionForce.sub(particle.p); this.lengthSq = this.attractionForce.lengthSq(); + if (this.lengthSq > 0.000004 && this.lengthSq < this.radiusSq) { this.attractionForce.normalize(); this.attractionForce.multiplyScalar(1 - this.lengthSq / this.radiusSq); this.attractionForce.multiplyScalar(this.force); + particle.a.add(this.attractionForce); } - }; - - Proton.Attraction = Attraction; -})(Proton); + } +} diff --git a/src/behaviour/Behaviour.js b/src/behaviour/Behaviour.js index 3623bec..3be07f2 100644 --- a/src/behaviour/Behaviour.js +++ b/src/behaviour/Behaviour.js @@ -1,130 +1,132 @@ -(function(Proton, undefined) { - Behaviour.id = 0; +import Proton from '../core/Proton'; +import Util from '../utils/Util'; +import ease from '../math/ease'; - /** - * The Behaviour class is the base for the other Behaviour - * - * @memberof! - - * @interface - * @alias Proton.Behaviour - * - * @param {Number} life the behaviours life - * @param {String} easing The behaviour's decaying trend, for example Proton.easeOutQuart - * - * @property {String} id The behaviours id - * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=Proton.easeLinear] this behaviour's easing - * @property {Number} age=0 How long the particle should be 'alife' - * @property {Number} energy=1 - * @property {Boolean} dead=false The particle is dead at first - * @property {Array} parents The behaviour's parents array - * @property {String} name The behaviour name - */ - function Behaviour(life, easing) { - this.id = 'Behaviour_' + Behaviour.id++; - this.life = Proton.Util.initValue(life, Infinity); - this.easing = Proton.ease.setEasingByName(easing); - this.age = 0; - this.energy = 1; - this.dead = false; - this.parents = []; - this.name = 'Behaviour'; - } +export default class Behaviour { + static id = 0; + /** + * The Behaviour class is the base for the other Behaviour + * + * @memberof! - + * @interface + * @alias Proton.Behaviour + * + * @param {Number} life the behaviours life + * @param {String} easing The behaviour's decaying trend, for example ease.easeOutQuart + * + * @property {String} id The behaviours id + * @param {Number} [life=Infinity] this behaviour's life + * @param {String} [easing=ease.easeLinear] this behaviour's easing + * @property {Number} age=0 How long the particle should be 'alife' + * @property {Number} energy=1 + * @property {Boolean} dead=false The particle is dead at first + * @property {Array} parents The behaviour's parents array + * @property {String} name The behaviour name + */ + constructor(life, easing) { - Behaviour.prototype = { - /** - * Reset this behaviour's parameters - * - * @method reset - * @memberof Proton.Behaviour - * @instance - * - * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=easeLinear] this behaviour's easing - */ - reset : function(life, easing) { - this.life = Proton.Util.initValue(life, Infinity); - this.easing = Proton.Util.initValue(easing, Proton.ease.setEasingByName(Proton.easeLinear)); - }, - /** - * Normalize a force by 1:100; - * - * @method normalizeForce - * @memberof Proton.Behaviour - * @instance - * - * @param {Proton.Vector2D} force - */ - normalizeForce : function(force) { - return force.multiplyScalar(Proton.MEASURE); - }, + this.life = Util.initValue(life, Infinity); + this.easing = ease.getEasing(easing); - /** - * Normalize a value by 1:100; - * - * @method normalizeValue - * @memberof Proton.Behaviour - * @instance - * - * @param {Number} value - */ - normalizeValue : function(value) { - return value * Proton.MEASURE; - }, + this.age = 0; + this.energy = 1; + this.dead = false; + this.parents = []; - /** - * Initialize the behaviour's parameters for all particles - * - * @method initialize - * @memberof Proton.Behaviour - * @instance - * - * @param {Proton.Particle} particle - */ - initialize : function(particle) { - }, - - /** - * Apply this behaviour for all particles every time - * - * @method applyBehaviour - * @memberof Proton.Behaviour - * @instance - * - * @param {Proton.Particle} particle - * @param {Number} time the integrate time 1/ms - * @param {Int} index the particle index - */ - applyBehaviour : function(particle, time, index) { - this.age += time; - if (this.age >= this.life || this.dead) { - this.energy = 0; - this.dead = true; - this.destroy(); - } else { - var scale = this.easing(particle.age / particle.life); - this.energy = Math.max(1 - scale, 0); - } - }, - - /** - * Destory this behaviour - * - * @method destroy - * @memberof Proton.Behaviour - * @instance - */ - destroy : function() { - var index; - var length = this.parents.length, i; - for ( i = 0; i < length; i++) { - this.parents[i].removeBehaviour(this); - } + this.id = `Behaviour_${Behaviour.id++}`; + this.name = 'Behaviour'; + } - this.parents = []; - } - }; + /** + * Reset this behaviour's parameters + * + * @method reset + * @memberof Proton.Behaviour + * @instance + * + * @param {Number} [life=Infinity] this behaviour's life + * @param {String} [easing=easeLinear] this behaviour's easing + */ + reset(life, easing) { + this.life = Util.initValue(life, Infinity); + this.easing = ease.getEasing(easing); + } - Proton.Behaviour = Behaviour; -})(Proton); + /** + * Normalize a force by 1:100; + * + * @method normalizeForce + * @memberof Proton.Behaviour + * @instance + * + * @param {Proton.Vector2D} force + */ + normalizeForce(force) { + return force.multiplyScalar(Proton.MEASURE); + } + + /** + * Normalize a value by 1:100; + * + * @method normalizeValue + * @memberof Proton.Behaviour + * @instance + * + * @param {Number} value + */ + normalizeValue(value) { + return value * Proton.MEASURE; + } + + /** + * Initialize the behaviour's parameters for all particles + * + * @method initialize + * @memberof Proton.Behaviour + * @instance + * + * @param {Proton.Particle} particle + */ + initialize(particle) {} + + /** + * Apply this behaviour for all particles every time + * + * @method applyBehaviour + * @memberof Proton.Behaviour + * @instance + * + * @param {Proton.Particle} particle + * @param {Number} time the integrate time 1/ms + * @param {Int} index the particle index + */ + calculate(particle, time, index) { + this.age += time; + + if (this.age >= this.life || this.dead) { + this.energy = 0; + this.dead = true; + this.destroy(); + } else { + const scale = this.easing(particle.age / particle.life); + this.energy = Math.max(1 - scale, 0); + } + } + + /** + * Destory this behaviour + * + * @method destroy + * @memberof Proton.Behaviour + * @instance + */ + destroy() { + let i = this.parents.length; + while (i--) { + this.parents[i].removeBehaviour(this); + } + + this.parents.length = 0; + } +} \ No newline at end of file diff --git a/src/behaviour/Collision.js b/src/behaviour/Collision.js index 27c2e43..f725b03 100644 --- a/src/behaviour/Collision.js +++ b/src/behaviour/Collision.js @@ -1,5 +1,9 @@ -(function(Proton, undefined) { - //can use Collision(emitter,true,function(){}) or Collision(); +import Util from '../utils/Util'; +import Vector2D from '../math/Vector2D'; +import Behaviour from './Behaviour'; + +//can use Collision(emitter,true,function(){}) or Collision(); +export default class Collision extends Behaviour { /** * The callback after collision @@ -21,19 +25,17 @@ * @param {Boolean} [mass=true] * @param {Callback} [callback=null] the callback after the collision * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=Proton.easeLinear] this behaviour's easing + * @param {String} [easing=ease.easeLinear] this behaviour's easing * * @property {String} name The Behaviour name */ - function Collision(emitter, mass, callback, life, easing) { - Collision._super_.call(this, life, easing); + constructor(emitter, mass, callback, life, easing) { + super(life, easing); + this.reset(emitter, mass, callback); this.name = "Collision"; } - - Proton.Util.inherits(Collision, Proton.Behaviour); - /** * Reset this behaviour's parameters * @@ -47,16 +49,17 @@ * @param {Boolean} [mass=true] * @param {Callback} [callback=null] the callback after the collision * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=Proton.easeLinear] this behaviour's easing + * @param {String} [easing=ease.easeLinear] this behaviour's easing */ - Collision.prototype.reset = function(emitter, mass, callback, life, easing) { - this.emitter = Proton.Util.initValue(emitter, null); - this.mass = Proton.Util.initValue(mass, true); - this.callback = Proton.Util.initValue(callback, null); + reset(emitter, mass, callback, life, easing) { + this.emitter = Util.initValue(emitter, null); + this.mass = Util.initValue(mass, true); + this.callback = Util.initValue(callback, null); + this.collisionPool = []; - this.delta = new Proton.Vector2D(); - if (life) - Collision._super_.prototype.reset.call(this, life, easing); + this.delta = new Vector2D(); + + life && super.reset(life, easing); } /** @@ -70,36 +73,42 @@ * @param {Number} time the integrate time 1/ms * @param {Int} index the particle index */ - Collision.prototype.applyBehaviour = function(particle, time, index) { - var newPool = this.emitter ? this.emitter.particles.slice(index) : this.pool.slice(index); - var otherParticle; - var lengthSq; - var overlap; - var averageMass1, averageMass2; - var length = newPool.length; - for (var i = 0; i < length; i++) { + applyBehaviour(particle, time, index) { + const newPool = this.emitter ? this.emitter.particles.slice(index) : this.pool.slice(index); + const length = newPool.length; + + let otherParticle; + let lengthSq; + let overlap; + let totalMass; + let averageMass1, averageMass2; + let i; + + for (i = 0; i < length; i++) { otherParticle = newPool[i]; + if (otherParticle !== particle) { this.delta.copy(otherParticle.p); this.delta.sub(particle.p); + lengthSq = this.delta.lengthSq(); - distance = particle.radius + otherParticle.radius; + const distance = particle.radius + otherParticle.radius; if (lengthSq <= distance * distance) { overlap = distance - Math.sqrt(lengthSq); overlap += 0.5; + totalMass = particle.mass + otherParticle.mass; averageMass1 = this.mass ? otherParticle.mass / totalMass : 0.5; averageMass2 = this.mass ? particle.mass / totalMass : 0.5; + particle.p.add(this.delta.clone().normalize().multiplyScalar(overlap * -averageMass1)); otherParticle.p.add(this.delta.normalize().multiplyScalar(overlap * averageMass2)); - if (this.callback) - this.callback(particle, otherParticle); + + this.callback && this.callback(particle, otherParticle); } } } - }; - - Proton.Collision = Collision; -})(Proton); + } +} diff --git a/src/behaviour/Color.js b/src/behaviour/Color.js index dcfb433..aadd6ef 100644 --- a/src/behaviour/Color.js +++ b/src/behaviour/Color.js @@ -1,113 +1,94 @@ -(function(Proton, undefined) { +import Util from '../utils/Util'; +import ColorUtil from '../utils/ColorUtil'; +import ArraySpan from '../math/ArraySpan'; +import Behaviour from './Behaviour'; - /** - * @memberof! Proton# - * @augments Proton.Behaviour - * @constructor - * @alias Proton.Color - * - * @param {Proton.ColorSpan | String} color1 the string should be a hex e.g. #000000 for black - * @param {Proton.ColorSpan | String} color2 the string should be a hex e.g. #000000 for black - * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=easeLinear] this behaviour's easing - * - * @property {String} name The Behaviour name - */ - function Color(color1, color2, life, easing) { - Color._super_.call(this, life, easing); - this.reset(color1, color2); - this.name = "Color"; - } +export default class Color extends Behaviour { + /** + * @memberof! Proton# + * @augments Proton.Behaviour + * @constructor + * @alias Proton.Color + * + * @param {Proton.ArraySpan | String} a the string should be a hex e.g. #000000 for black + * @param {Proton.ArraySpan | String} b the string should be a hex e.g. #000000 for black + * @param {Number} [life=Infinity] this behaviour's life + * @param {String} [easing=easeLinear] this behaviour's easing + * + * @property {String} name The Behaviour name + */ + constructor(a, b, life, easing) { + super(life, easing); - Proton.Util.inherits(Color, Proton.Behaviour); + this.reset(a, b); + this.name = "Color"; + } - /** - * Reset this behaviour's parameters - * - * @method reset - * @memberof Proton#Proton.Color - * @instance - * - * @param {Proton.ColorSpan | String} color1 the string should be a hex e.g. #000000 for black - * @param {Proton.ColorSpan | String} color2 the string should be a hex e.g. #000000 for black - * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=easeLinear] this behaviour's easing - */ - Color.prototype.reset = function(color1, color2, life, easing) { - this.color1 = this.setSpanValue(color1); - this.color2 = this.setSpanValue(color2); - if (life) - Color._super_.prototype.reset.call(this, life, easing); - } + /** + * Reset this behaviour's parameters + * + * @method reset + * @memberof Proton#Proton.Color + * @instance + * + * @param {Proton.ArraySpan | String} a the string should be a hex e.g. #000000 for black + * @param {Proton.ArraySpan | String} b the string should be a hex e.g. #000000 for black + * @param {Number} [life=Infinity] this behaviour's life + * @param {String} [easing=easeLinear] this behaviour's easing + */ + reset(a, b, life, easing) { + this.a = ArraySpan.createArraySpan(a); + this.b = ArraySpan.createArraySpan(b); - /** - * Initialize the behaviour's parameters for all particles - * - * @method initialize - * @memberof Proton#Proton.Color - * @instance - * - * @param {Proton.Particle} particle - */ - Color.prototype.initialize = function(particle) { - particle.color = this.color1.getValue(); - particle.transform.beginRGB = Proton.Util.hexToRGB(particle.color); + life && super.reset(life, easing); + } - if (this.color2) - particle.transform.endRGB = Proton.Util.hexToRGB(this.color2.getValue()); - }; + /** + * Initialize the behaviour's parameters for all particles + * + * @method initialize + * @memberof Proton#Proton.Color + * @instance + * + * @param {Proton.Particle} particle + */ + initialize(particle) { + particle.color = this.a.getValue(); + particle.transform.colorA = ColorUtil.hexToRGB(particle.color); - /** - * Apply this behaviour for all particles every time - * - * @method applyBehaviour - * @memberof Proton#Proton.Color - * @instance - * - * @param {Proton.Particle} particle - * @param {Number} the integrate time 1/ms - * @param {Int} the particle index - */ - Color.prototype.applyBehaviour = function(particle, time, index) { - if (this.color2) { - Color._super_.prototype.applyBehaviour.call(this, particle, time, index); - particle.transform.rgb.r = particle.transform.endRGB.r + (particle.transform.beginRGB.r - particle.transform.endRGB.r) * this.energy; - particle.transform.rgb.g = particle.transform.endRGB.g + (particle.transform.beginRGB.g - particle.transform.endRGB.g) * this.energy; - particle.transform.rgb.b = particle.transform.endRGB.b + (particle.transform.beginRGB.b - particle.transform.endRGB.b) * this.energy; - particle.transform.rgb.r = parseInt(particle.transform.rgb.r, 10); - particle.transform.rgb.g = parseInt(particle.transform.rgb.g, 10); - particle.transform.rgb.b = parseInt(particle.transform.rgb.b, 10); - } else { - particle.transform.rgb.r = particle.transform.beginRGB.r; - particle.transform.rgb.g = particle.transform.beginRGB.g; - particle.transform.rgb.b = particle.transform.beginRGB.b; + if (this.b) + particle.transform.colorB = ColorUtil.hexToRGB(this.b.getValue()); + }; - } - }; + /** + * Apply this behaviour for all particles every time + * + * @method applyBehaviour + * @memberof Proton#Proton.Color + * @instance + * + * @param {Proton.Particle} particle + * @param {Number} the integrate time 1/ms + * @param {Int} the particle index + */ + applyBehaviour(particle, time, index) { + if (this.b) { + this.calculate(particle, time, index); - /** - * Make sure that the color is an instance of Proton.ColorSpan, if not it makes a new instance - * - * @method setSpanValue - * @memberof Proton#Proton.Color - * @instance - * - * @param {Proton.Particle} particle - * @param {Number} the integrate time 1/ms - * @param {Int} the particle index - */ - Color.prototype.setSpanValue = function(color) { - if (color) { - if ( color instanceof Proton.ColorSpan) { - return color; - } else { - return new Proton.ColorSpan(color); - } - } else { - return null; - } - } + particle.transform.rgb.r = particle.transform.colorB.r + (particle.transform.colorA.r - particle.transform.colorB.r) * this.energy; + particle.transform.rgb.g = particle.transform.colorB.g + (particle.transform.colorA.g - particle.transform.colorB.g) * this.energy; + particle.transform.rgb.b = particle.transform.colorB.b + (particle.transform.colorA.b - particle.transform.colorB.b) * this.energy; - Proton.Color = Color; -})(Proton); + particle.transform.rgb.r = Math.floor(particle.transform.rgb.r); + particle.transform.rgb.g = Math.floor(particle.transform.rgb.g); + particle.transform.rgb.b = Math.floor(particle.transform.rgb.b); + + } else { + particle.transform.rgb.r = particle.transform.colorA.r; + particle.transform.rgb.g = particle.transform.colorA.g; + particle.transform.rgb.b = particle.transform.colorA.b; + } + }; + +} \ No newline at end of file diff --git a/src/behaviour/CrossZone.js b/src/behaviour/CrossZone.js index c75ce4c..040a83d 100644 --- a/src/behaviour/CrossZone.js +++ b/src/behaviour/CrossZone.js @@ -1,62 +1,62 @@ -(function(Proton, undefined) { +import Util from '../utils/Util'; +import Behaviour from './Behaviour'; - /** - * Defines what happens if the particles come to the end of the specified zone - * - * @memberof! Proton# - * @augments Proton.Behaviour - * @constructor - * @alias Proton.CrossZone - * - * @param {Proton.Zone} zone can be any Proton.Zone - e.g. Proton.RectZone() - * @param {String} [crossType=dead] what happens if the particles pass the zone - allowed strings: dead | bound | cross - * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=Proton.easeLinear] this behaviour's easing - * - * @property {String} name The Behaviour name - */ - function CrossZone(zone, crossType, life, easing) { - CrossZone._super_.call(this, life, easing); - this.reset(zone, crossType); - this.name = "CrossZone"; - } +export default class CrossZone extends Behaviour { - Proton.Util.inherits(CrossZone, Proton.Behaviour); + /** + * Defines what happens if the particles come to the end of the specified zone + * + * @memberof! Proton# + * @augments Proton.Behaviour + * @constructor + * @alias Proton.CrossZone + * + * @param {Proton.Zone} zone can be any Proton.Zone - e.g. Proton.RectZone() + * @param {String} [crossType=dead] what happens if the particles pass the zone - allowed strings: dead | bound | cross + * @param {Number} [life=Infinity] this behaviour's life + * @param {String} [easing=ease.easeLinear] this behaviour's easing + * + * @property {String} name The Behaviour name + */ + constructor(zone, crossType, life, easing) { + super(life, easing); - /** - * Reset this behaviour's parameters - * - * @method reset - * @memberof Proton#Proton.CrossZone - * @instance - * - * @param {Proton.Zone} zone can be any Proton.Zone - e.g. Proton.RectZone() - * @param {String} [crossType=dead] what happens if the particles pass the zone - allowed strings: dead | bound | cross - * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=easeLinear] this behaviour's easing - */ - CrossZone.prototype.reset = function(zone, crossType, life, easing) { - this.zone = zone; - this.zone.crossType = Proton.Util.initValue(crossType, "dead"); - if (life) - CrossZone._super_.prototype.reset.call(this, life, easing); - } + this.reset(zone, crossType); + this.name = "CrossZone"; + } - /** - * Apply this behaviour for all particles every time - * - * @method applyBehaviour - * @memberof Proton#Proton.CrossZone - * @instance - * - * @param {Proton.Particle} particle - * @param {Number} the integrate time 1/ms - * @param {Int} the particle index - */ - CrossZone.prototype.applyBehaviour = function(particle, time, index) { - CrossZone._super_.prototype.applyBehaviour.call(this, particle, time, index); - this.zone.crossing(particle); - }; + /** + * Reset this behaviour's parameters + * + * @method reset + * @memberof Proton#Proton.CrossZone + * @instance + * + * @param {Proton.Zone} zone can be any Proton.Zone - e.g. Proton.RectZone() + * @param {String} [crossType=dead] what happens if the particles pass the zone - allowed strings: dead | bound | cross + * @param {Number} [life=Infinity] this behaviour's life + * @param {String} [easing=easeLinear] this behaviour's easing + */ + reset(zone, crossType, life, easing) { + this.zone = zone; + this.zone.crossType = Util.initValue(crossType, "dead"); - Proton.CrossZone = CrossZone; -})(Proton); + life && super.reset(life, easing); + } + + /** + * Apply this behaviour for all particles every time + * + * @method applyBehaviour + * @memberof Proton#Proton.CrossZone + * @instance + * + * @param {Proton.Particle} particle + * @param {Number} the integrate time 1/ms + * @param {Int} the particle index + */ + applyBehaviour(particle, time, index) { + this.calculate(particle, time, index); + this.zone.crossing(particle); + }; +} \ No newline at end of file diff --git a/src/behaviour/Force.js b/src/behaviour/Force.js index 504cd08..b213152 100644 --- a/src/behaviour/Force.js +++ b/src/behaviour/Force.js @@ -1,4 +1,8 @@ -(function(Proton, undefined) { +import Util from '../utils/Util'; +import Vector2D from '../math/Vector2D'; +import Behaviour from './Behaviour'; + +export default class Force extends Behaviour { /** * @memberof! Proton# @@ -9,19 +13,17 @@ * @param {Number} fx * @param {Number} fy * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=Proton.easeLinear] this behaviour's easing + * @param {String} [easing=ease.easeLinear] this behaviour's easing * * @property {String} name The Behaviour name */ - function Force(fx, fy, life, easing) { - Force._super_.call(this, life, easing); - this.force = this.normalizeForce(new Proton.Vector2D(fx, fy)); + constructor(fx, fy, life, easing) { + super(life, easing); + + this.force = this.normalizeForce(new Vector2D(fx, fy)); this.name = "Force"; } - - Proton.Util.inherits(Force, Proton.Behaviour); - /** * Reset this behaviour's parameters * @@ -32,12 +34,12 @@ * @param {Number} fx * @param {Number} fy * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=Proton.easeLinear] this behaviour's easing + * @param {String} [easing=ease.easeLinear] this behaviour's easing */ - Force.prototype.reset = function(fx, fy, life, easing) { - this.force = this.normalizeForce(new Proton.Vector2D(fx, fy)); - if (life) - Force._super_.prototype.reset.call(this, life, easing); + reset(fx, fy, life, easing) { + this.force = this.normalizeForce(new Vector2D(fx, fy)); + + life && super.reset(life, easing); } /** @@ -51,11 +53,8 @@ * @param {Number} the integrate time 1/ms * @param {Int} the particle index */ - Force.prototype.applyBehaviour = function(particle, time, index) { - Force._super_.prototype.applyBehaviour.call(this, particle, time, index); + applyBehaviour(particle, time, index) { + this.calculate(particle, time, index); particle.a.add(this.force); - }; - - Proton.Force = Force; - Proton.F = Force; -})(Proton); + } +} \ No newline at end of file diff --git a/src/behaviour/Gravity.js b/src/behaviour/Gravity.js index 9a5b1b4..e013f01 100644 --- a/src/behaviour/Gravity.js +++ b/src/behaviour/Gravity.js @@ -1,4 +1,8 @@ -(function(Proton, undefined) { +import Util from '../utils/Util'; +import Vector2D from '../math/Vector2D'; +import Force from './Force'; + +export default class Gravity extends Force { /** * @memberof! Proton# @@ -8,17 +12,15 @@ * * @param {Number} g Gravity * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=Proton.easeLinear] this behaviour's easing + * @param {String} [easing=ease.easeLinear] this behaviour's easing * * @property {String} name The Behaviour name */ - function Gravity(g, life, easing) { - Gravity._super_.call(this, 0, g, life, easing); + constructor(g, life, easing) { + super(0, g, life, easing); this.name = "Gravity"; } - Proton.Util.inherits(Gravity, Proton.Force); - /** * Reset this behaviour's parameters * @@ -28,12 +30,9 @@ * * @param {Number} g Gravity * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=Proton.easeLinear] this behaviour's easing + * @param {String} [easing=ease.easeLinear] this behaviour's easing */ - Gravity.prototype.reset = function(g, life, easing) { - Gravity._super_.prototype.reset.call(this, 0, g, life, easing); + reset(g, life, easing) { + super.reset(0, g, life, easing); } - - Proton.Gravity = Gravity; - Proton.G = Gravity; -})(Proton); +} \ No newline at end of file diff --git a/src/behaviour/GravityWell.js b/src/behaviour/GravityWell.js index 7423a41..af6d841 100644 --- a/src/behaviour/GravityWell.js +++ b/src/behaviour/GravityWell.js @@ -1,76 +1,79 @@ -(function(Proton, undefined) { +import Util from '../utils/Util'; +import Vector2D from '../math/Vector2D'; +import Behaviour from './Behaviour'; + +export default class GravityWell extends Behaviour { /** * @memberof! Proton# - * @augments Proton.Behaviour + * @augments Behaviour * @constructor - * @alias Proton.GravityWell + * @alias GravityWell * - * @param {Proton.Vector2D} [centerPoint=new Proton.Vector2D] The point in the center + * @param {Vector2D} [centerPoint=new Vector2D] The point in the center * @param {Number} [force=100] The force * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=Proton.easeLinear] this behaviour's easing + * @param {String} [easing=easeLinear] this behaviour's easing * * @property {String} name The Behaviour name */ - function GravityWell(centerPoint, force, life, easing) { - GravityWell._super_.call(this, life, easing); - this.distanceVec = new Proton.Vector2D(); - this.centerPoint = Proton.Util.initValue(centerPoint, new Proton.Vector2D); - this.force = Proton.Util.initValue(this.normalizeValue(force), 100); + constructor(centerPoint, force, life, easing) { + super(life, easing); + + this.distanceVec = new Vector2D(); + this.centerPoint = Util.initValue(centerPoint, new Vector2D); + this.force = Util.initValue(this.normalizeValue(force), 100); + this.name = "GravityWell"; } - Proton.Util.inherits(GravityWell, Proton.Behaviour); - /** * Reset this behaviour's parameters * * @method reset - * @memberof Proton#Proton.GravityWell + * @memberof Proton#GravityWell * @instance * - * @param {Proton.Vector2D} [centerPoint=new Proton.Vector2D] The point in the center + * @param {Vector2D} [centerPoint=new Vector2D] The point in the center * @param {Number} [force=100] The force * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=Proton.easeLinear] this behaviour's easing + * @param {String} [easing=easeLinear] this behaviour's easing */ - GravityWell.prototype.reset = function(centerPoint, force, life, easing) { - this.distanceVec = new Proton.Vector2D(); - this.centerPoint = Proton.Util.initValue(centerPoint, new Proton.Vector2D); - this.force = Proton.Util.initValue(this.normalizeValue(force), 100); - if (life) - GravityWell._super_.prototype.reset.call(this, life, easing); + reset(centerPoint, force, life, easing) { + this.distanceVec = new Vector2D(); + this.centerPoint = Util.initValue(centerPoint, new Vector2D); + this.force = Util.initValue(this.normalizeValue(force), 100); + + life && super.reset(life, easing); }; /** * @inheritdoc */ - GravityWell.prototype.initialize = function(particle) { - + initialize(particle) { }; /** * Apply this behaviour for all particles every time * * @method applyBehaviour - * @memberof Proton#Proton.GravityWell + * @memberof Proton#GravityWell * @instance * - * @param {Proton.Particle} particle + * @param {Particle} particle * @param {Number} the integrate time 1/ms * @param {Int} the particle index */ - GravityWell.prototype.applyBehaviour = function(particle, time, index) { + applyBehaviour(particle, time, index) { this.distanceVec.set(this.centerPoint.x - particle.p.x, this.centerPoint.y - particle.p.y); - var distanceSq = this.distanceVec.lengthSq(); + const distanceSq = this.distanceVec.lengthSq(); + if (distanceSq != 0) { - var distance = this.distanceVec.length(); - var factor = (this.force * time ) / (distanceSq * distance ); + const distance = this.distanceVec.length(); + const factor = (this.force * time) / (distanceSq * distance); + particle.v.x += factor * this.distanceVec.x; particle.v.y += factor * this.distanceVec.y; } } - - Proton.GravityWell = GravityWell; -})(Proton); +} \ No newline at end of file diff --git a/src/behaviour/RandomDrift.js b/src/behaviour/RandomDrift.js index 462e136..eab8799 100644 --- a/src/behaviour/RandomDrift.js +++ b/src/behaviour/RandomDrift.js @@ -1,13 +1,18 @@ -(function(Proton, undefined) { +import Util from '../utils/Util'; +import Vector2D from '../math/Vector2D'; +import MathUtils from '../math/MathUtils'; +import Behaviour from './Behaviour'; + +export default class RandomDrift extends Behaviour { /** * @memberof! Proton# - * @augments Proton.Behaviour + * @augments Behaviour * @constructor - * @alias Proton.RandomDrift + * @alias RandomDrift * - * @param {Number} driftX X value of the new Proton.Vector2D - * @param {Number} driftY Y value of the new Proton.Vector2D + * @param {Number} driftX X value of the new Vector2D + * @param {Number} driftY Y value of the new Vector2D * @param {Number} delay How much delay the drift should have * @param {Number} [life=Infinity] this behaviour's life * @param {String} [easing=easeLinear] this behaviour's easing @@ -15,56 +20,53 @@ * @property {Number} time The time of the drift * @property {String} name The Behaviour name */ - function RandomDrift(driftX, driftY, delay, life, easing) { - RandomDrift._super_.call(this, life, easing); + constructor(driftX, driftY, delay, life, easing) { + super(life, easing); + this.reset(driftX, driftY, delay); this.time = 0; this.name = "RandomDrift"; } - Proton.Util.inherits(RandomDrift, Proton.Behaviour); - /** * Reset this behaviour's parameters * * @method reset - * @memberof Proton#Proton.RandomDrift + * @memberof Proton#RandomDrift * @instance * - * @param {Number} driftX X value of the new Proton.Vector2D - * @param {Number} driftY Y value of the new Proton.Vector2D + * @param {Number} driftX X value of the new Vector2D + * @param {Number} driftY Y value of the new Vector2D * @param {Number} delay How much delay the drift should have * @param {Number} [life=Infinity] this behaviour's life * @param {String} [easing=easeLinear] this behaviour's easing */ - RandomDrift.prototype.reset = function(driftX, driftY, delay, life, easing) { - this.panFoce = new Proton.Vector2D(driftX, driftY); + reset(driftX, driftY, delay, life, easing) { + this.panFoce = new Vector2D(driftX, driftY); this.panFoce = this.normalizeForce(this.panFoce); this.delay = delay; - if (life) - RandomDrift._super_.prototype.reset.call(this, life, easing); + + life && super.reset(life, easing); } /** * Apply this behaviour for all particles every time * * @method applyBehaviour - * @memberof Proton#Proton.RandomDrift + * @memberof Proton#RandomDrift * @instance * - * @param {Proton.Particle} particle + * @param {Particle} particle * @param {Number} time the integrate time 1/ms * @param {Int} index the particle index */ - RandomDrift.prototype.applyBehaviour = function(particle, time, index) { - RandomDrift._super_.prototype.applyBehaviour.call(this, particle, time, index); + applyBehaviour(particle, time, index) { + this.calculate(particle, time, index); this.time += time; + if (this.time >= this.delay) { - - particle.a.addXY(Proton.MathUtils.randomAToB(-this.panFoce.x, this.panFoce.x), Proton.MathUtils.randomAToB(-this.panFoce.y, this.panFoce.y)); + particle.a.addXY(MathUtils.randomAToB(-this.panFoce.x, this.panFoce.x), MathUtils.randomAToB(-this.panFoce.y, this.panFoce.y)); this.time = 0; }; - }; - - Proton.RandomDrift = RandomDrift; -})(Proton); + } +} diff --git a/src/behaviour/Repulsion.js b/src/behaviour/Repulsion.js index 4931b4f..60ea5e9 100644 --- a/src/behaviour/Repulsion.js +++ b/src/behaviour/Repulsion.js @@ -1,4 +1,7 @@ -(function(Proton, undefined) { +import Util from '../utils/Util'; +import Attraction from './Attraction'; + +export default class Repulsion extends Attraction { /** * The oppisite of Proton.Attraction - turns the force @@ -14,19 +17,18 @@ * @param {Number} [force=100] * @param {Number} [radius=1000] * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=Proton.easeLinear] this behaviour's easing + * @param {String} [easing=ease.easeLinear] this behaviour's easing * * @property {Number} force * @property {String} name The Behaviour name */ - function Repulsion(targetPosition, force, radius, life, easing) { - Repulsion._super_.call(this, targetPosition, force, radius, life, easing); + constructor(targetPosition, force, radius, life, easing) { + super(targetPosition, force, radius, life, easing); + this.force *= -1; this.name = "Repulsion"; } - Proton.Util.inherits(Repulsion, Proton.Attraction); - /** * Reset this behaviour's parameters * @@ -40,13 +42,10 @@ * @param {Number} [force=100] * @param {Number} [radius=1000] * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=Proton.easeLinear] this behaviour's easing + * @param {String} [easing=ease.easeLinear] this behaviour's easing */ - Repulsion.prototype.reset = function(targetPosition, force, radius, life, easing) { - Repulsion._super_.prototype.reset.call(this, targetPosition, force, radius, life, easing); + reset(targetPosition, force, radius, life, easing) { + super.reset(targetPosition, force, radius, life, easing); this.force *= -1; } - - Proton.Repulsion = Repulsion; -})(Proton); - +} diff --git a/src/behaviour/Rotate.js b/src/behaviour/Rotate.js index ae3592a..8d563ab 100644 --- a/src/behaviour/Rotate.js +++ b/src/behaviour/Rotate.js @@ -1,4 +1,7 @@ -(function(Proton, undefined) { +import Util from '../utils/Util'; +import Behaviour from './Behaviour'; + +export default class Rotate extends Behaviour { /** * @memberof! Proton# @@ -12,18 +15,17 @@ * @param {String} b * @param {String} [style=to] * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=Proton.easeLinear] this behaviour's easing + * @param {String} [easing=ease.easeLinear] this behaviour's easing * * @property {String} name The Behaviour name */ - function Rotate(a, b, style, life, easing) { - Rotate._super_.call(this, life, easing); + constructor(a, b, style, life, easing) { + super(life, easing); + this.reset(a, b, style); this.name = "Rotate"; } - Proton.Util.inherits(Rotate, Proton.Behaviour); - /** * Reset this behaviour's parameters * @@ -37,18 +39,16 @@ * @param {String} b * @param {String} [style=to] * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=Proton.easeLinear] this behaviour's easing + * @param {String} [easing=ease.easeLinear] this behaviour's easing */ - Rotate.prototype.reset = function(a, b, style, life, easing) { - if (b == null || b == undefined) - this.same = true; - else - this.same = false; - this.a = Proton.Util.setSpanValue(Proton.Util.initValue(a, "Velocity")); - this.b = Proton.Util.setSpanValue(Proton.Util.initValue(b, 0)); - this.style = Proton.Util.initValue(style, 'to'); - if (life) - Rotate._super_.prototype.reset.call(this, life, easing); + reset(a, b, style, life, easing) { + this.same = b === null || b === undefined ? true : false; + + this.a = Util.setSpanValue(Util.initValue(a, "Velocity")); + this.b = Util.setSpanValue(Util.initValue(b, 0)); + this.style = Util.initValue(style, 'to'); + + life && super.reset(life, easing); } /** @@ -60,11 +60,11 @@ * * @param {Proton.Particle} particle */ - Rotate.prototype.initialize = function(particle) { + initialize(particle) { particle.rotation = this.a.getValue(); particle.transform.rotationA = this.a.getValue(); - if (!this.same) - particle.transform.rotationB = this.b.getValue(); + + if (!this.same) particle.transform.rotationB = this.b.getValue(); }; /** @@ -78,8 +78,9 @@ * @param {Number} time the integrate time 1/ms * @param {Int} index the particle index */ - Rotate.prototype.applyBehaviour = function(particle, time, index) { - Rotate._super_.prototype.applyBehaviour.call(this, particle, time, index); + applyBehaviour(particle, time, index) { + this.calculate(particle, time, index); + if (!this.same) { if (this.style == 'to' || this.style == 'TO' || this.style == '_') { particle.rotation += particle.transform.rotationB + (particle.transform.rotationA - particle.transform.rotationB) * this.energy @@ -90,7 +91,6 @@ //beta... particle.rotation = particle.getDirection(); } - }; + } - Proton.Rotate = Rotate; -})(Proton); +} \ No newline at end of file diff --git a/src/behaviour/Scale.js b/src/behaviour/Scale.js index f66bd84..42e6db7 100644 --- a/src/behaviour/Scale.js +++ b/src/behaviour/Scale.js @@ -1,4 +1,7 @@ -(function(Proton, undefined) { +import Util from '../utils/Util'; +import Behaviour from './Behaviour'; + +export default class Scale extends Behaviour { /** * @memberof! Proton# @@ -11,19 +14,17 @@ * @param {Number} a * @param {String} b * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=Proton.easeLinear] this behaviour's easing + * @param {String} [easing=ease.easeLinear] this behaviour's easing * * @property {String} name The Behaviour name */ - function Scale(a, b, life, easing) { - Scale._super_.call(this, life, easing); + constructor(a, b, life, easing) { + super(life, easing); + this.reset(a, b); this.name = "Scale"; } - - Proton.Util.inherits(Scale, Proton.Behaviour); - /** * Reset this behaviour's parameters * @@ -34,17 +35,14 @@ * @param {Number} a * @param {String} b * @param {Number} [life=Infinity] this behaviour's life - * @param {String} [easing=Proton.easeLinear] this behaviour's easing + * @param {String} [easing=ease.easeLinear] this behaviour's easing */ - Scale.prototype.reset = function(a, b, life, easing) { - if (b == null || b == undefined) - this.same = true; - else - this.same = false; - this.a = Proton.Util.setSpanValue(Proton.Util.initValue(a, 1)); - this.b = Proton.Util.setSpanValue(b); - if (life) - Scale._super_.prototype.reset.call(this, life, easing); + reset(a, b, life, easing) { + this.same = b === null || b === undefined ? true : false; + this.a = Util.setSpanValue(Util.initValue(a, 1)); + this.b = Util.setSpanValue(b); + + life && super.reset(life, easing); } /** @@ -56,14 +54,10 @@ * * @param {Proton.Particle} particle */ - Scale.prototype.initialize = function(particle) { + initialize(particle) { particle.transform.scaleA = this.a.getValue(); particle.transform.oldRadius = particle.radius; - if (this.same) - particle.transform.scaleB = particle.transform.scaleA; - else - particle.transform.scaleB = this.b.getValue(); - + particle.transform.scaleB = this.same ? particle.transform.scaleA : this.b.getValue(); }; /** @@ -77,13 +71,11 @@ * @param {Number} time the integrate time 1/ms * @param {Int} index the particle index */ - Scale.prototype.applyBehaviour = function(particle, time, index) { - Scale._super_.prototype.applyBehaviour.call(this, particle, time, index); + applyBehaviour(particle, time, index) { + this.calculate(particle, time, index); particle.scale = particle.transform.scaleB + (particle.transform.scaleA - particle.transform.scaleB) * this.energy; - if (particle.scale < 0.0001) - particle.scale = 0; - particle.radius = particle.transform.oldRadius * particle.scale; - }; - Proton.Scale = Scale; -})(Proton); + if (particle.scale < 0.0001) particle.scale = 0; + particle.radius = particle.transform.oldRadius * particle.scale; + } +} \ No newline at end of file diff --git a/src/core/Particle.js b/src/core/Particle.js index 4caf7c2..bd1d367 100644 --- a/src/core/Particle.js +++ b/src/core/Particle.js @@ -1,143 +1,156 @@ -(function(Proton, undefined) { - - Particle.ID = 0; - /** - * the Particle class - * - * @class Proton.Particle - * @constructor - * @param {Object} pObj the parameters object; - * for example {life:3,dead:false} - */ - function Particle(pOBJ) { - /** - * The particle's id; - * @property id - * @type {string} - */ - this.id = 'particle_' + Particle.ID++; - this.reset(true); - Proton.Util.setPrototypeByObject(this, pOBJ); - } - - - Particle.prototype = { - getDirection : function() { - return Math.atan2(this.v.x, -this.v.y) * (180 / Math.PI); - }, - - reset : function(init) { - this.life = Infinity; - this.age = 0; - - //Energy loss - this.energy = 1; - this.dead = false; - this.sleep = false; - this.target = null; - this.sprite = null; - this.parent = null; - this.mass = 1; - this.radius = 10; - this.alpha = 1; - this.scale = 1; - this.rotation = 0; - this.color = null; - this.easing = Proton.ease.setEasingByName(Proton.easeLinear); - - if (init) { - this.transform = {} - this.p = new Proton.Vector2D(); - this.v = new Proton.Vector2D(); - this.a = new Proton.Vector2D(); - this.old = { - p : new Proton.Vector2D(), - v : new Proton.Vector2D(), - a : new Proton.Vector2D() - }; - this.behaviours = []; - } else { - Proton.Util.destroyObject(this.transform); - this.p.set(0, 0); - this.v.set(0, 0); - this.a.set(0, 0); - this.old.p.set(0, 0); - this.old.v.set(0, 0); - this.old.a.set(0, 0); - - this.removeAllBehaviours(); - } - - this.transform.rgb = { - r : 255, - g : 255, - b : 255 - } - - return this; - }, - - update : function(time, index) { - if (!this.sleep) { - this.age += time; - var length = this.behaviours.length, i; - - for ( i = 0; i < length; i++) { - if (this.behaviours[i]) - this.behaviours[i].applyBehaviour(this, time, index) - } - } else { - - } - - if (this.age >= this.life) { - this.destroy(); - } else { - var scale = this.easing(this.age / this.life); - this.energy = Math.max(1 - scale, 0); - } - - }, - - addBehaviour : function(behaviour) { - this.behaviours.push(behaviour); - if (behaviour.hasOwnProperty('parents')) - behaviour.parents.push(this); - - behaviour.initialize(this); - }, - - addBehaviours : function(behaviours) { - var length = behaviours.length, i; - - for ( i = 0; i < length; i++) { - this.addBehaviour(behaviours[i]); - } - }, - - removeBehaviour : function(behaviour) { - var index = this.behaviours.indexOf(behaviour); - if (index > -1) { - var behaviour = this.behaviours.splice(index, 1); - behaviour.parents = null; - } - }, - - removeAllBehaviours : function() { - Proton.Util.destroyArray(this.behaviours); - }, - - /** - * Destory this particle - * @method destroy - */ - destroy : function() { - this.removeAllBehaviours(); - this.energy = 0; - this.dead = true; - this.parent = null; - } - }; - - Proton.Particle = Particle; -})(Proton); +import Util from '../utils/Util'; +import ease from '../math/ease'; +import Vector2D from '../math/Vector2D'; +import MathUtils from '../math/MathUtils'; + +export default class Particle { + + static ID = 0; + + /** + * the Particle class + * + * @class Proton.Particle + * @constructor + * @param {Object} pObj the parameters object; + * for example {life:3,dead:false} + */ + constructor(pOBJ) { + /** + * The particle's id; + * @property id + * @type {string} + */ + this.id = `particle_${Particle.ID++}`; + this.reset('init'); + + pOBJ && Util.setPrototypeByObject(this, pOBJ); + } + + getDirection() { + return Math.atan2(this.v.x, -this.v.y) * MathUtils.N180_PI; + } + + reset(init) { + this.life = Infinity; + this.age = 0; + + //Energy loss + this.energy = 1; + this.dead = false; + this.sleep = false; + this.body = null; + this.sprite = null; + this.parent = null; + + this.mass = 1; + this.radius = 10; + this.alpha = 1; + this.scale = 1; + this.rotation = 0; + this.color = null; + + this.easing = ease.easeLinear; + + if (init == 'init') { + this.transform = {}; + this.p = new Vector2D(); + this.v = new Vector2D(); + this.a = new Vector2D(); + + this.old = { + p: new Vector2D(), + v: new Vector2D(), + a: new Vector2D() + }; + + this.behaviours = []; + } else { + Util.destroyObject(this.transform, 'rgb'); + + this.p.set(0, 0); + this.v.set(0, 0); + this.a.set(0, 0); + + this.old.p.set(0, 0); + this.old.v.set(0, 0); + this.old.a.set(0, 0); + + this.removeAllBehaviours(); + } + + if (!this.transform.rgb) { + this.transform.rgb = { r: 255, g: 255, b: 255 }; + } else { + this.transform.rgb.r = 255; + this.transform.rgb.g = 255; + this.transform.rgb.b = 255; + } + + return this; + } + + update(time, index) { + if (!this.sleep) { + this.age += time; + this.applyBehaviours(time, index); + } + + if (this.age < this.life) { + const scale = this.easing(this.age / this.life); + this.energy = Math.max(1 - scale, 0); + } else { + this.destroy(); + } + } + + applyBehaviours(time, index) { + const length = this.behaviours.length; + let i; + + for (i = 0; i < length; i++) { + this.behaviours[i] && this.behaviours[i].applyBehaviour(this, time, index) + } + } + + addBehaviour(behaviour) { + this.behaviours.push(behaviour); + + if (behaviour.hasOwnProperty('parents')) behaviour.parents.push(this); + behaviour.initialize(this); + } + + addBehaviours(behaviours) { + const length = behaviours.length; + let i; + + for (i = 0; i < length; i++) { + this.addBehaviour(behaviours[i]); + } + } + + removeBehaviour(behaviour) { + const index = this.behaviours.indexOf(behaviour); + + if (index > -1) { + const behaviour = this.behaviours.splice(index, 1); + behaviour.parents = null; + } + } + + removeAllBehaviours() { + Util.destroyArray(this.behaviours); + } + + /** + * Destory this particle + * @method destroy + */ + destroy() { + this.removeAllBehaviours(); + this.energy = 0; + this.dead = true; + this.parent = null; + } + +} \ No newline at end of file diff --git a/src/core/Pool.js b/src/core/Pool.js index 6755f67..5b46b08 100644 --- a/src/core/Pool.js +++ b/src/core/Pool.js @@ -1,146 +1,141 @@ -(function(Proton, undefined) { +/** + * get -> PUID :: uid-> Body + * -> cache[abc]. -> cache[abc] .pop() + * -> create [new Body| clone] + * -> return p1: { __pid: abc } + * + * expire -> cache[abc]= [p0, p1]; + * + */ +import Util from '../utils/Util'; +import PUID from '../utils/PUID'; - /** - * @memberof! Proton# - * @constructor - * @alias Proton.Pool - * - * @todo add description - * @todo add description of properties - * - * @property {Number} cID - * @property {Object} list - */ - function Pool() { - this.cID = 0; - this.list = {}; - } - - Pool.prototype = { +export default class Pool { - /** - * Creates a new class instance - * - * @todo add more documentation - * - * @method create - * @memberof Proton#Proton.Pool - * - * @param {Object|Function} obj any Object or Function - * @param {Object} [params] just add if `obj` is a function - * - * @return {Object} - */ - create: function(obj, params) { - this.cID++; - - if (typeof obj == "function") - return Proton.Util.classApply(obj, params); - else - return obj.clone(); - }, + /** + * @memberof! Proton# + * @constructor + * @alias Proton.Pool + * + * @todo add description + * @todo add description of properties + * + * @property {Number} total + * @property {Object} cache + */ + constructor(num) { + this.total = 0; + this.cache = {}; + } - /** - * @todo add description - what is in the list? - * - * @method getCount - * @memberof Proton#Proton.Pool - * - * @return {Number} - */ - getCount: function() { - var count = 0; - for (var id in this.list) - count += this.list[id].length; + /** + * @todo add description + * + * @method get + * @memberof Proton#Proton.Pool + * + * @param {Object|Function} target + * @param {Object} [params] just add if `target` is a function + * + * @return {Object} + */ + get(target, params, uid) { + let p; + uid = uid || target.__puid || PUID.getID(target); - return count++;; - }, + if (this.cache[uid] && this.cache[uid].length > 0) + p = this.cache[uid].pop(); + else + p = this.createOrClone(target, params); - /** - * @todo add description - * - * @method get - * @memberof Proton#Proton.Pool - * - * @param {Object|Function} obj - * @param {Object} [params] just add if `obj` is a function - * - * @return {Object} - */ - get: function(obj, params) { - var p, puid = obj.__puid || PUID.id(obj); - if (this.list[puid] && this.list[puid].length > 0) - p = this.list[puid].pop(); - else - p = this.create(obj, params); + p.__puid = target.__puid || uid; + return p; + } - p.__puid = obj.__puid || puid; - return p; - }, + /** + * @todo add description + * + * @method set + * @memberof Proton#Proton.Pool + * + * @param {Object} target + * + * @return {Object} + */ + expire(target) { + return this.getCache(target.__puid).push(target); + } - /** - * @todo add description - * - * @method set - * @memberof Proton#Proton.Pool - * - * @param {Object} obj - * - * @return {Object} - */ - set: function(obj) { - return this._getList(obj.__puid).push(obj); - }, + /** + * Creates a new class instance + * + * @todo add more documentation + * + * @method create + * @memberof Proton#Proton.Pool + * + * @param {Object|Function} target any Object or Function + * @param {Object} [params] just add if `target` is a function + * + * @return {Object} + */ + createOrClone(target, params) { + this.total++; - /** - * Destroyes all items from Pool.list - * - * @method destroy - * @memberof Proton#Proton.Pool - */ - destroy: function() { - for (var id in this.list) { - this.list[id].length = 0; - delete this.list[id]; - } - }, + if (this.create) { + return this.create(target, params); + } else if (typeof target == "function") { + return Util.classApply(target, params); + } else { + return target.clone(); + } + } - /** - * Returns Pool.list - * - * @method _getList - * @memberof Proton#Proton.Pool - * @private - * - * @param {Number} uid the unique id - * - * @return {Object} - */ - _getList: function(uid) { - uid = uid || "default"; - if (!this.list[uid]) this.list[uid] = []; - return this.list[uid]; - } - } + /** + * @todo add description - what is in the cache? + * + * @method getCount + * @memberof Proton#Proton.Pool + * + * @return {Number} + */ + getCount() { + let count = 0; - Proton.Pool = Pool; + for (let id in this.cache) + count += this.cache[id].length; - var PUID = { - _id: 0, - _uids: {}, - id: function(obj) { - for (var id in this._uids) { - if (this._uids[id] == obj) return id; - } + return count++;; + } - var nid = "PUID_" + (this._id++); - this._uids[nid] = obj; - return nid; - }, + /** + * Destroyes all items from Pool.cache + * + * @method destroy + * @memberof Proton#Proton.Pool + */ + destroy() { + for (let id in this.cache) { + this.cache[id].length = 0; + delete this.cache[id]; + } + } - hash: function(str) { - return; - } - } + /** + * Returns Pool.cache + * + * @method getCache + * @memberof Proton#Proton.Pool + * @private + * + * @param {Number} uid the unique id + * + * @return {Object} + */ + getCache(uid) { + uid = uid || "default"; -})(Proton); + if (!this.cache[uid]) this.cache[uid] = []; + return this.cache[uid]; + } +} \ No newline at end of file diff --git a/src/core/Proton.js b/src/core/Proton.js index 273f2a0..aeb083b 100644 --- a/src/core/Proton.js +++ b/src/core/Proton.js @@ -1,27 +1,29 @@ -(function(window, undefined) { - //the max particle number in pool - Proton.POOL_MAX = 1000; - Proton.TIME_STEP = 60; - Proton.USE_CLOCK = false; - +import Pool from './Pool'; +import Util from '../utils/Util'; +import Stats from '../debug/Stats'; +import EventDispatcher from '../events/EventDispatcher'; +import Integration from '../math/Integration'; + +export default class Proton { + + static USE_CLOCK = false; + //1:100 - Proton.MEASURE = 100; - Proton.EULER = 'euler'; - Proton.RK2 = 'runge-kutta2'; - Proton.VERLET = 'verlet'; - - Proton.PARTICLE_CREATED = 'partilcleCreated'; - Proton.PARTICLE_UPDATE = 'partilcleUpdate'; - Proton.PARTICLE_SLEEP = 'particleSleep'; - Proton.PARTICLE_DEAD = 'partilcleDead'; - Proton.PROTON_UPDATE = 'protonUpdate'; - Proton.PROTON_UPDATE_AFTER = 'protonUpdateAfter'; - Proton.EMITTER_ADDED = 'emitterAdded'; - Proton.EMITTER_REMOVED = 'emitterRemoved'; - - Proton.amendChangeTabsBug = true; - Proton.TextureBuffer = {}; - Proton.TextureCanvasBuffer = {}; + static MEASURE = 100; + static EULER = 'euler'; + static RK2 = 'runge-kutta2'; + + static PARTICLE_CREATED = 'PARTICLE_CREATED'; + static PARTICLE_UPDATE = 'PARTICLE_UPDATE'; + static PARTICLE_SLEEP = 'PARTICLE_SLEEP'; + static PARTICLE_DEAD = 'PARTICLE_DEAD'; + static PROTON_UPDATE = 'PROTON_UPDATE'; + static PROTON_UPDATE_AFTER = 'PROTON_UPDATE_AFTER'; + static EMITTER_ADDED = 'EMITTER_ADDED'; + static EMITTER_REMOVED = 'EMITTER_REMOVED'; + + static amendChangeTabsBug = true; + static bindEmtterEvent = false; /** * The constructor to add emitters @@ -40,148 +42,167 @@ * @property {Number} time The active time * @property {Number} oldtime The old time */ - function Proton(proParticleCount, integrationType) { - this.integrationType = Proton.Util.initValue(integrationType, Proton.EULER); + constructor(integrationType) { + this.emitters = []; this.renderers = []; + this.time = 0; this.oldTime = 0; + this.elapsed = 0; + + this.stats = new Stats(this); + this.pool = new Pool(80); + + this.integrationType = Util.initValue(integrationType, Proton.EULER); + this.integrator = new Integration(this.integrationType); + } + + /** + * add a type of Renderer + * + * @method addRenderer + * @memberof Proton + * @instance + * + * @param {Renderer} render + */ + addRenderer(render) { + render.init(this); + this.renderers.push(render); + } + + /** + * @name add a type of Renderer + * + * @method addRenderer + * @param {Renderer} render + */ + removeRenderer(render) { + const index = this.renderers.indexOf(render); + this.renderers.splice(index, 1); + render.remove(this); + } + + /** + * add the Emitter + * + * @method addEmitter + * @memberof Proton + * @instance + * + * @param {Emitter} emitter + */ + addEmitter(emitter) { + this.emitters.push(emitter); + emitter.parent = this; + + this.dispatchEvent(Proton.EMITTER_ADDED, emitter); + } + + /** + * Removes an Emitter + * + * @method removeEmitter + * @memberof Proton + * @instance + * + * @param {Proton.Emitter} emitter + */ + removeEmitter(emitter) { + const index = this.emitters.indexOf(emitter); + this.emitters.splice(index, 1); + emitter.parent = null; + + this.dispatchEvent(Proton.EMITTER_REMOVED, emitter); + } + + /** + * Updates all added emitters + * + * @method update + * @memberof Proton + * @instance + */ + update() { + this.dispatchEvent(Proton.PROTON_UPDATE); + + if (Proton.USE_CLOCK) { + if (!this.oldTime) this.oldTime = (new Date()).getTime(); + + let time = new Date().getTime(); + this.elapsed = (time - this.oldTime) / 1000; + Proton.amendChangeTabsBug && this.amendChangeTabsBug(); - Proton.pool = new Proton.Pool(100); - Proton.integrator = new Proton.NumericalIntegration(this.integrationType); + this.oldTime = time; + } else { + this.elapsed = 0.0167; + } + + // emitter update + if (this.elapsed > 0) this.emittersUpdate(this.elapsed); + + this.dispatchEvent(Proton.PROTON_UPDATE_AFTER); } + emittersUpdate(elapsed) { + let i = this.emitters.length; + while (i--) this.emitters[i].update(elapsed); + } - Proton.prototype = { - /** - * add a type of Renderer - * - * @method addRender - * @memberof Proton - * @instance - * - * @param {Renderer} render - */ - addRender: function(render) { - render.proton = this; - this.renderers.push(render.proton); - }, - - /** - * add the Emitter - * - * @method addEmitter - * @memberof Proton - * @instance - * - * @param {Emitter} emitter - */ - addEmitter: function(emitter) { - this.emitters.push(emitter); - emitter.parent = this; - - this.dispatchEvent(Proton.EMITTER_ADDED, emitter); - }, - - /** - * Removes an Emitter - * - * @method removeEmitter - * @memberof Proton - * @instance - * - * @param {Proton.Emitter} emitter - */ - removeEmitter: function(emitter) { - var index = this.emitters.indexOf(emitter); - this.emitters.splice(index, 1); - emitter.parent = null; - - this.dispatchEvent(Proton.EMITTER_REMOVED, emitter); - }, - - /** - * Updates all added emitters - * - * @method update - * @memberof Proton - * @instance - */ - update: function() { - this.dispatchEvent(Proton.PROTON_UPDATE); - - if (Proton.USE_CLOCK) { - if (!this.oldTime) - this.oldTime = new Date().getTime(); - - var time = new Date().getTime(); - this.elapsed = (time - this.oldTime) / 1000; - if (Proton.amendChangeTabsBug) - this.amendChangeTabsBug(); - this.oldTime = time; - } else { - this.elapsed = 0.0167; - } - - if (this.elapsed > 0) { - for (var i = 0; i < this.emitters.length; i++) { - this.emitters[i].update(this.elapsed); - } - } - - this.dispatchEvent(Proton.PROTON_UPDATE_AFTER); - }, - - /** - * @todo add description - * - * @method amendChangeTabsBug - * @memberof Proton - * @instance - */ - amendChangeTabsBug: function() { - if (this.elapsed > .5) { - this.oldTime = new Date().getTime(); - this.elapsed = 0; - } - }, - - /** - * Counts all particles from all emitters - * - * @method getCount - * @memberof Proton - * @instance - */ - getCount: function() { - var total = 0; - var length = this.emitters.length; - for (var i = 0; i < length; i++) { - total += this.emitters[i].particles.length; - } - return total; - }, - - /** - * Destroys everything related to this Proton instance. This includes all emitters, and all properties - * - * @method destroy - * @memberof Proton - * @instance - */ - destroy: function() { - var length = this.emitters.length; - for (var i = 0; i < length; i++) { - this.emitters[i].destroy(); - delete this.emitters[i]; - } - - this.emitters = []; - this.time = 0; - this.oldTime = 0; - Proton.pool.release(); + /** + * @todo add description + * + * @method amendChangeTabsBug + * @memberof Proton + * @instance + */ + amendChangeTabsBug() { + if (this.elapsed > .5) { + this.oldTime = (new Date()).getTime(); + this.elapsed = 0; } - }; + } + + /** + * Counts all particles from all emitters + * + * @method getCount + * @memberof Proton + * @instance + */ + getCount() { + let total = 0; + let i = this.emitters.length; + + while (i--) total += this.emitters[i].particles.length; + return total; + } + + getAllParticles() { + let particles = []; + let i = this.emitters.length; + + while (i--) particles = particles.concat(this.emitters[i].particles); + return particles; + } + + /** + * Destroys everything related to this Proton instance. This includes all emitters, and all properties + * + * @method destroy + * @memberof Proton + * @instance + */ + destroy() { + Util.destroy(this.renderers, this.getAllParticles()); + Util.destroy(this.emitters); + + this.time = 0; + this.oldTime = 0; + + this.pool.destroy(); + } +} - window.Proton = Proton; -})(window); +EventDispatcher.bind(Proton); \ No newline at end of file diff --git a/src/debug/Debug.js b/src/debug/Debug.js index bddaddd..9e86df1 100644 --- a/src/debug/Debug.js +++ b/src/debug/Debug.js @@ -1,84 +1,71 @@ -(function(Proton, undefined) { - var Debug = Debug || { - addEventListener : function(proton, fun) { - proton.addEventListener(Proton.PROTON_UPDATE, function() { - fun(); - }); - }, +import Util from '../utils/Util'; +import ColorUtil from '../utils/ColorUtil'; +import MathUtils from '../math/MathUtils'; +import CircleZone from '../zone/CircleZone'; +import PointZone from '../zone/PointZone'; +import LineZone from '../zone/LineZone'; +import RectZone from '../zone/RectZone'; - setStyle : function(c) { - var color = c || '#ff0000'; - var rgb = Proton.Util.hexToRGB(color); - var style = 'rgba(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ',' + 0.5 + ')'; - - return style; - }, - - drawZone : function(proton, canvas, zone, clear) { - var context = canvas.getContext('2d'); - var style = this.setStyle(); - - this.addEventListener(proton, function() { - if (clear) - context.clearRect(0, 0, canvas.width, canvas.height); +export default { + addEventListener(proton, fun) { + proton.addEventListener("PROTON_UPDATE_AFTER", () => fun()); + }, - if ( zone instanceof Proton.PointZone) { - context.beginPath(); - context.fillStyle = style; - context.arc(zone.x, zone.y, 10, 0, Math.PI * 2, true); - context.fill(); - context.closePath(); - } else if ( zone instanceof Proton.LineZone) { - context.beginPath(); - context.strokeStyle = style; - context.moveTo(zone.x1, zone.y1); - context.lineTo(zone.x2, zone.y2); - context.stroke(); - context.closePath(); - } else if ( zone instanceof Proton.RectZone) { - context.beginPath(); - context.strokeStyle = style; - context.drawRect(zone.x, zone.y, zone.width, zone.height); - context.stroke(); - context.closePath(); - } else if ( zone instanceof Proton.CircleZone) { - context.beginPath(); - context.strokeStyle = style; - context.arc(zone.x, zone.y, zone.radius, 0, Math.PI * 2, true); - context.stroke(); - context.closePath(); - } - }); - }, + getStyle(color) { + const rgb = ColorUtil.hexToRGB(color || '#ff0000'); + return `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, 0.5)`; + }, + + drawZone(proton, canvas, zone, clear) { + const context = canvas.getContext('2d'); + const style = this.getStyle(); - drawEmitter : function(proton, canvas, emitter, clear) { - var context = canvas.getContext('2d'); - var style = this.setStyle(); - this.addEventListener(proton, function() { - if (clear) - context.clearRect(0, 0, canvas.width, canvas.height); + this.addEventListener(proton, () => { + if (clear) + context.clearRect(0, 0, canvas.width, canvas.height); + if (zone instanceof PointZone) { context.beginPath(); context.fillStyle = style; - context.arc(emitter.p.x, emitter.p.y, 10, 0, Math.PI * 2, true); + context.arc(zone.x, zone.y, 10, 0, Math.PI * 2, true); context.fill(); context.closePath(); - }); - }, - - test : {}, - - setTest : function(id, value) { - this.test[id] = value; - }, + } else if (zone instanceof LineZone) { + context.beginPath(); + context.strokeStyle = style; + context.moveTo(zone.x1, zone.y1); + context.lineTo(zone.x2, zone.y2); + context.stroke(); + context.closePath(); + } else if (zone instanceof RectZone) { + context.beginPath(); + context.strokeStyle = style; + context.drawRect(zone.x, zone.y, zone.width, zone.height); + context.stroke(); + context.closePath(); + } else if (zone instanceof CircleZone) { + context.beginPath(); + context.strokeStyle = style; + context.arc(zone.x, zone.y, zone.radius, 0, Math.PI * 2, true); + context.stroke(); + context.closePath(); + } + }); + }, + + drawEmitter(proton, canvas, emitter, clear) { + const context = canvas.getContext('2d'); + const style = this.getStyle(); - getTest : function(id) { - if (this.test.hasOwnProperty(id)) - return this.test[id]; - else - return false; - } - } + this.addEventListener(proton, () => { + if (clear) context.clearRect(0, 0, canvas.width, canvas.height); + + context.beginPath(); + context.fillStyle = style; + context.arc(emitter.p.x, emitter.p.y, 10, 0, Math.PI * 2, true); + context.fill(); + context.closePath(); + }); + }, +} - Proton.Debug = Debug; -})(Proton); diff --git a/src/debug/Stats.js b/src/debug/Stats.js new file mode 100644 index 0000000..084fa64 --- /dev/null +++ b/src/debug/Stats.js @@ -0,0 +1,116 @@ +export default class Stats { + + constructor(proton) { + this.proton = proton; + this.container = null; + this.type = 1; + + this.emitterIndex = 0; + this.rendererIndex = 0; + } + + update(style, body) { + this.add(style, body); + + const emitter = this.getEmitter(); + const renderer = this.getRenderer(); + let str = ""; + + switch (this.type) { + case 2: + str += "emitter:" + this.proton.emitters.length + "
"; + if (emitter) str += "em speed:" + emitter.emitSpeed + "
"; + if (emitter) str += "pos:" + this.getEmitterPos(emitter); + break; + + case 3: + if (emitter) str += "initializes:" + emitter.initializes.length + "
"; + if (emitter) str += "" + this.concatArr(emitter.initializes) + "
"; + if (emitter) str += "behaviours:" + emitter.behaviours.length + "
"; + if (emitter) str += "" + this.concatArr(emitter.behaviours) + "
"; + break; + + case 4: + if (renderer) str += renderer.name + "
"; + if (renderer) str += "body:" + this.getCreatedNumber(renderer) + "
"; + break; + + default: + str += "particles:" + this.proton.getCount() + "
"; + str += "pool:" + this.proton.pool.getCount() + "
"; + str += "total:" + this.proton.pool.total; + } + + this.container.innerHTML = str; + } + + add(style, body) { + if (!this.container) { + this.type = 1; + + this.container = document.createElement('div'); + this.container.style.cssText = [ + 'position:absolute;bottom:0px;left:0;cursor:pointer;', + 'opacity:0.9;z-index:10000;padding:10px;font-size:12px;', + 'width:120px;height:50px;background-color:#002;color:#0ff;' + ].join(''); + + this.container.addEventListener('click', e => { + this.type++; + if (this.type > 4) this.type = 1; + }, false); + + let bg, color; + switch (style) { + case 2: + bg = "#201"; + color = "#f08"; + break; + + case 3: + bg = "#020"; + color = "#0f0"; + break; + + default: + bg = "#002"; + color = "#0ff"; + } + + this.container.style["background-color"] = bg; + this.container.style["color"] = color; + } + + if (!this.container.parentNode) { + body = body || this.body || document.body; + body.appendChild(this.container); + } + } + + getEmitter() { + return this.proton.emitters[this.emitterIndex]; + } + + getRenderer() { + return this.proton.renderers[this.rendererIndex]; + } + + concatArr(arr) { + let result = ''; + if (!arr || !arr.length) return result; + + for (let i = 0; i < arr.length; i++) { + result += (arr[i].name || '').substr(0, 1) + '.'; + } + + return result; + } + + getCreatedNumber(renderer) { + return renderer.pool.total || (renderer.cpool && renderer.cpool.total) || 0; + } + + getEmitterPos(e) { + return Math.round(e.p.x) + "," + Math.round(e.p.y); + } +} \ No newline at end of file diff --git a/src/emitter/BehaviourEmitter.js b/src/emitter/BehaviourEmitter.js index 9f9526a..bcc6809 100644 --- a/src/emitter/BehaviourEmitter.js +++ b/src/emitter/BehaviourEmitter.js @@ -1,4 +1,8 @@ -(function(Proton, undefined) { +import Util from '../utils/Util'; +import Emitter from './Emitter'; + +export default class BehaviourEmitter extends Emitter { + /** * The BehaviourEmitter class inherits from Proton.Emitter * @@ -7,12 +11,12 @@ * @constructor * @param {Object} pObj the parameters object; */ - function BehaviourEmitter(pObj) { + constructor(pObj) { + super(pObj); + this.selfBehaviours = []; - BehaviourEmitter._super_.call(this, pObj); }; - - Proton.Util.inherits(BehaviourEmitter, Proton.Emitter); + /** * add the Behaviour to emitter; * @@ -20,33 +24,35 @@ * @method addSelfBehaviour * @param {Proton.Behaviour} behaviour like this new Proton.Color('random') */ - BehaviourEmitter.prototype.addSelfBehaviour = function() { - var length = arguments.length, i; - for ( i = 0; i < length; i++) { - this.selfBehaviours.push(arguments[i]); + addSelfBehaviour(...rest) { + const length = rest.length; + let i; + + for (i = 0; i < length; i++) { + this.selfBehaviours.push(rest[i]); } }; + /** * remove the Behaviour for self * @method removeSelfBehaviour * @param {Proton.Behaviour} behaviour a behaviour */ - BehaviourEmitter.prototype.removeSelfBehaviour = function(behaviour) { - var index = this.selfBehaviours.indexOf(behaviour); - if (index > -1) - this.selfBehaviours.splice(index, 1); + removeSelfBehaviour(behaviour) { + const index = this.selfBehaviours.indexOf(behaviour); + if (index > -1) this.selfBehaviours.splice(index, 1); }; - BehaviourEmitter.prototype.update = function(time) { - BehaviourEmitter._super_.prototype.update.call(this, time); + update(time) { + super.update(time); if (!this.sleep) { - var length = this.selfBehaviours.length, i; - for ( i = 0; i < length; i++) { - this.selfBehaviours[i].applyBehaviour(this, time, i) + const length = this.selfBehaviours.length; + let i; + + for (i = 0; i < length; i++) { + this.selfBehaviours[i].applyBehaviour(this, time, i); } } } - - Proton.BehaviourEmitter = BehaviourEmitter; -})(Proton); +} \ No newline at end of file diff --git a/src/emitter/Emitter.js b/src/emitter/Emitter.js index 11eed96..d99fdf7 100644 --- a/src/emitter/Emitter.js +++ b/src/emitter/Emitter.js @@ -1,24 +1,38 @@ -(function(Proton, undefined) { - Emitter.ID = 0; +import Util from '../utils/Util'; +import Particle from '../core/Particle'; +import EventDispatcher from '../events/EventDispatcher'; + +import Rate from '../initialize/Rate'; +import InitializeUtil from '../initialize/InitializeUtil'; + +export default class Emitter extends Particle { + + static ID = 0; + /** * You can use this emit particles. * * It will dispatch follow events: - * Proton.PARTICLE_CREATED - * Proton.PARTICLE_UPDATA - * Proton.PARTICLE_DEAD + * PARTICLE_CREATED + * PARTICLE_UPDATA + * PARTICLE_DEAD * - * @class Proton.Emitter + * @class Emitter * @constructor * @param {Object} pObj the parameters object; * for example {damping:0.01,bindEmitter:false} */ - function Emitter(pObj) { + constructor(pObj) { + super(pObj); + this.initializes = []; this.particles = []; this.behaviours = []; - this.emitTime = 0; - this.emitTotalTimes = -1; + + this.emitSpeed = 0; + this.currentEmitTime = 0; + this.totalEmitTimes = -1; + /** * The friction coefficient for all particle emit by This; * @property damping @@ -26,6 +40,7 @@ * @default 0.006 */ this.damping = .006; + /** * If bindEmitter the particles can bind this emitter's property; * @property bindEmitter @@ -33,246 +48,257 @@ * @default true */ this.bindEmitter = true; + /** * The number of particles per second emit (a [particle]/b [s]); * @property rate - * @type {Proton.Rate} - * @default Proton.Rate(1, .1) - */ - this.rate = new Proton.Rate(1, .1); - Emitter._super_.call(this, pObj); - /** - * The emitter's id; - * @property id - * @type {string} + * @type {Rate} + * @default Rate(1, .1) */ - this.id = 'emitter_' + Emitter.ID++; - }; + this.rate = new Rate(1, .1); + + this.id = `emitter_${Emitter.ID++}`; + this.name = 'Emitter'; + } - Proton.Util.inherits(Emitter, Proton.Particle); - Proton.EventDispatcher.initialize(Emitter.prototype); /** * start emit particle * @method emit - * @param {Number} emitTime begin emit time; + * @param {Number} currentEmitTime begin emit time; * @param {String} life the life of this emitter */ - Emitter.prototype.emit = function(emitTime, life) { - this.emitTime = 0; - this.emitTotalTimes = Proton.Util.initValue(emitTime, Infinity); + emit(totalEmitTimes, life) { + this.stoped = false; + this.currentEmitTime = 0; + this.totalEmitTimes = Util.initValue(totalEmitTimes, Infinity); if (life == true || life == 'life' || life == 'destroy') { - if (emitTime == 'once') - this.life = 1; - else - this.life = this.emitTotalTimes; - + this.life = totalEmitTimes == 'once' ? 1 : this.totalEmitTimes; } else if (!isNaN(life)) { this.life = life; } this.rate.init(); - }; + } /** * stop emiting - * @method stopEmit + * @method stop */ - Emitter.prototype.stopEmit = function() { - this.emitTotalTimes = -1; - this.emitTime = 0; - }; + stop() { + this.totalEmitTimes = -1; + this.currentEmitTime = 0; + this.stoped = true; + } /** * remove current all particles * @method removeAllParticles */ - Emitter.prototype.removeAllParticles = function() { - for (var i = 0; i < this.particles.length; i++) - this.particles[i].dead = true; - }; - /** - * create single particle; - * - * can use emit({x:10},new Gravity(10),{'particleUpdate',fun}) or emit([{x:10},new Initialize],new Gravity(10),{'particleUpdate',fun}) - * @method removeAllParticles - */ - Emitter.prototype.createParticle = function(initialize, behaviour) { - var particle = Proton.pool.get(Proton.Particle); - this.setupParticle(particle, initialize, behaviour); - this.dispatchEvent(Proton.PARTICLE_CREATED, particle); + removeAllParticles() { + let i = this.particles.length; + while (i--) this.particles[i].dead = true; + } - return particle; - }; /** * add initialize to this emitter * @method addSelfInitialize */ - Emitter.prototype.addSelfInitialize = function(pObj) { + addSelfInitialize(pObj) { if (pObj['init']) { pObj.init(this); } else { this.initAll(); } - }; + } + /** * add the Initialize to particles; * * you can use initializes array:for example emitter.addInitialize(initialize1,initialize2,initialize3); * @method addInitialize - * @param {Proton.Initialize} initialize like this new Proton.Radius(1, 12) + * @param {Initialize} initialize like this new Radius(1, 12) */ - Emitter.prototype.addInitialize = function() { - var length = arguments.length, i; - for ( i = 0; i < length; i++) { - this.initializes.push(arguments[i]); - } - }; + addInitialize(...rest) { + let i = rest.length; + while (i--) + this.initializes.push(rest[i]); + } + /** * remove the Initialize * @method removeInitialize - * @param {Proton.Initialize} initialize a initialize + * @param {Initialize} initialize a initialize */ - Emitter.prototype.removeInitialize = function(initializer) { - var index = this.initializes.indexOf(initializer); - if (index > -1) { - this.initializes.splice(index, 1); - } - }; + removeInitialize(initializer) { + const index = this.initializes.indexOf(initializer); + if (index > -1) this.initializes.splice(index, 1); + } /** * remove all Initializes * @method removeInitializers */ - Emitter.prototype.removeInitializers = function() { - Proton.Util.destroyArray(this.initializes); - }; + removeAllInitializers() { + Util.destroyArray(this.initializes); + } + /** * add the Behaviour to particles; * * you can use Behaviours array:emitter.addBehaviour(Behaviour1,Behaviour2,Behaviour3); * @method addBehaviour - * @param {Proton.Behaviour} behaviour like this new Proton.Color('random') + * @param {Behaviour} behaviour like this new Color('random') */ - Emitter.prototype.addBehaviour = function() { - var length = arguments.length, i; - for ( i = 0; i < length; i++) { - this.behaviours.push(arguments[i]); - if (arguments[i].hasOwnProperty("parents")) - arguments[i].parents.push(this); + addBehaviour(...rest) { + let i = arguments.length; + while (i--) { + let behaviour = rest[i]; + this.behaviours.push(behaviour); + if (behaviour.parents) behaviour.parents.push(this); } - }; + } + /** * remove the Behaviour * @method removeBehaviour - * @param {Proton.Behaviour} behaviour a behaviour + * @param {Behaviour} behaviour a behaviour */ - Emitter.prototype.removeBehaviour = function(behaviour) { - var index = this.behaviours.indexOf(behaviour); - if (index > -1) - this.behaviours.splice(index, 1); - }; + removeBehaviour(behaviour) { + let index = this.behaviours.indexOf(behaviour); + this.behaviours.splice(index, 1); + + if (behaviour.parents) { + index = behaviour.parents.indexOf(behaviour); + behaviour.parents.splice(index, 1); + } + + return index; + } + /** * remove all behaviours * @method removeAllBehaviours */ - Emitter.prototype.removeAllBehaviours = function() { - Proton.Util.destroyArray(this.behaviours); - }; - - Emitter.prototype.integrate = function(time) { - var damping = 1 - this.damping; - Proton.integrator.integrate(this, time, damping); - var length = this.particles.length, i; - for ( i = 0; i < length; i++) { - var particle = this.particles[i]; - particle.update(time, i); - Proton.integrator.integrate(particle, time, damping); + removeAllBehaviours() { + Util.destroyArray(this.behaviours); + } - this.dispatchEvent(Proton.PARTICLE_UPDATE, particle); - } - }; + // emitter update + update(time) { + this.age += time; + if (this.age >= this.life || this.dead) this.destroy(); - Emitter.prototype.emitting = function(time) { - if (this.emitTotalTimes == 'once') { - var length = this.rate.getValue(99999), i; - for ( i = 0; i < length; i++) { - this.createParticle(); - } + this.emitting(time); + this.integrate(time); + } + + integrate(time) { + if (!this.parent) return; + + const damping = 1 - this.damping; + this.parent.integrator.calculate(this, time, damping); + + const length = this.particles.length; + let i, particle; + + for (i = length - 1; i >= 0; i--) { + particle = this.particles[i]; - this.emitTotalTimes = 'none'; - } else if (!isNaN(this.emitTotalTimes)) { - this.emitTime += time; - if (this.emitTime < this.emitTotalTimes) { - var length = this.rate.getValue(time), i; - for ( i = 0; i < length; i++) { - this.createParticle(); - } + // particle update + particle.update(time, i); + this.parent.integrator.calculate(particle, time, damping); + this.dispatch("PARTICLE_UPDATE", particle); + + // check dead + if (particle.dead) { + this.dispatch("PARTICLE_DEAD", particle); + + this.parent.pool.expire(particle); + this.particles.splice(i, 1); } } } - Emitter.prototype.update = function(time) { - this.age += time; - if (this.age >= this.life || this.dead) { - this.destroy(); + dispatch(event, target) { + this.parent && this.parent.dispatchEvent(event, target); + Proton.bindEmtterEvent && this.dispatchEvent(event, target); + } + + emitting(time) { + if (this.totalEmitTimes == 'once') { + let i; + const length = this.rate.getValue(99999); + + if (length > 0) this.emitSpeed = length; + for (i = 0; i < length; i++) this.createParticle(); + this.totalEmitTimes = 'none'; } - this.emitting(time); - this.integrate(time); - var particle; - var length = this.particles.length, k; - for ( k = length - 1; k >= 0; k--) { - particle = this.particles[k]; - if (particle.dead) { - this.dispatchEvent(Proton.PARTICLE_DEAD , particle); + else { + this.currentEmitTime += time; + + if (this.currentEmitTime < this.totalEmitTimes) { + const length = this.rate.getValue(time) + let i; - Proton.pool.set(particle); - this.particles.splice(k, 1); + if (length > 0) this.emitSpeed = length; + for (i = 0; i < length; i++) this.createParticle(); } } - }; + } - Emitter.prototype.setupParticle = function(particle, initialize, behaviour) { - var initializes = this.initializes; - var behaviours = this.behaviours; + /** + * create single particle; + * + * can use emit({x:10},new Gravity(10),{'particleUpdate',fun}) or emit([{x:10},new Initialize],new Gravity(10),{'particleUpdate',fun}) + * @method removeAllParticles + */ + createParticle(initialize, behaviour) { + const particle = this.parent.pool.get(Particle); + this.setupParticle(particle, initialize, behaviour); + this.dispatch("PARTICLE_CREATED", particle); + + return particle; + } + + setupParticle(particle, initialize, behaviour) { + let initializes = this.initializes; + let behaviours = this.behaviours; if (initialize) { - if ( initialize instanceof Array) - initializes = initialize; - else - initializes = [initialize]; + initializes = Util.isArray(initialize) ? initialize : [initialize]; } if (behaviour) { - if ( behaviour instanceof Array) - behaviours = behaviour; - else - behaviours = [behaviour]; + behaviour = Util.isArray(behaviour) ? behaviour : [behaviour]; } particle.reset(); - Proton.InitializeUtil.initialize(this, particle, initializes); + InitializeUtil.initialize(this, particle, initializes); particle.addBehaviours(behaviours); particle.parent = this; + this.particles.push(particle); - }; + } + + remove(){ + this.stop(); + Util.destroy(this.particles); + } /** * Destory this Emitter * @method destroy */ - Emitter.prototype.destroy = function() { + destroy(slow) { this.dead = true; - this.emitTotalTimes = -1; - if (this.particles.length == 0) { - this.removeInitializers(); - this.removeAllBehaviours(); - - if (this.parent) - this.parent.removeEmitter(this); - } + this.remove(); + this.removeAllInitializers(); + this.removeAllBehaviours(); + this.parent && this.parent.removeEmitter(this); } - Proton.Emitter = Emitter; -})(Proton); +} + +EventDispatcher.bind(Emitter); \ No newline at end of file diff --git a/src/emitter/FollowEmitter.js b/src/emitter/FollowEmitter.js index b2be7a5..f9f72a4 100644 --- a/src/emitter/FollowEmitter.js +++ b/src/emitter/FollowEmitter.js @@ -1,4 +1,8 @@ -(function(Proton, undefined) { +import Util from '../utils/Util'; +import Emitter from './Emitter'; + +export default class FollowEmitter extends Emitter { + /** * The FollowEmitter class inherits from Proton.Emitter * @@ -11,46 +15,41 @@ * @default 0.7 * @param {Object} pObj the parameters object; */ - function FollowEmitter(mouseTarget, ease, pObj) { - this.mouseTarget = Proton.Util.initValue(mouseTarget, window); - this.ease = Proton.Util.initValue(ease, .7); + constructor(mouseTarget, ease, pObj) { + super(pObj); + + this.mouseTarget = Util.initValue(mouseTarget, window); + this.ease = Util.initValue(ease, .7); + this._allowEmitting = false; this.initEventHandler(); - FollowEmitter._super_.call(this, pObj); }; - Proton.Util.inherits(FollowEmitter, Proton.Emitter); - FollowEmitter.prototype.initEventHandler = function() { - var self = this; - this.mousemoveHandler = function(e) { - self.mousemove.call(self, e); - }; - - this.mousedownHandler = function(e) { - self.mousedown.call(self, e); - }; + initEventHandler() { + this.mousemoveHandler = e => this.mousemove.call(this, e); + this.mousedownHandler = e => this.mousedown.call(this, e); + this.mouseupHandler = e => this.mouseup.call(this, e); - this.mouseupHandler = function(e) { - self.mouseup.call(self, e); - }; this.mouseTarget.addEventListener('mousemove', this.mousemoveHandler, false); } + /** * start emit particle * @method emit */ - FollowEmitter.prototype.emit = function() { + emit() { this._allowEmitting = true; } + /** * stop emiting - * @method stopEmit + * @method stop */ - FollowEmitter.prototype.stopEmit = function() { + stop() { this._allowEmitting = false; } - FollowEmitter.prototype.mousemove = function(e) { + mousemove(e) { if (e.layerX || e.layerX == 0) { this.p.x += (e.layerX - this.p.x) * this.ease; this.p.y += (e.layerY - this.p.y) * this.ease; @@ -58,17 +57,17 @@ this.p.x += (e.offsetX - this.p.x) * this.ease; this.p.y += (e.offsetY - this.p.y) * this.ease; } - if (this._allowEmitting) - FollowEmitter._super_.prototype.emit.call(this, 'once'); + + if (this._allowEmitting) super.emit('once'); }; + /** * Destory this Emitter * @method destroy */ - FollowEmitter.prototype.destroy = function() { - FollowEmitter._super_.prototype.destroy.call(this); + destroy() { + super.destroy(); this.mouseTarget.removeEventListener('mousemove', this.mousemoveHandler, false); } - Proton.FollowEmitter = FollowEmitter; -})(Proton); +} diff --git a/src/events/EventDispatcher.js b/src/events/EventDispatcher.js index 0c74f39..0de1fc2 100644 --- a/src/events/EventDispatcher.js +++ b/src/events/EventDispatcher.js @@ -1,93 +1,92 @@ /* * EventDispatcher - * Visit http://createjs.com/ for documentation, updates and examples. + * This code reference since http://createjs.com/. * **/ -(function(Proton, undefined) { - function EventDispatcher() { - this.initialize(); - }; +export default class EventDispatcher { - EventDispatcher.initialize = function(target) { - target.addEventListener = p.addEventListener; - target.removeEventListener = p.removeEventListener; - target.removeAllEventListeners = p.removeAllEventListeners; - target.hasEventListener = p.hasEventListener; - target.dispatchEvent = p.dispatchEvent; - }; + constructor() { + this._listeners = null; + } - var p = EventDispatcher.prototype; + static bind(TargetClass){ + TargetClass.prototype.dispatchEvent = EventDispatcher.prototype.dispatchEvent; + TargetClass.prototype.hasEventListener = EventDispatcher.prototype.hasEventListener; + TargetClass.prototype.addEventListener = EventDispatcher.prototype.addEventListener; + TargetClass.prototype.removeEventListener = EventDispatcher.prototype.removeEventListener; + TargetClass.prototype.removeAllEventListeners = EventDispatcher.prototype.removeAllEventListeners; + } - p._listeners = null; - - p.initialize = function() {}; - p.addEventListener = function(type, listener) { + addEventListener(type, listener) { if (!this._listeners) { this._listeners = {}; } else { this.removeEventListener(type, listener); } - if (!this._listeners[type]) this._listeners[type] = [] + if (!this._listeners[type]) this._listeners[type] = []; this._listeners[type].push(listener); return listener; - }; + } - p.removeEventListener = function(type, listener) { + removeEventListener(type, listener) { if (!this._listeners) return; if (!this._listeners[type]) return; - var arr = this._listeners[type]; - for (var i = 0, l = arr.length; i < l; i++) { + const arr = this._listeners[type]; + const length = arr.length; + + for (let i = 0;i < length; i++) { if (arr[i] == listener) { - if (l == 1) { - delete(this._listeners[type]); + if (length == 1) { + delete (this._listeners[type]); } + // allows for faster checks. else { arr.splice(i, 1); } + break; } } - }; + } - p.removeAllEventListeners = function(type) { + removeAllEventListeners(type) { if (!type) this._listeners = null; else if (this._listeners) - delete(this._listeners[type]); - }; + delete (this._listeners[type]); + } - p.dispatchEvent = function(eventName, eventTarget) { - var ret = false, - listeners = this._listeners; + dispatchEvent(type, args) { + let result = false; + const listeners = this._listeners; - if (eventName && listeners) { - var arr = listeners[eventName]; - if (!arr) return ret; + if (type && listeners) { + let arr = listeners[type]; + if (!arr) return result; - arr = arr.slice(); + //arr = arr.slice(); // to avoid issues with items being removed or added during the dispatch - var handler, i = arr.length; + let handler; + let i = arr.length; while (i--) { - var handler = arr[i]; - ret = ret || handler(eventTarget); + handler = arr[i]; + result = result || handler(args); } - + } - return !!ret; - }; + return !!result; + } - p.hasEventListener = function(type) { - var listeners = this._listeners; + hasEventListener(type) { + const listeners = this._listeners; return !!(listeners && listeners[type]); - }; + } - EventDispatcher.initialize(Proton.prototype); - Proton.EventDispatcher = EventDispatcher; -})(Proton); +} \ No newline at end of file diff --git a/src/index.js b/src/index.js new file mode 100644 index 0000000..4c7eec1 --- /dev/null +++ b/src/index.js @@ -0,0 +1,126 @@ +// import +import Proton from "./core/Proton"; +import Particle from "./core/Particle"; +import Pool from "./core/Pool"; + +import Util from "./utils/Util"; +import ColorUtil from "./utils/ColorUtil"; +import MathUtils from "./math/MathUtils"; +import Vector2D from "./math/Vector2D"; +import Polar2D from "./math/Polar2D"; +import Mat3 from "./math/Mat3"; +import Span from "./math/Span"; +import ArraySpan from "./math/ArraySpan"; +import Rectangle from "./math/Rectangle"; +import ease from "./math/ease"; + +import Rate from "./initialize/Rate"; +import Initialize from "./initialize/Initialize"; +import Life from "./initialize/Life"; +import Position from "./initialize/Position"; +import Velocity from "./initialize/Velocity"; +import Mass from "./initialize/Mass"; +import Radius from "./initialize/Radius"; +import Body from "./initialize/Body"; + +import Behaviour from "./behaviour/Behaviour"; +import Force from "./behaviour/Force"; +import Attraction from "./behaviour/Attraction"; +import RandomDrift from "./behaviour/RandomDrift"; +import Gravity from "./behaviour/Gravity"; +import Collision from "./behaviour/Collision"; +import CrossZone from "./behaviour/CrossZone"; +import Alpha from "./behaviour/Alpha"; +import Scale from "./behaviour/Scale"; +import Rotate from "./behaviour/Rotate"; +import Color from "./behaviour/Color"; +import Repulsion from "./behaviour/Repulsion"; +import GravityWell from "./behaviour/GravityWell"; + +import Emitter from "./emitter/Emitter"; +import BehaviourEmitter from "./emitter/BehaviourEmitter"; +import FollowEmitter from "./emitter/FollowEmitter"; + +import CanvasRenderer from "./render/CanvasRenderer"; +import DomRenderer from "./render/DomRenderer"; +import EaselRenderer from "./render/EaselRenderer"; +import PixelRenderer from "./render/PixelRenderer"; +import PixiRenderer from "./render/PixiRenderer"; +import WebGLRenderer from "./render/WebGLRenderer"; +import CustomRenderer from "./render/CustomRenderer"; + +import Zone from "./zone/Zone"; +import LineZone from "./zone/LineZone"; +import CircleZone from "./zone/CircleZone"; +import PointZone from "./zone/PointZone"; +import RectZone from "./zone/RectZone"; +import ImageZone from "./zone/ImageZone"; + +import Debug from "./debug/Debug"; +import "./polyfill/requestAnimationFrame"; + +// namespace +Proton.Particle = Proton.P = Particle; +Proton.Pool = Pool; + +Proton.Util = Util; +Proton.ColorUtil = ColorUtil; +Proton.MathUtils = MathUtils; +Proton.Vector2D = Proton.Vector = Vector2D; +Proton.Polar2D = Proton.Polar = Polar2D; +Proton.ArraySpan = ArraySpan; +Proton.Rectangle = Rectangle; +Proton.Rate = Rate; +Proton.ease = ease; +Proton.Span = Span; +Proton.Mat3 = Mat3; +Proton.getSpan = (a, b, center) => new Span(a, b, center); +Proton.createArraySpan = ArraySpan.createArraySpan; + +Proton.Initialize = Proton.Init = Initialize; +Proton.Life = Proton.L = Life; +Proton.Position = Proton.P = Position; +Proton.Velocity = Proton.V = Velocity; +Proton.Mass = Proton.M = Mass; +Proton.Radius = Proton.R = Radius; +Proton.Body = Proton.B = Body; + +Proton.Behaviour = Behaviour; +Proton.Force = Proton.F = Force; +Proton.Attraction = Proton.A = Attraction; +Proton.RandomDrift = Proton.RD = RandomDrift; +Proton.Gravity = Proton.G = Gravity; +Proton.Collision = Collision; +Proton.CrossZone = CrossZone; +Proton.Alpha = Proton.A = Alpha; +Proton.Scale = Proton.S = Scale; +Proton.Rotate = Rotate; +Proton.Color = Color; +Proton.Repulsion = Repulsion; +Proton.GravityWell = GravityWell; + +Proton.Emitter = Emitter; +Proton.BehaviourEmitter = BehaviourEmitter; +Proton.FollowEmitter = FollowEmitter; + +Proton.Zone = Zone; +Proton.LineZone = LineZone; +Proton.CircleZone = CircleZone; +Proton.PointZone = PointZone; +Proton.RectZone = RectZone; +Proton.ImageZone = ImageZone; + +Proton.CanvasRenderer = CanvasRenderer; +Proton.DomRenderer = DomRenderer; +Proton.EaselRenderer = EaselRenderer; +Proton.PixiRenderer = PixiRenderer; +Proton.PixelRenderer = PixelRenderer; +Proton.WebGLRenderer = Proton.WebGlRenderer = WebGLRenderer; +Proton.CustomRenderer = CustomRenderer; + +Proton.Debug = Debug; + +Object.assign(Proton, ease); + +// export +export default Proton; \ No newline at end of file diff --git a/src/initialize/Body.js b/src/initialize/Body.js new file mode 100644 index 0000000..4ad4c87 --- /dev/null +++ b/src/initialize/Body.js @@ -0,0 +1,29 @@ +import Util from '../utils/Util'; +import ArraySpan from '../math/ArraySpan'; +import Initialize from './Initialize'; + +export default class Body extends Initialize { + + constructor(image, w, h) { + super(); + + this.image = this.setSpanValue(image); + this.w = Util.initValue(w, 20); + this.h = Util.initValue(h, this.w); + this.name = 'Body'; + } + + initialize(particle) { + const imagetarget = this.image.getValue(); + + if (typeof(imagetarget) == 'string') { + particle.body = { width: this.w, height: this.h, src: imagetarget , isInner: true, inner: true }; + } else { + particle.body = imagetarget; + } + }; + + setSpanValue(color) { + return color instanceof ArraySpan ? color : new ArraySpan(color); + } +} \ No newline at end of file diff --git a/src/initialize/ImageTarget.js b/src/initialize/ImageTarget.js deleted file mode 100644 index d066ab1..0000000 --- a/src/initialize/ImageTarget.js +++ /dev/null @@ -1,33 +0,0 @@ -(function(Proton, undefined) { - function ImageTarget(image, w, h) { - ImageTarget._super_.call(this); - this.image = this.setSpanValue(image); - this.w = Proton.Util.initValue(w, 20); - this.h = Proton.Util.initValue(h, this.w); - } - - - Proton.Util.inherits(ImageTarget, Proton.Initialize); - ImageTarget.prototype.initialize = function(particle) { - var imagetarget = this.image.getValue(); - if ( typeof (imagetarget) == 'string') { - particle.target = { - width : this.w, - height : this.h, - src : imagetarget - } - } else { - particle.target = imagetarget; - } - }; - - ImageTarget.prototype.setSpanValue = function(color) { - if ( color instanceof Proton.ColorSpan) { - return color; - } else { - return new Proton.ColorSpan(color); - } - } - - Proton.ImageTarget = ImageTarget; -})(Proton); diff --git a/src/initialize/Initialize.js b/src/initialize/Initialize.js index 349a699..0799162 100644 --- a/src/initialize/Initialize.js +++ b/src/initialize/Initialize.js @@ -1,14 +1,9 @@ -(function(Proton, undefined) { - function Initialize() { - - } - - - Initialize.prototype.reset = function() { - +export default class Initialize { + + reset() { } - Initialize.prototype.init = function(emitter, particle) { + init(emitter, particle) { if (particle) { this.initialize(particle); } else { @@ -17,8 +12,6 @@ }; ///sub class init - Initialize.prototype.initialize = function(target) { + initialize(target) { }; - - Proton.Initialize = Initialize; -})(Proton); +} \ No newline at end of file diff --git a/src/initialize/InitializeUtil.js b/src/initialize/InitializeUtil.js index 545cf1d..85b7c61 100644 --- a/src/initialize/InitializeUtil.js +++ b/src/initialize/InitializeUtil.js @@ -1,34 +1,35 @@ -(function(Proton, undefined) { - var InitializeUtil = { +import Util from '../utils/Util'; +import MathUtils from '../math/MathUtils'; - initialize : function(emitter, particle, initializes) { - var length = initializes.length, i; - for ( i = 0; i < length; i++) { - if (initializes[i] instanceof Proton.Initialize) - initializes[i].init(emitter, particle); - else - Proton.InitializeUtil.init(emitter, particle, initializes[i]); - } +export default { - Proton.InitializeUtil.bindEmitter(emitter, particle); - }, - - //////////////////////init////////////////////// - init : function(emitter, particle, initialize) { - Proton.Util.setPrototypeByObject(particle, initialize); - Proton.Util.setVector2DByObject(particle, initialize); - }, + initialize(emitter, particle, initializes) { + const length = initializes.length; + let i; - bindEmitter : function(emitter, particle) { - if (emitter.bindEmitter) { - particle.p.add(emitter.p); - particle.v.add(emitter.v); - particle.a.add(emitter.a); - particle.v.rotate(Proton.MathUtils.degreeTransform(emitter.rotation)); - } + for (i = 0; i < length; i++) { + if (initializes[i] instanceof Proton.Initialize) + initializes[i].init(emitter, particle); + else + this.init(emitter, particle, initializes[i]); } - //////////////////////init////////////////////// - } - Proton.InitializeUtil = InitializeUtil; -})(Proton); + this.bindEmitter(emitter, particle); + }, + + //////////////////////init////////////////////// + init(emitter, particle, initialize) { + Util.setPrototypeByObject(particle, initialize); + Util.setVector2DByObject(particle, initialize); + }, + + bindEmitter(emitter, particle) { + if (emitter.bindEmitter) { + particle.p.add(emitter.p); + particle.v.add(emitter.v); + particle.a.add(emitter.a); + + particle.v.rotate(MathUtils.degreeTransform(emitter.rotation)); + } + } +} diff --git a/src/initialize/Life.js b/src/initialize/Life.js index 950565f..bded674 100644 --- a/src/initialize/Life.js +++ b/src/initialize/Life.js @@ -1,17 +1,19 @@ -(function(Proton, undefined) { - function Life(a, b, c) { - Life._super_.call(this); - this.lifePan = Proton.Util.setSpanValue(a, b, c); - } +import Util from '../utils/Util'; +import Initialize from './Initialize'; + +export default class Life extends Initialize { + + constructor(a, b, c) { + super(); + this.lifePan = Util.setSpanValue(a, b, c); + this.name = 'Life'; + } - Proton.Util.inherits(Life, Proton.Initialize); - Life.prototype.initialize = function(target) { + initialize(target) { if (this.lifePan.a == Infinity) target.life = Infinity; else target.life = this.lifePan.getValue(); - }; - - Proton.Life = Life; -})(Proton); + } +} diff --git a/src/initialize/Mass.js b/src/initialize/Mass.js index 50477a8..540fc7d 100644 --- a/src/initialize/Mass.js +++ b/src/initialize/Mass.js @@ -1,14 +1,15 @@ -(function(Proton, undefined) { - function Mass(a, b, c) { - Mass._super_.call(this); - this.massPan = Proton.Util.setSpanValue(a, b, c); - } +import Util from '../utils/Util'; +import Initialize from './Initialize'; +export default class Mass extends Initialize { - Proton.Util.inherits(Mass, Proton.Initialize); - Mass.prototype.initialize = function(target) { - target.mass = this.massPan.getValue(); - }; + constructor(a, b, c) { + super(); + this.massPan = Util.setSpanValue(a, b, c); + this.name = 'Mass'; + } - Proton.Mass = Mass; -})(Proton); + initialize(target) { + target.mass = this.massPan.getValue(); + } +} \ No newline at end of file diff --git a/src/initialize/Position.js b/src/initialize/Position.js index 3aa8db6..b106e21 100644 --- a/src/initialize/Position.js +++ b/src/initialize/Position.js @@ -1,21 +1,25 @@ -(function(Proton, undefined) { - function Position(zone) { - Position._super_.call(this); - this.zone = Proton.Util.initValue(zone, new Proton.PointZone()); - } +import Util from '../utils/Util'; +import PointZone from '../zone/PointZone'; +import Initialize from './Initialize'; +export default class Position extends Initialize { - Proton.Util.inherits(Position, Proton.Initialize); - Position.prototype.reset = function(zone) { - this.zone = Proton.Util.initValue(zone, new Proton.PointZone()); - }; + constructor(zone) { + super(); + this.zone = Util.initValue(zone, new PointZone()); + + this.name = 'Position'; + } - Position.prototype.initialize = function(target) { + reset(zone) { + this.zone = Util.initValue(zone, new PointZone()); + } + + initialize(target) { this.zone.getPosition(); + target.p.x = this.zone.vector.x; target.p.y = this.zone.vector.y; }; - Proton.Position = Position; - Proton.P = Position; -})(Proton); +} diff --git a/src/initialize/Radius.js b/src/initialize/Radius.js index fa09e05..dd5e210 100644 --- a/src/initialize/Radius.js +++ b/src/initialize/Radius.js @@ -1,19 +1,21 @@ -(function(Proton, undefined) { - function Radius(a, b, c) { - Radius._super_.call(this); - this.radius = Proton.Util.setSpanValue(a, b, c); - } +import Util from '../utils/Util'; +import Initialize from './Initialize'; + +export default class Radius extends Initialize { + constructor(a, b, c) { + super(); + this.radius = Util.setSpanValue(a, b, c); - Proton.Util.inherits(Radius, Proton.Initialize); - Radius.prototype.reset = function(a, b, c) { - this.radius = Proton.Util.setSpanValue(a, b, c); + this.name = 'Radius'; + } + + reset(a, b, c) { + this.radius = Util.setSpanValue(a, b, c); }; - Radius.prototype.initialize = function(particle) { + initialize(particle) { particle.radius = this.radius.getValue(); particle.transform.oldRadius = particle.radius; }; - - Proton.Radius = Radius; -})(Proton); +} \ No newline at end of file diff --git a/src/initialize/Rate.js b/src/initialize/Rate.js index c5ee847..d29f513 100644 --- a/src/initialize/Rate.js +++ b/src/initialize/Rate.js @@ -1,54 +1,49 @@ -(function(Proton, undefined) { +import Util from '../utils/Util'; + +export default class Rate { + /** * The number of particles per second emission (a [particle]/b [s]); * @namespace * @memberof! Proton# * @constructor - * @alias Proton.Rate + * @alias Rate * - * @param {Array | Number | Proton.Span} numpan the number of each emission; - * @param {Array | Number | Proton.Span} timepan the time of each emission; - * for example: new Proton.Rate(new Proton.Span(10, 20), new Proton.Span(.1, .25)); + * @param {Array | Number | Span} numpan the number of each emission; + * @param {Array | Number | Span} timepan the time of each emission; + * for example: new Rate(new Span(10, 20), new Span(.1, .25)); */ - function Rate(numpan, timepan) { - this.numPan = Proton.Util.initValue(numpan, 1); - this.timePan = Proton.Util.initValue(timepan, 1); - this.numPan = Proton.Util.setSpanValue(this.numPan); - this.timePan = Proton.Util.setSpanValue(this.timePan); + constructor(numpan, timepan) { + this.numPan = Util.setSpanValue(Util.initValue(numpan, 1)); + this.timePan = Util.setSpanValue(Util.initValue(timepan, 1)); + this.startTime = 0; this.nextTime = 0; this.init(); } + init() { + this.startTime = 0; + this.nextTime = this.timePan.getValue(); + } - Rate.prototype = { - /** - * @method init - * @memberof Proton#Proton.Rate - * @instance - */ - init : function() { + getValue(time) { + this.startTime += time; + + if (this.startTime >= this.nextTime) { this.startTime = 0; this.nextTime = this.timePan.getValue(); - }, - - getValue : function(time) { - this.startTime += time; - if (this.startTime >= this.nextTime) { - this.startTime = 0; - this.nextTime = this.timePan.getValue(); - if (this.numPan.b == 1) { - if (this.numPan.getValue(false) > 0.5) - return 1; - else - return 0; - } else { - return this.numPan.getValue(true); - } + + if (this.numPan.b == 1) { + if (this.numPan.getValue(false) > 0.5) + return 1; + else + return 0; + } else { + return this.numPan.getValue(true); } - return 0; } - } - Proton.Rate = Rate; -})(Proton); + return 0; + } +} \ No newline at end of file diff --git a/src/initialize/Velocity.js b/src/initialize/Velocity.js index 883679e..7b5ca9b 100644 --- a/src/initialize/Velocity.js +++ b/src/initialize/Velocity.js @@ -1,36 +1,40 @@ -(function(Proton, undefined) { - //radius and tha - function Velocity(rpan, thapan, type) { - Velocity._super_.call(this); - this.rPan = Proton.Util.setSpanValue(rpan); - this.thaPan = Proton.Util.setSpanValue(thapan); - this.type = Proton.Util.initValue(type, 'vector'); - } - - - Proton.Util.inherits(Velocity, Proton.Initialize); - - Velocity.prototype.reset = function(rpan, thapan, type) { - this.rPan = Proton.Util.setSpanValue(rpan); - this.thaPan = Proton.Util.setSpanValue(thapan); - this.type = Proton.Util.initValue(type, 'vector'); - }; - - Velocity.prototype.normalizeVelocity = function(vr) { - return vr * Proton.MEASURE; - } - - Velocity.prototype.initialize = function(target) { - if (this.type == 'p' || this.type == 'P' || this.type == 'polar') { - var polar2d = new Proton.Polar2D(this.normalizeVelocity(this.rPan.getValue()), this.thaPan.getValue() * Math.PI / 180); - target.v.x = polar2d.getX(); - target.v.y = polar2d.getY(); - } else { - target.v.x = this.normalizeVelocity(this.rPan.getValue()); - target.v.y = this.normalizeVelocity(this.thaPan.getValue()); - } - }; - - Proton.Velocity = Velocity; - Proton.V = Velocity; -})(Proton); +import Proton from '../core/Proton'; +import Util from '../utils/Util'; +import Polar2D from '../math/Polar2D'; +import MathUtils from '../math/MathUtils'; +import Initialize from './Initialize'; + +export default class Velocity extends Initialize { + + constructor(rpan, thapan, type) { + super(); + + this.rPan = Util.setSpanValue(rpan); + this.thaPan = Util.setSpanValue(thapan); + this.type = Util.initValue(type, 'vector'); + + this.name = 'Velocity'; + } + + reset(rpan, thapan, type) { + this.rPan = Util.setSpanValue(rpan); + this.thaPan = Util.setSpanValue(thapan); + this.type = Util.initValue(type, 'vector'); + }; + + normalizeVelocity(vr) { + return vr * Proton.MEASURE; + } + + initialize(target) { + if (this.type == 'p' || this.type == 'P' || this.type == 'polar') { + const polar2d = new Polar2D(this.normalizeVelocity(this.rPan.getValue()), this.thaPan.getValue() * MathUtils.PI_180); + + target.v.x = polar2d.getX(); + target.v.y = polar2d.getY(); + } else { + target.v.x = this.normalizeVelocity(this.rPan.getValue()); + target.v.y = this.normalizeVelocity(this.thaPan.getValue()); + } + }; +} \ No newline at end of file diff --git a/src/math/ArraySpan.js b/src/math/ArraySpan.js new file mode 100644 index 0000000..169fe17 --- /dev/null +++ b/src/math/ArraySpan.js @@ -0,0 +1,37 @@ +import Span from './Span'; +import Util from '../utils/Util'; +import MathUtils from './MathUtils'; + +export default class ArraySpan extends Span { + + constructor(color) { + super(); + this._arr = Util.isArray(color) ? color : [color]; + } + + getValue() { + const color = this._arr[Math.floor(this._arr.length * Math.random())]; + return color === 'random' || color === 'Random' ? MathUtils.randomColor() : color; + } + + /** + * Make sure that the color is an instance of Proton.ArraySpan, if not it makes a new instance + * + * @method setSpanValue + * @memberof Proton#Proton.Color + * @instance + * + * @param {Proton.Particle} particle + * @param {Number} the integrate time 1/ms + * @param {Int} the particle index + */ + static createArraySpan(arr) { + if (!arr) return null; + + if (arr instanceof ArraySpan) + return arr; + else + return new ArraySpan(arr); + } + +} \ No newline at end of file diff --git a/src/math/ColorSpan.js b/src/math/ColorSpan.js deleted file mode 100644 index 8663e96..0000000 --- a/src/math/ColorSpan.js +++ /dev/null @@ -1,21 +0,0 @@ -(function(Proton, undefined) { - function ColorSpan(color) { - if (Proton.Util.isArray(color)) { - this.colorArr = color; - } else { - this.colorArr = [color]; - } - } - - - Proton.Util.inherits(ColorSpan, Proton.Span); - ColorSpan.prototype.getValue = function() { - var color = this.colorArr[Math.floor(this.colorArr.length * Math.random())]; - if (color == 'random' || color == 'Random') - return Proton.MathUtils.randomColor(); - else - return color; - } - - Proton.ColorSpan = ColorSpan; -})(Proton); diff --git a/src/math/Integration.js b/src/math/Integration.js new file mode 100644 index 0000000..c652595 --- /dev/null +++ b/src/math/Integration.js @@ -0,0 +1,28 @@ +import Util from '../utils/Util'; + +export default class Integration { + + constructor(type) { + this.type = type; + } + + calculate(particles, time, damping) { + this.eulerIntegrate(particles, time, damping); + } + + // Euler Integrate + eulerIntegrate(particle, time, damping) { + if (!particle.sleep) { + particle.old.p.copy(particle.p); + particle.old.v.copy(particle.v); + + particle.a.multiplyScalar(1 / particle.mass); + particle.v.add(particle.a.multiplyScalar(time)); + particle.p.add(particle.old.v.multiplyScalar(time)); + + if (damping) particle.v.multiplyScalar(damping); + + particle.a.clear(); + } + } +} \ No newline at end of file diff --git a/src/math/Mat3.js b/src/math/Mat3.js index d234b78..1b85ad1 100644 --- a/src/math/Mat3.js +++ b/src/math/Mat3.js @@ -1,46 +1,52 @@ -(function(Proton, undefined) { - var Mat3 = Mat3 || { - create : function(mat3) { - var mat = new Float32Array(9); - if (mat3) - this.set(mat3, mat); - return mat; - }, - set : function(mat1, mat2) { - for (var i = 0; i < 9; i++) - mat2[i] = mat1[i]; - return mat2; - }, - multiply : function(mat, mat2, mat3) { - var a00 = mat[0], a01 = mat[1], a02 = mat[2], a10 = mat[3], a11 = mat[4], a20 = mat[6], a21 = mat[7], b00 = mat2[0], b01 = mat2[1], b02 = mat2[2], b10 = mat2[3], b11 = mat2[4], b20 = mat2[6], b21 = mat2[7]; - - mat3[0] = b00 * a00 + b01 * a10; - mat3[1] = b00 * a01 + b01 * a11; - mat3[2] = a02 * b02; - mat3[3] = b10 * a00 + b11 * a10; - mat3[4] = b10 * a01 + b11 * a11; - mat3[6] = b20 * a00 + b21 * a10 + a20; - mat3[7] = b20 * a01 + b21 * a11 + a21; - return mat3; - }, - inverse : function(mat, mat3) { - var a00 = mat[0], a01 = mat[1], a10 = mat[3], a11 = mat[4], a20 = mat[6], a21 = mat[7], b01 = a11, b11 = -a10, b21 = a21 * a10 - a11 * a20, d = a00 * b01 + a01 * b11, id; - id = 1 / d; - mat3[0] = b01 * id; - mat3[1] = (-a01 ) * id; - mat3[3] = b11 * id; - mat3[4] = a00 * id; - mat3[6] = b21 * id; - mat3[7] = (-a21 * a00 + a01 * a20) * id; - return mat3; - }, - multiplyVec2 : function(m, vec, mat3) { - var x = vec[0], y = vec[1]; - mat3[0] = x * m[0] + y * m[3] + m[6]; - mat3[1] = x * m[1] + y * m[4] + m[7]; - return mat3; - } - } +export default { + create(mat3) { + const mat = new Float32Array(9); + if (mat3) this.set(mat3, mat); + + return mat; + }, + + set(mat1, mat2) { + for (let i = 0; i < 9; i++) + mat2[i] = mat1[i]; + + return mat2; + }, + + multiply(mat, mat2, mat3) { + let a00 = mat[0], a01 = mat[1], a02 = mat[2], a10 = mat[3], a11 = mat[4], a20 = mat[6], a21 = mat[7], b00 = mat2[0], b01 = mat2[1], b02 = mat2[2], b10 = mat2[3], b11 = mat2[4], b20 = mat2[6], b21 = mat2[7]; + + mat3[0] = b00 * a00 + b01 * a10; + mat3[1] = b00 * a01 + b01 * a11; + mat3[2] = a02 * b02; + mat3[3] = b10 * a00 + b11 * a10; + mat3[4] = b10 * a01 + b11 * a11; + mat3[6] = b20 * a00 + b21 * a10 + a20; + mat3[7] = b20 * a01 + b21 * a11 + a21; + + return mat3; + }, - Proton.Mat3 = Mat3; -})(Proton); + inverse(mat, mat3) { + let a00 = mat[0], a01 = mat[1], a10 = mat[3], a11 = mat[4], a20 = mat[6], a21 = mat[7], b01 = a11, b11 = -a10, b21 = a21 * a10 - a11 * a20, d = a00 * b01 + a01 * b11, id; + + id = 1 / d; + mat3[0] = b01 * id; + mat3[1] = (-a01) * id; + mat3[3] = b11 * id; + mat3[4] = a00 * id; + mat3[6] = b21 * id; + mat3[7] = (-a21 * a00 + a01 * a20) * id; + + return mat3; + }, + + multiplyVec2(m, vec, mat3) { + let x = vec[0], y = vec[1]; + + mat3[0] = x * m[0] + y * m[3] + m[6]; + mat3[1] = x * m[1] + y * m[4] + m[7]; + + return mat3; + } +} \ No newline at end of file diff --git a/src/math/MathUtils.js b/src/math/MathUtils.js index e853e27..6d8e217 100644 --- a/src/math/MathUtils.js +++ b/src/math/MathUtils.js @@ -1,30 +1,37 @@ -(function(Proton, undefined) { - var MathUtils = { - randomAToB : function(a, b, INT) { - if (!INT) - return a + Math.random() * (b - a ); - else - return Math.floor(Math.random() * (b - a)) + a; - }, - randomFloating : function(center, f, INT) { - return MathUtils.randomAToB(center - f, center + f, INT); - }, - randomZone : function(display) { - - }, - - degreeTransform : function(a) { - return a * Math.PI / 180; - }, - - toColor16 : function getRGB(num) { - return "#" + num.toString(16); - }, - - randomColor : function() { - return '#' + ('00000' + (Math.random() * 0x1000000 << 0).toString(16)).slice(-6); - } - } - - Proton.MathUtils = MathUtils; -})(Proton); +const PI = 3.1415926; + +const MathUtils = { + + PI: PI, + PIx2: PI * 2, + PI_2: PI / 2, + PI_180: PI / 180, + N180_PI: 180 / PI, + + randomAToB(a, b, INT) { + if (!INT) + return a + Math.random() * (b - a); + else + return Math.floor(Math.random() * (b - a)) + a; + }, + + randomFloating(center, f, INT) { + return this.randomAToB(center - f, center + f, INT); + }, + + randomZone(display) {}, + + degreeTransform(a) { + return a * PI / 180; + }, + + toColor16(num) { + return "#" + num.toString(16); + }, + + randomColor() { + return '#' + ('00000' + (Math.random() * 0x1000000 << 0).toString(16)).slice(-6); + } +} + +export default MathUtils; \ No newline at end of file diff --git a/src/math/NumericalIntegration.js b/src/math/NumericalIntegration.js deleted file mode 100644 index 46f5b12..0000000 --- a/src/math/NumericalIntegration.js +++ /dev/null @@ -1,27 +0,0 @@ -//数值积分 -(function(Proton, undefined) { - var NumericalIntegration = function(type) { - this.type = Proton.Util.initValue(type, Proton.EULER); - } - - NumericalIntegration.prototype = { - integrate : function(particles, time, damping) { - this.eulerIntegrate(particles, time, damping); - }, - - eulerIntegrate : function(particle, time, damping) { - if (!particle.sleep) { - particle.old.p.copy(particle.p); - particle.old.v.copy(particle.v); - particle.a.multiplyScalar(1 / particle.mass); - particle.v.add(particle.a.multiplyScalar(time)); - particle.p.add(particle.old.v.multiplyScalar(time)); - if (damping) - particle.v.multiplyScalar(damping); - particle.a.clear(); - } - } - } - - Proton.NumericalIntegration = NumericalIntegration; -})(Proton); diff --git a/src/math/Polar2D.js b/src/math/Polar2D.js index cf56bcb..fbff21e 100644 --- a/src/math/Polar2D.js +++ b/src/math/Polar2D.js @@ -1,84 +1,62 @@ -(function(Proton, undefined) { - var Polar2D = function(r, tha) { +import Vector2D from './Vector2D'; + +export default class Polar2D { + + constructor(r, tha) { this.r = Math.abs(r) || 0; this.tha = tha || 0; } - Polar2D.prototype = { - set : function(r, tha) { - - this.r = r; - this.tha = tha; - return this; - - }, - - setR : function(r) { - - this.r = r; - return this; - - }, - - setTha : function(tha) { - - this.tha = tha; - - return this; - - }, - - copy : function(p) { - - this.r = p.r; - this.tha = p.tha; - - return this; - - }, - - toVector : function() { - return new Proton.Vector2D(this.getX(), this.getY()); - }, - - getX : function() { - return this.r * Math.sin(this.tha); - }, - - getY : function() { - return -this.r * Math.cos(this.tha); - }, - - normalize : function() { - - this.r = 1; - return this; - }, - - equals : function(v) { + set(r, tha) { + this.r = r; + this.tha = tha; + return this; + } - return ((v.r === this.r ) && (v.tha === this.tha ) ); + setR(r) { + this.r = r; + return this; + } - }, + setTha(tha) { + this.tha = tha; + return this; + } - toArray : function() { + copy(p) { + this.r = p.r; + this.tha = p.tha; + return this; + } - return [this.r, this.tha]; + toVector() { + return new Vector2D(this.getX(), this.getY()); + } - }, + getX() { + return this.r * Math.sin(this.tha); + } - clear : function() { - this.r = 0.0; - this.tha = 0.0; - return this; - }, + getY() { + return -this.r * Math.cos(this.tha); + } - clone : function() { + normalize() { + this.r = 1; + return this; + } - return new Proton.Polar2D(this.r, this.tha); + equals(v) { + return ((v.r === this.r) && (v.tha === this.tha)); + } - } - }; + clear() { + this.r = 0.0; + this.tha = 0.0; + return this; + } - Proton.Polar2D = Polar2D; -})(Proton); + clone() { + return new Polar2D(this.r, this.tha); + } +} \ No newline at end of file diff --git a/src/math/Rectangle.js b/src/math/Rectangle.js index 5cfe0eb..d54f25b 100644 --- a/src/math/Rectangle.js +++ b/src/math/Rectangle.js @@ -1,22 +1,20 @@ -(function(Proton, undefined) { - function Rectangle(x, y, w, h) { +export default class Rectangle { + + constructor(x, y, w, h) { this.x = x; this.y = y; + this.width = w; this.height = h; + this.bottom = this.y + this.height; this.right = this.x + this.width; } - - Rectangle.prototype = { - contains : function(x, y) { - if (x <= this.right && x >= this.x && y <= this.bottom && y >= this.y) - return true - else - return false - } + contains(x, y) { + if (x <= this.right && x >= this.x && y <= this.bottom && y >= this.y) + return true; + else + return false; } - - Proton.Rectangle = Rectangle; -})(Proton); +} diff --git a/src/math/Span.js b/src/math/Span.js index 7712225..566639a 100644 --- a/src/math/Span.js +++ b/src/math/Span.js @@ -1,33 +1,30 @@ -(function(Proton, undefined) { - function Span(a, b, center) { +import Util from '../utils/Util'; +import MathUtils from '../math/MathUtils'; + +export default class Span { + + constructor(a, b, center) { this.isArray = false; - if (Proton.Util.isArray(a)) { + if (Util.isArray(a)) { this.isArray = true; this.a = a; } else { - this.a = Proton.Util.initValue(a, 1); - this.b = Proton.Util.initValue(b, this.a); - this.center = Proton.Util.initValue(center, false); + this.a = Util.initValue(a, 1); + this.b = Util.initValue(b, this.a); + this.center = Util.initValue(center, false); } - } - - Span.prototype = { - getValue : function(INT) { - if (this.isArray) { - return this.a[Math.floor(this.a.length * Math.random())]; - } else { - if (!this.center) - return Proton.MathUtils.randomAToB(this.a, this.b, INT); - else - return Proton.MathUtils.randomFloating(this.a, this.b, INT); - } - } } - Proton.Span = Span; - Proton.getSpan = function(a, b, center) { - return new Proton.Span(a, b, center); + getValue(INT) { + if (this.isArray) { + return this.a[Math.floor(this.a.length * Math.random())]; + } else { + if (!this.center) + return MathUtils.randomAToB(this.a, this.b, INT); + else + return MathUtils.randomFloating(this.a, this.b, INT); + } } -})(Proton); +} \ No newline at end of file diff --git a/src/math/Vector2D.js b/src/math/Vector2D.js index b675e24..9df14b0 100644 --- a/src/math/Vector2D.js +++ b/src/math/Vector2D.js @@ -1,275 +1,164 @@ -//@author mrdoob / http://mrdoob.com/ -(function(Proton, undefined) { - var Vector2D = function(x, y) { - this.x = x || 0; - this.y = y || 0; - } +import MathUtils from '../math/MathUtils'; - Vector2D.prototype = { - set : function(x, y) { +export default class Vector2D { + + constructor(x, y) { + this.x = x || 0; + this.y = y || 0; + } + + set(x, y) { + this.x = x; + this.y = y; + return this; + } - this.x = x; - this.y = y; - return this; + setX(x) { + this.x = x; + return this; + } + + setY(y) { + this.y = y; + return this; + } + + getGradient() { + if (this.x != 0) + return Math.atan2(this.y, this.x); + else if (this.y > 0) + return MathUtils.PI_2; + else if (this.y < 0) + return -MathUtils.PI_2; + } - }, + copy(v) { + this.x = v.x; + this.y = v.y; - setX : function(x) { + return this; + } - this.x = x; - return this; + add(v, w) { + if (w !== undefined) { + return this.addVectors(v, w); + } - }, + this.x += v.x; + this.y += v.y; - setY : function(y) { + return this; + } - this.y = y; + addXY(a, b) { + this.x += a; + this.y += b; - return this; + return this; + } - }, + addVectors(a, b) { + this.x = a.x + b.x; + this.y = a.y + b.y; - getGradient : function() { - if (this.x != 0) - return Math.atan2(this.y, this.x); - else if (this.y > 0) - return Math.PI / 2; - else if (this.y < 0) - return -Math.PI / 2; - }, + return this; + } + + sub(v, w) { + if (w !== undefined) { + return this.subVectors(v, w); + } + + this.x -= v.x; + this.y -= v.y; + + return this; + } + + subVectors(a, b) { + this.x = a.x - b.x; + this.y = a.y - b.y; + + return this; + } + + divideScalar(s) { + if (s !== 0) { + this.x /= s; + this.y /= s; + } else { + this.set(0, 0); + } + + return this; + } + + multiplyScalar(s) { + this.x *= s; + this.y *= s; + + return this; + } - copy : function(v) { + negate() { + return this.multiplyScalar(-1); + } + + dot(v) { + return this.x * v.x + this.y * v.y; + } + + lengthSq() { + return this.x * this.x + this.y * this.y; + } - this.x = v.x; - this.y = v.y; + length() { + return Math.sqrt(this.x * this.x + this.y * this.y); + } - return this; + normalize() { + return this.divideScalar(this.length()); + } - }, + distanceTo(v) { + return Math.sqrt(this.distanceToSquared(v)); + } - add : function(v, w) { + rotate(tha) { + const x = this.x; + const y = this.y; - if (w !== undefined) { - return this.addVectors(v, w); + this.x = x * Math.cos(tha) + y * Math.sin(tha); + this.y = -x * Math.sin(tha) + y * Math.cos(tha); - } + return this; + } - this.x += v.x; - this.y += v.y; + distanceToSquared(v) { + const dx = this.x - v.x; + const dy = this.y - v.y; - return this; + return dx * dx + dy * dy; + } - }, + lerp(v, alpha) { + this.x += (v.x - this.x) * alpha; + this.y += (v.y - this.y) * alpha; - addXY : function(a, b) { + return this; + } - this.x += a; - this.y += b; + equals(v) { + return ((v.x === this.x) && (v.y === this.y)); + } - return this; + clear() { + this.x = 0.0; + this.y = 0.0; + return this; + } - }, - - addVectors : function(a, b) { - - this.x = a.x + b.x; - this.y = a.y + b.y; - - return this; - - }, - - addScalar : function(s) { - - this.x += s; - this.y += s; - - return this; - - }, - - sub : function(v, w) { - - if (w !== undefined) { - return this.subVectors(v, w); - - } - - this.x -= v.x; - this.y -= v.y; - - return this; - - }, - - subVectors : function(a, b) { - - this.x = a.x - b.x; - this.y = a.y - b.y; - - return this; - - }, - - multiplyScalar : function(s) { - - this.x *= s; - this.y *= s; - - return this; - - }, - - divideScalar : function(s) { - - if (s !== 0) { - - this.x /= s; - this.y /= s; - - } else { - - this.set(0, 0); - - } - - return this; - - }, - - min : function(v) { - - if (this.x > v.x) { - - this.x = v.x; - - } - - if (this.y > v.y) { - - this.y = v.y; - - } - - return this; - - }, - - max : function(v) { - - if (this.x < v.x) { - - this.x = v.x; - - } - - if (this.y < v.y) { - - this.y = v.y; - - } - - return this; - - }, - - negate : function() { - - return this.multiplyScalar(-1); - - }, - - dot : function(v) { - - return this.x * v.x + this.y * v.y; - - }, - - lengthSq : function() { - - return this.x * this.x + this.y * this.y; - - }, - - length : function() { - - return Math.sqrt(this.x * this.x + this.y * this.y); - - }, - - normalize : function() { - - return this.divideScalar(this.length()); - - }, - - distanceTo : function(v) { - - return Math.sqrt(this.distanceToSquared(v)); - - }, - - rotate : function(tha) { - var x = this.x; - var y = this.y; - this.x = x * Math.cos(tha) + y * Math.sin(tha); - this.y = -x * Math.sin(tha) + y * Math.cos(tha); - return this; - }, - - distanceToSquared : function(v) { - - var dx = this.x - v.x, dy = this.y - v.y; - return dx * dx + dy * dy; - - }, - - setLength : function(l) { - - var oldLength = this.length(); - - if (oldLength !== 0 && l !== oldLength) { - - this.multiplyScalar(l / oldLength); - } - - return this; - - }, - - lerp : function(v, alpha) { - - this.x += (v.x - this.x ) * alpha; - this.y += (v.y - this.y ) * alpha; - - return this; - - }, - - equals : function(v) { - - return ((v.x === this.x ) && (v.y === this.y ) ); - - }, - - toArray : function() { - - return [this.x, this.y]; - - }, - - clear : function() { - this.x = 0.0; - this.y = 0.0; - return this; - }, - - clone : function() { - - return new Proton.Vector2D(this.x, this.y); - - } - }; - - Proton.Vector2D = Vector2D; -})(Proton); + clone() { + return new Vector2D(this.x, this.y); + } +} \ No newline at end of file diff --git a/src/math/ease.js b/src/math/ease.js new file mode 100644 index 0000000..be6b306 --- /dev/null +++ b/src/math/ease.js @@ -0,0 +1,124 @@ +import MathUtils from './MathUtils'; + +export default { + + easeLinear(value) { + return value; + }, + + easeInQuad(value) { + return Math.pow(value, 2); + }, + + easeOutQuad(value) { + return -(Math.pow((value - 1), 2) - 1); + }, + + easeInOutQuad(value) { + if ((value /= 0.5) < 1) + return 0.5 * Math.pow(value, 2); + + return -0.5 * ((value -= 2) * value - 2); + }, + + easeInCubic(value) { + return Math.pow(value, 3); + }, + + easeOutCubic(value) { + return (Math.pow((value - 1), 3) + 1); + }, + + easeInOutCubic(value) { + if ((value /= 0.5) < 1) + return 0.5 * Math.pow(value, 3); + + return 0.5 * (Math.pow((value - 2), 3) + 2); + }, + + easeInQuart(value) { + return Math.pow(value, 4); + }, + + easeOutQuart(value) { + return -(Math.pow((value - 1), 4) - 1); + }, + + easeInOutQuart(value) { + if ((value /= 0.5) < 1) + return 0.5 * Math.pow(value, 4); + + return -0.5 * ((value -= 2) * Math.pow(value, 3) - 2); + }, + + easeInSine(value) { + return -Math.cos(value * (MathUtils.PI_2)) + 1; + }, + + easeOutSine(value) { + return Math.sin(value * (MathUtils.PI_2)); + }, + + easeInOutSine(value) { + return (-0.5 * (Math.cos(MathUtils.PI * value) - 1)); + }, + + easeInExpo(value) { + return (value === 0) ? 0 : Math.pow(2, 10 * (value - 1)); + }, + + easeOutExpo(value) { + return (value === 1) ? 1 : -Math.pow(2, -10 * value) + 1; + }, + + easeInOutExpo(value) { + if (value === 0) + return 0; + + if (value === 1) + return 1; + + if ((value /= 0.5) < 1) + return 0.5 * Math.pow(2, 10 * (value - 1)); + + return 0.5 * (-Math.pow(2, -10 * --value) + 2); + }, + + easeInCirc(value) { + return -(Math.sqrt(1 - (value * value)) - 1); + }, + + easeOutCirc(value) { + return Math.sqrt(1 - Math.pow((value - 1), 2)); + }, + + easeInOutCirc(value) { + if ((value /= 0.5) < 1) + return -0.5 * (Math.sqrt(1 - value * value) - 1); + return 0.5 * (Math.sqrt(1 - (value -= 2) * value) + 1); + }, + + easeInBack(value) { + let s = 1.70158; + return (value) * value * ((s + 1) * value - s); + }, + + easeOutBack(value) { + let s = 1.70158; + return (value = value - 1) * value * ((s + 1) * value + s) + 1; + }, + + easeInOutBack(value) { + let s = 1.70158; + if ((value /= 0.5) < 1) + return 0.5 * (value * value * (((s *= (1.525)) + 1) * value - s)); + return 0.5 * ((value -= 2) * value * (((s *= (1.525)) + 1) * value + s) + 2); + }, + + getEasing(ease) { + if (typeof ease === 'function') + return ease; + else + return this[ease] || this.easeLinear; + } +}; \ No newline at end of file diff --git a/src/plus/ease.js b/src/plus/ease.js deleted file mode 100644 index f70b1b9..0000000 --- a/src/plus/ease.js +++ /dev/null @@ -1,124 +0,0 @@ -(function(Proton, undefined) { - var ease = ease || { - easeLinear : function(value) { - return value; - }, - - easeInQuad : function(value) { - return Math.pow(value, 2); - }, - - easeOutQuad : function(value) { - return -(Math.pow((value - 1), 2) - 1); - }, - - easeInOutQuad : function(value) { - if ((value /= 0.5) < 1) - return 0.5 * Math.pow(value, 2); - return -0.5 * ((value -= 2) * value - 2); - }, - - easeInCubic : function(value) { - return Math.pow(value, 3); - }, - - easeOutCubic : function(value) { - return (Math.pow((value - 1), 3) + 1); - }, - - easeInOutCubic : function(value) { - if ((value /= 0.5) < 1) - return 0.5 * Math.pow(value, 3); - return 0.5 * (Math.pow((value - 2), 3) + 2); - }, - - easeInQuart : function(value) { - return Math.pow(value, 4); - }, - - easeOutQuart : function(value) { - return -(Math.pow((value - 1), 4) - 1); - }, - - easeInOutQuart : function(value) { - if ((value /= 0.5) < 1) - return 0.5 * Math.pow(value, 4); - return -0.5 * ((value -= 2) * Math.pow(value, 3) - 2); - }, - - easeInSine : function(value) { - return -Math.cos(value * (Math.PI / 2)) + 1; - }, - - easeOutSine : function(value) { - return Math.sin(value * (Math.PI / 2)); - }, - - easeInOutSine : function(value) { - return (-0.5 * (Math.cos(Math.PI * value) - 1)); - }, - - easeInExpo : function(value) { - return (value === 0) ? 0 : Math.pow(2, 10 * (value - 1)); - }, - - easeOutExpo : function(value) { - return (value === 1) ? 1 : -Math.pow(2, -10 * value) + 1; - }, - - easeInOutExpo : function(value) { - if (value === 0) - return 0; - if (value === 1) - return 1; - if ((value /= 0.5) < 1) - return 0.5 * Math.pow(2, 10 * (value - 1)); - return 0.5 * (-Math.pow(2, -10 * --value) + 2); - }, - - easeInCirc : function(value) { - return -(Math.sqrt(1 - (value * value)) - 1); - }, - - easeOutCirc : function(value) { - return Math.sqrt(1 - Math.pow((value - 1), 2)); - }, - - easeInOutCirc : function(value) { - if ((value /= 0.5) < 1) - return -0.5 * (Math.sqrt(1 - value * value) - 1); - return 0.5 * (Math.sqrt(1 - (value -= 2) * value) + 1); - }, - - easeInBack : function(value) { - var s = 1.70158; - return (value) * value * ((s + 1) * value - s); - }, - - easeOutBack : function(value) { - var s = 1.70158; - return ( value = value - 1) * value * ((s + 1) * value + s) + 1; - }, - - easeInOutBack : function(value) { - var s = 1.70158; - if ((value /= 0.5) < 1) - return 0.5 * (value * value * (((s *= (1.525)) + 1) * value - s)); - return 0.5 * ((value -= 2) * value * (((s *= (1.525)) + 1) * value + s) + 2); - }, - - setEasingByName: function(easeName) { - if (!!ease[easeName]) - return ease[easeName]; - else - return ease.easeLinear; - } - } - - for (var key in ease) { - if (key != "setEasingByName") Proton[key] = ease[key]; - } - - Proton.ease = ease; - -})(Proton); diff --git a/src/plus/requestAnimationFrame.js b/src/polyfill/requestAnimationFrame.js similarity index 100% rename from src/plus/requestAnimationFrame.js rename to src/polyfill/requestAnimationFrame.js diff --git a/src/render/BaseRender.js b/src/render/BaseRender.js deleted file mode 100644 index 6da08f4..0000000 --- a/src/render/BaseRender.js +++ /dev/null @@ -1,91 +0,0 @@ -(function(Proton, undefined) { - function BaseRender(proton, element, stroke) { - this.proton = proton; - this.element = element; - this.stroke = stroke; - this.pool = new Proton.Pool(); - } - - - BaseRender.prototype = { - start : function() { - var self = this; - this.proton.addEventListener(Proton.PROTON_UPDATE, function() { - self.onProtonUpdate.call(self); - }); - - this.proton.addEventListener(Proton.PROTON_UPDATE_AFTER, function() { - self.onProtonUpdateAfter.call(self); - }); - - this.proton.addEventListener(Proton.EMITTER_ADDED, function(emitter) { - self.onEmitterAdded.call(self, emitter); - }); - - this.proton.addEventListener(Proton.EMITTER_REMOVED, function(emitter) { - self.onEmitterRemoved.call(self, emitter); - }); - - var length = this.proton.emitters.length, i; - for ( i = 0; i < length; i++) { - var emitter = this.proton.emitters[i]; - this.addEmitterListener(emitter); - } - }, - - resize : function(width, height) { - }, - - addEmitterListener : function(emitter) { - var self = this; - emitter.addEventListener(Proton.PARTICLE_CREATED, function(particle) { - self.onParticleCreated.call(self, particle); - }); - emitter.addEventListener(Proton.PARTICLE_UPDATE, function(particle) { - self.onParticleUpdate.call(self, particle); - }); - emitter.addEventListener(Proton.PARTICLE_DEAD, function(particle) { - self.onParticleDead.call(self, particle); - }); - }, - - stop : function() { - var length = this.proton.emitters.length, i; - this.proton.removeAllEventListeners(); - for ( i = 0; i < length; i++) { - var emitter = this.proton.emitters[i]; - emitter.removeAllEventListeners(); - } - }, - - onEmitterAdded : function(emitter) { - this.addEmitterListener(emitter); - }, - - onEmitterRemoved : function(emitter) { - emitter.removeAllEventListeners(); - }, - - onProtonUpdate : function() { - - }, - - onProtonUpdateAfter : function() { - - }, - - onParticleCreated : function(particle) { - - }, - - onParticleUpdate : function(particle) { - - }, - - onParticleDead : function(particle) { - - } - } - - Proton.BaseRender = BaseRender; -})(Proton); diff --git a/src/render/BaseRenderer.js b/src/render/BaseRenderer.js new file mode 100644 index 0000000..33e1129 --- /dev/null +++ b/src/render/BaseRenderer.js @@ -0,0 +1,77 @@ +import Pool from '../core/Pool'; +import Util from '../utils/Util'; + +export default class BaseRenderer { + + constructor(element, stroke) { + this.element = element; + this.stroke = stroke; + + this.initHandler(); + + this.circleConf = { isCircle: true }; + this.pool = new Pool(); + this.name = 'BaseRenderer'; + } + + setStroke(color, thinkness) { + color = Util.initValue(color, '#000000'); + thinkness = Util.initValue(thinkness, 1); + + this.stroke = { color, thinkness }; + } + + initHandler() { + this._protonUpdateHandler = () => { this.onProtonUpdate.call(this) }; + this._protonUpdateAfterHandler = () => { this.onProtonUpdateAfter.call(this) }; + this._emitterAddedHandler = (emitter) => { this.onEmitterAdded.call(this, emitter) }; + this._emitterRemovedHandler = (emitter) => { this.onEmitterRemoved.call(this, emitter) }; + this._particleCreatedHandler = (particle) => { this.onParticleCreated.call(this, particle) }; + this._particleUpdateHandler = (particle) => { this.onParticleUpdate.call(this, particle) }; + this._particleDeadHandler = (particle) => { this.onParticleDead.call(this, particle) }; + } + + init(proton) { + this.parent = proton; + + proton.addEventListener(Proton.PROTON_UPDATE, this._protonUpdateHandler); + proton.addEventListener(Proton.PROTON_UPDATE_AFTER, this._protonUpdateAfterHandler); + + proton.addEventListener(Proton.EMITTER_ADDED, this._emitterAddedHandler); + proton.addEventListener(Proton.EMITTER_REMOVED, this._emitterRemovedHandler); + + proton.addEventListener(Proton.PARTICLE_CREATED, this._particleCreatedHandler); + proton.addEventListener(Proton.PARTICLE_UPDATE, this._particleUpdateHandler); + proton.addEventListener(Proton.PARTICLE_DEAD, this._particleDeadHandler); + } + + resize(width, height) {} + + remove(proton) { + this.parent.removeEventListener(Proton.PROTON_UPDATE, this._protonUpdateHandler); + this.parent.removeEventListener(Proton.PROTON_UPDATE_AFTER, this._protonUpdateAfterHandler); + + this.parent.removeEventListener(Proton.EMITTER_ADDED, this._emitterAddedHandler); + this.parent.removeEventListener(Proton.EMITTER_REMOVED, this._emitterRemovedHandler); + + this.parent.removeEventListener(Proton.PARTICLE_CREATED, this._particleCreatedHandler); + this.parent.removeEventListener(Proton.PARTICLE_UPDATE, this._particleUpdateHandler); + this.parent.removeEventListener(Proton.PARTICLE_DEAD, this._particleDeadHandler); + + this.parent = null; + } + + destroy(){ + this.remove(); + } + + onProtonUpdate() {} + onProtonUpdateAfter() {} + + onEmitterAdded(emitter) {} + onEmitterRemoved(emitter) {} + + onParticleCreated(particle) {} + onParticleUpdate(particle) {} + onParticleDead(particle) {} +} \ No newline at end of file diff --git a/src/render/CanvasRender.js b/src/render/CanvasRender.js deleted file mode 100644 index cfc6945..0000000 --- a/src/render/CanvasRender.js +++ /dev/null @@ -1,108 +0,0 @@ -(function(Proton, undefined) { - function CanvasRender(proton, element) { - CanvasRender._super_.call(this, proton, element); - this.stroke = null; - this.context = this.element.getContext("2d"); - this.bufferCache = {}; - } - - - Proton.Util.inherits(CanvasRender, Proton.BaseRender); - CanvasRender.prototype.resize = function(width, height) { - this.element.width = width; - this.element.height = height; - } - CanvasRender.prototype.start = function() { - CanvasRender._super_.prototype.start.call(this); - } - - CanvasRender.prototype.setStroke = function(color, thinkness) { - color = Proton.Util.initValue(color, '#000000'); - thinkness = Proton.Util.initValue(thinkness, 1); - this.stroke = { - color : color, - thinkness : thinkness - }; - } - - CanvasRender.prototype.onProtonUpdate = function() { - this.context.clearRect(0, 0, this.element.width, this.element.height); - } - - CanvasRender.prototype.onParticleCreated = function(particle) { - if (particle.target) - Proton.Util.getImage(particle.target, particle, false); - else - particle.color = particle.color ? particle.color : '#ff0000'; - } - - CanvasRender.prototype.onParticleUpdate = function(particle) { - if (particle.target) { - if (particle.target instanceof Image) { - var w = particle.target.width * particle.scale | 0; - var h = particle.target.height * particle.scale | 0; - var x = particle.p.x - w / 2; - var y = particle.p.y - h / 2; - - if (!!particle.color) { - if (!particle.transform["buffer"]) - particle.transform.buffer = this.getBuffer(particle.target); - var bufferContext = particle.transform.buffer.getContext('2d'); - bufferContext.clearRect(0, 0, particle.transform.buffer.width, particle.transform.buffer.height); - bufferContext.globalAlpha = particle.alpha; - bufferContext.drawImage(particle.target, 0, 0); - bufferContext.globalCompositeOperation = "source-atop"; - bufferContext.fillStyle = Proton.Util.rgbToHex(particle.transform.rgb); - bufferContext.fillRect(0, 0, particle.transform.buffer.width, particle.transform.buffer.height); - bufferContext.globalCompositeOperation = "source-over"; - bufferContext.globalAlpha = 1; - this.context.drawImage(particle.transform.buffer, 0, 0, particle.transform.buffer.width, particle.transform.buffer.height, x, y, w, h); - } else { - this.context.save(); - this.context.globalAlpha = particle.alpha; - this.context.translate(particle.p.x, particle.p.y); - this.context.rotate(Proton.MathUtils.degreeTransform(particle.rotation)); - this.context.translate(-particle.p.x, -particle.p.y); - this.context.drawImage(particle.target, 0, 0, particle.target.width, particle.target.height, x, y, w, h); - this.context.globalAlpha = 1; - this.context.restore(); - } - } - } else { - if (particle.transform["rgb"]) - this.context.fillStyle = 'rgba(' + particle.transform.rgb.r + ',' + particle.transform.rgb.g + ',' + particle.transform.rgb.b + ',' + particle.alpha + ')'; - else - this.context.fillStyle = particle.color; - this.context.beginPath(); - this.context.arc(particle.p.x, particle.p.y, particle.radius, 0, Math.PI * 2, true); - if (this.stroke) { - this.context.strokeStyle = this.stroke.color; - this.context.lineWidth = this.stroke.thinkness; - this.context.stroke(); - } - - this.context.closePath(); - this.context.fill(); - } - } - - CanvasRender.prototype.onParticleDead = function(particle) { - - } - - CanvasRender.prototype.getBuffer = function(image) { - if ( image instanceof Image) { - var size = image.width + '_' + image.height; - var canvas = this.bufferCache[size]; - if (!canvas) { - canvas = document.createElement('canvas'); - canvas.width = image.width; - canvas.height = image.height; - this.bufferCache[size] = canvas; - } - return canvas; - } - } - - Proton.CanvasRender = CanvasRender; -})(Proton); diff --git a/src/render/CanvasRenderer.js b/src/render/CanvasRenderer.js new file mode 100644 index 0000000..6df6166 --- /dev/null +++ b/src/render/CanvasRenderer.js @@ -0,0 +1,126 @@ +import Util from '../utils/Util'; +import ImgUtil from '../utils/ImgUtil'; +import ColorUtil from '../utils/ColorUtil'; +import MathUtils from '../math/MathUtils'; +import BaseRenderer from './BaseRenderer'; + +export default class CanvasRenderer extends BaseRenderer { + + constructor(element) { + super(element); + + this.stroke = null; + this.context = this.element.getContext("2d"); + this.bufferCache = {}; + + this.name = 'CanvasRenderer'; + } + + resize(width, height) { + this.element.width = width; + this.element.height = height; + } + + onProtonUpdate() { + this.context.clearRect(0, 0, this.element.width, this.element.height); + } + + onParticleCreated(particle) { + if (particle.body) + ImgUtil.getImgFromCache(particle.body, this.addImg2Body, particle); + else + particle.color = particle.color || '#ff0000'; + } + + onParticleUpdate(particle) { + if (particle.body) { + if (particle.body instanceof Image) this.drawImage(particle); + } else { + this.drawCircle(particle); + } + } + + onParticleDead(particle) { + particle.body = null; + } + + + // private + addImg2Body(img, particle) { + particle.body = img; + } + + // private drawCircle -- + drawImage(particle) { + const w = particle.body.width * particle.scale | 0; + const h = particle.body.height * particle.scale | 0; + const x = particle.p.x - w / 2; + const y = particle.p.y - h / 2; + + if (!!particle.color) { + if (!particle.transform["buffer"]) particle.transform.buffer = this.createBuffer(particle.body); + + const bufferContext = particle.transform.buffer.getContext('2d'); + bufferContext.clearRect(0, 0, particle.transform.buffer.width, particle.transform.buffer.height); + bufferContext.globalAlpha = particle.alpha; + bufferContext.drawImage(particle.body, 0, 0); + + bufferContext.globalCompositeOperation = "source-atop"; + bufferContext.fillStyle = ColorUtil.rgbToHex(particle.transform.rgb); + bufferContext.fillRect(0, 0, particle.transform.buffer.width, particle.transform.buffer.height); + bufferContext.globalCompositeOperation = "source-over"; + bufferContext.globalAlpha = 1; + + this.context.drawImage(particle.transform.buffer, 0, 0, particle.transform.buffer.width, particle.transform.buffer.height, x, y, w, h); + } else { + this.context.save(); + + this.context.globalAlpha = particle.alpha; + this.context.translate(particle.p.x, particle.p.y); + this.context.rotate(MathUtils.degreeTransform(particle.rotation)); + this.context.translate(-particle.p.x, -particle.p.y); + this.context.drawImage(particle.body, 0, 0, particle.body.width, particle.body.height, x, y, w, h); + + this.context.globalAlpha = 1; + this.context.restore(); + } + } + + // private drawCircle -- + drawCircle(particle) { + if (particle.transform["rgb"]) + this.context.fillStyle = 'rgba(' + particle.transform.rgb.r + ',' + particle.transform.rgb.g + ',' + particle.transform.rgb.b + ',' + particle.alpha + ')'; + else + this.context.fillStyle = particle.color; + + // draw circle + this.context.beginPath(); + this.context.arc(particle.p.x, particle.p.y, particle.radius, 0, Math.PI * 2, true); + + if (this.stroke) { + this.context.strokeStyle = this.stroke.color; + this.context.lineWidth = this.stroke.thinkness; + this.context.stroke(); + } + + this.context.closePath(); + this.context.fill(); + } + + // private createBuffer -- + createBuffer(image) { + if (image instanceof Image) { + const size = image.width + '_' + image.height; + let canvas = this.bufferCache[size]; + + if (!canvas) { + canvas = document.createElement('canvas'); + canvas.width = image.width; + canvas.height = image.height; + this.bufferCache[size] = canvas; + } + + return canvas; + } + } +} \ No newline at end of file diff --git a/src/render/CustomRenderer.js b/src/render/CustomRenderer.js new file mode 100644 index 0000000..fcc83d9 --- /dev/null +++ b/src/render/CustomRenderer.js @@ -0,0 +1,12 @@ +import Util from '../utils/Util'; +import BaseRenderer from './BaseRenderer'; + +export default class CustomRenderer extends BaseRenderer { + + constructor(element) { + super(element); + + this.name = 'CustomRenderer'; + } + +} \ No newline at end of file diff --git a/src/render/DomRender.js b/src/render/DomRender.js deleted file mode 100644 index 88f5bb2..0000000 --- a/src/render/DomRender.js +++ /dev/null @@ -1,90 +0,0 @@ -(function(Proton, undefined) { - function DomRender(proton, element) { - DomRender._super_.call(this, proton, element); - this.stroke = null; - } - - - Proton.Util.inherits(DomRender, Proton.BaseRender); - - DomRender.prototype.start = function() { - DomRender._super_.prototype.start.call(this); - } - - DomRender.prototype.setStroke = function(color, thinkness) { - color = Proton.Util.initValue(color, '#000000'); - thinkness = Proton.Util.initValue(thinkness, 1); - this.stroke = { - color : color, - thinkness : thinkness - }; - } - - DomRender.prototype.onProtonUpdate = function() { - } - - DomRender.prototype.onParticleCreated = function(particle) { - if (particle.target) { - var self = this; - Proton.Util.getImage(particle.target, particle, false, function(particle) { - self.setImgInDIV.call(self, particle); - }); - } else { - particle.transform.canvas = Proton.DomUtil.createCanvas(particle.id + '_canvas', particle.radius + 1, particle.radius + 1, 'absolute'); - particle.transform.bakOldRadius = particle.radius; - - if (this.stroke) { - particle.transform.canvas.width = 2 * particle.radius + this.stroke.thinkness * 2; - particle.transform.canvas.height = 2 * particle.radius + this.stroke.thinkness * 2; - } else { - particle.transform.canvas.width = 2 * particle.radius + 1; - particle.transform.canvas.height = 2 * particle.radius + 1; - } - - particle.transform.context = particle.transform.canvas.getContext('2d'); - particle.transform.context.fillStyle = particle.color; - particle.transform.context.beginPath(); - particle.transform.context.arc(particle.radius, particle.radius, particle.radius, 0, Math.PI * 2, true); - - if (this.stroke) { - particle.transform.context.strokeStyle = this.stroke.color; - particle.transform.context.lineWidth = this.stroke.thinkness; - particle.transform.context.stroke(); - } - - particle.transform.context.closePath(); - particle.transform.context.fill(); - this.element.appendChild(particle.transform.canvas); - } - - } - - DomRender.prototype.onParticleUpdate = function(particle) { - if (particle.target) { - if (particle.target instanceof Image) { - particle.transform.canvas.style.opacity = particle.alpha; - Proton.DomUtil.transformDom(particle.transform.canvas, particle.p.x - particle.target.width / 2, particle.p.y - particle.target.height / 2, particle.scale, particle.rotation); - } - } else { - particle.transform.canvas.style.opacity = particle.alpha; - if (particle.transform['oldRadius']) - Proton.DomUtil.transformDom(particle.transform.canvas, particle.p.x - particle.transform.oldRadius, particle.p.y - particle.transform.oldRadius, particle.scale, particle.rotation); - else - Proton.DomUtil.transformDom(particle.transform.canvas, particle.p.x - particle.transform.bakOldRadius, particle.p.y - particle.transform.bakOldRadius, particle.scale, particle.rotation); - } - } - - DomRender.prototype.onParticleDead = function(particle) { - if (particle.transform.canvas) - this.element.removeChild(particle.transform.canvas); - } - - DomRender.prototype.setImgInDIV = function(particle) { - particle.transform.canvas = Proton.DomUtil.createCanvas(particle.id + '_canvas', particle.target.width + 1, particle.target.height + 1, 'absolute', particle.p.x - particle.radius, particle.p.y - particle.radius); - particle.transform.context = particle.transform.canvas.getContext('2d'); - particle.transform.context.drawImage(particle.target, 0, 0, particle.target.width, particle.target.height); - this.element.appendChild(particle.transform.canvas); - } - - Proton.DomRender = DomRender; -})(Proton); diff --git a/src/render/DomRenderer.js b/src/render/DomRenderer.js new file mode 100644 index 0000000..bf5308e --- /dev/null +++ b/src/render/DomRenderer.js @@ -0,0 +1,94 @@ +import Util from '../utils/Util'; +import DomUtil from '../utils/DomUtil'; +import ImgUtil from '../utils/ImgUtil'; +import MathUtils from '../math/MathUtils'; +import BaseRenderer from './BaseRenderer'; + +export default class DomRenderer extends BaseRenderer { + + constructor(element) { + super(element); + + this.stroke = null; + this.pool.create = (body, particle) => this.createBody(body, particle); + this.addImg2Body = this.addImg2Body.bind(this); + + this.transform3d = false; + + this.name = 'DomRenderer'; + } + + onParticleCreated(particle) { + if (particle.body) { + ImgUtil.getImgFromCache(particle.body, this.addImg2Body, particle); + } else { + particle.body = this.pool.get(this.circleConf, particle); + this.element.appendChild(particle.body); + } + } + + onParticleUpdate(particle) { + if (this.bodyReady(particle)) { + if (this.transform3d) + DomUtil.transform3d(particle.body, particle.p.x, particle.p.y, particle.scale, particle.rotation); + else + DomUtil.transform(particle.body, particle.p.x, particle.p.y, particle.scale, particle.rotation); + + particle.body.style.opacity = particle.alpha; + if (particle.body.isCircle) { + particle.body.style.backgroundColor = particle.color || '#ff0000'; + } + } + } + + onParticleDead(particle) { + if (this.bodyReady(particle)) { + this.element.removeChild(particle.body); + this.pool.expire(particle.body); + particle.body = null; + } + } + + bodyReady(particle) { + return typeof particle.body === 'object' && particle.body && !particle.body.isInner; + } + + // private + addImg2Body(img, particle) { + if (particle.dead) return; + particle.body = this.pool.get(img, particle); + DomUtil.resize(particle.body, img.width, img.height); + + this.element.appendChild(particle.body); + } + + createBody(body, particle) { + if (body.isCircle) + return this.createCircle(particle); + else + return this.createSprite(body, particle); + } + + // private -- + createCircle(particle) { + const dom = DomUtil.createDiv(`${particle.id}_dom`, 2 * particle.radius, 2 * particle.radius); + dom.style.borderRadius = `${particle.radius}px`; + + if (this.stroke) { + dom.style.borderColor = this.stroke.color; + dom.style.borderWidth = `${this.stroke.thinkness}px`; + } + dom.isCircle = true; + + return dom; + } + + createSprite(body, particle) { + const url = typeof body === 'string' ? body : body.src; + const dom = DomUtil.createDiv(`${particle.id}_dom`, body.width, body.height); + dom.style.backgroundImage = `url(${url})`; + + return dom; + } + +} \ No newline at end of file diff --git a/src/render/EaselRender.js b/src/render/EaselRender.js deleted file mode 100644 index a2092e1..0000000 --- a/src/render/EaselRender.js +++ /dev/null @@ -1,66 +0,0 @@ -(function(Proton, undefined) { - function EaselRender(proton, element, stroke) { - EaselRender._super_.call(this, proton, element); - this.stroke = stroke; - } - - - Proton.Util.inherits(EaselRender, Proton.BaseRender); - EaselRender.prototype.resize = function(width, height) { - - } - EaselRender.prototype.start = function() { - EaselRender._super_.prototype.start.call(this); - }; - - EaselRender.prototype.onProtonUpdate = function() { - - } - - EaselRender.prototype.onParticleCreated = function(particle) { - if (particle.target) { - particle.target = this.pool.get(particle.target); - if (!particle.target.parent) { - if (!!particle.target['image']) { - particle.target.regX = particle.target.image.width / 2; - particle.target.regY = particle.target.image.height / 2; - } - this.element.addChild(particle.target); - } - } else { - var graphics = this.pool.get(createjs.Graphics); - if (this.stroke) { - if (this.stroke == true) { - graphics.beginStroke('#000000'); - } else if (this.stroke instanceof String) { - graphics.beginStroke(this.stroke); - } - } - - graphics.beginFill(particle.color).drawCircle(0, 0, particle.radius); - var shape = new createjs.Shape(graphics); - particle.target = shape; - this.element.addChild(particle.target); - } - } - - EaselRender.prototype.onParticleUpdate = function(particle) { - if (particle.target) { - particle.target.x = particle.p.x; - particle.target.y = particle.p.y; - particle.target.alpha = particle.alpha; - particle.target.scaleX = particle.target.scaleY = particle.scale; - particle.target.rotation = particle.rotation; - } - } - - EaselRender.prototype.onParticleDead = function(particle) { - if (particle.target) { - particle.target.parent && particle.target.parent.removeChild(particle.target); - this.pool.set(particle.target); - particle.target = null; - } - } - - Proton.EaselRender = EaselRender; -})(Proton); diff --git a/src/render/EaselRenderer.js b/src/render/EaselRenderer.js new file mode 100644 index 0000000..9c677b1 --- /dev/null +++ b/src/render/EaselRenderer.js @@ -0,0 +1,72 @@ +import Util from '../utils/Util'; +import BaseRenderer from './BaseRenderer'; + +export default class EaselRenderer extends BaseRenderer { + + constructor(element, stroke) { + super(element); + + this.stroke = stroke; + this.name = 'EaselRenderer'; + } + + onParticleCreated(particle) { + if (particle.body) { + this.createSprite(particle); + } else { + this.createCircle(particle); + } + + this.element.addChild(particle.body); + } + + onParticleUpdate(particle) { + if (particle.body) { + particle.body.x = particle.p.x; + particle.body.y = particle.p.y; + + particle.body.alpha = particle.alpha; + particle.body.scaleX = particle.body.scaleY = particle.scale; + particle.body.rotation = particle.rotation; + } + } + + onParticleDead(particle) { + if (particle.body) { + particle.body.parent && particle.body.parent.removeChild(particle.body); + this.pool.expire(particle.body); + particle.body = null; + } + + if (particle.graphics) this.pool.expire(particle.graphics); + } + + // private + createSprite(particle) { + particle.body = this.pool.get(particle.body); + + if (particle.body.parent) return; + if (particle.body['image']) { + particle.body.regX = particle.body.image.width / 2; + particle.body.regY = particle.body.image.height / 2; + } + } + + createCircle(particle) { + const graphics = this.pool.get(createjs.Graphics); + + if (this.stroke) { + if (this.stroke instanceof String) + graphics.beginStroke(this.stroke); + else + graphics.beginStroke('#000000'); + } + graphics.beginFill(particle.color || '#ff0000').drawCircle(0, 0, particle.radius); + + const shape = this.pool.get(createjs.Shape, [graphics]); + + particle.body = shape; + particle.graphics = graphics; + } + +} \ No newline at end of file diff --git a/src/render/PixelRender.js b/src/render/PixelRender.js deleted file mode 100644 index 0322d49..0000000 --- a/src/render/PixelRender.js +++ /dev/null @@ -1,67 +0,0 @@ -(function(Proton, undefined) { - function PixelRender(proton, element, rectangle) { - PixelRender._super_.call(this, proton, element); - this.context = this.element.getContext('2d'); - this.imageData = null; - this.rectangle = null; - this.rectangle = rectangle; - this.createImageData(rectangle); - } - - - Proton.Util.inherits(PixelRender, Proton.BaseRender); - PixelRender.prototype.resize = function(width, height) { - this.element.width = width; - this.element.height = height; - } - PixelRender.prototype.createImageData = function(rectangle) { - if (!rectangle) - this.rectangle = new Proton.Rectangle(0, 0, this.element.width, this.element.height); - else - this.rectangle = rectangle; - this.imageData = this.context.createImageData(this.rectangle.width, this.rectangle.height); - this.context.putImageData(this.imageData, this.rectangle.x, this.rectangle.y); - } - - PixelRender.prototype.start = function() { - PixelRender._super_.prototype.start.call(this); - }; - - PixelRender.prototype.onProtonUpdate = function() { - this.context.clearRect(this.rectangle.x, this.rectangle.y, this.rectangle.width, this.rectangle.height); - this.imageData = this.context.getImageData(this.rectangle.x, this.rectangle.y, this.rectangle.width, this.rectangle.height); - } - - PixelRender.prototype.onProtonUpdateAfter = function() { - this.context.putImageData(this.imageData, this.rectangle.x, this.rectangle.y); - } - - PixelRender.prototype.onParticleCreated = function(particle) { - - } - - PixelRender.prototype.onParticleUpdate = function(particle) { - if (this.imageData) { - this.setPixel(this.imageData, Math.floor(particle.p.x - this.rectangle.x), Math.floor(particle.p.y - this.rectangle.y), particle); - } - } - - PixelRender.prototype.setPixel = function(imagedata, x, y, particle) { - var rgb = particle.transform.rgb; - if ((x < 0) || (x > this.element.width) || (y < 0) || (y > this.elementwidth)) - return; - - var i = ((y >> 0) * imagedata.width + (x >> 0)) * 4; - - imagedata.data[i] = rgb.r; - imagedata.data[i + 1] = rgb.g; - imagedata.data[i + 2] = rgb.b; - imagedata.data[i + 3] = particle.alpha * 255; - } - - PixelRender.prototype.onParticleDead = function(particle) { - - } - - Proton.PixelRender = PixelRender; -})(Proton); diff --git a/src/render/PixelRenderer.js b/src/render/PixelRenderer.js new file mode 100644 index 0000000..228ff78 --- /dev/null +++ b/src/render/PixelRenderer.js @@ -0,0 +1,65 @@ +import Util from '../utils/Util'; +import Rectangle from '../math/Rectangle'; +import BaseRenderer from './BaseRenderer'; + +export default class PixelRenderer extends BaseRenderer { + + constructor(element, rectangle) { + super(element); + + this.context = this.element.getContext('2d'); + this.imageData = null; + this.rectangle = null; + this.rectangle = rectangle; + this.createImageData(rectangle); + + this.name = 'PixelRenderer'; + } + + resize(width, height) { + this.element.width = width; + this.element.height = height; + } + + createImageData(rectangle) { + this.rectangle = rectangle ? rectangle : new Rectangle(0, 0, this.element.width, this.element.height); + this.imageData = this.context.createImageData(this.rectangle.width, this.rectangle.height); + this.context.putImageData(this.imageData, this.rectangle.x, this.rectangle.y); + } + + onProtonUpdate() { + this.context.clearRect(this.rectangle.x, this.rectangle.y, this.rectangle.width, this.rectangle.height); + this.imageData = this.context.getImageData(this.rectangle.x, this.rectangle.y, this.rectangle.width, this.rectangle.height); + } + + onProtonUpdateAfter() { + this.context.putImageData(this.imageData, this.rectangle.x, this.rectangle.y); + } + + onParticleCreated(particle) {} + + onParticleUpdate(particle) { + if (this.imageData) { + this.setPixel(this.imageData, Math.floor(particle.p.x - this.rectangle.x), Math.floor(particle.p.y - this.rectangle.y), particle); + } + } + + setPixel(imagedata, x, y, particle) { + const rgb = particle.transform.rgb; + + if ((x < 0) || (x > this.element.width) || (y < 0) || (y > this.elementwidth)) + return; + + const i = ((y >> 0) * imagedata.width + (x >> 0)) * 4; + + imagedata.data[i] = rgb.r; + imagedata.data[i + 1] = rgb.g; + imagedata.data[i + 2] = rgb.b; + imagedata.data[i + 3] = particle.alpha * 255; + } + + onParticleDead(particle) { + + } + +} \ No newline at end of file diff --git a/src/render/PixiRender.js b/src/render/PixiRender.js deleted file mode 100644 index 743cf61..0000000 --- a/src/render/PixiRender.js +++ /dev/null @@ -1,76 +0,0 @@ -(function ( Proton, undefined ) { - - function PixiRender ( proton, element, stroke ) { - PixiRender._super_.call( this, proton, element ); - this.stroke = stroke; - } - - Proton.Util.inherits( PixiRender, Proton.BaseRender ); - - PixiRender.prototype.PI_180 = Math.PI / 180; - - PixiRender.prototype.resize = function ( width, height ) { - - }; - - PixiRender.prototype.start = function () { - PixiRender._super_.prototype.start.call( this ); - }; - - PixiRender.prototype.onProtonUpdate = function () { - - }; - - /** - * @param particle - */ - PixiRender.prototype.onParticleCreated = function ( particle ) { - if ( particle.target ) { - particle.target = this.pool.get(PIXI.Sprite,[particle.target]); - particle.target.anchor.x = 0.5; - particle.target.anchor.y = 0.5; - this.element.addChild( particle.target ); - } else { - var graphics = new PIXI.Graphics(); - if ( this.stroke ) { - if ( this.stroke == true ) { - graphics.beginStroke( '#000000' ); - } else if ( this.stroke instanceof String ) { - graphics.beginStroke( this.stroke ); - } - } - graphics.beginFill( particle.color ); - graphics.drawCircle( 0, 0, particle.radius ); - particle.target = graphics; - this.element.addChild( particle.target ); - } - }; - - /** - * @param particle - */ - PixiRender.prototype.onParticleUpdate = function ( particle ) { - if ( particle.target ) { - particle.target.position.x = particle.p.x; - particle.target.position.y = particle.p.y; - particle.target.alpha = particle.alpha; - particle.target.scale.x = particle.scale; - particle.target.scale.y = particle.scale; - // using cached version of Math.PI / 180 for slight performance increase. - particle.target.rotation = particle.rotation * this.PI_180;// Math.PI / 180; - } - }; - - /** - * @param particle - */ - PixiRender.prototype.onParticleDead = function ( particle ) { - if ( particle.target ) { - this.element.removeChild( particle.target ); - this.pool.set(particle.target); - particle.target=null; - } - }; - - Proton.PixiRender = PixiRender; -})( Proton ); diff --git a/src/render/PixiRenderer.js b/src/render/PixiRenderer.js new file mode 100644 index 0000000..7717c47 --- /dev/null +++ b/src/render/PixiRenderer.js @@ -0,0 +1,105 @@ +import Pool from '../core/Pool'; +import Util from '../utils/Util'; +import ColorUtil from '../utils/ColorUtil'; +import MathUtils from '../math/MathUtils'; +import BaseRenderer from './BaseRenderer'; + +export default class PixiRenderer extends BaseRenderer { + + constructor(element, stroke) { + super(element); + + this.stroke = stroke; + this.setColor = false; + this.pool.create = (body, particle) => this.createBody(body, particle); + this.name = 'PixiRenderer'; + } + + onProtonUpdate() { } + + /** + * @param particle + */ + onParticleCreated(particle) { + if (particle.body) { + particle.body = this.pool.get(particle.body, particle); + } else { + particle.body = this.pool.get(this.circleConf, particle); + } + + this.element.addChild(particle.body); + } + + /** + * @param particle + */ + onParticleUpdate(particle) { + this.transform(particle, particle.body); + if (this.setColor) particle.body.tint = ColorUtil.getHex16FromParticle(particle); + } + + /** + * @param particle + */ + onParticleDead(particle) { + this.element.removeChild(particle.body); + this.pool.expire(particle.body); + particle.body = null; + } + + destroy(particles) { + super.destroy(); + this.pool.destroy(); + + let i = particles.length; + while (i--) { + let particle = particles[i]; + if (particle.body) { + this.element.removeChild(particle.body); + } + } + } + + transform(particle, target) { + target.x = particle.p.x; + target.y = particle.p.y; + + target.alpha = particle.alpha; + + target.scale.x = particle.scale; + target.scale.y = particle.scale; + + // using cached version of MathUtils.PI_180 for slight performance increase. + target.rotation = particle.rotation * MathUtils.PI_180; // MathUtils.PI_180; + } + + createBody(body, particle) { + if (body.isCircle) + return this.createCircle(particle); + else + return this.createSprite(body); + } + + createSprite(body) { + const sprite = body.isInner ? PIXI.Sprite.fromImage(body.src) : new PIXI.Sprite(body); + sprite.anchor.x = 0.5; + sprite.anchor.y = 0.5; + + return sprite; + } + + createCircle(particle) { + const graphics = new PIXI.Graphics(); + + if (this.stroke) { + let stroke = this.stroke instanceof String ? this.stroke : 0x000000; + graphics.beginStroke(this.stroke); + } + + graphics.beginFill(particle.color || 0x008ced); + graphics.drawCircle(0, 0, particle.radius); + graphics.endFill(); + + return graphics; + } +} \ No newline at end of file diff --git a/src/render/Renderer.js b/src/render/Renderer.js deleted file mode 100644 index 1b67bc1..0000000 --- a/src/render/Renderer.js +++ /dev/null @@ -1,103 +0,0 @@ -//the own renderer -(function(Proton, undefined) { - function Renderer(type, proton, element) { - ///element dom/div canvas/canvas easeljs/cantainer(or stage) - this.element = element; - this.type = Proton.Util.initValue(type, 'canvas'); - this.proton = proton; - this.renderer = this.getRenderer(); - } - - - Renderer.prototype = { - start : function() { - this.addEventHandler(); - this.renderer.start(); - }, - stop : function() { - this.renderer.stop(); - }, - - resize : function(width, height) { - this.renderer.resize(width, height); - }, - setStroke : function(color, thinkness) { - if (this.renderer.hasOwnProperty('stroke')) - this.renderer.setStroke(color, thinkness); - else - alert('Sorry this renderer do not suppest stroke method!'); - }, - createImageData : function(data) { - if (this.renderer instanceof Proton.PixelRender) - this.renderer.createImageData(data); - }, - setMaxRadius : function(radius) { - if (this.renderer instanceof Proton.WebGLRender) - this.renderer.setMaxRadius(radius); - }, - blendEquation : function(A) { - if (this.renderer instanceof Proton.WebGLRender) - this.renderer.blendEquation(A); - }, - blendFunc : function(A, B) { - if (this.renderer instanceof Proton.WebGLRender) - this.renderer.blendFunc(A, B); - }, - setType : function(type) { - this.type = type; - this.renderer = this.getRenderer(); - }, - getRenderer : function() { - switch(this.type) { - case 'pixi': - return new Proton.PixiRender(this.proton, this.element); - break; - - case 'dom': - return new Proton.DomRender(this.proton, this.element); - break; - - case 'canvas': - return new Proton.CanvasRender(this.proton, this.element); - break; - - case 'webgl': - return new Proton.WebGLRender(this.proton, this.element); - break; - - case 'easel': - return new Proton.EaselRender(this.proton, this.element); - break; - - case 'easeljs': - return new Proton.EaselRender(this.proton, this.element); - break; - - case 'pixel': - return new Proton.PixelRender(this.proton, this.element); - break; - - default: - return new Proton.BaseRender(this.proton, this.element); - } - }, - render : function(callback) { - this.renderer.render(callback); - }, - addEventHandler : function() { - if (this.onProtonUpdate) - this.renderer.onProtonUpdate = this.onProtonUpdate; - - if (this.onParticleCreated) - this.renderer.onParticleCreated = this.onParticleCreated; - - if (this.onParticleUpdate) - this.renderer.onParticleUpdate = this.onParticleUpdate; - - if (this.onParticleDead) - this.renderer.onParticleDead = this.onParticleDead; - } - } - - Proton.Renderer = Renderer; -})(Proton); diff --git a/src/render/WebGLRender.js b/src/render/WebGLRender.js deleted file mode 100644 index ebcf093..0000000 --- a/src/render/WebGLRender.js +++ /dev/null @@ -1,244 +0,0 @@ -(function(Proton, undefined) { - function WebGLRender(proton, element) { - WebGLRender._super_.call(this, proton, element); - this.gl = this.element.getContext('experimental-webgl', { - antialias : true, - stencil : false, - depth : false - }); - if (!this.gl) - alert("Sorry your browser do not suppest WebGL!"); - this.initVar(); - this.setMaxRadius(); - this.initShaders(); - this.initBuffers(); - this.gl.blendEquation(this.gl.FUNC_ADD); - this.gl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE_MINUS_SRC_ALPHA); - this.gl.enable(this.gl.BLEND); - } - - - Proton.Util.inherits(WebGLRender, Proton.BaseRender); - WebGLRender.prototype.resize = function(width, height) { - this.umat[4] = -2; - this.umat[7] = 1; - this.smat[0] = 1 / width; - this.smat[4] = 1 / height; - this.mstack.set(this.umat, 0); - this.mstack.set(this.smat, 1); - this.gl.viewport(0, 0, width, height); - this.element.width = width; - this.element.height = height; - } - - WebGLRender.prototype.setMaxRadius = function(radius) { - this.circleCanvasURL = this.createCircle(radius); - } - - WebGLRender.prototype.getVertexShader = function() { - var vsSource = ["uniform vec2 viewport;", "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "uniform mat3 tMat;", "varying vec2 vTextureCoord;", "varying float alpha;", "void main() {", "vec3 v = tMat * vec3(aVertexPosition, 1.0);", "gl_Position = vec4(v.x, v.y, 0, 1);", "vTextureCoord = aTextureCoord;", "alpha = tMat[0][2];", "}"].join("\n"); - return vsSource; - } - - WebGLRender.prototype.getFragmentShader = function() { - var fsSource = ["precision mediump float;", "varying vec2 vTextureCoord;", "varying float alpha;", "uniform sampler2D uSampler;", "uniform vec4 color;", "uniform bool useTexture;", "uniform vec3 uColor;", "void main() {", "vec4 textureColor = texture2D(uSampler, vTextureCoord);", "gl_FragColor = textureColor * vec4(uColor, 1.0);", "gl_FragColor.w *= alpha;", "}"].join("\n"); - return fsSource; - } - - WebGLRender.prototype.initVar = function() { - this.mstack = new Proton.MStack(); - this.umat = Proton.Mat3.create([2, 0, 1, 0, -2, 0, -1, 1, 1]); - this.smat = Proton.Mat3.create([1 / 100, 0, 1, 0, 1 / 100, 0, 0, 0, 1]); - this.texturebuffers = {}; - } - - WebGLRender.prototype.start = function() { - WebGLRender._super_.prototype.start.call(this); - this.resize(this.element.width, this.element.height); - } - - WebGLRender.prototype.blendEquation = function(A) { - this.gl.blendEquation(this.gl[A]); - } - - WebGLRender.prototype.blendFunc = function(A, B) { - this.gl.blendFunc(this.gl[A], this.gl[B]); - } - - WebGLRender.prototype.getShader = function(gl, str, fs) { - var shader; - if (fs) - shader = gl.createShader(gl.FRAGMENT_SHADER); - else - shader = gl.createShader(gl.VERTEX_SHADER); - gl.shaderSource(shader, str); - gl.compileShader(shader); - - if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { - alert(gl.getShaderInfoLog(shader)); - return null; - } - return shader; - } - - WebGLRender.prototype.initShaders = function() { - var fragmentShader = this.getShader(this.gl, this.getFragmentShader(), true); - var vertexShader = this.getShader(this.gl, this.getVertexShader(), false); - - this.sprogram = this.gl.createProgram(); - this.gl.attachShader(this.sprogram, vertexShader); - this.gl.attachShader(this.sprogram, fragmentShader); - this.gl.linkProgram(this.sprogram); - if (!this.gl.getProgramParameter(this.sprogram, this.gl.LINK_STATUS)) - alert("Could not initialise shaders"); - - this.gl.useProgram(this.sprogram); - this.sprogram.vpa = this.gl.getAttribLocation(this.sprogram, "aVertexPosition"); - this.sprogram.tca = this.gl.getAttribLocation(this.sprogram, "aTextureCoord"); - this.gl.enableVertexAttribArray(this.sprogram.tca); - this.gl.enableVertexAttribArray(this.sprogram.vpa); - - this.sprogram.tMatUniform = this.gl.getUniformLocation(this.sprogram, "tMat"); - this.sprogram.samplerUniform = this.gl.getUniformLocation(this.sprogram, "uSampler"); - this.sprogram.useTex = this.gl.getUniformLocation(this.sprogram, "useTexture"); - this.sprogram.color = this.gl.getUniformLocation(this.sprogram, "uColor"); - this.gl.uniform1i(this.sprogram.useTex, 1); - }; - - WebGLRender.prototype.initBuffers = function() { - this.unitIBuffer = this.gl.createBuffer(); - this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitIBuffer); - var vs = [0, 3, 1, 0, 2, 3]; - this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(vs), this.gl.STATIC_DRAW); - - var ids = []; - for (var i = 0; i < 100; i++) - ids.push(i); - - idx = new Uint16Array(ids); - this.unitI33 = this.gl.createBuffer(); - this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitI33); - this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, idx, this.gl.STATIC_DRAW); - - ids = []; - for ( i = 0; i < 100; i++) - ids.push(i, i + 1, i + 2); - - idx = new Uint16Array(ids); - this.stripBuffer = this.gl.createBuffer(); - this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.stripBuffer); - this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, idx, this.gl.STATIC_DRAW); - }; - - WebGLRender.prototype.createCircle = function(raidus) { - this.circleCanvasRadius = Proton.WebGLUtil.nhpot(Proton.Util.initValue(raidus, 32)); - var canvas = Proton.DomUtil.createCanvas('circle_canvas', this.circleCanvasRadius * 2, this.circleCanvasRadius * 2); - var context = canvas.getContext('2d'); - context.beginPath(); - context.arc(this.circleCanvasRadius, this.circleCanvasRadius, this.circleCanvasRadius, 0, Math.PI * 2, true); - context.closePath(); - context.fillStyle = '#FFF'; - context.fill(); - return canvas.toDataURL(); - }; - - WebGLRender.prototype.setImgInCanvas = function(particle) { - var _w = particle.target.width; - var _h = particle.target.height; - var _width = Proton.WebGLUtil.nhpot(particle.target.width); - var _height = Proton.WebGLUtil.nhpot(particle.target.height); - var _scaleX = particle.target.width / _width; - var _scaleY = particle.target.height / _height; - - if (!this.texturebuffers[particle.transform.src]) - this.texturebuffers[particle.transform.src] = [this.gl.createTexture(), this.gl.createBuffer(), this.gl.createBuffer()]; - particle.transform.texture = this.texturebuffers[particle.transform.src][0]; - particle.transform.vcBuffer = this.texturebuffers[particle.transform.src][1]; - particle.transform.tcBuffer = this.texturebuffers[particle.transform.src][2]; - this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.transform.tcBuffer); - this.gl.bufferData(this.gl.ARRAY_BUFFER, new Float32Array([0.0, 0.0, _scaleX, 0.0, 0.0, _scaleY, _scaleY, _scaleY]), this.gl.STATIC_DRAW); - this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.transform.vcBuffer); - this.gl.bufferData(this.gl.ARRAY_BUFFER, new Float32Array([0.0, 0.0, _w, 0.0, 0.0, _h, _w, _h]), this.gl.STATIC_DRAW); - - var context = particle.transform.canvas.getContext('2d'); - var data = context.getImageData(0, 0, _width, _height); - - this.gl.bindTexture(this.gl.TEXTURE_2D, particle.transform.texture); - this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, this.gl.RGBA, this.gl.UNSIGNED_BYTE, data); - this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MAG_FILTER, this.gl.LINEAR); - this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MIN_FILTER, this.gl.LINEAR_MIPMAP_NEAREST); - this.gl.generateMipmap(this.gl.TEXTURE_2D); - particle.transform.textureLoaded = true; - particle.transform.textureWidth = _w; - particle.transform.textureHeight = _h; - } - - WebGLRender.prototype.setStroke = function(color, thinkness) { - - } - - WebGLRender.prototype.onProtonUpdate = function() { - //this.gl.clearColor(0, 0, 0, 1); - //this.gl.clear(this.gl.COLOR_BUFFER_BIT | this.gl.DEPTH_BUFFER_BIT); - } - - WebGLRender.prototype.onParticleCreated = function(particle) { - var self = this; - particle.transform.textureLoaded = false; - particle.transform.tmat = Proton.Mat3.create(); - particle.transform.tmat[8] = 1; - particle.transform.imat = Proton.Mat3.create(); - particle.transform.imat[8] = 1; - if (particle.target) { - Proton.Util.getImage(particle.target, particle, true, function(particle) { - self.setImgInCanvas.call(self, particle); - particle.transform.oldScale = 1; - }); - } else { - Proton.Util.getImage(this.circleCanvasURL, particle, true, function(particle) { - self.setImgInCanvas.call(self, particle); - particle.transform.oldScale = particle.radius / self.circleCanvasRadius; - }); - } - } - - WebGLRender.prototype.onParticleUpdate = function(particle) { - if (particle.transform.textureLoaded) { - this.updateMatrix(particle); - this.gl.uniform3f(this.sprogram.color, particle.transform.rgb.r / 255, particle.transform.rgb.g / 255, particle.transform.rgb.b / 255); - this.gl.uniformMatrix3fv(this.sprogram.tMatUniform, false, this.mstack.top()); - this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.transform.vcBuffer); - this.gl.vertexAttribPointer(this.sprogram.vpa, 2, this.gl.FLOAT, false, 0, 0); - this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.transform.tcBuffer); - this.gl.vertexAttribPointer(this.sprogram.tca, 2, this.gl.FLOAT, false, 0, 0); - this.gl.bindTexture(this.gl.TEXTURE_2D, particle.transform.texture); - this.gl.uniform1i(this.sprogram.samplerUniform, 0); - this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitIBuffer); - this.gl.drawElements(this.gl.TRIANGLES, 6, this.gl.UNSIGNED_SHORT, 0); - this.mstack.pop(); - } - } - - WebGLRender.prototype.onParticleDead = function(particle) { - - } - - WebGLRender.prototype.updateMatrix = function(particle) { - var moveOriginMatrix = Proton.WebGLUtil.makeTranslation(-particle.transform.textureWidth / 2, -particle.transform.textureHeight / 2); - var translationMatrix = Proton.WebGLUtil.makeTranslation(particle.p.x, particle.p.y); - var angel = particle.rotation * (Math.PI / 180); - var rotationMatrix = Proton.WebGLUtil.makeRotation(angel); - var scale = particle.scale * particle.transform.oldScale; - var scaleMatrix = Proton.WebGLUtil.makeScale(scale, scale); - - var matrix = Proton.WebGLUtil.matrixMultiply(moveOriginMatrix, scaleMatrix); - matrix = Proton.WebGLUtil.matrixMultiply(matrix, rotationMatrix); - matrix = Proton.WebGLUtil.matrixMultiply(matrix, translationMatrix); - - Proton.Mat3.inverse(matrix, particle.transform.imat); - matrix[2] = particle.alpha; - this.mstack.push(matrix); - } - - Proton.WebGLRender = WebGLRender; -})(Proton); diff --git a/src/render/WebGLRenderer.js b/src/render/WebGLRenderer.js new file mode 100644 index 0000000..e2718d8 --- /dev/null +++ b/src/render/WebGLRenderer.js @@ -0,0 +1,271 @@ +import Mat3 from '../math/Mat3'; +import BaseRenderer from './BaseRenderer'; + +import Util from '../utils/Util'; +import ImgUtil from '../utils/ImgUtil'; +import MStack from '../utils/MStack'; +import DomUtil from '../utils/DomUtil'; +import WebGLUtil from '../utils/WebGLUtil'; +import MathUtils from '../math/MathUtils'; + +export default class WebGLRenderer extends BaseRenderer { + + constructor(element) { + super(element); + + this.gl = this.element.getContext('experimental-webgl', { antialias: true, stencil: false, depth: false }); + if (!this.gl) alert("Sorry your browser do not suppest WebGL!"); + + this.initVar(); + this.setMaxRadius(); + this.initShaders(); + this.initBuffers(); + + this.gl.blendEquation(this.gl.FUNC_ADD); + this.gl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE_MINUS_SRC_ALPHA); + this.gl.enable(this.gl.BLEND); + + this.addImg2Body = this.addImg2Body.bind(this); + + this.name = 'WebGLRenderer'; + } + + init(proton) { + super.init(proton); + this.resize(this.element.width, this.element.height); + } + + resize(width, height) { + this.umat[4] = -2; + this.umat[7] = 1; + + this.smat[0] = 1 / width; + this.smat[4] = 1 / height; + + this.mstack.set(this.umat, 0); + this.mstack.set(this.smat, 1); + + this.gl.viewport(0, 0, width, height); + this.element.width = width; + this.element.height = height; + } + + setMaxRadius(radius) { + this.circleCanvasURL = this.createCircle(radius); + } + + getVertexShader() { + const vsSource = ["uniform vec2 viewport;", "attribute vec2 aVertexPosition;", "attribute vec2 aTextureCoord;", "uniform mat3 tMat;", "varying vec2 vTextureCoord;", "varying float alpha;", "void main() {", "vec3 v = tMat * vec3(aVertexPosition, 1.0);", "gl_Position = vec4(v.x, v.y, 0, 1);", "vTextureCoord = aTextureCoord;", "alpha = tMat[0][2];", "}"].join("\n"); + return vsSource; + } + + getFragmentShader() { + const fsSource = ["precision mediump float;", "varying vec2 vTextureCoord;", "varying float alpha;", "uniform sampler2D uSampler;", "uniform vec4 color;", "uniform bool useTexture;", "uniform vec3 uColor;", "void main() {", "vec4 textureColor = texture2D(uSampler, vTextureCoord);", "gl_FragColor = textureColor * vec4(uColor, 1.0);", "gl_FragColor.w *= alpha;", "}"].join("\n"); + return fsSource; + } + + initVar() { + this.mstack = new MStack(); + this.umat = Mat3.create([2, 0, 1, 0, -2, 0, -1, 1, 1]); + this.smat = Mat3.create([1 / 100, 0, 1, 0, 1 / 100, 0, 0, 0, 1]); + this.texturebuffers = {}; + } + + blendEquation(A) { + this.gl.blendEquation(this.gl[A]); + } + + blendFunc(A, B) { + this.gl.blendFunc(this.gl[A], this.gl[B]); + } + + getShader(gl, str, fs) { + const shader = fs ? gl.createShader(gl.FRAGMENT_SHADER) : gl.createShader(gl.VERTEX_SHADER); + + gl.shaderSource(shader, str); + gl.compileShader(shader); + + if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { + alert(gl.getShaderInfoLog(shader)); + return null; + } + + return shader; + } + + initShaders() { + const fragmentShader = this.getShader(this.gl, this.getFragmentShader(), true); + const vertexShader = this.getShader(this.gl, this.getVertexShader(), false); + + this.sprogram = this.gl.createProgram(); + this.gl.attachShader(this.sprogram, vertexShader); + this.gl.attachShader(this.sprogram, fragmentShader); + this.gl.linkProgram(this.sprogram); + + if (!this.gl.getProgramParameter(this.sprogram, this.gl.LINK_STATUS)) + alert("Could not initialise shaders"); + + this.gl.useProgram(this.sprogram); + this.sprogram.vpa = this.gl.getAttribLocation(this.sprogram, "aVertexPosition"); + this.sprogram.tca = this.gl.getAttribLocation(this.sprogram, "aTextureCoord"); + this.gl.enableVertexAttribArray(this.sprogram.tca); + this.gl.enableVertexAttribArray(this.sprogram.vpa); + + this.sprogram.tMatUniform = this.gl.getUniformLocation(this.sprogram, "tMat"); + this.sprogram.samplerUniform = this.gl.getUniformLocation(this.sprogram, "uSampler"); + this.sprogram.useTex = this.gl.getUniformLocation(this.sprogram, "useTexture"); + this.sprogram.color = this.gl.getUniformLocation(this.sprogram, "uColor"); + this.gl.uniform1i(this.sprogram.useTex, 1); + }; + + initBuffers() { + const vs = [0, 3, 1, 0, 2, 3]; + let idx; + + this.unitIBuffer = this.gl.createBuffer(); + this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitIBuffer); + this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(vs), this.gl.STATIC_DRAW); + + let i; + let ids = []; + for (i = 0; i < 100; i++) ids.push(i); + idx = new Uint16Array(ids); + + this.unitI33 = this.gl.createBuffer(); + this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitI33); + this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, idx, this.gl.STATIC_DRAW); + + ids = []; + for (i = 0; i < 100; i++) ids.push(i, i + 1, i + 2); + idx = new Uint16Array(ids); + + this.stripBuffer = this.gl.createBuffer(); + this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.stripBuffer); + this.gl.bufferData(this.gl.ELEMENT_ARRAY_BUFFER, idx, this.gl.STATIC_DRAW); + }; + + createCircle(raidus) { + this.circleCanvasRadius = WebGLUtil.nhpot(Util.initValue(raidus, 32)); + const canvas = DomUtil.createCanvas('circle_canvas', this.circleCanvasRadius * 2, this.circleCanvasRadius * 2); + const context = canvas.getContext('2d'); + + context.beginPath(); + context.arc(this.circleCanvasRadius, this.circleCanvasRadius, this.circleCanvasRadius, 0, Math.PI * 2, true); + context.closePath(); + context.fillStyle = '#FFF'; + context.fill(); + + return canvas.toDataURL(); + }; + + drawImg2Canvas(particle) { + const _w = particle.body.width; + const _h = particle.body.height; + + const _width = WebGLUtil.nhpot(particle.body.width); + const _height = WebGLUtil.nhpot(particle.body.height); + + const _scaleX = particle.body.width / _width; + const _scaleY = particle.body.height / _height; + + if (!this.texturebuffers[particle.transform.src]) + this.texturebuffers[particle.transform.src] = [this.gl.createTexture(), this.gl.createBuffer(), this.gl.createBuffer()]; + + particle.transform.texture = this.texturebuffers[particle.transform.src][0]; + particle.transform.vcBuffer = this.texturebuffers[particle.transform.src][1]; + particle.transform.tcBuffer = this.texturebuffers[particle.transform.src][2]; + + this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.transform.tcBuffer); + this.gl.bufferData(this.gl.ARRAY_BUFFER, new Float32Array([0.0, 0.0, _scaleX, 0.0, 0.0, _scaleY, _scaleY, _scaleY]), this.gl.STATIC_DRAW); + this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.transform.vcBuffer); + this.gl.bufferData(this.gl.ARRAY_BUFFER, new Float32Array([0.0, 0.0, _w, 0.0, 0.0, _h, _w, _h]), this.gl.STATIC_DRAW); + + const context = particle.transform.canvas.getContext('2d'); + const data = context.getImageData(0, 0, _width, _height); + + this.gl.bindTexture(this.gl.TEXTURE_2D, particle.transform.texture); + this.gl.texImage2D(this.gl.TEXTURE_2D, 0, this.gl.RGBA, this.gl.RGBA, this.gl.UNSIGNED_BYTE, data); + this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MAG_FILTER, this.gl.LINEAR); + this.gl.texParameteri(this.gl.TEXTURE_2D, this.gl.TEXTURE_MIN_FILTER, this.gl.LINEAR_MIPMAP_NEAREST); + this.gl.generateMipmap(this.gl.TEXTURE_2D); + + particle.transform.textureLoaded = true; + particle.transform.textureWidth = _w; + particle.transform.textureHeight = _h; + } + + onProtonUpdate() { + //this.gl.clearColor(0, 0, 0, 1); + //this.gl.clear(this.gl.COLOR_BUFFER_BIT | this.gl.DEPTH_BUFFER_BIT); + } + + onParticleCreated(particle) { + particle.transform.textureLoaded = false; + particle.transform.tmat = Mat3.create(); + particle.transform.tmat[8] = 1; + particle.transform.imat = Mat3.create(); + particle.transform.imat[8] = 1; + + if (particle.body) { + ImgUtil.getImgFromCache(particle.body, this.addImg2Body, particle); + } else { + ImgUtil.getImgFromCache(this.circleCanvasURL, this.addImg2Body, particle); + particle.transform.oldScale = particle.radius / this.circleCanvasRadius; + } + } + + // private + addImg2Body(img, particle) { + if (particle.dead) return; + + particle.body = img; + particle.transform.src = img.src; + particle.transform.canvas = ImgUtil.getCanvasFromCache(img); + particle.transform.oldScale = 1; + + this.drawImg2Canvas(particle); + } + + onParticleUpdate(particle) { + if (particle.transform.textureLoaded) { + this.updateMatrix(particle); + + this.gl.uniform3f(this.sprogram.color, particle.transform.rgb.r / 255, particle.transform.rgb.g / 255, particle.transform.rgb.b / 255); + this.gl.uniformMatrix3fv(this.sprogram.tMatUniform, false, this.mstack.top()); + + this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.transform.vcBuffer); + this.gl.vertexAttribPointer(this.sprogram.vpa, 2, this.gl.FLOAT, false, 0, 0); + this.gl.bindBuffer(this.gl.ARRAY_BUFFER, particle.transform.tcBuffer); + this.gl.vertexAttribPointer(this.sprogram.tca, 2, this.gl.FLOAT, false, 0, 0); + this.gl.bindTexture(this.gl.TEXTURE_2D, particle.transform.texture); + this.gl.uniform1i(this.sprogram.samplerUniform, 0); + this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, this.unitIBuffer); + + this.gl.drawElements(this.gl.TRIANGLES, 6, this.gl.UNSIGNED_SHORT, 0); + + this.mstack.pop(); + } + } + + onParticleDead(particle) { } + + updateMatrix(particle) { + const moveOriginMatrix = WebGLUtil.makeTranslation(-particle.transform.textureWidth / 2, -particle.transform.textureHeight / 2); + const translationMatrix = WebGLUtil.makeTranslation(particle.p.x, particle.p.y); + + const angel = particle.rotation * (MathUtils.PI_180); + const rotationMatrix = WebGLUtil.makeRotation(angel); + + const scale = particle.scale * particle.transform.oldScale; + const scaleMatrix = WebGLUtil.makeScale(scale, scale); + let matrix = WebGLUtil.matrixMultiply(moveOriginMatrix, scaleMatrix); + + matrix = WebGLUtil.matrixMultiply(matrix, rotationMatrix); + matrix = WebGLUtil.matrixMultiply(matrix, translationMatrix); + + Mat3.inverse(matrix, particle.transform.imat); + matrix[2] = particle.alpha; + + this.mstack.push(matrix); + } +} \ No newline at end of file diff --git a/src/utils/CanvasUtil.js b/src/utils/CanvasUtil.js deleted file mode 100644 index e875562..0000000 --- a/src/utils/CanvasUtil.js +++ /dev/null @@ -1,53 +0,0 @@ -(function(Proton, undefined) { - var CanvasUtil = CanvasUtil || { - // blur : function(src, dst, w, h) { - // var c; - // var r, g, b; - // for (var y = 1; y < h - 1; y++) { - // for (var x = 1; x < w - 1; x++) { - // r = 0; - // g = 0; - // b = 0; - - // for (var yb = -1; yb <= 1; yb++) { - // for (var xb = -1; xb <= 1; xb++) { - // c = src[(x + xb) + (y - yb) * w]; - // r += (c >> 16) & 0xFF; - // g += (c >> 8) & 0xFF; - // b += (c) & 0xFF; - // } - // } - - // r /= 9; - // g /= 9; - // b /= 9; - // dst[x + y * w] = 0xff000000 | (r << 16) | (g << 8) | b; - // } - // } - // }, - - // scaleBrightness : function(src, dst, w, h, s) { - - // var r, g, b; - // var c; - // var a; - // var as = s; - - // s = 1.0; - // for (var y = 0; y < h; y++) { - // for (var x = 0; x < w; x++) { - - // c = src[x + y * w]; - // a = Math.floor(as * ((c >> 24) & 0xFF)); - // r = Math.floor(s * ((c >> 16) & 0xFF)); - // g = Math.floor(s * ((c >> 8) & 0xFF)); - // b = Math.floor(s * ((c) & 0xFF)); - // dst[x + y * w] = (a << 24) | (r << 16) | (g << 8) | b; - - // } - // } - // } - } - - Proton.CanvasUtil = CanvasUtil; -})(Proton); diff --git a/src/utils/ColorUtil.js b/src/utils/ColorUtil.js new file mode 100644 index 0000000..c39eee8 --- /dev/null +++ b/src/utils/ColorUtil.js @@ -0,0 +1,45 @@ +export default { + + /** + * @typedef {Object} rgbObject + * @property {Number} r red value + * @property {Number} g green value + * @property {Number} b blue value + */ + /** + * converts a hex value to a rgb object + * + * @memberof Proton#Proton.Util + * @method hexToRGB + * + * @param {String} h any hex value, e.g. #000000 or 000000 for black + * + * @return {rgbObject} + */ + hexToRGB(h) { + const hex16 = (h.charAt(0) == "#") ? h.substring(1, 7) : h; + const r = parseInt(hex16.substring(0, 2), 16); + const g = parseInt(hex16.substring(2, 4), 16); + const b = parseInt(hex16.substring(4, 6), 16); + + return { r, g, b }; + }, + + /** + * converts a rgb value to a rgb string + * + * @memberof Proton#Proton.Util + * @method rgbToHex + * + * @param {Object | Proton.hexToRGB} rgb a rgb object like in {@link Proton#Proton.} + * + * @return {String} rgb() + */ + rgbToHex(rbg) { + return `rgb(${rbg.r}, ${rbg.g}, ${rbg.b})`; + }, + + getHex16FromParticle(p) { + return Number(p.transform.rgb.r) * 65536 + Number(p.transform.rgb.g) * 256 + Number(p.transform.rgb.b); + } +} \ No newline at end of file diff --git a/src/utils/DomUtil.js b/src/utils/DomUtil.js index 21bc5f4..729b5e1 100644 --- a/src/utils/DomUtil.js +++ b/src/utils/DomUtil.js @@ -1,57 +1,84 @@ -(function(Proton, undefined) { +export default { - /** - * @namespace - * @memberof! Proton# - * @alias Proton.DomUtil + /** + * Creates and returns a new canvas. The opacity is by default set to 0 + * + * @memberof Proton#Proton.DomUtil + * @method createCanvas + * + * @param {String} $id the canvas' id + * @param {Number} $width the canvas' width + * @param {Number} $height the canvas' height + * @param {String} [$position=absolute] the canvas' position, default is 'absolute' + * + * @return {Object} */ - var DomUtil = DomUtil || { - - /** - * Creates and returns a new canvas. The opacity is by default set to 0 - * - * @memberof Proton#Proton.DomUtil - * @method createCanvas - * - * @param {String} $id the canvas' id - * @param {Number} $width the canvas' width - * @param {Number} $height the canvas' height - * @param {String} [$position=absolute] the canvas' position, default is 'absolute' - * - * @return {Object} - */ - createCanvas : function($id, $width, $height, $position) { - var element = document.createElement("canvas"); - var position = $position ? $position : 'absolute'; - element.id = $id; - element.width = $width; - element.height = $height; - element.style.position = position; - element.style.opacity = 0; - this.transformDom(element, -500, -500, 0, 0); - return element; - }, - - /** - * Adds a transform: translate(), scale(), rotate() to a given div element for all browsers - * - * @memberof Proton#Proton.DomUtil - * @method transformDom - * - * @param {HTMLDivElement} $div - * @param {Number} $x - * @param {Number} $y - * @param {Number} $scale - * @param {Number} $rotate - */ - transformDom : function($div, $x, $y, $scale, $rotate) { - $div.style.WebkitTransform = 'translate(' + $x + 'px, ' + $y + 'px) ' + 'scale(' + $scale + ') ' + 'rotate(' + $rotate + 'deg)'; - $div.style.MozTransform = 'translate(' + $x + 'px, ' + $y + 'px) ' + 'scale(' + $scale + ') ' + 'rotate(' + $rotate + 'deg)'; - $div.style.OTransform = 'translate(' + $x + 'px, ' + $y + 'px) ' + 'scale(' + $scale + ') ' + 'rotate(' + $rotate + 'deg)'; - $div.style.msTransform = 'translate(' + $x + 'px, ' + $y + 'px) ' + 'scale(' + $scale + ') ' + 'rotate(' + $rotate + 'deg)'; - $div.style.transform = 'translate(' + $x + 'px, ' + $y + 'px) ' + 'scale(' + $scale + ') ' + 'rotate(' + $rotate + 'deg)'; - } - } - - Proton.DomUtil = DomUtil; -})(Proton); + createCanvas(id, width, height, position) { + const dom = document.createElement("canvas"); + position = position || 'absolute'; + + dom.id = id; + dom.width = width; + dom.height = height; + dom.style.opacity = 0; + dom.style.position = position; + + this.transform(dom, -500, -500, 0, 0); + + return dom; + }, + + createDiv(id, width, height) { + const dom = document.createElement("div"); + + dom.id = id; + dom.style.position = 'absolute'; + this.resize(dom, width, height); + + return dom; + }, + + resize(dom, width, height) { + dom.style.width = width + 'px'; + dom.style.height = height + 'px'; + dom.style.marginLeft = -width / 2 + 'px'; + dom.style.marginTop = -height / 2 + 'px'; + }, + + /** + * Adds a transform: translate(), scale(), rotate() to a given div dom for all browsers + * + * @memberof Proton#Proton.DomUtil + * @method transform + * + * @param {HTMLDivElement} div + * @param {Number} $x + * @param {Number} $y + * @param {Number} $scale + * @param {Number} $rotate + */ + transform(div, x, y, scale, rotate) { + const transform = `translate(${x}px, ${y}px) scale(${scale}) rotate(${rotate}deg)`; + + div.style.willChange = 'transform'; + this.css3(div, 'transform', transform); + }, + + transform3d(div, x, y, scale, rotate) { + const transform = `translate3d(${x}px, ${y}px, 0) scale(${scale}) rotate(${rotate}deg)`; + + div.style.willChange = 'transform'; + this.css3(div, 'backfaceVisibility', 'hidden'); + this.css3(div, 'transform', transform); + }, + + css3(div, key, val) { + const bkey = key.charAt(0).toUpperCase() + key.substr(1); + + div.style[`Webkit${bkey}`] = val; + div.style[`Moz${bkey}`] = val; + div.style[`O${bkey}`] = val; + div.style[`ms${bkey}`] = val; + div.style[`${key}`] = val; + } +} \ No newline at end of file diff --git a/src/utils/ImgUtil.js b/src/utils/ImgUtil.js new file mode 100644 index 0000000..18f36c7 --- /dev/null +++ b/src/utils/ImgUtil.js @@ -0,0 +1,74 @@ +import WebGLUtil from './WebGLUtil'; +import DomUtil from './DomUtil'; + +const IMG_CACHE = {}; +const CANVAS_CACHE = {}; +let canvasID = 0; + +export default { + + /** + * This will get the image data. It could be necessary to create a Proton.Zone. + * + * @memberof Proton#Proton.Util + * @method getImageData + * + * @param {HTMLCanvasElement} context any canvas, must be a 2dContext 'canvas.getContext('2d')' + * @param {Object} image could be any dom image, e.g. document.getElementById('thisIsAnImgTag'); + * @param {Proton.Rectangle} rect + */ + getImageData(context, image, rect) { + context.drawImage(image, rect.x, rect.y); + const imagedata = context.getImageData(rect.x, rect.y, rect.width, rect.height); + context.clearRect(rect.x, rect.y, rect.width, rect.height); + + return imagedata; + }, + + /** + * @memberof Proton#Proton.Util + * @method getImgFromCache + * + * @todo add description + * @todo describe func + * + * @param {Mixed} img + * @param {Proton.Particle} particle + * @param {Boolean} drawCanvas set to true if a canvas should be saved into particle.transform.canvas + * @param {Boolean} func + */ + getImgFromCache(img, callback, param) { + const src = typeof (img) == 'string' ? img : img.src; + + if (IMG_CACHE[src]) { + callback(IMG_CACHE[src], param); + } else { + const image = new Image(); + image.onload = e => { + IMG_CACHE[src] = e.target; + callback(IMG_CACHE[src], param); + } + + image.src = src; + } + }, + + getCanvasFromCache(img, callback, param) { + const src = img.src; + + if (!CANVAS_CACHE[src]) { + const width = WebGLUtil.nhpot(img.width); + const height = WebGLUtil.nhpot(img.height); + + const canvas = DomUtil.createCanvas(`canvas_cache_${canvasID}`, width, height); + const context = canvas.getContext('2d'); + context.drawImage(img, 0, 0, img.width, img.height); + + CANVAS_CACHE[src] = canvas; + } + + callback && callback(CANVAS_CACHE[src], param); + + return CANVAS_CACHE[src]; + } +} \ No newline at end of file diff --git a/src/utils/MStack.js b/src/utils/MStack.js index 5919e30..1f9861f 100644 --- a/src/utils/MStack.js +++ b/src/utils/MStack.js @@ -1,36 +1,38 @@ -(function(Proton, undefined) { - function MStack() { +import Mat3 from '../math/Mat3'; + +export default class MStack { + + constructor() { this.mats = []; this.size = 0; - for (var i = 0; i < 20; i++) - this.mats.push(Proton.Mat3.create([0, 0, 0, 0, 0, 0, 0, 0, 0])); - } + for (let i = 0; i < 20; i++) this.mats.push(Mat3.create([0, 0, 0, 0, 0, 0, 0, 0, 0])); + } - MStack.prototype.set = function(m, i) { + set(m, i) { if (i == 0) - Proton.Mat3.set(m, this.mats[0]); + Mat3.set(m, this.mats[0]); else - Proton.Mat3.multiply(this.mats[i - 1], m, this.mats[i]); + Mat3.multiply(this.mats[i - 1], m, this.mats[i]); + this.size = Math.max(this.size, i + 1); } - MStack.prototype.push = function(m) { + push(m) { if (this.size == 0) - Proton.Mat3.set(m, this.mats[0]); + Mat3.set(m, this.mats[0]); else - Proton.Mat3.multiply(this.mats[this.size - 1], m, this.mats[this.size]); + Mat3.multiply(this.mats[this.size - 1], m, this.mats[this.size]); + this.size++; } - MStack.prototype.pop = function() { + pop() { if (this.size > 0) this.size--; } - MStack.prototype.top = function() { + top() { return (this.mats[this.size - 1]); } - - Proton.MStack = MStack; -})(Proton); +} \ No newline at end of file diff --git a/src/utils/PUID.js b/src/utils/PUID.js new file mode 100644 index 0000000..7802ef4 --- /dev/null +++ b/src/utils/PUID.js @@ -0,0 +1,34 @@ +export default { + id: 0, + cache: {}, + + getID(target) { + let uid = this.getCacheID(target); + if (uid) return uid; + + uid = `PUID_${this.id++}`; + this.cache[uid] = target; + + return uid; + }, + + getCacheID(target) { + let obj; + for (let id in this.cache) { + obj = this.cache[id]; + + if (obj === target) return id; + + if (typeof obj === 'object' && typeof target === 'object' && obj.isInner && target.isInner) { + if (obj.src === target.src) + return id; + } + } + + return null; + }, + + getTarget(uid) { + return this.cache[uid]; + } +} \ No newline at end of file diff --git a/src/utils/Util.js b/src/utils/Util.js index c07936f..2b49ab6 100644 --- a/src/utils/Util.js +++ b/src/utils/Util.js @@ -1,475 +1,217 @@ -(function(Proton, undefined) { +import Vector2D from '../math/Vector2D'; +import Span from '../math/Span'; +import ImgUtil from './ImgUtil'; +import DomUtil from './DomUtil'; + +export default { /** - * @namespace - * @memberof! Proton# - * @alias Proton.Util + * Returns the default if the value is null or undefined + * + * @memberof Proton#Proton.Util + * @method initValue + * + * @param {Mixed} value a specific value, could be everything but null or undefined + * @param {Mixed} defaults the default if the value is null or undefined */ - var Util = Util || { - - /** - * Returns the default if the value is null or undefined - * - * @memberof Proton#Proton.Util - * @method initValue - * - * @param {Mixed} value a specific value, could be everything but null or undefined - * @param {Mixed} defaults the default if the value is null or undefined - */ - initValue: function(value, defaults) { - var value = (value != null && value != undefined) ? value : defaults; - return value; - }, - - /** - * Checks if the value is a valid array - * - * @memberof Proton#Proton.Util - * @method isArray - * - * @param {Array} value Any array - * - * @returns {Boolean} - */ - isArray: function(value) { - return typeof value === 'object' && value.hasOwnProperty('length'); - }, - - /** - * Destroyes the given array - * - * @memberof Proton#Proton.Util - * @method destroyArray - * - * @param {Array} array Any array - */ - destroyArray: function(array) { - array.length = 0; - }, - - /** - * Destroyes the given object - * - * @memberof Proton#Proton.Util - * @method destroyObject - * - * @param {Object} obj Any object - */ - destroyObject: function(obj) { - for (var o in obj) - delete obj[o]; - }, - - /** - * Returns the Vector2D - or creates a new one - * - * @memberof Proton#Proton.Util - * @method getVector2D - * - * @param {Proton.Vector2D | Number} postionOrX - * @param {Number} [y] just valid if 'postionOrX' is not an object - * - * @return {Proton.Vector2D} - */ - getVector2D: function(postionOrX, y) { - if (typeof(postionOrX) == 'object') { - return postionOrX; - } else { - var vector2d = new Proton.Vector2D(postionOrX, y); - return vector2d; - } - }, + initValue(value, defaults) { + value = (value !== null && value !== undefined) ? value : defaults; + return value; + }, - /** - * Makes an instance of a class and binds the given array - * - * @memberof Proton#Proton.Util - * @method classApply - * - * @param {Function} constructor A class to make an instance from - * @param {Array} [argArray] Any array to bind it to the constructor - * - * @return {Object} The instance of constructor, optionally bind with argArray - */ - classApply: function(constructor, argArray) { - if (!argArray) return new constructor; - - var args = [null].concat(argArray); - var factoryFunction = constructor.bind.apply(constructor, args); - return new factoryFunction(); - }, - - /** - * @memberof Proton#Proton.Util - * @method judgeVector2D - * - * @todo add description for param `pOBJ` - * @todo add description for function - * - * @param {Object} pOBJ - * - * @return {String} result - */ - judgeVector2D: function(pOBJ) { - var result = ''; - if (pOBJ.hasOwnProperty('x') || pOBJ.hasOwnProperty('y') || pOBJ.hasOwnProperty('p') || pOBJ.hasOwnProperty('position')) - result += 'p'; - if (pOBJ.hasOwnProperty('vx') || pOBJ.hasOwnProperty('vx') || pOBJ.hasOwnProperty('v') || pOBJ.hasOwnProperty('velocity')) - result += 'v'; - if (pOBJ.hasOwnProperty('ax') || pOBJ.hasOwnProperty('ax') || pOBJ.hasOwnProperty('a') || pOBJ.hasOwnProperty('accelerate')) - result += 'a'; - - return result; - }, - - /** - * @memberof Proton#Proton.Util - * @method setVector2DByObject - * - * @todo add description for param `target` - * @todo add description for param `pOBJ` - * @todo add description for function - * - * @param {Object} target - * @param {Object} pOBJ - */ - setVector2DByObject: function(target, pOBJ) { - if (pOBJ.hasOwnProperty('x')) - target.p.x = pOBJ['x']; - - if (pOBJ.hasOwnProperty('y')) - target.p.y = pOBJ['y']; + /** + * Checks if the value is a valid array + * + * @memberof Proton#Proton.Util + * @method isArray + * + * @param {Array} value Any array + * + * @returns {Boolean} + */ + isArray(value) { + return Object.prototype.toString.call(value) === '[object Array]'; + }, - if (pOBJ.hasOwnProperty('vx')) - target.v.x = pOBJ['vx']; + /** + * Destroyes the given array + * + * @memberof Proton#Proton.Util + * @method destroyArray + * + * @param {Array} array Any array + */ + destroyArray(array) { + if (array) array.length = 0; + }, - if (pOBJ.hasOwnProperty('vy')) - target.v.y = pOBJ['vy']; + /** + * Destroyes the given object + * + * @memberof Proton#Proton.Util + * @method destroyObject + * + * @param {Object} obj Any object + */ + destroyObject(obj, ignore) { + for (let o in obj) { + if (ignore && ignore.indexOf(o) > -1) continue; + delete obj[o]; + } + }, - if (pOBJ.hasOwnProperty('ax')) - target.a.x = pOBJ['ax']; + /** + * Makes an instance of a class and binds the given array + * + * @memberof Proton#Proton.Util + * @method classApply + * + * @param {Function} constructor A class to make an instance from + * @param {Array} [args] Any array to bind it to the constructor + * + * @return {Object} The instance of constructor, optionally bind with args + */ + classApply(constructor, args) { + if (!args) return new constructor; - if (pOBJ.hasOwnProperty('ay')) - target.a.y = pOBJ['ay']; + args = [null].concat(args); + const factoryFunction = constructor.bind.apply(constructor, args); + return new factoryFunction(); + }, - if (pOBJ.hasOwnProperty('p')) - particle.p.copy(pOBJ['p']); + /** + * @memberof Proton#Proton.Util + * @method setVector2DByObject + * + * @todo add description for param `target` + * @todo add description for param `pOBJ` + * @todo add description for function + * + * @param {Object} target + * @param {Object} pOBJ + */ + setVector2DByObject(target, pOBJ) { + if (this.hasProp(pOBJ, 'x')) target.p.x = pOBJ['x']; + if (this.hasProp(pOBJ, 'y')) target.p.y = pOBJ['y']; - if (pOBJ.hasOwnProperty('v')) - particle.v.copy(pOBJ['v']); + if (this.hasProp(pOBJ, 'vx')) target.v.x = pOBJ['vx']; + if (this.hasProp(pOBJ, 'vy')) target.v.y = pOBJ['vy']; - if (pOBJ.hasOwnProperty('a')) - particle.a.copy(pOBJ['a']); + if (this.hasProp(pOBJ, 'ax')) target.a.x = pOBJ['ax']; + if (this.hasProp(pOBJ, 'ay')) target.a.y = pOBJ['ay']; - if (pOBJ.hasOwnProperty('position')) - particle.p.copy(pOBJ['position']); + if (this.hasProp(pOBJ, 'p')) particle.p.copy(pOBJ['p']); + if (this.hasProp(pOBJ, 'v')) particle.v.copy(pOBJ['v']); + if (this.hasProp(pOBJ, 'a')) particle.a.copy(pOBJ['a']); - if (pOBJ.hasOwnProperty('velocity')) - particle.v.copy(pOBJ['velocity']); + if (this.hasProp(pOBJ, 'position')) particle.p.copy(pOBJ['position']); + if (this.hasProp(pOBJ, 'velocity')) particle.v.copy(pOBJ['velocity']); + if (this.hasProp(pOBJ, 'accelerate')) particle.a.copy(pOBJ['accelerate']); + }, - if (pOBJ.hasOwnProperty('accelerate')) - particle.a.copy(pOBJ['accelerate']); - }, + hasProp(obj, key) { + if (!obj) return false; + return obj[key] !== undefined; + // return obj.hasOwnProperty(key); + }, - /** - * 强行添加属性 - * - * @memberof Proton#Proton.Util - * @method addPrototypeByObject - * - * @todo add description for param `target` - * @todo add description for param `filters` - * @todo translate desription from chinese to english - * - * @param {Object} target - * @param {Object} prototypeObject An object of single prototypes - * @param {Object} filters - * - * @return {Object} target - */ - addPrototypeByObject: function(target, prototypeObject, filters) { - for (var singlePrototype in prototypeObject) { + /** + * set the prototype in a given prototypeObject + * + * @memberof Proton#Proton.Util + * @method setPrototypeByObject + * + * @todo add description for param `target` + * @todo add description for param `filters` + * @todo translate desription from chinese to english + * + * @param {Object} target + * @param {Object} prototypeObject An object of single prototypes + * @param {Object} filters + * + * @return {Object} target + */ + setPrototypeByObject(target, prototypeObject, filters) { + for (let singleProp in prototypeObject) { + if (target.hasOwnProperty(singleProp)) { if (filters) { - if (filters.indexOf(singlePrototype) < 0) - target[singlePrototype] = Proton.Util.getSpanValue(prototypeObject[singlePrototype]); - } else { - target[singlePrototype] = Proton.Util.getSpanValue(prototypeObject[singlePrototype]); - } - } - - return target; - }, - - /** - * set the prototype in a given prototypeObject - * - * @memberof Proton#Proton.Util - * @method setPrototypeByObject - * - * @todo add description for param `target` - * @todo add description for param `filters` - * @todo translate desription from chinese to english - * - * @param {Object} target - * @param {Object} prototypeObject An object of single prototypes - * @param {Object} filters - * - * @return {Object} target - */ - setPrototypeByObject: function(target, prototypeObject, filters) { - for (var singlePrototype in prototypeObject) { - if (target.hasOwnProperty(singlePrototype)) { - if (filters) { - if (filters.indexOf(singlePrototype) < 0) - target[singlePrototype] = Proton.Util.getSpanValue(prototypeObject[singlePrototype]); - } else { - target[singlePrototype] = Proton.Util.getSpanValue(prototypeObject[singlePrototype]); - } - } - } - - return target; - }, - - /** - * Returns a new Proton.Span object - * - * @memberof Proton#Proton.Util - * @method setSpanValue - * - * @todo a, b and c should be 'Mixed' or 'Number'? - * - * @param {Mixed | Proton.Span} a - * @param {Mixed} b - * @param {Mixed} c - * - * @return {Proton.Span} - */ - setSpanValue: function(a, b, c) { - if (a instanceof Proton.Span) { - return a; - } else { - if (!b) { - return new Proton.Span(a); + if (filters.indexOf(singleProp) < 0) + target[singleProp] = this.getSpanValue(prototypeObject[singleProp]); } else { - if (!c) - return new Proton.Span(a, b); - else - return new Proton.Span(a, b, c); + target[singleProp] = this.getSpanValue(prototypeObject[singleProp]); } } - }, - - /** - * Returns the value from a Proton.Span, if the param is not a Proton.Span it will return the given parameter - * - * @memberof Proton#Proton.Util - * @method getSpanValue - * - * @param {Mixed | Proton.Span} pan - * - * @return {Mixed} the value of Proton.Span OR the parameter if it is not a Proton.Span - */ - getSpanValue: function(pan) { - if (pan instanceof Proton.Span) - return pan.getValue(); - else - return pan; - }, - - /** - * Inherits any class from the superclass. Acts like 'extends' in Java - * - * @memberof Proton#Proton.Util - * @method inherits - * - * @param {Object} subClass the child class - * @param {Object} superClass the parent/super class - */ - inherits: function(subClass, superClass) { - subClass._super_ = superClass; - if (Object['create']) { - //console.log(subClass,superClass); - subClass.prototype = Object.create(superClass.prototype, { - constructor: { - value: subClass - } - }); - } else { - var F = function() {}; - F.prototype = superClass.prototype; - subClass.prototype = new F(); - subClass.prototype.constructor = subClass; - } - }, - - /** - * This will get the image data. It could be necessary to create a Proton.Zone. - * - * @memberof Proton#Proton.Util - * @method getImageData - * - * @param {HTMLCanvasElement} context any canvas, must be a 2dContext 'canvas.getContext('2d')' - * @param {Object} image could be any dom image, e.g. document.getElementById('thisIsAnImgTag'); - * @param {Proton.Rectangle} rect - */ - getImageData: function(context, image, rect) { - context.drawImage(image, rect.x, rect.y); - var imagedata = context.getImageData(rect.x, rect.y, rect.width, rect.height); - context.clearRect(rect.x, rect.y, rect.width, rect.height); - return imagedata; - }, - - /** - * @memberof Proton#Proton.Util - * @method getImage - * - * @todo add description - * @todo describe fun - * - * @param {Mixed} img - * @param {Proton.Particle} particle - * @param {Boolean} drawCanvas set to true if a canvas should be saved into particle.transform.canvas - * @param {Boolean} fun - */ - getImage: function(img, particle, drawCanvas, fun) { - if (typeof(img) == 'string') { - this.loadAndSetImage(img, particle, drawCanvas, fun); - } else if (typeof(img) == 'object') { - this.loadAndSetImage(img.src, particle, drawCanvas, fun); - } else if (img instanceof Image) { - this.loadedImage(img.src, particle, drawCanvas, fun, img); - } - }, + } - /** - * @memberof Proton#Proton.Util - * @method loadedImage - * - * @todo add description - * @todo describe fun - * @todo describe target - * - * @param {String} src the src of an img-tag - * @param {Proton.Particle} particle - * @param {Boolean} drawCanvas set to true if a canvas should be saved into particle.transform.canvas - * @param {Boolean} fun - * @param {Object} target - */ - loadedImage: function(src, particle, drawCanvas, fun, target) { - particle.target = target; - particle.transform.src = src; - if (!Proton.TextureBuffer[src]) - Proton.TextureBuffer[src] = particle.target; - if (drawCanvas) { - if (Proton.TextureCanvasBuffer[src]) { - particle.transform.canvas = Proton.TextureCanvasBuffer[src]; - } else { - var _width = Proton.WebGLUtil.nhpot(particle.target.width); - var _height = Proton.WebGLUtil.nhpot(particle.target.height); - particle.transform.canvas = Proton.DomUtil.createCanvas('canvas' + src, _width, _height); - var context = particle.transform.canvas.getContext('2d'); - context.drawImage(particle.target, 0, 0, particle.target.width, particle.target.height); - Proton.TextureCanvasBuffer[src] = particle.transform.canvas; - } - } - if (fun) - fun(particle); - }, + return target; + }, - /** - * @memberof Proton#Proton.Util - * @method loadAndSetImage - * - * @todo add description - * @todo describe fun - * - * @param {String} src the src of an img-tag - * @param {Proton.Particle} particle - * @param {Boolean} drawCanvas set to true if a canvas should be saved into particle.transform.canvas - * @param {Boolean} fun - */ - loadAndSetImage: function(src, particle, drawCanvas, fun) { - if (Proton.TextureBuffer[src]) { - this.loadedImage(src, particle, drawCanvas, fun, Proton.TextureBuffer[src]); + /** + * Returns a new Span object + * + * @memberof Proton#Proton.Util + * @method setSpanValue + * + * @todo a, b and c should be 'Mixed' or 'Number'? + * + * @param {Mixed | Span} a + * @param {Mixed} b + * @param {Mixed} c + * + * @return {Span} + */ + setSpanValue(a, b, c) { + if (a instanceof Span) { + return a; + } else { + if (!b) { + return new Span(a); } else { - var self = this; - var myImage = new Image(); - myImage.onload = function(e) { - self.loadedImage(src, particle, drawCanvas, fun, e.target); - } - myImage.src = src; - } - }, - - /** - * @typedef {Object} rgbObject - * @property {Number} r red value - * @property {Number} g green value - * @property {Number} b blue value - */ - /** - * converts a hex value to a rgb object - * - * @memberof Proton#Proton.Util - * @method hexToRGB - * - * @param {String} h any hex value, e.g. #000000 or 000000 for black - * - * @return {rgbObject} - */ - hexToRGB: function(h) { - var hex16 = (h.charAt(0) == "#") ? h.substring(1, 7) : h; - var r = parseInt(hex16.substring(0, 2), 16); - var g = parseInt(hex16.substring(2, 4), 16); - var b = parseInt(hex16.substring(4, 6), 16); - - return { - r: r, - g: g, - b: b + if (!c) + return new Span(a, b); + else + return new Span(a, b, c); } - }, - - /** - * converts a rgb value to a rgb string - * - * @memberof Proton#Proton.Util - * @method rgbToHex - * - * @param {Object | Proton.hexToRGB} rgb a rgb object like in {@link Proton#Proton.Util.hexToRGB} - * - * @return {String} rgb() - */ - rgbToHex: function(rbg) { - return 'rgb(' + rbg.r + ', ' + rbg.g + ', ' + rbg.b + ')'; } - }; + }, - Proton.Util = Util; -})(Proton); + /** + * Returns the value from a Span, if the param is not a Span it will return the given parameter + * + * @memberof Proton#Proton.Util + * @method getSpanValue + * + * @param {Mixed | Span} pan + * + * @return {Mixed} the value of Span OR the parameter if it is not a Span + */ + getSpanValue(pan) { + return pan instanceof Span ? pan.getValue() : pan; + }, + /** + * This will get the image data. It could be necessary to create a Proton.Zone. + * + * @memberof Proton#Proton.Util + * @method getImageData + * + * @param {HTMLCanvasElement} context any canvas, must be a 2dContext 'canvas.getContext('2d')' + * @param {Object} image could be any dom image, e.g. document.getElementById('thisIsAnImgTag'); + * @param {Proton.Rectangle} rect + */ + getImageData(context, image, rect) { + return ImgUtil.getImageData(context, image, rect); + }, -///bind -if (!Function.prototype.bind) { - Function.prototype.bind = function(oThis) { - if (typeof this !== "function") { - // closest thing possible to the ECMAScript 5 - // internal IsCallable function - throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable"); - } + destroy(arr, param) { + let i = arr.length; - var aArgs = Array.prototype.slice.call(arguments, 1), - fToBind = this, - fNOP = function() {}, - fBound = function() { - return fToBind.apply(this instanceof fNOP ? this : oThis || this, - aArgs.concat(Array.prototype.slice.call(arguments))); - }; + while (i--) { + try { arr[i].destroy(param); } catch (e) { } + delete arr[i]; + } - fNOP.prototype = this.prototype; - fBound.prototype = new fNOP(); + arr.length = 0; + } - return fBound; - }; -} +} \ No newline at end of file diff --git a/src/utils/WebGLUtil.js b/src/utils/WebGLUtil.js index ee7daca..9e4af9e 100644 --- a/src/utils/WebGLUtil.js +++ b/src/utils/WebGLUtil.js @@ -1,131 +1,135 @@ -(function(Proton, undefined) { +export default { - /** - * @namespace - * @memberof! Proton# - * @alias Proton.WebGLUtil + /** + * @memberof Proton#Proton.WebGLUtil + * @method ipot + * + * @todo add description + * @todo add length description + * + * @param {Number} length + * + * @return {Boolean} */ - var WebGLUtil = WebGLUtil || { + ipot(length) { + return (length & (length - 1)) == 0; + }, - /** - * @memberof Proton#Proton.WebGLUtil - * @method ipot - * - * @todo add description - * @todo add length description - * - * @param {Number} length - * - * @return {Boolean} - */ - ipot : function(length) { - return (length & (length - 1)) == 0; - }, + /** + * @memberof Proton#Proton.WebGLUtil + * @method nhpot + * + * @todo add description + * @todo add length description + * + * @param {Number} length + * + * @return {Number} + */ + nhpot(length) { + --length; + for (let i = 1; i < 32; i <<= 1) { + length = length | length >> i; + } + + return length + 1; + }, - /** - * @memberof Proton#Proton.WebGLUtil - * @method nhpot - * - * @todo add description - * @todo add length description - * - * @param {Number} length - * - * @return {Number} - */ - nhpot : function(length) {--length; - for (var i = 1; i < 32; i <<= 1) { - length = length | length >> i; - } - return length + 1; - }, + /** + * @memberof Proton#Proton.WebGLUtil + * @method makeTranslation + * + * @todo add description + * @todo add tx, ty description + * @todo add return description + * + * @param {Number} tx either 0 or 1 + * @param {Number} ty either 0 or 1 + * + * @return {Object} + */ + makeTranslation(tx, ty) { + return [1, 0, 0, 0, 1, 0, tx, ty, 1]; + }, - /** - * @memberof Proton#Proton.WebGLUtil - * @method makeTranslation - * - * @todo add description - * @todo add tx, ty description - * @todo add return description - * - * @param {Number} tx either 0 or 1 - * @param {Number} ty either 0 or 1 - * - * @return {Object} - */ - makeTranslation : function(tx, ty) { - return [1, 0, 0, 0, 1, 0, tx, ty, 1]; - }, + /** + * @memberof Proton#Proton.WebGLUtil + * @method makeRotation + * + * @todo add description + * @todo add return description + * + * @param {Number} angleInRadians + * + * @return {Object} + */ + makeRotation(angleInRadians) { + let c = Math.cos(angleInRadians); + let s = Math.sin(angleInRadians); - /** - * @memberof Proton#Proton.WebGLUtil - * @method makeRotation - * - * @todo add description - * @todo add return description - * - * @param {Number} angleInRadians - * - * @return {Object} - */ - makeRotation : function(angleInRadians) { - var c = Math.cos(angleInRadians); - var s = Math.sin(angleInRadians); - return [c, -s, 0, s, c, 0, 0, 0, 1]; - }, + return [c, -s, 0, s, c, 0, 0, 0, 1]; + }, - /** - * @memberof Proton#Proton.WebGLUtil - * @method makeScale - * - * @todo add description - * @todo add tx, ty description - * @todo add return description - * - * @param {Number} sx either 0 or 1 - * @param {Number} sy either 0 or 1 - * - * @return {Object} - */ - makeScale : function(sx, sy) { - return [sx, 0, 0, 0, sy, 0, 0, 0, 1]; - }, + /** + * @memberof Proton#Proton.WebGLUtil + * @method makeScale + * + * @todo add description + * @todo add tx, ty description + * @todo add return description + * + * @param {Number} sx either 0 or 1 + * @param {Number} sy either 0 or 1 + * + * @return {Object} + */ + makeScale(sx, sy) { + return [sx, 0, 0, 0, sy, 0, 0, 0, 1]; + }, - /** - * @memberof Proton#Proton.WebGLUtil - * @method matrixMultiply - * - * @todo add description - * @todo add a, b description - * @todo add return description - * - * @param {Object} a - * @param {Object} b - * - * @return {Object} - */ - matrixMultiply : function(a, b) { - var a00 = a[0 * 3 + 0]; - var a01 = a[0 * 3 + 1]; - var a02 = a[0 * 3 + 2]; - var a10 = a[1 * 3 + 0]; - var a11 = a[1 * 3 + 1]; - var a12 = a[1 * 3 + 2]; - var a20 = a[2 * 3 + 0]; - var a21 = a[2 * 3 + 1]; - var a22 = a[2 * 3 + 2]; - var b00 = b[0 * 3 + 0]; - var b01 = b[0 * 3 + 1]; - var b02 = b[0 * 3 + 2]; - var b10 = b[1 * 3 + 0]; - var b11 = b[1 * 3 + 1]; - var b12 = b[1 * 3 + 2]; - var b20 = b[2 * 3 + 0]; - var b21 = b[2 * 3 + 1]; - var b22 = b[2 * 3 + 2]; - return [a00 * b00 + a01 * b10 + a02 * b20, a00 * b01 + a01 * b11 + a02 * b21, a00 * b02 + a01 * b12 + a02 * b22, a10 * b00 + a11 * b10 + a12 * b20, a10 * b01 + a11 * b11 + a12 * b21, a10 * b02 + a11 * b12 + a12 * b22, a20 * b00 + a21 * b10 + a22 * b20, a20 * b01 + a21 * b11 + a22 * b21, a20 * b02 + a21 * b12 + a22 * b22]; - } - } + /** + * @memberof Proton#Proton.WebGLUtil + * @method matrixMultiply + * + * @todo add description + * @todo add a, b description + * @todo add return description + * + * @param {Object} a + * @param {Object} b + * + * @return {Object} + */ + matrixMultiply(a, b) { + let a00 = a[0 * 3 + 0]; + let a01 = a[0 * 3 + 1]; + let a02 = a[0 * 3 + 2]; + let a10 = a[1 * 3 + 0]; + let a11 = a[1 * 3 + 1]; + let a12 = a[1 * 3 + 2]; + let a20 = a[2 * 3 + 0]; + let a21 = a[2 * 3 + 1]; + let a22 = a[2 * 3 + 2]; + let b00 = b[0 * 3 + 0]; + let b01 = b[0 * 3 + 1]; + let b02 = b[0 * 3 + 2]; + let b10 = b[1 * 3 + 0]; + let b11 = b[1 * 3 + 1]; + let b12 = b[1 * 3 + 2]; + let b20 = b[2 * 3 + 0]; + let b21 = b[2 * 3 + 1]; + let b22 = b[2 * 3 + 2]; - Proton.WebGLUtil = WebGLUtil; -})(Proton); + return [ + a00 * b00 + a01 * b10 + a02 * b20, + a00 * b01 + a01 * b11 + a02 * b21, + a00 * b02 + a01 * b12 + a02 * b22, + a10 * b00 + a11 * b10 + a12 * b20, + a10 * b01 + a11 * b11 + a12 * b21, + a10 * b02 + a11 * b12 + a12 * b22, + a20 * b00 + a21 * b10 + a22 * b20, + a20 * b01 + a21 * b11 + a22 * b21, + a20 * b02 + a21 * b12 + a22 * b22 + ]; + } +} \ No newline at end of file diff --git a/src/zone/CircleZone.js b/src/zone/CircleZone.js index 891de84..9ccfc76 100644 --- a/src/zone/CircleZone.js +++ b/src/zone/CircleZone.js @@ -1,60 +1,64 @@ -(function(Proton, undefined) { - function CircleZone(x, y, radius) { - CircleZone._super_.call(this); - this.x = x; - this.y = y; - this.radius = radius; - this.angle = 0; - this.center = { - x : this.x, - y : this.y - }; - } - - - Proton.Util.inherits(CircleZone, Proton.Zone); - CircleZone.prototype.getPosition = function() { - this.random = Math.random(); - this.angle = Math.PI * 2 * Math.random(); - this.vector.x = this.x + this.random * this.radius * Math.cos(this.angle); - this.vector.y = this.y + this.random * this.radius * Math.sin(this.angle); - return this.vector; - } - - CircleZone.prototype.setCenter = function(x, y) { - this.center.x = x; - this.center.y = y; - } - - CircleZone.prototype.crossing = function(particle) { - var d = particle.p.distanceTo(this.center); - if (this.crossType == "dead") { - if (d - particle.radius > this.radius) - particle.dead = true; - } else if (this.crossType == "bound") { - if (d + particle.radius >= this.radius) - this.getSymmetric(particle); - } else if (this.crossType == "cross") { - if (this.alert) { - alert('Sorry CircleZone does not support cross method'); - this.alert = false; - } - } - } - - CircleZone.prototype.getSymmetric = function(particle) { - var tha2 = particle.v.getGradient(); - var tha1 = this.getGradient(particle); - var tha = 2 * (tha1 - tha2); - var oldx = particle.v.x; - var oldy = particle.v.y; - particle.v.x = oldx * Math.cos(tha) - oldy * Math.sin(tha); - particle.v.y = oldx * Math.sin(tha) + oldy * Math.cos(tha); - } - - CircleZone.prototype.getGradient = function(particle) { - return -Math.PI / 2 + Math.atan2(particle.p.y - this.center.y, particle.p.x - this.center.x); - } - - Proton.CircleZone = CircleZone; -})(Proton); +import Zone from './Zone'; +import MathUtils from '../math/MathUtils'; + +export default class CircleZone extends Zone { + + constructor(x, y, radius) { + super(); + + this.x = x; + this.y = y; + this.radius = radius; + + this.angle = 0; + this.center = { x, y }; + } + + getPosition() { + this.random = Math.random(); + this.angle = MathUtils.PIx2 * Math.random(); + + this.vector.x = this.x + this.random * this.radius * Math.cos(this.angle); + this.vector.y = this.y + this.random * this.radius * Math.sin(this.angle); + + return this.vector; + } + + setCenter(x, y) { + this.center.x = x; + this.center.y = y; + } + + crossing(particle) { + const d = particle.p.distanceTo(this.center); + + if (this.crossType == "dead") { + if (d - particle.radius > this.radius) + particle.dead = true; + } else if (this.crossType == "bound") { + if (d + particle.radius >= this.radius) + this.getSymmetric(particle); + } else if (this.crossType == "cross") { + if (this.alert) { + alert('Sorry CircleZone does not support cross method'); + this.alert = false; + } + } + } + + getSymmetric(particle) { + let tha2 = particle.v.getGradient(); + let tha1 = this.getGradient(particle); + + let tha = 2 * (tha1 - tha2); + let oldx = particle.v.x; + let oldy = particle.v.y; + + particle.v.x = oldx * Math.cos(tha) - oldy * Math.sin(tha); + particle.v.y = oldx * Math.sin(tha) + oldy * Math.cos(tha); + } + + getGradient(particle) { + return -MathUtils.PI_2 + Math.atan2(particle.p.y - this.center.y, particle.p.x - this.center.x); + } +} \ No newline at end of file diff --git a/src/zone/ImageZone.js b/src/zone/ImageZone.js index e7dd37b..8fe9150 100644 --- a/src/zone/ImageZone.js +++ b/src/zone/ImageZone.js @@ -1,39 +1,43 @@ -(function(Proton, undefined) { - function ImageZone(imageData, x, y, d) { - ImageZone._super_.call(this); +import Zone from './Zone'; +import Util from '../utils/Util'; + +export default class ImageZone extends Zone { + + constructor(imageData, x, y, d) { + super(); + this.reset(imageData, x, y, d); } - - Proton.Util.inherits(ImageZone, Proton.Zone); - ImageZone.prototype.reset = function(imageData, x, y, d) { + reset(imageData, x, y, d) { this.imageData = imageData; - this.x = Proton.Util.initValue(x, 0); - this.y = Proton.Util.initValue(y, 0); - this.d = Proton.Util.initValue(d, 2); + this.x = Util.initValue(x, 0); + this.y = Util.initValue(y, 0); + this.d = Util.initValue(d, 2); + this.vectors = []; this.setVectors(); } - ImageZone.prototype.setVectors = function() { - var i, j; - var length1 = this.imageData.width; - var length2 = this.imageData.height; - for ( i = 0; i < length1; i += this.d) { - for ( j = 0; j < length2; j += this.d) { - var index = ((j >> 0) * length1 + (i >> 0)) * 4; + setVectors() { + let i, j; + const length1 = this.imageData.width; + const length2 = this.imageData.height; + + for (i = 0; i < length1; i += this.d) { + for (j = 0; j < length2; j += this.d) { + let index = ((j >> 0) * length1 + (i >> 0)) * 4; + if (this.imageData.data[index + 3] > 0) { - this.vectors.push({ - x : i + this.x, - y : j + this.y - }); + this.vectors.push({ x: i + this.x, y: j + this.y }); } } } + return this.vector; } - ImageZone.prototype.getBound = function(x, y) { + getBound(x, y) { var index = ((y >> 0) * this.imageData.width + (x >> 0)) * 4; if (this.imageData.data[index + 3] > 0) return true; @@ -41,33 +45,34 @@ return false; } - ImageZone.prototype.getPosition = function() { + getPosition() { return this.vector.copy(this.vectors[Math.floor(Math.random() * this.vectors.length)]); } - ImageZone.prototype.getColor = function(x, y) { + getColor(x, y) { x -= this.x; y -= this.y; var i = ((y >> 0) * this.imageData.width + (x >> 0)) * 4; + return { - r : this.imageData.data[i], - g : this.imageData.data[i + 1], - b : this.imageData.data[i + 2], - a : this.imageData.data[i + 3] + r: this.imageData.data[i], + g: this.imageData.data[i + 1], + b: this.imageData.data[i + 2], + a: this.imageData.data[i + 3] }; } - ImageZone.prototype.crossing = function(particle) { + crossing(particle) { if (this.crossType == "dead") { if (this.getBound(particle.p.x - this.x, particle.p.y - this.y)) particle.dead = true; else particle.dead = false; - } else if (this.crossType == "bound") { + } + + else if (this.crossType == "bound") { if (!this.getBound(particle.p.x - this.x, particle.p.y - this.y)) particle.v.negate(); } } - - Proton.ImageZone = ImageZone; -})(Proton); +} \ No newline at end of file diff --git a/src/zone/LineZone.js b/src/zone/LineZone.js index 7a4e872..2eb231b 100644 --- a/src/zone/LineZone.js +++ b/src/zone/LineZone.js @@ -1,6 +1,12 @@ -(function(Proton, undefined) { - function LineZone(x1, y1, x2, y2, direction) { - LineZone._super_.call(this); +import Zone from './Zone'; +import Util from '../utils/Util'; +import MathUtils from '../math/MathUtils'; + +export default class CircleZone extends Zone { + + constructor(x1, y1, x2, y2, direction) { + super(); + if (x2 - x1 >= 0) { this.x1 = x1; this.y1 = y1; @@ -12,112 +18,118 @@ this.x2 = x1; this.y2 = y1; } + this.dx = this.x2 - this.x1; this.dy = this.y2 - this.y1; + this.minx = Math.min(this.x1, this.x2); this.miny = Math.min(this.y1, this.y2); this.maxx = Math.max(this.x1, this.x2); this.maxy = Math.max(this.y1, this.y2); + this.dot = this.x2 * this.y1 - this.x1 * this.y2; this.xxyy = this.dx * this.dx + this.dy * this.dy; + this.gradient = this.getGradient(); this.length = this.getLength(); - this.direction = Proton.Util.initValue(direction, '>'); + this.direction = Util.initValue(direction, '>'); } - Proton.Util.inherits(LineZone, Proton.Zone); - LineZone.prototype.getPosition = function() { + getPosition() { this.random = Math.random(); this.vector.x = this.x1 + this.random * this.length * Math.cos(this.gradient); this.vector.y = this.y1 + this.random * this.length * Math.sin(this.gradient); + return this.vector; } - LineZone.prototype.getDirection = function(x, y) { - var A = this.dy; - var B = -this.dx; - var C = this.dot; - var D = B == 0 ? 1 : B; + getDirection(x, y) { + const A = this.dy; + const B = -this.dx; + const C = this.dot; + const D = B == 0 ? 1 : B; + if ((A * x + B * y + C) * D > 0) - return true + return true; else return false; } - LineZone.prototype.getDistance = function(x, y) { - var A = this.dy; - var B = -this.dx; - var C = this.dot; - var D = (A * x + B * y + C); + getDistance(x, y) { + const A = this.dy; + const B = -this.dx; + const C = this.dot; + const D = (A * x + B * y + C); + return D / Math.sqrt(this.xxyy); } - LineZone.prototype.getSymmetric = function(v) { - var tha2 = v.getGradient(); - var tha1 = this.getGradient(); - var tha = 2 * (tha1 - tha2); - var oldx = v.x; - var oldy = v.y; + getSymmetric(v) { + const tha2 = v.getGradient(); + const tha1 = this.getGradient(); + const tha = 2 * (tha1 - tha2); + + const oldx = v.x; + const oldy = v.y; + v.x = oldx * Math.cos(tha) - oldy * Math.sin(tha); v.y = oldx * Math.sin(tha) + oldy * Math.cos(tha); + return v; } - LineZone.prototype.getGradient = function() { + getGradient() { return Math.atan2(this.dy, this.dx); } - LineZone.prototype.getRange = function(particle, fun) { - var angle = Math.abs(this.getGradient()); - if (angle <= Math.PI / 4) { - if (particle.p.x < this.maxx && particle.p.x > this.minx) { - fun(); - } + rangeOut(particle) { + const angle = Math.abs(this.getGradient()); + + if (angle <= MathUtils.PI / 4) { + if (particle.p.x <= this.maxx && particle.p.x >= this.minx) return true; } else { - if (particle.p.y < this.maxy && particle.p.y > this.miny) { - fun(); - } + if (particle.p.y <= this.maxy && particle.p.y >= this.miny) return true; } + + return false; } - LineZone.prototype.getLength = function() { + getLength() { return Math.sqrt(this.dx * this.dx + this.dy * this.dy) } - LineZone.prototype.crossing = function(particle) { - var self = this; + crossing(particle) { if (this.crossType == "dead") { if (this.direction == ">" || this.direction == "R" || this.direction == "right" || this.direction == "down") { - this.getRange(particle, function() { - if (self.getDirection(particle.p.x, particle.p.y)) - particle.dead = true; - }) + if (!this.rangeOut(particle)) return; + if (this.getDirection(particle.p.x, particle.p.y)) particle.dead = true; } else { - this.getRange(particle, function() { - if (!self.getDirection(particle.p.x, particle.p.y)) - particle.dead = true; - }) + if (!this.rangeOut(particle)) return; + if (!this.getDirection(particle.p.x, particle.p.y)) particle.dead = true; } - } else if (this.crossType == "bound") { - this.getRange(particle, function() { - if (self.getDistance(particle.p.x, particle.p.y) <= particle.radius) { - if (self.dx == 0) { - particle.v.x *= -1; - } else if (self.dy == 0) { - particle.v.y *= -1; - } else { - self.getSymmetric(particle.v); - } + } + + else if (this.crossType == "bound") { + if (!this.rangeOut(particle)) return; + + if (this.getDistance(particle.p.x, particle.p.y) <= particle.radius) { + if (this.dx == 0) { + particle.v.x *= -1; + } else if (this.dy == 0) { + particle.v.y *= -1; + } else { + this.getSymmetric(particle.v); } - }); - } else if (this.crossType == "cross") { + } + } + + else if (this.crossType == "cross") { if (this.alert) { - alert('Sorry lineZone does not support cross method'); + console.error('Sorry lineZone does not support cross method'); this.alert = false; } } } - Proton.LineZone = LineZone; -})(Proton); +} \ No newline at end of file diff --git a/src/zone/PointZone.js b/src/zone/PointZone.js index 183d01f..bd080d1 100644 --- a/src/zone/PointZone.js +++ b/src/zone/PointZone.js @@ -1,24 +1,25 @@ -(function(Proton, undefined) { - function PointZone(x, y) { - PointZone._super_.call(this); +import Zone from './Zone'; + +export default class PointZone extends Zone { + + constructor(x, y) { + super(); this.x = x; this.y = y; } - - Proton.Util.inherits(PointZone, Proton.Zone); - PointZone.prototype.getPosition = function() { + getPosition() { this.vector.x = this.x; this.vector.y = this.y; + return this.vector; } - PointZone.prototype.crossing = function(particle) { + crossing(particle) { + if (this.alert) { alert('Sorry PointZone does not support crossing method'); this.alert = false; } } - - Proton.PointZone = PointZone; -})(Proton); +} \ No newline at end of file diff --git a/src/zone/RectZone.js b/src/zone/RectZone.js index eb9a21b..256e7fa 100644 --- a/src/zone/RectZone.js +++ b/src/zone/RectZone.js @@ -1,21 +1,24 @@ -(function(Proton, undefined) { - function RectZone(x, y, width, height) { - RectZone._super_.call(this); +import Zone from './Zone'; + +export default class PointZoneRectZone extends Zone { + + constructor(x, y, width, height) { + super(); + this.x = x; this.y = y; this.width = width; this.height = height; } - - Proton.Util.inherits(RectZone, Proton.Zone); - RectZone.prototype.getPosition = function() { + getPosition() { this.vector.x = this.x + Math.random() * this.width; this.vector.y = this.y + Math.random() * this.height; + return this.vector; } - RectZone.prototype.crossing = function(particle) { + crossing(particle) { if (this.crossType == "dead") { if (particle.p.x + particle.radius < this.x) particle.dead = true; @@ -26,7 +29,9 @@ particle.dead = true; else if (particle.p.y - particle.radius > this.y + this.height) particle.dead = true; - } else if (this.crossType == "bound") { + } + + else if (this.crossType == "bound") { if (particle.p.x - particle.radius < this.x) { particle.p.x = this.x + particle.radius; particle.v.x *= -1; @@ -34,7 +39,7 @@ particle.p.x = this.x + this.width - particle.radius; particle.v.x *= -1; } - + if (particle.p.y - particle.radius < this.y) { particle.p.y = this.y + particle.radius; particle.v.y *= -1; @@ -42,7 +47,9 @@ particle.p.y = this.y + this.height - particle.radius; particle.v.y *= -1; } - } else if (this.crossType == "cross") { + } + + else if (this.crossType == "cross") { if (particle.p.x + particle.radius < this.x && particle.v.x <= 0) particle.p.x = this.x + this.width + particle.radius; else if (particle.p.x - particle.radius > this.x + this.width && particle.v.x >= 0) @@ -54,6 +61,4 @@ particle.p.y = this.y - particle.radius; } } - - Proton.RectZone = RectZone; -})(Proton); +} \ No newline at end of file diff --git a/src/zone/Zone.js b/src/zone/Zone.js index 9128046..3144935 100644 --- a/src/zone/Zone.js +++ b/src/zone/Zone.js @@ -1,21 +1,16 @@ -(function(Proton, undefined) { - function Zone() { - this.vector = new Proton.Vector2D(0, 0); +import Vector2D from '../math/Vector2D'; + +export default class Zone { + constructor() { + this.vector = new Vector2D(0, 0); this.random = 0; this.crossType = "dead"; this.alert = true; } + getPosition() { + } - Zone.prototype = { - getPosition : function() { - - }, - - crossing : function(particle) { - - } - }; - - Proton.Zone = Zone; -})(Proton); + crossing(particle) { + } +} \ No newline at end of file