You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by ah...@apache.org on 2015/04/15 23:43:52 UTC

[47/55] [abbrv] git commit: [flex-asjs] [refs/heads/develop] - refactor classes into more swcs and get AS build running (JS build will be fixed in later commit)

refactor classes into more swcs and get AS build running (JS build will be fixed in later commit)


Project: http://git-wip-us.apache.org/repos/asf/flex-asjs/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-asjs/commit/c84daedb
Tree: http://git-wip-us.apache.org/repos/asf/flex-asjs/tree/c84daedb
Diff: http://git-wip-us.apache.org/repos/asf/flex-asjs/diff/c84daedb

Branch: refs/heads/develop
Commit: c84daedb27af3caad0564170173680af5e60ddcc
Parents: c548870
Author: Alex Harui <ah...@apache.org>
Authored: Tue Apr 14 12:51:42 2015 -0700
Committer: Alex Harui <ah...@apache.org>
Committed: Tue Apr 14 12:51:42 2015 -0700

----------------------------------------------------------------------
 build.xml                                       |  10 +-
 frameworks/air-config-template.xml              |   6 +-
 frameworks/air-config.xml                       |   6 +-
 frameworks/build.xml                            | 108 +++-
 frameworks/flex-config-template.xml             |   8 +-
 frameworks/flex-config.xml                      |   8 +-
 frameworks/js/.jshintrc                         |  14 +
 .../projects/Binding/as/src/BindingClasses.as   | 126 +----
 .../apache/flex/binding/ViewBaseDataBinding.as  | 296 +++++++++++
 .../flex/binding/ApplicationDataBinding.as      | 329 ++++++++++++
 .../apache/flex/binding/ContainerDataBinding.as | 382 ++++++++++++++
 .../flex/binding/MXMLBeadViewBaseDataBinding.as | 328 ++++++++++++
 frameworks/projects/Binding/basic-manifest.xml  |  31 ++
 frameworks/projects/Binding/build.xml           |  81 +++
 frameworks/projects/Binding/compile-config.xml  |  77 +++
 .../projects/Charts/as/src/ChartsClasses.as     | 112 +---
 .../projects/Charts/asjs/ChartsClasses.as       |  95 ----
 frameworks/projects/Charts/asjs/defaults.css    | 102 ++++
 .../Charts/asjs/src/ChartASJSClasses.as         |  61 +++
 frameworks/projects/Charts/basic-manifest.xml   |  50 ++
 frameworks/projects/Charts/build.xml            |  81 +++
 frameworks/projects/Charts/compile-config.xml   |  82 +++
 .../Collections/as/src/CollectionsClasses.as    | 127 +----
 .../org/apache/flex/collections/ICollection.as  |  43 ++
 .../flex/collections/IStringCollection.as       |  43 ++
 .../apache/flex/collections/LazyCollection.as   | 248 +++++++++
 .../collections/converters/IItemConverter.as    |  49 ++
 .../collections/converters/JSONItemConverter.as |  74 +++
 .../flex/collections/parsers/IInputParser.as    |  50 ++
 .../flex/collections/parsers/JSONInputParser.as |  54 ++
 .../as/src/org/apache/flex/data/ICollection.as  |  43 --
 .../org/apache/flex/data/IStringCollection.as   |  43 --
 .../projects/Collections/basic-manifest.xml     |  28 +
 frameworks/projects/Collections/build.xml       |  81 +++
 .../projects/Collections/compile-config.xml     |  76 +++
 frameworks/projects/Core/as/basic-manifest.xml  | 110 ----
 frameworks/projects/Core/as/build.xml           |  79 ---
 frameworks/projects/Core/as/compile-config.xml  | 107 ----
 frameworks/projects/Core/as/defaults.css        | 514 -------------------
 frameworks/projects/Core/as/mx-manifest.xml     |  26 -
 frameworks/projects/Core/as/src/CoreClasses.as  | 162 ++----
 .../as/src/org/apache/flex/core/FormatBase.as   | 115 -----
 .../apache/flex/core/IScrollingLayoutParent.as  |  71 ---
 .../org/apache/flex/core/ViewBaseDataBinding.as | 296 -----------
 .../as/src/org/apache/flex/events/DragEvent.as  | 317 ------------
 .../as/src/org/apache/flex/svg/TextButton.as    |  30 --
 frameworks/projects/Core/as/svg-manifest.xml    |  24 -
 .../projects/Core/asjs/basic-manifest.xml       |  67 ---
 .../projects/Core/asjs/src/CoreASJSClasses.as   |  38 ++
 .../projects/Core/asjs/src/CoreClasses.as       |  95 ----
 .../apache/flex/core/ApplicationDataBinding.as  | 328 ------------
 .../apache/flex/core/ContainerDataBinding.as    | 381 --------------
 .../asjs/src/org/apache/flex/core/DropType.as   |  64 ---
 .../org/apache/flex/core/MXMLBeadViewBase.as    | 320 ------------
 .../flex/core/MXMLBeadViewBaseDataBinding.as    | 327 ------------
 .../flex/core/StatesWithTransitionsImpl.as      | 299 -----------
 .../asjs/tests/FlexUnitFlexJSApplication.mxml   |  46 --
 frameworks/projects/Core/asjs/tests/build.xml   | 141 -----
 .../tests/flexUnitTests/DataGridColumnTester.as |  27 -
 .../flexUnitTests/DataGridColumnTesterTest.as   |  55 --
 frameworks/projects/Core/basic-manifest.xml     |  37 ++
 frameworks/projects/Core/build.xml              |  82 +++
 frameworks/projects/Core/compile-config.xml     |  83 +++
 frameworks/projects/Core/mx-manifest.xml        |  26 +
 .../projects/CreateJS/as/createjs-manifest.xml  |  31 --
 frameworks/projects/CreateJS/as/defaults.css    |  36 ++
 .../projects/CreateJS/as/src/CreateJSClasses.as | 127 +----
 frameworks/projects/CreateJS/build.xml          |  81 +++
 frameworks/projects/CreateJS/compile-config.xml |  79 +++
 .../projects/CreateJS/createjs-manifest.xml     |  31 ++
 .../projects/DragDrop/as/src/DragDropClasses.as | 128 +----
 .../as/src/org/apache/flex/events/DragEvent.as  | 317 ++++++++++++
 .../DragDrop/asjs/src/DragDropASJSClasses.as    |  33 ++
 .../asjs/src/org/apache/flex/core/DropType.as   |  64 +++
 .../beads/controllers/DragMouseController.as    | 261 ++++++++++
 .../beads/controllers/DropMouseController.as    | 181 +++++++
 frameworks/projects/DragDrop/basic-manifest.xml |  27 +
 frameworks/projects/DragDrop/build.xml          |  81 +++
 frameworks/projects/DragDrop/compile-config.xml |  78 +++
 .../projects/Effects/as/src/EffectsClasses.as   | 128 +----
 .../projects/Effects/asjs/EffectsClasses.as     |  95 ----
 .../Effects/asjs/src/EffectsASJSClasses.as      |  37 ++
 .../flex/core/StatesWithTransitionsImpl.as      | 299 +++++++++++
 frameworks/projects/Effects/basic-manifest.xml  |  32 ++
 frameworks/projects/Effects/build.xml           |  81 +++
 frameworks/projects/Effects/compile-config.xml  |  78 +++
 .../Formatters/as/src/FormattersClasses.as      | 126 +----
 .../as/src/org/apache/flex/core/FormatBase.as   | 115 +++++
 .../asjs/src/FormattersASJSClasses.as           |  36 ++
 .../flex/html/accessories/CurrencyFormatter.as  | 215 ++++++++
 .../html/accessories/DateFormatMMDDYYYYBead.as  | 158 ++++++
 .../flex/html/accessories/NumberFormatter.as    | 210 ++++++++
 .../flex/html/beads/FormatableLabelView.as      |  90 ++++
 .../flex/html/beads/FormatableTextInputView.as  |  91 ++++
 .../projects/Formatters/basic-manifest.xml      |  25 +
 frameworks/projects/Formatters/build.xml        |  81 +++
 .../projects/Formatters/compile-config.xml      |  79 +++
 frameworks/projects/GoogleMaps/as/defaults.css  |  28 +
 .../GoogleMaps/as/src/GoogleMapsClasses.as      | 127 +----
 frameworks/projects/GoogleMaps/build.xml        |  81 +++
 .../projects/GoogleMaps/compile-config.xml      |  78 +++
 .../projects/GoogleMaps/google-manifest.xml     |  24 +
 .../projects/Graphics/as/src/GraphicsClasses.as | 117 +----
 frameworks/projects/Graphics/basic-manifest.xml |  34 ++
 frameworks/projects/Graphics/build.xml          |  81 +++
 frameworks/projects/Graphics/compile-config.xml |  76 +++
 frameworks/projects/HTML/as/defaults.css        | 431 ++++++++++++++++
 frameworks/projects/HTML/as/src/HTMLClasses.as  |  51 +-
 .../apache/flex/core/IScrollingLayoutParent.as  |  71 +++
 .../src/org/apache/flex/html/beads/AlertView.as |   2 +-
 .../flex/html/beads/NumericStepperView.as       |   4 +-
 .../as/src/org/apache/flex/svg/TextButton.as    |  30 ++
 frameworks/projects/HTML/asjs/HTMLClasses.as    |  95 ----
 .../projects/HTML/asjs/src/HTMLASJSClasses.as   |  52 ++
 .../org/apache/flex/html/MXMLBeadViewBase.as    | 323 ++++++++++++
 .../flex/html/accessories/CurrencyFormatter.as  | 215 --------
 .../html/accessories/DateFormatMMDDYYYYBead.as  | 158 ------
 .../flex/html/accessories/NumberFormatter.as    | 210 --------
 .../flex/html/beads/FormatableLabelView.as      |  90 ----
 .../flex/html/beads/FormatableTextInputView.as  |  91 ----
 .../beads/controllers/DragMouseController.as    | 261 ----------
 .../beads/controllers/DropMouseController.as    | 181 -------
 .../asjs/tests/FlexUnitFlexJSApplication.mxml   |  46 ++
 frameworks/projects/HTML/asjs/tests/build.xml   | 141 +++++
 .../tests/flexUnitTests/DataGridColumnTester.as |  27 +
 .../flexUnitTests/DataGridColumnTesterTest.as   |  55 ++
 frameworks/projects/HTML/basic-manifest.xml     |  98 ++++
 frameworks/projects/HTML/build.xml              |  82 +++
 frameworks/projects/HTML/compile-config.xml     |  87 ++++
 frameworks/projects/HTML/svg-manifest.xml       |  24 +
 frameworks/projects/HTML5/as/defaults.css       |  68 +++
 frameworks/projects/HTML5/as/html5-manifest.xml |  35 --
 .../projects/HTML5/as/src/HTML5Classes.as       | 127 +----
 frameworks/projects/HTML5/build.xml             |  81 +++
 frameworks/projects/HTML5/compile-config.xml    |  79 +++
 frameworks/projects/HTML5/html5-manifest.xml    |  35 ++
 frameworks/projects/JQuery/as/defaults.css      |  44 ++
 .../projects/JQuery/as/jquery-manifest.xml      |  30 --
 .../projects/JQuery/as/src/JQueryClasses.as     | 127 +----
 frameworks/projects/JQuery/build.xml            |  81 +++
 frameworks/projects/JQuery/compile-config.xml   |  79 +++
 frameworks/projects/JQuery/jquery-manifest.xml  |  30 ++
 .../projects/Mobile/as/cordova-manifest.xml     |  28 -
 .../projects/Mobile/as/src/MobileClasses.as     | 122 +----
 .../projects/Mobile/asjs/MobileClasses.as       |  95 ----
 .../Mobile/asjs/src/MobileASJSClasses.as        |  39 ++
 frameworks/projects/Mobile/basic-manifest.xml   |  29 ++
 frameworks/projects/Mobile/build.xml            |  81 +++
 frameworks/projects/Mobile/compile-config.xml   |  83 +++
 frameworks/projects/Mobile/cordova-manifest.xml |  28 +
 .../projects/Network/as/src/NetworkClasses.as   | 127 +----
 .../as/src/org/apache/flex/net/IInputParser.as  |  50 --
 .../src/org/apache/flex/net/IItemConverter.as   |  49 --
 .../src/org/apache/flex/net/JSONInputParser.as  |  54 --
 .../org/apache/flex/net/JSONItemConverter.as    |  74 ---
 .../flex/net/dataConverters/LazyCollection.as   | 249 ---------
 frameworks/projects/Network/basic-manifest.xml  |  27 +
 frameworks/projects/Network/build.xml           |  81 +++
 frameworks/projects/Network/compile-config.xml  |  76 +++
 159 files changed, 8817 insertions(+), 7912 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c84daedb/build.xml
----------------------------------------------------------------------
diff --git a/build.xml b/build.xml
index 3822577..dd3f0f1 100644
--- a/build.xml
+++ b/build.xml
@@ -160,8 +160,8 @@
        clean does not remove these since they don't change often and the downloads take time.
     -->
     <target name="thirdparty-downloads" description="Downloads all the required thirdparty code.">
-        <ant dir="${basedir}/frameworks/as" target="thirdparty-downloads"/>        
-        <ant dir="${basedir}/frameworks/js" target="thirdparty-downloads"/>
+        <ant dir="${basedir}/frameworks" target="thirdparty-downloads"/>
+        <!-- <ant dir="${basedir}/frameworks/js" target="thirdparty-downloads"/> -->
         <!-- don't ask again about these since we just did if these weren't already set -->	    
 	    <property name="build.noprompt" value="set" />
     </target>
@@ -316,8 +316,8 @@
     </target>
 	
     <target name="create-config" description="Create flex config file">
-        <ant dir="${basedir}/frameworks/as" target="flex-config" />
-        <ant dir="${basedir}/frameworks/as" target="air-config" />
+        <ant dir="${basedir}/frameworks" target="flex-config" />
+        <ant dir="${basedir}/frameworks" target="air-config" />
     </target>
 	
     <target name="setup-binary-release" depends="thirdparty-clean"
@@ -405,7 +405,7 @@
     -->
 
     <target name="frameworks-as" description="Full build of all Actionscript framework SWCs, including resource bundles and themes">
-        <ant dir="${basedir}/frameworks/as">
+        <ant dir="${basedir}/frameworks">
             <property name="locale" value="${locale}"/>
         </ant>
     </target>

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c84daedb/frameworks/air-config-template.xml
----------------------------------------------------------------------
diff --git a/frameworks/air-config-template.xml b/frameworks/air-config-template.xml
index a58ad0f..20ed8ec 100644
--- a/frameworks/air-config-template.xml
+++ b/frameworks/air-config-template.xml
@@ -77,7 +77,7 @@
       
       <!-- List of SWC files or directories that contain SWC files. -->
       <library-path>
-         <path-element>as/libs</path-element>
+         <path-element>libs</path-element>
          <path-element>{airHome}/frameworks/libs/air</path-element>
       </library-path>
      
@@ -94,13 +94,13 @@
          <namespace>
             <uri>library://ns.apache.org/flexjs/basic</uri>
             
-            <manifest>as/projects/FlexJSUI/basic-manifest.xml</manifest>
+            <manifest>projects/Core/basic-manifest.xml</manifest>
          
         </namespace>                                                 
          <namespace>
             <uri>library://ns.apache.org/flexjs/html5</uri>
             
-            <manifest>as/projects/FlexJSUI/html5-manifest.xml</manifest>
+            <manifest>projects/HTML5/html5-manifest.xml</manifest>
          
         </namespace>   
       </namespaces>

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c84daedb/frameworks/air-config.xml
----------------------------------------------------------------------
diff --git a/frameworks/air-config.xml b/frameworks/air-config.xml
index e79cb73..789c730 100644
--- a/frameworks/air-config.xml
+++ b/frameworks/air-config.xml
@@ -77,7 +77,7 @@
       
       <!-- List of SWC files or directories that contain SWC files. -->
       <library-path>
-         <path-element>as/libs</path-element>
+         <path-element>libs</path-element>
          <path-element>{airHome}/frameworks/libs/air</path-element>
       </library-path>
      
@@ -94,13 +94,13 @@
          <namespace>
             <uri>library://ns.apache.org/flexjs/basic</uri>
             
-            <manifest>as/projects/FlexJSUI/basic-manifest.xml</manifest>
+            <manifest>projects/Core/basic-manifest.xml</manifest>
          
         </namespace>                                                 
          <namespace>
             <uri>library://ns.apache.org/flexjs/html5</uri>
             
-            <manifest>as/projects/FlexJSUI/html5-manifest.xml</manifest>
+            <manifest>projects/HTML5/html5-manifest.xml</manifest>
          
         </namespace>   
       </namespaces>

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c84daedb/frameworks/build.xml
----------------------------------------------------------------------
diff --git a/frameworks/build.xml b/frameworks/build.xml
index 46e2145..d117ce5 100644
--- a/frameworks/build.xml
+++ b/frameworks/build.xml
@@ -23,9 +23,9 @@
     build_framework.xml is renamed to build.xml when it is packaged.
     It is used to build the frameworks directory from the zip file. 
 -->
-<project name="frameworks-as" default="main" basedir=".">
+<project name="frameworks" default="main" basedir=".">
 
-    <property name="FLEXJS_HOME" location="../.."/>
+    <property name="FLEXJS_HOME" location=".."/>
 
     <!-- Required for OSX 10.6 / Snow Leopard Performance. -->
     <!-- Java 7 on Mac requires OSX 10.7.3 or higher and is 64-bit only -->
@@ -75,9 +75,23 @@
     </target>
     
     <target name="compile" description="Builds all SWCs but not their resource bundles">
-        <antcall target="flexjsui"/>
+        <!-- order may matter due to dependencies -->
         <antcall target="mxmlcclasses"/>
-        <antcall target="flexjsjx"/>
+        <antcall target="Core"/>
+        <antcall target="Graphics"/>
+        <antcall target="Binding"/>
+        <antcall target="HTML"/>
+        <antcall target="Charts"/>
+        <antcall target="Collections"/>
+        <antcall target="CreateJS"/>
+        <antcall target="DragDrop"/>
+        <antcall target="Effects"/>
+        <antcall target="Formatters"/>
+        <antcall target="GoogleMaps"/>
+        <antcall target="HTML5"/>
+        <antcall target="JQuery"/>
+        <antcall target="Mobile"/>
+        <antcall target="Network"/>
     </target>
     
     <target name="other.locales" description ="Builds resource SWCs for all locales">
@@ -85,7 +99,7 @@
     </target>
     
     <target name="doc" >
-        <ant dir="${basedir}/projects/FlexJSUI" target="doc" />
+        <ant dir="${basedir}/projects/Core" target="doc" />
     </target>
    
     <!--
@@ -100,8 +114,22 @@
     
     <target name="clean" description="Cleans all SWCs and their resource bundles">
         <!-- Delete output from SWC projects -->
-        <ant dir="${basedir}/projects/FlexJSUI" target="clean"/>
-        <ant dir="${basedir}/projects/MXMLCClasses" target="clean"/>
+        <ant dir="${basedir}/projects/Binding" target="clean"/>
+        <ant dir="${basedir}/projects/Charts" target="clean"/>
+        <ant dir="${basedir}/projects/Collections" target="clean"/>
+        <ant dir="${basedir}/projects/Core" target="clean"/>
+        <ant dir="${basedir}/projects/CreateJS" target="clean"/>
+        <ant dir="${basedir}/projects/DragDrop" target="clean"/>
+        <ant dir="${basedir}/projects/Effects" target="clean"/>
+        <ant dir="${basedir}/projects/Formatters" target="clean"/>
+        <ant dir="${basedir}/projects/GoogleMaps" target="clean"/>
+        <ant dir="${basedir}/projects/Graphics" target="clean"/>
+        <ant dir="${basedir}/projects/HTML" target="clean"/>
+        <ant dir="${basedir}/projects/HTML5" target="clean"/>
+        <ant dir="${basedir}/projects/JQuery" target="clean"/>
+        <ant dir="${basedir}/projects/Mobile" target="clean"/>
+        <ant dir="${basedir}/projects/Network" target="clean"/>
+        <ant dir="${basedir}/as/projects/MXMLCClasses" target="clean"/>
 
         <!-- delete the FlashBuilder executable directories -->
         <delete includeemptydirs="true" failonerror="false">
@@ -121,20 +149,72 @@
         </delete> 
     </target>
     
-    <target name="flexjsjx" description="Clean build of FlexJSJX.swc">
-        <ant dir="${basedir}/projects/FlexJSJX"/>
+    <target name="Binding" description="Clean build of Binding.swc">
+        <ant dir="${basedir}/projects/Binding"/>
     </target>
     
-    <target name="flexjsui" description="Clean build of FlexJSUI.swc">
-        <ant dir="${basedir}/projects/FlexJSUI"/>
+    <target name="Charts" description="Clean build of Charts.swc">
+        <ant dir="${basedir}/projects/Charts"/>
+    </target>
+
+    <target name="Core" description="Clean build of Core.swc">
+        <ant dir="${basedir}/projects/Core"/>
+    </target>
+
+    <target name="Collections" description="Clean build of Collections.swc">
+        <ant dir="${basedir}/projects/Collections"/>
+    </target>
+
+    <target name="CreateJS" description="Clean build of CreateJS.swc">
+        <ant dir="${basedir}/projects/CreateJS"/>
+    </target>
+
+    <target name="DragDrop" description="Clean build of DragDrop.swc">
+        <ant dir="${basedir}/projects/DragDrop"/>
+    </target>
+
+    <target name="Effects" description="Clean build of Effects.swc">
+        <ant dir="${basedir}/projects/Effects"/>
+    </target>
+
+    <target name="Formatters" description="Clean build of Formatters.swc">
+        <ant dir="${basedir}/projects/Formatters"/>
+    </target>
+
+    <target name="GoogleMaps" description="Clean build of GoogleMaps.swc">
+        <ant dir="${basedir}/projects/GoogleMaps"/>
+    </target>
+
+    <target name="Graphics" description="Clean build of Graphics.swc">
+        <ant dir="${basedir}/projects/Graphics"/>
+    </target>
+
+    <target name="HTML" description="Clean build of HTML.swc">
+        <ant dir="${basedir}/projects/HTML"/>
+    </target>
+
+    <target name="HTML5" description="Clean build of HTML5.swc">
+        <ant dir="${basedir}/projects/HTML5"/>
+    </target>
+
+    <target name="JQuery" description="Clean build of JQuery.swc">
+        <ant dir="${basedir}/projects/JQuery"/>
+    </target>
+
+    <target name="Mobile" description="Clean build of Mobile.swc">
+        <ant dir="${basedir}/projects/Mobile"/>
+    </target>
+
+    <target name="Network" description="Clean build of Network.swc">
+        <ant dir="${basedir}/projects/Network"/>
     </target>
 
     <target name="mxmlcclasses" description="Clean build of MXMLClasses.swc">
-        <ant dir="${basedir}/projects/MXMLCClasses"/>
+        <ant dir="${basedir}/as/projects/MXMLCClasses"/>
     </target>
 
 	<target name="flex-config" depends="playerglobal-setswfversion" description="Copy the flex config template to flex-config.xml and inject version numbers">
-		<copy file="${basedir}/flex-config-template.xml" tofile="${basedir}/../flex-config.xml" overwrite="true">
+		<copy file="${basedir}/flex-config-template.xml" tofile="${basedir}/flex-config.xml" overwrite="true">
 			<filterset>
 				<filter token="playerversion" value="${playerglobal.version}"/>
 				<filter token="swfversion" value="${playerglobal.swfversion}"/>
@@ -144,7 +224,7 @@
 	</target>
 		
 	<target name="air-config" depends="playerglobal-setswfversion" description="Copy the air config template to air-config.xml and inject version numbers">
-		<copy file="${basedir}/air-config-template.xml" tofile="${basedir}/../air-config.xml" overwrite="true">
+		<copy file="${basedir}/air-config-template.xml" tofile="${basedir}/air-config.xml" overwrite="true">
 			<filterset>
 				<filter token="playerversion" value="${playerglobal.version}"/>
 				<filter token="swfversion" value="${playerglobal.swfversion}"/>

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c84daedb/frameworks/flex-config-template.xml
----------------------------------------------------------------------
diff --git a/frameworks/flex-config-template.xml b/frameworks/flex-config-template.xml
index 65a7fc1..c003483 100644
--- a/frameworks/flex-config-template.xml
+++ b/frameworks/flex-config-template.xml
@@ -78,7 +78,7 @@
 
       <!-- List of SWC files or directories that contain SWC files. -->
       <library-path>
-         <path-element>as/libs</path-element>
+         <path-element>libs</path-element>
          <path-element>{playerglobalHome}/{targetPlayerMajorVersion}.{targetPlayerMinorVersion}</path-element>
       </library-path>
 
@@ -103,18 +103,18 @@
          <namespace>
             <uri>library://ns.apache.org/flexjs/basic</uri>
             
-            <manifest>as/projects/FlexJSUI/basic-manifest.xml</manifest>
+            <manifest>projects/Core/basic-manifest.xml</manifest>
          
         </namespace>                                                 
          <namespace>
             <uri>library://ns.apache.org/flexjs/html5</uri>
             
-            <manifest>as/projects/FlexJSUI/html5-manifest.xml</manifest>
+            <manifest>projects/HTML5/html5-manifest.xml</manifest>
          
         </namespace>
 		<namespace>
             <uri>library://ns.apache.org/flexjs/svg</uri>
-         	<manifest>as/projects/FlexJSUI/svg-manifest.xml</manifest>
+         	<manifest>projects/HTML/svg-manifest.xml</manifest>
         </namespace>   
    
       </namespaces>

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c84daedb/frameworks/flex-config.xml
----------------------------------------------------------------------
diff --git a/frameworks/flex-config.xml b/frameworks/flex-config.xml
index d4707fd..ddf8b02 100644
--- a/frameworks/flex-config.xml
+++ b/frameworks/flex-config.xml
@@ -78,7 +78,7 @@
 
       <!-- List of SWC files or directories that contain SWC files. -->
       <library-path>
-         <path-element>as/libs</path-element>
+         <path-element>libs</path-element>
          <path-element>{playerglobalHome}/{targetPlayerMajorVersion}.{targetPlayerMinorVersion}</path-element>
       </library-path>
 
@@ -103,18 +103,18 @@
          <namespace>
             <uri>library://ns.apache.org/flexjs/basic</uri>
             
-            <manifest>as/projects/FlexJSUI/basic-manifest.xml</manifest>
+            <manifest>projects/Core/basic-manifest.xml</manifest>
          
         </namespace>                                                 
          <namespace>
             <uri>library://ns.apache.org/flexjs/html5</uri>
             
-            <manifest>as/projects/FlexJSUI/html5-manifest.xml</manifest>
+            <manifest>projects/HTML5/html5-manifest.xml</manifest>
          
         </namespace>
 		<namespace>
             <uri>library://ns.apache.org/flexjs/svg</uri>
-         	<manifest>as/projects/FlexJSUI/svg-manifest.xml</manifest>
+         	<manifest>projects/HTML/svg-manifest.xml</manifest>
         </namespace>   
    
       </namespaces>

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c84daedb/frameworks/js/.jshintrc
----------------------------------------------------------------------
diff --git a/frameworks/js/.jshintrc b/frameworks/js/.jshintrc
new file mode 100644
index 0000000..62b335a
--- /dev/null
+++ b/frameworks/js/.jshintrc
@@ -0,0 +1,14 @@
+{
+    "curly": false,
+    "eqeqeq": false,
+    "eqnull": true,
+    "globalstrict": true,
+    "indent": 2,
+    "maxlen": 120,
+    "onevar": false,
+    "strict": false,
+    "sub": true,
+    "white": false,
+    "gcl": true,
+    "globals": { "goog" : false, "org" : false }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c84daedb/frameworks/projects/Binding/as/src/BindingClasses.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/Binding/as/src/BindingClasses.as b/frameworks/projects/Binding/as/src/BindingClasses.as
index 2886df2..e9f56a2 100644
--- a/frameworks/projects/Binding/as/src/BindingClasses.as
+++ b/frameworks/projects/Binding/as/src/BindingClasses.as
@@ -25,133 +25,9 @@ package
  *  beyond those that are found by dependecy analysis starting
  *  from the classes specified in manifest.xml.
  */
-internal class FlexJSUIClasses
+internal class BindingClasses
 {	
-	import org.apache.cordova.camera.Camera; Camera;
-	import org.apache.cordova.Application; Application;
-	import org.apache.cordova.Weinre; Weinre;
-	
-	import org.apache.flex.charts.core.CartesianChart; CartesianChart;
-	import org.apache.flex.charts.core.ChartBase; ChartBase;
-	import org.apache.flex.charts.core.IAxisBead; IAxisBead;
-	import org.apache.flex.charts.core.IAxisGroup; IAxisGroup;
-	import org.apache.flex.charts.core.IChart; IChart;
-	import org.apache.flex.charts.core.ICartesianChartLayout; ICartesianChartLayout;
-	import org.apache.flex.charts.core.IChartDataGroup; IChartDataGroup;
-	import org.apache.flex.charts.core.IChartSeries; IChartSeries;
-	import org.apache.flex.charts.core.IHorizontalAxisBead; IHorizontalAxisBead;
-	import org.apache.flex.charts.core.IVerticalAxisBead; IVerticalAxisBead;
-	import org.apache.flex.charts.core.IChartItemRenderer; IChartItemRenderer;
-	import org.apache.flex.charts.core.IConnectedItemRenderer; IConnectedItemRenderer;
-	import org.apache.flex.charts.core.PolarChart; PolarChart;
-	import org.apache.flex.charts.supportClasses.ChartAxisGroup; ChartAxisGroup;
-	import org.apache.flex.charts.supportClasses.ChartDataGroup; ChartDataGroup;
-	import org.apache.flex.maps.google.Map; Map;
-	
-    import org.apache.flex.html.ToolTip; ToolTip;
-	import org.apache.flex.html.accessories.NumericOnlyTextInputBead; NumericOnlyTextInputBead;
-	import org.apache.flex.html.accessories.PasswordInputBead; PasswordInputBead;
-	import org.apache.flex.html.accessories.TextPromptBead; TextPromptBead;
-    import org.apache.flex.html.beads.AlertView; AlertView;
-	import org.apache.flex.html.beads.BackgroundImageBead; BackgroundImageBead;
-	import org.apache.flex.html.beads.ButtonBarView; ButtonBarView;
-	import org.apache.flex.html.beads.CheckBoxView; CheckBoxView;
-    import org.apache.flex.html.beads.ComboBoxView; ComboBoxView;
-    import org.apache.flex.html.beads.ContainerView; ContainerView;
-    import org.apache.flex.html.beads.ControlBarMeasurementBead; ControlBarMeasurementBead;
-    import org.apache.flex.html.beads.CSSButtonView; CSSButtonView;
-	import org.apache.flex.html.beads.CSSTextButtonView; CSSTextButtonView;
-    import org.apache.flex.html.beads.CSSTextToggleButtonView; CSSTextToggleButtonView;
-	import org.apache.flex.html.beads.DropDownListView; DropDownListView;
-	import org.apache.flex.html.beads.CloseButtonView; CloseButtonView;
-    import org.apache.flex.html.beads.ImageButtonView; ImageButtonView;
-    import org.apache.flex.html.beads.ImageAndTextButtonView; ImageAndTextButtonView;
-	import org.apache.flex.html.beads.ImageView; ImageView;
-    import org.apache.flex.html.beads.ListView; ListView;
-    import org.apache.flex.html.beads.NumericStepperView; NumericStepperView;
-    import org.apache.flex.html.beads.PanelView; PanelView;
-    import org.apache.flex.html.beads.PanelWithControlBarView; PanelWithControlBarView;
-	import org.apache.flex.html.beads.RadioButtonView; RadioButtonView;
-    import org.apache.flex.html.beads.ScrollBarView; ScrollBarView;
-	import org.apache.flex.html.beads.SimpleAlertView; SimpleAlertView;
-    import org.apache.flex.html.beads.SingleLineBorderBead; SingleLineBorderBead;
-	import org.apache.flex.html.beads.SliderView; SliderView;
-	import org.apache.flex.html.beads.SliderThumbView; SliderThumbView;
-	import org.apache.flex.html.beads.SliderTrackView; SliderTrackView;
-	import org.apache.flex.html.beads.SolidBackgroundBead; SolidBackgroundBead;
-    import org.apache.flex.html.beads.SpinnerView; SpinnerView;
-    import org.apache.flex.html.beads.TextButtonMeasurementBead; TextButtonMeasurementBead;
-	import org.apache.flex.html.beads.TextFieldLabelMeasurementBead; TextFieldLabelMeasurementBead;
-    import org.apache.flex.html.beads.TextAreaView; TextAreaView;
-    import org.apache.flex.html.beads.TextButtonView; TextButtonView;
-    import org.apache.flex.html.beads.TextFieldView; TextFieldView;
-    import org.apache.flex.html.beads.TextInputView; TextInputView;
-    import org.apache.flex.html.beads.TextInputWithBorderView; TextInputWithBorderView;
-    import org.apache.flex.html.beads.models.AlertModel; AlertModel;
-    import org.apache.flex.html.beads.models.ArraySelectionModel; ArraySelectionModel;
-    import org.apache.flex.html.beads.models.ComboBoxModel; ComboBoxModel;
-	import org.apache.flex.html.beads.models.ImageModel; ImageModel;
-    import org.apache.flex.html.beads.models.ImageAndTextModel; ImageAndTextModel;
-	import org.apache.flex.html.beads.models.PanelModel; PanelModel;
-    import org.apache.flex.html.beads.models.SingleLineBorderModel; SingleLineBorderModel;
-	import org.apache.flex.html.beads.models.TextModel; TextModel;
-    import org.apache.flex.html.beads.models.TitleBarModel; TitleBarModel;
-	import org.apache.flex.html.beads.models.ToggleButtonModel; ToggleButtonModel;
-	import org.apache.flex.html.beads.models.ValueToggleButtonModel; ValueToggleButtonModel;
-    import org.apache.flex.html.beads.controllers.AlertController; AlertController;
-	import org.apache.flex.html.beads.controllers.ComboBoxController; ComboBoxController;
-    import org.apache.flex.html.beads.controllers.DropDownListController; DropDownListController;
-	import org.apache.flex.html.beads.controllers.EditableTextKeyboardController; EditableTextKeyboardController;
-    import org.apache.flex.html.beads.controllers.ItemRendererMouseController; ItemRendererMouseController;
-    import org.apache.flex.html.beads.controllers.ListSingleSelectionMouseController; ListSingleSelectionMouseController;
-	import org.apache.flex.html.beads.controllers.SliderMouseController; SliderMouseController;
-	import org.apache.flex.html.beads.controllers.SpinnerMouseController; SpinnerMouseController;
-    import org.apache.flex.html.beads.controllers.VScrollBarMouseController; VScrollBarMouseController;
-	import org.apache.flex.html.beads.layouts.ButtonBarLayout; ButtonBarLayout;
-    import org.apache.flex.html.beads.layouts.NonVirtualVerticalScrollingLayout; NonVirtualVerticalScrollingLayout;  
-	import org.apache.flex.html.beads.layouts.NonVirtualHorizontalScrollingLayout; NonVirtualHorizontalScrollingLayout;
-    import org.apache.flex.html.beads.layouts.NonVirtualBasicLayout; NonVirtualBasicLayout;
-    import org.apache.flex.html.beads.layouts.VScrollBarLayout; VScrollBarLayout;
-	import org.apache.flex.html.beads.layouts.TileLayout; TileLayout;
-    import org.apache.flex.html.beads.TextItemRendererFactoryForArrayData; TextItemRendererFactoryForArrayData;
-	import org.apache.flex.html.beads.DataItemRendererFactoryForArrayData; DataItemRendererFactoryForArrayData;
-	import org.apache.flex.html.supportClasses.NonVirtualDataGroup; NonVirtualDataGroup;
-    import org.apache.flex.core.ItemRendererClassFactory; ItemRendererClassFactory;  
-	import org.apache.flex.core.FilledRectangle; FilledRectangle;
-	import org.apache.flex.core.FormatBase; FormatBase;
-	import org.apache.flex.events.CustomEvent; CustomEvent;
-	import org.apache.flex.events.Event; Event;
-	import org.apache.flex.events.MouseEvent; MouseEvent;
-	import org.apache.flex.events.ValueEvent; ValueEvent;
-	import org.apache.flex.utils.EffectTimer; EffectTimer;
-	import org.apache.flex.utils.Timer; Timer;
-	import org.apache.flex.utils.UIUtils; UIUtils;
-	import org.apache.flex.core.ISelectableItemRenderer; ISelectableItemRenderer;
-    import org.apache.flex.core.SimpleStatesImpl; SimpleStatesImpl;
-	import org.apache.flex.core.graphics.GraphicShape; GraphicShape;
-	import org.apache.flex.core.graphics.Rect; Rect;
-	import org.apache.flex.core.graphics.Ellipse; Ellipse;
-	import org.apache.flex.core.graphics.Circle; Circle;
-	import org.apache.flex.core.graphics.Path; Path;
-	import org.apache.flex.core.graphics.SolidColor; SolidColor;
-	import org.apache.flex.core.graphics.SolidColorStroke; SolidColorStroke;
-	import org.apache.flex.core.graphics.Text; Text;
-	import org.apache.flex.core.graphics.GraphicsContainer; GraphicsContainer;
-	import org.apache.flex.core.graphics.LinearGradient; LinearGradient;
-    import org.apache.flex.core.DataBindingBase; DataBindingBase;
     import org.apache.flex.binding.ChainBinding; ChainBinding;
-    import org.apache.flex.effects.PlatformWiper; PlatformWiper;    
-    import org.apache.flex.events.DragEvent; DragEvent;   
-	import org.apache.flex.events.utils.MouseUtils; MouseUtils;
-    import org.apache.flex.geom.Rectangle; Rectangle;    
-	
-	import org.apache.flex.mobile.ManagerBase; ManagerBase;
-    
-	import mx.core.ClassFactory; ClassFactory;
-    import mx.states.AddItems; AddItems;
-    import mx.states.SetEventHandler; SetEventHandler;
-    import mx.states.SetProperty; SetProperty;
-    import mx.states.State; State;
 }
 
 }

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c84daedb/frameworks/projects/Binding/as/src/org/apache/flex/binding/ViewBaseDataBinding.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/Binding/as/src/org/apache/flex/binding/ViewBaseDataBinding.as b/frameworks/projects/Binding/as/src/org/apache/flex/binding/ViewBaseDataBinding.as
new file mode 100644
index 0000000..7505e53
--- /dev/null
+++ b/frameworks/projects/Binding/as/src/org/apache/flex/binding/ViewBaseDataBinding.as
@@ -0,0 +1,296 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package org.apache.flex.binding
+{
+    import org.apache.flex.binding.ConstantBinding;
+    import org.apache.flex.binding.GenericBinding;
+    import org.apache.flex.binding.PropertyWatcher;
+    import org.apache.flex.binding.SimpleBinding;
+    import org.apache.flex.binding.WatcherBase;
+    import org.apache.flex.core.IBead;
+    import org.apache.flex.core.IStrand;
+    import org.apache.flex.events.Event;
+    import org.apache.flex.events.IEventDispatcher;
+    
+    /**
+     *  The ViewBaseDataBinding class implements databinding for
+     *  ViewBase instances.  Different classes can have
+     *  different databinding implementation that optimize for
+     *  the different lifecycles.  For example, an item renderer
+     *  databinding implementation can wait to execute databindings
+     *  until the data property is set.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10.2
+     *  @playerversion AIR 2.6
+     *  @productversion FlexJS 0.0
+     */
+	public class ViewBaseDataBinding implements IBead
+	{
+        /**
+         *  Constructor.
+         *  
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion FlexJS 0.0
+         */
+		public function ViewBaseDataBinding()
+		{
+			super();
+		}
+        
+        private var _strand:IStrand;
+        
+        /**
+         *  @copy org.apache.flex.core.IBead#strand
+         *  
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion FlexJS 0.0
+         */
+        public function set strand(value:IStrand):void
+        {
+            _strand = value;
+            IEventDispatcher(_strand).addEventListener("initBindings", initCompleteHandler);
+        }    
+
+        private function initCompleteHandler(event:Event):void
+        {
+            var fieldWatcher:Object;
+            var sb:SimpleBinding;
+            if (!("_bindings" in _strand))
+                return;
+            var bindingData:Array = _strand["_bindings"];
+            var n:int = bindingData[0];
+            var bindings:Array = [];
+            var i:int;
+            var index:int = 1;
+            for (i = 0; i < n; i++)
+            {
+                var binding:Object = {};
+                binding.source = bindingData[index++];
+				binding.destFunc = bindingData[index++];
+                binding.destination = bindingData[index++];
+                bindings.push(binding);
+            }
+            var watchers:Object = decodeWatcher(bindingData.slice(index));
+            for (i = 0; i < n; i++)
+            {
+                    binding = bindings[i];
+                if (binding.source is Array)
+                {
+                    if (binding.source[0] == "applicationModel")
+                    {
+                        if (binding.source.length == 2 && binding.destination.length == 2)
+                        {
+                            var destination:IStrand;
+                            // can be simplebinding or constantbinding
+                            var modelWatcher:Object = watchers.watcherMap["applicationModel"];
+                            fieldWatcher = modelWatcher.children.watcherMap[binding.source[1]];
+                            if (fieldWatcher.eventNames is String)
+                            {
+                                sb = new SimpleBinding();
+                                sb.destinationPropertyName = binding.destination[1];
+                                sb.eventName = fieldWatcher.eventNames as String;
+                                sb.sourceID = binding.source[0];
+                                sb.sourcePropertyName = binding.source[1];
+                                sb.setDocument(_strand);
+                                destination = _strand[binding.destination[0]] as IStrand;
+                                if (destination)
+                                    destination.addBead(sb);
+                                else
+                                {
+                                    deferredBindings[binding.destination[0]] = sb;
+                                    IEventDispatcher(_strand).addEventListener("valueChange", deferredBindingsHandler);
+                                }
+                            }
+                            else if (fieldWatcher.eventNames == null)
+                            {
+                                var cb:ConstantBinding = new ConstantBinding();
+                                cb.destinationPropertyName = binding.destination[1];
+                                cb.sourceID = binding.source[0];
+                                cb.sourcePropertyName = binding.source[1];
+                                cb.setDocument(_strand);
+                                destination = _strand[binding.destination[0]] as IStrand;
+                                if (destination)
+                                    destination.addBead(cb);
+                                else
+                                {
+                                    deferredBindings[binding.destination[0]] = cb;
+                                    IEventDispatcher(_strand).addEventListener("valueChange", deferredBindingsHandler);
+                                }
+                            }
+                        }
+                    }
+                }
+                else if (binding.source is String)
+                {
+                    fieldWatcher = watchers.watcherMap[binding.source];
+                    if (fieldWatcher.eventNames is String)
+                    {
+                        sb = new SimpleBinding();
+                        sb.destinationPropertyName = binding.destination[1];
+                        sb.eventName = fieldWatcher.eventNames as String;
+                        sb.sourcePropertyName = binding.source;
+                        sb.setDocument(_strand);
+                        destination = _strand[binding.destination[0]] as IStrand;
+                        if (destination)
+                            destination.addBead(sb);
+                        else
+                        {
+                            deferredBindings[binding.destination[0]] = sb;
+                            IEventDispatcher(_strand).addEventListener("valueChange", deferredBindingsHandler);
+                        }
+                    }
+                }
+                else
+                {
+                    makeGenericBinding(binding, i, watchers);
+                }
+            }
+        }
+
+        private function makeGenericBinding(binding:Object, index:int, watchers:Object):void
+        {
+            var gb:GenericBinding = new GenericBinding();
+            gb.setDocument(_strand);
+            gb.destinationData = binding.destination;
+			gb.destinationFunction = binding.destFunc;
+            gb.source = binding.source;
+            setupWatchers(gb, index, watchers.watchers, null);
+        }
+        
+        private function setupWatchers(gb:GenericBinding, index:int, watchers:Array, parentWatcher:WatcherBase):void
+        {
+            var n:int = watchers.length;
+            for (var i:int = 0; i < n; i++)
+            {
+                var watcher:Object = watchers[i];
+                if (watcher.bindings.indexOf(index) != -1)
+                {
+                    var type:String = watcher.type;
+                    switch (type)
+                    {
+                        case "property":
+                        {
+                            var pw:PropertyWatcher = new PropertyWatcher(this, 
+                                        watcher.propertyName, 
+                                        watcher.eventNames,
+                                        watcher.getterFunction);
+                            watcher.watcher = pw;
+                            if (parentWatcher)
+                                pw.parentChanged(parentWatcher.value);
+                            else
+                                pw.parentChanged(_strand);
+                            if (parentWatcher)
+                                parentWatcher.addChild(pw);
+                            if (watcher.children == null)
+                                pw.addBinding(gb);
+                            break;
+                        }
+                    }
+                    if (watcher.children)
+                    {
+                        setupWatchers(gb, index, watcher.children, watcher.watcher);
+                    }
+                }
+            }
+        }
+        
+        private function decodeWatcher(bindingData:Array):Object
+        {
+            var watcherMap:Object = {};
+            var watchers:Array = [];
+            var n:int = bindingData.length;
+            var index:int = 0;
+            var watcherData:Object;
+            while (index < n)
+            {
+                var watcherIndex:int = bindingData[index++];
+                var type:int = bindingData[index++];
+                switch (type)
+                {
+                    case 0:
+                    {
+                        watcherData = { type: "function" };
+                        watcherData.functionName = bindingData[index++];
+						watcherData.paramFunction = bindingData[index++];
+                        watcherData.eventNames = bindingData[index++];
+                        watcherData.bindings = bindingData[index++];
+                        break;
+                    }
+                    case 1:
+					{
+						watcherData = { type: "static" };
+						watcherData.propertyName = bindingData[index++];
+						watcherData.eventNames = bindingData[index++];
+						watcherData.bindings = bindingData[index++];
+						watcherData.getterFunction = bindingData[index++];
+						watcherData.parentObj = bindingData[index++];
+						watcherMap[watcherData.propertyName] = watcherData;
+						break;
+					}
+                    case 2:
+                    {
+                        watcherData = { type: "property" };
+                        watcherData.propertyName = bindingData[index++];
+                        watcherData.eventNames = bindingData[index++];
+                        watcherData.bindings = bindingData[index++];
+                        watcherData.getterFunction = bindingData[index++];
+                        watcherMap[watcherData.propertyName] = watcherData;
+                        break;
+                    }
+                    case 3:
+                    {
+                        watcherData = { type: "xml" };
+                        watcherData.propertyName = bindingData[index++];
+                        watcherData.bindings = bindingData[index++];
+                        watcherMap[watcherData.propertyName] = watcherData;
+                        break;
+                    }
+                }
+                watcherData.children = bindingData[index++];
+                if (watcherData.children != null)
+                {
+                    watcherData.children = decodeWatcher(watcherData.children);
+                }
+                watcherData.index = watcherIndex;
+                watchers.push(watcherData);
+            }            
+            return { watchers: watchers, watcherMap: watcherMap };
+        }
+        
+        private var deferredBindings:Object = {};
+        private function deferredBindingsHandler(event:Event):void
+        {
+            for (var p:String in deferredBindings)
+            {
+                if (_strand[p] != null)
+                {
+                    var destination:IStrand = _strand[p] as IStrand;
+                    destination.addBead(deferredBindings[p]);
+                    delete deferredBindings[p];
+                }
+            }
+        }
+        
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c84daedb/frameworks/projects/Binding/asjs/src/org/apache/flex/binding/ApplicationDataBinding.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/Binding/asjs/src/org/apache/flex/binding/ApplicationDataBinding.as b/frameworks/projects/Binding/asjs/src/org/apache/flex/binding/ApplicationDataBinding.as
new file mode 100644
index 0000000..e752cc0
--- /dev/null
+++ b/frameworks/projects/Binding/asjs/src/org/apache/flex/binding/ApplicationDataBinding.as
@@ -0,0 +1,329 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package org.apache.flex.binding
+{
+    import org.apache.flex.binding.ConstantBinding;
+    import org.apache.flex.binding.GenericBinding;
+    import org.apache.flex.binding.PropertyWatcher;
+    import org.apache.flex.binding.SimpleBinding;
+    import org.apache.flex.binding.WatcherBase;
+    import org.apache.flex.core.DataBindingBase;
+    import org.apache.flex.core.IBead;
+    import org.apache.flex.core.IStrand;
+    import org.apache.flex.events.Event;
+    import org.apache.flex.events.IEventDispatcher;
+    
+    /**
+     *  The ApplicationDataBinding class implements databinding for
+     *  Application instances.  Different classes can have
+     *  different databinding implementation that optimize for
+     *  the different lifecycles.  For example, an item renderer
+     *  databinding implementation can wait to execute databindings
+     *  until the data property is set.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10.2
+     *  @playerversion AIR 2.6
+     *  @productversion FlexJS 0.0
+     */
+	public class ApplicationDataBinding extends DataBindingBase implements IBead
+	{
+        /**
+         *  Constructor.
+         *  
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion FlexJS 0.0
+         */
+		public function ApplicationDataBinding()
+		{
+			super();
+		}
+        
+        private var _strand:IStrand;
+        
+        /**
+         *  @copy org.apache.flex.core.IBead#strand
+         *  
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion FlexJS 0.0
+         */
+        public function set strand(value:IStrand):void
+        {
+            _strand = value;
+            IEventDispatcher(_strand).addEventListener("viewChanged", initCompleteHandler);
+        }    
+
+        private function initCompleteHandler(event:Event):void
+        {
+            var fieldWatcher:Object;
+            var sb:SimpleBinding;
+            if (!("_bindings" in _strand))
+                return;
+            var bindingData:Array = _strand["_bindings"];
+            var n:int = bindingData[0];
+            var bindings:Array = [];
+            var i:int;
+            var index:int = 1;
+            for (i = 0; i < n; i++)
+            {
+                var binding:Object = {};
+                binding.source = bindingData[index++];
+				binding.destFunc = bindingData[index++];
+                binding.destination = bindingData[index++];
+                bindings.push(binding);
+            }
+            var watchers:Object = decodeWatcher(bindingData.slice(index));
+            for (i = 0; i < n; i++)
+            {
+                    binding = bindings[i];
+                if (binding.source is Array)
+                {
+                    if (binding.source[0] in _strand)
+                    {
+                        if (binding.source.length == 2 && binding.destination.length == 2)
+                        {
+                            // simple component.property binding
+                            var destObject:Object;
+                            var destination:IStrand;
+                            // can be simplebinding or constantbinding
+                            var compWatcher:Object = watchers.watcherMap[binding.source[0]];
+                            fieldWatcher = compWatcher.children.watcherMap[binding.source[1]];
+                            if (fieldWatcher.eventNames is String)
+                            {
+                                sb = new SimpleBinding();
+                                sb.destinationPropertyName = binding.destination[1];
+                                sb.eventName = fieldWatcher.eventNames as String;
+                                sb.sourceID = binding.source[0];
+                                sb.sourcePropertyName = binding.source[1];
+                                sb.setDocument(_strand);
+                                destObject = _strand[binding.destination[0]];                                
+                                destination = destObject as IStrand;
+                                if (destination)
+                                    destination.addBead(sb);
+                                else
+                                {
+                                    if (destObject)
+                                    {
+                                        sb.destination = destObject;
+                                        _strand.addBead(sb);
+                                    }
+                                    else
+                                    {
+                                        deferredBindings[binding.destination[0]] = sb;
+                                        IEventDispatcher(_strand).addEventListener("valueChange", deferredBindingsHandler);
+                                    }
+                                }
+                            }
+                            else if (fieldWatcher.eventNames == null)
+                            {
+                                var cb:ConstantBinding = new ConstantBinding();
+                                cb.destinationPropertyName = binding.destination[1];
+                                cb.sourceID = binding.source[0];
+                                cb.sourcePropertyName = binding.source[1];
+                                cb.setDocument(_strand);
+                                destObject = _strand[binding.destination[0]];                                
+                                destination = destObject as IStrand;
+                                if (destination)
+                                    destination.addBead(cb);
+                                else
+                                {
+                                    if (destObject)
+                                    {
+                                        cb.destination = destObject;
+                                        _strand.addBead(sb);
+                                    }
+                                    else
+                                    {
+                                        deferredBindings[binding.destination[0]] = sb;
+                                        IEventDispatcher(_strand).addEventListener("valueChange", deferredBindingsHandler);
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+                else if (binding.source is String)
+                {
+                    fieldWatcher = watchers.watcherMap[binding.source];
+                    if (fieldWatcher.eventNames is String)
+                    {
+                        sb = new SimpleBinding();
+                        sb.destinationPropertyName = binding.destination[1];
+                        sb.eventName = fieldWatcher.eventNames as String;
+                        sb.sourcePropertyName = binding.source;
+                        sb.setDocument(_strand);
+                        destObject = _strand[binding.destination[0]];                                
+                        destination = destObject as IStrand;
+                        if (destination)
+                            destination.addBead(sb);
+                        else
+                        {
+                            if (destObject)
+                            {
+                                sb.destination = destObject;
+                                _strand.addBead(sb);
+                            }
+                            else
+                            {
+                                deferredBindings[binding.destination[0]] = sb;
+                                IEventDispatcher(_strand).addEventListener("valueChange", deferredBindingsHandler);
+                            }
+                        }
+                    }
+                }
+                else
+                {
+                    makeGenericBinding(binding, i, watchers);
+                }
+            }
+        }
+
+        private function makeGenericBinding(binding:Object, index:int, watchers:Object):void
+        {
+            var gb:GenericBinding = new GenericBinding();
+            gb.setDocument(_strand);
+            gb.destinationData = binding.destination;
+			gb.destinationFunction = binding.destFunc;
+            gb.source = binding.source;
+            setupWatchers(gb, index, watchers.watchers, null);
+        }
+        
+        private function setupWatchers(gb:GenericBinding, index:int, watchers:Array, parentWatcher:WatcherBase):void
+        {
+            var n:int = watchers.length;
+            for (var i:int = 0; i < n; i++)
+            {
+                var watcher:Object = watchers[i];
+                if (watcher.bindings.indexOf(index) != -1)
+                {
+                    var type:String = watcher.type;
+                    switch (type)
+                    {
+                        case "property":
+                        {
+                            var pw:PropertyWatcher = new PropertyWatcher(this, 
+                                        watcher.propertyName, 
+                                        watcher.eventNames,
+                                        watcher.getterFunction);
+                            watcher.watcher = pw;
+                            if (parentWatcher)
+                                pw.parentChanged(parentWatcher.value);
+                            else
+                                pw.parentChanged(_strand);
+                            if (parentWatcher)
+                                parentWatcher.addChild(pw);
+                            if (watcher.children == null)
+                                pw.addBinding(gb);
+                            break;
+                        }
+                    }
+                    if (watcher.children)
+                    {
+                        setupWatchers(gb, index, watcher.children, watcher.watcher);
+                    }
+                }
+            }
+        }
+        
+        private function decodeWatcher(bindingData:Array):Object
+        {
+            var watcherMap:Object = {};
+            var watchers:Array = [];
+            var n:int = bindingData.length;
+            var index:int = 0;
+            var watcherData:Object;
+            // FalconJX adds an extra null to the data so make sure
+            // we have enough data for a complete watcher otherwise
+            // say we are done
+            while (index < n - 2)
+            {
+                var watcherIndex:int = bindingData[index++];
+                var type:int = bindingData[index++];
+                switch (type)
+                {
+                    case 0:
+                    {
+                        watcherData = { type: "function" };
+                        watcherData.functionName = bindingData[index++];
+						watcherData.paramFunction = bindingData[index++];
+                        watcherData.eventNames = bindingData[index++];
+                        watcherData.bindings = bindingData[index++];
+                        break;
+                    }
+                    case 1:
+					{
+						watcherData = { type: "static" };
+						watcherData.propertyName = bindingData[index++];
+						watcherData.eventNames = bindingData[index++];
+						watcherData.bindings = bindingData[index++];
+						watcherData.getterFunction = bindingData[index++];
+						watcherData.parentObj = bindingData[index++];
+						watcherMap[watcherData.propertyName] = watcherData;
+						break;
+					}
+                    case 2:
+                    {
+                        watcherData = { type: "property" };
+                        watcherData.propertyName = bindingData[index++];
+                        watcherData.eventNames = bindingData[index++];
+                        watcherData.bindings = bindingData[index++];
+                        watcherData.getterFunction = bindingData[index++];
+                        watcherMap[watcherData.propertyName] = watcherData;
+                        break;
+                    }
+                    case 3:
+                    {
+                        watcherData = { type: "xml" };
+                        watcherData.propertyName = bindingData[index++];
+                        watcherData.bindings = bindingData[index++];
+                        watcherMap[watcherData.propertyName] = watcherData;
+                        break;
+                    }
+                }
+                watcherData.children = bindingData[index++];
+                if (watcherData.children != null)
+                {
+                    watcherData.children = decodeWatcher(watcherData.children);
+                }
+                watcherData.index = watcherIndex;
+                watchers.push(watcherData);
+            }            
+            return { watchers: watchers, watcherMap: watcherMap };
+        }
+        
+        private var deferredBindings:Object = {};
+        private function deferredBindingsHandler(event:Event):void
+        {
+            for (var p:String in deferredBindings)
+            {
+                if (_strand[p] != null)
+                {
+                    var destination:IStrand = _strand[p] as IStrand;
+                    destination.addBead(deferredBindings[p]);
+                    delete deferredBindings[p];
+                }
+            }
+        }
+        
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/c84daedb/frameworks/projects/Binding/asjs/src/org/apache/flex/binding/ContainerDataBinding.as
----------------------------------------------------------------------
diff --git a/frameworks/projects/Binding/asjs/src/org/apache/flex/binding/ContainerDataBinding.as b/frameworks/projects/Binding/asjs/src/org/apache/flex/binding/ContainerDataBinding.as
new file mode 100644
index 0000000..fbe399f
--- /dev/null
+++ b/frameworks/projects/Binding/asjs/src/org/apache/flex/binding/ContainerDataBinding.as
@@ -0,0 +1,382 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package org.apache.flex.binding
+{
+    import org.apache.flex.binding.ChainBinding;
+    import org.apache.flex.binding.ConstantBinding;
+    import org.apache.flex.binding.GenericBinding;
+    import org.apache.flex.binding.PropertyWatcher;
+    import org.apache.flex.binding.SimpleBinding;
+    import org.apache.flex.binding.WatcherBase;
+    import org.apache.flex.core.DataBindingBase;
+    import org.apache.flex.core.IBead;
+    import org.apache.flex.core.IStrand;
+    import org.apache.flex.events.Event;
+    import org.apache.flex.events.IEventDispatcher;
+    
+    /**
+     *  The ContainerDataBinding class implements databinding for
+     *  Container instances.  Different classes can have
+     *  different databinding implementation that optimize for
+     *  the different lifecycles.  For example, an item renderer
+     *  databinding implementation can wait to execute databindings
+     *  until the data property is set.
+     *  
+     *  @langversion 3.0
+     *  @playerversion Flash 10.2
+     *  @playerversion AIR 2.6
+     *  @productversion FlexJS 0.0
+     */
+	public class ContainerDataBinding extends DataBindingBase implements IBead
+	{
+        /**
+         *  Constructor.
+         *  
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion FlexJS 0.0
+         */
+		public function ContainerDataBinding()
+		{
+			super();
+		}
+        
+        private var _strand:IStrand;
+        
+        /**
+         *  @copy org.apache.flex.core.IBead#strand
+         *  
+         *  @langversion 3.0
+         *  @playerversion Flash 10.2
+         *  @playerversion AIR 2.6
+         *  @productversion FlexJS 0.0
+         */
+        public function set strand(value:IStrand):void
+        {
+            _strand = value;
+            IEventDispatcher(_strand).addEventListener("initBindings", initCompleteHandler);
+        }    
+
+        private function initCompleteHandler(event:Event):void
+        {
+            var fieldWatcher:Object;
+            var sb:SimpleBinding;
+            var cb:ConstantBinding;
+            if (!("_bindings" in _strand))
+                return;
+            var bindingData:Array = _strand["_bindings"];
+            var n:int = bindingData[0];
+            var bindings:Array = [];
+            var i:int;
+            var index:int = 1;
+            for (i = 0; i < n; i++)
+            {
+                var binding:Object = {};
+                binding.source = bindingData[index++];
+				binding.destFunc = bindingData[index++];
+                binding.destination = bindingData[index++];
+                bindings.push(binding);
+            }
+            var watchers:Object = decodeWatcher(bindingData.slice(index));
+            for (i = 0; i < n; i++)
+            {
+                    binding = bindings[i];
+                if (binding.source is Array)
+                {
+                    if (binding.source[0] in _strand)
+                    {
+                        var destObject:Object;
+                        var destination:IStrand;
+                        var compWatcher:Object;
+                        if (binding.source.length == 2 && binding.destination.length == 2)
+                        {
+                            // simple component.property binding
+                            // can be simplebinding or constantbinding
+                            compWatcher = watchers.watcherMap[binding.source[0]];
+                            fieldWatcher = compWatcher.children.watcherMap[binding.source[1]];
+                            if (fieldWatcher.eventNames is String)
+                            {
+                                sb = new SimpleBinding();
+                                sb.destinationPropertyName = binding.destination[1];
+                                sb.eventName = fieldWatcher.eventNames as String;
+                                sb.sourceID = binding.source[0];
+                                sb.sourcePropertyName = binding.source[1];
+                                sb.setDocument(_strand);
+                                destObject = _strand[binding.destination[0]];                                
+                                destination = destObject as IStrand;
+                                if (destination)
+                                    destination.addBead(sb);
+                                else
+                                {
+                                    if (destObject)
+                                    {
+                                        sb.destination = destObject;
+                                        _strand.addBead(sb);
+                                    }
+                                    else
+                                    {
+                                        deferredBindings[binding.destination[0]] = sb;
+                                        IEventDispatcher(_strand).addEventListener("valueChange", deferredBindingsHandler);
+                                    }
+                                }
+                            }
+                            else if (fieldWatcher.eventNames == null)
+                            {
+                                cb = new ConstantBinding();
+                                cb.destinationPropertyName = binding.destination[1];
+                                cb.sourceID = binding.source[0];
+                                cb.sourcePropertyName = binding.source[1];
+                                cb.setDocument(_strand);
+                                destObject = _strand[binding.destination[0]];                                
+                                destination = destObject as IStrand;
+                                if (destination)
+                                    destination.addBead(cb);
+                                else
+                                {
+                                    if (destObject)
+                                    {
+                                        cb.destination = destObject;
+                                        _strand.addBead(sb);
+                                    }
+                                    else
+                                    {
+                                        deferredBindings[binding.destination[0]] = sb;
+                                        IEventDispatcher(_strand).addEventListener("valueChange", deferredBindingsHandler);
+                                    }
+                                }
+                            }
+                        }
+                        else
+                        {
+                            compWatcher = watchers.watcherMap[binding.source[0]];
+                            var chb:ChainBinding = new ChainBinding();
+                            chb.destination = binding.destination;
+                            chb.source = binding.source;
+                            chb.watcherChain = compWatcher;
+                            chb.setDocument(_strand);
+                            _strand.addBead(chb);
+                        }
+                    }
+                }
+                else if (binding.source is String && binding.destination is Array)
+                {
+                    fieldWatcher = watchers.watcherMap[binding.source];
+                    if (fieldWatcher == null)
+                    {
+                        cb = new ConstantBinding();
+                        cb.destinationPropertyName = binding.destination[1];
+                        cb.sourcePropertyName = binding.source;
+                        cb.setDocument(_strand);
+                        if (binding.destination[0] == "this")
+                            destObject = _strand;
+                        else
+                            destObject = _strand[binding.destination[0]];                                
+                        destination = destObject as IStrand;
+                        if (destination)
+                            destination.addBead(cb);
+                        else
+                        {
+                            if (destObject)
+                            {
+                                cb.destination = destObject;
+                                _strand.addBead(cb);
+                            }
+                            else
+                            {
+                                deferredBindings[binding.destination[0]] = cb;
+                                IEventDispatcher(_strand).addEventListener("valueChange", deferredBindingsHandler);
+                            }
+                        }
+                    }
+                    else if (fieldWatcher.eventNames is String)
+                    {
+                        sb = new SimpleBinding();
+                        sb.destinationPropertyName = binding.destination[1];
+                        sb.eventName = fieldWatcher.eventNames as String;
+                        sb.sourcePropertyName = binding.source;
+                        sb.setDocument(_strand);
+                        destObject = _strand[binding.destination[0]];                                
+                        destination = destObject as IStrand;
+                        if (destination)
+                            destination.addBead(sb);
+                        else
+                        {
+                            if (destObject)
+                            {
+                                sb.destination = destObject;
+                                _strand.addBead(sb);
+                            }
+                            else
+                            {
+                                deferredBindings[binding.destination[0]] = sb;
+                                IEventDispatcher(_strand).addEventListener("valueChange", deferredBindingsHandler);
+                            }
+                        }
+                    }
+                }
+                else
+                {
+                    makeGenericBinding(binding, i, watchers);
+                }
+            }
+        }
+
+        private function makeGenericBinding(binding:Object, index:int, watchers:Object):void
+        {
+            var gb:GenericBinding = new GenericBinding();
+            gb.setDocument(_strand);
+            gb.destinationData = binding.destination;
+			gb.destinationFunction = binding.destFunc;
+            gb.source = binding.source;
+            if (watchers.watchers.length)
+                setupWatchers(gb, index, watchers.watchers, null);
+            else
+            {
+                // should be a constant expression.
+                // the value doesn't matter as GenericBinding
+                // should get the value from the source
+                gb.valueChanged(null);  
+            }
+        }
+        
+        private function setupWatchers(gb:GenericBinding, index:int, watchers:Array, parentWatcher:WatcherBase):void
+        {
+            var n:int = watchers.length;
+            for (var i:int = 0; i < n; i++)
+            {
+                var watcher:Object = watchers[i];
+                var isValidWatcher:Boolean = false;
+                if (typeof(watcher.bindings) == "number")
+                    isValidWatcher = (watcher.bindings == index);
+                else
+                    isValidWatcher = (watcher.bindings.indexOf(index) != -1);
+                if (isValidWatcher)
+                {
+                    var type:String = watcher.type;
+                    switch (type)
+                    {
+                        case "property":
+                        {
+                            var pw:PropertyWatcher = new PropertyWatcher(this, 
+                                        watcher.propertyName, 
+                                        watcher.eventNames,
+                                        watcher.getterFunction);
+                            watcher.watcher = pw;
+                            if (parentWatcher)
+                                pw.parentChanged(parentWatcher.value);
+                            else
+                                pw.parentChanged(_strand);
+                            if (parentWatcher)
+                                parentWatcher.addChild(pw);
+                            if (watcher.children == null)
+                                pw.addBinding(gb);
+                            break;
+                        }
+                    }
+                    if (watcher.children)
+                    {
+                        setupWatchers(gb, index, watcher.children.watchers, watcher.watcher);
+                    }
+                }
+            }
+        }
+        
+        private function decodeWatcher(bindingData:Array):Object
+        {
+            var watcherMap:Object = {};
+            var watchers:Array = [];
+            var n:int = bindingData.length;
+            var index:int = 0;
+            var watcherData:Object;
+            // FalconJX adds an extra null to the data so make sure
+            // we have enough data for a complete watcher otherwise
+            // say we are done
+            while (index < n - 2)
+            {
+                var watcherIndex:int = bindingData[index++];
+                var type:int = bindingData[index++];
+                switch (type)
+                {
+                    case 0:
+                    {
+                        watcherData = { type: "function" };
+                        watcherData.functionName = bindingData[index++];
+						watcherData.paramFunction = bindingData[index++];
+                        watcherData.eventNames = bindingData[index++];
+                        watcherData.bindings = bindingData[index++];
+                        break;
+                    }
+                    case 1:
+					{
+						watcherData = { type: "static" };
+						watcherData.propertyName = bindingData[index++];
+						watcherData.eventNames = bindingData[index++];
+						watcherData.bindings = bindingData[index++];
+						watcherData.getterFunction = bindingData[index++];
+						watcherData.parentObj = bindingData[index++];
+						watcherMap[watcherData.propertyName] = watcherData;
+						break;
+					}
+                    case 2:
+                    {
+                        watcherData = { type: "property" };
+                        watcherData.propertyName = bindingData[index++];
+                        watcherData.eventNames = bindingData[index++];
+                        watcherData.bindings = bindingData[index++];
+                        watcherData.getterFunction = bindingData[index++];
+                        watcherMap[watcherData.propertyName] = watcherData;
+                        break;
+                    }
+                    case 3:
+                    {
+                        watcherData = { type: "xml" };
+                        watcherData.propertyName = bindingData[index++];
+                        watcherData.bindings = bindingData[index++];
+                        watcherMap[watcherData.propertyName] = watcherData;
+                        break;
+                    }
+                }
+                watcherData.children = bindingData[index++];
+                if (watcherData.children != null)
+                {
+                    watcherData.children = decodeWatcher(watcherData.children);
+                }
+                watcherData.index = watcherIndex;
+                watchers.push(watcherData);
+            }            
+            return { watchers: watchers, watcherMap: watcherMap };
+        }
+        
+        private var deferredBindings:Object = {};
+        private function deferredBindingsHandler(event:Event):void
+        {
+            for (var p:String in deferredBindings)
+            {
+                if (_strand[p] != null)
+                {
+                    var destination:IStrand = _strand[p] as IStrand;
+                    destination.addBead(deferredBindings[p]);
+                    delete deferredBindings[p];
+                }
+            }
+        }
+        
+    }
+}
\ No newline at end of file