You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by ka...@apache.org on 2018/11/18 15:40:44 UTC

[1/3] directory-fortress-enmasse git commit: first drop of new Fortress UI

Repository: directory-fortress-enmasse
Updated Branches:
  refs/heads/FC-247 [created] 5aae8a26f


http://git-wip-us.apache.org/repos/asf/directory-fortress-enmasse/blob/5aae8a26/embrasure/package.json
----------------------------------------------------------------------
diff --git a/embrasure/package.json b/embrasure/package.json
new file mode 100644
index 0000000..540874e
--- /dev/null
+++ b/embrasure/package.json
@@ -0,0 +1,50 @@
+{
+  "name": "embrasure",
+  "version": "0.1.0",
+  "description": "Fortress Dashboard",
+  "author": "Fortress Dev <de...@directory.apache.org>",
+  "private": true,
+  "scripts": {
+    "serve": "vue-cli-service serve",
+    "build": "vue-cli-service build",
+    "lint": "vue-cli-service lint"
+  },
+  "dependencies": {
+    "axios": "^0.18.0",
+    "element-ui": "^2.4.8",
+    "rfc6902": "^3.0.1",
+    "vue": "^2.5.17",
+    "vue-data-tables": "^3.4.4",
+    "vue-router": "^3.0.1",
+    "vue-split-pane": "0.0.8"
+  },
+  "devDependencies": {
+    "@vue/cli-plugin-babel": "^3.0.5",
+    "@vue/cli-plugin-eslint": "^3.0.5",
+    "@vue/cli-service": "^3.0.5",
+    "vue-template-compiler": "^2.5.17"
+  },
+  "eslintConfig": {
+    "root": true,
+    "env": {
+      "node": true
+    },
+    "extends": [
+      "plugin:vue/essential",
+      "eslint:recommended"
+    ],
+    "parserOptions": {
+      "parser": "babel-eslint"
+    }
+  },
+  "postcss": {
+    "plugins": {
+      "autoprefixer": {}
+    }
+  },
+  "browserslist": [
+    "> 1%",
+    "last 2 versions",
+    "not ie <= 8"
+  ]
+}

http://git-wip-us.apache.org/repos/asf/directory-fortress-enmasse/blob/5aae8a26/embrasure/public/embrasure-favicon.png
----------------------------------------------------------------------
diff --git a/embrasure/public/embrasure-favicon.png b/embrasure/public/embrasure-favicon.png
new file mode 100644
index 0000000..3dcf65f
Binary files /dev/null and b/embrasure/public/embrasure-favicon.png differ

http://git-wip-us.apache.org/repos/asf/directory-fortress-enmasse/blob/5aae8a26/embrasure/public/index.html
----------------------------------------------------------------------
diff --git a/embrasure/public/index.html b/embrasure/public/index.html
new file mode 100644
index 0000000..86f9174
--- /dev/null
+++ b/embrasure/public/index.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width,initial-scale=1.0">
+    <link rel="icon" href="<%= BASE_URL %>embrasure-favicon.png">
+    <title>Fortress Administrator</title>
+  </head>
+  <body>
+    <noscript>
+      <strong>Please enable Javascript to continue</strong>
+    </noscript>
+    <div id="app"></div>
+    <!-- built files will be auto injected -->
+  </body>
+</html>

http://git-wip-us.apache.org/repos/asf/directory-fortress-enmasse/blob/5aae8a26/embrasure/src/App.vue
----------------------------------------------------------------------
diff --git a/embrasure/src/App.vue b/embrasure/src/App.vue
new file mode 100644
index 0000000..e27ff98
--- /dev/null
+++ b/embrasure/src/App.vue
@@ -0,0 +1,92 @@
+<template>
+  <div id="app">
+    <div>
+      <el-container style="border: 1px solid #eee">
+        <el-header style="text-align: right; font-size: 12px; padding: 0px;">
+            <el-menu router :default-active="activeIndex" class="el-menu-demo" mode="horizontal" background-color="#545c64" text-color="#fff" active-text-color="#ffd04b">
+              <el-menu-item index="/" >Users</el-menu-item>
+              <el-menu-item index="/groups">Groups</el-menu-item>
+              <el-submenu index="rbac">
+                <template slot="title">RBAC</template>
+                <el-menu-item index="/roles">Roles</el-menu-item>
+                <el-menu-item index="/perms">Perms</el-menu-item>
+                <el-menu-item index="/ssds">SSDs</el-menu-item>
+                <el-menu-item index="/dsds">DSDs</el-menu-item>
+              </el-submenu>
+              <el-submenu index="arbac">
+                <template slot="title">ARBAC</template>
+                <el-menu-item index="/policies">Policies</el-menu-item>
+              </el-submenu>
+              <el-menu-item index="/pobjs">PObjs</el-menu-item>
+              <el-menu-item index="/ousers">OUsers</el-menu-item>
+              <el-menu-item index="/ouprms">OUPrms</el-menu-item>
+              <el-menu-item index="/admrles">ADMRLEs</el-menu-item>
+              <el-menu-item index="/admobjs">ADMObjs</el-menu-item>
+              <el-menu-item index="/admperms">ADMPerms</el-menu-item>
+              <el-menu-item index="/logout">Logout</el-menu-item>
+            </el-menu>
+          </el-header>
+      </el-container>
+    </div>
+    <div>
+        <router-view/>
+    </div>
+  </div>
+</template>
+
+<script>
+import axios from "axios"
+
+export default {
+  name: 'app',
+  data() {
+    return {
+      activeIndex: '/'
+    }
+  }
+}
+</script>
+
+<style>
+#app {
+  font-family: 'Avenir', Helvetica, Arial, sans-serif;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+  text-align: center;
+  color: #2200cc;
+}
+.split-pane {
+  display: flex;
+  flex-direction: row;
+  height: 80%;
+}
+
+.split-pane-item,
+.split-pane-gutter {
+  height: 80%;
+}
+
+.split-pane-gutter {
+  background: #000;
+  opacity: 0.2;
+  z-index: 1;
+  box-sizing: border-box;
+  background-clip: padding-box;
+  width: 11px;
+  margin: 0 -5px;
+  border-left: 5px solid rgba(255, 255, 255, 0);
+  border-right: 5px solid rgba(255, 255, 255, 0);
+  cursor: col-resize;
+}
+
+.split-pane-gutter:hover,
+.split-pane-gutter:focus {
+  border-left: 5px solid rgba(0, 0, 0, 0.5);
+  border-right: 5px solid rgba(0, 0, 0, 0.5);
+  transition: all 2s ease;
+}
+
+.is-dragging {
+  cursor: col-resize;
+}
+</style>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/directory-fortress-enmasse/blob/5aae8a26/embrasure/src/assets/nophoto.jpg
----------------------------------------------------------------------
diff --git a/embrasure/src/assets/nophoto.jpg b/embrasure/src/assets/nophoto.jpg
new file mode 100644
index 0000000..b4e10b0
Binary files /dev/null and b/embrasure/src/assets/nophoto.jpg differ

http://git-wip-us.apache.org/repos/asf/directory-fortress-enmasse/blob/5aae8a26/embrasure/src/components/ContactInformation.vue
----------------------------------------------------------------------
diff --git a/embrasure/src/components/ContactInformation.vue b/embrasure/src/components/ContactInformation.vue
new file mode 100644
index 0000000..e7e9cd1
--- /dev/null
+++ b/embrasure/src/components/ContactInformation.vue
@@ -0,0 +1,94 @@
+<template :entity="entity">
+    <div>
+        <el-row justify="start" type="flex">
+            <el-form-item label="Emails:">
+                <List :holder.sync="entity" fieldName="emails"/>
+            </el-form-item>
+            <el-form-item label="Phones:">
+                <List :holder.sync="entity" fieldName="phones"/>
+            </el-form-item>
+        </el-row>
+        <el-row justify="start" type="flex">
+            <el-form-item label="Mobiles:">
+                <List :holder.sync="entity" fieldName="mobiles"/>
+            </el-form-item>
+        </el-row>
+        <el-row justify="start" type="flex">
+            <el-form-item label="City:">
+                <el-input label="City" placeholder="" v-model="entity.address.city" size="small"></el-input>
+            </el-form-item>
+            <el-form-item label="State:">
+                <el-input label="State" placeholder="" v-model="entity.address.state" size="small"></el-input>
+            </el-form-item>
+        </el-row>
+        <el-row justify="start" type="flex">
+            <el-form-item label="Country:">
+                <el-input label="Country" placeholder="" v-model="entity.address.country" size="small"></el-input>
+            </el-form-item>
+            <el-form-item label="Postal Code:">
+                <el-input label="Postal Code" placeholder="" v-model="entity.address.postalCode" size="small"></el-input>
+            </el-form-item>
+        </el-row>
+        <el-row justify="start" type="flex">
+            <el-form-item label="Post Office Box:">
+                <el-input label="Post Office Box" placeholder="" v-model="entity.address.postOfficeBox" size="small"></el-input>
+            </el-form-item>
+            <el-form-item label="Building:">
+                <el-input label="Building" placeholder="" v-model="entity.address.building" size="small"></el-input>
+            </el-form-item>
+        </el-row>
+        <el-row justify="start" type="flex">
+            <el-form-item label="Department Number:">
+                <el-input label="Department Number" placeholder="" v-model="entity.address.departmentNumber" size="small"></el-input>
+            </el-form-item>
+            <el-form-item label="Room Number:">
+                <el-input label="Room Number" placeholder="" v-model="entity.address.roomNumber" size="small"></el-input>
+            </el-form-item>
+        </el-row>
+        <el-row justify="start" type="flex">
+            <el-form-item label="Addresses:">
+                <List :holder.sync="entity.address" fieldName="addresses"/>
+            </el-form-item>
+        </el-row>
+    </div>
+</template>
+
+<script>
+/* eslint-disable */
+import List from './List.vue'
+
+export default {
+  name: 'ContactInformation',
+props: {
+  entity: Object,
+},
+data() {
+    return {
+    }
+},
+created() {
+let address = {
+                addresses: null,
+                city: null,
+                state: null,
+                country: null,
+                postalCode: null,
+                postOfficeBox: null,
+                building: null,
+                departmentNumber: null,
+                roomNumber: null
+            }
+    if(this.entity.address == undefined || this.entity.address == null) {
+        this.$set(this.entity, 'address', address)
+    }
+},
+computed: {
+
+},
+methods: {
+},
+components: {
+    List
+}
+};
+</script>

http://git-wip-us.apache.org/repos/asf/directory-fortress-enmasse/blob/5aae8a26/embrasure/src/components/List.vue
----------------------------------------------------------------------
diff --git a/embrasure/src/components/List.vue b/embrasure/src/components/List.vue
new file mode 100644
index 0000000..27dd45d
--- /dev/null
+++ b/embrasure/src/components/List.vue
@@ -0,0 +1,77 @@
+<template :holder="holder" :fieldName="fieldName">
+  <div style="min-width: 10px; min-height: 10px;">
+    <table>
+        <tr style="line-height: 25px;"
+          v-for="(n, index) in items"
+          :key="index"
+          :label="n"
+          :value="index">
+          <td>
+              <span class="option_span_item">{{index+1}}.</span>
+          </td>
+          <td>
+            <input type="text" :value="n" :ref="fieldName+index" @input="updateItem(index)"/><i @click="deleteItem(index)" style="color: red; padding-left: 1px;" class="el-icon-remove"></i>
+          </td>
+        </tr>
+      </table>
+      <div style="padding: 1px;"/>
+      <el-button type="success" round size="mini" @click="addItem">+</el-button>
+  </div>
+</template>
+
+<script>
+/* eslint-disable */
+export default {
+  name: 'List',
+props: {
+  holder: Object,
+  fieldName: String
+},
+data() {
+    return {
+    }
+},
+created() {
+
+},
+computed: {
+    items: {
+        get() {
+            let arr = this.holder[this.fieldName]
+            if(arr == null) {
+                arr = []
+            }
+
+            return arr
+        },
+        set(newVal) {
+            // ignore
+        }
+    }
+},
+methods: {
+    addItem() {
+        let arr = this.holder[this.fieldName]
+        if(arr == null) {
+            this.$set(this.holder, this.fieldName, [])
+            arr = this.holder[this.fieldName]
+        }
+        arr.push('')
+    },
+    deleteItem(index) {
+        let arr = this.holder[this.fieldName]
+        if(arr != null) {
+            arr.splice(index, 1)
+        }
+    },
+    updateItem(index) {
+        let inputRef = this.fieldName + index
+        let newVal = this.$refs[inputRef][0].value
+        let arr = this.holder[this.fieldName]
+        if(arr != null) {
+            arr[index] = newVal
+        }        
+    }
+}
+};
+</script>

http://git-wip-us.apache.org/repos/asf/directory-fortress-enmasse/blob/5aae8a26/embrasure/src/components/RoleAssignment.vue
----------------------------------------------------------------------
diff --git a/embrasure/src/components/RoleAssignment.vue b/embrasure/src/components/RoleAssignment.vue
new file mode 100644
index 0000000..c728506
--- /dev/null
+++ b/embrasure/src/components/RoleAssignment.vue
@@ -0,0 +1,196 @@
+<template :holder="holder" :fieldName="fieldName" :isAdminRole="isAdminRole">
+<div>
+    <div style="float: left; display: inline-block; width:200px; padding-right: 20px;">
+        <select v-model="selectedResIndex" :size="5" style="width: 100%; min-height: 175px;" @change="selectCurRole">
+            <option class="el-select-dropdown__item"
+                v-for="(r, index) in roles"
+                :key="r.modId"
+                :label="r.name"
+                :value="index" :title="r.name">
+                <span class="option_span_item">{{r.name}}</span>
+            </option>
+        </select>
+        <div style="padding: 1px;"/>
+        <el-button type="success" round size="mini" @click="openRoleSearch">+</el-button>
+        <el-button type="warning" round size="mini" @click="deleteRole">-</el-button>
+    </div>
+    <TemporalConstraints v-if="curRole != null" :tcHolder="curRole"/>
+    <el-dialog title="Select Role" :visible.sync="roleDialogVisible" width="30%" center modal @open="setFocusRoleSelector">
+      <el-select ref="roleSelector" v-model="selectedRoles" multiple filterable remote reserve-keyword placeholder="Type first three letters of role" :remote-method="searchRoles" :loading="loading">
+        <el-option
+          v-for="(r, index) in foundRoles"
+          :key="r.modId"
+          :label="r.name"
+          :value="index" :title="r.name">
+        </el-option>
+      </el-select>
+      <el-button type="success" round size="mini" @click="addSelectedRoles">Ok</el-button>
+    </el-dialog>
+</div>
+</template>
+
+<script>
+/* eslint-disable */
+import TemporalConstraints from './TemporalConstraints.vue'
+import axios from "axios"
+import * as ft from "../lib/fortress"
+
+export default {
+  name: 'RoleAssignment',
+props: {
+  holder: Object,
+  fieldName: String,
+  isAdminRole: Boolean
+},
+data() {
+    return {
+        selectedResIndex: 0,
+        curRole: null,
+        selectedRoles: [],
+        roleDialogVisible: false,
+        foundRoles: [],
+        loading: false
+    }
+},
+beforeUpdate() {
+    this.selectCurRole()
+},
+beforeDestroy() {
+    console.log('beforeDestroy')
+},
+computed: {
+    roles: {
+        get() {
+            this.selectedResIndex = 0
+            console.log('computing roles get()')
+            let existing = this.holder[this.fieldName]
+            if(existing == null) {
+                existing = []
+            }
+
+            return existing
+        },
+        set(newVal) {
+            console.log('setting new values')
+            // ignore
+        }
+    }
+},
+methods: {
+    selectCurRole() {
+        let existing = this.holder[this.fieldName]
+        if(existing != null && existing.length > 0) {
+            console.log('updating cur role ' + this.selectedResIndex )
+            this.curRole = existing[this.selectedResIndex]
+        } else {
+            console.log('setting cur role to NULL')
+            this.curRole = null
+        }
+    },
+    openRoleSearch() {
+        this.selectedRoles = []
+        this.roleDialogVisible = true
+    },
+    deleteRole() {
+        let existing = this.holder[this.fieldName]
+        if(existing != null) {
+            existing.splice(this.selectedResIndex, 1)
+        }
+    },
+    updateItem(index) {
+        let inputRef = this.fieldName + index
+        let newVal = this.$refs[inputRef][0].value
+        let existing = this.holder[this.fieldName]
+        if(existing != null) {
+            existing[index] = newVal
+        }        
+    },
+    roleDialogClose(dropdownOpened) {
+        if(!dropdownOpened) {
+            this.roleDialogVisible = false
+        }
+    },
+    setFocusRoleSelector() {
+        this.$nextTick(function(){
+        this.$refs.roleSelector.focus()
+        })
+    },
+    addSelectedRoles() {
+        this.roleDialogVisible = false
+        console.log(this.selectedRoles)
+        let selected = this.selectedRoles
+        let existing = this.holder[this.fieldName]
+        if(existing == null) {
+            this.$set(this.holder, this.fieldName, [])
+            existing = this.holder[this.fieldName]
+        }
+        for(let i=0; i < selected.length; i++) {
+            let sr = this.foundRoles[selected[i]]
+            let add = true
+            for(let j=0; j < existing.length; j++) {
+                let er = existing[j]
+                if(er.modId == sr.modId) {
+                    add = false
+                    break
+                }
+            }
+            if(add) {
+                let ur = this.convertRoleToUserRole(sr)
+                console.log('adding role')
+                existing.push(ur)
+            }
+        }
+    },
+    convertRoleToUserRole(role) {
+        let userRole = {
+            fqcn: 'org.apache.directory.fortress.core.model.UserRole'
+        }
+        if(this.isAdminRole) {
+            userRole.fqcn = 'org.apache.directory.fortress.core.model.UserAdminRole'
+        }
+
+        userRole.userId = this.holder.userId
+        userRole.name = role.name
+        userRole.isGroupRole = false
+        userRole.timeout = role.timeout
+        userRole.beginTime = role.beginTime
+        userRole.endTime = role.endTime
+        userRole.beginDate = role.beginDate
+        userRole.endDate = role.endDate
+        userRole.beginLockDate = role.beginLockDate
+        userRole.endLockDate = role.endLockDate
+        userRole.dayMask = role.dayMask
+        userRole.parents = role.parents
+        userRole.roleConstraints = null
+
+        return userRole
+    },
+    searchRoles(query) {
+        this.selectedRoles = []
+        if (query.length > 2) {
+          this.loading = true
+          let ftReq = {
+                        "value": query,
+                        contextId: ft.CONTEXT_ID
+                      }
+          let url = ft.FT_BASE_URL + '/roleSearch'
+          if(this.isAdminRole) {
+              url = ft.FT_BASE_URL + '/arleSearch'
+          }
+          setTimeout(() => {
+            axios.post(url, ftReq, ft.AXIOS_FT_CONFIG).then(resp => {
+                this.foundRoles = resp.data.entities
+                this.loading = false
+            }).catch(e => {
+                this.foundRoles = []
+                ft.showErr(e, '')
+            })
+          }, 200);
+        }
+    }
+},
+components: {
+    TemporalConstraints
+}
+};
+</script>

http://git-wip-us.apache.org/repos/asf/directory-fortress-enmasse/blob/5aae8a26/embrasure/src/components/TemporalConstraints.vue
----------------------------------------------------------------------
diff --git a/embrasure/src/components/TemporalConstraints.vue b/embrasure/src/components/TemporalConstraints.vue
new file mode 100644
index 0000000..0efd331
--- /dev/null
+++ b/embrasure/src/components/TemporalConstraints.vue
@@ -0,0 +1,115 @@
+<template :tcHolder="tcHolder">
+  <div>
+    <el-row justify="start" type="flex">
+        <el-form-item label="Begin Time:">
+            <el-time-select :picker-options="timeSelectOps" v-model="beginTime" size="mini"></el-time-select>
+        </el-form-item>
+        <el-form-item label="End Time:">
+            <el-time-select :picker-options="timeSelectOps" v-model="endTime" size="mini"></el-time-select>
+        </el-form-item>
+    </el-row>
+    <el-row justify="start" type="flex">
+        <el-form-item label="Begin Date:">
+            <el-date-picker v-model="beginDate" value-format="yyyyMMdd" format="MM/dd/yyyy" type="date"></el-date-picker>
+        </el-form-item>
+        <el-form-item label="End Date:">
+            <el-date-picker v-model="endDate" value-format="yyyyMMdd" format="MM/dd/yyyy" type="date"></el-date-picker>
+        </el-form-item>
+    </el-row>
+    <el-row justify="start" type="flex">
+        <el-form-item label="Begin Lock Date:">
+            <el-date-picker v-model="beginLockDate" value-format="yyyyMMdd" format="MM/dd/yyyy" type="date"></el-date-picker>
+        </el-form-item>
+        <el-form-item label="End Lock Date:">
+            <el-date-picker v-model="endLockDate" value-format="yyyyMMdd" format="MM/dd/yyyy" type="date"></el-date-picker>
+        </el-form-item>
+    </el-row>
+  </div>
+</template>
+
+<script>
+/* eslint-disable */
+export default {
+  name: 'TemporalConstraints',
+props: {
+  tcHolder: Object,
+},
+data() {
+    return {
+        timeSelectOps: {
+            start: '00:00',
+            end: '23:30'
+        }
+    }
+},
+created() {
+
+},
+computed: {
+    // the below functions are used to convert date and time values in the format fortress stores
+    beginTime: {
+        get() {
+            return this.formatInput(this.tcHolder.beginTime)
+        },
+        set(newVal) {
+            this.tcHolder.beginTime = this.formatOutput(newVal)
+        }
+    },
+    endTime: {
+        get() {
+            return this.formatInput(this.tcHolder.endTime)
+        },
+        set(newVal) {
+            this.tcHolder.endTime = this.formatOutput(newVal)
+        }
+    },
+    beginDate: {
+        get() {
+            return this.tcHolder.beginDate
+        },
+        set(newVal) {
+            this.$set(this.tcHolder, 'beginDate', newVal)
+        }        
+    },
+    endDate: {
+        get() {
+            return this.tcHolder.endDate
+        },
+        set(newVal) {
+            this.$set(this.tcHolder, 'endDate', newVal)
+        }        
+    },
+    beginLockDate: {
+        get() {
+            return this.tcHolder.beginLockDate
+        },
+        set(newVal) {
+            this.$set(this.tcHolder, 'beginLockDate', newVal)
+        }        
+    },
+    endLockDate: {
+        get() {
+            return this.tcHolder.endLockDate
+        },
+        set(newVal) {
+            this.$set(this.tcHolder, 'endLockDate', newVal)
+        }        
+    }
+},
+methods: {
+    formatInput(t) {
+        if(t == null) {
+            return "00:00"
+        }
+        return t.substring(0,2) + ':' + t.substring(2)
+    },
+    formatOutput(t) {
+        if(t == null) {
+            return "0000"
+        }
+        return t.substring(0,2) + t.substring(3) // exclude : char
+    }
+
+}
+};
+</script>

http://git-wip-us.apache.org/repos/asf/directory-fortress-enmasse/blob/5aae8a26/embrasure/src/components/UserList.vue
----------------------------------------------------------------------
diff --git a/embrasure/src/components/UserList.vue b/embrasure/src/components/UserList.vue
new file mode 100644
index 0000000..b660a78
--- /dev/null
+++ b/embrasure/src/components/UserList.vue
@@ -0,0 +1,67 @@
+<template>
+<el-container>
+  <el-aside width="200px" style="background-color: #808471">
+    <el-menu :default-active="activeIndex" class="el-menu-demo" mode="vertical" background-color="#808471" text-color="#fff" active-text-color="#ffd04b">
+    </el-menu>
+  </el-aside>
+  <el-main>
+      <div style="float: right; margin-bottom: 1px">
+        <el-row>
+          <el-col>
+            <el-input v-model="filters[0].value" placeholder="search"></el-input>
+          </el-col>
+        </el-row>
+      </div>
+      <data-tables :data="resources" :table-props="tableProps" :page-size="10" :pagination-props="{ background: true, pageSizes: [10, 20, 50, 100] }" :filters="filters" highlight-current-row @row-click="fetchEntity" @selection-change="handleSelectionChange">
+       <el-table-column type="selection" width="55"></el-table-column>
+       <el-table-column v-for="col in columns" :prop="col.prop" :label="col.label" :key="col.label" sortable="custom" width="200" header-align="center">
+       </el-table-column>
+      </data-tables>
+  </el-main>
+  </el-container>
+</template>
+
+<script>
+/* eslint-disable */
+import axios from "axios"
+
+export default {
+  name: "UserList",
+  data() {
+    return {
+      resources: [],
+      activeIndex: "1",
+      multipleSelection: [],
+      columns: [{
+          prop: "username",
+          label: "Username"
+          }, {
+          prop: "displayname",
+          label: "Name"
+        }
+      ],
+     tableProps: {
+        border: false,
+        stripe: true,
+        defaultSort: {
+          prop: 'username',
+          order: 'ascending'
+        }
+     },
+      filters: [
+        {
+          prop: ['username', 'displayname'],
+          value: ''
+        }
+      ]
+    }
+    },
+    created() {
+    },
+    methods: {
+      fetchEntity(val) {
+        this.$router.push({name: "UserDetails", params: val});
+      }
+    }
+};
+</script>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/directory-fortress-enmasse/blob/5aae8a26/embrasure/src/components/UserParent.vue
----------------------------------------------------------------------
diff --git a/embrasure/src/components/UserParent.vue b/embrasure/src/components/UserParent.vue
new file mode 100644
index 0000000..2270d19
--- /dev/null
+++ b/embrasure/src/components/UserParent.vue
@@ -0,0 +1,37 @@
+<template>
+<el-container>
+  <el-aside width="200px" style="background-color: #808471">
+    <el-menu class="el-menu-demo" mode="vertical" background-color="#808471" text-color="#fff" active-text-color="#ffd04b">
+      <el-menu-item index="1" @click="save" v-if="enableSave">Save</el-menu-item>
+      <el-menu-item index="2" @click="back">&lt;- User List</el-menu-item>
+      <el-menu-item index="3" @click="addEntity">Add New</el-menu-item>
+      <!-- <el-menu-item index="4" @click="deleteEntity" v-if="multipleSelection.length > 0">Delete</el-menu-item> -->
+    </el-menu>
+  </el-aside>
+  <router-view class="child"></router-view>
+</el-container>
+</template>
+<script>
+/* eslint-disable */
+import axios from "axios"
+
+export default {
+  name: 'UserParent',
+  data() {
+    return {
+      enableSave: false
+    }
+  },
+  methods: {
+    addEntity() {
+
+    },
+    deleteEntity() {
+
+    },
+    back() {
+      
+    }
+  }
+};
+</script>

http://git-wip-us.apache.org/repos/asf/directory-fortress-enmasse/blob/5aae8a26/embrasure/src/components/Users.vue
----------------------------------------------------------------------
diff --git a/embrasure/src/components/Users.vue b/embrasure/src/components/Users.vue
new file mode 100644
index 0000000..f97757f
--- /dev/null
+++ b/embrasure/src/components/Users.vue
@@ -0,0 +1,488 @@
+<template>
+<el-container>
+  <el-main>
+    <el-row type="flex" justify="start" style="padding-bottom: 4px; text-align: left;">
+          <el-col :span="20">
+            <el-input style="width: 270px; padding-right: 20px;" v-model="filters[0].value" placeholder="search"></el-input>
+              <el-button type="primary" v-if="multipleSelection.length > 0" @click="deleteEntities">Delete</el-button>
+              <el-button type="primary" @click="newUser">New User</el-button>
+              <el-button type="primary" v-if="enableSave" @click="save">Save</el-button>
+          </el-col>
+    </el-row>
+    <el-row type="flex" justify="start">
+      <el-col :span="10" justify="center">
+      <data-tables ref="userTable" :data="entities" :table-props="tableProps" :page-size="10" :pagination-props="{ background: true, pageSizes: [10, 20, 50, 100] }" :filters="filters" :highlight-current-row="true" max-height="250" @row-click="showEntity" @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column v-for="col in columns" :prop="col.prop" :label="col.label" :key="col.label" sortable="custom" width="200" header-align="center">
+        </el-table-column>
+      </data-tables>
+      </el-col>
+
+      <el-col :span="25">
+        <el-form v-if="entity != null" v-model.lazy="entity" :inline="true" label-width="120px">
+        <el-tabs v-model="curTab" type="border-card">
+          <el-tab-pane name="User Details" label="User Details">
+            <el-row justify="start" type="flex">
+            <el-col :span="19">
+            <el-row justify="start" type="flex">
+              <el-form-item label="User ID:">
+                <el-input label="User ID" placeholder="User ID" v-model="entity.userId" size="small"></el-input>
+              </el-form-item>
+              <el-form-item label="Password:">
+                <el-input type="password" label="Password" v-model="entity.password" size="small"></el-input>
+              </el-form-item>
+            </el-row>
+            <el-row justify="start" type="flex">
+              <el-form-item label="Title:">
+                <el-input label="Title" v-model="entity.title" size="small"></el-input>
+              </el-form-item>
+              <el-form-item label="Display Name:">
+                <el-input label="Display Name" v-model="entity.displayName" size="small"></el-input>
+              </el-form-item>
+            </el-row>
+            <el-row justify="start" type="flex">
+              <el-form-item label="Organization:">
+                <el-input label="Organization" placeholder="Organization" v-model="entity.ou" size="small"></el-input>
+              </el-form-item>
+              <el-form-item label="Employee Type:">
+                <el-input label="Employee Type" v-model="entity.employeeType" size="small"></el-input>
+              </el-form-item>
+            </el-row>
+            <el-row justify="start" type="flex">
+              <el-form-item label="Description:">
+                <el-input label="Description" v-model="entity.description" size="small"></el-input>
+              </el-form-item>
+              <el-form-item label="Password Policy:">
+                <el-input label="Password Policy" placeholder="" v-model="entity.pwPolicy" size="small"></el-input>
+              </el-form-item>
+            </el-row>
+            <el-row justify="start" type="flex" v-if="entity.internalId != null">
+                <el-form-item v-if="!entity.reset" label="New Password:">
+                  <el-input type="password" label="New Password:" v-model="entity.newPassword" size="mini"></el-input>
+                </el-form-item>
+                <el-form-item label="">
+                  <el-button type="primary" size="mini" v-if="!entity.reset" @click="resetPassword">Reset Password</el-button>
+                  <el-button type="primary" size="mini" @click="lockOrUnlockUser">{{entity.locked? 'Unlock' : 'Lock'}}</el-button>
+                </el-form-item>
+            </el-row>
+            </el-col>
+            <el-col :span="4">
+                <label class="el-form-item__label" style="width: 33px;">Photo</label>
+                <img v-if="entity.jpegPhoto == null" ref="userPhoto" height="125" width="125" src="../assets/nophoto.jpg" @click="selectJpegPhoto"/>
+                <img v-else ref="userPhoto" height="125" width="125" :src="jpegPhoto" @click="selectJpegPhoto"/>
+                <input type="file" ref="photoFile" @change="changeJpegPhoto" style="opacity: 0; width: 0px; height: 0px">
+            </el-col>
+            </el-row>
+          </el-tab-pane>
+          <el-tab-pane name="Role Assignments" label="Role Assignments">
+            <!-- <el-form-item label="Roles:" label-width="50px"> -->
+              <RoleAssignment :holder.sync="entity" fieldName="roles"/>
+            <!-- </el-form-item> -->
+          </el-tab-pane>
+          <el-tab-pane name="Admin Role Assignments" label="Admin Role Assignments">
+            <!-- <el-form-item label="Roles:" label-width="50px"> -->
+              <RoleAssignment :holder.sync="entity" fieldName="adminRoles" isAdminRole/>
+            <!-- </el-form-item> -->
+          </el-tab-pane>
+          <el-tab-pane name="Contact Information" label="Contact Information">
+            <el-row justify="start" type="flex">
+              <ContactInformation :entity="entity"/>
+            </el-row>
+          </el-tab-pane>
+          <el-tab-pane name="Temporal Constraints" label="Temporal Constraints">
+            <TemporalConstraints :tcHolder="entity"/>
+          </el-tab-pane>
+          <el-tab-pane name="System Information" label="System Information">
+            <el-row justify="start" type="flex">
+              <el-form-item label="System:">
+                <el-checkbox v-model="entity.system" size="small"></el-checkbox>
+              </el-form-item>
+            </el-row>
+            <el-row justify="start" type="flex">
+              <el-form-item label="Internal ID:">
+                <span style="color: black;">{{entity.internalId}}</span>
+              </el-form-item>
+            </el-row>
+            <el-row justify="start" type="flex">
+              <el-form-item label="CN:">
+                <el-input label="CN" v-model="entity.cn" size="small"></el-input>
+              </el-form-item>
+            </el-row>
+            <el-row justify="start" type="flex">
+              <el-form-item label="DN:">
+                <span style="color: black;">{{entity.dn}}</span>
+              </el-form-item>
+            </el-row>
+            <el-row justify="start" type="flex">
+              <el-form-item label="SN:">
+                <el-input label="SN" v-model="entity.sn" size="small"></el-input>
+              </el-form-item>
+            </el-row>
+          </el-tab-pane>
+        </el-tabs>
+        </el-form>
+      </el-col>
+    </el-row>
+  </el-main>
+  </el-container>
+</template>
+
+<script>
+/* eslint-disable */
+import axios from "axios"
+import * as ft from "../lib/fortress"
+import * as jsondiff from "rfc6902"
+import SplitPane from 'vue-split-pane'
+import TemporalConstraints from './TemporalConstraints.vue'
+import List from './List.vue'
+import RoleAssignment from './RoleAssignment.vue'
+import ContactInformation from './ContactInformation.vue'
+import { Notification } from 'element-ui'
+
+export default {
+  name: "Users",
+  data() {
+    return {
+      entities: [],
+      entity: null,
+      rowIndex: -1,
+      curTab: 'User Details',
+      multipleSelection: [],
+      enableSave: false,
+      columns: [{
+          prop: "userId",
+          label: "User ID"
+          }, {
+          prop: "name",
+          label: "Name"
+        }
+      ],
+     tableProps: {
+        border: false,
+        stripe: true,
+        defaultSort: {
+          prop: 'userId',
+          order: 'ascending'
+        }
+     },
+      filters: [
+        {
+          prop: ['userId', 'name', 'displayName', 'roles', 'adminRoles'],
+          value: ''
+        }
+      ]
+    }
+    },
+    created() {
+      let ftReq = {
+                  	entity: {
+		                  fqcn: "org.apache.directory.fortress.core.model.User"
+	                  },
+                    contextId: ft.CONTEXT_ID
+                  }
+      ft.showWait()
+      axios.post(ft.FT_BASE_URL+ '/userSearch', ftReq, ft.AXIOS_FT_CONFIG).then(resp => {
+        this.entities = resp.data.entities
+        if(this.entities.length > 0) {
+          this.showEntity(this.entities[0])
+        }
+        ft.closeWait()
+      }).catch(e => {
+        ft.showErr(e, '')
+      })
+    },
+    computed: {
+      jpegPhoto: {
+        get() {
+          return 'data:image/jpeg;base64,' + this.entity.jpegPhoto
+        }
+      }
+    },
+    watch: {
+      entity: {
+        deep: true,
+      handler: function(newVal, oldVal) {
+          if(this.entity._justLoaded) {
+            delete this.entity._justLoaded
+          }
+          else {
+            this.enableSave = true
+          }
+        }
+      }
+    },
+    methods: {
+      newUser() {
+        this.entity = ft.newUser()
+        this.entity._justLoaded = true
+      },
+      showEntity(val) {
+        if(val !== undefined && val != null) {
+          this.enableSave = false
+          this.rowIndex = this.entities.indexOf(val)
+          // deep clone
+          this.entity = JSON.parse(JSON.stringify(val))
+          this.entity._justLoaded = true
+          //console.log(this.$refs.userTable)
+        }
+      },
+      handleSelectionChange(val) {
+        this.multipleSelection = val;
+      },
+      async save() {
+        ft.showWait()
+        let newUser = false
+        let url = ft.FT_BASE_URL+ '/userUpdate'
+        if(this.entity.internalId == null || this.entity.internalId == undefined) {
+          url = ft.FT_BASE_URL+ '/userAdd'
+          newUser = true
+          this.entity.fqcn = 'org.apache.directory.fortress.core.model.User'
+        }
+        let ftReq = {
+                  	entity: this.entity,
+                    contextId: ft.CONTEXT_ID
+                  }
+        axios.post(url, ftReq, ft.AXIOS_FT_CONFIG).then(resp => {
+          let rolesTobeAssigned = []
+          let rolesTobeDeAssigned = []
+          let admRolesTobeAssigned = []
+          let admRolesTobeDeAssigned = []
+          if(newUser) {
+            if(this.entity.roles != null) {
+              rolesTobeAssigned = this.entity.roles
+            }
+            if(this.entity.adminRoles != null) {
+              admRolesTobeAssigned = this.entity.adminRoles
+            }
+          }
+          else {
+            let origEntity = this.entities[this.rowIndex]
+            if(origEntity.roles == null) {
+                if(this.entity.roles != null) {
+                  rolesTobeAssigned = this.entity.roles
+                }
+            }
+            else {
+              let origRoles = origEntity.roles
+              let roles = this.entity.roles.slice() // if we don't slice here later the UI is failing to refresh properly
+              for(let i=0; i< origRoles.length; i++) {
+                 let or = origRoles[i]
+                 let found = false
+                 let j=0
+                for(; j< roles.length; j++) {
+                  let r = roles[j]
+                  if(or.modId == r.modId) {
+                      found = true
+                      let op = jsondiff.createPatch(or, r)
+                      if(op.length > 0) {
+                        rolesTobeAssigned.push(r)
+                      }
+                      break
+                  }
+                }
+                if(found) {
+                  roles.splice(j, 1)
+                }
+                else {
+                  rolesTobeDeAssigned.push(or)
+                }
+              }
+              rolesTobeAssigned.push(...roles) // remaining are the new roles
+            }
+
+            if(origEntity.adminRoles == null) {
+                if(this.entity.adminRoles != null) {
+                  admRolesTobeAssigned = this.entity.adminRoles
+                }
+            }
+            else {
+              let origAdmRoles = origEntity.adminRoles
+              let admRoles = this.entity.adminRoles.slice() // if we don't slice here later the UI is failing to refresh properly
+              for(let i=0; i< origAdmRoles.length; i++) {
+                 let or = origAdmRoles[i]
+                 let found = false
+                 let j=0
+                for(; j< admRoles.length; j++) {
+                  let r = admRoles[j]
+                  if(or.modId == r.modId) {
+                      found = true
+                      let op = jsondiff.createPatch(or, r)
+                      if(op.length > 0) {
+                        admRolesTobeAssigned.push(r)
+                      }
+                      break
+                  }
+                }
+                if(found) {
+                  admRoles.splice(j, 1)
+                }
+                else {
+                  admRolesTobeDeAssigned.push(or)
+                }
+              }
+              admRolesTobeAssigned.push(...admRoles) // remaining are the new roles
+            }
+          }
+          try {
+            this.updateRoleAssignments(rolesTobeDeAssigned, ft.FT_BASE_URL + '/roleDeasgn')
+            this.updateRoleAssignments(rolesTobeAssigned, ft.FT_BASE_URL + '/roleAsgn')
+            this.updateRoleAssignments(admRolesTobeDeAssigned, ft.FT_BASE_URL + '/arleDeasgn')
+            this.updateRoleAssignments(admRolesTobeAssigned, ft.FT_BASE_URL + '/arleAsgn')
+            let readPromise = this.fetchSingleUser(this.entity.userId)
+            readPromise.then( resp => {
+              console.log('fetching user')
+              if(newUser) {
+                this.entities.push(resp.data.entity)
+                this.showEntity(resp.data.entity)
+              }
+              else {
+                let origEntity = this.entities[this.rowIndex]
+                // Object.assign(origEntity, resp.data.entity)
+                origEntity = {...origEntity, ...resp.data.entity}
+                this.$set(this.entities, this.rowIndex, origEntity)
+              }
+              this.enableSave = false
+              ft.closeWait()
+            })
+          }
+          catch(e) {
+            ft.showErr(e, '')
+          }
+        }).catch(e => {
+          console.log(e)
+          ft.showErr(e, '')
+        })
+      },
+      changeJpegPhoto() {
+        let f = this.$refs.photoFile.files[0]
+        console.log(f.type)
+        if(!f.type.startsWith('image/jpeg')) {
+          ft.showErr('Invalid image')
+          return
+        }
+        if(f.size > 1048576) { // 1 MB
+          ft.showErr('Photo size cannot exceed 1MB, please select an image with smaller size')
+          return
+        }
+        let fileReader = new FileReader()
+        let imgRef = this.$refs.userPhoto
+        let self = this
+        fileReader.addEventListener('load', function(){
+          let img = fileReader.result
+          let commaPos = img.indexOf(',')
+          img = img.substring(commaPos+1)
+          console.log(img)
+          self.$set(self.entity, 'jpegPhoto', img)
+        }, false)
+        fileReader.readAsDataURL(f)
+      },
+      selectJpegPhoto() {
+        this.$refs.photoFile.click()
+      },
+      async updateRoleAssignments(roles, url) {
+        console.log('updating role assignment')
+        for(let i=0; i< roles.length; i++) {
+          let ftReq = {
+                      entity: roles[i],
+                      contextId: ft.CONTEXT_ID
+                    }
+          let respPromise = await axios.post(url, ftReq, ft.AXIOS_FT_CONFIG)
+        }
+      },
+      async fetchSingleUser(userId) {
+          let ftReq = {
+                      entity: {
+                        fqcn: 'org.apache.directory.fortress.core.model.User',
+                        userId: userId
+                      },
+                      contextId: ft.CONTEXT_ID
+                    }
+        let respPromise = await axios.post(ft.FT_BASE_URL + '/userRead', ftReq, ft.AXIOS_FT_CONFIG)
+        console.log(respPromise)
+        return respPromise
+      },
+      lockOrUnlockUser() {
+        let ftReq = {
+                      entity: {
+                        fqcn: 'org.apache.directory.fortress.core.model.User',
+                        userId: this.entity.userId
+                      },
+                      contextId: ft.CONTEXT_ID
+                    }
+        ft.showWait()
+        let origEntity = this.entities[this.rowIndex]
+        let url = ft.FT_BASE_URL+ '/userLock'
+        if(origEntity.locked) {
+          url = ft.FT_BASE_URL+ '/userUnlock'
+        }
+        let saveState = this.enableSave
+        axios.post(url, ftReq, ft.AXIOS_FT_CONFIG).then(resp => {
+          origEntity.locked = !origEntity.locked
+          this.entity.locked = origEntity.locked
+          if(!saveState) {
+            this.entity._justLoaded = true
+          }
+          ft.closeWait()
+        }).catch(e => {
+          ft.showErr(e, '')
+        })
+      },
+      resetPassword() {
+        if(this.entity.newPassword == null || this.entity.newPassword.trim().length == 0) {
+          ft.showErr('New password cannot be empty')
+          return
+        }
+        let ftReq = {
+                      entity: this.entity,
+                      contextId: ft.CONTEXT_ID
+                    }
+        ft.showWait()
+        let saveState = this.enableSave
+        axios.post(ft.FT_BASE_URL+ '/userReset', ftReq, ft.AXIOS_FT_CONFIG).then(resp => {
+          this.entity.reset = true
+          this.entities[this.rowIndex].reset = true
+          if(!saveState) {
+            this.entity._justLoaded = true
+          }
+          ft.closeWait()
+        }).catch(e => {
+          ft.showErr(e, '')
+        })
+      },
+      deleteEntities() {
+        ft.showWait()
+        for(let i=0; i< this.multipleSelection.length; i++) {
+          let e = this.multipleSelection[i]
+          let respPromise = this._deleteSingleEntity(e)
+          respPromise.then(resp => {
+            let row = this.entities.indexOf(e)
+            this.entities.splice(row, 1)
+          }).catch(e => {
+            let msg = 'Failed to delete user ' + e.userId
+            Notification.warning({message: msg, duration: 10000})
+          })
+        }
+
+        if(this.entities.length > 0) {
+          this.showEntity(this.entities[0])
+        }
+        ft.closeWait()
+      },
+      async _deleteSingleEntity(e) {
+          let ftReq = {
+                        entity: e,
+                        contextId: ft.CONTEXT_ID
+                      }
+          let respPromise = await axios.post(ft.FT_BASE_URL+ '/userDelete', ftReq, ft.AXIOS_FT_CONFIG)
+          return respPromise
+      }
+    },
+    components: {
+      SplitPane,
+      TemporalConstraints,
+      List,
+      RoleAssignment,
+      ContactInformation
+    }
+};
+</script>

http://git-wip-us.apache.org/repos/asf/directory-fortress-enmasse/blob/5aae8a26/embrasure/src/lib/fortress.js
----------------------------------------------------------------------
diff --git a/embrasure/src/lib/fortress.js b/embrasure/src/lib/fortress.js
new file mode 100644
index 0000000..e6f8e0c
--- /dev/null
+++ b/embrasure/src/lib/fortress.js
@@ -0,0 +1,99 @@
+import { Loading, Notification } from 'element-ui'
+
+export var FT_BASE_URL = '/fortress-rest'
+export var AXIOS_FT_CONFIG = {headers: {'Content-Type': 'application/json', 'Accept': 'application/json'}}
+export var CONTEXT_ID = 'HOME'
+
+var loadingWidget = null;
+export function showWait() {
+    loadingWidget = Loading.service({
+        lock: true,
+        text: 'Loading',
+        spinner: 'el-icon-loading',
+        background: 'rgba(0, 0, 0, 0)',
+        fullscreen: true
+      })
+ }
+
+export function closeWait() {
+     if(loadingWidget != null) {
+         loadingWidget.close()
+         loadingWidget = null
+     }
+ }
+
+ export function showSuccess(msg) {
+     Notification.success({message: msg})
+ }
+
+ export function showErr(msg, e) {
+     // close if the wait screen is still present
+     closeWait()
+     if(msg === undefined || msg === null) {
+         msg = ''
+     }
+     if(e !== null && e !== undefined && e.response !== undefined) {
+        if(e.response.data !== undefined) {
+            msg = msg + ' (' + e.response.data.detail + ')'
+        }
+     }
+     Notification.warning({message: msg, duration: 10000})
+ }
+
+ export function newUser() {
+    return {
+        address: {
+            addresses: null,
+            building: null,
+            city: null,
+            country: null,
+            departmentNumber: null,
+            postOfficeBox: null,
+            postalCode: null,
+            roomNumber: null,
+            state: null
+        },
+        adminRoles: null,
+        adminSession: null,
+        beginDate: null,
+        beginLockDate: null,
+        beginTime: null,
+        cn: null,
+        contextId: null,
+        dayMask: null,
+        description: null,
+        displayName: null,
+        dn: null,
+        emails: null,
+        employeeType: null,
+        endDate: null,
+        endLockDate: null,
+        endTime: null,
+        fqcn: null,
+        gecos: null,
+        gidNumber: null,
+        homeDirectory: null,
+        internalId: null,
+        jpegPhoto: null,
+        locked: false,
+        loginShell: null,
+        mobiles: null,
+        modCode: null,
+        modId: null,
+        name: null,
+        newPassword: null,
+        ou: null,
+        password: null,
+        phones: null,
+        pwPolicy: null,
+        reset: false,
+        roles: null,
+        sequenceId: 0,
+        sn: null,
+        system: false,
+        timeout: 60,
+        title: null,
+        uidNumber: null,
+        userId: null
+    }
+ }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/directory-fortress-enmasse/blob/5aae8a26/embrasure/src/lib/rest-examples.txt
----------------------------------------------------------------------
diff --git a/embrasure/src/lib/rest-examples.txt b/embrasure/src/lib/rest-examples.txt
new file mode 100644
index 0000000..171d2a1
--- /dev/null
+++ b/embrasure/src/lib/rest-examples.txt
@@ -0,0 +1,137 @@
+Contains curl commands of some basic fortress functions.
+
+a. Add Role:
+
+curl -X POST -u 'rbacuser' -H 'Content-type: text/xml' -k -d @test-add-role-user.xml https://HOSTNAME:8443/fortress-rest-2.0.2/roleAdd
+curl -X POST -u 'rbacuser' -H 'Content-type: text/xml' -k -d @test-add-role-member.xml https://HOSTNAME:8443/fortress-rest-2.0.2/roleAdd
+curl -X POST -u 'rbacuser' -H 'Content-type: text/xml' -k -d @test-add-role-custodian.xml https://HOSTNAME:8443/fortress-rest-2.0.2/roleAdd
+curl -X POST -u 'rbacuser' -H 'Content-type: text/xml' -k -d @test-add-role-owner.xml https://HOSTNAME:8443/fortress-rest-2.0.2/roleAdd
+curl -X POST -u 'rbacuser' -H 'Content-type: text/xml' -k -d @test-add-role-colgate.xml https://HOSTNAME:8443/fortress-rest-2.0.2/roleAdd
+curl -X POST -u 'rbacuser' -H 'Content-type: text/xml' -k -d @test-add-role-ibm.xml https://HOSTNAME:8443/fortress-rest-2.0.2/roleAdd
+curl -X POST -u 'rbacuser' -H 'Content-type: text/xml' -k -d @test-add-role-acme.xml https://HOSTNAME:8443/fortress-rest-2.0.2/roleAdd
+
+# Sample request:
+<FortRequest>
+  <contextId>HOME</contextId>
+      <entity xsi:type="role" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+         <name>acme1</name>
+         <description>access to acme group data</description>
+      </entity>
+</FortRequest>
+b. Search Role:
+
+curl -X POST -u 'rbacuser' -H 'Content-type: text/xml' -k -d @test-search-role.xml https://HOSTNAME:8443/fortress-rest-2.0.2/roleSearch
+
+<FortRequest>
+    <contextId>HOME</contextId>
+    <value>acme</value>
+</FortRequest>
+c. Add User:
+
+curl -X POST -u 'rbacuser' -H 'Content-type: text/xml' -k -d @test-add-user-curly.xml https://HOSTNAME:8443/fortress-rest-2.0.2/userAdd
+curl -X POST -u 'rbacuser' -H 'Content-type: text/xml' -k -d @test-add-user-moe.xml https://HOSTNAME:8443/fortress-rest-2.0.2/userAdd
+curl -X POST -u 'rbacuser' -H 'Content-type: text/xml' -k -d @test-add-user-larry.xml https://HOSTNAME:8443/fortress-rest-2.0.2/userAdd
+
+<FortRequest>
+      <contextId>HOME</contextId>
+      <entity xsi:type="user" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+         <userId>curly</userId>
+         <description>curly is a test user</description>
+         <ou>default</ou>
+         <sn>horowitz</sn>
+         <cn>curly horowitz</cn>
+         <locked>false</locked>
+      </entity>
+</FortRequest>
+d. Search User:
+
+curl -X POST -u 'rbacuser' -H 'Content-type: text/xml' -k -d @test-search-user.xml https://HOSTNAME:8443/fortress-rest-2.0.2/userSearch
+
+<FortRequest>
+    <entity xsi:type="user" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+        <userId>rbacuser</userId>
+    </entity>
+    <contextId>HOME</contextId>
+</FortRequest>
+e. Assign User:
+
+curl -X POST -u 'rbacuser' -H 'Content-type: text/xml' -k -d @test-assign-curly-acme.xml https://HOSTNAME:8443/fortress-rest-2.0.2/roleAsgn
+curl -X POST -u 'rbacuser' -H 'Content-type: text/xml' -k -d @test-assign-curly-colgate.xml https://HOSTNAME:8443/fortress-rest-2.0.2/roleAsgn
+curl -X POST -u 'rbacuser' -H 'Content-type: text/xml' -k -d @test-assign-curly-custodian.xml https://HOSTNAME:8443/fortress-rest-2.0.2/roleAsgn
+curl -X POST -u 'rbacuser' -H 'Content-type: text/xml' -k -d @test-assign-curly-ibm.xml https://HOSTNAME:8443/fortress-rest-2.0.2/roleAsgn
+curl -X POST -u 'rbacuser' -H 'Content-type: text/xml' -k -d @test-assign-curly-member.xml https://HOSTNAME:8443/fortress-rest-2.0.2/roleAsgn
+curl -X POST -u 'rbacuser' -H 'Content-type: text/xml' -k -d @test-assign-larry-acme.xml https://HOSTNAME:8443/fortress-rest-2.0.2/roleAsgn
+curl -X POST -u 'rbacuser' -H 'Content-type: text/xml' -k -d @test-assign-larry-colgate.xml https://HOSTNAME:8443/fortress-rest-2.0.2/roleAsgn
+curl -X POST -u 'rbacuser' -H 'Content-type: text/xml' -k -d @test-assign-larry-custodian.xml https://HOSTNAME:8443/fortress-rest-2.0.2/roleAsgn
+curl -X POST -u 'rbacuser' -H 'Content-type: text/xml' -k -d @test-assign-larry-member.xml https://HOSTNAME:8443/fortress-rest-2.0.2/roleAsgn
+curl -X POST -u 'rbacuser' -H 'Content-type: text/xml' -k -d @test-assign-moe-colgate.xml https://HOSTNAME:8443/fortress-rest-2.0.2/roleAsgn
+curl -X POST -u 'rbacuser' -H 'Content-type: text/xml' -k -d @test-assign-moe-ibm.xml https://HOSTNAME:8443/fortress-rest-2.0.2/roleAsgn
+curl -X POST -u 'rbacuser' -H 'Content-type: text/xml' -k -d @test-assign-moe-owner.xml https://HOSTNAME:8443/fortress-rest-2.0.2/roleAsgn
+
+<FortRequest>
+      <contextId>HOME</contextId>
+      <entity xsi:type="userRole" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+         <userId>curly</userId>
+         <name>acme</name>
+      </entity>
+</FortRequest>
+f. Create Session
+
+curl -X POST -u 'rbacuser' -H 'Content-type: text/xml' -k -d @test-create-session-curly.xml https://HOSTNAME:8443/fortress-rest-2.0.2/rbacCreateT
+curl -X POST -u 'rbacuser' -H 'Content-type: text/xml' -k -d @test-create-session-moe.xml https://HOSTNAME:8443/fortress-rest-2.0.2/rbacCreateT
+curl -X POST -u 'rbacuser' -H 'Content-type: text/xml' -k -d @test-create-session-larry.xml https://HOSTNAME:8443/fortress-rest-2.0.2/rbacCreateT
+h. Test Add Permission Object
+
+ curl -X POST -u 'rbacuser' -H 'Content-type: text/xml' -k -d @test-add-perm-object.xml https://HOSTNAME:8443/fortress-rest-2.0.1/objAdd
+i. Test Add Permission Operation
+
+ curl -X POST -u 'rbacuser' -H 'Content-type: text/xml' -k -d @test-add-perm-operation.xml https://HOSTNAME:8443/fortress-rest-2.0.2/permAdd
+j. Test Add Role Grant (to permission)
+
+ curl -X POST -u 'rbacuser' -H 'Content-type: text/xml' -k -d @test-add-role-grant.xml https://HOSTNAME:8443/fortress-rest-2.0.2/roleGrant
+k. Test Check Access
+
+ curl -X POST -u 'rbacuser' -H 'Content-type: text/xml' -k -d @test-check-access.xml https://HOSTNAME:8443/fortress-rest-2.0.2/rbacAuthZ
+l. Add User Role Constraint:
+
+ curl -X POST -u 'rbacuser' -H 'Content-type: text/xml' -k -d @test-assign-curly-role-member-constraint-colgate.xml https://HOSTNAME:8443/fortress-rest-2.0.2/addRoleConstraint
+
+ <FortRequest>
+    <contextId>HOME</contextId>
+    <entity xsi:type="userRole" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+        <name>member</name>
+        <userId>curly</userId>
+    </entity>
+    <entity2 xsi:type="roleConstraint" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+        <key>engagement</key>
+        <value>colgate</value>
+        <type>USER</type>
+    </entity2>
+ </FortRequest>
+m. Remove User Role Constraint:
+
+ curl -X POST -u 'rbacuser' -H 'Content-type: text/xml' -k -d @test-assign-curly-role-member-constraint-colgate.xml https://HOSTNAME:8443/fortress-rest-2.0.2/removeRoleConstraint
+
+ <FortRequest>
+    <contextId>HOME</contextId>
+    <entity xsi:type="userRole" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+        <name>member</name>
+        <userId>curly</userId>
+    </entity>
+    <entity2 xsi:type="roleConstraint" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+        <key>engagement</key>
+        <value>colgate</value>
+        <type>USER</type>
+    </entity2>
+ </FortRequest>
+n. Search Permissions:
+
+ curl -X POST -u 'rbacuser' -H 'Content-type: text/xml' -k -d @test-search-perms.xml https://HOSTNAME:8443/fortress-rest-2.0.2/permSearch
+
+ <FortRequest>
+    <contextId>HOME</contextId>
+    <entity xsi:type="permGrant" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+        <objName></objName>
+        <opName></opName>
+    </entity>
+ </FortRequest>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/directory-fortress-enmasse/blob/5aae8a26/embrasure/src/main.js
----------------------------------------------------------------------
diff --git a/embrasure/src/main.js b/embrasure/src/main.js
new file mode 100644
index 0000000..b7d6f7d
--- /dev/null
+++ b/embrasure/src/main.js
@@ -0,0 +1,22 @@
+import Vue from 'vue'
+import App from './App.vue'
+import router from './router'
+import ElementUI from 'element-ui'
+import 'element-ui/lib/theme-chalk/index.css'
+import locale from 'element-ui/lib/locale/lang/en'
+//import { Notification } from 'element-ui';
+import {DataTables} from 'vue-data-tables'
+
+Vue.config.productionTip = false
+Vue.use(ElementUI, { locale })
+Vue.use(DataTables)
+
+new Vue({
+  el: '#app',
+  router,
+  render: h => h(App),
+  components: { App },
+  template: '<App/>',
+  created: function() {
+  }
+})
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/directory-fortress-enmasse/blob/5aae8a26/embrasure/src/router/index.js
----------------------------------------------------------------------
diff --git a/embrasure/src/router/index.js b/embrasure/src/router/index.js
new file mode 100644
index 0000000..8bc8be3
--- /dev/null
+++ b/embrasure/src/router/index.js
@@ -0,0 +1,35 @@
+/* eslint-disable */
+import Vue from 'vue'
+import ViewRouter from 'vue-router'
+import UserList from '@/components/UserList'
+import UserParent from '@/components/UserParent'
+import Users from '@/components/Users'
+//import UserDetails from '@/components/UserDetails'
+
+Vue.use(ViewRouter)
+
+export default new ViewRouter({
+  routes: [
+    {
+      path: '/',
+      name: 'Users',
+      component: Users
+    },
+    {
+      path: '/users',
+      component: UserParent,
+      children: [
+        {
+          path: '',
+          name: 'UserList',
+          component: UserList
+        },
+        // {
+        //   path: ':id',
+        //   name: 'UserDetails',
+        //   component: UserDetails
+        // }
+      ]
+    }
+  ]
+})

http://git-wip-us.apache.org/repos/asf/directory-fortress-enmasse/blob/5aae8a26/embrasure/vue.config.js
----------------------------------------------------------------------
diff --git a/embrasure/vue.config.js b/embrasure/vue.config.js
new file mode 100644
index 0000000..91ae8e1
--- /dev/null
+++ b/embrasure/vue.config.js
@@ -0,0 +1,11 @@
+module.exports = {
+  lintOnSave: false,
+  devServer: {
+    proxy: {
+      '/fortress-rest': {
+        target: 'http://localhost:7070',
+        changeOrigin: true
+      }
+    }
+  }
+}
\ No newline at end of file


[2/3] directory-fortress-enmasse git commit: first drop of new Fortress UI

Posted by ka...@apache.org.
http://git-wip-us.apache.org/repos/asf/directory-fortress-enmasse/blob/5aae8a26/embrasure/package-lock.json
----------------------------------------------------------------------
diff --git a/embrasure/package-lock.json b/embrasure/package-lock.json
new file mode 100644
index 0000000..519c91d
--- /dev/null
+++ b/embrasure/package-lock.json
@@ -0,0 +1,12366 @@
+{
+  "name": "embrasure",
+  "version": "0.1.0",
+  "lockfileVersion": 1,
+  "requires": true,
+  "dependencies": {
+    "@babel/code-frame": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.47.tgz",
+      "integrity": "sha512-W7IeG4MoVf4oUvWfHUx9VG9if3E0xSUDf1urrnNYtC2ow1dz2ptvQ6YsJfyVXDuPTFXz66jkHhzMW7a5Eld7TA==",
+      "dev": true,
+      "requires": {
+        "@babel/highlight": "7.0.0-beta.47"
+      }
+    },
+    "@babel/core": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.0.0-beta.47.tgz",
+      "integrity": "sha512-7EIuAX0UVnCgZ0E9tz9rFK0gd+aovwMA9bul+dnkmBQYLrJdas2EHMUSmaK67i1cyZpvgVvXhHtXJxC7wo3rlQ==",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "7.0.0-beta.47",
+        "@babel/generator": "7.0.0-beta.47",
+        "@babel/helpers": "7.0.0-beta.47",
+        "@babel/template": "7.0.0-beta.47",
+        "@babel/traverse": "7.0.0-beta.47",
+        "@babel/types": "7.0.0-beta.47",
+        "babylon": "7.0.0-beta.47",
+        "convert-source-map": "1.6.0",
+        "debug": "3.2.6",
+        "json5": "0.5.1",
+        "lodash": "4.17.11",
+        "micromatch": "2.3.11",
+        "resolve": "1.8.1",
+        "semver": "5.6.0",
+        "source-map": "0.5.7"
+      }
+    },
+    "@babel/generator": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.0.0-beta.47.tgz",
+      "integrity": "sha512-fJP+9X+gqgTTZzTqrKJHwebPwt6S/e/4YuyRyKyWHAIirGgUwjRoZgbFci24wwGYMJW7nlkCSwWG7QvCVsG0eg==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "7.0.0-beta.47",
+        "jsesc": "2.5.1",
+        "lodash": "4.17.11",
+        "source-map": "0.5.7",
+        "trim-right": "1.0.1"
+      }
+    },
+    "@babel/helper-annotate-as-pure": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0-beta.47.tgz",
+      "integrity": "sha512-Pjxb/PrxyKWc7jcAXlawvNAQMxxY+tSSNC5wxJstJjpO10mocmGzBOqNYjxdvVhMb3d0BEPQ8mR+D65fFpZ+TA==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "7.0.0-beta.47"
+      }
+    },
+    "@babel/helper-builder-binary-assignment-operator-visitor": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.0.0-beta.47.tgz",
+      "integrity": "sha512-nv8d6TcDBb1CJMQzwab/e0rqyqoP9d2AQBjr4GdSiVRpJX4aiLEiLBm2XprdEb/sVIRmmBnVxPXJaHDsS/K2fw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-explode-assignable-expression": "7.0.0-beta.47",
+        "@babel/types": "7.0.0-beta.47"
+      }
+    },
+    "@babel/helper-call-delegate": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.0.0-beta.47.tgz",
+      "integrity": "sha512-Rx9TRmCCEP0pWau9gfR6ubcbbX3nVc4ImNY143ftC70jrKdSv5rS20yz2cmCilDzhexwGZQ3PFwOLKe3C/5aEg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-hoist-variables": "7.0.0-beta.47",
+        "@babel/traverse": "7.0.0-beta.47",
+        "@babel/types": "7.0.0-beta.47"
+      }
+    },
+    "@babel/helper-define-map": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.0.0-beta.47.tgz",
+      "integrity": "sha512-pLB9RY7GZKcc/frzgfDY/HwdqxWPe60qMAvNUef1V1bDZ8i4AUgxAANgltFzj61t100WGhqaS0xGkALD+9VA+g==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-function-name": "7.0.0-beta.47",
+        "@babel/types": "7.0.0-beta.47",
+        "lodash": "4.17.11"
+      }
+    },
+    "@babel/helper-explode-assignable-expression": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.0.0-beta.47.tgz",
+      "integrity": "sha512-1mwk27zmhSuMUcVWxw5ZKiPYfuWXviZNqgA4OvFBloPf9R+dKDhNgP2uUrkHh68ltVVc3Bup1nsbd/2KM5AxEw==",
+      "dev": true,
+      "requires": {
+        "@babel/traverse": "7.0.0-beta.47",
+        "@babel/types": "7.0.0-beta.47"
+      }
+    },
+    "@babel/helper-function-name": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.47.tgz",
+      "integrity": "sha512-0LSvt95XCYaOrDA5K68KkTyldKXizDwBnKACdYzQszp1GdbtzmSeGwFU5Ecw86fU6bkYXtDvkFTOQwk/WQSJPw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-get-function-arity": "7.0.0-beta.47",
+        "@babel/template": "7.0.0-beta.47",
+        "@babel/types": "7.0.0-beta.47"
+      }
+    },
+    "@babel/helper-get-function-arity": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.47.tgz",
+      "integrity": "sha512-63j0i3YUW8CO//uQc3ACffJdIlYcIlysuHjMF0yzQhqKoQ/CUPv0hf3nBwdRGjiWrr3JcL6++NF4XmXdwSU+fA==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "7.0.0-beta.47"
+      }
+    },
+    "@babel/helper-hoist-variables": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0-beta.47.tgz",
+      "integrity": "sha512-5BcKFhyzrsInlrfO/tGoe6khUuJzGfROD7oozF/5MWsKo/c3gVJfQ5y83lZ4XoTKJt/x4PQlLU0aHd/SJpYONA==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "7.0.0-beta.47"
+      }
+    },
+    "@babel/helper-member-expression-to-functions": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0-beta.47.tgz",
+      "integrity": "sha512-gpipslnZw2hcVGADUtqQII9KF8FPpRZsVUXwKP/0EnWwtujRFSVL+u2Fh+VXODRAxFmTLo6eGcOr/Vfan0MqYw==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "7.0.0-beta.47"
+      }
+    },
+    "@babel/helper-module-imports": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0-beta.47.tgz",
+      "integrity": "sha512-Rk43Ty+a6npu9znK22IqFlseStRGWxEHi2cjmLbbi63VGiseofdUtIJI65F9MTCuMTXAX7VbY/ghef1Jp5qpvw==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "7.0.0-beta.47",
+        "lodash": "4.17.11"
+      }
+    },
+    "@babel/helper-module-transforms": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.0.0-beta.47.tgz",
+      "integrity": "sha512-CziMe30ZunAhe6j05oNOFOg7im1lcv3dYuMxrwBYVe9YdP4NHPU7a1wrDBUhaPmyqTIZDwGnFne7k1KP79SeGQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-imports": "7.0.0-beta.47",
+        "@babel/helper-simple-access": "7.0.0-beta.47",
+        "@babel/helper-split-export-declaration": "7.0.0-beta.47",
+        "@babel/template": "7.0.0-beta.47",
+        "@babel/types": "7.0.0-beta.47",
+        "lodash": "4.17.11"
+      }
+    },
+    "@babel/helper-optimise-call-expression": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0-beta.47.tgz",
+      "integrity": "sha512-NhnGhjwrhzGas4A/PoBDEtEPCGJHrzhaT6qGmo1hmkA2orG4UNi7KENC38DhJII0n2oUrKUuzTwgCvxKOTiHbw==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "7.0.0-beta.47"
+      }
+    },
+    "@babel/helper-plugin-utils": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0-beta.47.tgz",
+      "integrity": "sha512-GR67o8boOKVJRKM5Nhk7oVEHpxYy8R00lwu0F82WxxBH+iiT26DqW1e/4w/mo7Bdn1A6l0pNaOlNk1PdM2Hgag==",
+      "dev": true
+    },
+    "@babel/helper-regex": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.0.0-beta.47.tgz",
+      "integrity": "sha512-dafidvVkjJP5AIWkJspV+7RGj1jeNts0qYvlmVzqAGb6BmQzEldJr6ZPzrmlpW/AW1YJGdw7br2yiwvlCRqDvQ==",
+      "dev": true,
+      "requires": {
+        "lodash": "4.17.11"
+      }
+    },
+    "@babel/helper-remap-async-to-generator": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.0.0-beta.47.tgz",
+      "integrity": "sha512-Nmj3lUHQscD160asav2bZ3sMIjGwGY9r6Vrriy9TqH7bmaClKUKUs5Twv0htFWfOKNFLEeY/MaqiAXylr1GS2w==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-annotate-as-pure": "7.0.0-beta.47",
+        "@babel/helper-wrap-function": "7.0.0-beta.47",
+        "@babel/template": "7.0.0-beta.47",
+        "@babel/traverse": "7.0.0-beta.47",
+        "@babel/types": "7.0.0-beta.47"
+      }
+    },
+    "@babel/helper-replace-supers": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.0.0-beta.47.tgz",
+      "integrity": "sha512-yf2JAD1+xNTjavqazqknRgPfd6MbGfvfIcAkxWsPURynAwOMSs4zThED8ImT2d5a97rGPysRJcq1jNh2L0WYxg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-member-expression-to-functions": "7.0.0-beta.47",
+        "@babel/helper-optimise-call-expression": "7.0.0-beta.47",
+        "@babel/traverse": "7.0.0-beta.47",
+        "@babel/types": "7.0.0-beta.47"
+      }
+    },
+    "@babel/helper-simple-access": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.0.0-beta.47.tgz",
+      "integrity": "sha512-sd2t3QDKjd+hHkJKaC2AX39l6oIil1N548oMZAtV5YHlVGoWWkAVGnPMxRg7ICEjIftCU3ZI6UeaogyEhF8t7Q==",
+      "dev": true,
+      "requires": {
+        "@babel/template": "7.0.0-beta.47",
+        "@babel/types": "7.0.0-beta.47",
+        "lodash": "4.17.11"
+      }
+    },
+    "@babel/helper-split-export-declaration": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.47.tgz",
+      "integrity": "sha512-jx8GmxryT6Qy4+24W6M6TnVL9T8bxqdyg5UKHjxBdw0Y2Sano1n0WphUS2seuOugn04W2ZQLqGc0ut8nGe/taA==",
+      "dev": true,
+      "requires": {
+        "@babel/types": "7.0.0-beta.47"
+      }
+    },
+    "@babel/helper-wrap-function": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.0.0-beta.47.tgz",
+      "integrity": "sha512-SAasvh80Mz5q9x15dqH6z8jpM0WTBmxQSNZATSwJwhmWdme6r2gxpufIMr8LwQIJHmXmgNLmvh0zdWSbE/PR4Q==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-function-name": "7.0.0-beta.47",
+        "@babel/template": "7.0.0-beta.47",
+        "@babel/traverse": "7.0.0-beta.47",
+        "@babel/types": "7.0.0-beta.47"
+      }
+    },
+    "@babel/helpers": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.0.0-beta.47.tgz",
+      "integrity": "sha512-uWk7gIua2COEWLwZGxfF5Wq1bgXOt1V6xzWxqeFznrA6F1TUPiAhkK5zORiZEa5RAILp6Mswsn3xFjDyCpp3rQ==",
+      "dev": true,
+      "requires": {
+        "@babel/template": "7.0.0-beta.47",
+        "@babel/traverse": "7.0.0-beta.47",
+        "@babel/types": "7.0.0-beta.47"
+      }
+    },
+    "@babel/highlight": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.47.tgz",
+      "integrity": "sha512-d505K3Hth1eg0b2swfEF7oFMw3J9M8ceFg0s6dhCSxOOF+07WDvJ0HKT/YbK/Jk9wn8Wyr6HIRAUPKJ9Wfv8Rg==",
+      "dev": true,
+      "requires": {
+        "chalk": "2.4.1",
+        "esutils": "2.0.2",
+        "js-tokens": "3.0.2"
+      }
+    },
+    "@babel/plugin-proposal-async-generator-functions": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.0.0-beta.47.tgz",
+      "integrity": "sha512-TQMLYVIqQ0MqVS1Z7jsuv3HlEetLo/7EnDY9mGBZ4c4/WLD/mu+tFuLiK2/2QH5wgi5viRfJGs/+L5TaDzxWng==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "7.0.0-beta.47",
+        "@babel/helper-remap-async-to-generator": "7.0.0-beta.47",
+        "@babel/plugin-syntax-async-generators": "7.0.0-beta.47"
+      }
+    },
+    "@babel/plugin-proposal-class-properties": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.0.0-beta.47.tgz",
+      "integrity": "sha512-6yuCiF+ZZHPLgAa+0a6/teNeAMsWqY6AVtZA4NhCWnwP4OH0JrRaY7rwvFCJSqNGurf8rF65W9IucM/l0+HOCg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-function-name": "7.0.0-beta.47",
+        "@babel/helper-plugin-utils": "7.0.0-beta.47",
+        "@babel/helper-replace-supers": "7.0.0-beta.47",
+        "@babel/plugin-syntax-class-properties": "7.0.0-beta.47"
+      }
+    },
+    "@babel/plugin-proposal-decorators": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.0.0-beta.47.tgz",
+      "integrity": "sha512-sI+cO1okrlOyV4I63HDXf/SFsCr492HLjzNsMsd7Lk9WrViA+eQIboIiI9wHicozdgD1WrpZGJTjz7Z3xwl2Qw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "7.0.0-beta.47",
+        "@babel/plugin-syntax-decorators": "7.0.0-beta.47"
+      }
+    },
+    "@babel/plugin-proposal-object-rest-spread": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.0.0-beta.47.tgz",
+      "integrity": "sha512-ujUjQUyTxUWHfixRD7Y5Nm8VCgHSf6YgbM37LEnojKp5lPahZO42qJfDty+Kh0tEanpI5H8BLPkJbFSzx6TNEw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "7.0.0-beta.47",
+        "@babel/plugin-syntax-object-rest-spread": "7.0.0-beta.47"
+      }
+    },
+    "@babel/plugin-proposal-optional-catch-binding": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.0.0-beta.47.tgz",
+      "integrity": "sha512-XMZavW6uior8KD4BeMavxF3PGrwVpIFlZk/GJQGkd3lOeOHil8nhHDuTWvsbsJptKFWMPkhGR18boNdxgmxyFQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "7.0.0-beta.47",
+        "@babel/plugin-syntax-optional-catch-binding": "7.0.0-beta.47"
+      }
+    },
+    "@babel/plugin-proposal-unicode-property-regex": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.0.0-beta.47.tgz",
+      "integrity": "sha512-TCQqSmPrgVB0Txr6WzCpxJyLuVTb9KoT0+oECKELtF717bvHOI4woR7o8D8DFkXzVQeb7Kqfu5w05gsvPq591g==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "7.0.0-beta.47",
+        "@babel/helper-regex": "7.0.0-beta.47",
+        "regexpu-core": "4.2.0"
+      }
+    },
+    "@babel/plugin-syntax-async-generators": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.0.0-beta.47.tgz",
+      "integrity": "sha512-LCNGYTLpQAsvTmVmT/I2pz7dIh3Bu+9BLxqL7b3QfplsMQxNsoBBMend33Arb4EtPt5dX7KeeVof8tL0trDRRA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "7.0.0-beta.47"
+      }
+    },
+    "@babel/plugin-syntax-class-properties": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.0.0-beta.47.tgz",
+      "integrity": "sha512-vLoAuLSjHSenX3TQmri6ttQWZp3rEtGcRp4LgYEBQ012fN5h+KmcssvkCAqm6V6ozS5KzUWpBlZ6t7YhZG6oBw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "7.0.0-beta.47"
+      }
+    },
+    "@babel/plugin-syntax-decorators": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.0.0-beta.47.tgz",
+      "integrity": "sha512-Lv10BM3C+0Ki53lI7T9xZsSsgzQqfoQZq4pZj0F6tkK54E5BBSFfUxGavRE43CFXHbK0Hd9uMqmpGWPGtCvgAw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "7.0.0-beta.47"
+      }
+    },
+    "@babel/plugin-syntax-dynamic-import": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.0.0-beta.47.tgz",
+      "integrity": "sha512-J2y7RAH2NwQ+ahJahj2eS1PqS2NWNWTDaEibqrE55VTJU7nPL8AhthRwIQfQkCH+8UIeL/T3Jh1iHIRkvJ6dXA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "7.0.0-beta.47"
+      }
+    },
+    "@babel/plugin-syntax-jsx": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.0.0-beta.47.tgz",
+      "integrity": "sha512-5scuJzIYZY8M+A1ra8mcKANIwB5TtsRD6Aw94xZxfvnjhhVMFR5RYE9HshVlBrZVY+r3cJDNIQLJMC/fGJHImA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "7.0.0-beta.47"
+      }
+    },
+    "@babel/plugin-syntax-object-rest-spread": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.0.0-beta.47.tgz",
+      "integrity": "sha512-UOGQCmzvNlZMQOuys7xPiTa2EjTT3xHuhUghcdJnYikqGV43obpIIaP+VDCWPvIT8g0QDIvmRWx5UefvkWXN+w==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "7.0.0-beta.47"
+      }
+    },
+    "@babel/plugin-syntax-optional-catch-binding": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.0.0-beta.47.tgz",
+      "integrity": "sha512-Dmq+REMR95Syg+VjV3bh63DD/tDxdraNQ4ErAOXFobfSCDbfov9YGkqSJ4K61LHTQwinQ0+dIUlgdFL2kbedIw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "7.0.0-beta.47"
+      }
+    },
+    "@babel/plugin-transform-arrow-functions": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.0.0-beta.47.tgz",
+      "integrity": "sha512-xiU+7RJAsqx+iZqWSQQWBu9ZDTruWimkg4puDSdRVfEwgZQdOtiU2LuO0+xGFyitJPHkKuje0WvK1tFu1dmxCw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "7.0.0-beta.47"
+      }
+    },
+    "@babel/plugin-transform-async-to-generator": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.0.0-beta.47.tgz",
+      "integrity": "sha512-/TXK3v6ipvmhMO81Y2Vjc7RYROkS2PcmRc+kvmU3CWA7r5I73KWg10UEW/fpWqCuoTCHHHXu1ZcZ5u+nduJeFw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-imports": "7.0.0-beta.47",
+        "@babel/helper-plugin-utils": "7.0.0-beta.47",
+        "@babel/helper-remap-async-to-generator": "7.0.0-beta.47"
+      }
+    },
+    "@babel/plugin-transform-block-scoped-functions": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.0.0-beta.47.tgz",
+      "integrity": "sha512-8KPxKyE6kb9VRbHwQ8XKsg/IPlxHaOMRyg2WfyV5C4dCmXbRdHDJy4hZKB3o4rGxjggmC/Bx8Fh51/P7UNtTcA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "7.0.0-beta.47"
+      }
+    },
+    "@babel/plugin-transform-block-scoping": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.0.0-beta.47.tgz",
+      "integrity": "sha512-V/u3Zdy40KjVQeyYUaQnCGiHQbRNJoc6IEtNDERltuW9vYPHS1n6YGc+EHKi8JVYT4kE6UHOjD+BrbCCV4kjRw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "7.0.0-beta.47",
+        "lodash": "4.17.11"
+      }
+    },
+    "@babel/plugin-transform-classes": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.0.0-beta.47.tgz",
+      "integrity": "sha512-hzW/jL6TPBMHJXeXwzuxMN0PFAfjVD0UzATHrFSejY5A7SvhWWrv1cZ3K0/SzCXJ9LpMdxCNiREvVjeD/Tyx2g==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-annotate-as-pure": "7.0.0-beta.47",
+        "@babel/helper-define-map": "7.0.0-beta.47",
+        "@babel/helper-function-name": "7.0.0-beta.47",
+        "@babel/helper-optimise-call-expression": "7.0.0-beta.47",
+        "@babel/helper-plugin-utils": "7.0.0-beta.47",
+        "@babel/helper-replace-supers": "7.0.0-beta.47",
+        "@babel/helper-split-export-declaration": "7.0.0-beta.47",
+        "globals": "11.8.0"
+      }
+    },
+    "@babel/plugin-transform-computed-properties": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.0.0-beta.47.tgz",
+      "integrity": "sha512-V78qyzmjj4aq/tjpkMFbV5gPtrx7xdclW1Rn6vV9hIwMSMbtstYEXF4msy614MofvYj6gYbPbNfyhXFIUvz/xw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "7.0.0-beta.47"
+      }
+    },
+    "@babel/plugin-transform-destructuring": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.0.0-beta.47.tgz",
+      "integrity": "sha512-3AaXC9H7qPybJbSs/QMhhj9EZF9MYrb/HRytwki1tckaYifqCJquENIZxDAYmwsWIGIHiq34WqwPRMIsz/b5uQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "7.0.0-beta.47"
+      }
+    },
+    "@babel/plugin-transform-dotall-regex": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.0.0-beta.47.tgz",
+      "integrity": "sha512-ofB5GwipMoaOH3Qyr5g5FpXWePhIAaD4zMDOoAHDYBPuLWxzAME8YQCa0S3HJf3eTu/HTN/c/G1gDwDB8Z/gKQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "7.0.0-beta.47",
+        "@babel/helper-regex": "7.0.0-beta.47",
+        "regexpu-core": "4.2.0"
+      }
+    },
+    "@babel/plugin-transform-duplicate-keys": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.0.0-beta.47.tgz",
+      "integrity": "sha512-r3xNVYTLVasjqTowIr6s+27oc5n7A5TKbB0/4u9FHjF7ONTWaggO8UFbbj07DOJ4Ll2RkigrZA8/D+w2nJ+XlA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "7.0.0-beta.47"
+      }
+    },
+    "@babel/plugin-transform-exponentiation-operator": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.0.0-beta.47.tgz",
+      "integrity": "sha512-vyGG3kLIXpMuaPL485aqowdWFrxCxXtbzMXy9p1QTK5Q/+9UHpK9XoAVJZGknnsm091m0Ss7spo8uHaxbzYVog==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-builder-binary-assignment-operator-visitor": "7.0.0-beta.47",
+        "@babel/helper-plugin-utils": "7.0.0-beta.47"
+      }
+    },
+    "@babel/plugin-transform-for-of": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.0.0-beta.47.tgz",
+      "integrity": "sha512-tfH5OMzV9fWLYJTzWDhoRJKr8kvBZWH26jiCgM0ayNq75ES/X947MqMNAgBjJdTAVEV2kOyks2ItgNAJT4rOUw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "7.0.0-beta.47"
+      }
+    },
+    "@babel/plugin-transform-function-name": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.0.0-beta.47.tgz",
+      "integrity": "sha512-/5I/f8NCouugsRT6ORB1UjCP3N+Rgv/OB6SzmaeIUEpYYPM6D7WQ+4BaRYXQn4eqtOJmTgxDXYa8FgYtoeqP9A==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-function-name": "7.0.0-beta.47",
+        "@babel/helper-plugin-utils": "7.0.0-beta.47"
+      }
+    },
+    "@babel/plugin-transform-literals": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.0.0-beta.47.tgz",
+      "integrity": "sha512-PxBw+52qWypwR76YfS2FlW4wZfp61SjIyt3OSPZeWnf0zVQWNVrlRRunJ7lBYudDYvyMwStAE/VynZ0fHtPgng==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "7.0.0-beta.47"
+      }
+    },
+    "@babel/plugin-transform-modules-amd": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.0.0-beta.47.tgz",
+      "integrity": "sha512-zW84YqQ5Kt8+t5pYrnFhjWQP2w2wq6Nxz9pozxpnvXP+lhqyJPqNdWM1lcVApORpWL1BF7BlgP08yk+5MVRfGA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-transforms": "7.0.0-beta.47",
+        "@babel/helper-plugin-utils": "7.0.0-beta.47"
+      }
+    },
+    "@babel/plugin-transform-modules-commonjs": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.0.0-beta.47.tgz",
+      "integrity": "sha512-MYoLyexybBJ9ODWWMsMFzxAQey68RzhQNPjfNAYPhPPB3X160EZ5qOjWxRS2rYNvuYAxs6guy5OdrDpESqFSrQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-transforms": "7.0.0-beta.47",
+        "@babel/helper-plugin-utils": "7.0.0-beta.47",
+        "@babel/helper-simple-access": "7.0.0-beta.47"
+      }
+    },
+    "@babel/plugin-transform-modules-systemjs": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.0.0-beta.47.tgz",
+      "integrity": "sha512-bMQy3/jEZRpoUg7RdOouphBO8+7Sfjl7XrO84PtgBx4ck+ZPc4xOlBQyr2rkmsJNmmGLi42nnMI1cZZJT3LVnQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-hoist-variables": "7.0.0-beta.47",
+        "@babel/helper-plugin-utils": "7.0.0-beta.47"
+      }
+    },
+    "@babel/plugin-transform-modules-umd": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.0.0-beta.47.tgz",
+      "integrity": "sha512-rG7KioAFCLxZ33wNBqUoxPhtXOmVEvnZNIy9wv0fSbNIQr8lO1avZ7SeBL3OZduNvLocqrESt9Xhh1nzb/zOvA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-transforms": "7.0.0-beta.47",
+        "@babel/helper-plugin-utils": "7.0.0-beta.47"
+      }
+    },
+    "@babel/plugin-transform-new-target": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0-beta.47.tgz",
+      "integrity": "sha512-2IRZtdoPXJn7KSwrmp0xtLTZ0PnhlQxhcTZ0XZ5wfFXmsZ9vi6AK4whIZ2IXI/c2qrYK9FEYLwR5QRfL5Qe6eQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "7.0.0-beta.47"
+      }
+    },
+    "@babel/plugin-transform-object-super": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.0.0-beta.47.tgz",
+      "integrity": "sha512-JN6ox2rH1xe6hlsd6/7d2kPjZSA97wH4oOdNOSaNqaFGEFuaP/Je4+ojHMgyHKU2nx9QHNBCTxHEj+ko+Ij6HQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "7.0.0-beta.47",
+        "@babel/helper-replace-supers": "7.0.0-beta.47"
+      }
+    },
+    "@babel/plugin-transform-parameters": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.0.0-beta.47.tgz",
+      "integrity": "sha512-UzQG8draO+30Y8eNEREuGBfmEHLL7WFxOjmTBbaTrbdOrm/znCUThqcuNz8cyn2nrZbln7M/loQ3stjf9Pt9fQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-call-delegate": "7.0.0-beta.47",
+        "@babel/helper-get-function-arity": "7.0.0-beta.47",
+        "@babel/helper-plugin-utils": "7.0.0-beta.47"
+      }
+    },
+    "@babel/plugin-transform-regenerator": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0-beta.47.tgz",
+      "integrity": "sha512-JEPIiJyqYRfjOYUTZguLkb2HTwudReqLyOljpOXnJ/1ymwsiof4D6ul611DGlMxJMZJGQ6TBi59iY9GoJ6j4Iw==",
+      "dev": true,
+      "requires": {
+        "regenerator-transform": "0.12.4"
+      }
+    },
+    "@babel/plugin-transform-runtime": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.0.0-beta.47.tgz",
+      "integrity": "sha512-RhnhjYsOxmKDGa1ePM5RQWFBYe1PnEZAhXTNEeIwtw1jluEoLL+PCTZDbt/aAcAkZvqwIWccjkNM/FwKTd5Sxw==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-imports": "7.0.0-beta.47",
+        "@babel/helper-plugin-utils": "7.0.0-beta.47"
+      }
+    },
+    "@babel/plugin-transform-shorthand-properties": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.0.0-beta.47.tgz",
+      "integrity": "sha512-+o7/yb0Nrk4Gg/tnBgfBf+G1uGZbtkSluUnj8RyD37ajpDlWmysDjFEHSfktKcuD8YHeGz2M9AYNGcClk1fr/g==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "7.0.0-beta.47"
+      }
+    },
+    "@babel/plugin-transform-spread": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.0.0-beta.47.tgz",
+      "integrity": "sha512-LFAozFdfT4bE2AQw2BnjzLufTX4GBsTUHUGRhT8XNoDYuGnV+7k9Yj6JU3/7csJc9u6W91PArYgoO+D56CMw6Q==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "7.0.0-beta.47"
+      }
+    },
+    "@babel/plugin-transform-sticky-regex": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.0.0-beta.47.tgz",
+      "integrity": "sha512-+Rc6NihGoXcwAqAxbiumvzOYxRR0aUg1ZExfyHnI5QnQf0sf4xAfgT/YpGvEgLd5Ci0rka+IWSj54PhzZkhuTg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "7.0.0-beta.47",
+        "@babel/helper-regex": "7.0.0-beta.47"
+      }
+    },
+    "@babel/plugin-transform-template-literals": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.0.0-beta.47.tgz",
+      "integrity": "sha512-ORfrfN/gQoRuI+xf+kOa2i/yvXfedFRgH+KtgoIrpUQom7OhexxzD280x80LMCIkdaVGzYhvlC3kdJkFMWAfUg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-annotate-as-pure": "7.0.0-beta.47",
+        "@babel/helper-plugin-utils": "7.0.0-beta.47"
+      }
+    },
+    "@babel/plugin-transform-typeof-symbol": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.0.0-beta.47.tgz",
+      "integrity": "sha512-PhPy5NUY5MT++fEr7/sxN1/ERSM2siHSbGgdkbqgDlyvf1NlU1HeqyfomHJEFE1Y4PX0hj+XmtjSAali/6XqYA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "7.0.0-beta.47"
+      }
+    },
+    "@babel/plugin-transform-unicode-regex": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.0.0-beta.47.tgz",
+      "integrity": "sha512-44nWn421tMVZ/A4+1uppzoAO7nrlwWzefMr9JUi5G+tXl0DLEtWy+F7L6zCVw19C4OAOA6WlolVro5CEs6g6AQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "7.0.0-beta.47",
+        "@babel/helper-regex": "7.0.0-beta.47",
+        "regexpu-core": "4.2.0"
+      }
+    },
+    "@babel/preset-env": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.0.0-beta.47.tgz",
+      "integrity": "sha512-ZFUgKdQDqw2H5TCMaWq6iDDO9+16RZPdDfOuoPID8Agm8I2MBlrqTI1MKWwqgEHICdZIOXkVszAMuuDTBwdzHA==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-imports": "7.0.0-beta.47",
+        "@babel/helper-plugin-utils": "7.0.0-beta.47",
+        "@babel/plugin-proposal-async-generator-functions": "7.0.0-beta.47",
+        "@babel/plugin-proposal-object-rest-spread": "7.0.0-beta.47",
+        "@babel/plugin-proposal-optional-catch-binding": "7.0.0-beta.47",
+        "@babel/plugin-proposal-unicode-property-regex": "7.0.0-beta.47",
+        "@babel/plugin-syntax-async-generators": "7.0.0-beta.47",
+        "@babel/plugin-syntax-object-rest-spread": "7.0.0-beta.47",
+        "@babel/plugin-syntax-optional-catch-binding": "7.0.0-beta.47",
+        "@babel/plugin-transform-arrow-functions": "7.0.0-beta.47",
+        "@babel/plugin-transform-async-to-generator": "7.0.0-beta.47",
+        "@babel/plugin-transform-block-scoped-functions": "7.0.0-beta.47",
+        "@babel/plugin-transform-block-scoping": "7.0.0-beta.47",
+        "@babel/plugin-transform-classes": "7.0.0-beta.47",
+        "@babel/plugin-transform-computed-properties": "7.0.0-beta.47",
+        "@babel/plugin-transform-destructuring": "7.0.0-beta.47",
+        "@babel/plugin-transform-dotall-regex": "7.0.0-beta.47",
+        "@babel/plugin-transform-duplicate-keys": "7.0.0-beta.47",
+        "@babel/plugin-transform-exponentiation-operator": "7.0.0-beta.47",
+        "@babel/plugin-transform-for-of": "7.0.0-beta.47",
+        "@babel/plugin-transform-function-name": "7.0.0-beta.47",
+        "@babel/plugin-transform-literals": "7.0.0-beta.47",
+        "@babel/plugin-transform-modules-amd": "7.0.0-beta.47",
+        "@babel/plugin-transform-modules-commonjs": "7.0.0-beta.47",
+        "@babel/plugin-transform-modules-systemjs": "7.0.0-beta.47",
+        "@babel/plugin-transform-modules-umd": "7.0.0-beta.47",
+        "@babel/plugin-transform-new-target": "7.0.0-beta.47",
+        "@babel/plugin-transform-object-super": "7.0.0-beta.47",
+        "@babel/plugin-transform-parameters": "7.0.0-beta.47",
+        "@babel/plugin-transform-regenerator": "7.0.0-beta.47",
+        "@babel/plugin-transform-shorthand-properties": "7.0.0-beta.47",
+        "@babel/plugin-transform-spread": "7.0.0-beta.47",
+        "@babel/plugin-transform-sticky-regex": "7.0.0-beta.47",
+        "@babel/plugin-transform-template-literals": "7.0.0-beta.47",
+        "@babel/plugin-transform-typeof-symbol": "7.0.0-beta.47",
+        "@babel/plugin-transform-unicode-regex": "7.0.0-beta.47",
+        "browserslist": "3.2.8",
+        "invariant": "2.2.4",
+        "semver": "5.6.0"
+      }
+    },
+    "@babel/runtime": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.0.0-beta.47.tgz",
+      "integrity": "sha512-3IaakAC5B4bHJ0aCUKVw0pt+GruavdgWDFbf7TfKh7ZJ8yQuUp7af7MNwf3e+jH8776cjqYmMO1JNDDAE9WfrA==",
+      "dev": true,
+      "requires": {
+        "core-js": "2.5.7",
+        "regenerator-runtime": "0.11.1"
+      }
+    },
+    "@babel/template": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.47.tgz",
+      "integrity": "sha512-mAzrOCLwOb4jAobHi0kTwIkoamP1Do28c6zxvrDXjYSJFZHz6KGuzMaT0AV7ZCq7M3si7QypVVMVX2bE6IsuOg==",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "7.0.0-beta.47",
+        "@babel/types": "7.0.0-beta.47",
+        "babylon": "7.0.0-beta.47",
+        "lodash": "4.17.11"
+      }
+    },
+    "@babel/traverse": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.47.tgz",
+      "integrity": "sha512-kYGGs//OnUnei+9TTldxlgf7llprj7VUeDKtG50+g+0k1g0yZyrkEgbyFheYFdnudR8IDEHOEXVsUuY82r5Aiw==",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "7.0.0-beta.47",
+        "@babel/generator": "7.0.0-beta.47",
+        "@babel/helper-function-name": "7.0.0-beta.47",
+        "@babel/helper-split-export-declaration": "7.0.0-beta.47",
+        "@babel/types": "7.0.0-beta.47",
+        "babylon": "7.0.0-beta.47",
+        "debug": "3.2.6",
+        "globals": "11.8.0",
+        "invariant": "2.2.4",
+        "lodash": "4.17.11"
+      }
+    },
+    "@babel/types": {
+      "version": "7.0.0-beta.47",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.47.tgz",
+      "integrity": "sha512-MOP5pOosg7JETrVGg8OQyzmUmbyoSopT5j2HlblHsto89mPz3cmxzn1IA4UNUmnWKgeticSwfhS+Gdy25IIlBQ==",
+      "dev": true,
+      "requires": {
+        "esutils": "2.0.2",
+        "lodash": "4.17.11",
+        "to-fast-properties": "2.0.0"
+      }
+    },
+    "@intervolga/optimize-cssnano-plugin": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/@intervolga/optimize-cssnano-plugin/-/optimize-cssnano-plugin-1.0.6.tgz",
+      "integrity": "sha512-zN69TnSr0viRSU6cEDIcuPcP67QcpQ6uHACg58FiN9PDrU6SLyGW3MR4tiISbYxy1kDWAVPwD+XwQTWE5cigAA==",
+      "dev": true,
+      "requires": {
+        "cssnano": "4.1.4",
+        "cssnano-preset-default": "4.0.2",
+        "postcss": "7.0.5"
+      }
+    },
+    "@mrmlnc/readdir-enhanced": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
+      "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==",
+      "dev": true,
+      "requires": {
+        "call-me-maybe": "1.0.1",
+        "glob-to-regexp": "0.3.0"
+      }
+    },
+    "@nodelib/fs.stat": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.2.tgz",
+      "integrity": "sha512-yprFYuno9FtNsSHVlSWd+nRlmGoAbqbeCwOryP6sC/zoCjhpArcRMYp19EvpSUSizJAlsXEwJv+wcWS9XaXdMw==",
+      "dev": true
+    },
+    "@vue/babel-preset-app": {
+      "version": "3.0.5",
+      "resolved": "https://registry.npmjs.org/@vue/babel-preset-app/-/babel-preset-app-3.0.5.tgz",
+      "integrity": "sha512-zMFfvjDDhR+XYESXffDqM2CBy4pmCN2sJP0OyjaGshAhXKXC3oPXynrQ5uYQ1DW+1LVFIP3k6t6gRzl8URt00w==",
+      "dev": true,
+      "requires": {
+        "@babel/plugin-proposal-class-properties": "7.0.0-beta.47",
+        "@babel/plugin-proposal-decorators": "7.0.0-beta.47",
+        "@babel/plugin-syntax-dynamic-import": "7.0.0-beta.47",
+        "@babel/plugin-syntax-jsx": "7.0.0-beta.47",
+        "@babel/plugin-transform-runtime": "7.0.0-beta.47",
+        "@babel/preset-env": "7.0.0-beta.47",
+        "@babel/runtime": "7.0.0-beta.47",
+        "babel-helper-vue-jsx-merge-props": "2.0.3",
+        "babel-plugin-dynamic-import-node": "2.2.0",
+        "babel-plugin-transform-vue-jsx": "4.0.1"
+      }
+    },
+    "@vue/cli-overlay": {
+      "version": "3.0.5",
+      "resolved": "https://registry.npmjs.org/@vue/cli-overlay/-/cli-overlay-3.0.5.tgz",
+      "integrity": "sha512-OYwbI+HpEkEJ+eA9WkzlQOE7gjFxiOSAWHU1dIqiD041Sh+uo5OhEFfVARza7rFwHHB1emujFctYyScGx5rArA==",
+      "dev": true
+    },
+    "@vue/cli-plugin-babel": {
+      "version": "3.0.5",
+      "resolved": "https://registry.npmjs.org/@vue/cli-plugin-babel/-/cli-plugin-babel-3.0.5.tgz",
+      "integrity": "sha512-nZYF93CG6xfgxpljolEcejOmcHXdoqzdNmlfakFi+7Lyvwc65T7aKG4kOV3m/FD14Bh6B56xiv3rSG9GFPR6aw==",
+      "dev": true,
+      "requires": {
+        "@babel/core": "7.0.0-beta.47",
+        "@vue/babel-preset-app": "3.0.5",
+        "babel-loader": "8.0.4"
+      }
+    },
+    "@vue/cli-plugin-eslint": {
+      "version": "3.0.5",
+      "resolved": "https://registry.npmjs.org/@vue/cli-plugin-eslint/-/cli-plugin-eslint-3.0.5.tgz",
+      "integrity": "sha512-FIOHXr+/blWenEhOieINKOrs6y+mfSKn6JoIBkX0TvNFVw0qprKyJFnYt/Eu/1wUis9B45uhHme+3eKfzqxSVQ==",
+      "dev": true,
+      "requires": {
+        "@vue/cli-shared-utils": "3.0.5",
+        "babel-eslint": "8.2.6",
+        "eslint": "4.19.1",
+        "eslint-loader": "2.1.1",
+        "eslint-plugin-vue": "4.7.1"
+      }
+    },
+    "@vue/cli-service": {
+      "version": "3.0.5",
+      "resolved": "https://registry.npmjs.org/@vue/cli-service/-/cli-service-3.0.5.tgz",
+      "integrity": "sha512-rwM0qJ8wWIOSprlulADc2VWw4BINC13lz1m2tA9+i+2PN8/zIT2bxfRqNM3fxUK5bjwQAHQhqrhcpkfOtftSXg==",
+      "dev": true,
+      "requires": {
+        "@intervolga/optimize-cssnano-plugin": "1.0.6",
+        "@vue/cli-overlay": "3.0.5",
+        "@vue/cli-shared-utils": "3.0.5",
+        "@vue/preload-webpack-plugin": "1.1.0",
+        "@vue/web-component-wrapper": "1.2.0",
+        "acorn": "5.7.3",
+        "address": "1.0.3",
+        "autoprefixer": "8.6.5",
+        "cache-loader": "1.2.2",
+        "case-sensitive-paths-webpack-plugin": "2.1.2",
+        "chalk": "2.4.1",
+        "clipboardy": "1.2.3",
+        "cliui": "4.1.0",
+        "copy-webpack-plugin": "4.5.3",
+        "css-loader": "1.0.0",
+        "cssnano": "4.1.4",
+        "debug": "3.2.6",
+        "escape-string-regexp": "1.0.5",
+        "file-loader": "1.1.11",
+        "friendly-errors-webpack-plugin": "1.7.0",
+        "fs-extra": "6.0.1",
+        "globby": "8.0.1",
+        "hash-sum": "1.0.2",
+        "html-webpack-plugin": "3.2.0",
+        "launch-editor-middleware": "2.2.1",
+        "lodash.defaultsdeep": "4.6.0",
+        "lodash.mapvalues": "4.6.0",
+        "lodash.transform": "4.6.0",
+        "mini-css-extract-plugin": "0.4.4",
+        "minimist": "1.2.0",
+        "ora": "2.1.0",
+        "portfinder": "1.0.17",
+        "postcss-loader": "2.1.6",
+        "read-pkg": "4.0.1",
+        "semver": "5.6.0",
+        "slash": "2.0.0",
+        "source-map-url": "0.4.0",
+        "ssri": "6.0.1",
+        "string.prototype.padend": "3.0.0",
+        "thread-loader": "1.2.0",
+        "uglifyjs-webpack-plugin": "1.3.0",
+        "url-loader": "1.1.2",
+        "vue-loader": "15.4.2",
+        "webpack": "4.21.0",
+        "webpack-bundle-analyzer": "2.13.1",
+        "webpack-chain": "4.12.1",
+        "webpack-dev-server": "3.1.9",
+        "webpack-merge": "4.1.4",
+        "yorkie": "2.0.0"
+      },
+      "dependencies": {
+        "globby": {
+          "version": "8.0.1",
+          "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.1.tgz",
+          "integrity": "sha512-oMrYrJERnKBLXNLVTqhm3vPEdJ/b2ZE28xN4YARiix1NOIOBPEpOUnm844K1iu/BkphCaf2WNFwMszv8Soi1pw==",
+          "dev": true,
+          "requires": {
+            "array-union": "1.0.2",
+            "dir-glob": "2.0.0",
+            "fast-glob": "2.2.3",
+            "glob": "7.1.3",
+            "ignore": "3.3.10",
+            "pify": "3.0.0",
+            "slash": "1.0.0"
+          },
+          "dependencies": {
+            "slash": {
+              "version": "1.0.0",
+              "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
+              "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
+              "dev": true
+            }
+          }
+        },
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+          "dev": true
+        }
+      }
+    },
+    "@vue/cli-shared-utils": {
+      "version": "3.0.5",
+      "resolved": "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-3.0.5.tgz",
+      "integrity": "sha512-z5vPzUQGZJnRkojqVbDYar8NvGSvB0kUcO0O+Y+xkxVbjZxrq78e9bJFB4PR4QsqQbuBS9v3zawLWY4MhKwKOA==",
+      "dev": true,
+      "requires": {
+        "chalk": "2.4.1",
+        "execa": "0.10.0",
+        "joi": "13.7.0",
+        "launch-editor": "2.2.1",
+        "lru-cache": "4.1.3",
+        "node-ipc": "9.1.1",
+        "opn": "5.4.0",
+        "ora": "2.1.0",
+        "request": "2.88.0",
+        "request-promise-native": "1.0.5",
+        "semver": "5.6.0",
+        "string.prototype.padstart": "3.0.0"
+      }
+    },
+    "@vue/component-compiler-utils": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-2.2.0.tgz",
+      "integrity": "sha512-pS4zlcdD7BvedyB+IfiTfrbi6C977UMIfulSk8r6uL0BU46ZE2+fUj/zbSNSfVxeaj9ElmnSni5OMwF9np+b+w==",
+      "dev": true,
+      "requires": {
+        "consolidate": "0.15.1",
+        "hash-sum": "1.0.2",
+        "lru-cache": "4.1.3",
+        "merge-source-map": "1.1.0",
+        "postcss": "6.0.23",
+        "postcss-selector-parser": "3.1.1",
+        "prettier": "1.13.7",
+        "source-map": "0.5.7",
+        "vue-template-es2015-compiler": "1.6.0"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "6.0.23",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
+          "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
+          "dev": true,
+          "requires": {
+            "chalk": "2.4.1",
+            "source-map": "0.6.1",
+            "supports-color": "5.5.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
+            }
+          }
+        },
+        "postcss-selector-parser": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz",
+          "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=",
+          "dev": true,
+          "requires": {
+            "dot-prop": "4.2.0",
+            "indexes-of": "1.0.1",
+            "uniq": "1.0.1"
+          }
+        }
+      }
+    },
+    "@vue/preload-webpack-plugin": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/@vue/preload-webpack-plugin/-/preload-webpack-plugin-1.1.0.tgz",
+      "integrity": "sha512-rcn2KhSHESBFMPj5vc5X2pI9bcBNQQixvJXhD5gZ4rN2iym/uH2qfDSQfUS5+qwiz0a85TCkeUs6w6jxFDudbw==",
+      "dev": true
+    },
+    "@vue/web-component-wrapper": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/@vue/web-component-wrapper/-/web-component-wrapper-1.2.0.tgz",
+      "integrity": "sha512-Xn/+vdm9CjuC9p3Ae+lTClNutrVhsXpzxvoTXXtoys6kVRX9FkueSUAqSWAyZntmVLlR4DosBV4pH8y5Z/HbUw==",
+      "dev": true
+    },
+    "@webassemblyjs/ast": {
+      "version": "1.7.8",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.8.tgz",
+      "integrity": "sha512-dOrtdtEyB8sInpl75yLPNksY4sRl0j/+t6aHyB/YA+ab9hV3Fo7FmG12FHzP+2MvWVAJtDb+6eXR5EZbZJ+uVg==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/helper-module-context": "1.7.8",
+        "@webassemblyjs/helper-wasm-bytecode": "1.7.8",
+        "@webassemblyjs/wast-parser": "1.7.8"
+      }
+    },
+    "@webassemblyjs/floating-point-hex-parser": {
+      "version": "1.7.8",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.8.tgz",
+      "integrity": "sha512-kn2zNKGsbql5i56VAgRYkpG+VazqHhQQZQycT2uXAazrAEDs23gy+Odkh5VblybjnwX2/BITkDtNmSO76hdIvQ==",
+      "dev": true
+    },
+    "@webassemblyjs/helper-api-error": {
+      "version": "1.7.8",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.8.tgz",
+      "integrity": "sha512-xUwxDXsd1dUKArJEP5wWM5zxgCSwZApSOJyP1XO7M8rNUChUDblcLQ4FpzTpWG2YeylMwMl1MlP5Ztryiz1x4g==",
+      "dev": true
+    },
+    "@webassemblyjs/helper-buffer": {
+      "version": "1.7.8",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.8.tgz",
+      "integrity": "sha512-WXiIMnuvuwlhWvVOm8xEXU9DnHaa3AgAU0ZPfvY8vO1cSsmYb2WbGbHnMLgs43vXnA7XAob9b56zuZaMkxpCBg==",
+      "dev": true
+    },
+    "@webassemblyjs/helper-code-frame": {
+      "version": "1.7.8",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.8.tgz",
+      "integrity": "sha512-TLQxyD9qGOIdX5LPQOPo0Ernd88U5rHkFb8WAjeMIeA0sPjCHeVPaGqUGGIXjUcblUkjuDAc07bruCcNHUrHDA==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/wast-printer": "1.7.8"
+      }
+    },
+    "@webassemblyjs/helper-fsm": {
+      "version": "1.7.8",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.8.tgz",
+      "integrity": "sha512-TjK0CnD8hAPkV5mbSp5aWl6SO1+H3WFcjWtixWoy8EMA99YnNzYhpc/WSYWhf7yrhpzkq5tZB0tvLK3Svr3IXA==",
+      "dev": true
+    },
+    "@webassemblyjs/helper-module-context": {
+      "version": "1.7.8",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.8.tgz",
+      "integrity": "sha512-uCutAKR7Nm0VsFixcvnB4HhAyHouNbj0Dx1p7eRjFjXGGZ+N7ftTaG1ZbWCasAEbtwGj54LP8+lkBZdTCPmLGg==",
+      "dev": true
+    },
+    "@webassemblyjs/helper-wasm-bytecode": {
+      "version": "1.7.8",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.8.tgz",
+      "integrity": "sha512-AdCCE3BMW6V34WYaKUmPgVHa88t2Z14P4/0LjLwuGkI0X6pf7nzp0CehzVVk51cKm2ymVXjl9dCG+gR1yhITIQ==",
+      "dev": true
+    },
+    "@webassemblyjs/helper-wasm-section": {
+      "version": "1.7.8",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.8.tgz",
+      "integrity": "sha512-BkBhYQuzyl4hgTGOKo87Vdw6f9nj8HhI7WYpI0MCC5qFa5ahrAPOGgyETVdnRbv+Rjukl9MxxfDmVcVC435lDg==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.7.8",
+        "@webassemblyjs/helper-buffer": "1.7.8",
+        "@webassemblyjs/helper-wasm-bytecode": "1.7.8",
+        "@webassemblyjs/wasm-gen": "1.7.8"
+      }
+    },
+    "@webassemblyjs/ieee754": {
+      "version": "1.7.8",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.8.tgz",
+      "integrity": "sha512-tOarWChdG1a3y1yqCX0JMDKzrat5tQe4pV6K/TX19BcXsBLYxFQOL1DEDa5KG9syeyvCrvZ+i1+Mv1ExngvktQ==",
+      "dev": true,
+      "requires": {
+        "@xtuc/ieee754": "1.2.0"
+      }
+    },
+    "@webassemblyjs/leb128": {
+      "version": "1.7.8",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.8.tgz",
+      "integrity": "sha512-GCYeGPgUFWJiZuP4NICbcyUQNxNLJIf476Ei+K+jVuuebtLpfvwkvYT6iTUE7oZYehhkor4Zz2g7SJ/iZaPudQ==",
+      "dev": true,
+      "requires": {
+        "@xtuc/long": "4.2.1"
+      }
+    },
+    "@webassemblyjs/utf8": {
+      "version": "1.7.8",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.8.tgz",
+      "integrity": "sha512-9X+f0VV+xNXW2ujfIRSXBJENGE6Qh7bNVKqu3yDjTFB3ar3nsThsGBBKdTG58aXOm2iUH6v28VIf88ymPXODHA==",
+      "dev": true
+    },
+    "@webassemblyjs/wasm-edit": {
+      "version": "1.7.8",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.8.tgz",
+      "integrity": "sha512-6D3Hm2gFixrfyx9XjSON4ml1FZTugqpkIz5Awvrou8fnpyprVzcm4X8pyGRtA2Piixjl3DqmX/HB1xdWyE097A==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.7.8",
+        "@webassemblyjs/helper-buffer": "1.7.8",
+        "@webassemblyjs/helper-wasm-bytecode": "1.7.8",
+        "@webassemblyjs/helper-wasm-section": "1.7.8",
+        "@webassemblyjs/wasm-gen": "1.7.8",
+        "@webassemblyjs/wasm-opt": "1.7.8",
+        "@webassemblyjs/wasm-parser": "1.7.8",
+        "@webassemblyjs/wast-printer": "1.7.8"
+      }
+    },
+    "@webassemblyjs/wasm-gen": {
+      "version": "1.7.8",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.8.tgz",
+      "integrity": "sha512-a7O/wE6eBeVKKUYgpMK7NOHmMADD85rSXLe3CqrWRDwWff5y3cSVbzpN6Qv3z6C4hdkpq9qyij1Ga1kemOZGvQ==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.7.8",
+        "@webassemblyjs/helper-wasm-bytecode": "1.7.8",
+        "@webassemblyjs/ieee754": "1.7.8",
+        "@webassemblyjs/leb128": "1.7.8",
+        "@webassemblyjs/utf8": "1.7.8"
+      }
+    },
+    "@webassemblyjs/wasm-opt": {
+      "version": "1.7.8",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.8.tgz",
+      "integrity": "sha512-3lbQ0PT81NHCdi1sR/7+SNpZadM4qYcTSr62nFFAA7e5lFwJr14M1Gi+A/Y3PgcDWOHYjsaNGPpPU0H03N6Blg==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.7.8",
+        "@webassemblyjs/helper-buffer": "1.7.8",
+        "@webassemblyjs/wasm-gen": "1.7.8",
+        "@webassemblyjs/wasm-parser": "1.7.8"
+      }
+    },
+    "@webassemblyjs/wasm-parser": {
+      "version": "1.7.8",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.8.tgz",
+      "integrity": "sha512-rZ/zlhp9DHR/05zh1MbAjT2t624sjrPP/OkJCjXqzm7ynH+nIdNcn9Ixc+qzPMFXhIrk0rBoQ3to6sEIvHh9jQ==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.7.8",
+        "@webassemblyjs/helper-api-error": "1.7.8",
+        "@webassemblyjs/helper-wasm-bytecode": "1.7.8",
+        "@webassemblyjs/ieee754": "1.7.8",
+        "@webassemblyjs/leb128": "1.7.8",
+        "@webassemblyjs/utf8": "1.7.8"
+      }
+    },
+    "@webassemblyjs/wast-parser": {
+      "version": "1.7.8",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.8.tgz",
+      "integrity": "sha512-Q/zrvtUvzWuSiJMcSp90fi6gp2nraiHXjTV2VgAluVdVapM4gy1MQn7akja2p6eSBDQpKJPJ6P4TxRkghRS5dg==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.7.8",
+        "@webassemblyjs/floating-point-hex-parser": "1.7.8",
+        "@webassemblyjs/helper-api-error": "1.7.8",
+        "@webassemblyjs/helper-code-frame": "1.7.8",
+        "@webassemblyjs/helper-fsm": "1.7.8",
+        "@xtuc/long": "4.2.1"
+      }
+    },
+    "@webassemblyjs/wast-printer": {
+      "version": "1.7.8",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.8.tgz",
+      "integrity": "sha512-GllIthRtwTxRDAURRNXscu7Napzmdf1jt1gpiZiK/QN4fH0lSGs3OTmvdfsMNP7tqI4B3ZtfaaWRlNIQug6Xyg==",
+      "dev": true,
+      "requires": {
+        "@webassemblyjs/ast": "1.7.8",
+        "@webassemblyjs/wast-parser": "1.7.8",
+        "@xtuc/long": "4.2.1"
+      }
+    },
+    "@xtuc/ieee754": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+      "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
+      "dev": true
+    },
+    "@xtuc/long": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.1.tgz",
+      "integrity": "sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g==",
+      "dev": true
+    },
+    "accepts": {
+      "version": "1.3.5",
+      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz",
+      "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=",
+      "dev": true,
+      "requires": {
+        "mime-types": "2.1.20",
+        "negotiator": "0.6.1"
+      }
+    },
+    "acorn": {
+      "version": "5.7.3",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz",
+      "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==",
+      "dev": true
+    },
+    "acorn-dynamic-import": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz",
+      "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==",
+      "dev": true,
+      "requires": {
+        "acorn": "5.7.3"
+      }
+    },
+    "acorn-jsx": {
+      "version": "3.0.1",
+      "resolved": "http://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz",
+      "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=",
+      "dev": true,
+      "requires": {
+        "acorn": "3.3.0"
+      },
+      "dependencies": {
+        "acorn": {
+          "version": "3.3.0",
+          "resolved": "http://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
+          "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=",
+          "dev": true
+        }
+      }
+    },
+    "address": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/address/-/address-1.0.3.tgz",
+      "integrity": "sha512-z55ocwKBRLryBs394Sm3ushTtBeg6VAeuku7utSoSnsJKvKcnXFIyC6vh27n3rXyxSgkJBBCAvyOn7gSUcTYjg==",
+      "dev": true
+    },
+    "ajv": {
+      "version": "5.5.2",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
+      "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+      "dev": true,
+      "requires": {
+        "co": "4.6.0",
+        "fast-deep-equal": "1.1.0",
+        "fast-json-stable-stringify": "2.0.0",
+        "json-schema-traverse": "0.3.1"
+      }
+    },
+    "ajv-errors": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.0.tgz",
+      "integrity": "sha1-7PAh+hCP0X37Xms4Py3SM+Mf/Fk=",
+      "dev": true
+    },
+    "ajv-keywords": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz",
+      "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=",
+      "dev": true
+    },
+    "alphanum-sort": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz",
+      "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=",
+      "dev": true
+    },
+    "ansi-colors": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.1.0.tgz",
+      "integrity": "sha512-hTv1qPdi+sVEk3jYsdjox5nQI0C9HTbjKShbCdYLKb1LOfNbb7wsF4d7OEKIZoxIHx02tSp3m94jcPW2EfMjmA==",
+      "dev": true
+    },
+    "ansi-escapes": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz",
+      "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==",
+      "dev": true
+    },
+    "ansi-html": {
+      "version": "0.0.7",
+      "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz",
+      "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=",
+      "dev": true
+    },
+    "ansi-regex": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+      "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+      "dev": true
+    },
+    "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.3"
+      }
+    },
+    "anymatch": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
+      "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
+      "dev": true,
+      "requires": {
+        "micromatch": "3.1.10",
+        "normalize-path": "2.1.1"
+      },
+      "dependencies": {
+        "arr-diff": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+          "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+          "dev": true
+        },
+        "array-unique": {
+          "version": "0.3.2",
+          "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+          "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+          "dev": true
+        },
+        "braces": {
+          "version": "2.3.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+          "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+          "dev": true,
+          "requires": {
+            "arr-flatten": "1.1.0",
+            "array-unique": "0.3.2",
+            "extend-shallow": "2.0.1",
+            "fill-range": "4.0.0",
+            "isobject": "3.0.1",
+            "repeat-element": "1.1.3",
+            "snapdragon": "0.8.2",
+            "snapdragon-node": "2.1.1",
+            "split-string": "3.1.0",
+            "to-regex": "3.0.2"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "0.1.1"
+              }
+            }
+          }
+        },
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+          "dev": true,
+          "requires": {
+            "ms": "2.0.0"
+          }
+        },
+        "expand-brackets": {
+          "version": "2.1.4",
+          "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+          "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+          "dev": true,
+          "requires": {
+            "debug": "2.6.9",
+            "define-property": "0.2.5",
+            "extend-shallow": "2.0.1",
+            "posix-character-classes": "0.1.1",
+            "regex-not": "1.0.2",
+            "snapdragon": "0.8.2",
+            "to-regex": "3.0.2"
+          },
+          "dependencies": {
+            "define-property": {
+              "version": "0.2.5",
+              "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+              "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+              "dev": true,
+              "requires": {
+                "is-descriptor": "0.1.6"
+              }
+            },
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "0.1.1"
+              }
+            },
+            "is-accessor-descriptor": {
+              "version": "0.1.6",
+              "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+              "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+              "dev": true,
+              "requires": {
+                "kind-of": "3.2.2"
+              },
+              "dependencies": {
+                "kind-of": {
+                  "version": "3.2.2",
+                  "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+                  "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+                  "dev": true,
+                  "requires": {
+                    "is-buffer": "1.1.6"
+                  }
+                }
+              }
+            },
+            "is-data-descriptor": {
+              "version": "0.1.4",
+              "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+              "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+              "dev": true,
+              "requires": {
+                "kind-of": "3.2.2"
+              },
+              "dependencies": {
+                "kind-of": {
+                  "version": "3.2.2",
+                  "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+                  "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+                  "dev": true,
+                  "requires": {
+                    "is-buffer": "1.1.6"
+                  }
+                }
+              }
+            },
+            "is-descriptor": {
+              "version": "0.1.6",
+              "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+              "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+              "dev": true,
+              "requires": {
+                "is-accessor-descriptor": "0.1.6",
+                "is-data-descriptor": "0.1.4",
+                "kind-of": "5.1.0"
+              }
+            },
+            "kind-of": {
+              "version": "5.1.0",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+              "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+              "dev": true
+            }
+          }
+        },
+        "extglob": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+          "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+          "dev": true,
+          "requires": {
+            "array-unique": "0.3.2",
+            "define-property": "1.0.0",
+            "expand-brackets": "2.1.4",
+            "extend-shallow": "2.0.1",
+            "fragment-cache": "0.2.1",
+            "regex-not": "1.0.2",
+            "snapdragon": "0.8.2",
+            "to-regex": "3.0.2"
+          },
+          "dependencies": {
+            "define-property": {
+              "version": "1.0.0",
+              "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+              "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+              "dev": true,
+              "requires": {
+                "is-descriptor": "1.0.2"
+              }
+            },
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "0.1.1"
+              }
+            }
+          }
+        },
+        "fill-range": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+          "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+          "dev": true,
+          "requires": {
+            "extend-shallow": "2.0.1",
+            "is-number": "3.0.0",
+            "repeat-string": "1.6.1",
+            "to-regex-range": "2.1.1"
+          },
+          "dependencies": {
+            "extend-shallow": {
+              "version": "2.0.1",
+              "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+              "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+              "dev": true,
+              "requires": {
+                "is-extendable": "0.1.1"
+              }
+            }
+          }
+        },
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "6.0.2"
+          }
+        },
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "6.0.2"
+          }
+        },
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "1.0.0",
+            "is-data-descriptor": "1.0.0",
+            "kind-of": "6.0.2"
+          }
+        },
+        "is-number": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+          "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+          "dev": true,
+          "requires": {
+            "kind-of": "3.2.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "dev": true,
+              "requires": {
+                "is-buffer": "1.1.6"
+              }
+            }
+          }
+        },
+        "isobject": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+          "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+          "dev": true
+        },
+        "kind-of": {
+          "version": "6.0.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+          "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+          "dev": true
+        },
+        "micromatch": {
+          "version": "3.1.10",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+          "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+          "dev": true,
+          "requires": {
+            "arr-diff": "4.0.0",
+            "array-unique": "0.3.2",
+            "braces": "2.3.2",
+            "define-property": "2.0.2",
+            "extend-shallow": "3.0.2",
+            "extglob": "2.0.4",
+            "fragment-cache": "0.2.1",
+            "kind-of": "6.0.2",
+            "nanomatch": "1.2.13",
+            "object.pick": "1.3.0",
+            "regex-not": "1.0.2",
+            "snapdragon": "0.8.2",
+            "to-regex": "3.0.2"
+          }
+        },
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+          "dev": true
+        }
+      }
+    },
+    "aproba": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
+      "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
+      "dev": true
+    },
+    "arch": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/arch/-/arch-2.1.1.tgz",
+      "integrity": "sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg==",
+      "dev": true
+    },
+    "argparse": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+      "dev": true,
+      "requires": {
+        "sprintf-js": "1.0.3"
+      }
+    },
+    "arr-diff": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
+      "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
+      "dev": true,
+      "requires": {
+        "arr-flatten": "1.1.0"
+      }
+    },
+    "arr-flatten": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+      "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+      "dev": true
+    },
+    "arr-union": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+      "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+      "dev": true
+    },
+    "array-filter": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz",
+      "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=",
+      "dev": true
+    },
+    "array-flatten": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+      "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
+      "dev": true
+    },
+    "array-map": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz",
+      "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=",
+      "dev": true
+    },
+    "array-reduce": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz",
+      "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=",
+      "dev": true
+    },
+    "array-union": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
+      "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+      "dev": true,
+      "requires": {
+        "array-uniq": "1.0.3"
+      }
+    },
+    "array-uniq": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
+      "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
+      "dev": true
+    },
+    "array-unique": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
+      "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
+      "dev": true
+    },
+    "arrify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+      "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
+      "dev": true
+    },
+    "asn1": {
+      "version": "0.2.4",
+      "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
+      "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
+      "dev": true,
+      "requires": {
+        "safer-buffer": "2.1.2"
+      }
+    },
+    "asn1.js": {
+      "version": "4.10.1",
+      "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
+      "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==",
+      "dev": true,
+      "requires": {
+        "bn.js": "4.11.8",
+        "inherits": "2.0.3",
+        "minimalistic-assert": "1.0.1"
+      }
+    },
+    "assert": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz",
+      "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=",
+      "dev": true,
+      "requires": {
+        "util": "0.10.3"
+      },
+      "dependencies": {
+        "inherits": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
+          "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
+          "dev": true
+        },
+        "util": {
+          "version": "0.10.3",
+          "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
+          "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
+          "dev": true,
+          "requires": {
+            "inherits": "2.0.1"
+          }
+        }
+      }
+    },
+    "assert-plus": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+      "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+      "dev": true
+    },
+    "assign-symbols": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+      "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+      "dev": true
+    },
+    "async": {
+      "version": "1.5.2",
+      "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz",
+      "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+      "dev": true
+    },
+    "async-each": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
+      "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=",
+      "dev": true
+    },
+    "async-limiter": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
+      "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==",
+      "dev": true
+    },
+    "async-validator": {
+      "version": "1.8.5",
+      "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-1.8.5.tgz",
+      "integrity": "sha512-tXBM+1m056MAX0E8TL2iCjg8WvSyXu0Zc8LNtYqrVeyoL3+esHRZ4SieE9fKQyyU09uONjnMEjrNBMqT0mbvmA==",
+      "requires": {
+        "babel-runtime": "6.26.0"
+      }
+    },
+    "asynckit": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
+      "dev": true
+    },
+    "atob": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
+      "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
+      "dev": true
+    },
+    "autoprefixer": {
+      "version": "8.6.5",
+      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-8.6.5.tgz",
+      "integrity": "sha512-PLWJN3Xo/rycNkx+mp8iBDMTm3FeWe4VmYaZDSqL5QQB9sLsQkG5k8n+LNDFnhh9kdq2K+egL/icpctOmDHwig==",
+      "dev": true,
+      "requires": {
+        "browserslist": "3.2.8",
+        "caniuse-lite": "1.0.30000892",
+        "normalize-range": "0.1.2",
+        "num2fraction": "1.2.2",
+        "postcss": "6.0.23",
+        "postcss-value-parser": "3.3.1"
+      },
+      "dependencies": {
+        "postcss": {
+          "version": "6.0.23",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
+          "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
+          "dev": true,
+          "requires": {
+            "chalk": "2.4.1",
+            "source-map": "0.6.1",
+            "supports-color": "5.5.0"
+          }
+        },
+        "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
+        }
+      }
+    },
+    "aws-sign2": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+      "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
+      "dev": true
+    },
+    "aws4": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
+      "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==",
+      "dev": true
+    },
+    "axios": {
+      "version": "0.18.0",
+      "resolved": "http://registry.npmjs.org/axios/-/axios-0.18.0.tgz",
+      "integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=",
+      "requires": {
+        "follow-redirects": "1.5.9",
+        "is-buffer": "1.1.6"
+      }
+    },
+    "babel-code-frame": {
+      "version": "6.26.0",
+      "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+      "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+      "dev": true,
+      "requires": {
+        "chalk": "1.1.3",
+        "esutils": "2.0.2",
+        "js-tokens": "3.0.2"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+          "dev": true
+        },
+        "ansi-styles": {
+          "version": "2.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+          "dev": true
+        },
+        "chalk": {
+          "version": "1.1.3",
+          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "dev": true,
+          "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"
+          }
+        },
+        "strip-ansi": {
+          "version": "3.0.1",
+          "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+          "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "2.1.1"
+          }
+        },
+        "supports-color": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+          "dev": true
+        }
+      }
+    },
+    "babel-eslint": {
+      "version": "8.2.6",
+      "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-8.2.6.tgz",
+      "integrity": "sha512-aCdHjhzcILdP8c9lej7hvXKvQieyRt20SF102SIGyY4cUIiw6UaAtK4j2o3dXX74jEmy0TJ0CEhv4fTIM3SzcA==",
+      "dev": true,
+      "requires": {
+        "@babel/code-frame": "7.0.0-beta.44",
+        "@babel/traverse": "7.0.0-beta.44",
+        "@babel/types": "7.0.0-beta.44",
+        "babylon": "7.0.0-beta.44",
+        "eslint-scope": "3.7.1",
+        "eslint-visitor-keys": "1.0.0"
+      },
+      "dependencies": {
+        "@babel/code-frame": {
+          "version": "7.0.0-beta.44",
+          "resolved": "http://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz",
+          "integrity": "sha512-cuAuTTIQ9RqcFRJ/Y8PvTh+paepNcaGxwQwjIDRWPXmzzyAeCO4KqS9ikMvq0MCbRk6GlYKwfzStrcP3/jSL8g==",
+          "dev": true,
+          "requires": {
+            "@babel/highlight": "7.0.0-beta.44"
+          }
+        },
+        "@babel/generator": {
+          "version": "7.0.0-beta.44",
+          "resolved": "http://registry.npmjs.org/@babel/generator/-/generator-7.0.0-beta.44.tgz",
+          "integrity": "sha512-5xVb7hlhjGcdkKpMXgicAVgx8syK5VJz193k0i/0sLP6DzE6lRrU1K3B/rFefgdo9LPGMAOOOAWW4jycj07ShQ==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "7.0.0-beta.44",
+            "jsesc": "2.5.1",
+            "lodash": "4.17.11",
+            "source-map": "0.5.7",
+            "trim-right": "1.0.1"
+          }
+        },
+        "@babel/helper-function-name": {
+          "version": "7.0.0-beta.44",
+          "resolved": "http://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz",
+          "integrity": "sha512-MHRG2qZMKMFaBavX0LWpfZ2e+hLloT++N7rfM3DYOMUOGCD8cVjqZpwiL8a0bOX3IYcQev1ruciT0gdFFRTxzg==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-get-function-arity": "7.0.0-beta.44",
+            "@babel/template": "7.0.0-beta.44",
+            "@babel/types": "7.0.0-beta.44"
+          }
+        },
+        "@babel/helper-get-function-arity": {
+          "version": "7.0.0-beta.44",
+          "resolved": "http://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz",
+          "integrity": "sha512-w0YjWVwrM2HwP6/H3sEgrSQdkCaxppqFeJtAnB23pRiJB5E/O9Yp7JAAeWBl+gGEgmBFinnTyOv2RN7rcSmMiw==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "7.0.0-beta.44"
+          }
+        },
+        "@babel/helper-split-export-declaration": {
+          "version": "7.0.0-beta.44",
+          "resolved": "http://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz",
+          "integrity": "sha512-aQ7QowtkgKKzPGf0j6u77kBMdUFVBKNHw2p/3HX/POt5/oz8ec5cs0GwlgM8Hz7ui5EwJnzyfRmkNF1Nx1N7aA==",
+          "dev": true,
+          "requires": {
+            "@babel/types": "7.0.0-beta.44"
+          }
+        },
+        "@babel/highlight": {
+          "version": "7.0.0-beta.44",
+          "resolved": "http://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0-beta.44.tgz",
+          "integrity": "sha512-Il19yJvy7vMFm8AVAh6OZzaFoAd0hbkeMZiX3P5HGD+z7dyI7RzndHB0dg6Urh/VAFfHtpOIzDUSxmY6coyZWQ==",
+          "dev": true,
+          "requires": {
+            "chalk": "2.4.1",
+            "esutils": "2.0.2",
+            "js-tokens": "3.0.2"
+          }
+        },
+        "@babel/template": {
+          "version": "7.0.0-beta.44",
+          "resolved": "http://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.44.tgz",
+          "integrity": "sha512-w750Sloq0UNifLx1rUqwfbnC6uSUk0mfwwgGRfdLiaUzfAOiH0tHJE6ILQIUi3KYkjiCDTskoIsnfqZvWLBDng==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "7.0.0-beta.44",
+            "@babel/types": "7.0.0-beta.44",
+            "babylon": "7.0.0-beta.44",
+            "lodash": "4.17.11"
+          }
+        },
+        "@babel/traverse": {
+          "version": "7.0.0-beta.44",
+          "resolved": "http://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.44.tgz",
+          "integrity": "sha512-UHuDz8ukQkJCDASKHf+oDt3FVUzFd+QYfuBIsiNu/4+/ix6pP/C+uQZJ6K1oEfbCMv/IKWbgDEh7fcsnIE5AtA==",
+          "dev": true,
+          "requires": {
+            "@babel/code-frame": "7.0.0-beta.44",
+            "@babel/generator": "7.0.0-beta.44",
+            "@babel/helper-function-name": "7.0.0-beta.44",
+            "@babel/helper-split-export-declaration": "7.0.0-beta.44",
+            "@babel/types": "7.0.0-beta.44",
+            "babylon": "7.0.0-beta.44",
+            "debug": "3.2.6",
+            "globals": "11.8.0",
+            "invariant": "2.2.4",
+            "lodash": "4.17.11"
+          }
+        },
+        "@babel/types": {
+          "version": "7.0.0-beta.44",
+          "resolved": "http://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.44.tgz",
+          "integrity": "sha512-5eTV4WRmqbaFM3v9gHAIljEQJU4Ssc6fxL61JN+Oe2ga/BwyjzjamwkCVVAQjHGuAX8i0BWo42dshL8eO5KfLQ==",
+          "dev": true,
+          "requires": {
+            "esutils": "2.0.2",
+            "lodash": "4.17.11",
+            "to-fast-properties": "2.0.0"
+          }
+        },
+        "babylon": {
+          "version": "7.0.0-beta.44",
+          "resolved": "http://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.44.tgz",
+          "integrity": "sha512-5Hlm13BJVAioCHpImtFqNOF2H3ieTOHd0fmFGMxOJ9jgeFqeAwsv3u5P5cR7CSeFrkgHsT19DgFJkHV0/Mcd8g==",
+          "dev": true
+        }
+      }
+    },
+    "babel-helper-vue-jsx-merge-props": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz",
+      "integrity": "sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg=="
+    },
+    "babel-loader": {
+      "version": "8.0.4",
+      "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.4.tgz",
+      "integrity": "sha512-fhBhNkUToJcW9nV46v8w87AJOwAJDz84c1CL57n3Stj73FANM/b9TbCUK4YhdOwEyZ+OxhYpdeZDNzSI29Firw==",
+      "dev": true,
+      "requires": {
+        "find-cache-dir": "1.0.0",
+       

<TRUNCATED>

[3/3] directory-fortress-enmasse git commit: first drop of new Fortress UI

Posted by ka...@apache.org.
first drop of new Fortress UI


Project: http://git-wip-us.apache.org/repos/asf/directory-fortress-enmasse/repo
Commit: http://git-wip-us.apache.org/repos/asf/directory-fortress-enmasse/commit/5aae8a26
Tree: http://git-wip-us.apache.org/repos/asf/directory-fortress-enmasse/tree/5aae8a26
Diff: http://git-wip-us.apache.org/repos/asf/directory-fortress-enmasse/diff/5aae8a26

Branch: refs/heads/FC-247
Commit: 5aae8a26f3df2d5682cbd791bc31b65bd7e80c76
Parents: 65d32f2
Author: Kiran Ayyagari <ka...@apache.org>
Authored: Sun Nov 18 21:10:16 2018 +0530
Committer: Kiran Ayyagari <ka...@apache.org>
Committed: Sun Nov 18 21:10:16 2018 +0530

----------------------------------------------------------------------
 embrasure/.gitignore                            |    21 +
 embrasure/README.md                             |    26 +
 embrasure/babel.config.js                       |     5 +
 embrasure/package-lock.json                     | 12366 +++++++++++++++++
 embrasure/package.json                          |    50 +
 embrasure/public/embrasure-favicon.png          |   Bin 0 -> 14376 bytes
 embrasure/public/index.html                     |    17 +
 embrasure/src/App.vue                           |    92 +
 embrasure/src/assets/nophoto.jpg                |   Bin 0 -> 3667 bytes
 embrasure/src/components/ContactInformation.vue |    94 +
 embrasure/src/components/List.vue               |    77 +
 embrasure/src/components/RoleAssignment.vue     |   196 +
 .../src/components/TemporalConstraints.vue      |   115 +
 embrasure/src/components/UserList.vue           |    67 +
 embrasure/src/components/UserParent.vue         |    37 +
 embrasure/src/components/Users.vue              |   488 +
 embrasure/src/lib/fortress.js                   |    99 +
 embrasure/src/lib/rest-examples.txt             |   137 +
 embrasure/src/main.js                           |    22 +
 embrasure/src/router/index.js                   |    35 +
 embrasure/vue.config.js                         |    11 +
 21 files changed, 13955 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/directory-fortress-enmasse/blob/5aae8a26/embrasure/.gitignore
----------------------------------------------------------------------
diff --git a/embrasure/.gitignore b/embrasure/.gitignore
new file mode 100644
index 0000000..185e663
--- /dev/null
+++ b/embrasure/.gitignore
@@ -0,0 +1,21 @@
+.DS_Store
+node_modules
+/dist
+
+# local env files
+.env.local
+.env.*.local
+
+# Log files
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw*

http://git-wip-us.apache.org/repos/asf/directory-fortress-enmasse/blob/5aae8a26/embrasure/README.md
----------------------------------------------------------------------
diff --git a/embrasure/README.md b/embrasure/README.md
new file mode 100644
index 0000000..61dc085
--- /dev/null
+++ b/embrasure/README.md
@@ -0,0 +1,26 @@
+# embrasure
+
+## Project setup
+```
+npm install
+```
+
+### Compiles and hot-reloads for development
+```
+npm run serve
+```
+
+### Compiles and minifies for production
+```
+npm run build
+```
+
+### Run your tests
+```
+npm run test
+```
+
+### Lints and fixes files
+```
+npm run lint
+```

http://git-wip-us.apache.org/repos/asf/directory-fortress-enmasse/blob/5aae8a26/embrasure/babel.config.js
----------------------------------------------------------------------
diff --git a/embrasure/babel.config.js b/embrasure/babel.config.js
new file mode 100644
index 0000000..ba17966
--- /dev/null
+++ b/embrasure/babel.config.js
@@ -0,0 +1,5 @@
+module.exports = {
+  presets: [
+    '@vue/app'
+  ]
+}