From 3acb4e28856d988f2793acf371298fa1cec2b023 Mon Sep 17 00:00:00 2001
From: neo <Neo Wang@cn.asia.ad.pwcinternal.com>
Date: Mon, 29 Oct 2018 17:50:43 +0800
Subject: [PATCH] [Bugfix] fixed save formular cannot save to db

---
 .../service/impl/CellTemplateServiceImpl.java |    4 +-
 .../src/main/resources/bpmn/approval.bpmn     |   14 +-
 atms-web/pom.xml                              |    2 +-
 .../resources/conf_profile_dev.properties     |    2 +-
 atms-web/src/main/webapp/package-lock.json    |  736 +++--
 diff                                          | 2717 +++++++++++++++++
 6 files changed, 3226 insertions(+), 249 deletions(-)
 create mode 100644 diff

diff --git a/atms-api/src/main/java/pwc/taxtech/atms/service/impl/CellTemplateServiceImpl.java b/atms-api/src/main/java/pwc/taxtech/atms/service/impl/CellTemplateServiceImpl.java
index f9c0d1ad8..5a1de3f71 100644
--- a/atms-api/src/main/java/pwc/taxtech/atms/service/impl/CellTemplateServiceImpl.java
+++ b/atms-api/src/main/java/pwc/taxtech/atms/service/impl/CellTemplateServiceImpl.java
@@ -254,7 +254,7 @@ public class CellTemplateServiceImpl extends AbstractService {
 
     private String getFormulaDataSource(String formula, List<String> keyValueConfigIds) {
         FormulaConfigExample example = new FormulaConfigExample();
-        example.setOrderByClause("LENGTH(FormulaName) desc");
+        example.setOrderByClause("LENGTH(FORMULA_NAME) desc");
         List<FormulaConfig> dataSourceList = formulaConfigMapper.selectByExample(example);
         List<String> nameList = new ArrayList<>();
         FormulaHelper formulaHelper = new FormulaHelper();
@@ -270,7 +270,7 @@ public class CellTemplateServiceImpl extends AbstractService {
         String keyValueMethodName = "KEYVALUE(";
         if (tmpFormula.contains(keyValueMethodName)) {
             KeyValueConfigExample keyValueConfigExample = new KeyValueConfigExample();
-            keyValueConfigExample.setOrderByClause("LENGTH(KeyCode) desc");
+            keyValueConfigExample.setOrderByClause("LENGTH(KEY_CODE) desc");
             List<KeyValueConfig> keyValueList = keyValueConfigMapper.selectByExample(keyValueConfigExample);
             for (KeyValueConfig keyValueConfig : keyValueList) {
                 if (tmpFormula.contains(keyValueMethodName + "\"" + keyValueConfig.getKeyCode().toUpperCase() + "\")")) {
diff --git a/atms-api/src/main/resources/bpmn/approval.bpmn b/atms-api/src/main/resources/bpmn/approval.bpmn
index 4ca03d06c..0db445668 100644
--- a/atms-api/src/main/resources/bpmn/approval.bpmn
+++ b/atms-api/src/main/resources/bpmn/approval.bpmn
@@ -69,49 +69,49 @@
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge bpmnElement="_13" id="BPMNEdge__13" sourceElement="_5" targetElement="_12">
-        <di:waypoint x="510.0" y="192.5"/>
+        <di:waypoint x="495.0" y="192.5"/>
         <di:waypoint x="640.0" y="191.0"/>
         <bpmndi:BPMNLabel>
           <dc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge bpmnElement="_15" id="BPMNEdge__15" sourceElement="_11" targetElement="_5">
-        <di:waypoint x="456.0" y="365.0"/>
+        <di:waypoint x="456.0" y="380.0"/>
         <di:waypoint x="456.0" y="220.0"/>
         <bpmndi:BPMNLabel>
           <dc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge bpmnElement="_14" id="BPMNEdge__14" sourceElement="_3" targetElement="_11">
-        <di:waypoint x="290.0" y="397.5"/>
+        <di:waypoint x="275.0" y="397.5"/>
         <di:waypoint x="440.0" y="396.0"/>
         <bpmndi:BPMNLabel>
           <dc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge bpmnElement="_16" id="BPMNEdge__16" sourceElement="_11" targetElement="_9">
-        <di:waypoint x="487.0" y="396.0"/>
+        <di:waypoint x="472.0" y="396.0"/>
         <di:waypoint x="760.0" y="396.0"/>
         <bpmndi:BPMNLabel>
           <dc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge bpmnElement="_4" id="BPMNEdge__4" sourceElement="_2" targetElement="_3">
-        <di:waypoint x="97.0" y="396.0"/>
+        <di:waypoint x="82.0" y="396.0"/>
         <di:waypoint x="190.0" y="397.5"/>
         <bpmndi:BPMNLabel>
           <dc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge bpmnElement="_8" id="BPMNEdge__8" sourceElement="_12" targetElement="_7">
-        <di:waypoint x="687.0" y="191.0"/>
+        <di:waypoint x="672.0" y="191.0"/>
         <di:waypoint x="765.0" y="121.0"/>
         <bpmndi:BPMNLabel>
           <dc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge bpmnElement="_10" id="BPMNEdge__10" sourceElement="_12" targetElement="_9">
-        <di:waypoint x="687.0" y="191.0"/>
+        <di:waypoint x="672.0" y="191.0"/>
         <di:waypoint x="760.0" y="396.0"/>
         <bpmndi:BPMNLabel>
           <dc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
diff --git a/atms-web/pom.xml b/atms-web/pom.xml
index f64640ae9..2957cda85 100644
--- a/atms-web/pom.xml
+++ b/atms-web/pom.xml
@@ -198,7 +198,7 @@
                 <version>2.1</version>
                 <configuration>
                     <!-- 閫氳繃maven tomcat7:run杩愯椤圭洰鏃讹紝璁块棶椤圭洰鐨勭鍙e彿 -->
-                    <port>8080</port>
+                    <port>18080</port>
                     <!-- 椤圭洰璁块棶璺緞  鏈緥锛歭ocalhost:9090,  濡傛灉閰嶇疆鐨刟a锛� 鍒欒闂矾寰勪负localhost:9090/aa-->
                     <path>/</path>
                     <uriEncoding>UTF-8</uriEncoding>
diff --git a/atms-web/src/main/resources/conf_profile_dev.properties b/atms-web/src/main/resources/conf_profile_dev.properties
index f4f64cf44..c56e55d13 100644
--- a/atms-web/src/main/resources/conf_profile_dev.properties
+++ b/atms-web/src/main/resources/conf_profile_dev.properties
@@ -1,3 +1,3 @@
-api.url=http://etms.longi-silicon.com:8180/
+api.url=http://10.158.230.144:8181/
 
 cookie.maxAgeSeconds=86400
diff --git a/atms-web/src/main/webapp/package-lock.json b/atms-web/src/main/webapp/package-lock.json
index 38f43fe6a..dd678526d 100644
--- a/atms-web/src/main/webapp/package-lock.json
+++ b/atms-web/src/main/webapp/package-lock.json
@@ -16,8 +16,8 @@
       "dev": true,
       "optional": true,
       "requires": {
-        "co": "4.6.0",
-        "json-stable-stringify": "1.0.1"
+        "co": "^4.6.0",
+        "json-stable-stringify": "^1.0.1"
       }
     },
     "ansi-regex": {
@@ -31,11 +31,11 @@
       "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
     },
     "argparse": {
-      "version": "1.0.9",
-      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz",
-      "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=",
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
       "requires": {
-        "sprintf-js": "1.0.3"
+        "sprintf-js": "~1.0.2"
       }
     },
     "array-find-index": {
@@ -102,7 +102,7 @@
       "dev": true,
       "optional": true,
       "requires": {
-        "tweetnacl": "0.14.5"
+        "tweetnacl": "^0.14.3"
       }
     },
     "boom": {
@@ -111,15 +111,15 @@
       "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=",
       "dev": true,
       "requires": {
-        "hoek": "2.16.3"
+        "hoek": "2.x.x"
       }
     },
     "brace-expansion": {
-      "version": "1.1.8",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz",
-      "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=",
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
       "requires": {
-        "balanced-match": "1.0.0",
+        "balanced-match": "^1.0.0",
         "concat-map": "0.0.1"
       }
     },
@@ -138,8 +138,8 @@
       "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
       "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
       "requires": {
-        "camelcase": "2.1.1",
-        "map-obj": "1.0.1"
+        "camelcase": "^2.0.0",
+        "map-obj": "^1.0.0"
       }
     },
     "caseless": {
@@ -154,11 +154,28 @@
       "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
       "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
       "requires": {
-        "ansi-styles": "2.2.1",
-        "escape-string-regexp": "1.0.5",
-        "has-ansi": "2.0.0",
-        "strip-ansi": "3.0.1",
-        "supports-color": "2.0.0"
+        "ansi-styles": "^2.2.1",
+        "escape-string-regexp": "^1.0.2",
+        "has-ansi": "^2.0.0",
+        "strip-ansi": "^3.0.0",
+        "supports-color": "^2.0.0"
+      }
+    },
+    "clean-css": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz",
+      "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==",
+      "dev": true,
+      "requires": {
+        "source-map": "~0.6.0"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        }
       }
     },
     "co": {
@@ -168,10 +185,25 @@
       "dev": true,
       "optional": true
     },
-    "coffeescript": {
+    "coffee-script": {
       "version": "1.10.0",
-      "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.10.0.tgz",
-      "integrity": "sha1-56qDAZF+9iGzXYo580jc3R234z4="
+      "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.10.0.tgz",
+      "integrity": "sha1-EpOLz5vhlI+gBvkuDEyegXBRCMA="
+    },
+    "color-convert": {
+      "version": "1.9.3",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+      "dev": true,
+      "requires": {
+        "color-name": "1.1.3"
+      }
+    },
+    "color-name": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+      "dev": true
     },
     "colors": {
       "version": "1.1.2",
@@ -184,9 +216,15 @@
       "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=",
       "dev": true,
       "requires": {
-        "delayed-stream": "1.0.0"
+        "delayed-stream": "~1.0.0"
       }
     },
+    "commander": {
+      "version": "2.17.1",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz",
+      "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==",
+      "dev": true
+    },
     "concat-map": {
       "version": "0.0.1",
       "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -206,7 +244,7 @@
       "dev": true,
       "optional": true,
       "requires": {
-        "boom": "2.10.1"
+        "boom": "2.x.x"
       }
     },
     "currently-unhandled": {
@@ -214,7 +252,7 @@
       "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
       "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
       "requires": {
-        "array-find-index": "1.0.2"
+        "array-find-index": "^1.0.1"
       }
     },
     "dashdash": {
@@ -224,7 +262,7 @@
       "dev": true,
       "optional": true,
       "requires": {
-        "assert-plus": "1.0.0"
+        "assert-plus": "^1.0.0"
       },
       "dependencies": {
         "assert-plus": {
@@ -241,8 +279,8 @@
       "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz",
       "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=",
       "requires": {
-        "get-stdin": "4.0.1",
-        "meow": "3.7.0"
+        "get-stdin": "^4.0.1",
+        "meow": "^3.3.0"
       }
     },
     "decamelize": {
@@ -256,6 +294,12 @@
       "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
       "dev": true
     },
+    "duplexer": {
+      "version": "0.1.1",
+      "resolved": "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
+      "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=",
+      "dev": true
+    },
     "ecc-jsbn": {
       "version": "0.1.1",
       "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
@@ -263,7 +307,7 @@
       "dev": true,
       "optional": true,
       "requires": {
-        "jsbn": "0.1.1"
+        "jsbn": "~0.1.0"
       }
     },
     "errno": {
@@ -273,15 +317,15 @@
       "dev": true,
       "optional": true,
       "requires": {
-        "prr": "1.0.1"
+        "prr": "~1.0.1"
       }
     },
     "error-ex": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz",
-      "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=",
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+      "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
       "requires": {
-        "is-arrayish": "0.2.1"
+        "is-arrayish": "^0.2.1"
       }
     },
     "escape-string-regexp": {
@@ -317,13 +361,29 @@
       "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
       "dev": true
     },
+    "figures": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz",
+      "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=",
+      "dev": true,
+      "requires": {
+        "escape-string-regexp": "^1.0.5",
+        "object-assign": "^4.1.0"
+      }
+    },
+    "file-sync-cmp": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/file-sync-cmp/-/file-sync-cmp-0.1.1.tgz",
+      "integrity": "sha1-peeo/7+kk7Q7kju9TKiaU7Y7YSs=",
+      "dev": true
+    },
     "find-up": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
       "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
       "requires": {
-        "path-exists": "2.1.0",
-        "pinkie-promise": "2.0.1"
+        "path-exists": "^2.0.0",
+        "pinkie-promise": "^2.0.0"
       }
     },
     "findup-sync": {
@@ -331,7 +391,7 @@
       "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz",
       "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=",
       "requires": {
-        "glob": "5.0.15"
+        "glob": "~5.0.0"
       },
       "dependencies": {
         "glob": {
@@ -339,11 +399,11 @@
           "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
           "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
           "requires": {
-            "inflight": "1.0.6",
-            "inherits": "2.0.3",
-            "minimatch": "3.0.4",
-            "once": "1.4.0",
-            "path-is-absolute": "1.0.1"
+            "inflight": "^1.0.4",
+            "inherits": "2",
+            "minimatch": "2 || 3",
+            "once": "^1.3.0",
+            "path-is-absolute": "^1.0.0"
           }
         }
       }
@@ -362,9 +422,9 @@
       "dev": true,
       "optional": true,
       "requires": {
-        "asynckit": "0.4.0",
-        "combined-stream": "1.0.5",
-        "mime-types": "2.1.17"
+        "asynckit": "^0.4.0",
+        "combined-stream": "^1.0.5",
+        "mime-types": "^2.1.12"
       }
     },
     "fs.realpath": {
@@ -389,7 +449,7 @@
       "dev": true,
       "optional": true,
       "requires": {
-        "assert-plus": "1.0.0"
+        "assert-plus": "^1.0.0"
       },
       "dependencies": {
         "assert-plus": {
@@ -406,12 +466,12 @@
       "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz",
       "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=",
       "requires": {
-        "fs.realpath": "1.0.0",
-        "inflight": "1.0.6",
-        "inherits": "2.0.3",
-        "minimatch": "3.0.4",
-        "once": "1.4.0",
-        "path-is-absolute": "1.0.1"
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^3.0.2",
+        "once": "^1.3.0",
+        "path-is-absolute": "^1.0.0"
       }
     },
     "graceful-fs": {
@@ -420,37 +480,65 @@
       "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
     },
     "grunt": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.0.2.tgz",
-      "integrity": "sha1-TmpeaVtwRy/VME9fqeNCNoNqc7w=",
-      "requires": {
-        "coffeescript": "1.10.0",
-        "dateformat": "1.0.12",
-        "eventemitter2": "0.4.14",
-        "exit": "0.1.2",
-        "findup-sync": "0.3.0",
-        "glob": "7.0.6",
-        "grunt-cli": "1.2.0",
-        "grunt-known-options": "1.1.0",
-        "grunt-legacy-log": "1.0.0",
-        "grunt-legacy-util": "1.0.0",
-        "iconv-lite": "0.4.19",
-        "js-yaml": "3.5.5",
-        "minimatch": "3.0.4",
-        "nopt": "3.0.6",
-        "path-is-absolute": "1.0.1",
-        "rimraf": "2.2.8"
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.0.1.tgz",
+      "integrity": "sha1-6HeHZOlEsY8yuw8QuQeEdcnftWs=",
+      "requires": {
+        "coffee-script": "~1.10.0",
+        "dateformat": "~1.0.12",
+        "eventemitter2": "~0.4.13",
+        "exit": "~0.1.1",
+        "findup-sync": "~0.3.0",
+        "glob": "~7.0.0",
+        "grunt-cli": "~1.2.0",
+        "grunt-known-options": "~1.1.0",
+        "grunt-legacy-log": "~1.0.0",
+        "grunt-legacy-util": "~1.0.0",
+        "iconv-lite": "~0.4.13",
+        "js-yaml": "~3.5.2",
+        "minimatch": "~3.0.0",
+        "nopt": "~3.0.6",
+        "path-is-absolute": "~1.0.0",
+        "rimraf": "~2.2.8"
+      }
+    },
+    "grunt-cli": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz",
+      "integrity": "sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg=",
+      "requires": {
+        "findup-sync": "~0.3.0",
+        "grunt-known-options": "~1.1.0",
+        "nopt": "~3.0.6",
+        "resolve": "~1.1.0"
+      }
+    },
+    "grunt-contrib-clean": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-2.0.0.tgz",
+      "integrity": "sha512-g5ZD3ORk6gMa5ugZosLDQl3dZO7cI3R14U75hTM+dVLVxdMNJCPVmwf9OUt4v4eWgpKKWWoVK9DZc1amJp4nQw==",
+      "dev": true,
+      "requires": {
+        "async": "^2.6.1",
+        "rimraf": "^2.6.2"
       },
       "dependencies": {
-        "grunt-cli": {
-          "version": "1.2.0",
-          "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz",
-          "integrity": "sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg=",
+        "async": {
+          "version": "2.6.1",
+          "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz",
+          "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==",
+          "dev": true,
+          "requires": {
+            "lodash": "^4.17.10"
+          }
+        },
+        "rimraf": {
+          "version": "2.6.2",
+          "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
+          "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
+          "dev": true,
           "requires": {
-            "findup-sync": "0.3.0",
-            "grunt-known-options": "1.1.0",
-            "nopt": "3.0.6",
-            "resolve": "1.1.7"
+            "glob": "^7.0.5"
           }
         }
       }
@@ -461,8 +549,60 @@
       "integrity": "sha1-YVCYYwhOhx1+ht5IwBUlntl3Rb0=",
       "dev": true,
       "requires": {
-        "chalk": "1.1.3",
-        "source-map": "0.5.7"
+        "chalk": "^1.0.0",
+        "source-map": "^0.5.3"
+      }
+    },
+    "grunt-contrib-copy": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-1.0.0.tgz",
+      "integrity": "sha1-cGDGWB6QS4qw0A8HbgqPbj58NXM=",
+      "dev": true,
+      "requires": {
+        "chalk": "^1.1.1",
+        "file-sync-cmp": "^0.1.0"
+      }
+    },
+    "grunt-contrib-cssmin": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/grunt-contrib-cssmin/-/grunt-contrib-cssmin-3.0.0.tgz",
+      "integrity": "sha512-eXpooYmVGKMs/xV7DzTLgJFPVOfMuawPD3x0JwhlH0mumq2NtH3xsxaHxp1Y3NKxp0j0tRhFS6kSBRsz6TuTGg==",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.4.1",
+        "clean-css": "~4.2.1",
+        "maxmin": "^2.1.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "3.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+          "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^1.9.0"
+          }
+        },
+        "chalk": {
+          "version": "2.4.1",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+          "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^3.2.1",
+            "escape-string-regexp": "^1.0.5",
+            "supports-color": "^5.3.0"
+          }
+        },
+        "supports-color": {
+          "version": "5.5.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
       }
     },
     "grunt-contrib-less": {
@@ -471,10 +611,10 @@
       "integrity": "sha1-O73sC3XRLOqlXWKUNiXAsIYc328=",
       "dev": true,
       "requires": {
-        "async": "2.6.0",
-        "chalk": "1.1.3",
-        "less": "2.7.3",
-        "lodash": "4.17.5"
+        "async": "^2.0.0",
+        "chalk": "^1.0.0",
+        "less": "~2.7.1",
+        "lodash": "^4.8.2"
       },
       "dependencies": {
         "async": {
@@ -483,7 +623,7 @@
           "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==",
           "dev": true,
           "requires": {
-            "lodash": "4.17.5"
+            "lodash": "^4.14.0"
           }
         },
         "lodash": {
@@ -494,21 +634,63 @@
         }
       }
     },
+    "grunt-contrib-uglify": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-4.0.0.tgz",
+      "integrity": "sha512-vy3Vop2KDqdiwcGOGAjyKvjHFrRD/YK4KPQWR3Yt6OdYlgFw1z7HCuk66+IJ9s7oJmp9uRQXuuSHyawKRAgiMw==",
+      "dev": true,
+      "requires": {
+        "chalk": "^2.4.1",
+        "maxmin": "^2.1.0",
+        "uglify-js": "~3.4.8",
+        "uri-path": "^1.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "3.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+          "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^1.9.0"
+          }
+        },
+        "chalk": {
+          "version": "2.4.1",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
+          "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^3.2.1",
+            "escape-string-regexp": "^1.0.5",
+            "supports-color": "^5.3.0"
+          }
+        },
+        "supports-color": {
+          "version": "5.5.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
     "grunt-known-options": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.0.tgz",
-      "integrity": "sha1-pCdO6zL6dl2lp6OxcSYXzjsUQUk="
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.1.tgz",
+      "integrity": "sha512-cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ=="
     },
     "grunt-legacy-log": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-1.0.0.tgz",
-      "integrity": "sha1-+4bxgJhHvAfcR4Q/ns1srLYt8tU=",
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-1.0.2.tgz",
+      "integrity": "sha512-WdedTJ/6zCXnI/coaouzqvkI19uwqbcPkdsXiDRKJyB5rOUlOxnCnTVbpeUdEckKVir2uHF3rDBYppj2p6N3+g==",
       "requires": {
-        "colors": "1.1.2",
-        "grunt-legacy-log-utils": "1.0.0",
-        "hooker": "0.2.3",
-        "lodash": "3.10.1",
-        "underscore.string": "3.2.3"
+        "colors": "~1.1.2",
+        "grunt-legacy-log-utils": "~1.0.0",
+        "hooker": "~0.2.3",
+        "lodash": "~4.17.5"
       }
     },
     "grunt-legacy-log-utils": {
@@ -516,8 +698,8 @@
       "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-1.0.0.tgz",
       "integrity": "sha1-p7ji0Ps1taUPSvmG/BEnSevJbz0=",
       "requires": {
-        "chalk": "1.1.3",
-        "lodash": "4.3.0"
+        "chalk": "~1.1.1",
+        "lodash": "~4.3.0"
       },
       "dependencies": {
         "lodash": {
@@ -532,13 +714,13 @@
       "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-1.0.0.tgz",
       "integrity": "sha1-OGqnjcbtUJhsKxiVcmWxtIq7m4Y=",
       "requires": {
-        "async": "1.5.2",
-        "exit": "0.1.2",
-        "getobject": "0.1.0",
-        "hooker": "0.2.3",
-        "lodash": "4.3.0",
-        "underscore.string": "3.2.3",
-        "which": "1.2.14"
+        "async": "~1.5.2",
+        "exit": "~0.1.1",
+        "getobject": "~0.1.0",
+        "hooker": "~0.2.3",
+        "lodash": "~4.3.0",
+        "underscore.string": "~3.2.3",
+        "which": "~1.2.1"
       },
       "dependencies": {
         "lodash": {
@@ -548,6 +730,15 @@
         }
       }
     },
+    "gzip-size": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz",
+      "integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=",
+      "dev": true,
+      "requires": {
+        "duplexer": "^0.1.1"
+      }
+    },
     "har-schema": {
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz",
@@ -562,8 +753,8 @@
       "dev": true,
       "optional": true,
       "requires": {
-        "ajv": "4.11.8",
-        "har-schema": "1.0.5"
+        "ajv": "^4.9.1",
+        "har-schema": "^1.0.5"
       }
     },
     "has-ansi": {
@@ -571,9 +762,15 @@
       "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
       "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
       "requires": {
-        "ansi-regex": "2.1.1"
+        "ansi-regex": "^2.0.0"
       }
     },
+    "has-flag": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+      "dev": true
+    },
     "hawk": {
       "version": "3.1.3",
       "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz",
@@ -581,10 +778,10 @@
       "dev": true,
       "optional": true,
       "requires": {
-        "boom": "2.10.1",
-        "cryptiles": "2.0.5",
-        "hoek": "2.16.3",
-        "sntp": "1.0.9"
+        "boom": "2.x.x",
+        "cryptiles": "2.x.x",
+        "hoek": "2.x.x",
+        "sntp": "1.x.x"
       }
     },
     "hoek": {
@@ -599,9 +796,9 @@
       "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk="
     },
     "hosted-git-info": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz",
-      "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg=="
+      "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz",
+      "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w=="
     },
     "http-signature": {
       "version": "1.1.1",
@@ -610,15 +807,18 @@
       "dev": true,
       "optional": true,
       "requires": {
-        "assert-plus": "0.2.0",
-        "jsprim": "1.4.1",
-        "sshpk": "1.13.1"
+        "assert-plus": "^0.2.0",
+        "jsprim": "^1.2.2",
+        "sshpk": "^1.7.0"
       }
     },
     "iconv-lite": {
-      "version": "0.4.19",
-      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
-      "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ=="
+      "version": "0.4.24",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+      "requires": {
+        "safer-buffer": ">= 2.1.2 < 3"
+      }
     },
     "image-size": {
       "version": "0.5.5",
@@ -632,7 +832,7 @@
       "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
       "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
       "requires": {
-        "repeating": "2.0.1"
+        "repeating": "^2.0.0"
       }
     },
     "inflight": {
@@ -640,8 +840,8 @@
       "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
       "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
       "requires": {
-        "once": "1.4.0",
-        "wrappy": "1.0.2"
+        "once": "^1.3.0",
+        "wrappy": "1"
       }
     },
     "inherits": {
@@ -659,7 +859,7 @@
       "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
       "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
       "requires": {
-        "builtin-modules": "1.1.1"
+        "builtin-modules": "^1.0.0"
       }
     },
     "is-finite": {
@@ -667,7 +867,7 @@
       "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
       "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
       "requires": {
-        "number-is-nan": "1.0.1"
+        "number-is-nan": "^1.0.0"
       }
     },
     "is-typedarray": {
@@ -699,8 +899,8 @@
       "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.5.5.tgz",
       "integrity": "sha1-A3fDgBfKvHMisNH7zSWkkWQfL74=",
       "requires": {
-        "argparse": "1.0.9",
-        "esprima": "2.7.3"
+        "argparse": "^1.0.2",
+        "esprima": "^2.6.0"
       }
     },
     "jsbn": {
@@ -724,7 +924,7 @@
       "dev": true,
       "optional": true,
       "requires": {
-        "jsonify": "0.0.0"
+        "jsonify": "~0.0.0"
       }
     },
     "json-stringify-safe": {
@@ -769,14 +969,14 @@
       "integrity": "sha512-KPdIJKWcEAb02TuJtaLrhue0krtRLoRoo7x6BNJIBelO00t/CCdJQUnHW5V34OnHMWzIktSalJxRO+FvytQlCQ==",
       "dev": true,
       "requires": {
-        "errno": "0.1.6",
-        "graceful-fs": "4.1.11",
-        "image-size": "0.5.5",
-        "mime": "1.6.0",
-        "mkdirp": "0.5.1",
-        "promise": "7.3.1",
+        "errno": "^0.1.1",
+        "graceful-fs": "^4.1.2",
+        "image-size": "~0.5.0",
+        "mime": "^1.2.11",
+        "mkdirp": "^0.5.0",
+        "promise": "^7.1.1",
         "request": "2.81.0",
-        "source-map": "0.5.7"
+        "source-map": "^0.5.3"
       }
     },
     "load-json-file": {
@@ -784,25 +984,25 @@
       "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
       "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
       "requires": {
-        "graceful-fs": "4.1.11",
-        "parse-json": "2.2.0",
-        "pify": "2.3.0",
-        "pinkie-promise": "2.0.1",
-        "strip-bom": "2.0.0"
+        "graceful-fs": "^4.1.2",
+        "parse-json": "^2.2.0",
+        "pify": "^2.0.0",
+        "pinkie-promise": "^2.0.0",
+        "strip-bom": "^2.0.0"
       }
     },
     "lodash": {
-      "version": "3.10.1",
-      "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
-      "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y="
+      "version": "4.17.11",
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
+      "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg=="
     },
     "loud-rejection": {
       "version": "1.6.0",
       "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
       "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
       "requires": {
-        "currently-unhandled": "0.4.1",
-        "signal-exit": "3.0.2"
+        "currently-unhandled": "^0.4.1",
+        "signal-exit": "^3.0.0"
       }
     },
     "map-obj": {
@@ -810,21 +1010,33 @@
       "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
       "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0="
     },
+    "maxmin": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-2.1.0.tgz",
+      "integrity": "sha1-TTsiCQPZXu5+t6x/qGTnLcCaMWY=",
+      "dev": true,
+      "requires": {
+        "chalk": "^1.0.0",
+        "figures": "^1.0.1",
+        "gzip-size": "^3.0.0",
+        "pretty-bytes": "^3.0.0"
+      }
+    },
     "meow": {
       "version": "3.7.0",
       "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
       "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
       "requires": {
-        "camelcase-keys": "2.1.0",
-        "decamelize": "1.2.0",
-        "loud-rejection": "1.6.0",
-        "map-obj": "1.0.1",
-        "minimist": "1.2.0",
-        "normalize-package-data": "2.4.0",
-        "object-assign": "4.1.1",
-        "read-pkg-up": "1.0.1",
-        "redent": "1.0.0",
-        "trim-newlines": "1.0.0"
+        "camelcase-keys": "^2.0.0",
+        "decamelize": "^1.1.2",
+        "loud-rejection": "^1.0.0",
+        "map-obj": "^1.0.1",
+        "minimist": "^1.1.3",
+        "normalize-package-data": "^2.3.4",
+        "object-assign": "^4.0.1",
+        "read-pkg-up": "^1.0.1",
+        "redent": "^1.0.0",
+        "trim-newlines": "^1.0.0"
       }
     },
     "mime": {
@@ -846,7 +1058,7 @@
       "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=",
       "dev": true,
       "requires": {
-        "mime-db": "1.30.0"
+        "mime-db": "~1.30.0"
       }
     },
     "minimatch": {
@@ -854,7 +1066,7 @@
       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
       "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
       "requires": {
-        "brace-expansion": "1.1.8"
+        "brace-expansion": "^1.1.7"
       }
     },
     "minimist": {
@@ -886,7 +1098,7 @@
       "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
       "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
       "requires": {
-        "abbrev": "1.1.1"
+        "abbrev": "1"
       }
     },
     "normalize-package-data": {
@@ -894,10 +1106,10 @@
       "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
       "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
       "requires": {
-        "hosted-git-info": "2.5.0",
-        "is-builtin-module": "1.0.0",
-        "semver": "5.5.0",
-        "validate-npm-package-license": "3.0.1"
+        "hosted-git-info": "^2.1.4",
+        "is-builtin-module": "^1.0.0",
+        "semver": "2 || 3 || 4 || 5",
+        "validate-npm-package-license": "^3.0.1"
       }
     },
     "number-is-nan": {
@@ -922,7 +1134,7 @@
       "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
       "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
       "requires": {
-        "wrappy": "1.0.2"
+        "wrappy": "1"
       }
     },
     "parse-json": {
@@ -930,7 +1142,7 @@
       "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
       "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
       "requires": {
-        "error-ex": "1.3.1"
+        "error-ex": "^1.2.0"
       }
     },
     "path-exists": {
@@ -938,7 +1150,7 @@
       "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
       "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
       "requires": {
-        "pinkie-promise": "2.0.1"
+        "pinkie-promise": "^2.0.0"
       }
     },
     "path-is-absolute": {
@@ -951,9 +1163,9 @@
       "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
       "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
       "requires": {
-        "graceful-fs": "4.1.11",
-        "pify": "2.3.0",
-        "pinkie-promise": "2.0.1"
+        "graceful-fs": "^4.1.2",
+        "pify": "^2.0.0",
+        "pinkie-promise": "^2.0.0"
       }
     },
     "performance-now": {
@@ -978,7 +1190,16 @@
       "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
       "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
       "requires": {
-        "pinkie": "2.0.4"
+        "pinkie": "^2.0.0"
+      }
+    },
+    "pretty-bytes": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-3.0.1.tgz",
+      "integrity": "sha1-J9AAjXeAY6C0gRuzXHnxvV1fvM8=",
+      "dev": true,
+      "requires": {
+        "number-is-nan": "^1.0.0"
       }
     },
     "promise": {
@@ -988,7 +1209,7 @@
       "dev": true,
       "optional": true,
       "requires": {
-        "asap": "2.0.6"
+        "asap": "~2.0.3"
       }
     },
     "prr": {
@@ -1017,9 +1238,9 @@
       "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
       "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
       "requires": {
-        "load-json-file": "1.1.0",
-        "normalize-package-data": "2.4.0",
-        "path-type": "1.1.0"
+        "load-json-file": "^1.0.0",
+        "normalize-package-data": "^2.3.2",
+        "path-type": "^1.0.0"
       }
     },
     "read-pkg-up": {
@@ -1027,8 +1248,8 @@
       "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
       "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
       "requires": {
-        "find-up": "1.1.2",
-        "read-pkg": "1.1.0"
+        "find-up": "^1.0.0",
+        "read-pkg": "^1.0.0"
       }
     },
     "redent": {
@@ -1036,8 +1257,8 @@
       "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
       "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
       "requires": {
-        "indent-string": "2.1.0",
-        "strip-indent": "1.0.1"
+        "indent-string": "^2.1.0",
+        "strip-indent": "^1.0.1"
       }
     },
     "repeating": {
@@ -1045,7 +1266,7 @@
       "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
       "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
       "requires": {
-        "is-finite": "1.0.2"
+        "is-finite": "^1.0.0"
       }
     },
     "request": {
@@ -1055,28 +1276,28 @@
       "dev": true,
       "optional": true,
       "requires": {
-        "aws-sign2": "0.6.0",
-        "aws4": "1.6.0",
-        "caseless": "0.12.0",
-        "combined-stream": "1.0.5",
-        "extend": "3.0.1",
-        "forever-agent": "0.6.1",
-        "form-data": "2.1.4",
-        "har-validator": "4.2.1",
-        "hawk": "3.1.3",
-        "http-signature": "1.1.1",
-        "is-typedarray": "1.0.0",
-        "isstream": "0.1.2",
-        "json-stringify-safe": "5.0.1",
-        "mime-types": "2.1.17",
-        "oauth-sign": "0.8.2",
-        "performance-now": "0.2.0",
-        "qs": "6.4.0",
-        "safe-buffer": "5.1.1",
-        "stringstream": "0.0.5",
-        "tough-cookie": "2.3.3",
-        "tunnel-agent": "0.6.0",
-        "uuid": "3.2.1"
+        "aws-sign2": "~0.6.0",
+        "aws4": "^1.2.1",
+        "caseless": "~0.12.0",
+        "combined-stream": "~1.0.5",
+        "extend": "~3.0.0",
+        "forever-agent": "~0.6.1",
+        "form-data": "~2.1.1",
+        "har-validator": "~4.2.1",
+        "hawk": "~3.1.3",
+        "http-signature": "~1.1.0",
+        "is-typedarray": "~1.0.0",
+        "isstream": "~0.1.2",
+        "json-stringify-safe": "~5.0.1",
+        "mime-types": "~2.1.7",
+        "oauth-sign": "~0.8.1",
+        "performance-now": "^0.2.0",
+        "qs": "~6.4.0",
+        "safe-buffer": "^5.0.1",
+        "stringstream": "~0.0.4",
+        "tough-cookie": "~2.3.0",
+        "tunnel-agent": "^0.6.0",
+        "uuid": "^3.0.0"
       }
     },
     "resolve": {
@@ -1095,10 +1316,15 @@
       "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==",
       "dev": true
     },
+    "safer-buffer": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+    },
     "semver": {
-      "version": "5.5.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
-      "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA=="
+      "version": "5.6.0",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
+      "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg=="
     },
     "signal-exit": {
       "version": "3.0.2",
@@ -1112,7 +1338,7 @@
       "dev": true,
       "optional": true,
       "requires": {
-        "hoek": "2.16.3"
+        "hoek": "2.x.x"
       }
     },
     "source-map": {
@@ -1122,22 +1348,32 @@
       "dev": true
     },
     "spdx-correct": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz",
-      "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=",
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.2.tgz",
+      "integrity": "sha512-q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ==",
       "requires": {
-        "spdx-license-ids": "1.2.2"
+        "spdx-expression-parse": "^3.0.0",
+        "spdx-license-ids": "^3.0.0"
       }
     },
+    "spdx-exceptions": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz",
+      "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA=="
+    },
     "spdx-expression-parse": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz",
-      "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw="
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
+      "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
+      "requires": {
+        "spdx-exceptions": "^2.1.0",
+        "spdx-license-ids": "^3.0.0"
+      }
     },
     "spdx-license-ids": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz",
-      "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc="
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz",
+      "integrity": "sha512-TfOfPcYGBB5sDuPn3deByxPhmfegAhpDYKSOXZQN81Oyrrif8ZCodOLzK3AesELnCx03kikhyDwh0pfvvQvF8w=="
     },
     "sprintf-js": {
       "version": "1.0.3",
@@ -1151,14 +1387,14 @@
       "dev": true,
       "optional": true,
       "requires": {
-        "asn1": "0.2.3",
-        "assert-plus": "1.0.0",
-        "bcrypt-pbkdf": "1.0.1",
-        "dashdash": "1.14.1",
-        "ecc-jsbn": "0.1.1",
-        "getpass": "0.1.7",
-        "jsbn": "0.1.1",
-        "tweetnacl": "0.14.5"
+        "asn1": "~0.2.3",
+        "assert-plus": "^1.0.0",
+        "bcrypt-pbkdf": "^1.0.0",
+        "dashdash": "^1.12.0",
+        "ecc-jsbn": "~0.1.1",
+        "getpass": "^0.1.1",
+        "jsbn": "~0.1.0",
+        "tweetnacl": "~0.14.0"
       },
       "dependencies": {
         "assert-plus": {
@@ -1182,7 +1418,7 @@
       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
       "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
       "requires": {
-        "ansi-regex": "2.1.1"
+        "ansi-regex": "^2.0.0"
       }
     },
     "strip-bom": {
@@ -1190,7 +1426,7 @@
       "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
       "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
       "requires": {
-        "is-utf8": "0.2.1"
+        "is-utf8": "^0.2.0"
       }
     },
     "strip-indent": {
@@ -1198,7 +1434,7 @@
       "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
       "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
       "requires": {
-        "get-stdin": "4.0.1"
+        "get-stdin": "^4.0.1"
       }
     },
     "supports-color": {
@@ -1213,7 +1449,7 @@
       "dev": true,
       "optional": true,
       "requires": {
-        "punycode": "1.4.1"
+        "punycode": "^1.4.1"
       }
     },
     "trim-newlines": {
@@ -1228,7 +1464,7 @@
       "dev": true,
       "optional": true,
       "requires": {
-        "safe-buffer": "5.1.1"
+        "safe-buffer": "^5.0.1"
       }
     },
     "tweetnacl": {
@@ -1238,11 +1474,35 @@
       "dev": true,
       "optional": true
     },
+    "uglify-js": {
+      "version": "3.4.9",
+      "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz",
+      "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==",
+      "dev": true,
+      "requires": {
+        "commander": "~2.17.1",
+        "source-map": "~0.6.1"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        }
+      }
+    },
     "underscore.string": {
       "version": "3.2.3",
       "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.2.3.tgz",
       "integrity": "sha1-gGmSYzZl1eX8tNsfs6hi62jp5to="
     },
+    "uri-path": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/uri-path/-/uri-path-1.0.0.tgz",
+      "integrity": "sha1-l0fwGDWJM8Md4PzP2C0TjmcmLjI=",
+      "dev": true
+    },
     "uuid": {
       "version": "3.2.1",
       "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz",
@@ -1251,12 +1511,12 @@
       "optional": true
     },
     "validate-npm-package-license": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz",
-      "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=",
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+      "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
       "requires": {
-        "spdx-correct": "1.0.2",
-        "spdx-expression-parse": "1.0.4"
+        "spdx-correct": "^3.0.0",
+        "spdx-expression-parse": "^3.0.0"
       }
     },
     "verror": {
@@ -1266,9 +1526,9 @@
       "dev": true,
       "optional": true,
       "requires": {
-        "assert-plus": "1.0.0",
+        "assert-plus": "^1.0.0",
         "core-util-is": "1.0.2",
-        "extsprintf": "1.3.0"
+        "extsprintf": "^1.2.0"
       },
       "dependencies": {
         "assert-plus": {
@@ -1285,7 +1545,7 @@
       "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz",
       "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=",
       "requires": {
-        "isexe": "2.0.0"
+        "isexe": "^2.0.0"
       }
     },
     "wrappy": {
diff --git a/diff b/diff
new file mode 100644
index 000000000..8d272beb7
--- /dev/null
+++ b/diff
@@ -0,0 +1,2717 @@
+diff --git a/atms-web/src/main/webapp/app/app.config.js b/atms-web/src/main/webapp/app/app.config.js
+new file mode 100644
+index 00000000..12fc1609
+--- /dev/null
++++ b/atms-web/src/main/webapp/app/app.config.js
+@@ -0,0 +1,30 @@
++锘�(function () {
++    'use strict';
++
++    angular.module('app.config', [])
++        // region of current application
++        .constant('region', 'zh-CN')
++        //.constant('region', 'en-US')
++        // version of current application
++        .constant('version', '1.0.0.0')
++        // Exceptionless Server URL
++        .constant('exceptionlessServerURL', '')
++        .run([
++            'region', function (region) {
++                $.when(
++                    $.getJSON("/Scripts/cldr/main/zh/numbers.json"),
++                    $.getJSON("/Scripts/cldr/main/zh/ca-gregorian.json"),
++                    $.getJSON("/Scripts/cldr/supplemental/likelySubtags.json")
++                ).then(function () {
++                    return [].slice.apply(arguments, [0]).map(function (result) {
++                        return result[0];
++                    });
++                }).then(Globalize.load).then(function () {
++                     Globalize.locale("zh-CN");
++                   // Globalize.locale("en-US");
++                    DevExpress.localization.locale(region);
++                    //DevExpress.localization.locale(navigator.language || navigator.browserLanguage);
++                });
++            }
++        ]);
++}());
+\ No newline at end of file
+diff --git a/atms-web/src/main/webapp/app/app.js b/atms-web/src/main/webapp/app/app.js
+new file mode 100644
+index 00000000..4f10bcb0
+--- /dev/null
++++ b/atms-web/src/main/webapp/app/app.js
+@@ -0,0 +1,355 @@
++锘�//
++// app module for online DPMS
++//
++var app = angular.module('app', ['ui.tree', 'ui.bootstrap', 'ui.bootstrap.tpls', 'ui.event', 'pascalprecht.translate', 'ngMessages', 'ui.utils',
++    'ngRoute', 'ngCookies', 'ngSanitize', 'ct.ui.router.extras', 'chieffancypants.loadingBar', 'ngDraggable', 'ngFileUpload', 'LocalStorageModule', 'exceptionless',
++    'app.config', 'app.common', 'app.webservices', 'app.framework', 'app.vat', 'app.invoice', 'app.cit', 'app.assetsManage', 'pasvaz.bindonce', 'app.vatDashboard', 'app.vatDongfeng', 'vs-repeat', 'ivh.treeview', 'angular-cache',
++    'app.cache', 'angularBootstrapNavTree', 'ngAnimate', 'cgNotify', 'dx', 'ngNumeraljs', 'app.noPermissionPage'])
++    //run blocks are executed after the injector is created and are the first
++    //methods that are executed in any Angular app.
++    .run(['$log', '$http', 'CacheFactory', 'userService', 'loginContext', '$rootScope', 'vatSessionService', '$q', function ($log, $http, CacheFactory, userService, loginContext, $rootScope, vatSessionService, $q) {
++        $log.debug('app.run()...');
++
++        $rootScope.vatPermission = constant.vatPermission;
++
++        // 鎺у埗鐢ㄦ埛鏈烘瀯缁村害涓婄殑鏉冮檺
++        $rootScope.checkUserOrganizationPermissionList = function (permissionCodeList) {
++            var deferred = $q.defer();
++            var promise = deferred.promise;
++            var model = {};
++
++            var orgID = vatSessionService.project.organizationID;
++
++            userService.getUserPermissionNew(loginContext.userName, function (data) {
++                permissionCodeList.forEach(function (permissionCode) {
++                    var ret = window.PWC.isHaveOrganizationPermission(orgID, permissionCode, data);
++                    model[permissionCode] = ret;
++                });
++
++                deferred.resolve(model);
++            });
++
++            var successFunction = function (fn) {
++                promise.then(function (model) {
++                    fn(model);
++                });
++                return this;
++            }
++
++            return {
++                success: successFunction,
++            };
++        };
++
++
++        $rootScope.checkUserOrganizationPermissionList([]);
++
++        $rootScope.checkUserPermissionList = function (permissionCodeList) {
++            var deferred = $q.defer();
++            var promise = deferred.promise;
++            var model = {};
++            // 杩欑鏂瑰紡 閲嶆柊鐧诲綍锛屽苟鍙戝幓鍚庡彴 鍙栨暟鎹� 浼氬嚭鐜伴棶棰�
++            //userService.getUserPermission(loginContext.userName).success(function (data) {
++            //    permissionCodeList.forEach(function (permissionCode) {
++            //        var ret = window.PWC.isHavePermission(permissionCode, data);
++            //        model[permissionCode] = ret;
++            //    });
++
++            //    deferred.resolve(model);
++            //});
++
++            userService.getUserPermissionNew(loginContext.userName, function (data) {
++                permissionCodeList.forEach(function (permissionCode) {
++                    var ret = window.PWC.isHavePermission(permissionCode, data);
++                    model[permissionCode] = ret;
++                });
++
++                deferred.resolve(model);
++            });
++
++            var successFunction = function (fn) {
++                promise.then(function (model) {
++                    fn(model);
++                });
++                return this;
++            }
++
++            return {
++                success: successFunction,
++            };
++        };
++        $http.defaults.headers.common['X-XSRF-Token'] =
++            angular.element('input[name="__RequestVerificationToken"]').attr('value');
++
++
++    }])
++    // We always place constant at the beginning of all configuration blocks.
++    .constant('application', {
++        // the current logged on user
++        currentUser: {},
++        // convert date to display time based on current user
++        toDisplayTimeString: function (dateTime) {
++            if (!_.isDate(dateTime)) {
++                throw new TypeError('"dateTime" should be "Date" type!');
++            }
++            return dateTime.toString('h:mmtt').toLowerCase();
++        },
++        // define angular events for $broadcast/$emit and $on
++        events: {
++            beforeUnload: 'event:beforeUnload',
++            navigateToTab: 'event:navigateToTab',
++            showNotificationBar: 'event:showNotificationBar'
++        }
++    })
++    // only providers and constants should be injected in config block
++    .config(['$logProvider', '$translateProvider', '$translatePartialLoaderProvider', 'region', '$compileProvider',
++        function ($logProvider, $translateProvider, $translatePartialLoaderProvider, region, $compileProvider) {
++            'use strict';
++
++            // to disable various debug runtime information in the compiler to DOM elements.
++            $compileProvider.debugInfoEnabled(false);
++            // enable output $log.debug by default
++            $logProvider.debugEnabled(true);
++
++            // angular-translate configuration
++            var configurateTranslation = function () {
++
++                $translateProvider.useLoader('$translatePartialLoader', {
++                    // the translation table are organized by language and module under folder 'app/i18n/'
++                    urlTemplate: '/app-resources/i18n/{lang}/{part}.json'
++                });
++
++                $translateProvider
++                    .preferredLanguage(region)
++                    .fallbackLanguage(region);
++
++                //https://github.com/Contactis/translations-manager/issues/7
++                //https://angular-translate.github.io/docs/#/guide/19_security
++                $translateProvider.useSanitizeValueStrategy('escape');
++            };
++
++            configurateTranslation();
++        }
++    ])
++    // IE10 fires input event when a placeholder is defined so that form element is in dirty instead of pristine state 
++    // refer to: https://github.com/angular/angular.js/issues/2614
++    .config(['$provide', function ($provide) {
++        $provide.decorator('$sniffer', ['$delegate', function ($sniffer) {
++            var msieVersion = parseInt((/msie (\d+)/.exec(angular.lowercase(navigator.userAgent)) || [])[1], 10);
++            var hasEvent = $sniffer.hasEvent;
++            $sniffer.hasEvent = function (event) {
++                if (event === 'input' && msieVersion === 10) {
++                    return false;
++                }
++                hasEvent.call(this, event);
++            };
++            return $sniffer;
++        }]);
++    }])
++    .config(['$ExceptionlessClient', 'exceptionlessServerURL', function ($ExceptionlessClient, exceptionlessServerURL) {
++        if (!PWC.isNullOrEmpty(exceptionlessServerURL)) {
++            $ExceptionlessClient.config.apiKey = 'HK0XK49LbufV6E4q8HLW7CGncwSBJvdBrJQwUnzw';
++            $ExceptionlessClient.config.serverUrl = exceptionlessServerURL;
++            $ExceptionlessClient.config.setUserIdentity('0', 'Anonymous');
++            $ExceptionlessClient.config.useSessions();
++            $ExceptionlessClient.config.defaultTags.push('JavaScript', 'Angular');
++        }
++    }])
++    .config(['CacheFactoryProvider', function (CacheFactoryProvider) {
++        var options = {
++            storageMode: 'localStorage', // This cache will use `localStorage`.
++            storagePrefix: 'atms.'
++        };
++        if (!window.localStorage) {
++            options.storageImpl = localStoragePolyfill;
++        }
++        angular.extend(CacheFactoryProvider.defaults, options);
++    }])
++    .config(['ivhTreeviewOptionsProvider', function (ivhTreeviewOptionsProvider) {
++        ivhTreeviewOptionsProvider.set({
++            defaultSelectedState: false,
++            validate: true,
++            // Twisties can be images, custom html, or plain text
++            twistieCollapsedTpl: '<i class="fa fa-plus" aria-hidden="true"></i>',
++            twistieExpandedTpl: '<i class="fa fa-minus" aria-hidden="true"></i>',
++            twistieLeafTpl: '<span style="color:white">&#9679;</span>'
++        });
++    }])
++    // refer to: https://github.com/oitozero/ngSweetAlert
++    .factory('SweetAlert', ['$rootScope', '$log', '$translate', function ($rootScope, $log, $translate) {
++        $log.debug('SweetAlert.run()...');
++        var swal = window.swal;
++        //public methods
++        var self = {
++
++            swal: function (arg1, arg2, arg3) {
++                $rootScope.$evalAsync(function () {
++                    if (typeof (arg2) === 'function') {
++                        swal(arg1, function (isConfirm) {
++                            $rootScope.$evalAsync(function () {
++                                arg2(isConfirm);
++                            });
++                        }, arg3);
++                    } else {
++                        swal(arg1, arg2, arg3);
++                    }
++                });
++            },
++            success: function (title, message) {
++                $rootScope.$evalAsync(function () {
++                    //swal(title, message, 'success');
++
++                    swal({
++                        title: title,
++                        text: message,
++                        type: "success",
++                        confirmButtonText: $translate.instant('Confirm'),
++                    });
++                });
++            },
++            error: function (title, message) {
++                $rootScope.$evalAsync(function () {
++                    //swal(title, message, 'error');
++                    swal({
++                        title: title,
++                        text: message,
++                        type: "error",
++                        confirmButtonText: $translate.instant('Confirm'),
++                    });
++
++                });
++            },
++            warning: function (title, message) {
++                $rootScope.$evalAsync(function () {
++                    //swal(title, message, 'warning');
++                    swal({
++                        title: title,
++                        text: message,
++                        type: "warning",
++                        confirmButtonText: $translate.instant('Confirm'),
++                    });
++                });
++            },
++            info: function (title, message) {
++                $rootScope.$evalAsync(function () {
++                    //swal(title, message, 'info');
++                    swal({
++                        title: title,
++                        text: message,
++                        type: "info",
++                        confirmButtonText: $translate.instant('Confirm'),
++                    });
++                });
++            }
++        };
++
++        return self;
++    }])
++    //turn off angular-loading-bar spinner
++    //refer to https://github.com/chieffancypants/angular-loading-bar
++    .config(['cfpLoadingBarProvider', function (cfpLoadingBarProvider) {
++        cfpLoadingBarProvider.includeSpinner = false;
++    }])
++    //initialize localStorage
++    //refer to https://github.com/grevory/angular-local-storage#get-started
++    .config(['localStorageServiceProvider', function (localStorageServiceProvider) {
++        localStorageServiceProvider.setPrefix('pwcdashboard').setStorageType('sessionStorage');
++    }])
++    // Provide the localization function for application and support async load translation table by parts on demand.
++    // Note: When trying to adding new translation resource into .json file, please check if the same KEY is existing 
++    // in .json files under i18n folder. Because if two parts have the same property, the property value will be overwrited 
++    // by the loaded last part.
++    // for example,
++    // We load app.json first and then load patient.json. "app.json" file contains a property {"Text" : "Test"} 
++    // and "patient.json" file contains property {"Text" : "Overwrite Test"} the "Text" on view will be translated to 
++    // be "Overwrite Test".
++    .factory('appTranslation', ['$log', '$translatePartialLoader', '$translate',
++        function ($log, $translatePartialLoader, $translate) {
++            'use strict';
++            $log.debug('appTranslation.ctor()...');
++
++            var translation = {
++                // part names for modules
++                // AppPart is for the translation of application level, not for a module for a business logic.
++                appPart: 'app',
++                vat: 'vat',
++                cit: 'cit',
++                noPermissionPage: 'noPermissionPage',
++                /// <summary>
++                /// async load translation tables into application for specified part names that required for the view.
++                /// </summary>
++                /// <param name="partNames">part names of array type</param>
++                load: function (partNames) {
++                    if (!angular.isArray(partNames)) {
++                        throw new TypeError('"partNames" should be an array!');
++                    }
++
++                    partNames.forEach(function (name) {
++                        $translatePartialLoader.addPart(name);
++                    });
++
++                    $translate.refresh();
++                },
++                loadAll: function () {
++                    _.map(_.values(translation), function (part) {
++                        if (_.isString(part)) {
++                            $translatePartialLoader.addPart(part);
++                        }
++                    });
++                    $translate.refresh();
++                }
++            };
++            return translation;
++        }
++    ])
++    .controller('AppController', ['$scope', '$log', '$location', '$translate', '$translatePartialLoader',
++        '$window', 'appRoute', 'application', 'appTranslation', '$timeout', '$uibModal', 'loginContext', '$ExceptionlessClient', 'signalRSvc',
++        'exceptionlessServerURL', function ($scope, $log, $location, $translate, $translatePartialLoader, $window, appRoute,
++            application, appTranslation, $timeout, $uibModal, loginContext, $ExceptionlessClient, signalRSvc, exceptionlessServerURL) {
++            'use strict';
++            $log.debug('AppController.ctor()...');
++
++            $scope.localName = loginContext.localName;
++
++            if (!PWC.isNullOrEmpty(exceptionlessServerURL)) {
++                $ExceptionlessClient.config.setUserIdentity(loginContext.userId, loginContext.localName);
++                $ExceptionlessClient.config.useSessions();
++            }
++
++            $scope.$on('$locationChangeSuccess', function () {
++                $scope.actualLocation = $location.path();
++            });
++
++            $scope.$watch(function () { return $location.path() }, function (newLocation) {
++                if ($scope.actualLocation === newLocation) {
++                    // back or forward
++                    $log.debug('Go back or go forward to view browser history. Url: ' + newLocation);
++                }
++            });
++
++            $scope.$on('$stateChangeSuccess',
++                function () {
++                    $log.debug('$stateChangeSuccess: ');
++                });
++
++
++            // publish unbeforeunload event to child scopes
++            $scope.onbeforeunload = function () {
++                $scope.$broadcast(application.events.beforeUnload);
++            };
++
++            $scope.main = function () {
++                $location.path('/main');
++                $location.url('main');
++            };
++
++            $scope.createDemo = function () {
++                $location.path('/accountDemo');
++                $location.url($location.path());
++            };
++
++            appTranslation.loadAll();
++
++            signalRSvc.initialize();
++        }
++    ]);
+\ No newline at end of file
+diff --git a/atms-web/src/main/webapp/app/framework/app-nav/app-nav.html b/atms-web/src/main/webapp/app/framework/app-nav/app-nav.html
+index 99acd90b..5f89d291 100644
+--- a/atms-web/src/main/webapp/app/framework/app-nav/app-nav.html
++++ b/atms-web/src/main/webapp/app/framework/app-nav/app-nav.html
+@@ -20,11 +20,6 @@
+                 <span class="nav-icon-color">{{'MenuVAT' | translate}}</span>
+             </a>
+         </div>
+-        <div class="nav-element-left">
+-            <a ui-sref="listApproval">
+-                <span class="nav-icon-color">{{'鎶ヨ〃瀹℃壒' | translate}}</span>
+-            </a>
+-        </div>
+         <!--<div class="nav-element-left">-->
+             <!--<a ui-sref="summaryDashboard" hover-show="second">-->
+                 <!--<span class="nav-icon-color">{{'MenuTaxAnalysisPlatform' | translate}}</span>-->
+diff --git a/atms-web/src/main/webapp/app/module-part1.js b/atms-web/src/main/webapp/app/module-part1.js
+new file mode 100644
+index 00000000..17307b54
+--- /dev/null
++++ b/atms-web/src/main/webapp/app/module-part1.js
+@@ -0,0 +1,858 @@
++//Common Bind Module Method
++var bindModule = function (thisModule, controllerProvider, compileProvider, filterProvider, provide) {
++
++    thisModule.controller = controllerProvider.register;
++    thisModule.directive = compileProvider.directive;
++    thisModule.filter = filterProvider.register;
++    thisModule.factory = provide.factory;
++    thisModule.service = provide.service;
++
++    return thisModule;
++};
++
++// register common module for shared functionalities for all other feature modules
++var commonModule = angular.module('app.common', ['pascalprecht.translate', 'ngAnimate', 'ui.grid', 'ui.grid.selection', 'ui.grid.selection', 'ui.grid.treeView', 'ui.grid.resizeColumns', 'ui.grid.grouping', 'ui.grid.exporter', 'app.config', 'ui.grid.edit'])
++	.run(['$log', function ($log) {
++	    $log.debug('app.common.run()...');
++	}])
++	// define the script files for lazy loading and method to create depencency map for resovle config in route
++	.provider('scriptDependency', ['version', function (version) {
++	    'use strict';
++	    // Here must add version parameter ?v=***, 
++	    // to solve the problem that the bundle is not refreshed when its content changed.
++
++	    this.commdataimport = [{
++	        url: '/bundles/commdataimport.js?v=' + version,
++	        type: 'text/javascript'
++	    }, {
++	        url: '/bundles/commdataimport.css?v=' + version,
++	        type: 'text/css'
++	    }];
++
++	    this.vat = [{
++	        url: '/bundles/vat.js?v=' + version,
++	        type: 'text/javascript'
++	    }, {
++	        url: '/bundles/vat.css?v=' + version,
++	        type: 'text/css'
++	    }, {
++	        url: '/bundles/vat.less?v=' + version,
++	        type: 'text/css'
++	    }];
++
++	    this.cit = [{
++	        url: '/bundles/cit.js?v=' + version,
++	        type: 'text/javascript'
++	    }, {
++	        url: '/bundles/cit.css?v=' + version,
++	        type: 'text/css'
++	    }, {
++	        url: '/bundles/cit.less?v=' + version,
++	        type: 'text/css'
++	    }];
++
++	    this.noPermissionPage = [{
++	        url: '/bundles/noPermissionPage.js?v=' + version,
++	        type: 'text/javascript'
++	    }, {
++	        url: '/bundles/noPermissionPage.less?v=' + version,
++	        type: 'text/css'
++	    }];
++
++	    this.assetsManage = [{
++	        url: '/bundles/assetsManage.js?v=' + version,
++	        type: 'text/javascript'
++	    }, {
++	        url: '/bundles/assetsManage.css?v=' + version,
++	        type: 'text/css'
++	    }, {
++	        url: '/bundles/assetsManage.less?v=' + version,
++	        type: 'text/css'
++	    }];
++
++	    this.summary = [
++		//    {
++		//    url: '/bundles/summary.js?v=' + version,
++		//    type: 'text/javascript'
++		//},
++		{
++		    url: '/bundles/summary.css?v=' + version,
++		    type: 'text/css'
++		}];
++
++	    this.createDependenciesMap = function (dependencies) {
++	        if (!angular.isArray(dependencies)) {
++	            throw new TypeError('"scriptUrls" should be an array type!');
++	        }
++
++	        var dependenciesMap = {
++	            dependency: ['$q', '$rootScope',
++					function ($q, $rootScope) {
++					    var deferred = $q.defer();
++					    PWC.Loader.load(dependencies, function (hasNewJsLoaded) {
++					        // If has new JavaScript resource loaded, should call $apply, otherwise, 
++					        // should not call it.
++					        if (hasNewJsLoaded) {
++					            $rootScope.$apply(function () {
++					                deferred.resolve();
++					            });
++					        } else {
++					            deferred.resolve();
++					        }
++					    });
++					    return deferred.promise;
++					}
++	            ]
++	        };
++
++	        return dependenciesMap;
++	    };
++
++	    this.$get = function () {
++	        return {
++	            createDependenciesMap: createDependenciesMap,
++	            infrastructure: infrastructure,
++	            vat: vat,
++	            cit: cit,
++	            assetsManage: assetsManage,
++	            noPermissionPageModule: noPermissionPageModule
++	            //subjectCorrespondingInfrastructure: subjectCorrespondingInfrastructure
++	            //subjectCorresponding: subjectCorresponding,
++	            //configurationInfrastructure: configurationInfrastructure,
++	            //declarationFormConfiguration: declarationFormConfiguration
++	        };
++	    };
++	}]);
++
++// register services module
++var webservices = angular.module('app.webservices', ['app.common'])
++	.run(['$log', function ($log) {
++	    $log.debug('app.webservices.run()...');
++	}]);
++
++// register framework module for application framework
++var frameworkModule = angular.module('app.framework', ['app.webservices', 'app.common'])
++	.run(['$log', function ($log) {
++	    $log.debug('app.framework.run()...');
++	}])
++	.config(['$controllerProvider', '$urlRouterProvider', '$compileProvider', '$filterProvider', '$provide', 'scriptDependencyProvider', '$stateProvider',
++		function ($controllerProvider, $urlRouterProvider, $compileProvider, $filterProvider, $provide, scriptDependencyProvider, $stateProvider) {
++		    'use strict';
++		    // this is required to add controller/directive/filter/service after angular bootstrap
++		    bindModule(frameworkModule, $controllerProvider, $compileProvider, $filterProvider, $provide);
++
++		   $stateProvider.state({
++		        name: 'overview',
++		        url: '/overview',
++		        views: {
++		            '@': {
++		                controller: ['$scope', '$stateParams', 'appTranslation',
++							function ($scope, $stateParams, appTranslation) {
++							    appTranslation.load([appTranslation.appPart]);
++							}],
++		                template: '<app-overview servicetypeid="2"></app-overview>',
++		            }
++		        },
++		        deepStateRedirect: true,
++		        sticky: true
++		    });
++
++		    $stateProvider.state({
++		        name: 'notification',
++		        url: '/notification',
++		        views: {
++		            '@': {
++		                controller: ['$scope', '$stateParams', 'appTranslation',
++							function ($scope, $stateParams, appTranslation) {
++							    appTranslation.load([appTranslation.appPart]);
++							}],
++		                template: '<app-push-notification></app-push-notification>',
++		            }
++		        },
++		        deepStateRedirect: true,
++		        sticky: true
++		    });
++
++		    $stateProvider.state({
++		        name: 'overviewVat',
++		        url: '/overview/vat',
++		        views: {
++		            '@': {
++		                controller: ['$scope', '$stateParams', 'appTranslation',
++							function ($scope, $stateParams, appTranslation) {
++                                appTranslation.load([appTranslation.vat,appTranslation.appPart]);
++							}],
++		                template: '<app-overview servicetypeid="2"></app-overview>',
++		            }
++		        },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat),
++		        deepStateRedirect: true,
++		        sticky: true
++		    });
++
++            /*$stateProvider.state({
++                 name: 'overviewAssetsManage',
++                 url: '/overview/assetsManage',
++                 views: {
++                     '@': {
++                         controller: ['$scope', '$stateParams', 'appTranslation',
++                             function ($scope, $stateParams, appTranslation) {
++                                 appTranslation.load([appTranslation.appPart]);
++                             }],
++                         template: '<app-overview servicetypeid="12"></app-overview>',
++                     }
++                 },
++                 deepStateRedirect: true,
++                 sticky: true
++             });
++
++             $stateProvider.state({
++                 name: 'overviewCit',
++                 url: '/overview/cit',
++                 views: {
++                     '@': {
++                         controller: ['$scope', '$stateParams', 'appTranslation',
++                             function ($scope, $stateParams, appTranslation) {
++                                 appTranslation.load([appTranslation.appPart]);
++                             }],
++                         template: '<app-overview servicetypeid="6"></app-overview>',
++                     }
++                 },
++                 deepStateRedirect: true,
++                 sticky: true
++             });
++
++             $stateProvider.state({
++                 name: 'summary',
++                 url: '/summary',
++                 views: {
++                     '@': {
++                         controller: ['$scope', '$stateParams', 'appTranslation',
++                             function ($scope, $stateParams, appTranslation) {
++                                 appTranslation.load([appTranslation.appPart]);
++                             }],
++                         template: '<app-summary></app-summary>',
++                     }
++                 },
++                 resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.summary),
++                 deepStateRedirect: true,
++                 sticky: true
++             });*/
++
++		}
++	]);
++
++// register cache module for application framework
++var cacheModule = angular.module('app.cache', ['app.common'])
++	.run(['$log', 'cacheService', function ($log, cacheService) {
++	    $log.debug('app.cache.run()...');
++
++	}]);
++
++var vatModule = angular.module('app.vat', ['ui.grid', 'ui.grid.selection', 'ui.grid.moveColumns', 'ui.grid.grouping', 'ui.grid.expandable', 'ui.grid.treeView', 'ui.grid.exporter', 'ui.grid.resizeColumns', 'mc.resizer', 'ui.select', 'ngAnimate', 'ngSanitize', 'ui.bootstrap', 'ui.grid.edit', 'perfect_scrollbar', 'dx', 'ui.grid.pinning',])
++	.run(['$log', function ($log) {
++	    $log.debug('app.vat.run()...');
++	}])
++	.config(['$controllerProvider', '$urlRouterProvider', '$compileProvider', '$filterProvider', '$provide', '$stateProvider', 'uiSelectConfig', 'scriptDependencyProvider',
++		function ($controllerProvider, $urlRouterProvider, $compileProvider, $filterProvider, $provide, $stateProvider, uiSelectConfig, scriptDependencyProvider) {
++		    'use strict';
++		    // this is required to add controller/directive/filter/service after angular bootstrap
++		    bindModule(vatModule, $controllerProvider, $compileProvider, $filterProvider, $provide);
++
++		    uiSelectConfig.theme = 'select2';
++
++		    $stateProvider.state({
++		        name: 'vat',
++		        url: '/vat',
++		        cache: false,
++		        views: {
++		            '@': {
++		                controller: ['$scope', '$stateParams', 'appTranslation',
++							function ($scope, $stateParams, appTranslation) {
++							    appTranslation.load([appTranslation.vat]);
++							}],
++		                template: '<vat-layout></vat-layout>',
++		            }
++		        },
++		        resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat),
++		        deepStateRedirect: true,
++		        sticky: true
++		    });
++
++		    $stateProvider.state({
++		        name: 'vat.importData',
++		        url: '/importData',
++		        views: {
++		            '@vat': {
++		                controller: ['$scope', '$stateParams', 'appTranslation',
++										function ($scope, $stateParams, appTranslation) {
++										    appTranslation.load([appTranslation.vat]);
++										}],
++		                template: '<vat-import-layout></vat-import-layout>',
++		            }
++		        },
++		        resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat),
++		        deepStateRedirect: true,
++		        sticky: true
++		    });
++
++
++		    $stateProvider.state({
++		        name: 'vat.importData.balanceSheet',
++		        url: '/balanceSheet',
++		        views: {
++		            '@vat.importData': {
++		                controller: ['$scope', '$stateParams', 'appTranslation',
++										function ($scope, $stateParams, appTranslation) {
++										    appTranslation.load([appTranslation.vat]);
++										}],
++		                template: '<vat-import-trial-balance></vat-import-trial-balance>',
++		            }
++		        },
++		        resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat),
++		        deepStateRedirect: true,
++		        sticky: true
++		    });
++
++		    $stateProvider.state({
++		        name: 'vat.importData.journalEntry',
++		        url: '/journalEntry',
++		        views: {
++		            '@vat.importData': {
++		                controller: ['$scope', '$stateParams', 'appTranslation',
++										function ($scope, $stateParams, appTranslation) {
++										    appTranslation.load([appTranslation.vat]);
++										}],
++		                template: '<vat-import-journal-entry></vat-import-journal-entry>',
++		            }
++		        },
++		        resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat),
++		        deepStateRedirect: true,
++		        sticky: true
++		    });
++
++		    $stateProvider.state({
++		        name: 'vat.importData.erpData',
++		        url: '/erpData',
++		        views: {
++		            '@vat.importData': {
++		                controller: ['$scope', '$stateParams', 'appTranslation',
++										function ($scope, $stateParams, appTranslation) {
++										    appTranslation.load([appTranslation.vat]);
++										}],
++		                template: '<vat-import-erp></vat-import-erp>',
++		            }
++		        },
++		        resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat),
++		        deepStateRedirect: true,
++		        sticky: true
++		    });
++
++		    $stateProvider.state({
++		        name: 'vat.importData.outputInvoice',
++		        url: '/outputInvoice',
++		        views: {
++		            '@vat.importData': {
++		                controller: ['$scope', '$stateParams', 'appTranslation',
++										function ($scope, $stateParams, appTranslation) {
++										    appTranslation.load([appTranslation.vat]);
++										}],
++		                template: '<vat-import-output-invoice></vat-import-output-invoice>',
++		            }
++		        },
++		        resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat),
++		        deepStateRedirect: true,
++		        sticky: true
++		    });
++
++		    $stateProvider.state({
++		        name: 'vat.importData.inputInvoice',
++		        url: '/inputInvoice',
++		        views: {
++		            '@vat.importData': {
++		                controller: ['$scope', '$stateParams', 'appTranslation',
++										function ($scope, $stateParams, appTranslation) {
++										    appTranslation.load([appTranslation.vat]);
++										}],
++		                template: '<vat-import-income-invoice></vat-import-income-invoice>',
++		            }
++		        },
++		        resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat),
++		        deepStateRedirect: true,
++		        sticky: true
++		    });
++
++		    $stateProvider.state({
++		        name: 'vat.importData.customInvoice',
++		        url: '/customInvoice',
++		        views: {
++		            '@vat.importData': {
++		                controller: ['$scope', '$stateParams', 'appTranslation',
++										function ($scope, $stateParams, appTranslation) {
++										    appTranslation.load([appTranslation.vat]);
++										}],
++		                template: '<vat-import-custom-invoice></vat-import-custom-invoice>',
++		            }
++		        },
++		        resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat),
++		        deepStateRedirect: true,
++		        sticky: true
++		    });
++
++		    $stateProvider.state({
++		        name: 'vat.importData.voucherMapping',
++		        url: '/voucherMapping',
++		        views: {
++		            '@vat.importData': {
++		                controller: ['$scope', '$stateParams', 'appTranslation',
++										function ($scope, $stateParams, appTranslation) {
++										    appTranslation.load([appTranslation.vat]);
++										}],
++		                template: '<vat-voucher-mapping></vat-voucher-mapping>',
++		            }
++		        },
++		        resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat),
++		        deepStateRedirect: true,
++		        sticky: true
++		    });
++
++		    $stateProvider.state({
++		        name: 'vat.importData.invoiceMapping',
++		        url: '/invoiceMapping',
++		        views: {
++		            '@vat.importData': {
++		                controller: ['$scope', '$stateParams', 'appTranslation',
++										function ($scope, $stateParams, appTranslation) {
++										    appTranslation.load([appTranslation.vat]);
++										}],
++		                template: '<vat-invoice-mapping></vat-invoice-mapping>',
++		            }
++		        },
++		        resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat),
++		        deepStateRedirect: true,
++		        sticky: true
++		    });
++
++		    $stateProvider.state({
++		        name: 'vat.importData.auditAdjust',
++		        url: '/auditAdjust',
++		        views: {
++		            '@vat.importData': {
++		                controller: ['$scope', '$stateParams', 'appTranslation',
++										function ($scope, $stateParams, appTranslation) {
++										    appTranslation.load([appTranslation.vat]);
++										}],
++		                template: '<vat-audit-adjust></vat-audit-adjust>',
++		            }
++		        },
++		        resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat),
++		        deepStateRedirect: true,
++		        sticky: true
++		    });
++
++		    $stateProvider.state({
++		        name: 'vat.previewData',
++		        url: '/previewData',
++		        views: {
++		            '@vat': {
++		                controller: ['$scope', '$stateParams', 'appTranslation',
++													function ($scope, $stateParams, appTranslation) {
++													    appTranslation.load([appTranslation.vat]);
++													}],
++		                template: '<vat-import-layout></vat-import-layout>',
++		            }
++		        },
++		        resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat),
++		        deepStateRedirect: true,
++		        sticky: true
++		    });
++
++		    $stateProvider.state({
++		        name: 'vat.previewData.balanceSheet',
++		        url: '/balanceSheet',
++		        views: {
++		            '@vat.previewData': {
++		                controller: ['$scope', '$stateParams', 'appTranslation',
++										function ($scope, $stateParams, appTranslation) {
++										    appTranslation.load([appTranslation.vat]);
++										}],
++		                template: '<vat-preview-balance-sheet></vat-preview-balance-sheet>',
++		            }
++		        },
++		        resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat),
++		        deepStateRedirect: true,
++		        sticky: true
++		    });
++
++		    $stateProvider.state({
++		        name: 'vat.previewData.accountVoucher',
++		        url: '/accountVoucher',
++		        views: {
++		            '@vat.previewData': {
++		                controller: [
++							'$scope', '$stateParams', 'appTranslation',
++							function ($scope, $stateParams, appTranslation) {
++							    appTranslation.load([appTranslation.vat]);
++							}
++		                ],
++		                template: '<vat-preview-account-voucher></vat-preview-account-voucher>'
++		            }
++		        },
++		        resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat),
++		        deepStateRedirect: true,
++		        sticky: true
++		    });
++
++		    $stateProvider.state({
++		        name: 'vat.previewData.outputInvoice',
++		        url: '/outputInvoice',
++		        views: {
++		            '@vat.previewData': {
++		                controller: ['$scope', '$stateParams', 'appTranslation',
++										function ($scope, $stateParams, appTranslation) {
++										    appTranslation.load([appTranslation.vat]);
++										}],
++		                template: '<vat-preview-output-invoice></vat-preview-output-invoice>',
++		            }
++		        },
++		        resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat),
++		        deepStateRedirect: true,
++		        sticky: true
++		    });
++
++		    $stateProvider.state({
++		        name: 'vat.previewData.inputInvoice',
++		        url: '/inputInvoice',
++		        views: {
++		            '@vat.previewData': {
++		                controller: ['$scope', '$stateParams', 'appTranslation',
++										function ($scope, $stateParams, appTranslation) {
++										    appTranslation.load([appTranslation.vat]);
++										}],
++		                template: '<vat-preview-input-invoice></vat-preview-input-invoice>',
++		            }
++		        },
++		        resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat),
++		        deepStateRedirect: true,
++		        sticky: true
++		    });
++
++		    $stateProvider.state({
++		        name: 'vat.previewData.customInvoice',
++		        url: '/customInvoice',
++		        views: {
++		            '@vat.previewData': {
++		                controller: ['$scope', '$stateParams', 'appTranslation',
++										function ($scope, $stateParams, appTranslation) {
++										    appTranslation.load([appTranslation.vat]);
++										}],
++		                template: '<vat-preview-custom-invoice-sheet></vat-preview-custom-invoice-sheet>',
++		            }
++		        },
++		        resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat),
++		        deepStateRedirect: true,
++		        sticky: true
++		    });
++
++		    $stateProvider.state({
++		        name: 'vat.reductionData',
++		        url: '/reductionData',
++		        views: {
++		            '@vat': {
++		                controller: ['$scope', '$stateParams', 'appTranslation',
++										function ($scope, $stateParams, appTranslation) {
++										    appTranslation.load([appTranslation.vat]);
++										}],
++		                template: '<vat-import-layout></vat-import-layout>',
++		            }
++		        },
++		        resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat),
++		        deepStateRedirect: true,
++		        sticky: true
++		    });
++
++		    // $stateProvider.state({
++		    //     name: 'vat.reductionData.accountMapping',
++		    //     url: '/accountMapping',
++		    //     views: {
++		    //         '@vat.reductionData': {
++		    //             controller: ['$scope', '$stateParams', 'appTranslation',
++			// 							function ($scope, $stateParams, appTranslation) {
++			// 							    appTranslation.load([appTranslation.vat]);
++			// 							}],
++		    //             template: '<vat-account-mapping></vat-account-mapping>',
++		    //         }
++		    //     },
++		    //     resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat),
++		    //     deepStateRedirect: true,
++		    //     sticky: true
++		    // });
++			//
++		    // $stateProvider.state({
++		    //     name: 'vat.reductionData.goodsMapping',
++		    //     url: '/goodsMapping',
++		    //     views: {
++		    //         '@vat.reductionData': {
++		    //             controller: ['$scope', '$stateParams', 'appTranslation',
++			// 							function ($scope, $stateParams, appTranslation) {
++			// 							    appTranslation.load([appTranslation.vat]);
++			// 							}],
++		    //             template: '<vat-goods-mapping></vat-goods-mapping>',
++		    //         }
++		    //     },
++		    //     resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat),
++		    //     deepStateRedirect: true,
++		    //     sticky: true
++		    // });
++
++		    $stateProvider.state({
++		        name: 'vat.reductionData.caculateData',
++		        url: '/caculateData',
++		        views: {
++		            '@vat.reductionData': {
++		                controller: ['$scope', '$stateParams', 'appTranslation',
++										function ($scope, $stateParams, appTranslation) {
++										    appTranslation.load([appTranslation.vat]);
++										}],
++		                template: '<vat-caculate-data></vat-caculate-data>',
++		            }
++		        },
++		        resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat),
++		        deepStateRedirect: true,
++		        sticky: true
++		    });
++
++		    $stateProvider.state({
++		        name: 'vat.reductionData.inputInvoice',
++		        url: '/inputInvoice',
++		        views: {
++		            '@vat.reductionData': {
++		                controller: ['$scope', '$stateParams', 'appTranslation',
++										function ($scope, $stateParams, appTranslation) {
++										    appTranslation.load([appTranslation.vat]);
++										}],
++		                template: '<p>inputInvoice</p>',
++		            }
++		        },
++		        resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat),
++		        deepStateRedirect: true,
++		        sticky: true
++		    });
++
++		    $stateProvider.state({
++		        name: 'vat.reductionData.unbilledInvoice',
++		        url: '/unbilledInvoice',
++		        views: {
++		            '@vat.reductionData': {
++		                controller: ['$scope', '$stateParams', 'appTranslation',
++										function ($scope, $stateParams, appTranslation) {
++										    appTranslation.load([appTranslation.vat]);
++										}],
++		                template: '<vat-unbilled-invoice></vat-unbilled-invoice>',
++		            }
++		        },
++		        resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat),
++		        deepStateRedirect: true,
++		        sticky: true
++		    });
++
++
++		    $stateProvider.state({
++		        name: 'vat.generateReport',
++		        url: '/generateReport',
++		        views: {
++		            '@vat': {
++		                controller: ['$scope', '$stateParams', 'appTranslation',
++										function ($scope, $stateParams, appTranslation) {
++										    $scope.isFromTopMenu = true;
++										    appTranslation.load([appTranslation.vat]);
++										}],
++		                template: '<vat-report-layout></vat-report-layout>',
++		            }
++		        },
++		        resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat),
++		        deepStateRedirect: true,
++		        sticky: true
++		    });
++
++		    $stateProvider.state({
++		        name: 'vat.generateReport.reportView',
++		        url: '/reportView?{id:string}&{templateid:string}&{name:string}&{templatecode:string}',
++		        views: {
++		            '@vat.generateReport': {
++		                controller: ['$scope', '$stateParams', 'appTranslation',
++										function ($scope, $stateParams, appTranslation) {
++										    $scope.reportId = $stateParams.id;
++										    $scope.templateId = $stateParams.templateid;
++										    $scope.templateName = $stateParams.name;
++										    $scope.templateCode = $stateParams.templatecode;
++										    appTranslation.load([appTranslation.vat]);
++										}],
++		                template: '<vat-report-view report-id="reportId" template-id="templateId" template-name="templateName" template-code="templateCode" ></vat-report-view>',
++		            }
++		        },
++		        resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat),
++		        deepStateRedirect: true,
++		        sticky: true
++		    });
++
++
++		    /**********a beautiful separated line for analyzeReport*********/
++		    $stateProvider.state({
++		        name: 'vat.analyzeLayout',
++		        url: '/analyzeLayout',
++		        views: {
++		            '@vat': {
++		                controller: ['$scope', '$stateParams', 'appTranslation',
++										function ($scope, $stateParams, appTranslation) {
++										    appTranslation.load([appTranslation.vat]);
++										}],
++		                template: '<vat-analysis-menu></vat-analysis-menu>',
++
++		            }
++		        },
++		        resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat),
++		        deepStateRedirect: true,
++		        sticky: true
++		    });
++
++		    $stateProvider.state({
++		        name: 'vat.analyzeLayout.analyzeReport',
++		        url: '/analyzeReport',
++		        views: {
++		            '@vat.analyzeLayout': {
++		                controller: ['$scope', '$stateParams', 'appTranslation',
++										function ($scope, $stateParams, appTranslation) {
++										    appTranslation.load([appTranslation.vat]);
++										}],
++		                template: '<vat-model-analysis></vat-model-analysis>',
++
++		            }
++		        },
++		        resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat),
++		        deepStateRedirect: true,
++		        sticky: true
++		    });
++
++		    $stateProvider.state({
++		        name: 'vat.analyzeLayout.vatTaxDifference',
++		        url: '/vatTaxDifference',
++		        views: {
++		            '@vat.analyzeLayout': {
++		                controller: ['$scope', '$stateParams', 'appTranslation',
++										function ($scope, $stateParams, appTranslation) {
++										    appTranslation.load([appTranslation.vat]);
++										}],
++		                template: '<vat-tax-difference></vat-tax-difference>',
++
++		            }
++		        },
++		        resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat),
++		        deepStateRedirect: true,
++		        sticky: true
++		    });
++		    $stateProvider.state({
++		        name: 'vat.analyzeReport',
++		        url: '/analyzeReport',
++		        views: {
++		            '@vat': {
++		                controller: ['$scope', '$stateParams', 'appTranslation',
++										function ($scope, $stateParams, appTranslation) {
++										    appTranslation.load([appTranslation.vat]);
++										}],
++		                template: '<vat-model-analysis></vat-model-analysis>',
++
++		            }
++		        },
++		        resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat),
++		        deepStateRedirect: true,
++		        sticky: true
++		    });
++
++		    $stateProvider.state({
++		        name: 'vat.analyzeReport.dataSummary',
++		        url: '/dataSummary',
++		        views: {
++		            '@vat': {
++		                controller: ['$scope', '$stateParams', 'appTranslation',
++										function ($scope, $stateParams, appTranslation) {
++										    appTranslation.load([appTranslation.vat]);
++										}],
++		                template: '<vat-data-summary></vat-data-summary>',
++		            }
++		        },
++		        resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat),
++		        deepStateRedirect: true,
++		        sticky: true
++		    });
++
++		    $stateProvider.state({
++		        name: 'vat.analyzeReport.vatAnalysis',
++		        url: '/vatAnalysis',
++		        views: {
++		            '@vat': {
++		                controller: ['$scope', '$stateParams', 'appTranslation',
++										function ($scope, $stateParams, appTranslation) {
++										    appTranslation.load([appTranslation.vat]);
++										}],
++		                template: '<vat-vat-analysis></vat-vat-analysis>',
++		            }
++		        },
++		        resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat),
++		        deepStateRedirect: true,
++		        sticky: true
++		    });
++
++		    $stateProvider.state({
++		        name: 'vat.analyzeReport.financeTargetAnalysis',
++		        url: '/financeTargetAnalysis',
++		        views: {
++		            '@vat': {
++		                controller: ['$scope', '$stateParams', 'appTranslation',
++										function ($scope, $stateParams, appTranslation) {
++										    appTranslation.load([appTranslation.vat]);
++										}],
++		                template: '<vat-finance-target-analysis></vat-finance-target-analysis>',
++		            }
++		        },
++		        resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat),
++		        deepStateRedirect: true,
++		        sticky: true
++		    });
++
++		    $stateProvider.state({
++		        name: 'vat.analyzeReport.vatModelAnalysis',
++		        url: '/vatModelAnalysis',
++		        views: {
++		            '@vat': {
++		                controller: ['$scope', '$stateParams', 'appTranslation',
++										function ($scope, $stateParams, appTranslation) {
++										    appTranslation.load([appTranslation.vat]);
++										}],
++		                template: '<vat-model-analysis></vat-model-analysis>',
++		            }
++		        },
++		        resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat),
++		        deepStateRedirect: true,
++		        sticky: true
++		    });
++
++		    /**********the end of a beautiful separated line for analyzeReport*********/
++
++		    $stateProvider.state({
++		        name: 'vat.devGrid',
++		        url: '/devGrid',
++		        views: {
++		            '@vat': {
++		                controller: ['$scope', '$stateParams', 'appTranslation',
++										function ($scope, $stateParams, appTranslation) {
++										    appTranslation.load([appTranslation.vat]);
++										}],
++		                template: '<dev-grid></dev-grid>',
++		            }
++		        },
++		        resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat),
++		        deepStateRedirect: true,
++		        sticky: true
++		    });
++		}]);
+\ No newline at end of file
+diff --git a/atms-web/src/main/webapp/app/module-part2.js b/atms-web/src/main/webapp/app/module-part2.js
+new file mode 100644
+index 00000000..bb6d7a84
+--- /dev/null
++++ b/atms-web/src/main/webapp/app/module-part2.js
+@@ -0,0 +1,957 @@
++锘�//Common Bind Module Method
++var bindModule = function (thisModule, controllerProvider, compileProvider, filterProvider, provide) {
++
++    thisModule.controller = controllerProvider.register;
++    thisModule.directive = compileProvider.directive;
++    thisModule.filter = filterProvider.register;
++    thisModule.factory = provide.factory;
++    thisModule.service = provide.service;
++
++    return thisModule;
++};
++
++var invoiceModule = angular.module('app.invoice', ['ui.grid', 'ui.grid.selection', 'ui.grid.moveColumns', 'ui.grid.grouping', 'ui.grid.expandable', 'ui.grid.treeView', 'ui.grid.exporter', 'ui.grid.resizeColumns', 'mc.resizer', 'ui.select', 'ngSanitize', 'ui.grid.edit', 'perfect_scrollbar', 'dx', 'ui.grid.pinning'])
++    .run(['$log', function ($log) {
++        $log.debug('app.invoice.run()...');
++    }])
++    .config(['$controllerProvider', '$urlRouterProvider', '$compileProvider', '$filterProvider', '$provide', '$stateProvider', 'uiSelectConfig', 'scriptDependencyProvider',
++        function ($controllerProvider, $urlRouterProvider, $compileProvider, $filterProvider, $provide, $stateProvider, uiSelectConfig, scriptDependencyProvider) {
++            'use strict';
++            // this is required to add controller/directive/filter/service after angular bootstrap
++            bindModule(invoiceModule, $controllerProvider, $compileProvider, $filterProvider, $provide);
++
++            uiSelectConfig.theme = 'select2';
++
++            //鍙戠エ绠$悊妗嗘灦 
++            $stateProvider.state({
++                name: 'invoiceManagement',
++                url: '/invoiceManagement',
++                views: {
++                    '@': {
++                        controller: ['$scope', '$stateParams', 'appTranslation', '$state',
++                                        function ($scope, $stateParams, appTranslation, $state) {
++                                            appTranslation.load([appTranslation.vat]);
++                                            $scope.state = $state;
++                                        }],
++                        template: '<invoice-manage-infrastructure state="state"></invoice-manage-infrastructure>'
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++            //鍙戠エ绠$悊涓昏鐣岄潰
++            $stateProvider.state('invoiceManagement.main', {
++                url: "/main",
++                sticky: true,
++                dsr: true,
++                views: {
++                    'main-view@invoiceManagement': {
++                        template: '<invoice-manage-main></invoice-manage-main>'
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat)
++            });
++
++            //鍙戠エ绠$悊涓婁紶index
++            $stateProvider.state('invoiceManagement.uploadIndex', {
++                url: "/main/uploadIndex",
++                sticky: true,
++                dsr: true,
++                views: {
++                    'uploadIndex-view@invoiceManagement': {
++
++                        template: '<invoice-manage-main-upload-index></invoice-manage-main-upload-index>'
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat)
++            });
++            //鍙戠エ绠$悊涓婁紶paper invoice
++            $stateProvider.state('invoiceManagement.uploadPaperInvoice', {
++                url: "/main/uploadPaperInvoice",
++                sticky: true,
++                dsr: true,
++                views: {
++                    'uploadPaperInvoice-view@invoiceManagement': {
++
++                        template: '<invoice-manage-main-upload-paper-invoice></invoice-manage-main-upload-paper-invoice>'
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat)
++            });
++
++            //鍙戠エ绠$悊涓婁紶electonic invoice
++            $stateProvider.state('invoiceManagement.uploadElecInvoice', {
++                url: "/main/uploadElecInvoice",
++                sticky: true,
++                dsr: true,
++                views: {
++                    'uploadElecInvoice-view@invoiceManagement': {
++
++                        template: '<invoice-manage-main-upload-electronic-invoice></invoice-manage-main-upload-electronic-invoice>'
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat)
++            });
++
++            //鍙戠エ绠$悊涓婁紶scan invoice
++            $stateProvider.state('invoiceManagement.uploadScanInvoice', {
++                url: "/main/uploadScanInvoice",
++                sticky: true,
++                dsr: true,
++                views: {
++                    'uploadScanInvoice-view@invoiceManagement': {
++
++                        template: '<invoice-manage-main-upload-scan-invoice></invoice-manage-main-upload-scan-invoice>'
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat)
++            });
++
++
++            //鍙戠エ绠$悊鏈敹绁ㄨ璇�
++            $stateProvider.state('invoiceManagement.noInvoiceVerify', {
++                url: "/noInvoiceVerify",
++                sticky: true,
++                dsr: true,
++                views: {
++                    'noInvoiceVerify-view@invoiceManagement': {
++                        template: '<invoice-manage-verify></invoice-manage-verify>'
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat)
++            });
++
++
++            //寮€绁ㄧ鐞�
++            $stateProvider.state('invoiceManagement.billingManage',
++            {
++                url: "/billingManage",
++                sticky: true,
++                dsr: true,
++                views: {
++                    'billingManage-view@invoiceManagement': {
++                        template: '<iframe id="dfiframe" src="/app/df/code/pages/PreViewFapiao.html" scrolling="auto" height="100%" style="border:none" width="100%"></iframe>'
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat)
++            });
++
++
++
++            //鍙戠エ鏌ヨ
++            $stateProvider.state('invoiceManagement.invoiceQuery',
++            {
++                url: "/invoiceQuery",
++                sticky: true,
++                dsr: true,
++                views: {
++                    'invoiceQuery-view@invoiceManagement': {
++                        template: '<iframe id="dfiframe" src="/app/df/code/pages/FapiaoInqury.html" scrolling="auto" height="100%" style="border:none" width="100%"></iframe>'
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat)
++            });
++
++
++            //鍙戠エ绠$悊寰呴€€绁ㄧ鐞�
++            $stateProvider.state('invoiceManagement.pendingRefundInvoice', {
++                url: "/pendingRefundInvoice",
++                sticky: true,
++                dsr: true,
++                views: {
++                    'pendingRefundInvoice-view@invoiceManagement': {
++                        template: '<invoice-manage-refund></invoice-manage-refund>'
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat)
++            });
++
++            //鍙戠エ绠$悊鍏宠仈绠$悊
++            $stateProvider.state('invoiceManagement.mapInvoice', {
++                url: "/mapInvoice",
++                sticky: true,
++                dsr: true,
++                views: {
++                    'mapInvoice-view@invoiceManagement': {
++                        template: '<invoice-manage-map></invoice-manage-map>'
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat)
++            });
++
++
++            //鍙戠エ绠$悊妗嗘灦 
++            $stateProvider.state({
++                name: 'outputInvoiceManage',
++                url: '/outputInvoiceManage',
++                views: {
++                    '@': {
++                        controller: ['$scope', '$stateParams', 'appTranslation', '$state',
++                                        function ($scope, $stateParams, appTranslation, $state) {
++                                            appTranslation.load([appTranslation.vat]);
++                                            $scope.state = $state;
++                                        }],
++                        template: '<output-invoice-infrastructure state="state"></output-invoice-infrastructure>'
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++            //鍙戠エ绠$悊涓昏鐣岄潰
++            $stateProvider.state('outputInvoiceManage.imported', {
++                url: "/imported",
++                sticky: false,
++                dsr: true,
++                views: {
++                    'outputInvoiceImported-view@outputInvoiceManage': {
++                        template: '<output-invoice-imported></output-invoice-imported>'
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat)
++            });
++
++            //鍙戠エ绠$悊缂栬緫鐣岄潰
++            $stateProvider.state('outputInvoiceManage.outputInvoiceEdit', {
++                url: "/outputInvoiceEdit",
++                sticky: false,
++                dsr: true,
++                views: {
++                    'outputInvoiceEdit-view@outputInvoiceManage': {
++                        template: '<output-invoice-edit></output-invoice-edit>'
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat)
++            });
++
++            //鍙戠エ绠$悊宸叉墦鍗癇D-USER鍙戠エ
++            $stateProvider.state('outputInvoiceManage.issuedInvoiceBdView', {
++                url: "/issuedInvoiceBdView",
++                sticky: false,
++                dsr: true,
++                views: {
++                    'issuedInvoiceBd-view@outputInvoiceManage': {
++                        template: '<issued-invoice-bd-view></issued-invoice-bd-view>'
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat)
++            });
++
++            $stateProvider.state('outputInvoiceManage.bdViewByVin', {
++                url: "/bdViewByVin",
++                sticky: false,
++                dsr: true,
++                views: {
++                    'bdViewByVin-view@outputInvoiceManage': {
++                        template: '<bd-view-by-vin></bd-view-by-vin>'
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat)
++            });
++
++
++            //GD宸插紑鍏峰彂绁ㄧ壒娈婂鐞�
++            $stateProvider.state('outputInvoiceManage.issuedInvoiceSpecial', {
++                url: "/issuedInvoiceSpecial",
++                sticky: false,
++                dsr: true,
++                views: {
++                    'issuedInvoiceSpecial-view@outputInvoiceManage': {
++                        template: '<special-vat-invoice></special-vat-invoice>'
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat)
++            });
++            //GD宸插紑鍏峰彂绁ㄧ壒娈婂鐞�
++            $stateProvider.state('outputInvoiceManage.GDViewByVIN', {
++                url: "/GDViewByVIN",
++                sticky: false,
++                dsr: true,
++                views: {
++                    'GDViewByVIN-view@outputInvoiceManage': {
++                        template: '<gd-view-by-vin></gd-view-by-vin>'
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat)
++            });
++
++            $stateProvider.state('outputInvoiceManage.outputReconciliationOverview', {
++                url: "/outputReconciliationOverview",
++                sticky: false,
++                dsr: true,
++                views: {
++                    'output-reconciliation-overview@outputInvoiceManage': {
++                        template: '<output-reconciliation-overview></output-reconciliation-overview>'
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat)
++            });
++
++            $stateProvider.state('outputInvoiceManage.reconciliationRuleConfig', {
++                url: "/reconciliationRuleConfig",
++                sticky: false,
++                dsr: true,
++                views: {
++                    'reconciliation-rule-config@outputInvoiceManage': {
++                        template: '<reconciliation-rule-config></reconciliation-rule-config>'
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat)
++            });
++
++            $stateProvider.state('outputInvoiceManage.outputReconciliationConfiguration', {
++                url: "/outputReconciliationConfiguration",
++                sticky: false,
++                dsr: true,
++                views: {
++                    'output-reconciliation-configuration@outputInvoiceManage': {
++                        template: '<output-reconciliation-configuration></output-reconciliation-configuration>'
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat)
++            });
++
++            $stateProvider.state('outputInvoiceManage.taxControlDisk', {
++                url: "/taxControlDisk",
++                sticky: false,
++                dsr: true,
++                views: {
++                    'tax-control-disk@outputInvoiceManage': {
++                        template: '<tax-control-disk></tax-control-disk>'
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat)
++            });
++
++            ////GD宸插紑鍏峰彂绁ㄨ鎯�
++            //$stateProvider.state('outputInvoiceManage.issuedInvoiceSpecialDetail', {
++            //    url: "/issuedInvoiceSpecialDetail/{gdid}/{parentPage}",
++            //    sticky: true,
++            //    dsr: true,
++            //    //params: {
++            //    //    GDID: null,
++            //    //    parentPage:null
++            //    //},              
++            //    views: {
++            //        'issuedInvoiceSpecialDetail-view@outputInvoiceManage': {
++            //            controller: ['$scope', '$stateParams', 'appTranslation',
++            //                          function ($scope, $stateParams, appTranslation) {
++            //                              console.log($stateParams.gdid);
++            //                              $scope.gdInvoiceID = $stateParams.gdid;
++            //                              $scope.parentPage = $stateParams.parentPage;
++            //                          }],
++            //            template: '<invoice-detail-vehicle></invoice-detail-vehicle>'
++
++            //        }
++            //    },
++            //    resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat)
++            //});
++            //鍙戠エ绠$悊宸叉墦鍗癎D-BD鍙戠エ
++            $stateProvider.state('outputInvoiceManage.issuedInvoiceGdView', {
++                url: "/issuedInvoiceGdView",
++                sticky: false,
++                dsr: true,
++                views: {
++                    'issuedInvoiceGd-view@outputInvoiceManage': {
++                        template: '<issued-invoice-gd-view></issued-invoice-gd-view>'
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat)
++            });
++
++
++
++            //鍙戠エ绠$悊缂栬緫鐣岄潰
++            $stateProvider.state('outputInvoiceManage.gdInvoicePrint', {
++                url: "/gdInvoicePrint",
++                sticky: false,
++                params: { "invoiceList": null },
++                dsr: true,
++                views: {
++                    'gdInvoicePrint-view@outputInvoiceManage': {
++                        template: '<gd-invoice-print></gd-invoice-print>'
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat)
++            });
++
++
++            //鍙戠エ绠$悊缂栬緫鐣岄潰
++            $stateProvider.state('outputInvoiceManage.importShipmentList', {
++                url: "/importShipmentList",
++                sticky: false,
++                dsr: true,
++                views: {
++                    'importShipment-view@outputInvoiceManage': {
++                        template: '<import-shipment-list></import-shipment-list>'
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat)
++            });
++
++        }]);
++
++var citModule = angular.module('app.cit', ['ui.grid', 'ui.grid.selection', 'ui.grid.moveColumns', 'ui.grid.grouping', 'ui.grid.expandable', 'ui.grid.treeView', 'ui.grid.exporter', 'ui.grid.resizeColumns', 'mc.resizer', 'ui.select', 'ngAnimate', 'ngSanitize', 'ui.bootstrap', 'ui.grid.edit', 'perfect_scrollbar', 'dx', 'ui.grid.pinning'])
++    .run(['$log', function ($log) {
++        $log.debug('app.cit.run()...');
++    }])
++    .config(['$controllerProvider', '$urlRouterProvider', '$compileProvider', '$filterProvider', '$provide', '$stateProvider', 'uiSelectConfig', 'scriptDependencyProvider',
++        function ($controllerProvider, $urlRouterProvider, $compileProvider, $filterProvider, $provide, $stateProvider, uiSelectConfig, scriptDependencyProvider) {
++            'use strict';
++            // this is required to add controller/directive/filter/service after angular bootstrap
++            bindModule(citModule, $controllerProvider, $compileProvider, $filterProvider, $provide);
++
++            uiSelectConfig.theme = 'select2';
++
++            $urlRouterProvider.when('/cit', '/cit/importData/balanceSheet');
++
++            $urlRouterProvider.when('/cit/importData', '/cit/importData/balanceSheet');
++
++            $urlRouterProvider.when('/cit/previewData', '/cit/previewData/balanceSheet');
++
++            $urlRouterProvider.when('/cit/reductionData', 'cit/reductionData/calculateData');
++
++            $urlRouterProvider.when('/cit/analyzeReport', 'cit/analyzeReport/citModelAnalysis');
++
++            $stateProvider.state({
++                name: 'cit',
++                url: '/cit',
++                cache: false,
++                views: {
++                    '@': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                            function ($scope, $stateParams, appTranslation) {
++                                appTranslation.load([appTranslation.cit]);
++                            }],
++                        template: '<cit-layout></cit-layout>',
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.cit),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++            $stateProvider.state({
++                name: 'cit.importData',
++                url: '/importData',
++                views: {
++                    '@cit': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                                        function ($scope, $stateParams, appTranslation) {
++                                            appTranslation.load([appTranslation.cit]);
++                                        }],
++                        template: '<cit-import-layout></cit-import-layout>',
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.cit),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++
++            $stateProvider.state({
++                name: 'cit.importData.balanceSheet',
++                url: '/balanceSheet',
++                views: {
++                    '@cit.importData': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                                        function ($scope, $stateParams, appTranslation) {
++                                            appTranslation.load([appTranslation.cit]);
++                                        }],
++                        template: '<cit-import-trial-balance></cit-import-trial-balance>',
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.cit),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++            $stateProvider.state({
++                name: 'cit.importData.assetList',
++                url: '/assetList',
++                views: {
++                    '@cit.importData': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                                        function ($scope, $stateParams, appTranslation) {
++                                            appTranslation.load([appTranslation.cit]);
++                                        }],
++                        template: '<cit-import-asset></cit-import-asset>'
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.cit),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++            $stateProvider.state({
++                name: 'cit.importData.journalEntry',
++                url: '/journalEntry',
++                views: {
++                    '@cit.importData': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                                        function ($scope, $stateParams, appTranslation) {
++                                            appTranslation.load([appTranslation.cit]);
++                                        }],
++                        template: '<cit-import-journal-entry></cit-import-journal-entry>',
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.cit),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++            $stateProvider.state({
++                name: 'cit.importData.erpData',
++                url: '/erpData',
++                views: {
++                    '@cit.importData': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                                        function ($scope, $stateParams, appTranslation) {
++                                            appTranslation.load([appTranslation.cit]);
++                                        }],
++                        template: '<cit-import-erp></cit-import-erp>',
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.cit),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++            $stateProvider.state({
++                name: 'cit.importData.outputInvoice',
++                url: '/outputInvoice',
++                views: {
++                    '@cit.importData': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                                        function ($scope, $stateParams, appTranslation) {
++                                            appTranslation.load([appTranslation.cit]);
++                                        }],
++                        template: '<cit-import-output-invoice></cit-import-output-invoice>',
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.cit),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++            $stateProvider.state({
++                name: 'cit.importData.inputInvoice',
++                url: '/inputInvoice',
++                views: {
++                    '@cit.importData': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                                        function ($scope, $stateParams, appTranslation) {
++                                            appTranslation.load([appTranslation.cit]);
++                                        }],
++                        template: '<cit-import-income-invoice></cit-import-income-invoice>',
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.cit),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++            $stateProvider.state({
++                name: 'cit.importData.customInvoice',
++                url: '/customInvoice',
++                views: {
++                    '@cit.importData': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                                        function ($scope, $stateParams, appTranslation) {
++                                            appTranslation.load([appTranslation.cit]);
++                                        }],
++                        template: '<cit-import-custom-invoice></cit-import-custom-invoice>',
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.cit),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++            $stateProvider.state({
++                name: 'cit.importData.voucherMapping',
++                url: '/voucherMapping',
++                views: {
++                    '@cit.importData': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                                        function ($scope, $stateParams, appTranslation) {
++                                            appTranslation.load([appTranslation.cit]);
++                                        }],
++                        template: '<cit-voucher-mapping></cit-voucher-mapping>',
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.cit),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++            $stateProvider.state({
++                name: 'cit.importData.invoiceMapping',
++                url: '/invoiceMapping',
++                views: {
++                    '@cit.importData': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                                        function ($scope, $stateParams, appTranslation) {
++                                            appTranslation.load([appTranslation.cit]);
++                                        }],
++                        template: '<cit-invoice-mapping></cit-invoice-mapping>',
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.cit),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++            $stateProvider.state({
++                name: 'cit.importData.auditAdjust',
++                url: '/auditAdjust',
++                views: {
++                    '@cit.importData': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                                        function ($scope, $stateParams, appTranslation) {
++                                            appTranslation.load([appTranslation.cit]);
++                                        }],
++                        template: '<cit-audit-adjust></cit-audit-adjust>',
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.cit),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++            $stateProvider.state({
++                name: 'cit.previewData',
++                url: '/previewData',
++                views: {
++                    '@cit': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                                                    function ($scope, $stateParams, appTranslation) {
++                                                        appTranslation.load([appTranslation.cit]);
++                                                    }],
++                        template: '<cit-import-layout></cit-import-layout>',
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.cit),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++            $stateProvider.state({
++                name: 'cit.previewData.balanceSheet',
++                url: '/balanceSheet',
++                views: {
++                    '@cit.previewData': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                                        function ($scope, $stateParams, appTranslation) {
++                                            appTranslation.load([appTranslation.cit]);
++                                        }],
++                        template: '<cit-preview-balance-sheet></cit-preview-balance-sheet>',
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.cit),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++            $stateProvider.state({
++                name: 'cit.previewData.accountVoucher',
++                url: '/accountVoucher',
++                views: {
++                    '@cit.previewData': {
++                        controller: [
++                            '$scope', '$stateParams', 'appTranslation',
++                            function ($scope, $stateParams, appTranslation) {
++                                appTranslation.load([appTranslation.cit]);
++                            }
++                        ],
++                        template: '<cit-preview-account-voucher></cit-preview-account-voucher>'
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.cit),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++            $stateProvider.state({
++                name: 'cit.previewData.outputInvoice',
++                url: '/outputInvoice',
++                views: {
++                    '@cit.previewData': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                                        function ($scope, $stateParams, appTranslation) {
++                                            appTranslation.load([appTranslation.cit]);
++                                        }],
++                        template: '<cit-preview-output-invoice></cit-preview-output-invoice>',
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.cit),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++            $stateProvider.state({
++                name: 'cit.previewData.inputInvoice',
++                url: '/inputInvoice',
++                views: {
++                    '@cit.previewData': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                                        function ($scope, $stateParams, appTranslation) {
++                                            appTranslation.load([appTranslation.cit]);
++                                        }],
++                        template: '<cit-preview-input-invoice></cit-preview-input-invoice>',
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.cit),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++            $stateProvider.state({
++                name: 'cit.previewData.customInvoice',
++                url: '/customInvoice',
++                views: {
++                    '@cit.previewData': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                                        function ($scope, $stateParams, appTranslation) {
++                                            appTranslation.load([appTranslation.cit]);
++                                        }],
++                        template: '<cit-preview-custom-invoice-sheet></cit-preview-custom-invoice-sheet>',
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.cit),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++            $stateProvider.state({
++                name: 'cit.reductionData',
++                url: '/reductionData',
++                views: {
++                    '@cit': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                                        function ($scope, $stateParams, appTranslation) {
++                                            appTranslation.load([appTranslation.cit]);
++                                        }],
++                        template: '<cit-import-layout></cit-import-layout>',
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.cit),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++            $stateProvider.state({
++                name: 'cit.reductionData.accountMapping',
++                url: '/accountMapping',
++                views: {
++                    '@cit.reductionData': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                                        function ($scope, $stateParams, appTranslation) {
++                                            appTranslation.load([appTranslation.cit]);
++                                        }],
++                        template: '<cit-account-mapping></cit-account-mapping>',
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.cit),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++            /*$stateProvider.state({
++                name: 'cit.reductionData.goodsMapping',
++                url: '/goodsMapping',
++                views: {
++                    '@cit.reductionData': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                                        function ($scope, $stateParams, appTranslation) {
++                                            appTranslation.load([appTranslation.cit]);
++                                        }],
++                        template: '<cit-goods-mapping></cit-goods-mapping>',
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.cit),
++                deepStateRedirect: true,
++                sticky: true
++            });*/
++
++            $stateProvider.state({
++                name: 'cit.reductionData.caculateData',
++                url: '/caculateData',
++                views: {
++                    '@cit.reductionData': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                                        function ($scope, $stateParams, appTranslation) {
++                                            appTranslation.load([appTranslation.cit]);
++                                        }],
++                        template: '<cit-caculate-data></cit-caculate-data>',
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.cit),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++            $stateProvider.state({
++                name: 'cit.reductionData.inputInvoice',
++                url: '/inputInvoice',
++                views: {
++                    '@cit.reductionData': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                                        function ($scope, $stateParams, appTranslation) {
++                                            appTranslation.load([appTranslation.cit]);
++                                        }],
++                        template: '<p>inputInvoice</p>',
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.cit),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++            $stateProvider.state({
++                name: 'cit.reductionData.unbilledInvoice',
++                url: '/unbilledInvoice',
++                views: {
++                    '@cit.reductionData': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                                        function ($scope, $stateParams, appTranslation) {
++                                            appTranslation.load([appTranslation.cit]);
++                                        }],
++                        template: '<cit-unbilled-invoice></cit-unbilled-invoice>',
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.cit),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++
++            $stateProvider.state({
++                name: 'cit.generateReport',
++                url: '/generateReport',
++                views: {
++                    '@cit': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                                        function ($scope, $stateParams, appTranslation) {
++                                            appTranslation.load([appTranslation.cit]);
++                                        }],
++                        template: '<cit-report-layout></cit-report-layout>',
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.cit),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++            $stateProvider.state({
++                name: 'cit.generateReport.reportView',
++                url: '/reportView?{id:string}&{templateid:string}&{name:string}',
++                views: {
++                    '@cit.generateReport': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                                        function ($scope, $stateParams, appTranslation) {
++                                            $scope.reportId = $stateParams.id;
++                                            $scope.templateId = $stateParams.templateid;
++                                            $scope.templateName = $stateParams.name;
++                                            appTranslation.load([appTranslation.cit]);
++                                        }],
++                        template: '<cit-report-view report-id="reportId" template-id="templateId" template-name="templateName"></cit-report-view>',
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.cit),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++            $stateProvider.state({
++                name: 'cit.analyzeReport',
++                url: '/analyzeReport',
++                views: {
++                    '@cit': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                                        function ($scope, $stateParams, appTranslation) {
++                                            appTranslation.load([appTranslation.cit]);
++                                        }],
++                        template: '<cit-import-layout></cit-import-layout>',
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.cit),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++            $stateProvider.state({
++                name: 'cit.analyzeReport.citModelAnalysis',
++                url: '/citModelAnalysis',
++                views: {
++                    '@cit.analyzeReport': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                                        function ($scope, $stateParams, appTranslation) {
++                                            appTranslation.load([appTranslation.cit]);
++                                        }],
++                        template: '<cit-model-analysis></cit-model-analysis>',
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.cit),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++            $stateProvider.state({
++                name: 'cit.analyzeReport.citIndexAnalysis',
++                url: '/citIndexAnalysis',
++                views: {
++                    '@cit.analyzeReport': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                                        function ($scope, $stateParams, appTranslation) {
++                                            appTranslation.load([appTranslation.cit]);
++                                        }],
++                        template: '<iframe id="dfiframe" src="/app/df/code/pages/citdashboard.html" scrolling="auto" height="100%" style="border:none" width="100%"></iframe>',
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.cit),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++            $stateProvider.state({
++                name: 'cit.analyzeReport.dataSummary',
++                url: '/dataSummary',
++                views: {
++                    '@cit': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                                        function ($scope, $stateParams, appTranslation) {
++                                            appTranslation.load([appTranslation.cit]);
++                                        }],
++                        template: '<cit-data-summary></cit-data-summary>',
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.cit),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++            /**********the end of a beautiful separated line for analyzeReport*********/
++
++            $stateProvider.state({
++                name: 'cit.devGrid',
++                url: '/devGrid',
++                views: {
++                    '@cit': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                                        function ($scope, $stateParams, appTranslation) {
++                                            appTranslation.load([appTranslation.cit]);
++                                        }],
++                        template: '<dev-grid></dev-grid>',
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.cit),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++
++        }]);
+\ No newline at end of file
+diff --git a/atms-web/src/main/webapp/app/module-part3.js b/atms-web/src/main/webapp/app/module-part3.js
+new file mode 100644
+index 00000000..7fc0e660
+--- /dev/null
++++ b/atms-web/src/main/webapp/app/module-part3.js
+@@ -0,0 +1,428 @@
++锘�//Common Bind Module Method
++var bindModule = function (thisModule, controllerProvider, compileProvider, filterProvider, provide) {
++
++    thisModule.controller = controllerProvider.register;
++    thisModule.directive = compileProvider.directive;
++    thisModule.filter = filterProvider.register;
++    thisModule.factory = provide.factory;
++    thisModule.service = provide.service;
++
++    return thisModule;
++};
++
++var assetsManageModule = angular.module('app.assetsManage', ['ui.grid', 'ui.grid.selection', 'ui.grid.moveColumns', 'ui.grid.grouping', 'ui.grid.expandable', 'ui.grid.treeView', 'ui.grid.exporter', 'ui.grid.resizeColumns', 'mc.resizer', 'ui.select', 'ngSanitize', 'ui.grid.edit', 'perfect_scrollbar', 'dx', 'ui.grid.pinning'])
++    .run(['$log', function ($log) {
++        $log.debug('app.assetsManage.run()...');
++    }])
++    .config(['$controllerProvider', '$urlRouterProvider', '$compileProvider', '$filterProvider', '$provide', '$stateProvider', 'uiSelectConfig', 'scriptDependencyProvider',
++        function ($controllerProvider, $urlRouterProvider, $compileProvider, $filterProvider, $provide, $stateProvider, uiSelectConfig, scriptDependencyProvider) {
++            'use strict';
++            // this is required to add controller/directive/filter/service after angular bootstrap
++            bindModule(assetsManageModule, $controllerProvider, $compileProvider, $filterProvider, $provide);
++
++            uiSelectConfig.theme = 'select2';
++
++            $urlRouterProvider.when('/assetsManage', '/assetsManage/importData/productItem');
++
++            $urlRouterProvider.when('/assetsManage/importData', '/assetsManage/importData/productItem');
++
++            $urlRouterProvider.when('/assetsManage/previewData', '/assetsManage/previewData/productItem');
++
++            $urlRouterProvider.when('/assetsManage/productMix', '/assetsManage/productMix/productItem');
++
++            $stateProvider.state({
++                name: 'assetsManage',
++                url: '/assetsManage',
++                cache: false,
++                views: {
++                    '@': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                            function ($scope, $stateParams, appTranslation) {
++                                appTranslation.load([appTranslation.cit]);
++                            }],
++                        template: '<assets-manage-layout></assets-manage-layout>',
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.assetsManage),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++            $stateProvider.state({
++                name: 'assetsManage.importData',
++                url: '/importData',
++                views: {
++                    '@assetsManage': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                                        function ($scope, $stateParams, appTranslation) {
++                                            appTranslation.load([appTranslation.cit]);
++                                        }],
++                        template: '<assets-manage-import-layout></assets-manage-import-layout>',
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.assetsManage),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++            $stateProvider.state({
++                name: 'assetsManage.importData.productItem',
++                url: '/productItem',
++                views: {
++                    '@assetsManage.importData': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                                        function ($scope, $stateParams, appTranslation) {
++                                            appTranslation.load([appTranslation.cit]);
++                                        }],
++                        template: '<product-item-import></product-item-import>'
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.assetsManage),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++            $stateProvider.state({
++                name: 'assetsManage.previewData',
++                url: '/previewData',
++                views: {
++                    '@assetsManage': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                                                    function ($scope, $stateParams, appTranslation) {
++                                                        appTranslation.load([appTranslation.cit]);
++                                                    }],
++                        template: '<assets-manage-import-layout></assets-manage-import-layout>',
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.assetsManage),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++            $stateProvider.state({
++                name: 'assetsManage.previewData.productItem',
++                url: '/productItem',
++                views: {
++                    '@assetsManage.previewData': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                                        function ($scope, $stateParams, appTranslation) {
++                                            appTranslation.load([appTranslation.cit]);
++                                        }],
++                        template: '<product-item-preview></product-item-preview>',
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.assetsManage),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++            $stateProvider.state({
++                name: 'assetsManage.generateReport',
++                url: '/generateReport',
++                views: {
++                    '@assetsManage': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                                        function ($scope, $stateParams, appTranslation) {
++                                            appTranslation.load([appTranslation.cit]);
++                                        }],
++                        template: '<assets-manage-report-layout></assets-manage-report-layout>',
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.assetsManage),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++            $stateProvider.state({
++                name: 'assetsManage.productMix',
++                url: '/productMix',
++                views: {
++                    '@assetsManage': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                                                    function ($scope, $stateParams, appTranslation) {
++                                                        appTranslation.load([appTranslation.cit]);
++                                                    }],
++                        template: '<assets-manage-import-layout></assets-manage-import-layout>',
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.assetsManage),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++            $stateProvider.state({
++                name: 'assetsManage.productMix.productItem',
++                url: '/productMix',
++                views: {
++                    '@assetsManage.productMix': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                                        function ($scope, $stateParams, appTranslation) {
++                                            appTranslation.load([appTranslation.cit]);
++                                        }],
++                        template: '<product-item-mix></product-item-mix>',
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.assetsManage),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++            $stateProvider.state({
++                name: 'assetsManage.generateReport.reportView',
++                url: '/reportView?{id:string}&{templateid:string}&{name:string}',
++                views: {
++                    '@assetsManage.generateReport': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                                        function ($scope, $stateParams, appTranslation) {
++                                            $scope.reportId = $stateParams.id;
++                                            $scope.templateId = $stateParams.templateid;
++                                            $scope.templateName = $stateParams.name;
++                                            appTranslation.load([appTranslation.cit]);
++                                        }],
++                        template: '<assets-manage-report-view report-id="reportId" template-id="templateId" template-name="templateName"></assets-manage-report-view>',
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.assetsManage),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++            $stateProvider.state({
++                name: 'assetsManage.generateReport.reportViewCit',
++                url: '/reportViewCit?{id:string}&{templateid:string}&{name:string}',
++                views: {
++                    '@assetsManage.generateReport': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                                        function ($scope, $stateParams, appTranslation) {
++                                            $scope.reportId = $stateParams.id;
++                                            $scope.templateId = $stateParams.templateid;
++                                            $scope.templateName = $stateParams.name;
++                                            appTranslation.load([appTranslation.cit]);
++                                        }]
++                        //template: '<cit-report-view2 report-id="reportId" template-id="templateId" template-name="templateName"></cit-report-view2>',
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.assetsManage),
++                deepStateRedirect: true,
++                sticky: true
++            });
++        }]);
++
++var vatDashboardModule = angular.module('app.vatDashboard', ['ui.grid', 'ui.grid.selection', 'ui.grid.moveColumns', 'ui.grid.grouping', 'ui.grid.expandable', 'ui.grid.treeView', 'ui.grid.exporter', 'ui.grid.resizeColumns', 'mc.resizer', 'ui.select', 'ngSanitize', 'ui.grid.edit', 'perfect_scrollbar', 'dx', 'ui.grid.pinning'])
++    .run(['$log', function ($log) {
++        $log.debug('app.vatDashboard.run()...');
++    }])
++    .config(['$controllerProvider', '$urlRouterProvider', '$compileProvider', '$filterProvider', '$provide', '$stateProvider', 'uiSelectConfig', 'scriptDependencyProvider',
++        function ($controllerProvider, $urlRouterProvider, $compileProvider, $filterProvider, $provide, $stateProvider, uiSelectConfig, scriptDependencyProvider) {
++            'use strict';
++            // this is required to add controller/directive/filter/service after angular bootstrap
++            bindModule(vatDashboardModule, $controllerProvider, $compileProvider, $filterProvider, $provide);
++
++            $stateProvider.state({
++                name: 'summaryDashboard',
++                url: '/summaryDashboard',
++                cache: false,
++                views: {
++                    '@': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                                        function ($scope, $stateParams, appTranslation) {
++                                            appTranslation.load([appTranslation.vat]);
++                                        }],
++                        template: '<summary-dashboard></summary-dashboard>',
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++            $stateProvider.state({
++                name: 'summaryDashboardConfig',
++                url: '/summaryDashboardConfig/{id}',
++                cache: false,
++                views: {
++                    '@': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                                        function ($scope, $stateParams, appTranslation) {
++                                            appTranslation.load([appTranslation.vat]);
++                                        }],
++                        template: '<summary-dashboard-config></summary-dashboard-config>',
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++            $stateProvider.state({
++                name: 'reportAnalysisDashboardConfig',
++                url: '/reportAnalysisDashboardConfig/{id}',
++                cache: false,
++                views: {
++                    '@': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                                        function ($scope, $stateParams, appTranslation) {
++                                            appTranslation.load([appTranslation.vat]);
++                                        }],
++                        template: '<report-analysis-dashboard-config></report-analysis-dashboard-config>',
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++            $stateProvider.state({
++                name: 'organizationDashboard',
++                url: '/organizationDashboard/{id}',
++                cache: false,
++                views: {
++                    '@': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                                        function ($scope, $stateParams, appTranslation) {
++                                            appTranslation.load([appTranslation.vat]);
++                                        }],
++                        template: '<organization-dashboard></organization-dashboard>',
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++            $stateProvider.state({
++                name: 'analyzeOrganizeDashboard',
++                url: '/analyzeOrganizeDashboard/{id}',
++                views: {
++                    '@vat.analyzeLayout': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                                        function ($scope, $stateParams, appTranslation) {
++                                            appTranslation.load([appTranslation.vat]);
++                                        }],
++                        template: '<organization-dashboard></organization-dashboard>',
++
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++            $stateProvider.state({
++                name: 'analyzeOrganizeDashboardConfig',
++                url: '/analyzeOrganizeDashboardConfig/{id}',
++                views: {
++                    '@vat.analyzeLayout': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                                        function ($scope, $stateParams, appTranslation) {
++                                            appTranslation.load([appTranslation.vat]);
++                                        }],
++                        template: '<report-analysis-dashboard-config></report-analysis-dashboard-config>',
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++        }]);
++
++var vatDongfengModule = angular.module('app.vatDongfeng', ['ui.grid', 'ui.grid.selection', 'ui.grid.moveColumns', 'ui.grid.grouping', 'ui.grid.expandable', 'ui.grid.treeView', 'ui.grid.exporter', 'ui.grid.resizeColumns', 'mc.resizer', 'ui.select', 'ngSanitize', 'ui.grid.edit', 'perfect_scrollbar', 'dx', 'ui.grid.pinning'])
++    .run(['$log', function ($log) {
++        $log.debug('app.vatDongfeng.run()...');
++    }])
++    .config(['$controllerProvider', '$urlRouterProvider', '$compileProvider', '$filterProvider', '$provide', '$stateProvider', 'uiSelectConfig', 'scriptDependencyProvider',
++        function ($controllerProvider, $urlRouterProvider, $compileProvider, $filterProvider, $provide, $stateProvider, uiSelectConfig, scriptDependencyProvider) {
++            'use strict';
++            // this is required to add controller/directive/filter/service after angular bootstrap
++            bindModule(vatDongfengModule, $controllerProvider, $compileProvider, $filterProvider, $provide);
++
++            $stateProvider.state({
++                name: 'IncomeTax',
++                url: '/IncomeTax',
++                views: {
++                    '@': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                                        function ($scope, $stateParams, appTranslation) {
++                                            appTranslation.load([appTranslation.vat]);
++                                        }],
++                        template: '<dongfeng-nav-bar type="1"></dongfeng-nav-bar>',
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++            $stateProvider.state({
++                name: 'CashFlow',
++                url: '/CashFlow',
++                cache: false,
++                views: {
++                    '@': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                                        function ($scope, $stateParams, appTranslation) {
++                                            appTranslation.load([appTranslation.vat]);
++                                        }],
++                        template: '<dongfeng-nav-bar type="2"></dongfeng-nav-bar>',
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++            $stateProvider.state({
++                name: 'DataSummary',
++                url: '/DataSummary',
++                cache: false,
++                views: {
++                    '@': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                                        function ($scope, $stateParams, appTranslation) {
++                                            appTranslation.load([appTranslation.vat]);
++                                        }],
++                        template: '<dongfeng-nav-bar type="3"></dongfeng-nav-bar>',
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++            $stateProvider.state({
++                name: 'GlobalSearch',
++                url: '/GlobalSearch',
++                cache: false,
++                views: {
++                    '@': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                                        function ($scope, $stateParams, appTranslation) {
++                                            appTranslation.load([appTranslation.vat]);
++                                        }],
++                        template: '<dongfeng-nav-bar type="4"></dongfeng-nav-bar>',
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat),
++                deepStateRedirect: true,
++                sticky: true
++            });
++
++            $stateProvider.state({
++                name: 'RiskPanel',
++                url: '/RiskPanel',
++                cache: false,
++                views: {
++                    '@': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                                        function ($scope, $stateParams, appTranslation) {
++                                            appTranslation.load([appTranslation.vat]);
++                                        }],
++                        template: '<dongfeng-nav-bar type="5"></dongfeng-nav-bar>',
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.vat),
++                deepStateRedirect: true,
++                sticky: true
++            });
++        }]);
+\ No newline at end of file
+diff --git a/atms-web/src/main/webapp/app/module-part4.js b/atms-web/src/main/webapp/app/module-part4.js
+new file mode 100644
+index 00000000..fbf23348
+--- /dev/null
++++ b/atms-web/src/main/webapp/app/module-part4.js
+@@ -0,0 +1,31 @@
++锘�
++var noPermissionPageModule = angular.module('app.noPermissionPage', [])
++    .run(['$log', function ($log) {
++        $log.debug('app.noPermissionPage.run()...');
++    }])
++    .config(['$controllerProvider', '$compileProvider', '$filterProvider', '$provide', 'scriptDependencyProvider', '$stateProvider', '$urlRouterProvider',
++        function ($controllerProvider, $compileProvider, $filterProvider, $provide, scriptDependencyProvider, $stateProvider, $urlRouterProvider) {
++            'use strict';
++
++
++            // this is required to add controller/directive/filter/service after angular bootstrap
++            bindModule(noPermissionPageModule, $controllerProvider, $compileProvider, $filterProvider, $provide);
++
++
++            $stateProvider.state({
++                name: 'noPermissionPage',
++                url: '/noPermissionPage',
++                views: {
++                    '@': {
++                        controller: ['$scope', '$stateParams', 'appTranslation',
++                       function ($scope, $stateParams, appTranslation) {
++                           appTranslation.load([appTranslation.noPermissionPage]);
++                       }],
++                        template: '<no-permission-page></no-permission-page>'
++                    }
++                },
++                resolve: scriptDependencyProvider.createDependenciesMap(scriptDependencyProvider.noPermissionPage),
++                deepStateRedirect: true,
++                sticky: true
++            });
++        }]);
+\ No newline at end of file
-- 
2.18.0