Subject: Built motion from commit bdd2216.|0.0.141
From: Daniele Cinti <[email-masked]>
Date: Fri, 9 Sep 2016 09:35:26 +0000 (+0200)

Built motion from commit bdd2216.|0.0.141
---

diff --git a/public/app/d40ca7fa.app.js b/public/app/a62d167b.app.js
similarity index 77%
rename from public/app/d40ca7fa.app.js
rename to public/app/a62d167b.app.js
index 95cd835..119153b 100644
--- a/public/app/d40ca7fa.app.js
+++ b/public/app/a62d167b.app.js
@@ -1,32 +1,32 @@
-a.put("app/analytic/report/list/create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_REPORT\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="forms.report" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.report.name.$touched || forms.report.$submitted) && forms.report.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="(forms.report.name.$touched || forms.report.$submitted) && forms.report.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.report.name.$touched || forms.report.$submitted) && forms.report.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_PATH\' | translate}}<span class="required" aria-required="true"></span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_PATH\' | translate}}" class="form-control" data-ng-model="path" disabled/>\n      <span data-ng-show="(forms.report.name.$touched || forms.report.$submitted) && forms.report.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="ok()" ng-disabled="forms.report.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/analytic/report/list/deleteNode.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_DELETE_FOLDER\' | translate }}</h3>\n</div>\n<div class="modal-body">\n<p>\n  {{\'MESSAGE_DELETE_NODE\' | translate}} : <b>{{node}}</b>?\n</p>\n<p>\n  {{\'MESSAGE_ALL_REPORTS_WILL_BE_DELETED\' | translate}}\n</p>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-danger" type="button" ng-click="ok()" ng-disabled="forms.report.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/analytic/report/list/extract.modal.html",'<div class="modal-header">\n  <button type="button" ng-click="cancel()" class="close">Ã</button>\n  <h4 class="modal-title">{{ \'APPLICATION_EXTRACT_REPORT\' | translate }}</h4>\n</div>\n<div class="modal-body" style="text-align:center;">\n  <form name="forms.report" class="form-inline mbottom20" novalidate>\n    <div class="form-group" data-ng-class="{\'hidden\':daily}">\n      <label class="control-label">{{\'APPLICATION_DATE_RANGE\' | translate}}</label>\n      <input type="daterange" name="dates" ranges="ranges" style="min-width:190px;" enabletimepicker="timepicker" placeholder="{{\'APPLICATION_DATE_RANGE\' | translate}}" class="form-control" data-ng-model="dates" max-date="{{maxdate}}" data-ng-required="!daily" data-ng-disabled="daily" data-ng-class="{\'disabled-invisible\':daily}" style="cursor:pointer;" readonly/>\n    </div>\n    <div class="form-group" data-ng-if="daily">\n      <label class="control-label">{{\'APPLICATION_FROM\' | translate}}</label>\n    </div>\n    <div class="form-group" data-ng-if="daily">\n      <uib-timepicker ng-model="dailyTime.start" ng-change="changed()" hour-step="1" minute-step="1" show-meridian="false"></uib-timepicker>\n    </div>\n    <div class="form-group" data-ng-if="daily">\n      <label class="control-label">{{\'APPLICATION_TO\' | translate}}</label>\n    </div>\n    <div class="form-group" data-ng-if="daily">\n      <uib-timepicker ng-model="dailyTime.end" ng-change="changed()" hour-step="1" minute-step="1" show-meridian="false"></uib-timepicker>\n    </div>\n      <!-- START STATUS -->\n      <div class="form-group">\n      <input\n      bs-switch\n      class="form-control"\n      ng-model="daily"\n      type="checkbox"\n      name="auth"\n      switch-active="{{ dailySwitch.isActive }}"\n      switch-on-text="{{ dailySwitch.onText }}"\n      switch-off-text="{{ dailySwitch.offText }}"\n      switch-on-color="{{ dailySwitch.onColor }}"\n      switch-off-color="{{ dailySwitch.offColor }}"\n      switch-animate="{{ dailySwitch.animate }}"\n      switch-size="{{ dailySwitch.size }}"\n      switch-label="{{ dailySwitch.label }}"\n      switch-icon="{{ dailySwitch.icon }}"\n      switch-radio-off="{{ dailySwitch.radioOff }}"\n      switch-label-width="{{ dailySwitch.labelWidth }}"\n      switch-handle-width="{{ dailySwitch.handleWidth }}">\n    </div>\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn default green-jungle" type="button" data-ng-click="extract(\'csv\')"><i class="fa fa-file-excel-o"></i> {{ \'APPLICATION_SAVE_AS_CSV\' | translate }}</button>\n  <button class="btn default red-intense" type="button" data-ng-click="extract(\'pdf\')"><i class="fa fa-file-pdf-o"></i> {{ \'APPLICATION_SAVE_AS_PDF\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/analytic/report/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getTrees()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-book-open"></i>\n					<a href="/analytics/reports/list">{{ \'APPLICATION_REPORTS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n		<div class="col-fixed">\n			<!-- BEGIN Portlet PORTLET-->\n			<div class="portlet light bordered">\n				<div class="portlet-title">\n					<div class="caption font-green-sharp" style="padding-left:10px;">\n						<i class="icon-folder font-green-sharp"></i>\n						<span class="caption-subject">{{ \'APPLICATION_FOLDERS\' | translate }} </span>\n					</div>\n					<div class="inputs">\n						<div class="portlet-input input-inline input-small">\n							<div class="input-icon right">\n								<i class="icon-magnifier"></i>\n								<input type="text" data-ng-model="searchField" data-ng-change="searchTrees()" class="form-control input-circle" placeholder="search...">\n							</div>\n						</div>\n					</div>\n				</div>\n				<div class="portlet-body">\n					<div js-tree="defaultTreeConfig" ng-model="defaultTreeData" should-apply="ac()" tree="defaultTreeInstance" tree-events="ready:initDefaultScopeTree;select_node:selectDefaultNode;"></div>\n					<div js-tree="customTreeConfig" ng-model="customTreeData" should-apply="ac()" tree="customTreeInstance" tree-events="ready:initCustomScopeTree;select_node:selectCustomNode;rename_node:updateCustomTree;delete_node:updateCustomTree;move_node:updateCustomTree;create_node:updateCustomTree;"></div>\n				</div>\n			</div>\n			<!-- END Portlet PORTLET-->\n		</div>\n		<div class="row tree-row">\n			<div class="col-md-12">\n				<!-- BEGIN Portlet PORTLET-->\n				<div class="portlet light bordered">\n					<div class="portlet-title">\n						<div class="caption font-green-sharp">\n							<i class="icon-book-open font-green-sharp"></i>\n							<span class="caption-subject">{{ \'APPLICATION_REPORTS\' | translate }}<span data-ng-if="selectedNode"> - {{selectedNode}}</span></span>\n						</div>\n						<div data-ng-if="!defaultTreeActive" class="actions">\n							<div class="btn-group" data-ng-show="id.length">\n								<a class="btn red" href="#" data-ng-click="deleteItems()">\n									<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n								</a>\n							</div>\n							<div class="btn-group">\n								<span class="btn default btn-file">\n								<span class="fileinput-new">\n								<i class="icon-cloud-upload"></i> {{\'APPLICATION_IMPORT_FROM_JSON\' | translate}}</span>\n								<input type="file" on-read-file="import($fileContent)"/>\n								</span>\n							</div>\n							<div class="btn-group">\n								<button class="btn green-jungle " ng-click="create()">\n									<i class="icon-plus"></i> {{ \'APPLICATION_NEW_REPORT\' | translate }}\n								</button>\n							</div>\n						</div>\n					</div>\n					<div class="portlet-body">\n						<div ng-slide-down="gridOptions" lazy-render duration="1">\n						<!-- START TABLE -->\n						<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n							<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n						</div>\n						<!-- END TABLE -->\n					</div>\n					</div>\n				</div>\n				<!-- END Portlet PORTLET-->\n			</div>\n		</div>\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/analytic/report/list/preview.modal.html",'<div class="modal-header">\n  <button type="button" ng-click="cancel()" class="close">Ã</button>\n  <h4 class="modal-title">{{ \'APPLICATION_REPORT_PREVIEW\' | translate }}</h4>\n</div>\n<div class="modal-body" style="text-align:center;">\n  <form name="forms.report" class="form-inline mbottom20" novalidate>\n    <div class="form-group" data-ng-class="{\'hidden\':daily}">\n      <label class="control-label">{{\'APPLICATION_DATE_RANGE\' | translate}}<span class="required" aria-required="true"></span></label>\n      <input type="daterange" name="dates" ranges="ranges" style="min-width:190px;" enabletimepicker="timepicker" placeholder="{{\'APPLICATION_DATE_RANGE\' | translate}}" class="form-control" data-ng-model="dates" data-ng-change="getPage()" max-date="{{maxdate}}" data-ng-required="!daily" data-ng-disabled="daily" data-ng-class="{\'disabled-invisible\':daily}" style="cursor:pointer;" readonly/>\n    </div>\n    <div class="form-group" data-ng-if="daily">\n      <label class="control-label">{{\'APPLICATION_FROM\' | translate}}</label>\n    </div>\n    <div class="form-group" data-ng-if="daily">\n      <uib-timepicker ng-model="dailyTime.start" ng-change="changed()" hour-step="1" minute-step="1" show-meridian="false"></uib-timepicker>\n    </div>\n    <div class="form-group" data-ng-if="daily">\n      <label class="control-label">{{\'APPLICATION_TO\' | translate}}</label>\n    </div>\n    <div class="form-group" data-ng-if="daily">\n      <uib-timepicker ng-model="dailyTime.end" ng-change="changed()" hour-step="1" minute-step="1" show-meridian="false"></uib-timepicker>\n    </div>\n    <div class="form-group" data-ng-if="daily">\n      <button class="btn btn-small btn-sm btn-success" data-ng-click="getPage()">Apply</button>\n    </div>\n      <div class="form-group">\n      <input\n      bs-switch\n      class="form-control"\n      ng-model="daily"\n      type="checkbox"\n      name="auth"\n      data-ng-change="getPage()"\n      switch-active="{{ dailySwitch.isActive }}"\n      switch-on-text="{{ dailySwitch.onText }}"\n      switch-off-text="{{ dailySwitch.offText }}"\n      switch-on-color="{{ dailySwitch.onColor }}"\n      switch-off-color="{{ dailySwitch.offColor }}"\n      switch-animate="{{ dailySwitch.animate }}"\n      switch-size="{{ dailySwitch.size }}"\n      switch-label="{{ dailySwitch.label }}"\n      switch-icon="{{ dailySwitch.icon }}"\n      switch-radio-off="{{ dailySwitch.radioOff }}"\n      switch-label-width="{{ dailySwitch.labelWidth }}"\n      switch-handle-width="{{ dailySwitch.handleWidth }}">\n    </div>\n  </form>\n  <div ng-slide-down="showResult" lazy-render duration="1">\n    <div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-exporter class="grid extract-grid">\n      <div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n    </div>\n  </div>\n</div>\n<div class="modal-footer">\n<button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CLOSE\' | translate }}</button>\n</div>\n'),a.put("app/analytic/report/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getReport()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-book-open"></i>\n					<a href="/analytics/reports/list">{{ \'APPLICATION_REPORTS\' | translate }}</a>\n					<i data-ng-show="report" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="report">\n					<a href="#">{{report.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/analytic/report/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<div class="caption-subject font-blue-madison bold uppercase dot">{{ \'APPLICATION_REPORT\' | translate}} {{ \'APPLICATION_SETTINGS\' | translate}} - {{report.name}} </div>\n				</div>\n				<ul class="nav nav-tabs">\n					<li>\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n					<li class="active">\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{ \'APPLICATION_BUILD\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_1_3" data-toggle="tab" data-ng-click="showResult = true">{{ \'APPLICATION_TEST_PREVIEW\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body">\n\n				<div class="tab-content">\n\n					<!-- GENERAL TAB -->\n					<div class="tab-pane" id="tab_1_1">\n						<form name="forms.general" data-ng-submit="forms.report.$valid && forms.general.$valid && updateReport()" novalidate>\n\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="report.name" required/>\n								<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="report.description"></textarea>\n							</div>\n							<!-- END DESCRIPTION -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}" />\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n\n					<!-- BUILD TAB -->\n					<div class="tab-pane active" id="tab_1_2">\n						<form name="forms.report" data-ng-submit="forms.report.$valid && forms.general.$valid && updateReport()" novalidate>\n							<!-- START TABLE INPUT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.report.table.$touched || forms.report.$submitted) && forms.report.table.$invalid}">\n								<label class="control-label">{{\'APPLICATION_TABLE\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="report.table" name="table" theme="bootstrap" required>\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{\'APPLICATION_\'+$select.selected.value.toUpperCase() | translate}}</ui-select-match>\n									<ui-select-choices group-by="\'channel\'" repeat="table.value as table in tables | filter: $select.search">\n										<div ng-bind-html="\'APPLICATION_\'+table.value.toUpperCase() | translate | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="(forms.report.table.$touched || forms.report.$submitted) && forms.report.table.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END TABLE INPUT-->\n							<div data-ng-if="report.table" class="mbottom20 pbottom20 table-responsive">\n								<div class="portlet-title tabbable-line">\n									<div class="caption caption-md">\n										<i class="icon-globe theme-font hide"></i>\n										<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_FIELDS\' | translate}} </span>\n									</div>\n								</div>\n								<!-- START TABLE -->\n								<table class="table table-striped table-bordered table-hover">\n									<thead>\n										<tr>\n											<th>{{ \'APPLICATION_FIELD\' | translate }} / {{ \'APPLICATION_METRIC\' | translate }}</th>\n											<th style="min-width:167px;">{{ \'APPLICATION_ALIAS\' | translate }}</th>\n											<th>{{ \'APPLICATION_FUNCTION\' | translate }}</th>\n											<th>{{ \'APPLICATION_FORMAT\' | translate }}</th>\n											<th>{{ \'APPLICATION_GROUP_BY\' | translate }}</th>\n											<th>{{ \'APPLICATION_ORDER_BY\' | translate }}</th>\n											<th></th>\n											<th style="min-width:66px;"></th>\n										</tr>\n									</thead>\n									<tbody ui-sortable="sortableOptions" data-ng-model="report.Fields">\n										<tr data-ng-repeat="field in report.Fields">\n											<td>\n												<!-- START FIELD -->\n												<div class="form-group" data-ng-class="{\'has-error\': forms.report.$submitted && !field.field}">\n													<!-- <label class="control-label">{{\'APPLICATION_FIELD\' | translate}}<span class="required" aria-required="true">*</span></label> -->\n													<div class="input-group">\n														<ui-select data-ng-if="!field.custom" data-ng-model="field.field" dynamic-name="randomName()" theme="bootstrap" on-select="setMetricId($item,$index)" required>\n															<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}"><span ng-bind-html="$select.selected.name"></span></ui-select-match>\n															<ui-select-choices repeat="tableField.value as tableField in tableFields | filter: $select.search">\n																<div ng-bind-html="tableField.name | highlight: $select.search"></div>\n															</ui-select-choices>\n														</ui-select>\n														<input data-ng-if="field.custom" type="text" dynamic-name="randomName()" placeholder="{{\'APPLICATION_CUSTOM\' | translate}}" class="form-control" data-ng-model="field.field" required/>\n														<span class="input-group-btn">\n																<button type="button" data-ng-click="toggleCustom(field)" class="btn btn-default">\n																	<span class="icon-pencil" data-ng-class="{\'font-blue\':field.custom}"></span>\n														</button>\n														</span>\n													</div>\n													<span data-ng-show="forms.report.$submitted && !field.field" class="help-block help-block-error">\n															<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n														</span>\n												</div>\n												<!-- END FIELD-->\n											</td>\n											<td>\n												<!-- START ALIAS -->\n												<div class="form-group" data-ng-class="{\'has-error\': forms.report.$submitted && !field.alias}">\n													<!-- <label class="control-label">{{\'APPLICATION_ALIAS\' | translate}}<span class="required" aria-required="true">*</span></label> -->\n													<input type="text" dynamic-name="randomName()" placeholder="{{\'APPLICATION_ALIAS\' | translate}}" class="form-control" data-ng-model="field.alias" data-ng-pattern="\'[A-Za-z0-9 <>=,.%_\\\\+*!\\\\-\\\\[\\\\]]+\'" required/>\n													<span data-ng-show="forms.report.$submitted && !field.alias" class="help-block help-block-error">\n															<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n														</span>\n													<span data-ng-show="forms.report.$submitted && !field.alias" class="help-block help-block-error">\n															<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_FORMAT\' | translate}}.\n														</span>\n												</div>\n												<!-- END ALIAS -->\n											</td>\n											<td>\n												<!-- START FUNCTION -->\n												<div class="form-group">\n													<!-- <label class="control-label">{{\'APPLICATION_FIELD\' | translate}}<span class="required" aria-required="true">*</span></label> -->\n													<ui-select data-ng-model="field.function" name="function" theme="bootstrap">\n														<ui-select-match placeholder="{{\'APPLICATION_FUNCTION\' | translate}}" allow-clear>{{$select.selected.name}}</ui-select-match>\n														<ui-select-choices repeat="function.value as function in functions | filter: $select.search">\n															<div ng-bind-html="function.name | highlight: $select.search"></div>\n														</ui-select-choices>\n													</ui-select>\n												</div>\n												<!-- END FUNCTION-->\n											</td>\n											<td>\n												<!-- START FORMAT -->\n												<div class="form-group">\n													<!-- <label class="control-label">{{\'APPLICATION_FIELD\' | translate}}<span class="required" aria-required="true">*</span></label> -->\n													<ui-select data-ng-model="field.format" name="format" theme="bootstrap">\n														<ui-select-match placeholder="{{\'APPLICATION_FORMAT\' | translate}}" allow-clear>{{$select.selected.name}}</ui-select-match>\n														<ui-select-choices repeat="format.value as format in formatFunctions | filter: $select.search">\n															<div ng-bind-html="format.name | highlight: $select.search"></div>\n														</ui-select-choices>\n													</ui-select>\n												</div>\n												<!-- END FORMAT-->\n											</td>\n											<td>\n												<!-- START GROUP_BY -->\n												<div class="form-group">\n													<!-- <label class="control-label">{{\'APPLICATION_FIELD\' | translate}}<span class="required" aria-required="true">*</span></label> -->\n													<ui-select data-ng-model="field.groupBy" name="groupBy" theme="bootstrap" required>\n														<ui-select-match placeholder="{{\'APPLICATION_GROUP_BY\' | translate}}">{{$select.selected.name | translate}}</ui-select-match>\n														<ui-select-choices repeat="groupBy.value as groupBy in groupByField | filter: $select.search">\n															{{$translate.instant(groupBy.name)}}\n														</ui-select-choices>\n													</ui-select>\n												</div>\n												<!-- END GROUP_BY-->\n											</td>\n											<td>\n												<!-- START ORDER_BY -->\n												<div class="form-group">\n													<!-- <label class="control-label">{{\'APPLICATION_FIELD\' | translate}}<span class="required" aria-required="true">*</span></label> -->\n													<ui-select data-ng-model="field.orderBy" name="orderBy" theme="bootstrap">\n														<ui-select-match placeholder="{{\'APPLICATION_ORDER_BY\' | translate}}" allow-clear>{{$select.selected}}</ui-select-match>\n														<ui-select-choices repeat="orderBy in [\'ASC\',\'DESC\'] | filter: $select.search">\n															<div ng-bind-html="orderBy | highlight: $select.search"></div>\n														</ui-select-choices>\n													</ui-select>\n												</div>\n												<!-- END TABLE INPUT-->\n											</td>\n											<td class="report-field-remove">\n												<button class="btn red" type="button" data-ng-click="removeField($index)"><i class="fa fa-times"></i></button>\n											</td>\n											<td class="report-field-handle">\n												<!-- <img data-ng-src="assets/images/move.png" class="img-responsive"> -->\n											</td>\n										</tr>\n										<tr data-ng-hide="report.Fields.length" class="unsortable">\n											<td colspan="8" style="text-align:center;">\n												<i>{{ \'MESSAGE_ADD_A_FIELD\' | translate }}</i>\n											</td>\n										</tr>\n									</tbody>\n								</table>\n								<button type="button" class="btn btn-sm green padding-bottom" ng-click="addField()">\n									<i class="fa fa-plus"></i> {{\'APPLICATION_ADD_FIELD\' | translate}}\n								</button>\n								<!-- END TABLE -->\n							</div>\n							<div data-ng-if="report.Fields.length" class="mbottom20 pbottom20">\n								<div class="portlet-title tabbable-line">\n									<div class="caption caption-md">\n										<i class="icon-globe theme-font hide"></i>\n										<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_CONDITIONS\' | translate}} </span>\n									</div>\n								</div>\n								<div class="alert alert-info">\n									<strong>Output</strong>\n									<br>\n									<span ng-bind-html="output"></span>\n								</div>\n\n								<report-builder group="report.conditions.group" fields="tableFields" forms="forms" firstCall=\'true\'></report-builder>\n							</div>\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}" />\n						</form>\n					</div>\n					<!-- END BUILD TAB -->\n\n					<!-- PREVIEW TAB -->\n					<div class="tab-pane" id="tab_1_3">\n						<div ng-slide-down="showResult" lazy-render duration="0.5">\n							<div ui-grid="gridOptions" data-ng-if="gridOptions" ui-grid-resize-columns ui-grid-auto-resize ui-grid-move-columns class="grid">\n								<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n							</div>\n						</div>\n					</div>\n					<!-- END PREVIEW TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/chat/offline/list/list.html",'<div class="row">\n	<div class="col-md-12">\n			<div class="page-bar">\n				<ul class="page-breadcrumb">\n					<li>\n						<i class="icon-rocket"></i>\n						<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-puzzle"></i>\n						<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-bubble"></i>\n						<a href="#">{{ \'APPLICATION_CHAT\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-login"></i>\n						<a href="/channels/chat/offline/list">{{ \'APPLICATION_OFFLINE\' | translate }}</a>\n					</li>\n				</ul>\n			</div>\n		</div>\n</div>\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-question font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_OFFLINE_MESSAGES\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/chat/offline/message/message.directive.html",'<div class="message">\n  <div class="row">\n    <div class="col-md-12">\n      <span class="bold">From: </span>\n      [<a href="" data-ng-click="openContact(message.email)">{{message.email}}</a>]\n    </div>\n  </div>\n  <br>\n  <span class="todo-tasklist-date">\n    <i class="icon-calendar"></i> {{message.createdAt | date:\'medium\'}} (<span am-time-ago="message.createdAt"></span>)\n  </span>\n  <hr>\n  <div class="body text-left message-body" data-ng-bind="message.text"></div>\n  <h5 data-ng-hide="message.text" class="media-heading"><i>{{\'MESSAGE_NO_AVAILABLE_TEXT\' | translate | lowercase}}</i></h5>\n</div>\n'),a.put("app/channels/chat/offline/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initView();">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-bubble"></i>\n					<a href="#">{{ \'APPLICATION_CHAT\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-login"></i>\n					<a href="/channels/chat/offline/list">Offline</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-user"></i>\n					<a href="#">{{enquiry.username}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE CONTENT -->\n		<div class="portlet light">\n			<div class="portlet-title">\n				<div class="caption">\n					<span data-ng-if="enquiry.ChatWebsite" class="caption-subject font-green-sharp bold uppercase">{{enquiry.ChatWebsite.name}}</span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<div class="row">\n					<div class="col-md-4">\n						<!-- Visitor Information -->\n						<div class="portlet">\n							<div class="portlet-body">\n								<v-accordion class="vAccordion--default">\n									<v-pane expanded="true">\n										<v-pane-header>\n											<ng-letter-avatar data-ng-if="enquiry.ChatVisitor" height="40" width="40" data="{{enquiry.ChatVisitor.fullname}}" fontsize="25" avatarcustombgcolor="#B0B0B0" charCount="2" avatarcustomborder="border:2px solid #EA4C61" shape="round"></ng-letter-avatar>\n										</v-pane-header>\n										<v-pane-content>\n											{{\'APPLICATION_NAME\' | translate}}:<p>{{enquiry.ChatVisitor.fullname}}</p>\n											{{\'APPLICATION_EMAIL\' | translate}}:<p><a data-ng-click="openContact(enquiry.ChatVisitor.email)" href="">{{enquiry.ChatVisitor.email}}</a></p>\n											<span data-ng-if="enquiry.ChatVisitor.labelOfflineData1">{{enquiry.ChatVisitor.labelOfflineData1}}: <p>{{enquiry.ChatVisitor.offlineData1}}</p></span>\n											<span data-ng-if="enquiry.ChatVisitor.labelOfflineData2">{{enquiry.ChatVisitor.labelOfflineData2}}: <p>{{enquiry.ChatVisitor.offlineData2}}</p></span>\n											<span data-ng-if="enquiry.ChatVisitor.labelOfflineData3">{{enquiry.ChatVisitor.labelOfflineData3}}: <p>{{enquiry.ChatVisitor.offlineData3}}</p></span>\n											{{\'APPLICATION_REMOTE_ADDRESS\' | translate}}:<p>{{enquiry.ChatVisitor.remote_address}}</p>\n											{{\'APPLICATION_BROWSER\' | translate}}:<p>{{enquiry.ChatVisitor.browser}}</p>\n											{{\'APPLICATION_REFERER\' | translate}}:<p>{{enquiry.ChatVisitor.referer}} - {{enquiry.ChatWebsite.name}}</p>\n											{{\'APPLICATION_OS\' | translate}}:<p>{{enquiry.ChatVisitor.os}}</p>\n										</v-pane-content>\n									</v-pane>\n								</v-accordion>\n							</div>\n						</div>\n					</div>\n					<div class="col-md-8">\n						<!-- Offline message -->\n						<div id="mail-box">\n							<ul class="chats">\n								<li class="in">\n									<enquiry-message message="enquiry" list-id="enquiry.ChatWebsite.ListId"></enquiry-message>\n								</li>\n							</ul>\n						</div>\n					</div>\n				</div>\n			</div>\n			<!-- END PROFILE CONTENT -->\n		</div>\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),
+a.put("app/analytic/report/list/copy.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_COPY_REPORT\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <div class="portlet light bordered">\n    <div class="portlet-title">\n      <div class="caption font-green-sharp" style="padding-left:10px;">\n        <i class="icon-folder font-green-sharp"></i>\n        <span class="caption-subject">{{ \'APPLICATION_COPY_TO\' | translate }} </span>\n      </div>\n    </div>\n    <div class="portlet-body">\n      <div js-tree="customTreeConfig" ng-model="customTreeData" should-apply="ac()" tree="customTreeInstance" tree-events="ready:initCustomScopeTree;"></div>\n    </div>\n  </div>\n  <div class="has-error">\n    <span data-ng-show="showAlert" class="help-block help-block-error">\n    <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_SELECT_FOLDER\' | translate}}.\n  </span>\n  </div>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" data-ng-click="ok()">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/analytic/report/list/create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_REPORT\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="forms.report" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.report.name.$touched || forms.report.$submitted) && forms.report.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" required/>\n      <span data-ng-show="(forms.report.name.$touched || forms.report.$submitted) && forms.report.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"></textarea>\n    </div>\n    <!-- END DESCRIPTION -->\n\n    <div class="form-group" data-ng-class="{\'has-error\': (forms.report.name.$touched || forms.report.$submitted) && forms.report.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_PATH\' | translate}}<span class="required" aria-required="true"></span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_PATH\' | translate}}" class="form-control" data-ng-model="path" disabled/>\n      <span data-ng-show="(forms.report.name.$touched || forms.report.$submitted) && forms.report.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="ok()" ng-disabled="forms.report.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/analytic/report/list/deleteNode.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_DELETE_FOLDER\' | translate }}</h3>\n</div>\n<div class="modal-body">\n<p>\n  {{\'MESSAGE_DELETE_NODE\' | translate}} : <b>{{node}}</b>?\n</p>\n<p>\n  {{\'MESSAGE_ALL_REPORTS_WILL_BE_DELETED\' | translate}}\n</p>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-danger" type="button" ng-click="ok()" ng-disabled="forms.report.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/analytic/report/list/extract.modal.html",'<div class="modal-header">\n  <button type="button" ng-click="cancel()" class="close">Ã</button>\n  <h4 class="modal-title">{{ \'APPLICATION_EXTRACT_REPORT\' | translate }}</h4>\n</div>\n<div class="modal-body" style="text-align:center;">\n  <form name="forms.report" class="form-inline mbottom20" novalidate>\n    <div class="form-group" data-ng-class="{\'hidden\':daily}">\n      <label class="control-label">{{\'APPLICATION_DATE_RANGE\' | translate}}</label>\n      <input type="daterange" name="dates" ranges="ranges" style="min-width:190px;" enabletimepicker="timepicker" placeholder="{{\'APPLICATION_DATE_RANGE\' | translate}}" class="form-control" data-ng-model="dates" max-date="{{maxdate}}" data-ng-required="!daily" data-ng-disabled="daily" data-ng-class="{\'disabled-invisible\':daily}" style="cursor:pointer;" readonly/>\n    </div>\n    <div class="form-group" data-ng-if="daily">\n      <label class="control-label">{{\'APPLICATION_FROM\' | translate}}</label>\n    </div>\n    <div class="form-group" data-ng-if="daily">\n      <uib-timepicker ng-model="dailyTime.start" ng-change="changed()" hour-step="1" minute-step="1" show-meridian="false"></uib-timepicker>\n    </div>\n    <div class="form-group" data-ng-if="daily">\n      <label class="control-label">{{\'APPLICATION_TO\' | translate}}</label>\n    </div>\n    <div class="form-group" data-ng-if="daily">\n      <uib-timepicker ng-model="dailyTime.end" ng-change="changed()" hour-step="1" minute-step="1" show-meridian="false"></uib-timepicker>\n    </div>\n      <!-- START STATUS -->\n      <div class="form-group">\n      <input\n      bs-switch\n      class="form-control"\n      ng-model="daily"\n      type="checkbox"\n      name="auth"\n      switch-active="{{ dailySwitch.isActive }}"\n      switch-on-text="{{ dailySwitch.onText }}"\n      switch-off-text="{{ dailySwitch.offText }}"\n      switch-on-color="{{ dailySwitch.onColor }}"\n      switch-off-color="{{ dailySwitch.offColor }}"\n      switch-animate="{{ dailySwitch.animate }}"\n      switch-size="{{ dailySwitch.size }}"\n      switch-label="{{ dailySwitch.label }}"\n      switch-icon="{{ dailySwitch.icon }}"\n      switch-radio-off="{{ dailySwitch.radioOff }}"\n      switch-label-width="{{ dailySwitch.labelWidth }}"\n      switch-handle-width="{{ dailySwitch.handleWidth }}">\n    </div>\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn default green-jungle" type="button" data-ng-click="extract(\'csv\')"><i class="fa fa-file-excel-o"></i> {{ \'APPLICATION_SAVE_AS_CSV\' | translate }}</button>\n  <button class="btn default red-intense" type="button" data-ng-click="extract(\'pdf\')"><i class="fa fa-file-pdf-o"></i> {{ \'APPLICATION_SAVE_AS_PDF\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/analytic/report/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getTrees()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-book-open"></i>\n					<a href="/analytics/reports/list">{{ \'APPLICATION_REPORTS\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n		<div class="col-fixed">\n			<!-- BEGIN Portlet PORTLET-->\n			<div class="portlet light bordered">\n				<div class="portlet-title">\n					<div class="caption font-green-sharp" style="padding-left:10px;">\n						<i class="icon-folder font-green-sharp"></i>\n						<span class="caption-subject">{{ \'APPLICATION_FOLDERS\' | translate }} </span>\n					</div>\n					<div class="inputs">\n						<div class="portlet-input input-inline input-small">\n							<div class="input-icon right">\n								<i class="icon-magnifier"></i>\n								<input type="text" data-ng-model="searchField" data-ng-change="searchTrees()" class="form-control input-circle" placeholder="search...">\n							</div>\n						</div>\n					</div>\n				</div>\n				<div class="portlet-body">\n					<div js-tree="defaultTreeConfig" ng-model="defaultTreeData" should-apply="ac()" tree="defaultTreeInstance" tree-events="ready:initDefaultScopeTree;select_node:selectDefaultNode;"></div>\n					<div js-tree="customTreeConfig" ng-model="customTreeData" should-apply="ac()" tree="customTreeInstance" tree-events="ready:initCustomScopeTree;select_node:selectCustomNode;rename_node:updateCustomTree;delete_node:updateCustomTree;move_node:updateCustomTree;create_node:updateCustomTree;"></div>\n				</div>\n			</div>\n			<!-- END Portlet PORTLET-->\n		</div>\n		<div class="row tree-row">\n			<div class="col-md-12">\n				<!-- BEGIN Portlet PORTLET-->\n				<div class="portlet light bordered">\n					<div class="portlet-title">\n						<div class="caption font-green-sharp">\n							<i class="icon-book-open font-green-sharp"></i>\n							<span class="caption-subject">{{ \'APPLICATION_REPORTS\' | translate }}<span data-ng-if="selectedNode"> - {{selectedNode}}</span></span>\n						</div>\n						<div data-ng-if="!defaultTreeActive" class="actions">\n							<div class="btn-group" data-ng-show="id.length">\n								<a class="btn red" href="#" data-ng-click="deleteItems()">\n									<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n								</a>\n							</div>\n							<div class="btn-group">\n								<span class="btn default btn-file">\n								<span class="fileinput-new">\n								<i class="icon-cloud-upload"></i> {{\'APPLICATION_IMPORT_FROM_JSON\' | translate}}</span>\n								<input type="file" on-read-file="import($fileContent)"/>\n								</span>\n							</div>\n							<div class="btn-group">\n								<button class="btn green-jungle " ng-click="create()">\n									<i class="icon-plus"></i> {{ \'APPLICATION_NEW_REPORT\' | translate }}\n								</button>\n							</div>\n						</div>\n					</div>\n					<div class="portlet-body">\n						<div ng-slide-down="gridOptions" lazy-render duration="1">\n						<!-- START TABLE -->\n						<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n							<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n						</div>\n						<!-- END TABLE -->\n					</div>\n					</div>\n				</div>\n				<!-- END Portlet PORTLET-->\n			</div>\n		</div>\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/analytic/report/list/preview.modal.html",'<div class="modal-header">\n  <button type="button" ng-click="cancel()" class="close">Ã</button>\n  <h4 class="modal-title">{{ \'APPLICATION_REPORT_PREVIEW\' | translate }}</h4>\n</div>\n<div class="modal-body" style="text-align:center;">\n  <form name="forms.report" class="form-inline mbottom20" novalidate>\n    <div class="form-group" data-ng-class="{\'hidden\':daily}">\n      <label class="control-label">{{\'APPLICATION_DATE_RANGE\' | translate}}<span class="required" aria-required="true"></span></label>\n      <input type="daterange" name="dates" ranges="ranges" style="min-width:190px;" enabletimepicker="timepicker" placeholder="{{\'APPLICATION_DATE_RANGE\' | translate}}" class="form-control" data-ng-model="dates" data-ng-change="getPage()" max-date="{{maxdate}}" data-ng-required="!daily" data-ng-disabled="daily" data-ng-class="{\'disabled-invisible\':daily}" style="cursor:pointer;" readonly/>\n    </div>\n    <div class="form-group" data-ng-if="daily">\n      <label class="control-label">{{\'APPLICATION_FROM\' | translate}}</label>\n    </div>\n    <div class="form-group" data-ng-if="daily">\n      <uib-timepicker ng-model="dailyTime.start" ng-change="changed()" hour-step="1" minute-step="1" show-meridian="false"></uib-timepicker>\n    </div>\n    <div class="form-group" data-ng-if="daily">\n      <label class="control-label">{{\'APPLICATION_TO\' | translate}}</label>\n    </div>\n    <div class="form-group" data-ng-if="daily">\n      <uib-timepicker ng-model="dailyTime.end" ng-change="changed()" hour-step="1" minute-step="1" show-meridian="false"></uib-timepicker>\n    </div>\n    <div class="form-group" data-ng-if="daily">\n      <button class="btn btn-small btn-sm btn-success" data-ng-click="getPage()">Apply</button>\n    </div>\n      <div class="form-group">\n      <input\n      bs-switch\n      class="form-control"\n      ng-model="daily"\n      type="checkbox"\n      name="auth"\n      data-ng-change="getPage()"\n      switch-active="{{ dailySwitch.isActive }}"\n      switch-on-text="{{ dailySwitch.onText }}"\n      switch-off-text="{{ dailySwitch.offText }}"\n      switch-on-color="{{ dailySwitch.onColor }}"\n      switch-off-color="{{ dailySwitch.offColor }}"\n      switch-animate="{{ dailySwitch.animate }}"\n      switch-size="{{ dailySwitch.size }}"\n      switch-label="{{ dailySwitch.label }}"\n      switch-icon="{{ dailySwitch.icon }}"\n      switch-radio-off="{{ dailySwitch.radioOff }}"\n      switch-label-width="{{ dailySwitch.labelWidth }}"\n      switch-handle-width="{{ dailySwitch.handleWidth }}">\n    </div>\n  </form>\n  <div ng-slide-down="showResult" lazy-render duration="1">\n    <div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-exporter class="grid extract-grid">\n      <div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n    </div>\n  </div>\n</div>\n<div class="modal-footer">\n<button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CLOSE\' | translate }}</button>\n</div>\n'),a.put("app/analytic/report/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getReport()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-book-open"></i>\n					<a href="/analytics/reports/list">{{ \'APPLICATION_REPORTS\' | translate }}</a>\n					<i data-ng-show="report" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="report">\n					<a href="#">{{report.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/analytic/report/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<div class="caption-subject font-blue-madison bold uppercase dot">{{ \'APPLICATION_REPORT\' | translate}} {{ \'APPLICATION_SETTINGS\' | translate}} - {{report.name}} </div>\n				</div>\n				<ul class="nav nav-tabs">\n					<li>\n						<a href="#" data-target="#tab_1_1" data-toggle="tab">{{ \'APPLICATION_GENERAL\' | translate}}</a>\n					</li>\n					<li class="active">\n						<a href="#" data-target="#tab_1_2" data-toggle="tab">{{ \'APPLICATION_BUILD\' | translate}}</a>\n					</li>\n					<li>\n						<a href="#" data-target="#tab_1_3" data-toggle="tab" data-ng-click="showResult = true">{{ \'APPLICATION_TEST_PREVIEW\' | translate}}</a>\n					</li>\n				</ul>\n			</div>\n\n			<div class="portlet-body">\n\n				<div class="tab-content">\n\n					<!-- GENERAL TAB -->\n					<div class="tab-pane" id="tab_1_1">\n						<form name="forms.general" data-ng-submit="forms.report.$valid && forms.general.$valid && updateReport()" novalidate>\n\n							<!-- START NAME -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid}">\n								<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="report.name" required/>\n								<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END NAME -->\n\n							<!-- START DESCRIPTION -->\n							<div class="form-group">\n								<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n								<textarea type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="report.description"></textarea>\n							</div>\n							<!-- END DESCRIPTION -->\n\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}" />\n						</form>\n					</div>\n					<!-- END GENERAL TAB -->\n\n					<!-- BUILD TAB -->\n					<div class="tab-pane active" id="tab_1_2">\n						<form name="forms.report" data-ng-submit="forms.report.$valid && forms.general.$valid && updateReport()" novalidate>\n							<!-- START TABLE INPUT -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.report.table.$touched || forms.report.$submitted) && forms.report.table.$invalid}">\n								<label class="control-label">{{\'APPLICATION_TABLE\' | translate}}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="report.table" name="table" theme="bootstrap" required>\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{\'APPLICATION_\'+$select.selected.value.toUpperCase() | translate}}</ui-select-match>\n									<ui-select-choices group-by="\'channel\'" repeat="table.value as table in tables | filter: $select.search">\n										<div ng-bind-html="\'APPLICATION_\'+table.value.toUpperCase() | translate | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="(forms.report.table.$touched || forms.report.$submitted) && forms.report.table.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END TABLE INPUT-->\n							<div data-ng-if="report.table" class="mbottom20 pbottom20 table-responsive">\n								<div class="portlet-title tabbable-line">\n									<div class="caption caption-md">\n										<i class="icon-globe theme-font hide"></i>\n										<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_FIELDS\' | translate}} </span>\n									</div>\n								</div>\n								<!-- START TABLE -->\n								<table class="table table-striped table-bordered table-hover">\n									<thead>\n										<tr>\n											<th>{{ \'APPLICATION_FIELD\' | translate }} / {{ \'APPLICATION_METRIC\' | translate }}</th>\n											<th style="min-width:167px;">{{ \'APPLICATION_ALIAS\' | translate }}</th>\n											<th>{{ \'APPLICATION_FUNCTION\' | translate }}</th>\n											<th>{{ \'APPLICATION_FORMAT\' | translate }}</th>\n											<th>{{ \'APPLICATION_GROUP_BY\' | translate }}</th>\n											<th>{{ \'APPLICATION_ORDER_BY\' | translate }}</th>\n											<th></th>\n											<th style="min-width:66px;"></th>\n										</tr>\n									</thead>\n									<tbody ui-sortable="sortableOptions" data-ng-model="report.Fields">\n										<tr data-ng-repeat="field in report.Fields">\n											<td>\n												<!-- START FIELD -->\n												<div class="form-group" data-ng-class="{\'has-error\': forms.report.$submitted && !field.field}">\n													<!-- <label class="control-label">{{\'APPLICATION_FIELD\' | translate}}<span class="required" aria-required="true">*</span></label> -->\n													<div class="input-group">\n														<ui-select data-ng-if="!field.custom" data-ng-model="field.field" dynamic-name="randomName()" theme="bootstrap" on-select="setMetricId($item,$index)" required>\n															<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}"><span ng-bind-html="$select.selected.name"></span></ui-select-match>\n															<ui-select-choices repeat="tableField.value as tableField in tableFields | filter: $select.search">\n																<div ng-bind-html="tableField.name | highlight: $select.search"></div>\n															</ui-select-choices>\n														</ui-select>\n														<input data-ng-if="field.custom" type="text" dynamic-name="randomName()" placeholder="{{\'APPLICATION_CUSTOM\' | translate}}" class="form-control" data-ng-model="field.field" required/>\n														<span class="input-group-btn">\n																<button type="button" data-ng-click="toggleCustom(field)" class="btn btn-default">\n																	<span class="icon-pencil" data-ng-class="{\'font-blue\':field.custom}"></span>\n														</button>\n														</span>\n													</div>\n													<span data-ng-show="forms.report.$submitted && !field.field" class="help-block help-block-error">\n															<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n														</span>\n												</div>\n												<!-- END FIELD-->\n											</td>\n											<td>\n												<!-- START ALIAS -->\n												<div class="form-group" data-ng-class="{\'has-error\': forms.report.$submitted && !field.alias}">\n													<!-- <label class="control-label">{{\'APPLICATION_ALIAS\' | translate}}<span class="required" aria-required="true">*</span></label> -->\n													<input type="text" dynamic-name="randomName()" placeholder="{{\'APPLICATION_ALIAS\' | translate}}" class="form-control" data-ng-model="field.alias" data-ng-pattern="\'[A-Za-z0-9 <>=,.%_\\\\+*!\\\\-\\\\[\\\\]]+\'" required/>\n													<span data-ng-show="forms.report.$submitted && !field.alias" class="help-block help-block-error">\n															<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n														</span>\n													<span data-ng-show="forms.report.$submitted && !field.alias" class="help-block help-block-error">\n															<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_WRONG_FORMAT\' | translate}}.\n														</span>\n												</div>\n												<!-- END ALIAS -->\n											</td>\n											<td>\n												<!-- START FUNCTION -->\n												<div class="form-group">\n													<!-- <label class="control-label">{{\'APPLICATION_FIELD\' | translate}}<span class="required" aria-required="true">*</span></label> -->\n													<ui-select data-ng-model="field.function" name="function" theme="bootstrap">\n														<ui-select-match placeholder="{{\'APPLICATION_FUNCTION\' | translate}}" allow-clear>{{$select.selected.name}}</ui-select-match>\n														<ui-select-choices repeat="function.value as function in functions | filter: $select.search">\n															<div ng-bind-html="function.name | highlight: $select.search"></div>\n														</ui-select-choices>\n													</ui-select>\n												</div>\n												<!-- END FUNCTION-->\n											</td>\n											<td>\n												<!-- START FORMAT -->\n												<div class="form-group">\n													<!-- <label class="control-label">{{\'APPLICATION_FIELD\' | translate}}<span class="required" aria-required="true">*</span></label> -->\n													<ui-select data-ng-model="field.format" name="format" theme="bootstrap">\n														<ui-select-match placeholder="{{\'APPLICATION_FORMAT\' | translate}}" allow-clear>{{$select.selected.name}}</ui-select-match>\n														<ui-select-choices repeat="format.value as format in formatFunctions | filter: $select.search">\n															<div ng-bind-html="format.name | highlight: $select.search"></div>\n														</ui-select-choices>\n													</ui-select>\n												</div>\n												<!-- END FORMAT-->\n											</td>\n											<td>\n												<!-- START GROUP_BY -->\n												<div class="form-group">\n													<!-- <label class="control-label">{{\'APPLICATION_FIELD\' | translate}}<span class="required" aria-required="true">*</span></label> -->\n													<ui-select data-ng-model="field.groupBy" name="groupBy" theme="bootstrap" required>\n														<ui-select-match placeholder="{{\'APPLICATION_GROUP_BY\' | translate}}">{{$select.selected.name | translate}}</ui-select-match>\n														<ui-select-choices repeat="groupBy.value as groupBy in groupByField | filter: $select.search">\n															{{$translate.instant(groupBy.name)}}\n														</ui-select-choices>\n													</ui-select>\n												</div>\n												<!-- END GROUP_BY-->\n											</td>\n											<td>\n												<!-- START ORDER_BY -->\n												<div class="form-group">\n													<!-- <label class="control-label">{{\'APPLICATION_FIELD\' | translate}}<span class="required" aria-required="true">*</span></label> -->\n													<ui-select data-ng-model="field.orderBy" name="orderBy" theme="bootstrap">\n														<ui-select-match placeholder="{{\'APPLICATION_ORDER_BY\' | translate}}" allow-clear>{{$select.selected}}</ui-select-match>\n														<ui-select-choices repeat="orderBy in [\'ASC\',\'DESC\'] | filter: $select.search">\n															<div ng-bind-html="orderBy | highlight: $select.search"></div>\n														</ui-select-choices>\n													</ui-select>\n												</div>\n												<!-- END TABLE INPUT-->\n											</td>\n											<td class="report-field-remove">\n												<button class="btn red" type="button" data-ng-click="removeField($index)"><i class="fa fa-times"></i></button>\n											</td>\n											<td class="report-field-handle">\n												<!-- <img data-ng-src="assets/images/move.png" class="img-responsive"> -->\n											</td>\n										</tr>\n										<tr data-ng-hide="report.Fields.length" class="unsortable">\n											<td colspan="8" style="text-align:center;">\n												<i>{{ \'MESSAGE_ADD_A_FIELD\' | translate }}</i>\n											</td>\n										</tr>\n									</tbody>\n								</table>\n								<button type="button" class="btn btn-sm green padding-bottom" ng-click="addField()">\n									<i class="fa fa-plus"></i> {{\'APPLICATION_ADD_FIELD\' | translate}}\n								</button>\n								<!-- END TABLE -->\n							</div>\n							<div data-ng-if="report.Fields.length" class="mbottom20 pbottom20">\n								<div class="portlet-title tabbable-line">\n									<div class="caption caption-md">\n										<i class="icon-globe theme-font hide"></i>\n										<span class="caption-subject font-blue-madison bold uppercase">{{ \'APPLICATION_CONDITIONS\' | translate}} </span>\n									</div>\n								</div>\n								<div class="alert alert-info">\n									<strong>Output</strong>\n									<br>\n									<span ng-bind-html="output"></span>\n								</div>\n\n								<report-builder group="report.conditions.group" fields="tableFields" forms="forms" firstCall=\'true\'></report-builder>\n							</div>\n							<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}" />\n						</form>\n					</div>\n					<!-- END BUILD TAB -->\n\n					<!-- PREVIEW TAB -->\n					<div class="tab-pane" id="tab_1_3">\n						<div ng-slide-down="showResult" lazy-render duration="0.5">\n							<div ui-grid="gridOptions" data-ng-if="gridOptions" ui-grid-resize-columns ui-grid-auto-resize ui-grid-move-columns class="grid">\n								<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n							</div>\n						</div>\n					</div>\n					<!-- END PREVIEW TAB -->\n\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/chat/offline/list/list.html",'<div class="row">\n	<div class="col-md-12">\n			<div class="page-bar">\n				<ul class="page-breadcrumb">\n					<li>\n						<i class="icon-rocket"></i>\n						<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-puzzle"></i>\n						<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-bubble"></i>\n						<a href="#">{{ \'APPLICATION_CHAT\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-login"></i>\n						<a href="/channels/chat/offline/list">{{ \'APPLICATION_OFFLINE\' | translate }}</a>\n					</li>\n				</ul>\n			</div>\n		</div>\n</div>\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-question font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_OFFLINE_MESSAGES\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/chat/offline/message/message.directive.html",'<div class="message">\n  <div class="row">\n    <div class="col-md-12">\n      <span class="bold">From: </span>\n      [<a href="" data-ng-click="openContact(message.email)">{{message.email}}</a>]\n    </div>\n  </div>\n  <br>\n  <span class="todo-tasklist-date">\n    <i class="icon-calendar"></i> {{message.createdAt | date:\'medium\'}} (<span am-time-ago="message.createdAt"></span>)\n  </span>\n  <hr>\n  <div class="body text-left message-body" data-ng-bind="message.text"></div>\n  <h5 data-ng-hide="message.text" class="media-heading"><i>{{\'MESSAGE_NO_AVAILABLE_TEXT\' | translate | lowercase}}</i></h5>\n</div>\n'),a.put("app/channels/chat/offline/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initView();">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-bubble"></i>\n					<a href="#">{{ \'APPLICATION_CHAT\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-login"></i>\n					<a href="/channels/chat/offline/list">Offline</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-user"></i>\n					<a href="#">{{enquiry.username}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE CONTENT -->\n		<div class="portlet light">\n			<div class="portlet-title">\n				<div class="caption">\n					<span data-ng-if="enquiry.ChatWebsite" class="caption-subject font-green-sharp bold uppercase">{{enquiry.ChatWebsite.name}}</span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<div class="row">\n					<div class="col-md-4">\n						<!-- Visitor Information -->\n						<div class="portlet">\n							<div class="portlet-body">\n								<v-accordion class="vAccordion--default">\n									<v-pane expanded="true">\n										<v-pane-header>\n											<ng-letter-avatar data-ng-if="enquiry.ChatVisitor" height="40" width="40" data="{{enquiry.ChatVisitor.fullname}}" fontsize="25" avatarcustombgcolor="#B0B0B0" charCount="2" avatarcustomborder="border:2px solid #EA4C61" shape="round"></ng-letter-avatar>\n										</v-pane-header>\n										<v-pane-content>\n											{{\'APPLICATION_NAME\' | translate}}:<p>{{enquiry.ChatVisitor.fullname}}</p>\n											{{\'APPLICATION_EMAIL\' | translate}}:<p><a data-ng-click="openContact(enquiry.ChatVisitor.email)" href="">{{enquiry.ChatVisitor.email}}</a></p>\n											<span data-ng-if="enquiry.ChatVisitor.labelOfflineData1">{{enquiry.ChatVisitor.labelOfflineData1}}: <p>{{enquiry.ChatVisitor.offlineData1}}</p></span>\n											<span data-ng-if="enquiry.ChatVisitor.labelOfflineData2">{{enquiry.ChatVisitor.labelOfflineData2}}: <p>{{enquiry.ChatVisitor.offlineData2}}</p></span>\n											<span data-ng-if="enquiry.ChatVisitor.labelOfflineData3">{{enquiry.ChatVisitor.labelOfflineData3}}: <p>{{enquiry.ChatVisitor.offlineData3}}</p></span>\n											{{\'APPLICATION_REMOTE_ADDRESS\' | translate}}:<p>{{enquiry.ChatVisitor.remote_address}}</p>\n											{{\'APPLICATION_BROWSER\' | translate}}:<p>{{enquiry.ChatVisitor.browser}}</p>\n											{{\'APPLICATION_REFERER\' | translate}}:<p>{{enquiry.ChatVisitor.referer}} - {{enquiry.ChatWebsite.name}}</p>\n											{{\'APPLICATION_OS\' | translate}}:<p>{{enquiry.ChatVisitor.os}}</p>\n										</v-pane-content>\n									</v-pane>\n								</v-accordion>\n							</div>\n						</div>\n					</div>\n					<div class="col-md-8">\n						<!-- Offline message -->\n						<div id="mail-box">\n							<ul class="chats">\n								<li class="in">\n									<enquiry-message message="enquiry" list-id="enquiry.ChatWebsite.ListId"></enquiry-message>\n								</li>\n							</ul>\n						</div>\n					</div>\n				</div>\n			</div>\n			<!-- END PROFILE CONTENT -->\n		</div>\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),
 a.put("app/channels/chat/online/list/list.html",'<div class="row">\n	<div class="col-md-12">\n			<div class="page-bar">\n				<ul class="page-breadcrumb">\n					<li>\n						<i class="icon-rocket"></i>\n						<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-puzzle"></i>\n						<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-bubble"></i>\n						<a href="#">{{ \'APPLICATION_CHAT\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-login"></i>\n						<a href="/channels/chat/online/list">{{ \'APPLICATION_ONLINE\' | translate }}</a>\n					</li>\n				</ul>\n			</div>\n		</div>\n</div>\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-question font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_VISITORS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/chat/online/view/view.detail.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_DETAIL\' | translate}}</span>\n				</div>\n			</div>\n			<div class="portlet-body row" data-ng-init="initView()">\n				<div class="col-md-6">\n					<div class="news-blocks">\n						<h3>\n							<a href="#" class="inactive-link">{{\'APPLICATION_MESSAGES\' | translate}}</a>\n							<!-- <a href="#" data-ng-click="export()" data-ng-show="chatRoom.ChatMessages.length" class="btn btn-sm blue pull-right"><i class="icon-cloud-download"></i> {{\'APPLICATION_EXPORT\' | translate}} CSV </a> -->\n							<a href="api/chat/rooms/{{chatRoom.id}}/export" target="_blank" data-ng-show="chatRoom.ChatMessages.length" class="btn btn-sm blue pull-right"><i class="icon-cloud-download"></i> {{\'APPLICATION_EXPORT\' | translate}} CSV </a>\n							<hr>\n						</h3>\n						<div class="news-block-tags">\n							<em am-time-ago="chatRoom.ChatVisitor.ChatEnquiry.createdAt"></em>\n						</div>\n						<p>\n							<div ng-scrollbars ng-scrollbars-config="config">\n								<ul class="chats">\n									<li data-ng-class="{\'out\': message.User, \'in\':message.ChatVisitor}" data-ng-repeat="message in chatRoom.ChatMessages | orderBy:\'createdAt\'">\n										<img class="avatar" data-ng-src="api/users/avatar/{{message.User.userpic || \'unknown_avatar\'}}">\n										<div class="message">\n											<span class="arrow">\n											</span>\n											<a href="#" class="name">\n												{{message.User ? message.User.fullname : message.ChatVisitor.fullname}}\n											</a>\n											<span class="datetime">\n												at {{message.createdAt | date: \'medium\'}}\n											</span>\n											<span class="body">\n												{{message.body}}\n											</span>\n										</div>\n									</li>\n								</ul>\n							</div>\n						</div>\n					</div>\n					<div class="col-md-6">\n						<div class="news-blocks">\n							<h3>\n								<a href="#" class="inactive-link">{{\'APPLICATION_VISITOR\' | translate}}</a>\n								<hr>\n							</h3>\n							<div class="margin-top-20 profile-desc-link">\n								<i class="icon-user"></i>\n								<a href="#" class="inactive-link">{{chatRoom.ChatVisitor.fullname}}</a>\n							</div>\n							<div class="margin-top-20 profile-desc-link">\n								<i class="icon-envelope"></i>\n								<a href="#" class="inactive-link">{{chatRoom.ChatVisitor.email}}</a>\n							</div>\n							<div class="margin-top-20 profile-desc-link">\n								<i class="icon-globe"></i>\n								<a href="#" class="inactive-link">{{chatRoom.ChatVisitor.remote_address}}</a>\n							</div>\n							<div class="margin-top-20 profile-desc-link">\n								<i class="icon-home"></i>\n								<a href="#" class="inactive-link">{{chatRoom.ChatVisitor.referer}} - {{chatRoom.ChatVisitor.ChatWebsite.name}}</a>\n							</div>\n							<div class="margin-top-20 profile-desc-link">\n								<i class="icon-cursor"></i>\n								<a href="#" class="inactive-link">{{chatRoom.ChatVisitor.browser}}</a>\n							</div>\n							<div class="margin-top-20 profile-desc-link">\n								<i class="icon-screen-desktop"></i>\n								<a href="#" class="inactive-link">{{chatRoom.ChatVisitor.os}}</a>\n							</div>\n						</div>\n					</div>\n				</div>\n			</div>\n		</div>\n	</div>\n'),a.put("app/channels/chat/online/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-bubble"></i>\n					<a href="#">{{ \'APPLICATION_CHAT\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-login"></i>\n					<a href="/channels/chat/online/list">Online</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/enquiry.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- START USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{chatRoom.ChatVisitor.email}}\n					</div>\n					<div class="profile-usertitle-job">\n						{{chatRoom.ChatVisitor.fullname}}\n					</div>\n				</div>\n				<!-- END USER TITLE -->\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.channels.chat.online.view.detail\')}">\n							<a data-ng-href="/channels/chat/online/view/{{chatRoom.id}}/detail">\n							<i class="icon-tag"></i>\n							{{ \'APPLICATION_DETAIL\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/chat/preview/preview.html",'<style>\n.xc_header_logo\n{\n	display:block;\n  background-image:url({{chatWebsite.remote}}/api/xchatty/assets?resource=images/motion_logo.png);\n	width:40px;\n	height:40px;\n	float:left;;\n	margin-left: 10px !important;\n  margin-top: 6px !important;\n}\n.xc_rating {\n  text-align: center;\n}\n.xc_rating_label > input{ /* HIDE RADIO */\n  display:none;\n}\n.xc_rating_label > input + img{ /* IMAGE STYLES */\n  cursor:pointer;\n  border:2px solid transparent;\n}\n.xc_rating_label > input:checked + img{ /* (CHECKED) IMAGE STYLES */\n  /*border:2px solid #f00;*/\n  background-color: #efefef;\n}\n\n.xc_label {\n  display: inline-block;\n  max-width: 100%;\n  margin-bottom: 5px;\n  font-weight: bold;\n}\n\n.xc_online_message,\n.xc_offline_message,\n.xc_rating_message\n{\n  text-align: center;\n}\n\n.xc_div_group {\n  margin: 10px 0 10px 0;\n}\n.xc_footer\n{\n  text-align: center;\n  padding-bottom: 5px;\n}\n\n.xc_powered\n{\n  color: grey;\n  font: 10px/16px "Lucida Grande","Lucida Sans Unicode",Arial,Verdana,sans-serif;\n  padding-bottom: 5px;\n}\n\n.xc_chat_container\n{\n  //width:379px;\n  //position:fixed;\n  //bottom:0;\n  //right:50px;\n  z-index:9999;\n  background-color:transparent;\n}\n\n.xc_chat_container *\n{\n  font-family:Arial,Helvetica,sans-serif;\n  font-size:13px;\n  margin:0;\n  padding:0;\n}\n\n.xc_chat_container p\n{\n  margin:5px 0;\n}\n\n.xc_signup_wrapper\n{\n  max-height:375px;\n}\n\n.xc_conversation_container\n{\n  max-height:375px;\n  list-style:none;\n  overflow:auto;\n  margin:0;\n  padding:20px 10px;\n}\n\n.xc_conversation_container a\n{\n  color:#036;\n}\n\n.xc_conversation_container a.xc_btn_style\n{\n  color:#fff;\n}\n\ndiv.xc_chat_head\n{\n  color:#fff;\n  background:{{chatWebsite.color}};\n  //border-radius: 20px 20px 0px 0px !important;\n  height:52px;\n  line-height:55px;\n  cursor:pointer;\n}\n\ndiv.xc_chat_head.rounded\n{\n  border-radius: 20px 20px 0px 0px !important;\n}\n\ndiv.xc_chat_head.squared\n{\n  //border-radius: 20px 20px 0px 0px !important;\n}\n\n.xc_chat_head-title\n{\n  margin:5px 0 0 15px;\n  color: #fff;\n}\n\n.xc_header_icon\n{\n  display:block;\n  background-image:url({{chatWebsite.remote}}/api/xchatty/assets?resource=images/iconVisitorchat.png);\n  width:21px;\n  height:16px;\n  float:right;\n  margin:20px 20px 0 0;\n}\n\n.xc_header_icon span.xc_notification_badge span\n{\n  display:block;\n  height:16px;\n  width:15px;\n  text-align:center;\n  font-size:9px;\n  color:#555;\n  position:relative;\n  top:-20px;\n  left:4px;\n  margin:0;\n  padding:0;\n}\n\n.xc_sub-head-spacer\n{\n  padding:1px;\n}\n\n.xc_conversation\n{\n  display:none;\n  margin:0 12px 0 11px;\n}\n\n.xc_chat_toggle_container\n{\n  /*background:mediumslateblue center 52px;*/\n  background: white;\n  border-style: solid;\n  border-width: 1px;\n  border-color: {{chatWebsite.color}};\n  //display:none;\n}\n\n.xc_signup_wrapper,.xc_notifications_wrapper,.xc_enquiry_wrapper,.xc_rating_wrapper\n{\n  //display:none;\n  display:block;\n  overflow:auto;\n  line-height:1;\n  padding:25px;\n}\n\n.xc_exit_chat_container\n{\n  text-align:right;\n  width:95%;\n  margin:0 auto;\n  padding:5px 1px 0 0;\n}\n\n.xc_exit_chat_container span,.xc_exit_chat_container a\n{\n  font-size:80%;\n  color:#666;\n  text-decoration:none;\n}\n\n.xc_exit_chat_container a:hover\n{\n  color:#333;\n}\n\na.xc_btn_exit_chat_confirm:hover\n{\n  color:red;\n}\n\na.xc_btn_exit_chat_cancel:hover\n{\n  color:#0c0;\n}\n\nform.xc_form_reply\n{\n  position:relative;\n}\n\n.xc_form_reply\n{\n  /*background-color:#e3e3e3;*/\n  text-align:center;\n  /*border-top:1px solid #d3d3d3;*/\n}\n\n.xc_input_message\n{\n  height:100px;\n  margin:10px auto 5px;\n}\n\n.xc_input_enquiry_message,\n.xc_input_rating_message\n{\n  height:100px;\n}\n\n.xc_form_signup,.xc_form_enquiry,.xc_form_rating\n{\n  /*text-align:center;*/\n}\n\n.xc_chat_container textarea,.xc_chat_container input[type=text]\n{\n  width:95%;\n  min-width:95%;\n  max-width:95%;\n  -webkit-box-sizing:border-box;\n  -moz-box-sizing:border-box;\n  box-sizing:border-box;\n  background-color:#fff;\n  border:1px solid #ccc;\n  -webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);\n  -moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);\n  box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);\n  -webkit-transition:border linear .2s, box-shadow linear .2s;\n  -moz-transition:border linear .2s, box-shadow linear .2s;\n  -o-transition:border linear .2s, box-shadow linear .2s;\n  transition:border linear .2s, box-shadow linear .2s;\n  display:inline-block;\n  font-size:14px;\n  line-height:20px;\n  color:#555;\n  -webkit-border-radius:4px;\n  -moz-border-radius:4px;\n  border-radius:4px;\n  vertical-align:middle;\n  margin:3px 0;\n  padding:4px 6px;\n  resize: none;\n}\n\n.xc_chat_container textarea:focus,.xc_chat_container input[type=text]:focus\n{\n  outline: {{chatWebsite.color_focus}} auto 5px;\n}\n\n.xc_chat_container input[type=text]\n{\n  height: 30px;\n}\n\n.xc_message_sending textarea, .xc_enquiry_sending textarea\n{\n  background: #fff url({{chatWebsite.remote}}/api/xchatty/assets?resource=images/loading.gif) 98% 5px no-repeat;\n}\n\n.xc_chatrow\n{\n  display:block;\n  border-top:1px dashed #e3e3e3;\n  margin:5px 0;\n  clear: both;\n}\n\n.xc_chatrow p\n{\n  color:#444;\n  word-wrap:break-word;\n}\n\n.xc_time\n{\n  float:right;\n  font-size:80%;\n  color:#ccc;\n  padding-left:12px;\n  margin:3px;\n}\n\n.xc_submission_pending\n{\n  background:transparent url({{chatWebsite.remote}}/api/xchatty/assets?resource=images/bullet_clock.png) left center norepeat;\n}\n\n.xc_submission_confirmed\n{\n  background:transparent url({{chatWebsite.remote}}/api/xchatty/assets?resource=images/bullet_tick.png) left center norepeat;\n}\n\n.xc_fullname\n{\n  font-weight:700;\n}\n\n.xc_fullname:after\n{\n  content:":";\n}\n\n.xc_avatar\n{\n  float: left;\n  margin: 0 5px 5px 0;\n  display: inline-block;\n  width: 40px;\n  height: 40px;\n  border-radius: 5px;\n  -moz-border-radius: 5px;\n  -webkit-border-radius: 5px;\n}\n\n.xc_smilie\n{\n  background-repeat:no-repeat;\n  display:inline-block;\n  width:18px;\n  height:18px;\n  text-indent:-9999px;\n  white-space:nowrap;\n}\n\n.xc_btn_load_more\n{\n  width:100%!important;\n}\n\n.xc_notifications_wrapper\n{\n  text-shadow:0 1px 0 rgba(255,255,255,0.5);\n}\n\n.xc_notification_success\n{\n  color:#468847;\n}\n\n.xc_notification_error\n{\n  color:#b94a48;\n}\n\n.xc_errorlist\n{\n  margin:0 0 0 25px;\n  padding:0;\n}\n\ni.xc_btn_notifications_close\n{\n  float:right;\n  font-weight:700;\n  font-size:20px;\n  color:#ccc;\n  cursor:pointer;\n  margin:-15px 0 0;\n  padding:0;\n}\n\n.xc_btn_style\n{\n  width:95%;\n  text-align:center;\n  line-height:1.2;\n  font-size:90%;\n  -moz-box-shadow:inset 0 1px 0 0 {{chatWebsite.color_button}};\n  -webkit-box-shadow:inset 0 1px 0 0 {{chatWebsite.color_button}};\n  box-shadow:inset 0 1px 0 0 {{chatWebsite.color_button}};\n  background:0;\n  background-color:{{chatWebsite.color_button}};\n  -moz-border-radius:4px;\n  -webkit-border-radius:4px;\n  border-radius:4px;\n  border:1px solid {{chatWebsite.color_button}};\n  display:inline-block;\n  color:#fff;\n  font-weight:700;\n  text-decoration:none;\n  text-shadow:1px 1px 0 #000c17;\n  margin:0 auto 5px;\n  padding:2px 0;\n}\n\n.xc_btn_style:hover\n{\n  background:0;\n  background-color:{{chatWebsite.color_button}};\n  color: #fff;\n  text-decoration: none;\n}\n\n.xc_btn_style:active\n{\n  position:relative;\n  top:1px;\n}\n\n.xc_composing_container\n{\n  display: none;\n  width: 95%;\n  margin: 0 auto;\n  background: transparent url({{chatWebsite.remote}}/api/xchatty/assets?resource=images/bullet_pencil.png) 6px center no-repeat;\n  padding-left: 19px;\n  font-style: italic;\n}\n\n@media only screen and (max-height: 620px) {\n  .xc_conversation_container\n  {\n    max-height:300px!important;\n  }\n}\n\n@media only screen and (max-height: 545px) {\n  .xc_conversation_container\n  {\n    max-height:200px!important;\n  }\n}\n\n@media only screen and (max-height: 445px) {\n  .xc_conversation_container\n  {\n    max-height:150px!important;\n  }\n}\n\n@media only screen and (max-width: 480px) {\n  .xc_chat_container\n  {\n    width:95%!important;\n    right:auto!important;\n    -webkit-border-top-left-radius:15px;\n    -webkit-border-top-right-radius:15px;\n    -moz-border-radius-topleft:15px;\n    -moz-border-radius-topright:15px;\n    border-top-left-radius:15px;\n    border-top-right-radius:15px;\n    box-shadow:0 0 5px rgba(0,0,0,.5);\n    -webkit-box-shadow:0 0 5px rgba(0,0,0,.5);\n    -moz-box-shadow:0 0 5px rgba(0,0,0,.5);\n  }\n\n  div.xc_chat_head\n  {\n    background-color:#036;\n    background-image:none;\n    line-height:25px;\n    height:auto;\n    -webkit-border-top-left-radius:15px;\n    -webkit-border-top-right-radius:15px;\n    -moz-border-radius-topleft:15px;\n    -moz-border-radius-topright:15px;\n    border-top-left-radius:15px;\n    border-top-right-radius:15px;\n    padding:10px;\n  }\n\n  .xc_chat_toggle_container\n  {\n    background-color:#fff;\n    background-image:none;\n    border-color:#036;\n    border-style:solid;\n    border-width:0 1px;\n  }\n\n  .xc_header_icon\n  {\n    background-image:url({{chatWebsite.remote}}/api/xchatty/assets?resource=images/icon_visitorchat.png);\n    margin:0;\n  }\n\n  .xc_header_icon span.xc_notification_badge span\n  {\n    top:-5px;\n    left:5px;\n  }\n\n  .xc_notification_success\n  {\n    background-color:#dff0d8;\n    border:1px solid #d6e9c6;\n  }\n\n  .xc_conversation_container\n  {\n    max-height:375px;\n    border-color:#036;\n  }\n\n  .xc_notification_error\n  {\n    background-color:#f2dede;\n    border:1px solid #eed3d7;\n  }\n\n  .xc_sub-head-spacer\n  {\n    display:none;\n    padding:0;\n  }\n\n  .xc_chat_head-title,.xc_conversation\n  {\n    margin:0;\n  }\n}\n</style>\n<div class="xc_chat_container">\n  <div class="xc_chat_head {{chatWebsite.header_shape}}">\n    <i class="xc_header_icon">\n      <span class="xc_notification_badge">\n        <span class="xc_notification_badge_number"></span>\n      </span>\n    </i>\n    <i class="xc_header_logo" style="background-image:url(/api/xchatty/assets?resource=images/{{(chatWebsite.defaultLogo || !license.custom) ? \'motionLogo.png\' : (!chatWebsite.defaultLogo && chatWebsite.logo && license.custom) ? chatWebsite.logo+\'&uploaded\' : \'motionLogo.png\'}});background-size:contain;"></i>\n	</a>\n    <span class="xc_chat_head-title">{{statePreview.state == \'online\' ? chatWebsite.header_online : chatWebsite.header_offline}}</span>\n  </div>\n  <div class="xc_chat_toggle_container">\n    <div class="xc_sub-head-spacer"></div>\n    <!-- <div class="xc_notifications_wrapper">\n    <ul class="xc_errorlist"></ul>\n  </div> -->\n  <div class="xc_enquiry_wrapper" data-ng-show=\'statePreview.state == "offline"\'>\n    <form class="xc_form_enquiry" accept-charset="UTF-8">\n      <p class="xc_offline_message" ng-bind-html=\'chatWebsite.offline_message\'></p>\n      <br>\n      <div ng-if="chatWebsite.enquiry_enable">\n        <div class="xc_div_group">\n          <label for="enquiryFullname" class="xc_label">{{chatWebsite.name_title}} *</label>\n          <input id="enquiryFullname" maxlength="45" data-label="Name" type="text" name="data[Enquiry][fullname]" placeholder="{{chatWebsite.username_placeholder}}" class="xc_input_enquiry_fullname" required/>\n        </div>\n        <br>\n        <div class="xc_div_group">\n          <label for="enquiryEmail" class="xc_label">{{chatWebsite.email_title}} *</label>\n          <input id="enquiryEmail" maxlength="85" type="text" data-label="Email Address" name="data[Enquiry][email]" placeholder="{{chatWebsite.email_placeholder}}" class="xc_input_enquiry_email" required/>\n        </div>\n        <br>\n        <div class="xc_div_group">\n          <label for="enquiryMessage" class="xc_label">{{chatWebsite.message_title}} *</label>\n          <textarea id="enquiryMessage" data-label="Message" maxlength="1500" placeholder="{{chatWebsite.enquiry_message_placeholder}}" name="data[Enquiry][message]" class="xc_input_enquiry_message" required></textarea>\n        </div>\n        <br>\n        <button type="submit" class="xc_btn_enquiry xc_btn_style">{{chatWebsite.enquiry_button}}</button>\n      </div>\n    </form>\n  </div>\n  <div class="xc_signup_wrapper" data-ng-show=\'statePreview.state == "online"\'>\n    <form class="xc_form_signup" accept-charset="UTF-8">\n      <p class="xc_online_message" ng-bind-html=\'chatWebsite.online_message\'></p>\n      <br>\n      <div class="xc_div_group">\n        <label for="dataFullname" class="xc_label">{{chatWebsite.name_title}} *</label>\n        <input maxlength="45" id="dataFullname" data-label="Fullname" type="text" name="data[Discussion][fullname]" placeholder="{{chatWebsite.username_placeholder}}" class="xc_input_fullname" required/>\n      </div>\n      <br>\n      <div class="xc_div_group">\n        <label for="dataEmail" class="xc_label">{{chatWebsite.email_title}} *</label>\n        <input maxlength="85" id="dataEmail" data-label="Email Address" type="text" name="data[Discussion][email]" placeholder="{{chatWebsite.email_placeholder}}" class="xc_input_email" required/>\n      </div>\n      <br>\n      <input type="hidden" class="xc_input_visitor_time" name="data[Discussion][visitor_time]" />\n      <button type="submit" class="xc_btn_signup xc_btn_style">{{chatWebsite.start_chat_button}}</button>\n    </form>\n  </div>\n  <div class="xc_rating_wrapper" data-ng-show=\'statePreview.state == "rating"\'>\n    <form class="xc_form_rating" accept-charset="UTF-8">\n      <p class="xc_rating_message">{{chatWebsite.rating_message}}</p>\n      <br>\n      <div class="xc_rating">\n        <label class="xc_rating_label" style="padding:30px;">\n          <input type="radio" name="data[Rating][rating]" value="good" />\n          <img src="{{chatWebsite.remote}}/api/xchatty/assets?resource=images/like.png" alt="Good" height="50"/>\n        </label>\n        <label class="xc_rating_label" style="padding:30px;">\n          <input type="radio" name="data[Rating][rating]" value="bad"/>\n          <img src="{{chatWebsite.remote}}/api/xchatty/assets?resource=images/dislike.png" alt="Good" height="50"/>\n        </label>\n      </div>\n      <div class="xc_div_group">\n        <label for="ratingMessage" class="xc_label">Message</label>\n        <textarea id="ratingMessage" data-label="Message" maxlength="1500" name="data[Rating][message]" class="xc_input_rating_message"></textarea>\n      </div>\n      <button type="submit" class="xc_button_rating xc_btn_style">{{chatWebsite.rating_send}}</button>\n      <button type="button" class="xc_button_skip_rating xc_btn_style">{{chatWebsite.rating_skip}}</button>\n    </form>\n  </div>\n  <div class="xc_footer">\n    <div data-ng-if="chatWebsite.defaultWhiteLabel || !license.custom" class="xc_powered"><a>Powered by xCALLY</a></div>\n		<div data-ng-if="!chatWebsite.defaultWhiteLabel && license.custom" data-ng-bind-html="chatWebsite.whiteLabel"></div>\n  </div>\n</div>\n</div>\n'),a.put("app/channels/chat/queue/list/list.create.modal.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_NEW_QUEUE\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <!-- START NAME -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.name.$touched || form.$submitted) && form.name.$invalid}">\n      <label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="item.name" data-ng-pattern="settings.patternName" required />\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$invalid && form.name.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n      <span data-ng-show="(form.name.$touched || form.$submitted) && form.name.$invalid && form.name.$error.pattern" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_NAME\' | translate}}.\n      </span>\n    </div>\n    <!-- END NAME -->\n\n    <!-- START STRATEGY -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.strategy.$touched || form.$submitted) && form.strategy.$invalid}">\n      <label class="control-label">{{\'APPLICATION_STRATEGY\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <ui-select data-ng-model="item.strategy" name="strategy" theme="bootstrap" required>\n        <ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected | uppercase}}</ui-select-match>\n        <ui-select-choices repeat="strategy in [\'beepall\',\'roundrobin\',\'rrmemory\'] | filter: $select.search">\n          <div ng-bind-html="strategy.toUpperCase() | highlight: $select.search"></div>\n        </ui-select-choices>\n      </ui-select>\n      <span data-ng-show="(form.strategy.$touched || form.$submitted) && form.strategy.$invalid && form.strategy.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END STRATEGY -->\n\n    <!-- START TIMEOUT -->\n    <div class="form-group" data-ng-class="{\'has-error\': (form.timeout.$touched || form.$submitted) && form.timeout.$invalid}">\n      <label class="control-label">{{\'APPLICATION_AGENT_TIMEOUT\' | translate}}<span class="required" aria-required="true">*</span></label>\n      <input type="number" name="timeout" placeholder="Timeout" class="form-control" data-ng-model="item.timeout" required min="1"/>\n      <span data-ng-show="(form.timeout.$touched || form.$submitted) && form.timeout.$invalid && form.timeout.$error.required" class="help-block help-block-error">\n        <strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n      </span>\n    </div>\n    <!-- END TIMEOUT -->\n\n    <!-- START AGENTS-->\n    <div class="form-body" data-ng-init="getTeams()">\n      <label for="penalty">{{\'APPLICATION_PENALTY\' | translate}}</label>\n      <div class="input-group input-small mbottom20">\n        <input type="number" class="spinner-input form-control" maxlength="3" data-ng-model="item.penalty" readonly>\n        <div class="spinner-buttons input-group-btn btn-group-vertical">\n          <button type="button" class="btn spinner-up btn-xs blue" data-ng-click="item.penalty=item.penalty+1">\n            <i class="fa fa-angle-up"></i>\n          </button>\n          <button type="button" class="btn spinner-down btn-xs blue" data-ng-disabled="!item.penalty" data-ng-click="item.penalty=item.penalty-1">\n            <i class="fa fa-angle-down"></i>\n          </button>\n        </div>\n      </div>\n      <div class="form-group last">\n        <div class="col-md-12" id="multi-select-team">\n        </div>\n      </div>\n    </div>\n    <!-- END AGENTS-->\n\n    <!-- START DESCRIPTION -->\n    <div class="form-group">\n      <label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n      <input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="item.description"/>\n    </div>\n    <!-- END DESCRIPTION -->\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/chat/queue/list/list.html",'<div class="row">\n	<div class="col-md-12">\n			<div class="page-bar">\n				<ul class="page-breadcrumb">\n					<li>\n						<i class="icon-rocket"></i>\n						<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-puzzle"></i>\n						<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-bubble"></i>\n						<a href="#">{{ \'APPLICATION_CHAT\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-docs"></i>\n						<a href="#">{{ \'APPLICATION_QUEUES\' | translate }}</a>\n					</li>\n				</ul>\n			</div>\n		</div>\n</div>\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-docs font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_QUEUES\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<a class="btn green-jungle" href="#" data-ng-click="createItem()" data-ng-show="Auth.getCurrentUser().role === \'admin\'">\n						<i class="icon-plus"></i> {{ \'APPLICATION_NEW_QUEUE\' | translate }}\n					</a>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/chat/queue/view/view.agents.html",'<div class="row" data-ng-init="getTeams()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_AGENTS\' | translate}}</span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- BEGIN FORM-->\n				<form action="index.html" class="form-horizontal form-row-seperated">\n					<div class="form-body">\n						<label for="penalty">{{\'APPLICATION_PENALTY\' | translate}}</label>\n						<div class="input-group input-small mbottom20">\n							<input type="number" class="spinner-input form-control" maxlength="3" data-ng-model="queue.penalty" readonly>\n							<div class="spinner-buttons input-group-btn btn-group-vertical">\n								<button type="button" class="btn spinner-up btn-xs blue" data-ng-click="queue.penalty=queue.penalty+1">\n									<i class="fa fa-angle-up"></i>\n								</button>\n								<button type="button" class="btn spinner-down btn-xs blue" data-ng-disabled="!queue.penalty" data-ng-click="queue.penalty=queue.penalty-1">\n									<i class="fa fa-angle-down"></i>\n								</button>\n							</div>\n						</div>\n						<div class="form-group last">\n							<div class="col-md-12" id="multi-select-team">\n							</div>\n						</div>\n					</div>\n				</form>\n				<!-- END FORM-->\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/chat/queue/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="getQueue()">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-bubble"></i>\n					<a href="#">{{ \'APPLICATION_CHAT\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-docs"></i>\n					<a href="/channels/chat/queues/list">{{ \'APPLICATION_QUEUES\' | translate }}</a>\n					<i data-ng-show="queue" class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="queue">\n					<a href="#">{{queue.name}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/queue.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{queue.name}}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.channels.chat.queues.view.settings\')}">\n							<a data-ng-href="/channels/chat/queues/view/{{queue.id}}/settings">\n							<i class="icon-settings"></i>\n							{{ \'APPLICATION_SETTINGS\' | translate}} </a>\n						</li>\n						<li data-ng-class="{active: $state.is(\'main.channels.chat.queues.view.agents\')}" data-ng-show="Auth.getCurrentUser().role === \'admin\'">\n							<a data-ng-href="/channels/chat/queues/view/{{queue.id}}/agents">\n							<i class="icon-people"></i>\n							{{ \'APPLICATION_AGENTS\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),
 a.put("app/channels/chat/queue/view/view.settings.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_SETTINGS\' | translate}}</span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<form name="forms.general" data-ng-submit="forms.general.$valid && updateChatQueue()" novalidate>\n					<!-- START NAME -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid}">\n						<label class="control-label">{{\'APPLICATION_NAME\' | translate}}<span class="required" aria-required="true">*</span></label>\n						<input type="text" name="name" placeholder="{{\'APPLICATION_NAME\' | translate}}" class="form-control" data-ng-model="queue.name" data-ng-pattern="settings.patternName" required />\n						<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid && forms.general.name.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n						<span data-ng-show="(forms.general.name.$touched || forms.general.$submitted) && forms.general.name.$invalid && forms.general.name.$error.pattern" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_INVALID_PATTERN_NAME\' | translate}}.\n						</span>\n					</div>\n					<!-- END NAME -->\n\n					<!-- START STRATEGY -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.general.strategy.$touched || forms.general.$submitted) && forms.general.strategy.$invalid}">\n						<label class="control-label">{{\'APPLICATION_STRATEGY\' | translate}}</label>\n						<ui-select data-ng-model="queue.strategy" name="strategy" theme="bootstrap">\n							<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected | uppercase}}</ui-select-match>\n							<ui-select-choices repeat="strategy in [\'beepall\',\'roundrobin\',\'rrmemory\'] | filter: $select.search">\n								<div ng-bind-html="strategy.toUpperCase() | highlight: $select.search"></div>\n							</ui-select-choices>\n						</ui-select>\n					</div>\n					<!-- END STRATEGY -->\n\n					<!-- START TIMEOUT -->\n					<div class="form-group">\n						<label class="control-label">{{\'APPLICATION_AGENT\' | translate}} {{\'APPLICATION_TIMEOUT\' | translate}}</label>\n						<input type="number" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" min="1" data-ng-model="queue.timeout"/>\n					</div>\n					<!-- END TIMEOUT -->\n\n					<!-- START DESCRIPTION -->\n					<div class="form-group">\n						<label class="control-label">{{\'APPLICATION_DESCRIPTION\' | translate}}</label>\n						<input type="text" name="description" placeholder="{{\'APPLICATION_DESCRIPTION\' | translate}}" class="form-control" data-ng-model="queue.description"/>\n					</div>\n					<!-- END DESCRIPTION -->\n\n					<input class="btn green-haze" type="submit" value="{{\'APPLICATION_UPDATE\' | translate}}"/>\n				</form>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/chat/realtime/view/agent/agent.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initAgents()">\n	<div class="col-md-12">\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions"  ui-grid-resize-columns  class="ui-grid" ui-grid-tree-view ui-grid-expandable-row ui-grid-pagination ui-grid-auto-resize>\n			<span us-spinner spinner-key="grid-spinner" spinner-start-active="true"></span>\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/chat/realtime/view/agent/agent.modal.info.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_INTERFACE_INFO\' | translate }}</h3>\n</div>\n<div class="modal-body">\n<div data-ng-if="agent.ipaddr" class="well">\n  <div>{{agent.ipaddr}}:{{agent.port}}</div>\n  <div>{{agent.fullcontact}}</div>\n  <div>{{agent.useragent}}</div>\n  <div>{{agent.lastms}}</div>\n</div>\n<div data-ng-if="!agent.ipaddr" class="alert alert-danger" role="alert">\n  {{\'MESSAGE_NO_AVAILABLE_INFO\' | translate}}\n</div>\n</div>\n<div class="modal-footer">\n  <button class="btn default" type="button" ng-click="close()">{{ \'APPLICATION_CLOSE\' | translate }}</button>\n</div>\n'),a.put("app/channels/chat/realtime/view/agent/queue.modal.add.html",'<div class="modal-header">\n  <h3 class="modal-title">{{ \'APPLICATION_JOIN_QUEUE\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <form name="form" novalidate>\n\n    <div class="form-group row">\n  <label class="col-md-2 control-label" style="margin-top: 7px;">{{\'APPLICATION_QUEUE\' | translate}}:</label>\n  <div class="col-md-10">\n    <ui-select multiple ng-model="item.queues" theme="bootstrap" required>\n      <ui-select-match placeholder="{{\'APPLICATION_QUEUE\' | translate}}">{{$item.name}}</ui-select-match>\n      <ui-select-choices repeat="queue.id as queue in queues | filter: $select.search">\n        <div ng-bind-html="queue.name | highlight: $select.search"></div>\n      </ui-select-choices>\n    </ui-select>\n  </div>\n</div>\n\n  </form>\n</div>\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" ng-click="save()" ng-disabled="form.$invalid">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/chat/realtime/view/application/application.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initApplications()">\n	<div class="col-md-12">\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions" ui-grid-resize-columns class="ui-grid" ui-grid-auto-resize>\n			<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/chat/realtime/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-bubble"></i>\n					<a href="#">{{ \'APPLICATION_CHAT\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-energy"></i>\n					<a href="#">{{ \'APPLICATION_REALTIME\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n\n		<div>\n			<nav class="navbar navbar-default" role="navigation">\n				<div class="collapse navbar-collapse">\n					<ul class="nav navbar-nav">\n						<li data-ng-class="{\'active\': $state.is(\'main.channels.chat.realtime.view.agents\')}">\n							<a href="/channels/chat/realtime/view/agents">\n								{{\'APPLICATION_AGENTS\' | translate}}\n							</a>\n						</li>\n						<li data-ng-class="{\'active\': $state.is(\'main.channels.chat.realtime.view.applications\')}">\n							<a href="/channels/chat/realtime/view/applications">\n								{{\'APPLICATION_APPLICATIONS\' | translate}}\n							</a>\n						</li>\n					</ul>\n				</div>\n			</nav>\n		</div>\n\n		<div ui-view></div>\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/chat/room/external/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n	<div class="portlet light" data-ng-init="initView()">\n		<div class="portlet-title">\n	<div class="caption">\n		<div class="btn-group btn-group-solid">\n			<button type="button" class="btn btn-sm default" data-ng-model="query.status" uib-btn-radio="\'OPEN\'" uib-uncheckable>OPEN</button>\n		</div>\n		<div class="btn-group btn-group-solid">\n			<button type="button" class="btn btn-sm default" data-ng-model="query.status" uib-btn-radio="\'CLOSED\'" uib-uncheckable>CLOSED</button>\n		</div>\n	</div>\n	<div class="actions">\n		<a href="#" class="btn btn-icon-only blue" data-ng-click="tagItems();" data-ng-show="id.length">\n			<i class="fa fa-tags"></i>\n		</a>\n		<a href="#" class="btn btn-icon-only default" data-ng-click="getPage();">\n			<i class="fa fa-refresh"></i>\n		</a>\n	</div>\n</div>\n<div class="portlet-title" data-ng-show="tags.length">\n	<!-- START TAGS -->\n	<div class="form-group">\n		<div class="row">\n			<div class="col-md-1">\n				<a href="#" class="btn btn-icon-only">\n					<i class="fa fa-tags" style="color: gray;"></i>\n				</a>\n			</div>\n			<div class="col-md-11">\n				<ui-select multiple data-ng-model="query.tags" theme="bootstrap" on-select="onChanged($item, $model)" on-remove="onChanged($item, $model)">\n					<ui-select-match placeholder="Search by tag...">{{$item}}</ui-select-match>\n					<ui-select-choices repeat="tag in tags | filter:$select.search">\n						{{tag}}\n					</ui-select-choices>\n				</ui-select>\n			</div>\n		</div>\n	</div>\n	<!-- END TAGS -->\n</div>\n<div class="portlet-body">\n		<!-- BEGIN UI-GRID SPINNER -->\n		<span us-spinner spinner-key="spinner-grid" spinner-start-active="true"></span>\n		<!-- END UI-GRID SPINNER -->\n\n		<!-- START TABLE -->\n\n		<div ui-grid="gridOptions" ui-grid-resize-columns ui-grid-auto-resize ui-grid-selection ui-grid-pagination class="ui-grid">\n			<div class="watermark" data-ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/chat/room/group/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n	<div class="portlet light" data-ng-init="initView()">\n		<div class="portlet-title">\n	<div class="caption">\n		<div class="btn-group btn-group-solid">\n			<button type="button" class="btn btn-sm default" data-ng-model="query.status" uib-btn-radio="\'OPEN\'" uib-uncheckable>OPEN</button>\n		</div>\n		<div class="btn-group btn-group-solid">\n			<button type="button" class="btn btn-sm default" data-ng-model="query.status" uib-btn-radio="\'CLOSED\'" uib-uncheckable>CLOSED</button>\n		</div>\n	</div>\n	<div class="actions">\n		<a href="#" class="btn btn-icon-only default" data-ng-click="getPage();">\n			<i class="fa fa-refresh"></i>\n		</a>\n	</div>\n</div>\n<div class="portlet-title" data-ng-show="tags.length">\n	<!-- START TAGS -->\n	<div class="form-group">\n		<div class="row">\n			<div class="col-md-1">\n				<a href="#" class="btn btn-icon-only">\n					<i class="fa fa-tags" style="color: gray;"></i>\n				</a>\n			</div>\n			<div class="col-md-11">\n				<ui-select multiple data-ng-model="query.tags" theme="bootstrap" on-select="onChanged($item, $model)" on-remove="onChanged($item, $model)">\n					<ui-select-match placeholder="Search by tag...">{{$item}}</ui-select-match>\n					<ui-select-choices repeat="tag in tags | filter:$select.search">\n						{{tag}}\n					</ui-select-choices>\n				</ui-select>\n			</div>\n		</div>\n	</div>\n	<!-- END TAGS -->\n</div>\n<div class="portlet-body">\n		<!-- BEGIN UI-GRID SPINNER -->\n		<span us-spinner spinner-key="spinner-grid" spinner-start-active="true"></span>\n		<!-- END UI-GRID SPINNER -->\n\n		<!-- START TABLE -->\n\n		<div ui-grid="gridOptions" ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination class="ui-grid">\n			<div class="watermark" data-ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/chat/room/internal/list/list.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12" data-ng-init="initView()">\n		<!-- BEGIN UI-GRID SPINNER -->\n		<span us-spinner spinner-key="spinner-grid" spinner-start-active="true"></span>\n		<!-- END UI-GRID SPINNER -->\n\n		<!-- START TABLE -->\n		<div ui-grid="gridOptions" ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination class="ui-grid">\n			<div class="watermark" data-ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n		</div>\n		<!-- END TABLE -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/chat/room/room.add.html",'<div class="modal-header">\n  <button ng-if="modal.dismissable" type="button" data-ng-click="$dismiss()" class="close">&times;</button>\n  <h4 class="modal-title">{{\'APPLICATION_NEW_GROUP\' | translate}}</h4>\n</div>\n\n<div class="modal-body">\n  <div class="portlet box blue">\n		<div class="portlet-title">\n			<div class="caption">\n				<i class="icon-people"></i>{{\'APPLICATION_AGENTS\' | translate}}\n			</div>\n		</div>\n		<div class="portlet-body">\n			<ul>\n				<li data-ng-repeat="item in items">\n					 {{item.fullname}}\n				</li>\n        <li data-ng-repeat="item in selected.items">\n					 {{item.fullname}}\n				</li>\n			</ul>\n		</div>\n	</div>\n\n  <ui-select multiple name="items" ng-model="selected.items" theme="bootstrap">\n    <ui-select-match placeholder="{{\'APPLICATION_SELECTED_AGENTS\' | translate}}">{{$item.fullname}}</ui-select-match>\n    <ui-select-choices repeat="{id: agent.id, fullname: agent.fullname} as agent in agents.rows | filter: $select.search">\n      {{agent.fullname}}\n    </ui-select-choices>\n  </ui-select>\n</div>\n\n<div class="modal-footer">\n  <button class="btn btn-success" type="button" data-ng-click="ok()" data-ng-show="selected.items.length">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" data-ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n</div>\n'),a.put("app/channels/chat/room/room.close.html",'<div class="modal-header">\n  <button ng-if="modal.dismissable" type="button" ng-click="$dismiss()" class="close">&times;</button>\n  <h4 ng-if="modal.title" ng-bind="modal.title | translate" class="modal-title"></h4>\n</div>\n<div class="modal-body">\n  <p ng-if="modal.text && !closed" ng-bind="modal.text | translate"></p>\n  <form name="form" novalidate data-ng-init="initDisposition()">\n  <div class="form-group">\n    <ui-select data-ng-model="item.disposition" name="list" theme="bootstrap" data-ng-disabled="!dispositions.length" required>\n      <ui-select-match placeholder="{{\'APPLICATION_DISPOSITION\' | translate}}">{{$select.selected.name}}</ui-select-match>\n      <ui-select-choices repeat="disposition.name as disposition in dispositions | filter: $select.search">\n        <div ng-bind-html="disposition.name | highlight: $select.search"></div>\n      </ui-select-choices>\n    </ui-select>\n  </div>\n  <div class="note note-warning" data-ng-hide="dispositions.length">\n    <h4 class="block">Warning!</h4>\n    <p>\n      {{ \'MESSAGE_NO_DISPOSITIONS_AVAILABLE\' | translate }}\n    </p>\n  </div>\n</form>\n  <!-- <div ng-if="modal.html" ng-bind-html="modal.html"></div> -->\n</div>\n<div class="modal-footer">\n  <button class="btn btn-danger" type="button" ng-click="ok()">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button>\n  <!-- <button ng-repeat="button in modal.buttons" ng-class="button.classes" ng-click="button.click($event)" ng-bind="button.text" class="btn"></button> -->\n</div>\n'),a.put("app/channels/chat/room/room.directive.html",'<div class="portlet light">\n  <div class="portlet-title">\n    <div class="caption">\n      <span data-ng-if="chatRoom" class="label label-sm label-default">{{chatRoom.status}}</span>\n      <span data-ng-if="chatRoom.ChatWebsite"> | </span>\n      <span data-ng-if="chatRoom.ChatWebsite" class="caption-subject font-green-sharp bold uppercase">{{chatRoom.ChatWebsite.name | truncate: 25: \'...\': true}}</span>\n    </div>\n    <div class="actions">\n      <button class="btn btn-icon-only btn-primary" data-ng-click="addAgent(chatRoom.id)" data-ng-disabled="chatRoom.status === \'CLOSED\'">\n        <i class="fa fa-user-plus"></i>\n      </button>\n      <button class="btn btn-icon-only" data-ng-class="{\'btn-success\':chatRoom.status !== \'CLOSED\',\'grey-cascade\':chatRoom.status === \'CLOSED\'}" data-ng-click="closeRoom(chatRoom.id)" data-ng-if="chatRoom.ChatVisitors.length" data-ng-disabled="chatRoom.status === \'CLOSED\' && chatRoom.disposition">\n        <i data-ng-class="{\'fa fa-upload\':chatRoom.status !== \'CLOSED\',\'icon-target\':chatRoom.status === \'CLOSED\'}"></i>\n      </button>\n      <a href="api/chat/rooms/{{chatRoom.id}}/export" target="_blank" class="btn btn-primary btn-icon-only" data-ng-if="chatRoom" title="{{\'APPLICATION_EXPORT\' | translate}} CSV">\n        <i class="fa fa-download"></i>\n      </a>\n      <button class="btn default btn-icon-only" data-ng-if="chatRoom && chatRoom.status !== \'CLOSED\'" data-ng-click="togglePanelLeft()" title="{{\'APPLICATION_RESIZE\' | translate}}">\n        <i ng-class="panelRight == \'col-md-12\' ? \'icon-size-actual\' : \'icon-size-fullscreen\'"></i>\n      </button>\n    </div>\n  </div>\n  <div class="portlet-body">\n<div class="row">\n  <div data-ng-class="panelLeft" data-ng-show="panelLeft">\n    <div class="portlet">\n      <div class="portlet-body">\n        <div class="portlet-title line">\n          <div class="form">\n            <!-- START TAGS -->\n            <div class="form-group">\n              <div class="row">\n                <div class="col-md-1">\n                  <a href="#" class="btn btn-icon-only">\n                    <i class="fa fa-tags" style="color: gray;"></i>\n                  </a>\n                </div>\n                <div class="col-md-11">\n                  <ui-select multiple data-ng-model="form.tags" theme="bootstrap" on-select="onChanged(chatRoom.id)" on-remove="onChanged(chatRoom.id)">\n                    <ui-select-match placeholder="Tags...">{{$item}}</ui-select-match>\n                    <ui-select-choices repeat="tag in tags | filter:$select.search" class="">\n                      {{tag}}\n                    </ui-select-choices>\n                  </ui-select>\n                </div>\n              </div>\n            </div>\n            <!-- END TAGS -->\n          </div>\n        </div>\n        <v-accordion class="vAccordion--default">\n          <v-pane data-ng-if="chatRoom.ChatVisitors.length" data-ng-repeat="chatVisitor in chatRoom.ChatVisitors" expanded="true">\n            <v-pane-header>\n              <ng-letter-avatar\n              height="40"\n              width="40"\n              data="{{chatRoom.ChatVisitor.fullname}}"\n              fontsize="25"\n              avatarcustombgcolor="#B0B0B0"\n              charCount="2"\n              avatarcustomborder="border:2px solid #EA4C61"\n              shape="round"></ng-letter-avatar>\n            </v-pane-header>\n            <v-pane-content>\n              {{\'APPLICATION_ROOM_ID\' | translate}}: <p>{{chatRoom.id}}</p>\n              {{\'APPLICATION_NAME\' | translate}}: <p>{{chatRoom.ChatVisitor.fullname}}</p>\n              {{\'APPLICATION_EMAIL\' | translate}}: <p><a data-ng-click="openContact(chatRoom.ChatVisitor.email)" href="">{{chatRoom.ChatVisitor.email}}</a></p>\n              <span data-ng-if="chatRoom.ChatVisitor.labelData1">{{chatRoom.ChatVisitor.labelData1}}: <p>{{chatRoom.ChatVisitor.data1}}</p></span>\n              <span data-ng-if="chatRoom.ChatVisitor.labelData2">{{chatRoom.ChatVisitor.labelData2}}: <p>{{chatRoom.ChatVisitor.data2}}</p></span>\n              <span data-ng-if="chatRoom.ChatVisitor.labelData3">{{chatRoom.ChatVisitor.labelData3}}: <p>{{chatRoom.ChatVisitor.data3}}</p></span>\n              {{\'APPLICATION_REMOTE_ADDRESS\' | translate}}: <p>{{chatRoom.ChatVisitor.remote_address}}</p>\n              {{\'APPLICATION_BROWSER\' | translate}}: <p>{{chatRoom.ChatVisitor.browser}}</p>\n              {{\'APPLICATION_REFERER\' | translate}}:<p>{{chatRoom.ChatVisitor.referer}} - {{enquiry.ChatWebsite.name}}</p>\n              {{\'APPLICATION_OS\' | translate}}: <p>{{chatRoom.ChatVisitor.os}}</p>\n            </v-pane-content>\n          </v-pane>\n\n          <v-pane data-ng-repeat="user in chatRoom.Users | filter:{ id: \'!\' + user.id}">\n            <v-pane-header>\n              <ng-letter-avatar\n              height="40"\n              width="40"\n              data="{{user.fullname}}"\n              fontsize="25"\n              avatarcustombgcolor="#B0B0B0"\n              avatarcustomborder="border:2px solid #3399CC"\n              charCount="2"\n              shape="round"></ng-letter-avatar>\n            </v-pane-header>\n            <v-pane-content>\n              {{\'APPLICATION_NAME\' | translate}}: <p>{{user.fullname}}</p>\n              {{\'APPLICATION_ROLE\' | translate}}: <p>{{user.role}}</p>\n              {{\'APPLICATION_INTERNAL\' | translate}}: <p>{{user.internal}}</p>\n              {{\'APPLICATION_EMAIL\' | translate}}: <p><a data-ng-href="mailto:{{user.email}}">{{user.email}}</a></p>\n            </v-pane-content>\n          </v-pane>\n        </v-accordion>\n      </div>\n    </div>\n  </div>\n  <div data-ng-class="panelRight">\n    <div class="note note-info" data-ng-if="chatRoom && chatRoom.status == \'CLOSED\'">\n      <h4 class="block"><i class="icon-info"></i> {{\'MESSAGE_CHAT_ROOM_CLOSED\' | translate}}!</h4>\n      <p>\n        <strong>{{\'MESSAGE_CHAT_ROOM_CLOSED_DETAILS\' | translate}}.</strong>\n      </p>\n      <hr>\n      <p>\n        <i class="icon-target"></i> {{\'APPLICATION_DISPOSITION\' | translate}}: <strong>{{chatRoom.disposition}}</strong>\n      </p>\n      <p>\n        <i class="icon-star"></i> {{\'APPLICATION_RATING\' | translate}}: <strong>{{chatRoom.rating | ucfirst}}</strong>\n      </p>\n      <p>\n        <i class="icon-note"></i> {{\'APPLICATION_RATING_MESSAGE\' | translate}}: <strong>{{chatRoom.ratingMessage}}</strong>\n      </p>\n      <p>\n        <i class="icon-calendar"></i> {{\'APPLICATION_UPDATED_AT\' | translate}}: <strong>{{chatRoom.updatedAt | date:\'medium\'}}</strong> (<span am-time-ago="chatRoom.updatedAt"></span>)\n      </p>\n    </div>\n    <div class="portlet light bordered">\n      <div class="portlet-body">\n        <div id="chat-box" schroll-bottom="chatRoom.ChatMessages">\n        <ul class="chats">\n          <li data-ng-repeat="message in chatRoom.ChatMessages" data-ng-class="message.UserId == user.id ? \'out\' : \'in\'">\n            <div class="avatar" data-ng-class="message.ChatVisitor ? \'pretty-avatar-v\' : \'pretty-avatar\'">\n              <ng-letter-avatar\n              data-ng-if="!message.ChatVisitor"\n              height="40"\n              width="40"\n              fontsize="25"\n              data="{{message.User.fullname}}"\n              avatarcustombgcolor="#B0B0B0"\n              avatarcustomborder="border:2px solid #3399CC"\n              charCount="2"\n              shape="round"></ng-letter-avatar>\n              <ng-letter-avatar\n              data-ng-if="message.ChatVisitor"\n              height="40"\n              width="40"\n              fontsize="25"\n              data="{{message.ChatVisitor.fullname}}"\n              avatarcustombgcolor="#B0B0B0"\n              avatarcustomborder="border:2px solid #EA4C61"\n              charCount="2"\n              shape="round"></ng-letter-avatar>\n            </div>\n            <div class="message">\n              <span class="arrow"></span>\n              <a href="#" class="name">{{message.User.fullname || message.ChatVisitor.fullname}} </a>\n              <span am-time-ago="message.createdAt"></span>\n              <ng-emoticons emoticons-data="message.body"></ng-emoticons>\n            </div>\n          </li>\n          <li data-ng-if="chatRoom.status === \'CLOSED\'">\n            <div class="media-body" style="text-align: center;">\n              <h5 class="media-heading"><i>{{\'MESSAGE_CHAT_CLOSED\' | translate | lowercase}}</i></h5>\n            </div>\n          </li>\n        </ul>\n      </div>\n      <div class="chat-form" data-ng-if="chatRoom && isMyRoom(chatRoom.Users)">\n        <div class="input-cont">\n          <input class="form-control" type="text" placeholder="Type a message here..." ng-enter="sendMessage()" data-ng-model="message.body" data-ng-disabled="chatRoom.status === \'CLOSED\'"/>\n        </div>\n        <div class="btn-cont">\n          <span class="arrow"></span>\n          <a href="#" class="btn blue icn-only" data-ng-disabled="chatRoom.status === \'CLOSED\'" data-ng-click="sendMessage()">\n            <i class="fa fa-check icon-white"></i>\n          </a>\n        </div>\n      </div>\n      <div class="form-group chat-canned-answer-div" data-ng-if="chatRoom.status !== \'CLOSED\'" data-ng-class="{\'has-error\': forms.compose.subject.$invalid && forms.compose.$submitted}">\n        <div class="row">\n          <div class="col-md-1">\n            <a href="#" class="btn btn-icon-only">\n              <i class="fa fa-magic" style="color: gray;"></i>\n            </a>\n          </div>\n          <div class="col-md-11">\n            <input type="text"\n            data-ng-model="modelOptions.selectedAnswer"\n            uib-typeahead="key for key in getAnswers($viewValue)"\n            placeholder="Canned answers.."\n            typeahead-loading="loadingLocations"\n            typeahead-no-results="noResults"\n            typeahead-on-select="onSelect($item)"\n            class="form-control">\n            <i ng-show="loadingLocations" class="glyphicon glyphicon-refresh"></i>\n            <div ng-show="noResults">\n              <i class="glyphicon glyphicon-remove"></i> No Results Found\n            </div>\n            <span data-ng-show="forms.compose.subject.$invalid && forms.compose.$submitted" class="help-block help-block-error">\n'+"              <strong>{{'APPLICATION_WARNING' | translate}}!</strong> {{'MESSAGE_REQUIRED_FIELD' | translate}}.\n            </span>\n          </div>\n        </div>\n\n      </div>\n    </div>\n  </div>\n</div>\n</div>\n</div>\n"),a.put("app/channels/chat/room/room.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row" data-ng-init="initView()">\n  <div class="col-md-12">\n    <div class="page-bar">\n      <ul class="page-breadcrumb">\n        <li>\n          <i class="icon-rocket"></i>\n          <a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n          <i class="fa fa-angle-right"></i>\n        </li>\n        <li>\n          <i class="icon-puzzle"></i>\n          <a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n          <i class="fa fa-angle-right"></i>\n        </li>\n        <li>\n          <i class="icon-bubble"></i>\n          <a href="#">{{ \'APPLICATION_CHAT\' | translate }}</a>\n          <i class="fa fa-angle-right"></i>\n        </li>\n        <li>\n          <i class="fa fa-users"></i>\n          <a href="#">{{ \'APPLICATION_INTERACTIONS\' | translate }}</a>\n        </li>\n      </ul>\n    </div>\n\n    <div class="row inbox">\n      <div class="col-md-2">\n        <ul class="inbox-nav margin-bottom-10">\n          <li data-ng-class="{active: $state.includes(\'main.channels.chat.room.internal\')}">\n            <a href="/channels/chat/room/internal/list" class="btn">\n              {{\'APPLICATION_INTERNAL\' | translate}}\n            </a>\n            <b></b>\n          </li>\n          <li data-ng-class="{active: $state.includes(\'main.channels.chat.room.external\')}">\n            <a href="/channels/chat/room/external/list" class="btn">\n              {{\'APPLICATION_EXTERNAL\' | translate}}\n            </a>\n            <b></b>\n          </li>\n          <li data-ng-class="{active: $state.includes(\'main.channels.chat.room.group\')}">\n            <a href="/channels/chat/room/group/list" class="btn">\n              {{\'APPLICATION_GROUPS\' | translate}}\n            </a>\n            <b></b>\n          </li>\n        </ul>\n      </div>\n\n      <div class="col-md-10">\n        <div class="room-content">\n          <div ui-view></div>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/chat/room/template.html",'<div ng-bind-html="neText" ne-hljs></div>\n<div class="ne-video" ng-if="video.host" class="fade">\n  <div class="ne-video-preview" ng-hide="nePlayVideo || !options.video.details">\n    <div class="ne-video-thumb" ng-click="nePlayVideo=!nePlayVideo">\n      <img ng-src="{{video.thumbnail}}" alt=""/>\n      <i class="fa fa-play-circle-o"></i>\n    </div>\n    <div class="ne-video-detail">\n      <div class="ne-video-title">\n        <a ng-href="{{video.url}}">{{video.title}}</a>\n      </div>\n      <div class="ne-video-desc">\n        {{video.description}}\n      </div>\n      <div class="ne-video-stats">\n        <span><i class="fa fa-eye"></i> {{video.views}}</span>\n        <span><i class="fa fa-heart"></i> {{video.likes}}</span>\n      </div>\n    </div>\n  </div>\n  <div class="ne-video-player" ng-if="nePlayVideo || !(options.video.details)">\n    <iframe ng-src="{{video.embedSrc}}" frameBorder="0" width="{{video.width}}" height="{{video.height}}" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>\n  </div>\n</div>\n<div class="ne-video" ng-if="video.basic">\n  <div class="ne-video-player">\n    <div class="player">\n      <video ng-src="{{video.basic}}" controls></video>\n    </div>\n  </div>\n</div>\n<div ng-init="neImageLong=false" ng-class="{false:\'ne-image\', true:\'ne-image ne-image-long\'}[neImageLong]"\nng-if="image.url">\n<div class="ne-image-wrapper">\n  <img ng-src="{{image.url}}" ng-click="neImageLong=!neImageLong" alt=""/>\n</div>\n</div>\n<!-- <div class="ne-pdf" ng-if="pdf.url">\n  <div class="ne-pdf-preview" ng-hide="neShowPdf">\n    <div class="ne-pdf-icon">\n      <i class="fa fa-file-pdf-o"></i>\n    </div>\n    <div class="ne-pdf-detail" >\n      <div class="ne-pdf-title">\n        <a href="">{{pdf.url}}</a>\n      </div>\n      <div class="ne-pdf-view">\n\n        <button><i class="fa fa-download"></i> <a ng-href="{{pdf.url}}" target="_blank">Download</a></button>\n        <button ng-click="neShowPdf=!neShowPdf"><i class="fa fa-eye"></i> View PDF</button>\n\n      </div>\n    </div>\n  </div>\n  <div class="ne-pdf-viewer" ng-if="neShowPdf" ng-show="neShowPdf">\n    <iframe ng-src="{{pdf.url}}" frameBorder="0"></iframe>\n  </div>\n\n</div>\n<div class="ne-audio" ng-if="audio.url">\n  <audio ng-src="{{audio.url}}" controls></audio>\n</div> -->\n'),a.put("app/channels/chat/room/view.tags.modal.html",'<div class="modal-header" data-ng-init="initModal()">\n  <h3 class="modal-title">{{ \'APPLICATION_TAGS\' | translate }}</h3>\n</div>\n<div class="modal-body">\n  <!-- START TRANSPORT -->\n  <div class="form-group">\n    <form name="form" novalidate>\n      <!-- START TAGS -->\n      <div class="form-group">\n        <ui-select multiple data-ng-model="item.tags" theme="bootstrap">\n          <ui-select-match placeholder="{{\'APPLICATION_TAGS\' | translate}}">{{$item}}</ui-select-match>\n          <ui-select-choices repeat="tag in tags | filter: $select.search">\n            {{tag}}\n          </ui-select-choices>\n        </ui-select>\n      </div>\n      <!-- END TAGS -->\n    </form>\n  </div>\n  <!-- END TRANSPORT -->\n</div>\n<div class="modal-footer">\n  <button type="button" class="btn" data-ng-class="button.class" data-ng-click="button.click()"data-ng-repeat="button in modal.buttons">{{button.text | translate}}</button>\n  <!-- <button class="btn btn-success" type="button" data-ng-click="ok()">{{ \'APPLICATION_CONFIRM\' | translate }}</button>\n  <button class="btn default" type="button" data-ng-click="cancel()">{{ \'APPLICATION_CANCEL\' | translate }}</button> -->\n</div>\n'),
 a.put("app/channels/chat/visitor/list/list.html",'<div class="row">\n	<div class="col-md-12">\n			<div class="page-bar">\n				<ul class="page-breadcrumb">\n					<li>\n						<i class="icon-rocket"></i>\n						<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-puzzle"></i>\n						<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-bubble"></i>\n						<a href="#">{{ \'APPLICATION_CHAT\' | translate }}</a>\n						<i class="fa fa-angle-right"></i>\n					</li>\n					<li>\n						<i class="icon-question"></i>\n						<a href="/channels/chat/visitors/list">{{ \'APPLICATION_VISITORS\' | translate }}</a>\n					</li>\n				</ul>\n			</div>\n		</div>\n</div>\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-question font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_VISITORS\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/chat/visitor/view/view.html",'<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-bubble"></i>\n					<a href="#">{{ \'APPLICATION_CHAT\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-question"></i>\n					<a href="/channels/chat/visitors/list">{{ \'APPLICATION_VISITORS\' | translate }}</a>\n					<i  class="fa fa-angle-right"></i>\n				</li>\n				<li data-ng-show="chatVisitor">\n					<a href="#">{{chatVisitor.fullname}}</a>\n				</li>\n			</ul>\n		</div>\n\n		<!-- BEGIN PROFILE SIDEBAR -->\n		<div class="profile-sidebar">\n			<!-- PORTLET MAIN -->\n			<div class="portlet light profile-sidebar-portlet">\n				<!-- SIDEBAR USERPIC -->\n				<div class="profile-image">\n					<img data-ng-src="assets/images/media/visitor.png" class="img-responsive">\n				</div>\n				<!-- END SIDEBAR USERPIC -->\n				<!-- SIDEBAR USER TITLE -->\n				<div class="profile-usertitle">\n					<div class="profile-usertitle-name">\n						{{chatVisitor.fullname}}\n					</div>\n				</div>\n				<!-- END SIDEBAR USER TITLE -->\n\n				<!-- SIDEBAR MENU -->\n				<div class="profile-usermenu">\n					<ul class="nav">\n						<li data-ng-class="{active: $state.is(\'main.channels.chat.visitors.view.profile\')}">\n							<a data-ng-href="/channels/chat/visitors/view/{{chatVisitor.id}}/profile">\n							<i class="icon-tag"></i>\n							{{ \'APPLICATION_PROFILE\' | translate}} </a>\n						</li>\n					</ul>\n				</div>\n				<!-- END MENU -->\n			</div>\n			<!-- END PORTLET MAIN -->\n		</div>\n		<!-- END BEGIN PROFILE SIDEBAR -->\n		<!-- BEGIN PROFILE CONTENT -->\n		<div ui-view class="profile-content">\n		</div>\n		<!-- END PROFILE CONTENT -->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/chat/visitor/view/view.profile.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_PROFILE\' | translate}}</span>\n				</div>\n			</div>\n			<div class="portlet-body" data-ng-init="initView()">\n				<div>\n					<h4 class="profile-desc-title">{{chatVisitor.email}}</h4>\n					<div class="margin-top-20 profile-desc-link">\n						<i class="icon-magnifier"></i>\n						<a href="#" class="inactive-link">{{chatVisitor.origin}}</a>\n					</div>\n					<div class="margin-top-20 profile-desc-link">\n						<i class="icon-globe"></i>\n						<a href="#" class="inactive-link">{{chatVisitor.remote_address}}</a>\n					</div>\n					<div class="margin-top-20 profile-desc-link">\n						<i class="icon-user"></i>\n						<a href="#" class="inactive-link">{{chatVisitor.user_agent | truncate: 50: \'...\'}}</a>\n					</div>\n					<div class="margin-top-20 profile-desc-link">\n						<i class="icon-flag"></i>\n						<a href="#" class="inactive-link">{{chatVisitor.visitor_language}}</a>\n					</div>\n					<div class="margin-top-20 profile-desc-link">\n						<i class="icon-home"></i>\n						<a href="#" class="inactive-link">{{chatVisitor.referer}}</a>\n					</div>\n					<div class="margin-top-20 profile-desc-link">\n						<i class="icon-cursor"></i>\n						<a href="#" class="inactive-link">{{chatVisitor.browser}}</a>\n					</div>\n					<div class="margin-top-20 profile-desc-link">\n						<i class="icon-screen-desktop"></i>\n						<a href="#" class="inactive-link">{{chatVisitor.os}}</a>\n					</div>\n				</div>\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/chat/website/list/list.html",'<div class="row">\n	<div class="col-md-12">\n		<div class="page-bar">\n			<ul class="page-breadcrumb">\n				<li>\n					<i class="icon-rocket"></i>\n					<a href="/">{{ \'APPLICATION_DASHBOARD\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-puzzle"></i>\n					<a href="#">{{ \'APPLICATION_CHANNELS\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-bubble"></i>\n					<a href="#">{{ \'APPLICATION_CHAT\' | translate }}</a>\n					<i class="fa fa-angle-right"></i>\n				</li>\n				<li>\n					<i class="icon-globe"></i>\n					<a href="#">{{ \'APPLICATION_WEB_SITES\' | translate }}</a>\n				</li>\n			</ul>\n		</div>\n	</div>\n</div>\n\n<!-- BEGIN PAGE CONTENT-->\n<div class="row">\n	<div class="col-md-12">\n		<!-- BEGIN Portlet PORTLET-->\n		<div class="portlet light bordered" data-ng-init="initView()">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-notebook font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_WEB_SITES\' | translate }}</a> </span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle" href="/channels/chat/websites/wizard">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_WEB_SITE\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{ \'MESSAGE_NO_RESULTS_AVAILABLE\' | translate }}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/chat/website/view/action/list/list.html",'<div class="row" data-ng-init="initActons()">\n	<div class="col-md-12">\n		<div class="portlet light">\n			<div class="portlet-title tabbable-line">\n				<div class="caption caption-md">\n					<i class="icon-globe theme-font hide"></i>\n					<span class="caption-subject font-blue-madison bold uppercase">{{\'APPLICATION_ACTIONS\' | translate}}</span>\n				</div>\n				<div class="actions">\n					<div class="btn-group" data-ng-show="id.length">\n						<a class="btn red" href="#" data-ng-click="deleteItems()">\n							<i class="icon-trash"></i> {{ \'APPLICATION_DELETE\' | translate }}\n						</a>\n					</div>\n					<div class="btn-group">\n						<a class="btn green-jungle" href="/channels/chat/websites/view/{{chatWebsite.id}}/actions/wizard" data-toggle="dropdown">\n							<i class="icon-plus"></i> {{ \'APPLICATION_NEW_ACTION\' | translate }}\n						</a>\n					</div>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<!-- START TABLE -->\n				<div ui-grid="gridOptions"  ui-grid-resize-columns ui-grid-auto-resize ui-grid-pagination ui-grid-selection ui-grid-exporter ui-grid-draggable-rows class="ui-grid">\n					<div class="watermark" ng-show="!gridOptions.data.length">{{\'MESSAGE_NO_RESULTS_AVAILABLE\' | translate}}</div>\n				</div>\n				<!-- END TABLE -->\n			</div>\n		</div>\n	</div>\n</div>\n'),a.put("app/channels/chat/website/view/action/view/view.html",'\n<div class="row" data-ng-init="initAction()">\n	<div class="col-md-12">\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-directions font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ACTION\' | translate }}</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<form name="forms.settings" ng-submit="updateItem()" novalidate>\n					<!-- START APP -->\n					<div class="form-group"  data-ng-class="{\'has-error\': (forms.settings.app.$touched || forms.settings.$submitted) && forms.settings.app.$invalid}">\n						<label class="control-label">{{ \'APPLICATION_APPLICATION\' | translate }}<span class="required" aria-required="true">*</span></label>\n						<ui-select data-ng-model="application.app" name="app" theme="bootstrap" required>\n							<ui-select-match placeholder="{{ \'APPLICATION_APPLICATION\' | translate }}">{{$select.selected.name}}</ui-select-match>\n							<ui-select-choices repeat="app.value as app in apps | filter: $select.search">\n								<div ng-bind-html="app.name | highlight: $select.search"></div>\n							</ui-select-choices>\n						</ui-select>\n						<span data-ng-show="(forms.settings.app.$touched || forms.settings.$submitted) && forms.settings.app.$invalid && forms.settings.app.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n					</div>\n					<!-- END APP -->\n\n					<div class="app-settings" ng-slide-down="application.app === \'queue\'" lazy-render duration="1" data-ng-init="getQueues()">\n						<!-- START QUEUE -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.queue.$touched || forms.settings.$submitted) && forms.settings.queue.$invalid}">\n							<label class="control-label">{{\'APPLICATION_QUEUE\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.ChatQueueId" name="queue" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n								<ui-select-choices repeat="queue.id as queue in queues | filter: $select.search">\n									<div ng-bind-html="queue.name | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<div class="note note-warning" data-ng-hide="queues.length">\n                <h4 class="block">Warning!</h4>\n                <p>\n                  {{ \'MESSAGE_NO_QUEUES_AVAILABLE\' | translate }}\n                </p>\n                <p>\n                  {{\'APPLICATION_GO_TO\' | translate}} <a href="/channels/chat/queues/list">{{\'APPLICATION_QUEUES\' | translate}}</a>\n                </p>\n              </div>\n							<span data-ng-show="(forms.settings.queue.$touched || forms.settings.$submitted) && forms.settings.queue.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END QUEUE -->\n\n						<!-- START TIMEOUT -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid}">\n							<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}} <span class="required" aria-required="true">*</span></label>\n							<input type="number" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="application.timeout" min="1" required/>\n							<span data-ng-show="(forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid && forms.settings.timeout.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END TIMEOUT -->\n					</div>\n\n					<div class="app-settings" ng-slide-down="application.app === \'agent\'" lazy-render duration="1" data-ng-init="getAgents()">\n						<!-- START AGENT -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.agent.$touched || forms.settings.$submitted) && forms.settings.agent.$invalid}">\n							<label class="control-label">{{\'APPLICATION_AGENT\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.UserId" name="agent" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.fullname}}</ui-select-match>\n								<ui-select-choices repeat="agent.id as agent in agents | filter: $select.search">\n									<div ng-bind-html="agent.fullname | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<div class="note note-warning" data-ng-hide="agents.length">\n                <h4 class="block">Warning!</h4>\n                <p>\n                  {{ \'MESSAGE_NO_AGENTS_AVAILABLE\' | translate }}\n                </p>\n                <p>\n                  {{\'APPLICATION_GO_TO\' | translate}} <a href="/staff/agents/list">{{\'APPLICATION_QUEUES\' | translate}}</a>\n                </p>\n              </div>\n							<span data-ng-show="(forms.settings.agent.$touched || forms.settings.$submitted) && forms.settings.agent.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END AGENT -->\n\n						<!-- START TIMEOUT -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid}">\n							<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}} <span class="required" aria-required="true">*</span></label>\n							<input type="number" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="application.timeout" min="1" required/>\n							<span data-ng-show="(forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid && forms.settings.timeout.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END TIMEOUT -->\n					</div>\n\n					<div class="app-settings" ng-slide-down="application.app === \'sendMail\'" lazy-render duration="1" data-ng-init="getMailAccounts();getTemplates()">\n						<!-- START SENDMAIL -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.timeout.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid}">\n							<label class="control-label">{{\'APPLICATION_TO\' | translate}} <span class="required" aria-required="true">*</span></label>\n							<input type="email" name="to" placeholder="{{\'APPLICATION_TO\' | translate}}" class="form-control" data-ng-model="application.data2" min="1" required/>\n							<span data-ng-show="(forms.settings.from.$touched || forms.settings.$submitted) && forms.settings.timeout.$invalid && forms.settings.timeout.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.mail.$touched || forms.settings.$submitted) && forms.settings.account.$invalid}">\n							<label class="control-label">{{\'APPLICATION_ACCOUNT\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.data8" name="account" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n								<ui-select-choices repeat="account.id as account in mailAccounts | filter: $select.search">\n									<div ng-bind-html="account.name | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.settings.account.$touched || forms.settings.$submitted) && forms.settings.account.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.template.$touched || forms.settings.$submitted) && forms.settings.template.$invalid}">\n							<label class="control-label">{{\'APPLICATION_TEMPLATE\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.data9" name="template" theme="bootstrap" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n								<ui-select-choices repeat="template.id as template in templates | filter: $select.search">\n									<div ng-bind-html="template.name | highlight: $select.search"></div>\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.settings.template.$touched || forms.settings.$submitted) && forms.settings.template.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END SENDMAIL -->\n					</div>\n\n					<!-- START INTERVAL_TYPE -->\n					<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.intType.$touched || forms.settings.$submitted) && forms.settings.intType.$invalid}">\n						<label class="control-label">{{ \'APPLICATION_INTERVAL_TYPE\' | translate }}<span class="required" aria-required="true">*</span></label>\n						<ui-select data-ng-model="application.intType" theme="bootstrap" name="intType" required>\n							<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{ $select.selected.name | translate }}</ui-select-match>\n							<ui-select-choices repeat="intType.value as intType in $application.intTypes | filter: $select.search">\n								{{ intType.name | translate }}\n							</ui-select-choices>\n						</ui-select>\n						<span data-ng-show="(forms.settings.intType.$touched || forms.settings.$submitted) && forms.settings.intType.$error.required" class="help-block help-block-error">\n							<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n						</span>\n					</div>\n					<!-- END INTERVAL_TYPE -->\n\n					<div class="app-settings" ng-slide-down="application.intType === \'custom\'" lazy-render duration="1">\n						<!-- START TIME -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_TIME\' | translate }}</label>\n							<div class="input-group input-large">\n								<fieldset class="pull-left" ng-disabled="application.alwaysTime">\n									<uib-timepicker name="t_from" data-ng-model="application.t_from" show-meridian="false" show-spinners="false" mousewheel="false"></uib-timepicker>\n								</fieldset>\n								<div class="input-group-addon col-md-1 interval-to pull-left">to</div>\n								<fieldset ng-disabled="application.alwaysTime"><uib-timepicker  name="t_to" data-ng-model="application.t_to" show-meridian="false" show-spinners="false" mousewheel="false"></uib-timepicker></fieldset>\n								<!-- <label class="control-label pointer-cursor"><input type="checkbox" data-ng-model="application.alwaysTime">{{\'APPLICATION_ALWAYS\' | translate}}</label> -->\n							</div>\n						</div>\n						<!-- END TIME -->\n\n						<!-- START ALWAYS -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_ALWAYS\' | translate }}</label>\n							<div class="input-group input-large">\n								<label class="control-label pointer-cursor">\n									<input\n										bs-switch\n										data-ng-model="application.alwaysTime"\n										type="checkbox"\n										switch-active="{{ isActive }}"\n										switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n										switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n										switch-on-color="{{ onColor }}"\n										switch-off-color="{{ offColor }}"\n										switch-animate="{{ animate }}"\n										switch-size="{{ size }}"\n										switch-label="{{ label }}"\n										switch-icon="{{ icon }}"\n										switch-radio-off="{{ radioOff }}"\n										switch-label-width="{{ labelWidth }}"\n										switch-handle-width="{{ handleWidth }}">\n									<!-- <input type="checkbox" data-ng-model="application.alwaysTime"> -->\n								</label>\n							</div>\n						</div>\n						<!-- END ALWAYS -->\n\n						<!-- START WEEKDAY -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_WEEKDAY\' | translate }}</label>\n							<div class="input-group input-large">\n								<ui-select data-ng-model="application.wd_from" theme="bootstrap" name="wd_from">\n									<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n										{{ weekDay.name | translate}}\n									</ui-select-choices>\n								</ui-select>\n								<span class="input-group-addon">to</span>\n								<ui-select data-ng-model="application.wd_to" theme="bootstrap" name="wd_to">\n									<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n										{{ weekDay.name | translate }}\n									</ui-select-choices>\n								</ui-select>\n							</div>\n						</div>\n						<!-- END WEEKDAY -->\n\n						<!-- START MONTHDAY -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_MONTHDAY\' | translate }}</label>\n							<div class="input-group input-large">\n								<ui-select data-ng-model="application.md_from" theme="bootstrap" name="md_from">\n									<ui-select-match>{{$select.selected}}</ui-select-match>\n									<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n										{{monthDay}}\n									</ui-select-choices>\n								</ui-select>\n								<span class="input-group-addon">to</span>\n								<ui-select data-ng-model="application.md_to" theme="bootstrap" name="md_to">\n									<ui-select-match>{{$select.selected}}</ui-select-match>\n									<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n										{{monthDay}}\n									</ui-select-choices>\n								</ui-select>\n							</div>\n						</div>\n						<!-- END MONTHDAY -->\n\n						<!-- START MONTH -->\n						<div class="form-group">\n							<label class="control-label">{{ \'APPLICATION_MONTH\' | translate }}</label>\n							<div class="input-group input-large">\n								<ui-select data-ng-model="application.m_from" theme="bootstrap" name="m_from">\n									<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n										{{ month.name | translate }}\n									</ui-select-choices>\n								</ui-select>\n								<span class="input-group-addon">to</span>\n								<ui-select data-ng-model="application.m_to" theme="bootstrap" name="m_to">\n									<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n										{{ month.name | translate }}\n									</ui-select-choices>\n								</ui-select>\n							</div>\n						</div>\n						<!-- END MONTH -->\n					</div>\n\n					<div class="app-settings" ng-slide-down="application.intType === \'list\'" lazy-render duration="1" data-ng-init="getIntervals()">\n\n						<!-- START INTERVALS -->\n						<div class="form-group" data-ng-class="{\'has-error\': (forms.settings.IntervalId.$touched || forms.settings.$submitted) && forms.settings.IntervalId.$invalid}">\n							<label class="control-label">{{\'APPLICATION_INTERVALS\' | translate}}<span class="required" aria-required="true">*</span></label>\n							<ui-select data-ng-model="application.IntervalId" theme="bootstrap" name="IntervalId" required>\n								<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{ $select.selected.name}}</ui-select-match>\n								<ui-select-choices repeat="interval.id as interval in intervals | filter: $select.search">\n									{{ interval.name}}\n								</ui-select-choices>\n							</ui-select>\n							<span data-ng-show="(forms.settings.IntervalId.$touched || forms.settings.$submitted) && forms.settings.IntervalId.$error.required" class="help-block help-block-error">\n								<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n							</span>\n						</div>\n						<!-- END INTERVALS -->\n\n					</div>\n					<button class="btn green-haze" type="submit">{{\'APPLICATION_UPDATE\' | translate}}</button>\n				</form>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),a.put("app/channels/chat/website/view/action/wizard/wizard.html",'\n<div class="row" data-ng-init="initWizard()">\n	<div class="col-md-12">\n		<!-- BEGIN  PORTLET-->\n		<div class="portlet light bordered">\n			<div class="portlet-title">\n				<div class="caption font-green-sharp">\n					<i class="icon-directions font-green-sharp"></i>\n					<span class="caption-subject">{{ \'APPLICATION_ACTION\' | translate }} WIZARD</a> </span>\n				</div>\n			</div>\n			<div class="portlet-body">\n				<wizard on-finish="createItem()">\n					<wz-step title="{{\'APPLICATION_APPLICATION\' | translate}}" canexit="formValidation(forms.action.$valid)">\n						<form name="forms.action" novalidate>\n							<!-- START APP -->\n							<div class="form-group"  data-ng-class="{\'has-error\': forms.action.$submitted && forms.action.app.$invalid}">\n								<label class="control-label">{{ \'APPLICATION_APPLICATION\' | translate }}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="application.app" name="app" theme="bootstrap" required>\n									<ui-select-match placeholder="{{ \'APPLICATION_APPLICATION\' | translate }}">{{$select.selected.name}}</ui-select-match>\n									<ui-select-choices repeat="app.value as app in apps | filter: $select.search">\n										<div ng-bind-html="app.name | highlight: $select.search"></div>\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="forms.action.$submitted && forms.action.app.$invalid" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END APP -->\n\n							<div class="app-settings" ng-slide-down="application.app === \'agent\'" lazy-render duration="1" data-ng-init="getAgents()">\n								<!-- START AGENT -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.agent.$touched || forms.action.$submitted) && forms.action.agent.$invalid}">\n									<label class="control-label">{{\'APPLICATION_AGENT\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.UserId" name="agent" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.fullname}}</ui-select-match>\n										<ui-select-choices repeat="agent.id as agent in agents | filter: $select.search">\n											<div ng-bind-html="agent.fullname | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<div class="note note-warning" data-ng-hide="agents.length">\n	                  <h4 class="block">Warning!</h4>\n	                  <p>\n	                    {{ \'MESSAGE_NO_AGENTS_AVAILABLE\' | translate }}\n	                  </p>\n	                  <p>\n	                    {{\'APPLICATION_GO_TO\' | translate}} <a href="/staff/agents/list">{{\'APPLICATION_QUEUES\' | translate}}</a>\n	                  </p>\n	                </div>\n									<span data-ng-show="(forms.action.agent.$touched || forms.action.$submitted) && forms.action.agent.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END AGENT -->\n\n								<!-- START TIMEOUT -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid}">\n									<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}} <span class="required" aria-required="true">*</span></label>\n									<input type="number" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="application.timeout" min="1" required/>\n									<span data-ng-show="(forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid && forms.action.timeout.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END TIMEOUT -->\n\n							</div>\n\n							<div class="app-settings" ng-slide-down="application.app === \'queue\'" lazy-render duration="1" data-ng-init="getQueues()">\n								<!-- START QUEUE -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.queue.$touched || forms.action.$submitted) && forms.action.queue.$invalid}">\n									<label class="control-label">{{\'APPLICATION_QUEUE\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.ChatQueueId" name="queue" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="queue.id as queue in queues | filter: $select.search">\n											<div ng-bind-html="queue.name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<div class="note note-warning" data-ng-hide="queues.length">\n	                  <h4 class="block">Warning!</h4>\n	                  <p>\n	                    {{ \'MESSAGE_NO_QUEUES_AVAILABLE\' | translate }}\n	                  </p>\n	                  <p>\n	                    {{\'APPLICATION_GO_TO\' | translate}} <a href="/channels/chat/queues/list">{{\'APPLICATION_QUEUES\' | translate}}</a>\n	                  </p>\n	                </div>\n									<span data-ng-show="(forms.action.queue.$touched || forms.action.$submitted) && forms.action.queue.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END QUEUE -->\n\n								<!-- START TIMEOUT -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid}">\n									<label class="control-label">{{\'APPLICATION_TIMEOUT\' | translate}} <span class="required" aria-required="true">*</span></label>\n									<input type="number" name="timeout" placeholder="{{\'APPLICATION_TIMEOUT\' | translate}}" class="form-control" data-ng-model="application.timeout" min="1" required/>\n									<span data-ng-show="(forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid && forms.action.timeout.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END TIMEOUT -->\n							</div>\n\n							<div class="app-settings" ng-slide-down="application.app === \'sendMail\'" lazy-render duration="1" data-ng-init="getMailAccounts();getTemplates()">\n								<!-- START SENDMAIL -->\n								<div class="app-settings" ng-slide-down="application.app === \'sendMail\'" lazy-render duration="1">\n									<div class="form-group" data-ng-class="{\'has-error\': (forms.action.timeout.$touched || forms.action.$submitted) && forms.action.timeout.$invalid}">\n										<label class="control-label">{{\'APPLICATION_TO\' | translate}} <span class="required" aria-required="true">*</span></label>\n										<input type="email" name="to" placeholder="{{\'APPLICATION_TO\' | translate}}" class="form-control" data-ng-model="application.data2" min="1" required/>\n										<span data-ng-show="(forms.action.from.$touched || forms.action.$submitted) && forms.action.timeout.$invalid && forms.action.timeout.$error.required" class="help-block help-block-error">\n											<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n										</span>\n									</div>\n								</div>\n\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.mail.$touched || forms.action.$submitted) && forms.action.account.$invalid}">\n									<label class="control-label">{{\'APPLICATION_ACCOUNT\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.data8" name="account" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="account.id as account in mailAccounts | filter: $select.search">\n											<div ng-bind-html="account.name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.action.account.$touched || forms.action.$submitted) && forms.action.account.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.template.$touched || forms.action.$submitted) && forms.action.template.$invalid}">\n									<label class="control-label">{{\'APPLICATION_TEMPLATE\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.data9" name="template" theme="bootstrap" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{$select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="template.id as template in templates | filter: $select.search">\n											<div ng-bind-html="template.name | highlight: $select.search"></div>\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.action.template.$touched || forms.action.$submitted) && forms.action.template.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END SENDMAIL -->\n							</div>\n\n							<!-- START INTERVAL_TYPE -->\n							<div class="form-group" data-ng-class="{\'has-error\': (forms.action.intType.$touched || forms.action.$submitted) && forms.action.intType.$invalid}">\n								<label class="control-label">{{ \'APPLICATION_INTERVAL_TYPE\' | translate }}<span class="required" aria-required="true">*</span></label>\n								<ui-select data-ng-model="application.intType" theme="bootstrap" name="intType" required>\n									<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{ $select.selected.name | translate }}</ui-select-match>\n									<ui-select-choices repeat="intType.value as intType in $application.intTypes | filter: $select.search">\n										{{ intType.name | translate }}\n									</ui-select-choices>\n								</ui-select>\n								<span data-ng-show="(forms.action.intType.$touched || forms.action.$submitted) && forms.action.intType.$error.required" class="help-block help-block-error">\n									<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n								</span>\n							</div>\n							<!-- END INTERVAL_TYPE -->\n\n							<div class="app-settings" ng-slide-down="application.intType === \'custom\'" lazy-render duration="1">\n								<!-- START TIME -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_TIME\' | translate }}</label>\n									<div class="input-group input-large">\n										<fieldset class="pull-left" ng-disabled="application.alwaysTime">\n											<uib-timepicker name="t_from" data-ng-model="application.t_from" show-meridian="false" show-spinners="false" mousewheel="false"></uib-timepicker>\n										</fieldset>\n										<div class="input-group-addon col-md-1 interval-to pull-left">to</div>\n										<fieldset ng-disabled="application.alwaysTime"><uib-timepicker  name="t_to" data-ng-model="application.t_to" show-meridian="false" show-spinners="false" mousewheel="false"></uib-timepicker></fieldset>\n										<!-- <label class="control-label pointer-cursor"><input type="checkbox" data-ng-model="application.alwaysTime">{{\'APPLICATION_ALWAYS\' | translate}}</label> -->\n									</div>\n								</div>\n								<!-- END TIME -->\n\n								<!-- START ALWAYS -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_ALWAYS\' | translate }}</label>\n									<div class="input-group input-large">\n										<label class="control-label pointer-cursor">\n											<input\n												bs-switch\n												data-ng-model="application.alwaysTime"\n												type="checkbox"\n												switch-active="{{ isActive }}"\n												switch-on-text="{{ \'APPLICATION_YES\' | translate }}"\n												switch-off-text="{{ \'APPLICATION_NO\' | translate }}"\n												switch-on-color="{{ onColor }}"\n												switch-off-color="{{ offColor }}"\n												switch-animate="{{ animate }}"\n												switch-size="{{ size }}"\n												switch-label="{{ label }}"\n												switch-icon="{{ icon }}"\n												switch-radio-off="{{ radioOff }}"\n												switch-label-width="{{ labelWidth }}"\n												switch-handle-width="{{ handleWidth }}">\n											<!-- <input type="checkbox" data-ng-model="application.alwaysTime"> -->\n										</label>\n									</div>\n								</div>\n								<!-- END ALWAYS -->\n\n								<!-- START WEEKDAY -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_WEEKDAY\' | translate }}</label>\n									<div class="input-group input-large">\n										<ui-select data-ng-model="application.wd_from" theme="bootstrap" name="wd_from">\n											<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n											<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n												{{ weekDay.name | translate}}\n											</ui-select-choices>\n										</ui-select>\n										<span class="input-group-addon">to</span>\n										<ui-select data-ng-model="application.wd_to" theme="bootstrap" name="wd_to">\n											<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n											<ui-select-choices repeat="weekDay.value as weekDay in $interval.daysOfWeek | filter: $select.search">\n												{{ weekDay.name | translate }}\n											</ui-select-choices>\n										</ui-select>\n									</div>\n								</div>\n								<!-- END WEEKDAY -->\n\n								<!-- START MONTHDAY -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_MONTHDAY\' | translate }}</label>\n									<div class="input-group input-large">\n										<ui-select data-ng-model="application.md_from" theme="bootstrap" name="md_from">\n											<ui-select-match>{{$select.selected}}</ui-select-match>\n											<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n												{{monthDay}}\n											</ui-select-choices>\n										</ui-select>\n										<span class="input-group-addon">to</span>\n										<ui-select data-ng-model="application.md_to" theme="bootstrap" name="md_to">\n											<ui-select-match>{{$select.selected}}</ui-select-match>\n											<ui-select-choices repeat="monthDay in $interval.daysOfMonth | filter: $select.search">\n												{{monthDay}}\n											</ui-select-choices>\n										</ui-select>\n									</div>\n								</div>\n								<!-- END MONTHDAY -->\n\n								<!-- START MONTH -->\n								<div class="form-group">\n									<label class="control-label">{{ \'APPLICATION_MONTH\' | translate }}</label>\n									<div class="input-group input-large">\n										<ui-select data-ng-model="application.m_from" theme="bootstrap" name="m_from">\n											<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n											<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n												{{ month.name | translate }}\n											</ui-select-choices>\n										</ui-select>\n										<span class="input-group-addon">to</span>\n										<ui-select data-ng-model="application.m_to" theme="bootstrap" name="m_to">\n											<ui-select-match placeholder="">{{ $select.selected.name | translate }}</ui-select-match>\n											<ui-select-choices repeat="month.value as month in $interval.months | filter: $select.search">\n												{{ month.name | translate }}\n											</ui-select-choices>\n										</ui-select>\n									</div>\n								</div>\n								<!-- END MONTH -->\n							</div>\n\n							<div class="app-settings" ng-slide-down="application.intType === \'list\'" lazy-render duration="1" data-ng-init="getIntervals()">\n\n								<!-- START INTERVALS -->\n								<div class="form-group" data-ng-class="{\'has-error\': (forms.action.IntervalId.$touched || forms.action.$submitted) && forms.action.IntervalId.$invalid}">\n									<label class="control-label">{{\'APPLICATION_INTERVALS\' | translate}}<span class="required" aria-required="true">*</span></label>\n									<ui-select data-ng-model="application.IntervalId" theme="bootstrap" name="IntervalId" required>\n										<ui-select-match placeholder="{{\'APPLICATION_SEARCH_FILTER\' | translate}}">{{ $select.selected.name}}</ui-select-match>\n										<ui-select-choices repeat="interval.id as interval in intervals | filter: $select.search">\n											{{ interval.name}}\n										</ui-select-choices>\n									</ui-select>\n									<span data-ng-show="(forms.action.IntervalId.$touched || forms.action.$submitted) && forms.action.IntervalId.$error.required" class="help-block help-block-error">\n										<strong>{{\'APPLICATION_WARNING\' | translate}}!</strong> {{\'MESSAGE_REQUIRED_FIELD\' | translate}}.\n									</span>\n								</div>\n								<!-- END INTERVALS -->\n\n							</div>\n\n							<input class="btn green-haze" type="submit" data-ng-click="next()" value="{{\'APPLICATION_CONTINUE\' | translate}}"/>\n						</form>\n					</wz-step>\n					<wz-step title="{{\'APPLICATION_CONFIRM\' | translate}}">\n						<p>{{\'MESSAGE_CONFIGURATION_COMPLETED\' | translate}}</p>\n						<input class="btn default" type="button" value="{{\'APPLICATION_BACK\' | translate}}" wz-previous/>\n						<input class="btn green-haze" type="submit" data-ng-click="next()" value="{{\'APPLICATION_CONFIRM\' | translate}}"/>\n					</wz-step>\n				</wizard>\n			</div>\n		</div>\n		<!-- END Portlet PORTLET-->\n	</div>\n</div>\n<!-- END PAGE CONTENT-->\n'),
diff --git a/public/assets/plugins/jscripty/js/Actions.js b/public/assets/plugins/jscripty/js/Actions.js
index aeaa420..c42f825 100644
--- a/public/assets/plugins/jscripty/js/Actions.js
+++ b/public/assets/plugins/jscripty/js/Actions.js
@@ -1,634 +1 @@
-'use strict';
-/**
- * $Id: Actions.js,v 1.7 2013-02-14 07:48:01 gaudenz Exp $
- * Copyright (c) 2006-2012, JGraph Ltd
- */
-/**
- * Constructs the actions object for the given UI.
- */
-function Actions(editorUi) {
-	this.editorUi = editorUi;
-	this.actions = new Object();
-	this.init();
-};
-
-/**
- * Adds the default actions.
- */
-Actions.prototype.init = function() {
-	var ui = this.editorUi;
-	var editor = ui.editor;
-	var graph = editor.graph;
-
-	// File actions
-	this.addAction('new', function() {
-		ui.showDialog(new NewDialog(ui).container, 300, 180, true, true);
-	});
-	this.addAction('open', function() {
-		ui.showDialog(new OpenDialog(ui).container, 300, 180, true, true);
-	});
-	this.addAction('save', function() {
-		ui.saveFile(false);
-	}, null, null, 'Ctrl+S');
-	this.addAction('saveAs', function() {
-		ui.saveFile(true);
-	}, null, null, 'Ctrl+Shift-S');
-	this.addAction('publish', function() {
-		ui.publishFile(false);
-	}, null, null, 'Ctrl+Shift+P');
-	this.addAction('variable', function() {
-		ui.showDialog(new VariableDialog(ui).container, 300, 180, true, true);
-	});
-	this.addAction('import', function() {
-		ui.showDialog(new ImportDialog(ui).container, 300, 200, true, true);
-	});
-	this.addAction('export', function() {
-		ui.showDialog(new ExportDialog(ui).container, 300, 200, true, true);
-	}, null, null, 'Ctrl+E');
-	this.put('editFile', new Action(mxResources.get('edit'), mxUtils.bind(this,
-		function() {
-			this.editorUi.showDialog(new EditFileDialog(ui).container, 620, 420,
-				true, true);
-		})));
-	this.addAction('rename', function() {
-		ui.showDialog(new RenameDialog(ui).container, 300, 180, true, true);
-	});
-	this.addAction('print', function() {
-		mxUtils.printScreen(graph);
-	}, null, 'sprite-print', 'Ctrl+P');
-	this.addAction('preview', function() {
-		mxUtils.show(graph, null, 10, 10);
-	});
-
-	// Edit actions
-	this.addAction('undo', function() {
-		editor.undoManager.undo();
-	}, null, 'sprite-undo', 'Ctrl+Z');
-	this.addAction('redo', function() {
-		editor.undoManager.redo();
-	}, null, 'sprite-redo', 'Ctrl+Y');
-	this.addAction('cut', function() {
-		mxClipboard.cut(graph);
-	}, null, 'sprite-cut', 'Ctrl+X');
-	this.addAction('copy', function() {
-		mxClipboard.copy(graph);
-	}, null, 'sprite-copy', 'Ctrl+C');
-	this.addAction('paste', function() {
-		mxClipboard.paste(graph);
-	}, false, 'sprite-paste', 'Ctrl+V');
-	this.addAction('delete', function() {
-		graph.removeCells();
-	}, null, null, 'Delete');
-	this.addAction('duplicate', function() {
-		var s = graph.gridSize;
-		graph.setSelectionCells(graph.moveCells(graph.getSelectionCells(), s, s,
-			true));
-	}, null, null, 'Ctrl+D');
-	this.addAction('selectVertices', function() {
-		graph.selectVertices();
-	}, null, null, 'Ctrl+Shift+V');
-	this.addAction('selectEdges', function() {
-		graph.selectEdges();
-	}, null, null, 'Ctrl+Shift+E');
-	this.addAction('selectAll', function() {
-		graph.selectAll();
-	}, null, null, 'Ctrl+A');
-
-	// Navigation actions
-	this.addAction('home', function() {
-		graph.home();
-	}, null, null, 'Home');
-	this.addAction('exitGroup', function() {
-		graph.exitGroup();
-	}, null, null, 'Page Up');
-	this.addAction('enterGroup', function() {
-		graph.enterGroup();
-	}, null, null, 'Page Down');
-	this.addAction('expand', function() {
-		graph.foldCells(false);
-	}, null, null, 'Enter');
-	this.addAction('collapse', function() {
-		graph.foldCells(true);
-	}, null, null, 'Backspace');
-
-	// Arrange actions
-	this.addAction('toFront', function() {
-		graph.orderCells(false);
-	}, null, null, 'Ctrl+F');
-	this.addAction('toBack', function() {
-		graph.orderCells(true);
-	}, null, null, 'Ctrl+B');
-	this.addAction('group', function() {
-		graph.setSelectionCell(graph.groupCells(null, 0));
-	}, null, null, 'Ctrl+G');
-	this.addAction('ungroup', function() {
-		graph.setSelectionCells(graph.ungroupCells());
-	}, null, null, 'Ctrl+U');
-	this.addAction('removeFromGroup', function() {
-		graph.removeCellsFromParent();
-	});
-	this.addAction('editLink', function() {
-		var cell = graph.getSelectionCell();
-		var link = graph.getLinkForCell(cell);
-
-		if (link == null) {
-			link = '';
-		}
-
-		link = mxUtils.prompt(mxResources.get('enterValue'), link);
-
-		if (link != null) {
-			graph.setLinkForCell(cell, link);
-		}
-	});
-	this.addAction('openLink', function() {
-		var cell = graph.getSelectionCell();
-		var link = graph.getLinkForCell(cell);
-
-		if (link != null) {
-			window.open(link);
-		}
-	});
-	this.addAction('autosize', function() {
-		var cells = graph.getSelectionCells();
-
-		if (cells != null) {
-			graph.getModel().beginUpdate();
-			try {
-				for (var i = 0; i < cells.length; i++) {
-					var cell = cells[i];
-
-					if (graph.getModel().getChildCount(cell)) {
-						graph.updateGroupBounds([cell], 20);
-					} else {
-						graph.updateCellSize(cell);
-					}
-				}
-			} finally {
-				graph.getModel().endUpdate();
-			}
-		}
-	});
-	this.addAction('wordWrap', function() {
-		var state = graph.getView().getState(graph.getSelectionCell());
-		var value = 'wrap';
-
-		if (state != null && state.style[mxConstants.STYLE_WHITE_SPACE] == 'wrap') {
-			value = null;
-		}
-
-		graph.setCellStyles(mxConstants.STYLE_WHITE_SPACE, value);
-	});
-	this.addAction('rotation', function() {
-		var value = '0';
-		var state = graph.getView().getState(graph.getSelectionCell());
-
-		if (state != null) {
-			value = state.style[mxConstants.STYLE_ROTATION] || value;
-		}
-
-		value = mxUtils.prompt(mxResources.get('enterValue') + ' (' +
-			mxResources.get('rotation') + ' 0-360)', value);
-
-		if (value != null) {
-			graph.setCellStyles(mxConstants.STYLE_ROTATION, value);
-		}
-	});
-	this.addAction('tilt', function() {
-		var cells = graph.getSelectionCells();
-
-		if (cells != null) {
-			graph.getModel().beginUpdate();
-			try {
-				for (var i = 0; i < cells.length; i++) {
-					var cell = cells[i];
-
-					if (graph.getModel().isVertex(cell) && graph.getModel().getChildCount(
-							cell) == 0) {
-						var geo = graph.getCellGeometry(cell);
-
-						if (geo != null) {
-							// Rotates the size and position in the geometry
-							geo = geo.clone();
-							geo.x += geo.width / 2 - geo.height / 2;
-							geo.y += geo.height / 2 - geo.width / 2;
-							var tmp = geo.width;
-							geo.width = geo.height;
-							geo.height = tmp;
-							graph.getModel().setGeometry(cell, geo);
-
-							// Reads the current direction and advances by 90 degrees
-							var state = graph.view.getState(cell);
-
-							if (state != null) {
-								var dir = state.style[mxConstants.STYLE_DIRECTION] || 'east' /*default*/ ;
-
-								if (dir == 'east') {
-									dir = 'south';
-								} else if (dir == 'south') {
-									dir = 'west';
-								} else if (dir == 'west') {
-									dir = 'north';
-								} else if (dir == 'north') {
-									dir = 'east';
-								}
-
-								graph.setCellStyles(mxConstants.STYLE_DIRECTION, dir, [cell]);
-							}
-						}
-					}
-				}
-			} finally {
-				graph.getModel().endUpdate();
-			}
-		}
-	}, null, null, 'Ctrl+R');
-
-	// View actions
-	this.addAction('actualSize', function() {
-		graph.zoomTo(1);
-	});
-	this.addAction('zoomIn', function() {
-		graph.zoomIn();
-	}, null, null, 'Add');
-	this.addAction('zoomOut', function() {
-		graph.zoomOut();
-	}, null, null, 'Subtract');
-	this.addAction('fitWindow', function() {
-		graph.fit();
-	});
-
-	this.addAction('fitPage', mxUtils.bind(this, function() {
-		if (!graph.pageVisible) {
-			this.get('pageView').funct();
-		}
-
-		var fmt = graph.pageFormat;
-		var ps = graph.pageScale;
-		var cw = graph.container.clientWidth - 20;
-		var ch = graph.container.clientHeight - 20;
-
-		var scale = Math.floor(100 * Math.min(cw / fmt.width / ps, ch / fmt.height /
-			ps)) / 100;
-		graph.zoomTo(scale);
-
-		graph.container.scrollLeft = Math.round(graph.view.translate.x * scale -
-			Math.max(10, (graph.container.clientWidth - fmt.width * ps * scale) / 2)
-		);
-		graph.container.scrollTop = Math.round(graph.view.translate.y * scale -
-			Math.max(10, (graph.container.clientHeight - fmt.height * ps * scale) /
-				2));
-	}));
-	this.addAction('fitPageWidth', mxUtils.bind(this, function() {
-		if (!graph.pageVisible) {
-			this.get('pageView').funct();
-		}
-
-		var fmt = graph.pageFormat;
-		var ps = graph.pageScale;
-		var cw = graph.container.clientWidth - 20;
-
-		var scale = Math.floor(100 * cw / fmt.width / ps) / 100;
-		graph.zoomTo(scale);
-
-		graph.container.scrollLeft = Math.round(graph.view.translate.x * scale -
-			Math.max(10, (graph.container.clientWidth - fmt.width * ps * scale) / 2)
-		);
-		graph.container.scrollTop = Math.round(graph.view.translate.y * scale -
-			Math.max(10, (graph.container.clientHeight - fmt.height * ps * scale) /
-				2));
-	}));
-	this.put('customZoom', new Action(mxResources.get('custom'), function() {
-		var value = mxUtils.prompt(mxResources.get('enterValue') + ' (%)',
-			parseInt(graph.getView().getScale() * 100));
-
-		if (value != null && value.length > 0 && !isNaN(parseInt(value))) {
-			graph.zoomTo(parseInt(value) / 100);
-		}
-	}));
-
-	// Option actions
-	var action = null;
-	action = this.addAction('grid', function() {
-		graph.setGridEnabled(!graph.isGridEnabled());
-		editor.updateGraphComponents();
-	}, null, null, 'Ctrl+Shift+G');
-	action.setToggleAction(true);
-	action.setSelectedCallback(function() {
-		return graph.isGridEnabled();
-	});
-	action = this.addAction('guides', function() {
-		graph.graphHandler.guidesEnabled = !graph.graphHandler.guidesEnabled;
-	});
-	action.setToggleAction(true);
-	action.setSelectedCallback(function() {
-		return graph.graphHandler.guidesEnabled;
-	});
-	action = this.addAction('tooltips', function() {
-		graph.tooltipHandler.setEnabled(!graph.tooltipHandler.isEnabled());
-	});
-	action.setToggleAction(true);
-	action.setSelectedCallback(function() {
-		return graph.tooltipHandler.isEnabled();
-	});
-	action = this.addAction('navigation', function() {
-		graph.foldingEnabled = !graph.foldingEnabled;
-		graph.view.revalidate();
-	});
-	action.setToggleAction(true);
-	action.setSelectedCallback(function() {
-		return graph.foldingEnabled;
-	});
-	action = this.addAction('scrollbars', function() {
-		graph.scrollbars = !graph.scrollbars;
-		editor.updateGraphComponents();
-
-		if (!graph.scrollbars) {
-			var t = graph.view.translate;
-			graph.view.setTranslate(t.x - graph.container.scrollLeft / graph.view.scale,
-				t.y - graph.container.scrollTop / graph.view.scale);
-			graph.container.scrollLeft = 0;
-			graph.container.scrollTop = 0;
-			graph.sizeDidChange();
-		} else {
-			var dx = graph.view.translate.x;
-			var dy = graph.view.translate.y;
-
-			graph.view.translate.x = 0;
-			graph.view.translate.y = 0;
-			graph.sizeDidChange();
-			graph.container.scrollLeft -= Math.round(dx * graph.view.scale);
-			graph.container.scrollTop -= Math.round(dy * graph.view.scale);
-		}
-	}, !mxClient.IS_TOUCH);
-	action.setToggleAction(true);
-	action.setSelectedCallback(function() {
-		return graph.container.style.overflow == 'auto';
-	});
-	action = this.addAction('pageView', mxUtils.bind(this, function() {
-		graph.pageVisible = !graph.pageVisible;
-		graph.pageBreaksVisible = graph.pageVisible;
-		graph.preferPageSize = graph.pageBreaksVisible;
-		graph.view.validate();
-		graph.sizeDidChange();
-
-		editor.updateGraphComponents();
-		editor.outline.update();
-
-		if (mxUtils.hasScrollbars(graph.container)) {
-			if (graph.pageVisible) {
-				graph.container.scrollLeft -= 20;
-				graph.container.scrollTop -= 20;
-			} else {
-				graph.container.scrollLeft += 20;
-				graph.container.scrollTop += 20;
-			}
-		}
-	}));
-	action.setToggleAction(true);
-	action.setSelectedCallback(function() {
-		return graph.pageVisible;
-	});
-	action = this.addAction('connect', function() {
-		graph.setConnectable(!graph.connectionHandler.isEnabled());
-	}, null, null, 'Ctrl+Q');
-	action.setToggleAction(true);
-	action.setSelectedCallback(function() {
-		return graph.connectionHandler.isEnabled();
-	});
-	action = this.addAction('copyConnect', function() {
-		graph.connectionHandler.setCreateTarget(!graph.connectionHandler.isCreateTarget());
-	});
-	action.setToggleAction(true);
-	action.setSelectedCallback(function() {
-		return graph.connectionHandler.isCreateTarget();
-	});
-
-	// Help actions
-	this.addAction('help', function() {
-		var ext = '';
-
-		if (mxResources.isLanguageSupported(mxClient.language)) {
-			ext = '_' + mxClient.language;
-		}
-
-		window.open(RESOURCES_PATH + '/help' + ext + '.html');
-	});
-	this.put('about', new Action(mxResources.get('about') + ' Cally Square',
-		function() {
-			ui.showDialog(new AboutDialog(ui).container, 320, 280, true, true);
-		}, null, null, 'F1'));
-
-	// Font style actions
-	var toggleFontStyle = mxUtils.bind(this, function(key, style) {
-		this.addAction(key, function() {
-			graph.toggleCellStyleFlags(mxConstants.STYLE_FONTSTYLE, style);
-		});
-	});
-
-	toggleFontStyle('bold', mxConstants.FONT_BOLD);
-	toggleFontStyle('italic', mxConstants.FONT_ITALIC);
-	toggleFontStyle('underline', mxConstants.FONT_UNDERLINE);
-
-	// Format actions
-	this.addAction('shadow', function() {
-		graph.toggleCellStyles(mxConstants.STYLE_SHADOW);
-	});
-	this.addAction('dashed', function() {
-		graph.toggleCellStyles(mxConstants.STYLE_DASHED);
-	});
-	this.addAction('rounded', function() {
-		graph.toggleCellStyles(mxConstants.STYLE_ROUNDED);
-	});
-	this.addAction('curved', function() {
-		graph.toggleCellStyles(mxConstants.STYLE_CURVED);
-	});
-	this.addAction('style', function() {
-		var cells = graph.getSelectionCells();
-
-		if (cells != null && cells.length > 0) {
-			var model = graph.getModel();
-			var style = mxUtils.prompt(mxResources.get('enterValue') + ' (' +
-				mxResources.get('style') + ')',
-				model.getStyle(cells[0]) || '');
-
-			if (style != null) {
-				graph.setCellStyle(style, cells);
-			}
-		}
-	});
-	this.addAction('setAsDefaultEdge', function() {
-		graph.setDefaultEdge(graph.getSelectionCell());
-	});
-	this.addAction('addWaypoint', function() {
-		var cell = graph.getSelectionCell();
-
-		if (cell != null && graph.getModel().isEdge(cell)) {
-			var handler = editor.graph.selectionCellsHandler.getHandler(cell);
-
-			if (handler instanceof mxEdgeHandler) {
-				var t = graph.view.translate;
-				var s = graph.view.scale;
-				var dx = t.x;
-				var dy = t.y;
-
-				var parent = graph.getModel().getParent(cell);
-				var pgeo = graph.getCellGeometry(parent);
-
-				if (graph.getModel().isVertex(parent) && pgeo != null) {
-					dx += pgeo.x;
-					dy += pgeo.y;
-				}
-
-				handler.addPointAt(handler.state, graph.panningHandler.triggerX / s - dx,
-					graph.panningHandler.triggerY / s - dy);
-			}
-		}
-	});
-	this.addAction('removeWaypoint', function() {
-		// TODO: Action should run with "this" set to action
-		var rmWaypointAction = ui.actions.get('removeWaypoint');
-
-		if (rmWaypointAction.handler != null) {
-			// NOTE: Popupevent handled and action updated in Menus.createPopupMenu
-			rmWaypointAction.handler.removePoint(rmWaypointAction.handler.state,
-				rmWaypointAction.index);
-		}
-	});
-	this.addAction('image', function() {
-		function updateImage(value, w, h) {
-			var select = null;
-			var cells = graph.getSelectionCells();
-
-			graph.getModel().beginUpdate();
-			try {
-				// Inserts new cell if no cell is selected
-				if (cells.length == 0) {
-					var gs = graph.getGridSize();
-					cells = [graph.insertVertex(graph.getDefaultParent(), null, '', gs, gs,
-						w, h)];
-					select = cells;
-				}
-
-				graph.setCellStyles(mxConstants.STYLE_IMAGE, value, cells);
-				graph.setCellStyles(mxConstants.STYLE_SHAPE, 'image', cells);
-
-				if (graph.getSelectionCount() == 1) {
-					if (w != null && h != null) {
-						var cell = cells[0];
-						var geo = graph.getModel().getGeometry(cell);
-
-						if (geo != null) {
-							geo = geo.clone();
-							geo.width = w;
-							geo.height = h;
-							graph.getModel().setGeometry(cell, geo);
-						}
-					}
-				}
-			} finally {
-				graph.getModel().endUpdate();
-			}
-
-			if (select != null) {
-				graph.setSelectionCells(select);
-				graph.scrollCellToVisible(select[0]);
-			}
-		};
-
-		var value = '';
-		var state = graph.getView().getState(graph.getSelectionCell());
-
-		if (state != null) {
-			value = state.style[mxConstants.STYLE_IMAGE] || value;
-		}
-
-		value = mxUtils.prompt(mxResources.get('enterValue') + ' (' + mxResources.get(
-			'url') + ')', value);
-
-		if (value != null) {
-			if (value.length > 0) {
-				var img = new Image();
-
-				img.onload = function() {
-					updateImage(value, img.width, img.height);
-				};
-				img.onerror = function() {
-					mxUtils.alert(mxResources.get('fileNotFound'));
-				};
-
-				img.src = value;
-			}
-		}
-	});
-};
-
-/**
- * Registers the given action under the given name.
- */
-Actions.prototype.addAction = function(key, funct, enabled, iconCls, shortcut) {
-	return this.put(key, new Action(mxResources.get(key), funct, enabled, iconCls,
-		shortcut));
-};
-
-/**
- * Registers the given action under the given name.
- */
-Actions.prototype.put = function(name, action) {
-	this.actions[name] = action;
-
-	return action;
-};
-
-/**
- * Returns the action for the given name or null if no such action exists.
- */
-Actions.prototype.get = function(name) {
-	return this.actions[name];
-};
-
-/**
- * Constructs a new action for the given parameters.
- */
-function Action(label, funct, enabled, iconCls, shortcut) {
-	mxEventSource.call(this);
-	this.label = label;
-	this.funct = funct;
-	this.enabled = (enabled != null) ? enabled : true;
-	this.iconCls = iconCls;
-	this.shortcut = shortcut;
-};
-
-// Action inherits from mxEventSource
-mxUtils.extend(Action, mxEventSource);
-
-/**
- * Sets the enabled state of the action and fires a stateChanged event.
- */
-Action.prototype.setEnabled = function(value) {
-	if (this.enabled != value) {
-		this.enabled = value;
-		this.fireEvent(new mxEventObject('stateChanged'));
-	}
-};
-
-/**
- * Sets the enabled state of the action and fires a stateChanged event.
- */
-Action.prototype.setToggleAction = function(value) {
-	this.toggleAction = value;
-};
-
-/**
- * Sets the enabled state of the action and fires a stateChanged event.
- */
-Action.prototype.setSelectedCallback = function(funct) {
-	this.selectedCallback = funct;
-};
-
-/**
- * Sets the enabled state of the action and fires a stateChanged event.
- */
-Action.prototype.isSelected = function() {
-	return this.selectedCallback();
-};
\ No newline at end of file
diff --git a/public/assets/plugins/jscripty/js/Dialogs.js b/public/assets/plugins/jscripty/js/Dialogs.js
index 791874e..71c8f4d 100644
--- a/public/assets/plugins/jscripty/js/Dialogs.js
+++ b/public/assets/plugins/jscripty/js/Dialogs.js
@@ -1,1194 +1 @@
-'use strict';
-/**
- * $Id: Dialogs.js,v 1.5 2013-01-29 17:23:31 gaudenz Exp $
- * Copyright (c) 2006-2012, JGraph Ltd
- */
-/**
- * Constructs a new dialog.
- */
-
-function createCheckbox(value) {
-	var input = document.createElement('input');
-	input.setAttribute('type', 'checkbox');
-	if (value) {
-		input.setAttribute('checked', true);
-	}
-	return input;
-}
-
-function createDropdownFromApi(path, value, option_name, option_value, editorUi,
-	keys, pattern) {
-	var req = new XMLHttpRequest();
-	req.open('GET', path, false); // `false` makes the request synchronous
-	req.setRequestHeader('Authorization', 'Bearer ' + editorUi.editor.data.token);
-	req.send(null);
-	var res = [];
-	if (req.status === 200) {
-		res = JSON.parse(req.response);
-	}
-	var input = document.createElement('select');
-	var option = document.createElement('option');
-	option.text = '-- None --';
-	option.value = '-1';
-	input.appendChild(option);
-	res.rows.forEach(function(elem) {
-		option = document.createElement('option');
-		option.text = elem[option_name];
-		if (keys && pattern) {
-			keys.forEach(function(key) {
-				pattern = pattern.replace('%' + key + '%', elem[key]);
-			});
-			option.value = pattern;
-			option.selected = (pattern == value);
-		} else {
-			option.value = elem[option_value];
-			option.selected = (elem[option_value] == value);
-		}
-		input.appendChild(option);
-	});
-	input.className = 'form-control select2';
-
-	return input;
-}
-
-function createGroupedDropdownFromApi(path, value, option_name, option_value, editorUi, paginated, associationField) {
-	var req = new XMLHttpRequest();
-	req.open('GET', path, false); // `false` makes the request synchronous
-	req.setRequestHeader('Authorization', 'Bearer ' + editorUi.editor.data.token);
-	req.send(null);
-	var res = [];
-	if (req.status === 200) {
-		res = JSON.parse(req.response);
-	}
-	var input = document.createElement('select');
-	var option = document.createElement('option');
-	option.text = '-- None --';
-	option.value = '0';
-	input.appendChild(option);
-	var selectValues = paginated ? res.rows : res;
-	var mainFilter = {};
-	var groupFilter = {};
-	mainFilter[associationField] = null;
-	var mainValues = _.filter(selectValues, mainFilter);
-	var groupValues = {};
-	mainValues.forEach(function(elem) {
-		option = document.createElement('option');
-		option.className = 'select-group-father';
-		option.text = elem[option_name].toUpperCase();
-		option.value = elem[option_value];
-		option.selected = (elem[option_value] == value);
-		input.appendChild(option);
-		groupFilter[associationField] = elem[option_value];
-		groupValues = _.filter(selectValues, groupFilter);
-		groupValues.forEach(function(elem) {
-			option = document.createElement('option');
-			option.className = 'select-group-son';
-			option.text = '-' + _.capitalize(elem[option_name]);
-			option.value = elem[option_value];
-			option.selected = (elem[option_value] == value);
-			input.appendChild(option);
-		});
-	})
-	input.className = 'form-control select2';
-
-	return input;
-}
-
-function createDropdownFromArray(array, value) {
-	var input = document.createElement('select');
-
-	for (var item in array) {
-		var option = document.createElement('option');
-		option.text = array[item];
-		option.value = item;
-		if (value > 0 || value != '')
-			option.selected = (value === item) ? true : false;
-
-		input.appendChild(option);
-	}
-
-	input.className = 'form-control select2';
-
-	return input;
-}
-
-function Dialog(editorUi, elt, w, h, modal, closable, onClose) {
-	var dx = 0;
-
-	if (mxClient.IS_IE && document.documentMode != 9) {
-		dx = 60;
-	}
-
-	w += dx;
-	h += dx;
-
-	var left = Math.max(0, Math.round((document.body.scrollWidth - w) / 2));
-	var top = Math.max(0, Math.round((Math.max(document.body.scrollHeight,
-		document.documentElement.scrollHeight) - h) / 3));
-
-	var div = editorUi.createDiv('geDialog');
-	div.className = 'modal fade in center';
-	div.style.display = 'block';
-	div.style.paddingRight = '12px';
-	// div.style.width = w + 'px';
-	// div.style.height = h + 'px';
-	// div.style.left = left + 'px';
-	// div.style.top = top + 'px';
-
-	var divModalDialog = editorUi.createDiv('geModalDialog');
-	divModalDialog.className = 'modal-dialog';
-	divModalDialog.appendChild(elt);
-	div.appendChild(divModalDialog);
-
-	if (this.bg == null) {
-		this.bg = editorUi.createDiv('background');
-		this.bg.className = 'modal-backdrop fade in';
-
-		if (mxClient.IS_QUIRKS) {
-			new mxDivResizer(this.bg);
-		}
-	}
-
-	if (modal) {
-		document.body.appendChild(this.bg);
-	}
-
-	document.body.appendChild(div);
-
-	this.onDialogClose = onClose;
-	this.container = div;
-};
-
-/**
- * Removes the dialog from the DOM.
- */
-Dialog.prototype.close = function() {
-	if (this.onDialogClose != null) {
-		this.onDialogClose();
-		this.onDialogClose = null;
-	}
-
-	this.container.parentNode.removeChild(this.container);
-	this.bg.parentNode.removeChild(this.bg);
-};
-
-/**
- * Constructs a new open dialog.
- */
-function ImportDialog(editorUi) {
-
-	var content = editorUi.createDiv('modal-content');
-	var header = editorUi.createDiv('modal-header');
-	var body = editorUi.createDiv('modal-body');
-	var footer = editorUi.createDiv('modal-footer');
-
-	//--- START HEADER
-	var title = editorUi.createHeader('h4');
-	mxUtils.write(title, mxResources.get('import') + ' XML');
-
-	var x = mxUtils.button('', function() {
-		editorUi.hideDialog();
-	});
-	x.className = 'close';
-
-	header.appendChild(x);
-	header.appendChild(title);
-	//--- END HEADER
-
-	//--- START BODY
-	var row = editorUi.createDiv('row');
-	var col1 = editorUi.createDiv('col-md-12');
-
-	var textarea = document.createElement('textarea');
-	textarea.style.width = '100%';
-	textarea.style.height = '374px';
-
-	var input = document.createElement('input');
-	input.type = 'file';
-	input.setAttribute('accept', 'text/xml');
-
-	input.addEventListener('change', function readSingleFile(evt) {
-		//Retrieve the first (and only!) File from the FileList object
-		var f = evt.target.files[0];
-		console.log(f);
-		if (f) {
-			if (f.type === 'text/xml') {
-				var r = new FileReader();
-				r.onload = function(e) {
-					var contents = e.target.result;
-					mxUtils.write(textarea, contents);
-				};
-				r.readAsText(f);
-			} else {
-				alert('Failed to load format file');
-			}
-		} else {
-			alert('Failed to load file');
-		}
-	}, false);
-
-	col1.appendChild(input);
-	col1.appendChild(textarea);
-
-	row.appendChild(col1);
-	body.appendChild(row);
-	//--- END BODY
-
-	//--- START FOOTER
-	var save = mxUtils.button(mxResources.get('import'), mxUtils.bind(this,
-		function(data) {
-			var doc = mxUtils.parseXml(textarea.value);
-			editorUi.editor.setGraphXml(doc.documentElement);
-			editorUi.hideDialog();
-		}));
-	save.className = 'btn blue';
-
-	var close = mxUtils.button(mxResources.get('cancel'), function() {
-		editorUi.hideDialog();
-	});
-	close.className = 'btn default';
-
-	footer.appendChild(save);
-	footer.appendChild(close);
-	//--- END FOOTER
-
-	//--- START CONTENT
-	content.appendChild(header);
-	content.appendChild(body);
-	content.appendChild(footer);
-	//--- END CONTENT
-
-	this.container = content;
-
-};
-
-/**
- * Constructs a new about dialog.
- */
-function AboutDialog(editorUi) {
-	var content = editorUi.createDiv('modal-content');
-	var header = editorUi.createDiv('modal-header');
-	var body = editorUi.createDiv('modal-body');
-	var footer = editorUi.createDiv('modal-footer');
-
-	//--- START HEADER
-	var title = editorUi.createHeader('h4');
-	mxUtils.write(title, mxResources.get('about') + ' Cally Square');
-
-	var x = mxUtils.button('', function() {
-		editorUi.hideDialog();
-	});
-	x.className = 'close';
-
-	header.appendChild(x);
-	header.appendChild(title);
-	//--- END HEADER
-
-	//--- START BODY
-	var img = document.createElement('img');
-	img.style.border = '0px';
-	img.setAttribute('width', '176');
-	img.setAttribute('width', '151');
-	img.setAttribute('src', IMAGE_PATH + '/logo.png');
-	body.appendChild(img);
-	mxUtils.br(body);
-	mxUtils.write(body, 'Powered by Xenialab ' + mxClient.VERSION);
-	mxUtils.br(body);
-	var link = document.createElement('a');
-	link.setAttribute('href', 'http://www.callysquare.com/');
-	link.setAttribute('target', '_blank');
-	mxUtils.write(link, 'www.callysquare.com');
-	body.appendChild(link);
-	mxUtils.br(body);
-	mxUtils.br(body);
-	//--- END BODY
-
-	var close = mxUtils.button(mxResources.get('close'), function() {
-		editorUi.hideDialog();
-	});
-	close.className = 'btn default';
-
-	footer.appendChild(close);
-	//--- END FOOTER
-
-	//--- START CONTENT
-	content.appendChild(header);
-	content.appendChild(body);
-	content.appendChild(footer);
-	//--- END CONTENT
-
-	this.container = content;
-};
-
-/**
- * Constructs a new save dialog.
- */
-function SaveDialog(editorUi) {
-
-	var content = editorUi.createDiv('modal-content');
-	var header = editorUi.createDiv('modal-header');
-	var body = editorUi.createDiv('modal-body');
-	var footer = editorUi.createDiv('modal-footer');
-
-	//--- START HEADER
-	var title = editorUi.createHeader('h4');
-	mxUtils.write(title, mxResources.get('saveAs'));
-
-	var x = mxUtils.button('', function() {
-		editorUi.hideDialog();
-	});
-	x.className = 'close';
-
-	header.appendChild(x);
-	header.appendChild(title);
-	//--- END HEADER
-
-	//--- START BODY
-	var name = 'name';
-	var id = '_' + name;
-	var value = editorUi.editor.getOrCreateFilename();
-
-	var row = editorUi.createDiv('row');
-	var col1 = editorUi.createDiv('col-md-4');
-	var col2 = editorUi.createDiv('col-md-8');
-
-	var label = document.createElement('label');
-	label.className = 'control-label pull-right';
-	mxUtils.write(label, mxResources.get(name));
-	col1.appendChild(label);
-
-	var select = document.createElement('input');
-	select.setAttribute('value', value + '_copy');
-	select.setAttribute('id', id)
-	select.className = 'form-control';
-	col2.appendChild(select);
-
-	row.appendChild(col1);
-	row.appendChild(col2);
-	body.appendChild(row);
-	//--- END BODY
-
-	//--- START FOOTER
-	var save = mxUtils.button(mxResources.get('save'), function() {
-		editorUi.saveAs(select.value);
-		editorUi.hideDialog();
-	});
-	save.className = 'btn blue';
-
-	var close = mxUtils.button(mxResources.get('cancel'), function() {
-		editorUi.hideDialog();
-	});
-	close.className = 'btn default';
-
-	footer.appendChild(save);
-	footer.appendChild(close);
-	//--- END FOOTER
-
-	//--- START CONTENT
-	content.appendChild(header);
-	content.appendChild(body);
-	content.appendChild(footer);
-	//--- END CONTENT
-
-	this.container = content;
-	//nameInput.setAttribute('value', editorUi.editor.getOrCreateFilename());
-};
-
-/**
- * Constructs a new save dialog.
- */
-function NewDialog(editorUi) {
-
-	var content = editorUi.createDiv('modal-content');
-	var header = editorUi.createDiv('modal-header');
-	var body = editorUi.createDiv('modal-body');
-	var footer = editorUi.createDiv('modal-footer');
-
-	//--- START HEADER
-	var title = editorUi.createHeader('h4');
-	mxUtils.write(title, mxResources.get('new'));
-
-	var x = mxUtils.button('', function() {
-		editorUi.hideDialog();
-	});
-	x.className = 'close';
-
-	header.appendChild(x);
-	header.appendChild(title);
-	//--- END HEADER
-
-	//--- START BODY
-	var name = 'name';
-	var id = '_' + name;
-	var value = editorUi.editor.getOrCreateFilename();
-
-	var row = editorUi.createDiv('row');
-	var col1 = editorUi.createDiv('col-md-4');
-	var col2 = editorUi.createDiv('col-md-8');
-
-	var label = document.createElement('label');
-	label.className = 'control-label pull-right';
-	mxUtils.write(label, mxResources.get(name));
-	col1.appendChild(label);
-
-	var select = document.createElement('input');
-	select.setAttribute('value', value + '_new');
-	select.setAttribute('id', id)
-	select.className = 'form-control';
-	col2.appendChild(select);
-
-	row.appendChild(col1);
-	row.appendChild(col2);
-	body.appendChild(row);
-	//--- END BODY
-
-	//--- START FOOTER
-	var save = mxUtils.button(mxResources.get('new'), function() {
-		editorUi.new(select.value);
-		editorUi.hideDialog();
-	});
-	save.className = 'btn blue';
-
-	var close = mxUtils.button(mxResources.get('cancel'), function() {
-		editorUi.hideDialog();
-	});
-	close.className = 'btn default';
-
-	footer.appendChild(save);
-	footer.appendChild(close);
-	//--- END FOOTER
-
-	//--- START CONTENT
-	content.appendChild(header);
-	content.appendChild(body);
-	content.appendChild(footer);
-	//--- END CONTENT
-
-	this.container = content;
-	//nameInput.setAttribute('value', editorUi.editor.getOrCreateFilename());
-};
-
-/**
- * Constructs a new save dialog.
- */
-function VariableDialog(editorUi) {
-
-	var content = editorUi.createDiv('modal-content');
-	var header = editorUi.createDiv('modal-header');
-	var body = editorUi.createDiv('modal-body');
-	var footer = editorUi.createDiv('modal-footer');
-
-	//--- START HEADER
-	var title = editorUi.createHeader('h4');
-	mxUtils.write(title, mxResources.get('variable'));
-
-	var x = mxUtils.button('', function() {
-		editorUi.hideDialog();
-	});
-	x.className = 'close';
-
-	header.appendChild(x);
-	header.appendChild(title);
-	//--- END HEADER
-
-	//--- START BODY
-	var name = 'name';
-	var id = '_' + name;
-	var value = editorUi.editor.getOrCreateFilename();
-
-	var row = editorUi.createDiv('row');
-	var col1 = editorUi.createDiv('col-md-4');
-	var col2 = editorUi.createDiv('col-md-8');
-
-	var label = document.createElement('label');
-	label.className = 'control-label pull-right';
-	mxUtils.write(label, mxResources.get(name));
-	col1.appendChild(label);
-
-	var select = document.createElement('input');
-	select.setAttribute('value', 'variable name');
-	select.setAttribute('id', id)
-	select.className = 'form-control';
-	col2.appendChild(select);
-
-	row.appendChild(col1);
-	row.appendChild(col2);
-	body.appendChild(row);
-	//--- END BODY
-
-	//--- START FOOTER
-	var save = mxUtils.button(mxResources.get('new'), function() {
-		editorUi.variable(select.value);
-		editorUi.hideDialog();
-	});
-	save.className = 'btn blue';
-
-	var close = mxUtils.button(mxResources.get('cancel'), function() {
-		editorUi.hideDialog();
-	});
-	close.className = 'btn default';
-
-	footer.appendChild(save);
-	footer.appendChild(close);
-	//--- END FOOTER
-
-	//--- START CONTENT
-	content.appendChild(header);
-	content.appendChild(body);
-	content.appendChild(footer);
-	//--- END CONTENT
-
-	this.container = content;
-	//nameInput.setAttribute('value', editorUi.editor.getOrCreateFilename());
-};
-
-/**
- * Constructs a new save dialog.
- */
-function OpenDialog(editorUi) {
-
-	var content = editorUi.createDiv('modal-content');
-	var header = editorUi.createDiv('modal-header');
-	var body = editorUi.createDiv('modal-body');
-	var footer = editorUi.createDiv('modal-footer');
-
-	//--- START HEADER
-	var title = editorUi.createHeader('h4');
-	mxUtils.write(title, mxResources.get('open'));
-
-	var x = mxUtils.button('', function() {
-		editorUi.hideDialog();
-	});
-	x.className = 'close';
-
-	header.appendChild(x);
-	header.appendChild(title);
-	//--- END HEADER
-
-	//--- START BODY
-	var row = editorUi.createDiv('row');
-	var col1 = editorUi.createDiv('col-md-4');
-	var col2 = editorUi.createDiv('col-md-8');
-
-	var label = document.createElement('label');
-	label.className = 'control-label pull-right';
-	mxUtils.write(label, mxResources.get('name'));
-	col1.appendChild(label);
-
-	var req = new XMLHttpRequest();
-	req.open('GET', '/api/jscripty/projects', false); // `false` makes the request synchronous
-	req.setRequestHeader('Authorization', 'Bearer ' + editorUi.editor.data.token);
-	req.send(null);
-	var res = [];
-	if (req.status === 200) {
-		res = JSON.parse(req.response).rows;
-	}
-
-	var select = document.createElement('select');
-
-	for (var j = 0; j < res.length; j++) {
-		var option = document.createElement('option');
-		option.text = res[j].name;
-		option.value = res[j].id;
-		select.appendChild(option);
-	}
-	select.className = 'form-control';
-	col2.appendChild(select);
-
-	row.appendChild(col1);
-	row.appendChild(col2);
-	body.appendChild(row);
-	//--- END BODY
-
-	//--- START FOOTER
-	var save = mxUtils.button(mxResources.get('open'), function() {
-		console.log(select);
-		console.log(select.value);
-		window.open('jscripty/projects/view/' + select.value, '_blank');
-		editorUi.hideDialog();
-	});
-	save.className = 'btn blue';
-
-	var close = mxUtils.button(mxResources.get('cancel'), function() {
-		editorUi.hideDialog();
-	});
-	close.className = 'btn default';
-
-	footer.appendChild(save);
-	footer.appendChild(close);
-	//--- END FOOTER
-
-	//--- START CONTENT
-	content.appendChild(header);
-	content.appendChild(body);
-	content.appendChild(footer);
-	//--- END CONTENT
-
-	this.container = content;
-	//nameInput.setAttribute('value', editorUi.editor.getOrCreateFilename());
-};
-
-/**
- * Constructs a new rename dialog.
- */
-function RenameDialog(editorUi) {
-
-	var content = editorUi.createDiv('modal-content');
-	var header = editorUi.createDiv('modal-header');
-	var body = editorUi.createDiv('modal-body');
-	var footer = editorUi.createDiv('modal-footer');
-
-	//--- START HEADER
-	var title = editorUi.createHeader('h4');
-	mxUtils.write(title, mxResources.get('rename'));
-
-	var x = mxUtils.button('', function() {
-		editorUi.hideDialog();
-	});
-	x.className = 'close';
-
-	header.appendChild(x);
-	header.appendChild(title);
-	//--- END HEADER
-
-	//--- START BODY
-	var row = editorUi.createDiv('row');
-	var col1 = editorUi.createDiv('col-md-4');
-	var col2 = editorUi.createDiv('col-md-8');
-
-	var label = document.createElement('label');
-	label.className = 'control-label pull-right';
-	mxUtils.write(label, mxResources.get('name'));
-	col1.appendChild(label);
-	var name = editorUi.editor.filename;
-	var input = document.createElement('input');
-	input.setAttribute('value', name);
-	input.className = 'form-control';
-
-	col2.appendChild(input);
-
-	row.appendChild(col1);
-	row.appendChild(col2);
-	body.appendChild(row);
-	//--- END BODY
-
-	//--- START FOOTER
-	var save = mxUtils.button(mxResources.get('save'), function() {
-		var req = new XMLHttpRequest();
-
-		req.open("PUT", SAVE_URL + editorUi.editor.data.id, true);
-		req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
-		req.setRequestHeader('Authorization', 'Bearer ' + editorUi.editor.data.token);
-		req.send('name=' + input.value);
-
-		req.onload = function(e) {
-			if (req.status === 200) {
-				editorUi.editor.setStatus('Project successfully renamed');
-				editorUi.editor.filename = input.value;
-
-			} else {
-				editorUi.editor.setStatus(JSON.parse(req.response).errors[0].message)
-			}
-		}
-		req.onerror = function(e) {
-			mxUtils.alert(req.statusText);
-		};
-		editorUi.hideDialog();
-	});
-	save.className = 'btn blue';
-
-	var close = mxUtils.button(mxResources.get('cancel'), function() {
-		editorUi.hideDialog();
-	});
-	close.className = 'btn default';
-
-	footer.appendChild(save);
-	footer.appendChild(close);
-	//--- END FOOTER
-
-	//--- START CONTENT
-	content.appendChild(header);
-	content.appendChild(body);
-	content.appendChild(footer);
-	//--- END CONTENT
-
-	this.container = content;
-	//nameInput.setAttribute('value', editorUi.editor.getOrCreateFilename());
-};
-/**
- * Constructs a new edit file dialog.
- */
-function EditFileDialog(editorUi) {
-
-	var content = editorUi.createDiv('modal-content');
-	var header = editorUi.createDiv('modal-header');
-	var body = editorUi.createDiv('modal-body');
-	var footer = editorUi.createDiv('modal-footer');
-
-	//--- START HEADER
-	var title = editorUi.createHeader('h4');
-	mxUtils.write(title, mxResources.get('edit'));
-
-	var x = mxUtils.button('', function() {
-		editorUi.hideDialog();
-	});
-	x.className = 'close';
-
-	header.appendChild(x);
-	header.appendChild(title);
-	//--- END HEADER
-
-	//--- START BODY
-	var row = editorUi.createDiv('row');
-	var col1 = editorUi.createDiv('col-md-12');
-
-	var textarea = document.createElement('textarea');
-	textarea.style.width = '100%';
-	textarea.style.height = '374px';
-	textarea.value = mxUtils.getPrettyXml(editorUi.editor.getGraphXml());
-
-	// Enables dropping files
-	if (fileSupport) {
-		function handleDrop(evt) {
-			evt.stopPropagation();
-			evt.preventDefault();
-
-			if (evt.dataTransfer.files.length > 0) {
-				var file = evt.dataTransfer.files[0];
-
-				var reader = new FileReader();
-				reader.onload = function(e) {
-					textarea.value = e.target.result;
-				};
-				reader.readAsText(file);
-			}
-		};
-
-		function handleDragOver(evt) {
-			evt.stopPropagation();
-			evt.preventDefault();
-		};
-
-		// Setup the dnd listeners.
-		textarea.addEventListener('dragover', handleDragOver, false);
-		textarea.addEventListener('drop', handleDrop, false);
-	}
-	col1.appendChild(textarea);
-
-	row.appendChild(col1);
-	body.appendChild(row);
-	//--- END BODY
-
-	//--- START FOOTER
-	var save = mxUtils.button(mxResources.get('save'), function() {
-		var doc = mxUtils.parseXml(textarea.value);
-		editorUi.editor.setGraphXml(doc.documentElement);
-		editorUi.hideDialog();
-	});
-	save.className = 'btn blue';
-
-	var close = mxUtils.button(mxResources.get('cancel'), function() {
-		editorUi.hideDialog();
-	});
-	close.className = 'btn default';
-
-	footer.appendChild(save);
-	footer.appendChild(close);
-	//--- END FOOTER
-
-	//--- START CONTENT
-	content.appendChild(header);
-	content.appendChild(body);
-	content.appendChild(footer);
-	//--- END CONTENT
-
-	this.container = content;
-};
-
-/**
- * Constructs a new export dialog.
- */
-function ExportDialog(editorUi) {
-	var content = editorUi.createDiv('modal-content');
-	var header = editorUi.createDiv('modal-header');
-	var body = editorUi.createDiv('modal-body form');
-	var footer = editorUi.createDiv('modal-footer');
-
-	//--- START HEADER
-	var title = editorUi.createHeader('h4');
-	mxUtils.write(title, mxResources.get('export') + ' XML');
-
-	var x = mxUtils.button('', function() {
-		editorUi.hideDialog();
-	});
-	x.className = 'close';
-
-	header.appendChild(x);
-	header.appendChild(title);
-	//--- END HEADER
-
-	//--- START BODY
-	var form = editorUi.createDiv('form-horizontal form-row-seperated');
-	var group = editorUi.createDiv('form-group last');
-
-	var label = document.createElement('label');
-	label.className = 'col-sm-4 control-label';
-	mxUtils.write(label, mxResources.get('filename'));
-
-	var input = document.createElement('input');
-	input.setAttribute('value', editorUi.editor.getOrCreateFilename());
-	input.className = 'form-control';
-
-	var div = editorUi.createDiv('col-sm-8');
-	div.appendChild(input);
-
-	group.appendChild(label);
-	group.appendChild(div);
-	form.appendChild(group);
-
-	body.appendChild(form);
-	//--- END BODY
-
-	//--- START FOOTER
-	var save = mxUtils.button(mxResources.get('export'), mxUtils.bind(this,
-		function(data) {
-			editorUi.save(false);
-
-			var xml = encodeURIComponent(mxUtils.getXml(editorUi.editor.getGraphXml()));
-			new mxXmlRequest(SAVE_URL + editorUi.editor.data.id + '/download',
-				'filename=' + input.value, 'GET').simulate(document, "_blank");
-			editorUi.hideDialog();
-		}));
-	save.className = 'btn blue';
-
-	var close = mxUtils.button(mxResources.get('cancel'), function() {
-		editorUi.hideDialog();
-	});
-	close.className = 'btn default';
-
-	footer.appendChild(save);
-	footer.appendChild(close);
-	//--- END FOOTER
-
-	//--- START CONTENT
-	content.appendChild(header);
-	content.appendChild(body);
-	content.appendChild(footer);
-	//--- END CONTENT
-
-	this.container = content;
-};
-
-/**
- * Giuseppe Careri
- * Constructs a new general dialog.
- */
-
-function GeneralDialog(editorUi, cell) {
-	var graph = editorUi.editor.graph;
-
-	var content = editorUi.createDiv('modal-content');
-	var header = editorUi.createDiv('modal-header');
-	var body = editorUi.createDiv('modal-body form modal-body-scroll');
-	var footer = editorUi.createDiv('modal-footer');
-	//--- START HEADER
-	var title = editorUi.createHeader('h4');
-	mxUtils.write(title, mxResources.get('edit') + ' ' + mxResources.get(cell.value
-		.nodeName));
-
-	var x = mxUtils.button('', function() {
-		editorUi.hideDialog();
-	});
-	x.className = 'close';
-
-	header.appendChild(x);
-	header.appendChild(title);
-	//--- END HEADER
-
-	//--- START BODY
-	var inputGroup = editorUi.createDiv('form-horizontal form-row-seperated');
-	inputGroup.setAttribute('id', 'inputGroup');
-	var length = cell.value.attributes.length;
-	var form = editorUi.createDiv('form-horizontal form-row-seperated');
-
-	for (var i = 0; i < length; i++) {
-		var name = cell.value.attributes[i].name;
-		var id = '_' + name;
-		var value = cell.value.attributes[i].value;
-		console.log(name);
-		var group = editorUi.createDiv((i == length - 1) ? 'form-group last' :
-			'form-group');
-
-		var label = document.createElement('label');
-		label.className = 'col-sm-4 control-label';
-		mxUtils.write(label, mxResources.get(name));
-		group.appendChild(label);
-
-		var input;
-
-		switch (name) {
-			case 'id':
-				input = document.createElement('input');
-				value = cell.id;
-				input.setAttribute('value', value);
-				input.setAttribute('disabled', true)
-				input.className = 'form-control';
-				break;
-			case 'state':
-				input = document.createElement('input');
-				input.setAttribute('type', 'button')
-				input.onclick = function() {
-					if (this.value == 'ON') {
-						this.setAttribute('value', 'OFF');
-						this.className = 'btn btn-danger btn-md';
-					} else {
-						this.className = 'btn btn-success btn-md';
-						this.setAttribute('value', 'ON');
-					}
-
-				};
-				input.setAttribute('value', value);
-				input.className = (value == 'ON' ? 'btn btn-success btn-md' : 'btn btn-danger btn-md');
-
-				break;
-			case 'text':
-				input = document.createElement('textarea');
-				input.innerHTML = value;
-				input.className = 'form-control';
-				break;
-			case 'Body':
-				input = document.createElement('textarea');
-				input.innerHTML = value;
-				input.className = 'form-control';
-				break;
-			case 'question':
-				input = document.createElement('textarea');
-				input.innerHTML = value;
-				input.className = 'form-control';
-
-				break;
-			case 'other':
-				input = document.createElement('input');
-				input.setAttribute('value', value);
-				input.setAttribute('placeholder', 'Insert label for "Other" answer option');
-				input.className = 'form-control';
-				break;
-				// case 'addtext':
-				// 	var input = document.createElement('input');
-				// 	input.setAttribute('type', 'checkbox');
-				// 	console.log('value', value);
-				// 	if (value == 'true') {
-				// 		input.setAttribute('checked', true);
-				//
-				// 	} else {
-				// 		input.removeAttribute("checked");
-				//
-				// 	}
-				// 	// input.value = input.checked;
-				//
-				// 	input.onclick = function() {
-				// 		this.value = this.checked;
-				//
-				// 		console.log(input);
-				// 		if (this.checked) {
-				// 			console.log(this.checked);
-				// 			var rowdiv = editorUi.createDiv('form-group');
-				// 			rowdiv.setAttribute('id', 'rowdiv');
-				// 			var col1 = editorUi.createDiv('col-md-4');
-				// 			var col2 = editorUi.createDiv('col-md-8');
-				// 			var label = document.createElement('label');
-				// 			// input.setAttribute('placeholder', 'Insert label');
-				// 			label.className = 'pull-right control-label';
-				// 			mxUtils.write(label, 'Texarea Label');
-				// 			col1.appendChild(label);
-				// 			var input = document.createElement('input');
-				// 			// input.setAttribute('placeholder', 'Insert label');
-				// 			// input.value = inputValue;
-				// 			input.className = 'form-control';
-				// 			col2.appendChild(input);
-				// 			rowdiv.appendChild(col1);
-				// 			rowdiv.appendChild(col2);
-				// 			inputGroup.appendChild(rowdiv);
-				// 			body.appendChild(inputGroup);
-				// 		} else {
-				// 			console.log(this.checked);
-				// 			document.getElementById('inputGroup').removeChild(document.getElementById('rowdiv'));
-				// 		}
-				// 	};
-				//
-				//
-				// 	input.className = 'btn green';
-				// 	break;
-			case 'account_id':
-				input = createDropdownFromApi('/api/sms/accounts', value, 'name', 'id',
-					editorUi);
-				break;
-			case 'sms_text':
-				input = document.createElement('textarea');
-				input.innerHTML = value;
-				input.className = 'form-control';
-				input.setAttribute('maxlength', "160");
-
-				break;
-			case 'add':
-				var input = mxUtils.button('+', function() {
-					var rowdiv = createDynamicInput(null, null, editorUi);
-					inputGroup.appendChild(rowdiv);
-					body.appendChild(inputGroup);
-				})
-
-				input.className = 'btn green';
-				break;
-			default:
-				input = document.createElement('input');
-				input.setAttribute('value', value);
-				input.className = 'form-control';
-				break;
-		}
-
-		input.setAttribute('id', id)
-		var div = editorUi.createDiv('col-sm-8');
-		div.appendChild(input);
-		// Help
-		if (mxResources.get('help_' + name)) {
-			var help = editorUi.createDiv('p');
-			help.className = 'help-block';
-			mxUtils.write(help, mxResources.get('help_' + name));
-			div.appendChild(help);
-		}
-
-		group.appendChild(div);
-		form.appendChild(group);
-	}
-	body.appendChild(form);
-	// console.log(cell);
-	if (cell.value.nodeName == 'input') {
-
-		if (cell.children) {
-			for (var j = 0; j < cell.children.length; j++) {
-				var selectValue = '';
-				var inputValue = '';
-				_.forEach(cell.children[j].value.attributes, function(element) {
-					// console.log(element);
-					if (element.name == 'type') {
-						selectValue = element.value;
-
-					} else if (element.name == 'label') {
-						inputValue = element.value;
-
-					}
-				})
-				var rowdiv = createDynamicInput(selectValue, inputValue, editorUi);
-				inputGroup.appendChild(rowdiv);
-
-			}
-		}
-
-	}
-	body.appendChild(inputGroup);
-
-	//--- END BODY
-
-	//--- START FOOTER
-	var save = mxUtils.button(mxResources.get('save'), mxUtils.bind(this,
-		function(data) {
-			for (var i = 0; i < cell.value.attributes.length; i++) {
-				var id = '_' + cell.value.attributes[i].name;
-				var name = cell.value.attributes[i].name;
-				console.log(name);
-
-				cell.setAttribute(name, document.getElementById(id).value);
-				console.log(document.getElementById(id).value);
-
-
-			};
-
-			if (cell.value.nodeName == 'input') {
-				if (graph.model.getChildCount(cell)) {
-					cell.children = [];
-				}
-				if (document.getElementById('inputGroup')) {
-					var inputGroup = document.getElementById('inputGroup').children;
-					for (var j = 0; j < inputGroup.length; j++) {
-
-						var divSelect = inputGroup[j].children[1];
-						var divInput = inputGroup[j].children[0];
-						var doc = mxUtils.createXmlDocument();
-						var node = doc.createElement('inputGroup');
-						node.setAttribute('type', inputGroup[j].getElementsByTagName('select')[0].value);
-						node.setAttribute('label', inputGroup[j].getElementsByTagName('input')[0].value);
-						var cells = new mxCell(node);
-						graph.model.add(cell, cells);
-					}
-				}
-			}
-
-			graph.refresh(cell);
-			editorUi.hideDialog();
-		}));
-	save.className = 'btn blue';
-
-	var close = mxUtils.button(mxResources.get('cancel'), function() {
-		editorUi.hideDialog();
-	});
-	close.className = 'btn default';
-
-	footer.appendChild(save);
-	footer.appendChild(close);
-	//--- END FOOTER
-
-	//--- START CONTENT
-	content.appendChild(header);
-	content.appendChild(body);
-	content.appendChild(footer);
-	//--- END CONTENT
-
-	this.container = content;
-};
-
-
-
-function createDynamicInput(selectValue, inputValue, editorUi) {
-
-	var rowdiv = editorUi.createDiv('form-group');
-	var col1 = editorUi.createDiv('col-md-5');
-	var col2 = editorUi.createDiv('col-md-5');
-	var col3 = editorUi.createDiv('col-md-2');
-
-	var input = document.createElement('input');
-	input.setAttribute('placeholder', 'Insert label');
-	input.value = inputValue;
-	input.className = 'form-control';
-	col1.appendChild(input);
-
-	var select = document.createElement('select');
-	var option = document.createElement('option');
-	option.text = '-- None --';
-	option.value = '';
-	select.appendChild(option);
-
-	var selectValues = ['text', 'number', 'textarea', 'checkbox'];
-	selectValues.forEach(function(elem) {
-		option = document.createElement('option');
-		option.text = elem;
-		option.value = elem;
-		option.selected = (elem == selectValue);
-		select.appendChild(option);
-	})
-	select.className = 'form-control';
-	col2.appendChild(select);
-	var button = mxUtils.button('x', function() {
-		var buttonParent = button.parentElement;
-		var divParent = buttonParent.parentElement;
-		document.getElementById('inputGroup').removeChild(divParent);
-	})
-
-	button.className = 'btn red';
-	col3.appendChild(button);
-	rowdiv.appendChild(col1);
-	rowdiv.appendChild(col2);
-	rowdiv.appendChild(col3);
-	return rowdiv;
-
-
-}
\ No newline at end of file
diff --git a/public/assets/plugins/jscripty/js/Editor.js b/public/assets/plugins/jscripty/js/Editor.js
index 9858989..1aa7e63 100644
--- a/public/assets/plugins/jscripty/js/Editor.js
+++ b/public/assets/plugins/jscripty/js/Editor.js
@@ -1,888 +1 @@
-/**
- * $Id: Editor.js,v 1.14 2013/03/06 17:57:10 boris Exp $
- * Copyright (c) 2006-2012, JGraph Ltd
- */
-// Specifies if local storage should be used (eg. on the iPad which has no filesystem)
-var useLocalStorage = (mxClient.IS_TOUCH || urlParams['storage'] == 'local') && typeof(localStorage) != 'undefined';
-var fileSupport = window.File != null && window.FileReader != null && window.FileList != null;
-
-// Specifies if connector should be shown on selected cells
-var touchStyle = mxClient.IS_TOUCH || urlParams['touch'] == '1';
-
-// Counts open editor tabs (must be global for cross-window access)
-var counter = 0;
-
-// Cross-domain window access is not allowed in FF, so if we
-// were opened from another domain then this will fail.
-try {
-	var op = window;
-
-	while (op.opener != null && !isNaN(op.opener.counter)) {
-		op = op.opener;
-	}
-
-	// Increments the counter in the first opener in the chain
-	if (op != null) {
-		op.counter++;
-		counter = op.counter;
-	}
-} catch (e) {
-	// ignore
-}
-
-/**
- * Editor constructor executed on page load.
- */
-Editor = function() {
-	mxEventSource.call(this);
-	this.init();
-	this.initStencilRegistry();
-	this.graph = new Graph();
-	this.outline = new mxOutline(this.graph);
-	this.outline.updateOnPan = true;
-	this.undoManager = this.createUndoManager();
-	this.status = '';
-
-	// Contains the name which was used for the last save. Default value is null.
-	this.filename = null;
-
-	this.getOrCreateFilename = function() {
-		return this.filename || mxResources.get('drawing', [counter]) + '.xml';
-	};
-
-	this.getFilename = function() {
-		return this.filename;
-	};
-
-	// Sets the status and fires a statusChanged event
-	this.setStatus = function(value) {
-		this.status = value;
-		this.fireEvent(new mxEventObject('statusChanged'));
-	};
-
-	// Returns the current status
-	this.getStatus = function() {
-		return this.status;
-	};
-
-	// Contains the current modified state of the diagram. This is false for
-	// new diagrams and after the diagram was saved.
-	this.modified = false;
-
-	// Updates modified state if graph changes
-	this.graphChangeListener = function() {
-		this.modified = true;
-	};
-	this.graph.getModel().addListener(mxEvent.CHANGE, mxUtils.bind(this, function() {
-		this.graphChangeListener.apply(this, arguments);
-	}));
-
-	// Installs dialog if browser window is closed without saving
-	// This must be disabled during save and image export
-	window.onbeforeunload = mxUtils.bind(this, function() {
-		if (this.modified) {
-			return mxResources.get('allChangesLost');
-		}
-	});
-
-	// Sets persistent graph state defaults
-	this.graph.resetViewOnRootChange = false;
-	this.graph.scrollbars = true;
-	this.graph.background = null;
-};
-
-// Editor inherits from mxEventSource
-mxUtils.extend(Editor, mxEventSource);
-
-/**
- * Specifies the image URL to be used for the grid.
- */
-Editor.prototype.gridImage = IMAGE_PATH + '/grid.gif';
-
-/**
- * Specifies the image URL to be used for the transparent background.
- */
-Editor.prototype.transparentImage = IMAGE_PATH + '/transparent.gif';
-
-/**
- * Sets the XML node for the current diagram.
- */
-Editor.prototype.setGraphXml = function(node) {
-	var dec = new mxCodec(node.ownerDocument);
-
-	if (node.nodeName == 'mxGraphModel') {
-		this.graph.view.scale = 1;
-		this.graph.gridEnabled = node.getAttribute('grid') != '0';
-		this.graph.graphHandler.guidesEnabled = node.getAttribute('guides') != '0';
-		this.graph.setTooltips(node.getAttribute('tooltips') != '0');
-		this.graph.setConnectable(node.getAttribute('connect') != '0');
-		this.graph.foldingEnabled = node.getAttribute('fold') != '0';
-		this.graph.scrollbars = node.getAttribute('scrollbars') != '0';
-
-		if (!this.graph.scrollbars) {
-			this.graph.container.scrollLeft = 0;
-			this.graph.container.scrollTop = 0;
-			this.graph.view.translate.x = Number(node.getAttribute('dx') || 0);
-			this.graph.view.translate.y = Number(node.getAttribute('dy') || 0);
-		}
-
-		this.graph.pageVisible = node.getAttribute('page') == '1';
-		this.graph.pageBreaksVisible = this.graph.pageVisible;
-		this.graph.preferPageSize = this.graph.pageBreaksVisible;
-
-		// Loads the persistent state settings
-		var ps = node.getAttribute('pageScale');
-
-		if (ps != null) {
-			this.graph.pageScale = ps;
-		} else {
-			this.graph.pageScale = 1.5;
-		}
-
-		var pw = node.getAttribute('pageWidth');
-		var ph = node.getAttribute('pageHeight');
-
-		if (pw != null && ph != null) {
-			this.graph.pageFormat = new mxRectangle(0, 0, parseFloat(pw), parseFloat(ph));
-			this.outline.outline.pageFormat = this.graph.pageFormat;
-		}
-
-		// Loads the persistent state settings
-		var bg = node.getAttribute('background');
-
-		if (bg != null && bg.length > 0) {
-			this.graph.background = bg;
-		}
-
-		dec.decode(node, this.graph.getModel());
-		this.updateGraphComponents();
-	}
-};
-
-/**
- * Returns the XML node that represents the current diagram.
- */
-Editor.prototype.getGraphXml = function() {
-	var enc = new mxCodec(mxUtils.createXmlDocument());
-	var node = enc.encode(this.graph.getModel());
-
-	if (this.graph.view.translate.x != 0 || this.graph.view.translate.y != 0) {
-		node.setAttribute('dx', Math.round(this.graph.view.translate.x * 100) / 100);
-		node.setAttribute('dy', Math.round(this.graph.view.translate.y * 100) / 100);
-	}
-
-	node.setAttribute('grid', (this.graph.isGridEnabled()) ? '1' : '0');
-	node.setAttribute('guides', (this.graph.graphHandler.guidesEnabled) ? '1' : '0');
-	node.setAttribute('guides', (this.graph.graphHandler.guidesEnabled) ? '1' : '0');
-	node.setAttribute('tooltips', (this.graph.tooltipHandler.isEnabled()) ? '1' : '0');
-	node.setAttribute('connect', (this.graph.connectionHandler.isEnabled()) ? '1' : '0');
-	node.setAttribute('fold', (this.graph.foldingEnabled) ? '1' : '0');
-	node.setAttribute('page', (this.graph.pageVisible) ? '1' : '0');
-	node.setAttribute('pageScale', this.graph.pageScale);
-	node.setAttribute('pageWidth', this.graph.pageFormat.width);
-	node.setAttribute('pageHeight', this.graph.pageFormat.height);
-
-	if (!this.graph.scrollbars) {
-		node.setAttribute('scrollbars', '0');
-	}
-
-	if (this.graph.background != null) {
-		node.setAttribute('background', this.graph.background);
-	}
-
-	return node;
-};
-
-/**
- * Keeps the graph container in sync with the persistent graph state
- */
-Editor.prototype.updateGraphComponents = function() {
-	var graph = this.graph;
-	var outline = this.outline;
-
-	if (graph.container != null && outline.outline.container != null) {
-		if (graph.background != null) {
-			if (graph.background == 'none') {
-				graph.container.style.backgroundColor = 'transparent';
-			} else {
-				if (graph.view.backgroundPageShape != null) {
-					graph.view.backgroundPageShape.fill = graph.background;
-					graph.view.backgroundPageShape.reconfigure();
-				}
-
-				graph.container.style.backgroundColor = graph.background;
-			}
-		} else {
-			graph.container.style.backgroundColor = '';
-		}
-
-		if (graph.pageVisible) {
-			graph.container.style.backgroundColor = '#ebebeb';
-			graph.container.style.borderStyle = 'solid';
-			graph.container.style.borderColor = '#e5e5e5';
-			graph.container.style.borderTopWidth = '1px';
-			graph.container.style.borderLeftWidth = '1px';
-			graph.container.style.borderRightWidth = '0px';
-			graph.container.style.borderBottomWidth = '0px';
-		} else {
-			graph.container.style.border = '';
-		}
-
-		outline.outline.container.style.backgroundColor = graph.container.style.backgroundColor;
-
-		if (outline.outline.pageVisible != graph.pageVisible ||
-			outline.outline.pageScale != graph.pageScale) {
-			outline.outline.pageScale = graph.pageScale;
-			outline.outline.pageVisible = graph.pageVisible;
-			outline.outline.view.validate();
-		}
-
-		if (graph.scrollbars && graph.container.style.overflow == 'hidden' && !touchStyle) {
-			graph.container.style.overflow = 'auto';
-		} else if (!graph.scrollbars || touchStyle) {
-			graph.container.style.overflow = 'hidden';
-		}
-
-		// Transparent.gif is a workaround for focus repaint problems in IE
-		var noBackground = (mxClient.IS_IE && document.documentMode >= 9) ? 'url(' + this.transparentImage + ')' : 'none';
-		graph.container.style.backgroundImage = (!graph.pageVisible && graph.isGridEnabled()) ? 'url(' + this.gridImage + ')' : noBackground;
-
-		if (graph.view.backgroundPageShape != null) {
-			graph.view.backgroundPageShape.node.style.backgroundImage = (this.graph.isGridEnabled()) ? 'url(' + this.gridImage + ')' : 'none';
-		}
-	}
-};
-
-/**
- * Initializes the environment.
- */
-Editor.prototype.init = function() {
-	// Adds stylesheet for IE6
-	if (mxClient.IS_IE6) {
-		mxClient.link('stylesheet', CSS_PATH + '/grapheditor-ie6.css');
-	}
-
-	// Adds required resources (disables loading of fallback properties, this can only
-	// be used if we know that all keys are defined in the language specific file)
-	mxResources.loadDefaultBundle = false;
-	mxResources.add(RESOURCE_BASE);
-
-	// Makes the connection hotspot smaller
-	mxConstants.DEFAULT_HOTSPOT = 0.3;
-
-	var mxConnectionHandlerCreateMarker = mxConnectionHandler.prototype.createMarker;
-	mxConnectionHandler.prototype.createMarker = function() {
-		var marker = mxConnectionHandlerCreateMarker.apply(this, arguments);
-
-		// Overrides to ignore hotspot only for target terminal
-		marker.intersects = mxUtils.bind(this, function(state, evt) {
-			if (this.isConnecting()) {
-				return true;
-			}
-
-			return mxCellMarker.prototype.intersects.apply(marker, arguments);
-		});
-
-		return marker;
-	};
-
-	// Makes the shadow brighter
-	mxConstants.SHADOWCOLOR = '#d0d0d0';
-
-	// Changes some default colors
-	mxConstants.HANDLE_FILLCOLOR = '#99ccff';
-	mxConstants.HANDLE_STROKECOLOR = '#0088cf';
-	mxConstants.VERTEX_SELECTION_COLOR = '#00a8ff';
-	mxConstants.OUTLINE_COLOR = '#00a8ff';
-	mxConstants.OUTLINE_HANDLE_FILLCOLOR = '#99ccff';
-	mxConstants.OUTLINE_HANDLE_STROKECOLOR = '#00a8ff';
-	mxConstants.CONNECT_HANDLE_FILLCOLOR = '#cee7ff';
-	mxConstants.EDGE_SELECTION_COLOR = '#00a8ff';
-	mxConstants.DEFAULT_VALID_COLOR = '#00a8ff';
-	mxConstants.LABEL_HANDLE_FILLCOLOR = '#cee7ff';
-	mxConstants.GUIDE_COLOR = '#0088cf';
-
-	mxGraph.prototype.pageBreakColor = '#c0c0c0';
-	mxGraph.prototype.pageScale = 1;
-
-	// Increases default rubberband opacity (default is 20)
-	mxRubberband.prototype.defaultOpacity = 30;
-
-	// Changes border color of background page shape
-	mxGraphView.prototype.createBackgroundPageShape = function(bounds) {
-		return new mxRectangleShape(bounds, this.graph.background || 'white', '#cacaca');
-	};
-
-	// Fits the number of background pages to the graph
-	mxGraphView.prototype.getBackgroundPageBounds = function() {
-		var gb = this.getGraphBounds();
-
-		// Computes unscaled, untranslated graph bounds
-		var x = (gb.width > 0) ? gb.x / this.scale - this.translate.x : 0;
-		var y = (gb.height > 0) ? gb.y / this.scale - this.translate.y : 0;
-		var w = gb.width / this.scale;
-		var h = gb.height / this.scale;
-
-		var fmt = this.graph.pageFormat;
-		var ps = this.graph.pageScale;
-
-		var pw = fmt.width * ps;
-		var ph = fmt.height * ps;
-
-		var x0 = Math.floor(Math.min(0, x) / pw);
-		var y0 = Math.floor(Math.min(0, y) / ph);
-		var xe = Math.ceil(Math.max(1, x + w) / pw);
-		var ye = Math.ceil(Math.max(1, y + h) / ph);
-
-		var rows = xe - x0;
-		var cols = ye - y0;
-
-		var bounds = new mxRectangle(this.scale * (this.translate.x + x0 * pw), this.scale *
-			(this.translate.y + y0 * ph), this.scale * rows * pw, this.scale * cols * ph);
-
-		return bounds;
-	};
-
-	// Add panning for background page in VML
-	var graphPanGraph = mxGraph.prototype.panGraph;
-	mxGraph.prototype.panGraph = function(dx, dy) {
-		graphPanGraph.apply(this, arguments);
-
-		if ((this.dialect != mxConstants.DIALECT_SVG && this.view.backgroundPageShape != null) &&
-			(!this.useScrollbarsForPanning || !mxUtils.hasScrollbars(this.container))) {
-			this.view.backgroundPageShape.node.style.marginLeft = dx + 'px';
-			this.view.backgroundPageShape.node.style.marginTop = dy + 'px';
-		}
-	};
-
-	var editor = this;
-
-	// Uses HTML for background pages (to support grid background image)
-	mxGraphView.prototype.validateBackground = function() {
-		var bg = this.graph.getBackgroundImage();
-
-		if (bg != null) {
-			if (this.backgroundImage == null || this.backgroundImage.image != bg.src) {
-				if (this.backgroundImage != null) {
-					this.backgroundImage.destroy();
-				}
-
-				var bounds = new mxRectangle(0, 0, 1, 1);
-
-				this.backgroundImage = new mxImageShape(bounds, bg.src);
-				this.backgroundImage.dialect = this.graph.dialect;
-				this.backgroundImage.init(this.backgroundPane);
-				this.backgroundImage.redraw();
-			}
-
-			this.redrawBackgroundImage(this.backgroundImage, bg);
-		} else if (this.backgroundImage != null) {
-			this.backgroundImage.destroy();
-			this.backgroundImage = null;
-		}
-
-		if (this.graph.pageVisible) {
-			var bounds = this.getBackgroundPageBounds();
-
-			if (this.backgroundPageShape == null) {
-				this.backgroundPageShape = this.createBackgroundPageShape(bounds);
-				this.backgroundPageShape.scale = 1;
-				this.backgroundPageShape.isShadow = true;
-				this.backgroundPageShape.dialect = mxConstants.DIALECT_STRICTHTML;
-				this.backgroundPageShape.init(this.graph.container);
-				// Required for the browser to render the background page in correct order
-				this.graph.container.firstChild.style.position = 'absolute';
-				this.graph.container.insertBefore(this.backgroundPageShape.node, this.graph.container.firstChild);
-				this.backgroundPageShape.redraw();
-
-				this.backgroundPageShape.node.className = 'geBackgroundPage';
-				this.backgroundPageShape.node.style.backgroundPosition = '-1px -1px';
-
-				// Adds listener for double click handling on background
-				mxEvent.addListener(this.backgroundPageShape.node, 'dblclick',
-					mxUtils.bind(this, function(evt) {
-						this.graph.dblClick(evt);
-					})
-				);
-
-				// Adds basic listeners for graph event dispatching outside of the
-				// container and finishing the handling of a single gesture
-				mxEvent.addGestureListeners(this.backgroundPageShape.node,
-					mxUtils.bind(this, function(evt) {
-						this.graph.fireMouseEvent(mxEvent.MOUSE_DOWN, new mxMouseEvent(evt));
-					}),
-					mxUtils.bind(this, function(evt) {
-						// Hides the tooltip if mouse is outside container
-						if (this.graph.tooltipHandler != null &&
-							this.graph.tooltipHandler.isHideOnHover()) {
-							this.graph.tooltipHandler.hide();
-						}
-
-						if (this.graph.isMouseDown &&
-							!mxEvent.isConsumed(evt)) {
-							this.graph.fireMouseEvent(mxEvent.MOUSE_MOVE,
-								new mxMouseEvent(evt));
-						}
-					}),
-					mxUtils.bind(this, function(evt) {
-						this.graph.fireMouseEvent(mxEvent.MOUSE_UP,
-							new mxMouseEvent(evt));
-					}));
-			} else {
-				this.backgroundPageShape.scale = 1;
-				this.backgroundPageShape.bounds = bounds;
-				this.backgroundPageShape.redraw();
-			}
-
-			this.backgroundPageShape.node.style.backgroundImage = (this.graph.isGridEnabled()) ?
-				'url(' + editor.gridImage + ')' : 'none';
-		} else if (this.backgroundPageShape != null) {
-			this.backgroundPageShape.destroy();
-			this.backgroundPageShape = null;
-		}
-	};
-
-	// Draws page breaks only within the page
-	mxGraph.prototype.updatePageBreaks = function(visible, width, height) {
-		var scale = this.view.scale;
-		var tr = this.view.translate;
-		var fmt = this.pageFormat;
-		var ps = scale * this.pageScale;
-
-		var bounds2 = this.view.getBackgroundPageBounds();
-
-		width = bounds2.width;
-		height = bounds2.height;
-		var bounds = new mxRectangle(scale * tr.x, scale * tr.y,
-			fmt.width * ps, fmt.height * ps);
-
-		// Does not show page breaks if the scale is too small
-		visible = visible && Math.min(bounds.width, bounds.height) > this.minPageBreakDist;
-
-		var horizontalCount = (visible) ? Math.ceil(width / bounds.width) - 1 : 0;
-		var verticalCount = (visible) ? Math.ceil(height / bounds.height) - 1 : 0;
-		var right = bounds2.x + width;
-		var bottom = bounds2.y + height;
-
-		if (this.horizontalPageBreaks == null && horizontalCount > 0) {
-			this.horizontalPageBreaks = [];
-		}
-
-		if (this.horizontalPageBreaks != null) {
-			for (var i = 0; i <= horizontalCount; i++) {
-				var pts = [new mxPoint(bounds2.x + (i + 1) * bounds.width, bounds2.y),
-					new mxPoint(bounds2.x + (i + 1) * bounds.width, bottom)
-				];
-
-				if (this.horizontalPageBreaks[i] != null) {
-					this.horizontalPageBreaks[i].scale = 1;
-					this.horizontalPageBreaks[i].points = pts;
-					this.horizontalPageBreaks[i].redraw();
-				} else {
-					var pageBreak = new mxPolyline(pts, this.pageBreakColor, this.scale);
-					pageBreak.dialect = this.dialect;
-					pageBreak.isDashed = this.pageBreakDashed;
-					pageBreak.addPipe = false;
-					pageBreak.scale = scale;
-					pageBreak.init(this.view.backgroundPane);
-					pageBreak.redraw();
-
-					this.horizontalPageBreaks[i] = pageBreak;
-				}
-			}
-
-			for (var i = horizontalCount; i < this.horizontalPageBreaks.length; i++) {
-				this.horizontalPageBreaks[i].destroy();
-			}
-
-			this.horizontalPageBreaks.splice(horizontalCount, this.horizontalPageBreaks.length - horizontalCount);
-		}
-
-		if (this.verticalPageBreaks == null && verticalCount > 0) {
-			this.verticalPageBreaks = [];
-		}
-
-		if (this.verticalPageBreaks != null) {
-			for (var i = 0; i <= verticalCount; i++) {
-				var pts = [new mxPoint(bounds2.x, bounds2.y + (i + 1) * bounds.height),
-					new mxPoint(right, bounds2.y + (i + 1) * bounds.height)
-				];
-
-				if (this.verticalPageBreaks[i] != null) {
-					this.verticalPageBreaks[i].scale = 1; //scale;
-					this.verticalPageBreaks[i].points = pts;
-					this.verticalPageBreaks[i].redraw();
-				} else {
-					var pageBreak = new mxPolyline(pts, this.pageBreakColor, scale);
-					pageBreak.dialect = this.dialect;
-					pageBreak.isDashed = this.pageBreakDashed;
-					pageBreak.addPipe = false;
-					pageBreak.scale = scale;
-					pageBreak.init(this.view.backgroundPane);
-					pageBreak.redraw();
-
-					this.verticalPageBreaks[i] = pageBreak;
-				}
-			}
-
-			for (var i = verticalCount; i < this.verticalPageBreaks.length; i++) {
-				this.verticalPageBreaks[i].destroy();
-			}
-
-			this.verticalPageBreaks.splice(verticalCount, this.verticalPageBreaks.length - verticalCount);
-		}
-	};
-
-	// Enables snapping to off-grid terminals for edge waypoints
-	mxEdgeHandler.prototype.snapToTerminals = true;
-
-	// Enables guides
-	mxGraphHandler.prototype.guidesEnabled = true;
-
-	// Disables removing relative children from parents
-	var mxGraphHandlerShouldRemoveCellsFromParent = mxGraphHandler.prototype.shouldRemoveCellsFromParent;
-	mxGraphHandler.prototype.shouldRemoveCellsFromParent = function(parent, cells, evt) {
-		for (var i = 0; i < cells.length; i++) {
-			if (this.graph.getModel().isVertex(cells[i])) {
-				var geo = this.graph.getCellGeometry(cells[i]);
-
-				if (geo != null && geo.relative) {
-					return false;
-				}
-			}
-		}
-
-		return mxGraphHandlerShouldRemoveCellsFromParent.apply(this, arguments);
-	};
-
-	// Alt-move disables guides
-	mxGuide.prototype.isEnabledForEvent = function(evt) {
-		return !mxEvent.isAltDown(evt);
-	};
-
-	// Consumes click events for disabled menu items
-	mxPopupMenuAddItem = mxPopupMenu.prototype.addItem;
-	mxPopupMenu.prototype.addItem = function(title, image, funct, parent, iconCls, enabled) {
-		var result = mxPopupMenuAddItem.apply(this, arguments);
-
-		if (enabled != null && !enabled) {
-			mxEvent.addListener(result, 'mousedown', function(evt) {
-				mxEvent.consume(evt);
-			});
-		}
-
-		return result;
-	};
-
-	// Selects descendants before children selection mode
-	var graphHandlerGetInitialCellForEvent = mxGraphHandler.prototype.getInitialCellForEvent;
-	mxGraphHandler.prototype.getInitialCellForEvent = function(me) {
-		var model = this.graph.getModel();
-		var psel = model.getParent(this.graph.getSelectionCell());
-		var cell = graphHandlerGetInitialCellForEvent.apply(this, arguments);
-		var parent = model.getParent(cell);
-
-		if (psel == null || (psel != cell && psel != parent)) {
-			while (!this.graph.isCellSelected(cell) && !this.graph.isCellSelected(parent) &&
-				model.isVertex(parent) && !this.graph.isValidRoot(parent)) {
-				cell = parent;
-				parent = this.graph.getModel().getParent(cell);
-			}
-		}
-
-		return cell;
-	};
-
-	// Selection is delayed to mouseup if child selected
-	var graphHandlerIsDelayedSelection = mxGraphHandler.prototype.isDelayedSelection;
-	mxGraphHandler.prototype.isDelayedSelection = function(cell) {
-		var result = graphHandlerIsDelayedSelection.apply(this, arguments);
-		var model = this.graph.getModel();
-		var psel = model.getParent(this.graph.getSelectionCell());
-		var parent = model.getParent(cell);
-
-		if (psel == null || (psel != cell && psel != parent)) {
-			if (!this.graph.isCellSelected(cell) && model.isVertex(parent) && !this.graph.isValidRoot(parent)) {
-				result = true;
-			}
-		}
-
-		return result;
-	};
-
-	// Delayed selection of parent group
-	mxGraphHandler.prototype.selectDelayed = function(me) {
-		var cell = me.getCell();
-
-		if (cell == null) {
-			cell = this.cell;
-		}
-
-		var model = this.graph.getModel();
-		var parent = model.getParent(cell);
-
-		while (this.graph.isCellSelected(cell) && model.isVertex(parent) && !this.graph.isValidRoot(parent)) {
-			cell = parent;
-			parent = model.getParent(cell);
-		}
-
-		this.graph.selectCellForEvent(cell, me.getEvent());
-	};
-
-	// Returns last selected ancestor
-	mxPanningHandler.prototype.getCellForPopupEvent = function(me) {
-		var cell = me.getCell();
-		var model = this.graph.getModel();
-		var parent = model.getParent(cell);
-
-		while (model.isVertex(parent) && !this.graph.isValidRoot(parent)) {
-			if (this.graph.isCellSelected(parent)) {
-				cell = parent;
-			}
-
-			parent = model.getParent(parent);
-		}
-
-		return cell;
-	};
-};
-
-/**
- * Creates and returns a new undo manager.
- */
-Editor.prototype.createUndoManager = function() {
-	var graph = this.graph;
-	var undoMgr = new mxUndoManager();
-
-	// Installs the command history
-	var listener = function(sender, evt) {
-		undoMgr.undoableEditHappened(evt.getProperty('edit'));
-	};
-
-	graph.getModel().addListener(mxEvent.UNDO, listener);
-	graph.getView().addListener(mxEvent.UNDO, listener);
-
-	// Keeps the selection in sync with the history
-	var undoHandler = function(sender, evt) {
-		var cand = graph.getSelectionCellsForChanges(evt.getProperty('edit').changes);
-		var cells = [];
-
-		for (var i = 1; i < cand.length; i++) {
-			if (graph.view.getState(cand[i]) != null) {
-				cells.push(cand[i]);
-			}
-		}
-
-		graph.setSelectionCells(cells);
-	};
-
-	undoMgr.addListener(mxEvent.UNDO, undoHandler);
-	undoMgr.addListener(mxEvent.REDO, undoHandler);
-
-	return undoMgr;
-};
-
-/**
- * Adds basic stencil set (no namespace).
- */
-Editor.prototype.initStencilRegistry = function() {
-	// Loads default stencils
-	mxStencilRegistry.loadStencilSet(STENCIL_PATH + '/general.xml');
-};
-
-/**
- * Overrides stencil registry for dynamic loading of stencils.
- */
-(function() {
-	/**
-	 * Maps from library names to an array of Javascript filenames,
-	 * which are synchronously loaded. Currently only stencil files
-	 * (.xml) and JS files (.js) are supported.
-	 * IMPORTANT: For embedded diagrams to work entries must also
-	 * be added in EmbedServlet.java.
-	 */
-	mxStencilRegistry.libraries = {};
-
-	/**
-	 * Stores all package names that have been dynamically loaded.
-	 * Each package is only loaded once.
-	 */
-	mxStencilRegistry.packages = [];
-
-	// Extends the default stencil registry to add dynamic loading
-	mxStencilRegistry.getStencil = function(name) {
-		var result = mxStencilRegistry.stencils[name];
-
-		if (result == null) {
-			var basename = mxStencilRegistry.getBasenameForStencil(name);
-
-			// Loads stencil files and tries again
-			if (basename != null) {
-				var libs = mxStencilRegistry.libraries[basename];
-
-				if (libs != null) {
-					if (mxStencilRegistry.packages[basename] == null) {
-						mxStencilRegistry.packages[basename] = 1;
-
-						for (var i = 0; i < libs.length; i++) {
-							var fname = libs[i];
-
-							if (fname.toLowerCase().substring(fname.length - 4, fname.length) == '.xml') {
-								mxStencilRegistry.loadStencilSet(fname, null);
-							} else if (fname.toLowerCase().substring(fname.length - 3, fname.length) == '.js') {
-								var req = mxUtils.load(fname);
-
-								if (req != null) {
-									eval.call(window, req.getText());
-								}
-							} else {
-								// FIXME: This does not yet work as the loading is triggered after
-								// the shape was used in the graph, at which point the keys have
-								// typically been translated in the calling method.
-								//mxResources.add(fname);
-							}
-						}
-					}
-				} else {
-					mxStencilRegistry.loadStencilSet(STENCIL_PATH + '/' + basename + '.xml', null);
-				}
-
-				result = mxStencilRegistry.stencils[name];
-			}
-		}
-
-		return result;
-	};
-
-	// Returns the basename for the given stencil or null if no file must be
-	// loaded to render the given stencil.
-	mxStencilRegistry.getBasenameForStencil = function(name) {
-		var parts = name.split('.');
-		var tmp = null;
-
-		if (parts.length > 0 && parts[0] == 'mxgraph') {
-			tmp = parts[1];
-
-			for (var i = 2; i < parts.length - 1; i++) {
-				tmp += '/' + parts[i];
-			}
-		}
-
-		return tmp;
-	};
-
-	// Loads the given stencil set
-	mxStencilRegistry.loadStencilSet = function(stencilFile, postStencilLoad, force) {
-		force = (force != null) ? force : false;
-
-		// Uses additional cache for detecting previous load attempts
-		var xmlDoc = mxStencilRegistry.packages[stencilFile];
-
-		if (force || xmlDoc == null) {
-			var install = false;
-
-			if (xmlDoc == null) {
-				var req = mxUtils.load(stencilFile);
-				xmlDoc = req.getXml();
-				mxStencilRegistry.packages[stencilFile] = xmlDoc;
-				install = true;
-			}
-
-			mxStencilRegistry.parseStencilSet(xmlDoc, postStencilLoad, install);
-		}
-	};
-
-	// Parses the given stencil set
-	mxStencilRegistry.parseStencilSet = function(xmlDocument, postStencilLoad, install) {
-		install = (install != null) ? install : true;
-		var root = xmlDocument.documentElement;
-		var shape = root.firstChild;
-		var packageName = '';
-		var name = root.getAttribute('name');
-
-		if (name != null) {
-			packageName = name + '.';
-		}
-
-		while (shape != null) {
-			if (shape.nodeType == mxConstants.NODETYPE_ELEMENT) {
-				name = shape.getAttribute('name');
-
-				if (name != null) {
-					packageName = packageName.toLowerCase();
-					var stencilName = name.replace(/ /g, "_");
-
-					if (install) {
-						mxStencilRegistry.addStencil(packageName + stencilName.toLowerCase(), new mxStencil(shape));
-					}
-
-					if (postStencilLoad != null) {
-						var w = shape.getAttribute('w');
-						var h = shape.getAttribute('h');
-
-						w = (w == null) ? 80 : parseInt(w, 10);
-						h = (h == null) ? 80 : parseInt(h, 10);
-
-						postStencilLoad(packageName, stencilName, name, w, h);
-					}
-				}
-			}
-
-			shape = shape.nextSibling;
-		}
-	};
-})();
-
-/**
- * Class for asynchronously opening a new window and loading a file at the same
- * time. This acts as a bridge between the open dialog and the new editor.
- */
-OpenFile = function(done) {
-	this.producer = null;
-	this.consumer = null;
-	this.done = done;
-};
-
-/**
- * Registers the editor from the new window.
- */
-OpenFile.prototype.setConsumer = function(value) {
-	this.consumer = value;
-	this.execute();
-};
-
-/**
- * Sets the data from the loaded file.
- */
-OpenFile.prototype.setData = function(value, filename) {
-	this.data = value;
-	this.filename = filename;
-	this.execute();
-};
-
-/**
- * Displays an error message.
- */
-OpenFile.prototype.error = function(msg) {
-	this.cancel();
-	mxUtils.alert(msg);
-};
-
-/**
- * Consumes the data.
- */
-OpenFile.prototype.execute = function() {
-	if (this.consumer != null && this.data != null) {
-		this.consumer(this.data, this.filename);
-		this.cancel();
-	}
-};
-
-/**
- * Cancels the operation.
- */
-OpenFile.prototype.cancel = function() {
-	if (this.done != null) {
-		this.done();
-	}
-};
\ No newline at end of file
diff --git a/public/assets/plugins/jscripty/js/EditorUi.js b/public/assets/plugins/jscripty/js/EditorUi.js
index 8d5d72b..f7cd5f0 100644
--- a/public/assets/plugins/jscripty/js/EditorUi.js
+++ b/public/assets/plugins/jscripty/js/EditorUi.js
@@ -1,1345 +1 @@
-/**
- * $Id: EditorUi.js,v 1.21 2013/03/14 20:46:36 david Exp $
- * Copyright (c) 2006-2012, JGraph Ltd
- */
-/**
- * Constructs a new graph editor
- */
-EditorUi = function(editor, container) {
-	this.editor = editor || new Editor();
-	this.container = container || document.getElementById('geEditor');
-	var graph = editor.graph;
-	var self = this;
-
-	// Disables scrollbars
-	this.container.style.overflow = 'hidden';
-
-	// Pre-fetches submenu image
-	new Image().src = mxPopupMenu.prototype.submenuImage;
-
-	// Pre-fetches connect image
-	if (mxConnectionHandler.prototype.connectImage != null) {
-		new Image().src = mxConnectionHandler.prototype.connectImage.src;
-	}
-
-	// Creates the user interface
-	this.actions = new Actions(this);
-	this.menus = new Menus(this);
-	this.createDivs();
-	this.refresh();
-	this.createUi();
-
-	// Disables HTML and text selection
-	var textEditing = mxUtils.bind(this, function(evt) {
-		if (evt == null) {
-			evt = window.event;
-		}
-
-		if (this.isSelectionAllowed(evt)) {
-			return true;
-		}
-
-		return graph.isEditing();
-	});
-
-	// Disables text selection while not editing and no dialog visible
-	if (this.container == document.body) {
-		this.menubarContainer.onselectstart = textEditing;
-		this.menubarContainer.onmousedown = textEditing;
-		this.toolbarContainer.onselectstart = textEditing;
-		this.toolbarContainer.onmousedown = textEditing;
-		this.diagramContainer.onselectstart = textEditing;
-		this.diagramContainer.onmousedown = textEditing;
-		this.sidebarContainer.onselectstart = textEditing;
-		this.sidebarContainer.onmousedown = textEditing;
-		this.footerContainer.onselectstart = textEditing;
-		this.footerContainer.onmousedown = textEditing;
-	}
-
-	// And uses built-in context menu while editing
-	if (mxClient.IS_IE && (typeof(document.documentMode) === 'undefined' ||
-			document.documentMode < 9)) {
-		mxEvent.addListener(this.diagramContainer, 'contextmenu', textEditing);
-		mxEvent.addListener(this.sidebarContainer, 'contextmenu', textEditing);
-	} else {
-		// Allows browser context menu outside of diagram and sidebar
-		this.diagramContainer.oncontextmenu = textEditing;
-		this.sidebarContainer.oncontextmenu = textEditing;
-	}
-
-	// Contains the main graph instance inside the given panel
-	graph.init(this.diagramContainer);
-	graph.refresh();
-
-	// Enables scrollbars and sets cursor style for the container
-	graph.container.setAttribute('tabindex', '0');
-	// graph.container.style.overflow = (touchStyle) ? 'hidden' : 'auto';
-	graph.container.style.cursor = 'default';
-	graph.container.style.backgroundImage = 'url(' + editor.gridImage + ')';
-	graph.container.style.backgroundPosition = '-1px -1px';
-	graph.container.focus();
-
-	// Keeps graph container focused on mouse down
-	var graphFireMouseEvent = graph.fireMouseEvent;
-	graph.fireMouseEvent = function(evtName, me, sender) {
-		if (evtName == mxEvent.MOUSE_DOWN) {
-			this.container.focus();
-		}
-
-		graphFireMouseEvent.apply(this, arguments);
-	};
-
-	// Giuseppe Careri
-	// Defines invalid connections along with the error messages that they produce.
-
-	this.createMultiplicities(graph.multiplicities, ['start', 'end', 'input',
-		'question', 'email'
-	], [
-		[1, 1],
-		[0, 0],
-		[1, 1],
-		[1, 'n'],
-		[1, 'n']
-	], [
-		[0, 0],
-		[1, 'n'],
-		[1, 'n'],
-		[1, 'n'],
-		[1, 'n']
-
-	]);
-
-
-	// Giuseppe Careri
-	// Processes a doubleclick on an optional cell and fires a <dblclick> event.
-	// The event is fired initially.
-	// If the graph is enabled and the event has not been consumed, then <edit> is called with the given cell.
-	// The event is ignored if no cell was specified.
-	graph.dblClick = function(evt, cell) {
-		var edges = ['question'];
-		var mxe = new mxEventObject(mxEvent.DOUBLE_CLICK, 'event', evt, 'cell',
-			cell);
-		this.fireEvent(mxe);
-
-		if (this.isEnabled() && !mxEvent.isConsumed(evt) && !mxe.isConsumed()) {
-			// Override dblClick Vertices and Edges
-			if (this.getModel().isEdge(cell)) {
-				if (edges.indexOf(cell.source.value.tagName) >= 0)
-					this.startEditingAtCell(cell);
-			} else if (this.getModel().isVertex(cell)) {
-				console.log(self);
-				console.log(cell);
-				self.showDialog(new GeneralDialog(self, cell).container, 320, 280, true,
-					true);
-			}
-			mxe.consume();
-		}
-	}
-
-	// Configures automatic expand on mouseover
-	graph.panningHandler.autoExpand = true;
-
-	// Installs context menu
-	graph.panningHandler.factoryMethod = mxUtils.bind(this, function(menu, cell,
-		evt) {
-		this.menus.createPopupMenu(menu, cell, evt);
-	});
-
-	// Initializes the outline
-	editor.outline.init(this.outlineContainer);
-
-	// Hides context menu
-	mxEvent.addGestureListeners(document, mxUtils.bind(this, function(evt) {
-		graph.panningHandler.hideMenu();
-	}));
-
-	// Adds gesture handling (pinch to zoom)
-	if (mxClient.IS_TOUCH) {
-		mxEvent.addListener(graph.container, 'gesturechange',
-			mxUtils.bind(this, function(evt) {
-				graph.view.getDrawPane().setAttribute('transform', 'scale(' + evt.scale +
-					')');
-				graph.view.getOverlayPane().style.visibility = 'hidden';
-			})
-		);
-
-		mxEvent.addListener(graph.container, 'gestureend',
-			mxUtils.bind(this, function(evt) {
-				graph.view.getDrawPane().removeAttribute('transform');
-				graph.zoomToCenter = true;
-				graph.zoom(evt.scale);
-				graph.view.getOverlayPane().style.visibility = 'visible';
-			})
-		);
-	}
-
-	// Create handler for key events
-	var keyHandler = this.createKeyHandler(editor);
-
-	// Getter for key handler
-	this.getKeyHandler = function() {
-		return keyHandler;
-	};
-
-	// Updates the editor UI after the window has been resized
-	mxEvent.addListener(window, 'resize', mxUtils.bind(this, function() {
-		this.refresh();
-		graph.sizeDidChange();
-		this.editor.outline.update(false);
-		this.editor.outline.outline.sizeDidChange();
-	}));
-
-	// Updates action and menu states
-	this.init();
-	this.open();
-};
-
-/**
- * Specifies the size of the split bar.
- */
-EditorUi.prototype.splitSize = (mxClient.IS_TOUCH) ? 16 : 8;
-
-/**
- * Specifies the height of the menubar. Default is 34.
- */
-EditorUi.prototype.menubarHeight = 33;
-
-/**
- * Specifies the height of the toolbar. Default is 36.
- */
-EditorUi.prototype.toolbarHeight = 36;
-
-/**
- * Specifies the height of the footer. Default is 28.
- */
-EditorUi.prototype.footerHeight = 28;
-
-/**
- * Specifies the position of the horizontal split bar. Default is 212.
- */
-EditorUi.prototype.hsplitPosition = 204;
-
-/**
- * Specifies the position of the vertical split bar. Default is 190.
- */
-EditorUi.prototype.vsplitPosition = 190;
-
-/**
- * Installs the listeners to update the action states.
- */
-EditorUi.prototype.init = function() {
-	// Updates action states
-	this.addUndoListener();
-	this.addSelectionListener();
-
-	// Overrides clipboard to update paste action state
-	var paste = this.actions.get('paste');
-
-	var updatePaste = function() {
-		paste.setEnabled(!mxClipboard.isEmpty());
-	};
-
-	var mxClipboardCut = mxClipboard.cut;
-	mxClipboard.cut = function() {
-		mxClipboardCut.apply(this, arguments);
-		updatePaste();
-	};
-
-	var mxClipboardCopy = mxClipboard.copy;
-	mxClipboard.copy = function() {
-		mxClipboardCopy.apply(this, arguments);
-		updatePaste();
-	};
-};
-
-/**
- * Hook for allowing selection and context menu for certain events.
- */
-EditorUi.prototype.isSelectionAllowed = function(evt) {
-	return false;
-};
-
-/**
- * Opens the current diagram via the window.opener if one exists.
- */
-EditorUi.prototype.open = function() {
-	// Cross-domain window access is not allowed in FF, so if we
-	// were opened from another domain then this will fail.
-	try {
-		if (window.opener != null && window.opener.openFile != null) {
-			window.opener.openFile.setConsumer(mxUtils.bind(this, function(xml,
-				filename) {
-				try {
-					var doc = mxUtils.parseXml(xml);
-					this.editor.setGraphXml(doc.documentElement);
-					this.editor.modified = false;
-					this.editor.undoManager.clear();
-
-					if (filename != null) {
-						this.editor.filename = filename;
-					}
-				} catch (e) {
-					mxUtils.alert(mxResources.get('invalidOrMissingFile') + ': ' + e.message);
-				}
-			}));
-		}
-	} catch (e) {
-		// ignore
-	}
-};
-
-/**
- * Giuseppe Careri
- * Opens the current diagram via string.
- */
-EditorUi.prototype.openString = function(xml, filename, data) {
-	try {
-		var doc = mxUtils.parseXml(xml);
-		this.editor.setGraphXml(doc.documentElement);
-		this.editor.modified = false;
-		this.editor.undoManager.clear();
-
-		if (filename != null) {
-			this.editor.filename = filename;
-		}
-
-		if (data != null) {
-			this.editor.data = data;
-		}
-	} catch (e) {
-		mxUtils.alert(mxResources.get('invalidOrMissingFile') + ': ' + e.message);
-	}
-};
-
-/**
- * Saves As the current graph under the given project name.
- */
-EditorUi.prototype.new = function(name) {
-	var editor = this.editor;
-
-	if (name != null) {
-		var xml = mxUtils.getPrettyXml(this.editor.getGraphXml());
-		try {
-			if (useLocalStorage) {
-				if (localStorage.getItem(name) != null &&
-					!mxUtils.confirm(mxResources.get('replace', [name]))) {
-					return;
-				}
-
-				localStorage.setItem(name, xml);
-				this.editor.setStatus(mxResources.get('saved') + ' ' + new Date());
-			} else {
-				console.log(xml.length);
-				console.log(MAX_REQUEST_SIZE);
-				if (xml.length < MAX_REQUEST_SIZE) {
-					xml = encodeURIComponent(xml);
-					name = encodeURIComponent(name);
-
-					var xhr = new XMLHttpRequest();
-					xhr.open("POST", SAVE_URL, true);
-					xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
-					xhr.setRequestHeader('Authorization', 'Bearer ' + editor.data.token);
-					xhr.onload = function(e) {
-						if (xhr.readyState === 4) {
-							if (xhr.status === 201) {
-								editor.setStatus('Project ' + JSON.parse(xhr.response).name +
-									' is opening in new window!');
-								setTimeout(function() {
-									window.open('jscripty/projects/view/' + JSON.parse(xhr.response).id,
-										'_blank');
-								}, 1500);
-							} else {
-								try {
-									var response = JSON.parse(xhr.response);
-									editor.setStatus('Error creating project: ' + response.errors[0].message);
-								} catch (e) {
-									editor.setStatus('Error creating project' + ' (' + xhr.status + ' ' + xhr.statusText + ')');
-								}
-							}
-						}
-					};
-					xhr.onerror = function(e) {
-						mxUtils.alert(xhr.statusText);
-					};
-					xhr.send('description=project_new&name=' + name);
-				} else {
-					mxUtils.alert(mxResources.get('drawingTooLarge'));
-					mxUtils.popup(xml);
-
-					return;
-				}
-			}
-
-			this.editor.filename = name;
-			this.editor.modified = false;
-		} catch (e) {
-			this.editor.setStatus('Error creating project');
-		}
-	} else {
-		this.editor.setStatus('Error creating project');
-	}
-};
-
-
-/**
- * Saves the current graph under the given project name.
- */
-EditorUi.prototype.save = function(name) {
-	var editor = this.editor;
-
-	if (name != null) {
-		var xml = mxUtils.getPrettyXml(this.editor.getGraphXml());
-		try {
-			if (useLocalStorage) {
-				if (localStorage.getItem(name) != null &&
-					!mxUtils.confirm(mxResources.get('replace', [name]))) {
-					return;
-				}
-
-				localStorage.setItem(name, xml);
-				this.editor.setStatus(mxResources.get('saved') + ' ' + new Date());
-			} else {
-				console.log(xml.length);
-				console.log(MAX_REQUEST_SIZE);
-				if (xml.length < MAX_REQUEST_SIZE) {
-					xml = encodeURIComponent(xml);
-
-					var xhr = new XMLHttpRequest();
-					xhr.open("PUT", SAVE_URL + this.editor.data.id, true);
-					xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
-					xhr.setRequestHeader('Authorization', 'Bearer ' + editor.data.token);
-					xhr.onload = function(e) {
-						if (xhr.readyState === 4) {
-							if (xhr.status === 200) {
-								editor.setStatus('Updated at ' + JSON.parse(xhr.response).updatedAt +
-									' (' + xhr.status + ' ' + xhr.statusText + ')');
-							} else {
-								try {
-									var response = JSON.parse(xhr.response);
-									editor.setStatus('Error saving project: ' + response.errors[0].message);
-								} catch (e) {
-									editor.setStatus('Error saving project' + ' (' + xhr.status + ' ' + xhr.statusText + ')');
-								}
-							}
-						}
-					};
-					xhr.onerror = function(e) {
-						mxUtils.alert(xhr.statusText);
-					};
-					xhr.send('draft=' + xml);
-				} else {
-					mxUtils.alert(mxResources.get('drawingTooLarge'));
-					mxUtils.popup(xml);
-
-					return;
-				}
-			}
-
-			this.editor.filename = name;
-			this.editor.modified = false;
-		} catch (e) {
-			this.editor.setStatus('Error saving file');
-		}
-	} else {
-		this.editor.setStatus('Error saving file');
-	}
-};
-
-/**
- * Saves As the current graph under the given project name.
- */
-EditorUi.prototype.saveAs = function(name) {
-	var editor = this.editor;
-	console.log(name);
-	if (name != null) {
-		var xml = mxUtils.getPrettyXml(this.editor.getGraphXml());
-		try {
-			if (useLocalStorage) {
-				if (localStorage.getItem(name) != null &&
-					!mxUtils.confirm(mxResources.get('replace', [name]))) {
-					return;
-				}
-
-				localStorage.setItem(name, xml);
-				this.editor.setStatus(mxResources.get('saved') + ' ' + new Date());
-			} else {
-				console.log(xml.length);
-				console.log(MAX_REQUEST_SIZE);
-				if (xml.length < MAX_REQUEST_SIZE) {
-					xml = encodeURIComponent(xml);
-					name = encodeURIComponent(name);
-
-					var xhr = new XMLHttpRequest();
-					xhr.open("POST", SAVE_URL, true);
-					xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
-					xhr.setRequestHeader('Authorization', 'Bearer ' + editor.data.token);
-					xhr.onload = function(e) {
-						if (xhr.readyState === 4) {
-							if (xhr.status === 201) {
-								editor.setStatus('Project ' + JSON.parse(xhr.response).name +
-									' is opening in new window!');
-								setTimeout(function() {
-									window.open('jscripty/project/' + JSON.parse(xhr.response).id,
-										'_blank');
-								}, 1500);
-							} else {
-								try {
-									var response = JSON.parse(xhr.response);
-									editor.setStatus('Error cloning project: ' + response.errors[0].message);
-								} catch (e) {
-									editor.setStatus('Error cloning project' + ' (' + xhr.status + ' ' + xhr.statusText + ')');
-								}
-							}
-						}
-					};
-					xhr.onerror = function(e) {
-						mxUtils.alert(xhr.statusText);
-					};
-					xhr.send('description=project_cloned&name=' + name +
-						'&draft=' + xml + '&production=' + xml);
-				} else {
-					mxUtils.alert(mxResources.get('drawingTooLarge'));
-					mxUtils.popup(xml);
-
-					return;
-				}
-			}
-
-			this.editor.filename = name;
-			this.editor.modified = false;
-		} catch (e) {
-			this.editor.setStatus('Error saving file');
-		}
-	} else {
-		this.editor.setStatus('Error saving file');
-	}
-};
-
-/**
- * Plush the current graph under the given project name.
- */
-EditorUi.prototype.validate = function(a, b) {
-	var graph = this.editor.graph;
-	a = null != a ? a : graph.model.getRoot();
-	b = null != b ? b : {};
-	for (var c = !0, d = graph.model.getChildCount(a), e = 0; e < d; e++) {
-		var f = graph.model.getChildAt(a, e),
-			g = b;
-		graph.isValidRoot(f) && (g = {});
-		g = this.validate(f, g);
-		null != g ? graph.setCellWarning(f, g.replace(/\n/g, "\x3cbr\x3e")) : graph.setCellWarning(f, null);
-		c = c && null == g
-	}
-	d = "";
-	if (graph.model.isVertex(a)) {
-		switch (a.value.nodeName) {
-			case 'question':
-				d = (a.value.getAttribute('question') !== "") ? "" :
-					'Question can not be empty' + "\n";
-				d += (a.value.getAttribute('label') !== "") ? "" : 'Label can not be empty' + "\n";
-
-				break;
-			case 'input':
-				d = (a.value.getAttribute('question') !== "") ? "" : 'Question can not be empty' + "\n";
-				d += (a.value.getAttribute('label') !== "") ? "" : 'Label can not be empty' + "\n";
-
-				break;
-			case 'start':
-				d = this.validateBlock('start') ? '' : "Only one Start block is allowed" + "\n";
-				d += (a.value.getAttribute('label') !== "") ? "" : 'Label can not be empty' + "\n";
-
-				break;
-		}
-	}
-
-	if (graph.model.isEdge(a)) {
-		var z = graph.model.getCell(a.source.getId());
-		switch (z.value.nodeName) {
-			case 'question':
-				// var patt = /^[a-zA-Z0-9][a-zA-Z0-9\s]*$/;
-				var str = String(a.getValue());
-				console.log(str);
-				if (str === 'null' || str === 'undefined') {
-					d = "Value can not be empty" + "\n";
-				} else {
-					var result = str.split(",");
-					result.forEach(function(entry, key) {
-						d = d + ((entry.trim() !== "") ? "" : 'Value' + (key + 1) + ' can not be empty' + "\n");
-					});
-				}
-				// console.log(a.getValue());
-				// if ((str == 'undefined') || (str == 'null')) {
-				// 	str = ' ';
-				// }
-				// d = ((a.getValue() !== "") && (a.getValue() !== 'undefined') && (a.getValue() !== null)) ? '' : "Value can not be empty" + "\n";
-				// d = d + ((patt.test(str.trim())) ? "" : 'Value can not be empty' + "\n");
-				//
-				// res.forEach(function(entry) {
-				// d = d + ((patt.test(entry.trim())) ? "" : 'Can not be empty' + "\n");
-				// });
-				break;
-
-		}
-	}
-
-	graph.isCellCollapsed(a) && !c && (d += (mxResources.get(graph.containsValidationErrorsResource) || graph.containsValidationErrorsResource) + "\n");
-	d = graph.model.isEdge(a) ? d + (graph.getEdgeValidationError(a, graph.model.getTerminal(a, !0), graph.model.getTerminal(a, !1)) || "") : d + (graph.getCellValidationError(a) || "");
-	e = graph.validateCell(a, b);
-	null != e && (d += e);
-	null == graph.model.getParent(a) && graph.view.validate();
-	return 0 < d.length || !c ? d : null
-}
-
-EditorUi.prototype.validateBlock = function(blockName) {
-	var graph = this.editor.graph;
-	var parent = graph.getDefaultParent();
-	var count = 0;
-	// var model = graph.getModel();
-	//We can also use model.getChildren(parent)
-	parent.children.forEach(function(n) {
-		if (graph.model.isVertex(n) && n.value.nodeName == blockName) {
-			count++;
-		}
-	});
-	return count > 1 ? false : true;
-}
-
-EditorUi.prototype.publish = function(name) {
-
-	var editor = this.editor;
-
-	if (name != null) {
-
-		var response = this.validate();
-		if (response === null) {
-			var xml = mxUtils.getPrettyXml(this.editor.getGraphXml());
-			try {
-				if (useLocalStorage) {
-					if (localStorage.getItem(name) != null &&
-						!mxUtils.confirm(mxResources.get('replace', [name]))) {
-						return;
-					}
-
-					localStorage.setItem(name, xml);
-					this.editor.setStatus(mxResources.get('saved') + ' ' + new Date());
-				} else {
-					console.log(xml.length);
-					console.log(MAX_REQUEST_SIZE);
-					if (xml.length < MAX_REQUEST_SIZE) {
-						xml = encodeURIComponent(xml);
-
-						var xhr = new XMLHttpRequest();
-						xhr.open("PUT", SAVE_URL + this.editor.data.id, true);
-						xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
-						xhr.setRequestHeader('Authorization', 'Bearer ' + editor.data.token);
-						xhr.onload = function(e) {
-							if (xhr.readyState === 4) {
-								if (xhr.status === 200) {
-									editor.setStatus('Published at ' + JSON.parse(xhr.response).updatedAt +
-										' (' + xhr.status + ' ' + xhr.statusText + ')');
-								} else {
-									try {
-										var response = JSON.parse(xhr.response);
-										editor.setStatus('Error publishing project: ' + response.errors[0].message);
-									} catch (e) {
-										editor.setStatus('Error publishing project' + ' (' + xhr.status + ' ' + xhr.statusText + ')');
-									}
-								}
-							}
-						};
-						xhr.onerror = function(e) {
-							mxUtils.alert(xhr.statusText);
-						};
-						xhr.send('draft=' + xml + '&production=' + xml);
-					} else {
-						mxUtils.alert(mxResources.get('drawingTooLarge'));
-						mxUtils.popup(xml);
-
-						return;
-					}
-				}
-
-				this.editor.filename = name;
-				this.editor.modified = false;
-			} catch (e) {
-				this.editor.setStatus('Error publishing file');
-			}
-		} else {
-			editor.setStatus('Error publishing project: ');
-		}
-	} else {
-		this.editor.setStatus('Error publishing file');
-	}
-	// }
-
-
-
-};
-
-/**
- * Create variable
- */
-EditorUi.prototype.variable = function(name) {
-	var editor = this.editor;
-
-	if (name != null) {
-		try {
-
-			var xhr = new XMLHttpRequest();
-			xhr.open("POST", VARIABLE_URL, true);
-			xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
-			xhr.setRequestHeader('Authorization', 'Bearer ' + editor.data.token);
-			xhr.onload = function(e) {
-				if (xhr.readyState === 4) {
-					if (xhr.status === 201) {
-						editor.setStatus('Variable created at ' + JSON.parse(xhr.response).createdAt +
-							' (' + xhr.status + ' ' + xhr.statusText + ')');
-					} else {
-						try {
-							var response = JSON.parse(xhr.response);
-							editor.setStatus('Error creating variable: ' + response.errors[0].message);
-						} catch (e) {
-							editor.setStatus('Error creating variable' + ' (' + xhr.status + ' ' + xhr.statusText + ')');
-						}
-					}
-				}
-			};
-			xhr.onerror = function(e) {
-				mxUtils.alert(xhr.statusText);
-			};
-			xhr.send('name=' + name);
-		} catch (e) {
-			this.editor.setStatus('Error creating variable');
-		}
-	} else {
-		this.editor.setStatus('Error creating variable');
-	}
-};
-
-/**
- * Returns the URL for a copy of this editor with no state.
- */
-EditorUi.prototype.getUrl = function(pathname) {
-	var href = (pathname != null) ? pathname : window.location.pathname;
-	var parms = (href.indexOf('?') > 0) ? 1 : 0;
-
-	// Removes template URL parameter for new blank diagram
-	for (var key in urlParams) {
-		if (parms == 0) {
-			href += '?';
-		} else {
-			href += '&';
-		}
-
-		href += key + '=' + urlParams[key];
-		parms++;
-	}
-
-	return href;
-};
-
-/**
- * Updates the states of the given undo/redo items.
- */
-EditorUi.prototype.addUndoListener = function() {
-	var undo = this.actions.get('undo');
-	var redo = this.actions.get('redo');
-
-	var undoMgr = this.editor.undoManager;
-
-	var undoListener = function() {
-		undo.setEnabled(undoMgr.canUndo());
-		redo.setEnabled(undoMgr.canRedo());
-	};
-
-	undoMgr.addListener(mxEvent.ADD, undoListener);
-	undoMgr.addListener(mxEvent.UNDO, undoListener);
-	undoMgr.addListener(mxEvent.REDO, undoListener);
-	undoMgr.addListener(mxEvent.CLEAR, undoListener);
-
-	// Updates the button states once
-	undoListener();
-};
-
-/**
- * Updates the states of the given toolbar items based on the selection.
- */
-EditorUi.prototype.addSelectionListener = function() {
-	var selectionListener = mxUtils.bind(this, function() {
-		var graph = this.editor.graph;
-		var selected = !graph.isSelectionEmpty();
-		var vertexSelected = false;
-		var edgeSelected = false;
-
-		var cells = graph.getSelectionCells();
-
-		if (cells != null) {
-			for (var i = 0; i < cells.length; i++) {
-				var cell = cells[i];
-
-				if (graph.getModel().isEdge(cell)) {
-					edgeSelected = true;
-				}
-
-				if (graph.getModel().isVertex(cell)) {
-					vertexSelected = true;
-				}
-
-				if (edgeSelected && vertexSelected) {
-					break;
-				}
-			}
-		}
-
-		// Updates action states
-		var actions = ['cut', 'copy', 'delete', 'duplicate', 'bold', 'italic',
-			'style', 'underline', 'toFront', 'toBack', 'dashed', 'rounded',
-			'shadow',
-			'tilt', 'autosize'
-		];
-
-		for (var i = 0; i < actions.length; i++) {
-			this.actions.get(actions[i]).setEnabled(selected);
-		}
-
-		this.actions.get('curved').setEnabled(edgeSelected);
-		this.actions.get('rotation').setEnabled(vertexSelected);
-		this.actions.get('wordWrap').setEnabled(vertexSelected);
-		this.actions.get('group').setEnabled(graph.getSelectionCount() > 1);
-		this.actions.get('ungroup').setEnabled(graph.getSelectionCount() == 1 &&
-			graph.getModel().getChildCount(graph.getSelectionCell()) > 0);
-		var oneVertexSelected = vertexSelected && graph.getSelectionCount() == 1;
-		this.actions.get('removeFromGroup').setEnabled(oneVertexSelected &&
-			graph.getModel().isVertex(graph.getModel().getParent(graph.getSelectionCell()))
-		);
-
-		// Updates menu states
-		var menus = ['fontFamily', 'fontSize', 'alignment', 'position', 'text',
-			'format',
-			'arrange', 'linewidth', 'spacing'
-		];
-
-		for (var i = 0; i < menus.length; i++) {
-			this.menus.get(menus[i]).setEnabled(selected);
-		}
-
-		menus = ['line', 'lineend', 'linestart'];
-
-		for (var i = 0; i < menus.length; i++) {
-			this.menus.get(menus[i]).setEnabled(edgeSelected);
-		}
-
-		this.actions.get('setAsDefaultEdge').setEnabled(edgeSelected);
-
-		this.menus.get('align').setEnabled(graph.getSelectionCount() > 1);
-		this.menus.get('direction').setEnabled(vertexSelected || (edgeSelected &&
-			graph.isLoop(graph.view.getState(graph.getSelectionCell()))));
-		this.menus.get('navigation').setEnabled(graph.foldingEnabled && ((graph.view
-				.currentRoot != null) ||
-			(graph.getSelectionCount() == 1 && graph.isValidRoot(graph.getSelectionCell()))
-		));
-		this.actions.get('home').setEnabled(graph.view.currentRoot != null);
-		this.actions.get('exitGroup').setEnabled(graph.view.currentRoot != null);
-		var groupEnabled = graph.getSelectionCount() == 1 && graph.isValidRoot(
-			graph.getSelectionCell());
-		this.actions.get('enterGroup').setEnabled(groupEnabled);
-		this.actions.get('expand').setEnabled(groupEnabled);
-		this.actions.get('collapse').setEnabled(groupEnabled);
-		this.actions.get('editLink').setEnabled(graph.getSelectionCount() == 1);
-		this.actions.get('openLink').setEnabled(graph.getSelectionCount() == 1 &&
-			graph.getLinkForCell(graph.getSelectionCell()) != null);
-	});
-
-	this.editor.graph.getSelectionModel().addListener(mxEvent.CHANGE,
-		selectionListener);
-	selectionListener();
-};
-
-/**
- * Refreshes the viewport.
- */
-EditorUi.prototype.refresh = function() {
-	var quirks = mxClient.IS_IE && (document.documentMode == null || document.documentMode ==
-		5);
-	var w = this.container.clientWidth;
-	var h = this.container.clientHeight;
-
-	if (this.container == document.body) {
-		w = document.body.clientWidth || document.documentElement.clientWidth;
-		h = (quirks) ? document.body.clientHeight || document.documentElement.clientHeight :
-			document.documentElement.clientHeight;
-	}
-
-	var effHsplitPosition = Math.max(0, Math.min(this.hsplitPosition, w - this.splitSize -
-		20));
-	var effVsplitPosition = Math.max(0, Math.min(this.vsplitPosition, h - this.menubarHeight -
-		this.toolbarHeight - this.footerHeight - this.splitSize - 1));
-
-	this.menubarContainer.style.height = this.menubarHeight + 'px';
-	this.toolbarContainer.style.top = this.menubarHeight + 'px';
-	this.toolbarContainer.style.height = this.toolbarHeight + 'px';
-
-	var tmp = this.menubarHeight + this.toolbarHeight;
-
-	if (!mxClient.IS_QUIRKS) {
-		tmp += 1;
-	}
-
-	this.sidebarContainer.style.top = tmp + 'px';
-	this.sidebarContainer.style.width = effHsplitPosition + 'px';
-	this.outlineContainer.style.width = effHsplitPosition + 'px';
-	this.outlineContainer.style.height = effVsplitPosition + 'px';
-	this.outlineContainer.style.bottom = this.footerHeight + 'px';
-	this.diagramContainer.style.left = (effHsplitPosition + this.splitSize) +
-		'px';
-	this.diagramContainer.style.top = this.sidebarContainer.style.top;
-	this.footerContainer.style.height = this.footerHeight + 'px';
-	this.footerContainer.style.display = 'none';
-	this.hsplit.style.top = this.sidebarContainer.style.top;
-	this.hsplit.style.bottom = this.outlineContainer.style.bottom;
-	this.hsplit.style.left = effHsplitPosition + 'px';
-	this.vsplit.style.width = this.sidebarContainer.style.width;
-	this.vsplit.style.bottom = (effVsplitPosition + this.footerHeight) + 'px';
-
-	if (quirks) {
-		this.menubarContainer.style.width = w + 'px';
-		this.toolbarContainer.style.width = this.menubarContainer.style.width;
-		var sidebarHeight = (h - effVsplitPosition - this.splitSize - this.footerHeight -
-			this.menubarHeight - this.toolbarHeight);
-		this.sidebarContainer.style.height = sidebarHeight + 'px';
-		this.diagramContainer.style.width = (w - effHsplitPosition - this.splitSize) +
-			'px';
-		var diagramHeight = (h - this.footerHeight - this.menubarHeight - this.toolbarHeight);
-		this.diagramContainer.style.height = diagramHeight + 'px';
-		this.footerContainer.style.width = this.menubarContainer.style.width;
-		this.hsplit.style.height = diagramHeight + 'px';
-	} else {
-		this.sidebarContainer.style.bottom = (effVsplitPosition + this.splitSize +
-			this.footerHeight) + 'px';
-		this.diagramContainer.style.bottom = this.outlineContainer.style.bottom;
-	}
-};
-
-/**
- * Creates the required containers.
- */
-EditorUi.prototype.createDivs = function() {
-	this.menubarContainer = this.createDiv('geMenubarContainer');
-	this.toolbarContainer = this.createDiv('geToolbarContainer');
-	this.sidebarContainer = this.createDiv('geSidebarContainer');
-	this.outlineContainer = this.createDiv('geOutlineContainer');
-	this.diagramContainer = this.createDiv('geDiagramContainer');
-	this.footerContainer = this.createDiv('geFooterContainer');
-	this.hsplit = this.createDiv('geHsplit');
-	this.vsplit = this.createDiv('geVsplit');
-
-	// Sets static style for containers
-	this.menubarContainer.style.top = '0px';
-	this.menubarContainer.style.left = '0px';
-	this.menubarContainer.style.right = '0px';
-	this.toolbarContainer.style.left = '0px';
-	this.toolbarContainer.style.right = '0px';
-	this.sidebarContainer.style.left = '0px';
-	this.outlineContainer.style.left = '0px';
-	this.diagramContainer.style.right = '0px';
-	this.footerContainer.style.left = '0px';
-	this.footerContainer.style.right = '0px';
-	this.footerContainer.style.bottom = '0px';
-	this.vsplit.style.left = '0px';
-	this.vsplit.style.height = this.splitSize + 'px';
-	this.hsplit.style.width = this.splitSize + 'px';
-};
-
-/**
- * Creates the required containers.
- */
-EditorUi.prototype.createUi = function() {
-	// Creates menubar
-	this.menubar = this.menus.createMenubar(this.createDiv('geMenubar'));
-	this.menubarContainer.appendChild(this.menubar.container);
-
-	// Creates toolbar
-	this.toolbar = this.createToolbar(this.createDiv('geToolbar'));
-	this.toolbarContainer.appendChild(this.toolbar.container);
-
-	// Creates the sidebar
-	this.sidebar = this.createSidebar(this.sidebarContainer);
-
-	// Creates the footer
-	this.footerContainer.appendChild(this.createFooter());
-
-	// Adds status bar in menubar
-	this.statusContainer = this.createStatusContainer();
-
-	// Connects the status bar to the editor status
-	this.editor.addListener('statusChanged', mxUtils.bind(this, function() {
-		this.setStatusText(this.editor.getStatus());
-	}));
-
-	this.setStatusText(this.editor.getStatus());
-	this.menubar.container.appendChild(this.statusContainer);
-
-	// Inserts into DOM
-	this.container.appendChild(this.menubarContainer);
-	this.container.appendChild(this.toolbarContainer);
-	this.container.appendChild(this.sidebarContainer);
-	this.container.appendChild(this.outlineContainer);
-	this.container.appendChild(this.diagramContainer);
-	this.container.appendChild(this.footerContainer);
-	this.container.appendChild(this.hsplit);
-	this.container.appendChild(this.vsplit);
-
-	// HSplit
-	this.addSplitHandler(this.hsplit, true, 0, mxUtils.bind(this, function(
-		value) {
-		this.hsplitPosition = value;
-		this.refresh();
-		this.editor.graph.sizeDidChange();
-		this.editor.outline.update(false);
-		this.editor.outline.outline.sizeDidChange();
-	}));
-
-	// VSplit
-	this.addSplitHandler(this.vsplit, false, this.footerHeight, mxUtils.bind(
-		this,
-		function(value) {
-			this.vsplitPosition = value;
-			this.refresh();
-			this.editor.outline.update(false);
-			this.editor.outline.outline.sizeDidChange();
-		}));
-};
-
-/**
- * Creates a new toolbar for the given container.
- */
-EditorUi.prototype.createStatusContainer = function() {
-	var container = document.createElement('a');
-	container.className = 'geItem geStatus';
-
-	return container;
-};
-
-/**
- * Creates a new toolbar for the given container.
- */
-EditorUi.prototype.createStatusContainer = function() {
-	var container = document.createElement('a');
-	container.className = 'geItem geStatus';
-
-	return container;
-};
-
-/**
- * Creates a new toolbar for the given container.
- */
-EditorUi.prototype.setStatusText = function(value) {
-	this.statusContainer.innerHTML = value;
-};
-
-/**
- * Creates a new toolbar for the given container.
- */
-EditorUi.prototype.createToolbar = function(container) {
-	return new Toolbar(this, container);
-};
-
-/**
- * Creates a new sidebar for the given container.
- */
-EditorUi.prototype.createSidebar = function(container) {
-	return new Sidebar(this, container);
-};
-
-/**
- * Creates and returns a new footer.
- */
-EditorUi.prototype.createFooter = function() {
-	return this.createDiv('geFooter');
-};
-
-/**
- * Creates the actual toolbar for the toolbar container.
- */
-EditorUi.prototype.createDiv = function(classname) {
-	var elt = document.createElement('div');
-	elt.className = classname;
-
-	return elt;
-};
-
-/**
- * Creates the custom header.
- */
-EditorUi.prototype.createHeader = function(classname) {
-	var elt = document.createElement(classname);
-	return elt;
-};
-
-/**
- * Creates the custom header.
- */
-EditorUi.prototype.createForm = function(classname) {
-	var elt = document.createElement('form');
-	elt.className = classname;
-
-	return elt;
-};
-
-/**
- * Updates the states of the given undo/redo items.
- */
-EditorUi.prototype.addSplitHandler = function(elt, horizontal, dx, onChange) {
-	var start = null;
-	var initial = null;
-
-	function getValue() {
-		return parseInt(((horizontal) ? elt.style.left : elt.style.bottom));
-	};
-
-	function moveHandler(evt) {
-		if (start != null) {
-			var pt = new mxPoint(mxEvent.getClientX(evt), mxEvent.getClientY(evt));
-			onChange(Math.max(0, initial + ((horizontal) ? (pt.x - start.x) : (start.y -
-				pt.y)) - dx));
-			mxEvent.consume(evt);
-		}
-	};
-
-	function dropHandler(evt) {
-		moveHandler(evt);
-		start = null;
-		initial = null;
-	};
-
-	mxEvent.addGestureListeners(elt, function(evt) {
-		start = new mxPoint(mxEvent.getClientX(evt), mxEvent.getClientY(evt));
-		initial = getValue();
-		mxEvent.consume(evt);
-	});
-
-	mxEvent.addListener(document, 'mousemove', moveHandler);
-	mxEvent.addListener(document, 'touchmove', moveHandler);
-	mxEvent.addListener(document, 'mouseup', dropHandler);
-	mxEvent.addListener(document, 'touchend', dropHandler);
-};
-
-/**
- * Displays a print dialog.
- */
-EditorUi.prototype.showDialog = function(elt, w, h, modal, closable, onClose) {
-	this.hideDialog();
-	this.dialog = new Dialog(this, elt, w, (mxClient.IS_VML) ? h - 12 : h,
-		modal,
-		closable, onClose);
-};
-
-/**
- * Displays a print dialog.
- */
-EditorUi.prototype.hideDialog = function() {
-	if (this.dialog != null) {
-		this.dialog.close();
-		this.dialog = null;
-		this.editor.graph.container.focus();
-	}
-};
-
-/**
- * Adds the label menu items to the given menu and parent.
- */
-EditorUi.prototype.saveFile = function(forceDialog) {
-	if (!forceDialog && this.editor.filename != null) {
-		this.save(this.editor.getOrCreateFilename());
-	} else {
-		this.showDialog(new SaveDialog(this).container, 300, 100, true, true);
-	}
-};
-
-/**
- * Adds the label menu items to the given menu and parent.
- */
-EditorUi.prototype.publishFile = function(forceDialog) {
-	if (!forceDialog && this.editor.filename != null) {
-		this.publish(this.editor.getOrCreateFilename());
-	} else {
-		//this.showDialog(new SaveDialog(this).container, 300, 100, true, true);
-	}
-};
-
-/**
- * Executes the given layout.
- */
-EditorUi.prototype.executeLayout = function(layout, animate, ignoreChildCount) {
-	var graph = this.editor.graph;
-	var cell = graph.getSelectionCell();
-
-	// Allow global overridding of animation
-	animate = this.animate != null ? this.animate : animate;
-
-	graph.getModel().beginUpdate();
-	try {
-		layout.execute(graph.getDefaultParent(), cell);
-	} catch (e) {
-		throw e;
-	} finally {
-		// Animates the changes in the graph model except
-		// for Camino, where animation is too slow
-		if (animate && navigator.userAgent.indexOf('Camino') < 0) {
-			// New API for animating graph layout results asynchronously
-			var morph = new mxMorphing(graph);
-			morph.addListener(mxEvent.DONE, mxUtils.bind(this, function() {
-				graph.getModel().endUpdate();
-			}));
-
-			morph.startAnimation();
-		} else {
-			graph.getModel().endUpdate();
-		}
-	}
-};
-
-/**
- * Creates the keyboard event handler for the current graph and history.
- */
-EditorUi.prototype.createKeyHandler = function(editor) {
-	var graph = this.editor.graph;
-	var keyHandler = new mxKeyHandler(graph);
-
-	// Routes command-key to control-key on Mac
-	keyHandler.isControlDown = function(evt) {
-		return mxEvent.isControlDown(evt) || (mxClient.IS_MAC && evt.metaKey);
-	};
-
-	// Helper function to move cells with the cursor keys
-	function nudge(keyCode) {
-		if (!graph.isSelectionEmpty()) {
-			var dx = 0;
-			var dy = 0;
-
-			if (keyCode == 37) {
-				dx = -1;
-			} else if (keyCode == 38) {
-				dy = -1;
-			} else if (keyCode == 39) {
-				dx = 1;
-			} else if (keyCode == 40) {
-				dy = 1;
-			}
-
-			graph.moveCells(graph.getSelectionCells(), dx, dy);
-			graph.scrollCellToVisible(graph.getSelectionCell());
-		}
-	};
-
-	// Binds keystrokes to actions
-	var bindAction = mxUtils.bind(this, function(code, control, key, shift) {
-		var action = this.actions.get(key);
-
-		if (action != null) {
-			var f = function() {
-				if (action.enabled) {
-					action.funct();
-				}
-			};
-
-			if (control) {
-				if (shift) {
-					keyHandler.bindControlShiftKey(code, f);
-				} else {
-					keyHandler.bindControlKey(code, f);
-				}
-			} else {
-				if (shift) {
-					keyHandler.bindShiftKey(code, f);
-				} else {
-					keyHandler.bindKey(code, f);
-				}
-			}
-		}
-	});
-
-	var ui = this;
-	var keyHandleEscape = keyHandler.escape;
-	keyHandler.escape = function(evt) {
-		ui.hideDialog();
-		keyHandleEscape.apply(this, arguments);
-	};
-
-	// Ignores enter keystroke. Remove this line if you want the
-	// enter keystroke to stop editing.
-	keyHandler.enter = function() {};
-	keyHandler.bindKey(8, function() {
-		graph.foldCells(true);
-	}); // Backspace
-	keyHandler.bindKey(13, function() {
-		graph.foldCells(false);
-	}); // Enter
-	keyHandler.bindKey(33, function() {
-		graph.exitGroup();
-	}); // Page Up
-	keyHandler.bindKey(34, function() {
-		graph.enterGroup();
-	}); // Page Down
-	keyHandler.bindKey(36, function() {
-		graph.home();
-	}); // Home
-	keyHandler.bindKey(35, function() {
-		graph.refresh();
-	}); // End
-	keyHandler.bindKey(37, function() {
-		nudge(37);
-	}); // Left arrow
-	keyHandler.bindKey(38, function() {
-		nudge(38);
-	}); // Up arrow
-	keyHandler.bindKey(39, function() {
-		nudge(39);
-	}); // Right arrow
-	keyHandler.bindKey(40, function() {
-		nudge(40);
-	}); // Down arrow
-	keyHandler.bindKey(113, function() {
-		graph.startEditingAtCell();
-	});
-	bindAction(46, false, 'delete'); // Delete
-	bindAction(82, true, 'tilt'); // Ctrl+R
-	bindAction(83, true, 'save'); // Ctrl+S
-	bindAction(83, true, 'saveAs', true); // Ctrl+Shift+S
-	bindAction(107, false, 'zoomIn'); // Add
-	bindAction(109, false, 'zoomOut'); // Subtract
-	bindAction(65, true, 'selectAll'); // Ctrl+A
-	bindAction(86, true, 'selectVertices', true); // Ctrl+Shift+V
-	bindAction(69, true, 'selectEdges', true); // Ctrl+Shift+E
-	bindAction(69, true, 'export'); // Ctrl+Shift+E
-	bindAction(66, true, 'toBack'); // Ctrl+B
-	bindAction(70, true, 'toFront'); // Ctrl+F
-	bindAction(68, true, 'duplicate'); // Ctrl+D
-	bindAction(90, true, 'undo'); // Ctrl+Z
-	bindAction(89, true, 'redo'); // Ctrl+Y
-	bindAction(88, true, 'cut'); // Ctrl+X
-	bindAction(67, true, 'copy'); // Ctrl+C
-	bindAction(81, true, 'connect'); // Ctrl+Q
-	bindAction(86, true, 'paste'); // Ctrl+V
-	bindAction(71, true, 'group'); // Ctrl+G
-	bindAction(71, true, 'grid', true); // Ctrl+Shift+G
-	bindAction(85, true, 'ungroup'); // Ctrl+U
-	bindAction(112, false, 'about'); // F1
-	bindAction(80, true, 'publish', true); // Ctrl+Shift+P
-
-	return keyHandler;
-};
-
-/**
- * Giuseppe Careri
- * Creates a new toolbar for the given container.
- */
-EditorUi.prototype.createMultiplicities = function(graph, cells, source,
-	target) {
-	for (var i = 0; i < cells.length; i++) {
-		graph.push(new mxMultiplicity(true, cells[i], null, null, source[i][0],
-			source[i][1], null, mxResources.get(cells[i]) + ' must have ' + source[i][0] + ' outgoing edge.', null));
-		graph.push(new mxMultiplicity(false, cells[i], null, null, target[i][0],
-			target[i][1], null, mxResources.get(cells[i]) + ' must have ' + target[i][0] + ' incoming edge.', null));
-	};
-};
\ No newline at end of file
diff --git a/public/assets/plugins/jscripty/js/Graph.js b/public/assets/plugins/jscripty/js/Graph.js
index dda2a33..dc712d5 100644
--- a/public/assets/plugins/jscripty/js/Graph.js
+++ b/public/assets/plugins/jscripty/js/Graph.js
@@ -1,644 +1 @@
-/**
- * $Id: Graph.js,v 1.14 2013-02-16 10:19:54 gaudenz Exp $
- * Copyright (c) 2006-2012, JGraph Ltd
- */
-/**
- * Constructs a new graph instance. Note that the constructor does not take a
- * container because the graph instance is needed for creating the UI, which
- * in turn will create the container for the graph. Hence, the container is
- * assigned later in EditorUi.
- */
-Graph = function(container, model, renderHint, stylesheet) {
-	mxGraph.call(this, container, model, renderHint, stylesheet);
-
-	this.setConnectable(true);
-	this.setDropEnabled(false);
-	this.setPanning(true);
-	this.setTooltips(!mxClient.IS_TOUCH);
-	this.setAllowLoops(false);
-	this.setMultigraph(false);
-	this.allowAutoPanning = true;
-	this.resetEdgesOnConnect = false;
-	this.constrainChildren = false;
-
-	// Centers the port icon on the target port
-	this.connectionHandler.targetConnectImage = true;
-
-	// Does not allow dangling edges
-	this.setAllowDanglingEdges(false);
-
-	// Enables cloning of connection sources
-	this.connectionHandler.setCreateTarget(false);
-
-	// Disables built-in connection starts
-	this.connectionHandler.isValidSource = function() {
-		return mxConnectionHandler.prototype.isValidSource.apply(this, arguments) && urlParams['connect'] != '2';
-	};
-
-	// Sets the style to be used when an elbow edge is double clicked
-	this.alternateEdgeStyle = 'vertical';
-
-	if (stylesheet == null) {
-		this.loadStylesheet();
-	}
-
-	// Creates rubberband selection
-	var rubberband = new mxRubberband(this);
-
-	this.getRubberband = function() {
-		return rubberband;
-	};
-
-	// Shows hand cursor while panning
-	this.panningHandler.addListener(mxEvent.PAN_START, mxUtils.bind(this, function() {
-		this.container.style.cursor = 'pointer';
-	}));
-
-	this.panningHandler.addListener(mxEvent.PAN_END, mxUtils.bind(this, function() {
-		this.container.style.cursor = 'default';
-	}));
-
-	// Adds support for HTML labels via style. Note: Currently, only the Java
-	// backend supports HTML labels but CSS support is limited to the following:
-	// http://docs.oracle.com/javase/6/docs/api/index.html?javax/swing/text/html/CSS.html
-	this.isHtmlLabel = function(cell) {
-		var state = this.view.getState(cell);
-		var style = (state != null) ? state.style : this.getCellStyle(cell);
-
-		return style['html'] == '1' || style['whiteSpace'] == 'wrap';
-	};
-
-	// HTML entities are displayed as plain text in wrapped plain text labels
-	this.cellRenderer.getLabelValue = function(state) {
-		var result = mxCellRenderer.prototype.getLabelValue.apply(this, arguments);
-
-		if (state.style['whiteSpace'] == 'wrap' && state.style['html'] != 1) {
-			result = mxUtils.htmlEntities(result, false);
-		}
-
-		return result;
-	};
-
-	// Unlocks all cells
-	this.isCellLocked = function(cell) {
-		return false;
-	};
-
-	// Tap and hold brings up context menu.
-	// Tolerance slightly below graph tolerance is better.
-	this.connectionHandler.tapAndHoldTolerance = 16;
-
-	//  Tap and hold on background starts rubberband on cell starts connecting
-	var connectionHandlerTapAndHold = this.connectionHandler.tapAndHold;
-	this.connectionHandler.tapAndHold = function(me, state) {
-		if (state == null) {
-			if (!this.graph.panningHandler.active) {
-				rubberband.start(me.getGraphX(), me.getGraphY());
-				this.graph.panningHandler.panningTrigger = false;
-			}
-		} else if (tapAndHoldStartsConnection) {
-			connectionHandlerTapAndHold.apply(this, arguments);
-		} else if (this.graph.isCellSelected(state.cell) && this.graph.getSelectionCount() > 1) {
-			this.graph.removeSelectionCell(state.cell);
-		}
-	};
-
-	if (touchStyle) {
-		this.initTouch();
-	}
-};
-
-// Graph inherits from mxGraph
-mxUtils.extend(Graph, mxGraph);
-
-/**
- * Allows to all values in fit.
- */
-Graph.prototype.minFitScale = null;
-
-/**
- * Allows to all values in fit.
- */
-Graph.prototype.maxFitScale = null;
-
-/**
- * Loads the stylesheet for this graph.
- */
-Graph.prototype.loadStylesheet = function() {
-	var node = mxUtils.load(STYLE_PATH + '/default.xml').getDocumentElement();
-	var dec = new mxCodec(node.ownerDocument);
-	dec.decode(node, this.getStylesheet());
-};
-
-/**
- * Inverts the elbow edge style without removing existing styles.
- */
-Graph.prototype.flipEdge = function(edge) {
-	if (edge != null) {
-		var state = this.view.getState(edge);
-		var style = (state != null) ? state.style : this.getCellStyle(edge);
-
-		if (style != null) {
-			var elbow = mxUtils.getValue(style, mxConstants.STYLE_ELBOW,
-				mxConstants.ELBOW_HORIZONTAL);
-			var value = (elbow == mxConstants.ELBOW_HORIZONTAL) ?
-				mxConstants.ELBOW_VERTICAL : mxConstants.ELBOW_HORIZONTAL;
-			this.setCellStyles(mxConstants.STYLE_ELBOW, value, [edge]);
-		}
-	}
-};
-
-/**
- * Sets the default edge for future connections.
- */
-Graph.prototype.setDefaultEdge = function(cell) {
-	if (cell != null && this.getModel().isEdge(cell)) {
-		// Take a snapshot of the cell at the moment of calling
-		var proto = this.getModel().cloneCells([cell])[0];
-
-		// Delete existing points
-		if (proto.geometry != null) {
-			proto.geometry.points = null;
-		}
-
-		// Delete entry-/exitXY styles
-		var style = proto.getStyle();
-		style = mxUtils.setStyle(style, mxConstants.STYLE_ENTRY_X, null);
-		style = mxUtils.setStyle(style, mxConstants.STYLE_ENTRY_Y, null);
-		style = mxUtils.setStyle(style, mxConstants.STYLE_EXIT_X, null);
-		style = mxUtils.setStyle(style, mxConstants.STYLE_EXIT_Y, null);
-		proto.setStyle(style);
-
-		// Uses edge template for connect preview
-		this.connectionHandler.createEdgeState = function(me) {
-			return this.graph.view.createState(proto);
-		};
-
-		// Creates new connections from edge template
-		this.connectionHandler.factoryMethod = function() {
-			return this.graph.cloneCells([proto])[0];
-		};
-	}
-};
-
-/**
- * Disables folding for non-swimlanes.
- */
-Graph.prototype.isCellFoldable = function(cell) {
-	return this.foldingEnabled && this.isSwimlane(cell);
-};
-
-/**
- * Disables drill-down for non-swimlanes.
- */
-Graph.prototype.isValidRoot = function(cell) {
-	return this.isSwimlane(cell);
-};
-
-/**
- * Overrides createGroupCell to set the group style for new groups to 'group'.
- */
-Graph.prototype.createGroupCell = function() {
-	var group = mxGraph.prototype.createGroupCell.apply(this, arguments);
-	group.setStyle('group');
-
-	return group;
-};
-
-/**
- * Giuseppe Careri
- * Overrides tooltips to show position and size
- */
-Graph.prototype.getTooltipForCell = function(cell) {
-	var tip = '';
-
-	if (this.getModel().isVertex(cell)) {
-		// var geo = this.getCellGeometry(cell);
-
-		// var f2 = function(x)
-		// {
-		// 	return Math.round(parseFloat(x) * 100) / 100;
-		// };
-
-		// if (geo != null)
-		// {
-		// 	if (tip == null)
-		// 	{
-		// 		tip = '';
-		// 	}
-		// 	else if (tip.length > 0)
-		// 	{
-		// 		tip += '\n';
-		// 	}
-
-		// 	tip += 'X: ' + f2(geo.x) + '\nY: ' + f2(geo.y) + '\nW: ' + f2(geo.width) + '\nH: ' + f2(geo.height);
-		// }
-
-		tip += mxResources.get('description_' + cell.value.nodeName) || '';
-	} else if (this.getModel().isEdge(cell)) {
-		tip = mxGraph.prototype.getTooltipForCell.apply(this, arguments);
-	}
-
-	return tip;
-};
-
-/**
- * Giuseppe Careri
- * Returns the label for the given cell.
- */
-Graph.prototype.convertValueToString = function(cell) {
-	if (cell.value != null && typeof(cell.value) == 'object') {
-		return cell.value.getAttribute('label');
-	}
-
-	return mxGraph.prototype.convertValueToString.apply(this, arguments);
-};
-
-/**
- * Giuseppe Careri
- * Handles label changes for XML user objects.
- */
-Graph.prototype.cellLabelChanged = function(cell, value, autoSize) {
-	if (cell.value != null && typeof(cell.value) == 'object') {
-		var tmp = cell.value.cloneNode(true);
-		tmp.setAttribute('label', value);
-		value = tmp;
-	}
-
-	mxGraph.prototype.cellLabelChanged.apply(this, arguments);
-};
-
-/**
- * Sets the link for the given cell.
- */
-Graph.prototype.setLinkForCell = function(cell, link) {
-	var value = null;
-
-	if (cell.value != null && typeof(cell.value) == 'object') {
-		value = cell.value.cloneNode(true);
-	} else {
-		var doc = mxUtils.createXmlDocument();
-
-		value = doc.createElement('UserObject');
-		value.setAttribute('label', cell.value);
-	}
-
-	if (link != null && link.length > 0) {
-		value.setAttribute('link', link);
-	} else {
-		value.removeAttribute('link');
-	}
-
-	this.model.setValue(cell, value);
-};
-
-/**
- * Returns the link for the given cell.
- */
-Graph.prototype.getLinkForCell = function(cell) {
-	if (cell.value != null && typeof(cell.value) == 'object') {
-		return cell.value.getAttribute('link');
-	}
-
-	return null;
-};
-
-/**
- * Customized graph for touch devices.
- */
-Graph.prototype.initTouch = function() {
-	// Disables new connections via "hotspot"
-	this.connectionHandler.marker.isEnabled = function() {
-		return this.graph.connectionHandler.first != null;
-	};
-
-	// Hides menu when editing starts
-	this.addListener(mxEvent.START_EDITING, function(sender, evt) {
-		this.panningHandler.hideMenu();
-	});
-
-	// Context menu for touchstyle
-	var showMenu = false;
-	var menuCell = null;
-
-	// Checks if native hit detection did not return anything and does custom
-	// hit detection for edges to take into account the tolerance
-	this.updateMouseEvent = function(me) {
-		mxGraph.prototype.updateMouseEvent.apply(this, arguments);
-
-		if (me.getState() == null) {
-			var cell = this.getCellAt(me.graphX, me.graphY);
-
-			if (this.getModel().isEdge(cell)) {
-				me.state = this.view.getState(cell);
-
-				if (me.state != null && me.state.shape != null) {
-					this.container.style.cursor = me.state.shape.node.style.cursor;
-				}
-			}
-		}
-
-		if (me.getState() == null) {
-			this.container.style.cursor = 'default';
-		}
-	};
-
-	// Handles popup menu on touch devices (tap selected cell)
-	this.fireMouseEvent = function(evtName, me, sender) {
-		if (evtName == mxEvent.MOUSE_DOWN) {
-			if (!this.panningHandler.isMenuShowing()) {
-				menuCell = me.getCell();
-				showMenu = (menuCell != null) ? this.isCellSelected(menuCell) : this.isSelectionEmpty();
-			} else {
-				showMenu = false;
-				menuCell = null;
-			}
-		} else if (evtName == mxEvent.MOUSE_UP) {
-			if (showMenu && !this.isEditing()) {
-				if (!this.panningHandler.isMenuShowing()) {
-					var x = mxEvent.getClientX(me.getEvent());
-					var y = mxEvent.getClientY(me.getEvent());
-
-					this.panningHandler.popup(x + 16, y, menuCell, me.getEvent());
-				}
-
-				showMenu = false;
-				menuCell = null;
-				me.consume();
-
-				return;
-			}
-
-			showMenu = false;
-			menuCell = null;
-		}
-
-		mxGraph.prototype.fireMouseEvent.apply(this, arguments);
-
-		if (evtName == mxEvent.MOUSE_MOVE && me.isConsumed()) {
-			showMenu = false;
-			menuCell = null;
-		}
-	};
-};
-
-/**
- * Implements touch devices.
- */
-(function() {
-	// Enables rotation handle
-	mxVertexHandler.prototype.rotationEnabled = true;
-
-	// Matches label positions of mxGraph 1.x
-	mxText.prototype.baseSpacingTop = 5;
-	mxText.prototype.baseSpacingBottom = 1;
-
-	// Touch-specific static overrides
-	if (touchStyle) {
-		// Sets constants for touch style
-		mxConstants.HANDLE_SIZE = 16;
-		mxConstants.LABEL_HANDLE_SIZE = 7;
-
-		// Larger tolerance and grid for real touch devices
-		if (mxClient.IS_TOUCH) {
-			mxVertexHandler.prototype.tolerance = 4;
-			mxEdgeHandler.prototype.tolerance = 6;
-			Graph.prototype.tolerance = 14;
-			Graph.prototype.gridSize = 20;
-
-			// One finger pans (no rubberband selection) must start regardless of mouse button
-			mxPanningHandler.prototype.selectOnPopup = false;
-			mxPanningHandler.prototype.useLeftButtonForPanning = true;
-			mxPanningHandler.prototype.isPanningTrigger = function(me) {
-				var evt = me.getEvent();
-
-				return (this.useLeftButtonForPanning && (this.ignoreCell || me.getState() == null)
-					/* &&
-								 			mxEvent.isLeftMouseButton(evt)*/
-				) || (mxEvent.isControlDown(evt) &&
-					mxEvent.isShiftDown(evt)) || (this.usePopupTrigger &&
-					mxEvent.isPopupTrigger(evt));
-			};
-		}
-
-		// Don't clear selection if multiple cells selected
-		var graphHandlerMouseDown = mxGraphHandler.prototype.mouseDown;
-		mxGraphHandler.prototype.mouseDown = function(sender, me) {
-			graphHandlerMouseDown.apply(this, arguments);
-
-			if (this.graph.isCellSelected(me.getCell()) && this.graph.getSelectionCount() > 1) {
-				this.delayedSelection = false;
-			}
-		};
-
-		// Changes order of panninghandler
-		Graph.prototype.createHandlers = function(container) {
-			this.tooltipHandler = new mxTooltipHandler(this);
-			this.tooltipHandler.setEnabled(false);
-			// Selection cells first
-			this.selectionCellsHandler = new mxSelectionCellsHandler(this);
-			this.panningHandler = new mxPanningHandler(this);
-			this.panningHandler.panningEnabled = false;
-			this.connectionHandler = new mxConnectionHandler(this);
-			this.connectionHandler.setEnabled(false);
-			this.graphHandler = new mxGraphHandler(this);
-		};
-
-		// On connect the target is selected and we clone the cell of the preview edge for insert
-		mxConnectionHandler.prototype.selectCells = function(edge, target) {
-			if (touchStyle && target != null) {
-				this.graph.setSelectionCell(target);
-			} else {
-				this.graph.setSelectionCell(edge);
-			}
-		};
-
-		// Overrides double click handling to use the tolerance
-		// FIXME: Double click on edges in iPad needs focus on textarea
-		var graphDblClick = mxGraph.prototype.dblClick;
-		Graph.prototype.dblClick = function(evt, cell) {
-			if (cell == null) {
-				var pt = mxUtils.convertPoint(this.container,
-					mxEvent.getClientX(evt), mxEvent.getClientY(evt));
-				cell = this.getCellAt(pt.x, pt.y);
-			}
-
-			graphDblClick.call(this, evt, cell);
-		};
-
-		// Rounded edge and vertex handles
-		var touchHandle = new mxImage(IMAGE_PATH + '/touch-handle.png', 16, 16);
-		mxVertexHandler.prototype.handleImage = touchHandle;
-		mxEdgeHandler.prototype.handleImage = touchHandle;
-		mxOutline.prototype.sizerImage = touchHandle;
-
-		// Pre-fetches touch handle
-		new Image().src = touchHandle.src;
-
-		// Adds connect icon to selected vertices
-		var connectorSrc = IMAGE_PATH + '/touch-connector.png';
-
-		var vertexHandlerInit = mxVertexHandler.prototype.init;
-		mxVertexHandler.prototype.init = function() {
-			vertexHandlerInit.apply(this, arguments);
-
-			// Only show connector image on one cell and do not show on containers
-			if (showConnectorImg && this.graph.connectionHandler.isEnabled() &&
-				this.graph.isCellConnectable(this.state.cell) &&
-				!this.graph.isValidRoot(this.state.cell) &&
-				this.graph.getSelectionCount() == 1) {
-				this.connectorImg = mxUtils.createImage(connectorSrc);
-				this.connectorImg.style.cursor = 'pointer';
-				this.connectorImg.style.width = '29px';
-				this.connectorImg.style.height = '29px';
-				this.connectorImg.style.position = 'absolute';
-
-				if (!mxClient.IS_TOUCH) {
-					this.connectorImg.setAttribute('title', mxResources.get('connect'));
-					mxEvent.redirectMouseEvents(this.connectorImg, this.graph, this.state);
-				}
-
-				// Adds 2px tolerance
-				this.connectorImg.style.padding = '2px';
-
-				// Starts connecting on touch/mouse down
-				mxEvent.addGestureListeners(this.connectorImg,
-					mxUtils.bind(this, function(evt) {
-						this.graph.panningHandler.hideMenu();
-						var pt = mxUtils.convertPoint(this.graph.container,
-							mxEvent.getClientX(evt), mxEvent.getClientY(evt));
-						this.graph.connectionHandler.start(this.state, pt.x, pt.y);
-						this.graph.isMouseDown = true;
-						mxEvent.consume(evt);
-					})
-				);
-
-				this.graph.container.appendChild(this.connectorImg);
-			}
-
-			this.redrawTools();
-		};
-
-		var vertexHandlerRedraw = mxVertexHandler.prototype.redraw;
-		mxVertexHandler.prototype.redraw = function() {
-			vertexHandlerRedraw.apply(this);
-			this.redrawTools();
-		};
-
-		mxVertexHandler.prototype.redrawTools = function() {
-			if (this.state != null && this.connectorImg != null) {
-				// Top right for single-sizer
-				if (mxVertexHandler.prototype.singleSizer) {
-					this.connectorImg.style.left = (this.state.x + this.state.width - this.connectorImg.offsetWidth / 2) + 'px';
-					this.connectorImg.style.top = (this.state.y - this.connectorImg.offsetHeight / 2) + 'px';
-				} else {
-					this.connectorImg.style.left = (this.state.x + this.state.width + mxConstants.HANDLE_SIZE / 2 + 4 /* - 2 padding*/ ) + 'px';
-					this.connectorImg.style.top = (this.state.y + (this.state.height - this.connectorImg.offsetHeight) / 2) + 'px';
-				}
-			}
-		};
-
-		var vertexHandlerDestroy = mxVertexHandler.prototype.destroy;
-		mxVertexHandler.prototype.destroy = function(sender, me) {
-			vertexHandlerDestroy.apply(this, arguments);
-
-			if (this.connectorImg != null) {
-				this.connectorImg.parentNode.removeChild(this.connectorImg);
-				this.connectorImg = null;
-			}
-		};
-
-		// Pre-fetches touch connector
-		new Image().src = connectorSrc;
-	} else {
-		var img = new mxImage(IMAGE_PATH + '/connector.png', 15, 15);
-		mxConnectionHandler.prototype.connectImage = img;
-
-		// Pre-fetches img
-		new Image().src = img.src;
-
-		if (urlParams['connect'] == '2') // not touchStyle
-		{
-			var img = new mxImage(IMAGE_PATH + '/connector.png', 15, 15);
-
-			var vertexHandlerInit = mxVertexHandler.prototype.init;
-			mxVertexHandler.prototype.init = function() {
-				vertexHandlerInit.apply(this, arguments);
-
-				// Only show connector image on one cell and do not show on containers
-				if (showConnectorImg && this.graph.connectionHandler.isEnabled() &&
-					this.graph.isCellConnectable(this.state.cell) &&
-					!this.graph.isValidRoot(this.state.cell) &&
-					this.graph.getSelectionCount() == 1) {
-					// Workaround for event redirection via image tag in quirks and IE8
-					if (mxClient.IS_IE && !mxClient.IS_SVG) {
-						this.connectorImg = document.createElement('div');
-						this.connectorImg.style.backgroundImage = 'url(' + img.src + ')';
-						this.connectorImg.style.backgroundPosition = 'center';
-						this.connectorImg.style.backgroundRepeat = 'no-repeat';
-						this.connectorImg.style.width = (img.width + 4) + 'px';
-						this.connectorImg.style.height = (img.height + 4) + 'px';
-						this.connectorImg.style.display = (mxClient.IS_QUIRKS) ? 'inline' : 'inline-block';
-					} else {
-						this.connectorImg = mxUtils.createImage(img.src);
-						this.connectorImg.style.width = img.width + 'px';
-						this.connectorImg.style.height = img.height + 'px';
-					}
-
-					this.connectorImg.style.cursor = 'pointer';
-					this.connectorImg.style.position = 'absolute';
-					this.connectorImg.setAttribute('title', mxResources.get('connect'));
-					mxEvent.redirectMouseEvents(this.connectorImg, this.graph, this.state);
-
-					// Adds 2px tolerance
-					this.connectorImg.style.padding = '2px';
-
-					// Starts connecting on touch/mouse down
-					mxEvent.addListener(this.connectorImg, 'mousedown',
-						mxUtils.bind(this, function(evt) {
-							this.graph.panningHandler.hideMenu();
-							var pt = mxUtils.convertPoint(this.graph.container,
-								mxEvent.getClientX(evt), mxEvent.getClientY(evt));
-							this.graph.connectionHandler.start(this.state, pt.x, pt.y);
-							this.graph.isMouseDown = true;
-							mxEvent.consume(evt);
-						})
-					);
-
-					this.graph.container.appendChild(this.connectorImg);
-				}
-
-				this.redrawTools();
-			};
-
-			var vertexHandlerRedraw = mxVertexHandler.prototype.redraw;
-			mxVertexHandler.prototype.redraw = function() {
-				vertexHandlerRedraw.apply(this);
-				this.redrawTools();
-			};
-
-			mxVertexHandler.prototype.redrawTools = function() {
-				if (this.state != null && this.connectorImg != null) {
-					// Top right for single-sizer
-					if (mxVertexHandler.prototype.singleSizer) {
-						this.connectorImg.style.left = (this.state.x + this.state.width - this.connectorImg.offsetWidth / 2) + 'px';
-						this.connectorImg.style.top = (this.state.y - this.connectorImg.offsetHeight / 2) + 'px';
-					} else {
-						this.connectorImg.style.left = (this.state.x + this.state.width + mxConstants.HANDLE_SIZE / 2 + 2 /* - 2 padding*/ ) + 'px';
-						this.connectorImg.style.top = (this.state.y + (this.state.height - this.connectorImg.offsetHeight) / 2) + 'px';
-					}
-				}
-			};
-
-			var vertexHandlerDestroy = mxVertexHandler.prototype.destroy;
-			mxVertexHandler.prototype.destroy = function(sender, me) {
-				vertexHandlerDestroy.apply(this, arguments);
-
-				if (this.connectorImg != null) {
-					this.connectorImg.parentNode.removeChild(this.connectorImg);
-					this.connectorImg = null;
-				}
-			};
-		}
-	}
-})();
\ No newline at end of file
diff --git a/public/assets/plugins/jscripty/js/Menus.js b/public/assets/plugins/jscripty/js/Menus.js
index 7d33b9e..0b54306 100644
--- a/public/assets/plugins/jscripty/js/Menus.js
+++ b/public/assets/plugins/jscripty/js/Menus.js
@@ -1,716 +1 @@
-/**
- * $Id: Menus.js,v 1.13 2013-02-20 16:21:29 gaudenz Exp $
- * Copyright (c) 2006-2012, JGraph Ltd
- */
-/**
- * Constructs a new graph editor
- */
-Menus = function(editorUi) {
-	this.editorUi = editorUi;
-	this.menus = new Object();
-	this.init();
-
-	// Pre-fetches checkmark image
-	new Image().src = IMAGE_PATH + '/checkmark.gif';
-};
-
-/**
- * Adds the label menu items to the given menu and parent.
- */
-Menus.prototype.init = function() {
-	var graph = this.editorUi.editor.graph;
-
-	this.put('fontFamily', new Menu(mxUtils.bind(this, function(menu, parent) {
-		var fonts = ['Helvetica', 'Verdana', 'Times New Roman', 'Garamond',
-			'Comic Sans MS',
-			'Courier New', 'Georgia', 'Lucida Console', 'Tahoma'
-		];
-
-		for (var i = 0; i < fonts.length; i++) {
-			var tr = this.styleChange(menu, fonts[i], [mxConstants.STYLE_FONTFAMILY], [
-				fonts[i]
-			], null, parent);
-			tr.firstChild.nextSibling.style.fontFamily = fonts[i];
-		}
-
-		menu.addSeparator(parent);
-		this.promptChange(menu, mxResources.get('custom'), '', mxConstants.DEFAULT_FONTFAMILY,
-			mxConstants.STYLE_FONTFAMILY, parent);
-	})));
-	this.put('fontSize', new Menu(mxUtils.bind(this, function(menu, parent) {
-		var sizes = [6, 8, 9, 10, 11, 12, 14, 18, 24, 36, 48, 72];
-
-		for (var i = 0; i < sizes.length; i++) {
-			this.styleChange(menu, sizes[i], [mxConstants.STYLE_FONTSIZE], [sizes[i]],
-				null, parent);
-		}
-
-		menu.addSeparator(parent);
-		this.promptChange(menu, mxResources.get('custom'), '(pt)', '12',
-			mxConstants.STYLE_FONTSIZE, parent);
-	})));
-	this.put('linewidth', new Menu(mxUtils.bind(this, function(menu, parent) {
-		var sizes = [1, 2, 3, 4, 8, 12, 16, 24];
-
-		for (var i = 0; i < sizes.length; i++) {
-			this.styleChange(menu, sizes[i] + 'px', [mxConstants.STYLE_STROKEWIDTH], [
-				sizes[i]
-			], null, parent);
-		}
-
-		menu.addSeparator(parent);
-		this.promptChange(menu, mxResources.get('custom'), '(px)', '1',
-			mxConstants.STYLE_STROKEWIDTH, parent);
-	})));
-	this.put('line', new Menu(mxUtils.bind(this, function(menu, parent) {
-		this.styleChange(menu, mxResources.get('straight'), [mxConstants.STYLE_EDGE], [
-			null
-		], null, parent);
-		this.styleChange(menu, mxResources.get('entityRelation'), [mxConstants.STYLE_EDGE], [
-			'entityRelationEdgeStyle'
-		], null, parent);
-		menu.addSeparator(parent);
-		this.styleChange(menu, mxResources.get('horizontal'), [mxConstants.STYLE_EDGE,
-			mxConstants.STYLE_ELBOW
-		], ['elbowEdgeStyle', 'horizontal'], null, parent);
-		this.styleChange(menu, mxResources.get('vertical'), [mxConstants.STYLE_EDGE,
-			mxConstants.STYLE_ELBOW
-		], ['elbowEdgeStyle', 'vertical'], null, parent);
-		menu.addSeparator(parent);
-		this.styleChange(menu, mxResources.get('manual'), [mxConstants.STYLE_EDGE], [
-			'segmentEdgeStyle'
-		], null, parent);
-		this.styleChange(menu, mxResources.get('automatic'), [mxConstants.STYLE_EDGE], [
-			'orthogonalEdgeStyle'
-		], null, parent);
-	})));
-	this.put('lineend', new Menu(mxUtils.bind(this, function(menu, parent) {
-		this.styleChange(menu, mxResources.get('classic'), [mxConstants.STYLE_ENDARROW], [
-			mxConstants.ARROW_CLASSIC
-		], null, parent);
-		this.styleChange(menu, mxResources.get('openArrow'), [mxConstants.STYLE_ENDARROW], [
-			mxConstants.ARROW_OPEN
-		], null, parent);
-		this.styleChange(menu, mxResources.get('block'), [mxConstants.STYLE_ENDARROW], [
-			mxConstants.ARROW_BLOCK
-		], null, parent);
-		menu.addSeparator(parent);
-		this.styleChange(menu, mxResources.get('oval'), [mxConstants.STYLE_ENDARROW], [
-			mxConstants.ARROW_OVAL
-		], null, parent);
-		this.styleChange(menu, mxResources.get('diamond'), [mxConstants.STYLE_ENDARROW], [
-			mxConstants.ARROW_DIAMOND
-		], null, parent);
-		this.styleChange(menu, mxResources.get('diamondThin'), [mxConstants.STYLE_ENDARROW], [
-			mxConstants.ARROW_DIAMOND_THIN
-		], null, parent);
-		menu.addSeparator(parent);
-		this.styleChange(menu, mxResources.get('none'), [mxConstants.STYLE_ENDARROW], [
-			mxConstants.NONE
-		], null, parent);
-		menu.addSeparator(parent);
-		menu.addItem(mxResources.get('transparent'), null, function() {
-			graph.toggleCellStyles('endFill', true);
-		}, parent, null, true);
-		menu.addSeparator(parent);
-		this.promptChange(menu, mxResources.get('size'), '(px)', mxConstants.DEFAULT_MARKERSIZE,
-			mxConstants.STYLE_ENDSIZE, parent);
-	})));
-	this.put('linestart', new Menu(mxUtils.bind(this, function(menu, parent) {
-		this.styleChange(menu, mxResources.get('classic'), [mxConstants.STYLE_STARTARROW], [
-			mxConstants.ARROW_CLASSIC
-		], null, parent);
-		this.styleChange(menu, mxResources.get('openArrow'), [mxConstants.STYLE_STARTARROW], [
-			mxConstants.ARROW_OPEN
-		], null, parent);
-		this.styleChange(menu, mxResources.get('block'), [mxConstants.STYLE_STARTARROW], [
-			mxConstants.ARROW_BLOCK
-		], null, parent);
-		menu.addSeparator(parent);
-		this.styleChange(menu, mxResources.get('oval'), [mxConstants.STYLE_STARTARROW], [
-			mxConstants.ARROW_OVAL
-		], null, parent);
-		this.styleChange(menu, mxResources.get('diamond'), [mxConstants.STYLE_STARTARROW], [
-			mxConstants.ARROW_DIAMOND
-		], null, parent);
-		this.styleChange(menu, mxResources.get('diamondThin'), [mxConstants.STYLE_STARTARROW], [
-			mxConstants.ARROW_DIAMOND_THIN
-		], null, parent);
-		menu.addSeparator(parent);
-		this.styleChange(menu, mxResources.get('none'), [mxConstants.STYLE_STARTARROW], [
-			mxConstants.NONE
-		], null, parent);
-		menu.addSeparator(parent);
-		menu.addItem(mxResources.get('transparent'), null, function() {
-			graph.toggleCellStyles('startFill', true);
-		}, parent, null, true);
-		menu.addSeparator(parent);
-		this.promptChange(menu, mxResources.get('size'), '(px)', mxConstants.DEFAULT_MARKERSIZE,
-			mxConstants.STYLE_STARTSIZE, parent);
-	})));
-	this.put('spacing', new Menu(mxUtils.bind(this, function(menu, parent) {
-		// Uses shadow action and line menu to analyze selection
-		var vertexSelected = this.editorUi.actions.get('shadow').enabled;
-		var edgeSelected = this.get('line').enabled;
-
-		if (vertexSelected || menu.showDisabled) {
-			this.promptChange(menu, mxResources.get('top'), '(px)', '0',
-				mxConstants.STYLE_SPACING_TOP, parent, vertexSelected);
-			this.promptChange(menu, mxResources.get('right'), '(px)', '0',
-				mxConstants.STYLE_SPACING_RIGHT, parent, vertexSelected);
-			this.promptChange(menu, mxResources.get('bottom'), '(px)', '0',
-				mxConstants.STYLE_SPACING_BOTTOM, parent, vertexSelected);
-			this.promptChange(menu, mxResources.get('left'), '(px)', '0',
-				mxConstants.STYLE_SPACING_LEFT, parent, vertexSelected);
-			menu.addSeparator(parent);
-			this.promptChange(menu, mxResources.get('global'), '(px)', '0',
-				mxConstants.STYLE_SPACING, parent, vertexSelected);
-			this.promptChange(menu, mxResources.get('perimeter'), '(px)', '0',
-				mxConstants.STYLE_PERIMETER_SPACING, parent, vertexSelected);
-		}
-
-		if (edgeSelected || menu.showDisabled) {
-			menu.addSeparator(parent);
-			this.promptChange(menu, mxResources.get('sourceSpacing'), '(px)', '0',
-				mxConstants.STYLE_SOURCE_PERIMETER_SPACING, parent, edgeSelected);
-			this.promptChange(menu, mxResources.get('targetSpacing'), '(px)', '0',
-				mxConstants.STYLE_TARGET_PERIMETER_SPACING, parent, edgeSelected);
-		}
-	})));
-	this.put('format', new Menu(mxUtils.bind(this, function(menu, parent) {
-		this.addMenuItem(menu, 'style', parent);
-	})));
-	this.put('text', new Menu(mxUtils.bind(this, function(menu, parent) {
-		var enabled = this.get('text').enabled;
-		menu.addSeparator(parent);
-		this.addSubmenu('fontFamily', menu, parent);
-		this.addSubmenu('fontSize', menu, parent);
-		this.addMenuItems(menu, ['-', 'bold', 'italic', 'underline', '-'],
-			parent);
-		this.addSubmenu('alignment', menu, parent);
-		this.addMenuItem(menu, 'wordWrap', parent);
-		menu.addSeparator(parent);
-		this.promptChange(menu, mxResources.get('textOpacity'), '(%)', '100',
-			mxConstants.STYLE_TEXT_OPACITY, parent, enabled);
-		menu.addItem(mxResources.get('hide'), null, function() {
-			graph.toggleCellStyles(mxConstants.STYLE_NOLABEL, false);
-		}, parent, null, enabled);
-	})));
-	this.put('alignment', new Menu(mxUtils.bind(this, function(menu, parent) {
-		this.styleChange(menu, mxResources.get('leftAlign'), [mxConstants.STYLE_ALIGN], [
-			mxConstants.ALIGN_LEFT
-		], null, parent);
-		this.styleChange(menu, mxResources.get('center'), [mxConstants.STYLE_ALIGN], [
-			mxConstants.ALIGN_CENTER
-		], null, parent);
-		this.styleChange(menu, mxResources.get('rightAlign'), [mxConstants.STYLE_ALIGN], [
-			mxConstants.ALIGN_RIGHT
-		], null, parent);
-		menu.addSeparator(parent);
-		this.styleChange(menu, mxResources.get('topAlign'), [mxConstants.STYLE_VERTICAL_ALIGN], [
-			mxConstants.ALIGN_TOP
-		], null, parent);
-		this.styleChange(menu, mxResources.get('middle'), [mxConstants.STYLE_VERTICAL_ALIGN], [
-			mxConstants.ALIGN_MIDDLE
-		], null, parent);
-		this.styleChange(menu, mxResources.get('bottomAlign'), [mxConstants.STYLE_VERTICAL_ALIGN], [
-			mxConstants.ALIGN_BOTTOM
-		], null, parent);
-		menu.addSeparator(parent);
-		this.addSubmenu('position', menu, parent);
-		this.addSubmenu('spacing', menu, parent);
-		menu.addSeparator(parent);
-		var enabled = this.get('text').enabled;
-		menu.addItem(mxResources.get('vertical'), null, function() {
-			graph.toggleCellStyles(mxConstants.STYLE_HORIZONTAL, true);
-		}, parent, null, enabled);
-	})));
-	this.put('position', new Menu(mxUtils.bind(this, function(menu, parent) {
-		this.styleChange(menu, mxResources.get('left'), [mxConstants.STYLE_LABEL_POSITION,
-			mxConstants.STYLE_ALIGN
-		], [mxConstants.ALIGN_LEFT, mxConstants.ALIGN_RIGHT], null, parent);
-		this.styleChange(menu, mxResources.get('center'), [mxConstants.STYLE_LABEL_POSITION,
-			mxConstants.STYLE_ALIGN
-		], [mxConstants.ALIGN_CENTER, mxConstants.ALIGN_CENTER], null, parent);
-		this.styleChange(menu, mxResources.get('right'), [mxConstants.STYLE_LABEL_POSITION,
-			mxConstants.STYLE_ALIGN
-		], [mxConstants.ALIGN_RIGHT, mxConstants.ALIGN_LEFT], null, parent);
-		menu.addSeparator(parent);
-		this.styleChange(menu, mxResources.get('top'), [mxConstants.STYLE_VERTICAL_LABEL_POSITION,
-			mxConstants.STYLE_VERTICAL_ALIGN
-		], [mxConstants.ALIGN_TOP, mxConstants.ALIGN_BOTTOM], null, parent);
-		this.styleChange(menu, mxResources.get('middle'), [mxConstants.STYLE_VERTICAL_LABEL_POSITION,
-			mxConstants.STYLE_VERTICAL_ALIGN
-		], [mxConstants.ALIGN_MIDDLE, mxConstants.ALIGN_MIDDLE], null, parent);
-		this.styleChange(menu, mxResources.get('bottom'), [mxConstants.STYLE_VERTICAL_LABEL_POSITION,
-			mxConstants.STYLE_VERTICAL_ALIGN
-		], [mxConstants.ALIGN_BOTTOM, mxConstants.ALIGN_TOP], null, parent);
-	})));
-	this.put('direction', new Menu(mxUtils.bind(this, function(menu, parent) {
-		menu.addItem(mxResources.get('flipH'), null, function() {
-			graph.toggleCellStyles(mxConstants.STYLE_FLIPH, false);
-		}, parent);
-		menu.addItem(mxResources.get('flipV'), null, function() {
-			graph.toggleCellStyles(mxConstants.STYLE_FLIPV, false);
-		}, parent);
-		this.addMenuItems(menu, ['-', 'tilt', 'rotation'], parent);
-	})));
-	this.put('align', new Menu(mxUtils.bind(this, function(menu, parent) {
-		menu.addItem(mxResources.get('leftAlign'), null, function() {
-			graph.alignCells(mxConstants.ALIGN_LEFT);
-		}, parent);
-		menu.addItem(mxResources.get('center'), null, function() {
-			graph.alignCells(mxConstants.ALIGN_CENTER);
-		}, parent);
-		menu.addItem(mxResources.get('rightAlign'), null, function() {
-			graph.alignCells(mxConstants.ALIGN_RIGHT);
-		}, parent);
-		menu.addSeparator(parent);
-		menu.addItem(mxResources.get('topAlign'), null, function() {
-			graph.alignCells(mxConstants.ALIGN_TOP);
-		}, parent);
-		menu.addItem(mxResources.get('middle'), null, function() {
-			graph.alignCells(mxConstants.ALIGN_MIDDLE);
-		}, parent);
-		menu.addItem(mxResources.get('bottomAlign'), null, function() {
-			graph.alignCells(mxConstants.ALIGN_BOTTOM);
-		}, parent);
-	})));
-	this.put('layout', new Menu(mxUtils.bind(this, function(menu, parent) {
-		// menu.addItem(mxResources.get('horizontalTree'), null, mxUtils.bind(this, function()
-		// {
-		// 	if (!graph.isSelectionEmpty())
-		// 	{
-		// 		var layout = new mxCompactTreeLayout(graph, true);
-		// 		layout.edgeRouting = false;
-		// 		layout.levelDistance = 30;
-		//    		this.editorUi.executeLayout(layout, true, true);
-		// 	}
-		// }), parent);
-		// menu.addItem(mxResources.get('verticalTree'), null, mxUtils.bind(this, function()
-		// {
-		// 	if (!graph.isSelectionEmpty())
-		// 	{
-		// 		var layout = new mxCompactTreeLayout(graph, false);
-		// 		layout.edgeRouting = false;
-		// 		layout.levelDistance = 30;
-		//    		this.editorUi.executeLayout(layout, true, true);
-		// 	}
-		// }), parent);
-		// menu.addSeparator(parent);
-		menu.addItem(mxResources.get('horizontalFlow'), null, mxUtils.bind(this,
-			function() {
-				var layout = new mxHierarchicalLayout(graph, mxConstants.DIRECTION_WEST);
-				this.editorUi.executeLayout(layout, true, true);
-			}), parent);
-		menu.addItem(mxResources.get('verticalFlow'), null, mxUtils.bind(this,
-			function() {
-				var layout = new mxHierarchicalLayout(graph, mxConstants.DIRECTION_NORTH);
-				this.editorUi.executeLayout(layout, true, true);
-			}), parent);
-		//menu.addSeparator(parent);
-		// menu.addItem(mxResources.get('organic'), null, mxUtils.bind(this, function()
-		// {
-		// 	var layout = new mxFastOrganicLayout(graph);
-		//   		this.editorUi.executeLayout(layout, true, true);
-		// }), parent);
-		// menu.addItem(mxResources.get('circle'), null, mxUtils.bind(this, function()
-		// {
-		// 	var layout = new mxCircleLayout(graph);
-		//   		this.editorUi.executeLayout(layout, true, true, graph.getSelectionCells());
-		// }), parent);
-	})));
-	this.put('navigation', new Menu(mxUtils.bind(this, function(menu, parent) {
-		this.addMenuItems(menu, ['home', '-', 'exitGroup', 'enterGroup', '-',
-			'expand', 'collapse'
-		], parent);
-	})));
-	this.put('arrange', new Menu(mxUtils.bind(this, function(menu, parent) {
-		this.addMenuItems(menu, ['toFront', 'toBack', '-'], parent);
-		//this.addSubmenu('direction', menu, parent);
-		this.addSubmenu('layout', menu, parent);
-		//this.addSubmenu('align', menu, parent);
-		menu.addSeparator(parent);
-		//this.addSubmenu('navigation', menu, parent);
-		this.addMenuItems(menu, ['-', 'group', 'ungroup', 'removeFromGroup'],
-			parent);
-		//this.addMenuItems(menu, ['-', 'group', 'ungroup', 'removeFromGroup', '-', 'autosize'], parent);
-	})));
-	this.put('view', new Menu(mxUtils.bind(this, function(menu, parent) {
-		this.addMenuItems(menu, ['actualSize'], parent);
-		menu.addSeparator();
-		var scales = [0.25, 0.5, 0.75, 1, 2, 4];
-
-		for (var i = 0; i < scales.length; i++) {
-			(function(scale) {
-				menu.addItem((scale * 100) + '%', null, function() {
-					graph.zoomTo(scale);
-				}, parent);
-			})(scales[i]);
-		}
-
-		this.addMenuItems(menu, ['-', 'zoomIn', 'zoomOut', '-', 'fitWindow',
-			'customZoom', '-', 'fitPage', 'fitPageWidth'
-		], parent);
-	})));
-	this.put('file', new Menu(mxUtils.bind(this, function(menu, parent) {
-		this.addMenuItems(menu, ['new', 'open', '-', 'save', 'saveAs', 'publish',
-			'-', 'variable', '-', 'import', 'export', '-', 'editFile', 'rename', '-',
-			'print'
-		], parent);
-	})));
-	this.put('edit', new Menu(mxUtils.bind(this, function(menu, parent) {
-		this.addMenuItems(menu, ['undo', 'redo', '-', 'cut', 'copy', 'paste',
-			'delete', '-', 'duplicate', '-',
-			'selectVertices', 'selectEdges', 'selectAll'
-		]);
-	})));
-	this.put('help', new Menu(mxUtils.bind(this, function(menu, parent) {
-		this.addMenuItems(menu, ['help', '-', 'about']);
-	})));
-};
-
-/**
- * Adds the label menu items to the given menu and parent.
- */
-Menus.prototype.put = function(name, menu) {
-	this.menus[name] = menu;
-};
-
-/**
- * Adds the label menu items to the given menu and parent.
- */
-Menus.prototype.get = function(name) {
-	return this.menus[name];
-};
-
-/**
- * Adds the given submenu.
- */
-Menus.prototype.addSubmenu = function(name, menu, parent) {
-	var enabled = this.get(name).enabled;
-
-	if (menu.showDisabled || enabled) {
-		var submenu = menu.addItem(mxResources.get(name), null, null, parent, null,
-			enabled);
-		this.addMenu(name, menu, submenu);
-	}
-};
-
-/**
- * Adds the label menu items to the given menu and parent.
- */
-Menus.prototype.addMenu = function(name, popupMenu, parent) {
-	var menu = this.get(name);
-
-	if (menu != null && (popupMenu.showDisabled || menu.enabled)) {
-		this.get(name).execute(popupMenu, parent);
-	}
-};
-
-/**
- * Adds a style change item to the given menu.
- */
-Menus.prototype.styleChange = function(menu, label, keys, values, sprite,
-	parent) {
-	return menu.addItem(label, null, mxUtils.bind(this, function() {
-		var graph = this.editorUi.editor.graph;
-
-		graph.getModel().beginUpdate();
-		try {
-			for (var i = 0; i < keys.length; i++) {
-				graph.setCellStyles(keys[i], values[i]);
-			}
-		} finally {
-			graph.getModel().endUpdate();
-		}
-	}), parent, sprite);
-};
-
-/**
- * Adds a style change item with a prompt to the given menu.
- */
-Menus.prototype.promptChange = function(menu, label, hint, defaultValue, key,
-	parent, enabled) {
-	return menu.addItem(label, null, mxUtils.bind(this, function() {
-		var graph = this.editorUi.editor.graph;
-		var value = defaultValue;
-		var state = graph.getView().getState(graph.getSelectionCell());
-
-		if (state != null) {
-			value = state.style[key] || value;
-		}
-
-		value = mxUtils.prompt(mxResources.get('enterValue') + ((hint.length > 0) ?
-			(' ' + hint) : ''), value);
-
-		if (value != null && value.length > 0) {
-			graph.setCellStyles(key, value);
-		}
-	}), parent, null, enabled);
-};
-
-/**
- * Creates the keyboard event handler for the current graph and history.
- */
-Menus.prototype.addMenuItem = function(menu, key, parent) {
-	var action = this.editorUi.actions.get(key);
-
-	if (action != null && (menu.showDisabled || action.enabled)) {
-		var item = menu.addItem(action.label, null, action.funct, parent, null,
-			action.enabled);
-
-		// Adds checkmark image
-		if (action.toggleAction && action.isSelected()) {
-			this.addCheckmark(item);
-		}
-
-		this.addShortcut(item, action);
-
-		return item;
-	}
-
-	return null;
-};
-
-/**
- * Adds a checkmark to the given menuitem.
- */
-Menus.prototype.addShortcut = function(item, action) {
-	if (action.shortcut != null) {
-		var td = item.firstChild.nextSibling.nextSibling;
-		var span = document.createElement('span');
-		span.style.color = 'gray';
-		mxUtils.write(span, action.shortcut);
-		td.appendChild(span);
-	}
-};
-
-/**
- * Adds a checkmark to the given menuitem.
- */
-Menus.prototype.addCheckmark = function(item) {
-	var td = item.firstChild.nextSibling;
-	td.style.backgroundImage = 'url(' + IMAGE_PATH + '/checkmark.gif)';
-	td.style.backgroundRepeat = 'no-repeat';
-	td.style.backgroundPosition = '2px 50%';
-};
-
-/**
- * Creates the keyboard event handler for the current graph and history.
- */
-Menus.prototype.addMenuItems = function(menu, keys, parent) {
-	for (var i = 0; i < keys.length; i++) {
-		if (keys[i] == '-') {
-			menu.addSeparator(parent);
-		} else {
-			this.addMenuItem(menu, keys[i], parent);
-		}
-	}
-};
-
-/**
- * Creates the keyboard event handler for the current graph and history.
- */
-Menus.prototype.createPopupMenu = function(menu, cell, evt) {
-	var graph = this.editorUi.editor.graph;
-	menu.smartSeparators = true;
-
-	if (graph.isSelectionEmpty()) {
-		this.addMenuItems(menu, ['undo', 'redo', '-', 'paste', '-']);
-	} else {
-		this.addMenuItems(menu, ['delete', '-', 'cut', 'copy', '-', 'duplicate']);
-
-		if (graph.getSelectionCount() == 1 && graph.getModel().isEdge(graph.getSelectionCell())) {
-			this.addMenuItems(menu, ['setAsDefaultEdge']);
-		}
-
-		menu.addSeparator();
-	}
-
-	if (graph.getSelectionCount() > 0) {
-		this.addMenuItems(menu, ['toFront', 'toBack', '-']);
-
-		if (graph.getModel().isEdge(graph.getSelectionCell())) {
-			var isWaypoint = false;
-			var cell = graph.getSelectionCell();
-
-			if (cell != null && graph.getModel().isEdge(cell)) {
-				var handler = graph.selectionCellsHandler.getHandler(cell);
-
-				if (handler instanceof mxEdgeHandler && handler.bends != null && handler.bends
-					.length > 2) {
-					var index = handler.getHandleForEvent(new mxMouseEvent(evt));
-
-					// Configures removeWaypoint action before execution
-					var rmWaypointAction = this.editorUi.actions.get('removeWaypoint');
-					rmWaypointAction.handler = handler;
-					rmWaypointAction.index = index;
-
-					isWaypoint = index > 0 && index < handler.bends.length;
-				}
-			}
-
-			this.addMenuItems(menu, ['-', (isWaypoint) ? 'removeWaypoint' :
-				'addWaypoint'
-			]);
-		} else if (graph.getSelectionCount() > 1) {
-			menu.addSeparator();
-			this.addMenuItems(menu, ['group']);
-		}
-
-		menu.addSeparator();
-
-		if (graph.getSelectionCount() == 1) {
-			var link = graph.getLinkForCell(graph.getSelectionCell());
-
-			if (link != null) {
-				this.addMenuItems(menu, ['openLink']);
-			}
-		}
-	} else {
-		this.addMenuItems(menu, ['-', 'selectVertices', 'selectEdges', '-',
-			'selectAll'
-		]);
-	}
-};
-
-/**
- * Creates the keyboard event handler for the current graph and history.
- */
-Menus.prototype.createMenubar = function(container) {
-	var menubar = new Menubar(this.editorUi, container);
-	// var menus = ['file', 'edit', 'view', 'format', 'text', 'arrange',
-	// 	'help'
-	// ];
-	var menus = ['file', 'edit', 'view', 'format', 'text', 'arrange'];
-	for (var i = 0; i < menus.length; i++) {
-		menubar.addMenu(mxResources.get(menus[i]), this.get(menus[i]).funct);
-	}
-
-	return menubar;
-};
-
-/**
- * Construcs a new menubar for the given editor.
- */
-function Menubar(editorUi, container) {
-	this.editorUi = editorUi;
-	this.container = container;
-
-	// Global handler to hide the current menu
-	mxEvent.addGestureListeners(document, mxUtils.bind(this, function(evt) {
-		this.hideMenu();
-	}));
-};
-
-/**
- * Adds the menubar elements.
- */
-Menubar.prototype.hideMenu = function() {
-	if (this.currentMenu != null) {
-		this.currentMenu.hideMenu();
-	}
-};
-
-/**
- * Adds a submenu to this menubar.
- */
-Menubar.prototype.addMenu = function(label, funct) {
-	var elt = document.createElement('a');
-	elt.setAttribute('href', 'javascript:void(0);');
-	elt.className = 'geItem';
-	mxUtils.write(elt, label);
-
-	this.addMenuHandler(elt, funct);
-	this.container.appendChild(elt);
-
-	return elt;
-};
-
-/**
- * Adds a handler for showing a menu in the given element.
- */
-Menubar.prototype.addMenuHandler = function(elt, funct) {
-	if (funct != null) {
-		var show = true;
-
-		var clickHandler = mxUtils.bind(this, function(evt) {
-			if (show && elt.enabled == null || elt.enabled) {
-				this.editorUi.editor.graph.panningHandler.hideMenu();
-				var menu = new mxPopupMenu(funct);
-				menu.div.className += ' geMenubarMenu';
-				menu.smartSeparators = true;
-				menu.showDisabled = true;
-				menu.autoExpand = true;
-
-				// Disables autoexpand and destroys menu when hidden
-				menu.hideMenu = mxUtils.bind(this, function() {
-					mxPopupMenu.prototype.hideMenu.apply(menu, arguments);
-					menu.destroy();
-					this.currentMenu = null;
-					this.currentElt = null;
-				});
-
-				// Added width of the page-sidebar
-				var x = elt.offsetLeft + document.getElementById('page-sidebar').offsetWidth +
-					22;
-				// Added static height of the page-navbar
-				var y = elt.offsetTop + elt.offsetHeight + 140;
-
-				menu.popup(x, y, null, evt);
-
-				//menu.popup(elt.offsetLeft + 4, elt.offsetTop + elt.offsetHeight + 4, null, evt);
-				this.currentMenu = menu;
-				this.currentElt = elt;
-			}
-
-			show = true;
-			mxEvent.consume(evt);
-		});
-
-		// Shows menu automatically while in expanded state
-		mxEvent.addListener(elt, 'mousemove', mxUtils.bind(this, function(evt) {
-			if (this.currentMenu != null && this.currentElt != elt) {
-				this.hideMenu();
-				clickHandler(evt);
-			}
-		}));
-
-		// Hides menu if already showing
-		mxEvent.addListener(elt, 'mousedown', mxUtils.bind(this, function() {
-			show = this.currentElt != elt;
-		}));
-
-		mxEvent.addListener(elt, 'click', clickHandler);
-	}
-};
-
-/**
- * Constructs a new action for the given parameters.
- */
-function Menu(funct, enabled) {
-	mxEventSource.call(this);
-	this.funct = funct;
-	this.enabled = (enabled != null) ? enabled : true;
-};
-
-// Menu inherits from mxEventSource
-mxUtils.extend(Menu, mxEventSource);
-
-/**
- * Sets the enabled state of the action and fires a stateChanged event.
- */
-Menu.prototype.setEnabled = function(value) {
-	if (this.enabled != value) {
-		this.enabled = value;
-		this.fireEvent(new mxEventObject('stateChanged'));
-	}
-};
-
-/**
- * Sets the enabled state of the action and fires a stateChanged event.
- */
-Menu.prototype.execute = function(menu, parent) {
-	this.funct(menu, parent);
-};
\ No newline at end of file
diff --git a/public/assets/plugins/jscripty/js/Shapes.js b/public/assets/plugins/jscripty/js/Shapes.js
index 42e13ca..ef6e188 100644
--- a/public/assets/plugins/jscripty/js/Shapes.js
+++ b/public/assets/plugins/jscripty/js/Shapes.js
@@ -1,1234 +1 @@
-/**
- * $Id: Shapes.js,v 1.13 2013-02-02 06:44:30 gaudenz Exp $
- * Copyright (c) 2006-2012, JGraph Ltd
- */
-
-/**
- * Registers shapes.
- */
-(function()
-{
-	// Cube Shape, supports size style
-	function CubeShape() { };
-	CubeShape.prototype = new mxCylinder();
-	CubeShape.prototype.constructor = CubeShape;
-	CubeShape.prototype.size = 20;
-	CubeShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
-	{
-		var s = Math.min(w, Math.min(h, mxUtils.getValue(this.style, 'size', this.size)));
-
-		if (isForeground)
-		{
-			path.moveTo(s, h);
-			path.lineTo(s, s);
-			path.lineTo(0, 0);
-			path.moveTo(s, s);
-			path.lineTo(w, s);
-			path.end();
-		}
-		else
-		{
-			path.moveTo(0, 0);
-			path.lineTo(w - s, 0);
-			path.lineTo(w, s);
-			path.lineTo(w, h);
-			path.lineTo(s, h);
-			path.lineTo(0, h - s);
-			path.lineTo(0, 0);
-			path.close();
-			path.end();
-		}
-	};
-
-	mxCellRenderer.prototype.defaultShapes['cube'] = CubeShape;
-
-	// Note Shape, supports size style
-	function NoteShape() { };
-	NoteShape.prototype = new mxCylinder();
-	NoteShape.prototype.constructor = NoteShape;
-	NoteShape.prototype.size = 30;
-	NoteShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
-	{
-		var s = Math.min(w, Math.min(h, mxUtils.getValue(this.style, 'size', this.size)));
-
-		if (isForeground)
-		{
-			path.moveTo(w - s, 0);
-			path.lineTo(w - s, s);
-			path.lineTo(w, s);
-			path.end();
-		}
-		else
-		{
-			path.moveTo(0, 0);
-			path.lineTo(w - s, 0);
-			path.lineTo(w, s);
-			path.lineTo(w, h);
-			path.lineTo(0, h);
-			path.lineTo(0, 0);
-			path.close();
-			path.end();
-		}
-	};
-
-	mxCellRenderer.prototype.defaultShapes['note'] = NoteShape;
-
-	// Folder Shape, supports tabWidth, tabHeight styles
-	function FolderShape() { };
-	FolderShape.prototype = new mxCylinder();
-	FolderShape.prototype.constructor = FolderShape;
-	FolderShape.prototype.tabWidth = 60;
-	FolderShape.prototype.tabHeight = 20;
-	FolderShape.prototype.tabPosition = 'right';
-	FolderShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
-	{
-		var tw = mxUtils.getValue(this.style, 'tabWidth', this.tabWidth);
-		var th = mxUtils.getValue(this.style, 'tabHeight', this.tabHeight);
-		var tp = mxUtils.getValue(this.style, 'tabPosition', this.tabPosition);
-		var dx = Math.min(w, tw);
-		var dy = Math.min(h, th);
-
-		if (isForeground)
-		{
-			if (tp == 'left')
-			{
-				path.moveTo(0, dy);
-				path.lineTo(dx, dy);
-			}
-			// Right is default
-			else
-			{
-				path.moveTo(w - dx, dy);
-				path.lineTo(w, dy);
-			}
-			
-			path.end();
-		}
-		else
-		{
-			if (tp == 'left')
-			{
-				path.moveTo(0, 0);
-				path.lineTo(dx, 0);
-				path.lineTo(dx, dy);
-				path.lineTo(w, dy);
-			}
-			// Right is default
-			else
-			{
-				path.moveTo(0, dy);
-				path.lineTo(w - dx, dy);
-				path.lineTo(w - dx, 0);
-				path.lineTo(w, 0);
-			}
-			
-			path.lineTo(w, h);
-			path.lineTo(0, h);
-			path.lineTo(0, dy);
-			path.close();
-			path.end();
-		}
-	};
-
-	mxCellRenderer.prototype.defaultShapes['folder'] = FolderShape;
-
-	// Card Shape, supports size style
-	function CardShape() { };
-	CardShape.prototype = new mxCylinder();
-	CardShape.prototype.constructor = CardShape;
-	CardShape.prototype.size = 30;
-	CardShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
-	{
-		var s = Math.min(w, Math.min(h, mxUtils.getValue(this.style, 'size', this.size)));
-
-		if (!isForeground)
-		{
-			path.moveTo(s, 0);
-			path.lineTo(w, 0);
-			path.lineTo(w, h);
-			path.lineTo(0, h);
-			path.lineTo(0, s);
-			path.lineTo(s, 0);
-			path.close();
-			path.end();
-		}
-	};
-
-	mxCellRenderer.prototype.defaultShapes['card'] = CardShape;
-
-	// Tape Shape, supports size style
-	function TapeShape() { };
-	TapeShape.prototype = new mxCylinder();
-	TapeShape.prototype.constructor = TapeShape;
-	TapeShape.prototype.size = 0.4;
-	TapeShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
-	{
-		var s = mxUtils.getValue(this.style, 'size', this.size);
-		var dy = h * s;
-		var fy = 1.4;
-
-		if (!isForeground)
-		{
-			path.moveTo(0, dy / 2);
-			path.quadTo(w / 4, dy * fy, w / 2, dy / 2);
-			path.quadTo(w * 3 / 4, dy * (1 - fy), w, dy / 2);
-			path.lineTo(w, h - dy / 2);
-			path.quadTo(w * 3 / 4, h - dy * fy, w / 2, h - dy / 2);
-			path.quadTo(w / 4, h - dy * (1 - fy), 0, h - dy / 2);
-			path.lineTo(0, dy / 2);
-			path.close();
-			path.end();
-		}
-	};
-
-	mxCellRenderer.prototype.defaultShapes['tape'] = TapeShape;
-
-	// Tape Shape, supports size style
-	function StepShape() { };
-	StepShape.prototype = new mxCylinder();
-	StepShape.prototype.constructor = StepShape;
-	StepShape.prototype.size = 0.2;
-	StepShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
-	{
-		var s =  w * mxUtils.getValue(this.style, 'size', this.size);
-
-		if (!isForeground)
-		{
-			path.moveTo(0, 0);
-			path.lineTo(w - s, 0);
-			path.lineTo(w, h / 2);
-			path.lineTo(w - s, h);
-			path.lineTo(0, h);
-			path.lineTo(s, h / 2);
-			path.close();
-			path.end();
-		}
-	};
-
-	mxCellRenderer.prototype.defaultShapes['step'] = StepShape;
-
-	// Plus Shape
-	function PlusShape()
-	{
-		mxRectangleShape.call(this);
-	};
-	mxUtils.extend(PlusShape, mxRectangleShape);
-	PlusShape.prototype.isHtmlAllowed = function()
-	{
-		return false;
-	};
-	PlusShape.prototype.paintForeground = function(c, x, y, w, h)
-	{
-		var border = Math.min(w / 5, h / 5) + 1;
-		
-		c.begin();
-		c.moveTo(x + w / 2, y + border);
-		c.lineTo(x + w / 2, y + h - border);
-		c.moveTo(x + border, y + h / 2);
-		c.lineTo(x + w - border, y + h / 2);
-		c.end();
-		c.stroke();
-		mxRectangleShape.prototype.paintForeground.apply(this, arguments);
-	};
-
-	mxCellRenderer.prototype.defaultShapes['plus'] = PlusShape;
-
-	// CompositeShape
-	function ExtendedShape()
-	{
-		mxRectangleShape.call(this);
-	};
-	mxUtils.extend(ExtendedShape, mxRectangleShape);
-	ExtendedShape.prototype.isHtmlAllowed = function()
-	{
-		return false;
-	};
-	ExtendedShape.prototype.paintForeground = function(c, x, y, w, h)
-	{
-		if (this.style != null)
-		{
-			if (this.style['double'] == 1)
-			{
-				var inset = Math.max(2, this.strokewidth + 1);
-	
-				mxRectangleShape.prototype.paintBackground.call(this, c, x + inset, y + inset, w - 2 * inset, h - 2 * inset);
-				mxRectangleShape.prototype.paintForeground.apply(this, arguments);
-				
-				x += inset;
-				y += inset;
-				w -= 2 * inset;
-				h -= 2 * inset;
-			}
-			
-			c.setDashed(false);
-			
-			// Draws the symbols defined in the style. The symbols are
-			// numbered from 1...n. Possible postfixes are align,
-			// verticalAlign, spacing, arcSpacing, width, height
-			var counter = 0;
-			var shape = null;
-			
-			do
-			{
-				shape = mxCellRenderer.prototype.defaultShapes[this.style['symbol' + counter]];
-				
-				if (shape != null)
-				{
-					var align = this.style['symbol' + counter + 'Align'];
-					var valign = this.style['symbol' + counter + 'VerticalAlign'];
-					var width = this.style['symbol' + counter + 'Width'];
-					var height = this.style['symbol' + counter + 'Height'];
-					var spacing = this.style['symbol' + counter + 'Spacing'] || 0;
-					var arcspacing = this.style['symbol' + counter + 'ArcSpacing'];
-					
-					if (arcspacing != null)
-					{
-						spacing += this.getArcSize(w + this.strokewidth, h + this.strokewidth) * arcspacing;
-					}
-					
-					var x2 = x;
-					var y2 = y;
-					
-					if (align == mxConstants.ALIGN_CENTER)
-					{
-						x2 += (w - width) / 2;
-					}
-					else if (align == mxConstants.ALIGN_RIGHT)
-					{
-						x2 += w - width - spacing;
-					}
-					else
-					{
-						x2 += spacing;
-					}
-					
-					if (valign == mxConstants.ALIGN_MIDDLE)
-					{
-						y2 += (h - height) / 2;
-					}
-					else if (valign == mxConstants.ALIGN_BOTTOM)
-					{
-						y2 += h - height - spacing;
-					}
-					else
-					{
-						y2 += spacing;
-					}
-					
-					c.save();
-					
-					// Small hack to pass style along into subshape
-					var tmp = new shape();
-					// TODO: Clone style and override settings (eg. strokewidth)
-					tmp.style = this.style;
-					shape.prototype.paintVertexShape.call(tmp, c, x2, y2, width, height);
-					c.restore();
-				}
-				
-				counter++;
-			}
-			while (shape != null);
-		}
-	};
-
-	mxCellRenderer.prototype.defaultShapes['ext'] = ExtendedShape;
-	
-	// Tape Shape, supports size style
-	function MessageShape() { };
-	MessageShape.prototype = new mxCylinder();
-	MessageShape.prototype.constructor = MessageShape;
-	MessageShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
-	{
-		if (isForeground)
-		{
-			path.moveTo(0, 0);
-			path.lineTo(w / 2, h / 2);
-			path.lineTo(w, 0);
-			path.end();
-		}
-		else
-		{
-			path.moveTo(0, 0);
-			path.lineTo(w, 0);
-			path.lineTo(w, h);
-			path.lineTo(0, h);
-			path.close();
-		}
-	};
-
-	mxCellRenderer.prototype.defaultShapes['message'] = MessageShape;
-	
-	// New Actor Shape
-	function UmlActorShape() { };
-	UmlActorShape.prototype = new mxCylinder();
-	UmlActorShape.prototype.constructor = UmlActorShape;
-	UmlActorShape.prototype.addPipe = true;
-	UmlActorShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
-	{
-		var width = w / 3;
-		var height = h / 4;
-		
-		if (!isForeground)
-		{
-			path.moveTo(w / 2, height);
-			path.curveTo(w / 2 - width, height, w / 2 - width, 0, w / 2, 0);
-			path.curveTo(w / 2 + width, 0, w / 2 + width, height, w / 2, height);
-			path.close();
-
-			path.moveTo(w / 2, height);
-			path.lineTo(w / 2, 2 * h / 3);
-			
-			// Arms
-			path.moveTo(w / 2, h / 3);
-			path.lineTo(0, h / 3);
-			path.moveTo(w / 2, h / 3);
-			path.lineTo(w, h / 3);
-			
-			// Legs
-			path.moveTo(w / 2, 2 * h / 3);
-			path.lineTo(0, h);
-			path.moveTo(w / 2, 2 * h / 3);
-			path.lineTo(w, h);
-			path.end();
-		}
-	};
-
-	// Replaces existing actor shape
-	mxCellRenderer.prototype.defaultShapes['umlActor'] = UmlActorShape;
-
-	// New Actor Shape
-	function LollipopShape() { };
-	LollipopShape.prototype = new mxCylinder();
-	LollipopShape.prototype.constructor = LollipopShape;
-	LollipopShape.prototype.size = 10;
-	LollipopShape.prototype.addPipe = true;
-	LollipopShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
-	{
-		var ss = mxUtils.getValue(this.style, 'size', this.size);
-		var width = ss * 2 / 3;
-		var height = ss;
-		
-		if (!isForeground)
-		{
-			path.moveTo(w / 2, height);
-			path.curveTo(w / 2 - width, height, w / 2 - width, 0, w / 2, 0);
-			path.curveTo(w / 2 + width, 0, w / 2 + width, height, w / 2, height);
-			path.close();
-
-			path.moveTo(w / 2, height);
-			path.lineTo(w / 2, h);
-			path.end();
-		}
-	};
-
-	// Replaces existing actor shape
-	mxCellRenderer.prototype.defaultShapes['lollipop'] = LollipopShape;
-	
-	// Folder Shape, supports tabWidth, tabHeight styles
-	function ComponentShape() { };
-	ComponentShape.prototype = new mxCylinder();
-	ComponentShape.prototype.constructor = ComponentShape;
-	ComponentShape.prototype.jettyWidth = 32;
-	ComponentShape.prototype.jettyHeight = 12;
-	ComponentShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
-	{
-		var dx = mxUtils.getValue(this.style, 'jettyWidth', this.jettyWidth);
-		var dy = mxUtils.getValue(this.style, 'jettyHeight', this.jettyHeight);
-		var x0 = dx / 2;
-		var x1 = x0 + dx / 2;
-		var y0 = 0.3 * h - dy / 2;
-		var y1 = 0.7 * h - dy / 2;
-
-		if (isForeground)
-		{
-			path.moveTo(x0, y0);
-			path.lineTo(x1, y0);
-			path.lineTo(x1, y0 + dy);
-			path.lineTo(x0, y0 + dy);
-			path.moveTo(x0, y1);
-			path.lineTo(x1, y1);
-			path.lineTo(x1, y1 + dy);
-			path.lineTo(x0, y1 + dy);
-			path.end();
-		}
-		else
-		{
-			path.moveTo(x0, 0);
-			path.lineTo(w, 0);
-			path.lineTo(w, h);
-			path.lineTo(x0, h);
-			path.lineTo(x0, y1 + dy);
-			path.lineTo(0, y1 + dy);
-			path.lineTo(0, y1);
-			path.lineTo(x0, y1);
-			path.lineTo(x0, y0 + dy);
-			path.lineTo(0, y0 + dy);
-			path.lineTo(0, y0);
-			path.lineTo(x0, y0);
-			path.close();
-			path.end();
-		}
-	};
-
-	mxCellRenderer.prototype.defaultShapes['component'] = ComponentShape;
-	
-	// State Shapes derives from double ellipse
-	function StateShape() { };
-	StateShape.prototype = new mxDoubleEllipse();
-	StateShape.prototype.constructor = StateShape;
-	StateShape.prototype.outerStroke = true;
-	StateShape.prototype.paintVertexShape = function(c, x, y, w, h)
-	{
-		var inset = Math.min(4, Math.min(w / 5, h / 5));
-		
-		if (w > 0 && h > 0)
-		{
-			c.ellipse(x + inset, y + inset, w - 2 * inset, h - 2 * inset);
-			c.fillAndStroke();
-		}
-		
-		c.setShadow(false);
-
-		if (this.outerStroke)
-		{
-			c.ellipse(x, y, w, h);
-			c.stroke();			
-		}
-	};
-
-	mxCellRenderer.prototype.defaultShapes['endState'] = StateShape;
-
-	function StartStateShape() { };
-	StartStateShape.prototype = new StateShape();
-	StartStateShape.prototype.constructor = StartStateShape;
-	StartStateShape.prototype.outerStroke = false;
-	
-	mxCellRenderer.prototype.defaultShapes['startState'] = StartStateShape;
-
-	// Image export for state shapes
-	var imageExportInitShapes = mxImageExport.prototype.initShapes;
-	mxImageExport.prototype.initShapes = function()
-	{
-		imageExportInitShapes.apply(this, arguments);
-
-		function createStateShape(outerStroke)
-		{
-			return {
-				drawShape: function(canvas, state, bounds, background)
-				{
-					var x = bounds.x;
-					var y = bounds.y;
-					var w = bounds.width;
-					var h = bounds.height;
-					
-					if (background)
-					{
-						var inset = Math.min(4, Math.min(w / 5, h / 5));
-						x += inset;
-						y += inset;
-						w -= 2 * inset;
-						h -= 2 * inset;
-						
-						if (w > 0 && h > 0)
-						{
-							canvas.ellipse(x, y, w, h);
-						}
-						
-						return true;
-					}
-					else
-					{
-						canvas.fillAndStroke();
-		
-						if (outerStroke)
-						{
-							canvas.ellipse(x, y, w, h);
-							canvas.stroke();
-						}
-					}
-				}
-			};
-		};
-		
-		this.shapes['endState'] = createStateShape(true);
-		this.shapes['startState'] = createStateShape(false);
-	};
-
-	// Defines custom edge shape
-	function LinkShape()
-	{
-		mxArrow.call(this);
-	};
-	mxUtils.extend(LinkShape, mxArrow);
-	LinkShape.prototype.paintEdgeShape = function(c, pts)
-	{
-		var width = 10;
-
-		// Base vector (between end points)
-		var p0 = pts[0];
-		var pe = pts[pts.length - 1];
-		
-		var dx = pe.x - p0.x;
-		var dy = pe.y - p0.y;
-		var dist = Math.sqrt(dx * dx + dy * dy);
-		var length = dist;
-		
-		// Computes the norm and the inverse norm
-		var nx = dx / dist;
-		var ny = dy / dist;
-		var basex = length * nx;
-		var basey = length * ny;
-		var floorx = width * ny/3;
-		var floory = -width * nx/3;
-		
-		// Computes points
-		var p0x = p0.x - floorx / 2;
-		var p0y = p0.y - floory / 2;
-		var p1x = p0x + floorx;
-		var p1y = p0y + floory;
-		var p2x = p1x + basex;
-		var p2y = p1y + basey;
-		var p3x = p2x + floorx;
-		var p3y = p2y + floory;
-		// p4 not necessary
-		var p5x = p3x - 3 * floorx;
-		var p5y = p3y - 3 * floory;
-		
-		c.begin();
-		c.moveTo(p1x, p1y);
-		c.lineTo(p2x, p2y);
-		c.moveTo(p5x + floorx, p5y + floory);
-		c.lineTo(p0x, p0y);
-		c.stroke();
-	};
-
-	// Registers the link shape
-	mxCellRenderer.prototype.defaultShapes['link'] = LinkShape;
-
-	// Registers and defines the custom marker
-	mxMarker.addMarker('dash', function(canvas, shape, type, pe, unitX, unitY, size, source, sw, filled)
-	{
-		var nx = unitX * (size + sw + 1);
-		var ny = unitY * (size + sw + 1);
-
-		return function()
-		{
-			canvas.begin();
-			canvas.moveTo(pe.x - nx / 2 - ny / 2, pe.y - ny / 2 + nx / 2);
-			canvas.lineTo(pe.x + ny / 2 - 3 * nx / 2, pe.y - 3 * ny / 2 - nx / 2);
-			canvas.stroke();
-		};
-	});
-
-	// Implements custom handlers
-	var SPECIAL_HANDLE_INDEX = -99;
-
-	// Handlers are only added if mxVertexHandler is defined (ie. not in embedded graph)
-	if (typeof(mxVertexHandler) != 'undefined')
-	{
-		function mxExtVertexHandler(state)
-		{
-			mxVertexHandler.call(this, state);
-		};
-	
-		mxUtils.extend(mxExtVertexHandler, mxVertexHandler);
-	
-		mxExtVertexHandler.prototype.useGridForSpecialHandle = false;
-		
-		mxExtVertexHandler.prototype.init = function()
-		{
-			this.horizontal = mxUtils.getValue(this.state.style, mxConstants.STYLE_HORIZONTAL, true);
-			var graph = this.state.view.graph;
-	
-			if (this.handleImage != null)
-			{
-				var bounds = new mxRectangle(0, 0, this.handleImage.width, this.handleImage.height);
-				this.specialHandle = new mxImageShape(bounds, this.handleImage.src);
-			}
-			else
-			{
-				var size = 10;
-				var bounds = new mxRectangle(0, 0, size, size);
-				this.specialHandle = new mxRhombus(bounds, mxConstants.HANDLE_FILLCOLOR, mxConstants.HANDLE_STROKECOLOR);
-			}
-			
-			this.specialHandle.dialect = (graph.dialect != mxConstants.DIALECT_SVG) ?
-					mxConstants.DIALECT_VML : mxConstants.DIALECT_SVG;
-			this.specialHandle.init(graph.getView().getOverlayPane());
-			this.specialHandle.node.style.cursor = this.getSpecialHandleCursor();
-	
-			mxEvent.redirectMouseEvents(this.specialHandle.node, graph, this.state);
-			mxVertexHandler.prototype.init.apply(this, arguments);
-		};
-		
-		mxExtVertexHandler.prototype.getSpecialHandleCursor = function()
-		{
-			return 'default';
-		};
-		
-		mxExtVertexHandler.prototype.redraw = function()
-		{
-			mxVertexHandler.prototype.redraw.apply(this, arguments);
-	
-			var size = this.specialHandle.bounds.width;
-			this.specialHandle.bounds = this.getSpecialHandleBounds(size);
-			this.specialHandle.redraw();
-		};
-
-		mxExtVertexHandler.prototype.destroy = function()
-		{
-			mxVertexHandler.prototype.destroy.apply(this, arguments);
-			
-			if (this.specialHandle != null)
-			{
-				this.specialHandle.destroy();
-				this.specialHandle = null;
-			}
-		};
-		
-		mxExtVertexHandler.prototype.getHandleForEvent = function(me)
-		{
-			if (me.isSource(this.specialHandle))
-			{
-				return SPECIAL_HANDLE_INDEX;
-			}
-			
-			return mxVertexHandler.prototype.getHandleForEvent.apply(this, arguments);
-		};
-
-		mxExtVertexHandler.prototype.mouseMove = function(sender, me)
-		{
-			if (!me.isConsumed() && this.index == SPECIAL_HANDLE_INDEX)
-			{
-				var point = new mxPoint(me.getGraphX(), me.getGraphY());
-				this.constrainPoint(point);
-				var gridEnabled = this.graph.isGridEnabledEvent(me.getEvent());
-				var scale = this.graph.getView().scale;
-				
-				if (gridEnabled && this.useGridForSpecialHandle)
-				{
-					point.x = this.graph.snap(point.x / scale) * scale;
-					point.y = this.graph.snap(point.y / scale) * scale;
-				}
-				
-				this.updateStyle(point);			
-				this.moveSizerTo(this.specialHandle, point.x, point.y);
-				this.state.view.graph.cellRenderer.redraw(this.state, true);
-				me.consume();
-			}
-			else
-			{
-				mxVertexHandler.prototype.mouseMove.apply(this, arguments);
-			}
-		};
-
-		mxExtVertexHandler.prototype.mouseUp = function(sender, me)
-		{
-			if (!me.isConsumed() && this.index == SPECIAL_HANDLE_INDEX)
-			{
-				this.applyStyle();
-				this.reset();
-				me.consume();
-			}
-			else
-			{
-				mxVertexHandler.prototype.mouseUp.apply(this, arguments);
-			}
-		};
-
-		mxExtVertexHandler.prototype.getSpecialHandleBounds = function(size)
-		{
-			var rotation = this.state.shape.getShapeRotation();
-			var alpha = mxUtils.toRadians(rotation);
-			var cos = Math.cos(alpha);
-			var sin = Math.sin(alpha);
-			
-			var bounds = new mxRectangle(this.state.x, this.state.y, this.state.width, this.state.height);
-			
-			if (this.state.shape.isPaintBoundsInverted())
-			{
-				var t = (bounds.width - bounds.height) / 2;
-				bounds.x += t;
-				bounds.y -= t;
-				var tmp = bounds.width;
-				bounds.width = bounds.height;
-				bounds.height = tmp;
-			}
-	
-			var pt = this.getSpecialHandlePoint(bounds);
-
-			if (this.state.shape.flipH)
-			{
-				pt.x = 2 * bounds.x + bounds.width - pt.x;
-			}
-			
-			if (this.state.shape.flipV)
-			{
-				pt.y = 2 * bounds.y + bounds.height - pt.y;
-			}
-			
-			pt = mxUtils.getRotatedPoint(pt, cos, sin,
-				new mxPoint(this.state.getCenterX(), this.state.getCenterY()));
-
-			return new mxRectangle(pt.x - size / 2, pt.y - size / 2, size, size);
-		};
-		
-		mxExtVertexHandler.prototype.getSpecialHandlePoint = function(bounds)
-		{
-			// Hook for subclassers
-			return null;
-		};
-	
-		mxExtVertexHandler.prototype.updateStyle = function(point)
-		{
-			// Hook for subclassers
-		};
-		
-		mxExtVertexHandler.prototype.constrainPoint = function(point)
-		{
-			point.x = Math.max(this.state.x, Math.min(this.state.x + this.state.width, point.x));
-			point.y = Math.max(this.state.y, Math.min(this.state.y + this.state.height, point.y));
-		};
-		
-		mxExtVertexHandler.prototype.applyStyle = function()
-		{
-			// Hook for subclassers
-		};
-
-		// Folder Handler
-		function mxFolderHandler(state)
-		{
-			mxExtVertexHandler.call(this, state);
-		};
-	
-		mxUtils.extend(mxFolderHandler, mxExtVertexHandler);
-
-		mxFolderHandler.prototype.getSpecialHandlePoint = function(bounds)
-		{
-			var scale = this.graph.getView().scale;
-			var tw = Math.min(bounds.width, mxUtils.getValue(this.state.style, 'tabWidth', 60) * scale);
-			var th = Math.min(bounds.height, mxUtils.getValue(this.state.style, 'tabHeight', 20) * scale);
-			
-			var tp = mxUtils.getValue(this.state.style, 'tabPosition', 'right');
-			var x = (tp == 'left') ? bounds.x + tw : bounds.x + bounds.width - tw;
-	
-			return new mxPoint(x, bounds.y + th);
-		};
-		
-		mxFolderHandler.prototype.updateStyle = function(point)
-		{
-			var rotation = this.state.shape.getShapeRotation();
-			var alpha = mxUtils.toRadians(rotation);
-			var cos = Math.cos(-alpha);
-			var sin = Math.sin(-alpha);
-
-			var bounds = new mxRectangle(this.state.x, this.state.y, this.state.width, this.state.height);
-			
-			if (this.state.shape.isPaintBoundsInverted())
-			{
-				var t = (bounds.width - bounds.height) / 2;
-				bounds.x += t;
-				bounds.y -= t;
-				var tmp = bounds.width;
-				bounds.width = bounds.height;
-				bounds.height = tmp;
-			}
-	
-			var pt = new mxPoint(point.x, point.y);
-			pt = mxUtils.getRotatedPoint(pt, cos, sin,
-				new mxPoint(this.state.getCenterX(), this.state.getCenterY()));
-
-			if (this.state.shape.flipH)
-			{
-				pt.x = 2 * bounds.x + bounds.width - pt.x;
-			}
-			
-			if (this.state.shape.flipV)
-			{
-				pt.y = 2 * bounds.y + bounds.height - pt.y;
-			}
-			
-			var result = this.updateStyleUnrotated(pt, bounds);
-		
-			// Modifies point to use rotated coordinates of return value
-			if (result != null)
-			{
-				if (this.state.shape.flipH)
-				{
-					result.x = 2 * bounds.x + bounds.width - result.x;
-				}
-				
-				if (this.state.shape.flipV)
-				{
-					result.y = 2 * bounds.y + bounds.height - result.y;
-				}
-				
-				cos = Math.cos(alpha);
-				sin = Math.sin(alpha);
-				result = mxUtils.getRotatedPoint(result, cos, sin,
-						new mxPoint(this.state.getCenterX(), this.state.getCenterY()));
-				point.x = result.x;
-				point.y = result.y;
-			}
-		};
-		
-		mxFolderHandler.prototype.updateStyleUnrotated = function(pt, bounds)
-		{
-			var tp = mxUtils.getValue(this.state.style, 'tabPosition', 'right');
-			var tw = (tp == 'left') ? pt.x - bounds.x : bounds.x + bounds.width - pt.x;
-			var th = pt.y - bounds.y;
-			
-			var scale = this.graph.getView().scale;
-			this.state.style['tabWidth'] = Math.round(Math.max(1, tw) / scale);
-			this.state.style['tabHeight'] =  Math.round(Math.max(1, th) / scale);
-		};
-		
-		mxFolderHandler.prototype.applyStyle = function()
-		{
-			var model = this.graph.getModel();
-			model.beginUpdate();
-			try
-			{
-				this.state.view.graph.setCellStyles('tabWidth', this.state.style['tabWidth'], [this.state.cell]);
-				this.state.view.graph.setCellStyles('tabHeight', this.state.style['tabHeight'], [this.state.cell]);
-			}
-			finally
-			{
-				model.endUpdate();
-			}
-		};
-		
-		// Swimlane Handler
-		function mxSwimlaneHandler(state)
-		{
-			mxFolderHandler.call(this, state);
-		};
-		
-		mxUtils.extend(mxSwimlaneHandler, mxFolderHandler);
-		
-		mxSwimlaneHandler.prototype.getSpecialHandlePoint = function(bounds)
-		{
-			var scale = this.graph.getView().scale;
-			var startSize = mxUtils.getValue(this.state.style, mxConstants.STYLE_STARTSIZE, mxConstants.DEFAULT_STARTSIZE);
-
-			return new mxPoint(bounds.x + bounds.width / 2, bounds.y + Math.min(bounds.height, startSize * scale));
-		};
-		
-		mxSwimlaneHandler.prototype.updateStyleUnrotated = function(point, bounds)
-		{
-			point.x = bounds.x + bounds.width / 2;
-			startSize = point.y - bounds.y;
-			var scale = this.graph.getView().scale;
-			this.state.style['startSize'] = Math.round(Math.max(1, startSize) / scale);
-			
-			return point;
-		};
-		
-		mxSwimlaneHandler.prototype.applyStyle = function()
-		{
-			this.state.view.graph.setCellStyles('startSize', this.state.style['startSize'], [this.state.cell]);
-		};
-
-		// Cube Handler
-		function mxCubeHandler(state)
-		{
-			mxFolderHandler.call(this, state);
-		};
-	
-		mxUtils.extend(mxCubeHandler, mxFolderHandler);
-		
-		mxCubeHandler.prototype.defaultValue = 20;
-	
-		mxCubeHandler.prototype.scaleFactor = 1;
-		
-		mxCubeHandler.prototype.getSpecialHandlePoint = function(bounds)
-		{
-			var scale = this.graph.getView().scale;
-			var sz = Math.min(bounds.width, Math.min(bounds.height,
-				mxUtils.getValue(this.state.style, 'size', this.defaultValue) * scale / this.scaleFactor));
-			
-			return new mxPoint(bounds.x + sz, bounds.y + sz);
-		};
-	
-		mxCubeHandler.prototype.updateStyleUnrotated = function(pt, bounds)
-		{
-			var size = Math.max(0, Math.min(Math.min(bounds.width / this.scaleFactor, pt.x - bounds.x),
-					Math.min(bounds.height / this.scaleFactor, pt.y - bounds.y)));
-			var scale = this.graph.getView().scale;
-			this.state.style['size'] = Math.round(Math.max(1, size) / scale) * this.scaleFactor;
-			
-			// Stays on the diagonal
-			return new mxPoint(bounds.x + size, bounds.y + size);
-		};
-		
-		mxCubeHandler.prototype.applyStyle = function()
-		{
-			this.state.view.graph.setCellStyles('size', this.state.style['size'], [this.state.cell]);
-		};
-		
-		// Card Handler
-		function mxCardHandler(state)
-		{
-			mxCubeHandler.call(this, state);
-		};
-	
-		mxUtils.extend(mxCardHandler, mxCubeHandler);
-		
-		mxCardHandler.prototype.defaultValue = 30;
-	
-		mxCardHandler.prototype.scaleFactor = 2;
-		
-		// Note Handler
-		function mxNoteHandler(state)
-		{
-			mxCubeHandler.call(this, state);
-		};
-	
-		mxUtils.extend(mxNoteHandler, mxCubeHandler);
-		
-		mxNoteHandler.prototype.defaultValue = 30;
-	
-		mxNoteHandler.prototype.scaleFactor = 1;
-		
-		mxNoteHandler.prototype.getSpecialHandlePoint = function(bounds)
-		{
-			var scale = this.graph.getView().scale;
-			var sz = Math.min(bounds.width, Math.min(bounds.height,
-					mxUtils.getValue(this.state.style, 'size', this.defaultValue) * scale / this.scaleFactor));
-			
-			return new mxPoint(bounds.x + bounds.width - sz, bounds.y + sz);
-		};
-		
-		mxNoteHandler.prototype.updateStyleUnrotated = function(pt, bounds)
-		{
-			var size = Math.max(0, Math.min(Math.min(bounds.width / this.scaleFactor, pt.x - bounds.x + bounds.width),
-					Math.min(bounds.height / this.scaleFactor, pt.y - bounds.y)));
-			var scale = this.graph.getView().scale;
-			this.state.style['size'] = Math.round(Math.max(1, size) / scale) * this.scaleFactor;
-			
-			// Stays on the diagonal
-			return new mxPoint(bounds.x + bounds.width - size, bounds.y + size);
-		};
-		
-		// Step Handler
-		function mxStepHandler(state)
-		{
-			mxCubeHandler.call(this, state);
-		};
-	
-		mxUtils.extend(mxStepHandler, mxCubeHandler);
-		
-		mxStepHandler.prototype.defaultValue = 0.2;
-	
-		mxStepHandler.prototype.scaleFactor = 1;
-		
-		mxStepHandler.prototype.getSpecialHandlePoint = function(bounds)
-		{
-			var sz = mxUtils.getValue(this.state.style, 'size', this.defaultValue);
-			
-			return new mxPoint(bounds.x + bounds.width * sz, bounds.y + bounds.height / 2);
-		};
-	
-		mxStepHandler.prototype.updateStyleUnrotated = function(pt, bounds)
-		{
-			var size = Math.min(1, (pt.x - bounds.x) / bounds.width);
-			this.state.style['size'] = size;
-			
-			return new mxPoint(bounds.x + size * bounds.width, bounds.y + bounds.height / 2);
-		};
-		
-		// Tape Handler
-		function mxTapeHandler(state)
-		{
-			mxCubeHandler.call(this, state);
-		};
-	
-		mxUtils.extend(mxTapeHandler, mxCubeHandler);
-		
-		mxTapeHandler.prototype.defaultValue = 0.4;
-	
-		mxTapeHandler.prototype.scaleFactor = 1;
-		
-		mxTapeHandler.prototype.getSpecialHandlePoint = function(bounds)
-		{
-			var sz = mxUtils.getValue(this.state.style, 'size', this.defaultValue);
-	
-			return new mxPoint(bounds.x + bounds.width / 2, bounds.y + sz * bounds.height / 2);
-		};
-	
-		mxTapeHandler.prototype.updateStyleUnrotated = function(pt, bounds)
-		{
-			var size = Math.max(0, Math.min(1, ((pt.y - bounds.y) / bounds.height) * 2));
-			this.state.style['size'] = size;
-			
-			return new mxPoint(bounds.x + bounds.width / 2, bounds.y + size * bounds.height / 2);
-		};
-		
-		var handlers = {'swimlane': mxSwimlaneHandler, 'folder': mxFolderHandler, 'cube': mxCubeHandler,
-				'card': mxCardHandler, 'note': mxNoteHandler, 'step': mxStepHandler, 'tape': mxTapeHandler};
-
-		var mxGraphCreateHandler = mxGraph.prototype.createHandler;
-		mxGraph.prototype.createHandler = function(state)
-		{
-			if (state != null)
-			{
-				var ctor = handlers[state.style['shape']];
-
-				if (ctor != null)
-				{
-					return new ctor(state);
-				}
-			}
-			
-			return mxGraphCreateHandler.apply(this, arguments);
-		};
-	}
-	
-	// Constraints
-	mxGraph.prototype.getAllConnectionConstraints = function(terminal, source)
-	{
-		if (terminal != null && terminal.shape != null)
-		{
-			if (terminal.shape.stencil != null)
-			{
-				if (terminal.shape.stencil != null)
-				{
-					return terminal.shape.stencil.constraints;
-				}
-			}
-			else if (terminal.shape.constraints != null)
-			{
-				return terminal.shape.constraints;
-			}
-		}
-
-		return null;
-	};
-
-	mxRectangleShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.25, 0), true),
-	                                          new mxConnectionConstraint(new mxPoint(0.5, 0), true),
-	                                          new mxConnectionConstraint(new mxPoint(0.75, 0), true),
-	        	              		 new mxConnectionConstraint(new mxPoint(0, 0.25), true),
-	        	              		 new mxConnectionConstraint(new mxPoint(0, 0.5), true),
-	        	              		 new mxConnectionConstraint(new mxPoint(0, 0.75), true),
-	        	            		 new mxConnectionConstraint(new mxPoint(1, 0.25), true),
-	        	            		 new mxConnectionConstraint(new mxPoint(1, 0.5), true),
-	        	            		 new mxConnectionConstraint(new mxPoint(1, 0.75), true),
-	        	            		 new mxConnectionConstraint(new mxPoint(0.25, 1), true),
-	        	            		 new mxConnectionConstraint(new mxPoint(0.5, 1), true),
-	        	            		 new mxConnectionConstraint(new mxPoint(0.75, 1), true)];
-	mxLabel.prototype.constraints = mxRectangleShape.prototype.constraints;
-	mxImageShape.prototype.constraints = mxRectangleShape.prototype.constraints;
-	mxSwimlane.prototype.constraints = mxRectangleShape.prototype.constraints;
-	PlusShape.prototype.constraints = mxRectangleShape.prototype.constraints;
-	NoteShape.prototype.constraints = mxRectangleShape.prototype.constraints;
-	CardShape.prototype.constraints = mxRectangleShape.prototype.constraints;
-	CubeShape.prototype.constraints = mxRectangleShape.prototype.constraints;
-	FolderShape.prototype.constraints = mxRectangleShape.prototype.constraints;
-	mxCylinder.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.15, 0.05), false),
-                                        new mxConnectionConstraint(new mxPoint(0.5, 0), true),
-                                        new mxConnectionConstraint(new mxPoint(0.85, 0.05), false),
-      	              		 new mxConnectionConstraint(new mxPoint(0, 0.3), true),
-      	              		 new mxConnectionConstraint(new mxPoint(0, 0.5), true),
-      	              		 new mxConnectionConstraint(new mxPoint(0, 0.7), true),
-      	            		 new mxConnectionConstraint(new mxPoint(1, 0.3), true),
-      	            		 new mxConnectionConstraint(new mxPoint(1, 0.5), true),
-      	            		 new mxConnectionConstraint(new mxPoint(1, 0.7), true),
-      	            		 new mxConnectionConstraint(new mxPoint(0.15, 0.95), false),
-      	            		 new mxConnectionConstraint(new mxPoint(0.5, 1), true),
-      	            		 new mxConnectionConstraint(new mxPoint(0.85, 0.95), false)];
-	UmlActorShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.25, 0.1), false),
-	                                          new mxConnectionConstraint(new mxPoint(0.5, 0), false),
-	                                          new mxConnectionConstraint(new mxPoint(0.75, 0.1), false),
-	        	              		 new mxConnectionConstraint(new mxPoint(0, 1/3), false),
-	        	              		 new mxConnectionConstraint(new mxPoint(0, 1), false),
-	        	            		 new mxConnectionConstraint(new mxPoint(1, 1/3), false),
-	        	            		 new mxConnectionConstraint(new mxPoint(1, 1), false),
-	        	            		 new mxConnectionConstraint(new mxPoint(0.5, 0.5), false)];
-	ComponentShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.25, 0), true),
-	                                          new mxConnectionConstraint(new mxPoint(0.5, 0), true),
-	                                          new mxConnectionConstraint(new mxPoint(0.75, 0), true),
-	        	              		 new mxConnectionConstraint(new mxPoint(0, 0.3), true),
-	        	              		 new mxConnectionConstraint(new mxPoint(0, 0.7), true),
-	        	            		 new mxConnectionConstraint(new mxPoint(1, 0.25), true),
-	        	            		 new mxConnectionConstraint(new mxPoint(1, 0.5), true),
-	        	            		 new mxConnectionConstraint(new mxPoint(1, 0.75), true),
-	        	            		 new mxConnectionConstraint(new mxPoint(0.25, 1), true),
-	        	            		 new mxConnectionConstraint(new mxPoint(0.5, 1), true),
-	        	            		 new mxConnectionConstraint(new mxPoint(0.75, 1), true)];
-	mxActor.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.5, 0), true),
-   	              		 new mxConnectionConstraint(new mxPoint(0.25, 0.2), false),
-   	              		 new mxConnectionConstraint(new mxPoint(0.1, 0.5), false),
-   	              		 new mxConnectionConstraint(new mxPoint(0, 0.75), true),
-   	            		 new mxConnectionConstraint(new mxPoint(0.75, 0.25), false),
-   	            		 new mxConnectionConstraint(new mxPoint(0.9, 0.5), false),
-   	            		 new mxConnectionConstraint(new mxPoint(1, 0.75), true),
-   	            		 new mxConnectionConstraint(new mxPoint(0.25, 1), true),
-   	            		 new mxConnectionConstraint(new mxPoint(0.5, 1), true),
-   	            		 new mxConnectionConstraint(new mxPoint(0.75, 1), true)];
-	TapeShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0.35), false),
-	                                   new mxConnectionConstraint(new mxPoint(0, 0.5), false),
-	                                   new mxConnectionConstraint(new mxPoint(0, 0.65), false),
-	                                   new mxConnectionConstraint(new mxPoint(1, 0.35), false),
-		                                new mxConnectionConstraint(new mxPoint(1, 0.5), false),
-		                                new mxConnectionConstraint(new mxPoint(1, 0.65), false),
-										new mxConnectionConstraint(new mxPoint(0.25, 1), false),
-										new mxConnectionConstraint(new mxPoint(0.75, 0), false)];
-	// TODO: Relative ports
-	StepShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.25, 0), true),
-                                       new mxConnectionConstraint(new mxPoint(0.5, 0), true),
-                                       new mxConnectionConstraint(new mxPoint(0.75, 0), true),
-                                       new mxConnectionConstraint(new mxPoint(0.25, 1), true),
-  	        	            		 	new mxConnectionConstraint(new mxPoint(0.5, 1), true),
-  	        	            		 	new mxConnectionConstraint(new mxPoint(0.75, 1), true),
-	                                   new mxConnectionConstraint(new mxPoint(0.1, 0.25), false),
-	                                   new mxConnectionConstraint(new mxPoint(0.2, 0.5), false),
-	                                   new mxConnectionConstraint(new mxPoint(0.1, 0.75), false),
-	                                   new mxConnectionConstraint(new mxPoint(0.9, 0.25), false),
-		                                new mxConnectionConstraint(new mxPoint(1, 0.5), false),
-		                                new mxConnectionConstraint(new mxPoint(0.9, 0.75), false)];
-	mxLine.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0.5), false),
-	                                new mxConnectionConstraint(new mxPoint(0.25, 0.5), false),
-	                                new mxConnectionConstraint(new mxPoint(0.75, 0.5), false),
-									new mxConnectionConstraint(new mxPoint(1, 0.5), false)];
-	LollipopShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.5, 0), false),
-										new mxConnectionConstraint(new mxPoint(0.5, 1), false)];
-	mxEllipse.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0), true), new mxConnectionConstraint(new mxPoint(1, 0), true),
-	                                   new mxConnectionConstraint(new mxPoint(0, 1), true), new mxConnectionConstraint(new mxPoint(1, 1), true),
-	                                   new mxConnectionConstraint(new mxPoint(0.5, 0), true), new mxConnectionConstraint(new mxPoint(0.5, 1), true),
-	          	              		   new mxConnectionConstraint(new mxPoint(0, 0.5), true), new mxConnectionConstraint(new mxPoint(1, 0.5))];
-	mxDoubleEllipse.prototype.constraints = mxEllipse.prototype.constraints;
-	mxRhombus.prototype.constraints = mxEllipse.prototype.constraints;
-	mxTriangle.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0.25), true),
-	                                    new mxConnectionConstraint(new mxPoint(0, 0.5), true),
-	                                   new mxConnectionConstraint(new mxPoint(0, 0.75), true),
-	                                   new mxConnectionConstraint(new mxPoint(0.5, 0), true),
-	                                   new mxConnectionConstraint(new mxPoint(0.5, 1), true),
-	                                   new mxConnectionConstraint(new mxPoint(1, 0.5), true)];
-	mxHexagon.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.375, 0), true),
-	                                    new mxConnectionConstraint(new mxPoint(0.5, 0), true),
-	                                   new mxConnectionConstraint(new mxPoint(0.625, 0), true),
-	                                   new mxConnectionConstraint(new mxPoint(0.125, 0.25), false),
-	                                   new mxConnectionConstraint(new mxPoint(0, 0.5), true),
-	                                   new mxConnectionConstraint(new mxPoint(0.125, 0.75), false),
-	                                   new mxConnectionConstraint(new mxPoint(0.875, 0.25), false),
-	                                   new mxConnectionConstraint(new mxPoint(0, 0.5), true),
-	                                   new mxConnectionConstraint(new mxPoint(1, 0.5), true),
-	                                   new mxConnectionConstraint(new mxPoint(0.875, 0.75), false),
-	                                   new mxConnectionConstraint(new mxPoint(0.375, 1), true),
-	                                    new mxConnectionConstraint(new mxPoint(0.5, 1), true),
-	                                   new mxConnectionConstraint(new mxPoint(0.625, 1), true)];
-	mxCloud.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.25, 0.25), false),
-	                                 new mxConnectionConstraint(new mxPoint(0.4, 0.1), false),
-	                                 new mxConnectionConstraint(new mxPoint(0.16, 0.55), false),
-	                                 new mxConnectionConstraint(new mxPoint(0.07, 0.4), false),
-	                                 new mxConnectionConstraint(new mxPoint(0.31, 0.8), false),
-	                                 new mxConnectionConstraint(new mxPoint(0.13, 0.77), false),
-	                                 new mxConnectionConstraint(new mxPoint(0.8, 0.8), false),
-	                                 new mxConnectionConstraint(new mxPoint(0.55, 0.95), false),
-	                                 new mxConnectionConstraint(new mxPoint(0.875, 0.5), false),
-	                                 new mxConnectionConstraint(new mxPoint(0.96, 0.7), false),
-	                                 new mxConnectionConstraint(new mxPoint(0.625, 0.2), false),
-	                                 new mxConnectionConstraint(new mxPoint(0.88, 0.25), false)];
-	mxArrow.prototype.constraints = null;
-})();
\ No newline at end of file
diff --git a/public/assets/plugins/jscripty/js/Sidebar.js b/public/assets/plugins/jscripty/js/Sidebar.js
index 8b618e6..8787f74 100644
--- a/public/assets/plugins/jscripty/js/Sidebar.js
+++ b/public/assets/plugins/jscripty/js/Sidebar.js
@@ -1,793 +1 @@
-'use strict';
-
-/**
- * Construcs a new sidebar for the given editor.
- */
-function Sidebar(editorUi, container) {
-	this.editorUi = editorUi;
-	this.container = container;
-	this.palettes = new Object();
-	this.showTooltips = true;
-	this.graph = new Graph(document.createElement('div'), null, null, this.editorUi
-		.editor.graph.getStylesheet());
-	this.graph.resetViewOnRootChange = false;
-	this.graph.foldingEnabled = false;
-	this.graph.setConnectable(false);
-	this.graph.autoScroll = false;
-	this.graph.setTooltips(false);
-	this.graph.setEnabled(false);
-
-	// Container must be in the DOM for correct HTML rendering
-	this.graph.container.style.visibility = 'hidden';
-	this.graph.container.style.position = 'absolute';
-	document.body.appendChild(this.graph.container);
-
-	if (!mxClient.IS_TOUCH) {
-		mxEvent.addListener(document, 'mouseup', mxUtils.bind(this, function() {
-			this.showTooltips = true;
-		}));
-
-		// Enables tooltips after scroll
-		mxEvent.addListener(container, 'scroll', mxUtils.bind(this, function() {
-			this.showTooltips = true;
-		}));
-
-		mxEvent.addListener(document, 'mousedown', mxUtils.bind(this, function() {
-			this.showTooltips = false;
-			this.hideTooltip();
-		}));
-
-		mxEvent.addListener(document, 'mousemove', mxUtils.bind(this, function(evt) {
-			var src = mxEvent.getSource(evt);
-
-			while (src != null) {
-				if (src == this.currentElt) {
-					return;
-				}
-
-				src = src.parentNode;
-			}
-
-			this.hideTooltip();
-		}));
-
-		// Handles mouse leaving the window
-		mxEvent.addListener(document, 'mouseout', mxUtils.bind(this, function(evt) {
-			if (evt.toElement == null && evt.relatedTarget == null) {
-				this.hideTooltip();
-			}
-		}));
-	}
-
-	this.init();
-
-	// Pre-fetches tooltip image
-	new Image().src = IMAGE_PATH + '/tooltip.png';
-};
-
-/**
- * Adds all palettes to the sidebar.
- */
-Sidebar.prototype.init = function() {
-	var dir = STENCIL_PATH;
-	console.log(dir);
-
-	// this.addImagePalette('entry', mxResources.get('application'), dir + '/',
-	// 	'_128x128.png', ['start', 'question', 'input', 'end', 'email'], [mxResources.get('start'),
-	// 		mxResources.get('question'), mxResources.get('input'), mxResources.get('end'), mxResources.get('email')
-	// 	]);
-	this.addImagePalette('entry', mxResources.get('application'), dir + '/',
-		'_128x128.png', ['start', 'question', 'input', 'end'], [mxResources.get('start'),
-			mxResources.get('question'), mxResources.get('input'), mxResources.get('end')
-		]);
-	// this.addBpmnPalette(dir, false);
-
-};
-
-/**
- * Specifies if tooltips should be visible. Default is true.
- */
-Sidebar.prototype.enableTooltips = !mxClient.IS_TOUCH;
-
-/**
- * Specifies the delay for the tooltip. Default is 16 px.
- */
-Sidebar.prototype.tooltipBorder = 16;
-
-/**
- * Specifies the delay for the tooltip. Default is 3 px.
- */
-Sidebar.prototype.thumbBorder = 3;
-
-/**
- * Specifies the delay for the tooltip. Default is 300 ms.
- */
-Sidebar.prototype.tooltipDelay = 300;
-
-/**
- * Specifies if edges should be used as templates if clicked. Default is true.
- */
-Sidebar.prototype.installEdges = true;
-
-/**
- * Specifies the URL of the gear image.
- */
-Sidebar.prototype.gearImage = STENCIL_PATH + '/clipart/Gear_128x128.png';
-
-/**
- * Specifies the width of the thumbnails.
- */
-Sidebar.prototype.thumbWidth = 34;
-
-/**
- * Specifies the height of the thumbnails.
- */
-Sidebar.prototype.thumbHeight = 34;
-
-/**
- * Specifies the padding for the thumbnails. Default is 3.
- */
-Sidebar.prototype.thumbPadding = 2;
-
-/**
- * Specifies the size of the sidebar titles.
- */
-Sidebar.prototype.sidebarTitleSize = 9;
-
-/**
- * Specifies if titles in the sidebar should be enabled.
- */
-Sidebar.prototype.sidebarTitles = false;
-
-/**
- * Specifies if titles in the tooltips should be enabled.
- */
-Sidebar.prototype.tooltipTitles = false;
-
-/**
- * Adds all palettes to the sidebar.
- */
-Sidebar.prototype.showTooltip = function(elt, cells, title, showLabel) {
-	if (this.enableTooltips && this.showTooltips) {
-		if (this.currentElt != elt) {
-			if (this.thread != null) {
-				window.clearTimeout(this.thread);
-				this.thread = null;
-			}
-
-			var show = mxUtils.bind(this, function() {
-				// Lazy creation of the DOM nodes and graph instance
-				if (this.tooltip == null) {
-					this.tooltip = document.createElement('div');
-					this.tooltip.className = 'geSidebarTooltip';
-					document.body.appendChild(this.tooltip);
-
-					this.graph2 = new Graph(this.tooltip, null, null, this.editorUi.editor.graph
-						.getStylesheet());
-					this.graph2.view.setTranslate(this.tooltipBorder, this.tooltipBorder);
-					this.graph2.resetViewOnRootChange = false;
-					this.graph2.foldingEnabled = false;
-					this.graph2.autoScroll = false;
-					this.graph2.setTooltips(false);
-					this.graph2.setConnectable(false);
-					this.graph2.setEnabled(false);
-
-					if (!mxClient.IS_SVG) {
-						this.graph2.view.canvas.style.position = 'relative';
-					}
-
-					this.tooltipImage = mxUtils.createImage(IMAGE_PATH + '/tooltip.png');
-					this.tooltipImage.style.position = 'absolute';
-					this.tooltipImage.style.width = '14px';
-					this.tooltipImage.style.height = '27px';
-
-					document.body.appendChild(this.tooltipImage);
-				}
-
-				this.tooltip.style.display = 'block';
-				this.graph2.labelsVisible = (showLabel == null || showLabel);
-				this.graph2.model.clear();
-				this.graph2.addCells(cells);
-
-				var bounds = this.graph2.getGraphBounds();
-				var width = bounds.width + 2 * this.tooltipBorder;
-				var height = bounds.height + 2 * this.tooltipBorder;
-
-				if (mxClient.IS_QUIRKS) {
-					width += 4;
-					height += 4;
-					this.tooltip.style.overflow = 'hidden';
-				} else {
-					this.tooltip.style.overflow = 'visible';
-				}
-
-				this.tooltipImage.style.visibility = 'visible';
-				this.tooltip.style.width = width + 'px';
-
-				// Adds title for entry
-				if (this.tooltipTitles && title != null && title.length > 0) {
-					if (this.tooltipTitle == null) {
-						this.tooltipTitle = document.createElement('div');
-						this.tooltipTitle.style.borderTop = '1px solid gray';
-						this.tooltipTitle.style.textAlign = 'center';
-						this.tooltipTitle.style.width = '100%';
-
-						// Oversize titles are cut-off currently. Should make tooltip wider later.
-						this.tooltipTitle.style.overflow = 'hidden';
-
-						if (mxClient.IS_SVG) {
-							this.tooltipTitle.style.paddingTop = '2px';
-						} else {
-							this.tooltipTitle.style.position = 'absolute';
-							this.tooltipTitle.style.paddingTop = '6px';
-						}
-
-						this.tooltip.appendChild(this.tooltipTitle);
-					} else {
-						this.tooltipTitle.innerHTML = '';
-					}
-
-					this.tooltipTitle.style.display = '';
-					mxUtils.write(this.tooltipTitle, title);
-
-					var dy = this.tooltipTitle.offsetHeight + 10;
-					height += dy;
-
-					if (mxClient.IS_SVG) {
-						this.tooltipTitle.style.marginTop = (-dy) + 'px';
-					} else {
-						height -= 6;
-						this.tooltipTitle.style.top = (height - dy) + 'px';
-					}
-				} else if (this.tooltipTitle != null && this.tooltipTitle.parentNode !=
-					null) {
-					this.tooltipTitle.style.display = 'none';
-				}
-
-				this.tooltip.style.height = height + 'px';
-				var x0 = -Math.min(0, bounds.x - this.tooltipBorder);
-				var y0 = -Math.min(0, bounds.y - this.tooltipBorder);
-
-				var left = this.container.clientWidth + this.editorUi.splitSize + 3;
-				var top = Math.max(0, (this.container.offsetTop + elt.offsetTop - this.container
-					.scrollTop - height / 2 + 16));
-
-				if (mxClient.IS_SVG) {
-					this.graph2.view.canvas.setAttribute('transform', 'translate(' + x0 +
-						',' + y0 + ')');
-				} else {
-					this.graph2.view.drawPane.style.left = x0 + 'px';
-					this.graph2.view.drawPane.style.top = y0 + 'px';
-				}
-
-				// Workaround for ignored position CSS style in IE9
-				// (changes to relative without the following line)
-				// Added width of the page-sidebar
-				//		left += document.getElementById('page-sidebar').offsetWidth;
-				// Added static height of the page-navbar
-				top += 90;
-
-				this.tooltip.style.position = 'absolute';
-				this.tooltip.style.left = left + 'px';
-				this.tooltip.style.top = top + 'px';
-				this.tooltipImage.style.left = (left - 13) + 'px';
-				this.tooltipImage.style.top = (top + height / 2 - 13) + 'px';
-			});
-
-			if (this.tooltip != null && this.tooltip.style.display != 'none') {
-				show();
-			} else {
-				this.thread = window.setTimeout(show, this.tooltipDelay);
-			}
-
-			this.currentElt = elt;
-		}
-	}
-};
-
-/**
- * Hides the current tooltip.
- */
-Sidebar.prototype.hideTooltip = function() {
-	if (this.thread != null) {
-		window.clearTimeout(this.thread);
-		this.thread = null;
-	}
-
-	if (this.tooltip != null) {
-		this.tooltip.style.display = 'none';
-		this.tooltipImage.style.visibility = 'hidden';
-		this.currentElt = null;
-	}
-};
-
-/**
- * Creates and returns the given title element.
- */
-Sidebar.prototype.createTitle = function(label) {
-	var elt = document.createElement('a');
-	elt.setAttribute('href', 'javascript:void(0);');
-	elt.className = 'geTitle';
-	mxUtils.write(elt, label);
-
-	return elt;
-};
-
-/**
- * Creates a thumbnail for the given cells.
- */
-Sidebar.prototype.createThumb = function(cells, width, height, parent, title,
-	showLabel) {
-	this.graph.labelsVisible = (showLabel == null || showLabel);
-	this.graph.view.scaleAndTranslate(1, 0, 0);
-	this.graph.addCells(cells);
-	var bounds = this.graph.getGraphBounds();
-	var corr = this.thumbBorder;
-	var s = Math.min((width - 2) / (bounds.width - bounds.x + corr), (height - 2) /
-		(bounds.height - bounds.y + corr));
-	var x0 = -Math.min(bounds.x, 0);
-	var y0 = -Math.min(bounds.y, 0);
-	this.graph.view.scaleAndTranslate(s, x0, y0);
-
-	bounds = this.graph.getGraphBounds();
-	var dx = Math.max(0, Math.floor((width - bounds.width - bounds.x) / 2));
-	var dy = Math.max(0, Math.floor((height - bounds.height - bounds.y) / 2));
-
-	var node = null;
-
-	// For supporting HTML labels in IE9 standards mode the container is cloned instead
-	if (this.graph.dialect == mxConstants.DIALECT_SVG && !mxClient.NO_FO) {
-		node = this.graph.view.getCanvas().ownerSVGElement.cloneNode(true);
-	}
-	// LATER: Check if deep clone can be used for quirks if container in DOM
-	else {
-		node = this.graph.container.cloneNode(false);
-		node.innerHTML = this.graph.container.innerHTML;
-	}
-
-	this.graph.getModel().clear();
-
-	// Catch-all event handling
-	if (mxClient.IS_IE6) {
-		parent.style.backgroundImage = 'url(' + this.editorUi.editor.transparentImage +
-			')';
-	}
-
-	var dd = 3;
-	node.style.position = 'relative';
-	node.style.overflow = 'hidden';
-	node.style.cursor = 'pointer';
-	node.style.left = (dx + dd) + 'px';
-	node.style.top = (dy + dd) + 'px';
-	node.style.width = width + 'px';
-	node.style.height = height + 'px';
-	node.style.visibility = '';
-	node.style.minWidth = '';
-	node.style.minHeight = '';
-
-	parent.appendChild(node);
-
-	// Adds title for sidebar entries
-	if (this.sidebarTitles && title != null) {
-		var border = (mxClient.IS_QUIRKS) ? 2 * this.thumbPadding + 2 : 0;
-		parent.style.height = (this.thumbHeight + border + this.sidebarTitleSize + 8) +
-			'px';
-
-		var div = document.createElement('div');
-		div.style.fontSize = this.sidebarTitleSize + 'px';
-		div.style.textAlign = 'center';
-		div.style.whiteSpace = 'nowrap';
-
-		if (mxClient.IS_IE) {
-			div.style.height = (this.sidebarTitleSize + 12) + 'px';
-		}
-
-		div.style.paddingTop = '4px';
-		mxUtils.write(div, title);
-		parent.appendChild(div);
-	}
-};
-
-/**
- * Creates and returns a new palette item for the given image.
- */
-Sidebar.prototype.createItem = function(cells, title, showLabel) {
-	var elt = document.createElement('a');
-	elt.setAttribute('href', 'javascript:void(0);');
-	elt.className = 'geItem';
-	elt.style.overflow = 'hidden';
-	var border = (mxClient.IS_QUIRKS) ? 8 + 2 * this.thumbPadding : 6;
-	elt.style.width = (this.thumbWidth + border) + 'px';
-	elt.style.height = (this.thumbHeight + border) + 'px';
-	elt.style.padding = this.thumbPadding + 'px';
-
-	// Blocks default click action
-	mxEvent.addListener(elt, 'click', function(evt) {
-		mxEvent.consume(evt);
-	});
-
-	this.createThumb(cells, this.thumbWidth, this.thumbHeight, elt, title,
-		showLabel);
-
-	return elt;
-};
-
-
-/**
- * Creates a drop handler for inserting the given cells.
- */
-Sidebar.prototype.createDropHandler = function(cells, allowSplit) {
-	return function(graph, evt, target, x, y) {
-		if (graph.isEnabled()) {
-			cells = graph.getImportableCells(cells);
-
-			if (cells.length > 0) {
-				var validDropTarget = (target != null) ?
-					graph.isValidDropTarget(target, cells, evt) : false;
-				var select = null;
-
-				if (target != null && !validDropTarget) {
-					target = null;
-				}
-
-				// Splits the target edge or inserts into target group
-				if (allowSplit && graph.isSplitEnabled() && graph.isSplitTarget(target,
-						cells, evt)) {
-					graph.splitEdge(target, cells, null, x, y);
-					select = cells;
-				} else if (cells.length > 0) {
-					select = graph.importCells(cells, x, y, target);
-				}
-
-				if (select != null && select.length > 0) {
-					graph.scrollCellToVisible(select[0]);
-					graph.setSelectionCells(select);
-				}
-			}
-		}
-	};
-};
-
-/**
- * Creates and returns a preview element for the given width and height.
- */
-Sidebar.prototype.createDragPreview = function(width, height) {
-	var elt = document.createElement('div');
-	elt.style.border = '1px dashed black';
-	elt.style.width = width + 'px';
-	elt.style.height = height + 'px';
-
-	return elt;
-};
-
-/**
- * Creates a drag source for the given element.
- */
-Sidebar.prototype.createDragSource = function(elt, dropHandler, preview) {
-	var dragSource = mxUtils.makeDraggable(elt, this.editorUi.editor.graph,
-		dropHandler,
-		preview, 0, 0, this.editorUi.editor.graph.autoscroll, true, true);
-
-
-
-	// Allows drop into cell only if target is a valid root
-	dragSource.getDropTarget = function(graph, x, y) {
-		var target = mxDragSource.prototype.getDropTarget.apply(this, arguments);
-		if (!graph.isValidRoot(target)) {
-			target = null;
-		}
-
-		return target;
-	};
-
-	return dragSource;
-};
-
-
-
-/**
- * Adds a handler for inserting the cell with a single click.
- */
-Sidebar.prototype.addClickHandler = function(elt, ds) {
-	var graph = this.editorUi.editor.graph;
-	var first = null;
-
-	mxEvent.addGestureListeners(elt, function(evt) {
-		first = new mxPoint(mxEvent.getClientX(evt), mxEvent.getClientY(evt));
-	});
-
-	var oldMouseUp = ds.mouseUp;
-	ds.mouseUp = function(evt) {
-		if (!mxEvent.isPopupTrigger(evt) && this.currentGraph == null && first !=
-			null) {
-			var tol = graph.tolerance;
-
-			if (Math.abs(first.x - mxEvent.getClientX(evt)) <= tol &&
-				Math.abs(first.y - mxEvent.getClientY(evt)) <= tol) {
-				var gs = graph.getGridSize();
-				ds.drop(graph, evt, null, gs, gs);
-			}
-		}
-
-		oldMouseUp.apply(this, arguments);
-		first = null;
-	};
-};
-
-/**
- * Giuseppe Careri
- * Create xml document vertex
- */
-Sidebar.prototype.createXmlDocument = function(element, label, variables,
-	values) {
-	var doc = mxUtils.createXmlDocument();
-	var node = doc.createElement(element)
-	node.setAttribute('label', label);
-
-	variables.forEach(function(variable, index) {
-		node.setAttribute(variable, values[index] ? values[index] : '');
-	});
-
-	return node;
-}
-
-/**
- * Giuseppe Careri
- * Creates a drop handler for inserting the given cells.
- */
-Sidebar.prototype.createVertexTemplate = function(style, width, height, value,
-	title, showLabel) {
-	var variables = [];
-	var values = [];
-
-	switch (value) {
-		case 'start':
-			variables = ['id', 'text', 'state'];
-			values = ['0', '', "OFF"];
-			break;
-		case 'end':
-			variables = ['id', 'text'];
-			values = ['0', ''];
-			break;
-		case 'question':
-			variables = ['id', 'question', 'other'];
-			values = ['0', ''];
-			break;
-		case 'input':
-			variables = ['id', 'question', 'add'];
-			values = ['0', ''];
-			break;
-			// case 'email':
-			// 	variables = ["Host", "Username", "Password", "To", "Subject", "Body"];
-			// 	values = [''];
-			// 	break;
-			// case 'sms':
-			// 	variables = ['account_id', 'to', 'sms_text'];
-			// 	values = ['0'];
-			// 	break;
-
-		default:
-			variables = [];
-			values = [];
-			break;
-	}
-
-	var node = this.createXmlDocument(value, title, variables, values);
-
-	//var cells = [new mxCell((value != null) ? value : '', new mxGeometry(0, 0, width, height), style)];
-	var cells = [new mxCell(node, new mxGeometry(0, 0, width, height), style)];
-	cells[0].vertex = true;
-	return this.createVertexTemplateFromCells(cells, width, height, title,
-		showLabel);
-};
-
-
-
-/**
- * Creates a drop handler for inserting the given cells.
- */
-Sidebar.prototype.createVertexTemplateFromCells = function(cells, width, height,
-	title, showLabel) {
-	var elt = this.createItem(cells, title, showLabel);
-	var ds = this.createDragSource(elt, this.createDropHandler(cells, true), this
-		.createDragPreview(width, height));
-	this.addClickHandler(elt, ds);
-
-	// Uses guides for vertices only if enabled in graph
-	ds.isGuidesEnabled = mxUtils.bind(this, function() {
-		return this.editorUi.editor.graph.graphHandler.guidesEnabled;
-	});
-
-	// Shows a tooltip with the rendered cell
-	if (!touchStyle) {
-		mxEvent.addListener(elt, 'mousemove', mxUtils.bind(this, function(evt) {
-			this.showTooltip(elt, cells, title, showLabel);
-		}));
-	}
-
-	return elt;
-};
-
-/**
- * Creates a drop handler for inserting the given cells.
- */
-Sidebar.prototype.createEdgeTemplate = function(style, width, height, value,
-	title, showLabel) {
-	var cells = [new mxCell((value != null) ? value : '', new mxGeometry(0, 0,
-		width, height), style)];
-	cells[0].geometry.setTerminalPoint(new mxPoint(0, height), true);
-	cells[0].geometry.setTerminalPoint(new mxPoint(width, 0), false);
-	cells[0].geometry.relative = true;
-	cells[0].edge = true;
-
-	return this.createEdgeTemplateFromCells(cells, width, height, title,
-		showLabel);
-};
-
-/**
- * Creates a drop handler for inserting the given cells.
- */
-Sidebar.prototype.createEdgeTemplateFromCells = function(cells, width, height,
-	title, showLabel) {
-	var elt = this.createItem(cells, title, showLabel);
-	this.createDragSource(elt, this.createDropHandler(cells, false), this.createDragPreview(
-		width, height));
-
-	// Installs the default edge
-	var graph = this.editorUi.editor.graph;
-	mxEvent.addListener(elt, 'click', mxUtils.bind(this, function(evt) {
-		if (this.installEdges) {
-			graph.setDefaultEdge(cells[0]);
-		}
-
-		// Highlights the entry for 200ms
-		elt.style.backgroundColor = '#ffffff';
-
-		window.setTimeout(function() {
-			elt.style.backgroundColor = '';
-		}, 300);
-
-		mxEvent.consume(evt);
-	}));
-
-	// Shows a tooltip with the rendered cell
-	touchStyle = false;
-	if (!touchStyle) {
-		mxEvent.addListener(elt, 'mousemove', mxUtils.bind(this, function(evt) {
-			this.showTooltip(elt, cells, title, showLabel);
-		}));
-	}
-
-	return elt;
-};
-
-/**
- * Adds the given palette.
- */
-Sidebar.prototype.addPalette = function(id, title, expanded, onInit) {
-	var elt = this.createTitle(title);
-	this.container.appendChild(elt);
-
-	var div = document.createElement('div');
-	div.className = 'geSidebar';
-
-	if (expanded) {
-		onInit(div);
-		onInit = null;
-	} else {
-		div.style.display = 'none';
-	}
-
-	this.addFoldingHandler(elt, div, onInit);
-
-	var outer = document.createElement('div');
-	outer.appendChild(div);
-	this.container.appendChild(outer);
-
-	// Keeps references to the DOM nodes
-	if (id != null) {
-		this.palettes[id] = [elt, outer];
-	}
-};
-
-/**
- * Create the given title element.
- */
-Sidebar.prototype.addFoldingHandler = function(title, content, funct) {
-	var initialized = false;
-
-	title.style.backgroundImage = (content.style.display == 'none') ?
-		'url(' + IMAGE_PATH + '/collapsed.gif)' : 'url(' + IMAGE_PATH +
-		'/expanded.gif)';
-	title.style.backgroundRepeat = 'no-repeat';
-	title.style.backgroundPosition = '100% 50%';
-
-	mxEvent.addListener(title, 'click', function(evt) {
-		if (content.style.display == 'none') {
-			if (!initialized) {
-				initialized = true;
-
-				if (funct != null) {
-					title.style.cursor = 'wait';
-					window.setTimeout(function() {
-						funct(content);
-						title.style.cursor = '';
-					}, 0);
-				}
-			}
-
-			title.style.backgroundImage = 'url(' + IMAGE_PATH + '/expanded.gif)';
-			content.style.display = 'block';
-		} else {
-			title.style.backgroundImage = 'url(' + IMAGE_PATH + '/collapsed.gif)';
-			content.style.display = 'none';
-		}
-
-		mxEvent.consume(evt);
-	});
-};
-
-/**
- * Removes the palette for the given ID.
- */
-Sidebar.prototype.removePalette = function(id) {
-	var elts = this.palettes[id];
-
-	if (elts != null) {
-		this.palettes[id] = null;
-
-		for (var i = 0; i < elts.length; i++) {
-			this.container.removeChild(elts[i]);
-		}
-
-		return true;
-	}
-
-	return false;
-};
-
-/**
- * Adds the given image palette.
- */
-Sidebar.prototype.addImagePalette = function(id, title, prefix, postfix, items,
-	titles) {
-	// Giuseppe Careri
-	// Expanded Sidebar only entry
-	this.addPalette(id, title, (id === 'entry'), mxUtils.bind(this, function(
-		content) {
-		var showTitles = titles != null;
-
-		for (var i = 0; i < items.length; i++) {
-			var icon = prefix + items[i] + postfix;
-			content.appendChild(this.createVertexTemplate('image;image=' + icon, 80,
-				80, items[i], (showTitles) ? titles[i] : null, showTitles));
-		}
-	}));
-};
-// ***********modified***************
-// Sidebar.prototype.addBpmnPalette = function(dir, expand) {
-// 	//Abigael Dawit
-//
-// 	var fns = [
-// 		this.createVertexTemplate(
-// 			'text;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;overflow=hidden;',
-// 			40, 20, 'Text', 'Text', null),
-// 		//this.createVertexTemplate('shape=ext;rounded=1;whiteSpace=wrap;dashed=1;dashPattern=1 4;', 120, 80, 'Event\nSub-Process', 'Event Sub-Process', null),
-// 		this.createVertexTemplate('shape=swimlane;whiteSpace=wrap;startSize=60;',
-// 			120, 160, 'Container', 'Container', null),
-// 		//	this.createVertexTemplate('shape=ellipse;', 120, 160, 'Ellips', 'Ellipse', null)
-// 		this.createVertexTemplate(
-// 			'shape=swimlane;html=1;horizontal=0;swimlaneFillColor=white;swimlaneLine=0;fillColor=none;rounded=1;verticalAlign=middle',
-// 			300, 120, 'Lane', 'Lane', null)
-//
-// 	]
-//
-// 	this.addPalette('utility', 'Utility ', false, mxUtils.bind(this, function(
-// 		content) {
-// 		//var showTitles = titles != null;
-// 		for (var i = 0; i < fns.length; i++) {
-// 			content.appendChild(fns[i]);
-// 		}
-// 	}));
-//
-// };
\ No newline at end of file
diff --git a/public/assets/plugins/jscripty/js/Toolbar.js b/public/assets/plugins/jscripty/js/Toolbar.js
index 7eab562..f3f93e7 100644
--- a/public/assets/plugins/jscripty/js/Toolbar.js
+++ b/public/assets/plugins/jscripty/js/Toolbar.js
@@ -1,407 +1 @@
-/**
- * $Id: Toolbar.js,v 1.3 2013-02-20 16:21:29 gaudenz Exp $
- * Copyright (c) 2006-2012, JGraph Ltd
- */
-/**
- * Construcs a new toolbar for the given editor.
- */
-function Toolbar(editorUi, container)
-{
-	this.editorUi = editorUi;
-	this.container = container;
-	this.init();
-
-	// Global handler to hide the current menu
-	mxEvent.addGestureListeners(document, mxUtils.bind(this, function(evt)
-	{
-		this.hideMenu();
-	}));
-};
-
-/**
- * Adds the toolbar elements.
- */
-Toolbar.prototype.init = function()
-{
-	this.addItems(['save', 'publish', '-', 'print', 'undo', 'redo', '-', 'copy', 'cut', 'paste', 'delete', '-', 'duplicate', '-', 'actualSize', 'zoomIn', 'zoomOut', '-']);
-	var fontElt = this.addMenu('Helvetica', mxResources.get('fontFamily'), true, 'fontFamily');
-	fontElt.style.whiteSpace = 'nowrap';
-	fontElt.style.overflow = 'hidden';
-	fontElt.style.width = '70px';
-	this.addSeparator();
-	var sizeElt = this.addMenu('12', mxResources.get('fontSize'), true, 'fontSize');
-	sizeElt.style.whiteSpace = 'nowrap';
-	sizeElt.style.overflow = 'hidden';
-	sizeElt.style.width = '30px';
-
-	this.addItems(['-', 'bold', 'italic', 'underline']);
-	// Giuseppe Careri
-	// var align = this.addMenuFunction('geSprite-left', mxResources.get('align'), false, mxUtils.bind(this, function(menu)
-	// {
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ALIGN], [mxConstants.ALIGN_LEFT], 'geIcon geSprite geSprite-left', null).setAttribute('title', mxResources.get('left'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ALIGN], [mxConstants.ALIGN_CENTER], 'geIcon geSprite geSprite-center', null).setAttribute('title', mxResources.get('center'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ALIGN], [mxConstants.ALIGN_RIGHT], 'geIcon geSprite geSprite-right', null).setAttribute('title', mxResources.get('right'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_VERTICAL_ALIGN], [mxConstants.ALIGN_TOP], 'geIcon geSprite geSprite-top', null).setAttribute('title', mxResources.get('top'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_VERTICAL_ALIGN], [mxConstants.ALIGN_MIDDLE], 'geIcon geSprite geSprite-middle', null).setAttribute('title', mxResources.get('middle'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_VERTICAL_ALIGN], [mxConstants.ALIGN_BOTTOM], 'geIcon geSprite geSprite-bottom', null).setAttribute('title', mxResources.get('bottom'));
-	// }));
-	// this.addItems(['fontColor', '-']);
-	// var line = this.addMenuFunction('geSprite-straight', mxResources.get('line'), false, mxUtils.bind(this, function(menu)
-	// {
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_EDGE], [null], 'geIcon geSprite geSprite-straight', null).setAttribute('title', mxResources.get('straight'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_EDGE], ['entityRelationEdgeStyle'], 'geIcon geSprite geSprite-entity', null).setAttribute('title', mxResources.get('entityRelation'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_ELBOW], ['elbowEdgeStyle', 'horizontal'], 'geIcon geSprite geSprite-helbow', null).setAttribute('title', mxResources.get('horizontal'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_ELBOW], ['elbowEdgeStyle', 'vertical'], 'geIcon geSprite geSprite-velbow', null).setAttribute('title', mxResources.get('vertical'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_EDGE], ['segmentEdgeStyle'], 'geIcon geSprite geSprite-segment', null).setAttribute('title', mxResources.get('manual'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_EDGE], ['orthogonalEdgeStyle'], 'geIcon geSprite geSprite-orthogonal', null).setAttribute('title', mxResources.get('automatic'));
-	// }));
-	// var linestart = this.addMenuFunction('geSprite-startclassic', mxResources.get('lineend'), false, mxUtils.bind(this, function(menu)
-	// {
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.NONE, 0], 'geIcon geSprite geSprite-noarrow', null).setAttribute('title', mxResources.get('none'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_CLASSIC, 1], 'geIcon geSprite geSprite-startclassic', null).setAttribute('title', mxResources.get('classic'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_OPEN, 1], 'geIcon geSprite geSprite-startopen', null).setAttribute('title', mxResources.get('openArrow'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_BLOCK, 1], 'geIcon geSprite geSprite-startblock', null).setAttribute('title', mxResources.get('block'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_OVAL, 1], 'geIcon geSprite geSprite-startoval', null).setAttribute('title', mxResources.get('oval'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_DIAMOND, 1], 'geIcon geSprite geSprite-startdiamond', null).setAttribute('title', mxResources.get('diamond'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_DIAMOND_THIN, 1], 'geIcon geSprite geSprite-startthindiamond', null).setAttribute('title', mxResources.get('diamondThin'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_CLASSIC, 0], 'geIcon geSprite geSprite-startclassictrans', null).setAttribute('title', mxResources.get('classic'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_BLOCK, 0], 'geIcon geSprite geSprite-startblocktrans', null).setAttribute('title', mxResources.get('block'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_OVAL, 0], 'geIcon geSprite geSprite-startovaltrans', null).setAttribute('title', mxResources.get('oval'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_DIAMOND, 0], 'geIcon geSprite geSprite-startdiamondtrans', null).setAttribute('title', mxResources.get('diamond'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_DIAMOND_THIN, 0], 'geIcon geSprite geSprite-startthindiamondtrans', null).setAttribute('title', mxResources.get('diamondThin'));
-	// }));
-	// var lineend = this.addMenuFunction('geSprite-endclassic', mxResources.get('lineend'), false, mxUtils.bind(this, function(menu)
-	// {
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.NONE, 0], 'geIcon geSprite geSprite-noarrow', null).setAttribute('title', mxResources.get('none'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_CLASSIC, 1], 'geIcon geSprite geSprite-endclassic', null).setAttribute('title', mxResources.get('classic'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_OPEN, 1], 'geIcon geSprite geSprite-endopen', null).setAttribute('title', mxResources.get('openArrow'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_BLOCK, 1], 'geIcon geSprite geSprite-endblock', null).setAttribute('title', mxResources.get('block'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_OVAL, 1], 'geIcon geSprite geSprite-endoval', null).setAttribute('title', mxResources.get('oval'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_DIAMOND, 1], 'geIcon geSprite geSprite-enddiamond', null).setAttribute('title', mxResources.get('diamond'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_DIAMOND_THIN, 1], 'geIcon geSprite geSprite-endthindiamond', null).setAttribute('title', mxResources.get('diamondThin'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_CLASSIC, 0], 'geIcon geSprite geSprite-endclassictrans', null).setAttribute('title', mxResources.get('classic'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_BLOCK, 0], 'geIcon geSprite geSprite-endblocktrans', null).setAttribute('title', mxResources.get('block'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_OVAL, 0], 'geIcon geSprite geSprite-endovaltrans', null).setAttribute('title', mxResources.get('oval'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_DIAMOND, 0], 'geIcon geSprite geSprite-enddiamondtrans', null).setAttribute('title', mxResources.get('diamond'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_DIAMOND_THIN, 0], 'geIcon geSprite geSprite-endthindiamondtrans', null).setAttribute('title', mxResources.get('diamondThin'));
-	// }));
-	// this.addItems(['-', 'strokeColor', 'image', 'fillColor']);
-	// this.addItem('geSprite-gradientcolor', 'gradientColor').setAttribute('title', mxResources.get('gradient'));
-	// this.addItems(['shadow']);
-
-	var graph = this.editorUi.editor.graph;
-
-	// Update font size and font family labels
-	var update = mxUtils.bind(this, function()
-	{
-		var ff = 'Helvetica';
-		var fs = '12';
-    	var state = graph.getView().getState(graph.getSelectionCell());
-
-    	if (state != null)
-    	{
-    		ff = state.style[mxConstants.STYLE_FONTFAMILY] || ff;
-    		fs = state.style[mxConstants.STYLE_FONTSIZE] || fs;
-
-    		if (ff.length > 10)
-    		{
-    			ff = ff.substring(0, 8) + '...';
-    		}
-
-    		fontElt.innerHTML = ff;
-    		sizeElt.innerHTML = fs;
-    	}
-	});
-
-    graph.getSelectionModel().addListener(mxEvent.CHANGE, update);
-    graph.getModel().addListener(mxEvent.CHANGE, update);
-
-	// Giuseppe Careri
-	// Updates button states
-  //this.addEdgeSelectionHandler([line, linestart, lineend]);
-	//this.addSelectionHandler([align]);
-};
-
-/**
- * Hides the current menu.
- */
-Toolbar.prototype.hideMenu = function()
-{
-	if (this.currentMenu != null)
-	{
-		this.currentMenu.hideMenu();
-		this.currentMenu.destroy();
-		this.currentMenu = null;
-	}
-};
-
-/**
- * Adds a label to the toolbar.
- */
-Toolbar.prototype.addMenu = function(label, tooltip, showLabels, name)
-{
-	var menu = this.editorUi.menus.get(name);
-	var elt = this.addMenuFunction(label, tooltip, showLabels, menu.funct);
-
-	menu.addListener('stateChanged', function()
-	{
-		elt.setEnabled(menu.enabled);
-	});
-
-	return elt;
-};
-
-/**
- * Adds a label to the toolbar.
- */
-Toolbar.prototype.addMenuFunction = function(label, tooltip, showLabels, funct)
-{
-	var elt = (showLabels) ? this.createLabel(label) : this.createButton(label);
-	this.initElement(elt, tooltip);
-	this.addMenuHandler(elt, showLabels, funct);
-	this.container.appendChild(elt);
-
-	return elt;
-};
-
-/**
- * Adds a separator to the separator.
- */
-Toolbar.prototype.addSeparator = function()
-{
-	var elt = document.createElement('div');
-	elt.className = 'geSeparator';
-	this.container.appendChild(elt);
-
-	return elt;
-};
-
-/**
- * Adds given action item
- */
-Toolbar.prototype.addItems = function(keys)
-{
-	for (var i = 0; i < keys.length; i++)
-	{
-		var key = keys[i];
-
-		if (key == '-')
-		{
-			this.addSeparator();
-		}
-		else
-		{
-			this.addItem('geSprite-' + key.toLowerCase(), key);
-		}
-	}
-};
-
-/**
- * Adds given action item
- */
-Toolbar.prototype.addItem = function(sprite, key)
-{
-	var action = this.editorUi.actions.get(key);
-	var elt = null;
-
-	if (action != null)
-	{
-		elt = this.addButton(sprite, action.label, action.funct);
-		elt.setEnabled(action.enabled);
-
-		action.addListener('stateChanged', function()
-		{
-			elt.setEnabled(action.enabled);
-		});
-	}
-
-	return elt;
-};
-
-/**
- * Adds a button to the toolbar.
- */
-Toolbar.prototype.addButton = function(classname, tooltip, funct)
-{
-	var elt = this.createButton(classname);
-
-	this.initElement(elt, tooltip);
-	this.addClickHandler(elt, funct);
-	this.container.appendChild(elt);
-
-	return elt;
-};
-
-/**
- * Updates the states of the given toolbar items based on the selection.
- */
-Toolbar.prototype.addSelectionHandler = function(items)
-{
-	var graph = this.editorUi.editor.graph;
-
-	var selectionListener = function()
-    {
-    	var selected = !graph.isSelectionEmpty();
-
-    	for (var i = 0; i < items.length; i++)
-    	{
-    		items[i].setEnabled(selected);
-    	}
-    };
-
-    graph.getSelectionModel().addListener(mxEvent.CHANGE, selectionListener);
-    selectionListener();
-};
-
-/**
- * Updates the states of the given toolbar items based on the selection.
- */
-Toolbar.prototype.addEdgeSelectionHandler = function(items)
-{
-	var graph = this.editorUi.editor.graph;
-
-	var selectionListener = function()
-    {
-		var edgeSelected = false;
-
-		if (!graph.isSelectionEmpty())
-		{
-			var cells = graph.getSelectionCells();
-
-			for (var i = 0; i < cells.length; i++)
-			{
-				if (graph.getModel().isEdge(cells[i]))
-				{
-					edgeSelected = true;
-					break;
-				}
-			}
-		}
-
-    	for (var i = 0; i < items.length; i++)
-    	{
-    		items[i].setEnabled(edgeSelected);
-    	}
-    };
-
-    graph.getSelectionModel().addListener(mxEvent.CHANGE, selectionListener);
-    selectionListener();
-};
-
-/**
- * Initializes the given toolbar element.
- */
-Toolbar.prototype.initElement = function(elt, tooltip)
-{
-	elt.setAttribute('tabindex', '0');
-
-	// Adds tooltip
-	if (tooltip != null)
-	{
-		elt.setAttribute('title', tooltip);
-	}
-
-	this.addEnabledState(elt);
-};
-
-/**
- * Adds enabled state with setter to DOM node (avoids JS wrapper).
- */
-Toolbar.prototype.addEnabledState = function(elt)
-{
-	var classname = elt.className;
-
-	elt.setEnabled = function(value)
-	{
-		elt.enabled = value;
-
-		if (value)
-		{
-			elt.className = classname;
-		}
-		else
-		{
-			elt.className = classname + ' geDisabled';
-		}
-	};
-
-	elt.setEnabled(true);
-};
-
-/**
- * Adds enabled state with setter to DOM node (avoids JS wrapper).
- */
-Toolbar.prototype.addClickHandler = function(elt, funct)
-{
-	if (funct != null)
-	{
-		mxEvent.addListener(elt, 'click', function(evt)
-		{
-			if (elt.enabled)
-			{
-				funct(evt);
-			}
-
-			mxEvent.consume(evt);
-		});
-	}
-};
-
-/**
- * Creates and returns a new button.
- */
-Toolbar.prototype.createButton = function(classname)
-{
-	var elt = document.createElement('a');
-	elt.setAttribute('href', 'javascript:void(0);');
-	elt.className = 'geButton';
-
-	var inner = document.createElement('div');
-	inner.className = 'geSprite ' + classname;
-	elt.appendChild(inner);
-
-	return elt;
-};
-
-/**
- * Creates and returns a new button.
- */
-Toolbar.prototype.createLabel = function(label, tooltip)
-{
-	var elt = document.createElement('a');
-	elt.setAttribute('href', 'javascript:void(0);');
-	elt.className = 'geLabel';
-	mxUtils.write(elt, label);
-
-	return elt;
-};
-
-/**
- * Adds a handler for showing a menu in the given element.
- */
-Toolbar.prototype.addMenuHandler = function(elt, showLabels, funct, showAll)
-{
-	if (funct != null)
-	{
-		var graph = this.editorUi.editor.graph;
-		var menu = null;
-
-		mxEvent.addListener(elt, 'click', mxUtils.bind(this, function(evt)
-		{
-			if (elt.enabled == null || elt.enabled)
-			{
-				graph.panningHandler.hideMenu();
-				menu = new mxPopupMenu(funct);
-				menu.div.className += ' geToolbarMenu';
-				menu.showDisabled = showAll;
-				menu.labels = showLabels;
-				menu.autoExpand = true;
-
-				menu.popup(elt.offsetLeft, elt.offsetTop + elt.offsetHeight + 34, null, evt);
-				this.currentMenu = menu;
-			}
-
-			mxEvent.consume(evt);
-		}));
-	}
-};
\ No newline at end of file
diff --git a/public/assets/plugins/jscripty/js/custom.js b/public/assets/plugins/jscripty/js/custom.js
index a53e30b..f17194c 100644
--- a/public/assets/plugins/jscripty/js/custom.js
+++ b/public/assets/plugins/jscripty/js/custom.js
@@ -1,283 +1 @@
-var urlParams = (function(url) {
-	var result = new Object();
-	var idx = url.lastIndexOf('?');
-
-	if (idx > 0) {
-		var params = url.substring(idx + 1).split('&');
-
-		for (var i = 0; i < params.length; i++) {
-			idx = params[i].indexOf('=');
-
-			if (idx > 0) {
-				result[params[i].substring(0, idx)] = params[i].substring(idx + 1);
-			}
-		}
-	}
-
-	return result;
-})(window.location.href);
-
-var t0 = new Date();
-
-// Public global variables
-var MAX_REQUEST_SIZE = 10485760;
-var MAX_WIDTH = 12000;
-var MAX_HEIGHT = 12000;
-
-// CUSTOM_PARAMETERS - URLs for save and export
-var EXPORT_URL = 'http://exp.draw.io/ImageExport2/export';
-var SHARE_HOST = 'http://localhost:3000';
-
-var SAVE_URL = 'api/jscripty/projects/';
-var VARIABLE_URL = 'api/square/variables/';
-
-// Paths and files
-var STENCIL_PATH = '/assets/plugins/jscripty/stencils';
-var SHAPES_PATH = '/assets/plugins/mxgraph/shapes';
-var IMAGE_PATH = '/assets/plugins/mxgraph/images';
-// Path for images inside the diagram
-//var GRAPH_IMAGE_PATH = 'assets/plugins/mxgraph/img';
-//var ICONFINDER_PATH = 'iconfinder';
-var STYLE_PATH = '/assets/plugins/mxgraph/styles';
-var CSS_PATH = '/assets/plugins/mxgraph/styles';
-var OPEN_FORM = 'api/jscripty/projects/open';
-var TEMPLATE_PATH = '/assets/plugins/jscripty/templates';
-
-// Directory for i18 files and basename for main i18n file
-var RESOURCES_PATH = '/assets/plugins/jscripty/resources';
-var RESOURCE_BASE = RESOURCES_PATH + '/dia';
-
-// Specifies connection mode for touch devices (at least one should be true)
-var tapAndHoldStartsConnection = true;
-var showConnectorImg = true;
-
-var mxLoadResources = false;
-// var mxLanguage = '';
-console.log('custom', localStorage.getItem("NG_TRANSLATE_LANG_KEY"));
-switch (localStorage.getItem("NG_TRANSLATE_LANG_KEY")) {
-	case 'en_EN':
-		mxLanguage = 'en';
-		break;
-	case 'it':
-		mxLanguage = 'it';
-		break;
-	default:
-		mxLanguage = 'it';
-}
-console.log('mxLanguage', mxLanguage);
-
-var mxLanguages = ['ar', 'bs', 'cs', 'da', 'de', 'el', 'es', 'es-ar', 'fr',
-	'hu', 'id', 'it', 'ja', 'ko', 'nl', 'no', 'pl', 'pt-br', 'pt', 'ro', 'ru',
-	'sr', 'sv', 'th', 'tr', 'uk', 'zh'
-];
-var mxBasePath = 'assets/plugins/mxgraph';
-var geBasePath = 'assets/plugins/mxgraph/js';
-
-var ISPEECHLANG = {
-	usenglishfemale: "US English Female",
-	usenglishmale: "US English Male",
-	ukenglishfemale: "UK English Female",
-	ukenglishmale: "UK English Male",
-	auenglishfemale: "Australian English",
-	usspanishfemale: "US Spanish Female",
-	usspanishmale: "US Spanish Male",
-	chchinesefemale: "Chinese Female",
-	chchinesemale: "Chinese Male",
-	hkchinesefemale: "Hong Kong Cantonese Female",
-	twchinesefemale: "Taiwan Chinese Female",
-	jpjapanesefemale: "Japanese Female",
-	jpjapanesemale: "Japanese Male",
-	krkoreanfemale: "Korean Female",
-	krkoreanmale: "Korean Male",
-	caenglishfemale: "Canadian English Female",
-	huhungarianfemale: "Hungarian Female",
-	brportuguesefemale: "Brazilian Portuguese Female",
-	eurportuguesefemale: "European Portuguese Female",
-	eurportuguesemale: "European Portuguese Male",
-	eurspanishfemale: "European Spanish Female",
-	eurspanishmale: "European Spanish Male",
-	eurcatalanfemale: "European Catalan Female",
-	eurczechfemale: "European Czech Female",
-	eurdanishfemale: "European Danish Female",
-	eurfinnishfemale: "European Finnish Female",
-	eurfrenchfemale: "European French Female",
-	eurfrenchmale: "European French Male",
-	eurnorwegianfemale: "European Norwegian Female",
-	eurdutchfemale: "European Dutch Female",
-	eurpolishfemale: "European Polish Female",
-	euritalianfemale: "European Italian Female",
-	eurturkishfemale: "European Turkish Female	",
-	eurturkishmale: "European Turkish Male",
-	eurgermanfemale: "European German Female",
-	eurgermanmale: "European German Male",
-	rurussianfemale: "Russian Female",
-	rurussianmale: "Russian Male",
-	swswedishfemale: "Swedish Female",
-	cafrenchfemale: "Canadian French Female",
-	cafrenchmale: "Canadian French Male"
-};
-
-var ISPEECHASRLANG = {
-	"en-US": "English (US)",
-	"en-CA": "English (Canada)",
-	"en-GB": "English (UK)",
-	"en-AU": "English (Australia)",
-	"es-ES": "Spanish (Spain)",
-	"es-MX": "Spanish (Mexico)",
-	"it-IT": "Italian (Italy) / Finnish (Finland)",
-	"fr-FR": "French (France)",
-	"fr-CA": "French (Canada)",
-	"pl-PL": "Polish (Poland)",
-	"pt-PT": "Portuguese (Portugal)",
-	"ca-ES": "Catalan (Catalan)",
-	"zh-TW": "Chinese (Taiwan)",
-	"da-DK": "Danish (Denmark)",
-	"fr-FR": "German (Germany)",
-	"ja-JP": "Japanese (Japan)",
-	"ko-KR": "Korean (Korea)",
-	"nl-NL": "Dutch (Netherlands)",
-	"nb-NO": "Norwegian (Norway)",
-	"pt-BR": "Portuguese (Brazil)",
-	"ru-RU": "Russian (Russia)",
-	"sv-SE": "Swedish (Sweden)",
-	"zh-CN": "Chinese (China)",
-	"zh-HK": "Chinese (Hong Kong)"
-};
-
-var ISPEECHASRMODEL = {
-	0: "Default",
-	date: "Date",
-	usmoney: "US Money",
-	numbersto9: "Numbers to 9",
-	numbersto99: "Numbers to 99",
-	numbersto999: "Numbers to 999",
-	time: "Time",
-	phonenumber: "Phone number",
-	streets: "Streets",
-	citystate: "US City/States"
-};
-
-var GOOGLETTSLANG = {
-	"af": "Afrikaans",
-	"sq": "Albanian",
-	"am": "Amharic",
-	"ar": "Arabic",
-	"hy": "Armenian",
-	"az": "Azerbaijani",
-	"eu": "Basque",
-	"be": "Belarusian",
-	"bn": "Bengali",
-	"bh": "Bihari",
-	"bs": "Bosnian",
-	"br": "Breton",
-	"bg": "Bulgarian",
-	"km": "Cambodian",
-	"ca": "Catalan",
-	"zh-CN": "Chinese (Simplified)",
-	"zh-TW": "Chinese (Traditional)",
-	"co": "Corsican",
-	"hr": "Croatian",
-	"cs": "Czech",
-	"da": "Danish",
-	"nl": "Dutch",
-	"en": "English",
-	"eo": "Esperanto",
-	"et": "Estonian",
-	"fo": "Faroese",
-	"tl": "Filipino",
-	"fi": "Finnish",
-	"fr": "French",
-	"fy": "Frisian",
-	"gl": "Galician",
-	"ka": "Georgian",
-	"de": "German",
-	"el": "Greek",
-	"gn": "Guarani",
-	"gu": "Gujarati",
-	"xx-hacker": "Hacker",
-	"ha": "Hausa",
-	"iw": "Hebrew",
-	"hi": "Hindi",
-	"hu": "Hungarian",
-	"is": "Icelandic",
-	"id": "Indonesian",
-	"ia": "Interlingua",
-	"ga": "Irish",
-	"it": "Italian",
-	"jw": "Javanese",
-	"ja": "Japanese",
-	"kn": "Kannada",
-	"kk": "Kazakh",
-	"rw": "Kinyarwanda",
-	"rn": "Kirundi",
-	"xx-klingon": "Klingon",
-	"ku": "Kurdish",
-	"ko": "Korean",
-	"ky": "Kyrgyz",
-	"lo": "Laothian",
-	"la": "Latin",
-	"lv": "Latvian",
-	"ln": "Lingala",
-	"lt": "Lithuanian",
-	"mk": "Macedonian",
-	"mg": "Malagasy",
-	"ms": "Malay",
-	"ml": "Malayalam",
-	"mt": "Maltese",
-	"mi": "Maori",
-	"mr": "Marathi",
-	"mo": "Moldavian",
-	"mn": "Mongolian",
-	"sr-ME": "Montenegrin",
-	"ne": "Nepali",
-	"no": "Norwegian",
-	"nn": "Norwegian (Nynorsk)",
-	"oc": "Occitan",
-	"or": "Oriya",
-	"om": "Oromo",
-	"ps": "Pashto",
-	"fa": "Persian",
-	"xx-pirate": "Pirate",
-	"pl": "Polish",
-	"pt-BR": "Portuguese (Brazil)",
-	"pt-PT": "Portuguese (Portugal)",
-	"pa": "Punjabi",
-	"qu": "Quechua",
-	"ro": "Romanian",
-	"rm": "Romansh",
-	"ru": "Russian",
-	"gd": "Scots Gaelic",
-	"sr": "Serbian",
-	"sh": "Serbo-Croatian",
-	"st": "Sesotho",
-	"sn": "Shona",
-	"sd": "Sindhi",
-	"si": "Sinhalese",
-	"sk": "Slovak",
-	"sl": "Slovenian",
-	"so": "Somali",
-	"es": "Spanish",
-	"su": "Sundanese",
-	"sw": "Swahili",
-	"sv": "Swedish",
-	"tg": "Tajik",
-	"ta": "Tamil",
-	"tt": "Tatar",
-	"te": "Telugu",
-	"th": "Thai",
-	"ti": "Tigrinya",
-	"to": "Tonga",
-	"tr": "Turkish",
-	"tk": "Turkmen",
-	"tw": "Twi",
-	"ug": "Uighur",
-	"uk": "Ukrainian",
-	"ur": "Urdu",
-	"uz": "Uzbek",
-	"vi": "Vietnamese",
-	"cy": "Welsh",
-	"xh": "Xhosa",
-	"yi": "Yiddish",
-	"yo": "Yoruba",
-	"zu": "Zulu"
-};
\ No newline at end of file
diff --git a/public/assets/plugins/mxgraph/js/mxClient.js b/public/assets/plugins/mxgraph/js/mxClient.js
index e795889..b276f9e 100644
--- a/public/assets/plugins/mxgraph/js/mxClient.js
+++ b/public/assets/plugins/mxgraph/js/mxClient.js
@@ -1,18737 +1 @@
-var mxClient = {
-  VERSION: "2.0.0.0",
-  IS_IE: 0 <= navigator.userAgent.indexOf("MSIE"),
-  IS_IE6: 0 <= navigator.userAgent.indexOf("MSIE 6"),
-  IS_QUIRKS: 0 <= navigator.userAgent.indexOf("MSIE") && (null == document.documentMode || 5 == document.documentMode),
-  VML_PREFIX: "v",
-  OFFICE_PREFIX: "o",
-  IS_NS: 0 <= navigator.userAgent.indexOf("Mozilla/") && 0 > navigator.userAgent.indexOf("MSIE"),
-  IS_OP: 0 <= navigator.userAgent.indexOf("Opera/"),
-  IS_OT: 0 > navigator.userAgent.indexOf("Presto/2.4.") && 0 > navigator.userAgent.indexOf("Presto/2.3.") && 0 > navigator.userAgent.indexOf("Presto/2.2.") &&
-    0 > navigator.userAgent.indexOf("Presto/2.1.") && 0 > navigator.userAgent.indexOf("Presto/2.0.") && 0 > navigator.userAgent.indexOf("Presto/1."),
-  IS_SF: 0 <= navigator.userAgent.indexOf("AppleWebKit/") && 0 > navigator.userAgent.indexOf("Chrome/"),
-  IS_GC: 0 <= navigator.userAgent.indexOf("Chrome/"),
-  IS_MT: 0 <= navigator.userAgent.indexOf("Firefox/") && 0 > navigator.userAgent.indexOf("Firefox/1.") && 0 > navigator.userAgent.indexOf("Firefox/2.") || 0 <= navigator.userAgent.indexOf(
-      "Iceweasel/") && 0 > navigator.userAgent.indexOf("Iceweasel/1.") &&
-    0 > navigator.userAgent.indexOf("Iceweasel/2.") || 0 <= navigator.userAgent.indexOf("SeaMonkey/") && 0 > navigator.userAgent.indexOf("SeaMonkey/1.") || 0 <= navigator.userAgent.indexOf(
-      "Iceape/") && 0 > navigator.userAgent.indexOf("Iceape/1."),
-  IS_SVG: 0 <= navigator.userAgent.indexOf("Firefox/") || 0 <= navigator.userAgent.indexOf("Iceweasel/") || 0 <= navigator.userAgent.indexOf("Seamonkey/") || 0 <= navigator.userAgent.indexOf(
-      "Iceape/") || 0 <= navigator.userAgent.indexOf("Galeon/") || 0 <= navigator.userAgent.indexOf("Epiphany/") || 0 <=
-    navigator.userAgent.indexOf("AppleWebKit/") || 0 <= navigator.userAgent.indexOf("Gecko/") || 0 <= navigator.userAgent.indexOf("Opera/"),
-  NO_FO: 0 <= navigator.userAgent.indexOf("Firefox/1.") || 0 <= navigator.userAgent.indexOf("Iceweasel/1.") || 0 <= navigator.userAgent.indexOf("Firefox/2.") || 0 <= navigator.userAgent.indexOf(
-      "Iceweasel/2.") || 0 <= navigator.userAgent.indexOf("SeaMonkey/1.") || 0 <= navigator.userAgent.indexOf("Iceape/1.") || 0 <= navigator.userAgent.indexOf("Camino/1.") || 0 <= navigator.userAgent
-    .indexOf("Epiphany/2.") ||
-    0 <= navigator.userAgent.indexOf("Opera/") || 0 <= navigator.userAgent.indexOf("MSIE") || 0 <= navigator.userAgent.indexOf("Mozilla/2."),
-  IS_VML: "MICROSOFT INTERNET EXPLORER" == navigator.appName.toUpperCase(),
-  IS_MAC: 0 < navigator.userAgent.toUpperCase().indexOf("MACINTOSH"),
-  IS_TOUCH: 0 < navigator.userAgent.toUpperCase().indexOf("IPAD") || 0 < navigator.userAgent.toUpperCase().indexOf("IPOD") || 0 < navigator.userAgent.toUpperCase().indexOf("IPHONE") || 0 <
-    navigator.userAgent.toUpperCase().indexOf("ANDROID"),
-  IS_LOCAL: 0 > document.location.href.indexOf("http://") &&
-    0 > document.location.href.indexOf("https://"),
-  isBrowserSupported: function() {
-    return mxClient.IS_VML || mxClient.IS_SVG
-  },
-  link: function(a, b, c) {
-    c = c || document;
-    if (mxClient.IS_IE6) c.write('\x3clink rel\x3d"' + a + '" href\x3d"' + b + '" charset\x3d"ISO-8859-1" type\x3d"text/css"/\x3e');
-    else {
-      var d = c.createElement("link");
-      d.setAttribute("rel", a);
-      d.setAttribute("href", b);
-      d.setAttribute("charset", "ISO-8859-1");
-      d.setAttribute("type", "text/css");
-      c.getElementsByTagName("head")[0].appendChild(d)
-    }
-  },
-  include: function(a) {
-    document.write('\x3cscript src\x3d"' +
-      a + '"\x3e\x3c/script\x3e')
-  },
-  dispose: function() {
-    for (var a = 0; a < mxEvent.objects.length; a++) null != mxEvent.objects[a].mxListenerList && mxEvent.removeAllListeners(mxEvent.objects[a])
-  }
-};
-mxClient.IS_OP && mxClient.IS_OT ? mxClient.CSS_PREFIX = "O" : mxClient.IS_SF || mxClient.IS_GC ? mxClient.CSS_PREFIX = "Webkit" : mxClient.IS_MT ? mxClient.CSS_PREFIX = "Moz" : mxClient.IS_IE && 9 <=
-  document.documentMode && (mxClient.CSS_PREFIX = "ms");
-"undefined" == typeof mxLoadResources && (mxLoadResources = !0);
-"undefined" == typeof mxResourceExtension && (mxResourceExtension = ".txt");
-"undefined" == typeof mxLoadStylesheets && (mxLoadStylesheets = !0);
-"undefined" != typeof mxBasePath && 0 < mxBasePath.length ? ("/" == mxBasePath.substring(mxBasePath.length - 1) && (mxBasePath = mxBasePath.substring(0, mxBasePath.length - 1)), mxClient.basePath =
-  mxBasePath) : mxClient.basePath = ".";
-"undefined" != typeof mxImageBasePath && 0 < mxImageBasePath.length ? ("/" == mxImageBasePath.substring(mxImageBasePath.length - 1) && (mxImageBasePath = mxImageBasePath.substring(0, mxImageBasePath.length -
-  1)), mxClient.imageBasePath = mxImageBasePath) : mxClient.imageBasePath = mxClient.basePath + "/images";
-mxClient.language = "undefined" != typeof mxLanguage ? mxLanguage : mxClient.IS_IE ? navigator.userLanguage : navigator.language;
-mxClient.defaultLanguage = "undefined" != typeof mxDefaultLanguage ? mxDefaultLanguage : "en";
-mxLoadStylesheets && mxClient.link("stylesheet", mxClient.basePath + "/css/common.css");
-"undefined" != typeof mxLanguages && (mxClient.languages = mxLanguages);
-if (mxClient.IS_IE) {
-  if (9 <= document.documentMode) mxClient.IS_VML = !1, mxClient.IS_SVG = !0;
-  else {
-    8 == document.documentMode ? (document.namespaces.add(mxClient.VML_PREFIX, "urn:schemas-microsoft-com:vml", "#default#VML"), document.namespaces.add(mxClient.OFFICE_PREFIX,
-      "urn:schemas-microsoft-com:office:office", "#default#VML")) : (document.namespaces.add(mxClient.VML_PREFIX, "urn:schemas-microsoft-com:vml"), document.namespaces.add(mxClient.OFFICE_PREFIX,
-      "urn:schemas-microsoft-com:office:office"));
-    var ss = document.createStyleSheet();
-    ss.cssText = "v\\:*{behavior:url(#default#VML)}o\\:*{behavior:url(#default#VML)}";
-    mxLoadStylesheets && mxClient.link("stylesheet", mxClient.basePath + "/css/explorer.css")
-  }
-  window.attachEvent("onunload", mxClient.dispose)
-}
-var mxLog = {
-    consoleName: "Console",
-    TRACE: !1,
-    DEBUG: !0,
-    WARN: !0,
-    buffer: "",
-    init: function() {
-      if (null == mxLog.window && null != document.body) {
-        var a = mxLog.consoleName + " - mxGraph " + mxClient.VERSION,
-          b = document.createElement("table");
-        b.setAttribute("width", "100%");
-        b.setAttribute("height", "100%");
-        var c = document.createElement("tbody"),
-          d = document.createElement("tr"),
-          e = document.createElement("td");
-        e.style.verticalAlign = "top";
-        mxLog.textarea = document.createElement("textarea");
-        mxLog.textarea.setAttribute("readOnly", "true");
-        mxLog.textarea.style.height = "100%";
-        mxLog.textarea.style.resize = "none";
-        mxLog.textarea.value = mxLog.buffer;
-        mxLog.textarea.style.width = mxClient.IS_NS && "BackCompat" != document.compatMode ? "99%" : "100%";
-        e.appendChild(mxLog.textarea);
-        d.appendChild(e);
-        c.appendChild(d);
-        d = document.createElement("tr");
-        mxLog.td = document.createElement("td");
-        mxLog.td.style.verticalAlign = "top";
-        mxLog.td.setAttribute("height", "30px");
-        d.appendChild(mxLog.td);
-        c.appendChild(d);
-        b.appendChild(c);
-        mxLog.addButton("Info", function(a) {
-          mxLog.info()
-        });
-        mxLog.addButton("DOM", function(a) {
-          a = mxUtils.getInnerHtml(document.body);
-          mxLog.debug(a)
-        });
-        mxLog.addButton("Trace", function(a) {
-          mxLog.TRACE = !mxLog.TRACE;
-          mxLog.TRACE ? mxLog.debug("Tracing enabled") : mxLog.debug("Tracing disabled")
-        });
-        mxLog.addButton("Copy", function(a) {
-          try {
-            mxUtils.copy(mxLog.textarea.value)
-          } catch (b) {
-            mxUtils.alert(b)
-          }
-        });
-        mxLog.addButton("Show", function(a) {
-          try {
-            mxUtils.popup(mxLog.textarea.value)
-          } catch (b) {
-            mxUtils.alert(b)
-          }
-        });
-        mxLog.addButton("Clear", function(a) {
-          mxLog.textarea.value = ""
-        });
-        d = c = 0;
-        "number" === typeof window.innerWidth ? (c = window.innerHeight, d = window.innerWidth) : (c = document.documentElement.clientHeight || document.body.clientHeight, d = document.body.clientWidth);
-        mxLog.window = new mxWindow(a, b, Math.max(0, d - 320), Math.max(0, c - 210), 300, 160);
-        mxLog.window.setMaximizable(!0);
-        mxLog.window.setScrollable(!1);
-        mxLog.window.setResizable(!0);
-        mxLog.window.setClosable(!0);
-        mxLog.window.destroyOnClose = !1;
-        if ((mxClient.IS_NS || mxClient.IS_IE) && !mxClient.IS_GC && !mxClient.IS_SF && "BackCompat" != document.compatMode) {
-          var f =
-            mxLog.window.getElement(),
-            a = function(a, b) {
-              mxLog.textarea.style.height = Math.max(0, f.offsetHeight - 70) + "px"
-            };
-          mxLog.window.addListener(mxEvent.RESIZE_END, a);
-          mxLog.window.addListener(mxEvent.MAXIMIZE, a);
-          mxLog.window.addListener(mxEvent.NORMALIZE, a);
-          mxLog.textarea.style.height = "92px"
-        }
-      }
-    },
-    info: function() {
-      mxLog.writeln(mxUtils.toString(navigator))
-    },
-    addButton: function(a, b) {
-      var c = document.createElement("button");
-      mxUtils.write(c, a);
-      mxEvent.addListener(c, "click", b);
-      mxLog.td.appendChild(c)
-    },
-    isVisible: function() {
-      return null !=
-        mxLog.window ? mxLog.window.isVisible() : !1
-    },
-    show: function() {
-      mxLog.setVisible(!0)
-    },
-    setVisible: function(a) {
-      null == mxLog.window && mxLog.init();
-      null != mxLog.window && mxLog.window.setVisible(a)
-    },
-    enter: function(a) {
-      if (mxLog.TRACE) return mxLog.writeln("Entering " + a), (new Date).getTime()
-    },
-    leave: function(a, b) {
-      if (mxLog.TRACE) {
-        var c = 0 != b ? " (" + ((new Date).getTime() - b) + " ms)" : "";
-        mxLog.writeln("Leaving " + a + c)
-      }
-    },
-    debug: function() {
-      mxLog.DEBUG && mxLog.writeln.apply(this, arguments)
-    },
-    warn: function() {
-      mxLog.WARN && mxLog.writeln.apply(this,
-        arguments)
-    },
-    write: function() {
-      for (var a = "", b = 0; b < arguments.length; b++) a += arguments[b], b < arguments.length - 1 && (a += " ");
-      null != mxLog.textarea ? (mxLog.textarea.value += a, 0 <= navigator.userAgent.indexOf("Presto/2.5") && (mxLog.textarea.style.visibility = "hidden", mxLog.textarea.style.visibility = "visible"),
-        mxLog.textarea.scrollTop = mxLog.textarea.scrollHeight) : mxLog.buffer += a
-    },
-    writeln: function() {
-      for (var a = "", b = 0; b < arguments.length; b++) a += arguments[b], b < arguments.length - 1 && (a += " ");
-      mxLog.write(a + "\n")
-    }
-  },
-  mxObjectIdentity = {
-    FIELD_NAME: "mxObjectId",
-    counter: 0,
-    get: function(a) {
-      if ("object" == typeof a && null == a[mxObjectIdentity.FIELD_NAME]) {
-        var b = mxUtils.getFunctionName(a.constructor);
-        a[mxObjectIdentity.FIELD_NAME] = b + "#" + mxObjectIdentity.counter++
-      }
-      return a[mxObjectIdentity.FIELD_NAME]
-    },
-    clear: function(a) {
-      "object" == typeof a && delete a[mxObjectIdentity.FIELD_NAME]
-    }
-  };
-
-function mxDictionary() {
-  this.clear()
-}
-mxDictionary.prototype.map = null;
-mxDictionary.prototype.clear = function() {
-  this.map = {}
-};
-mxDictionary.prototype.get = function(a) {
-  a = mxObjectIdentity.get(a);
-  return this.map[a]
-};
-mxDictionary.prototype.put = function(a, b) {
-  var c = mxObjectIdentity.get(a),
-    d = this.map[c];
-  this.map[c] = b;
-  return d
-};
-mxDictionary.prototype.remove = function(a) {
-  a = mxObjectIdentity.get(a);
-  var b = this.map[a];
-  delete this.map[a];
-  return b
-};
-mxDictionary.prototype.getKeys = function() {
-  var a = [],
-    b;
-  for (b in this.map) a.push(b);
-  return a
-};
-mxDictionary.prototype.getValues = function() {
-  var a = [],
-    b;
-  for (b in this.map) a.push(this.map[b]);
-  return a
-};
-mxDictionary.prototype.visit = function(a) {
-  for (var b in this.map) a(b, this.map[b])
-};
-var mxResources = {
-  resources: [],
-  extension: mxResourceExtension,
-  resourcesEncoded: !1,
-  loadDefaultBundle: !0,
-  loadSpecialBundle: !0,
-  isLanguageSupported: function(a) {
-    return null != mxClient.languages ? 0 <= mxUtils.indexOf(mxClient.languages, a) : !0
-  },
-  getDefaultBundle: function(a, b) {
-    return mxResources.loadDefaultBundle || !mxResources.isLanguageSupported(b) ? a + mxResources.extension : null
-  },
-  getSpecialBundle: function(a, b) {
-    if (null == mxClient.languages || !this.isLanguageSupported(b)) {
-      var c = b.indexOf("-");
-      0 < c && (b = b.substring(0, c))
-    }
-    return mxResources.loadSpecialBundle &&
-      mxResources.isLanguageSupported(b) && b != mxClient.defaultLanguage ? a + "_" + b + mxResources.extension : null
-  },
-  add: function(a, b) {
-    b = null != b ? b : mxClient.language.toLowerCase();
-    if (b != mxConstants.NONE) {
-      var c = mxResources.getDefaultBundle(a, b);
-      if (null != c) try {
-        var d = mxUtils.load(c);
-        d.isReady() && mxResources.parse(d.getText())
-      } catch (e) {}
-      c = mxResources.getSpecialBundle(a, b);
-      if (null != c) try {
-        d = mxUtils.load(c), d.isReady() && mxResources.parse(d.getText())
-      } catch (f) {}
-    }
-  },
-  parse: function(a) {
-    if (null != a) {
-      a = a.split("\n");
-      for (var b = 0; b <
-        a.length; b++)
-        if ("#" != a[b].charAt(0)) {
-          var c = a[b].indexOf("\x3d");
-          if (0 < c) {
-            var d = a[b].substring(0, c),
-              e = a[b].length;
-            13 == a[b].charCodeAt(e - 1) && e--;
-            c = a[b].substring(c + 1, e);
-            this.resourcesEncoded ? (c = c.replace(/\\(?=u[a-fA-F\d]{4})/g, "%"), mxResources.resources[d] = unescape(c)) : mxResources.resources[d] = c
-          }
-        }
-    }
-  },
-  get: function(a, b, c) {
-    a = mxResources.resources[a];
-    null == a && (a = c);
-    if (null != a && null != b) {
-      c = [];
-      for (var d = null, e = 0; e < a.length; e++) {
-        var f = a.charAt(e);
-        "{" == f ? d = "" : null != d && "}" == f ? (d = parseInt(d) - 1, 0 <= d && d < b.length &&
-          c.push(b[d]), d = null) : null != d ? d += f : c.push(f)
-      }
-      a = c.join("")
-    }
-    return a
-  }
-};
-
-function mxPoint(a, b) {
-  this.x = null != a ? a : 0;
-  this.y = null != b ? b : 0
-}
-mxPoint.prototype.x = null;
-mxPoint.prototype.y = null;
-mxPoint.prototype.equals = function(a) {
-  return a.x == this.x && a.y == this.y
-};
-mxPoint.prototype.clone = function() {
-  return mxUtils.clone(this)
-};
-
-function mxRectangle(a, b, c, d) {
-  mxPoint.call(this, a, b);
-  this.width = null != c ? c : 0;
-  this.height = null != d ? d : 0
-}
-mxRectangle.prototype = new mxPoint;
-mxRectangle.prototype.constructor = mxRectangle;
-mxRectangle.prototype.width = null;
-mxRectangle.prototype.height = null;
-mxRectangle.prototype.setRect = function(a, b, c, d) {
-  this.x = a;
-  this.y = b;
-  this.width = c;
-  this.height = d
-};
-mxRectangle.prototype.getCenterX = function() {
-  return this.x + this.width / 2
-};
-mxRectangle.prototype.getCenterY = function() {
-  return this.y + this.height / 2
-};
-mxRectangle.prototype.add = function(a) {
-  if (null != a) {
-    var b = Math.min(this.x, a.x),
-      c = Math.min(this.y, a.y),
-      d = Math.max(this.x + this.width, a.x + a.width);
-    a = Math.max(this.y + this.height, a.y + a.height);
-    this.x = b;
-    this.y = c;
-    this.width = d - b;
-    this.height = a - c
-  }
-};
-mxRectangle.prototype.grow = function(a) {
-  this.x -= a;
-  this.y -= a;
-  this.width += 2 * a;
-  this.height += 2 * a
-};
-mxRectangle.prototype.getPoint = function() {
-  return new mxPoint(this.x, this.y)
-};
-mxRectangle.prototype.equals = function(a) {
-  return a.x == this.x && a.y == this.y && a.width == this.width && a.height == this.height
-};
-var mxEffects = {
-    animateChanges: function(a, b, c) {
-      var d = 0,
-        e = function() {
-          for (var g = !1, h = 0; h < b.length; h++) {
-            var k = b[h];
-            if (k instanceof mxGeometryChange || k instanceof mxTerminalChange || k instanceof mxValueChange || k instanceof mxChildChange || k instanceof mxStyleChange) {
-              var l = a.getView().getState(k.cell || k.child, !1);
-              if (null != l)
-                if (g = !0, k.constructor != mxGeometryChange || a.model.isEdge(k.cell)) mxUtils.setOpacity(l.shape.node, 100 * d / 10);
-                else {
-                  var m = a.getView().scale,
-                    n = (k.geometry.x - k.previous.x) * m,
-                    p = (k.geometry.y -
-                      k.previous.y) * m,
-                    q = (k.geometry.width - k.previous.width) * m,
-                    m = (k.geometry.height - k.previous.height) * m;
-                  0 == d ? (l.x -= n, l.y -= p, l.width -= q, l.height -= m) : (l.x += n / 10, l.y += p / 10, l.width += q / 10, l.height += m / 10);
-                  a.cellRenderer.redraw(l);
-                  mxEffects.cascadeOpacity(a, k.cell, 100 * d / 10)
-                }
-            }
-          }
-          10 > d && g ? (d++, window.setTimeout(e, f)) : null != c && c()
-        },
-        f = 30;
-      e()
-    },
-    cascadeOpacity: function(a, b, c) {
-      for (var d = a.model.getChildCount(b), e = 0; e < d; e++) {
-        var f = a.model.getChildAt(b, e),
-          g = a.getView().getState(f);
-        null != g && (mxUtils.setOpacity(g.shape.node,
-          c), mxEffects.cascadeOpacity(a, f, c))
-      }
-      b = a.model.getEdges(b);
-      if (null != b)
-        for (e = 0; e < b.length; e++) d = a.getView().getState(b[e]), null != d && mxUtils.setOpacity(d.shape.node, c)
-    },
-    fadeOut: function(a, b, c, d, e, f) {
-      d = d || 40;
-      e = e || 30;
-      var g = b || 100;
-      mxUtils.setOpacity(a, g);
-      if (f || null == f) {
-        var h = function() {
-          g = Math.max(g - d, 0);
-          mxUtils.setOpacity(a, g);
-          0 < g ? window.setTimeout(h, e) : (a.style.visibility = "hidden", c && a.parentNode && a.parentNode.removeChild(a))
-        };
-        window.setTimeout(h, e)
-      } else a.style.visibility = "hidden", c && a.parentNode && a.parentNode.removeChild(a)
-    }
-  },
-  mxUtils = {
-    errorResource: "none" != mxClient.language ? "error" : "",
-    closeResource: "none" != mxClient.language ? "close" : "",
-    errorImage: mxClient.imageBasePath + "/error.gif",
-    removeCursors: function(a) {
-      null != a.style && (a.style.cursor = "");
-      a = a.childNodes;
-      if (null != a)
-        for (var b = a.length, c = 0; c < b; c += 1) mxUtils.removeCursors(a[c])
-    },
-    getCurrentStyle: function() {
-      return mxClient.IS_IE ? function(a) {
-        return null != a ? a.currentStyle : null
-      } : function(a) {
-        return null != a ? window.getComputedStyle(a, "") : null
-      }
-    }(),
-    hasScrollbars: function(a) {
-      a = mxUtils.getCurrentStyle(a);
-      return null != a && ("scroll" == a.overflow || "auto" == a.overflow)
-    },
-    bind: function(a, b) {
-      return function() {
-        return b.apply(a, arguments)
-      }
-    },
-    eval: function(a) {
-      var b = null;
-      if (0 <= a.indexOf("function")) try {
-        eval("var _mxJavaScriptExpression\x3d" + a), b = _mxJavaScriptExpression, _mxJavaScriptExpression = null
-      } catch (c) {
-        mxLog.warn(c.message + " while evaluating " + a)
-      } else try {
-        b = eval(a)
-      } catch (d) {
-        mxLog.warn(d.message + " while evaluating " + a)
-      }
-      return b
-    },
-    findNode: function(a, b, c) {
-      var d = a.getAttribute(b);
-      if (null != d && d == c) return a;
-      for (a =
-        a.firstChild; null != a;) {
-        d = mxUtils.findNode(a, b, c);
-        if (null != d) return d;
-        a = a.nextSibling
-      }
-      return null
-    },
-    findNodeByAttribute: function() {
-      return 9 <= document.documentMode ? function(a, b, c) {
-        var d = null;
-        if (null != a)
-          if (a.nodeType == mxConstants.NODETYPE_ELEMENT && a.getAttribute(b) == c) d = a;
-          else
-            for (a = a.firstChild; null != a && null == d;) d = mxUtils.findNodeByAttribute(a, b, c), a = a.nextSibling;
-        return d
-      } : mxClient.IS_IE ? function(a, b, c) {
-        return null == a ? null : a.ownerDocument.selectSingleNode("//*[@" + b + "\x3d'" + c + "']")
-      } : function(a, b, c) {
-        return null ==
-          a ? null : a.ownerDocument.evaluate("//*[@" + b + "\x3d'" + c + "']", a.ownerDocument, null, XPathResult.ANY_TYPE, null).iterateNext()
-      }
-    }(),
-    getFunctionName: function(a) {
-      var b = null;
-      if (null != a)
-        if (null != a.name) b = a.name;
-        else {
-          a = a.toString();
-          for (b = 9;
-            " " == a.charAt(b);) b++;
-          var c = a.indexOf("(", b),
-            b = a.substring(b, c)
-        }
-      return b
-    },
-    indexOf: function(a, b) {
-      if (null != a && null != b)
-        for (var c = 0; c < a.length; c++)
-          if (a[c] == b) return c;
-      return -1
-    },
-    remove: function(a, b) {
-      var c = null;
-      if ("object" == typeof b)
-        for (var d = mxUtils.indexOf(b, a); 0 <= d;) b.splice(d,
-          1), c = a, d = mxUtils.indexOf(b, a);
-      for (var e in b) b[e] == a && (delete b[e], c = a);
-      return c
-    },
-    isNode: function(a, b, c, d) {
-      return null != a && !isNaN(a.nodeType) && (null == b || a.nodeName.toLowerCase() == b.toLowerCase()) ? null == c || a.getAttribute(c) == d : !1
-    },
-    getChildNodes: function(a, b) {
-      b = b || mxConstants.NODETYPE_ELEMENT;
-      for (var c = [], d = a.firstChild; null != d;) d.nodeType == b && c.push(d), d = d.nextSibling;
-      return c
-    },
-    createXmlDocument: function() {
-      var a = null;
-      document.implementation && document.implementation.createDocument ? a = document.implementation.createDocument("",
-        "", null) : window.ActiveXObject && (a = new ActiveXObject("Microsoft.XMLDOM"));
-      return a
-    },
-    parseXml: function() {
-      return mxClient.IS_IE && ("undefined" === typeof document.documentMode || 9 > document.documentMode) ? function(a) {
-        var b = mxUtils.createXmlDocument();
-        b.async = "false";
-        b.loadXML(a);
-        return b
-      } : function(a) {
-        return (new DOMParser).parseFromString(a, "text/xml")
-      }
-    }(),
-    clearSelection: function() {
-      if (document.selection) return function() {
-        document.selection.empty()
-      };
-      if (window.getSelection) return function() {
-        window.getSelection().removeAllRanges()
-      }
-    }(),
-    getPrettyXml: function(a, b, c) {
-      var d = [];
-      if (null != a)
-        if (b = b || "  ", c = c || "", a.nodeType == mxConstants.NODETYPE_TEXT) d.push(a.nodeValue);
-        else {
-          d.push(c + "\x3c" + a.nodeName);
-          var e = a.attributes;
-          if (null != e)
-            for (var f = 0; f < e.length; f++) {
-              var g = mxUtils.htmlEntities(e[f].nodeValue);
-              d.push(" " + e[f].nodeName + '\x3d"' + g + '"')
-            }
-          e = a.firstChild;
-          if (null != e) {
-            for (d.push("\x3e\n"); null != e;) d.push(mxUtils.getPrettyXml(e, b, c + b)), e = e.nextSibling;
-            d.push(c + "\x3c/" + a.nodeName + "\x3e\n")
-          } else d.push("/\x3e\n")
-        }
-      return d.join("")
-    },
-    removeWhitespace: function(a,
-      b) {
-      for (var c = b ? a.previousSibling : a.nextSibling; null != c && c.nodeType == mxConstants.NODETYPE_TEXT;) {
-        var d = b ? c.previousSibling : c.nextSibling,
-          e = mxUtils.getTextContent(c);
-        0 == mxUtils.trim(e).length && c.parentNode.removeChild(c);
-        c = d
-      }
-    },
-    htmlEntities: function(a, b) {
-      a = (a || "").replace(/&/g, "\x26amp;");
-      a = a.replace(/"/g, "\x26quot;");
-      a = a.replace(/\'/g, "\x26#39;");
-      a = a.replace(/</g, "\x26lt;");
-      a = a.replace(/>/g, "\x26gt;");
-      if (null == b || b) a = a.replace(/\n/g, "\x26#xa;");
-      return a
-    },
-    isVml: function(a) {
-      return null != a && "urn:schemas-microsoft-com:vml" ==
-        a.tagUrn
-    },
-    getXml: function(a, b) {
-      var c = "";
-      null != a && (c = a.xml, c = null == c ? a.innerHTML ? a.innerHTML : (new XMLSerializer).serializeToString(a) : c.replace(/\r\n\t[\t]*/g, "").replace(/>\r\n/g, "\x3e").replace(/\r\n/g, "\n"));
-      return c = c.replace(/\n/g, b || "\x26#xa;")
-    },
-    getTextContent: function(a) {
-      var b = "";
-      null != a && (null != a.firstChild && (a = a.firstChild), b = a.nodeValue || "");
-      return b
-    },
-    getInnerHtml: function() {
-      return mxClient.IS_IE ? function(a) {
-        return null != a ? a.innerHTML : ""
-      } : function(a) {
-        return null != a ? (new XMLSerializer).serializeToString(a) :
-          ""
-      }
-    }(),
-    getOuterHtml: function() {
-      return mxClient.IS_IE ? function(a) {
-        if (null != a) {
-          if (null != a.outerHTML) return a.outerHTML;
-          var b = [];
-          b.push("\x3c" + a.nodeName);
-          var c = a.attributes;
-          if (null != c)
-            for (var d = 0; d < c.length; d++) {
-              var e = c[d].nodeValue;
-              null != e && 0 < e.length && (b.push(" "), b.push(c[d].nodeName), b.push('\x3d"'), b.push(e), b.push('"'))
-            }
-          0 == a.innerHTML.length ? b.push("/\x3e") : (b.push("\x3e"), b.push(a.innerHTML), b.push("\x3c/" + a.nodeName + "\x3e"));
-          return b.join("")
-        }
-        return ""
-      } : function(a) {
-        return null != a ? (new XMLSerializer).serializeToString(a) :
-          ""
-      }
-    }(),
-    write: function(a, b) {
-      var c = a.ownerDocument.createTextNode(b);
-      null != a && a.appendChild(c);
-      return c
-    },
-    writeln: function(a, b) {
-      var c = a.ownerDocument.createTextNode(b);
-      null != a && (a.appendChild(c), a.appendChild(document.createElement("br")));
-      return c
-    },
-    br: function(a, b) {
-      b = b || 1;
-      for (var c = null, d = 0; d < b; d++) null != a && (c = a.ownerDocument.createElement("br"), a.appendChild(c));
-      return c
-    },
-    button: function(a, b, c) {
-      c = null != c ? c : document;
-      c = c.createElement("button");
-      mxUtils.write(c, a);
-      mxEvent.addListener(c, "click", function(a) {
-        b(a)
-      });
-      return c
-    },
-    para: function(a, b) {
-      var c = document.createElement("p");
-      mxUtils.write(c, b);
-      null != a && a.appendChild(c);
-      return c
-    },
-    addTransparentBackgroundFilter: function(a) {
-      a.style.filter += "progid:DXImageTransform.Microsoft.AlphaImageLoader(src\x3d'" + mxClient.imageBasePath + "/transparent.gif', sizingMethod\x3d'scale')"
-    },
-    linkAction: function(a, b, c, d, e) {
-      return mxUtils.link(a, b, function() {
-        c.execute(d)
-      }, e)
-    },
-    linkInvoke: function(a, b, c, d, e, f) {
-      return mxUtils.link(a, b, function() {
-        c[d](e)
-      }, f)
-    },
-    link: function(a, b, c, d) {
-      var e =
-        document.createElement("span");
-      e.style.color = "blue";
-      e.style.textDecoration = "underline";
-      e.style.cursor = "pointer";
-      null != d && (e.style.paddingLeft = d + "px");
-      mxEvent.addListener(e, "click", c);
-      mxUtils.write(e, b);
-      null != a && a.appendChild(e);
-      return e
-    },
-    fit: function(a) {
-      var b = parseInt(a.offsetLeft),
-        c = parseInt(a.offsetWidth),
-        d = document.body,
-        e = document.documentElement,
-        f = (d.scrollLeft || e.scrollLeft) + (d.clientWidth || e.clientWidth);
-      b + c > f && (a.style.left = Math.max(d.scrollLeft || e.scrollLeft, f - c) + "px");
-      b = parseInt(a.offsetTop);
-      c = parseInt(a.offsetHeight);
-      f = (d.scrollTop || e.scrollTop) + Math.max(d.clientHeight || 0, e.clientHeight);
-      b + c > f && (a.style.top = Math.max(d.scrollTop || e.scrollTop, f - c) + "px")
-    },
-    open: function(a) {
-      if (mxClient.IS_NS) {
-        try {
-          netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect")
-        } catch (b) {
-          return mxUtils.alert("Permission to read file denied."), ""
-        }
-        var c = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
-        c.initWithPath(a);
-        if (!c.exists()) return mxUtils.alert("File not found."),
-          "";
-        a = Components.classes["@mozilla.org/network/file-input-stream;1"].createInstance(Components.interfaces.nsIFileInputStream);
-        a.init(c, 1, 4, null);
-        c = Components.classes["@mozilla.org/scriptableinputstream;1"].createInstance(Components.interfaces.nsIScriptableInputStream);
-        c.init(a);
-        return c.read(c.available())
-      }
-      c = (new ActiveXObject("Scripting.FileSystemObject")).OpenTextFile(a, 1);
-      a = c.readAll();
-      c.close();
-      return a
-    },
-    save: function(a, b) {
-      if (mxClient.IS_NS) {
-        try {
-          netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect")
-        } catch (c) {
-          mxUtils.alert("Permission to write file denied.");
-          return
-        }
-        var d = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
-        d.initWithPath(a);
-        d.exists() || d.create(0, 420);
-        var e = Components.classes["@mozilla.org/network/file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream);
-        e.init(d, 34, 4, null);
-        e.write(b, b.length);
-        e.flush();
-        e.close()
-      } else d = (new ActiveXObject("Scripting.FileSystemObject")).CreateTextFile(a, !0), d.Write(b), d.Close()
-    },
-    saveAs: function(a) {
-      var b = document.createElement("iframe");
-      b.setAttribute("src", "");
-      b.style.visibility = "hidden";
-      document.body.appendChild(b);
-      try {
-        if (mxClient.IS_NS) {
-          var c = b.contentDocument;
-          c.open();
-          c.write(a);
-          c.close();
-          try {
-            netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"), b.focus(), saveDocument(c)
-          } catch (d) {
-            mxUtils.alert("Permission to save document denied.")
-          }
-        } else c = b.contentWindow.document, c.write(a), c.execCommand("SaveAs", !1, document.location)
-      } finally {
-        document.body.removeChild(b)
-      }
-    },
-    copy: function(a) {
-      if (window.clipboardData) window.clipboardData.setData("Text",
-        a);
-      else {
-        netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
-        var b = Components.classes["@mozilla.org/widget/clipboard;1"].createInstance(Components.interfaces.nsIClipboard);
-        if (b) {
-          var c = Components.classes["@mozilla.org/widget/transferable;1"].createInstance(Components.interfaces.nsITransferable);
-          if (c) {
-            c.addDataFlavor("text/unicode");
-            var d = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
-            d.data = a;
-            c.setTransferData("text/unicode",
-              d, 2 * a.length);
-            b.setData(c, null, Components.interfaces.nsIClipboard.kGlobalClipboard)
-          }
-        }
-      }
-    },
-    load: function(a) {
-      a = new mxXmlRequest(a, null, "GET", !1);
-      a.send();
-      return a
-    },
-    get: function(a, b, c) {
-      return (new mxXmlRequest(a, null, "GET")).send(b, c)
-    },
-    post: function(a, b, c, d) {
-      return (new mxXmlRequest(a, b)).send(c, d)
-    },
-    submit: function(a, b, c, d) {
-      return (new mxXmlRequest(a, b)).simulate(c, d)
-    },
-    loadInto: function(a, b, c) {
-      mxClient.IS_IE ? b.onreadystatechange = function() {
-        4 == b.readyState && c()
-      } : b.addEventListener("load", c, !1);
-      b.load(a)
-    },
-    getValue: function(a, b, c) {
-      a = null != a ? a[b] : null;
-      null == a && (a = c);
-      return a
-    },
-    getNumber: function(a, b, c) {
-      a = null != a ? a[b] : null;
-      null == a && (a = c || 0);
-      return Number(a)
-    },
-    getColor: function(a, b, c) {
-      a = null != a ? a[b] : null;
-      null == a ? a = c : a == mxConstants.NONE && (a = null);
-      return a
-    },
-    clone: function(a, b, c) {
-      c = null != c ? c : !1;
-      var d = null;
-      if (null != a && "function" == typeof a.constructor) {
-        var d = new a.constructor,
-          e;
-        for (e in a)
-          if (e != mxObjectIdentity.FIELD_NAME && (null == b || 0 > mxUtils.indexOf(b, e))) d[e] = !c && "object" == typeof a[e] ? mxUtils.clone(a[e]) : a[e]
-      }
-      return d
-    },
-    equalPoints: function(a, b) {
-      if (null == a && null != b || null != a && null == b || null != a && null != b && a.length != b.length) return !1;
-      if (null != a && null != b)
-        for (var c = 0; c < a.length; c++)
-          if (a[c] == b[c] || null != a[c] && !a[c].equals(b[c])) return !1;
-      return !0
-    },
-    equalEntries: function(a, b) {
-      if (null == a && null != b || null != a && null == b || null != a && null != b && a.length != b.length) return !1;
-      if (null != a && null != b)
-        for (var c in a)
-          if (a[c] != b[c]) return !1;
-      return !0
-    },
-    extend: function(a, b) {
-      var c = function() {};
-      c.prototype = b.prototype;
-      a.prototype = new c;
-      a.prototype.constructor =
-        a
-    },
-    toString: function(a) {
-      var b = "",
-        c;
-      for (c in a) try {
-        if (null == a[c]) b += c + " \x3d [null]\n";
-        else if ("function" == typeof a[c]) b += c + " \x3d\x3e [Function]\n";
-        else if ("object" == typeof a[c]) var d = mxUtils.getFunctionName(a[c].constructor),
-          b = b + (c + " \x3d\x3e [" + d + "]\n");
-        else b += c + " \x3d " + a[c] + "\n"
-      } catch (e) {
-        b += c + "\x3d" + e.message
-      }
-      return b
-    },
-    toRadians: function(a) {
-      return Math.PI * a / 180
-    },
-    arcToCurves: function(a, b, c, d, e, f, g, h, k) {
-      h -= a;
-      k -= b;
-      if (0 === c || 0 === d) return p;
-      c = Math.abs(c);
-      d = Math.abs(d);
-      var l = -h / 2,
-        m = -k / 2,
-        n = Math.cos(e *
-          Math.PI / 180),
-        p = Math.sin(e * Math.PI / 180);
-      e = n * l + p * m;
-      var l = -1 * p * l + n * m,
-        m = e * e,
-        q = l * l,
-        s = c * c,
-        r = d * d,
-        t = m / s + q / r;
-      1 < t ? (c *= Math.sqrt(t), d *= Math.sqrt(t), f = 0) : (t = 1, f === g && (t = -1), f = t * Math.sqrt((s * r - s * q - r * m) / (s * q + r * m)));
-      m = f * c * l / d;
-      q = -1 * f * d * e / c;
-      h = n * m - p * q + h / 2;
-      k = p * m + n * q + k / 2;
-      s = Math.atan2((l - q) / d, (e - m) / c) - Math.atan2(0, 1);
-      f = 0 <= s ? s : 2 * Math.PI + s;
-      s = Math.atan2((-l - q) / d, (-e - m) / c) - Math.atan2((l - q) / d, (e - m) / c);
-      e = 0 <= s ? s : 2 * Math.PI + s;
-      0 == g && 0 < e ? e -= 2 * Math.PI : 0 != g && 0 > e && (e += 2 * Math.PI);
-      g = 2 * e / Math.PI;
-      g = Math.ceil(0 > g ? -1 * g : g);
-      e /= g;
-      l = 8 / 3 * Math.sin(e /
-        4) * Math.sin(e / 4) / Math.sin(e / 2);
-      m = n * c;
-      n *= d;
-      c *= p;
-      d *= p;
-      for (var v = Math.cos(f), w = Math.sin(f), q = -l * (m * w + d * v), s = -l * (c * w - n * v), t = r = 0, p = [], u = 0; u < g; ++u) {
-        f += e;
-        var v = Math.cos(f),
-          w = Math.sin(f),
-          r = m * v - d * w + h,
-          t = c * v + n * w + k,
-          y = -l * (m * w + d * v),
-          v = -l * (c * w - n * v),
-          w = 6 * u;
-        p[w] = Number(q + a);
-        p[w + 1] = Number(s + b);
-        p[w + 2] = Number(r - y + a);
-        p[w + 3] = Number(t - v + b);
-        p[w + 4] = Number(r + a);
-        p[w + 5] = Number(t + b);
-        q = r + y;
-        s = t + v
-      }
-      return p
-    },
-    getBoundingBox: function(a, b) {
-      var c = null;
-      if (null != a && null != b && 0 != b) {
-        var d = mxUtils.toRadians(b),
-          c = Math.cos(d),
-          e = Math.sin(d),
-          f =
-          new mxPoint(a.x + a.width / 2, a.y + a.height / 2),
-          g = new mxPoint(a.x, a.y),
-          d = new mxPoint(a.x + a.width, a.y),
-          h = new mxPoint(d.x, a.y + a.height),
-          k = new mxPoint(a.x, h.y),
-          g = mxUtils.getRotatedPoint(g, c, e, f),
-          d = mxUtils.getRotatedPoint(d, c, e, f),
-          h = mxUtils.getRotatedPoint(h, c, e, f),
-          k = mxUtils.getRotatedPoint(k, c, e, f),
-          c = new mxRectangle(g.x, g.y, 0, 0);
-        c.add(new mxRectangle(d.x, d.y, 0, 0));
-        c.add(new mxRectangle(h.x, h.y, 0, 0));
-        c.add(new mxRectangle(k.x, k.y, 0, 0))
-      }
-      return c
-    },
-    getRotatedPoint: function(a, b, c, d) {
-      d = null != d ? d : new mxPoint;
-      var e =
-        a.x - d.x;
-      a = a.y - d.y;
-      return new mxPoint(e * b - a * c + d.x, a * b + e * c + d.y)
-    },
-    getPortConstraints: function(a, b, c, d) {
-      a = mxUtils.getValue(a.style, mxConstants.STYLE_PORT_CONSTRAINT, null);
-      if (null == a) return d;
-      d = a.toString();
-      a = mxConstants.DIRECTION_MASK_NONE;
-      0 <= d.indexOf(mxConstants.DIRECTION_NORTH) && (a |= mxConstants.DIRECTION_MASK_NORTH);
-      0 <= d.indexOf(mxConstants.DIRECTION_WEST) && (a |= mxConstants.DIRECTION_MASK_WEST);
-      0 <= d.indexOf(mxConstants.DIRECTION_SOUTH) && (a |= mxConstants.DIRECTION_MASK_SOUTH);
-      0 <= d.indexOf(mxConstants.DIRECTION_EAST) &&
-        (a |= mxConstants.DIRECTION_MASK_EAST);
-      return a
-    },
-    reversePortConstraints: function(a) {
-      var b = 0,
-        b = (a & mxConstants.DIRECTION_MASK_WEST) << 3,
-        b = b | (a & mxConstants.DIRECTION_MASK_NORTH) << 1,
-        b = b | (a & mxConstants.DIRECTION_MASK_SOUTH) >> 1;
-      return b |= (a & mxConstants.DIRECTION_MASK_EAST) >> 3
-    },
-    findNearestSegment: function(a, b, c) {
-      var d = -1;
-      if (0 < a.absolutePoints.length)
-        for (var e = a.absolutePoints[0], f = null, g = 1; g < a.absolutePoints.length; g++) {
-          var h = a.absolutePoints[g],
-            e = mxUtils.ptSegDistSq(e.x, e.y, h.x, h.y, b, c);
-          if (null == f || e < f) f =
-            e, d = g - 1;
-          e = h
-        }
-      return d
-    },
-    rectangleIntersectsSegment: function(a, b, c) {
-      var d = a.y,
-        e = a.x,
-        f = d + a.height,
-        g = e + a.width;
-      a = b.x;
-      var h = c.x;
-      b.x > c.x && (a = c.x, h = b.x);
-      h > g && (h = g);
-      a < e && (a = e);
-      if (a > h) return !1;
-      var e = b.y,
-        g = c.y,
-        k = c.x - b.x;
-      1E-7 < Math.abs(k) && (c = (c.y - b.y) / k, b = b.y - c * b.x, e = c * a + b, g = c * h + b);
-      e > g && (b = g, g = e, e = b);
-      g > f && (g = f);
-      e < d && (e = d);
-      return e > g ? !1 : !0
-    },
-    contains: function(a, b, c) {
-      return a.x <= b && a.x + a.width >= b && a.y <= c && a.y + a.height >= c
-    },
-    intersects: function(a, b) {
-      var c = a.width,
-        d = a.height,
-        e = b.width,
-        f = b.height;
-      if (0 >= e || 0 >= f || 0 >= c ||
-        0 >= d) return !1;
-      var g = a.x,
-        h = a.y,
-        k = b.x,
-        l = b.y,
-        e = e + k,
-        f = f + l,
-        c = c + g,
-        d = d + h;
-      return (e < k || e > g) && (f < l || f > h) && (c < g || c > k) && (d < h || d > l)
-    },
-    intersectsHotspot: function(a, b, c, d, e, f) {
-      d = null != d ? d : 1;
-      e = null != e ? e : 0;
-      f = null != f ? f : 0;
-      if (0 < d) {
-        var g = a.getCenterX(),
-          h = a.getCenterY(),
-          k = a.width,
-          l = a.height,
-          m = mxUtils.getValue(a.style, mxConstants.STYLE_STARTSIZE) * a.view.scale;
-        0 < m && (mxUtils.getValue(a.style, mxConstants.STYLE_HORIZONTAL, !0) ? (h = a.y + m / 2, l = m) : (g = a.x + m / 2, k = m));
-        k = Math.max(e, k * d);
-        l = Math.max(e, l * d);
-        0 < f && (k = Math.min(k, f), l = Math.min(l,
-          f));
-        d = new mxRectangle(g - k / 2, h - l / 2, k, l);
-        g = mxUtils.toRadians(mxUtils.getValue(a.style, mxConstants.STYLE_ROTATION) || 0);
-        0 != g && (e = Math.cos(-g), f = Math.sin(-g), g = new mxPoint(a.getCenterX(), a.getCenterY()), a = mxUtils.getRotatedPoint(new mxPoint(b, c), e, f, g), b = a.x, c = a.y);
-        return mxUtils.contains(d, b, c)
-      }
-      return !0
-    },
-    getOffset: function(a, b) {
-      var c = 0,
-        d = 0;
-      if (null != b && b) var e = document.body,
-        f = document.documentElement,
-        c = c + (e.scrollLeft || f.scrollLeft),
-        d = d + (e.scrollTop || f.scrollTop);
-      for (; a.offsetParent;) c += a.offsetLeft, d +=
-        a.offsetTop, a = a.offsetParent;
-      return new mxPoint(c, d)
-    },
-    getScrollOrigin: function(a) {
-      for (var b = document.body, c = document.documentElement, d = new mxPoint(b.scrollLeft || c.scrollLeft, b.scrollTop || c.scrollTop); null != a && a != b && a != c;) !isNaN(a.scrollLeft) && !
-        isNaN(a.scrollTop) && (d.x += a.scrollLeft, d.y += a.scrollTop), a = a.parentNode;
-      return d
-    },
-    convertPoint: function(a, b, c) {
-      var d = mxUtils.getScrollOrigin(a);
-      a = mxUtils.getOffset(a);
-      a.x -= d.x;
-      a.y -= d.y;
-      return new mxPoint(b - a.x, c - a.y)
-    },
-    ltrim: function(a, b) {
-      return a.replace(RegExp("^[" +
-        (b || "\\s") + "]+", "g"), "")
-    },
-    rtrim: function(a, b) {
-      return a.replace(RegExp("[" + (b || "\\s") + "]+$", "g"), "")
-    },
-    trim: function(a, b) {
-      return mxUtils.ltrim(mxUtils.rtrim(a, b), b)
-    },
-    isNumeric: function(a) {
-      return null != a && (null == a.length || 0 < a.length && 0 > a.indexOf("0x") && 0 > a.indexOf("0X")) && !isNaN(a)
-    },
-    mod: function(a, b) {
-      return (a % b + b) % b
-    },
-    intersection: function(a, b, c, d, e, f, g, h) {
-      var k = (h - f) * (c - a) - (g - e) * (d - b);
-      g = ((g - e) * (b - f) - (h - f) * (a - e)) / k;
-      e = ((c - a) * (b - f) - (d - b) * (a - e)) / k;
-      return 0 <= g && 1 >= g && 0 <= e && 1 >= e ? new mxPoint(a + g * (c - a), b + g *
-        (d - b)) : null
-    },
-    ptSegDistSq: function(a, b, c, d, e, f) {
-      c -= a;
-      d -= b;
-      e -= a;
-      f -= b;
-      0 >= e * c + f * d ? c = 0 : (e = c - e, f = d - f, a = e * c + f * d, c = 0 >= a ? 0 : a * a / (c * c + d * d));
-      e = e * e + f * f - c;
-      0 > e && (e = 0);
-      return e
-    },
-    relativeCcw: function(a, b, c, d, e, f) {
-      c -= a;
-      d -= b;
-      e -= a;
-      f -= b;
-      a = e * d - f * c;
-      0 == a && (a = e * c + f * d, 0 < a && (a = (e - c) * c + (f - d) * d, 0 > a && (a = 0)));
-      return 0 > a ? -1 : 0 < a ? 1 : 0
-    },
-    animateChanges: function(a, b) {
-      mxEffects.animateChanges.apply(this, arguments)
-    },
-    cascadeOpacity: function(a, b, c) {
-      mxEffects.cascadeOpacity.apply(this, arguments)
-    },
-    fadeOut: function(a, b, c, d, e, f) {
-      mxEffects.fadeOut.apply(this,
-        arguments)
-    },
-    setOpacity: function(a, b) {
-      mxUtils.isVml(a) ? a.style.filter = 100 <= b ? null : "alpha(opacity\x3d" + b / 5 + ")" : mxClient.IS_IE && ("undefined" === typeof document.documentMode || 9 > document.documentMode) ? a.style
-        .filter = 100 <= b ? null : "alpha(opacity\x3d" + b + ")" : a.style.opacity = b / 100
-    },
-    createImage: function(a) {
-      var b = null;
-      mxClient.IS_IE6 && "CSS1Compat" != document.compatMode ? (b = document.createElement(mxClient.VML_PREFIX + ":image"), b.setAttribute("src", a), b.style.borderStyle = "none") : (b = document.createElement(
-        "img"), b.setAttribute("src",
-        a), b.setAttribute("border", "0"));
-      return b
-    },
-    sortCells: function(a, b) {
-      b = null != b ? b : !0;
-      var c = new mxDictionary;
-      a.sort(function(a, e) {
-        var f = c.get(a);
-        null == f && (f = mxCellPath.create(a).split(mxCellPath.PATH_SEPARATOR), c.put(a, f));
-        var g = c.get(e);
-        null == g && (g = mxCellPath.create(e).split(mxCellPath.PATH_SEPARATOR), c.put(e, g));
-        f = mxCellPath.compare(f, g);
-        return 0 == f ? 0 : 0 < f == b ? 1 : -1
-      });
-      return a
-    },
-    getStylename: function(a) {
-      return null != a && (a = a.split(";")[0], 0 > a.indexOf("\x3d")) ? a : ""
-    },
-    getStylenames: function(a) {
-      var b = [];
-      if (null !=
-        a) {
-        a = a.split(";");
-        for (var c = 0; c < a.length; c++) 0 > a[c].indexOf("\x3d") && b.push(a[c])
-      }
-      return b
-    },
-    indexOfStylename: function(a, b) {
-      if (null != a && null != b)
-        for (var c = a.split(";"), d = 0, e = 0; e < c.length; e++) {
-          if (c[e] == b) return d;
-          d += c[e].length + 1
-        }
-      return -1
-    },
-    addStylename: function(a, b) {
-      0 > mxUtils.indexOfStylename(a, b) && (null == a ? a = "" : 0 < a.length && ";" != a.charAt(a.length - 1) && (a += ";"), a += b);
-      return a
-    },
-    removeStylename: function(a, b) {
-      var c = [];
-      if (null != a)
-        for (var d = a.split(";"), e = 0; e < d.length; e++) d[e] != b && c.push(d[e]);
-      return c.join(";")
-    },
-    removeAllStylenames: function(a) {
-      var b = [];
-      if (null != a) {
-        a = a.split(";");
-        for (var c = 0; c < a.length; c++) 0 <= a[c].indexOf("\x3d") && b.push(a[c])
-      }
-      return b.join(";")
-    },
-    setCellStyles: function(a, b, c, d) {
-      if (null != b && 0 < b.length) {
-        a.beginUpdate();
-        try {
-          for (var e = 0; e < b.length; e++)
-            if (null != b[e]) {
-              var f = mxUtils.setStyle(a.getStyle(b[e]), c, d);
-              a.setStyle(b[e], f)
-            }
-        } finally {
-          a.endUpdate()
-        }
-      }
-    },
-    setStyle: function(a, b, c) {
-      var d = null != c && ("undefined" == typeof c.length || 0 < c.length);
-      if (null == a || 0 == a.length) d && (a = b + "\x3d" + c);
-      else {
-        var e = a.indexOf(b +
-          "\x3d");
-        0 > e ? d && (d = ";" == a.charAt(a.length - 1) ? "" : ";", a = a + d + b + "\x3d" + c) : (b = d ? b + "\x3d" + c : "", c = a.indexOf(";", e), d || c++, a = a.substring(0, e) + b + (c > e ?
-          a.substring(c) : ""))
-      }
-      return a
-    },
-    setCellStyleFlags: function(a, b, c, d, e) {
-      if (null != b && 0 < b.length) {
-        a.beginUpdate();
-        try {
-          for (var f = 0; f < b.length; f++)
-            if (null != b[f]) {
-              var g = mxUtils.setStyleFlag(a.getStyle(b[f]), c, d, e);
-              a.setStyle(b[f], g)
-            }
-        } finally {
-          a.endUpdate()
-        }
-      }
-    },
-    setStyleFlag: function(a, b, c, d) {
-      if (null == a || 0 == a.length) a = d || null == d ? b + "\x3d" + c : b + "\x3d0";
-      else {
-        var e = a.indexOf(b +
-          "\x3d");
-        if (0 > e) e = ";" == a.charAt(a.length - 1) ? "" : ";", a = d || null == d ? a + e + b + "\x3d" + c : a + e + b + "\x3d0";
-        else {
-          var f = a.indexOf(";", e),
-            g = "",
-            g = 0 > f ? a.substring(e + b.length + 1) : a.substring(e + b.length + 1, f),
-            g = null == d ? parseInt(g) ^ c : d ? parseInt(g) | c : parseInt(g) & ~c;
-          a = a.substring(0, e) + b + "\x3d" + g + (0 <= f ? a.substring(f) : "")
-        }
-      }
-      return a
-    },
-    getAlignmentAsPoint: function(a, b) {
-      var c = 0,
-        d = 0;
-      a == mxConstants.ALIGN_CENTER ? c = -0.5 : a == mxConstants.ALIGN_RIGHT && (c = -1);
-      b == mxConstants.ALIGN_MIDDLE ? d = -0.5 : b == mxConstants.ALIGN_BOTTOM && (d = -1);
-      return new mxPoint(c,
-        d)
-    },
-    getSizeForString: function(a, b, c) {
-      b = null != b ? b : mxConstants.DEFAULT_FONTSIZE;
-      c = null != c ? c : mxConstants.DEFAULT_FONTFAMILY;
-      var d = document.createElement("div");
-      d.style.fontFamily = c;
-      d.style.fontSize = Math.round(b) + "px";
-      d.style.lineHeight = Math.round(b * mxConstants.LINE_HEIGHT) + "px";
-      d.style.position = "absolute";
-      d.style.whiteSpace = "nowrap";
-      d.style.visibility = "hidden";
-      d.style.display = mxClient.IS_QUIRKS ? "inline" : "inline-block";
-      d.style.zoom = "1";
-      d.innerHTML = a;
-      document.body.appendChild(d);
-      a = new mxRectangle(0, 0,
-        d.offsetWidth, d.offsetHeight);
-      document.body.removeChild(d);
-      return a
-    },
-    getViewXml: function(a, b, c, d, e) {
-      d = null != d ? d : 0;
-      e = null != e ? e : 0;
-      b = null != b ? b : 1;
-      null == c && (c = [a.getModel().getRoot()]);
-      var f = a.getView(),
-        g = null,
-        h = f.isEventsEnabled();
-      f.setEventsEnabled(!1);
-      var k = f.drawPane,
-        l = f.overlayPane;
-      a.dialect == mxConstants.DIALECT_SVG ? (f.drawPane = document.createElementNS(mxConstants.NS_SVG, "g"), f.canvas.appendChild(f.drawPane), f.overlayPane = document.createElementNS(mxConstants.NS_SVG,
-        "g")) : (f.drawPane = f.drawPane.cloneNode(!1),
-        f.canvas.appendChild(f.drawPane), f.overlayPane = f.overlayPane.cloneNode(!1));
-      f.canvas.appendChild(f.overlayPane);
-      var m = f.getTranslate();
-      f.translate = new mxPoint(d, e);
-      b = new mxTemporaryCellStates(a.getView(), b, c);
-      try {
-        g = (new mxCodec).encode(a.getView())
-      } finally {
-        b.destroy(), f.translate = m, f.canvas.removeChild(f.drawPane), f.canvas.removeChild(f.overlayPane), f.drawPane = k, f.overlayPane = l, f.setEventsEnabled(h)
-      }
-      return g
-    },
-    getScaleForPageCount: function(a, b, c, d) {
-      if (1 > a) return 1;
-      c = null != c ? c : mxConstants.PAGE_FORMAT_A4_PORTRAIT;
-      d = null != d ? d : 0;
-      var e = c.width - 2 * d;
-      c = c.height - 2 * d;
-      d = b.getGraphBounds().clone();
-      b = b.getView().getScale();
-      d.width /= b;
-      d.height /= b;
-      b = d.width;
-      c = b / d.height / (e / c);
-      d = Math.sqrt(a);
-      var f = Math.sqrt(c);
-      c = d * f;
-      d /= f;
-      if (1 > c && d > a) {
-        var g = d / a;
-        d = a;
-        c /= g
-      }
-      1 > d && c > a && (g = c / a, c = a, d /= g);
-      g = Math.ceil(c) * Math.ceil(d);
-      for (f = 0; g > a;) {
-        var g = Math.floor(c) / c,
-          h = Math.floor(d) / d;
-        1 == g && (g = Math.floor(c - 1) / c);
-        1 == h && (h = Math.floor(d - 1) / d);
-        g = g > h ? g : h;
-        c *= g;
-        d *= g;
-        g = Math.ceil(c) * Math.ceil(d);
-        f++;
-        if (10 < f) break
-      }
-      return 0.99999 * (e * c / b)
-    },
-    show: function(a,
-      b, c, d) {
-      c = null != c ? c : 0;
-      d = null != d ? d : 0;
-      null == b ? b = window.open().document : b.open();
-      var e = a.getGraphBounds();
-      c = -e.x + c;
-      d = -e.y + d;
-      if (mxClient.IS_IE) {
-        for (var e = "\x3chtml\x3e\x3chead\x3e", f = document.getElementsByTagName("base"), g = 0; g < f.length; g++) e += f[g].outerHTML;
-        e += "\x3cstyle\x3e";
-        for (g = 0; g < document.styleSheets.length; g++) try {
-          e += document.styleSheets(g).cssText
-        } catch (h) {}
-        e += "\x3c/style\x3e\x3c/head\x3e";
-        e += "\x3cbody\x3e";
-        e += a.container.innerHTML;
-        e += "\x3c/body\x3e";
-        e += "\x3chtml\x3e";
-        b.writeln(e);
-        b.close();
-        a =
-          b.body.getElementsByTagName("DIV")[0];
-        null != a && (a.style.position = "absolute", a.style.left = c + "px", a.style.top = d + "px")
-      } else {
-        b.writeln("\x3chtml");
-        b.writeln("\x3chead\x3e");
-        f = document.getElementsByTagName("base");
-        for (g = 0; g < f.length; g++) b.writeln(mxUtils.getOuterHtml(f[g]));
-        f = document.getElementsByTagName("link");
-        for (g = 0; g < f.length; g++) b.writeln(mxUtils.getOuterHtml(f[g]));
-        f = document.getElementsByTagName("style");
-        for (g = 0; g < f.length; g++) b.writeln(mxUtils.getOuterHtml(f[g]));
-        b.writeln("\x3c/head\x3e");
-        b.writeln("\x3c/html\x3e");
-        b.close();
-        null == b.body && b.documentElement.appendChild(b.createElement("body"));
-        b.body.style.overflow = "auto";
-        for (a = a.container.firstChild; null != a;) g = a.cloneNode(!0), b.body.appendChild(g), a = a.nextSibling;
-        a = b.getElementsByTagName("g")[0];
-        null != a && (a.setAttribute("transform", "translate(" + c + "," + d + ")"), c = a.ownerSVGElement, c.setAttribute("width", e.width + Math.max(e.x, 0) + 3), c.setAttribute("height", e.height +
-          Math.max(e.y, 0) + 3))
-      }
-      mxUtils.removeCursors(b.body);
-      return b
-    },
-    printScreen: function(a) {
-      var b = window.open();
-      mxUtils.show(a, b.document);
-      a = function() {
-        b.focus();
-        b.print();
-        b.close()
-      };
-      mxClient.IS_GC ? b.setTimeout(a, 500) : a()
-    },
-    popup: function(a, b) {
-      if (b) {
-        var c = document.createElement("div");
-        c.style.overflow = "scroll";
-        c.style.width = "636px";
-        c.style.height = "460px";
-        var d = document.createElement("pre");
-        d.innerHTML = mxUtils.htmlEntities(a, !1).replace(/\n/g, "\x3cbr\x3e").replace(/ /g, "\x26nbsp;");
-        c.appendChild(d);
-        c = new mxWindow("Popup Window", c, document.body.clientWidth / 2 - 320, (document.body.clientHeight || document.documentElement.clientHeight) /
-          2 - 240, 640, 480, !1, !0);
-        c.setClosable(!0);
-        c.setVisible(!0)
-      } else mxClient.IS_NS ? (c = window.open(), c.document.writeln("\x3cpre\x3e" + mxUtils.htmlEntities(a) + "\x3c/pre"), c.document.close()) : (c = window.open(), d = c.document.createElement(
-        "pre"), d.innerHTML = mxUtils.htmlEntities(a, !1).replace(/\n/g, "\x3cbr\x3e").replace(/ /g, "\x26nbsp;"), c.document.body.appendChild(d))
-    },
-    alert: function(a) {
-      alert(a)
-    },
-    prompt: function(a, b) {
-      return prompt(a, b)
-    },
-    confirm: function(a) {
-      return confirm(a)
-    },
-    error: function(a, b, c, d) {
-      var e = document.createElement("div");
-      e.style.padding = "20px";
-      var f = document.createElement("img");
-      f.setAttribute("src", d || mxUtils.errorImage);
-      f.setAttribute("valign", "bottom");
-      f.style.verticalAlign = "middle";
-      e.appendChild(f);
-      e.appendChild(document.createTextNode("\u00a0"));
-      e.appendChild(document.createTextNode("\u00a0"));
-      e.appendChild(document.createTextNode("\u00a0"));
-      mxUtils.write(e, a);
-      a = document.body.clientWidth;
-      d = document.body.clientHeight || document.documentElement.clientHeight;
-      var g = new mxWindow(mxResources.get(mxUtils.errorResource) ||
-        mxUtils.errorResource, e, (a - b) / 2, d / 4, b, null, !1, !0);
-      c && (mxUtils.br(e), b = document.createElement("p"), c = document.createElement("button"), mxClient.IS_IE ? c.style.cssText = "float:right" : c.setAttribute("style", "float:right"), mxEvent.addListener(
-        c, "click",
-        function(a) {
-          g.destroy()
-        }), mxUtils.write(c, mxResources.get(mxUtils.closeResource) || mxUtils.closeResource), b.appendChild(c), e.appendChild(b), mxUtils.br(e), g.setClosable(!0));
-      g.setVisible(!0);
-      return g
-    },
-    makeDraggable: function(a, b, c, d, e, f, g, h, k, l) {
-      a = new mxDragSource(a,
-        c);
-      a.dragOffset = new mxPoint(null != e ? e : 0, null != f ? f : mxConstants.TOOLTIP_VERTICAL_OFFSET);
-      a.autoscroll = g;
-      a.setGuidesEnabled(!1);
-      null != k && (a.highlightDropTargets = k);
-      null != l && (a.getDropTarget = l);
-      a.getGraphForEvent = function(a) {
-        return "function" == typeof b ? b(a) : b
-      };
-      null != d && (a.createDragElement = function() {
-        return d.cloneNode(!0)
-      }, h && (a.createPreviewElement = function(a) {
-        var b = d.cloneNode(!0),
-          c = parseInt(b.style.width),
-          e = parseInt(b.style.height);
-        b.style.width = Math.round(c * a.view.scale) + "px";
-        b.style.height = Math.round(e *
-          a.view.scale) + "px";
-        return b
-      }));
-      return a
-    }
-  },
-  mxConstants = {
-    DEFAULT_HOTSPOT: 0.3,
-    MIN_HOTSPOT_SIZE: 8,
-    MAX_HOTSPOT_SIZE: 0,
-    RENDERING_HINT_EXACT: "exact",
-    RENDERING_HINT_FASTER: "faster",
-    RENDERING_HINT_FASTEST: "fastest",
-    DIALECT_SVG: "svg",
-    DIALECT_VML: "vml",
-    DIALECT_MIXEDHTML: "mixedHtml",
-    DIALECT_PREFERHTML: "preferHtml",
-    DIALECT_STRICTHTML: "strictHtml",
-    NS_SVG: "http://www.w3.org/2000/svg",
-    NS_XHTML: "http://www.w3.org/1999/xhtml",
-    NS_XLINK: "http://www.w3.org/1999/xlink",
-    SHADOWCOLOR: "gray",
-    SHADOW_OFFSET_X: 2,
-    SHADOW_OFFSET_Y: 3,
-    SHADOW_OPACITY: 1,
-    NODETYPE_ELEMENT: 1,
-    NODETYPE_ATTRIBUTE: 2,
-    NODETYPE_TEXT: 3,
-    NODETYPE_CDATA: 4,
-    NODETYPE_ENTITY_REFERENCE: 5,
-    NODETYPE_ENTITY: 6,
-    NODETYPE_PROCESSING_INSTRUCTION: 7,
-    NODETYPE_COMMENT: 8,
-    NODETYPE_DOCUMENT: 9,
-    NODETYPE_DOCUMENTTYPE: 10,
-    NODETYPE_DOCUMENT_FRAGMENT: 11,
-    NODETYPE_NOTATION: 12,
-    TOOLTIP_VERTICAL_OFFSET: 16,
-    DEFAULT_VALID_COLOR: "#00FF00",
-    DEFAULT_INVALID_COLOR: "#FF0000",
-    HIGHLIGHT_STROKEWIDTH: 3,
-    CURSOR_MOVABLE_VERTEX: "move",
-    CURSOR_MOVABLE_EDGE: "move",
-    CURSOR_LABEL_HANDLE: "default",
-    CURSOR_BEND_HANDLE: "pointer",
-    CURSOR_CONNECT: "pointer",
-    HIGHLIGHT_COLOR: "#00FF00",
-    CONNECT_TARGET_COLOR: "#0000FF",
-    INVALID_CONNECT_TARGET_COLOR: "#FF0000",
-    DROP_TARGET_COLOR: "#0000FF",
-    VALID_COLOR: "#00FF00",
-    INVALID_COLOR: "#FF0000",
-    EDGE_SELECTION_COLOR: "#00FF00",
-    VERTEX_SELECTION_COLOR: "#00FF00",
-    VERTEX_SELECTION_STROKEWIDTH: 1,
-    EDGE_SELECTION_STROKEWIDTH: 1,
-    VERTEX_SELECTION_DASHED: !0,
-    EDGE_SELECTION_DASHED: !0,
-    GUIDE_COLOR: "#FF0000",
-    GUIDE_STROKEWIDTH: 1,
-    OUTLINE_COLOR: "#0099FF",
-    OUTLINE_STROKEWIDTH: mxClient.IS_IE ? 2 : 3,
-    HANDLE_SIZE: 7,
-    LABEL_HANDLE_SIZE: 4,
-    HANDLE_FILLCOLOR: "#00FF00",
-    HANDLE_STROKECOLOR: "black",
-    LABEL_HANDLE_FILLCOLOR: "yellow",
-    CONNECT_HANDLE_FILLCOLOR: "#0000FF",
-    LOCKED_HANDLE_FILLCOLOR: "#FF0000",
-    OUTLINE_HANDLE_FILLCOLOR: "#00FFFF",
-    OUTLINE_HANDLE_STROKECOLOR: "#0033FF",
-    DEFAULT_FONTFAMILY: "Arial,Helvetica",
-    DEFAULT_FONTSIZE: 11,
-    LINE_HEIGHT: 1.2,
-    DEFAULT_FONTSTYLE: 0,
-    DEFAULT_STARTSIZE: 40,
-    DEFAULT_MARKERSIZE: 6,
-    DEFAULT_IMAGESIZE: 24,
-    ENTITY_SEGMENT: 30,
-    RECTANGLE_ROUNDING_FACTOR: 0.15,
-    LINE_ARCSIZE: 20,
-    ARROW_SPACING: 10,
-    ARROW_WIDTH: 30,
-    ARROW_SIZE: 30,
-    PAGE_FORMAT_A4_PORTRAIT: new mxRectangle(0,
-      0, 826, 1169),
-    PAGE_FORMAT_A4_LANDSCAPE: new mxRectangle(0, 0, 1169, 826),
-    PAGE_FORMAT_LETTER_PORTRAIT: new mxRectangle(0, 0, 850, 1100),
-    PAGE_FORMAT_LETTER_LANDSCAPE: new mxRectangle(0, 0, 1100, 850),
-    NONE: "none",
-    STYLE_PERIMETER: "perimeter",
-    STYLE_SOURCE_PORT: "sourcePort",
-    STYLE_TARGET_PORT: "targetPort",
-    STYLE_PORT_CONSTRAINT: "portConstraint",
-    STYLE_OPACITY: "opacity",
-    STYLE_TEXT_OPACITY: "textOpacity",
-    STYLE_OVERFLOW: "overflow",
-    STYLE_ORTHOGONAL: "orthogonal",
-    STYLE_EXIT_X: "exitX",
-    STYLE_EXIT_Y: "exitY",
-    STYLE_EXIT_PERIMETER: "exitPerimeter",
-    STYLE_ENTRY_X: "entryX",
-    STYLE_ENTRY_Y: "entryY",
-    STYLE_ENTRY_PERIMETER: "entryPerimeter",
-    STYLE_WHITE_SPACE: "whiteSpace",
-    STYLE_ROTATION: "rotation",
-    STYLE_FILLCOLOR: "fillColor",
-    STYLE_SWIMLANE_FILLCOLOR: "swimlaneFillColor",
-    STYLE_GRADIENTCOLOR: "gradientColor",
-    STYLE_GRADIENT_DIRECTION: "gradientDirection",
-    STYLE_STROKECOLOR: "strokeColor",
-    STYLE_SEPARATORCOLOR: "separatorColor",
-    STYLE_STROKEWIDTH: "strokeWidth",
-    STYLE_ALIGN: "align",
-    STYLE_VERTICAL_ALIGN: "verticalAlign",
-    STYLE_LABEL_POSITION: "labelPosition",
-    STYLE_VERTICAL_LABEL_POSITION: "verticalLabelPosition",
-    STYLE_IMAGE_ASPECT: "imageAspect",
-    STYLE_IMAGE_ALIGN: "imageAlign",
-    STYLE_IMAGE_VERTICAL_ALIGN: "imageVerticalAlign",
-    STYLE_GLASS: "glass",
-    STYLE_IMAGE: "image",
-    STYLE_IMAGE_WIDTH: "imageWidth",
-    STYLE_IMAGE_HEIGHT: "imageHeight",
-    STYLE_IMAGE_BACKGROUND: "imageBackground",
-    STYLE_IMAGE_BORDER: "imageBorder",
-    STYLE_FLIPH: "flipH",
-    STYLE_FLIPV: "flipV",
-    STYLE_NOLABEL: "noLabel",
-    STYLE_NOEDGESTYLE: "noEdgeStyle",
-    STYLE_LABEL_BACKGROUNDCOLOR: "labelBackgroundColor",
-    STYLE_LABEL_BORDERCOLOR: "labelBorderColor",
-    STYLE_LABEL_PADDING: "labelPadding",
-    STYLE_INDICATOR_SHAPE: "indicatorShape",
-    STYLE_INDICATOR_IMAGE: "indicatorImage",
-    STYLE_INDICATOR_COLOR: "indicatorColor",
-    STYLE_INDICATOR_STROKECOLOR: "indicatorStrokeColor",
-    STYLE_INDICATOR_GRADIENTCOLOR: "indicatorGradientColor",
-    STYLE_INDICATOR_SPACING: "indicatorSpacing",
-    STYLE_INDICATOR_WIDTH: "indicatorWidth",
-    STYLE_INDICATOR_HEIGHT: "indicatorHeight",
-    STYLE_INDICATOR_DIRECTION: "indicatorDirection",
-    STYLE_SHADOW: "shadow",
-    STYLE_SEGMENT: "segment",
-    STYLE_ENDARROW: "endArrow",
-    STYLE_STARTARROW: "startArrow",
-    STYLE_ENDSIZE: "endSize",
-    STYLE_STARTSIZE: "startSize",
-    STYLE_SWIMLANE_LINE: "swimlaneLine",
-    STYLE_ENDFILL: "endFill",
-    STYLE_STARTFILL: "startFill",
-    STYLE_DASHED: "dashed",
-    STYLE_DASH_PATTERN: "dashPattern",
-    STYLE_ROUNDED: "rounded",
-    STYLE_CURVED: "curved",
-    STYLE_ARCSIZE: "arcSize",
-    STYLE_SMOOTH: "smooth",
-    STYLE_SOURCE_PERIMETER_SPACING: "sourcePerimeterSpacing",
-    STYLE_TARGET_PERIMETER_SPACING: "targetPerimeterSpacing",
-    STYLE_PERIMETER_SPACING: "perimeterSpacing",
-    STYLE_SPACING: "spacing",
-    STYLE_SPACING_TOP: "spacingTop",
-    STYLE_SPACING_LEFT: "spacingLeft",
-    STYLE_SPACING_BOTTOM: "spacingBottom",
-    STYLE_SPACING_RIGHT: "spacingRight",
-    STYLE_HORIZONTAL: "horizontal",
-    STYLE_DIRECTION: "direction",
-    STYLE_ELBOW: "elbow",
-    STYLE_FONTCOLOR: "fontColor",
-    STYLE_FONTFAMILY: "fontFamily",
-    STYLE_FONTSIZE: "fontSize",
-    STYLE_FONTSTYLE: "fontStyle",
-    STYLE_AUTOSIZE: "autosize",
-    STYLE_FOLDABLE: "foldable",
-    STYLE_EDITABLE: "editable",
-    STYLE_BENDABLE: "bendable",
-    STYLE_MOVABLE: "movable",
-    STYLE_RESIZABLE: "resizable",
-    STYLE_CLONEABLE: "cloneable",
-    STYLE_DELETABLE: "deletable",
-    STYLE_SHAPE: "shape",
-    STYLE_EDGE: "edgeStyle",
-    STYLE_LOOP: "loopStyle",
-    STYLE_ROUTING_CENTER_X: "routingCenterX",
-    STYLE_ROUTING_CENTER_Y: "routingCenterY",
-    FONT_BOLD: 1,
-    FONT_ITALIC: 2,
-    FONT_UNDERLINE: 4,
-    FONT_SHADOW: 8,
-    SHAPE_RECTANGLE: "rectangle",
-    SHAPE_ELLIPSE: "ellipse",
-    SHAPE_DOUBLE_ELLIPSE: "doubleEllipse",
-    SHAPE_RHOMBUS: "rhombus",
-    SHAPE_LINE: "line",
-    SHAPE_IMAGE: "image",
-    SHAPE_ARROW: "arrow",
-    SHAPE_LABEL: "label",
-    SHAPE_CYLINDER: "cylinder",
-    SHAPE_SWIMLANE: "swimlane",
-    SHAPE_CONNECTOR: "connector",
-    SHAPE_ACTOR: "actor",
-    SHAPE_CLOUD: "cloud",
-    SHAPE_TRIANGLE: "triangle",
-    SHAPE_HEXAGON: "hexagon",
-    ARROW_CLASSIC: "classic",
-    ARROW_BLOCK: "block",
-    ARROW_OPEN: "open",
-    ARROW_OVAL: "oval",
-    ARROW_DIAMOND: "diamond",
-    ARROW_DIAMOND_THIN: "diamondThin",
-    ALIGN_LEFT: "left",
-    ALIGN_CENTER: "center",
-    ALIGN_RIGHT: "right",
-    ALIGN_TOP: "top",
-    ALIGN_MIDDLE: "middle",
-    ALIGN_BOTTOM: "bottom",
-    DIRECTION_NORTH: "north",
-    DIRECTION_SOUTH: "south",
-    DIRECTION_EAST: "east",
-    DIRECTION_WEST: "west",
-    DIRECTION_MASK_NONE: 0,
-    DIRECTION_MASK_WEST: 1,
-    DIRECTION_MASK_NORTH: 2,
-    DIRECTION_MASK_SOUTH: 4,
-    DIRECTION_MASK_EAST: 8,
-    DIRECTION_MASK_ALL: 15,
-    ELBOW_VERTICAL: "vertical",
-    ELBOW_HORIZONTAL: "horizontal",
-    EDGESTYLE_ELBOW: "elbowEdgeStyle",
-    EDGESTYLE_ENTITY_RELATION: "entityRelationEdgeStyle",
-    EDGESTYLE_LOOP: "loopEdgeStyle",
-    EDGESTYLE_SIDETOSIDE: "sideToSideEdgeStyle",
-    EDGESTYLE_TOPTOBOTTOM: "topToBottomEdgeStyle",
-    EDGESTYLE_ORTHOGONAL: "orthogonalEdgeStyle",
-    EDGESTYLE_SEGMENT: "segmentEdgeStyle",
-    PERIMETER_ELLIPSE: "ellipsePerimeter",
-    PERIMETER_RECTANGLE: "rectanglePerimeter",
-    PERIMETER_RHOMBUS: "rhombusPerimeter",
-    PERIMETER_TRIANGLE: "trianglePerimeter"
-  };
-
-function mxEventObject(a) {
-  this.name = a;
-  this.properties = [];
-  for (var b = 1; b < arguments.length; b += 2) null != arguments[b + 1] && (this.properties[arguments[b]] = arguments[b + 1])
-}
-mxEventObject.prototype.name = null;
-mxEventObject.prototype.properties = null;
-mxEventObject.prototype.consumed = !1;
-mxEventObject.prototype.getName = function() {
-  return this.name
-};
-mxEventObject.prototype.getProperties = function() {
-  return this.properties
-};
-mxEventObject.prototype.getProperty = function(a) {
-  return this.properties[a]
-};
-mxEventObject.prototype.isConsumed = function() {
-  return this.consumed
-};
-mxEventObject.prototype.consume = function() {
-  this.consumed = !0
-};
-
-function mxMouseEvent(a, b) {
-  this.evt = a;
-  this.state = b
-}
-mxMouseEvent.prototype.consumed = !1;
-mxMouseEvent.prototype.evt = null;
-mxMouseEvent.prototype.graphX = null;
-mxMouseEvent.prototype.graphY = null;
-mxMouseEvent.prototype.state = null;
-mxMouseEvent.prototype.getEvent = function() {
-  return this.evt
-};
-mxMouseEvent.prototype.getSource = function() {
-  return mxEvent.getSource(this.evt)
-};
-mxMouseEvent.prototype.isSource = function(a) {
-  if (null != a)
-    for (var b = this.getSource(); null != b;) {
-      if (b == a.node) return !0;
-      b = b.parentNode
-    }
-  return !1
-};
-mxMouseEvent.prototype.getX = function() {
-  return mxEvent.getClientX(this.getEvent())
-};
-mxMouseEvent.prototype.getY = function() {
-  return mxEvent.getClientY(this.getEvent())
-};
-mxMouseEvent.prototype.getGraphX = function() {
-  return this.graphX
-};
-mxMouseEvent.prototype.getGraphY = function() {
-  return this.graphY
-};
-mxMouseEvent.prototype.getState = function() {
-  return this.state
-};
-mxMouseEvent.prototype.getCell = function() {
-  var a = this.getState();
-  return null != a ? a.cell : null
-};
-mxMouseEvent.prototype.isPopupTrigger = function() {
-  return mxEvent.isPopupTrigger(this.getEvent())
-};
-mxMouseEvent.prototype.isConsumed = function() {
-  return this.consumed
-};
-mxMouseEvent.prototype.consume = function(a) {
-  (null != a ? a : 1) && this.evt.preventDefault && this.evt.preventDefault();
-  this.evt.returnValue = !1;
-  this.consumed = !0
-};
-
-function mxEventSource(a) {
-  this.setEventSource(a)
-}
-mxEventSource.prototype.eventListeners = null;
-mxEventSource.prototype.eventsEnabled = !0;
-mxEventSource.prototype.eventSource = null;
-mxEventSource.prototype.isEventsEnabled = function() {
-  return this.eventsEnabled
-};
-mxEventSource.prototype.setEventsEnabled = function(a) {
-  this.eventsEnabled = a
-};
-mxEventSource.prototype.getEventSource = function() {
-  return this.eventSource
-};
-mxEventSource.prototype.setEventSource = function(a) {
-  this.eventSource = a
-};
-mxEventSource.prototype.addListener = function(a, b) {
-  null == this.eventListeners && (this.eventListeners = []);
-  this.eventListeners.push(a);
-  this.eventListeners.push(b)
-};
-mxEventSource.prototype.removeListener = function(a) {
-  if (null != this.eventListeners)
-    for (var b = 0; b < this.eventListeners.length;) this.eventListeners[b + 1] == a ? this.eventListeners.splice(b, 2) : b += 2
-};
-mxEventSource.prototype.fireEvent = function(a, b) {
-  if (null != this.eventListeners && this.isEventsEnabled()) {
-    null == a && (a = new mxEventObject);
-    null == b && (b = this.getEventSource());
-    null == b && (b = this);
-    for (var c = [b, a], d = 0; d < this.eventListeners.length; d += 2) {
-      var e = this.eventListeners[d];
-      (null == e || e == a.getName()) && this.eventListeners[d + 1].apply(this, c)
-    }
-  }
-};
-var mxEvent = {
-  objects: [],
-  addListener: function() {
-    var a = function(a, c, d) {
-      null == a.mxListenerList && (a.mxListenerList = [], mxEvent.objects.push(a));
-      a.mxListenerList.push({
-        name: c,
-        f: d
-      })
-    };
-    return window.addEventListener ? function(b, c, d) {
-      b.addEventListener(c, d, !1);
-      a(b, c, d)
-    } : function(b, c, d) {
-      b.attachEvent("on" + c, d);
-      a(b, c, d)
-    }
-  }(),
-  removeListener: function() {
-    var a = function(a, c, d) {
-      if (null != a.mxListenerList) {
-        c = a.mxListenerList.length;
-        for (var e = 0; e < c; e++)
-          if (a.mxListenerList[e].f == d) {
-            a.mxListenerList.splice(e, 1);
-            break
-          }
-        0 ==
-          a.mxListenerList.length && (a.mxListenerList = null)
-      }
-    };
-    return window.removeEventListener ? function(b, c, d) {
-      b.removeEventListener(c, d, !1);
-      a(b, c, d)
-    } : function(b, c, d) {
-      b.detachEvent("on" + c, d);
-      a(b, c, d)
-    }
-  }(),
-  removeAllListeners: function(a) {
-    var b = a.mxListenerList;
-    if (null != b)
-      for (; 0 < b.length;) {
-        var c = b[0];
-        mxEvent.removeListener(a, c.name, c.f)
-      }
-  },
-  addGestureListeners: function(a, b, c, d) {
-    null != b && mxEvent.addListener(a, "mousedown", b);
-    null != c && mxEvent.addListener(a, "mousemove", c);
-    null != d && mxEvent.addListener(a, "mouseup", d);
-    mxClient.IS_TOUCH && (null != b && mxEvent.addListener(a, "touchstart", b), null != c && mxEvent.addListener(a, "touchmove", c), null != d && mxEvent.addListener(a, "touchend", d))
-  },
-  removeGestureListeners: function(a, b, c, d) {
-    null != b && mxEvent.removeListener(a, "mousedown", b);
-    null != c && mxEvent.removeListener(a, "mousemove", c);
-    null != d && mxEvent.removeListener(a, "mouseup", d);
-    mxClient.IS_TOUCH && (null != b && mxEvent.removeListener(a, "touchstart", b), null != c && mxEvent.removeListener(a, "touchmove", c), null != d && mxEvent.removeListener(a, "touchend",
-      d))
-  },
-  redirectMouseEvents: function(a, b, c, d, e, f, g) {
-    var h = function(a) {
-      return "function" == typeof c ? c(a) : c
-    };
-    mxEvent.addGestureListeners(a, function(a) {
-      null != d ? d(a) : mxEvent.isConsumed(a) || b.fireMouseEvent(mxEvent.MOUSE_DOWN, new mxMouseEvent(a, h(a)))
-    }, function(a) {
-      null != e ? e(a) : mxEvent.isConsumed(a) || b.fireMouseEvent(mxEvent.MOUSE_MOVE, new mxMouseEvent(a, h(a)))
-    }, function(a) {
-      null != f ? f(a) : mxEvent.isConsumed(a) || b.fireMouseEvent(mxEvent.MOUSE_UP, new mxMouseEvent(a, h(a)))
-    });
-    mxEvent.addListener(a, "dblclick", function(a) {
-      if (null !=
-        g) g(a);
-      else if (!mxEvent.isConsumed(a)) {
-        var c = h(a);
-        b.dblClick(a, null != c ? c.cell : null)
-      }
-    })
-  },
-  release: function(a) {
-    if (null != a && (mxEvent.removeAllListeners(a), a = a.childNodes, null != a))
-      for (var b = a.length, c = 0; c < b; c += 1) mxEvent.release(a[c])
-  },
-  addMouseWheelListener: function(a) {
-    if (null != a) {
-      var b = function(b) {
-        null == b && (b = window.event);
-        var d = 0,
-          d = mxClient.IS_NS && !mxClient.IS_SF && !mxClient.IS_GC ? -b.detail / 2 : b.wheelDelta / 120;
-        0 != d && a(b, 0 < d)
-      };
-      mxClient.IS_NS ? mxEvent.addListener(window, mxClient.IS_SF || mxClient.IS_GC ? "mousewheel" :
-        "DOMMouseScroll", b) : mxEvent.addListener(document, "mousewheel", b)
-    }
-  },
-  disableContextMenu: function() {
-    return mxClient.IS_IE && ("undefined" === typeof document.documentMode || 9 > document.documentMode) ? function(a) {
-      mxEvent.addListener(a, "contextmenu", function() {
-        return !1
-      })
-    } : function(a) {
-      a.setAttribute("oncontextmenu", "return false;")
-    }
-  }(),
-  getSource: function(a) {
-    return null != a.srcElement ? a.srcElement : a.target
-  },
-  isConsumed: function(a) {
-    return null != a.isConsumed && a.isConsumed
-  },
-  isLeftMouseButton: function(a) {
-    return a.button ==
-      (mxClient.IS_IE && ("undefined" === typeof document.documentMode || 9 > document.documentMode) ? 1 : 0)
-  },
-  isRightMouseButton: function(a) {
-    return 2 == a.button
-  },
-  isPopupTrigger: function(a) {
-    return mxEvent.isRightMouseButton(a) || mxEvent.isShiftDown(a) && !mxEvent.isControlDown(a)
-  },
-  isShiftDown: function(a) {
-    return null != a ? a.shiftKey : !1
-  },
-  isAltDown: function(a) {
-    return null != a ? a.altKey : !1
-  },
-  isControlDown: function(a) {
-    return null != a ? a.ctrlKey : !1
-  },
-  isMetaDown: function(a) {
-    return null != a ? a.metaKey : !1
-  },
-  getMainEvent: function(a) {
-    ("touchstart" ==
-      a.type || "touchmove" == a.type) && null != a.touches && null != a.touches[0] ? a = a.touches[0] : "touchend" == a.type && (null != a.changedTouches && null != a.changedTouches[0]) && (a =
-      a.changedTouches[0]);
-    return a
-  },
-  getClientX: function(a) {
-    return mxEvent.getMainEvent(a).clientX
-  },
-  getClientY: function(a) {
-    return mxEvent.getMainEvent(a).clientY
-  },
-  consume: function(a, b, c) {
-    c = null != c ? c : !0;
-    if (null != b ? b : 1) a.preventDefault ? (c && a.stopPropagation(), a.preventDefault()) : c && (a.cancelBubble = !0);
-    a.isConsumed = !0;
-    a.returnValue = !1
-  },
-  LABEL_HANDLE: -1,
-  ROTATION_HANDLE: -2,
-  MOUSE_DOWN: "mouseDown",
-  MOUSE_MOVE: "mouseMove",
-  MOUSE_UP: "mouseUp",
-  ACTIVATE: "activate",
-  RESIZE_START: "resizeStart",
-  RESIZE: "resize",
-  RESIZE_END: "resizeEnd",
-  MOVE_START: "moveStart",
-  MOVE: "move",
-  MOVE_END: "moveEnd",
-  PAN_START: "panStart",
-  PAN: "pan",
-  PAN_END: "panEnd",
-  MINIMIZE: "minimize",
-  NORMALIZE: "normalize",
-  MAXIMIZE: "maximize",
-  HIDE: "hide",
-  SHOW: "show",
-  CLOSE: "close",
-  DESTROY: "destroy",
-  REFRESH: "refresh",
-  SIZE: "size",
-  SELECT: "select",
-  FIRED: "fired",
-  GET: "get",
-  RECEIVE: "receive",
-  CONNECT: "connect",
-  DISCONNECT: "disconnect",
-  SUSPEND: "suspend",
-  RESUME: "resume",
-  MARK: "mark",
-  SESSION: "session",
-  ROOT: "root",
-  POST: "post",
-  OPEN: "open",
-  SAVE: "save",
-  BEFORE_ADD_VERTEX: "beforeAddVertex",
-  ADD_VERTEX: "addVertex",
-  AFTER_ADD_VERTEX: "afterAddVertex",
-  DONE: "done",
-  EXECUTE: "execute",
-  EXECUTED: "executed",
-  BEGIN_UPDATE: "beginUpdate",
-  START_EDIT: "startEdit",
-  END_UPDATE: "endUpdate",
-  END_EDIT: "endEdit",
-  BEFORE_UNDO: "beforeUndo",
-  UNDO: "undo",
-  REDO: "redo",
-  CHANGE: "change",
-  NOTIFY: "notify",
-  LAYOUT_CELLS: "layoutCells",
-  CLICK: "click",
-  SCALE: "scale",
-  TRANSLATE: "translate",
-  SCALE_AND_TRANSLATE: "scaleAndTranslate",
-  UP: "up",
-  DOWN: "down",
-  ADD: "add",
-  REMOVE: "remove",
-  CLEAR: "clear",
-  ADD_CELLS: "addCells",
-  CELLS_ADDED: "cellsAdded",
-  MOVE_CELLS: "moveCells",
-  CELLS_MOVED: "cellsMoved",
-  RESIZE_CELLS: "resizeCells",
-  CELLS_RESIZED: "cellsResized",
-  TOGGLE_CELLS: "toggleCells",
-  CELLS_TOGGLED: "cellsToggled",
-  ORDER_CELLS: "orderCells",
-  CELLS_ORDERED: "cellsOrdered",
-  REMOVE_CELLS: "removeCells",
-  CELLS_REMOVED: "cellsRemoved",
-  GROUP_CELLS: "groupCells",
-  UNGROUP_CELLS: "ungroupCells",
-  REMOVE_CELLS_FROM_PARENT: "removeCellsFromParent",
-  FOLD_CELLS: "foldCells",
-  CELLS_FOLDED: "cellsFolded",
-  ALIGN_CELLS: "alignCells",
-  LABEL_CHANGED: "labelChanged",
-  CONNECT_CELL: "connectCell",
-  CELL_CONNECTED: "cellConnected",
-  SPLIT_EDGE: "splitEdge",
-  FLIP_EDGE: "flipEdge",
-  START_EDITING: "startEditing",
-  ADD_OVERLAY: "addOverlay",
-  REMOVE_OVERLAY: "removeOverlay",
-  UPDATE_CELL_SIZE: "updateCellSize",
-  ESCAPE: "escape",
-  CLICK: "click",
-  DOUBLE_CLICK: "doubleClick",
-  START: "start",
-  RESET: "reset"
-};
-
-function mxXmlRequest(a, b, c, d, e, f) {
-  this.url = a;
-  this.params = b;
-  this.method = c || "POST";
-  this.async = null != d ? d : !0;
-  this.username = e;
-  this.password = f
-}
-mxXmlRequest.prototype.url = null;
-mxXmlRequest.prototype.params = null;
-mxXmlRequest.prototype.method = null;
-mxXmlRequest.prototype.async = null;
-mxXmlRequest.prototype.binary = !1;
-mxXmlRequest.prototype.username = null;
-mxXmlRequest.prototype.password = null;
-mxXmlRequest.prototype.request = null;
-mxXmlRequest.prototype.isBinary = function() {
-  return this.binary
-};
-mxXmlRequest.prototype.setBinary = function(a) {
-  this.binary = a
-};
-mxXmlRequest.prototype.getText = function() {
-  return this.request.responseText
-};
-mxXmlRequest.prototype.isReady = function() {
-  return 4 == this.request.readyState
-};
-mxXmlRequest.prototype.getDocumentElement = function() {
-  var a = this.getXml();
-  return null != a ? a.documentElement : null
-};
-mxXmlRequest.prototype.getXml = function() {
-  var a = this.request.responseXML;
-  if (9 <= document.documentMode || null == a || null == a.documentElement) a = mxUtils.parseXml(this.request.responseText);
-  return a
-};
-mxXmlRequest.prototype.getText = function() {
-  return this.request.responseText
-};
-mxXmlRequest.prototype.getStatus = function() {
-  return this.request.status
-};
-mxXmlRequest.prototype.create = function() {
-  if (window.XMLHttpRequest) return function() {
-    var a = new XMLHttpRequest;
-    this.isBinary() && a.overrideMimeType && a.overrideMimeType("text/plain; charset\x3dx-user-defined");
-    return a
-  };
-  if ("undefined" != typeof ActiveXObject) return function() {
-    return new ActiveXObject("Microsoft.XMLHTTP")
-  }
-}();
-mxXmlRequest.prototype.send = function(a, b) {
-  this.request = this.create();
-  null != this.request && (null != a && (this.request.onreadystatechange = mxUtils.bind(this, function() {
-    this.isReady() && (a(this), this.onreadystatechaange = null)
-  })), this.request.open(this.method, this.url, this.async, this.username, this.password), this.setRequestHeaders(this.request, this.params), this.request.send(this.params))
-};
-mxXmlRequest.prototype.setRequestHeaders = function(a, b) {
-  null != b && a.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
-};
-mxXmlRequest.prototype.simulate = function(a, b) {
-  a = a || document;
-  var c = null;
-  a == document && (c = window.onbeforeunload, window.onbeforeunload = null);
-  var d = a.createElement("form");
-  d.setAttribute("method", this.method);
-  d.setAttribute("action", this.url);
-  null != b && d.setAttribute("target", b);
-  d.style.display = "none";
-  d.style.visibility = "hidden";
-  for (var e = 0 < this.params.indexOf("\x26") ? this.params.split("\x26") : this.params.split(), f = 0; f < e.length; f++) {
-    var g = e[f].indexOf("\x3d");
-    if (0 < g) {
-      var h = e[f].substring(0, g),
-        k = e[f].substring(g +
-          1),
-        g = a.createElement("textarea");
-      g.setAttribute("name", h);
-      k = k.replace(/\n/g, "\x26#xa;");
-      h = a.createTextNode(k);
-      g.appendChild(h);
-      d.appendChild(g)
-    }
-  }
-  a.body.appendChild(d);
-  d.submit();
-  a.body.removeChild(d);
-  null != c && (window.onbeforeunload = c)
-};
-var mxClipboard = {
-  STEPSIZE: 10,
-  insertCount: 1,
-  cells: null,
-  isEmpty: function() {
-    return null == mxClipboard.cells
-  },
-  cut: function(a, b) {
-    b = mxClipboard.copy(a, b);
-    mxClipboard.insertCount = 0;
-    mxClipboard.removeCells(a, b);
-    return b
-  },
-  removeCells: function(a, b) {
-    a.removeCells(b)
-  },
-  copy: function(a, b) {
-    b = b || a.getSelectionCells();
-    var c = a.getExportableCells(b);
-    mxClipboard.insertCount = 1;
-    mxClipboard.cells = a.cloneCells(c);
-    return c
-  },
-  paste: function(a) {
-    if (null != mxClipboard.cells) {
-      var b = a.getImportableCells(mxClipboard.cells),
-        c = mxClipboard.insertCount *
-        mxClipboard.STEPSIZE,
-        d = a.getDefaultParent(),
-        b = a.importCells(b, c, c, d);
-      mxClipboard.insertCount++;
-      a.setSelectionCells(b)
-    }
-  }
-};
-
-function mxWindow(a, b, c, d, e, f, g, h, k, l) {
-  null != b && (g = null != g ? g : !0, this.content = b, this.init(c, d, e, f, l), this.installMaximizeHandler(), this.installMinimizeHandler(), this.installCloseHandler(), this.setMinimizable(g),
-    this.setTitle(a), (null == h || h) && this.installMoveHandler(), null != k && null != k.parentNode ? k.parentNode.replaceChild(this.div, k) : document.body.appendChild(this.div))
-}
-mxWindow.prototype = new mxEventSource;
-mxWindow.prototype.constructor = mxWindow;
-mxWindow.prototype.closeImage = mxClient.imageBasePath + "/close.gif";
-mxWindow.prototype.minimizeImage = mxClient.imageBasePath + "/minimize.gif";
-mxWindow.prototype.normalizeImage = mxClient.imageBasePath + "/normalize.gif";
-mxWindow.prototype.maximizeImage = mxClient.imageBasePath + "/maximize.gif";
-mxWindow.prototype.resizeImage = mxClient.imageBasePath + "/resize.gif";
-mxWindow.prototype.visible = !1;
-mxWindow.prototype.content = !1;
-mxWindow.prototype.minimumSize = new mxRectangle(0, 0, 50, 40);
-mxWindow.prototype.title = !1;
-mxWindow.prototype.content = !1;
-mxWindow.prototype.destroyOnClose = !0;
-mxWindow.prototype.init = function(a, b, c, d, e) {
-  e = null != e ? e : "mxWindow";
-  this.div = document.createElement("div");
-  this.div.className = e;
-  this.div.style.left = a + "px";
-  this.div.style.top = b + "px";
-  this.table = document.createElement("table");
-  this.table.className = e;
-  null != c && (mxClient.IS_IE || (this.div.style.width = c + "px"), this.table.style.width = c + "px");
-  null != d && (mxClient.IS_IE || (this.div.style.height = d + "px"), this.table.style.height = d + "px");
-  a = document.createElement("tbody");
-  b = document.createElement("tr");
-  this.title = document.createElement("td");
-  this.title.className = e + "Title";
-  b.appendChild(this.title);
-  a.appendChild(b);
-  b = document.createElement("tr");
-  this.td = document.createElement("td");
-  this.td.className = e + "Pane";
-  this.contentWrapper = document.createElement("div");
-  this.contentWrapper.className = e + "Pane";
-  this.contentWrapper.style.width = "100%";
-  this.contentWrapper.appendChild(this.content);
-  if (mxClient.IS_IE || "DIV" != this.content.nodeName.toUpperCase()) this.contentWrapper.style.height = "100%";
-  this.td.appendChild(this.contentWrapper);
-  b.appendChild(this.td);
-  a.appendChild(b);
-  this.table.appendChild(a);
-  this.div.appendChild(this.table);
-  e = mxUtils.bind(this, function(a) {
-    this.activate()
-  });
-  mxEvent.addListener(this.title, "mousedown", e);
-  mxEvent.addListener(this.table, "mousedown", e);
-  mxClient.IS_TOUCH && (mxEvent.addListener(this.title, "touchstart", e), mxEvent.addListener(this.table, "touchstart", e));
-  this.hide()
-};
-mxWindow.prototype.setTitle = function(a) {
-  for (var b = this.title.firstChild; null != b;) {
-    var c = b.nextSibling;
-    b.nodeType == mxConstants.NODETYPE_TEXT && b.parentNode.removeChild(b);
-    b = c
-  }
-  mxUtils.write(this.title, a || "")
-};
-mxWindow.prototype.setScrollable = function(a) {
-  0 > navigator.userAgent.indexOf("Presto/2.5") && (this.contentWrapper.style.overflow = a ? "auto" : "hidden")
-};
-mxWindow.prototype.activate = function() {
-  if (mxWindow.activeWindow != this) {
-    var a = mxUtils.getCurrentStyle(this.getElement()),
-      a = null != a ? a.zIndex : 3;
-    if (mxWindow.activeWindow) {
-      var b = mxWindow.activeWindow.getElement();
-      null != b && null != b.style && (b.style.zIndex = a)
-    }
-    b = mxWindow.activeWindow;
-    this.getElement().style.zIndex = parseInt(a) + 1;
-    mxWindow.activeWindow = this;
-    this.fireEvent(new mxEventObject(mxEvent.ACTIVATE, "previousWindow", b))
-  }
-};
-mxWindow.prototype.getElement = function() {
-  return this.div
-};
-mxWindow.prototype.fit = function() {
-  mxUtils.fit(this.div)
-};
-mxWindow.prototype.isResizable = function() {
-  return null != this.resize ? "none" != this.resize.style.display : !1
-};
-mxWindow.prototype.setResizable = function(a) {
-  a ? null == this.resize ? (this.resize = document.createElement("img"), this.resize.style.position = "absolute", this.resize.style.bottom = "2px", this.resize.style.right = "2px", this.resize.setAttribute(
-      "src", mxClient.imageBasePath + "/resize.gif"), this.resize.style.cursor = "nw-resize", mxEvent.addGestureListeners(this.resize, mxUtils.bind(this, function(a) {
-      this.activate();
-      var c = mxEvent.getClientX(a),
-        d = mxEvent.getClientY(a),
-        e = this.div.offsetWidth,
-        f = this.div.offsetHeight,
-        g = mxUtils.bind(this,
-          function(a) {
-            var b = mxEvent.getClientX(a) - c,
-              g = mxEvent.getClientY(a) - d;
-            this.setSize(e + b, f + g);
-            this.fireEvent(new mxEventObject(mxEvent.RESIZE, "event", a));
-            mxEvent.consume(a)
-          }),
-        h = mxUtils.bind(this, function(a) {
-          mxEvent.removeGestureListeners(document, null, g, h);
-          this.fireEvent(new mxEventObject(mxEvent.RESIZE_END, "event", a));
-          mxEvent.consume(a)
-        });
-      mxEvent.addGestureListeners(document, null, g, h);
-      this.fireEvent(new mxEventObject(mxEvent.RESIZE_START, "event", a));
-      mxEvent.consume(a)
-    }), null, null), this.div.appendChild(this.resize)) :
-    this.resize.style.display = "inline" : null != this.resize && (this.resize.style.display = "none")
-};
-mxWindow.prototype.setSize = function(a, b) {
-  a = Math.max(this.minimumSize.width, a);
-  b = Math.max(this.minimumSize.height, b);
-  mxClient.IS_IE || (this.div.style.width = a + "px", this.div.style.height = b + "px");
-  this.table.style.width = a + "px";
-  this.table.style.height = b + "px";
-  mxClient.IS_IE || (this.contentWrapper.style.height = this.div.offsetHeight - this.title.offsetHeight - 2 + "px")
-};
-mxWindow.prototype.setMinimizable = function(a) {
-  this.minimize.style.display = a ? "" : "none"
-};
-mxWindow.prototype.getMinimumSize = function() {
-  return new mxRectangle(0, 0, 0, this.title.offsetHeight)
-};
-mxWindow.prototype.installMinimizeHandler = function() {
-  this.minimize = document.createElement("img");
-  this.minimize.setAttribute("src", this.minimizeImage);
-  this.minimize.setAttribute("align", "right");
-  this.minimize.setAttribute("title", "Minimize");
-  this.minimize.style.cursor = "pointer";
-  this.minimize.style.marginRight = "1px";
-  this.minimize.style.display = "none";
-  this.title.appendChild(this.minimize);
-  var a = !1,
-    b = null,
-    c = null,
-    d = mxUtils.bind(this, function(d) {
-      this.activate();
-      if (a) a = !1, this.minimize.setAttribute("src",
-        this.minimizeImage), this.minimize.setAttribute("title", "Minimize"), this.contentWrapper.style.display = "", this.maximize.style.display = b, mxClient.IS_IE || (this.div.style.height =
-        c), this.table.style.height = c, null != this.resize && (this.resize.style.visibility = ""), this.fireEvent(new mxEventObject(mxEvent.NORMALIZE, "event", d));
-      else {
-        a = !0;
-        this.minimize.setAttribute("src", this.normalizeImage);
-        this.minimize.setAttribute("title", "Normalize");
-        this.contentWrapper.style.display = "none";
-        b = this.maximize.style.display;
-        this.maximize.style.display = "none";
-        c = this.table.style.height;
-        var f = this.getMinimumSize();
-        0 < f.height && (mxClient.IS_IE || (this.div.style.height = f.height + "px"), this.table.style.height = f.height + "px");
-        0 < f.width && (mxClient.IS_IE || (this.div.style.width = f.width + "px"), this.table.style.width = f.width + "px");
-        null != this.resize && (this.resize.style.visibility = "hidden");
-        this.fireEvent(new mxEventObject(mxEvent.MINIMIZE, "event", d))
-      }
-      mxEvent.consume(d)
-    });
-  mxEvent.addListener(this.minimize, "mousedown", d);
-  mxClient.IS_TOUCH &&
-    mxEvent.addListener(this.minimize, "touchstart", d)
-};
-mxWindow.prototype.setMaximizable = function(a) {
-  this.maximize.style.display = a ? "" : "none"
-};
-mxWindow.prototype.installMaximizeHandler = function() {
-  this.maximize = document.createElement("img");
-  this.maximize.setAttribute("src", this.maximizeImage);
-  this.maximize.setAttribute("align", "right");
-  this.maximize.setAttribute("title", "Maximize");
-  this.maximize.style.cursor = "default";
-  this.maximize.style.marginLeft = "1px";
-  this.maximize.style.cursor = "pointer";
-  this.maximize.style.display = "none";
-  this.title.appendChild(this.maximize);
-  var a = !1,
-    b = null,
-    c = null,
-    d = null,
-    e = null,
-    f = mxUtils.bind(this, function(f) {
-      this.activate();
-      if ("none" != this.maximize.style.display) {
-        if (a) {
-          a = !1;
-          this.maximize.setAttribute("src", this.maximizeImage);
-          this.maximize.setAttribute("title", "Maximize");
-          this.contentWrapper.style.display = "";
-          this.minimize.style.visibility = "";
-          this.div.style.left = b + "px";
-          this.div.style.top = c + "px";
-          if (!mxClient.IS_IE && (this.div.style.height = d, this.div.style.width = e, h = mxUtils.getCurrentStyle(this.contentWrapper), "auto" == h.overflow || null != this.resize)) this.contentWrapper
-            .style.height = this.div.offsetHeight - this.title.offsetHeight -
-            2 + "px";
-          this.table.style.height = d;
-          this.table.style.width = e;
-          null != this.resize && (this.resize.style.visibility = "");
-          this.fireEvent(new mxEventObject(mxEvent.NORMALIZE, "event", f))
-        } else {
-          a = !0;
-          this.maximize.setAttribute("src", this.normalizeImage);
-          this.maximize.setAttribute("title", "Normalize");
-          this.contentWrapper.style.display = "";
-          this.minimize.style.visibility = "hidden";
-          b = parseInt(this.div.style.left);
-          c = parseInt(this.div.style.top);
-          d = this.table.style.height;
-          e = this.table.style.width;
-          this.div.style.left = "0px";
-          this.div.style.top = "0px";
-          mxClient.IS_IE || (this.div.style.height = document.body.clientHeight - 2 + "px", this.div.style.width = document.body.clientWidth - 2 + "px");
-          this.table.style.width = document.body.clientWidth - 2 + "px";
-          this.table.style.height = document.body.clientHeight - 2 + "px";
-          null != this.resize && (this.resize.style.visibility = "hidden");
-          if (!mxClient.IS_IE) {
-            var h = mxUtils.getCurrentStyle(this.contentWrapper);
-            if ("auto" == h.overflow || null != this.resize) this.contentWrapper.style.height = this.div.offsetHeight - this.title.offsetHeight -
-              2 + "px"
-          }
-          this.fireEvent(new mxEventObject(mxEvent.MAXIMIZE, "event", f))
-        }
-        mxEvent.consume(f)
-      }
-    });
-  mxEvent.addGestureListeners(this.maximize, f);
-  mxEvent.addListener(this.title, "dblclick", f)
-};
-mxWindow.prototype.installMoveHandler = function() {
-  this.title.style.cursor = "move";
-  mxEvent.addGestureListeners(this.title, mxUtils.bind(this, function(a) {
-    var b = mxEvent.getClientX(a),
-      c = mxEvent.getClientY(a),
-      d = this.getX(),
-      e = this.getY(),
-      f = mxUtils.bind(this, function(a) {
-        var f = mxEvent.getClientX(a) - b,
-          g = mxEvent.getClientY(a) - c;
-        this.setLocation(d + f, e + g);
-        this.fireEvent(new mxEventObject(mxEvent.MOVE, "event", a));
-        mxEvent.consume(a)
-      }),
-      g = mxUtils.bind(this, function(a) {
-        mxEvent.removeGestureListeners(document, null, f,
-          g);
-        this.fireEvent(new mxEventObject(mxEvent.MOVE_END, "event", a));
-        mxEvent.consume(a)
-      });
-    mxEvent.addGestureListeners(document, null, f, g);
-    this.fireEvent(new mxEventObject(mxEvent.MOVE_START, "event", a));
-    mxEvent.consume(a)
-  }))
-};
-mxWindow.prototype.setLocation = function(a, b) {
-  this.div.style.left = a + "px";
-  this.div.style.top = b + "px"
-};
-mxWindow.prototype.getX = function() {
-  return parseInt(this.div.style.left)
-};
-mxWindow.prototype.getY = function() {
-  return parseInt(this.div.style.top)
-};
-mxWindow.prototype.installCloseHandler = function() {
-  this.closeImg = document.createElement("img");
-  this.closeImg.setAttribute("src", this.closeImage);
-  this.closeImg.setAttribute("align", "right");
-  this.closeImg.setAttribute("title", "Close");
-  this.closeImg.style.marginLeft = "2px";
-  this.closeImg.style.cursor = "pointer";
-  this.closeImg.style.display = "none";
-  this.title.insertBefore(this.closeImg, this.title.firstChild);
-  mxEvent.addGestureListeners(this.closeImg, mxUtils.bind(this, function(a) {
-    this.fireEvent(new mxEventObject(mxEvent.CLOSE,
-      "event", a));
-    this.destroyOnClose ? this.destroy() : this.setVisible(!1);
-    mxEvent.consume(a)
-  }))
-};
-mxWindow.prototype.setImage = function(a) {
-  this.image = document.createElement("img");
-  this.image.setAttribute("src", a);
-  this.image.setAttribute("align", "left");
-  this.image.style.marginRight = "4px";
-  this.image.style.marginLeft = "0px";
-  this.image.style.marginTop = "-2px";
-  this.title.insertBefore(this.image, this.title.firstChild)
-};
-mxWindow.prototype.setClosable = function(a) {
-  this.closeImg.style.display = a ? "" : "none"
-};
-mxWindow.prototype.isVisible = function() {
-  return null != this.div ? "hidden" != this.div.style.visibility : !1
-};
-mxWindow.prototype.setVisible = function(a) {
-  null != this.div && this.isVisible() != a && (a ? this.show() : this.hide())
-};
-mxWindow.prototype.show = function() {
-  this.div.style.visibility = "";
-  this.activate();
-  var a = mxUtils.getCurrentStyle(this.contentWrapper);
-  if (!mxClient.IS_IE && ("auto" == a.overflow || null != this.resize)) this.contentWrapper.style.height = this.div.offsetHeight - this.title.offsetHeight - 2 + "px";
-  this.fireEvent(new mxEventObject(mxEvent.SHOW))
-};
-mxWindow.prototype.hide = function() {
-  this.div.style.visibility = "hidden";
-  this.fireEvent(new mxEventObject(mxEvent.HIDE))
-};
-mxWindow.prototype.destroy = function() {
-  this.fireEvent(new mxEventObject(mxEvent.DESTROY));
-  null != this.div && (mxEvent.release(this.div), this.div.parentNode.removeChild(this.div), this.div = null);
-  this.contentWrapper = this.content = this.title = null
-};
-
-function mxForm(a) {
-  this.table = document.createElement("table");
-  this.table.className = a;
-  this.body = document.createElement("tbody");
-  this.table.appendChild(this.body)
-}
-mxForm.prototype.table = null;
-mxForm.prototype.body = !1;
-mxForm.prototype.getTable = function() {
-  return this.table
-};
-mxForm.prototype.addButtons = function(a, b) {
-  var c = document.createElement("tr"),
-    d = document.createElement("td");
-  c.appendChild(d);
-  var d = document.createElement("td"),
-    e = document.createElement("button");
-  mxUtils.write(e, mxResources.get("ok") || "OK");
-  d.appendChild(e);
-  mxEvent.addListener(e, "click", function() {
-    a()
-  });
-  e = document.createElement("button");
-  mxUtils.write(e, mxResources.get("cancel") || "Cancel");
-  d.appendChild(e);
-  mxEvent.addListener(e, "click", function() {
-    b()
-  });
-  c.appendChild(d);
-  this.body.appendChild(c)
-};
-mxForm.prototype.addText = function(a, b) {
-  var c = document.createElement("input");
-  c.setAttribute("type", "text");
-  c.value = b;
-  return this.addField(a, c)
-};
-mxForm.prototype.addCheckbox = function(a, b) {
-  var c = document.createElement("input");
-  c.setAttribute("type", "checkbox");
-  this.addField(a, c);
-  b && (c.checked = !0);
-  return c
-};
-mxForm.prototype.addTextarea = function(a, b, c) {
-  var d = document.createElement("textarea");
-  mxClient.IS_NS && c--;
-  d.setAttribute("rows", c || 2);
-  d.value = b;
-  return this.addField(a, d)
-};
-mxForm.prototype.addCombo = function(a, b, c) {
-  var d = document.createElement("select");
-  null != c && d.setAttribute("size", c);
-  b && d.setAttribute("multiple", "true");
-  return this.addField(a, d)
-};
-mxForm.prototype.addOption = function(a, b, c, d) {
-  var e = document.createElement("option");
-  mxUtils.writeln(e, b);
-  e.setAttribute("value", c);
-  d && e.setAttribute("selected", d);
-  a.appendChild(e)
-};
-mxForm.prototype.addField = function(a, b) {
-  var c = document.createElement("tr"),
-    d = document.createElement("td");
-  mxUtils.write(d, a);
-  c.appendChild(d);
-  d = document.createElement("td");
-  d.appendChild(b);
-  c.appendChild(d);
-  this.body.appendChild(c);
-  return b
-};
-
-function mxImage(a, b, c) {
-  this.src = a;
-  this.width = b;
-  this.height = c
-}
-mxImage.prototype.src = null;
-mxImage.prototype.width = null;
-mxImage.prototype.height = null;
-
-function mxDivResizer(a, b) {
-  if ("div" == a.nodeName.toLowerCase()) {
-    null == b && (b = window);
-    this.div = a;
-    var c = mxUtils.getCurrentStyle(a);
-    null != c && (this.resizeWidth = "auto" == c.width, this.resizeHeight = "auto" == c.height);
-    mxEvent.addListener(b, "resize", mxUtils.bind(this, function(a) {
-      this.handlingResize || (this.handlingResize = !0, this.resize(), this.handlingResize = !1)
-    }));
-    this.resize()
-  }
-}
-mxDivResizer.prototype.resizeWidth = !0;
-mxDivResizer.prototype.resizeHeight = !0;
-mxDivResizer.prototype.handlingResize = !1;
-mxDivResizer.prototype.resize = function() {
-  var a = this.getDocumentWidth(),
-    b = this.getDocumentHeight(),
-    c = parseInt(this.div.style.left),
-    d = parseInt(this.div.style.right),
-    e = parseInt(this.div.style.top),
-    f = parseInt(this.div.style.bottom);
-  this.resizeWidth && (!isNaN(c) && !isNaN(d) && 0 <= c && 0 <= d && 0 < a - d - c) && (this.div.style.width = a - d - c + "px");
-  this.resizeHeight && (!isNaN(e) && !isNaN(f) && 0 <= e && 0 <= f && 0 < b - e - f) && (this.div.style.height = b - e - f + "px")
-};
-mxDivResizer.prototype.getDocumentWidth = function() {
-  return document.body.clientWidth
-};
-mxDivResizer.prototype.getDocumentHeight = function() {
-  return document.body.clientHeight
-};
-
-function mxDragSource(a, b) {
-  this.element = a;
-  this.dropHandler = b;
-  mxEvent.addGestureListeners(a, mxUtils.bind(this, this.mouseDown))
-}
-mxDragSource.prototype.element = null;
-mxDragSource.prototype.dropHandler = null;
-mxDragSource.prototype.dragOffset = null;
-mxDragSource.prototype.dragElement = null;
-mxDragSource.prototype.previewElement = null;
-mxDragSource.prototype.enabled = !0;
-mxDragSource.prototype.currentGraph = null;
-mxDragSource.prototype.currentDropTarget = null;
-mxDragSource.prototype.currentPoint = null;
-mxDragSource.prototype.currentGuide = null;
-mxDragSource.prototype.currentHighlight = null;
-mxDragSource.prototype.autoscroll = !0;
-mxDragSource.prototype.guidesEnabled = !0;
-mxDragSource.prototype.gridEnabled = !0;
-mxDragSource.prototype.highlightDropTargets = !0;
-mxDragSource.prototype.dragElementZIndex = 100;
-mxDragSource.prototype.dragElementOpacity = 70;
-mxDragSource.prototype.isEnabled = function() {
-  return this.enabled
-};
-mxDragSource.prototype.setEnabled = function(a) {
-  this.enabled = a
-};
-mxDragSource.prototype.isGuidesEnabled = function() {
-  return this.guidesEnabled
-};
-mxDragSource.prototype.setGuidesEnabled = function(a) {
-  this.guidesEnabled = a
-};
-mxDragSource.prototype.isGridEnabled = function() {
-  return this.gridEnabled
-};
-mxDragSource.prototype.setGridEnabled = function(a) {
-  this.gridEnabled = a
-};
-mxDragSource.prototype.getGraphForEvent = function(a) {
-  return null
-};
-mxDragSource.prototype.getDropTarget = function(a, b, c) {
-  return a.getCellAt(b, c)
-};
-mxDragSource.prototype.createDragElement = function(a) {
-  return this.element.cloneNode(!0)
-};
-mxDragSource.prototype.createPreviewElement = function(a) {
-  return null
-};
-mxDragSource.prototype.mouseDown = function(a) {
-  this.enabled && (!mxEvent.isConsumed(a) && null == this.mouseMoveHandler) && (this.startDrag(a), this.mouseMoveHandler = mxUtils.bind(this, this.mouseMove), this.mouseUpHandler = mxUtils.bind(
-    this, this.mouseUp), mxEvent.addGestureListeners(document, null, this.mouseMoveHandler, this.mouseUpHandler), mxEvent.consume(a, !0, !1))
-};
-mxDragSource.prototype.startDrag = function(a) {
-  this.dragElement = this.createDragElement(a);
-  this.dragElement.style.position = "absolute";
-  this.dragElement.style.zIndex = this.dragElementZIndex;
-  mxUtils.setOpacity(this.dragElement, this.dragElementOpacity)
-};
-mxDragSource.prototype.stopDrag = function(a) {
-  null != this.dragElement && (null != this.dragElement.parentNode && this.dragElement.parentNode.removeChild(this.dragElement), this.dragElement = null)
-};
-mxDragSource.prototype.graphContainsEvent = function(a, b) {
-  var c = mxEvent.getClientX(b),
-    d = mxEvent.getClientY(b),
-    e = mxUtils.getOffset(a.container),
-    f = mxUtils.getScrollOrigin();
-  return c >= e.x - f.x && d >= e.y - f.y && c <= e.x - f.x + a.container.offsetWidth && d <= e.y - f.y + a.container.offsetHeight
-};
-mxDragSource.prototype.mouseMove = function(a) {
-  var b = this.getGraphForEvent(a);
-  null != b && !this.graphContainsEvent(b, a) && (b = null);
-  b != this.currentGraph && (null != this.currentGraph && this.dragExit(this.currentGraph), this.currentGraph = b, null != this.currentGraph && this.dragEnter(this.currentGraph));
-  null != this.currentGraph && this.dragOver(this.currentGraph, a);
-  if (null != this.dragElement && (null == this.previewElement || "visible" != this.previewElement.style.visibility)) {
-    var b = mxEvent.getClientX(a),
-      c = mxEvent.getClientY(a);
-    null == this.dragElement.parentNode && document.body.appendChild(this.dragElement);
-    this.dragElement.style.visibility = "visible";
-    null != this.dragOffset && (b += this.dragOffset.x, c += this.dragOffset.y);
-    b += document.body.scrollLeft || document.documentElement.scrollLeft;
-    c += document.body.scrollTop || document.documentElement.scrollTop;
-    this.dragElement.style.left = b + "px";
-    this.dragElement.style.top = c + "px"
-  } else null != this.dragElement && (this.dragElement.style.visibility = "hidden");
-  mxEvent.consume(a)
-};
-mxDragSource.prototype.mouseUp = function(a) {
-  if (null != this.currentGraph) {
-    if (null != this.currentPoint && (null == this.previewElement || "hidden" != this.previewElement.style.visibility)) {
-      var b = this.currentGraph.view.scale,
-        c = this.currentGraph.view.translate;
-      this.drop(this.currentGraph, a, this.currentDropTarget, this.currentPoint.x / b - c.x, this.currentPoint.y / b - c.y)
-    }
-    this.dragExit(this.currentGraph)
-  }
-  this.stopDrag(a);
-  mxEvent.removeGestureListeners(document, null, this.mouseMoveHandler, this.mouseUpHandler);
-  this.currentGraph =
-    this.mouseUpHandler = this.mouseMoveHandler = null;
-  mxEvent.consume(a)
-};
-mxDragSource.prototype.dragEnter = function(a) {
-  a.isMouseDown = !0;
-  this.previewElement = this.createPreviewElement(a);
-  this.isGuidesEnabled() && null != this.previewElement && (this.currentGuide = new mxGuide(a, a.graphHandler.getGuideStates()));
-  this.highlightDropTargets && (this.currentHighlight = new mxCellHighlight(a, mxConstants.DROP_TARGET_COLOR))
-};
-mxDragSource.prototype.dragExit = function(a) {
-  this.currentPoint = this.currentDropTarget = null;
-  a.isMouseDown = !1;
-  null != this.previewElement && (null != this.previewElement.parentNode && this.previewElement.parentNode.removeChild(this.previewElement), this.previewElement = null);
-  null != this.currentGuide && (this.currentGuide.destroy(), this.currentGuide = null);
-  null != this.currentHighlight && (this.currentHighlight.destroy(), this.currentHighlight = null)
-};
-mxDragSource.prototype.dragOver = function(a, b) {
-  var c = mxUtils.getOffset(a.container),
-    d = mxUtils.getScrollOrigin(a.container),
-    e = mxEvent.getClientX(b) - c.x + d.x,
-    c = mxEvent.getClientY(b) - c.y + d.y;
-  a.autoScroll && (null == this.autoscroll || this.autoscroll) && a.scrollPointToVisible(e, c, a.autoExtend);
-  null != this.currentHighlight && a.isDropEnabled() && (this.currentDropTarget = this.getDropTarget(a, e, c), d = a.getView().getState(this.currentDropTarget), this.currentHighlight.highlight(d));
-  if (null != this.previewElement) {
-    null == this.previewElement.parentNode &&
-      (a.container.appendChild(this.previewElement), this.previewElement.style.zIndex = "3", this.previewElement.style.position = "absolute");
-    var d = this.isGridEnabled() && a.isGridEnabledEvent(b),
-      f = !0;
-    if (null != this.currentGuide && this.currentGuide.isEnabledForEvent(b)) var f = parseInt(this.previewElement.style.width),
-      g = parseInt(this.previewElement.style.height),
-      f = new mxRectangle(0, 0, f, g),
-      c = new mxPoint(e, c),
-      c = this.currentGuide.move(f, c, d),
-      f = !1,
-      e = c.x,
-      c = c.y;
-    else if (d) var d = a.view.scale,
-      g = a.view.translate,
-      h = a.gridSize /
-      2,
-      e = (a.snap(e / d - g.x - h) + g.x) * d,
-      c = (a.snap(c / d - g.y - h) + g.y) * d;
-    null != this.currentGuide && f && this.currentGuide.hide();
-    null != this.previewOffset && (e += this.previewOffset.x, c += this.previewOffset.y);
-    this.previewElement.style.left = Math.round(e) + "px";
-    this.previewElement.style.top = Math.round(c) + "px";
-    this.previewElement.style.visibility = "visible"
-  }
-  this.currentPoint = new mxPoint(e, c)
-};
-mxDragSource.prototype.drop = function(a, b, c, d, e) {
-  this.dropHandler(a, b, c, d, e);
-  a.container.focus()
-};
-
-function mxToolbar(a) {
-  this.container = a
-}
-mxToolbar.prototype = new mxEventSource;
-mxToolbar.prototype.constructor = mxToolbar;
-mxToolbar.prototype.container = null;
-mxToolbar.prototype.enabled = !0;
-mxToolbar.prototype.noReset = !1;
-mxToolbar.prototype.updateDefaultMode = !0;
-mxToolbar.prototype.addItem = function(a, b, c, d, e, f) {
-  var g = document.createElement(null != b ? "img" : "button"),
-    h = e || (null != f ? "mxToolbarMode" : "mxToolbarItem");
-  g.className = h;
-  g.setAttribute("src", b);
-  null != a && (null != b ? g.setAttribute("title", a) : mxUtils.write(g, a));
-  this.container.appendChild(g);
-  null != c && (mxEvent.addListener(g, "click", c), mxClient.IS_TOUCH && mxEvent.addListener(g, "touchend", c));
-  a = mxUtils.bind(this, function(a) {
-    null != d ? g.setAttribute("src", b) : g.style.backgroundColor = ""
-  });
-  mxEvent.addGestureListeners(g,
-    mxUtils.bind(this, function(a) {
-      null != d ? g.setAttribute("src", d) : g.style.backgroundColor = "gray";
-      if (null != f) {
-        null == this.menu && (this.menu = new mxPopupMenu, this.menu.init());
-        var b = this.currentImg;
-        this.menu.isMenuShowing() && this.menu.hideMenu();
-        b != g && (this.currentImg = g, this.menu.factoryMethod = f, b = new mxPoint(g.offsetLeft, g.offsetTop + g.offsetHeight), this.menu.popup(b.x, b.y, null, a), this.menu.isMenuShowing() &&
-          (g.className = h + "Selected", this.menu.hideMenu = function() {
-            mxPopupMenu.prototype.hideMenu.apply(this);
-            g.className = h;
-            this.currentImg = null
-          }))
-      }
-    }), null, a);
-  mxEvent.addListener(g, "mouseout", a);
-  return g
-};
-mxToolbar.prototype.addCombo = function(a) {
-  var b = document.createElement("div");
-  b.style.display = "inline";
-  b.className = "mxToolbarComboContainer";
-  var c = document.createElement("select");
-  c.className = a || "mxToolbarCombo";
-  b.appendChild(c);
-  this.container.appendChild(b);
-  return c
-};
-mxToolbar.prototype.addActionCombo = function(a, b) {
-  var c = document.createElement("select");
-  c.className = b || "mxToolbarCombo";
-  this.addOption(c, a, null);
-  mxEvent.addListener(c, "change", function(a) {
-    var b = c.options[c.selectedIndex];
-    c.selectedIndex = 0;
-    null != b.funct && b.funct(a)
-  });
-  this.container.appendChild(c);
-  return c
-};
-mxToolbar.prototype.addOption = function(a, b, c) {
-  var d = document.createElement("option");
-  mxUtils.writeln(d, b);
-  "function" == typeof c ? d.funct = c : d.setAttribute("value", c);
-  a.appendChild(d);
-  return d
-};
-mxToolbar.prototype.addSwitchMode = function(a, b, c, d, e) {
-  var f = document.createElement("img");
-  f.initialClassName = e || "mxToolbarMode";
-  f.className = f.initialClassName;
-  f.setAttribute("src", b);
-  f.altIcon = d;
-  null != a && f.setAttribute("title", a);
-  mxEvent.addListener(f, "click", mxUtils.bind(this, function(a) {
-    a = this.selectedMode.altIcon;
-    null != a ? (this.selectedMode.altIcon = this.selectedMode.getAttribute("src"), this.selectedMode.setAttribute("src", a)) : this.selectedMode.className = this.selectedMode.initialClassName;
-    this.updateDefaultMode &&
-      (this.defaultMode = f);
-    this.selectedMode = f;
-    a = f.altIcon;
-    null != a ? (f.altIcon = f.getAttribute("src"), f.setAttribute("src", a)) : f.className = f.initialClassName + "Selected";
-    this.fireEvent(new mxEventObject(mxEvent.SELECT));
-    c()
-  }));
-  this.container.appendChild(f);
-  null == this.defaultMode && (this.defaultMode = f, this.selectMode(f), c());
-  return f
-};
-mxToolbar.prototype.addMode = function(a, b, c, d, e, f) {
-  f = null != f ? f : !0;
-  var g = document.createElement(null != b ? "img" : "button");
-  g.initialClassName = e || "mxToolbarMode";
-  g.className = g.initialClassName;
-  g.setAttribute("src", b);
-  g.altIcon = d;
-  null != a && g.setAttribute("title", a);
-  this.enabled && f && (mxEvent.addListener(g, "click", mxUtils.bind(this, function(a) {
-      this.selectMode(g, c);
-      this.noReset = !1
-    })), mxEvent.addListener(g, "dblclick", mxUtils.bind(this, function(a) {
-      this.selectMode(g, c);
-      this.noReset = !0
-    })), null == this.defaultMode &&
-    (this.defaultMode = g, this.defaultFunction = c, this.selectMode(g, c)));
-  this.container.appendChild(g);
-  return g
-};
-mxToolbar.prototype.selectMode = function(a, b) {
-  if (this.selectedMode != a) {
-    if (null != this.selectedMode) {
-      var c = this.selectedMode.altIcon;
-      null != c ? (this.selectedMode.altIcon = this.selectedMode.getAttribute("src"), this.selectedMode.setAttribute("src", c)) : this.selectedMode.className = this.selectedMode.initialClassName
-    }
-    this.selectedMode = a;
-    c = this.selectedMode.altIcon;
-    null != c ? (this.selectedMode.altIcon = this.selectedMode.getAttribute("src"), this.selectedMode.setAttribute("src", c)) : this.selectedMode.className = this.selectedMode.initialClassName +
-      "Selected";
-    this.fireEvent(new mxEventObject(mxEvent.SELECT, "function", b))
-  }
-};
-mxToolbar.prototype.resetMode = function(a) {
-  (a || !this.noReset) && this.selectedMode != this.defaultMode && this.selectMode(this.defaultMode, this.defaultFunction)
-};
-mxToolbar.prototype.addSeparator = function(a) {
-  return this.addItem(null, a, null)
-};
-mxToolbar.prototype.addBreak = function() {
-  mxUtils.br(this.container)
-};
-mxToolbar.prototype.addLine = function() {
-  var a = document.createElement("hr");
-  a.style.marginRight = "6px";
-  a.setAttribute("size", "1");
-  this.container.appendChild(a)
-};
-mxToolbar.prototype.destroy = function() {
-  mxEvent.release(this.container);
-  this.selectedMode = this.defaultFunction = this.defaultMode = this.container = null;
-  null != this.menu && this.menu.destroy()
-};
-
-function mxSession(a, b, c, d) {
-  this.model = a;
-  this.urlInit = b;
-  this.urlPoll = c;
-  this.urlNotify = d;
-  null != a && (this.codec = new mxCodec, this.codec.lookup = function(b) {
-    return a.getCell(b)
-  });
-  a.addListener(mxEvent.NOTIFY, mxUtils.bind(this, function(a, b) {
-    var c = b.getProperty("edit");
-    (null != c && this.debug || this.connected && !this.suspended) && this.notify("\x3cedit\x3e" + this.encodeChanges(c.changes, c.undone) + "\x3c/edit\x3e")
-  }))
-}
-mxSession.prototype = new mxEventSource;
-mxSession.prototype.constructor = mxSession;
-mxSession.prototype.model = null;
-mxSession.prototype.urlInit = null;
-mxSession.prototype.urlPoll = null;
-mxSession.prototype.urlNotify = null;
-mxSession.prototype.codec = null;
-mxSession.prototype.linefeed = "\x26#xa;";
-mxSession.prototype.escapePostData = !0;
-mxSession.prototype.significantRemoteChanges = !0;
-mxSession.prototype.sent = 0;
-mxSession.prototype.received = 0;
-mxSession.prototype.debug = !1;
-mxSession.prototype.connected = !1;
-mxSession.prototype.suspended = !1;
-mxSession.prototype.polling = !1;
-mxSession.prototype.start = function() {
-  this.debug ? (this.connected = !0, this.fireEvent(new mxEventObject(mxEvent.CONNECT))) : this.connected || this.get(this.urlInit, mxUtils.bind(this, function(a) {
-    this.connected = !0;
-    this.fireEvent(new mxEventObject(mxEvent.CONNECT));
-    this.poll()
-  }))
-};
-mxSession.prototype.suspend = function() {
-  this.connected && !this.suspended && (this.suspended = !0, this.fireEvent(new mxEventObject(mxEvent.SUSPEND)))
-};
-mxSession.prototype.resume = function(a, b, c) {
-  this.connected && this.suspended && (this.suspended = !1, this.fireEvent(new mxEventObject(mxEvent.RESUME)), this.polling || this.poll())
-};
-mxSession.prototype.stop = function(a) {
-  this.connected && (this.connected = !1);
-  this.fireEvent(new mxEventObject(mxEvent.DISCONNECT, "reason", a))
-};
-mxSession.prototype.poll = function() {
-  this.connected && !this.suspended && null != this.urlPoll ? (this.polling = !0, this.get(this.urlPoll, mxUtils.bind(this, function() {
-    this.poll()
-  }))) : this.polling = !1
-};
-mxSession.prototype.notify = function(a, b, c) {
-  null != a && 0 < a.length && (null != this.urlNotify && (this.debug ? (mxLog.show(), mxLog.debug("mxSession.notify: " + this.urlNotify + " xml\x3d" + a)) : (a = "\x3cmessage\x3e\x3cdelta\x3e" + a +
-    "\x3c/delta\x3e\x3c/message\x3e", this.escapePostData && (a = encodeURIComponent(a)), mxUtils.post(this.urlNotify, "xml\x3d" + a, b, c))), this.sent += a.length, this.fireEvent(new mxEventObject(
-    mxEvent.NOTIFY, "url", this.urlNotify, "xml", a)))
-};
-mxSession.prototype.get = function(a, b, c) {
-  if ("undefined" != typeof mxUtils) {
-    var d = mxUtils.bind(this, function(a) {
-      null != c ? c(a) : this.stop(a)
-    });
-    mxUtils.get(a, mxUtils.bind(this, function(c) {
-        if ("undefined" != typeof mxUtils)
-          if (c.isReady() && 404 != c.getStatus()) {
-            if (this.received += c.getText().length, this.fireEvent(new mxEventObject(mxEvent.GET, "url", a, "request", c)), this.isValidResponse(c)) {
-              if (0 < c.getText().length) {
-                var f = c.getDocumentElement();
-                null == f ? d("Invalid response: " + c.getText()) : this.receive(f)
-              }
-              null != b && b(c)
-            }
-          } else d("Response not ready")
-      }),
-      function(a) {
-        d("Transmission error")
-      })
-  }
-};
-mxSession.prototype.isValidResponse = function(a) {
-  return 0 > a.getText().indexOf("\x3c?php")
-};
-mxSession.prototype.encodeChanges = function(a, b) {
-  for (var c = "", d = b ? -1 : 1, e = b ? a.length - 1 : 0; 0 <= e && e < a.length; e += d) var f = this.codec.encode(a[e]),
-    c = c + mxUtils.getXml(f, this.linefeed);
-  return c
-};
-mxSession.prototype.receive = function(a) {
-  if (null != a && a.nodeType == mxConstants.NODETYPE_ELEMENT) {
-    var b = a.getAttribute("namespace");
-    null != b && (this.model.prefix = b + "-");
-    for (b = a.firstChild; null != b;) {
-      var c = b.nodeName.toLowerCase();
-      "state" == c ? this.processState(b) : "delta" == c && this.processDelta(b);
-      b = b.nextSibling
-    }
-    this.fireEvent(new mxEventObject(mxEvent.RECEIVE, "node", a))
-  }
-};
-mxSession.prototype.processState = function(a) {
-  (new mxCodec(a.ownerDocument)).decode(a.firstChild, this.model)
-};
-mxSession.prototype.processDelta = function(a) {
-  for (a = a.firstChild; null != a;) "edit" == a.nodeName && this.processEdit(a), a = a.nextSibling
-};
-mxSession.prototype.processEdit = function(a) {
-  a = this.decodeChanges(a);
-  if (0 < a.length) {
-    var b = this.createUndoableEdit(a);
-    this.model.fireEvent(new mxEventObject(mxEvent.CHANGE, "edit", b, "changes", a));
-    this.model.fireEvent(new mxEventObject(mxEvent.UNDO, "edit", b));
-    this.fireEvent(new mxEventObject(mxEvent.FIRED, "edit", b))
-  }
-};
-mxSession.prototype.createUndoableEdit = function(a) {
-  var b = new mxUndoableEdit(this.model, this.significantRemoteChanges);
-  b.changes = a;
-  b.notify = function() {
-    b.source.fireEvent(new mxEventObject(mxEvent.CHANGE, "edit", b, "changes", b.changes));
-    b.source.fireEvent(new mxEventObject(mxEvent.NOTIFY, "edit", b, "changes", b.changes))
-  };
-  return b
-};
-mxSession.prototype.decodeChanges = function(a) {
-  this.codec.document = a.ownerDocument;
-  var b = [];
-  for (a = a.firstChild; null != a;) {
-    var c = this.decodeChange(a);
-    null != c && b.push(c);
-    a = a.nextSibling
-  }
-  return b
-};
-mxSession.prototype.decodeChange = function(a) {
-  var b = null;
-  a.nodeType == mxConstants.NODETYPE_ELEMENT && (b = "mxRootChange" == a.nodeName ? (new mxCodec(a.ownerDocument)).decode(a) : this.codec.decode(a), null != b && (b.model = this.model, b.execute(),
-    "mxChildChange" == a.nodeName && null == b.parent && this.cellRemoved(b.child)));
-  return b
-};
-mxSession.prototype.cellRemoved = function(a, b) {
-  this.codec.putObject(a.getId(), a);
-  for (var c = this.model.getChildCount(a), d = 0; d < c; d++) this.cellRemoved(this.model.getChildAt(a, d))
-};
-
-function mxUndoableEdit(a, b) {
-  this.source = a;
-  this.changes = [];
-  this.significant = null != b ? b : !0
-}
-mxUndoableEdit.prototype.source = null;
-mxUndoableEdit.prototype.changes = null;
-mxUndoableEdit.prototype.significant = null;
-mxUndoableEdit.prototype.undone = !1;
-mxUndoableEdit.prototype.redone = !1;
-mxUndoableEdit.prototype.isEmpty = function() {
-  return 0 == this.changes.length
-};
-mxUndoableEdit.prototype.isSignificant = function() {
-  return this.significant
-};
-mxUndoableEdit.prototype.add = function(a) {
-  this.changes.push(a)
-};
-mxUndoableEdit.prototype.notify = function() {};
-mxUndoableEdit.prototype.die = function() {};
-mxUndoableEdit.prototype.undo = function() {
-  if (!this.undone) {
-    this.source.fireEvent(new mxEventObject(mxEvent.START_EDIT));
-    for (var a = this.changes.length - 1; 0 <= a; a--) {
-      var b = this.changes[a];
-      null != b.execute ? b.execute() : null != b.undo && b.undo();
-      this.source.fireEvent(new mxEventObject(mxEvent.EXECUTED, "change", b))
-    }
-    this.undone = !0;
-    this.redone = !1;
-    this.source.fireEvent(new mxEventObject(mxEvent.END_EDIT))
-  }
-  this.notify()
-};
-mxUndoableEdit.prototype.redo = function() {
-  if (!this.redone) {
-    this.source.fireEvent(new mxEventObject(mxEvent.START_EDIT));
-    for (var a = this.changes.length, b = 0; b < a; b++) {
-      var c = this.changes[b];
-      null != c.execute ? c.execute() : null != c.redo && c.redo();
-      this.source.fireEvent(new mxEventObject(mxEvent.EXECUTED, "change", c))
-    }
-    this.undone = !1;
-    this.redone = !0;
-    this.source.fireEvent(new mxEventObject(mxEvent.END_EDIT))
-  }
-  this.notify()
-};
-
-function mxUndoManager(a) {
-  this.size = null != a ? a : 100;
-  this.clear()
-}
-mxUndoManager.prototype = new mxEventSource;
-mxUndoManager.prototype.constructor = mxUndoManager;
-mxUndoManager.prototype.size = null;
-mxUndoManager.prototype.history = null;
-mxUndoManager.prototype.indexOfNextAdd = 0;
-mxUndoManager.prototype.isEmpty = function() {
-  return 0 == this.history.length
-};
-mxUndoManager.prototype.clear = function() {
-  this.history = [];
-  this.indexOfNextAdd = 0;
-  this.fireEvent(new mxEventObject(mxEvent.CLEAR))
-};
-mxUndoManager.prototype.canUndo = function() {
-  return 0 < this.indexOfNextAdd
-};
-mxUndoManager.prototype.undo = function() {
-  for (; 0 < this.indexOfNextAdd;) {
-    var a = this.history[--this.indexOfNextAdd];
-    a.undo();
-    if (a.isSignificant()) {
-      this.fireEvent(new mxEventObject(mxEvent.UNDO, "edit", a));
-      break
-    }
-  }
-};
-mxUndoManager.prototype.canRedo = function() {
-  return this.indexOfNextAdd < this.history.length
-};
-mxUndoManager.prototype.redo = function() {
-  for (var a = this.history.length; this.indexOfNextAdd < a;) {
-    var b = this.history[this.indexOfNextAdd++];
-    b.redo();
-    if (b.isSignificant()) {
-      this.fireEvent(new mxEventObject(mxEvent.REDO, "edit", b));
-      break
-    }
-  }
-};
-mxUndoManager.prototype.undoableEditHappened = function(a) {
-  this.trim();
-  0 < this.size && this.size == this.history.length && this.history.shift();
-  this.history.push(a);
-  this.indexOfNextAdd = this.history.length;
-  this.fireEvent(new mxEventObject(mxEvent.ADD, "edit", a))
-};
-mxUndoManager.prototype.trim = function() {
-  if (this.history.length > this.indexOfNextAdd)
-    for (var a = this.history.splice(this.indexOfNextAdd, this.history.length - this.indexOfNextAdd), b = 0; b < a.length; b++) a[b].die()
-};
-var mxUrlConverter = function(a) {
-  var b = !0,
-    c = null,
-    d = null;
-  return {
-    isEnabled: function() {
-      return b
-    },
-    setEnabled: function(a) {
-      b = a
-    },
-    getBaseUrl: function() {
-      return c
-    },
-    setBaseUrl: function(a) {
-      c = a
-    },
-    getBaseDomain: function() {
-      return c
-    },
-    setBaseDomain: function(a) {
-      c = a
-    },
-    isRelativeUrl: function(a) {
-      return "http://" != a.substring(0, 7) && "https://" != a.substring(0, 8) && "data:image" != a.substring(0, 10)
-    },
-    convert: function(a) {
-      if (b && this.isRelativeUrl(a)) {
-        if (null == c) {
-          d = location.protocol + "//" + location.host;
-          c = d + location.pathname;
-          var f = c.lastIndexOf("/");
-          0 < f && (c = c.substring(0, f + 1))
-        }
-        a = "/" == a.charAt(0) ? d + a : c + a
-      }
-      return a
-    }
-  }
-};
-
-function mxPanningManager(a) {
-  this.thread = null;
-  this.active = !1;
-  this.dy = this.dx = this.t0y = this.t0x = this.tdy = this.tdx = 0;
-  this.scrollbars = !1;
-  this.scrollTop = this.scrollLeft = 0;
-  this.mouseListener = {
-    mouseDown: function(a, b) {},
-    mouseMove: function(a, b) {},
-    mouseUp: mxUtils.bind(this, function(a, b) {
-      this.active && this.stop()
-    })
-  };
-  a.addMouseListener(this.mouseListener);
-  mxEvent.addListener(document, "mouseup", mxUtils.bind(this, function() {
-    this.active && this.stop()
-  }));
-  var b = mxUtils.bind(this, function() {
-    this.scrollbars = mxUtils.hasScrollbars(a.container);
-    this.scrollLeft = a.container.scrollLeft;
-    this.scrollTop = a.container.scrollTop;
-    return window.setInterval(mxUtils.bind(this, function() {
-      this.tdx -= this.dx;
-      this.tdy -= this.dy;
-      if (this.scrollbars) {
-        var b = -a.container.scrollLeft - Math.ceil(this.dx),
-          d = -a.container.scrollTop - Math.ceil(this.dy);
-        a.panGraph(b, d);
-        a.panDx = this.scrollLeft - a.container.scrollLeft;
-        a.panDy = this.scrollTop - a.container.scrollTop;
-        a.fireEvent(new mxEventObject(mxEvent.PAN))
-      } else a.panGraph(this.getDx(), this.getDy())
-    }), this.delay)
-  });
-  this.isActive =
-    function() {
-      return active
-    };
-  this.getDx = function() {
-    return Math.round(this.tdx)
-  };
-  this.getDy = function() {
-    return Math.round(this.tdy)
-  };
-  this.start = function() {
-    this.t0x = a.view.translate.x;
-    this.t0y = a.view.translate.y;
-    this.active = !0
-  };
-  this.panTo = function(c, d, e, f) {
-    this.active || this.start();
-    this.scrollLeft = a.container.scrollLeft;
-    this.scrollTop = a.container.scrollTop;
-    f = null != f ? f : 0;
-    var g = a.container;
-    this.dx = c + (null != e ? e : 0) - g.scrollLeft - g.clientWidth;
-    0 > this.dx && Math.abs(this.dx) < this.border ? this.dx = this.border + this.dx :
-      this.dx = this.handleMouseOut ? Math.max(this.dx, 0) : 0;
-    0 == this.dx && (this.dx = c - g.scrollLeft, this.dx = 0 < this.dx && this.dx < this.border ? this.dx - this.border : this.handleMouseOut ? Math.min(0, this.dx) : 0);
-    this.dy = d + f - g.scrollTop - g.clientHeight;
-    0 > this.dy && Math.abs(this.dy) < this.border ? this.dy = this.border + this.dy : this.dy = this.handleMouseOut ? Math.max(this.dy, 0) : 0;
-    0 == this.dy && (this.dy = d - g.scrollTop, this.dy = 0 < this.dy && this.dy < this.border ? this.dy - this.border : this.handleMouseOut ? Math.min(0, this.dy) : 0);
-    0 != this.dx || 0 != this.dy ?
-      (this.dx *= this.damper, this.dy *= this.damper, null == this.thread && (this.thread = b())) : null != this.thread && (window.clearInterval(this.thread), this.thread = null)
-  };
-  this.stop = function() {
-    if (this.active)
-      if (this.active = !1, null != this.thread && (window.clearInterval(this.thread), this.thread = null), this.tdy = this.tdx = 0, this.scrollbars) a.panDx = 0, a.panDy = 0, a.fireEvent(new mxEventObject(
-        mxEvent.PAN));
-      else {
-        var b = a.panDx,
-          d = a.panDy;
-        if (0 != b || 0 != d) a.panGraph(0, 0), a.view.setTranslate(this.t0x + b / a.view.scale, this.t0y + d / a.view.scale)
-      }
-  };
-  this.destroy = function() {
-    a.removeMouseListener(this.mouseListener)
-  }
-}
-mxPanningManager.prototype.damper = 1 / 6;
-mxPanningManager.prototype.delay = 10;
-mxPanningManager.prototype.handleMouseOut = !0;
-mxPanningManager.prototype.border = 0;
-
-function mxPopupMenu(a) {
-  this.factoryMethod = a;
-  null != a && this.init()
-}
-mxPopupMenu.prototype = new mxEventSource;
-mxPopupMenu.prototype.constructor = mxPopupMenu;
-mxPopupMenu.prototype.submenuImage = mxClient.imageBasePath + "/submenu.gif";
-mxPopupMenu.prototype.zIndex = 10006;
-mxPopupMenu.prototype.factoryMethod = null;
-mxPopupMenu.prototype.useLeftButtonForPopup = !1;
-mxPopupMenu.prototype.enabled = !0;
-mxPopupMenu.prototype.itemCount = 0;
-mxPopupMenu.prototype.autoExpand = !1;
-mxPopupMenu.prototype.smartSeparators = !1;
-mxPopupMenu.prototype.labels = !0;
-mxPopupMenu.prototype.init = function() {
-  this.table = document.createElement("table");
-  this.table.className = "mxPopupMenu";
-  this.tbody = document.createElement("tbody");
-  this.table.appendChild(this.tbody);
-  this.div = document.createElement("div");
-  this.div.className = "mxPopupMenu";
-  this.div.style.display = "inline";
-  this.div.style.zIndex = this.zIndex;
-  this.div.appendChild(this.table);
-  mxEvent.disableContextMenu(this.div)
-};
-mxPopupMenu.prototype.isEnabled = function() {
-  return this.enabled
-};
-mxPopupMenu.prototype.setEnabled = function(a) {
-  this.enabled = a
-};
-mxPopupMenu.prototype.isPopupTrigger = function(a) {
-  return a.isPopupTrigger() || this.useLeftButtonForPopup && mxEvent.isLeftMouseButton(a.getEvent())
-};
-mxPopupMenu.prototype.addItem = function(a, b, c, d, e, f) {
-  d = d || this;
-  this.itemCount++;
-  d.willAddSeparator && (d.containsItems && this.addSeparator(d, !0), d.willAddSeparator = !1);
-  d.containsItems = !0;
-  var g = document.createElement("tr");
-  g.className = "mxPopupMenuItem";
-  var h = document.createElement("td");
-  h.className = "mxPopupMenuIcon";
-  null != b ? (e = document.createElement("img"), e.src = b, h.appendChild(e)) : null != e && (b = document.createElement("div"), b.className = e, h.appendChild(b));
-  g.appendChild(h);
-  this.labels && (h = document.createElement("td"),
-    h.className = "mxPopupMenuItem" + (null != f && !f ? " disabled" : ""), mxUtils.write(h, a), h.align = "left", g.appendChild(h), a = document.createElement("td"), a.className =
-    "mxPopupMenuItem" + (null != f && !f ? " disabled" : ""), a.style.paddingRight = "6px", a.style.textAlign = "right", g.appendChild(a), null == d.div && this.createSubmenu(d));
-  d.tbody.appendChild(g);
-  if (null == f || f) mxEvent.addGestureListeners(g, mxUtils.bind(this, function(a) {
-    this.eventReceiver = g;
-    d.activeRow != g && d.activeRow != d && (null != d.activeRow && null != d.activeRow.div.parentNode &&
-      this.hideSubmenu(d), null != g.div && (this.showSubmenu(d, g), d.activeRow = g));
-    mxEvent.consume(a)
-  }), mxUtils.bind(this, function(a) {
-    d.activeRow != g && d.activeRow != d && (null != d.activeRow && null != d.activeRow.div.parentNode && this.hideSubmenu(d), this.autoExpand && null != g.div && (this.showSubmenu(d, g), d.activeRow =
-      g));
-    g.className = "mxPopupMenuItemHover"
-  }), mxUtils.bind(this, function(a) {
-    this.eventReceiver == g && (d.activeRow != g && this.hideMenu(), null != c && c(a));
-    this.eventReceiver = null;
-    mxEvent.consume(a)
-  })), mxEvent.addListener(g,
-    "mouseout", mxUtils.bind(this, function(a) {
-      g.className = "mxPopupMenuItem"
-    }));
-  return g
-};
-mxPopupMenu.prototype.createSubmenu = function(a) {
-  a.table = document.createElement("table");
-  a.table.className = "mxPopupMenu";
-  a.tbody = document.createElement("tbody");
-  a.table.appendChild(a.tbody);
-  a.div = document.createElement("div");
-  a.div.className = "mxPopupMenu";
-  a.div.style.position = "absolute";
-  a.div.style.display = "inline";
-  a.div.style.zIndex = this.zIndex;
-  a.div.appendChild(a.table);
-  var b = document.createElement("img");
-  b.setAttribute("src", this.submenuImage);
-  td = a.firstChild.nextSibling.nextSibling;
-  td.appendChild(b)
-};
-mxPopupMenu.prototype.showSubmenu = function(a, b) {
-  if (null != b.div) {
-    b.div.style.left = a.div.offsetLeft + b.offsetLeft + b.offsetWidth - 1 + "px";
-    b.div.style.top = a.div.offsetTop + b.offsetTop + "px";
-    document.body.appendChild(b.div);
-    var c = parseInt(b.div.offsetLeft),
-      d = parseInt(b.div.offsetWidth),
-      e = document.body,
-      f = document.documentElement;
-    if (c + d > (e.scrollLeft || f.scrollLeft) + (e.clientWidth || f.clientWidth)) b.div.style.left = a.div.offsetLeft - d + (mxClient.IS_IE ? 6 : -6) + "px";
-    mxUtils.fit(b.div)
-  }
-};
-mxPopupMenu.prototype.addSeparator = function(a, b) {
-  a = a || this;
-  if (this.smartSeparators && !b) a.willAddSeparator = !0;
-  else if (null != a.tbody) {
-    a.willAddSeparator = !1;
-    var c = document.createElement("tr"),
-      d = document.createElement("td");
-    d.className = "mxPopupMenuIcon";
-    d.style.padding = "0 0 0 0px";
-    c.appendChild(d);
-    d = document.createElement("td");
-    d.style.padding = "0 0 0 0px";
-    d.setAttribute("colSpan", "2");
-    var e = document.createElement("hr");
-    e.setAttribute("size", "1");
-    d.appendChild(e);
-    c.appendChild(d);
-    a.tbody.appendChild(c)
-  }
-};
-mxPopupMenu.prototype.popup = function(a, b, c, d) {
-  if (null != this.div && null != this.tbody && null != this.factoryMethod) {
-    this.div.style.left = a + "px";
-    for (this.div.style.top = b + "px"; null != this.tbody.firstChild;) mxEvent.release(this.tbody.firstChild), this.tbody.removeChild(this.tbody.firstChild);
-    this.itemCount = 0;
-    this.factoryMethod(this, c, d);
-    0 < this.itemCount && (this.showMenu(), this.fireEvent(new mxEventObject(mxEvent.SHOW)))
-  }
-};
-mxPopupMenu.prototype.isMenuShowing = function() {
-  return null != this.div && this.div.parentNode == document.body
-};
-mxPopupMenu.prototype.showMenu = function() {
-  9 <= document.documentMode && (this.div.style.filter = "none");
-  document.body.appendChild(this.div);
-  mxUtils.fit(this.div)
-};
-mxPopupMenu.prototype.hideMenu = function() {
-  null != this.div && (null != this.div.parentNode && this.div.parentNode.removeChild(this.div), this.hideSubmenu(this), this.containsItems = !1)
-};
-mxPopupMenu.prototype.hideSubmenu = function(a) {
-  null != a.activeRow && (this.hideSubmenu(a.activeRow), null != a.activeRow.div.parentNode && a.activeRow.div.parentNode.removeChild(a.activeRow.div), a.activeRow = null)
-};
-mxPopupMenu.prototype.destroy = function() {
-  null != this.div && (mxEvent.release(this.div), null != this.div.parentNode && this.div.parentNode.removeChild(this.div), this.div = null)
-};
-
-function mxAutoSaveManager(a) {
-  this.changeHandler = mxUtils.bind(this, function(a, c) {
-    this.isEnabled() && this.graphModelChanged(c.getProperty("edit").changes)
-  });
-  this.setGraph(a)
-}
-mxAutoSaveManager.prototype = new mxEventSource;
-mxAutoSaveManager.prototype.constructor = mxAutoSaveManager;
-mxAutoSaveManager.prototype.graph = null;
-mxAutoSaveManager.prototype.autoSaveDelay = 10;
-mxAutoSaveManager.prototype.autoSaveThrottle = 2;
-mxAutoSaveManager.prototype.autoSaveThreshold = 5;
-mxAutoSaveManager.prototype.ignoredChanges = 0;
-mxAutoSaveManager.prototype.lastSnapshot = 0;
-mxAutoSaveManager.prototype.enabled = !0;
-mxAutoSaveManager.prototype.changeHandler = null;
-mxAutoSaveManager.prototype.isEnabled = function() {
-  return this.enabled
-};
-mxAutoSaveManager.prototype.setEnabled = function(a) {
-  this.enabled = a
-};
-mxAutoSaveManager.prototype.setGraph = function(a) {
-  null != this.graph && this.graph.getModel().removeListener(this.changeHandler);
-  this.graph = a;
-  null != this.graph && this.graph.getModel().addListener(mxEvent.CHANGE, this.changeHandler)
-};
-mxAutoSaveManager.prototype.save = function() {};
-mxAutoSaveManager.prototype.graphModelChanged = function(a) {
-  a = ((new Date).getTime() - this.lastSnapshot) / 1E3;
-  a > this.autoSaveDelay || this.ignoredChanges >= this.autoSaveThreshold && a > this.autoSaveThrottle ? (this.save(), this.reset()) : this.ignoredChanges++
-};
-mxAutoSaveManager.prototype.reset = function() {
-  this.lastSnapshot = (new Date).getTime();
-  this.ignoredChanges = 0
-};
-mxAutoSaveManager.prototype.destroy = function() {
-  this.setGraph(null)
-};
-
-function mxAnimation(a) {
-  this.delay = null != a ? a : 20
-}
-mxAnimation.prototype = new mxEventSource;
-mxAnimation.prototype.constructor = mxAnimation;
-mxAnimation.prototype.delay = null;
-mxAnimation.prototype.thread = null;
-mxAnimation.prototype.startAnimation = function() {
-  null == this.thread && (this.thread = window.setInterval(mxUtils.bind(this, this.updateAnimation), this.delay))
-};
-mxAnimation.prototype.updateAnimation = function() {
-  this.fireEvent(new mxEventObject(mxEvent.EXECUTE))
-};
-mxAnimation.prototype.stopAnimation = function() {
-  null != this.thread && (window.clearInterval(this.thread), this.thread = null, this.fireEvent(new mxEventObject(mxEvent.DONE)))
-};
-
-function mxMorphing(a, b, c, d) {
-  mxAnimation.call(this, d);
-  this.graph = a;
-  this.steps = null != b ? b : 6;
-  this.ease = null != c ? c : 1.5
-}
-mxMorphing.prototype = new mxAnimation;
-mxMorphing.prototype.constructor = mxMorphing;
-mxMorphing.prototype.graph = null;
-mxMorphing.prototype.steps = null;
-mxMorphing.prototype.step = 0;
-mxMorphing.prototype.ease = null;
-mxMorphing.prototype.cells = null;
-mxMorphing.prototype.updateAnimation = function() {
-  var a = new mxCellStatePreview(this.graph);
-  if (null != this.cells)
-    for (var b = 0; b < this.cells.length; b++) this.animateCell(cells[b], a, !1);
-  else this.animateCell(this.graph.getModel().getRoot(), a, !0);
-  this.show(a);
-  (a.isEmpty() || this.step++ >= this.steps) && this.stopAnimation()
-};
-mxMorphing.prototype.show = function(a) {
-  a.show()
-};
-mxMorphing.prototype.animateCell = function(a, b, c) {
-  var d = this.graph.getView().getState(a),
-    e = null;
-  if (null != d && (e = this.getDelta(d), this.graph.getModel().isVertex(a) && (0 != e.x || 0 != e.y))) {
-    var f = this.graph.view.getTranslate(),
-      g = this.graph.view.getScale();
-    e.x += f.x * g;
-    e.y += f.y * g;
-    b.moveState(d, -e.x / this.ease, -e.y / this.ease)
-  }
-  if (c && !this.stopRecursion(d, e)) {
-    d = this.graph.getModel().getChildCount(a);
-    for (e = 0; e < d; e++) this.animateCell(this.graph.getModel().getChildAt(a, e), b, c)
-  }
-};
-mxMorphing.prototype.stopRecursion = function(a, b) {
-  return null != b && (0 != b.x || 0 != b.y)
-};
-mxMorphing.prototype.getDelta = function(a) {
-  var b = this.getOriginForCell(a.cell),
-    c = this.graph.getView().getTranslate(),
-    d = this.graph.getView().getScale();
-  a = new mxPoint(a.x / d - c.x, a.y / d - c.y);
-  return new mxPoint((b.x - a.x) * d, (b.y - a.y) * d)
-};
-mxMorphing.prototype.getOriginForCell = function(a) {
-  var b = null;
-  null != a && (b = this.getOriginForCell(this.graph.getModel().getParent(a)), a = this.graph.getCellGeometry(a), null != a && (b.x += a.x, b.y += a.y));
-  null == b && (b = this.graph.view.getTranslate(), b = new mxPoint(-b.x, -b.y));
-  return b
-};
-
-function mxImageBundle(a) {
-  this.images = [];
-  this.alt = null != a ? a : !1
-}
-mxImageBundle.prototype.images = null;
-mxImageBundle.prototype.images = null;
-mxImageBundle.prototype.putImage = function(a, b, c) {
-  this.images[a] = {
-    value: b,
-    fallback: c
-  }
-};
-mxImageBundle.prototype.getImage = function(a) {
-  var b = null;
-  null != a && (a = this.images[a], null != a && (b = this.alt ? a.fallback : a.value));
-  return b
-};
-
-function mxImageExport() {}
-mxImageExport.prototype.includeOverlays = !1;
-mxImageExport.prototype.drawState = function(a, b) {
-  null != a && (this.visitStatesRecursive(a, b, this.drawCellState), this.includeOverlays && this.visitStatesRecursive(a, b, this.drawOverlays))
-};
-mxImageExport.prototype.visitStatesRecursive = function(a, b, c) {
-  if (null != a) {
-    c(a, b);
-    for (var d = a.view.graph, e = d.model.getChildCount(a.cell), f = 0; f < e; f++) {
-      var g = d.view.getState(d.model.getChildAt(a.cell, f));
-      this.visitStatesRecursive(g, b, c)
-    }
-  }
-};
-mxImageExport.prototype.drawCellState = function(a, b) {
-  a.shape instanceof mxShape && (b.save(), a.shape.paint(b), b.restore());
-  null != a.text && (b.save(), a.text.paint(b), b.restore())
-};
-mxImageExport.prototype.drawOverlays = function(a, b) {
-  null != a.overlays && a.overlays.visit(function(a, d) {
-    d instanceof mxShape && d.paint(b)
-  })
-};
-
-function mxAbstractCanvas2D() {
-  this.converter = this.createUrlConverter();
-  this.reset()
-}
-mxAbstractCanvas2D.prototype.state = null;
-mxAbstractCanvas2D.prototype.states = null;
-mxAbstractCanvas2D.prototype.path = null;
-mxAbstractCanvas2D.prototype.rotateHtml = !0;
-mxAbstractCanvas2D.prototype.lastX = 0;
-mxAbstractCanvas2D.prototype.lastY = 0;
-mxAbstractCanvas2D.prototype.moveOp = "M";
-mxAbstractCanvas2D.prototype.lineOp = "L";
-mxAbstractCanvas2D.prototype.quadOp = "Q";
-mxAbstractCanvas2D.prototype.curveOp = "C";
-mxAbstractCanvas2D.prototype.closeOp = "Z";
-mxAbstractCanvas2D.prototype.pointerEvents = !1;
-mxAbstractCanvas2D.prototype.createUrlConverter = function() {
-  return new mxUrlConverter
-};
-mxAbstractCanvas2D.prototype.reset = function() {
-  this.state = this.createState();
-  this.states = []
-};
-mxAbstractCanvas2D.prototype.createState = function() {
-  return {
-    dx: 0,
-    dy: 0,
-    scale: 1,
-    alpha: 1,
-    fillColor: null,
-    fillAlpha: 1,
-    gradientColor: null,
-    gradientAlpha: 1,
-    gradientDirection: null,
-    strokeColor: null,
-    strokeWidth: 1,
-    dashed: !1,
-    dashPattern: "3 3",
-    lineCap: "flat",
-    lineJoin: "miter",
-    miterLimit: 10,
-    fontColor: "#000000",
-    fontBackgroundColor: null,
-    fontBorderColor: null,
-    fontSize: mxConstants.DEFAULT_FONTSIZE,
-    fontFamily: mxConstants.DEFAULT_FONTFAMILY,
-    fontStyle: 0,
-    shadow: !1,
-    shadowColor: mxConstants.SHADOWCOLOR,
-    shadowAlpha: mxConstants.SHADOW_OPACITY,
-    shadowDx: mxConstants.SHADOW_OFFSET_X,
-    shadowDy: mxConstants.SHADOW_OFFSET_Y,
-    rotation: 0,
-    rotationCx: 0,
-    rotationCy: 0
-  }
-};
-mxAbstractCanvas2D.prototype.format = function(a) {
-  return Math.round(parseFloat(a))
-};
-mxAbstractCanvas2D.prototype.addOp = function() {
-  if (null != this.path && (this.path.push(arguments[0]), 2 < arguments.length))
-    for (var a = this.state, b = 2; b < arguments.length; b += 2) this.lastX = arguments[b - 1], this.lastY = arguments[b], this.path.push(this.format((this.lastX + a.dx) * a.scale)), this.path.push(
-      this.format((this.lastY + a.dy) * a.scale))
-};
-mxAbstractCanvas2D.prototype.rotatePoint = function(a, b, c, d, e) {
-  c *= Math.PI / 180;
-  return mxUtils.getRotatedPoint(new mxPoint(a, b), Math.cos(c), Math.sin(c), new mxPoint(d, e))
-};
-mxAbstractCanvas2D.prototype.save = function() {
-  this.states.push(this.state);
-  this.state = mxUtils.clone(this.state)
-};
-mxAbstractCanvas2D.prototype.restore = function() {
-  this.state = this.states.pop()
-};
-mxAbstractCanvas2D.prototype.scale = function(a) {
-  this.state.scale *= a;
-  this.state.strokeWidth *= a
-};
-mxAbstractCanvas2D.prototype.translate = function(a, b) {
-  this.state.dx += a;
-  this.state.dy += b
-};
-mxAbstractCanvas2D.prototype.setAlpha = function(a) {
-  this.state.alpha = a
-};
-mxAbstractCanvas2D.prototype.setFillColor = function(a) {
-  a == mxConstants.NONE && (a = null);
-  this.state.fillColor = a;
-  this.state.gradientColor = null
-};
-mxAbstractCanvas2D.prototype.setGradient = function(a, b, c, d, e, f, g, h, k) {
-  c = this.state;
-  c.fillColor = a;
-  c.fillAlpha = null != h ? h : 1;
-  c.gradientColor = b;
-  c.gradientAlpha = null != k ? k : 1;
-  c.gradientDirection = g
-};
-mxAbstractCanvas2D.prototype.setStrokeColor = function(a) {
-  a == mxConstants.NONE && (a = null);
-  this.state.strokeColor = a
-};
-mxAbstractCanvas2D.prototype.setStrokeWidth = function(a) {
-  this.state.strokeWidth = a
-};
-mxAbstractCanvas2D.prototype.setDashed = function(a) {
-  this.state.dashed = a
-};
-mxAbstractCanvas2D.prototype.setDashPattern = function(a) {
-  this.state.dashPattern = a
-};
-mxAbstractCanvas2D.prototype.setLineCap = function(a) {
-  this.state.lineCap = a
-};
-mxAbstractCanvas2D.prototype.setLineJoin = function(a) {
-  this.state.lineJoin = a
-};
-mxAbstractCanvas2D.prototype.setMiterLimit = function(a) {
-  this.state.miterLimit = a
-};
-mxAbstractCanvas2D.prototype.setFontColor = function(a) {
-  a == mxConstants.NONE && (a = null);
-  this.state.fontColor = a
-};
-mxAbstractCanvas2D.prototype.setFontBackgroundColor = function(a) {
-  a == mxConstants.NONE && (a = null);
-  this.state.fontBackgroundColor = a
-};
-mxAbstractCanvas2D.prototype.setFontBorderColor = function(a) {
-  a == mxConstants.NONE && (a = null);
-  this.state.fontBorderColor = a
-};
-mxAbstractCanvas2D.prototype.setFontSize = function(a) {
-  this.state.fontSize = a
-};
-mxAbstractCanvas2D.prototype.setFontFamily = function(a) {
-  this.state.fontFamily = a
-};
-mxAbstractCanvas2D.prototype.setFontStyle = function(a) {
-  null == a && (a = 0);
-  this.state.fontStyle = a
-};
-mxAbstractCanvas2D.prototype.setShadow = function(a) {
-  this.state.shadow = a
-};
-mxAbstractCanvas2D.prototype.setShadowColor = function(a) {
-  a == mxConstants.NONE && (a = null);
-  this.state.shadowColor = a
-};
-mxAbstractCanvas2D.prototype.setShadowAlpha = function(a) {
-  this.state.shadowAlpha = a
-};
-mxAbstractCanvas2D.prototype.setShadowOffset = function(a, b) {
-  this.state.shadowDx = a;
-  this.state.shadowDy = b
-};
-mxAbstractCanvas2D.prototype.begin = function() {
-  this.lastY = this.lastX = 0;
-  this.path = []
-};
-mxAbstractCanvas2D.prototype.moveTo = function(a, b) {
-  this.addOp(this.moveOp, a, b)
-};
-mxAbstractCanvas2D.prototype.lineTo = function(a, b) {
-  this.addOp(this.lineOp, a, b)
-};
-mxAbstractCanvas2D.prototype.quadTo = function(a, b, c, d) {
-  this.addOp(this.quadOp, a, b, c, d)
-};
-mxAbstractCanvas2D.prototype.curveTo = function(a, b, c, d, e, f) {
-  this.addOp(this.curveOp, a, b, c, d, e, f)
-};
-mxAbstractCanvas2D.prototype.arcTo = function(a, b, c, d, e, f, g) {
-  a = mxUtils.arcToCurves(this.lastX, this.lastY, a, b, c, d, e, f, g);
-  for (b = 0; b < a.length; b += 6) this.curveTo(a[b], a[b + 1], a[b + 2], a[b + 3], a[b + 4], a[b + 5])
-};
-mxAbstractCanvas2D.prototype.close = function(a, b, c, d, e, f) {
-  this.addOp(this.closeOp)
-};
-mxAbstractCanvas2D.prototype.end = function() {};
-
-function mxXmlCanvas2D(a) {
-  mxAbstractCanvas2D.call(this);
-  this.root = a;
-  this.writeDefaults()
-}
-mxUtils.extend(mxXmlCanvas2D, mxAbstractCanvas2D);
-mxXmlCanvas2D.prototype.textEnabled = !0;
-mxXmlCanvas2D.prototype.compressed = !0;
-mxXmlCanvas2D.prototype.writeDefaults = function() {
-  var a;
-  a = this.createElement("fontfamily");
-  a.setAttribute("family", mxConstants.DEFAULT_FONTFAMILY);
-  this.root.appendChild(a);
-  a = this.createElement("fontsize");
-  a.setAttribute("size", mxConstants.DEFAULT_FONTSIZE);
-  this.root.appendChild(a);
-  a = this.createElement("shadowcolor");
-  a.setAttribute("color", mxConstants.SHADOWCOLOR);
-  this.root.appendChild(a);
-  a = this.createElement("shadowalpha");
-  a.setAttribute("alpha", mxConstants.SHADOW_OPACITY);
-  this.root.appendChild(a);
-  a = this.createElement("shadowoffset");
-  a.setAttribute("dx", mxConstants.SHADOW_OFFSET_X);
-  a.setAttribute("dy", mxConstants.SHADOW_OFFSET_Y);
-  this.root.appendChild(a)
-};
-mxXmlCanvas2D.prototype.format = function(a) {
-  return parseFloat(parseFloat(a).toFixed(2))
-};
-mxXmlCanvas2D.prototype.createElement = function(a) {
-  return this.root.ownerDocument.createElement(a)
-};
-mxXmlCanvas2D.prototype.save = function() {
-  this.compressed && mxAbstractCanvas2D.prototype.save.apply(this, arguments);
-  this.root.appendChild(this.createElement("save"))
-};
-mxXmlCanvas2D.prototype.restore = function() {
-  this.compressed && mxAbstractCanvas2D.prototype.restore.apply(this, arguments);
-  this.root.appendChild(this.createElement("restore"))
-};
-mxXmlCanvas2D.prototype.scale = function(a) {
-  if (this.compressed) {
-    if (this.state.scale == a) return;
-    mxAbstractCanvas2D.prototype.setAlpha.apply(this, arguments)
-  }
-  var b = this.createElement("scale");
-  b.setAttribute("scale", a);
-  this.root.appendChild(b)
-};
-mxXmlCanvas2D.prototype.translate = function(a, b) {
-  var c = this.createElement("translate");
-  c.setAttribute("dx", this.format(a));
-  c.setAttribute("dy", this.format(b));
-  this.root.appendChild(c)
-};
-mxXmlCanvas2D.prototype.rotate = function(a, b, c, d, e) {
-  var f = this.createElement("rotate");
-  if (0 != a || b || c) f.setAttribute("theta", this.format(a)), f.setAttribute("flipH", b ? "1" : "0"), f.setAttribute("flipV", c ? "1" : "0"), f.setAttribute("cx", this.format(d)), f.setAttribute(
-    "cy", this.format(e)), this.root.appendChild(f)
-};
-mxXmlCanvas2D.prototype.setAlpha = function(a) {
-  if (this.compressed) {
-    if (this.state.alpha == a) return;
-    mxAbstractCanvas2D.prototype.setAlpha.apply(this, arguments)
-  }
-  var b = this.createElement("alpha");
-  b.setAttribute("alpha", this.format(a));
-  this.root.appendChild(b)
-};
-mxXmlCanvas2D.prototype.setFillColor = function(a) {
-  a == mxConstants.NONE && (a = null);
-  if (this.compressed) {
-    if (this.state.fillColor == a) return;
-    mxAbstractCanvas2D.prototype.setFillColor.apply(this, arguments)
-  }
-  var b = this.createElement("fillcolor");
-  b.setAttribute("color", null != a ? a : mxConstants.NONE);
-  this.root.appendChild(b)
-};
-mxXmlCanvas2D.prototype.setGradient = function(a, b, c, d, e, f, g, h, k) {
-  if (null != a && null != b) {
-    mxAbstractCanvas2D.prototype.setGradient.apply(this, arguments);
-    var l = this.createElement("gradient");
-    l.setAttribute("c1", a);
-    l.setAttribute("c2", b);
-    l.setAttribute("x", this.format(c));
-    l.setAttribute("y", this.format(d));
-    l.setAttribute("w", this.format(e));
-    l.setAttribute("h", this.format(f));
-    null != g && l.setAttribute("direction", g);
-    null != h && l.setAttribute("alpha1", h);
-    null != k && l.setAttribute("alpha2", k);
-    this.root.appendChild(l)
-  }
-};
-mxXmlCanvas2D.prototype.setStrokeColor = function(a) {
-  a == mxConstants.NONE && (a = null);
-  if (this.compressed) {
-    if (this.state.strokeColor == a) return;
-    mxAbstractCanvas2D.prototype.setStrokeColor.apply(this, arguments)
-  }
-  var b = this.createElement("strokecolor");
-  b.setAttribute("color", null != a ? a : mxConstants.NONE);
-  this.root.appendChild(b)
-};
-mxXmlCanvas2D.prototype.setStrokeWidth = function(a) {
-  if (this.compressed) {
-    if (this.state.strokeWidth == a) return;
-    mxAbstractCanvas2D.prototype.setStrokeWidth.apply(this, arguments)
-  }
-  var b = this.createElement("strokewidth");
-  b.setAttribute("width", this.format(a));
-  this.root.appendChild(b)
-};
-mxXmlCanvas2D.prototype.setDashed = function(a) {
-  if (this.compressed) {
-    if (this.state.dashed == a) return;
-    mxAbstractCanvas2D.prototype.setDashed.apply(this, arguments)
-  }
-  var b = this.createElement("dashed");
-  b.setAttribute("dashed", a ? "1" : "0");
-  this.root.appendChild(b)
-};
-mxXmlCanvas2D.prototype.setDashPattern = function(a) {
-  if (this.compressed) {
-    if (this.state.dashPattern == a) return;
-    mxAbstractCanvas2D.prototype.setDashPattern.apply(this, arguments)
-  }
-  var b = this.createElement("dashpattern");
-  b.setAttribute("pattern", a);
-  this.root.appendChild(b)
-};
-mxXmlCanvas2D.prototype.setLineCap = function(a) {
-  if (this.compressed) {
-    if (this.state.lineCap == a) return;
-    mxAbstractCanvas2D.prototype.setLineCap.apply(this, arguments)
-  }
-  var b = this.createElement("linecap");
-  b.setAttribute("cap", a);
-  this.root.appendChild(b)
-};
-mxXmlCanvas2D.prototype.setLineJoin = function(a) {
-  if (this.compressed) {
-    if (this.state.lineJoin == a) return;
-    mxAbstractCanvas2D.prototype.setLineJoin.apply(this, arguments)
-  }
-  var b = this.createElement("linejoin");
-  b.setAttribute("join", a);
-  this.root.appendChild(b)
-};
-mxXmlCanvas2D.prototype.setMiterLimit = function(a) {
-  if (this.compressed) {
-    if (this.state.miterLimit == a) return;
-    mxAbstractCanvas2D.prototype.setMiterLimit.apply(this, arguments)
-  }
-  var b = this.createElement("miterlimit");
-  b.setAttribute("limit", a);
-  this.root.appendChild(b)
-};
-mxXmlCanvas2D.prototype.setFontColor = function(a) {
-  if (this.textEnabled) {
-    a == mxConstants.NONE && (a = null);
-    if (this.compressed) {
-      if (this.state.fontColor == a) return;
-      mxAbstractCanvas2D.prototype.setFontColor.apply(this, arguments)
-    }
-    var b = this.createElement("fontcolor");
-    b.setAttribute("color", null != a ? a : mxConstants.NONE);
-    this.root.appendChild(b)
-  }
-};
-mxXmlCanvas2D.prototype.setFontBackgroundColor = function(a) {
-  if (this.textEnabled) {
-    a == mxConstants.NONE && (a = null);
-    if (this.compressed) {
-      if (this.state.fontBackgroundColor == a) return;
-      mxAbstractCanvas2D.prototype.setFontBackgroundColor.apply(this, arguments)
-    }
-    var b = this.createElement("fontbackgroundcolor");
-    b.setAttribute("color", null != a ? a : mxConstants.NONE);
-    this.root.appendChild(b)
-  }
-};
-mxXmlCanvas2D.prototype.setFontBorderColor = function(a) {
-  if (this.textEnabled) {
-    a == mxConstants.NONE && (a = null);
-    if (this.compressed) {
-      if (this.state.fontBorderColor == a) return;
-      mxAbstractCanvas2D.prototype.setFontBorderColor.apply(this, arguments)
-    }
-    var b = this.createElement("fontbordercolor");
-    b.setAttribute("color", null != a ? a : mxConstants.NONE);
-    this.root.appendChild(b)
-  }
-};
-mxXmlCanvas2D.prototype.setFontSize = function(a) {
-  if (this.textEnabled) {
-    if (this.compressed) {
-      if (this.state.fontSize == a) return;
-      mxAbstractCanvas2D.prototype.setFontSize.apply(this, arguments)
-    }
-    var b = this.createElement("fontsize");
-    b.setAttribute("size", a);
-    this.root.appendChild(b)
-  }
-};
-mxXmlCanvas2D.prototype.setFontFamily = function(a) {
-  if (this.textEnabled) {
-    if (this.compressed) {
-      if (this.state.fontFamily == a) return;
-      mxAbstractCanvas2D.prototype.setFontFamily.apply(this, arguments)
-    }
-    var b = this.createElement("fontfamily");
-    b.setAttribute("family", a);
-    this.root.appendChild(b)
-  }
-};
-mxXmlCanvas2D.prototype.setFontStyle = function(a) {
-  if (this.textEnabled) {
-    null == a && (a = 0);
-    if (this.compressed) {
-      if (this.state.fontStyle == a) return;
-      mxAbstractCanvas2D.prototype.setFontStyle.apply(this, arguments)
-    }
-    var b = this.createElement("fontstyle");
-    b.setAttribute("style", a);
-    this.root.appendChild(b)
-  }
-};
-mxXmlCanvas2D.prototype.setShadow = function(a) {
-  if (this.compressed) {
-    if (this.state.shadow == a) return;
-    mxAbstractCanvas2D.prototype.setShadow.apply(this, arguments)
-  }
-  var b = this.createElement("shadow");
-  b.setAttribute("enabled", a ? "1" : "0");
-  this.root.appendChild(b)
-};
-mxXmlCanvas2D.prototype.setShadowColor = function(a) {
-  if (this.compressed) {
-    a == mxConstants.NONE && (a = null);
-    if (this.state.shadowColor == a) return;
-    mxAbstractCanvas2D.prototype.setShadowColor.apply(this, arguments)
-  }
-  var b = this.createElement("shadowcolor");
-  b.setAttribute("color", null != a ? a : mxConstants.NONE);
-  this.root.appendChild(b)
-};
-mxXmlCanvas2D.prototype.setShadowAlpha = function(a) {
-  if (this.compressed) {
-    if (this.state.shadowAlpha == a) return;
-    mxAbstractCanvas2D.prototype.setShadowAlpha.apply(this, arguments)
-  }
-  var b = this.createElement("shadowalpha");
-  b.setAttribute("alpha", a);
-  this.root.appendChild(b)
-};
-mxXmlCanvas2D.prototype.setShadowOffset = function(a, b) {
-  if (this.compressed) {
-    if (this.state.shadowDx == a && this.state.shadowDy == b) return;
-    mxAbstractCanvas2D.prototype.setShadowOffset.apply(this, arguments)
-  }
-  var c = this.createElement("shadowoffset");
-  c.setAttribute("dx", a);
-  c.setAttribute("dy", b);
-  this.root.appendChild(c)
-};
-mxXmlCanvas2D.prototype.rect = function(a, b, c, d) {
-  var e = this.createElement("rect");
-  e.setAttribute("x", this.format(a));
-  e.setAttribute("y", this.format(b));
-  e.setAttribute("w", this.format(c));
-  e.setAttribute("h", this.format(d));
-  this.root.appendChild(e)
-};
-mxXmlCanvas2D.prototype.roundrect = function(a, b, c, d, e, f) {
-  var g = this.createElement("roundrect");
-  g.setAttribute("x", this.format(a));
-  g.setAttribute("y", this.format(b));
-  g.setAttribute("w", this.format(c));
-  g.setAttribute("h", this.format(d));
-  g.setAttribute("dx", this.format(e));
-  g.setAttribute("dy", this.format(f));
-  this.root.appendChild(g)
-};
-mxXmlCanvas2D.prototype.ellipse = function(a, b, c, d) {
-  var e = this.createElement("ellipse");
-  e.setAttribute("x", this.format(a));
-  e.setAttribute("y", this.format(b));
-  e.setAttribute("w", this.format(c));
-  e.setAttribute("h", this.format(d));
-  this.root.appendChild(e)
-};
-mxXmlCanvas2D.prototype.image = function(a, b, c, d, e, f, g, h) {
-  e = this.converter.convert(e);
-  var k = this.createElement("image");
-  k.setAttribute("x", this.format(a));
-  k.setAttribute("y", this.format(b));
-  k.setAttribute("w", this.format(c));
-  k.setAttribute("h", this.format(d));
-  k.setAttribute("src", e);
-  k.setAttribute("aspect", f ? "1" : "0");
-  k.setAttribute("flipH", g ? "1" : "0");
-  k.setAttribute("flipV", h ? "1" : "0");
-  this.root.appendChild(k)
-};
-mxXmlCanvas2D.prototype.begin = function() {
-  this.root.appendChild(this.createElement("begin"));
-  this.lastY = this.lastX = 0
-};
-mxXmlCanvas2D.prototype.moveTo = function(a, b) {
-  var c = this.createElement("move");
-  c.setAttribute("x", this.format(a));
-  c.setAttribute("y", this.format(b));
-  this.root.appendChild(c);
-  this.lastX = a;
-  this.lastY = b
-};
-mxXmlCanvas2D.prototype.lineTo = function(a, b) {
-  var c = this.createElement("line");
-  c.setAttribute("x", this.format(a));
-  c.setAttribute("y", this.format(b));
-  this.root.appendChild(c);
-  this.lastX = a;
-  this.lastY = b
-};
-mxXmlCanvas2D.prototype.quadTo = function(a, b, c, d) {
-  var e = this.createElement("quad");
-  e.setAttribute("x1", this.format(a));
-  e.setAttribute("y1", this.format(b));
-  e.setAttribute("x2", this.format(c));
-  e.setAttribute("y2", this.format(d));
-  this.root.appendChild(e);
-  this.lastX = c;
-  this.lastY = d
-};
-mxXmlCanvas2D.prototype.curveTo = function(a, b, c, d, e, f) {
-  var g = this.createElement("curve");
-  g.setAttribute("x1", this.format(a));
-  g.setAttribute("y1", this.format(b));
-  g.setAttribute("x2", this.format(c));
-  g.setAttribute("y2", this.format(d));
-  g.setAttribute("x3", this.format(e));
-  g.setAttribute("y3", this.format(f));
-  this.root.appendChild(g);
-  this.lastX = e;
-  this.lastY = f
-};
-mxXmlCanvas2D.prototype.close = function() {
-  this.root.appendChild(this.createElement("close"))
-};
-mxXmlCanvas2D.prototype.text = function(a, b, c, d, e, f, g, h, k, l, m, n) {
-  if (this.textEnabled && null != e) {
-    mxUtils.isNode(e) && (e = mxUtils.getOuterHtml(e));
-    var p = this.createElement("text");
-    p.setAttribute("x", this.format(a));
-    p.setAttribute("y", this.format(b));
-    p.setAttribute("w", this.format(c));
-    p.setAttribute("h", this.format(d));
-    p.setAttribute("str", e);
-    null != f && p.setAttribute("align", f);
-    null != g && p.setAttribute("valign", g);
-    p.setAttribute("wrap", h ? "1" : "0");
-    null == k && (k = "");
-    p.setAttribute("format", k);
-    null != l && p.setAttribute("fill",
-      l ? "1" : "0");
-    null != m && p.setAttribute("clip", m ? "1" : "0");
-    null != n && p.setAttribute("rotation", n);
-    this.root.appendChild(p)
-  }
-};
-mxXmlCanvas2D.prototype.stroke = function() {
-  this.root.appendChild(this.createElement("stroke"))
-};
-mxXmlCanvas2D.prototype.fill = function() {
-  this.root.appendChild(this.createElement("fill"))
-};
-mxXmlCanvas2D.prototype.fillAndStroke = function() {
-  this.root.appendChild(this.createElement("fillstroke"))
-};
-
-function mxSvgCanvas2D(a, b) {
-  mxAbstractCanvas2D.call(this);
-  this.root = a;
-  this.gradients = [];
-  this.defs = null;
-  this.styleEnabled = null != b ? b : !1;
-  var c = null;
-  if (a.ownerDocument != document)
-    for (c = a; null != c && "svg" != c.nodeName;) c = c.parentNode;
-  null != c && (0 < c.getElementsByTagName("defs").length && (this.defs = c.getElementsByTagName("defs")[0]), null == this.defs && (this.defs = this.createElement("defs"), null != c.firstChild ? c.insertBefore(
-    this.defs, c.firstChild) : c.appendChild(this.defs)), this.styleEnabled && this.defs.appendChild(this.createStyle()))
-}
-mxUtils.extend(mxSvgCanvas2D, mxAbstractCanvas2D);
-mxSvgCanvas2D.prototype.node = null;
-mxSvgCanvas2D.prototype.matchHtmlAlignment = !0;
-mxSvgCanvas2D.prototype.textEnabled = !0;
-mxSvgCanvas2D.prototype.foEnabled = !0;
-mxSvgCanvas2D.prototype.strokeTolerance = 0;
-mxSvgCanvas2D.prototype.refCount = 0;
-mxSvgCanvas2D.prototype.blockImagePointerEvents = !1;
-mxSvgCanvas2D.prototype.reset = function() {
-  mxAbstractCanvas2D.prototype.reset.apply(this, arguments);
-  this.gradients = []
-};
-mxSvgCanvas2D.prototype.createStyle = function(a) {
-  a = this.createElement("style");
-  a.setAttribute("type", "text/css");
-  mxUtils.write(a, "svg{font-family:" + mxConstants.DEFAULT_FONTFAMILY + ";font-size:" + mxConstants.DEFAULT_FONTSIZE + ";fill:none;stroke-miterlimit:10}");
-  return a
-};
-mxSvgCanvas2D.prototype.createElement = function(a, b) {
-  if (null != this.root.ownerDocument.createElementNS) return this.root.ownerDocument.createElementNS(b || mxConstants.NS_SVG, a);
-  var c = this.root.ownerDocument.createElement(a);
-  null != b && c.setAttribute("xmlns", b);
-  return c
-};
-mxSvgCanvas2D.prototype.createGradientId = function(a, b, c, d, e) {
-  "#" == a.charAt(0) && (a = a.substring(1));
-  "#" == b.charAt(0) && (b = b.substring(1));
-  a = a.toLowerCase() + "-" + c;
-  b = b.toLowerCase() + "-" + d;
-  c = null;
-  null == e || e == mxConstants.DIRECTION_SOUTH ? c = "s" : e == mxConstants.DIRECTION_EAST ? c = "e" : (d = a, a = b, b = d, e == mxConstants.DIRECTION_NORTH ? c = "s" : e == mxConstants.DIRECTION_WEST &&
-    (c = "e"));
-  return "mx-gradient-" + a + "-" + b + "-" + c
-};
-mxSvgCanvas2D.prototype.getSvgGradient = function(a, b, c, d, e) {
-  var f = this.createGradientId(a, b, c, d, e),
-    g = this.gradients[f];
-  if (null == g) {
-    var h = this.root.ownerSVGElement,
-      k = 0,
-      l = f + "-" + k;
-    if (null != h)
-      for (g = h.ownerDocument.getElementById(l); null != g && g.ownerSVGElement != h;) l = f + "-" + k++, g = h.ownerDocument.getElementById(l);
-    else l = "id" + ++this.refCount;
-    null == g && (g = this.createSvgGradient(a, b, c, d, e), g.setAttribute("id", l), null != this.defs ? this.defs.appendChild(g) : h.appendChild(g));
-    this.gradients[f] = g
-  }
-  return g.getAttribute("id")
-};
-mxSvgCanvas2D.prototype.createSvgGradient = function(a, b, c, d, e) {
-  var f = this.createElement("linearGradient");
-  f.setAttribute("x1", "0%");
-  f.setAttribute("y1", "0%");
-  f.setAttribute("x2", "0%");
-  f.setAttribute("y2", "0%");
-  null == e || e == mxConstants.DIRECTION_SOUTH ? f.setAttribute("y2", "100%") : e == mxConstants.DIRECTION_EAST ? f.setAttribute("x2", "100%") : e == mxConstants.DIRECTION_NORTH ? f.setAttribute(
-    "y1", "100%") : e == mxConstants.DIRECTION_WEST && f.setAttribute("x1", "100%");
-  c = 1 > c ? ";stop-opacity:" + c : "";
-  e = this.createElement("stop");
-  e.setAttribute("offset", "0%");
-  e.setAttribute("style", "stop-color:" + a + c);
-  f.appendChild(e);
-  c = 1 > d ? ";stop-opacity:" + d : "";
-  e = this.createElement("stop");
-  e.setAttribute("offset", "100%");
-  e.setAttribute("style", "stop-color:" + b + c);
-  f.appendChild(e);
-  return f
-};
-mxSvgCanvas2D.prototype.addNode = function(a, b) {
-  var c = this.node,
-    d = this.state;
-  if (null != c) {
-    if ("path" == c.nodeName)
-      if (null != this.path && 0 < this.path.length) c.setAttribute("d", this.path.join(" "));
-      else return;
-    a && null != d.fillColor ? this.updateFill() : this.styleEnabled || ("ellipse" == c.nodeName && mxClient.IS_NS && !mxClient.IS_GC && !mxClient.IS_SF ? c.setAttribute("fill", "transparent") : c.setAttribute(
-      "fill", "none"), a = !1);
-    b && null != d.strokeColor ? this.updateStroke() : this.styleEnabled || c.setAttribute("stroke", "none");
-    null !=
-      d.transform && 0 < d.transform.length && c.setAttribute("transform", d.transform);
-    d.shadow && this.root.appendChild(this.createShadow(c));
-    0 < this.strokeTolerance && !a && this.root.appendChild(this.createTolerance(c));
-    this.pointerEvents && ("path" != c.nodeName || this.path[this.path.length - 1] == this.closeOp) && c.setAttribute("pointer-events", "all");
-    this.root.appendChild(c)
-  }
-};
-mxSvgCanvas2D.prototype.updateFill = function() {
-  var a = this.state;
-  1 > a.alpha && this.node.setAttribute("fill-opacity", a.alpha);
-  null != a.fillColor && (null != a.gradientColor ? (a = this.getSvgGradient(a.fillColor, a.gradientColor, a.fillAlpha, a.gradientAlpha, a.gradientDirection), this.node.setAttribute("fill", "url(#" +
-    a + ")")) : this.node.setAttribute("fill", a.fillColor.toLowerCase()))
-};
-mxSvgCanvas2D.prototype.updateStroke = function() {
-  var a = this.state;
-  this.node.setAttribute("stroke", a.strokeColor.toLowerCase());
-  1 > a.alpha && this.node.setAttribute("stroke-opacity", a.alpha);
-  var b = Math.max(1, this.format(a.strokeWidth * a.scale));
-  1 != b && this.node.setAttribute("stroke-width", b);
-  "path" == this.node.nodeName && this.updateStrokeAttributes();
-  a.dashed && this.node.setAttribute("stroke-dasharray", this.createDashPattern(b))
-};
-mxSvgCanvas2D.prototype.updateStrokeAttributes = function() {
-  var a = this.state;
-  null != a.lineJoin && "miter" != a.lineJoin && this.node.setAttribute("stroke-linejoin", a.lineJoin);
-  if (null != a.lineCap) {
-    var b = a.lineCap;
-    "flat" == b && (b = "butt");
-    "butt" != b && this.node.setAttribute("stroke-linecap", b)
-  }
-  null != a.miterLimit && (!this.styleEnabled || 10 != a.miterLimit) && this.node.setAttribute("stroke-miterlimit", a.miterLimit)
-};
-mxSvgCanvas2D.prototype.createDashPattern = function(a) {
-  var b = this.state.dashPattern.split(" "),
-    c = [];
-  if (0 < b.length)
-    for (var d = 0; d < b.length; d++) c[d] = Number(b[d]) * a;
-  return c.join(" ")
-};
-mxSvgCanvas2D.prototype.createTolerance = function(a) {
-  a = a.cloneNode(!0);
-  var b = parseFloat(a.getAttribute("stroke-width") || 1) + this.strokeTolerance;
-  a.setAttribute("pointer-events", "stroke");
-  a.setAttribute("visibility", "hidden");
-  a.removeAttribute("stroke-dasharray");
-  a.setAttribute("stroke-width", b);
-  a.setAttribute("fill", "none");
-  a.setAttribute("stroke", mxClient.IS_OP ? "none" : "white");
-  return a
-};
-mxSvgCanvas2D.prototype.createShadow = function(a) {
-  a = a.cloneNode(!0);
-  var b = this.state;
-  "none" != a.getAttribute("fill") && a.setAttribute("fill", b.shadowColor);
-  "none" != a.getAttribute("stroke") && a.setAttribute("stroke", b.shadowColor);
-  a.setAttribute("transform", "translate(" + this.format(b.shadowDx * b.scale) + "," + this.format(b.shadowDy * b.scale) + ")" + (b.transform || ""));
-  a.setAttribute("opacity", b.shadowAlpha);
-  return a
-};
-mxSvgCanvas2D.prototype.rotate = function(a, b, c, d, e) {
-  if (0 != a || b || c) {
-    var f = this.state;
-    d += f.dx;
-    e += f.dy;
-    d *= f.scale;
-    e *= f.scale;
-    f.transform = f.transform || "";
-    if (b && c) a += 180;
-    else if (b ^ c) {
-      var g = b ? d : 0,
-        h = b ? -1 : 1,
-        k = c ? e : 0,
-        l = c ? -1 : 1;
-      f.transform += "translate(" + this.format(g) + "," + this.format(k) + ")scale(" + this.format(h) + "," + this.format(l) + ")translate(" + this.format(-g) + "," + this.format(-k) + ")"
-    }
-    if (b ? !c : c) a *= -1;
-    0 != a && (f.transform += "rotate(" + this.format(a) + "," + this.format(d) + "," + this.format(e) + ")");
-    f.rotation += a;
-    f.rotationCx =
-      d;
-    f.rotationCy = e
-  }
-};
-mxSvgCanvas2D.prototype.begin = function() {
-  mxAbstractCanvas2D.prototype.begin.apply(this, arguments);
-  this.node = this.createElement("path")
-};
-mxSvgCanvas2D.prototype.rect = function(a, b, c, d) {
-  var e = this.state,
-    f = this.createElement("rect");
-  f.setAttribute("x", this.format((a + e.dx) * e.scale));
-  f.setAttribute("y", this.format((b + e.dy) * e.scale));
-  f.setAttribute("width", this.format(c * e.scale));
-  f.setAttribute("height", this.format(d * e.scale));
-  this.node = f
-};
-mxSvgCanvas2D.prototype.roundrect = function(a, b, c, d, e, f) {
-  this.rect(a, b, c, d);
-  0 < e && this.node.setAttribute("rx", this.format(e * this.state.scale));
-  0 < f && this.node.setAttribute("ry", this.format(f * this.state.scale))
-};
-mxSvgCanvas2D.prototype.ellipse = function(a, b, c, d) {
-  var e = this.state,
-    f = this.createElement("ellipse");
-  f.setAttribute("cx", Math.round((a + c / 2 + e.dx) * e.scale));
-  f.setAttribute("cy", Math.round((b + d / 2 + e.dy) * e.scale));
-  f.setAttribute("rx", c / 2 * e.scale);
-  f.setAttribute("ry", d / 2 * e.scale);
-  this.node = f
-};
-mxSvgCanvas2D.prototype.image = function(a, b, c, d, e, f, g, h) {
-  e = this.converter.convert(e);
-  f = null != f ? f : !0;
-  g = null != g ? g : !1;
-  h = null != h ? h : !1;
-  var k = this.state;
-  a += k.dx;
-  b += k.dy;
-  var l = this.createElement("image");
-  l.setAttribute("x", this.format(a * k.scale));
-  l.setAttribute("y", this.format(b * k.scale));
-  l.setAttribute("width", this.format(c * k.scale));
-  l.setAttribute("height", this.format(d * k.scale));
-  null == l.setAttributeNS ? l.setAttribute("xlink:href", e) : l.setAttributeNS(mxConstants.NS_XLINK, "href", e);
-  f || l.setAttribute("preserveAspectRatio",
-    "none");
-  1 > k.alpha && l.setAttribute("opacity", k.alpha);
-  e = this.state.transform || "";
-  if (g || h) {
-    var m = f = 1,
-      n = 0,
-      p = 0;
-    g && (f = -1, n = -c - 2 * a);
-    h && (m = -1, p = -d - 2 * b);
-    e += "scale(" + f + "," + m + ")translate(" + n + "," + p + ")"
-  }
-  0 < e.length && l.setAttribute("transform", e);
-  this.root.appendChild(l);
-  this.blockImagePointerEvents && (l.setAttribute("style", "pointer-events:none"), l = this.createElement("rect"), l.setAttribute("visibility", "hidden"), l.setAttribute("pointer-events", "fill"),
-    l.setAttribute("x", this.format(a * k.scale)), l.setAttribute("y",
-      this.format(b * k.scale)), l.setAttribute("width", this.format(c * k.scale)), l.setAttribute("height", this.format(d * k.scale)), this.root.appendChild(l))
-};
-mxSvgCanvas2D.prototype.createDiv = function(a, b, c, d, e) {
-  c = this.state;
-  d = "display:inline-block;font-size:" + Math.round(c.fontSize) + "px;font-family:" + c.fontFamily + ";color:" + c.fontColor + ";line-height:" + Math.round(c.fontSize * mxConstants.LINE_HEIGHT) +
-    "px;" + d;
-  (c.fontStyle & mxConstants.FONT_BOLD) == mxConstants.FONT_BOLD && (d += "font-weight:bold;");
-  (c.fontStyle & mxConstants.FONT_ITALIC) == mxConstants.FONT_ITALIC && (d += "font-style:italic;");
-  (c.fontStyle & mxConstants.FONT_UNDERLINE) == mxConstants.FONT_UNDERLINE && (d += "font-decoration:underline;");
-  b == mxConstants.ALIGN_CENTER ? d += "text-align:center;" : b == mxConstants.ALIGN_RIGHT && (d += "text-align:right;");
-  b = "";
-  null != c.fontBackgroundColor && (b += "background-color:" + c.fontBackgroundColor + ";");
-  null != c.fontBorderColor && (b += "border:1px solid " + c.fontBorderColor + ";");
-  mxUtils.isNode(a) || (c = document.createElement("textarea"), c.innerHTML = a.replace(/&lt;/g, "\x26amp;lt;").replace(/&gt;/g, "\x26amp;gt;").replace(/</g, "\x26lt;").replace(/>/g, "\x26gt;"), a =
-    c.value, e ? d += b : 0 < b.length && (a = '\x3cdiv xmlns\x3d"http://www.w3.org/1999/xhtml" style\x3d"display:inline-block;' +
-      b + '"\x3e' + a + "\x3c/div\x3e"));
-  if (!mxClient.IS_IE && document.createElementNS) return e = document.createElementNS("http://www.w3.org/1999/xhtml", "div"), e.setAttribute("style", d), mxUtils.isNode(a) ? this.root.ownerDocument !=
-    document ? e.appendChild(a.cloneNode(!0)) : e.appendChild(a) : e.innerHTML = a, e;
-  mxUtils.isNode(a) && this.root.ownerDocument != document && (a = a.outerHTML);
-  a = a.replace(/<br>/g, "\x3cbr /\x3e").replace(/<hr>/g, "\x3chr /\x3e");
-  return mxUtils.parseXml('\x3cdiv xmlns\x3d"http://www.w3.org/1999/xhtml" style\x3d"' +
-    d + '"\x3e' + a + "\x3c/div\x3e").documentElement
-};
-mxSvgCanvas2D.prototype.text = function(a, b, c, d, e, f, g, h, k, l, m, n) {
-  if (this.textEnabled && null != e) {
-    n = null != n ? n : 0;
-    var p = this.state;
-    a += p.dx;
-    b += p.dy;
-    if (this.foEnabled && "html" == k) {
-      var q = "vertical-align:top;";
-      m ? (q += "overflow:hidden;", 0 < d && (q += "max-height:" + Math.round(d) + "px;"), 0 < c && (q += "width:" + Math.round(c) + "px;")) : l && (q += "width:" + Math.round(c) + "px;", 0 < d &&
-        (q += "max-height:" + Math.round(d) + "px;"));
-      h ? (!m && 0 < c && (q += "width:" + Math.round(c) + "px;"), q += "white-space:normal;") : q += "white-space:nowrap;";
-      h = this.createElement("g");
-      1 > p.alpha && h.setAttribute("opacity", p.alpha);
-      k = this.createElement("foreignObject");
-      k.setAttribute("pointer-events", "all");
-      q = this.createDiv(e, f, g, q, l);
-      if (null != q) {
-        h.appendChild(k);
-        this.root.appendChild(h);
-        var s = 0;
-        if (mxClient.IS_IE && !mxClient.IS_SVG) {
-          var r = document.createElement("div");
-          r.style.cssText = q.getAttribute("style");
-          r.style.display = mxClient.IS_QUIRKS ? "inline" : "inline-block";
-          r.style.visibility = "hidden";
-          r.innerHTML = mxUtils.isNode(e) ? e.outerHTML : e;
-          document.body.appendChild(r);
-          s = r.offsetWidth;
-          d = mxClient.IS_QUIRKS && 0 < d && m ? Math.min(d, r.offsetHeight + 2) : r.offsetHeight;
-          r.parentNode.removeChild(r);
-          k.appendChild(q)
-        } else this.root.ownerDocument != document ? (q.style.visibility = "hidden", document.body.appendChild(q), s = q.offsetWidth, d = q.offsetHeight, k.appendChild(q), q.style.visibility = "") :
-          (k.appendChild(q), s = q.offsetWidth, d = q.offsetHeight);
-        c = l ? Math.max(c, s) : s;
-        1 > p.alpha && h.setAttribute("opacity", p.alpha);
-        l = e = 0;
-        f == mxConstants.ALIGN_CENTER ? e -= c / 2 : f == mxConstants.ALIGN_RIGHT && (e -= c);
-        a += e;
-        g == mxConstants.ALIGN_MIDDLE ?
-          l -= d / 2 : g == mxConstants.ALIGN_BOTTOM && (l -= d);
-        b += l;
-        f = 1 != p.scale ? "scale(" + p.scale + ")" : "";
-        0 != p.rotation && this.rotateHtml ? (f += "rotate(" + p.rotation + "," + c / 2 + "," + d / 2 + ")", b = this.rotatePoint((a + c / 2) * p.scale, (b + d / 2) * p.scale, p.rotation, p.rotationCx,
-          p.rotationCy), a = b.x - c * p.scale / 2, b = b.y - d * p.scale / 2) : (a *= p.scale, b *= p.scale);
-        0 != n && (f += "rotate(" + n + "," + -e + "," + -l + ")");
-        h.setAttribute("transform", "translate(" + Math.round(a) + "," + Math.round(b) + ")" + f);
-        k.setAttribute("width", Math.round(Math.max(1, c)));
-        k.setAttribute("height",
-          Math.round(Math.max(1, d)))
-      }
-    } else this.plainText(a, b, c, d, e, f, g, h, l, m, n)
-  }
-};
-mxSvgCanvas2D.prototype.createClip = function(a, b, c, d) {
-  a = Math.round(a);
-  b = Math.round(b);
-  c = Math.round(c);
-  d = Math.round(d);
-  for (var e = "mx-clip-" + a + "-" + b + "-" + c + "-" + d, f = 0, g = e + "-" + f; null != document.getElementById(g);) g = e + "-" + ++f;
-  clip = this.createElement("clipPath");
-  clip.setAttribute("id", g);
-  e = this.createElement("rect");
-  e.setAttribute("x", a);
-  e.setAttribute("y", b);
-  e.setAttribute("width", c);
-  e.setAttribute("height", d);
-  clip.appendChild(e);
-  return clip
-};
-mxSvgCanvas2D.prototype.plainText = function(a, b, c, d, e, f, g, h, k, l, m) {
-  m = null != m ? m : 0;
-  h = this.state;
-  var n = Math.round(h.fontSize),
-    p = this.createElement("g"),
-    q = h.transform || "";
-  0 != m && (q += "rotate(" + m + "," + this.format(a * h.scale) + "," + this.format(b * h.scale) + ")");
-  if (l && 0 < c && 0 < d) {
-    var s = a;
-    m = b;
-    f == mxConstants.ALIGN_CENTER ? s -= c / 2 : f == mxConstants.ALIGN_RIGHT && (s -= c);
-    g == mxConstants.ALIGN_MIDDLE ? m -= d / 2 : g == mxConstants.ALIGN_BOTTOM && (m -= d);
-    m = this.createClip(s * h.scale - 2, m * h.scale - 2, c * h.scale + 4, d * h.scale + 4);
-    null != this.defs ? this.defs.appendChild(m) :
-      this.root.appendChild(m);
-    p.setAttribute("clip-path", "url(#" + m.getAttribute("id") + ")")
-  }
-  this.updateFont(p, f);
-  m = f == mxConstants.ALIGN_RIGHT ? "end" : f == mxConstants.ALIGN_CENTER ? "middle" : "start";
-  "start" != m && p.setAttribute("text-anchor", m);
-  (!this.styleEnabled || n != mxConstants.DEFAULT_FONTSIZE) && p.setAttribute("font-size", Math.round(n * h.scale) + "px");
-  0 < q.length && p.setAttribute("transform", q);
-  1 > h.alpha && p.setAttribute("opacity", h.alpha);
-  var q = e.split("\n"),
-    s = Math.round(n * mxConstants.LINE_HEIGHT),
-    r = n + (q.length -
-      1) * s;
-  m = b + n - 1;
-  g == mxConstants.ALIGN_MIDDLE ? (d = (this.matchHtmlAlignment && l && 0 < d ? Math.min(r, d) : r) / 2, m -= d + 1) : g == mxConstants.ALIGN_BOTTOM && (d = this.matchHtmlAlignment && l && 0 < d ?
-    Math.min(r, d) : r, m -= d + 2);
-  for (d = 0; d < q.length; d++) 0 < q[d].length && 0 < mxUtils.trim(q[d]).length && (l = this.createElement("text"), l.setAttribute("x", this.format(a * h.scale)), l.setAttribute("y", this.format(
-    m * h.scale)), mxUtils.write(l, q[d]), p.appendChild(l)), m += s;
-  this.root.appendChild(p);
-  this.addTextBackground(p, e, a, b, c, r, f, g, k)
-};
-mxSvgCanvas2D.prototype.updateFont = function(a) {
-  var b = this.state;
-  a.setAttribute("fill", b.fontColor);
-  (!this.styleEnabled || b.fontFamily != mxConstants.DEFAULT_FONTFAMILY) && a.setAttribute("font-family", b.fontFamily);
-  (b.fontStyle & mxConstants.FONT_BOLD) == mxConstants.FONT_BOLD && a.setAttribute("font-weight", "bold");
-  (b.fontStyle & mxConstants.FONT_ITALIC) == mxConstants.FONT_ITALIC && a.setAttribute("font-style", "italic");
-  (b.fontStyle & mxConstants.FONT_UNDERLINE) == mxConstants.FONT_UNDERLINE && a.setAttribute("text-decoration",
-    "underline")
-};
-mxSvgCanvas2D.prototype.addTextBackground = function(a, b, c, d, e, f, g, h, k) {
-  var l = this.state;
-  if (null != l.fontBackgroundColor || null != l.fontBorderColor) {
-    var m = null;
-    k ? (g == mxConstants.ALIGN_CENTER ? c -= e / 2 : g == mxConstants.ALIGN_RIGHT && (c -= e), h == mxConstants.ALIGN_MIDDLE ? d -= f / 2 : h == mxConstants.ALIGN_BOTTOM && (d -= f), m = new mxRectangle(
-      (c + 1) * l.scale, d * l.scale, (e - 2) * l.scale, (f + 2) * l.scale)) : null != a.getBBox && this.root.ownerDocument == document ? (m = a.getBBox(), b = mxClient.IS_IE && mxClient.IS_SVG,
-      m = new mxRectangle(m.x, m.y + (b ? 0 :
-        1), m.width, m.height + (b ? 1 : 0))) : (m = document.createElement("div"), m.style.lineHeight = Math.round(l.fontSize * mxConstants.LINE_HEIGHT) + "px", m.style.fontSize = Math.round(l.fontSize) +
-      "px", m.style.fontFamily = l.fontFamily, m.style.whiteSpace = "nowrap", m.style.position = "absolute", m.style.visibility = "hidden", m.style.display = mxClient.IS_QUIRKS ? "inline" :
-      "inline-block", m.style.zoom = "1", (l.fontStyle & mxConstants.FONT_BOLD) == mxConstants.FONT_BOLD && (m.style.fontWeight = "bold"), (l.fontStyle & mxConstants.FONT_ITALIC) == mxConstants.FONT_ITALIC &&
-      (m.style.fontStyle = "italic"), b = mxUtils.htmlEntities(b, !1), m.innerHTML = b.replace(/\n/g, "\x3cbr/\x3e"), document.body.appendChild(m), e = m.offsetWidth, f = m.offsetHeight, m.parentNode
-      .removeChild(m), g == mxConstants.ALIGN_CENTER ? c -= e / 2 : g == mxConstants.ALIGN_RIGHT && (c -= e), h == mxConstants.ALIGN_MIDDLE ? d -= f / 2 : h == mxConstants.ALIGN_BOTTOM && (d -= f),
-      m = new mxRectangle((c + 1) * l.scale, (d + 2) * l.scale, e * l.scale, (f + 1) * l.scale));
-    null != m && (b = this.createElement("rect"), b.setAttribute("fill", l.fontBackgroundColor || "none"), b.setAttribute("stroke",
-      l.fontBorderColor || "none"), b.setAttribute("x", Math.floor(m.x - 1)), b.setAttribute("y", Math.floor(m.y - 1)), b.setAttribute("width", Math.ceil(m.width + 2)), b.setAttribute("height",
-      Math.ceil(m.height)), l = null != l.fontBorderColor ? Math.max(1, this.format(l.scale)) : 0, b.setAttribute("stroke-width", l), this.root.ownerDocument == document && 1 == mxUtils.mod(l,
-      2) && b.setAttribute("transform", "translate(0.5, 0.5)"), a.insertBefore(b, a.firstChild))
-  }
-};
-mxSvgCanvas2D.prototype.stroke = function() {
-  this.addNode(!1, !0)
-};
-mxSvgCanvas2D.prototype.fill = function() {
-  this.addNode(!0, !1)
-};
-mxSvgCanvas2D.prototype.fillAndStroke = function() {
-  this.addNode(!0, !0)
-};
-var mxVmlCanvas2D = function(a) {
-  mxAbstractCanvas2D.call(this);
-  this.root = a
-};
-mxUtils.extend(mxVmlCanvas2D, mxAbstractCanvas2D);
-mxVmlCanvas2D.prototype.node = null;
-mxVmlCanvas2D.prototype.textEnabled = !0;
-mxVmlCanvas2D.prototype.moveOp = "m";
-mxVmlCanvas2D.prototype.lineOp = "l";
-mxVmlCanvas2D.prototype.curveOp = "c";
-mxVmlCanvas2D.prototype.closeOp = "x";
-mxVmlCanvas2D.prototype.rotatedHtmlBackground = "";
-mxVmlCanvas2D.prototype.vmlScale = 1;
-mxVmlCanvas2D.prototype.addNode = function(a, b) {
-  var c = this.node,
-    d = this.state;
-  if (null != c) {
-    if ("shape" == c.nodeName)
-      if (null != this.path && 0 < this.path.length) c.path = this.path.join(" ") + " e", c.style.width = this.root.style.width, c.style.height = this.root.style.height, c.coordsize = parseInt(c.style
-        .width) + " " + parseInt(c.style.height);
-      else return;
-    c.strokeweight = this.format(Math.max(1, d.strokeWidth * d.scale / this.vmlScale)) + "px";
-    d.shadow && this.root.appendChild(this.createShadow(c, a && null != d.fillColor, b && null != d.strokeColor));
-    b && null != d.strokeColor ? (c.stroked = "true", c.strokecolor = d.strokeColor) : c.stroked = "false";
-    c.appendChild(this.createStroke());
-    a && null != d.fillColor ? c.appendChild(this.createFill()) : this.pointerEvents && ("shape" != c.nodeName || this.path[this.path.length - 1] == this.closeOp) ? c.appendChild(this.createTransparentFill()) :
-      c.filled = "false";
-    this.root.appendChild(c)
-  }
-};
-mxVmlCanvas2D.prototype.createTransparentFill = function() {
-  var a = document.createElement(mxClient.VML_PREFIX + ":fill");
-  a.src = mxClient.imageBasePath + "/transparent.gif";
-  a.type = "tile";
-  return a
-};
-mxVmlCanvas2D.prototype.createFill = function() {
-  var a = this.state,
-    b = document.createElement(mxClient.VML_PREFIX + ":fill");
-  b.color = a.fillColor;
-  if (null != a.gradientColor) {
-    b.type = "gradient";
-    b.method = "none";
-    b.color2 = a.gradientColor;
-    var c = 180 - a.rotation,
-      c = a.gradientDirection == mxConstants.DIRECTION_WEST ? c - (90 + ("x" == this.root.style.flip ? 180 : 0)) : a.gradientDirection == mxConstants.DIRECTION_EAST ? c + (90 + ("x" == this.root.style
-        .flip ? 180 : 0)) : a.gradientDirection == mxConstants.DIRECTION_NORTH ? c - (180 + ("y" == this.root.style.flip ?
-        -180 : 0)) : c + ("y" == this.root.style.flip ? -180 : 0);
-    if ("x" == this.root.style.flip || "y" == this.root.style.flip) c *= -1;
-    b.angle = mxUtils.mod(c, 360);
-    b.opacity = 100 * a.alpha * a.fillAlpha + "%";
-    b.setAttribute(mxClient.OFFICE_PREFIX + ":opacity2", 100 * a.alpha * a.gradientAlpha + "%")
-  } else 1 > a.alpha && (b.opacity = 100 * a.alpha + "%");
-  return b
-};
-mxVmlCanvas2D.prototype.createStroke = function() {
-  var a = this.state,
-    b = document.createElement(mxClient.VML_PREFIX + ":stroke");
-  b.endcap = a.lineCap || "flat";
-  b.joinstyle = a.lineJoin || "miter";
-  b.miterlimit = a.miterLimit || "10";
-  1 > a.alpha && (b.opacity = 100 * a.alpha + "%");
-  a.dashed && (b.dashstyle = this.getVmlDashStyle());
-  return b
-};
-mxVmlCanvas2D.prototype.getVmlDashStyle = function() {
-  var a = "dash";
-  if (null != this.state.dashPattern) {
-    var b = this.state.dashPattern.split(" ");
-    0 < b.length && 1 == b[0] && (a = "0 2")
-  }
-  return a
-};
-mxVmlCanvas2D.prototype.createShadow = function(a, b, c) {
-  var d = this.state,
-    e = -d.rotation * (Math.PI / 180),
-    f = Math.cos(e),
-    e = Math.sin(e),
-    g = d.shadowDx * d.scale,
-    h = d.shadowDy * d.scale;
-  "x" == this.root.style.flip ? g *= -1 : "y" == this.root.style.flip && (h *= -1);
-  var k = a.cloneNode(!0);
-  k.style.marginLeft = Math.round(g * f - h * e) + "px";
-  k.style.marginTop = Math.round(g * e + h * f) + "px";
-  8 == document.documentMode && (k.strokeweight = a.strokeweight, "shape" == a.nodeName && (k.path = this.path.join(" ") + " e", k.style.width = this.root.style.width, k.style.height =
-    this.root.style.height, k.coordsize = parseInt(a.style.width) + " " + parseInt(a.style.height)));
-  c ? (k.strokecolor = d.shadowColor, k.appendChild(this.createShadowStroke())) : k.stroked = "false";
-  b ? k.appendChild(this.createShadowFill()) : k.filled = "false";
-  return k
-};
-mxVmlCanvas2D.prototype.createShadowFill = function() {
-  var a = document.createElement(mxClient.VML_PREFIX + ":fill");
-  a.color = this.state.shadowColor;
-  a.opacity = 100 * this.state.alpha * this.state.shadowAlpha + "%";
-  return a
-};
-mxVmlCanvas2D.prototype.createShadowStroke = function() {
-  var a = this.createStroke();
-  a.opacity = 100 * this.state.alpha * this.state.shadowAlpha + "%";
-  return a
-};
-mxVmlCanvas2D.prototype.rotate = function(a, b, c, d, e) {
-  b && c ? a += 180 : b ? this.root.style.flip = "x" : c && (this.root.style.flip = "y");
-  if (b ? !c : c) a *= -1;
-  this.root.style.rotation = a;
-  this.state.rotation += a;
-  this.state.rotationCx = d;
-  this.state.rotationCy = e
-};
-mxVmlCanvas2D.prototype.begin = function() {
-  mxAbstractCanvas2D.prototype.begin.apply(this, arguments);
-  this.node = document.createElement(mxClient.VML_PREFIX + ":shape");
-  this.node.style.position = "absolute"
-};
-mxVmlCanvas2D.prototype.quadTo = function(a, b, c, d) {
-  var e = this.state,
-    f = (this.lastX + e.dx) * e.scale,
-    g = (this.lastY + e.dy) * e.scale;
-  a = (a + e.dx) * e.scale;
-  b = (b + e.dy) * e.scale;
-  c = (c + e.dx) * e.scale;
-  d = (d + e.dy) * e.scale;
-  var g = g + 2 / 3 * (b - g),
-    h = c + 2 / 3 * (a - c);
-  b = d + 2 / 3 * (b - d);
-  this.path.push("c " + this.format(f + 2 / 3 * (a - f)) + " " + this.format(g) + " " + this.format(h) + " " + this.format(b) + " " + this.format(c) + " " + this.format(d));
-  this.lastX = c / e.scale - e.dx;
-  this.lastY = d / e.scale - e.dy
-};
-mxVmlCanvas2D.prototype.createRect = function(a, b, c, d, e) {
-  var f = this.state;
-  a = document.createElement(a);
-  a.style.position = "absolute";
-  a.style.left = this.format((b + f.dx) * f.scale) + "px";
-  a.style.top = this.format((c + f.dy) * f.scale) + "px";
-  a.style.width = this.format(d * f.scale) + "px";
-  a.style.height = this.format(e * f.scale) + "px";
-  return a
-};
-mxVmlCanvas2D.prototype.rect = function(a, b, c, d) {
-  this.node = this.createRect(mxClient.VML_PREFIX + ":rect", a, b, c, d)
-};
-mxVmlCanvas2D.prototype.roundrect = function(a, b, c, d, e, f) {
-  this.node = this.createRect(mxClient.VML_PREFIX + ":roundrect", a, b, c, d);
-  this.node.setAttribute("arcsize", Math.max(100 * e / c, 100 * f / d) + "%")
-};
-mxVmlCanvas2D.prototype.ellipse = function(a, b, c, d) {
-  this.node = this.createRect(mxClient.VML_PREFIX + ":oval", a, b, c, d)
-};
-mxVmlCanvas2D.prototype.image = function(a, b, c, d, e, f, g, h) {
-  var k = null;
-  f ? (k = this.createRect(mxClient.VML_PREFIX + ":rect", a, b, c, d), k.stroked = "false", a = document.createElement(mxClient.VML_PREFIX + ":fill"), a.aspect = f ? "atmost" : "ignore", a.rotate =
-    "true", a.type = "frame", a.src = e, k.appendChild(a)) : (k = this.createRect(mxClient.VML_PREFIX + ":image", a, b, c, d), k.src = e);
-  g && h ? k.style.rotation = "180" : g ? k.style.flip = "x" : h && (k.style.flip = "y");
-  1 > this.state.alpha && (k.style.filter += "alpha(opacity\x3d" + 100 * this.state.alpha + ")");
-  this.root.appendChild(k)
-};
-mxVmlCanvas2D.prototype.createDiv = function(a, b, c, d) {
-  c = document.createElement("div");
-  var e = this.state,
-    f = "";
-  null != e.fontBackgroundColor && (f += "background-color:" + e.fontBackgroundColor + ";");
-  null != e.fontBorderColor && (f += "border:1px solid " + e.fontBorderColor + ";");
-  mxUtils.isNode(a) ? c.appendChild(a) : 0 < f.length && !d ? (d = document.createElement("div"), d.style.cssText = f, d.style.display = mxClient.IS_QUIRKS ? "inline" : "inline-block", d.style.zoom =
-    "1", d.innerHTML = a, c.appendChild(d)) : (c.style.cssText = f, c.innerHTML = a);
-  a = c.style;
-  a.fontSize = Math.round(e.fontSize / this.vmlScale) + "px";
-  a.fontFamily = e.fontFamily;
-  a.color = e.fontColor;
-  a.verticalAlign = "top";
-  a.textAlign = b || "left";
-  a.lineHeight = Math.round(e.fontSize * mxConstants.LINE_HEIGHT / this.vmlScale) + "px";
-  (e.fontStyle & mxConstants.FONT_BOLD) == mxConstants.FONT_BOLD && (a.fontWeight = "bold");
-  (e.fontStyle & mxConstants.FONT_ITALIC) == mxConstants.FONT_ITALIC && (a.fontStyle = "italic");
-  (e.fontStyle & mxConstants.FONT_UNDERLINE) == mxConstants.FONT_UNDERLINE && (a.fontDecoration = "underline");
-  return c
-};
-mxVmlCanvas2D.prototype.text = function(a, b, c, d, e, f, g, h, k, l, m, n) {
-  if (this.textEnabled && null != e) {
-    var p = this.state;
-    if ("html" == k) {
-      null != p.rotation && (b = this.rotatePoint(a, b, p.rotation, p.rotationCx, p.rotationCy), a = b.x, b = b.y);
-      8 == document.documentMode ? (a += p.dx, b += p.dy) : (a *= p.scale, b *= p.scale);
-      k = 8 == document.documentMode ? document.createElement(mxClient.VML_PREFIX + ":group") : document.createElement("div");
-      k.style.position = "absolute";
-      k.style.display = "inline";
-      k.style.left = this.format(a) + "px";
-      k.style.top = this.format(b) +
-        "px";
-      k.style.zoom = p.scale;
-      var q = document.createElement("div");
-      q.style.position = "relative";
-      q.style.display = "inline";
-      var s = mxUtils.getAlignmentAsPoint(f, g),
-        r = s.x,
-        s = s.y;
-      e = this.createDiv(e, f, g, l);
-      f = document.createElement("div");
-      h ? (!m && 0 < c && (e.style.width = Math.round(c) + "px"), e.style.whiteSpace = "normal") : e.style.whiteSpace = "nowrap";
-      h = p.rotation + (n || 0);
-      this.rotateHtml && 0 != h ? (f.style.display = "inline", f.style.zoom = "1", f.appendChild(e), 8 == document.documentMode && "DIV" != this.root.nodeName ? (q.appendChild(f), k.appendChild(q)) :
-        k.appendChild(f)) : 8 == document.documentMode ? (q.appendChild(e), k.appendChild(q)) : (e.style.display = "inline", k.appendChild(e));
-      "DIV" != this.root.nodeName ? (n = document.createElement(mxClient.VML_PREFIX + ":rect"), n.stroked = "false", n.filled = "false", n.appendChild(k), this.root.appendChild(n)) : this.root.appendChild(
-        k);
-      m ? (e.style.overflow = "hidden", 0 < c && (e.style.width = Math.round(c) + "px"), 0 < d && 8 == document.documentMode && (e.style.maxHeight = Math.round(d) + "px")) : l && (e.style.width = c +
-        "px", 0 < d && (e.style.maxHeight = Math.round(d) +
-          "px"));
-      if (this.rotateHtml && 0 != h) {
-        c = h * (Math.PI / 180);
-        h = parseFloat(parseFloat(Math.cos(c)).toFixed(8));
-        n = parseFloat(parseFloat(Math.sin(-c)).toFixed(8));
-        c %= 2 * Math.PI;
-        0 > c && (c += 2 * Math.PI);
-        c %= Math.PI;
-        c > Math.PI / 2 && (c = Math.PI - c);
-        g = Math.cos(c);
-        var t = Math.sin(c);
-        8 == document.documentMode && (e.style.display = "inline-block", f.style.display = "inline-block", q.style.display = "inline-block");
-        e.style.visibility = "hidden";
-        document.body.appendChild(e);
-        c = e.offsetWidth;
-        q = e.offsetHeight;
-        if (mxClient.IS_QUIRKS && (m || l) && q > d) q =
-          d, e.style.height = q + "px";
-        d = q;
-        m = (d - d * g + c * -t) / 2 - n * c * (r + 0.5) + h * d * (s + 0.5);
-        l = (c - c * g + d * -t) / 2 + h * c * (r + 0.5) + n * d * (s + 0.5);
-        "group" == k.nodeName && "DIV" == this.root.nodeName ? (r = document.createElement("div"), r.style.display = "inline-block", r.style.position = "absolute", r.style.left = this.format(a + (l -
-          c / 2) * p.scale) + "px", r.style.top = this.format(b + (m - d / 2) * p.scale) + "px", k.parentNode.appendChild(r), r.appendChild(k)) : (p = 8 == document.documentMode ? 1 : p.scale, k.style
-          .left = this.format(a + (l - c / 2) * p) + "px", k.style.top = this.format(b + (m -
-            d / 2) * p) + "px");
-        f.style.filter = "progid:DXImageTransform.Microsoft.Matrix(M11\x3d" + h + ", M12\x3d" + n + ", M21\x3d" + -n + ", M22\x3d" + h + ", sizingMethod\x3d'auto expand')";
-        f.style.backgroundColor = this.rotatedHtmlBackground;
-        1 > this.state.alpha && (f.style.filter += "alpha(opacity\x3d" + 100 * this.state.alpha + ")");
-        e.style.visibility = "";
-        f.appendChild(e)
-      } else 8 != document.documentMode ? (e.style.verticalAlign = "top", 1 > this.state.alpha && (k.style.filter = "alpha(opacity\x3d" + 100 * this.state.alpha + ")"), p = e.parentNode, e.style.visibility =
-        "hidden", document.body.appendChild(e), c = e.offsetWidth, q = e.offsetHeight, mxClient.IS_QUIRKS && (m && q > d) && (q = d, e.style.height = q + "px"), d = q, e.style.visibility = "", p.appendChild(
-          e), k.style.left = this.format(a + c * r * this.state.scale) + "px", k.style.top = this.format(b + d * s * this.state.scale) + "px") : (1 > this.state.alpha && (e.style.filter =
-        "alpha(opacity\x3d" + 100 * this.state.alpha + ")"), q.style.left = 100 * r + "%", q.style.top = 100 * s + "%")
-    } else this.plainText(a, b, c, d, mxUtils.htmlEntities(e, !1), f, g, h, k, l, m, n)
-  }
-};
-mxVmlCanvas2D.prototype.plainText = function(a, b, c, d, e, f, g, h, k, l, m, n) {
-  d = this.state;
-  a = (a + d.dx) * d.scale;
-  b = (b + d.dy) * d.scale;
-  c = document.createElement(mxClient.VML_PREFIX + ":shape");
-  c.style.width = "1px";
-  c.style.height = "1px";
-  c.stroked = "false";
-  l = document.createElement(mxClient.VML_PREFIX + ":fill");
-  l.color = d.fontColor;
-  l.opacity = 100 * d.alpha + "%";
-  c.appendChild(l);
-  l = document.createElement(mxClient.VML_PREFIX + ":path");
-  l.textpathok = "true";
-  l.v = "m " + this.format(0) + " " + this.format(0) + " l " + this.format(1) + " " + this.format(0);
-  c.appendChild(l);
-  l = document.createElement(mxClient.VML_PREFIX + ":textpath");
-  l.style.cssText = "v-text-align:" + f;
-  l.style.align = f;
-  l.style.fontFamily = d.fontFamily;
-  l.string = e;
-  l.on = "true";
-  f = Math.round(d.fontSize * d.scale / this.vmlScale);
-  l.style.fontSize = f + "px";
-  (d.fontStyle & mxConstants.FONT_BOLD) == mxConstants.FONT_BOLD && (l.style.fontWeight = "bold");
-  (d.fontStyle & mxConstants.FONT_ITALIC) == mxConstants.FONT_ITALIC && (l.style.fontStyle = "italic");
-  (d.fontStyle & mxConstants.FONT_UNDERLINE) == mxConstants.FONT_UNDERLINE &&
-    (l.style.textDecoration = "underline");
-  e = e.split("\n");
-  d = f + (e.length - 1) * f * mxConstants.LINE_HEIGHT;
-  f = e = 0;
-  g == mxConstants.ALIGN_BOTTOM ? f = -d / 2 : g != mxConstants.ALIGN_MIDDLE && (f = d / 2);
-  null != n && (c.style.rotation = n, g = n * (Math.PI / 180), e = Math.sin(g) * f, f *= Math.cos(g));
-  c.appendChild(l);
-  c.style.left = this.format(a - e) + "px";
-  c.style.top = this.format(b + f) + "px";
-  this.root.appendChild(c)
-};
-mxVmlCanvas2D.prototype.stroke = function() {
-  this.addNode(!1, !0)
-};
-mxVmlCanvas2D.prototype.fill = function() {
-  this.addNode(!0, !1)
-};
-mxVmlCanvas2D.prototype.fillAndStroke = function() {
-  this.addNode(!0, !0)
-};
-
-function mxGuide(a, b) {
-  this.graph = a;
-  this.setStates(b)
-}
-mxGuide.prototype.graph = null;
-mxGuide.prototype.states = null;
-mxGuide.prototype.horizontal = !0;
-mxGuide.prototype.vertical = !0;
-mxGuide.prototype.guideX = null;
-mxGuide.prototype.guideY = null;
-mxGuide.prototype.setStates = function(a) {
-  this.states = a
-};
-mxGuide.prototype.isEnabledForEvent = function(a) {
-  return !0
-};
-mxGuide.prototype.getGuideTolerance = function() {
-  return this.graph.gridSize * this.graph.view.scale / 2
-};
-mxGuide.prototype.createGuideShape = function(a) {
-  a = new mxPolyline([], mxConstants.GUIDE_COLOR, mxConstants.GUIDE_STROKEWIDTH);
-  a.isDashed = !0;
-  return a
-};
-mxGuide.prototype.move = function(a, b, c) {
-  if (null != this.states && (this.horizontal || this.vertical) && null != a && null != b) {
-    var d = this.graph.getView().translate,
-      e = this.graph.getView().scale,
-      f = b.x,
-      g = b.y,
-      h = !1,
-      k = !1,
-      l = this.getGuideTolerance(),
-      m = l,
-      n = l,
-      l = a.clone();
-    l.x += b.x;
-    l.y += b.y;
-    var p = l.x,
-      q = l.x + l.width,
-      s = l.getCenterX(),
-      r = l.y,
-      t = l.y + l.height,
-      v = l.getCenterY();
-    b = function(b) {
-      b += this.graph.panDx;
-      var c = !1;
-      Math.abs(b - s) < m ? (f = b - a.getCenterX(), m = Math.abs(b - s), c = !0) : Math.abs(b - p) < m ? (f = b - a.x, m = Math.abs(b - p), c = !0) : Math.abs(b -
-        q) < m && (f = b - a.x - a.width, m = Math.abs(b - q), c = !0);
-      if (c) {
-        null == this.guideX && (this.guideX = this.createGuideShape(!0), this.guideX.dialect = this.graph.dialect != mxConstants.DIALECT_SVG ? mxConstants.DIALECT_VML : mxConstants.DIALECT_SVG,
-          this.guideX.pointerEvents = !1, this.guideX.init(this.graph.getView().getOverlayPane()));
-        var d = this.graph.container;
-        b -= this.graph.panDx;
-        this.guideX.points = [new mxPoint(b, -this.graph.panDy), new mxPoint(b, d.scrollHeight - 3 - this.graph.panDy)]
-      }
-      h = h || c
-    };
-    for (var l = function(b) {
-        b += this.graph.panDy;
-        var c = !1;
-        Math.abs(b - v) < n ? (g = b - a.getCenterY(), n = Math.abs(b - v), c = !0) : Math.abs(b - r) < n ? (g = b - a.y, n = Math.abs(b - r), c = !0) : Math.abs(b - t) < n && (g = b - a.y - a.height,
-          n = Math.abs(b - t), c = !0);
-        if (c) {
-          null == this.guideY && (this.guideY = this.createGuideShape(!1), this.guideY.dialect = this.graph.dialect != mxConstants.DIALECT_SVG ? mxConstants.DIALECT_VML : mxConstants.DIALECT_SVG,
-            this.guideY.pointerEvents = !1, this.guideY.init(this.graph.getView().getOverlayPane()));
-          var d = this.graph.container;
-          b -= this.graph.panDy;
-          this.guideY.points = [new mxPoint(-this.graph.panDx,
-            b), new mxPoint(d.scrollWidth - 3 - this.graph.panDx, b)]
-        }
-        k = k || c
-      }, w = 0; w < this.states.length; w++) {
-      var u = this.states[w];
-      null != u && (this.horizontal && (b.call(this, u.getCenterX()), b.call(this, u.x), b.call(this, u.x + u.width)), this.vertical && (l.call(this, u.getCenterY()), l.call(this, u.y), l.call(this,
-        u.y + u.height)))
-    }!h && null != this.guideX ? this.guideX.node.style.visibility = "hidden" : null != this.guideX && (this.guideX.node.style.visibility = "visible", this.guideX.redraw());
-    !k && null != this.guideY ? this.guideY.node.style.visibility =
-      "hidden" : null != this.guideY && (this.guideY.node.style.visibility = "visible", this.guideY.redraw());
-    c && (h || (c = a.x - (this.graph.snap(a.x / e - d.x) + d.x) * e, f = this.graph.snap(f / e) * e - c), k || (d = a.y - (this.graph.snap(a.y / e - d.y) + d.y) * e, g = this.graph.snap(g / e) * e -
-      d));
-    b = new mxPoint(f, g)
-  }
-  return b
-};
-mxGuide.prototype.hide = function() {
-  null != this.guideX && (this.guideX.node.style.visibility = "hidden");
-  null != this.guideY && (this.guideY.node.style.visibility = "hidden")
-};
-mxGuide.prototype.destroy = function() {
-  null != this.guideX && (this.guideX.destroy(), this.guideX = null);
-  null != this.guideY && (this.guideY.destroy(), this.guideY = null)
-};
-
-function mxStencil(a) {
-  this.desc = a;
-  this.parseDescription();
-  this.parseConstraints()
-}
-mxStencil.defaultLocalized = !1;
-mxStencil.prototype.desc = null;
-mxStencil.prototype.constraints = null;
-mxStencil.prototype.aspect = null;
-mxStencil.prototype.w0 = null;
-mxStencil.prototype.h0 = null;
-mxStencil.prototype.bgNode = null;
-mxStencil.prototype.fgNode = null;
-mxStencil.prototype.strokewidth = null;
-mxStencil.prototype.parseDescription = function() {
-  this.fgNode = this.desc.getElementsByTagName("foreground")[0];
-  this.bgNode = this.desc.getElementsByTagName("background")[0];
-  this.w0 = Number(this.desc.getAttribute("w") || 100);
-  this.h0 = Number(this.desc.getAttribute("h") || 100);
-  var a = this.desc.getAttribute("aspect");
-  this.aspect = null != a ? a : "variable";
-  a = this.desc.getAttribute("strokewidth");
-  this.strokewidth = null != a ? a : "1"
-};
-mxStencil.prototype.parseConstraints = function() {
-  var a = this.desc.getElementsByTagName("connections")[0];
-  if (null != a && (a = mxUtils.getChildNodes(a), null != a && 0 < a.length)) {
-    this.constraints = [];
-    for (var b = 0; b < a.length; b++) this.constraints.push(this.parseConstraint(a[b]))
-  }
-};
-mxStencil.prototype.parseConstraint = function(a) {
-  var b = Number(a.getAttribute("x")),
-    c = Number(a.getAttribute("y"));
-  a = "1" == a.getAttribute("perimeter");
-  return new mxConnectionConstraint(new mxPoint(b, c), a)
-};
-mxStencil.prototype.evaluateTextAttribute = function(a, b, c) {
-  b = this.evaluateAttribute(a, b, c);
-  a = a.getAttribute("localized");
-  if (mxStencil.defaultLocalized && null == a || "1" == a) b = mxResources.get(b);
-  return b
-};
-mxStencil.prototype.evaluateAttribute = function(a, b, c) {
-  b = a.getAttribute(b);
-  null == b && (a = mxUtils.getTextContent(a), null != a && (a = mxUtils.eval(a), "function" == typeof a && (b = a(c))));
-  return b
-};
-mxStencil.prototype.drawShape = function(a, b, c, d, e, f) {
-  this.drawChildren(a, b, c, d, e, f, this.bgNode, !1);
-  this.drawChildren(a, b, c, d, e, f, this.fgNode, !0)
-};
-mxStencil.prototype.drawChildren = function(a, b, c, d, e, f, g, h) {
-  if (null != g) {
-    var k = mxUtils.getValue(b.style, mxConstants.STYLE_DIRECTION, null);
-    c = this.computeAspect(b.style, c, d, e, f, k);
-    d = Math.min(c.width, c.height);
-    d = "inherit" == this.strokewidth ? Number(mxUtils.getNumber(b.style, mxConstants.STYLE_STROKEWIDTH, 1)) : Number(this.strokewidth) * d;
-    a.setStrokeWidth(d);
-    for (g = g.firstChild; null != g;) g.nodeType == mxConstants.NODETYPE_ELEMENT && this.drawNode(a, b, g, c, h), g = g.nextSibling
-  }
-};
-mxStencil.prototype.computeAspect = function(a, b, c, d, e, f) {
-  a = b;
-  b = d / this.w0;
-  var g = e / this.h0;
-  if (f = "north" == f || "south" == f) {
-    g = d / this.h0;
-    b = e / this.w0;
-    var h = (d - e) / 2;
-    a += h;
-    c -= h
-  }
-  "fixed" == this.aspect && (b = g = Math.min(b, g), f ? (a += (e - this.w0 * b) / 2, c += (d - this.h0 * g) / 2) : (a += (d - this.w0 * b) / 2, c += (e - this.h0 * g) / 2));
-  return new mxRectangle(a, c, b, g)
-};
-mxStencil.prototype.drawNode = function(a, b, c, d, e) {
-  var f = c.nodeName,
-    g = d.x,
-    h = d.y,
-    k = d.width,
-    l = d.height,
-    m = Math.min(k, l);
-  if ("save" == f) a.save();
-  else if ("restore" == f) a.restore();
-  else if ("path" == f) {
-    a.begin();
-    for (c = c.firstChild; null != c;) c.nodeType == mxConstants.NODETYPE_ELEMENT && this.drawNode(a, b, c, d, e), c = c.nextSibling
-  } else if ("close" == f) a.close();
-  else if ("move" == f) a.moveTo(g + Number(c.getAttribute("x")) * k, h + Number(c.getAttribute("y")) * l);
-  else if ("line" == f) a.lineTo(g + Number(c.getAttribute("x")) * k, h + Number(c.getAttribute("y")) *
-    l);
-  else if ("quad" == f) a.quadTo(g + Number(c.getAttribute("x1")) * k, h + Number(c.getAttribute("y1")) * l, g + Number(c.getAttribute("x2")) * k, h + Number(c.getAttribute("y2")) * l);
-  else if ("curve" == f) a.curveTo(g + Number(c.getAttribute("x1")) * k, h + Number(c.getAttribute("y1")) * l, g + Number(c.getAttribute("x2")) * k, h + Number(c.getAttribute("y2")) * l, g + Number(
-    c.getAttribute("x3")) * k, h + Number(c.getAttribute("y3")) * l);
-  else if ("arc" == f) a.arcTo(Number(c.getAttribute("rx")) * k, Number(c.getAttribute("ry")) * l, Number(c.getAttribute("x-axis-rotation")),
-    Number(c.getAttribute("large-arc-flag")), Number(c.getAttribute("sweep-flag")), g + Number(c.getAttribute("x")) * k, h + Number(c.getAttribute("y")) * l);
-  else if ("rect" == f) a.rect(g + Number(c.getAttribute("x")) * k, h + Number(c.getAttribute("y")) * l, Number(c.getAttribute("w")) * k, Number(c.getAttribute("h")) * l);
-  else if ("roundrect" == f) b = c.getAttribute("arcsize"), 0 == b && (b = 100 * mxConstants.RECTANGLE_ROUNDING_FACTOR), m = Number(c.getAttribute("w")) * k, d = Number(c.getAttribute("h")) * l, b =
-    Number(b) / 100, b = Math.min(m * b, d * b), a.roundrect(g +
-      Number(c.getAttribute("x")) * k, h + Number(c.getAttribute("y")) * l, m, d, b, b);
-  else if ("ellipse" == f) a.ellipse(g + Number(c.getAttribute("x")) * k, h + Number(c.getAttribute("y")) * l, Number(c.getAttribute("w")) * k, Number(c.getAttribute("h")) * l);
-  else if ("image" == f) b = this.evaluateAttribute(c, "src", b), a.image(g + Number(c.getAttribute("x")) * k, h + Number(c.getAttribute("y")) * l, Number(c.getAttribute("w")) * k, Number(c.getAttribute(
-    "h")) * l, b, !1, "1" == c.getAttribute("flipH"), "1" == c.getAttribute("flipV"));
-  else if ("text" == f) {
-    m = this.evaluateTextAttribute(c,
-      "str", b);
-    d = "1" == c.getAttribute("vertical") ? -90 : 0;
-    if ("0" == c.getAttribute("align-shape")) {
-      var n = b.rotation,
-        p = 1 == mxUtils.getValue(b.style, mxConstants.STYLE_FLIPH, 0);
-      b = 1 == mxUtils.getValue(b.style, mxConstants.STYLE_FLIPV, 0);
-      d = p && b ? d - n : p || b ? d + n : d - n
-    }
-    d -= c.getAttribute("rotation");
-    a.text(g + Number(c.getAttribute("x")) * k, h + Number(c.getAttribute("y")) * l, 0, 0, m, c.getAttribute("align") || "left", c.getAttribute("valign") || "top", !1, "", !1, !1, d)
-  } else if ("include-shape" == f) n = mxStencilRegistry.getStencil(c.getAttribute("name")),
-    null != n && (g += Number(c.getAttribute("x")) * k, h += Number(c.getAttribute("y")) * l, m = Number(c.getAttribute("w")) * k, d = Number(c.getAttribute("h")) * l, n.drawShape(a, b, g, h, m, d));
-  else if ("fillstroke" == f) a.fillAndStroke();
-  else if ("fill" == f) a.fill();
-  else if ("stroke" == f) a.stroke();
-  else if ("strokewidth" == f) a.setStrokeWidth(Number(c.getAttribute("width")) * m);
-  else if ("dashed" == f) a.setDashed("1" == c.getAttribute("dashed"));
-  else if ("dashpattern" == f) {
-    if (c = c.getAttribute("pattern"), null != c) {
-      c = c.split(" ");
-      k = [];
-      for (l = 0; l <
-        c.length; l++) 0 < c[l].length && k.push(Number(c[l]) * m);
-      c = k.join(" ");
-      a.setDashPattern(c)
-    }
-  } else "strokecolor" == f ? a.setStrokeColor(c.getAttribute("color")) : "linecap" == f ? a.setLineCap(c.getAttribute("cap")) : "linejoin" == f ? a.setLineJoin(c.getAttribute("join")) :
-    "miterlimit" == f ? a.setMiterLimit(Number(c.getAttribute("limit"))) : "fillcolor" == f ? a.setFillColor(c.getAttribute("color")) : "alpha" == f ? a.setAlpha(c.getAttribute("alpha")) :
-    "fontcolor" == f ? a.setFontColor(c.getAttribute("color")) : "fontstyle" == f ? a.setFontStyle(c.getAttribute("style")) :
-    "fontfamily" == f ? a.setFontFamily(c.getAttribute("family")) : "fontsize" == f && a.setFontSize(Number(c.getAttribute("size")) * m);
-  e && ("fillstroke" == f || "fill" == f || "stroke" == f) && a.setShadow(!1)
-};
-
-function mxShape(a) {
-  this.stencil = a;
-  this.strokewidth = 1;
-  this.rotation = 0;
-  this.opacity = 100;
-  this.flipV = this.flipH = !1
-}
-mxShape.prototype.dialect = null;
-mxShape.prototype.scale = 1;
-mxShape.prototype.bounds = null;
-mxShape.prototype.points = null;
-mxShape.prototype.node = null;
-mxShape.prototype.style = null;
-mxShape.prototype.style = null;
-mxShape.prototype.boundingBox = null;
-mxShape.prototype.stencil = null;
-mxShape.prototype.svgStrokeTolerance = 6;
-mxShape.prototype.pointerEvents = !0;
-mxShape.prototype.stencilPointerEvents = !1;
-mxShape.prototype.vmlScale = 1;
-mxShape.prototype.init = function(a) {
-  null == this.node && (this.node = this.create(a), null != a && a.appendChild(this.node))
-};
-mxShape.prototype.isParseVml = function() {
-  return !0
-};
-mxShape.prototype.isHtmlAllowed = function() {
-  return !1
-};
-mxShape.prototype.getSvgScreenOffset = function() {
-  return 1 == mxUtils.mod(Math.max(1, Math.round(this.strokewidth * this.scale)), 2) ? 0.5 : 0
-};
-mxShape.prototype.create = function(a) {
-  var b = null;
-  return b = null != a.ownerSVGElement ? this.createSvg(a) : 8 == document.documentMode || this.dialect == mxConstants.DIALECT_SVG || this.dialect != mxConstants.DIALECT_VML && this.isHtmlAllowed() ?
-    this.createHtml(a) : this.createVml(a)
-};
-mxShape.prototype.createSvg = function() {
-  return document.createElementNS(mxConstants.NS_SVG, "g")
-};
-mxShape.prototype.createVml = function() {
-  var a = document.createElement(mxClient.VML_PREFIX + ":group");
-  a.style.position = "absolute";
-  return a
-};
-mxShape.prototype.createHtml = function() {
-  var a = document.createElement("div");
-  a.style.position = "absolute";
-  return a
-};
-mxShape.prototype.reconfigure = function() {
-  this.redraw()
-};
-mxShape.prototype.redraw = function() {
-  this.updateBoundsFromPoints();
-  this.checkBounds() ? (this.node.style.visibility = "", "DIV" == this.node.nodeName && this.isHtmlAllowed() ? this.redrawHtmlShape() : this.redrawShape(), this.updateBoundingBox()) : (this.node.style
-    .visibility = "hidden", this.boundingBox = null)
-};
-mxShape.prototype.updateBoundsFromPoints = function() {
-  var a = this.points;
-  if (null != a && 0 < a.length && null != a[0]) {
-    this.bounds = new mxRectangle(Number(a[0].x), Number(a[0].y), 1, 1);
-    for (var b = 1; b < this.points.length; b++) null != a[b] && this.bounds.add(new mxRectangle(Number(a[b].x), Number(a[b].y), 1, 1))
-  }
-};
-mxShape.prototype.checkBounds = function() {
-  return null != this.bounds && !isNaN(this.bounds.x) && !isNaN(this.bounds.y) && !isNaN(this.bounds.width) && !isNaN(this.bounds.height) && 0 < this.bounds.width && 0 < this.bounds.height
-};
-mxShape.prototype.createVmlGroup = function() {
-  var a = document.createElement(mxClient.VML_PREFIX + ":group");
-  a.style.position = "absolute";
-  a.style.width = this.node.style.width;
-  a.style.height = this.node.style.height;
-  return a
-};
-mxShape.prototype.redrawShape = function() {
-  var a = this.createCanvas();
-  for (a.pointerEvents = this.pointerEvents; this.node.hasChildNodes();) this.node.removeChild(this.node.lastChild);
-  this.paint(a);
-  this.node != a.root && this.node.insertAdjacentHTML("beforeend", a.root.outerHTML);
-  "DIV" == this.node.nodeName && 8 == document.documentMode && (this.node.style.filter = "", (null == this.stencil || !this.stencilPointerEvents) && mxUtils.addTransparentBackgroundFilter(this.node));
-  this.destroyCanvas(a)
-};
-mxShape.prototype.createCanvas = function() {
-  var a = null,
-    b = null;
-  if (null != this.node.ownerSVGElement) a = new mxSvgCanvas2D(this.node, !1), a.strokeTolerance = this.svgStrokeTolerance, a.blockImagePointerEvents = mxClient.IS_NS && !mxClient.IS_SF && !
-    mxClient.IS_GC, b = this.getSvgScreenOffset(), 0 != b ? this.node.setAttribute("transform", "translate(" + b + "," + b + ")") : this.node.removeAttribute("transform");
-  else {
-    this.updateVmlContainer();
-    var c = Math.max(1, Math.round(this.bounds.width)),
-      d = Math.max(1, Math.round(this.bounds.height)),
-      b = 8 == document.documentMode && this.isParseVml() ? this.createVmlGroup() : this.node,
-      a = new mxVmlCanvas2D(b, !1);
-    "" != b.tagUrn && (b.coordsize = c * this.vmlScale + "," + d * this.vmlScale, a.scale(this.vmlScale), a.vmlScale = this.vmlScale);
-    b = this.scale;
-    a.translate(-Math.round(this.bounds.x / b), -Math.round(this.bounds.y / b))
-  }
-  return a
-};
-mxShape.prototype.updateVmlContainer = function() {
-  this.node.style.left = Math.round(this.bounds.x) + "px";
-  this.node.style.top = Math.round(this.bounds.y) + "px";
-  var a = Math.max(1, Math.round(this.bounds.width)),
-    b = Math.max(1, Math.round(this.bounds.height));
-  this.node.style.width = a + "px";
-  this.node.style.height = b + "px";
-  this.node.style.overflow = "visible"
-};
-mxShape.prototype.destroyCanvas = function(a) {
-  if (a instanceof mxSvgCanvas2D) {
-    for (var b in a.gradients) {
-      var c = a.gradients[b];
-      c.mxRefCount = (c.mxRefCount || 0) + 1
-    }
-    this.releaseSvgGradients(this.oldGradients);
-    this.oldGradients = a.gradients
-  }
-};
-mxShape.prototype.paint = function(a) {
-  var b = this.scale,
-    c = this.bounds.x / b,
-    d = this.bounds.y / b,
-    e = this.bounds.width / b,
-    f = this.bounds.height / b;
-  if (this.isPaintBoundsInverted()) var g = (e - f) / 2,
-    c = c + g,
-    d = d - g,
-    g = e,
-    e = f,
-    f = g;
-  this.updateTransform(a, c, d, e, f);
-  this.configureCanvas(a, c, d, e, f);
-  if (null != this.stencil) this.paintStencilShape(a, c, d, e, f);
-  else if (a.setStrokeWidth(this.strokewidth), null != this.points) {
-    c = [];
-    for (d = 0; d < this.points.length; d++) c.push(new mxPoint(this.points[d].x / b, this.points[d].y / b));
-    this.paintEdgeShape(a,
-      c)
-  } else this.paintVertexShape(a, c, d, e, f)
-};
-mxShape.prototype.configureCanvas = function(a, b, c, d, e) {
-  var f = null;
-  null != this.style && (f = this.style.dashPattern);
-  a.setAlpha(this.opacity / 100);
-  null != this.isShadow && a.setShadow(this.isShadow);
-  null != this.isDashed && a.setDashed(this.isDashed);
-  null != f && a.setDashPattern(f);
-  null != this.gradient ? (b = this.getGradientBounds(a, b, c, d, e), a.setGradient(this.fill, this.gradient, b.x, b.y, b.width, b.height, this.gradientDirection)) : a.setFillColor(this.fill);
-  a.setStrokeColor(this.stroke)
-};
-mxShape.prototype.getGradientBounds = function(a, b, c, d, e) {
-  return new mxRectangle(b, c, d, e)
-};
-mxShape.prototype.updateTransform = function(a, b, c, d, e) {
-  a.scale(this.scale);
-  a.rotate(this.getShapeRotation(), this.flipH, this.flipV, b + d / 2, c + e / 2)
-};
-mxShape.prototype.paintStencilShape = function(a, b, c, d, e) {
-  this.stencilPointerEvents && (this.dialect == mxConstants.DIALECT_SVG ? this.addTransparentBackgroundRectangle(this.node, b, c, d, e) : 8 != document.documentMode && this.setTransparentBackgroundImage(
-    this.node));
-  this.stencil.drawShape(a, this, b, c, d, e)
-};
-mxShape.prototype.paintVertexShape = function(a, b, c, d, e) {
-  this.paintBackground(a, b, c, d, e);
-  a.setShadow(!1);
-  this.paintForeground(a, b, c, d, e)
-};
-mxShape.prototype.paintBackground = function(a, b, c, d, e) {};
-mxShape.prototype.paintForeground = function(a, b, c, d, e) {};
-mxShape.prototype.paintEdgeShape = function(a, b) {};
-mxShape.prototype.getArcSize = function(a, b) {
-  var c = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, 100 * mxConstants.RECTANGLE_ROUNDING_FACTOR) / 100;
-  return Math.min(a * c, b * c)
-};
-mxShape.prototype.paintGlassEffect = function(a, b, c, d, e, f) {
-  var g = Math.ceil(this.strokewidth / 2);
-  a.setGradient("#ffffff", "#ffffff", b, c, d, 0.6 * e, "south", 0.9, 0.1);
-  a.begin();
-  f += 2 * g;
-  this.isRounded ? (a.moveTo(b - g + f, c - g), a.quadTo(b - g, c - g, b - g, c - g + f), a.lineTo(b - g, c + 0.4 * e), a.quadTo(b + 0.5 * d, c + 0.7 * e, b + d + g, c + 0.4 * e), a.lineTo(b + d +
-    g, c - g + f), a.quadTo(b + d + g, c - g, b + d + g - f, c - g)) : (a.moveTo(b - g, c - g), a.lineTo(b - g, c + 0.4 * e), a.quadTo(b + 0.5 * d, c + 0.7 * e, b + d + g, c + 0.4 * e), a.lineTo(
-    b + d + g, c - g));
-  a.close();
-  a.fill()
-};
-mxShape.prototype.apply = function(a) {
-  this.state = a;
-  this.style = a.style;
-  if (null != this.style) {
-    this.fill = mxUtils.getValue(this.style, mxConstants.STYLE_FILLCOLOR, this.fill);
-    this.gradient = mxUtils.getValue(this.style, mxConstants.STYLE_GRADIENTCOLOR, this.gradient);
-    this.gradientDirection = mxUtils.getValue(this.style, mxConstants.STYLE_GRADIENT_DIRECTION, this.gradientDirection);
-    this.opacity = mxUtils.getValue(this.style, mxConstants.STYLE_OPACITY, this.opacity);
-    this.stroke = mxUtils.getValue(this.style, mxConstants.STYLE_STROKECOLOR,
-      this.stroke);
-    this.strokewidth = mxUtils.getNumber(this.style, mxConstants.STYLE_STROKEWIDTH, this.strokewidth);
-    this.spacing = mxUtils.getValue(this.style, mxConstants.STYLE_SPACING, this.spacing);
-    this.startSize = mxUtils.getNumber(this.style, mxConstants.STYLE_STARTSIZE, this.startSize);
-    this.endSize = mxUtils.getNumber(this.style, mxConstants.STYLE_ENDSIZE, this.endSize);
-    this.startArrow = mxUtils.getValue(this.style, mxConstants.STYLE_STARTARROW, this.startArrow);
-    this.endArrow = mxUtils.getValue(this.style, mxConstants.STYLE_ENDARROW,
-      this.endArrow);
-    this.rotation = mxUtils.getValue(this.style, mxConstants.STYLE_ROTATION, this.rotation);
-    this.direction = mxUtils.getValue(this.style, mxConstants.STYLE_DIRECTION, this.direction);
-    this.flipH = 1 == mxUtils.getValue(this.style, mxConstants.STYLE_FLIPH, 0);
-    this.flipV = 1 == mxUtils.getValue(this.style, mxConstants.STYLE_FLIPV, 0);
-    null != this.stencil && (this.flipH = 1 == mxUtils.getValue(this.style, "stencilFlipH", 0) || this.flipH, this.flipV = 1 == mxUtils.getValue(this.style, "stencilFlipV", 0) || this.flipV);
-    if ("north" ==
-      this.direction || "south" == this.direction) a = this.flipH, this.flipH = this.flipV, this.flipV = a;
-    this.isShadow = 1 == mxUtils.getValue(this.style, mxConstants.STYLE_SHADOW, this.isShadow);
-    this.isDashed = 1 == mxUtils.getValue(this.style, mxConstants.STYLE_DASHED, this.isDashed);
-    this.isRounded = 1 == mxUtils.getValue(this.style, mxConstants.STYLE_ROUNDED, this.isRounded);
-    this.glass = 1 == mxUtils.getValue(this.style, mxConstants.STYLE_GLASS, this.glass);
-    "none" == this.fill && (this.fill = null);
-    "none" == this.gradient && (this.gradient = null);
-    "none" == this.stroke && (this.stroke = null)
-  }
-};
-mxShape.prototype.setCursor = function(a) {
-  null == a && (a = "");
-  this.cursor = a;
-  null != this.node && (this.node.style.cursor = a)
-};
-mxShape.prototype.getCursor = function() {
-  return this.cursor
-};
-mxShape.prototype.updateBoundingBox = function() {
-  if (null != this.bounds) {
-    var a = this.createBoundingBox();
-    if (null != a) {
-      this.augmentBoundingBox(a);
-      var b = this.getShapeRotation();
-      0 != b && (a = mxUtils.getBoundingBox(a, b));
-      a.x = Math.floor(a.x);
-      a.y = Math.floor(a.y);
-      a.width = Math.ceil(a.width);
-      a.height = Math.ceil(a.height)
-    }
-    this.boundingBox = a
-  }
-};
-mxShape.prototype.createBoundingBox = function() {
-  var a = this.bounds.clone();
-  if (this.isPaintBoundsInverted()) {
-    var b = (a.width - a.height) / 2;
-    a.x += b;
-    a.y -= b;
-    b = a.width;
-    a.width = a.height;
-    a.height = b
-  }
-  return a
-};
-mxShape.prototype.augmentBoundingBox = function(a) {
-  this.isShadow && (a.width += Math.ceil(mxConstants.SHADOW_OFFSET_X * this.scale), a.height += Math.ceil(mxConstants.SHADOW_OFFSET_Y * this.scale));
-  var b = Math.ceil(this.strokewidth * this.scale);
-  a.grow(Math.ceil(b / 2))
-};
-mxShape.prototype.isPaintBoundsInverted = function() {
-  return null == this.stencil && ("north" == this.direction || "south" == this.direction)
-};
-mxShape.prototype.getRotation = function() {
-  return null != this.rotation ? this.rotation : 0
-};
-mxShape.prototype.getTextRotation = function() {
-  var a = this.getRotation();
-  1 != mxUtils.getValue(this.style, mxConstants.STYLE_HORIZONTAL, 1) && (a += mxText.prototype.verticalTextRotation);
-  return a
-};
-mxShape.prototype.getShapeRotation = function() {
-  var a = this.getRotation();
-  null != this.direction && ("north" == this.direction ? a += 270 : "west" == this.direction ? a += 180 : "south" == this.direction && (a += 90));
-  return a
-};
-mxShape.prototype.addTransparentBackgroundRectangle = function(a, b, c, d, e) {
-  a = document.createElementNS(mxConstants.NS_SVG, "rect");
-  a.setAttribute("x", b);
-  a.setAttribute("y", c);
-  a.setAttribute("width", d);
-  a.setAttribute("height", e);
-  a.setAttribute("fill", "none");
-  a.setAttribute("stroke", "none");
-  a.setAttribute("pointer-events", "all");
-  this.node.appendChild(a)
-};
-mxShape.prototype.setTransparentBackgroundImage = function(a) {
-  a.style.backgroundImage = "url('" + mxClient.imageBasePath + "/transparent.gif')"
-};
-mxShape.prototype.releaseSvgGradients = function(a) {
-  if (null != a)
-    for (var b in a) {
-      var c = a[b];
-      c.mxRefCount = (c.mxRefCount || 0) - 1;
-      0 == c.mxRefCount && null != c.parentNode && c.parentNode.removeChild(c)
-    }
-};
-mxShape.prototype.destroy = function() {
-  null != this.node && (mxEvent.release(this.node), null != this.node.parentNode && this.node.parentNode.removeChild(this.node), this.node = null);
-  this.releaseSvgGradients(this.oldGradients);
-  this.oldGradients = null
-};
-var mxStencilRegistry = {
-    stencils: [],
-    addStencil: function(a, b) {
-      mxStencilRegistry.stencils[a] = b
-    },
-    getStencil: function(a) {
-      return mxStencilRegistry.stencils[a]
-    }
-  },
-  mxMarker = {
-    markers: [],
-    addMarker: function(a, b) {
-      mxMarker.markers[a] = b
-    },
-    createMarker: function(a, b, c, d, e, f, g, h, k, l) {
-      var m = mxMarker.markers[c];
-      return null != m ? m(a, b, c, d, e, f, g, h, k, l) : null
-    }
-  };
-(function() {
-  function a(a, b, e, f, g, h, k, l, m, n) {
-    b = 1.118 * g * m;
-    l = 1.118 * h * m;
-    g *= k + m;
-    h *= k + m;
-    var p = f.clone();
-    p.x -= b;
-    p.y -= l;
-    k = e != mxConstants.ARROW_CLASSIC ? 1 : 0.75;
-    f.x += -g * k - b;
-    f.y += -h * k - l;
-    return function() {
-      a.begin();
-      a.moveTo(p.x, p.y);
-      a.lineTo(p.x - g - h / 2, p.y - h + g / 2);
-      e == mxConstants.ARROW_CLASSIC && a.lineTo(p.x - 3 * g / 4, p.y - 3 * h / 4);
-      a.lineTo(p.x + h / 2 - g, p.y - h - g / 2);
-      a.close();
-      n ? a.fillAndStroke() : a.stroke()
-    }
-  }
-
-  function b(a, b, e, f, g, h, k, l, m, n) {
-    l = e == mxConstants.ARROW_DIAMOND ? 0.7071 : 0.9862;
-    b = g * m * l;
-    l *= h * m;
-    g *= k + m;
-    h *= k + m;
-    var p = f.clone();
-    p.x -= b;
-    p.y -= l;
-    f.x += -g - b;
-    f.y += -h - l;
-    var q = e == mxConstants.ARROW_DIAMOND ? 2 : 3.4;
-    return function() {
-      a.begin();
-      a.moveTo(p.x, p.y);
-      a.lineTo(p.x - g / 2 - h / q, p.y + g / q - h / 2);
-      a.lineTo(p.x - g, p.y - h);
-      a.lineTo(p.x - g / 2 + h / q, p.y - h / 2 - g / q);
-      a.close();
-      n ? a.fillAndStroke() : a.stroke()
-    }
-  }
-  mxMarker.addMarker("classic", a);
-  mxMarker.addMarker("block", a);
-  mxMarker.addMarker("open", function(a, b, e, f, g, h, k, l, m, n) {
-    b = 1.118 * g * m;
-    e = 1.118 * h * m;
-    g *= k + m;
-    h *= k + m;
-    var p = f.clone();
-    p.x -= b;
-    p.y -= e;
-    f.x += 2 * -b;
-    f.y += 2 * -e;
-    return function() {
-      a.begin();
-      a.moveTo(p.x - g -
-        h / 2, p.y - h + g / 2);
-      a.lineTo(p.x, p.y);
-      a.lineTo(p.x + h / 2 - g, p.y - h - g / 2);
-      a.stroke()
-    }
-  });
-  mxMarker.addMarker("oval", function(a, b, e, f, g, h, k, l, m, n) {
-    var p = k / 2,
-      q = f.clone();
-    f.x -= g * p;
-    f.y -= h * p;
-    return function() {
-      a.ellipse(q.x - p, q.y - p, k, k);
-      n ? a.fillAndStroke() : a.stroke()
-    }
-  });
-  mxMarker.addMarker("diamond", b);
-  mxMarker.addMarker("diamondThin", b)
-})();
-
-function mxActor(a, b, c, d) {
-  mxShape.call(this);
-  this.bounds = a;
-  this.fill = b;
-  this.stroke = c;
-  this.strokewidth = null != d ? d : 1
-}
-mxUtils.extend(mxActor, mxShape);
-mxActor.prototype.paintVertexShape = function(a, b, c, d, e) {
-  a.translate(b, c);
-  a.begin();
-  this.redrawPath(a, b, c, d, e);
-  a.fillAndStroke()
-};
-mxActor.prototype.redrawPath = function(a, b, c, d, e) {
-  b = d / 3;
-  a.moveTo(0, e);
-  a.curveTo(0, 3 * e / 5, 0, 2 * e / 5, d / 2, 2 * e / 5);
-  a.curveTo(d / 2 - b, 2 * e / 5, d / 2 - b, 0, d / 2, 0);
-  a.curveTo(d / 2 + b, 0, d / 2 + b, 2 * e / 5, d / 2, 2 * e / 5);
-  a.curveTo(d, 2 * e / 5, d, 3 * e / 5, d, e);
-  a.close()
-};
-
-function mxCloud(a, b, c, d) {
-  mxActor.call(this);
-  this.bounds = a;
-  this.fill = b;
-  this.stroke = c;
-  this.strokewidth = null != d ? d : 1
-}
-mxUtils.extend(mxCloud, mxActor);
-mxCloud.prototype.redrawPath = function(a, b, c, d, e) {
-  a.moveTo(0.25 * d, 0.25 * e);
-  a.curveTo(0.05 * d, 0.25 * e, 0, 0.5 * e, 0.16 * d, 0.55 * e);
-  a.curveTo(0, 0.66 * e, 0.18 * d, 0.9 * e, 0.31 * d, 0.8 * e);
-  a.curveTo(0.4 * d, e, 0.7 * d, e, 0.8 * d, 0.8 * e);
-  a.curveTo(d, 0.8 * e, d, 0.6 * e, 0.875 * d, 0.5 * e);
-  a.curveTo(d, 0.3 * e, 0.8 * d, 0.1 * e, 0.625 * d, 0.2 * e);
-  a.curveTo(0.5 * d, 0.05 * e, 0.3 * d, 0.05 * e, 0.25 * d, 0.25 * e);
-  a.close()
-};
-
-function mxRectangleShape(a, b, c, d) {
-  mxShape.call(this);
-  this.bounds = a;
-  this.fill = b;
-  this.stroke = c;
-  this.strokewidth = null != d ? d : 1
-}
-mxUtils.extend(mxRectangleShape, mxShape);
-mxRectangleShape.prototype.isHtmlAllowed = function() {
-  return !this.isRounded && !this.glass && 0 == this.rotation
-};
-mxRectangleShape.prototype.paintBackground = function(a, b, c, d, e) {
-  if (this.isRounded) {
-    var f = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, 100 * mxConstants.RECTANGLE_ROUNDING_FACTOR) / 100,
-      f = Math.min(d * f, e * f);
-    a.roundrect(b, c, d, e, f, f)
-  } else a.rect(b, c, d, e);
-  a.fillAndStroke()
-};
-mxRectangleShape.prototype.paintForeground = function(a, b, c, d, e) {
-  this.glass && this.paintGlassEffect(a, b, c, d, e, this.getArcSize(d + this.strokewidth, e + this.strokewidth))
-};
-mxRectangleShape.prototype.redrawHtmlShape = function() {
-  this.updateHtmlBounds(this.node);
-  this.updateHtmlFilters(this.node);
-  this.updateHtmlColors(this.node)
-};
-mxRectangleShape.prototype.updateHtmlBounds = function(a) {
-  var b = 9 <= document.documentMode ? 0 : Math.ceil(this.strokewidth * this.scale);
-  a.style.borderWidth = Math.max(1, b) + "px";
-  a.style.overflow = "hidden";
-  a.style.left = Math.round(this.bounds.x - b / 2) + "px";
-  a.style.top = Math.round(this.bounds.y - b / 2) + "px";
-  "CSS1Compat" == document.compatMode && (b = -b);
-  a.style.width = Math.round(Math.max(0, this.bounds.width + b)) + "px";
-  a.style.height = Math.round(Math.max(0, this.bounds.height + b)) + "px"
-};
-mxRectangleShape.prototype.updateHtmlColors = function(a) {
-  var b = this.stroke;
-  null != b && b != mxConstants.NONE ? (a.style.borderColor = b, this.isDashed ? a.style.borderStyle = "dashed" : 0 < this.strokewidth && (a.style.borderStyle = "solid"), a.style.borderWidth = Math
-    .max(1, Math.ceil(this.strokewidth * this.scale)) + "px") : a.style.borderWidth = "0px";
-  b = this.fill;
-  null != b && b != mxConstants.NONE ? (a.style.backgroundColor = b, a.style.backgroundImage = "none") : this.pointerEvents ? a.style.backgroundColor = "transparent" : 8 == document.documentMode ?
-    mxUtils.addTransparentBackgroundFilter(a) : this.setTransparentBackgroundImage(a)
-};
-mxRectangleShape.prototype.updateHtmlFilters = function(a) {
-  var b = "";
-  100 > this.opacity && (b += "alpha(opacity\x3d" + this.opacity + ")");
-  this.isShadow && (b += "progid:DXImageTransform.Microsoft.dropShadow (OffX\x3d'" + Math.round(mxConstants.SHADOW_OFFSET_X * this.scale) + "', OffY\x3d'" + Math.round(mxConstants.SHADOW_OFFSET_Y *
-    this.scale) + "', Color\x3d'" + mxConstants.SHADOWCOLOR + "')");
-  if (this.gradient) {
-    var c = this.fill,
-      d = this.gradient,
-      e = "0",
-      f = {
-        east: 0,
-        south: 1,
-        west: 2,
-        north: 3
-      },
-      g = null != this.direction ? f[this.direction] : 0;
-    null !=
-      this.gradientDirection && (g = mxUtils.mod(g + f[this.gradientDirection] - 1, 4));
-    1 == g ? (e = "1", f = c, c = d, d = f) : 2 == g ? (f = c, c = d, d = f) : 3 == g && (e = "1");
-    b += "progid:DXImageTransform.Microsoft.gradient(startColorStr\x3d'" + c + "', endColorStr\x3d'" + d + "', gradientType\x3d'" + e + "')"
-  }
-  a.style.filter = b
-};
-
-function mxEllipse(a, b, c, d) {
-  mxShape.call(this);
-  this.bounds = a;
-  this.fill = b;
-  this.stroke = c;
-  this.strokewidth = null != d ? d : 1
-}
-mxUtils.extend(mxEllipse, mxShape);
-mxEllipse.prototype.paintVertexShape = function(a, b, c, d, e) {
-  a.ellipse(b, c, d, e);
-  a.fillAndStroke()
-};
-
-function mxDoubleEllipse(a, b, c, d) {
-  mxShape.call(this);
-  this.bounds = a;
-  this.fill = b;
-  this.stroke = c;
-  this.strokewidth = null != d ? d : 1
-}
-mxUtils.extend(mxDoubleEllipse, mxShape);
-mxDoubleEllipse.prototype.vmlScale = 10;
-mxDoubleEllipse.prototype.paintBackground = function(a, b, c, d, e) {
-  a.ellipse(b, c, d, e);
-  a.fillAndStroke()
-};
-mxDoubleEllipse.prototype.paintForeground = function(a, b, c, d, e) {
-  var f = Math.min(4, Math.min(d / 5, e / 5));
-  d -= 2 * f;
-  e -= 2 * f;
-  0 < d && 0 < e && a.ellipse(b + f, c + f, d, e);
-  a.stroke()
-};
-
-function mxRhombus(a, b, c, d) {
-  mxShape.call(this);
-  this.bounds = a;
-  this.fill = b;
-  this.stroke = c;
-  this.strokewidth = null != d ? d : 1
-}
-mxUtils.extend(mxRhombus, mxShape);
-mxRhombus.prototype.paintVertexShape = function(a, b, c, d, e) {
-  var f = d / 2,
-    g = e / 2;
-  a.begin();
-  a.moveTo(b + f, c);
-  a.lineTo(b + d, c + g);
-  a.lineTo(b + f, c + e);
-  a.lineTo(b, c + g);
-  a.close();
-  a.fillAndStroke()
-};
-
-function mxPolyline(a, b, c) {
-  mxShape.call(this);
-  this.points = a;
-  this.stroke = b;
-  this.strokewidth = null != c ? c : 1
-}
-mxUtils.extend(mxPolyline, mxShape);
-mxPolyline.prototype.getRotation = function() {
-  return 0
-};
-mxPolyline.prototype.paintEdgeShape = function(a, b) {
-  this.paintLine(a, b, this.isRounded)
-};
-mxPolyline.prototype.paintLine = function(a, b, c) {
-  var d = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, mxConstants.LINE_ARCSIZE) / 2,
-    e = b[0],
-    f = b[b.length - 1];
-  a.begin();
-  a.moveTo(e.x, e.y);
-  for (var g = 1; g < b.length - 1; g++) {
-    var h = b[g],
-      k = e.x - h.x,
-      e = e.y - h.y;
-    if (c && g < b.length - 1 && (0 != k || 0 != e)) {
-      var l = Math.sqrt(k * k + e * e),
-        k = k * Math.min(d, l / 2) / l,
-        e = e * Math.min(d, l / 2) / l;
-      a.lineTo(h.x + k, h.y + e);
-      e = b[g + 1];
-      k = e.x - h.x;
-      e = e.y - h.y;
-      l = Math.max(1, Math.sqrt(k * k + e * e));
-      k = k * Math.min(d, l / 2) / l;
-      e = e * Math.min(d, l / 2) / l;
-      k = h.x + k;
-      e = h.y + e;
-      a.quadTo(h.x,
-        h.y, k, e);
-      h = new mxPoint(k, e)
-    } else a.lineTo(h.x, h.y);
-    e = h
-  }
-  a.lineTo(f.x, f.y);
-  a.stroke()
-};
-
-function mxArrow(a, b, c, d, e, f, g) {
-  mxShape.call(this);
-  this.points = a;
-  this.fill = b;
-  this.stroke = c;
-  this.strokewidth = null != d ? d : 1;
-  this.arrowWidth = null != e ? e : mxConstants.ARROW_WIDTH;
-  this.spacing = null != f ? f : mxConstants.ARROW_SPACING;
-  this.endSize = null != g ? g : mxConstants.ARROW_SIZE
-}
-mxUtils.extend(mxArrow, mxShape);
-mxArrow.prototype.paintEdgeShape = function(a, b) {
-  var c = mxConstants.ARROW_SPACING,
-    d = mxConstants.ARROW_WIDTH,
-    e = mxConstants.ARROW_SIZE,
-    f = b[0],
-    g = b[b.length - 1],
-    h = g.x - f.x,
-    k = g.y - f.y,
-    l = Math.sqrt(h * h + k * k),
-    m = l - 2 * c - e,
-    h = h / l,
-    k = k / l,
-    l = d * k / 3,
-    d = -d * h / 3,
-    e = f.x - l / 2 + c * h,
-    f = f.y - d / 2 + c * k,
-    n = e + l,
-    p = f + d,
-    q = n + m * h,
-    m = p + m * k,
-    s = q + l,
-    r = m + d,
-    t = s - 3 * l,
-    v = r - 3 * d;
-  a.begin();
-  a.moveTo(e, f);
-  a.lineTo(n, p);
-  a.lineTo(q, m);
-  a.lineTo(s, r);
-  a.lineTo(g.x - c * h, g.y - c * k);
-  a.lineTo(t, v);
-  a.lineTo(t + l, v + d);
-  a.close();
-  a.fillAndStroke()
-};
-
-function mxText(a, b, c, d, e, f, g, h, k, l, m, n, p, q, s, r, t, v, w, u) {
-  mxShape.call(this);
-  this.value = a;
-  this.bounds = b;
-  this.color = null != e ? e : "black";
-  this.align = null != c ? c : "";
-  this.valign = null != d ? d : "";
-  this.family = null != f ? f : mxConstants.DEFAULT_FONTFAMILY;
-  this.size = null != g ? g : mxConstants.DEFAULT_FONTSIZE;
-  this.fontStyle = null != h ? h : mxConstants.DEFAULT_FONTSTYLE;
-  this.spacing = parseInt(k || 2);
-  this.spacingTop = this.spacing + parseInt(l || 0);
-  this.spacingRight = this.spacing + parseInt(m || 0);
-  this.spacingBottom = this.spacing + parseInt(n || 0);
-  this.spacingLeft = this.spacing + parseInt(p || 0);
-  this.horizontal = null != q ? q : !0;
-  this.background = s;
-  this.border = r;
-  this.wrap = null != t ? t : !1;
-  this.clipped = null != v ? v : !1;
-  this.overflow = null != w ? w : "visible";
-  this.labelPadding = null != u ? u : 0;
-  this.rotation = 0
-}
-mxUtils.extend(mxText, mxShape);
-mxText.prototype.baseSpacingTop = 0;
-mxText.prototype.baseSpacingBottom = 0;
-mxText.prototype.baseSpacingLeft = 0;
-mxText.prototype.baseSpacingRight = 0;
-mxText.prototype.replaceLinefeeds = !0;
-mxText.prototype.verticalTextRotation = -90;
-mxText.prototype.ignoreClippedStringSize = !0;
-mxText.prototype.ignoreStringSize = !1;
-mxText.prototype.isParseVml = function() {
-  return !1
-};
-mxText.prototype.isHtmlAllowed = function() {
-  return 8 != document.documentMode
-};
-mxText.prototype.getSvgScreenOffset = function() {
-  return 0
-};
-mxText.prototype.checkBounds = function() {
-  return null != this.bounds && !isNaN(this.bounds.x) && !isNaN(this.bounds.y) && !isNaN(this.bounds.width) && !isNaN(this.bounds.height)
-};
-mxText.prototype.updateBoundingBox = function() {
-  var a = this.node;
-  8 == document.documentMode && null != a.firstChild && (a = a.firstChild, null != a.firstChild && (a = a.firstChild));
-  this.boundingBox = this.bounds.clone();
-  var b = this.getTextRotation();
-  if (!this.ignoreStringSize && null != a && "fill" != this.overflow && (!this.clipped || !this.ignoreClippedStringSize)) {
-    var c = null,
-      d = null;
-    if (null != a.ownerSVGElement)
-      if (null != a.firstChild && null != a.firstChild.firstChild && "foreignObject" == a.firstChild.firstChild.nodeName) a = a.firstChild.firstChild,
-        c = this.wrap ? this.bounds.width : parseInt(a.getAttribute("width")) * this.scale, d = parseInt(a.getAttribute("height")) * this.scale;
-      else {
-        b = a.getBBox();
-        if (0 == b.width && 0 == b.height) return;
-        this.boundingBox = new mxRectangle(b.x, b.y, b.width, b.height);
-        b = 0
-      } else d = this.state.view.textDiv, null != this.offsetWidth && null != this.offsetHeight ? (c = this.wrap ? this.bounds.width : this.offsetWidth * this.scale, d = this.offsetHeight * this.scale) :
-      null != d ? (this.updateFont(d), this.updateSize(d), mxUtils.isNode(this.value) ? d.innerHTML = this.value.outerHTML :
-        (c = this.replaceLinefeeds ? this.value.replace(/\n/g, "\x3cbr/\x3e") : this.value, d.innerHTML = c), c = this.wrap ? this.bounds.width : d.offsetWidth * this.scale, d = d.offsetHeight *
-        this.scale) : (c = this.wrap ? this.bounds.width : a.offsetWidth * this.scale, d = a.offsetHeight * this.scale);
-    null != c && null != d && (this.boundingBox = new mxRectangle(this.bounds.x + this.margin.x * c, this.bounds.y + this.margin.y * d, c, d))
-  } else this.boundingBox.x += this.margin.x * this.boundingBox.width, this.boundingBox.y += this.margin.y * this.boundingBox.height;
-  null !=
-    this.boundingBox && (0 != b && (b = mxUtils.getBoundingBox(this.boundingBox, b), this.boundingBox.x = b.x, this.boundingBox.y = b.y, mxClient.IS_QUIRKS || (this.boundingBox.width = b.width,
-      this.boundingBox.height = b.height)), this.boundingBox.x = Math.floor(this.boundingBox.x), this.boundingBox.y = Math.floor(this.boundingBox.y), this.boundingBox.width = Math.ceil(this.boundingBox
-      .width), this.boundingBox.height = Math.ceil(this.boundingBox.height))
-};
-mxText.prototype.getShapeRotation = function() {
-  return 0
-};
-mxText.prototype.getTextRotation = function() {
-  return null != this.state && null != this.state.shape ? this.state.shape.getTextRotation() : 0
-};
-mxText.prototype.isPaintBoundsInverted = function() {
-  return !this.horizontal && null != this.state && this.state.view.graph.model.isVertex(this.state.cell)
-};
-mxText.prototype.configureCanvas = function(a, b, c, d, e) {
-  mxShape.prototype.configureCanvas.apply(this, arguments);
-  a.setFontColor(this.color);
-  a.setFontBackgroundColor(this.background);
-  a.setFontBorderColor(this.border);
-  a.setFontFamily(this.family);
-  a.setFontSize(this.size);
-  a.setFontStyle(this.fontStyle)
-};
-mxText.prototype.updateVmlContainer = function() {
-  this.node.style.left = Math.round(this.bounds.x) + "px";
-  this.node.style.top = Math.round(this.bounds.y) + "px";
-  this.node.style.width = "1px";
-  this.node.style.height = "1px";
-  this.node.style.overflow = "visible"
-};
-mxText.prototype.paint = function(a) {
-  var b = this.scale,
-    c = this.bounds.x / b,
-    d = this.bounds.y / b,
-    e = this.bounds.width / b,
-    b = this.bounds.height / b;
-  this.updateTransform(a, c, d, e, b);
-  this.configureCanvas(a, c, d, e, b);
-  var f = mxUtils.isNode(this.value) || this.dialect == mxConstants.DIALECT_STRICTHTML,
-    g = f || a instanceof mxVmlCanvas2D ? "html" : "",
-    h = this.value;
-  !f && "html" == g && (h = mxUtils.htmlEntities(h, !1));
-  h = !mxUtils.isNode(this.value) && this.replaceLinefeeds && "html" == g ? h.replace(/\n/g, "\x3cbr/\x3e") : h;
-  a.text(c, d, e, b, h, this.align,
-    this.valign, this.wrap, g, "fill" == this.overflow, this.clipped, this.getTextRotation())
-};
-mxText.prototype.redrawHtmlShape = function() {
-  var a = this.node.style;
-  a.opacity = 1 > this.opacity ? this.opacity : "";
-  a.overflow = "";
-  a.width = "";
-  a.height = "";
-  this.updateFont(this.node);
-  this.updateSize(this.node);
-  this.updateValue();
-  this.offsetHeight = this.offsetWidth = null;
-  null != mxClient.CSS_PREFIX ? this.updateHtmlTransform() : this.updateHtmlFilter()
-};
-mxText.prototype.updateHtmlTransform = function() {
-  var a = this.getTextRotation(),
-    b = this.node.style,
-    c = this.margin.x,
-    d = this.margin.y;
-  0 != a ? (b[mxClient.CSS_PREFIX + "TransformOrigin"] = 100 * -c + "% " + 100 * -d + "%", b[mxClient.CSS_PREFIX + "Transform"] = "translate(" + 100 * c + "%," + 100 * d + "%)scale(" + this.scale +
-    ") rotate(" + a + "deg)") : (b[mxClient.CSS_PREFIX + "TransformOrigin"] = "0% 0%", b[mxClient.CSS_PREFIX + "Transform"] = "scale(" + this.scale + ")translate(" + 100 * c + "%," + 100 * d +
-    "%)");
-  b.left = Math.round(this.bounds.x) + "px";
-  b.top = Math.round(this.bounds.y) +
-    "px"
-};
-mxText.prototype.updateHtmlFilter = function() {
-  var a = this.node.style,
-    b = this.margin.x,
-    c = this.margin.y,
-    d = this.scale;
-  a.filter = "";
-  var e = 0,
-    f = 0,
-    g = null != this.state ? this.state.view.textDiv : null;
-  if (null != g) {
-    g.style.overflow = "";
-    g.style.height = "";
-    g.style.width = "";
-    this.updateFont(g);
-    this.updateSize(g);
-    if (mxUtils.isNode(this.value)) g.innerHTML = this.value.outerHTML;
-    else {
-      var h = this.value;
-      this.dialect != mxConstants.DIALECT_STRICTHTML && (h = mxUtils.htmlEntities(h, !1));
-      h = this.replaceLinefeeds ? h.replace(/\n/g, "\x3cbr/\x3e") : h;
-      g.innerHTML = h
-    }
-    e = g.offsetWidth + 2;
-    f = g.offsetHeight + 2
-  } else e = this.node.offsetWidth, f = this.node.offsetHeight + 1;
-  this.offsetWidth = e;
-  this.offsetHeight = f;
-  g = this.bounds.width / d;
-  h = this.bounds.height / d;
-  mxClient.IS_QUIRKS && (this.clipped || "fill" == this.overflow) && 0 < h ? (h = Math.min(h, f), a.height = Math.round(h + 1) + "px") : h = f;
-  "fill" != this.overflow && (mxClient.IS_QUIRKS && (this.clipped || this.wrap) && 0 < g ? (g = Math.min(g, e), a.width = Math.round(g) + "px") : g = e);
-  var h = h * d,
-    g = g * d,
-    e = this.getTextRotation() * (Math.PI / 180),
-    f = parseFloat(parseFloat(Math.cos(e)).toFixed(8)),
-    k = parseFloat(parseFloat(Math.sin(-e)).toFixed(8)),
-    e = e % (2 * Math.PI);
-  0 > e && (e += 2 * Math.PI);
-  e %= Math.PI;
-  e > Math.PI / 2 && (e = Math.PI - e);
-  var l = Math.cos(e),
-    m = Math.sin(-e),
-    b = g * -(b + 0.5),
-    c = h * -(c + 0.5),
-    n = (h - h * l + g * m) / 2 + k * b - f * c;
-  0 != e && (a.filter = "progid:DXImageTransform.Microsoft.Matrix(M11\x3d" + f + ", M12\x3d" + k + ", M21\x3d" + -k + ", M22\x3d" + f + ", sizingMethod\x3d'auto expand')");
-  a.zoom = d;
-  a.left = Math.round(this.bounds.x + ((g - g * l + h * m) / 2 - f * b - k * c) - g / 2) + "px";
-  a.top = Math.round(this.bounds.y + n - h / 2) + "px"
-};
-mxText.prototype.updateValue = function() {
-  if (mxUtils.isNode(this.value)) this.node.innerHTML = "", this.node.appendChild(this.value);
-  else {
-    var a = this.value;
-    this.dialect != mxConstants.DIALECT_STRICTHTML && (a = mxUtils.htmlEntities(a, !1));
-    var a = this.replaceLinefeeds ? a.replace(/\n/g, "\x3cbr/\x3e") : a,
-      b = null != this.background && this.background != mxConstants.NONE ? this.background : null,
-      c = null != this.border && this.border != mxConstants.NONE ? this.border : null;
-    if (null != b || null != c)
-      if ("fill" == this.overflow) null != b && (this.node.style.backgroundColor =
-        b), null != c && (this.node.style.border = "1px solid " + c);
-      else {
-        var d = "";
-        null != b && (d += "background-color:" + b + ";");
-        null != c && (d += "border:1px solid " + c + ";");
-        a = '\x3cdiv style\x3d"zoom:1;' + d + "display:inline-block;_display:inline;padding-bottom:1px;padding-right:1px;line-height:" + this.node.style.lineHeight + '"\x3e' + a + "\x3c/div\x3e";
-        this.node.style.lineHeight = ""
-      }
-    this.node.innerHTML = a
-  }
-};
-mxText.prototype.updateFont = function(a) {
-  a = a.style;
-  a.lineHeight = Math.round(this.size * mxConstants.LINE_HEIGHT) + "px";
-  a.fontSize = Math.round(this.size) + "px";
-  a.fontFamily = this.family;
-  a.verticalAlign = "top";
-  a.color = this.color;
-  a.fontWeight = (this.fontStyle & mxConstants.FONT_BOLD) == mxConstants.FONT_BOLD ? "bold" : "";
-  a.fontStyle = (this.fontStyle & mxConstants.FONT_ITALIC) == mxConstants.FONT_ITALIC ? "italic" : "";
-  a.fontDecoration = (this.fontStyle & mxConstants.FONT_UNDERLINE) == mxConstants.FONT_UNDERLINE ? "underline" : "";
-  a.textAlign =
-    this.align == mxConstants.ALIGN_CENTER ? "center" : this.align == mxConstants.ALIGN_RIGHT ? "right" : "left"
-};
-mxText.prototype.updateSize = function(a) {
-  var b = Math.round(this.bounds.width / this.scale),
-    c = Math.round(this.bounds.height / this.scale);
-  a = a.style;
-  this.clipped ? (a.overflow = "hidden", 0 < c && (a.maxHeight = c + "px"), 0 < b && (a.width = b + "px")) : "fill" == this.overflow && (a.width = b + "px", 0 < c && (a.maxHeight = c + "px"));
-  this.wrap ? (!this.clipped && 0 < b && (a.width = b + "px"), a.whiteSpace = "normal") : a.whiteSpace = "nowrap"
-};
-mxText.prototype.updateMargin = function() {
-  this.margin = mxUtils.getAlignmentAsPoint(this.align, this.valign)
-};
-mxText.prototype.getSpacing = function() {
-  var a = 0,
-    b = 0,
-    a = this.align == mxConstants.ALIGN_CENTER ? (this.spacingLeft - this.spacingRight) / 2 : this.align == mxConstants.ALIGN_RIGHT ? -this.spacingRight - this.baseSpacingRight : this.spacingLeft +
-    this.baseSpacingLeft,
-    b = this.valign == mxConstants.ALIGN_MIDDLE ? (this.spacingTop - this.spacingBottom) / 2 : this.valign == mxConstants.ALIGN_BOTTOM ? -this.spacingBottom - this.baseSpacingBottom : this.spacingTop +
-    this.baseSpacingTop;
-  return new mxPoint(a, b)
-};
-
-function mxTriangle() {
-  mxActor.call(this)
-}
-mxUtils.extend(mxTriangle, mxActor);
-mxTriangle.prototype.redrawPath = function(a, b, c, d, e) {
-  a.moveTo(0, 0);
-  a.lineTo(d, 0.5 * e);
-  a.lineTo(0, e);
-  a.close()
-};
-
-function mxHexagon() {
-  mxActor.call(this)
-}
-mxUtils.extend(mxHexagon, mxActor);
-mxHexagon.prototype.redrawPath = function(a, b, c, d, e) {
-  a.moveTo(0.25 * d, 0);
-  a.lineTo(0.75 * d, 0);
-  a.lineTo(d, 0.5 * e);
-  a.lineTo(0.75 * d, e);
-  a.lineTo(0.25 * d, e);
-  a.lineTo(0, 0.5 * e);
-  a.close()
-};
-
-function mxLine(a, b, c) {
-  mxShape.call(this);
-  this.bounds = a;
-  this.stroke = b;
-  this.strokewidth = null != c ? c : 1
-}
-mxUtils.extend(mxLine, mxShape);
-mxLine.prototype.paintVertexShape = function(a, b, c, d, e) {
-  c += e / 2;
-  a.begin();
-  a.moveTo(b, c);
-  a.lineTo(b + d, c);
-  a.stroke()
-};
-
-function mxImageShape(a, b, c, d, e) {
-  mxShape.call(this);
-  this.bounds = a;
-  this.image = b;
-  this.fill = c;
-  this.stroke = d;
-  this.strokewidth = null != e ? e : 1;
-  this.shadow = !1
-}
-mxUtils.extend(mxImageShape, mxRectangleShape);
-mxImageShape.prototype.preserveImageAspect = !0;
-mxImageShape.prototype.getSvgScreenOffset = function() {
-  return !mxClient.IS_IE ? 0.5 : 0
-};
-mxImageShape.prototype.apply = function(a) {
-  mxShape.prototype.apply.apply(this, arguments);
-  this.gradient = this.stroke = this.fill = null;
-  null != this.style && (this.fill = mxUtils.getValue(this.style, mxConstants.STYLE_IMAGE_BACKGROUND), this.stroke = mxUtils.getValue(this.style, mxConstants.STYLE_IMAGE_BORDER), this.preserveImageAspect =
-    1 == mxUtils.getNumber(this.style, mxConstants.STYLE_IMAGE_ASPECT, 1), this.flipH = this.flipH || 1 == mxUtils.getValue(this.style, "imageFlipH", 0), this.flipV = this.flipV || 1 == mxUtils.getValue(
-      this.style,
-      "imageFlipV", 0))
-};
-mxImageShape.prototype.isHtmlAllowed = function() {
-  return !this.preserveImageAspect
-};
-mxImageShape.prototype.createHtml = function() {
-  var a = document.createElement("div");
-  a.style.position = "absolute";
-  return a
-};
-mxImageShape.prototype.paintVertexShape = function(a, b, c, d, e) {
-  if (null != this.image) {
-    var f = mxUtils.getValue(this.style, mxConstants.STYLE_IMAGE_BACKGROUND, null),
-      g = mxUtils.getValue(this.style, mxConstants.STYLE_IMAGE_BORDER, null);
-    if (null != f || null != g) a.setFillColor(f), a.setStrokeColor(g), a.rect(b, c, d, e), a.fillAndStroke();
-    a.image(b, c, d, e, this.image, this.preserveImageAspect, !1, !1)
-  } else mxRectangleShape.prototype.paintBackground.apply(this, arguments)
-};
-mxImageShape.prototype.redrawHtmlShape = function() {
-  this.node.style.left = Math.round(this.bounds.x) + "px";
-  this.node.style.top = Math.round(this.bounds.y) + "px";
-  this.node.style.width = Math.max(0, Math.round(this.bounds.width)) + "px";
-  this.node.style.height = Math.max(0, Math.round(this.bounds.height)) + "px";
-  this.node.style.backgroundColor = this.fill || "";
-  this.node.style.borderColor = this.stroke || "";
-  this.node.innerHTML = "";
-  if (null != this.image) {
-    var a = document.createElement(mxClient.IS_IE6 || null == mxClient.CSS_PREFIX && 0 !=
-      this.rotation ? mxClient.VML_PREFIX + ":image" : "img");
-    a.style.position = "absolute";
-    a.src = this.image;
-    var b = 100 > this.opacity ? "alpha(opacity\x3d" + this.opacity + ")" : "";
-    this.node.style.filter = b;
-    this.flipH && this.flipV ? b += "progid:DXImageTransform.Microsoft.BasicImage(rotation\x3d2)" : this.flipH ? b += "progid:DXImageTransform.Microsoft.BasicImage(mirror\x3d1)" : this.flipV && (b +=
-      "progid:DXImageTransform.Microsoft.BasicImage(rotation\x3d2, mirror\x3d1)");
-    a.style.filter != b && (a.style.filter = b);
-    "image" == a.nodeName ? a.style.rotation =
-      this.rotation : a.style[mxClient.CSS_PREFIX + "Transform"] = "rotate(" + this.rotation + "deg)";
-    a.style.width = this.node.style.width;
-    a.style.height = this.node.style.height;
-    this.node.style.backgroundImage = "";
-    this.node.appendChild(a)
-  } else this.setTransparentBackgroundImage(this.node)
-};
-
-function mxLabel(a, b, c, d) {
-  mxRectangleShape.call(this, a, b, c, d)
-}
-mxUtils.extend(mxLabel, mxRectangleShape);
-mxLabel.prototype.imageSize = mxConstants.DEFAULT_IMAGESIZE;
-mxLabel.prototype.spacing = 2;
-mxLabel.prototype.indicatorSize = 10;
-mxLabel.prototype.indicatorSpacing = 2;
-mxLabel.prototype.init = function(a) {
-  mxShape.prototype.init.apply(this, arguments);
-  null != this.indicatorColor && null != this.indicatorShape && (this.indicator = new this.indicatorShape, this.indicator.dialect = this.dialect, this.indicator.bounds = this.bounds, this.indicator
-    .fill = this.indicatorColor, this.indicator.stroke = this.indicatorColor, this.indicator.gradient = this.indicatorGradientColor, this.indicator.direction = this.indicatorDirection, this.indicator
-    .init(this.node))
-};
-mxLabel.prototype.redraw = function() {
-  null != this.indicator && (this.indicator.fill = this.indicatorColor, this.indicator.stroke = this.indicatorColor, this.indicator.gradient = this.indicatorGradientColor, this.indicator.direction =
-    this.indicatorDirection);
-  mxShape.prototype.redraw.apply(this, arguments)
-};
-mxLabel.prototype.isHtmlAllowed = function() {
-  return mxRectangleShape.prototype.isHtmlAllowed.apply(this, arguments) && null == this.indicatorColor && null == this.indicatorShape
-};
-mxLabel.prototype.paintForeground = function(a, b, c, d, e) {
-  this.paintImage(a, b, c, d, e);
-  this.paintIndicator(a, b, c, d, e);
-  mxRectangleShape.prototype.paintForeground.apply(this, arguments)
-};
-mxLabel.prototype.paintImage = function(a, b, c, d, e) {
-  null != this.image && (b = this.getImageBounds(b, c, d, e), a.image(b.x, b.y, b.width, b.height, this.image, !1, !1, !1))
-};
-mxLabel.prototype.getImageBounds = function(a, b, c, d) {
-  var e = mxUtils.getValue(this.style, mxConstants.STYLE_IMAGE_ALIGN, mxConstants.ALIGN_LEFT),
-    f = mxUtils.getValue(this.style, mxConstants.STYLE_IMAGE_VERTICAL_ALIGN, mxConstants.ALIGN_MIDDLE),
-    g = mxUtils.getNumber(this.style, mxConstants.STYLE_IMAGE_WIDTH, mxConstants.DEFAULT_IMAGESIZE),
-    h = mxUtils.getNumber(this.style, mxConstants.STYLE_IMAGE_HEIGHT, mxConstants.DEFAULT_IMAGESIZE),
-    k = mxUtils.getNumber(this.style, mxConstants.STYLE_SPACING, this.spacing) + 5;
-  a = e == mxConstants.ALIGN_CENTER ?
-    a + (c - g) / 2 : e == mxConstants.ALIGN_RIGHT ? a + (c - g - k) : a + k;
-  b = f == mxConstants.ALIGN_TOP ? b + k : f == mxConstants.ALIGN_BOTTOM ? b + (d - h - k) : b + (d - h) / 2;
-  return new mxRectangle(a, b, g, h)
-};
-mxLabel.prototype.paintIndicator = function(a, b, c, d, e) {
-  null != this.indicator ? (this.indicator.bounds = this.getIndicatorBounds(b, c, d, e), this.indicator.paint(a)) : null != this.indicatorImage && (b = this.getIndicatorBounds(b, c, d, e), a.image(
-    b.x, b.y, b.width, b.height, this.indicatorImage, !1, !1, !1))
-};
-mxLabel.prototype.getIndicatorBounds = function(a, b, c, d) {
-  var e = mxUtils.getValue(this.style, mxConstants.STYLE_IMAGE_ALIGN, mxConstants.ALIGN_LEFT),
-    f = mxUtils.getValue(this.style, mxConstants.STYLE_IMAGE_VERTICAL_ALIGN, mxConstants.ALIGN_MIDDLE),
-    g = mxUtils.getNumber(this.style, mxConstants.STYLE_INDICATOR_WIDTH, this.indicatorSize),
-    h = mxUtils.getNumber(this.style, mxConstants.STYLE_INDICATOR_HEIGHT, this.indicatorSize),
-    k = this.spacing + 5;
-  a = e == mxConstants.ALIGN_RIGHT ? a + (c - g - k) : e == mxConstants.ALIGN_CENTER ? a + (c - g) /
-    2 : a + k;
-  b = f == mxConstants.ALIGN_BOTTOM ? b + (d - h - k) : f == mxConstants.ALIGN_TOP ? b + k : b + (d - h) / 2;
-  return new mxRectangle(a, b, g, h)
-};
-mxLabel.prototype.redrawHtmlShape = function() {
-  for (mxRectangleShape.prototype.redrawHtmlShape.apply(this, arguments); this.node.hasChildNodes();) this.node.removeChild(this.node.lastChild);
-  if (null != this.image) {
-    var a = document.createElement("img");
-    a.style.position = "relative";
-    a.setAttribute("border", "0");
-    var b = this.getImageBounds(this.bounds.x, this.bounds.y, this.bounds.width, this.bounds.height);
-    b.x -= this.bounds.x;
-    b.y -= this.bounds.y;
-    a.style.left = Math.round(b.x) + "px";
-    a.style.top = Math.round(b.y) + "px";
-    a.style.width =
-      Math.round(b.width) + "px";
-    a.style.height = Math.round(b.height) + "px";
-    a.src = this.image;
-    this.node.appendChild(a)
-  }
-};
-
-function mxCylinder(a, b, c, d) {
-  mxShape.call(this);
-  this.bounds = a;
-  this.fill = b;
-  this.stroke = c;
-  this.strokewidth = null != d ? d : 1
-}
-mxUtils.extend(mxCylinder, mxShape);
-mxCylinder.prototype.maxHeight = 40;
-mxCylinder.prototype.svgStrokeTolerance = 0;
-mxCylinder.prototype.paintVertexShape = function(a, b, c, d, e) {
-  a.translate(b, c);
-  a.begin();
-  this.redrawPath(a, b, c, d, e, !1);
-  a.fillAndStroke();
-  a.setShadow(!1);
-  a.begin();
-  this.redrawPath(a, b, c, d, e, !0);
-  a.stroke()
-};
-mxCylinder.prototype.redrawPath = function(a, b, c, d, e, f) {
-  b = Math.min(this.maxHeight, Math.round(e / 5));
-  if (f && null != this.fill || !f && null == this.fill) a.moveTo(0, b), a.curveTo(0, 2 * b, d, 2 * b, d, b), f || (a.stroke(), a.begin());
-  f || (a.moveTo(0, b), a.curveTo(0, -b / 3, d, -b / 3, d, b), a.lineTo(d, e - b), a.curveTo(d, e + b / 3, 0, e + b / 3, 0, e - b), a.close())
-};
-
-function mxConnector(a, b, c) {
-  mxPolyline.call(this, a, b, c)
-}
-mxUtils.extend(mxConnector, mxPolyline);
-mxConnector.prototype.paintEdgeShape = function(a, b) {
-  var c = this.createMarker(a, b, !0),
-    d = this.createMarker(a, b, !1);
-  null == this.style || 1 != this.style[mxConstants.STYLE_CURVED] ? this.paintLine(a, b, this.isRounded) : this.paintCurvedLine(a, b);
-  a.setFillColor(this.stroke);
-  a.setShadow(!1);
-  a.setDashed(!1);
-  null != c && c();
-  null != d && d()
-};
-mxConnector.prototype.paintCurvedLine = function(a, b) {
-  a.begin();
-  var c = b[0],
-    d = b.length;
-  a.moveTo(c.x, c.y);
-  for (c = 1; c < d - 2; c++) {
-    var e = b[c],
-      f = b[c + 1];
-    a.quadTo(e.x, e.y, (e.x + f.x) / 2, (e.y + f.y) / 2)
-  }
-  e = b[d - 2];
-  f = b[d - 1];
-  a.quadTo(e.x, e.y, f.x, f.y);
-  a.stroke()
-};
-mxConnector.prototype.createMarker = function(a, b, c) {
-  var d = b.length,
-    e = c ? b[1] : b[d - 2];
-  b = c ? b[0] : b[d - 1];
-  var d = b.x - e.x,
-    f = b.y - e.y,
-    g = Math.max(1, Math.sqrt(d * d + f * f)),
-    e = d / g,
-    d = f / g,
-    f = mxUtils.getNumber(this.style, c ? mxConstants.STYLE_STARTSIZE : mxConstants.STYLE_ENDSIZE, mxConstants.DEFAULT_MARKERSIZE),
-    g = mxUtils.getValue(this.style, c ? mxConstants.STYLE_STARTARROW : mxConstants.STYLE_ENDARROW);
-  return mxMarker.createMarker(a, this, g, b, e, d, f, c, this.strokewidth, 0 != this.style[c ? mxConstants.STYLE_STARTFILL : mxConstants.STYLE_ENDFILL])
-};
-mxConnector.prototype.augmentBoundingBox = function(a) {
-  mxShape.prototype.augmentBoundingBox.apply(this, arguments);
-  var b = 0;
-  mxUtils.getValue(this.style, mxConstants.STYLE_STARTARROW, mxConstants.NONE) != mxConstants.NONE && (b = mxUtils.getNumber(this.style, mxConstants.STYLE_STARTSIZE, mxConstants.DEFAULT_MARKERSIZE) +
-    1);
-  mxUtils.getValue(this.style, mxConstants.STYLE_ENDARROW, mxConstants.NONE) != mxConstants.NONE && (b = Math.max(b, mxUtils.getNumber(this.style, mxConstants.STYLE_ENDSIZE, mxConstants.DEFAULT_MARKERSIZE)) +
-    1);
-  a.grow(Math.ceil(b * this.scale))
-};
-
-function mxSwimlane(a, b, c, d) {
-  mxShape.call(this);
-  this.bounds = a;
-  this.fill = b;
-  this.stroke = c;
-  this.strokewidth = null != d ? d : 1
-}
-mxUtils.extend(mxSwimlane, mxShape);
-mxSwimlane.prototype.imageSize = 16;
-mxSwimlane.prototype.getGradientBounds = function(a, b, c, d, e) {
-  a = Math.min(e, mxUtils.getValue(this.style, mxConstants.STYLE_STARTSIZE, mxConstants.DEFAULT_STARTSIZE));
-  return new mxRectangle(b, c, d, a)
-};
-mxSwimlane.prototype.getRotation = function() {
-  var a = mxShape.prototype.getRotation.apply(this, arguments);
-  1 != mxUtils.getValue(this.style, mxConstants.STYLE_HORIZONTAL, 1) && (a += mxText.prototype.verticalTextRotation);
-  return a
-};
-mxSwimlane.prototype.getTextRotation = function() {
-  return this.getRotation()
-};
-mxSwimlane.prototype.isPaintBoundsInverted = function() {
-  return mxShape.prototype.isPaintBoundsInverted.apply(this, arguments) || 1 != mxUtils.getValue(this.style, mxConstants.STYLE_HORIZONTAL, 1)
-};
-mxSwimlane.prototype.getArcSize = function(a, b, c) {
-  a = mxUtils.getValue(this.style, mxConstants.STYLE_ARCSIZE, 100 * mxConstants.RECTANGLE_ROUNDING_FACTOR) / 100;
-  return 3 * c * a
-};
-mxSwimlane.prototype.paintVertexShape = function(a, b, c, d, e) {
-  var f = Math.min(e, mxUtils.getValue(this.style, mxConstants.STYLE_STARTSIZE, mxConstants.DEFAULT_STARTSIZE)),
-    g = mxUtils.getValue(this.style, mxConstants.STYLE_SWIMLANE_FILLCOLOR, mxConstants.NONE),
-    h = 1 == mxUtils.getValue(this.style, mxConstants.STYLE_SWIMLANE_LINE, 1),
-    k = 0;
-  a.translate(b, c);
-  this.isRounded ? (k = this.getArcSize(d, e, f), this.paintRoundedSwimlane(a, b, c, d, e, f, k, g, h)) : this.paintSwimlane(a, b, c, d, e, f, g, h);
-  g = mxUtils.getValue(this.style, mxConstants.STYLE_SEPARATORCOLOR,
-    mxConstants.NONE);
-  this.paintSeparator(a, d, f, e, g);
-  null != this.image && (e = this.getImageBounds(b, f, d, e), a.image(e.x - b, e.y - c, e.width, e.height, this.image, !1, !1, !1));
-  this.glass && (a.setShadow(!1), this.paintGlassEffect(a, 0, 0, d, f, k))
-};
-mxSwimlane.prototype.paintSwimlane = function(a, b, c, d, e, f, g, h) {
-  g != mxConstants.NONE && (a.save(), a.setFillColor(g), a.rect(0, 0, d, e), a.fillAndStroke(), a.restore(), a.setShadow(!1));
-  a.begin();
-  a.moveTo(0, f);
-  a.lineTo(0, 0);
-  a.lineTo(d, 0);
-  a.lineTo(d, f);
-  h && a.close();
-  a.fillAndStroke();
-  f < e && g == mxConstants.NONE && (a.pointerEvents = !1, a.begin(), a.moveTo(0, f), a.lineTo(0, e), a.lineTo(d, e), a.lineTo(d, f), a.stroke())
-};
-mxSwimlane.prototype.paintRoundedSwimlane = function(a, b, c, d, e, f, g, h, k) {
-  h != mxConstants.NONE && (a.save(), a.setFillColor(h), a.roundrect(0, 0, d, e, g, g), a.fillAndStroke(), a.restore(), a.setShadow(!1));
-  a.begin();
-  a.moveTo(d, f);
-  a.lineTo(d, g);
-  a.quadTo(d, 0, d - Math.min(d / 2, g), 0);
-  a.lineTo(Math.min(d / 2, g), 0);
-  a.quadTo(0, 0, 0, g);
-  a.lineTo(0, f);
-  k && a.close();
-  a.fillAndStroke();
-  f < e && h == mxConstants.NONE && (a.pointerEvents = !1, a.begin(), a.moveTo(0, f), a.lineTo(0, e - g), a.quadTo(0, e, Math.min(d / 2, g), e), a.lineTo(d - Math.min(d / 2, g), e),
-    a.quadTo(d, e, d, e - g), a.lineTo(d, f), a.stroke())
-};
-mxSwimlane.prototype.paintSeparator = function(a, b, c, d, e) {
-  e != mxConstants.NONE && (a.setStrokeColor(e), a.setDashed(!0), a.begin(), a.moveTo(b, c), a.lineTo(b, d), a.stroke(), a.setDashed(!1))
-};
-mxSwimlane.prototype.getImageBounds = function(a, b, c, d) {
-  return new mxRectangle(a + c - this.imageSize, b, this.imageSize, this.imageSize)
-};
-
-function mxGraphLayout(a) {
-  this.graph = a
-}
-mxGraphLayout.prototype.graph = null;
-mxGraphLayout.prototype.useBoundingBox = !0;
-mxGraphLayout.prototype.parent = null;
-mxGraphLayout.prototype.moveCell = function(a, b, c) {};
-mxGraphLayout.prototype.execute = function(a) {};
-mxGraphLayout.prototype.getGraph = function() {
-  return this.graph
-};
-mxGraphLayout.prototype.getConstraint = function(a, b, c, d) {
-  c = this.graph.view.getState(b);
-  b = null != c ? c.style : this.graph.getCellStyle(b);
-  return null != b ? b[a] : null
-};
-mxGraphLayout.traverse = function(a, b, c, d, e) {
-  if (null != c && null != a) {
-    b = null != b ? b : !0;
-    e = e || [];
-    var f = mxCellPath.create(a);
-    if (null == e[f] && (e[f] = a, d = c(a, d), null == d || d))
-      if (d = this.graph.model.getEdgeCount(a), 0 < d)
-        for (f = 0; f < d; f++) {
-          var g = this.graph.model.getEdgeAt(a, f),
-            h = this.graph.model.getTerminal(g, !0) == a;
-          if (!b || h) h = this.graph.view.getVisibleTerminal(g, !h), this.traverse(h, b, c, g, e)
-        }
-  }
-};
-mxGraphLayout.prototype.isVertexMovable = function(a) {
-  return this.graph.isCellMovable(a)
-};
-mxGraphLayout.prototype.isVertexIgnored = function(a) {
-  return !this.graph.getModel().isVertex(a) || !this.graph.isCellVisible(a)
-};
-mxGraphLayout.prototype.isEdgeIgnored = function(a) {
-  var b = this.graph.getModel();
-  return !b.isEdge(a) || !this.graph.isCellVisible(a) || null == b.getTerminal(a, !0) || null == b.getTerminal(a, !1)
-};
-mxGraphLayout.prototype.setEdgeStyleEnabled = function(a, b) {
-  this.graph.setCellStyles(mxConstants.STYLE_NOEDGESTYLE, b ? "0" : "1", [a])
-};
-mxGraphLayout.prototype.setOrthogonalEdge = function(a, b) {
-  this.graph.setCellStyles(mxConstants.STYLE_ORTHOGONAL, b ? "1" : "0", [a])
-};
-mxGraphLayout.prototype.getParentOffset = function(a) {
-  var b = new mxPoint;
-  if (null != a && a != this.parent) {
-    var c = this.graph.getModel();
-    if (c.isAncestor(this.parent, a))
-      for (var d = c.getGeometry(a); a != this.parent;) b.x += d.x, b.y += d.y, a = c.getParent(a), d = c.getGeometry(a)
-  }
-  return b
-};
-mxGraphLayout.prototype.setEdgePoints = function(a, b) {
-  if (null != a) {
-    var c = this.graph.model,
-      d = c.getGeometry(a);
-    null == d ? (d = new mxGeometry, d.setRelative(!0)) : d = d.clone();
-    if (null != this.parent && null != b)
-      for (var e = c.getParent(a), e = this.getParentOffset(e), f = 0; f < b.length; f++) b[f].x -= e.x, b[f].y -= e.y;
-    d.points = b;
-    c.setGeometry(a, d)
-  }
-};
-mxGraphLayout.prototype.setVertexLocation = function(a, b, c) {
-  var d = this.graph.getModel(),
-    e = d.getGeometry(a),
-    f = null;
-  if (null != e) {
-    f = new mxRectangle(b, c, e.width, e.height);
-    if (this.useBoundingBox) {
-      var g = this.graph.getView().getState(a);
-      if (null != g && null != g.text && null != g.text.boundingBox) {
-        var h = this.graph.getView().scale,
-          k = g.text.boundingBox;
-        g.text.boundingBox.x < g.x && (b += (g.x - k.x) / h, f.width = k.width);
-        g.text.boundingBox.y < g.y && (c += (g.y - k.y) / h, f.height = k.height)
-      }
-    }
-    null != this.parent && (g = d.getParent(a), null != g && g !=
-      this.parent && (g = this.getParentOffset(g), b -= g.x, c -= g.y));
-    if (e.x != b || e.y != c) e = e.clone(), e.x = b, e.y = c, d.setGeometry(a, e)
-  }
-  return f
-};
-mxGraphLayout.prototype.getVertexBounds = function(a) {
-  var b = this.graph.getModel().getGeometry(a);
-  if (this.useBoundingBox) {
-    var c = this.graph.getView().getState(a);
-    if (null != c && null != c.text && null != c.text.boundingBox) var d = this.graph.getView().scale,
-      e = c.text.boundingBox,
-      f = Math.max(c.x - e.x, 0) / d,
-      g = Math.max(c.y - e.y, 0) / d,
-      h = Math.max(e.x + e.width - (c.x + c.width), 0) / d,
-      c = Math.max(e.y + e.height - (c.y + c.height), 0) / d,
-      b = new mxRectangle(b.x - f, b.y - g, b.width + f + h, b.height + g + c)
-  }
-  null != this.parent && (a = this.graph.getModel().getParent(a),
-    b = b.clone(), null != a && a != this.parent && (a = this.getParentOffset(a), b.x += a.x, b.y += a.y));
-  return new mxRectangle(b.x, b.y, b.width, b.height)
-};
-mxGraphLayout.prototype.arrangeGroups = function(a, b) {
-  this.graph.getModel().beginUpdate();
-  try {
-    for (var c = a.length - 1; 0 <= c; c--) {
-      var d = a[c],
-        e = this.graph.getChildVertices(d),
-        f = this.graph.getBoundingBoxFromGeometry(e),
-        g = this.graph.getCellGeometry(d),
-        h = 0,
-        k = 0;
-      if (this.graph.isSwimlane(d)) var l = this.graph.getStartSize(d),
-        h = l.width,
-        k = l.height;
-      null != f && null != g && (g = g.clone(), g.x = g.x + f.x - b - h, g.y = g.y + f.y - b - k, g.width = f.width + 2 * b + h, g.height = f.height + 2 * b + k, this.graph.getModel().setGeometry(d,
-        g), this.graph.moveCells(e,
-        b + h - f.x, b + k - f.y))
-    }
-  } finally {
-    this.graph.getModel().endUpdate()
-  }
-};
-
-function mxStackLayout(a, b, c, d, e, f) {
-  mxGraphLayout.call(this, a);
-  this.horizontal = null != b ? b : !0;
-  this.spacing = null != c ? c : 0;
-  this.x0 = null != d ? d : 0;
-  this.y0 = null != e ? e : 0;
-  this.border = null != f ? f : 0
-}
-mxStackLayout.prototype = new mxGraphLayout;
-mxStackLayout.prototype.constructor = mxStackLayout;
-mxStackLayout.prototype.horizontal = null;
-mxStackLayout.prototype.spacing = null;
-mxStackLayout.prototype.x0 = null;
-mxStackLayout.prototype.y0 = null;
-mxStackLayout.prototype.border = 0;
-mxStackLayout.prototype.keepFirstLocation = !1;
-mxStackLayout.prototype.fill = !1;
-mxStackLayout.prototype.resizeParent = !1;
-mxStackLayout.prototype.resizeLast = !1;
-mxStackLayout.prototype.wrap = null;
-mxStackLayout.prototype.isHorizontal = function() {
-  return this.horizontal
-};
-mxStackLayout.prototype.moveCell = function(a, b, c) {
-  var d = this.graph.getModel(),
-    e = d.getParent(a),
-    f = this.isHorizontal();
-  if (null != a && null != e) {
-    var g = 0,
-      h = 0,
-      k = d.getChildCount(e);
-    b = f ? b : c;
-    g = this.graph.getView().getState(e);
-    null != g && (b -= f ? g.x : g.y);
-    for (g = 0; g < k; g++)
-      if (c = d.getChildAt(e, g), c != a && (c = d.getGeometry(c), null != c)) {
-        c = f ? c.x + c.width / 2 : c.y + c.height / 2;
-        if (h < b && c > b) break;
-        h = c
-      }
-    f = e.getIndex(a);
-    f = Math.max(0, g - (g > f ? 1 : 0));
-    d.add(e, a, f)
-  }
-};
-mxStackLayout.prototype.getParentSize = function(a) {
-  var b = this.graph.getModel(),
-    c = b.getGeometry(a);
-  if (null != this.graph.container && (null == c && b.isLayer(a) || a == this.graph.getView().currentRoot)) c = new mxRectangle(0, 0, this.graph.container.offsetWidth - 1, this.graph.container.offsetHeight -
-    1);
-  return c
-};
-mxStackLayout.prototype.execute = function(a) {
-  if (null != a) {
-    var b = this.isHorizontal(),
-      c = this.graph.getModel(),
-      d = this.getParentSize(a),
-      e = 0;
-    null != d && (e = b ? d.height : d.width);
-    var e = e - (2 * this.spacing + 2 * this.border),
-      f = this.x0 + this.border,
-      g = this.y0 + this.border;
-    if (this.graph.isSwimlane(a)) {
-      var h = this.graph.getCellStyle(a),
-        k = mxUtils.getValue(h, mxConstants.STYLE_STARTSIZE, mxConstants.DEFAULT_STARTSIZE),
-        h = mxUtils.getValue(h, mxConstants.STYLE_HORIZONTAL, !0);
-      b == h && (e -= k);
-      b ? g += k : f += k
-    }
-    c.beginUpdate();
-    try {
-      for (var k = 0,
-          h = null, l = c.getChildCount(a), m = 0; m < l; m++) {
-        var n = c.getChildAt(a, m);
-        if (!this.isVertexIgnored(n) && this.isVertexMovable(n)) {
-          var p = c.getGeometry(n);
-          if (null != p) {
-            p = p.clone();
-            if (null != this.wrap && null != h && (b && h.x + h.width + p.width + 2 * this.spacing > this.wrap || !b && h.y + h.height + p.height + 2 * this.spacing > this.wrap)) h = null, b ? g +=
-              k + this.spacing : f += k + this.spacing, k = 0;
-            k = Math.max(k, b ? p.height : p.width);
-            null != h ? b ? p.x = h.x + h.width + this.spacing : p.y = h.y + h.height + this.spacing : this.keepFirstLocation || (b ? p.x = f : p.y = g);
-            b ? p.y = g : p.x = f;
-            this.fill && 0 < e && (b ? p.height = e : p.width = e);
-            c.setGeometry(n, p);
-            h = p
-          }
-        }
-      }
-      this.resizeParent && null != d && null != h && !this.graph.isCellCollapsed(a) ? (d = d.clone(), b ? d.width = h.x + h.width + this.spacing : d.height = h.y + h.height + this.spacing, c.setGeometry(
-        a, d)) : this.resizeLast && (null != d && null != h) && (b ? h.width = d.width - h.x - this.spacing : h.height = d.height - h.y - this.spacing)
-    } finally {
-      c.endUpdate()
-    }
-  }
-};
-
-function mxPartitionLayout(a, b, c, d) {
-  mxGraphLayout.call(this, a);
-  this.horizontal = null != b ? b : !0;
-  this.spacing = c || 0;
-  this.border = d || 0
-}
-mxPartitionLayout.prototype = new mxGraphLayout;
-mxPartitionLayout.prototype.constructor = mxPartitionLayout;
-mxPartitionLayout.prototype.horizontal = null;
-mxPartitionLayout.prototype.spacing = null;
-mxPartitionLayout.prototype.border = null;
-mxPartitionLayout.prototype.resizeVertices = !0;
-mxPartitionLayout.prototype.isHorizontal = function() {
-  return this.horizontal
-};
-mxPartitionLayout.prototype.moveCell = function(a, b, c) {
-  c = this.graph.getModel();
-  var d = c.getParent(a);
-  if (null != a && null != d) {
-    for (var e = 0, f = 0, g = c.getChildCount(d), e = 0; e < g; e++) {
-      var h = c.getChildAt(d, e),
-        h = this.getVertexBounds(h);
-      if (null != h) {
-        h = h.x + h.width / 2;
-        if (f < b && h > b) break;
-        f = h
-      }
-    }
-    b = d.getIndex(a);
-    b = Math.max(0, e - (e > b ? 1 : 0));
-    c.add(d, a, b)
-  }
-};
-mxPartitionLayout.prototype.execute = function(a) {
-  var b = this.isHorizontal(),
-    c = this.graph.getModel(),
-    d = c.getGeometry(a);
-  if (null != this.graph.container && (null == d && c.isLayer(a) || a == this.graph.getView().currentRoot)) d = new mxRectangle(0, 0, this.graph.container.offsetWidth - 1, this.graph.container.offsetHeight -
-    1);
-  if (null != d) {
-    for (var e = [], f = c.getChildCount(a), g = 0; g < f; g++) {
-      var h = c.getChildAt(a, g);
-      !this.isVertexIgnored(h) && this.isVertexMovable(h) && e.push(h)
-    }
-    f = e.length;
-    if (0 < f) {
-      var k = this.border,
-        l = this.border,
-        m = b ?
-        d.height : d.width,
-        m = m - 2 * this.border;
-      a = this.graph.isSwimlane(a) ? this.graph.getStartSize(a) : new mxRectangle;
-      m -= b ? a.height : a.width;
-      k += a.width;
-      l += a.height;
-      a = this.border + (f - 1) * this.spacing;
-      d = b ? (d.width - k - a) / f : (d.height - l - a) / f;
-      if (0 < d) {
-        c.beginUpdate();
-        try {
-          for (g = 0; g < f; g++) {
-            var h = e[g],
-              n = c.getGeometry(h);
-            null != n && (n = n.clone(), n.x = k, n.y = l, b ? (this.resizeVertices && (n.width = d, n.height = m), k += d + this.spacing) : (this.resizeVertices && (n.height = d, n.width = m), l +=
-              d + this.spacing), c.setGeometry(h, n))
-          }
-        } finally {
-          c.endUpdate()
-        }
-      }
-    }
-  }
-};
-
-function mxCompactTreeLayout(a, b, c) {
-  mxGraphLayout.call(this, a);
-  this.horizontal = null != b ? b : !0;
-  this.invert = null != c ? c : !1
-}
-mxCompactTreeLayout.prototype = new mxGraphLayout;
-mxCompactTreeLayout.prototype.constructor = mxCompactTreeLayout;
-mxCompactTreeLayout.prototype.horizontal = null;
-mxCompactTreeLayout.prototype.invert = null;
-mxCompactTreeLayout.prototype.resizeParent = !0;
-mxCompactTreeLayout.prototype.groupPadding = 10;
-mxCompactTreeLayout.prototype.parentsChanged = null;
-mxCompactTreeLayout.prototype.moveTree = !1;
-mxCompactTreeLayout.prototype.levelDistance = 10;
-mxCompactTreeLayout.prototype.nodeDistance = 20;
-mxCompactTreeLayout.prototype.resetEdges = !0;
-mxCompactTreeLayout.prototype.prefHozEdgeSep = 5;
-mxCompactTreeLayout.prototype.prefVertEdgeOff = 4;
-mxCompactTreeLayout.prototype.minEdgeJetty = 8;
-mxCompactTreeLayout.prototype.channelBuffer = 4;
-mxCompactTreeLayout.prototype.edgeRouting = !0;
-mxCompactTreeLayout.prototype.isVertexIgnored = function(a) {
-  return mxGraphLayout.prototype.isVertexIgnored.apply(this, arguments) || 0 == this.graph.getConnections(a).length
-};
-mxCompactTreeLayout.prototype.isHorizontal = function() {
-  return this.horizontal
-};
-mxCompactTreeLayout.prototype.execute = function(a, b) {
-  this.parent = a;
-  var c = this.graph.getModel();
-  if (null == b)
-    if (0 < this.graph.getEdges(a, c.getParent(a), this.invert, !this.invert, !1).length) b = a;
-    else {
-      var d = this.graph.findTreeRoots(a, !0, this.invert);
-      if (0 < d.length)
-        for (var e = 0; e < d.length; e++)
-          if (!this.isVertexIgnored(d[e]) && 0 < this.graph.getEdges(d[e], null, this.invert, !this.invert, !1).length) {
-            b = d[e];
-            break
-          }
-    }
-  if (null != b) {
-    this.parentsChanged = this.resizeParent ? {} : null;
-    c.beginUpdate();
-    try {
-      var f = this.dfs(b, a);
-      if (null !=
-        f) {
-        this.layout(f);
-        var g = this.graph.gridSize,
-          d = g;
-        if (!this.moveTree) {
-          var h = this.getVertexBounds(b);
-          null != h && (g = h.x, d = h.y)
-        }
-        h = null;
-        h = this.isHorizontal() ? this.horizontalLayout(f, g, d) : this.verticalLayout(f, null, g, d);
-        if (null != h) {
-          var k = e = 0;
-          0 > h.x && (e = Math.abs(g - h.x));
-          0 > h.y && (k = Math.abs(d - h.y));
-          (0 != e || 0 != k) && this.moveNode(f, e, k);
-          this.resizeParent && this.adjustParents();
-          this.edgeRouting && this.localEdgeProcessing(f)
-        }
-      }
-    } finally {
-      c.endUpdate()
-    }
-  }
-};
-mxCompactTreeLayout.prototype.moveNode = function(a, b, c) {
-  a.x += b;
-  a.y += c;
-  this.apply(a);
-  for (a = a.child; null != a;) this.moveNode(a, b, c), a = a.next
-};
-mxCompactTreeLayout.prototype.dfs = function(a, b, c) {
-  c = null != c ? c : [];
-  var d = mxCellPath.create(a),
-    e = null;
-  if (null != a && null == c[d] && !this.isVertexIgnored(a)) {
-    c[d] = a;
-    var e = this.createNode(a),
-      d = this.graph.getModel(),
-      f = null;
-    a = this.graph.getEdges(a, b, this.invert, !this.invert, !1, !0);
-    for (var g = this.graph.getView(), h = 0; h < a.length; h++) {
-      var k = a[h];
-      if (!this.isEdgeIgnored(k)) {
-        this.resetEdges && this.setEdgePoints(k, null);
-        this.edgeRouting && (this.setEdgeStyleEnabled(k, !1), this.setEdgePoints(k, null));
-        var l = g.getState(k),
-          k = null != l ? l.getVisibleTerminal(this.invert) : g.getVisibleTerminal(k, this.invert),
-          l = this.dfs(k, b, c);
-        null != l && null != d.getGeometry(k) && (null == f ? e.child = l : f.next = l, f = l)
-      }
-    }
-  }
-  return e
-};
-mxCompactTreeLayout.prototype.layout = function(a) {
-  if (null != a) {
-    for (var b = a.child; null != b;) this.layout(b), b = b.next;
-    null != a.child ? this.attachParent(a, this.join(a)) : this.layoutLeaf(a)
-  }
-};
-mxCompactTreeLayout.prototype.horizontalLayout = function(a, b, c, d) {
-  a.x += b + a.offsetX;
-  a.y += c + a.offsetY;
-  d = this.apply(a, d);
-  b = a.child;
-  if (null != b) {
-    d = this.horizontalLayout(b, a.x, a.y, d);
-    c = a.y + b.offsetY;
-    for (var e = b.next; null != e;) d = this.horizontalLayout(e, a.x + b.offsetX, c, d), c += e.offsetY, e = e.next
-  }
-  return d
-};
-mxCompactTreeLayout.prototype.verticalLayout = function(a, b, c, d, e) {
-  a.x += c + a.offsetY;
-  a.y += d + a.offsetX;
-  e = this.apply(a, e);
-  b = a.child;
-  if (null != b) {
-    e = this.verticalLayout(b, a, a.x, a.y, e);
-    c = a.x + b.offsetY;
-    for (d = b.next; null != d;) e = this.verticalLayout(d, a, c, a.y + b.offsetX, e), c += d.offsetY, d = d.next
-  }
-  return e
-};
-mxCompactTreeLayout.prototype.attachParent = function(a, b) {
-  var c = this.nodeDistance + this.levelDistance,
-    d = (b - a.width) / 2 - this.nodeDistance,
-    e = d + a.width + 2 * this.nodeDistance - b;
-  a.child.offsetX = c + a.height;
-  a.child.offsetY = e;
-  a.contour.upperHead = this.createLine(a.height, 0, this.createLine(c, e, a.contour.upperHead));
-  a.contour.lowerHead = this.createLine(a.height, 0, this.createLine(c, d, a.contour.lowerHead))
-};
-mxCompactTreeLayout.prototype.layoutLeaf = function(a) {
-  var b = 2 * this.nodeDistance;
-  a.contour.upperTail = this.createLine(a.height + b, 0);
-  a.contour.upperHead = a.contour.upperTail;
-  a.contour.lowerTail = this.createLine(0, -a.width - b);
-  a.contour.lowerHead = this.createLine(a.height + b, 0, a.contour.lowerTail)
-};
-mxCompactTreeLayout.prototype.join = function(a) {
-  var b = 2 * this.nodeDistance,
-    c = a.child;
-  a.contour = c.contour;
-  for (var d = c.width + b, e = d, c = c.next; null != c;) {
-    var f = this.merge(a.contour, c.contour);
-    c.offsetY = f + d;
-    c.offsetX = 0;
-    d = c.width + b;
-    e += f + d;
-    c = c.next
-  }
-  return e
-};
-mxCompactTreeLayout.prototype.merge = function(a, b) {
-  for (var c = 0, d = 0, e = 0, f = a.lowerHead, g = b.upperHead; null != g && null != f;) {
-    var h = this.offset(c, d, g.dx, g.dy, f.dx, f.dy),
-      d = d + h,
-      e = e + h;
-    c + g.dx <= f.dx ? (c += g.dx, d += g.dy, g = g.next) : (c -= f.dx, d -= f.dy, f = f.next)
-  }
-  null != g ? (c = this.bridge(a.upperTail, 0, 0, g, c, d), a.upperTail = null != c.next ? b.upperTail : c, a.lowerTail = b.lowerTail) : (c = this.bridge(b.lowerTail, c, d, f, 0, 0), null == c.next &&
-    (a.lowerTail = c));
-  a.lowerHead = b.lowerHead;
-  return e
-};
-mxCompactTreeLayout.prototype.offset = function(a, b, c, d, e, f) {
-  var g = 0;
-  if (e <= a || 0 >= a + c) return 0;
-  g = 0 < e * d - c * f ? 0 > a ? a * d / c - b : 0 < a ? a * f / e - b : -b : e < a + c ? f - (b + (e - a) * d / c) : e > a + c ? (c + a) * f / e - (b + d) : f - (b + d);
-  return 0 < g ? g : 0
-};
-mxCompactTreeLayout.prototype.bridge = function(a, b, c, d, e, f) {
-  b = e + d.dx - b;
-  e = e = 0;
-  0 == d.dx ? e = d.dy : (e = b * d.dy, e /= d.dx);
-  b = this.createLine(b, e, d.next);
-  a.next = this.createLine(0, f + d.dy - e - c, b);
-  return b
-};
-mxCompactTreeLayout.prototype.createNode = function(a) {
-  var b = {};
-  b.cell = a;
-  b.x = 0;
-  b.y = 0;
-  b.width = 0;
-  b.height = 0;
-  a = this.getVertexBounds(a);
-  null != a && (this.isHorizontal() ? (b.width = a.height, b.height = a.width) : (b.width = a.width, b.height = a.height));
-  b.offsetX = 0;
-  b.offsetY = 0;
-  b.contour = {};
-  return b
-};
-mxCompactTreeLayout.prototype.apply = function(a, b) {
-  var c = this.graph.getModel(),
-    d = a.cell,
-    e = c.getGeometry(d);
-  null != d && null != e && (this.isVertexMovable(d) && (e = this.setVertexLocation(d, a.x, a.y), this.resizeParent && (c = c.getParent(d), d = mxCellPath.create(c), null == this.parentsChanged[d] &&
-    (this.parentsChanged[d] = c))), b = null == b ? new mxRectangle(e.x, e.y, e.width, e.height) : new mxRectangle(Math.min(b.x, e.x), Math.min(b.y, e.y), Math.max(b.x + b.width, e.x + e.width),
-    Math.max(b.y + b.height, e.y + e.height)));
-  return b
-};
-mxCompactTreeLayout.prototype.createLine = function(a, b, c) {
-  var d = {};
-  d.dx = a;
-  d.dy = b;
-  d.next = c;
-  return d
-};
-mxCompactTreeLayout.prototype.adjustParents = function() {
-  var a = [],
-    b;
-  for (b in this.parentsChanged) a.push(this.parentsChanged[b]);
-  this.arrangeGroups(mxUtils.sortCells(a, !0), this.groupPadding)
-};
-mxCompactTreeLayout.prototype.localEdgeProcessing = function(a) {
-  this.processNodeOutgoing(a);
-  for (a = a.child; null != a;) this.localEdgeProcessing(a), a = a.next
-};
-mxCompactTreeLayout.prototype.processNodeOutgoing = function(a) {
-  for (var b = a.child, c = a.cell, d = 0, e = []; null != b;) {
-    d++;
-    var f = b.x;
-    this.horizontal && (f = b.y);
-    e.push(new WeightedCellSorter(b, f));
-    b = b.next
-  }
-  e.sort(WeightedCellSorter.prototype.compare);
-  var f = a.width,
-    g = (d + 1) * this.prefHozEdgeSep;
-  f > g + 2 * this.prefHozEdgeSep && (f -= 2 * this.prefHozEdgeSep);
-  a = f / d;
-  b = a / 2;
-  f > g + 2 * this.prefHozEdgeSep && (b += this.prefHozEdgeSep);
-  for (var f = this.minEdgeJetty - this.prefVertEdgeOff, g = 0, h = this.getVertexBounds(c), k = 0; k < e.length; k++) {
-    for (var l =
-        e[k].cell.cell, m = this.getVertexBounds(l), l = this.graph.getEdgesBetween(c, l, !1), n = [], p = 0, q = 0, s = 0; s < l.length; s++) this.horizontal ? (p = h.x + h.width, q = h.y + b, n.push(
-      new mxPoint(p, q)), p = h.x + h.width + f, n.push(new mxPoint(p, q)), q = m.y + m.height / 2) : (p = h.x + b, q = h.y + h.height, n.push(new mxPoint(p, q)), q = h.y + h.height + f, n.push(
-      new mxPoint(p, q)), p = m.x + m.width / 2), n.push(new mxPoint(p, q)), this.setEdgePoints(l[s], n);
-    k < d / 2 ? f += this.prefVertEdgeOff : k > d / 2 && (f -= this.prefVertEdgeOff);
-    b += a;
-    g = Math.max(g, f)
-  }
-};
-
-function WeightedCellSorter(a, b) {
-  this.cell = a;
-  this.weightedValue = b
-}
-WeightedCellSorter.prototype.weightedValue = 0;
-WeightedCellSorter.prototype.nudge = !1;
-WeightedCellSorter.prototype.visited = !1;
-WeightedCellSorter.prototype.rankIndex = null;
-WeightedCellSorter.prototype.cell = null;
-WeightedCellSorter.prototype.compare = function(a, b) {
-  return null != a && null != b ? b.weightedValue > a.weightedValue ? 1 : b.weightedValue < a.weightedValue ? -1 : b.nudge ? 1 : -1 : 0
-};
-
-function mxFastOrganicLayout(a) {
-  mxGraphLayout.call(this, a)
-}
-mxFastOrganicLayout.prototype = new mxGraphLayout;
-mxFastOrganicLayout.prototype.constructor = mxFastOrganicLayout;
-mxFastOrganicLayout.prototype.useInputOrigin = !0;
-mxFastOrganicLayout.prototype.resetEdges = !0;
-mxFastOrganicLayout.prototype.disableEdgeStyle = !0;
-mxFastOrganicLayout.prototype.forceConstant = 50;
-mxFastOrganicLayout.prototype.forceConstantSquared = 0;
-mxFastOrganicLayout.prototype.minDistanceLimit = 2;
-mxFastOrganicLayout.prototype.maxDistanceLimit = 500;
-mxFastOrganicLayout.prototype.minDistanceLimitSquared = 4;
-mxFastOrganicLayout.prototype.initialTemp = 200;
-mxFastOrganicLayout.prototype.temperature = 0;
-mxFastOrganicLayout.prototype.maxIterations = 0;
-mxFastOrganicLayout.prototype.iteration = 0;
-mxFastOrganicLayout.prototype.allowedToRun = !0;
-mxFastOrganicLayout.prototype.isVertexIgnored = function(a) {
-  return mxGraphLayout.prototype.isVertexIgnored.apply(this, arguments) || 0 == this.graph.getConnections(a).length
-};
-mxFastOrganicLayout.prototype.execute = function(a) {
-  var b = this.graph.getModel();
-  this.vertexArray = [];
-  for (var c = this.graph.getChildVertices(a), d = 0; d < c.length; d++) this.isVertexIgnored(c[d]) || this.vertexArray.push(c[d]);
-  var e = this.useInputOrigin ? this.graph.view.getBounds(this.vertexArray) : null,
-    f = this.vertexArray.length;
-  this.indices = [];
-  this.dispX = [];
-  this.dispY = [];
-  this.cellLocation = [];
-  this.isMoveable = [];
-  this.neighbours = [];
-  this.radius = [];
-  this.radiusSquared = [];
-  0.0010 > this.forceConstant && (this.forceConstant =
-    0.0010);
-  this.forceConstantSquared = this.forceConstant * this.forceConstant;
-  for (d = 0; d < this.vertexArray.length; d++) {
-    var g = this.vertexArray[d];
-    this.cellLocation[d] = [];
-    var h = mxCellPath.create(g);
-    this.indices[h] = d;
-    var k = this.getVertexBounds(g),
-      l = k.width,
-      m = k.height,
-      n = k.x,
-      p = k.y;
-    this.cellLocation[d][0] = n + l / 2;
-    this.cellLocation[d][1] = p + m / 2;
-    this.radius[d] = Math.min(l, m);
-    this.radiusSquared[d] = this.radius[d] * this.radius[d]
-  }
-  b.beginUpdate();
-  try {
-    for (d = 0; d < f; d++) {
-      this.dispX[d] = 0;
-      this.dispY[d] = 0;
-      this.isMoveable[d] = this.isVertexMovable(this.vertexArray[d]);
-      var q = this.graph.getConnections(this.vertexArray[d], a),
-        c = this.graph.getOpposites(q, this.vertexArray[d]);
-      this.neighbours[d] = [];
-      for (l = 0; l < c.length; l++) {
-        this.resetEdges && this.graph.resetEdge(q[l]);
-        this.disableEdgeStyle && this.setEdgeStyleEnabled(q[l], !1);
-        var h = mxCellPath.create(c[l]),
-          s = this.indices[h];
-        this.neighbours[d][l] = null != s ? s : d
-      }
-    }
-    this.temperature = this.initialTemp;
-    0 == this.maxIterations && (this.maxIterations = 20 * Math.sqrt(f));
-    for (this.iteration = 0; this.iteration < this.maxIterations; this.iteration++) {
-      if (!this.allowedToRun) return;
-      this.calcRepulsion();
-      this.calcAttraction();
-      this.calcPositions();
-      this.reduceTemperature()
-    }
-    a = c = null;
-    for (d = 0; d < this.vertexArray.length; d++) g = this.vertexArray[d], this.isVertexMovable(g) && (k = this.getVertexBounds(g), null != k && (this.cellLocation[d][0] -= k.width / 2, this.cellLocation[
-        d][1] -= k.height / 2, n = this.graph.snap(this.cellLocation[d][0]), p = this.graph.snap(this.cellLocation[d][1]), this.setVertexLocation(g, n, p), c = null == c ? n : Math.min(c, n), a =
-      null == a ? p : Math.min(a, p)));
-    d = -(c || 0) + 1;
-    g = -(a || 0) + 1;
-    null != e && (d += e.x,
-      g += e.y);
-    this.graph.moveCells(this.vertexArray, d, g)
-  } finally {
-    b.endUpdate()
-  }
-};
-mxFastOrganicLayout.prototype.calcPositions = function() {
-  for (var a = 0; a < this.vertexArray.length; a++)
-    if (this.isMoveable[a]) {
-      var b = Math.sqrt(this.dispX[a] * this.dispX[a] + this.dispY[a] * this.dispY[a]);
-      0.0010 > b && (b = 0.0010);
-      var c = this.dispX[a] / b * Math.min(b, this.temperature),
-        b = this.dispY[a] / b * Math.min(b, this.temperature);
-      this.dispX[a] = 0;
-      this.dispY[a] = 0;
-      this.cellLocation[a][0] += c;
-      this.cellLocation[a][1] += b
-    }
-};
-mxFastOrganicLayout.prototype.calcAttraction = function() {
-  for (var a = 0; a < this.vertexArray.length; a++)
-    for (var b = 0; b < this.neighbours[a].length; b++) {
-      var c = this.neighbours[a][b];
-      if (a != c && this.isMoveable[a] && this.isMoveable[c]) {
-        var d = this.cellLocation[a][0] - this.cellLocation[c][0],
-          e = this.cellLocation[a][1] - this.cellLocation[c][1],
-          f = d * d + e * e - this.radiusSquared[a] - this.radiusSquared[c];
-        f < this.minDistanceLimitSquared && (f = this.minDistanceLimitSquared);
-        var g = Math.sqrt(f),
-          f = f / this.forceConstant,
-          d = d / g * f,
-          e = e / g * f;
-        this.dispX[a] -= d;
-        this.dispY[a] -= e;
-        this.dispX[c] += d;
-        this.dispY[c] += e
-      }
-    }
-};
-mxFastOrganicLayout.prototype.calcRepulsion = function() {
-  for (var a = this.vertexArray.length, b = 0; b < a; b++)
-    for (var c = b; c < a; c++) {
-      if (!this.allowedToRun) return;
-      if (c != b && this.isMoveable[b] && this.isMoveable[c]) {
-        var d = this.cellLocation[b][0] - this.cellLocation[c][0],
-          e = this.cellLocation[b][1] - this.cellLocation[c][1];
-        0 == d && (d = 0.01 + Math.random());
-        0 == e && (e = 0.01 + Math.random());
-        var f = Math.sqrt(d * d + e * e),
-          g = f - this.radius[b] - this.radius[c];
-        g > this.maxDistanceLimit || (g < this.minDistanceLimit && (g = this.minDistanceLimit), g = this.forceConstantSquared /
-          g, d = d / f * g, e = e / f * g, this.dispX[b] += d, this.dispY[b] += e, this.dispX[c] -= d, this.dispY[c] -= e)
-      }
-    }
-};
-mxFastOrganicLayout.prototype.reduceTemperature = function() {
-  this.temperature = this.initialTemp * (1 - this.iteration / this.maxIterations)
-};
-
-function mxCircleLayout(a, b) {
-  mxGraphLayout.call(this, a);
-  this.radius = null != b ? b : 100
-}
-mxCircleLayout.prototype = new mxGraphLayout;
-mxCircleLayout.prototype.constructor = mxCircleLayout;
-mxCircleLayout.prototype.radius = null;
-mxCircleLayout.prototype.moveCircle = !1;
-mxCircleLayout.prototype.x0 = 0;
-mxCircleLayout.prototype.y0 = 0;
-mxCircleLayout.prototype.resetEdges = !0;
-mxCircleLayout.prototype.disableEdgeStyle = !0;
-mxCircleLayout.prototype.execute = function(a) {
-  var b = this.graph.getModel();
-  b.beginUpdate();
-  try {
-    for (var c = 0, d = null, e = null, f = [], g = b.getChildCount(a), h = 0; h < g; h++) {
-      var k = b.getChildAt(a, h);
-      if (this.isVertexIgnored(k)) this.isEdgeIgnored(k) || (this.resetEdges && this.graph.resetEdge(k), this.disableEdgeStyle && this.setEdgeStyleEnabled(k, !1));
-      else {
-        f.push(k);
-        var l = this.getVertexBounds(k),
-          d = null == d ? l.y : Math.min(d, l.y),
-          e = null == e ? l.x : Math.min(e, l.x),
-          c = Math.max(c, Math.max(l.width, l.height))
-      }
-    }
-    var m = this.getRadius(f.length,
-      c);
-    this.moveCircle && (e = this.x0, d = this.y0);
-    this.circle(f, m, e, d)
-  } finally {
-    b.endUpdate()
-  }
-};
-mxCircleLayout.prototype.getRadius = function(a, b) {
-  return Math.max(a * b / Math.PI, this.radius)
-};
-mxCircleLayout.prototype.circle = function(a, b, c, d) {
-  for (var e = a.length, f = 2 * Math.PI / e, g = 0; g < e; g++) this.isVertexMovable(a[g]) && this.setVertexLocation(a[g], c + b + b * Math.sin(g * f), d + b + b * Math.cos(g * f))
-};
-
-function mxParallelEdgeLayout(a) {
-  mxGraphLayout.call(this, a)
-}
-mxParallelEdgeLayout.prototype = new mxGraphLayout;
-mxParallelEdgeLayout.prototype.constructor = mxParallelEdgeLayout;
-mxParallelEdgeLayout.prototype.spacing = 20;
-mxParallelEdgeLayout.prototype.execute = function(a) {
-  a = this.findParallels(a);
-  this.graph.model.beginUpdate();
-  try {
-    for (var b in a) {
-      var c = a[b];
-      1 < c.length && this.layout(c)
-    }
-  } finally {
-    this.graph.model.endUpdate()
-  }
-};
-mxParallelEdgeLayout.prototype.findParallels = function(a) {
-  for (var b = this.graph.getModel(), c = [], d = b.getChildCount(a), e = 0; e < d; e++) {
-    var f = b.getChildAt(a, e);
-    if (!this.isEdgeIgnored(f)) {
-      var g = this.getEdgeId(f);
-      null != g && (null == c[g] && (c[g] = []), c[g].push(f))
-    }
-  }
-  return c
-};
-mxParallelEdgeLayout.prototype.getEdgeId = function(a) {
-  var b = this.graph.getView(),
-    c = b.getState(a),
-    d = null != c ? c.getVisibleTerminal(!0) : b.getVisibleTerminal(a, !0);
-  a = null != c ? c.getVisibleTerminal(!1) : b.getVisibleTerminal(a, !1);
-  return null != d && null != a ? (d = mxCellPath.create(d), a = mxCellPath.create(a), d > a ? a + "-" + d : d + "-" + a) : null
-};
-mxParallelEdgeLayout.prototype.layout = function(a) {
-  var b = a[0],
-    c = this.graph.getModel(),
-    d = c.getGeometry(c.getTerminal(b, !0)),
-    e = c.getGeometry(c.getTerminal(b, !1));
-  if (d == e)
-    for (var b = d.x + d.width + this.spacing, c = d.y + d.height / 2, f = 0; f < a.length; f++) this.route(a[f], b, c), b += this.spacing;
-  else if (null != d && null != e)
-    for (var b = d.x + d.width / 2, c = d.y + d.height / 2, f = e.x + e.width / 2 - b, g = e.y + e.height / 2 - c, e = Math.sqrt(f * f + g * g), d = g * this.spacing / e, e = f * this.spacing / e,
-        b = b + f / 2 + d * (a.length - 1) / 2, c = c + g / 2 - e * (a.length - 1) / 2, f = 0; f < a.length; f++) this.route(a[f],
-      b, c), b -= d, c += e
-};
-mxParallelEdgeLayout.prototype.route = function(a, b, c) {
-  this.graph.isCellMovable(a) && this.setEdgePoints(a, [new mxPoint(b, c)])
-};
-
-function mxCompositeLayout(a, b, c) {
-  mxGraphLayout.call(this, a);
-  this.layouts = b;
-  this.master = c
-}
-mxCompositeLayout.prototype = new mxGraphLayout;
-mxCompositeLayout.prototype.constructor = mxCompositeLayout;
-mxCompositeLayout.prototype.layouts = null;
-mxCompositeLayout.prototype.master = null;
-mxCompositeLayout.prototype.moveCell = function(a, b, c) {
-  null != this.master ? this.master.move.apply(this.master, arguments) : this.layouts[0].move.apply(this.layouts[0], arguments)
-};
-mxCompositeLayout.prototype.execute = function(a) {
-  var b = this.graph.getModel();
-  b.beginUpdate();
-  try {
-    for (var c = 0; c < this.layouts.length; c++) this.layouts[c].execute.apply(this.layouts[c], arguments)
-  } finally {
-    b.endUpdate()
-  }
-};
-
-function mxEdgeLabelLayout(a, b) {
-  mxGraphLayout.call(this, a)
-}
-mxEdgeLabelLayout.prototype = new mxGraphLayout;
-mxEdgeLabelLayout.prototype.constructor = mxEdgeLabelLayout;
-mxEdgeLabelLayout.prototype.execute = function(a) {
-  for (var b = this.graph.view, c = this.graph.getModel(), d = [], e = [], f = c.getChildCount(a), g = 0; g < f; g++) {
-    var h = c.getChildAt(a, g),
-      k = b.getState(h);
-    null != k && (this.isVertexIgnored(h) ? this.isEdgeIgnored(h) || d.push(k) : e.push(k))
-  }
-  this.placeLabels(e, d)
-};
-mxEdgeLabelLayout.prototype.placeLabels = function(a, b) {
-  var c = this.graph.getModel();
-  c.beginUpdate();
-  try {
-    for (var d = 0; d < b.length; d++) {
-      var e = b[d];
-      if (null != e && null != e.text && null != e.text.boundingBox)
-        for (var f = 0; f < a.length; f++) {
-          var g = a[f];
-          null != g && this.avoid(e, g)
-        }
-    }
-  } finally {
-    c.endUpdate()
-  }
-};
-mxEdgeLabelLayout.prototype.avoid = function(a, b) {
-  var c = this.graph.getModel(),
-    d = a.text.boundingBox;
-  if (mxUtils.intersects(d, b)) {
-    var e = -d.y - d.height + b.y,
-      f = -d.y + b.y + b.height,
-      e = Math.abs(e) < Math.abs(f) ? e : f,
-      f = -d.x - d.width + b.x,
-      d = -d.x + b.x + b.width,
-      d = Math.abs(f) < Math.abs(d) ? f : d;
-    Math.abs(d) < Math.abs(e) ? e = 0 : d = 0;
-    f = c.getGeometry(a.cell);
-    null != f && (f = f.clone(), null != f.offset ? (f.offset.x += d, f.offset.y += e) : f.offset = new mxPoint(d, e), c.setGeometry(a.cell, f))
-  }
-};
-
-function mxGraphAbstractHierarchyCell() {
-  this.x = [];
-  this.y = [];
-  this.temp = []
-}
-mxGraphAbstractHierarchyCell.prototype.maxRank = -1;
-mxGraphAbstractHierarchyCell.prototype.minRank = -1;
-mxGraphAbstractHierarchyCell.prototype.x = null;
-mxGraphAbstractHierarchyCell.prototype.y = null;
-mxGraphAbstractHierarchyCell.prototype.width = 0;
-mxGraphAbstractHierarchyCell.prototype.height = 0;
-mxGraphAbstractHierarchyCell.prototype.nextLayerConnectedCells = null;
-mxGraphAbstractHierarchyCell.prototype.previousLayerConnectedCells = null;
-mxGraphAbstractHierarchyCell.prototype.temp = null;
-mxGraphAbstractHierarchyCell.prototype.getNextLayerConnectedCells = function(a) {
-  return null
-};
-mxGraphAbstractHierarchyCell.prototype.getPreviousLayerConnectedCells = function(a) {
-  return null
-};
-mxGraphAbstractHierarchyCell.prototype.isEdge = function() {
-  return !1
-};
-mxGraphAbstractHierarchyCell.prototype.isVertex = function() {
-  return !1
-};
-mxGraphAbstractHierarchyCell.prototype.getGeneralPurposeVariable = function(a) {
-  return null
-};
-mxGraphAbstractHierarchyCell.prototype.setGeneralPurposeVariable = function(a, b) {
-  return null
-};
-mxGraphAbstractHierarchyCell.prototype.setX = function(a, b) {
-  this.isVertex() ? this.x[0] = b : this.isEdge() && (this.x[a - this.minRank - 1] = b)
-};
-mxGraphAbstractHierarchyCell.prototype.getX = function(a) {
-  return this.isVertex() ? this.x[0] : this.isEdge() ? this.x[a - this.minRank - 1] : 0
-};
-mxGraphAbstractHierarchyCell.prototype.setY = function(a, b) {
-  this.isVertex() ? this.y[0] = b : this.isEdge() && (this.y[a - this.minRank - 1] = b)
-};
-
-function mxGraphHierarchyNode(a) {
-  mxGraphAbstractHierarchyCell.apply(this, arguments);
-  this.cell = a
-}
-mxGraphHierarchyNode.prototype = new mxGraphAbstractHierarchyCell;
-mxGraphHierarchyNode.prototype.constructor = mxGraphHierarchyNode;
-mxGraphHierarchyNode.prototype.cell = null;
-mxGraphHierarchyNode.prototype.connectsAsTarget = [];
-mxGraphHierarchyNode.prototype.connectsAsSource = [];
-mxGraphHierarchyNode.prototype.hashCode = !1;
-mxGraphHierarchyNode.prototype.getRankValue = function(a) {
-  return this.maxRank
-};
-mxGraphHierarchyNode.prototype.getNextLayerConnectedCells = function(a) {
-  if (null == this.nextLayerConnectedCells) {
-    this.nextLayerConnectedCells = [];
-    this.nextLayerConnectedCells[0] = [];
-    for (var b = 0; b < this.connectsAsTarget.length; b++) {
-      var c = this.connectsAsTarget[b]; - 1 == c.maxRank || c.maxRank == a + 1 ? this.nextLayerConnectedCells[0].push(c.source) : this.nextLayerConnectedCells[0].push(c)
-    }
-  }
-  return this.nextLayerConnectedCells[0]
-};
-mxGraphHierarchyNode.prototype.getPreviousLayerConnectedCells = function(a) {
-  if (null == this.previousLayerConnectedCells) {
-    this.previousLayerConnectedCells = [];
-    this.previousLayerConnectedCells[0] = [];
-    for (var b = 0; b < this.connectsAsSource.length; b++) {
-      var c = this.connectsAsSource[b]; - 1 == c.minRank || c.minRank == a - 1 ? this.previousLayerConnectedCells[0].push(c.target) : this.previousLayerConnectedCells[0].push(c)
-    }
-  }
-  return this.previousLayerConnectedCells[0]
-};
-mxGraphHierarchyNode.prototype.isVertex = function() {
-  return !0
-};
-mxGraphHierarchyNode.prototype.getGeneralPurposeVariable = function(a) {
-  return this.temp[0]
-};
-mxGraphHierarchyNode.prototype.setGeneralPurposeVariable = function(a, b) {
-  this.temp[0] = b
-};
-mxGraphHierarchyNode.prototype.isAncestor = function(a) {
-  if (null != a && null != this.hashCode && null != a.hashCode && this.hashCode.length < a.hashCode.length) {
-    if (this.hashCode == a.hashCode) return !0;
-    if (null == this.hashCode || null == this.hashCode) return !1;
-    for (var b = 0; b < this.hashCode.length; b++)
-      if (this.hashCode[b] != a.hashCode[b]) return !1;
-    return !0
-  }
-  return !1
-};
-mxGraphHierarchyNode.prototype.getCoreCell = function() {
-  return this.cell
-};
-
-function mxGraphHierarchyEdge(a) {
-  mxGraphAbstractHierarchyCell.apply(this, arguments);
-  this.edges = a
-}
-mxGraphHierarchyEdge.prototype = new mxGraphAbstractHierarchyCell;
-mxGraphHierarchyEdge.prototype.constructor = mxGraphHierarchyEdge;
-mxGraphHierarchyEdge.prototype.edges = null;
-mxGraphHierarchyEdge.prototype.source = null;
-mxGraphHierarchyEdge.prototype.target = null;
-mxGraphHierarchyEdge.prototype.isReversed = !1;
-mxGraphHierarchyEdge.prototype.invert = function(a) {
-  a = this.source;
-  this.source = this.target;
-  this.target = a;
-  this.isReversed = !this.isReversed
-};
-mxGraphHierarchyEdge.prototype.getNextLayerConnectedCells = function(a) {
-  if (null == this.nextLayerConnectedCells) {
-    this.nextLayerConnectedCells = [];
-    for (var b = 0; b < this.temp.length; b++) this.nextLayerConnectedCells[b] = [], b == this.temp.length - 1 ? this.nextLayerConnectedCells[b].push(this.source) : this.nextLayerConnectedCells[b].push(
-      this)
-  }
-  return this.nextLayerConnectedCells[a - this.minRank - 1]
-};
-mxGraphHierarchyEdge.prototype.getPreviousLayerConnectedCells = function(a) {
-  if (null == this.previousLayerConnectedCells) {
-    this.previousLayerConnectedCells = [];
-    for (var b = 0; b < this.temp.length; b++) this.previousLayerConnectedCells[b] = [], 0 == b ? this.previousLayerConnectedCells[b].push(this.target) : this.previousLayerConnectedCells[b].push(
-      this)
-  }
-  return this.previousLayerConnectedCells[a - this.minRank - 1]
-};
-mxGraphHierarchyEdge.prototype.isEdge = function() {
-  return !0
-};
-mxGraphHierarchyEdge.prototype.getGeneralPurposeVariable = function(a) {
-  return this.temp[a - this.minRank - 1]
-};
-mxGraphHierarchyEdge.prototype.setGeneralPurposeVariable = function(a, b) {
-  this.temp[a - this.minRank - 1] = b
-};
-mxGraphHierarchyEdge.prototype.getCoreCell = function() {
-  return null != this.edges && 0 < this.edges.length ? this.edges[0] : null
-};
-
-function mxGraphHierarchyModel(a, b, c, d, e) {
-  a.getGraph();
-  this.tightenToSource = e;
-  this.roots = c;
-  this.parent = d;
-  this.vertexMapper = {};
-  this.edgeMapper = {};
-  this.maxRank = 0;
-  c = [];
-  null == b && (b = this.graph.getChildVertices(d));
-  this.maxRank = this.SOURCESCANSTARTRANK;
-  this.createInternalCells(a, b, c);
-  for (d = 0; d < b.length; d++) {
-    e = c[d].connectsAsSource;
-    for (var f = 0; f < e.length; f++) {
-      var g = e[f],
-        h = g.edges;
-      if (null != h && 0 < h.length) {
-        var h = h[0],
-          k = a.getVisibleTerminal(h, !1),
-          k = mxCellPath.create(k),
-          k = this.vertexMapper[k];
-        c[d] == k && (k = a.getVisibleTerminal(h, !0), k = mxCellPath.create(k), k = this.vertexMapper[k]);
-        null != k && c[d] != k && (g.target = k, 0 == k.connectsAsTarget.length && (k.connectsAsTarget = []), 0 > mxUtils.indexOf(k.connectsAsTarget, g) && k.connectsAsTarget.push(g))
-      }
-    }
-    c[d].temp[0] = 1
-  }
-}
-mxGraphHierarchyModel.prototype.maxRank = null;
-mxGraphHierarchyModel.prototype.vertexMapper = null;
-mxGraphHierarchyModel.prototype.edgeMapper = null;
-mxGraphHierarchyModel.prototype.ranks = null;
-mxGraphHierarchyModel.prototype.roots = null;
-mxGraphHierarchyModel.prototype.parent = null;
-mxGraphHierarchyModel.prototype.dfsCount = 0;
-mxGraphHierarchyModel.prototype.SOURCESCANSTARTRANK = 1E8;
-mxGraphHierarchyModel.prototype.tightenToSource = !1;
-mxGraphHierarchyModel.prototype.createInternalCells = function(a, b, c) {
-  for (var d = a.getGraph(), e = 0; e < b.length; e++) {
-    c[e] = new mxGraphHierarchyNode(b[e]);
-    var f = mxCellPath.create(b[e]);
-    this.vertexMapper[f] = c[e];
-    f = a.getEdges(b[e]);
-    c[e].connectsAsSource = [];
-    for (var g = 0; g < f.length; g++) {
-      var h = a.getVisibleTerminal(f[g], !1);
-      if (h != b[e] && h != b[e] && a.graph.model.isVertex(h) && !a.isVertexIgnored(h)) {
-        var k = a.getEdgesBetween(b[e], h, !1),
-          l = a.getEdgesBetween(b[e], h, !0),
-          h = mxCellPath.create(k[0]);
-        if (null != k && 0 < k.length && null ==
-          this.edgeMapper[h] && 2 * l.length >= k.length) {
-          for (var l = new mxGraphHierarchyEdge(k), m = 0; m < k.length; m++) {
-            var n = k[m],
-              h = mxCellPath.create(n);
-            this.edgeMapper[h] = l;
-            d.resetEdge(n);
-            a.disableEdgeStyle && (a.setEdgeStyleEnabled(n, !1), a.setOrthogonalEdge(n, !0))
-          }
-          l.source = c[e];
-          0 > mxUtils.indexOf(c[e].connectsAsSource, l) && c[e].connectsAsSource.push(l)
-        }
-      }
-    }
-    c[e].temp[0] = 0
-  }
-};
-mxGraphHierarchyModel.prototype.initialRank = function() {
-  var a = [];
-  if (null != this.roots)
-    for (var b = 0; b < this.roots.length; b++) {
-      var c = mxCellPath.create(this.roots[b]),
-        c = this.vertexMapper[c];
-      null != c && a.push(c)
-    }
-  for (var d in this.vertexMapper) c = this.vertexMapper[d], c.temp[0] = -1;
-  for (var e = a.slice(); 0 < a.length;) {
-    var c = a[0],
-      f, g;
-    f = c.connectsAsTarget;
-    g = c.connectsAsSource;
-    for (var h = !0, k = this.SOURCESCANSTARTRANK, b = 0; b < f.length; b++) {
-      var l = f[b];
-      if (5270620 == l.temp[0]) l = l.source, k = Math.min(k, l.temp[0] - 1);
-      else {
-        h = !1;
-        break
-      }
-    }
-    if (h) {
-      c.temp[0] =
-        k;
-      this.maxRank = Math.min(this.maxRank, k);
-      if (null != g)
-        for (b = 0; b < g.length; b++) l = g[b], l.temp[0] = 5270620, l = l.target, -1 == l.temp[0] && (a.push(l), l.temp[0] = -2);
-      a.shift()
-    } else if (b = a.shift(), a.push(c), b == c && 1 == a.length) break
-  }
-  for (d in this.vertexMapper) c = this.vertexMapper[d], c.temp[0] -= this.maxRank;
-  for (b = 0; b < e.length; b++) {
-    c = e[b];
-    a = 0;
-    f = c.connectsAsSource;
-    for (d = 0; d < f.length; d++) l = f[d], l = l.target, c.temp[0] = Math.max(a, l.temp[0] + 1), a = c.temp[0]
-  }
-  this.maxRank = this.SOURCESCANSTARTRANK - this.maxRank
-};
-mxGraphHierarchyModel.prototype.fixRanks = function() {
-  var a = [];
-  this.ranks = [];
-  for (var b = 0; b < this.maxRank + 1; b++) a[b] = [], this.ranks[b] = a[b];
-  var c = null;
-  if (null != this.roots)
-    for (var d = this.roots, c = [], b = 0; b < d.length; b++) {
-      var e = mxCellPath.create(d[b]);
-      c[b] = this.vertexMapper[e]
-    }
-  this.visit(function(b, c, d, e, l) {
-    0 == l && (0 > c.maxRank && 0 > c.minRank) && (a[c.temp[0]].push(c), c.maxRank = c.temp[0], c.minRank = c.temp[0], c.temp[0] = a[c.maxRank].length - 1);
-    if (null != b && null != d && 1 < b.maxRank - c.maxRank) {
-      d.maxRank = b.maxRank;
-      d.minRank =
-        c.maxRank;
-      d.temp = [];
-      d.x = [];
-      d.y = [];
-      for (b = d.minRank + 1; b < d.maxRank; b++) a[b].push(d), d.setGeneralPurposeVariable(b, a[b].length - 1)
-    }
-  }, c, !1, null)
-};
-mxGraphHierarchyModel.prototype.visit = function(a, b, c, d) {
-  if (null != b) {
-    for (var e = 0; e < b.length; e++) {
-      var f = b[e];
-      null != f && (null == d && (d = {}), c ? (f.hashCode = [], f.hashCode[0] = this.dfsCount, f.hashCode[1] = e, this.extendedDfs(null, f, null, a, d, f.hashCode, e, 0)) : this.dfs(null, f, null,
-        a, d, 0))
-    }
-    this.dfsCount++
-  }
-};
-mxGraphHierarchyModel.prototype.dfs = function(a, b, c, d, e, f) {
-  if (null != b) {
-    var g = mxCellPath.create(b.cell);
-    if (null == e[g]) {
-      e[g] = b;
-      d(a, b, c, f, 0);
-      a = b.connectsAsSource.slice();
-      for (c = 0; c < a.length; c++) g = a[c], this.dfs(b, g.target, g, d, e, f + 1)
-    } else d(a, b, c, f, 1)
-  }
-};
-mxGraphHierarchyModel.prototype.extendedDfs = function(a, b, c, d, e, f, g, h) {
-  if (null != b) {
-    if (null != a && (null == b.hashCode || b.hashCode[0] != a.hashCode[0])) f = a.hashCode.length + 1, b.hashCode = a.hashCode.slice(), b.hashCode[f - 1] = g;
-    g = mxCellPath.create(b.cell);
-    if (null == e[g]) {
-      e[g] = b;
-      d(a, b, c, h, 0);
-      a = b.connectsAsSource.slice();
-      for (c = 0; c < a.length; c++) g = a[c], this.extendedDfs(b, g.target, g, d, e, b.hashCode, c, h + 1)
-    } else d(a, b, c, h, 1)
-  }
-};
-
-function mxHierarchicalLayoutStage() {}
-mxHierarchicalLayoutStage.prototype.execute = function(a) {};
-
-function mxMedianHybridCrossingReduction(a) {
-  this.layout = a
-}
-mxMedianHybridCrossingReduction.prototype = new mxHierarchicalLayoutStage;
-mxMedianHybridCrossingReduction.prototype.constructor = mxMedianHybridCrossingReduction;
-mxMedianHybridCrossingReduction.prototype.layout = null;
-mxMedianHybridCrossingReduction.prototype.maxIterations = 24;
-mxMedianHybridCrossingReduction.prototype.nestedBestRanks = null;
-mxMedianHybridCrossingReduction.prototype.currentBestCrossings = 0;
-mxMedianHybridCrossingReduction.prototype.iterationsWithoutImprovement = 0;
-mxMedianHybridCrossingReduction.prototype.maxNoImprovementIterations = 2;
-mxMedianHybridCrossingReduction.prototype.execute = function(a) {
-  a = this.layout.getModel();
-  this.nestedBestRanks = [];
-  for (var b = 0; b < a.ranks.length; b++) this.nestedBestRanks[b] = a.ranks[b].slice();
-  for (var c = 0, d = this.calculateCrossings(a), b = 0; b < this.maxIterations && c < this.maxNoImprovementIterations; b++) {
-    this.weightedMedian(b, a);
-    this.transpose(b, a);
-    var e = this.calculateCrossings(a);
-    if (e < d) {
-      d = e;
-      for (e = c = 0; e < this.nestedBestRanks.length; e++)
-        for (var f = a.ranks[e], g = 0; g < f.length; g++) {
-          var h = f[g];
-          this.nestedBestRanks[e][h.getGeneralPurposeVariable(e)] =
-            h
-        }
-    } else {
-      c++;
-      for (e = 0; e < this.nestedBestRanks.length; e++) {
-        f = a.ranks[e];
-        for (g = 0; g < f.length; g++) h = f[g], h.setGeneralPurposeVariable(e, g)
-      }
-    }
-    if (0 == d) break
-  }
-  c = [];
-  d = [];
-  for (b = 0; b < a.maxRank + 1; b++) d[b] = [], c[b] = d[b];
-  for (b = 0; b < this.nestedBestRanks.length; b++)
-    for (e = 0; e < this.nestedBestRanks[b].length; e++) d[b].push(this.nestedBestRanks[b][e]);
-  a.ranks = c
-};
-mxMedianHybridCrossingReduction.prototype.calculateCrossings = function(a) {
-  for (var b = a.ranks.length, c = 0, d = 1; d < b; d++) c += this.calculateRankCrossing(d, a);
-  return c
-};
-mxMedianHybridCrossingReduction.prototype.calculateRankCrossing = function(a, b) {
-  for (var c = 0, d = b.ranks[a], e = d.length, f = b.ranks[a - 1].length, g = [], h = 0; h < e; h++) g[h] = [];
-  for (h = 0; h < d.length; h++)
-    for (var k = d[h], l = k.getGeneralPurposeVariable(a), m = k.getPreviousLayerConnectedCells(a), k = 0; k < m.length; k++) {
-      var n = m[k].getGeneralPurposeVariable(a - 1);
-      g[l][n] = 201207
-    }
-  for (h = 0; h < e; h++)
-    for (k = 0; k < f; k++)
-      if (201207 == g[h][k]) {
-        for (d = h + 1; d < e; d++)
-          for (l = 0; l < k; l++) 201207 == g[d][l] && c++;
-        for (d = 0; d < h; d++)
-          for (l = k + 1; l < f; l++) 201207 == g[d][l] &&
-            c++
-      }
-  return c / 2
-};
-mxMedianHybridCrossingReduction.prototype.transpose = function(a, b) {
-  for (var c = !0, d = 0; c && 10 > d++;)
-    for (var e = 1 == a % 2 && 1 == d % 2, c = !1, f = 0; f < b.ranks.length; f++) {
-      for (var g = b.ranks[f], h = [], k = 0; k < g.length; k++) {
-        var l = g[k],
-          m = l.getGeneralPurposeVariable(f);
-        0 > m && (m = k);
-        h[m] = l
-      }
-      for (var n = m = l = null, p = null, q = null, s = null, r = null, t = null, v = null, w = null, k = 0; k < g.length - 1; k++) {
-        if (0 == k) {
-          for (var v = h[k], l = v.getNextLayerConnectedCells(f), m = v.getPreviousLayerConnectedCells(f), q = [], s = [], u = 0; u < l.length; u++) q[u] = l[u].getGeneralPurposeVariable(f + 1);
-          for (u = 0; u < m.length; u++) s[u] = m[u].getGeneralPurposeVariable(f - 1)
-        } else l = n, m = p, q = r, s = t, v = w;
-        w = h[k + 1];
-        n = w.getNextLayerConnectedCells(f);
-        p = w.getPreviousLayerConnectedCells(f);
-        r = [];
-        t = [];
-        for (u = 0; u < n.length; u++) r[u] = n[u].getGeneralPurposeVariable(f + 1);
-        for (u = 0; u < p.length; u++) t[u] = p[u].getGeneralPurposeVariable(f - 1);
-        for (var y = 0, z = 0, u = 0; u < q.length; u++)
-          for (var x = 0; x < r.length; x++) q[u] > r[x] && y++, q[u] < r[x] && z++;
-        for (u = 0; u < s.length; u++)
-          for (x = 0; x < t.length; x++) s[u] > t[x] && y++, s[u] < t[x] && z++;
-        if (z < y || z == y && e) n = v.getGeneralPurposeVariable(f),
-          v.setGeneralPurposeVariable(f, w.getGeneralPurposeVariable(f)), w.setGeneralPurposeVariable(f, n), n = l, p = m, r = q, t = s, w = v, e || (c = !0)
-      }
-    }
-};
-mxMedianHybridCrossingReduction.prototype.weightedMedian = function(a, b) {
-  var c = 0 == a % 2;
-  if (c)
-    for (var d = b.maxRank - 1; 0 <= d; d--) this.medianRank(d, c);
-  else
-    for (d = 1; d < b.maxRank; d++) this.medianRank(d, c)
-};
-mxMedianHybridCrossingReduction.prototype.medianRank = function(a, b) {
-  for (var c = this.nestedBestRanks[a].length, d = [], e = [], f = 0; f < c; f++) {
-    var g = this.nestedBestRanks[a][f],
-      h = new MedianCellSorter;
-    h.cell = g;
-    var k;
-    k = b ? g.getNextLayerConnectedCells(a) : g.getPreviousLayerConnectedCells(a);
-    var l;
-    l = b ? a + 1 : a - 1;
-    null != k && 0 != k.length ? (h.medianValue = this.medianValue(k, l), d.push(h)) : e[g.getGeneralPurposeVariable(a)] = !0
-  }
-  d.sort(MedianCellSorter.prototype.compare);
-  for (f = 0; f < c; f++) null == e[f] && (g = d.shift().cell, g.setGeneralPurposeVariable(a,
-    f))
-};
-mxMedianHybridCrossingReduction.prototype.medianValue = function(a, b) {
-  for (var c = [], d = 0, e = 0; e < a.length; e++) {
-    var f = a[e];
-    c[d++] = f.getGeneralPurposeVariable(b)
-  }
-  c.sort(function(a, b) {
-    return a - b
-  });
-  if (1 == d % 2) return c[Math.floor(d / 2)];
-  if (2 == d) return (c[0] + c[1]) / 2;
-  e = d / 2;
-  f = c[e - 1] - c[0];
-  d = c[d - 1] - c[e];
-  return (c[e - 1] * d + c[e] * f) / (f + d)
-};
-
-function MedianCellSorter() {}
-MedianCellSorter.prototype.medianValue = 0;
-MedianCellSorter.prototype.cell = !1;
-MedianCellSorter.prototype.compare = function(a, b) {
-  return null != a && null != b ? b.medianValue > a.medianValue ? -1 : b.medianValue < a.medianValue ? 1 : 0 : 0
-};
-
-function mxMinimumCycleRemover(a) {
-  this.layout = a
-}
-mxMinimumCycleRemover.prototype = new mxHierarchicalLayoutStage;
-mxMinimumCycleRemover.prototype.constructor = mxMinimumCycleRemover;
-mxMinimumCycleRemover.prototype.layout = null;
-mxMinimumCycleRemover.prototype.execute = function(a) {
-  var b = this.layout.getModel(),
-    c = {},
-    d = mxUtils.clone(b.vertexMapper, null, !0),
-    e = null;
-  if (null != b.roots) {
-    var f = b.roots,
-      e = [];
-    for (a = 0; a < f.length; a++) {
-      var g = mxCellPath.create(f[a]);
-      e[a] = b.vertexMapper[g]
-    }
-  }
-  b.visit(function(a, b, e, f, g) {
-    b.isAncestor(a) && (e.invert(), mxUtils.remove(e, a.connectsAsSource), a.connectsAsTarget.push(e), mxUtils.remove(e, b.connectsAsTarget), b.connectsAsSource.push(e));
-    a = mxCellPath.create(b.cell);
-    c[a] = b;
-    delete d[a]
-  }, e, !0, null);
-  e = null;
-  0 <
-    d.lenth && (e = mxUtils.clone(d, null, !0));
-  a = mxUtils.clone(c, null, !0);
-  b.visit(function(a, b, e, f, g) {
-    b.isAncestor(a) && (e.invert(), mxUtils.remove(e, a.connectsAsSource), b.connectsAsSource.push(e), a.connectsAsTarget.push(e), mxUtils.remove(e, b.connectsAsTarget));
-    a = mxCellPath.create(b.cell);
-    c[a] = b;
-    delete d[a]
-  }, d, !0, a);
-  f = this.layout.getGraph();
-  if (null != e && 0 < e.length) {
-    b = b.roots;
-    for (a = 0; a < e.length; a++) g = e[a].cell, 0 == f.getIncomingEdges(g).length && b.push(g)
-  }
-};
-
-function mxCoordinateAssignment(a, b, c, d, e, f) {
-  this.layout = a;
-  this.intraCellSpacing = b;
-  this.interRankCellSpacing = c;
-  this.orientation = d;
-  this.initialX = e;
-  this.parallelEdgeSpacing = f
-}
-var mxHierarchicalEdgeStyle = {
-  ORTHOGONAL: 1,
-  POLYLINE: 2,
-  STRAIGHT: 3,
-  CURVE: 4
-};
-mxCoordinateAssignment.prototype = new mxHierarchicalLayoutStage;
-mxCoordinateAssignment.prototype.constructor = mxCoordinateAssignment;
-mxCoordinateAssignment.prototype.layout = null;
-mxCoordinateAssignment.prototype.intraCellSpacing = 30;
-mxCoordinateAssignment.prototype.interRankCellSpacing = 100;
-mxCoordinateAssignment.prototype.parallelEdgeSpacing = 10;
-mxCoordinateAssignment.prototype.maxIterations = 8;
-mxCoordinateAssignment.prototype.prefHozEdgeSep = 5;
-mxCoordinateAssignment.prototype.prefVertEdgeOff = 2;
-mxCoordinateAssignment.prototype.minEdgeJetty = 12;
-mxCoordinateAssignment.prototype.channelBuffer = 4;
-mxCoordinateAssignment.prototype.jettyPositions = null;
-mxCoordinateAssignment.prototype.orientation = mxConstants.DIRECTION_NORTH;
-mxCoordinateAssignment.prototype.initialX = null;
-mxCoordinateAssignment.prototype.limitX = null;
-mxCoordinateAssignment.prototype.currentXDelta = null;
-mxCoordinateAssignment.prototype.widestRank = null;
-mxCoordinateAssignment.prototype.rankTopY = null;
-mxCoordinateAssignment.prototype.rankBottomY = null;
-mxCoordinateAssignment.prototype.widestRankValue = null;
-mxCoordinateAssignment.prototype.rankWidths = null;
-mxCoordinateAssignment.prototype.rankY = null;
-mxCoordinateAssignment.prototype.fineTuning = !0;
-mxCoordinateAssignment.prototype.edgeStyle = mxHierarchicalEdgeStyle.POLYLINE;
-mxCoordinateAssignment.prototype.nextLayerConnectedCache = null;
-mxCoordinateAssignment.prototype.previousLayerConnectedCache = null;
-mxCoordinateAssignment.prototype.groupPadding = 10;
-mxCoordinateAssignment.prototype.printStatus = function() {
-  var a = this.layout.getModel();
-  mxLog.show();
-  mxLog.writeln("\x3d\x3d\x3d\x3d\x3d\x3dCoord assignment debug\x3d\x3d\x3d\x3d\x3d\x3d\x3d");
-  for (var b = 0; b < a.ranks.length; b++) {
-    mxLog.write("Rank ", b, " : ");
-    for (var c = a.ranks[b], d = 0; d < c.length; d++) mxLog.write(c[d].getGeneralPurposeVariable(b), "  ");
-    mxLog.writeln()
-  }
-  mxLog.writeln("\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d\x3d")
-};
-mxCoordinateAssignment.prototype.execute = function(a) {
-  this.jettyPositions = [];
-  a = this.layout.getModel();
-  this.currentXDelta = 0;
-  this.initialCoords(this.layout.getGraph(), a);
-  this.fineTuning && this.minNode(a);
-  var b = 1E8;
-  if (this.fineTuning)
-    for (var c = 0; c < this.maxIterations; c++) {
-      0 != c && (this.medianPos(c, a), this.minNode(a));
-      if (this.currentXDelta < b) {
-        for (var d = 0; d < a.ranks.length; d++)
-          for (var e = a.ranks[d], f = 0; f < e.length; f++) {
-            var g = e[f];
-            g.setX(d, g.getGeneralPurposeVariable(d))
-          }
-        b = this.currentXDelta
-      } else
-        for (d = 0; d < a.ranks.length; d++) {
-          e =
-            a.ranks[d];
-          for (f = 0; f < e.length; f++) g = e[f], g.setGeneralPurposeVariable(d, g.getX(d))
-        }
-      this.minPath(this.layout.getGraph(), a);
-      this.currentXDelta = 0
-    }
-  this.setCellLocations(this.layout.getGraph(), a)
-};
-mxCoordinateAssignment.prototype.minNode = function(a) {
-  for (var b = [], c = [], d = [], e = 0; e <= a.maxRank; e++) {
-    d[e] = a.ranks[e];
-    for (var f = 0; f < d[e].length; f++) {
-      var g = d[e][f],
-        h = new WeightedCellSorter(g, e);
-      h.rankIndex = f;
-      h.visited = !0;
-      b.push(h);
-      g = mxCellPath.create(g.getCoreCell());
-      c[g] = h
-    }
-  }
-  a = 10 * b.length;
-  for (f = 0; 0 < b.length && f <= a;) {
-    var h = b.shift(),
-      e = h.cell,
-      k = h.weightedValue,
-      l = parseInt(h.rankIndex),
-      g = e.getNextLayerConnectedCells(k),
-      m = e.getPreviousLayerConnectedCells(k),
-      n = g.length,
-      p = m.length,
-      q = this.medianXValue(g, k + 1),
-      s =
-      this.medianXValue(m, k - 1),
-      r = n + p,
-      t = e.getGeneralPurposeVariable(k),
-      v = t;
-    0 < r && (v = (q * n + s * p) / r);
-    n = !1;
-    v < t - 1 ? 0 == l ? (e.setGeneralPurposeVariable(k, v), n = !0) : (l = d[k][l - 1], t = l.getGeneralPurposeVariable(k), t = t + l.width / 2 + this.intraCellSpacing + e.width / 2, t < v ? (e.setGeneralPurposeVariable(
-      k, v), n = !0) : t < e.getGeneralPurposeVariable(k) - 1 && (e.setGeneralPurposeVariable(k, t), n = !0)) : v > t + 1 && (l == d[k].length - 1 ? (e.setGeneralPurposeVariable(k, v), n = !0) :
-      (l = d[k][l + 1], t = l.getGeneralPurposeVariable(k), t = t - l.width / 2 - this.intraCellSpacing -
-        e.width / 2, t > v ? (e.setGeneralPurposeVariable(k, v), n = !0) : t > e.getGeneralPurposeVariable(k) + 1 && (e.setGeneralPurposeVariable(k, t), n = !0)));
-    if (n) {
-      for (e = 0; e < g.length; e++) k = g[e], k = mxCellPath.create(k.getCoreCell()), k = c[k], null != k && !1 == k.visited && (k.visited = !0, b.push(k));
-      for (e = 0; e < m.length; e++) k = m[e], k = mxCellPath.create(k.getCoreCell()), k = c[k], null != k && !1 == k.visited && (k.visited = !0, b.push(k))
-    }
-    h.visited = !1;
-    f++
-  }
-};
-mxCoordinateAssignment.prototype.medianPos = function(a, b) {
-  if (0 == a % 2)
-    for (var c = b.maxRank; 0 < c; c--) this.rankMedianPosition(c - 1, b, c);
-  else
-    for (c = 0; c < b.maxRank - 1; c++) this.rankMedianPosition(c + 1, b, c)
-};
-mxCoordinateAssignment.prototype.rankMedianPosition = function(a, b, c) {
-  b = b.ranks[a];
-  for (var d = [], e = [], f = 0; f < b.length; f++) {
-    var g = b[f];
-    d[f] = new WeightedCellSorter;
-    d[f].cell = g;
-    d[f].rankIndex = f;
-    var h = mxCellPath.create(g.getCoreCell());
-    e[h] = d[f];
-    var k = null,
-      k = c < a ? g.getPreviousLayerConnectedCells(a) : g.getNextLayerConnectedCells(a);
-    d[f].weightedValue = this.calculatedWeightedValue(g, k)
-  }
-  d.sort(WeightedCellSorter.prototype.compare);
-  for (f = 0; f < d.length; f++) {
-    h = 0;
-    g = d[f].cell;
-    h = 0;
-    k = c < a ? g.getPreviousLayerConnectedCells(a).slice() :
-      g.getNextLayerConnectedCells(a).slice();
-    null != k && (h = k.length, h = 0 < h ? this.medianXValue(k, c) : g.getGeneralPurposeVariable(a));
-    for (var l = 0, k = -1E8, m = d[f].rankIndex - 1; 0 <= m;) {
-      var n = mxCellPath.create(b[m].getCoreCell()),
-        n = e[n];
-      if (null != n) {
-        var p = n.cell;
-        n.visited ? (k = p.getGeneralPurposeVariable(a) + p.width / 2 + this.intraCellSpacing + l + g.width / 2, m = -1) : (l += p.width + this.intraCellSpacing, m--)
-      }
-    }
-    l = 0;
-    p = 1E8;
-    for (m = d[f].rankIndex + 1; m < d.length;)
-      if (n = mxCellPath.create(b[m].getCoreCell()), n = e[n], null != n) {
-        var q = n.cell;
-        n.visited ?
-          (p = q.getGeneralPurposeVariable(a) - q.width / 2 - this.intraCellSpacing - l - g.width / 2, m = d.length) : (l += q.width + this.intraCellSpacing, m++)
-      }
-    h >= k && h <= p ? g.setGeneralPurposeVariable(a, h) : h < k ? (g.setGeneralPurposeVariable(a, k), this.currentXDelta += k - h) : h > p && (g.setGeneralPurposeVariable(a, p), this.currentXDelta +=
-      h - p);
-    d[f].visited = !0
-  }
-};
-mxCoordinateAssignment.prototype.calculatedWeightedValue = function(a, b) {
-  for (var c = 0, d = 0; d < b.length; d++) {
-    var e = b[d];
-    a.isVertex() && e.isVertex() ? c++ : c = a.isEdge() && e.isEdge() ? c + 8 : c + 2
-  }
-  return c
-};
-mxCoordinateAssignment.prototype.medianXValue = function(a, b) {
-  if (0 == a.length) return 0;
-  for (var c = [], d = 0; d < a.length; d++) c[d] = a[d].getGeneralPurposeVariable(b);
-  c.sort(function(a, b) {
-    return a - b
-  });
-  if (1 == a.length % 2) return c[Math.floor(a.length / 2)];
-  d = a.length / 2;
-  return (c[d - 1] + c[d]) / 2
-};
-mxCoordinateAssignment.prototype.initialCoords = function(a, b) {
-  this.calculateWidestRank(a, b);
-  for (var c = this.widestRank; 0 <= c; c--) c < b.maxRank && this.rankCoordinates(c, a, b);
-  for (c = this.widestRank + 1; c <= b.maxRank; c++) 0 < c && this.rankCoordinates(c, a, b)
-};
-mxCoordinateAssignment.prototype.rankCoordinates = function(a, b, c) {
-  b = c.ranks[a];
-  c = 0;
-  for (var d = this.initialX + (this.widestRankValue - this.rankWidths[a]) / 2, e = !1, f = 0; f < b.length; f++) {
-    var g = b[f];
-    if (g.isVertex()) {
-      var h = this.layout.getVertexBounds(g.cell);
-      null != h ? this.orientation == mxConstants.DIRECTION_NORTH || this.orientation == mxConstants.DIRECTION_SOUTH ? (g.width = h.width, g.height = h.height) : (g.width = h.height, g.height = h.width) :
-        e = !0;
-      c = Math.max(c, g.height)
-    } else g.isEdge() && (h = 1, null != g.edges ? h = g.edges.length : mxLog.warn("edge.edges is null"),
-      g.width = (h - 1) * this.parallelEdgeSpacing);
-    d += g.width / 2;
-    g.setX(a, d);
-    g.setGeneralPurposeVariable(a, d);
-    d += g.width / 2;
-    d += this.intraCellSpacing
-  }!0 == e && mxLog.warn("At least one cell has no bounds")
-};
-mxCoordinateAssignment.prototype.calculateWidestRank = function(a, b) {
-  var c = -this.interRankCellSpacing,
-    d = 0;
-  this.rankWidths = [];
-  this.rankY = [];
-  for (var e = b.maxRank; 0 <= e; e--) {
-    for (var f = 0, g = b.ranks[e], h = this.initialX, k = !1, l = 0; l < g.length; l++) {
-      var m = g[l];
-      if (m.isVertex()) {
-        var n = this.layout.getVertexBounds(m.cell);
-        null != n ? this.orientation == mxConstants.DIRECTION_NORTH || this.orientation == mxConstants.DIRECTION_SOUTH ? (m.width = n.width, m.height = n.height) : (m.width = n.height, m.height = n
-          .width) : k = !0;
-        f = Math.max(f, m.height)
-      } else m.isEdge() &&
-        (n = 1, null != m.edges ? n = m.edges.length : mxLog.warn("edge.edges is null"), m.width = (n - 1) * this.parallelEdgeSpacing);
-      h += m.width / 2;
-      m.setX(e, h);
-      m.setGeneralPurposeVariable(e, h);
-      h += m.width / 2;
-      h += this.intraCellSpacing;
-      h > this.widestRankValue && (this.widestRankValue = h, this.widestRank = e);
-      this.rankWidths[e] = h
-    }!0 == k && mxLog.warn("At least one cell has no bounds");
-    this.rankY[e] = c;
-    h = f / 2 + d / 2 + this.interRankCellSpacing;
-    d = f;
-    c = this.orientation == mxConstants.DIRECTION_NORTH || this.orientation == mxConstants.DIRECTION_WEST ? c + h : c -
-      h;
-    for (l = 0; l < g.length; l++) g[l].setY(e, c)
-  }
-};
-mxCoordinateAssignment.prototype.minPath = function(a, b) {
-  var c = b.edgeMapper,
-    d;
-  for (d in c) {
-    var e = c[d];
-    if (!(1 > e.maxRank - e.minRank - 1)) {
-      for (var f = e.getGeneralPurposeVariable(e.minRank + 1), g = !0, h = 0, k = e.minRank + 2; k < e.maxRank; k++) {
-        var l = e.getGeneralPurposeVariable(k);
-        f != l ? (g = !1, f = l) : h++
-      }
-      if (!g) {
-        for (var g = f = 0, l = [], m = [], n = e.getGeneralPurposeVariable(e.minRank + 1), k = e.minRank + 1; k < e.maxRank - 1; k++) {
-          var p = e.getX(k + 1);
-          n == p ? (l[k - e.minRank - 1] = n, f++) : this.repositionValid(b, e, k + 1, n) ? (l[k - e.minRank - 1] = n, f++) : n = l[k - e.minRank -
-            1] = p
-        }
-        n = e.getX(k);
-        for (k = e.maxRank - 1; k > e.minRank + 1; k--) p = e.getX(k - 1), n == p ? (m[k - e.minRank - 2] = n, g++) : this.repositionValid(b, e, k - 1, n) ? (m[k - e.minRank - 2] = n, g++) : (m[k -
-          e.minRank - 2] = e.getX(k - 1), n = p);
-        if (g > h || f > h)
-          if (g >= f)
-            for (k = e.maxRank - 2; k > e.minRank; k--) e.setX(k, m[k - e.minRank - 1]);
-          else if (f > g)
-          for (k = e.minRank + 2; k < e.maxRank; k++) e.setX(k, l[k - e.minRank - 2])
-      }
-    }
-  }
-};
-mxCoordinateAssignment.prototype.repositionValid = function(a, b, c, d) {
-  a = a.ranks[c];
-  for (var e = -1, f = 0; f < a.length; f++)
-    if (b == a[f]) {
-      e = f;
-      break
-    }
-  if (0 > e) return !1;
-  f = b.getGeneralPurposeVariable(c);
-  if (d < f) {
-    if (0 == e) return !0;
-    a = a[e - 1];
-    c = a.getGeneralPurposeVariable(c);
-    c = c + a.width / 2 + this.intraCellSpacing + b.width / 2;
-    if (!(c <= d)) return !1
-  } else if (d > f) {
-    if (e == a.length - 1) return !0;
-    a = a[e + 1];
-    c = a.getGeneralPurposeVariable(c);
-    c = c - a.width / 2 - this.intraCellSpacing - b.width / 2;
-    if (!(c >= d)) return !1
-  }
-  return !0
-};
-mxCoordinateAssignment.prototype.setCellLocations = function(a, b) {
-  this.rankTopY = [];
-  this.rankBottomY = [];
-  for (var c = 0; c < b.ranks.length; c++) this.rankTopY[c] = Number.MAX_VALUE, this.rankBottomY[c] = 0;
-  c = null;
-  this.layout.resizeParent && (c = {});
-  var d = b.edgeMapper,
-    e = b.vertexMapper,
-    f;
-  for (f in e) {
-    var g = e[f];
-    this.setVertexLocation(g);
-    if (this.layout.resizeParent) {
-      var g = a.model.getParent(g.cell),
-        h = mxCellPath.create(g);
-      null == c[h] && (c[h] = g)
-    }
-  }
-  this.layout.resizeParent && null != c && this.adjustParents(c);
-  (this.edgeStyle == mxHierarchicalEdgeStyle.ORTHOGONAL ||
-    this.edgeStyle == mxHierarchicalEdgeStyle.POLYLINE || this.edgeStyle == mxHierarchicalEdgeStyle.CURVE) && this.localEdgeProcessing(b);
-  for (f in d) this.setEdgePosition(d[f])
-};
-mxCoordinateAssignment.prototype.adjustParents = function(a) {
-  var b = [],
-    c;
-  for (c in a) b.push(a[c]);
-  this.layout.arrangeGroups(mxUtils.sortCells(b, !0), this.groupPadding)
-};
-mxCoordinateAssignment.prototype.localEdgeProcessing = function(a) {
-  for (var b = 0; b < a.ranks.length; b++)
-    for (var c = a.ranks[b], d = 0; d < c.length; d++) {
-      var e = c[d];
-      if (e.isVertex())
-        for (var f = e.getPreviousLayerConnectedCells(b), g = b - 1, h = 0; 2 > h; h++) {
-          if (-1 < g && g < a.ranks.length && null != f && 0 < f.length) {
-            for (var k = [], l = 0; l < f.length; l++) {
-              var m = new WeightedCellSorter(f[l], f[l].getX(g));
-              k.push(m)
-            }
-            k.sort(WeightedCellSorter.prototype.compare);
-            for (var m = e.x[0] - e.width / 2, n = m + e.width, p = f = 0, g = [], l = 0; l < k.length; l++) {
-              var q = k[l].cell,
-                s;
-              if (q.isVertex()) {
-                s = 0 == h ? e.connectsAsSource : e.connectsAsTarget;
-                for (var r = 0; r < s.length; r++)
-                  if (s[r].source == q || s[r].target == q) f += s[r].edges.length, p++, g.push(s[r])
-              } else f += q.edges.length, p++, g.push(q)
-            }
-            e.width > (f + 1) * this.prefHozEdgeSep + 2 * this.prefHozEdgeSep && (m += this.prefHozEdgeSep, n -= this.prefHozEdgeSep);
-            k = (n - m) / f;
-            m += k / 2;
-            n = this.minEdgeJetty - this.prefVertEdgeOff;
-            for (l = p = 0; l < g.length; l++) {
-              q = g[l].edges.length;
-              r = mxCellPath.create(g[l].edges[0]);
-              s = this.jettyPositions[r];
-              null == s && (s = [], this.jettyPositions[r] =
-                s);
-              l < f / 2 ? n += this.prefVertEdgeOff : l > f / 2 && (n -= this.prefVertEdgeOff);
-              for (r = 0; r < q; r++) s[4 * r + 2 * h] = m, m += k, s[4 * r + 2 * h + 1] = n;
-              p = Math.max(p, n)
-            }
-          }
-          f = e.getNextLayerConnectedCells(b);
-          g = b + 1
-        }
-    }
-};
-mxCoordinateAssignment.prototype.setEdgePosition = function(a) {
-  var b = 0;
-  if (101207 != a.temp[0]) {
-    var c = a.maxRank,
-      d = a.minRank;
-    c == d && (c = a.source.maxRank, d = a.target.minRank);
-    for (var e = 0, f = mxCellPath.create(a.edges[0]), f = this.jettyPositions[f], g = a.isReversed ? a.target.cell : a.source.cell, h = this.layout.graph, k = 0; k < a.edges.length; k++) {
-      var l = a.edges[k],
-        m = this.layout.getVisibleTerminal(l, !0),
-        n = h.model.getTerminal(l, !0),
-        p = [],
-        q = a.isReversed;
-      m != g && (q = !q);
-      if (null != f) {
-        var s = q ? 2 : 0,
-          r = q ? this.rankTopY[d] : this.rankBottomY[c],
-          t = f[4 * e + 1 + s];
-        q && (t = -t);
-        r += t;
-        s = f[4 * e + s];
-        n = h.model.getTerminal(l, !0);
-        this.layout.isPort(n) && h.model.getParent(n) == m && (s = h.view.getState(n), s = null != s ? s.x : m.geometry.x + a.source.width * n.geometry.x);
-        this.orientation == mxConstants.DIRECTION_NORTH || this.orientation == mxConstants.DIRECTION_SOUTH ? (p.push(new mxPoint(s, r)), this.edgeStyle == mxHierarchicalEdgeStyle.CURVE && p.push(
-          new mxPoint(s, r + t))) : (p.push(new mxPoint(r, s)), this.edgeStyle == mxHierarchicalEdgeStyle.CURVE && p.push(new mxPoint(r + t, s)))
-      }
-      s = a.x.length -
-        1;
-      r = t = -1;
-      m = a.maxRank - 1;
-      q && (s = 0, t = a.x.length, r = 1, m = a.minRank + 1);
-      for (; a.maxRank != a.minRank && s != t; s += r) {
-        var n = a.x[s] + b,
-          v = (this.rankTopY[m] + this.rankBottomY[m + 1]) / 2,
-          w = (this.rankTopY[m - 1] + this.rankBottomY[m]) / 2;
-        if (q) var u = v,
-          v = w,
-          w = u;
-        this.orientation == mxConstants.DIRECTION_NORTH || this.orientation == mxConstants.DIRECTION_SOUTH ? (p.push(new mxPoint(n, v)), p.push(new mxPoint(n, w))) : (p.push(new mxPoint(v, n)), p.push(
-          new mxPoint(w, n)));
-        this.limitX = Math.max(this.limitX, n);
-        m += r
-      }
-      null != f && (s = q ? 2 : 0, r = q ? this.rankBottomY[c] :
-        this.rankTopY[d], t = f[4 * e + 3 - s], q && (t = -t), r -= t, s = f[4 * e + 2 - s], q = h.model.getTerminal(l, !1), m = this.layout.getVisibleTerminal(l, !1), this.layout.isPort(q) && h.model
-        .getParent(q) == m && (s = h.view.getState(q), s = null != s ? s.x : m.geometry.x + a.target.width * q.geometry.x), this.orientation == mxConstants.DIRECTION_NORTH || this.orientation ==
-        mxConstants.DIRECTION_SOUTH ? (this.edgeStyle == mxHierarchicalEdgeStyle.CURVE && p.push(new mxPoint(s, r - t)), p.push(new mxPoint(s, r))) : (this.edgeStyle == mxHierarchicalEdgeStyle.CURVE &&
-          p.push(new mxPoint(r -
-            t, s)), p.push(new mxPoint(r, s))));
-      a.isReversed && this.processReversedEdge(a, l);
-      this.layout.setEdgePoints(l, p);
-      b = 0 == b ? this.parallelEdgeSpacing : 0 < b ? -b : -b + this.parallelEdgeSpacing;
-      e++
-    }
-    a.temp[0] = 101207
-  }
-};
-mxCoordinateAssignment.prototype.setVertexLocation = function(a) {
-  var b = a.cell,
-    c = a.x[0] - a.width / 2,
-    d = a.y[0] - a.height / 2;
-  this.rankTopY[a.minRank] = Math.min(this.rankTopY[a.minRank], d);
-  this.rankBottomY[a.minRank] = Math.max(this.rankBottomY[a.minRank], d + a.height);
-  this.orientation == mxConstants.DIRECTION_NORTH || this.orientation == mxConstants.DIRECTION_SOUTH ? this.layout.setVertexLocation(b, c, d) : this.layout.setVertexLocation(b, d, c);
-  this.limitX = Math.max(this.limitX, c + a.width)
-};
-mxCoordinateAssignment.prototype.processReversedEdge = function(a, b) {};
-
-function WeightedCellSorter(a, b) {
-  this.cell = a;
-  this.weightedValue = b
-}
-WeightedCellSorter.prototype.weightedValue = 0;
-WeightedCellSorter.prototype.nudge = !1;
-WeightedCellSorter.prototype.visited = !1;
-WeightedCellSorter.prototype.rankIndex = null;
-WeightedCellSorter.prototype.cell = null;
-WeightedCellSorter.prototype.compare = function(a, b) {
-  return null != a && null != b ? b.weightedValue > a.weightedValue ? -1 : b.weightedValue < a.weightedValue ? 1 : b.nudge ? -1 : 1 : 0
-};
-
-function mxHierarchicalLayout(a, b, c) {
-  mxGraphLayout.call(this, a);
-  this.orientation = null != b ? b : mxConstants.DIRECTION_NORTH;
-  this.deterministic = null != c ? c : !0
-}
-mxHierarchicalLayout.prototype = new mxGraphLayout;
-mxHierarchicalLayout.prototype.constructor = mxHierarchicalLayout;
-mxHierarchicalLayout.prototype.roots = null;
-mxHierarchicalLayout.prototype.resizeParent = !1;
-mxHierarchicalLayout.prototype.moveParent = !1;
-mxHierarchicalLayout.prototype.parentBorder = 0;
-mxHierarchicalLayout.prototype.intraCellSpacing = 30;
-mxHierarchicalLayout.prototype.interRankCellSpacing = 100;
-mxHierarchicalLayout.prototype.interHierarchySpacing = 60;
-mxHierarchicalLayout.prototype.parallelEdgeSpacing = 10;
-mxHierarchicalLayout.prototype.orientation = mxConstants.DIRECTION_NORTH;
-mxHierarchicalLayout.prototype.fineTuning = !0;
-mxHierarchicalLayout.prototype.tightenToSource = !0;
-mxHierarchicalLayout.prototype.disableEdgeStyle = !0;
-mxHierarchicalLayout.prototype.traverseAncestors = !0;
-mxHierarchicalLayout.prototype.model = null;
-mxHierarchicalLayout.prototype.edgesCache = null;
-mxHierarchicalLayout.prototype.getModel = function() {
-  return this.model
-};
-mxHierarchicalLayout.prototype.execute = function(a, b) {
-  this.parent = a;
-  var c = this.graph.model;
-  this.edgesCache = {};
-  if (!(null == b && null == a)) {
-    if (null != b && null != a) {
-      for (var d = [], e = 0; e < b.length; e++) c.isAncestor(a, b[e]) && d.push(b[e]);
-      this.roots = d
-    } else this.roots = b;
-    c.beginUpdate();
-    try {
-      this.run(a), this.resizeParent && !this.graph.isCellCollapsed(a) && this.graph.updateGroupBounds([a], this.parentBorder, this.moveParent)
-    } finally {
-      c.endUpdate()
-    }
-  }
-};
-mxHierarchicalLayout.prototype.findRoots = function(a, b) {
-  var c = [];
-  if (null != a && null != b) {
-    var d = this.graph.model,
-      e = null,
-      f = -1E5,
-      g;
-    for (g in b) {
-      var h = b[g];
-      if (d.isVertex(h) && this.graph.isCellVisible(h)) {
-        for (var k = this.getEdges(h), l = 0, m = 0, n = 0; n < k.length; n++) this.getVisibleTerminal(k[n], !0) == h ? l++ : m++;
-        0 == m && 0 < l && c.push(h);
-        k = l - m;
-        k > f && (f = k, e = h)
-      }
-    }
-    0 == c.length && null != e && c.push(e)
-  }
-  return c
-};
-mxHierarchicalLayout.prototype.getEdges = function(a) {
-  var b = mxCellPath.create(a);
-  if (null != this.edgesCache[b]) return this.edgesCache[b];
-  for (var c = this.graph.model, d = [], e = this.graph.isCellCollapsed(a), f = c.getChildCount(a), g = 0; g < f; g++) {
-    var h = c.getChildAt(a, g);
-    if (this.isPort(h)) d = d.concat(c.getEdges(h, !0, !0));
-    else if (e || !this.graph.isCellVisible(h)) d = d.concat(c.getEdges(h, !0, !0))
-  }
-  d = d.concat(c.getEdges(a, !0, !0));
-  c = [];
-  for (g = 0; g < d.length; g++) e = this.getVisibleTerminal(d[g], !0), f = this.getVisibleTerminal(d[g], !1), (e == f || e != f && (f == a && (null == this.parent || this.graph.isValidAncestor(e,
-    this.parent, this.traverseAncestors)) || e == a && (null == this.parent || this.graph.isValidAncestor(f, this.parent, this.traverseAncestors)))) && c.push(d[g]);
-  return this.edgesCache[b] = c
-};
-mxHierarchicalLayout.prototype.getVisibleTerminal = function(a, b) {
-  var c = this.graph.view.getState(a),
-    c = null != c ? c.getVisibleTerminal(b) : this.graph.view.getVisibleTerminal(a, b);
-  this.isPort(c) && (c = this.graph.model.getParent(c));
-  return c
-};
-mxHierarchicalLayout.prototype.run = function(a) {
-  var b = [],
-    c = [];
-  if (null == this.roots && null != a) {
-    var d = {};
-    this.filterDescendants(a, d);
-    this.roots = [];
-    var e = !0,
-      f;
-    for (f in d)
-      if (null != d[f]) {
-        e = !1;
-        break
-      }
-    for (; !e;) {
-      for (var g = this.findRoots(a, d), e = 0; e < g.length; e++) {
-        var h = [];
-        b.push(h);
-        this.traverse(g[e], !0, null, c, h, b, d)
-      }
-      for (e = 0; e < g.length; e++) this.roots.push(g[e]);
-      e = !0;
-      for (f in d)
-        if (null != d[f]) {
-          e = !1;
-          break
-        }
-    }
-  } else
-    for (e = 0; e < roots.length; e++) h = [], b.push(h), traverse(roots.get(e), !0, null, c, h, b, null);
-  for (e = c = 0; e < b.length; e++) {
-    h =
-      b[e];
-    d = [];
-    for (f in h) d.push(h[f]);
-    this.model = new mxGraphHierarchyModel(this, d, this.roots, a, this.tightenToSource);
-    this.cycleStage(a);
-    this.layeringStage();
-    this.crossingStage(a);
-    c = this.placementStage(c, a)
-  }
-};
-mxHierarchicalLayout.prototype.filterDescendants = function(a, b) {
-  var c = this.graph.model;
-  c.isVertex(a) && (a != this.parent && this.graph.isCellVisible(a)) && (b[mxCellPath.create(a)] = a);
-  if (this.traverseAncestors || a == this.parent && this.graph.isCellVisible(a))
-    for (var d = c.getChildCount(a), e = 0; e < d; e++) {
-      var f = c.getChildAt(a, e);
-      this.isPort(f) || this.filterDescendants(f, b)
-    }
-};
-mxHierarchicalLayout.prototype.isPort = function(a) {
-  return a.geometry.relative ? !0 : !1
-};
-mxHierarchicalLayout.prototype.getEdgesBetween = function(a, b, c) {
-  c = null != c ? c : !1;
-  for (var d = this.getEdges(a), e = [], f = 0; f < d.length; f++) {
-    var g = this.getVisibleTerminal(d[f], !0),
-      h = this.getVisibleTerminal(d[f], !1);
-    (g == a && h == b || !c && g == b && h == a) && e.push(d[f])
-  }
-  return e
-};
-mxHierarchicalLayout.prototype.traverse = function(a, b, c, d, e, f, g) {
-  if (null != a && null != d) {
-    var h = mxCellPath.create(a);
-    if (null == d[h] && (null == g || null != g[h])) {
-      null == e[h] && (e[h] = a);
-      null == d[h] && (d[h] = a);
-      delete g[h];
-      var k = this.getEdges(a);
-      for (c = 0; c < k.length; c++)
-        if (h = this.getVisibleTerminal(k[c], !0) == a, !b || h) h = this.getVisibleTerminal(k[c], !h), e = this.traverse(h, b, k[c], d, e, f, g)
-    } else if (null == e[h])
-      for (c = 0; c < f.length; c++)
-        if (a = f[c], null != a[h]) {
-          for (k in e) a[k] = e[k];
-          f.pop();
-          return a
-        }
-  }
-  return e
-};
-mxHierarchicalLayout.prototype.cycleStage = function(a) {
-  (new mxMinimumCycleRemover(this)).execute(a)
-};
-mxHierarchicalLayout.prototype.layeringStage = function() {
-  this.model.initialRank();
-  this.model.fixRanks()
-};
-mxHierarchicalLayout.prototype.crossingStage = function(a) {
-  (new mxMedianHybridCrossingReduction(this)).execute(a)
-};
-mxHierarchicalLayout.prototype.placementStage = function(a, b) {
-  var c = new mxCoordinateAssignment(this, this.intraCellSpacing, this.interRankCellSpacing, this.orientation, a, this.parallelEdgeSpacing);
-  c.fineTuning = this.fineTuning;
-  c.execute(b);
-  return c.limitX + this.interHierarchySpacing
-};
-
-function mxGraphModel(a) {
-  this.currentEdit = this.createUndoableEdit();
-  null != a ? this.setRoot(a) : this.clear()
-}
-mxGraphModel.prototype = new mxEventSource;
-mxGraphModel.prototype.constructor = mxGraphModel;
-mxGraphModel.prototype.root = null;
-mxGraphModel.prototype.cells = null;
-mxGraphModel.prototype.maintainEdgeParent = !0;
-mxGraphModel.prototype.createIds = !0;
-mxGraphModel.prototype.prefix = "";
-mxGraphModel.prototype.postfix = "";
-mxGraphModel.prototype.nextId = 0;
-mxGraphModel.prototype.currentEdit = null;
-mxGraphModel.prototype.updateLevel = 0;
-mxGraphModel.prototype.endingUpdate = !1;
-mxGraphModel.prototype.clear = function() {
-  this.setRoot(this.createRoot())
-};
-mxGraphModel.prototype.isCreateIds = function() {
-  return this.createIds
-};
-mxGraphModel.prototype.setCreateIds = function(a) {
-  this.createIds = a
-};
-mxGraphModel.prototype.createRoot = function() {
-  var a = new mxCell;
-  a.insert(new mxCell);
-  return a
-};
-mxGraphModel.prototype.getCell = function(a) {
-  return null != this.cells ? this.cells[a] : null
-};
-mxGraphModel.prototype.filterCells = function(a, b) {
-  var c = null;
-  if (null != a)
-    for (var c = [], d = 0; d < a.length; d++) b(a[d]) && c.push(a[d]);
-  return c
-};
-mxGraphModel.prototype.getDescendants = function(a) {
-  return this.filterDescendants(null, a)
-};
-mxGraphModel.prototype.filterDescendants = function(a, b) {
-  var c = [];
-  b = b || this.getRoot();
-  (null == a || a(b)) && c.push(b);
-  for (var d = this.getChildCount(b), e = 0; e < d; e++) var f = this.getChildAt(b, e),
-    c = c.concat(this.filterDescendants(a, f));
-  return c
-};
-mxGraphModel.prototype.getRoot = function(a) {
-  var b = a || this.root;
-  if (null != a)
-    for (; null != a;) b = a, a = this.getParent(a);
-  return b
-};
-mxGraphModel.prototype.setRoot = function(a) {
-  this.execute(new mxRootChange(this, a));
-  return a
-};
-mxGraphModel.prototype.rootChanged = function(a) {
-  var b = this.root;
-  this.root = a;
-  this.nextId = 0;
-  this.cells = null;
-  this.cellAdded(a);
-  return b
-};
-mxGraphModel.prototype.isRoot = function(a) {
-  return null != a && this.root == a
-};
-mxGraphModel.prototype.isLayer = function(a) {
-  return this.isRoot(this.getParent(a))
-};
-mxGraphModel.prototype.isAncestor = function(a, b) {
-  for (; null != b && b != a;) b = this.getParent(b);
-  return b == a
-};
-mxGraphModel.prototype.contains = function(a) {
-  return this.isAncestor(this.root, a)
-};
-mxGraphModel.prototype.getParent = function(a) {
-  return null != a ? a.getParent() : null
-};
-mxGraphModel.prototype.add = function(a, b, c) {
-  if (b != a && null != a && null != b) {
-    null == c && (c = this.getChildCount(a));
-    var d = a != this.getParent(b);
-    this.execute(new mxChildChange(this, a, b, c));
-    this.maintainEdgeParent && d && this.updateEdgeParents(b)
-  }
-  return b
-};
-mxGraphModel.prototype.cellAdded = function(a) {
-  if (null != a) {
-    null == a.getId() && this.createIds && a.setId(this.createId(a));
-    if (null != a.getId()) {
-      var b = this.getCell(a.getId());
-      if (b != a) {
-        for (; null != b;) a.setId(this.createId(a)), b = this.getCell(a.getId());
-        null == this.cells && (this.cells = {});
-        this.cells[a.getId()] = a
-      }
-    }
-    mxUtils.isNumeric(a.getId()) && (this.nextId = Math.max(this.nextId, a.getId()));
-    for (var b = this.getChildCount(a), c = 0; c < b; c++) this.cellAdded(this.getChildAt(a, c))
-  }
-};
-mxGraphModel.prototype.createId = function(a) {
-  a = this.nextId;
-  this.nextId++;
-  return this.prefix + a + this.postfix
-};
-mxGraphModel.prototype.updateEdgeParents = function(a, b) {
-  b = b || this.getRoot(a);
-  for (var c = this.getChildCount(a), d = 0; d < c; d++) {
-    var e = this.getChildAt(a, d);
-    this.updateEdgeParents(e, b)
-  }
-  e = this.getEdgeCount(a);
-  c = [];
-  for (d = 0; d < e; d++) c.push(this.getEdgeAt(a, d));
-  for (d = 0; d < c.length; d++) e = c[d], this.isAncestor(b, e) && this.updateEdgeParent(e, b)
-};
-mxGraphModel.prototype.updateEdgeParent = function(a, b) {
-  for (var c = this.getTerminal(a, !0), d = this.getTerminal(a, !1), e = null; null != c && !this.isEdge(c) && null != c.geometry && c.geometry.relative;) c = this.getParent(c);
-  for (; null != d && !this.isEdge(d) && null != d.geometry && d.geometry.relative;) d = this.getParent(d);
-  if (this.isAncestor(b, c) && this.isAncestor(b, d) && (e = c == d ? this.getParent(c) : this.getNearestCommonAncestor(c, d), null != e && (this.getParent(e) != this.root || this.isAncestor(e, a)) &&
-      this.getParent(a) != e)) {
-    c = this.getGeometry(a);
-    if (null != c) {
-      var f = this.getOrigin(this.getParent(a)),
-        g = this.getOrigin(e),
-        d = g.x - f.x,
-        f = g.y - f.y,
-        c = c.clone();
-      c.translate(-d, -f);
-      this.setGeometry(a, c)
-    }
-    this.add(e, a, this.getChildCount(e))
-  }
-};
-mxGraphModel.prototype.getOrigin = function(a) {
-  var b = null;
-  null != a ? (b = this.getOrigin(this.getParent(a)), this.isEdge(a) || (a = this.getGeometry(a), null != a && (b.x += a.x, b.y += a.y))) : b = new mxPoint;
-  return b
-};
-mxGraphModel.prototype.getNearestCommonAncestor = function(a, b) {
-  if (null != a && null != b) {
-    var c = mxCellPath.create(b);
-    if (null != c && 0 < c.length) {
-      var d = a,
-        e = mxCellPath.create(d);
-      if (c.length < e.length) var d = b,
-        f = e,
-        e = c,
-        c = f;
-      for (; null != d;) {
-        f = this.getParent(d);
-        if (0 == c.indexOf(e + mxCellPath.PATH_SEPARATOR) && null != f) return d;
-        e = mxCellPath.getParentPath(e);
-        d = f
-      }
-    }
-  }
-  return null
-};
-mxGraphModel.prototype.remove = function(a) {
-  a == this.root ? this.setRoot(null) : null != this.getParent(a) && this.execute(new mxChildChange(this, null, a));
-  return a
-};
-mxGraphModel.prototype.cellRemoved = function(a) {
-  if (null != a && null != this.cells) {
-    for (var b = this.getChildCount(a) - 1; 0 <= b; b--) this.cellRemoved(this.getChildAt(a, b));
-    null != this.cells && null != a.getId() && delete this.cells[a.getId()]
-  }
-};
-mxGraphModel.prototype.parentForCellChanged = function(a, b, c) {
-  var d = this.getParent(a);
-  null != b ? (b != d || d.getIndex(a) != c) && b.insert(a, c) : null != d && (c = d.getIndex(a), d.remove(c));
-  !this.contains(d) && null != b ? this.cellAdded(a) : null == b && this.cellRemoved(a);
-  return d
-};
-mxGraphModel.prototype.getChildCount = function(a) {
-  return null != a ? a.getChildCount() : 0
-};
-mxGraphModel.prototype.getChildAt = function(a, b) {
-  return null != a ? a.getChildAt(b) : null
-};
-mxGraphModel.prototype.getChildren = function(a) {
-  return null != a ? a.children : null
-};
-mxGraphModel.prototype.getChildVertices = function(a) {
-  return this.getChildCells(a, !0, !1)
-};
-mxGraphModel.prototype.getChildEdges = function(a) {
-  return this.getChildCells(a, !1, !0)
-};
-mxGraphModel.prototype.getChildCells = function(a, b, c) {
-  b = null != b ? b : !1;
-  c = null != c ? c : !1;
-  for (var d = this.getChildCount(a), e = [], f = 0; f < d; f++) {
-    var g = this.getChildAt(a, f);
-    (!c && !b || c && this.isEdge(g) || b && this.isVertex(g)) && e.push(g)
-  }
-  return e
-};
-mxGraphModel.prototype.getTerminal = function(a, b) {
-  return null != a ? a.getTerminal(b) : null
-};
-mxGraphModel.prototype.setTerminal = function(a, b, c) {
-  var d = b != this.getTerminal(a, c);
-  this.execute(new mxTerminalChange(this, a, b, c));
-  this.maintainEdgeParent && d && this.updateEdgeParent(a, this.getRoot());
-  return b
-};
-mxGraphModel.prototype.setTerminals = function(a, b, c) {
-  this.beginUpdate();
-  try {
-    this.setTerminal(a, b, !0), this.setTerminal(a, c, !1)
-  } finally {
-    this.endUpdate()
-  }
-};
-mxGraphModel.prototype.terminalForCellChanged = function(a, b, c) {
-  var d = this.getTerminal(a, c);
-  null != b ? b.insertEdge(a, c) : null != d && d.removeEdge(a, c);
-  return d
-};
-mxGraphModel.prototype.getEdgeCount = function(a) {
-  return null != a ? a.getEdgeCount() : 0
-};
-mxGraphModel.prototype.getEdgeAt = function(a, b) {
-  return null != a ? a.getEdgeAt(b) : null
-};
-mxGraphModel.prototype.getDirectedEdgeCount = function(a, b, c) {
-  for (var d = 0, e = this.getEdgeCount(a), f = 0; f < e; f++) {
-    var g = this.getEdgeAt(a, f);
-    g != c && this.getTerminal(g, b) == a && d++
-  }
-  return d
-};
-mxGraphModel.prototype.getConnections = function(a) {
-  return this.getEdges(a, !0, !0, !1)
-};
-mxGraphModel.prototype.getIncomingEdges = function(a) {
-  return this.getEdges(a, !0, !1, !1)
-};
-mxGraphModel.prototype.getOutgoingEdges = function(a) {
-  return this.getEdges(a, !1, !0, !1)
-};
-mxGraphModel.prototype.getEdges = function(a, b, c, d) {
-  b = null != b ? b : !0;
-  c = null != c ? c : !0;
-  d = null != d ? d : !0;
-  for (var e = this.getEdgeCount(a), f = [], g = 0; g < e; g++) {
-    var h = this.getEdgeAt(a, g),
-      k = this.getTerminal(h, !0),
-      l = this.getTerminal(h, !1);
-    (d && k == l || k != l && (b && l == a || c && k == a)) && f.push(h)
-  }
-  return f
-};
-mxGraphModel.prototype.getEdgesBetween = function(a, b, c) {
-  c = null != c ? c : !1;
-  var d = this.getEdgeCount(a),
-    e = this.getEdgeCount(b),
-    f = a,
-    g = d;
-  e < d && (g = e, f = b);
-  d = [];
-  for (e = 0; e < g; e++) {
-    var h = this.getEdgeAt(f, e),
-      k = this.getTerminal(h, !0),
-      l = this.getTerminal(h, !1),
-      m = l == a && k == b;
-    (k == a && l == b || !c && m) && d.push(h)
-  }
-  return d
-};
-mxGraphModel.prototype.getOpposites = function(a, b, c, d) {
-  c = null != c ? c : !0;
-  d = null != d ? d : !0;
-  var e = [];
-  if (null != a)
-    for (var f = 0; f < a.length; f++) {
-      var g = this.getTerminal(a[f], !0),
-        h = this.getTerminal(a[f], !1);
-      g == b && null != h && h != b && d ? e.push(h) : h == b && (null != g && g != b && c) && e.push(g)
-    }
-  return e
-};
-mxGraphModel.prototype.getTopmostCells = function(a) {
-  for (var b = [], c = 0; c < a.length; c++) {
-    for (var d = a[c], e = !0, f = this.getParent(d); null != f;) {
-      if (0 <= mxUtils.indexOf(a, f)) {
-        e = !1;
-        break
-      }
-      f = this.getParent(f)
-    }
-    e && b.push(d)
-  }
-  return b
-};
-mxGraphModel.prototype.isVertex = function(a) {
-  return null != a ? a.isVertex() : !1
-};
-mxGraphModel.prototype.isEdge = function(a) {
-  return null != a ? a.isEdge() : !1
-};
-mxGraphModel.prototype.isConnectable = function(a) {
-  return null != a ? a.isConnectable() : !1
-};
-mxGraphModel.prototype.getValue = function(a) {
-  return null != a ? a.getValue() : null
-};
-mxGraphModel.prototype.setValue = function(a, b) {
-  this.execute(new mxValueChange(this, a, b));
-  return b
-};
-mxGraphModel.prototype.valueForCellChanged = function(a, b) {
-  return a.valueChanged(b)
-};
-mxGraphModel.prototype.getGeometry = function(a, b) {
-  return null != a ? a.getGeometry() : null
-};
-mxGraphModel.prototype.setGeometry = function(a, b) {
-  b != this.getGeometry(a) && this.execute(new mxGeometryChange(this, a, b));
-  return b
-};
-mxGraphModel.prototype.geometryForCellChanged = function(a, b) {
-  var c = this.getGeometry(a);
-  a.setGeometry(b);
-  return c
-};
-mxGraphModel.prototype.getStyle = function(a) {
-  return null != a ? a.getStyle() : null
-};
-mxGraphModel.prototype.setStyle = function(a, b) {
-  b != this.getStyle(a) && this.execute(new mxStyleChange(this, a, b));
-  return b
-};
-mxGraphModel.prototype.styleForCellChanged = function(a, b) {
-  var c = this.getStyle(a);
-  a.setStyle(b);
-  return c
-};
-mxGraphModel.prototype.isCollapsed = function(a) {
-  return null != a ? a.isCollapsed() : !1
-};
-mxGraphModel.prototype.setCollapsed = function(a, b) {
-  b != this.isCollapsed(a) && this.execute(new mxCollapseChange(this, a, b));
-  return b
-};
-mxGraphModel.prototype.collapsedStateForCellChanged = function(a, b) {
-  var c = this.isCollapsed(a);
-  a.setCollapsed(b);
-  return c
-};
-mxGraphModel.prototype.isVisible = function(a) {
-  return null != a ? a.isVisible() : !1
-};
-mxGraphModel.prototype.setVisible = function(a, b) {
-  b != this.isVisible(a) && this.execute(new mxVisibleChange(this, a, b));
-  return b
-};
-mxGraphModel.prototype.visibleStateForCellChanged = function(a, b) {
-  var c = this.isVisible(a);
-  a.setVisible(b);
-  return c
-};
-mxGraphModel.prototype.execute = function(a) {
-  a.execute();
-  this.beginUpdate();
-  this.currentEdit.add(a);
-  this.fireEvent(new mxEventObject(mxEvent.EXECUTE, "change", a));
-  this.fireEvent(new mxEventObject(mxEvent.EXECUTED, "change", a));
-  this.endUpdate()
-};
-mxGraphModel.prototype.beginUpdate = function() {
-  this.updateLevel++;
-  this.fireEvent(new mxEventObject(mxEvent.BEGIN_UPDATE));
-  1 == this.updateLevel && this.fireEvent(new mxEventObject(mxEvent.START_EDIT))
-};
-mxGraphModel.prototype.endUpdate = function() {
-  this.updateLevel--;
-  0 == this.updateLevel && this.fireEvent(new mxEventObject(mxEvent.END_EDIT));
-  if (!this.endingUpdate) {
-    this.endingUpdate = 0 == this.updateLevel;
-    this.fireEvent(new mxEventObject(mxEvent.END_UPDATE, "edit", this.currentEdit));
-    try {
-      if (this.endingUpdate && !this.currentEdit.isEmpty()) {
-        this.fireEvent(new mxEventObject(mxEvent.BEFORE_UNDO, "edit", this.currentEdit));
-        var a = this.currentEdit;
-        this.currentEdit = this.createUndoableEdit();
-        a.notify();
-        this.fireEvent(new mxEventObject(mxEvent.UNDO,
-          "edit", a))
-      }
-    } finally {
-      this.endingUpdate = !1
-    }
-  }
-};
-mxGraphModel.prototype.createUndoableEdit = function() {
-  var a = new mxUndoableEdit(this, !0);
-  a.notify = function() {
-    a.source.fireEvent(new mxEventObject(mxEvent.CHANGE, "edit", a, "changes", a.changes));
-    a.source.fireEvent(new mxEventObject(mxEvent.NOTIFY, "edit", a, "changes", a.changes))
-  };
-  return a
-};
-mxGraphModel.prototype.mergeChildren = function(a, b, c) {
-  c = null != c ? c : !0;
-  this.beginUpdate();
-  try {
-    var d = {};
-    this.mergeChildrenImpl(a, b, c, d);
-    for (var e in d) {
-      var f = d[e],
-        g = this.getTerminal(f, !0);
-      null != g && (g = d[mxCellPath.create(g)], this.setTerminal(f, g, !0));
-      g = this.getTerminal(f, !1);
-      null != g && (g = d[mxCellPath.create(g)], this.setTerminal(f, g, !1))
-    }
-  } finally {
-    this.endUpdate()
-  }
-};
-mxGraphModel.prototype.mergeChildrenImpl = function(a, b, c, d) {
-  this.beginUpdate();
-  try {
-    for (var e = a.getChildCount(), f = 0; f < e; f++) {
-      var g = a.getChildAt(f);
-      if ("function" == typeof g.getId) {
-        var h = g.getId(),
-          k = null != h && (!this.isEdge(g) || !c) ? this.getCell(h) : null;
-        if (null == k) {
-          var l = g.clone();
-          l.setId(h);
-          l.setTerminal(g.getTerminal(!0), !0);
-          l.setTerminal(g.getTerminal(!1), !1);
-          k = b.insert(l);
-          this.cellAdded(k)
-        }
-        d[mxCellPath.create(g)] = k;
-        this.mergeChildrenImpl(g, k, c, d)
-      }
-    }
-  } finally {
-    this.endUpdate()
-  }
-};
-mxGraphModel.prototype.getParents = function(a) {
-  var b = [];
-  if (null != a)
-    for (var c = {}, d = 0; d < a.length; d++) {
-      var e = this.getParent(a[d]);
-      if (null != e) {
-        var f = mxCellPath.create(e);
-        null == c[f] && (c[f] = e, b.push(e))
-      }
-    }
-  return b
-};
-mxGraphModel.prototype.cloneCell = function(a) {
-  return null != a ? this.cloneCells([a], !0)[0] : null
-};
-mxGraphModel.prototype.cloneCells = function(a, b) {
-  for (var c = {}, d = [], e = 0; e < a.length; e++) null != a[e] ? d.push(this.cloneCellImpl(a[e], c, b)) : d.push(null);
-  for (e = 0; e < d.length; e++) null != d[e] && this.restoreClone(d[e], a[e], c);
-  return d
-};
-mxGraphModel.prototype.cloneCellImpl = function(a, b, c) {
-  var d = this.cellCloned(a);
-  b[mxObjectIdentity.get(a)] = d;
-  if (c) {
-    c = this.getChildCount(a);
-    for (var e = 0; e < c; e++) {
-      var f = this.cloneCellImpl(this.getChildAt(a, e), b, !0);
-      d.insert(f)
-    }
-  }
-  return d
-};
-mxGraphModel.prototype.cellCloned = function(a) {
-  return a.clone()
-};
-mxGraphModel.prototype.restoreClone = function(a, b, c) {
-  var d = this.getTerminal(b, !0);
-  null != d && (d = c[mxObjectIdentity.get(d)], null != d && d.insertEdge(a, !0));
-  d = this.getTerminal(b, !1);
-  null != d && (d = c[mxObjectIdentity.get(d)], null != d && d.insertEdge(a, !1));
-  for (var d = this.getChildCount(a), e = 0; e < d; e++) this.restoreClone(this.getChildAt(a, e), this.getChildAt(b, e), c)
-};
-
-function mxRootChange(a, b) {
-  this.model = a;
-  this.previous = this.root = b
-}
-mxRootChange.prototype.execute = function() {
-  this.root = this.previous;
-  this.previous = this.model.rootChanged(this.previous)
-};
-
-function mxChildChange(a, b, c, d) {
-  this.model = a;
-  this.previous = this.parent = b;
-  this.child = c;
-  this.previousIndex = this.index = d
-}
-mxChildChange.prototype.execute = function() {
-  var a = this.model.getParent(this.child),
-    b = null != a ? a.getIndex(this.child) : 0;
-  null == this.previous && this.connect(this.child, !1);
-  a = this.model.parentForCellChanged(this.child, this.previous, this.previousIndex);
-  null != this.previous && this.connect(this.child, !0);
-  this.parent = this.previous;
-  this.previous = a;
-  this.index = this.previousIndex;
-  this.previousIndex = b
-};
-mxChildChange.prototype.connect = function(a, b) {
-  b = null != b ? b : !0;
-  var c = a.getTerminal(!0),
-    d = a.getTerminal(!1);
-  null != c && (b ? this.model.terminalForCellChanged(a, c, !0) : this.model.terminalForCellChanged(a, null, !0));
-  null != d && (b ? this.model.terminalForCellChanged(a, d, !1) : this.model.terminalForCellChanged(a, null, !1));
-  a.setTerminal(c, !0);
-  a.setTerminal(d, !1);
-  c = this.model.getChildCount(a);
-  for (d = 0; d < c; d++) this.connect(this.model.getChildAt(a, d), b)
-};
-
-function mxTerminalChange(a, b, c, d) {
-  this.model = a;
-  this.cell = b;
-  this.previous = this.terminal = c;
-  this.source = d
-}
-mxTerminalChange.prototype.execute = function() {
-  this.terminal = this.previous;
-  this.previous = this.model.terminalForCellChanged(this.cell, this.previous, this.source)
-};
-
-function mxValueChange(a, b, c) {
-  this.model = a;
-  this.cell = b;
-  this.previous = this.value = c
-}
-mxValueChange.prototype.execute = function() {
-  this.value = this.previous;
-  this.previous = this.model.valueForCellChanged(this.cell, this.previous)
-};
-
-function mxStyleChange(a, b, c) {
-  this.model = a;
-  this.cell = b;
-  this.previous = this.style = c
-}
-mxStyleChange.prototype.execute = function() {
-  this.style = this.previous;
-  this.previous = this.model.styleForCellChanged(this.cell, this.previous)
-};
-
-function mxGeometryChange(a, b, c) {
-  this.model = a;
-  this.cell = b;
-  this.previous = this.geometry = c
-}
-mxGeometryChange.prototype.execute = function() {
-  this.geometry = this.previous;
-  this.previous = this.model.geometryForCellChanged(this.cell, this.previous)
-};
-
-function mxCollapseChange(a, b, c) {
-  this.model = a;
-  this.cell = b;
-  this.previous = this.collapsed = c
-}
-mxCollapseChange.prototype.execute = function() {
-  this.collapsed = this.previous;
-  this.previous = this.model.collapsedStateForCellChanged(this.cell, this.previous)
-};
-
-function mxVisibleChange(a, b, c) {
-  this.model = a;
-  this.cell = b;
-  this.previous = this.visible = c
-}
-mxVisibleChange.prototype.execute = function() {
-  this.visible = this.previous;
-  this.previous = this.model.visibleStateForCellChanged(this.cell, this.previous)
-};
-
-function mxCellAttributeChange(a, b, c) {
-  this.cell = a;
-  this.attribute = b;
-  this.previous = this.value = c
-}
-mxCellAttributeChange.prototype.execute = function() {
-  var a = this.cell.getAttribute(this.attribute);
-  null == this.previous ? this.cell.value.removeAttribute(this.attribute) : this.cell.setAttribute(this.attribute, this.previous);
-  this.previous = a
-};
-
-function mxCell(a, b, c) {
-  this.value = a;
-  this.setGeometry(b);
-  this.setStyle(c);
-  if (null != this.onInit) this.onInit()
-}
-mxCell.prototype.id = null;
-mxCell.prototype.value = null;
-mxCell.prototype.geometry = null;
-mxCell.prototype.style = null;
-mxCell.prototype.vertex = !1;
-mxCell.prototype.edge = !1;
-mxCell.prototype.connectable = !0;
-mxCell.prototype.visible = !0;
-mxCell.prototype.collapsed = !1;
-mxCell.prototype.parent = null;
-mxCell.prototype.source = null;
-mxCell.prototype.target = null;
-mxCell.prototype.children = null;
-mxCell.prototype.edges = null;
-mxCell.prototype.mxTransient = "id value parent source target children edges".split(" ");
-mxCell.prototype.getId = function() {
-  return this.id
-};
-mxCell.prototype.setId = function(a) {
-  this.id = a
-};
-mxCell.prototype.getValue = function() {
-  return this.value
-};
-mxCell.prototype.setValue = function(a) {
-  this.value = a
-};
-mxCell.prototype.valueChanged = function(a) {
-  var b = this.getValue();
-  this.setValue(a);
-  return b
-};
-mxCell.prototype.getGeometry = function() {
-  return this.geometry
-};
-mxCell.prototype.setGeometry = function(a) {
-  this.geometry = a
-};
-mxCell.prototype.getStyle = function() {
-  return this.style
-};
-mxCell.prototype.setStyle = function(a) {
-  this.style = a
-};
-mxCell.prototype.isVertex = function() {
-  return this.vertex
-};
-mxCell.prototype.setVertex = function(a) {
-  this.vertex = a
-};
-mxCell.prototype.isEdge = function() {
-  return this.edge
-};
-mxCell.prototype.setEdge = function(a) {
-  this.edge = a
-};
-mxCell.prototype.isConnectable = function() {
-  return this.connectable
-};
-mxCell.prototype.setConnectable = function(a) {
-  this.connectable = a
-};
-mxCell.prototype.isVisible = function() {
-  return this.visible
-};
-mxCell.prototype.setVisible = function(a) {
-  this.visible = a
-};
-mxCell.prototype.isCollapsed = function() {
-  return this.collapsed
-};
-mxCell.prototype.setCollapsed = function(a) {
-  this.collapsed = a
-};
-mxCell.prototype.getParent = function() {
-  return this.parent
-};
-mxCell.prototype.setParent = function(a) {
-  this.parent = a
-};
-mxCell.prototype.getTerminal = function(a) {
-  return a ? this.source : this.target
-};
-mxCell.prototype.setTerminal = function(a, b) {
-  b ? this.source = a : this.target = a;
-  return a
-};
-mxCell.prototype.getChildCount = function() {
-  return null == this.children ? 0 : this.children.length
-};
-mxCell.prototype.getIndex = function(a) {
-  return mxUtils.indexOf(this.children, a)
-};
-mxCell.prototype.getChildAt = function(a) {
-  return null == this.children ? null : this.children[a]
-};
-mxCell.prototype.insert = function(a, b) {
-  null != a && (null == b && (b = this.getChildCount(), a.getParent() == this && b--), a.removeFromParent(), a.setParent(this), null == this.children ? (this.children = [], this.children.push(a)) :
-    this.children.splice(b, 0, a));
-  return a
-};
-mxCell.prototype.remove = function(a) {
-  var b = null;
-  null != this.children && 0 <= a && (b = this.getChildAt(a), null != b && (this.children.splice(a, 1), b.setParent(null)));
-  return b
-};
-mxCell.prototype.removeFromParent = function() {
-  if (null != this.parent) {
-    var a = this.parent.getIndex(this);
-    this.parent.remove(a)
-  }
-};
-mxCell.prototype.getEdgeCount = function() {
-  return null == this.edges ? 0 : this.edges.length
-};
-mxCell.prototype.getEdgeIndex = function(a) {
-  return mxUtils.indexOf(this.edges, a)
-};
-mxCell.prototype.getEdgeAt = function(a) {
-  return null == this.edges ? null : this.edges[a]
-};
-mxCell.prototype.insertEdge = function(a, b) {
-  if (null != a && (a.removeFromTerminal(b), a.setTerminal(this, b), null == this.edges || a.getTerminal(!b) != this || 0 > mxUtils.indexOf(this.edges, a))) null == this.edges && (this.edges = []),
-    this.edges.push(a);
-  return a
-};
-mxCell.prototype.removeEdge = function(a, b) {
-  if (null != a) {
-    if (a.getTerminal(!b) != this && null != this.edges) {
-      var c = this.getEdgeIndex(a);
-      0 <= c && this.edges.splice(c, 1)
-    }
-    a.setTerminal(null, b)
-  }
-  return a
-};
-mxCell.prototype.removeFromTerminal = function(a) {
-  var b = this.getTerminal(a);
-  null != b && b.removeEdge(this, a)
-};
-mxCell.prototype.getAttribute = function(a, b) {
-  var c = this.getValue();
-  return (null != c && c.nodeType == mxConstants.NODETYPE_ELEMENT ? c.getAttribute(a) : null) || b
-};
-mxCell.prototype.setAttribute = function(a, b) {
-  var c = this.getValue();
-  null != c && c.nodeType == mxConstants.NODETYPE_ELEMENT && c.setAttribute(a, b)
-};
-mxCell.prototype.clone = function() {
-  var a = mxUtils.clone(this, this.mxTransient);
-  a.setValue(this.cloneValue());
-  return a
-};
-mxCell.prototype.cloneValue = function() {
-  var a = this.getValue();
-  null != a && ("function" == typeof a.clone ? a = a.clone() : isNaN(a.nodeType) || (a = a.cloneNode(!0)));
-  return a
-};
-
-function mxGeometry(a, b, c, d) {
-  mxRectangle.call(this, a, b, c, d)
-}
-mxGeometry.prototype = new mxRectangle;
-mxGeometry.prototype.constructor = mxGeometry;
-mxGeometry.prototype.TRANSLATE_CONTROL_POINTS = !0;
-mxGeometry.prototype.alternateBounds = null;
-mxGeometry.prototype.sourcePoint = null;
-mxGeometry.prototype.targetPoint = null;
-mxGeometry.prototype.points = null;
-mxGeometry.prototype.offset = null;
-mxGeometry.prototype.relative = !1;
-mxGeometry.prototype.swap = function() {
-  if (null != this.alternateBounds) {
-    var a = new mxRectangle(this.x, this.y, this.width, this.height);
-    this.x = this.alternateBounds.x;
-    this.y = this.alternateBounds.y;
-    this.width = this.alternateBounds.width;
-    this.height = this.alternateBounds.height;
-    this.alternateBounds = a
-  }
-};
-mxGeometry.prototype.getTerminalPoint = function(a) {
-  return a ? this.sourcePoint : this.targetPoint
-};
-mxGeometry.prototype.setTerminalPoint = function(a, b) {
-  b ? this.sourcePoint = a : this.targetPoint = a;
-  return a
-};
-mxGeometry.prototype.translate = function(a, b) {
-  this.clone();
-  this.relative || (this.x += a, this.y += b);
-  null != this.sourcePoint && (this.sourcePoint.x += a, this.sourcePoint.y += b);
-  null != this.targetPoint && (this.targetPoint.x += a, this.targetPoint.y += b);
-  if (this.TRANSLATE_CONTROL_POINTS && null != this.points)
-    for (var c = this.points.length, d = 0; d < c; d++) {
-      var e = this.points[d];
-      null != e && (e.x += a, e.y += b)
-    }
-};
-var mxCellPath = {
-    PATH_SEPARATOR: ".",
-    create: function(a) {
-      var b = "";
-      if (null != a)
-        for (var c = a.getParent(); null != c;) b = c.getIndex(a) + mxCellPath.PATH_SEPARATOR + b, a = c, c = a.getParent();
-      a = b.length;
-      1 < a && (b = b.substring(0, a - 1));
-      return b
-    },
-    getParentPath: function(a) {
-      if (null != a) {
-        var b = a.lastIndexOf(mxCellPath.PATH_SEPARATOR);
-        if (0 <= b) return a.substring(0, b);
-        if (0 < a.length) return ""
-      }
-      return null
-    },
-    resolve: function(a, b) {
-      var c = a;
-      if (null != b)
-        for (var d = b.split(mxCellPath.PATH_SEPARATOR), e = 0; e < d.length; e++) c = c.getChildAt(parseInt(d[e]));
-      return c
-    },
-    compare: function(a, b) {
-      for (var c = Math.min(a.length, b.length), d = 0, e = 0; e < c; e++)
-        if (a[e] != b[e]) {
-          0 == a[e].length || 0 == b[e].length ? d = a[e] == b[e] ? 0 : a[e] > b[e] ? 1 : -1 : (c = parseInt(a[e]), e = parseInt(b[e]), d = c == e ? 0 : c > e ? 1 : -1);
-          break
-        }
-      0 == d && (c = a.length, e = b.length, c != e && (d = c > e ? 1 : -1));
-      return d
-    }
-  },
-  mxPerimeter = {
-    RectanglePerimeter: function(a, b, c, d) {
-      b = a.getCenterX();
-      var e = a.getCenterY(),
-        f = Math.atan2(c.y - e, c.x - b),
-        g = new mxPoint(0, 0),
-        h = Math.PI,
-        k = Math.PI / 2 - f,
-        l = Math.atan2(a.height, a.width);
-      f < -h + l || f > h - l ? (g.x = a.x, g.y = e - a.width *
-        Math.tan(f) / 2) : f < -l ? (g.y = a.y, g.x = b - a.height * Math.tan(k) / 2) : f < l ? (g.x = a.x + a.width, g.y = e + a.width * Math.tan(f) / 2) : (g.y = a.y + a.height, g.x = b + a.height *
-        Math.tan(k) / 2);
-      d && (c.x >= a.x && c.x <= a.x + a.width ? g.x = c.x : c.y >= a.y && c.y <= a.y + a.height && (g.y = c.y), c.x < a.x ? g.x = a.x : c.x > a.x + a.width && (g.x = a.x + a.width), c.y < a.y ? g.y =
-        a.y : c.y > a.y + a.height && (g.y = a.y + a.height));
-      return g
-    },
-    EllipsePerimeter: function(a, b, c, d) {
-      var e = a.x,
-        f = a.y,
-        g = a.width / 2,
-        h = a.height / 2,
-        k = e + g,
-        l = f + h;
-      b = c.x;
-      c = c.y;
-      var m = parseInt(b - k),
-        n = parseInt(c - l);
-      if (0 == m && 0 != n) return new mxPoint(k,
-        l + h * n / Math.abs(n));
-      if (0 == m && 0 == n) return new mxPoint(b, c);
-      if (d) {
-        if (c >= f && c <= f + a.height) return a = c - l, a = Math.sqrt(g * g * (1 - a * a / (h * h))) || 0, b <= e && (a = -a), new mxPoint(k + a, c);
-        if (b >= e && b <= e + a.width) return a = b - k, a = Math.sqrt(h * h * (1 - a * a / (g * g))) || 0, c <= f && (a = -a), new mxPoint(b, l + a)
-      }
-      e = n / m;
-      l -= e * k;
-      f = g * g * e * e + h * h;
-      a = -2 * k * f;
-      h = Math.sqrt(a * a - 4 * f * (g * g * e * e * k * k + h * h * k * k - g * g * h * h));
-      g = (-a + h) / (2 * f);
-      h = (-a - h) / (2 * f);
-      k = e * g + l;
-      l = e * h + l;
-      e = Math.sqrt(Math.pow(g - b, 2) + Math.pow(k - c, 2));
-      b = Math.sqrt(Math.pow(h - b, 2) + Math.pow(l - c, 2));
-      f = c = 0;
-      e < b ? (c =
-        g, f = k) : (c = h, f = l);
-      return new mxPoint(c, f)
-    },
-    RhombusPerimeter: function(a, b, c, d) {
-      b = a.x;
-      var e = a.y,
-        f = a.width;
-      a = a.height;
-      var g = b + f / 2,
-        h = e + a / 2,
-        k = c.x;
-      c = c.y;
-      if (g == k) return h > c ? new mxPoint(g, e) : new mxPoint(g, e + a);
-      if (h == c) return g > k ? new mxPoint(b, h) : new mxPoint(b + f, h);
-      var l = g,
-        m = h;
-      d && (k >= b && k <= b + f ? l = k : c >= e && c <= e + a && (m = c));
-      return k < g ? c < h ? mxUtils.intersection(k, c, l, m, g, e, b, h) : mxUtils.intersection(k, c, l, m, g, e + a, b, h) : c < h ? mxUtils.intersection(k, c, l, m, g, e, b + f, h) : mxUtils.intersection(
-        k, c, l, m, g, e + a, b + f, h)
-    },
-    TrianglePerimeter: function(a,
-      b, c, d) {
-      b = null != b ? b.style[mxConstants.STYLE_DIRECTION] : null;
-      var e = b == mxConstants.DIRECTION_NORTH || b == mxConstants.DIRECTION_SOUTH,
-        f = a.x,
-        g = a.y,
-        h = a.width;
-      a = a.height;
-      var k = f + h / 2,
-        l = g + a / 2,
-        m = new mxPoint(f, g),
-        n = new mxPoint(f + h, l),
-        p = new mxPoint(f, g + a);
-      b == mxConstants.DIRECTION_NORTH ? (m = p, n = new mxPoint(k, g), p = new mxPoint(f + h, g + a)) : b == mxConstants.DIRECTION_SOUTH ? (n = new mxPoint(k, g + a), p = new mxPoint(f + h, g)) :
-        b == mxConstants.DIRECTION_WEST && (m = new mxPoint(f + h, g), n = new mxPoint(f, l), p = new mxPoint(f + h, g + a));
-      var q = c.x -
-        k,
-        s = c.y - l,
-        q = e ? Math.atan2(q, s) : Math.atan2(s, q),
-        r = e ? Math.atan2(h, a) : Math.atan2(a, h),
-        s = !1,
-        s = b == mxConstants.DIRECTION_NORTH || b == mxConstants.DIRECTION_WEST ? q > -r && q < r : q < -Math.PI + r || q > Math.PI - r,
-        r = null;
-      s ? r = d && (e && c.x >= m.x && c.x <= p.x || !e && c.y >= m.y && c.y <= p.y) ? e ? new mxPoint(c.x, m.y) : new mxPoint(m.x, c.y) : b == mxConstants.DIRECTION_NORTH ? new mxPoint(f + h / 2 +
-        a * Math.tan(q) / 2, g + a) : b == mxConstants.DIRECTION_SOUTH ? new mxPoint(f + h / 2 - a * Math.tan(q) / 2, g) : b == mxConstants.DIRECTION_WEST ? new mxPoint(f + h, g + a / 2 + h *
-        Math.tan(q) / 2) : new mxPoint(f,
-        g + a / 2 - h * Math.tan(q) / 2) : (d && (d = new mxPoint(k, l), c.y >= g && c.y <= g + a ? (d.x = e ? k : b == mxConstants.DIRECTION_WEST ? f + h : f, d.y = c.y) : c.x >= f && c.x <= f +
-        h && (d.x = c.x, d.y = !e ? l : b == mxConstants.DIRECTION_NORTH ? g + a : g), k = d.x, l = d.y), r = e && c.x <= f + h / 2 || !e && c.y <= g + a / 2 ? mxUtils.intersection(c.x, c.y, k,
-        l, m.x, m.y, n.x, n.y) : mxUtils.intersection(c.x, c.y, k, l, n.x, n.y, p.x, p.y));
-      null == r && (r = new mxPoint(k, l));
-      return r
-    }
-  };
-
-function mxPrintPreview(a, b, c, d, e, f, g, h, k) {
-  this.graph = a;
-  this.scale = null != b ? b : 1 / a.pageScale;
-  this.border = null != d ? d : 0;
-  this.pageFormat = null != c ? c : a.pageFormat;
-  this.title = null != h ? h : "Printer-friendly version";
-  this.x0 = null != e ? e : 0;
-  this.y0 = null != f ? f : 0;
-  this.borderColor = g;
-  this.pageSelector = null != k ? k : !0
-}
-mxPrintPreview.prototype.graph = null;
-mxPrintPreview.prototype.pageFormat = null;
-mxPrintPreview.prototype.scale = null;
-mxPrintPreview.prototype.border = 0;
-mxPrintPreview.prototype.x0 = 0;
-mxPrintPreview.prototype.y0 = 0;
-mxPrintPreview.prototype.autoOrigin = !0;
-mxPrintPreview.prototype.printOverlays = !1;
-mxPrintPreview.prototype.borderColor = null;
-mxPrintPreview.prototype.title = null;
-mxPrintPreview.prototype.pageSelector = null;
-mxPrintPreview.prototype.wnd = null;
-mxPrintPreview.prototype.pageCount = 0;
-mxPrintPreview.prototype.getWindow = function() {
-  return this.wnd
-};
-mxPrintPreview.prototype.getDoctype = function() {
-  var a = "";
-  8 == document.documentMode && (a = '\x3cmeta http-equiv\x3d"X-UA-Compatible" content\x3d"IE\x3d8"\x3e');
-  return a
-};
-mxPrintPreview.prototype.open = function(a) {
-  var b = this.graph.cellRenderer.initializeOverlay,
-    c = null;
-  try {
-    this.printOverlays && (this.graph.cellRenderer.initializeOverlay = function(a, b) {
-      b.init(a.view.getDrawPane())
-    });
-    if (null == this.wnd) {
-      this.wnd = window.open();
-      var d = this.wnd.document,
-        e = this.getDoctype();
-      null != e && 0 < e.length && d.writeln(e);
-      d.writeln("\x3chtml\x3e");
-      d.writeln("\x3chead\x3e");
-      this.writeHead(d, a);
-      d.writeln("\x3c/head\x3e");
-      d.writeln('\x3cbody class\x3d"mxPage"\x3e');
-      mxClient.link("stylesheet", mxClient.basePath +
-        "/css/common.css", d);
-      mxClient.IS_VML && (d.namespaces.add("v", "urn:schemas-microsoft-com:vml"), d.namespaces.add("o", "urn:schemas-microsoft-com:office:office"), d.createStyleSheet().cssText =
-        "v\\:*{behavior:url(#default#VML)}o\\:*{behavior:url(#default#VML)}", mxClient.link("stylesheet", mxClient.basePath + "/css/explorer.css", d));
-      var f = this.graph.getGraphBounds().clone(),
-        g = this.graph.getView().getScale(),
-        h = g / this.scale,
-        k = this.graph.getView().getTranslate();
-      this.autoOrigin || (this.x0 = -k.x * this.scale, this.y0 = -k.y * this.scale, f.width += f.x, f.height += f.y, f.x = 0, this.border = f.y = 0);
-      f.width /= h;
-      f.height /= h;
-      var l = this.pageFormat.width - 2 * this.border,
-        m = this.pageFormat.height - 2 * this.border,
-        n = Math.max(1, Math.ceil((f.width + this.x0) / l)),
-        p = Math.max(1, Math.ceil((f.height + this.y0) / m));
-      this.pageCount = n * p;
-      var q = mxUtils.bind(this, function() {
-        if (this.pageSelector && (1 < p || 1 < n)) {
-          var a = this.createPageSelector(p, n);
-          d.body.appendChild(a);
-          if (mxClient.IS_IE) {
-            a.style.position = "absolute";
-            var b = function() {
-              a.style.top = d.body.scrollTop +
-                10 + "px"
-            };
-            mxEvent.addListener(this.wnd, "scroll", function(a) {
-              b()
-            });
-            mxEvent.addListener(this.wnd, "resize", function(a) {
-              b()
-            })
-          }
-        }
-      });
-      a = function(a, b) {
-        null != this.borderColor && (a.style.borderColor = this.borderColor, a.style.borderStyle = "solid", a.style.borderWidth = "1px");
-        a.style.background = "white";
-        b && (a.style.pageBreakAfter = "always");
-        mxClient.IS_IE ? (d.writeln(a.outerHTML), a.parentNode.removeChild(a)) : (a.parentNode.removeChild(a), d.body.appendChild(a));
-        if (b) {
-          var c = d.createElement("hr");
-          c.className = "mxPageBreak";
-          d.body.appendChild(c)
-        }
-      };
-      var s = this.getCoverPages(this.pageFormat.width, this.pageFormat.height);
-      if (null != s)
-        for (var r = 0; r < s.length; r++) a(s[r], !0);
-      for (var t = this.getAppendices(this.pageFormat.width, this.pageFormat.height), r = 0; r < p; r++)
-        for (var v = r * m / this.scale - this.y0 / this.scale + (f.y - k.y * g) / g, s = 0; s < n; s++) {
-          if (null == this.wnd) return null;
-          var w = s * l / this.scale - this.x0 / this.scale + (f.x - k.x * g) / g,
-            u = r * n + s + 1,
-            c = this.renderPage(this.pageFormat.width, this.pageFormat.height, mxUtils.bind(this, function(a) {
-              this.addGraphFragment(-w, -v, this.scale, u, a)
-            }));
-          c.setAttribute("id", "mxPage-" + u);
-          a(c, null != t || r < p - 1 || s < n - 1)
-        }
-      if (null != t)
-        for (r = 0; r < t.length; r++) a(t[r], r < t.length);
-      d.writeln("\x3c/body\x3e");
-      d.writeln("\x3c/html\x3e");
-      d.close();
-      q();
-      mxEvent.release(d.body)
-    }
-    this.wnd.focus()
-  } catch (y) {
-    null != c && null != c.parentNode && c.parentNode.removeChild(c)
-  } finally {
-    this.graph.cellRenderer.initializeOverlay = b
-  }
-  return this.wnd
-};
-mxPrintPreview.prototype.writeHead = function(a, b) {
-  null != this.title && a.writeln("\x3ctitle\x3e" + this.title + "\x3c/title\x3e");
-  a.writeln('\x3cstyle type\x3d"text/css"\x3e');
-  a.writeln("@media print {");
-  a.writeln("  table.mxPageSelector { display: none; }");
-  a.writeln("  hr.mxPageBreak { display: none; }");
-  a.writeln("}");
-  a.writeln("@media screen {");
-  a.writeln("  table.mxPageSelector { position: fixed; right: 10px; top: 10px;font-family: Arial; font-size:10pt; border: solid 1px darkgray;background: white; border-collapse:collapse; }");
-  a.writeln("  table.mxPageSelector td { border: solid 1px gray; padding:4px; }");
-  a.writeln("  body.mxPage { background: gray; }");
-  a.writeln("}");
-  null != b && a.writeln(b);
-  a.writeln("\x3c/style\x3e")
-};
-mxPrintPreview.prototype.createPageSelector = function(a, b) {
-  var c = this.wnd.document,
-    d = c.createElement("table");
-  d.className = "mxPageSelector";
-  d.setAttribute("border", "0");
-  for (var e = c.createElement("tbody"), f = 0; f < a; f++) {
-    for (var g = c.createElement("tr"), h = 0; h < b; h++) {
-      var k = f * b + h + 1,
-        l = c.createElement("td");
-      if (!mxClient.IS_NS || mxClient.IS_SF || mxClient.IS_GC) {
-        var m = c.createElement("a");
-        m.setAttribute("href", "#mxPage-" + k);
-        mxUtils.write(m, k, c);
-        l.appendChild(m)
-      } else mxUtils.write(l, k, c);
-      g.appendChild(l)
-    }
-    e.appendChild(g)
-  }
-  d.appendChild(e);
-  return d
-};
-mxPrintPreview.prototype.renderPage = function(a, b, c) {
-  var d = document.createElement("div");
-  try {
-    d.style.width = a + "px";
-    d.style.height = b + "px";
-    d.style.overflow = "hidden";
-    d.style.pageBreakInside = "avoid";
-    d.style.position = "relative";
-    var e = document.createElement("div");
-    e.style.top = this.border + "px";
-    e.style.left = this.border + "px";
-    e.style.width = a - 2 * this.border + "px";
-    e.style.height = b - 2 * this.border + "px";
-    e.style.overflow = "hidden";
-    this.graph.dialect == mxConstants.DIALECT_VML && (e.style.position = "absolute");
-    d.appendChild(e);
-    document.body.appendChild(d);
-    c(e)
-  } catch (f) {
-    throw d.parentNode.removeChild(d), f;
-  }
-  return d
-};
-mxPrintPreview.prototype.addGraphFragment = function(a, b, c, d, e) {
-  d = this.graph.getView();
-  var f = this.graph.container;
-  this.graph.container = e;
-  var g = d.getCanvas(),
-    h = d.getBackgroundPane(),
-    k = d.getDrawPane(),
-    l = d.getOverlayPane();
-  this.graph.dialect == mxConstants.DIALECT_SVG ? d.createSvg() : this.graph.dialect == mxConstants.DIALECT_VML ? d.createVml() : d.createHtml();
-  var m = d.isEventsEnabled();
-  d.setEventsEnabled(!1);
-  var n = this.graph.isEnabled();
-  this.graph.setEnabled(!1);
-  var p = d.getTranslate();
-  d.translate = new mxPoint(a,
-    b);
-  a = null;
-  try {
-    var q = [this.graph.getModel().getRoot()];
-    a = new mxTemporaryCellStates(d, c, q)
-  } finally {
-    if (mxClient.IS_IE) d.overlayPane.innerHTML = "";
-    else
-      for (c = e.firstChild; null != c;) q = c.nextSibling, b = c.nodeName.toLowerCase(), "svg" == b ? (c.setAttribute("width", parseInt(e.style.width)), c.setAttribute("height", parseInt(e.style.height))) :
-        "default" != c.style.cursor && "table" != b && c.parentNode.removeChild(c), c = q;
-    d.overlayPane.parentNode.removeChild(d.overlayPane);
-    this.graph.setEnabled(n);
-    this.graph.container = f;
-    d.canvas =
-      g;
-    d.backgroundPane = h;
-    d.drawPane = k;
-    d.overlayPane = l;
-    d.translate = p;
-    a.destroy();
-    d.setEventsEnabled(m)
-  }
-};
-mxPrintPreview.prototype.getCoverPages = function() {
-  return null
-};
-mxPrintPreview.prototype.getAppendices = function() {
-  return null
-};
-mxPrintPreview.prototype.print = function() {
-  var a = this.open();
-  null != a && a.print()
-};
-mxPrintPreview.prototype.close = function() {
-  null != this.wnd && (this.wnd.close(), this.wnd = null)
-};
-
-function mxStylesheet() {
-  this.styles = {};
-  this.putDefaultVertexStyle(this.createDefaultVertexStyle());
-  this.putDefaultEdgeStyle(this.createDefaultEdgeStyle())
-}
-mxStylesheet.prototype.createDefaultVertexStyle = function() {
-  var a = {};
-  a[mxConstants.STYLE_SHAPE] = mxConstants.SHAPE_RECTANGLE;
-  a[mxConstants.STYLE_PERIMETER] = mxPerimeter.RectanglePerimeter;
-  a[mxConstants.STYLE_VERTICAL_ALIGN] = mxConstants.ALIGN_MIDDLE;
-  a[mxConstants.STYLE_ALIGN] = mxConstants.ALIGN_CENTER;
-  a[mxConstants.STYLE_FILLCOLOR] = "#C3D9FF";
-  a[mxConstants.STYLE_STROKECOLOR] = "#6482B9";
-  a[mxConstants.STYLE_FONTCOLOR] = "#774400";
-  return a
-};
-mxStylesheet.prototype.createDefaultEdgeStyle = function() {
-  var a = {};
-  a[mxConstants.STYLE_SHAPE] = mxConstants.SHAPE_CONNECTOR;
-  a[mxConstants.STYLE_ENDARROW] = mxConstants.ARROW_CLASSIC;
-  a[mxConstants.STYLE_VERTICAL_ALIGN] = mxConstants.ALIGN_MIDDLE;
-  a[mxConstants.STYLE_ALIGN] = mxConstants.ALIGN_CENTER;
-  a[mxConstants.STYLE_STROKECOLOR] = "#6482B9";
-  a[mxConstants.STYLE_FONTCOLOR] = "#446299";
-  return a
-};
-mxStylesheet.prototype.putDefaultVertexStyle = function(a) {
-  this.putCellStyle("defaultVertex", a)
-};
-mxStylesheet.prototype.putDefaultEdgeStyle = function(a) {
-  this.putCellStyle("defaultEdge", a)
-};
-mxStylesheet.prototype.getDefaultVertexStyle = function() {
-  return this.styles.defaultVertex
-};
-mxStylesheet.prototype.getDefaultEdgeStyle = function() {
-  return this.styles.defaultEdge
-};
-mxStylesheet.prototype.putCellStyle = function(a, b) {
-  this.styles[a] = b
-};
-mxStylesheet.prototype.getCellStyle = function(a, b) {
-  var c = b;
-  if (null != a && 0 < a.length)
-    for (var d = a.split(";"), c = null != c && ";" != a.charAt(0) ? mxUtils.clone(c) : {}, e = 0; e < d.length; e++) {
-      var f = d[e],
-        g = f.indexOf("\x3d");
-      if (0 <= g) {
-        var h = f.substring(0, g),
-          f = f.substring(g + 1);
-        f == mxConstants.NONE ? delete c[h] : mxUtils.isNumeric(f) ? c[h] = parseFloat(f) : c[h] = f
-      } else if (f = this.styles[f], null != f)
-        for (h in f) c[h] = f[h]
-    }
-  return c
-};
-
-function mxCellState(a, b, c) {
-  this.view = a;
-  this.cell = b;
-  this.style = c;
-  this.origin = new mxPoint;
-  this.absoluteOffset = new mxPoint
-}
-mxCellState.prototype = new mxRectangle;
-mxCellState.prototype.constructor = mxCellState;
-mxCellState.prototype.view = null;
-mxCellState.prototype.cell = null;
-mxCellState.prototype.style = null;
-mxCellState.prototype.invalid = !0;
-mxCellState.prototype.invalidOrder = !1;
-mxCellState.prototype.orderChanged = !1;
-mxCellState.prototype.origin = null;
-mxCellState.prototype.absolutePoints = null;
-mxCellState.prototype.absoluteOffset = null;
-mxCellState.prototype.visibleSourceState = null;
-mxCellState.prototype.visibleTargetState = null;
-mxCellState.prototype.terminalDistance = 0;
-mxCellState.prototype.length = 0;
-mxCellState.prototype.segments = null;
-mxCellState.prototype.shape = null;
-mxCellState.prototype.text = null;
-mxCellState.prototype.getPerimeterBounds = function(a, b) {
-  a = a || 0;
-  b = null != b ? b : new mxRectangle(this.x, this.y, this.width, this.height);
-  if (null != this.shape && null != this.shape.stencil) {
-    var c = this.shape.stencil.computeAspect(this.style, b.x, b.y, b.width, b.height);
-    b.x = c.x;
-    b.y = c.y;
-    b.width = this.shape.stencil.w0 * c.width;
-    b.height = this.shape.stencil.h0 * c.height
-  }
-  0 != a && b.grow(a);
-  return b
-};
-mxCellState.prototype.setAbsoluteTerminalPoint = function(a, b) {
-  b ? (null == this.absolutePoints && (this.absolutePoints = []), 0 == this.absolutePoints.length ? this.absolutePoints.push(a) : this.absolutePoints[0] = a) : null == this.absolutePoints ? (this.absolutePoints = [],
-    this.absolutePoints.push(null), this.absolutePoints.push(a)) : 1 == this.absolutePoints.length ? this.absolutePoints.push(a) : this.absolutePoints[this.absolutePoints.length - 1] = a
-};
-mxCellState.prototype.setCursor = function(a) {
-  null != this.shape && this.shape.setCursor(a);
-  null != this.text && this.text.setCursor(a)
-};
-mxCellState.prototype.getVisibleTerminal = function(a) {
-  a = this.getVisibleTerminalState(a);
-  return null != a ? a.cell : null
-};
-mxCellState.prototype.getVisibleTerminalState = function(a) {
-  return a ? this.visibleSourceState : this.visibleTargetState
-};
-mxCellState.prototype.setVisibleTerminalState = function(a, b) {
-  b ? this.visibleSourceState = a : this.visibleTargetState = a
-};
-mxCellState.prototype.destroy = function() {
-  this.view.graph.cellRenderer.destroy(this)
-};
-mxCellState.prototype.clone = function() {
-  var a = new mxCellState(this.view, this.cell, this.style);
-  if (null != this.absolutePoints) {
-    a.absolutePoints = [];
-    for (var b = 0; b < this.absolutePoints.length; b++) a.absolutePoints[b] = this.absolutePoints[b].clone()
-  }
-  null != this.origin && (a.origin = this.origin.clone());
-  null != this.absoluteOffset && (a.absoluteOffset = this.absoluteOffset.clone());
-  null != this.boundingBox && (a.boundingBox = this.boundingBox.clone());
-  a.terminalDistance = this.terminalDistance;
-  a.segments = this.segments;
-  a.length =
-    this.length;
-  a.x = this.x;
-  a.y = this.y;
-  a.width = this.width;
-  a.height = this.height;
-  return a
-};
-
-function mxGraphSelectionModel(a) {
-  this.graph = a;
-  this.cells = []
-}
-mxGraphSelectionModel.prototype = new mxEventSource;
-mxGraphSelectionModel.prototype.constructor = mxGraphSelectionModel;
-mxGraphSelectionModel.prototype.doneResource = "none" != mxClient.language ? "done" : "";
-mxGraphSelectionModel.prototype.updatingSelectionResource = "none" != mxClient.language ? "updatingSelection" : "";
-mxGraphSelectionModel.prototype.graph = null;
-mxGraphSelectionModel.prototype.singleSelection = !1;
-mxGraphSelectionModel.prototype.isSingleSelection = function() {
-  return this.singleSelection
-};
-mxGraphSelectionModel.prototype.setSingleSelection = function(a) {
-  this.singleSelection = a
-};
-mxGraphSelectionModel.prototype.isSelected = function(a) {
-  return null != a ? 0 <= mxUtils.indexOf(this.cells, a) : !1
-};
-mxGraphSelectionModel.prototype.isEmpty = function() {
-  return 0 == this.cells.length
-};
-mxGraphSelectionModel.prototype.clear = function() {
-  this.changeSelection(null, this.cells)
-};
-mxGraphSelectionModel.prototype.setCell = function(a) {
-  null != a && this.setCells([a])
-};
-mxGraphSelectionModel.prototype.setCells = function(a) {
-  if (null != a) {
-    this.singleSelection && (a = [this.getFirstSelectableCell(a)]);
-    for (var b = [], c = 0; c < a.length; c++) this.graph.isCellSelectable(a[c]) && b.push(a[c]);
-    this.changeSelection(b, this.cells)
-  }
-};
-mxGraphSelectionModel.prototype.getFirstSelectableCell = function(a) {
-  if (null != a)
-    for (var b = 0; b < a.length; b++)
-      if (this.graph.isCellSelectable(a[b])) return a[b];
-  return null
-};
-mxGraphSelectionModel.prototype.addCell = function(a) {
-  null != a && this.addCells([a])
-};
-mxGraphSelectionModel.prototype.addCells = function(a) {
-  if (null != a) {
-    var b = null;
-    this.singleSelection && (b = this.cells, a = [this.getFirstSelectableCell(a)]);
-    for (var c = [], d = 0; d < a.length; d++) !this.isSelected(a[d]) && this.graph.isCellSelectable(a[d]) && c.push(a[d]);
-    this.changeSelection(c, b)
-  }
-};
-mxGraphSelectionModel.prototype.removeCell = function(a) {
-  null != a && this.removeCells([a])
-};
-mxGraphSelectionModel.prototype.removeCells = function(a) {
-  if (null != a) {
-    for (var b = [], c = 0; c < a.length; c++) this.isSelected(a[c]) && b.push(a[c]);
-    this.changeSelection(null, b)
-  }
-};
-mxGraphSelectionModel.prototype.changeSelection = function(a, b) {
-  if (null != a && 0 < a.length && null != a[0] || null != b && 0 < b.length && null != b[0]) {
-    var c = new mxSelectionChange(this, a, b);
-    c.execute();
-    var d = new mxUndoableEdit(this, !1);
-    d.add(c);
-    this.fireEvent(new mxEventObject(mxEvent.UNDO, "edit", d))
-  }
-};
-mxGraphSelectionModel.prototype.cellAdded = function(a) {
-  null != a && !this.isSelected(a) && this.cells.push(a)
-};
-mxGraphSelectionModel.prototype.cellRemoved = function(a) {
-  null != a && (a = mxUtils.indexOf(this.cells, a), 0 <= a && this.cells.splice(a, 1))
-};
-
-function mxSelectionChange(a, b, c) {
-  this.selectionModel = a;
-  this.added = null != b ? b.slice() : null;
-  this.removed = null != c ? c.slice() : null
-}
-mxSelectionChange.prototype.execute = function() {
-  var a = mxLog.enter("mxSelectionChange.execute");
-  window.status = mxResources.get(this.selectionModel.updatingSelectionResource) || this.selectionModel.updatingSelectionResource;
-  if (null != this.removed)
-    for (var b = 0; b < this.removed.length; b++) this.selectionModel.cellRemoved(this.removed[b]);
-  if (null != this.added)
-    for (b = 0; b < this.added.length; b++) this.selectionModel.cellAdded(this.added[b]);
-  b = this.added;
-  this.added = this.removed;
-  this.removed = b;
-  window.status = mxResources.get(this.selectionModel.doneResource) ||
-    this.selectionModel.doneResource;
-  mxLog.leave("mxSelectionChange.execute", a);
-  this.selectionModel.fireEvent(new mxEventObject(mxEvent.CHANGE, "added", this.added, "removed", this.removed))
-};
-
-function mxCellEditor(a) {
-  this.graph = a
-}
-mxCellEditor.prototype.graph = null;
-mxCellEditor.prototype.textarea = null;
-mxCellEditor.prototype.editingCell = null;
-mxCellEditor.prototype.trigger = null;
-mxCellEditor.prototype.modified = !1;
-mxCellEditor.prototype.autoSize = !0;
-mxCellEditor.prototype.emptyLabelText = "";
-mxCellEditor.prototype.textNode = "";
-mxCellEditor.prototype.init = function() {
-  this.textarea = document.createElement("textarea");
-  this.textarea.className = "mxCellEditor";
-  this.textarea.style.position = "absolute";
-  this.textarea.style.overflow = "visible";
-  this.textarea.setAttribute("cols", "20");
-  this.textarea.setAttribute("rows", "4");
-  mxClient.IS_NS && (this.textarea.style.resize = "none");
-  mxEvent.addListener(this.textarea, "blur", mxUtils.bind(this, function(a) {
-    this.focusLost()
-  }));
-  mxEvent.addListener(this.textarea, "keydown", mxUtils.bind(this, function(a) {
-    mxEvent.isConsumed(a) ||
-      (113 == a.keyCode || this.graph.isEnterStopsCellEditing() && 13 == a.keyCode && !mxEvent.isControlDown(a) && !mxEvent.isShiftDown(a) ? (this.graph.stopEditing(!1), mxEvent.consume(a)) :
-        27 == a.keyCode ? (this.graph.stopEditing(!0), mxEvent.consume(a)) : (this.clearOnChange && (this.clearOnChange = !1, this.textarea.value = ""), this.setModified(!0)))
-  }));
-  mxEvent.addListener(this.textarea, "keypress", mxUtils.bind(this, function(a) {
-    this.autoSize && !mxEvent.isConsumed(a) && setTimeout(mxUtils.bind(this, function() {
-      this.resize()
-    }), 0)
-  }))
-};
-mxCellEditor.prototype.resize = function() {
-  if (null != this.textDiv) {
-    var a = this.graph.getView().getState(this.editingCell),
-      b = this.graph.isLabelClipped(a.cell),
-      c = this.graph.isWrapping(a.cell);
-    if (this.graph.getModel().isEdge(a.cell)) this.bounds.x = a.absoluteOffset.x, this.bounds.y = a.absoluteOffset.y, this.bounds.width = 0, this.bounds.height = 0;
-    else if (null != this.bounds) {
-      this.bounds.x = a.x;
-      this.bounds.y = a.y;
-      this.bounds.width = a.width;
-      this.bounds.height = a.height;
-      var d = mxUtils.getValue(a.style, mxConstants.STYLE_LABEL_POSITION,
-        mxConstants.ALIGN_CENTER);
-      d == mxConstants.ALIGN_LEFT ? this.bounds.x -= a.width : d == mxConstants.ALIGN_RIGHT && (this.bounds.x += a.width);
-      d = mxUtils.getValue(a.style, mxConstants.STYLE_VERTICAL_LABEL_POSITION, mxConstants.ALIGN_MIDDLE);
-      d == mxConstants.ALIGN_TOP ? this.bounds.y -= a.height : d == mxConstants.ALIGN_BOTTOM && (this.bounds.y += a.height)
-    }
-    d = this.textarea.value;
-    if ("\n" == d.charAt(d.length - 1) || "" == d) d += "\x26nbsp;";
-    d = mxUtils.htmlEntities(d, !1);
-    c ? (this.textDiv.style.whiteSpace = "normal", this.textDiv.style.width = this.bounds.width +
-      "px") : d = d.replace(/ /g, "\x26nbsp;");
-    d = d.replace(/\n/g, "\x3cbr/\x3e");
-    this.textDiv.innerHTML = d;
-    var d = this.textDiv.offsetWidth + 30,
-      e = this.textDiv.offsetHeight + 16,
-      d = Math.max(d, 40),
-      e = Math.max(e, 20);
-    b && (d = Math.min(this.bounds.width - 4, d), e = Math.min(this.bounds.height, e));
-    var f = null != a.text ? a.text.margin : null;
-    null == f && (f = mxUtils.getValue(a.style, mxConstants.STYLE_ALIGN, mxConstants.ALIGN_CENTER), a = mxUtils.getValue(a.style, mxConstants.STYLE_VERTICAL_ALIGN, mxConstants.ALIGN_MIDDLE), f =
-      mxUtils.getAlignmentAsPoint(f,
-        a));
-    if (null != f) {
-      if (b || !c) this.textarea.style.left = Math.max(0, Math.round(this.bounds.x - f.x * this.bounds.width + f.x * d) - 3) + "px";
-      this.textarea.style.top = Math.max(0, Math.round(this.bounds.y - f.y * this.bounds.height + f.y * e) + 4) + "px"
-    }
-    if (b || !c) this.textarea.style.width = d + "px";
-    this.textarea.style.height = e + "px"
-  }
-};
-mxCellEditor.prototype.isModified = function() {
-  return this.modified
-};
-mxCellEditor.prototype.setModified = function(a) {
-  this.modified = a
-};
-mxCellEditor.prototype.focusLost = function() {
-  this.stopEditing(!this.graph.isInvokesStopCellEditing())
-};
-mxCellEditor.prototype.startEditing = function(a, b) {
-  null == this.textarea && this.init();
-  this.stopEditing(!0);
-  var c = this.graph.getView().getState(a);
-  if (null != c) {
-    this.editingCell = a;
-    this.trigger = b;
-    this.textNode = null;
-    null != c.text && this.isHideLabel(c) && (this.textNode = c.text.node, this.textNode.style.visibility = "hidden");
-    var d = this.graph.getView().scale,
-      d = mxUtils.getValue(c.style, mxConstants.STYLE_FONTSIZE, mxConstants.DEFAULT_FONTSIZE) * d,
-      e = mxUtils.getValue(c.style, mxConstants.STYLE_FONTFAMILY, mxConstants.DEFAULT_FONTFAMILY),
-      f = mxUtils.getValue(c.style, mxConstants.STYLE_FONTCOLOR, "black"),
-      g = mxUtils.getValue(c.style, mxConstants.STYLE_ALIGN, mxConstants.ALIGN_LEFT),
-      h = (mxUtils.getValue(c.style, mxConstants.STYLE_FONTSTYLE, 0) & mxConstants.FONT_BOLD) == mxConstants.FONT_BOLD,
-      k = (mxUtils.getValue(c.style, mxConstants.STYLE_FONTSTYLE, 0) & mxConstants.FONT_ITALIC) == mxConstants.FONT_ITALIC,
-      l = (mxUtils.getValue(c.style, mxConstants.STYLE_FONTSTYLE, 0) & mxConstants.FONT_UNDERLINE) == mxConstants.FONT_UNDERLINE;
-    this.textarea.style.fontSize = Math.round(d) +
-      "px";
-    this.textarea.style.lineHeight = Math.round(d * mxConstants.LINE_HEIGHT) + "px";
-    this.textarea.style.fontFamily = e;
-    this.textarea.style.textAlign = g;
-    this.textarea.style.color = f;
-    this.textarea.style.fontWeight = h ? "bold" : "normal";
-    this.textarea.style.fontStyle = k ? "italic" : "";
-    this.textarea.style.textDecoration = l ? "underline" : "";
-    this.textarea.style.overflow = "auto";
-    this.textarea.style.outline = "none";
-    this.bounds = d = this.getEditorBounds(c);
-    this.textarea.style.left = d.x + "px";
-    this.textarea.style.top = d.y + "px";
-    this.textarea.style.width =
-      d.width + "px";
-    this.textarea.style.height = d.height + "px";
-    this.textarea.style.zIndex = 5;
-    c = this.getInitialValue(c, b);
-    null == c || 0 == c.length ? (c = this.getEmptyLabelText(), this.clearOnChange = !0) : this.clearOnChange = !1;
-    this.setModified(!1);
-    this.textarea.value = c;
-    this.graph.container.appendChild(this.textarea);
-    "none" != this.textarea.style.display && (this.autoSize && (this.textDiv = this.createTextDiv(), document.body.appendChild(this.textDiv), this.resize()), this.textarea.focus(), this.textarea.select())
-  }
-};
-mxCellEditor.prototype.createTextDiv = function() {
-  var a = document.createElement("div"),
-    b = a.style;
-  b.position = "absolute";
-  b.whiteSpace = "nowrap";
-  b.visibility = "hidden";
-  b.display = mxClient.IS_QUIRKS ? "inline" : "inline-block";
-  b.zoom = "1";
-  b.verticalAlign = "top";
-  b.lineHeight = this.textarea.style.lineHeight;
-  b.fontSize = this.textarea.style.fontSize;
-  b.fontFamily = this.textarea.style.fontFamily;
-  b.fontWeight = this.textarea.style.fontWeight;
-  b.textAlign = this.textarea.style.textAlign;
-  b.fontStyle = this.textarea.style.fontStyle;
-  b.textDecoration = this.textarea.style.textDecoration;
-  return a
-};
-mxCellEditor.prototype.stopEditing = function(a) {
-  null != this.editingCell && (null != this.textNode && (this.textNode.style.visibility = "visible", this.textNode = null), !a && this.isModified() && this.graph.labelChanged(this.editingCell, this
-      .getCurrentValue(), this.trigger), null != this.textDiv && (document.body.removeChild(this.textDiv), this.textDiv = null), this.bounds = this.trigger = this.editingCell = null, this.textarea
-    .blur(), this.textarea.parentNode.removeChild(this.textarea))
-};
-mxCellEditor.prototype.getInitialValue = function(a, b) {
-  return this.graph.getEditingValue(a.cell, b)
-};
-mxCellEditor.prototype.getCurrentValue = function() {
-  return this.textarea.value.replace(/\r/g, "")
-};
-mxCellEditor.prototype.isHideLabel = function(a) {
-  return !0
-};
-mxCellEditor.prototype.getMinimumSize = function(a) {
-  var b = this.graph.getView().scale;
-  return new mxRectangle(0, 0, null == a.text ? 30 : a.text.size * b + 20, "left" == this.textarea.style.textAlign ? 120 : 40)
-};
-mxCellEditor.prototype.getEditorBounds = function(a) {
-  var b = this.graph.getModel().isEdge(a.cell),
-    c = this.graph.getView().scale,
-    d = this.getMinimumSize(a),
-    e = d.width,
-    d = d.height,
-    f = parseInt(a.style[mxConstants.STYLE_SPACING] || 2) * c,
-    g = parseInt(a.style[mxConstants.STYLE_SPACING_TOP] || 0) * c + f,
-    h = parseInt(a.style[mxConstants.STYLE_SPACING_RIGHT] || 0) * c + f,
-    k = parseInt(a.style[mxConstants.STYLE_SPACING_BOTTOM] || 0) * c + f,
-    c = parseInt(a.style[mxConstants.STYLE_SPACING_LEFT] || 0) * c + f,
-    h = new mxRectangle(a.x, a.y, Math.max(e, a.width -
-      c - h), Math.max(d, a.height - g - k));
-  b ? (h.x = a.absoluteOffset.x, h.y = a.absoluteOffset.y, null != a.text && null != a.text.boundingBox && (0 < a.text.boundingBox.x && (h.x = a.text.boundingBox.x), 0 < a.text.boundingBox.y && (h.y =
-    a.text.boundingBox.y))) : null != a.text && null != a.text.boundingBox && (h.x = Math.min(h.x, a.text.boundingBox.x), h.y = Math.min(h.y, a.text.boundingBox.y));
-  h.x += c;
-  h.y += g;
-  null != a.text && null != a.text.boundingBox && (b ? (h.width = Math.max(e, a.text.boundingBox.width), h.height = Math.max(d, a.text.boundingBox.height)) : (h.width =
-    Math.max(h.width, a.text.boundingBox.width), h.height = Math.max(h.height, a.text.boundingBox.height)));
-  this.graph.getModel().isVertex(a.cell) && (b = mxUtils.getValue(a.style, mxConstants.STYLE_LABEL_POSITION, mxConstants.ALIGN_CENTER), b == mxConstants.ALIGN_LEFT ? h.x -= a.width : b ==
-    mxConstants.ALIGN_RIGHT && (h.x += a.width), b = mxUtils.getValue(a.style, mxConstants.STYLE_VERTICAL_LABEL_POSITION, mxConstants.ALIGN_MIDDLE), b == mxConstants.ALIGN_TOP ? h.y -= a.height :
-    b == mxConstants.ALIGN_BOTTOM && (h.y += a.height));
-  return h
-};
-mxCellEditor.prototype.getEmptyLabelText = function(a) {
-  return this.emptyLabelText
-};
-mxCellEditor.prototype.getEditingCell = function() {
-  return this.editingCell
-};
-mxCellEditor.prototype.destroy = function() {
-  null != this.textarea && (mxEvent.release(this.textarea), null != this.textarea.parentNode && this.textarea.parentNode.removeChild(this.textarea), this.textarea = null)
-};
-
-function mxCellRenderer() {}
-mxCellRenderer.prototype.defaultEdgeShape = mxConnector;
-mxCellRenderer.prototype.defaultVertexShape = mxRectangleShape;
-mxCellRenderer.prototype.defaultTextShape = mxText;
-mxCellRenderer.prototype.legacyControlPosition = !0;
-mxCellRenderer.prototype.defaultShapes = {};
-mxCellRenderer.registerShape = function(a, b) {
-  mxCellRenderer.prototype.defaultShapes[a] = b
-};
-mxCellRenderer.registerShape(mxConstants.SHAPE_RECTANGLE, mxRectangleShape);
-mxCellRenderer.registerShape(mxConstants.SHAPE_ELLIPSE, mxEllipse);
-mxCellRenderer.registerShape(mxConstants.SHAPE_RHOMBUS, mxRhombus);
-mxCellRenderer.registerShape(mxConstants.SHAPE_CYLINDER, mxCylinder);
-mxCellRenderer.registerShape(mxConstants.SHAPE_CONNECTOR, mxConnector);
-mxCellRenderer.registerShape(mxConstants.SHAPE_ACTOR, mxActor);
-mxCellRenderer.registerShape(mxConstants.SHAPE_TRIANGLE, mxTriangle);
-mxCellRenderer.registerShape(mxConstants.SHAPE_HEXAGON, mxHexagon);
-mxCellRenderer.registerShape(mxConstants.SHAPE_CLOUD, mxCloud);
-mxCellRenderer.registerShape(mxConstants.SHAPE_LINE, mxLine);
-mxCellRenderer.registerShape(mxConstants.SHAPE_ARROW, mxArrow);
-mxCellRenderer.registerShape(mxConstants.SHAPE_DOUBLE_ELLIPSE, mxDoubleEllipse);
-mxCellRenderer.registerShape(mxConstants.SHAPE_SWIMLANE, mxSwimlane);
-mxCellRenderer.registerShape(mxConstants.SHAPE_IMAGE, mxImageShape);
-mxCellRenderer.registerShape(mxConstants.SHAPE_LABEL, mxLabel);
-mxCellRenderer.prototype.initialize = function(a, b) {
-  var c = a.view.graph.getModel();
-  if (null != a.view.graph.container && null == a.shape && a.cell != a.view.currentRoot && (c.isVertex(a.cell) || c.isEdge(a.cell)))
-    if (this.createShape(a), null != a.shape && (null == b || b)) this.initializeShape(a), a.view.graph.ordered || c.isEdge(a.cell) ? a.invalidOrder = !0 : a.view.graph.keepEdgesInForeground &&
-      null != this.firstEdge && (this.firstEdge.parentNode == a.shape.node.parentNode ? this.insertState(a, this.firstEdge) : this.firstEdge = null), a.shape.scale =
-      a.view.scale, this.createCellOverlays(a), this.installListeners(a)
-};
-mxCellRenderer.prototype.initializeShape = function(a) {
-  a.shape.init(a.view.getDrawPane())
-};
-mxCellRenderer.prototype.getPreviousStateInContainer = function(a, b) {
-  for (var c = null, d = a.view.graph, e = d.getModel(), f = a.cell, g = e.getParent(f); null != g && null == c;) c = this.findPreviousStateInContainer(d, g, f, b), f = g, g = e.getParent(f);
-  return c
-};
-mxCellRenderer.prototype.findPreviousStateInContainer = function(a, b, c, d) {
-  var e = null,
-    f = a.getModel();
-  for (c = null != c ? b.getIndex(c) - 1 : f.getChildCount(b) - 1; 0 <= c && null == e; c--) e = this.findPreviousStateInContainer(a, f.getChildAt(b, c), null, d);
-  if (null == e && (e = a.view.getState(b), null != e && (null == e.shape || null == e.shape.node || e.shape.node.parentNode != d))) e = null;
-  return e
-};
-mxCellRenderer.prototype.order = function(a) {
-  var b = a.shape.node.parentNode,
-    c = this.getPreviousStateInContainer(a, b),
-    d = b.firstChild;
-  null != c && (d = c.shape.node, null != c.text && (null != c.text.node && c.text.node.parentNode == b) && (d = c.text.node), d = d.nextSibling);
-  this.insertState(a, d)
-};
-mxCellRenderer.prototype.orderEdge = function(a) {
-  var b = a.view,
-    c = b.graph.getModel();
-  if (b.graph.keepEdgesInForeground) {
-    if (null == this.firstEdge || null == this.firstEdge.parentNode || this.firstEdge.parentNode != a.shape.node.parentNode) this.firstEdge = a.shape.node
-  } else if (b.graph.keepEdgesInBackground) {
-    var d = a.shape.node,
-      e = d.parentNode,
-      c = c.getParent(a.cell),
-      b = b.getState(c),
-      e = null != b && null != b.shape && null != b.shape.node ? b.shape.node.nextSibling : e.firstChild;
-    null != e && e != d && this.insertState(a, e)
-  }
-};
-mxCellRenderer.prototype.insertState = function(a, b) {
-  a.shape.node.parentNode.insertBefore(a.shape.node, b);
-  null != a.text && (null != a.text.node && a.text.node.parentNode == a.shape.node.parentNode) && a.shape.node.parentNode.insertBefore(a.text.node, a.shape.node.nextSibling)
-};
-mxCellRenderer.prototype.createShape = function(a) {
-  if (null != a.style) {
-    var b = mxStencilRegistry.getStencil(a.style[mxConstants.STYLE_SHAPE]);
-    null != b ? a.shape = new mxShape(b) : (b = this.getShapeConstructor(a), a.shape = new b);
-    a.shape.points = a.absolutePoints;
-    a.shape.bounds = new mxRectangle(a.x, a.y, a.width, a.height);
-    a.shape.dialect = a.view.graph.dialect;
-    this.configureShape(a)
-  }
-};
-mxCellRenderer.prototype.getShape = function(a) {
-  return null != a ? mxCellRenderer.prototype.defaultShapes[a] : null
-};
-mxCellRenderer.prototype.getShapeConstructor = function(a) {
-  var b = this.getShape(a.style[mxConstants.STYLE_SHAPE]);
-  null == b && (b = a.view.graph.getModel().isEdge(a.cell) ? this.defaultEdgeShape : this.defaultVertexShape);
-  return b
-};
-mxCellRenderer.prototype.configureShape = function(a) {
-  a.shape.apply(a);
-  a.shape.image = a.view.graph.getImage(a);
-  a.shape.indicatorShape = this.getShape(a.view.graph.getIndicatorShape(a));
-  a.shape.indicatorColor = a.view.graph.getIndicatorColor(a);
-  a.shape.indicatorGradientColor = a.view.graph.getIndicatorGradientColor(a);
-  a.shape.indicatorDirection = a.style[mxConstants.STYLE_INDICATOR_DIRECTION];
-  a.shape.indicatorImage = a.view.graph.getIndicatorImage(a);
-  this.postConfigureShape(a)
-};
-mxCellRenderer.prototype.postConfigureShape = function(a) {
-  null != a.shape && (this.resolveColor(a, "indicatorColor", mxConstants.STYLE_FILLCOLOR), this.resolveColor(a, "indicatorGradientColor", mxConstants.STYLE_GRADIENTCOLOR), this.resolveColor(a,
-    "fill", mxConstants.STYLE_FILLCOLOR), this.resolveColor(a, "stroke", mxConstants.STYLE_STROKECOLOR), this.resolveColor(a, "gradient", mxConstants.STYLE_GRADIENTCOLOR))
-};
-mxCellRenderer.prototype.resolveColor = function(a, b, c) {
-  var d = a.shape[b],
-    e = a.view.graph,
-    f = null;
-  "inherit" == d ? f = e.model.getParent(a.cell) : "swimlane" == d ? (f = null != e.model.getTerminal(a.cell, !1) ? e.model.getTerminal(a.cell, !1) : a.cell, f = e.getSwimlane(f), c = e.swimlaneIndicatorColorAttribute) :
-    "indicated" == d && (a.shape[b] = a.shape.indicatorColor);
-  null != f && (d = e.getView().getState(f), a.shape[b] = null, null != d && (a.shape[b] = null != d.shape && "indicatorColor" != b ? d.shape[b] : d.style[c]))
-};
-mxCellRenderer.prototype.getLabelValue = function(a) {
-  return a.view.graph.getLabel(a.cell)
-};
-mxCellRenderer.prototype.createLabel = function(a, b) {
-  var c = a.view.graph;
-  c.getModel().isEdge(a.cell);
-  if (0 < a.style[mxConstants.STYLE_FONTSIZE] || null == a.style[mxConstants.STYLE_FONTSIZE]) {
-    var d = c.isHtmlLabel(a.cell) || null != b && mxUtils.isNode(b);
-    a.text = new this.defaultTextShape(b, new mxRectangle, a.style[mxConstants.STYLE_ALIGN] || mxConstants.ALIGN_CENTER, c.getVerticalAlign(a), a.style[mxConstants.STYLE_FONTCOLOR], a.style[
-        mxConstants.STYLE_FONTFAMILY], a.style[mxConstants.STYLE_FONTSIZE], a.style[mxConstants.STYLE_FONTSTYLE],
-      a.style[mxConstants.STYLE_SPACING], a.style[mxConstants.STYLE_SPACING_TOP], a.style[mxConstants.STYLE_SPACING_RIGHT], a.style[mxConstants.STYLE_SPACING_BOTTOM], a.style[mxConstants.STYLE_SPACING_LEFT],
-      a.style[mxConstants.STYLE_HORIZONTAL], a.style[mxConstants.STYLE_LABEL_BACKGROUNDCOLOR], a.style[mxConstants.STYLE_LABEL_BORDERCOLOR], c.isWrapping(a.cell) && c.isHtmlLabel(a.cell), c.isLabelClipped(
-        a.cell), a.style[mxConstants.STYLE_OVERFLOW], a.style[mxConstants.STYLE_LABEL_PADDING]);
-    a.text.opacity = mxUtils.getValue(a.style,
-      mxConstants.STYLE_TEXT_OPACITY, 100);
-    a.text.dialect = d ? mxConstants.DIALECT_STRICTHTML : a.view.graph.dialect;
-    a.text.state = a;
-    this.initializeLabel(a);
-    var e = !1,
-      f = function(b) {
-        var d = a;
-        if (mxClient.IS_TOUCH || e) d = mxEvent.getClientX(b), b = mxEvent.getClientY(b), b = mxUtils.convertPoint(c.container, d, b), d = c.view.getState(c.getCellAt(b.x, b.y));
-        return d
-      };
-    mxEvent.addGestureListeners(a.text.node, mxUtils.bind(this, function(b) {
-      this.isLabelEvent(a, b) && (c.fireMouseEvent(mxEvent.MOUSE_DOWN, new mxMouseEvent(b, a)), e = c.dialect !=
-        mxConstants.DIALECT_SVG && "IMG" == mxEvent.getSource(b).nodeName)
-    }), mxUtils.bind(this, function(b) {
-      this.isLabelEvent(a, b) && c.fireMouseEvent(mxEvent.MOUSE_MOVE, new mxMouseEvent(b, f(b)))
-    }), mxUtils.bind(this, function(b) {
-      this.isLabelEvent(a, b) && (c.fireMouseEvent(mxEvent.MOUSE_UP, new mxMouseEvent(b, f(b))), e = !1)
-    }));
-    mxEvent.addListener(a.text.node, "dblclick", mxUtils.bind(this, function(b) {
-      this.isLabelEvent(a, b) && (c.dblClick(b, a.cell), mxEvent.consume(b))
-    }))
-  }
-};
-mxCellRenderer.prototype.initializeLabel = function(a) {
-  var b = a.view.graph;
-  a.text.dialect != mxConstants.DIALECT_SVG && (mxClient.IS_SVG && mxClient.NO_FO ? a.text.init(b.container) : mxUtils.isVml(a.view.getDrawPane()) && (null != a.shape.label ? a.text.init(a.shape.label) :
-    a.text.init(a.shape.node)));
-  null == a.text.node && (a.text.init(a.view.getDrawPane()), null != a.shape && null != a.text && a.shape.node.parentNode.insertBefore(a.text.node, a.shape.node.nextSibling))
-};
-mxCellRenderer.prototype.createCellOverlays = function(a) {
-  var b = a.view.graph.getCellOverlays(a.cell),
-    c = null;
-  if (null != b)
-    for (var c = new mxDictionary, d = 0; d < b.length; d++) {
-      var e = null != a.overlays ? a.overlays.remove(b[d]) : null;
-      null == e && (e = new mxImageShape(new mxRectangle, b[d].image.src), e.dialect = a.view.graph.dialect, e.preserveImageAspect = !1, e.overlay = b[d], this.initializeOverlay(a, e), this.installCellOverlayListeners(
-        a, b[d], e), null != b[d].cursor && (e.node.style.cursor = b[d].cursor));
-      c.put(b[d], e)
-    }
-  null != a.overlays &&
-    a.overlays.visit(function(a, b) {
-      b.destroy()
-    });
-  a.overlays = c
-};
-mxCellRenderer.prototype.initializeOverlay = function(a, b) {
-  b.init(a.view.getOverlayPane())
-};
-mxCellRenderer.prototype.installCellOverlayListeners = function(a, b, c) {
-  var d = a.view.graph;
-  mxEvent.addListener(c.node, "click", function(c) {
-    d.isEditing() && d.stopEditing(!d.isInvokesStopCellEditing());
-    b.fireEvent(new mxEventObject(mxEvent.CLICK, "event", c, "cell", a.cell))
-  });
-  mxEvent.addGestureListeners(c.node, function(a) {
-    mxEvent.consume(a)
-  }, function(b) {
-    d.fireMouseEvent(mxEvent.MOUSE_MOVE, new mxMouseEvent(b, a))
-  });
-  mxClient.IS_TOUCH && mxEvent.addListener(c.node, "touchend", function(c) {
-    b.fireEvent(new mxEventObject(mxEvent.CLICK,
-      "event", c, "cell", a.cell))
-  })
-};
-mxCellRenderer.prototype.createControl = function(a) {
-  var b = a.view.graph,
-    c = b.getFoldingImage(a);
-  if (b.foldingEnabled && null != c) {
-    if (null == a.control) {
-      var d = new mxRectangle(0, 0, c.width, c.height);
-      a.control = new mxImageShape(d, c.src);
-      a.control.preserveImageAspect = !1;
-      a.control.dialect = b.dialect;
-      this.initControl(a, a.control, !0, function(c) {
-        if (b.isEnabled()) {
-          var d = !b.isCellCollapsed(a.cell);
-          b.foldCells(d, !1, [a.cell]);
-          mxEvent.consume(c)
-        }
-      })
-    }
-  } else null != a.control && (a.control.destroy(), a.control = null)
-};
-mxCellRenderer.prototype.initControl = function(a, b, c, d) {
-  var e = a.view.graph;
-  e.isHtmlLabel(a.cell) && mxClient.NO_FO && e.dialect == mxConstants.DIALECT_SVG ? (b.dialect = mxConstants.DIALECT_PREFERHTML, b.init(e.container), b.node.style.zIndex = 1) : b.init(a.view.getOverlayPane());
-  b = b.innerNode || b.node;
-  d && (e.isEnabled() && (b.style.cursor = "pointer"), mxEvent.addListener(b, "click", d));
-  c && mxEvent.addGestureListeners(b, function(b) {
-    e.fireMouseEvent(mxEvent.MOUSE_DOWN, new mxMouseEvent(b, a));
-    mxEvent.consume(b)
-  }, function(b) {
-    e.fireMouseEvent(mxEvent.MOUSE_MOVE,
-      new mxMouseEvent(b, a))
-  });
-  return b
-};
-mxCellRenderer.prototype.isShapeEvent = function(a, b) {
-  return !0
-};
-mxCellRenderer.prototype.isLabelEvent = function(a, b) {
-  return !0
-};
-mxCellRenderer.prototype.installListeners = function(a) {
-  var b = a.view.graph,
-    c = function(c) {
-      var d = a;
-      if (b.dialect != mxConstants.DIALECT_SVG && "IMG" == mxEvent.getSource(c).nodeName || mxClient.IS_TOUCH) d = mxEvent.getClientX(c), c = mxEvent.getClientY(c), c = mxUtils.convertPoint(b.container,
-        d, c), d = b.view.getState(b.getCellAt(c.x, c.y));
-      return d
-    },
-    d = !1;
-  mxEvent.addListener(a.shape.node, "gesturestart", mxUtils.bind(this, function(a) {
-    b.lastTouchTime = 0;
-    d = !0;
-    mxEvent.consume(a)
-  }));
-  mxEvent.addGestureListeners(a.shape.node, mxUtils.bind(this,
-    function(c) {
-      this.isShapeEvent(a, c) && !d ? b.fireMouseEvent(mxEvent.MOUSE_DOWN, new mxMouseEvent(c, null != a.shape && mxEvent.getSource(c) == a.shape.content ? null : a)) : d && mxEvent.consume(c)
-    }), mxUtils.bind(this, function(e) {
-    this.isShapeEvent(a, e) && !d ? b.fireMouseEvent(mxEvent.MOUSE_MOVE, new mxMouseEvent(e, null != a.shape && mxEvent.getSource(e) == a.shape.content ? null : c(e))) : d && mxEvent.consume(
-      e)
-  }), mxUtils.bind(this, function(e) {
-    this.isShapeEvent(a, e) && !d ? b.fireMouseEvent(mxEvent.MOUSE_UP, new mxMouseEvent(e, null != a.shape &&
-      mxEvent.getSource(e) == a.shape.content ? null : c(e))) : d && mxEvent.consume(e)
-  }));
-  var e = mxClient.IS_TOUCH ? "gestureend" : "dblclick";
-  mxEvent.addListener(a.shape.node, e, mxUtils.bind(this, function(c) {
-    d = !1;
-    "gestureend" == e ? (b.lastTouchTime = 0, b.gestureEnabled && (b.handleGesture(a, c), mxEvent.consume(c))) : this.isShapeEvent(a, c) && (b.dblClick(c, null != a.shape && mxEvent.getSource(
-      c) == a.shape.content ? null : a.cell), mxEvent.consume(c))
-  }))
-};
-mxCellRenderer.prototype.redrawLabel = function(a, b) {
-  var c = this.getLabelValue(a);
-  if (null == a.text && null != c && (mxUtils.isNode(c) || 0 < c.length)) this.createLabel(a, c);
-  else if (null != a.text && (null == c || 0 == c.length)) a.text.destroy(), a.text = null;
-  if (null != a.text) {
-    var d = a.view.graph,
-      e = d.isWrapping(a.cell),
-      d = d.isLabelClipped(a.cell),
-      f = this.getLabelBounds(a);
-    if (b || a.text.value != c || a.text.isWrapping != e || a.text.isClipping != d || a.text.scale != a.view.scale || !a.text.bounds.equals(f)) a.text.value = c, a.text.bounds = f, a.text.scale =
-      this.getTextScale(a), a.text.isWrapping = e, a.text.isClipping = d, a.text.redraw()
-  }
-};
-mxCellRenderer.prototype.getTextScale = function(a) {
-  return a.view.scale
-};
-mxCellRenderer.prototype.getLabelBounds = function(a) {
-  var b = a.view.graph,
-    c = a.view.scale,
-    d = b.getModel().isEdge(a.cell),
-    e = new mxRectangle(a.absoluteOffset.x, a.absoluteOffset.y);
-  a.text.updateMargin();
-  d ? (d = a.text.getSpacing(), e.x += d.x * c, e.y += d.y * c, b = b.getCellGeometry(a.cell), null != b && (e.width = Math.max(0, a.text.margin.x * b.width * c - a.text.spacingLeft * c - a.text.spacingRight *
-    c), e.height = Math.max(0, a.text.margin.y * b.height * c - a.text.spacingTop * c - a.text.spacingBottom * c))) : (a.text.isPaintBoundsInverted() && (d = e.x,
-      e.x = e.y, e.y = d), e.x += a.x, e.y += a.y, e.width = Math.max(1, a.width), e.height = Math.max(1, a.height), b.isSwimlane(a.cell) && (b = b.getStartSize(a.cell), 0 < b.width ? (d = Math.min(
-      e.width, b.width * c), a.shape.flipH && (e.x += e.width - d), e.width = d) : 0 < b.height && (d = Math.min(e.height, b.height * c), a.shape.flipV && (e.y += e.height - d), e.height = d)),
-    this.rotateLabelBounds(a, e));
-  return e
-};
-mxCellRenderer.prototype.rotateLabelBounds = function(a, b) {
-  if (a.text.isPaintBoundsInverted()) {
-    var c = (a.width - a.height) / 2;
-    b.x += c;
-    b.y -= c;
-    c = b.width;
-    b.width = b.height;
-    b.height = c
-  }
-  b.x -= a.text.margin.x * b.width;
-  b.y -= a.text.margin.y * b.height;
-  if ("fill" != a.style[mxConstants.STYLE_OVERFLOW]) {
-    var c = a.view.scale,
-      d = a.text.getSpacing();
-    b.x += d.x * c;
-    b.y += d.y * c;
-    b.width = Math.max(0, b.width - a.text.spacingLeft * c - a.text.spacingRight * c);
-    b.height = Math.max(0, b.height - a.text.spacingTop * c - a.text.spacingBottom * c)
-  }
-  var e = a.text.getTextRotation();
-  if (0 != e && (null != a && a.view.graph.model.isVertex(a.cell)) && (c = a.getCenterX(), d = a.getCenterY(), b.x != c || b.y != d)) e *= Math.PI / 180, pt = mxUtils.getRotatedPoint(new mxPoint(b.x,
-    b.y), Math.cos(e), Math.sin(e), new mxPoint(c, d)), b.x = pt.x, b.y = pt.y
-};
-mxCellRenderer.prototype.redrawCellOverlays = function(a, b) {
-  this.createCellOverlays(a);
-  if (null != a.overlays) {
-    var c = mxUtils.mod(mxUtils.getValue(a.style, mxConstants.STYLE_ROTATION, 0), 90),
-      d = mxUtils.toRadians(c),
-      e = Math.cos(d),
-      f = Math.sin(d);
-    a.overlays.visit(function(d, h) {
-      var k = h.overlay.getBounds(a);
-      if (!a.view.graph.getModel().isEdge(a.cell) && null != a.shape && 0 != c) {
-        var l = k.getCenterX(),
-          m = k.getCenterY(),
-          m = mxUtils.getRotatedPoint(new mxPoint(l, m), e, f, new mxPoint(a.getCenterX(), a.getCenterY())),
-          l = m.x,
-          m = m.y;
-        k.x =
-          Math.round(l - k.width / 2);
-        k.y = Math.round(m - k.height / 2)
-      }
-      if (b || null == h.bounds || h.scale != a.view.scale || !h.bounds.equals(k)) h.bounds = k, h.scale = a.view.scale, h.redraw()
-    })
-  }
-};
-mxCellRenderer.prototype.redrawControl = function(a, b) {
-  if (null != a.control) {
-    var c = this.getControlBounds(a),
-      d = this.legacyControlPosition ? mxUtils.getValue(a.style, mxConstants.STYLE_ROTATION, 0) : a.shape.getTextRotation(),
-      e = a.view.scale;
-    if (b || a.control.scale != e || !a.control.bounds.equals(c) || a.control.rotation != d) a.control.rotation = d, a.control.bounds = c, a.control.scale = e, a.control.redraw()
-  }
-};
-mxCellRenderer.prototype.getControlBounds = function(a) {
-  if (null != a.control) {
-    var b = a.control.scale,
-      c = a.control.bounds.width / b,
-      b = a.control.bounds.height / b,
-      d = a.view.scale,
-      e = a.getCenterX(),
-      f = a.getCenterY();
-    if (!a.view.graph.getModel().isEdge(a.cell) && (e = a.x + c * d, f = a.y + b * d, null != a.shape)) {
-      var g = a.shape.getShapeRotation();
-      if (this.legacyControlPosition) g = mxUtils.getValue(a.style, mxConstants.STYLE_ROTATION, 0);
-      else if (a.shape.isPaintBoundsInverted()) var h = (a.width - a.height) / 2,
-        e = e + h,
-        f = f - h;
-      0 != g && (h = mxUtils.toRadians(g),
-        g = Math.cos(h), h = Math.sin(h), f = mxUtils.getRotatedPoint(new mxPoint(e, f), g, h, new mxPoint(a.getCenterX(), a.getCenterY())), e = f.x, f = f.y)
-    }
-    return a.view.graph.getModel().isEdge(a.cell), new mxRectangle(Math.round(e - c / 2 * d), Math.round(f - b / 2 * d), Math.round(c * d), Math.round(b * d))
-  }
-  return null
-};
-mxCellRenderer.prototype.redraw = function(a, b, c) {
-  if (null != a.shape) {
-    var d = !1;
-    a.view.graph.getModel().isEdge(a.cell);
-    reconfigure = null != b ? b : !1;
-    this.createControl(a);
-    if (a.orderChanged || a.invalidOrder) a.view.graph.ordered ? this.order(a) : this.orderEdge(a);
-    if (a.orderChanged || !mxUtils.equalEntries(a.shape.style, a.style)) this.configureShape(a), b = !0;
-    delete a.invalidOrder;
-    delete a.orderChanged;
-    if (b || null == a.shape.bounds || a.shape.scale != a.view.scale || !a.shape.bounds.equals(a) || !mxUtils.equalPoints(a.shape.points,
-        a.absolutePoints)) d = !0, a.shape.points = null != a.absolutePoints ? a.absolutePoints.slice() : null, a.shape.bounds = new mxRectangle(a.x, a.y, a.width, a.height), a.shape.scale = a.view
-      .scale, null == c || c ? a.shape.redraw() : a.shape.updateBoundingBox();
-    if (null == c || c) this.redrawLabel(a, d), this.redrawCellOverlays(a, d), this.redrawControl(a, d)
-  }
-};
-mxCellRenderer.prototype.destroy = function(a) {
-  null != a.shape && (null != a.text && (a.text.destroy(), a.text = null), null != a.overlays && (a.overlays.visit(function(a, c) {
-    c.destroy()
-  }), a.overlays = null), null != a.control && (a.control.destroy(), a.control = null), a.shape.destroy(), a.shape = null)
-};
-var mxEdgeStyle = {
-    EntityRelation: function(a, b, c, d, e) {
-      var f = a.view,
-        g = f.graph;
-      d = mxUtils.getValue(a.style, mxConstants.STYLE_SEGMENT, mxConstants.ENTITY_SEGMENT) * f.scale;
-      var h = a.absolutePoints,
-        k = h[0],
-        l = h[h.length - 1],
-        h = !1;
-      if (null != k) b = new mxCellState, b.x = k.x, b.y = k.y;
-      else if (null != b) {
-        var m = mxUtils.getPortConstraints(b, a, !0, mxConstants.DIRECTION_MASK_NONE);
-        m != mxConstants.DIRECTION_MASK_NONE ? h = m == mxConstants.DIRECTION_MASK_WEST : (k = g.getCellGeometry(b.cell), k.relative ? h = 0.5 >= k.x : null != c && (h = c.x + c.width < b.x))
-      } else return;
-      k = !0;
-      null != l ? (c = new mxCellState, c.x = l.x, c.y = l.y) : null != c && (m = mxUtils.getPortConstraints(c, a, !1, mxConstants.DIRECTION_MASK_NONE), m != mxConstants.DIRECTION_MASK_NONE ? k = m ==
-        mxConstants.DIRECTION_MASK_WEST : (a = g.getCellGeometry(c.cell), a.relative ? k = 0.5 >= a.x : null != b && (k = b.x + b.width < c.x)));
-      null != b && null != c && (a = h ? b.x : b.x + b.width, b = f.getRoutingCenterY(b), g = k ? c.x : c.x + c.width, c = f.getRoutingCenterY(c), f = new mxPoint(a + (h ? -d : d), b), l = new mxPoint(
-        g + (k ? -d : d), c), h == k ? (d = h ? Math.min(a, g) - d : Math.max(a, g) + d, e.push(new mxPoint(d,
-        b)), e.push(new mxPoint(d, c))) : (f.x < l.x == h ? (d = b + (c - b) / 2, e.push(f), e.push(new mxPoint(f.x, d)), e.push(new mxPoint(l.x, d))) : e.push(f), e.push(l)))
-    },
-    Loop: function(a, b, c, d, e) {
-      if (null != b) {
-        c = a.view;
-        var f = c.graph;
-        d = null != d && 0 < d.length ? d[0] : null;
-        null != d && (d = c.transformControlPoint(a, d), mxUtils.contains(b, d.x, d.y) && (d = null));
-        var g = 0,
-          h = 0,
-          k = 0,
-          l = 0,
-          f = mxUtils.getValue(a.style, mxConstants.STYLE_SEGMENT, f.gridSize) * c.scale;
-        a = mxUtils.getValue(a.style, mxConstants.STYLE_DIRECTION, mxConstants.DIRECTION_WEST);
-        a == mxConstants.DIRECTION_NORTH ||
-          a == mxConstants.DIRECTION_SOUTH ? (g = c.getRoutingCenterX(b), h = f) : (k = c.getRoutingCenterY(b), l = f);
-        null == d || d.x < b.x || d.x > b.x + b.width ? null != d ? (g = d.x, l = Math.max(Math.abs(k - d.y), l)) : a == mxConstants.DIRECTION_NORTH ? k = b.y - 2 * h : a == mxConstants.DIRECTION_SOUTH ?
-          k = b.y + b.height + 2 * h : g = a == mxConstants.DIRECTION_EAST ? b.x - 2 * l : b.x + b.width + 2 * l : null != d && (g = c.getRoutingCenterX(b), h = Math.max(Math.abs(g - d.x), l), k =
-            d.y, l = 0);
-        e.push(new mxPoint(g - h, k - l));
-        e.push(new mxPoint(g + h, k + l))
-      }
-    },
-    ElbowConnector: function(a, b, c, d, e) {
-      var f = null !=
-        d && 0 < d.length ? d[0] : null,
-        g = !1,
-        h = !1;
-      if (null != b && null != c)
-        if (null != f) var k = Math.min(b.x, c.x),
-          l = Math.max(b.x + b.width, c.x + c.width),
-          h = Math.min(b.y, c.y),
-          m = Math.max(b.y + b.height, c.y + c.height),
-          f = a.view.transformControlPoint(a, f),
-          g = f.y < h || f.y > m,
-          h = f.x < k || f.x > l;
-        else k = Math.max(b.x, c.x), l = Math.min(b.x + b.width, c.x + c.width), g = k == l, g || (h = Math.max(b.y, c.y), m = Math.min(b.y + b.height, c.y + c.height), h = h == m);
-        !h && (g || a.style[mxConstants.STYLE_ELBOW] == mxConstants.ELBOW_VERTICAL) ? mxEdgeStyle.TopToBottom(a, b, c, d, e) : mxEdgeStyle.SideToSide(a,
-        b, c, d, e)
-    },
-    SideToSide: function(a, b, c, d, e) {
-      var f = a.view;
-      d = null != d && 0 < d.length ? d[0] : null;
-      var g = a.absolutePoints,
-        h = g[0],
-        g = g[g.length - 1];
-      null != d && (d = f.transformControlPoint(a, d));
-      null != h && (b = new mxCellState, b.x = h.x, b.y = h.y);
-      null != g && (c = new mxCellState, c.x = g.x, c.y = g.y);
-      null != b && null != c && (a = Math.max(b.x, c.x), h = Math.min(b.x + b.width, c.x + c.width), a = null != d ? d.x : h + (a - h) / 2, h = f.getRoutingCenterY(b), f = f.getRoutingCenterY(c),
-        null != d && (d.y >= b.y && d.y <= b.y + b.height && (h = d.y), d.y >= c.y && d.y <= c.y + c.height && (f = d.y)), !mxUtils.contains(c,
-          a, h) && !mxUtils.contains(b, a, h) && e.push(new mxPoint(a, h)), !mxUtils.contains(c, a, f) && !mxUtils.contains(b, a, f) && e.push(new mxPoint(a, f)), 1 == e.length && (null != d ? !
-          mxUtils.contains(c, a, d.y) && !mxUtils.contains(b, a, d.y) && e.push(new mxPoint(a, d.y)) : (f = Math.max(b.y, c.y), b = Math.min(b.y + b.height, c.y + c.height), e.push(new mxPoint(a,
-            f + (b - f) / 2)))))
-    },
-    TopToBottom: function(a, b, c, d, e) {
-      var f = a.view;
-      d = null != d && 0 < d.length ? d[0] : null;
-      var g = a.absolutePoints,
-        h = g[0],
-        g = g[g.length - 1];
-      null != d && (d = f.transformControlPoint(a, d));
-      null !=
-        h && (b = new mxCellState, b.x = h.x, b.y = h.y);
-      null != g && (c = new mxCellState, c.x = g.x, c.y = g.y);
-      null != b && null != c && (h = Math.max(b.y, c.y), g = Math.min(b.y + b.height, c.y + c.height), a = f.getRoutingCenterX(b), null != d && (d.x >= b.x && d.x <= b.x + b.width) && (a = d.x), h =
-        null != d ? d.y : g + (h - g) / 2, !mxUtils.contains(c, a, h) && !mxUtils.contains(b, a, h) && e.push(new mxPoint(a, h)), a = null != d && d.x >= c.x && d.x <= c.x + c.width ? d.x : f.getRoutingCenterX(
-          c), !mxUtils.contains(c, a, h) && !mxUtils.contains(b, a, h) && e.push(new mxPoint(a, h)), 1 == e.length && (null != d && 1 ==
-          e.length ? !mxUtils.contains(c, d.x, h) && !mxUtils.contains(b, d.x, h) && e.push(new mxPoint(d.x, h)) : (f = Math.max(b.x, c.x), b = Math.min(b.x + b.width, c.x + c.width), e.push(new mxPoint(
-            f + (b - f) / 2, h)))))
-    },
-    SegmentConnector: function(a, b, c, d, e) {
-      var f = a.absolutePoints,
-        g = !0,
-        h = null,
-        k = f[0];
-      null == k && null != b ? k = new mxPoint(a.view.getRoutingCenterX(b), a.view.getRoutingCenterY(b)) : null != k && (k = k.clone());
-      var l = f.length - 1;
-      if (null != d && 0 < d.length) {
-        for (var h = a.view.transformControlPoint(a, d[0]), m = b, n = f[0], p = !1, q = !1, p = h, s = d.length, r =
-            0; 2 > r; r++) {
-          var t = null != n && n.x == p.x,
-            v = null != n && n.y == p.y,
-            w = null != m && p.y >= m.y && p.y <= m.y + m.height,
-            m = null != m && p.x >= m.x && p.x <= m.x + m.width,
-            p = v || null == n && w,
-            q = t || null == n && m;
-          if (null != n && !v && !t && (w || m)) {
-            g = w ? !1 : !0;
-            break
-          }
-          if (q || p) {
-            g = p;
-            1 == r && (g = 0 == d.length % 2 ? p : q);
-            break
-          }
-          m = c;
-          n = f[l];
-          p = a.view.transformControlPoint(a, d[s - 1])
-        }
-        g && (null != f[0] && f[0].y != h.y || null == f[0] && null != b && (h.y < b.y || h.y > b.y + b.height)) ? e.push(new mxPoint(k.x, h.y)) : !g && (null != f[0] && f[0].x != h.x || null == f[
-          0] && null != b && (h.x < b.x || h.x > b.x + b.width)) && e.push(new mxPoint(h.x,
-          k.y));
-        g ? k.y = h.y : k.x = h.x;
-        for (r = 0; r < d.length; r++) g = !g, h = a.view.transformControlPoint(a, d[r]), g ? k.y = h.y : k.x = h.x, e.push(k.clone())
-      } else h = k, g = !0;
-      k = f[l];
-      null == k && null != c && (k = new mxPoint(a.view.getRoutingCenterX(c), a.view.getRoutingCenterY(c)));
-      g && (null != f[l] && f[l].y != h.y || null == f[l] && null != c && (h.y < c.y || h.y > c.y + c.height)) ? e.push(new mxPoint(k.x, h.y)) : !g && (null != f[l] && f[l].x != h.x || null == f[l] &&
-        null != c && (h.x < c.x || h.x > c.x + c.width)) && e.push(new mxPoint(h.x, k.y));
-      if (null == f[0] && null != b)
-        for (; 1 < e.length && mxUtils.contains(b,
-            e[1].x, e[1].y);) e = e.splice(1, 1);
-      if (null == f[l] && null != c)
-        for (; 1 < e.length && mxUtils.contains(c, e[e.length - 1].x, e[e.length - 1].y);) e = e.splice(e.length - 1, 1)
-    },
-    orthBuffer: 10,
-    dirVectors: [
-      [-1, 0],
-      [0, -1],
-      [1, 0],
-      [0, 1],
-      [-1, 0],
-      [0, -1],
-      [1, 0]
-    ],
-    wayPoints1: [
-      [0, 0],
-      [0, 0],
-      [0, 0],
-      [0, 0],
-      [0, 0],
-      [0, 0],
-      [0, 0],
-      [0, 0],
-      [0, 0],
-      [0, 0],
-      [0, 0],
-      [0, 0]
-    ],
-    routePatterns: [
-      [
-        [513, 2308, 2081, 2562],
-        [513, 1090, 514, 2184, 2114, 2561],
-        [513, 1090, 514, 2564, 2184, 2562],
-        [513, 2308, 2561, 1090, 514, 2568, 2308]
-      ],
-      [
-        [514, 1057, 513, 2308, 2081, 2562],
-        [514, 2184, 2114, 2561],
-        [514, 2184,
-          2562, 1057, 513, 2564, 2184
-        ],
-        [514, 1057, 513, 2568, 2308, 2561]
-      ],
-      [
-        [1090, 514, 1057, 513, 2308, 2081, 2562],
-        [2114, 2561],
-        [1090, 2562, 1057, 513, 2564, 2184],
-        [1090, 514, 1057, 513, 2308, 2561, 2568]
-      ],
-      [
-        [2081, 2562],
-        [1057, 513, 1090, 514, 2184, 2114, 2561],
-        [1057, 513, 1090, 514, 2184, 2562, 2564],
-        [1057, 2561, 1090, 514, 2568, 2308]
-      ]
-    ],
-    inlineRoutePatterns: [
-      [null, [2114, 2568], null, null],
-      [null, [514, 2081, 2114, 2568], null, null],
-      [null, [2114, 2561], null, null],
-      [
-        [2081, 2562],
-        [1057, 2114, 2568],
-        [2184, 2562], null
-      ]
-    ],
-    vertexSeperations: [],
-    limits: [
-      [0, 0, 0, 0, 0, 0, 0, 0, 0],
-      [0, 0, 0, 0, 0, 0, 0, 0, 0]
-    ],
-    LEFT_MASK: 32,
-    TOP_MASK: 64,
-    RIGHT_MASK: 128,
-    BOTTOM_MASK: 256,
-    LEFT: 1,
-    TOP: 2,
-    RIGHT: 4,
-    BOTTOM: 8,
-    SIDE_MASK: 480,
-    CENTER_MASK: 512,
-    SOURCE_MASK: 1024,
-    TARGET_MASK: 2048,
-    VERTEX_MASK: 3072,
-    OrthConnector: function(a, b, c, d, e) {
-      var f = a.view.graph,
-        g = null == b ? !1 : f.getModel().isEdge(b.cell),
-        f = null == c ? !1 : f.getModel().isEdge(c.cell);
-      if (null != d && 0 < d.length || g || f) mxEdgeStyle.SegmentConnector(a, b, c, d, e);
-      else {
-        d = a.absolutePoints;
-        var h = d[0],
-          k = d[d.length - 1];
-        d = null != b ? b.x : h.x;
-        var g = null != b ? b.y : h.y,
-          l = null != b ? b.width :
-          1,
-          m = null != b ? b.height : 1,
-          n = null != c ? c.x : k.x,
-          p = null != c ? c.y : k.y,
-          q = null != c ? c.width : 1,
-          s = null != c ? c.height : 1,
-          f = a.view.scale * mxEdgeStyle.orthBuffer,
-          r = [mxConstants.DIRECTION_MASK_ALL, mxConstants.DIRECTION_MASK_ALL];
-        null != b && (r[0] = mxUtils.getPortConstraints(b, a, !0, mxConstants.DIRECTION_MASK_ALL));
-        null != c && (r[1] = mxUtils.getPortConstraints(c, a, !1, mxConstants.DIRECTION_MASK_ALL));
-        a = [0, 0];
-        d = [
-          [d, g, l, m],
-          [n, p, q, s]
-        ];
-        for (l = 0; 2 > l; l++) mxEdgeStyle.limits[l][1] = d[l][0] - f, mxEdgeStyle.limits[l][2] = d[l][1] - f, mxEdgeStyle.limits[l][4] =
-          d[l][0] + d[l][2] + f, mxEdgeStyle.limits[l][8] = d[l][1] + d[l][3] + f;
-        l = d[0][0] + d[0][2] / 2 - (d[1][0] + d[1][2] / 2);
-        m = d[0][1] + d[0][3] / 2 - (d[1][1] + d[1][3] / 2);
-        g = 0;
-        0 > l ? g = 0 > m ? 2 : 1 : 0 >= m && (g = 3, 0 == l && (g = 2));
-        m = null;
-        null != b && (m = h);
-        b = [
-          [0.5, 0.5],
-          [0.5, 0.5]
-        ];
-        for (l = 0; 2 > l; l++) null != m && (b[l][0] = (m.x - d[l][0]) / d[l][2], 0.01 > b[l][0] ? a[l] = mxConstants.DIRECTION_MASK_WEST : 0.99 < b[l][0] && (a[l] = mxConstants.DIRECTION_MASK_EAST),
-            b[l][1] = (m.y - d[l][1]) / d[l][3], 0.01 > b[l][1] ? a[l] = mxConstants.DIRECTION_MASK_NORTH : 0.99 < b[l][1] && (a[l] = mxConstants.DIRECTION_MASK_SOUTH)),
-          m = null, null != c && (m = k);
-        l = d[0][1] - (d[1][1] + d[1][3]);
-        m = d[0][0] - (d[1][0] + d[1][2]);
-        n = d[1][1] - (d[0][1] + d[0][3]);
-        p = d[1][0] - (d[0][0] + d[0][2]);
-        mxEdgeStyle.vertexSeperations[1] = Math.max(m - 2 * f, 0);
-        mxEdgeStyle.vertexSeperations[2] = Math.max(l - 2 * f, 0);
-        mxEdgeStyle.vertexSeperations[4] = Math.max(n - 2 * f, 0);
-        mxEdgeStyle.vertexSeperations[3] = Math.max(p - 2 * f, 0);
-        c = [];
-        h = [];
-        k = [];
-        h[0] = m >= p ? mxConstants.DIRECTION_MASK_WEST : mxConstants.DIRECTION_MASK_EAST;
-        k[0] = l >= n ? mxConstants.DIRECTION_MASK_NORTH : mxConstants.DIRECTION_MASK_SOUTH;
-        h[1] = mxUtils.reversePortConstraints(h[0]);
-        k[1] = mxUtils.reversePortConstraints(k[0]);
-        m = m >= p ? m : p;
-        n = l >= n ? l : n;
-        p = [
-          [0, 0],
-          [0, 0]
-        ];
-        q = !1;
-        for (l = 0; 2 > l; l++) 0 == a[l] && (0 == (h[l] & r[l]) && (h[l] = mxUtils.reversePortConstraints(h[l])), 0 == (k[l] & r[l]) && (k[l] = mxUtils.reversePortConstraints(k[l])), p[l][0] = k[l],
-          p[l][1] = h[l]);
-        n > 2 * f && m > 2 * f && (0 < (h[0] & r[0]) && 0 < (k[1] & r[1]) ? (p[0][0] = h[0], p[0][1] = k[0], p[1][0] = k[1], p[1][1] = h[1], q = !0) : 0 < (k[0] & r[0]) && 0 < (h[1] & r[1]) && (p[0]
-          [0] = k[0], p[0][1] = h[0], p[1][0] = h[1], p[1][1] = k[1], q = !0));
-        n > 2 * f && !q &&
-          (p[0][0] = k[0], p[0][1] = h[0], p[1][0] = k[1], p[1][1] = h[1], q = !0);
-        m > 2 * f && !q && (p[0][0] = h[0], p[0][1] = k[0], p[1][0] = h[1], p[1][1] = k[1]);
-        for (l = 0; 2 > l; l++)
-          if (0 == a[l] && (0 == (p[l][0] & r[l]) && (p[l][0] = p[l][1]), c[l] = p[l][0] & r[l], c[l] |= (p[l][1] & r[l]) << 8, c[l] |= (p[1 - l][l] & r[l]) << 16, c[l] |= (p[1 - l][1 - l] & r[l]) <<
-              24, 0 == (c[l] & 15) && (c[l] <<= 8), 0 == (c[l] & 3840) && (c[l] = c[l] & 15 | c[l] >> 8), 0 == (c[l] & 983040) && (c[l] = c[l] & 65535 | (c[l] & 251658240) >> 8), a[l] = c[l] & 15,
-              r[l] == mxConstants.DIRECTION_MASK_WEST || r[l] == mxConstants.DIRECTION_MASK_NORTH || r[l] ==
-              mxConstants.DIRECTION_MASK_EAST || r[l] == mxConstants.DIRECTION_MASK_SOUTH)) a[l] = r[l];
-        l = a[0] == mxConstants.DIRECTION_MASK_EAST ? 3 : a[0];
-        r = a[1] == mxConstants.DIRECTION_MASK_EAST ? 3 : a[1];
-        l -= g;
-        r -= g;
-        1 > l && (l += 4);
-        1 > r && (r += 4);
-        r = mxEdgeStyle.routePatterns[l - 1][r - 1];
-        mxEdgeStyle.wayPoints1[0][0] = d[0][0];
-        mxEdgeStyle.wayPoints1[0][1] = d[0][1];
-        switch (a[0]) {
-          case mxConstants.DIRECTION_MASK_WEST:
-            mxEdgeStyle.wayPoints1[0][0] -= f;
-            mxEdgeStyle.wayPoints1[0][1] += b[0][1] * d[0][3];
-            break;
-          case mxConstants.DIRECTION_MASK_SOUTH:
-            mxEdgeStyle.wayPoints1[0][0] +=
-              b[0][0] * d[0][2];
-            mxEdgeStyle.wayPoints1[0][1] += d[0][3] + f;
-            break;
-          case mxConstants.DIRECTION_MASK_EAST:
-            mxEdgeStyle.wayPoints1[0][0] += d[0][2] + f;
-            mxEdgeStyle.wayPoints1[0][1] += b[0][1] * d[0][3];
-            break;
-          case mxConstants.DIRECTION_MASK_NORTH:
-            mxEdgeStyle.wayPoints1[0][0] += b[0][0] * d[0][2], mxEdgeStyle.wayPoints1[0][1] -= f
-        }
-        f = 0;
-        h = c = 0 < (a[0] & (mxConstants.DIRECTION_MASK_EAST | mxConstants.DIRECTION_MASK_WEST)) ? 0 : 1;
-        for (l = k = 0; l < r.length; l++) {
-          k = r[l] & 15;
-          s = k == mxConstants.DIRECTION_MASK_EAST ? 3 : k;
-          s += g;
-          4 < s && (s -= 4);
-          m = mxEdgeStyle.dirVectors[s -
-            1];
-          k = 0 < s % 2 ? 0 : 1;
-          k != c && (f++, mxEdgeStyle.wayPoints1[f][0] = mxEdgeStyle.wayPoints1[f - 1][0], mxEdgeStyle.wayPoints1[f][1] = mxEdgeStyle.wayPoints1[f - 1][1]);
-          var t = 0 < (r[l] & mxEdgeStyle.TARGET_MASK),
-            q = 0 < (r[l] & mxEdgeStyle.SOURCE_MASK),
-            n = (r[l] & mxEdgeStyle.SIDE_MASK) >> 5,
-            n = n << g;
-          15 < n && (n >>= 4);
-          p = 0 < (r[l] & mxEdgeStyle.CENTER_MASK);
-          (q || t) && 9 > n ? (s = 0, q = q ? 0 : 1, s = p && 0 == k ? d[q][0] + b[q][0] * d[q][2] : p ? d[q][1] + b[q][1] * d[q][3] : mxEdgeStyle.limits[q][n], 0 == k ? (n = (s - mxEdgeStyle.wayPoints1[
-            f][0]) * m[0], 0 < n && (mxEdgeStyle.wayPoints1[f][0] +=
-            m[0] * n)) : (n = (s - mxEdgeStyle.wayPoints1[f][1]) * m[1], 0 < n && (mxEdgeStyle.wayPoints1[f][1] += m[1] * n))) : p && (mxEdgeStyle.wayPoints1[f][0] += m[0] * Math.abs(mxEdgeStyle.vertexSeperations[
-            s] / 2), mxEdgeStyle.wayPoints1[f][1] += m[1] * Math.abs(mxEdgeStyle.vertexSeperations[s] / 2));
-          0 < f && mxEdgeStyle.wayPoints1[f][k] == mxEdgeStyle.wayPoints1[f - 1][k] ? f-- : c = k
-        }
-        for (l = 0; l <= f && !(l == f && ((0 < (a[1] & (mxConstants.DIRECTION_MASK_EAST | mxConstants.DIRECTION_MASK_WEST)) ? 0 : 1) == h ? 0 : 1) != (f + 1) % 2); l++) e.push(new mxPoint(
-          mxEdgeStyle.wayPoints1[l][0],
-          mxEdgeStyle.wayPoints1[l][1]))
-      }
-    },
-    getRoutePattern: function(a, b, c, d) {
-      var e = a[0] == mxConstants.DIRECTION_MASK_EAST ? 3 : a[0];
-      a = a[1] == mxConstants.DIRECTION_MASK_EAST ? 3 : a[1];
-      e -= b;
-      a -= b;
-      1 > e && (e += 4);
-      1 > a && (a += 4);
-      b = routePatterns[e - 1][a - 1];
-      if (0 == c || 0 == d) null != inlineRoutePatterns[e - 1][a - 1] && (b = inlineRoutePatterns[e - 1][a - 1]);
-      return b
-    }
-  },
-  mxStyleRegistry = {
-    values: [],
-    putValue: function(a, b) {
-      mxStyleRegistry.values[a] = b
-    },
-    getValue: function(a) {
-      return mxStyleRegistry.values[a]
-    },
-    getName: function(a) {
-      for (var b in mxStyleRegistry.values)
-        if (mxStyleRegistry.values[b] ==
-          a) return b;
-      return null
-    }
-  };
-mxStyleRegistry.putValue(mxConstants.EDGESTYLE_ELBOW, mxEdgeStyle.ElbowConnector);
-mxStyleRegistry.putValue(mxConstants.EDGESTYLE_ENTITY_RELATION, mxEdgeStyle.EntityRelation);
-mxStyleRegistry.putValue(mxConstants.EDGESTYLE_LOOP, mxEdgeStyle.Loop);
-mxStyleRegistry.putValue(mxConstants.EDGESTYLE_SIDETOSIDE, mxEdgeStyle.SideToSide);
-mxStyleRegistry.putValue(mxConstants.EDGESTYLE_TOPTOBOTTOM, mxEdgeStyle.TopToBottom);
-mxStyleRegistry.putValue(mxConstants.EDGESTYLE_ORTHOGONAL, mxEdgeStyle.OrthConnector);
-mxStyleRegistry.putValue(mxConstants.EDGESTYLE_SEGMENT, mxEdgeStyle.SegmentConnector);
-mxStyleRegistry.putValue(mxConstants.PERIMETER_ELLIPSE, mxPerimeter.EllipsePerimeter);
-mxStyleRegistry.putValue(mxConstants.PERIMETER_RECTANGLE, mxPerimeter.RectanglePerimeter);
-mxStyleRegistry.putValue(mxConstants.PERIMETER_RHOMBUS, mxPerimeter.RhombusPerimeter);
-mxStyleRegistry.putValue(mxConstants.PERIMETER_TRIANGLE, mxPerimeter.TrianglePerimeter);
-
-function mxGraphView(a) {
-  this.graph = a;
-  this.translate = new mxPoint;
-  this.graphBounds = new mxRectangle;
-  this.states = new mxDictionary
-}
-mxGraphView.prototype = new mxEventSource;
-mxGraphView.prototype.constructor = mxGraphView;
-mxGraphView.prototype.EMPTY_POINT = new mxPoint;
-mxGraphView.prototype.doneResource = "none" != mxClient.language ? "done" : "";
-mxGraphView.prototype.updatingDocumentResource = "none" != mxClient.language ? "updatingDocument" : "";
-mxGraphView.prototype.allowEval = !1;
-mxGraphView.prototype.captureDocumentGesture = !0;
-mxGraphView.prototype.optimizeVmlReflows = !0;
-mxGraphView.prototype.rendering = !0;
-mxGraphView.prototype.graph = null;
-mxGraphView.prototype.currentRoot = null;
-mxGraphView.prototype.graphBounds = null;
-mxGraphView.prototype.scale = 1;
-mxGraphView.prototype.translate = null;
-mxGraphView.prototype.updateStyle = !1;
-mxGraphView.prototype.getGraphBounds = function() {
-  return this.graphBounds
-};
-mxGraphView.prototype.setGraphBounds = function(a) {
-  this.graphBounds = a
-};
-mxGraphView.prototype.getBounds = function(a) {
-  var b = null;
-  if (null != a && 0 < a.length)
-    for (var c = this.graph.getModel(), d = 0; d < a.length; d++)
-      if (c.isVertex(a[d]) || c.isEdge(a[d])) {
-        var e = this.getState(a[d]);
-        null != e && (null == b ? b = new mxRectangle(e.x, e.y, e.width, e.height) : b.add(e))
-      }
-  return b
-};
-mxGraphView.prototype.setCurrentRoot = function(a) {
-  if (this.currentRoot != a) {
-    var b = new mxCurrentRootChange(this, a);
-    b.execute();
-    var c = new mxUndoableEdit(this, !1);
-    c.add(b);
-    this.fireEvent(new mxEventObject(mxEvent.UNDO, "edit", c));
-    this.graph.sizeDidChange()
-  }
-  return a
-};
-mxGraphView.prototype.scaleAndTranslate = function(a, b, c) {
-  var d = this.scale,
-    e = new mxPoint(this.translate.x, this.translate.y);
-  if (this.scale != a || this.translate.x != b || this.translate.y != c) this.scale = a, this.translate.x = b, this.translate.y = c, this.isEventsEnabled() && (this.revalidate(), this.graph.sizeDidChange());
-  this.fireEvent(new mxEventObject(mxEvent.SCALE_AND_TRANSLATE, "scale", a, "previousScale", d, "translate", this.translate, "previousTranslate", e))
-};
-mxGraphView.prototype.getScale = function() {
-  return this.scale
-};
-mxGraphView.prototype.setScale = function(a) {
-  var b = this.scale;
-  this.scale != a && (this.scale = a, this.isEventsEnabled() && (this.revalidate(), this.graph.sizeDidChange()));
-  this.fireEvent(new mxEventObject(mxEvent.SCALE, "scale", a, "previousScale", b))
-};
-mxGraphView.prototype.getTranslate = function() {
-  return this.translate
-};
-mxGraphView.prototype.setTranslate = function(a, b) {
-  var c = new mxPoint(this.translate.x, this.translate.y);
-  if (this.translate.x != a || this.translate.y != b) this.translate.x = a, this.translate.y = b, this.isEventsEnabled() && (this.revalidate(), this.graph.sizeDidChange());
-  this.fireEvent(new mxEventObject(mxEvent.TRANSLATE, "translate", this.translate, "previousTranslate", c))
-};
-mxGraphView.prototype.refresh = function() {
-  null != this.currentRoot && this.clear();
-  this.revalidate()
-};
-mxGraphView.prototype.revalidate = function() {
-  this.invalidate();
-  this.validate()
-};
-mxGraphView.prototype.clear = function(a, b, c) {
-  var d = this.graph.getModel();
-  a = a || d.getRoot();
-  b = null != b ? b : !1;
-  c = null != c ? c : !0;
-  this.removeState(a);
-  if (c && (b || a != this.currentRoot)) {
-    c = d.getChildCount(a);
-    for (var e = 0; e < c; e++) this.clear(d.getChildAt(a, e), b)
-  } else this.invalidate(a)
-};
-mxGraphView.prototype.invalidate = function(a, b, c, d) {
-  var e = this.graph.getModel();
-  a = a || e.getRoot();
-  b = null != b ? b : !0;
-  c = null != c ? c : !0;
-  d = null != d ? d : !1;
-  var f = this.getState(a);
-  null != f && (f.invalid = !0, d && (f.orderChanged = !0));
-  if (b)
-    for (var g = e.getChildCount(a), f = 0; f < g; f++) {
-      var h = e.getChildAt(a, f);
-      this.invalidate(h, b, c, d)
-    }
-  if (c) {
-    d = e.getEdgeCount(a);
-    for (f = 0; f < d; f++) this.invalidate(e.getEdgeAt(a, f), b, c)
-  }
-};
-mxGraphView.prototype.validate = function(a) {
-  var b = mxLog.enter("mxGraphView.validate");
-  window.status = mxResources.get(this.updatingDocumentResource) || this.updatingDocumentResource;
-  var c = null;
-  if (this.optimizeVmlReflows && null != this.canvas && null == this.textDiv && (8 == document.documentMode || mxClient.IS_QUIRKS)) {
-    c = this.canvas.style.display;
-    this.canvas.style.display = "none";
-    var d = document.createElement("div");
-    d.style.position = "absolute";
-    d.style.whiteSpace = "nowrap";
-    d.style.visibility = "hidden";
-    d.style.display = mxClient.IS_QUIRKS ?
-      "inline" : "inline-block";
-    d.style.zoom = "1";
-    document.body.appendChild(d);
-    this.textDiv = d
-  }
-  a = a || (null != this.currentRoot ? this.currentRoot : this.graph.getModel().getRoot());
-  this.validateBounds(null, a);
-  a = this.validatePoints(null, a);
-  null == a && (a = new mxRectangle);
-  this.setGraphBounds(a);
-  this.validateBackground();
-  null != c && (this.canvas.style.display = c, document.body.removeChild(this.textDiv), this.textDiv = null);
-  window.status = mxResources.get(this.doneResource) || this.doneResource;
-  mxLog.leave("mxGraphView.validate", b)
-};
-mxGraphView.prototype.createBackgroundPageShape = function(a) {
-  return new mxRectangleShape(a, "white", "black")
-};
-mxGraphView.prototype.validateBackground = function() {
-  var a = this.graph.getBackgroundImage();
-  if (null != a) {
-    if (null == this.backgroundImage || this.backgroundImage.image != a.src) {
-      null != this.backgroundImage && this.backgroundImage.destroy();
-      var b = new mxRectangle(0, 0, 1, 1);
-      this.backgroundImage = new mxImageShape(b, a.src);
-      this.backgroundImage.dialect = this.graph.dialect;
-      this.backgroundImage.init(this.backgroundPane);
-      this.backgroundImage.redraw()
-    }
-    this.redrawBackgroundImage(this.backgroundImage, a)
-  } else null != this.backgroundImage &&
-    (this.backgroundImage.destroy(), this.backgroundImage = null);
-  this.graph.pageVisible ? (b = this.getBackgroundPageBounds(), null == this.backgroundPageShape ? (this.backgroundPageShape = this.createBackgroundPageShape(b), this.backgroundPageShape.scale =
-    this.scale, this.backgroundPageShape.isShadow = !0, this.backgroundPageShape.dialect = this.graph.dialect, this.backgroundPageShape.init(this.backgroundPane), this.backgroundPageShape.redraw(),
-    mxEvent.addListener(this.backgroundPageShape.node, "dblclick", mxUtils.bind(this,
-      function(a) {
-        this.graph.dblClick(a)
-      })), mxEvent.addGestureListeners(this.backgroundPageShape.node, mxUtils.bind(this, function(a) {
-      this.graph.fireMouseEvent(mxEvent.MOUSE_DOWN, new mxMouseEvent(a))
-    }), mxUtils.bind(this, function(a) {
-      null != this.graph.tooltipHandler && this.graph.tooltipHandler.isHideOnHover() && this.graph.tooltipHandler.hide();
-      this.graph.isMouseDown && !mxEvent.isConsumed(a) && this.graph.fireMouseEvent(mxEvent.MOUSE_MOVE, new mxMouseEvent(a))
-    }), mxUtils.bind(this, function(a) {
-      this.graph.fireMouseEvent(mxEvent.MOUSE_UP,
-        new mxMouseEvent(a))
-    }))) : (this.backgroundPageShape.scale = this.scale, this.backgroundPageShape.bounds = b, this.backgroundPageShape.redraw())) : null != this.backgroundPageShape && (this.backgroundPageShape.destroy(),
-    this.backgroundPageShape = null)
-};
-mxGraphView.prototype.getBackgroundPageBounds = function() {
-  var a = this.graph.pageFormat,
-    b = this.scale * this.graph.pageScale;
-  return new mxRectangle(this.scale * this.translate.x, this.scale * this.translate.y, a.width * b, a.height * b)
-};
-mxGraphView.prototype.redrawBackgroundImage = function(a, b) {
-  a.scale = this.scale;
-  a.bounds.x = this.scale * this.translate.x;
-  a.bounds.y = this.scale * this.translate.y;
-  a.bounds.width = this.scale * b.width;
-  a.bounds.height = this.scale * b.height;
-  a.redraw()
-};
-mxGraphView.prototype.validateBounds = function(a, b) {
-  var c = this.graph.getModel(),
-    d = this.getState(b, !0);
-  if (null != d && d.invalid) {
-    if (this.graph.isCellVisible(b)) {
-      if (b != this.currentRoot && null != a) {
-        d.absoluteOffset.x = 0;
-        d.absoluteOffset.y = 0;
-        d.origin.x = a.origin.x;
-        d.origin.y = a.origin.y;
-        var e = this.graph.getCellGeometry(b);
-        if (null != e) {
-          if (!c.isEdge(b)) {
-            var f = e.offset || this.EMPTY_POINT;
-            e.relative ? (d.origin.x += e.x * a.width / this.scale + f.x, d.origin.y += e.y * a.height / this.scale + f.y) : (d.absoluteOffset.x = this.scale * f.x, d.absoluteOffset.y =
-              this.scale * f.y, d.origin.x += e.x, d.origin.y += e.y)
-          }
-          d.x = this.scale * (this.translate.x + d.origin.x);
-          d.y = this.scale * (this.translate.y + d.origin.y);
-          d.width = this.scale * e.width;
-          d.height = this.scale * e.height;
-          if (c.isVertex(b)) {
-            if (e.relative && (f = mxUtils.toRadians(a.style[mxConstants.STYLE_ROTATION] || "0"), 0 != f)) {
-              var e = Math.cos(f),
-                f = Math.sin(f),
-                g = new mxPoint(d.getCenterX(), d.getCenterY()),
-                h = new mxPoint(a.getCenterX(), a.getCenterY()),
-                e = mxUtils.getRotatedPoint(g, e, f, h);
-              d.x = e.x - d.width / 2;
-              d.y = e.y - d.height / 2
-            }
-            this.updateVertexLabelOffset(d)
-          }
-        }
-      }
-    } else this.removeState(b);
-    f = this.graph.getChildOffsetForCell(b);
-    null != f && (d.origin.x += f.x, d.origin.y += f.y)
-  }
-  if (null != d && (!this.graph.isCellCollapsed(b) || b == this.currentRoot)) {
-    e = c.getChildCount(b);
-    for (f = 0; f < e; f++) g = c.getChildAt(b, f), this.validateBounds(d, g)
-  }
-};
-mxGraphView.prototype.updateVertexLabelOffset = function(a) {
-  var b = mxUtils.getValue(a.style, mxConstants.STYLE_LABEL_POSITION, mxConstants.ALIGN_CENTER);
-  b == mxConstants.ALIGN_LEFT ? a.absoluteOffset.x -= a.width : b == mxConstants.ALIGN_RIGHT && (a.absoluteOffset.x += a.width);
-  b = mxUtils.getValue(a.style, mxConstants.STYLE_VERTICAL_LABEL_POSITION, mxConstants.ALIGN_MIDDLE);
-  b == mxConstants.ALIGN_TOP ? a.absoluteOffset.y -= a.height : b == mxConstants.ALIGN_BOTTOM && (a.absoluteOffset.y += a.height)
-};
-mxGraphView.prototype.validatePoints = function(a, b) {
-  var c = this.graph.getModel(),
-    d = this.getState(b),
-    e = null;
-  if (null != d) {
-    if (d.invalid) {
-      var f = this.graph.getCellGeometry(b);
-      if (null != f && c.isEdge(b)) {
-        var g = this.getState(this.getVisibleTerminal(b, !0));
-        d.setVisibleTerminalState(g, !0);
-        if (null != g && c.isEdge(g.cell) && !c.isAncestor(g.cell, b)) {
-          var h = this.getState(c.getParent(g.cell));
-          this.validatePoints(h, g.cell)
-        }
-        var k = this.getState(this.getVisibleTerminal(b, !1));
-        d.setVisibleTerminalState(k, !1);
-        null != k && (c.isEdge(k.cell) &&
-          !c.isAncestor(k.cell, b)) && (h = this.getState(c.getParent(k.cell)), this.validatePoints(h, k.cell));
-        this.updateFixedTerminalPoints(d, g, k);
-        this.updatePoints(d, f.points, g, k);
-        this.updateFloatingTerminalPoints(d, g, k);
-        this.updateEdgeBounds(d);
-        this.updateEdgeLabelOffset(d)
-      } else null != f && (f.relative && null != a && c.isEdge(a.cell)) && (f = this.getPoint(a, f), null != f && (d.x = f.x, d.y = f.y, f.x = f.x / this.scale - this.translate.x, f.y = f.y / this.scale -
-        this.translate.y, d.origin = f, this.childMoved(a, d)));
-      d.invalid = !1;
-      b != this.currentRoot &&
-        this.graph.cellRenderer.redraw(d, !1, this.isRendering())
-    }
-    if (c.isEdge(b) || c.isVertex(b)) null != d.shape && null != d.shape.boundingBox && (e = d.shape.boundingBox.clone()), null != d.text && !this.graph.isLabelClipped(d.cell) && null != d.text.boundingBox &&
-      (null != e ? e.add(d.text.boundingBox) : e = d.text.boundingBox.clone())
-  }
-  if (null != d && (!this.graph.isCellCollapsed(b) || b == this.currentRoot)) {
-    f = c.getChildCount(b);
-    for (g = 0; g < f; g++) h = c.getChildAt(b, g), h = this.validatePoints(d, h), null != h && (null == e ? e = h : e.add(h))
-  }
-  return e
-};
-mxGraphView.prototype.childMoved = function(a, b) {
-  var c = b.cell;
-  if (!this.graph.isCellCollapsed(c) || c == this.currentRoot)
-    for (var d = this.graph.getModel(), e = d.getChildCount(c), f = 0; f < e; f++) this.validateBounds(b, d.getChildAt(c, f))
-};
-mxGraphView.prototype.updateFixedTerminalPoints = function(a, b, c) {
-  this.updateFixedTerminalPoint(a, b, !0, this.graph.getConnectionConstraint(a, b, !0));
-  this.updateFixedTerminalPoint(a, c, !1, this.graph.getConnectionConstraint(a, c, !1))
-};
-mxGraphView.prototype.updateFixedTerminalPoint = function(a, b, c, d) {
-  var e = null;
-  null != d && (e = this.graph.getConnectionPoint(b, d));
-  if (null == e && null == b) {
-    b = this.scale;
-    d = this.translate;
-    var f = a.origin,
-      e = this.graph.getCellGeometry(a.cell).getTerminalPoint(c);
-    null != e && (e = new mxPoint(b * (d.x + e.x + f.x), b * (d.y + e.y + f.y)))
-  }
-  a.setAbsoluteTerminalPoint(e, c)
-};
-mxGraphView.prototype.updatePoints = function(a, b, c, d) {
-  if (null != a) {
-    var e = [];
-    e.push(a.absolutePoints[0]);
-    var f = this.getEdgeStyle(a, b, c, d);
-    if (null != f) c = this.getTerminalPort(a, c, !0), d = this.getTerminalPort(a, d, !1), f(a, c, d, b, e);
-    else if (null != b)
-      for (f = 0; f < b.length; f++) null != b[f] && (d = mxUtils.clone(b[f]), e.push(this.transformControlPoint(a, d)));
-    b = a.absolutePoints;
-    e.push(b[b.length - 1]);
-    a.absolutePoints = e
-  }
-};
-mxGraphView.prototype.transformControlPoint = function(a, b) {
-  var c = a.origin;
-  return new mxPoint(this.scale * (b.x + this.translate.x + c.x), this.scale * (b.y + this.translate.y + c.y))
-};
-mxGraphView.prototype.getEdgeStyle = function(a, b, c, d) {
-  a = null != c && c == d ? mxUtils.getValue(a.style, mxConstants.STYLE_LOOP, this.graph.defaultLoopStyle) : !mxUtils.getValue(a.style, mxConstants.STYLE_NOEDGESTYLE, !1) ? a.style[mxConstants.STYLE_EDGE] :
-    null;
-  "string" == typeof a && (b = mxStyleRegistry.getValue(a), null == b && this.isAllowEval() && (b = mxUtils.eval(a)), a = b);
-  return "function" == typeof a ? a : null
-};
-mxGraphView.prototype.updateFloatingTerminalPoints = function(a, b, c) {
-  var d = a.absolutePoints,
-    e = d[0];
-  null == d[d.length - 1] && null != c && this.updateFloatingTerminalPoint(a, c, b, !1);
-  null == e && null != b && this.updateFloatingTerminalPoint(a, b, c, !0)
-};
-mxGraphView.prototype.updateFloatingTerminalPoint = function(a, b, c, d) {
-  b = this.getTerminalPort(a, b, d);
-  var e = this.getNextPoint(a, c, d),
-    f = this.graph.isOrthogonal(a);
-  c = mxUtils.toRadians(Number(b.style[mxConstants.STYLE_ROTATION] || "0"));
-  var g = new mxPoint(b.getCenterX(), b.getCenterY());
-  if (0 != c) var h = Math.cos(-c),
-    k = Math.sin(-c),
-    e = mxUtils.getRotatedPoint(e, h, k, g);
-  h = parseFloat(a.style[mxConstants.STYLE_PERIMETER_SPACING] || 0);
-  h += parseFloat(a.style[d ? mxConstants.STYLE_SOURCE_PERIMETER_SPACING : mxConstants.STYLE_TARGET_PERIMETER_SPACING] ||
-    0);
-  b = this.getPerimeterPoint(b, e, 0 == c && f, h);
-  0 != c && (h = Math.cos(c), k = Math.sin(c), b = mxUtils.getRotatedPoint(b, h, k, g));
-  a.setAbsoluteTerminalPoint(b, d)
-};
-mxGraphView.prototype.getTerminalPort = function(a, b, c) {
-  a = mxUtils.getValue(a.style, c ? mxConstants.STYLE_SOURCE_PORT : mxConstants.STYLE_TARGET_PORT);
-  null != a && (a = this.getState(this.graph.getModel().getCell(a)), null != a && (b = a));
-  return b
-};
-mxGraphView.prototype.getPerimeterPoint = function(a, b, c, d) {
-  var e = null;
-  if (null != a) {
-    var f = this.getPerimeterFunction(a);
-    if (null != f && null != b && (d = this.getPerimeterBounds(a, d), 0 < d.width || 0 < d.height)) e = f(d, a, b, c);
-    null == e && (e = this.getPoint(a))
-  }
-  return e
-};
-mxGraphView.prototype.getRoutingCenterX = function(a) {
-  var b = null != a.style ? parseFloat(a.style[mxConstants.STYLE_ROUTING_CENTER_X]) || 0 : 0;
-  return a.getCenterX() + b * a.width
-};
-mxGraphView.prototype.getRoutingCenterY = function(a) {
-  var b = null != a.style ? parseFloat(a.style[mxConstants.STYLE_ROUTING_CENTER_Y]) || 0 : 0;
-  return a.getCenterY() + b * a.height
-};
-mxGraphView.prototype.getPerimeterBounds = function(a, b) {
-  b = null != b ? b : 0;
-  null != a && (b += parseFloat(a.style[mxConstants.STYLE_PERIMETER_SPACING] || 0));
-  return a.getPerimeterBounds(b * this.scale)
-};
-mxGraphView.prototype.getPerimeterFunction = function(a) {
-  a = a.style[mxConstants.STYLE_PERIMETER];
-  if ("string" == typeof a) {
-    var b = mxStyleRegistry.getValue(a);
-    null == b && this.isAllowEval() && (b = mxUtils.eval(a));
-    a = b
-  }
-  return "function" == typeof a ? a : null
-};
-mxGraphView.prototype.getNextPoint = function(a, b, c) {
-  a = a.absolutePoints;
-  var d = null;
-  if (null != a && (c || 2 < a.length || null == b)) d = a.length, d = a[c ? Math.min(1, d - 1) : Math.max(0, d - 2)];
-  null == d && null != b && (d = new mxPoint(b.getCenterX(), b.getCenterY()));
-  return d
-};
-mxGraphView.prototype.getVisibleTerminal = function(a, b) {
-  for (var c = this.graph.getModel(), d = c.getTerminal(a, b), e = d; null != d && d != this.currentRoot;) {
-    if (!this.graph.isCellVisible(e) || this.graph.isCellCollapsed(d)) e = d;
-    d = c.getParent(d)
-  }
-  c.getParent(e) == c.getRoot() && (e = null);
-  return e
-};
-mxGraphView.prototype.updateEdgeBounds = function(a) {
-  var b = a.absolutePoints;
-  a.length = 0;
-  if (null != b && 0 < b.length) {
-    var c = b[0],
-      d = b[b.length - 1];
-    if (null == c || null == d) a.cell != this.currentRoot && this.clear(a.cell, !0);
-    else {
-      if (c.x != d.x || c.y != d.y) {
-        var e = d.x - c.x,
-          f = d.y - c.y;
-        a.terminalDistance = Math.sqrt(e * e + f * f)
-      } else a.terminalDistance = 0;
-      var d = 0,
-        g = [],
-        f = c;
-      if (null != f) {
-        for (var c = f.x, h = f.y, k = c, l = h, m = 1; m < b.length; m++) {
-          var n = b[m];
-          null != n && (e = f.x - n.x, f = f.y - n.y, e = Math.sqrt(e * e + f * f), g.push(e), d += e, f = n, c = Math.min(f.x, c), h = Math.min(f.y,
-            h), k = Math.max(f.x, k), l = Math.max(f.y, l))
-        }
-        a.length = d;
-        a.segments = g;
-        a.x = c;
-        a.y = h;
-        a.width = Math.max(1, k - c);
-        a.height = Math.max(1, l - h)
-      }
-    }
-  }
-};
-mxGraphView.prototype.getPoint = function(a, b) {
-  var c = a.getCenterX(),
-    d = a.getCenterY();
-  if (null != a.segments && (null == b || b.relative)) {
-    for (var e = a.absolutePoints.length, f = ((null != b ? b.x / 2 : 0) + 0.5) * a.length, g = a.segments[0], h = 0, k = 1; f > h + g && k < e - 1;) h += g, g = a.segments[k++];
-    e = 0 == g ? 0 : (f - h) / g;
-    f = a.absolutePoints[k - 1];
-    k = a.absolutePoints[k];
-    if (null != f && null != k) {
-      h = c = d = 0;
-      if (null != b) {
-        var d = b.y,
-          l = b.offset;
-        null != l && (c = l.x, h = l.y)
-      }
-      l = k.x - f.x;
-      k = k.y - f.y;
-      c = f.x + l * e + ((0 == g ? 0 : k / g) * d + c) * this.scale;
-      d = f.y + k * e - ((0 == g ? 0 : l / g) * d - h) * this.scale
-    }
-  } else null !=
-    b && (l = b.offset, null != l && (c += l.x, d += l.y));
-  return new mxPoint(c, d)
-};
-mxGraphView.prototype.getRelativePoint = function(a, b, c) {
-  var d = this.graph.getModel().getGeometry(a.cell);
-  if (null != d) {
-    var e = a.absolutePoints.length;
-    if (d.relative && 1 < e) {
-      for (var d = a.length, f = a.segments, g = a.absolutePoints[0], h = a.absolutePoints[1], k = mxUtils.ptSegDistSq(g.x, g.y, h.x, h.y, b, c), l = 0, m = 0, n = 0, p = 2; p < e; p++) m += f[p -
-        2], h = a.absolutePoints[p], g = mxUtils.ptSegDistSq(g.x, g.y, h.x, h.y, b, c), g <= k && (k = g, l = p - 1, n = m), g = h;
-      e = f[l];
-      g = a.absolutePoints[l];
-      h = a.absolutePoints[l + 1];
-      k = h.x;
-      f = h.y;
-      a = g.x - k;
-      l = g.y - f;
-      k = b - k;
-      f = c - f;
-      k = a - k;
-      f = l - f;
-      f = k * a + f * l;
-      a = Math.sqrt(0 >= f ? 0 : f * f / (a * a + l * l));
-      a > e && (a = e);
-      e = Math.sqrt(mxUtils.ptSegDistSq(g.x, g.y, h.x, h.y, b, c)); - 1 == mxUtils.relativeCcw(g.x, g.y, h.x, h.y, b, c) && (e = -e);
-      return new mxPoint(-2 * ((d / 2 - n - a) / d), e / this.scale)
-    }
-  }
-  return new mxPoint
-};
-mxGraphView.prototype.updateEdgeLabelOffset = function(a) {
-  var b = a.absolutePoints;
-  a.absoluteOffset.x = a.getCenterX();
-  a.absoluteOffset.y = a.getCenterY();
-  if (null != b && 0 < b.length && null != a.segments) {
-    var c = this.graph.getCellGeometry(a.cell);
-    if (c.relative) {
-      var d = this.getPoint(a, c);
-      null != d && (a.absoluteOffset = d)
-    } else {
-      var d = b[0],
-        e = b[b.length - 1];
-      if (null != d && null != e) {
-        var b = e.x - d.x,
-          f = e.y - d.y,
-          g = e = 0,
-          c = c.offset;
-        null != c && (e = c.x, g = c.y);
-        c = d.y + f / 2 + g * this.scale;
-        a.absoluteOffset.x = d.x + b / 2 + e * this.scale;
-        a.absoluteOffset.y = c
-      }
-    }
-  }
-};
-mxGraphView.prototype.getState = function(a, b) {
-  b = b || !1;
-  var c = null;
-  null != a && (c = this.states.get(a), this.graph.isCellVisible(a) && (null == c && b && this.graph.isCellVisible(a) ? (c = this.createState(a), this.states.put(a, c)) : b && (null != c && this.updateStyle) &&
-    (c.style = this.graph.getCellStyle(a))));
-  return c
-};
-mxGraphView.prototype.isRendering = function() {
-  return this.rendering
-};
-mxGraphView.prototype.setRendering = function(a) {
-  this.rendering = a
-};
-mxGraphView.prototype.isAllowEval = function() {
-  return this.allowEval
-};
-mxGraphView.prototype.setAllowEval = function(a) {
-  this.allowEval = a
-};
-mxGraphView.prototype.getStates = function() {
-  return this.states
-};
-mxGraphView.prototype.setStates = function(a) {
-  this.states = a
-};
-mxGraphView.prototype.getCellStates = function(a) {
-  if (null == a) return this.states;
-  for (var b = [], c = 0; c < a.length; c++) {
-    var d = this.getState(a[c]);
-    null != d && b.push(d)
-  }
-  return b
-};
-mxGraphView.prototype.removeState = function(a) {
-  var b = null;
-  null != a && (b = this.states.remove(a), null != b && (this.graph.cellRenderer.destroy(b), b.destroy()));
-  return b
-};
-mxGraphView.prototype.createState = function(a) {
-  var b = this.graph.getCellStyle(a);
-  a = new mxCellState(this, a, b);
-  this.graph.cellRenderer.initialize(a, this.isRendering());
-  return a
-};
-mxGraphView.prototype.getCanvas = function() {
-  return this.canvas
-};
-mxGraphView.prototype.getBackgroundPane = function() {
-  return this.backgroundPane
-};
-mxGraphView.prototype.getDrawPane = function() {
-  return this.drawPane
-};
-mxGraphView.prototype.getOverlayPane = function() {
-  return this.overlayPane
-};
-mxGraphView.prototype.isContainerEvent = function(a) {
-  a = mxEvent.getSource(a);
-  return a == this.graph.container || a.parentNode == this.backgroundPane || null != a.parentNode && a.parentNode.parentNode == this.backgroundPane || a == this.canvas.parentNode || a == this.canvas ||
-    a == this.backgroundPane || a == this.drawPane || a == this.overlayPane
-};
-mxGraphView.prototype.isScrollEvent = function(a) {
-  var b = mxUtils.getOffset(this.graph.container);
-  a = new mxPoint(a.clientX - b.x, a.clientY - b.y);
-  var b = this.graph.container.offsetWidth,
-    c = this.graph.container.clientWidth;
-  if (b > c && a.x > c + 2 && a.x <= b) return !0;
-  b = this.graph.container.offsetHeight;
-  c = this.graph.container.clientHeight;
-  return b > c && a.y > c + 2 && a.y <= b ? !0 : !1
-};
-mxGraphView.prototype.init = function() {
-  this.installListeners();
-  var a = this.graph;
-  a.dialect == mxConstants.DIALECT_SVG ? this.createSvg() : a.dialect == mxConstants.DIALECT_VML ? this.createVml() : this.createHtml()
-};
-mxGraphView.prototype.installListeners = function() {
-  var a = this.graph,
-    b = a.container;
-  if (null != b) {
-    mxEvent.addGestureListeners(b, mxUtils.bind(this, function(b) {
-      mxClient.IS_TOUCH && a.isEditing() && a.stopEditing(!a.isInvokesStopCellEditing());
-      this.isContainerEvent(b) && (!mxClient.IS_IE && !mxClient.IS_GC && !mxClient.IS_OP && !mxClient.IS_SF || !this.isScrollEvent(b)) && a.fireMouseEvent(mxEvent.MOUSE_DOWN, new mxMouseEvent(
-        b))
-    }), mxUtils.bind(this, function(b) {
-      this.isContainerEvent(b) && a.fireMouseEvent(mxEvent.MOUSE_MOVE,
-        new mxMouseEvent(b))
-    }), mxUtils.bind(this, function(b) {
-      this.isContainerEvent(b) && a.fireMouseEvent(mxEvent.MOUSE_UP, new mxMouseEvent(b))
-    }));
-    mxEvent.addListener(b, "dblclick", mxUtils.bind(this, function(b) {
-      a.dblClick(b)
-    }));
-    var c = function(c) {
-      var e = null;
-      mxClient.IS_TOUCH && (e = mxEvent.getClientX(c), c = mxEvent.getClientY(c), c = mxUtils.convertPoint(b, e, c), e = a.view.getState(a.getCellAt(c.x, c.y)));
-      return e
-    };
-    a.addMouseListener({
-      mouseDown: function(b, c) {
-        a.panningHandler.hideMenu()
-      },
-      mouseMove: function() {},
-      mouseUp: function() {}
-    });
-    this.moveHandler = mxUtils.bind(this, function(b) {
-      null != a.tooltipHandler && a.tooltipHandler.isHideOnHover() && a.tooltipHandler.hide();
-      this.captureDocumentGesture && (a.isMouseDown && !mxEvent.isConsumed(b)) && a.fireMouseEvent(mxEvent.MOUSE_MOVE, new mxMouseEvent(b, c(b)))
-    });
-    this.endHandler = mxUtils.bind(this, function(b) {
-      this.captureDocumentGesture && a.fireMouseEvent(mxEvent.MOUSE_UP, new mxMouseEvent(b))
-    });
-    mxEvent.addGestureListeners(document, null, this.moveHandler, this.endHandler)
-  }
-};
-mxGraphView.prototype.createHtml = function() {
-  var a = this.graph.container;
-  null != a && (this.canvas = this.createHtmlPane("100%", "100%"), this.backgroundPane = this.createHtmlPane("1px", "1px"), this.drawPane = this.createHtmlPane("1px", "1px"), this.overlayPane =
-    this.createHtmlPane("1px", "1px"), this.canvas.appendChild(this.backgroundPane), this.canvas.appendChild(this.drawPane), this.canvas.appendChild(this.overlayPane), a.appendChild(this.canvas),
-    mxClient.IS_QUIRKS && (a = mxUtils.bind(this, function(a) {
-      a = this.getGraphBounds();
-      this.updateHtmlCanvasSize(a.x + a.width + this.graph.border, a.y + a.height + this.graph.border)
-    }), mxEvent.addListener(window, "resize", a)))
-};
-mxGraphView.prototype.updateHtmlCanvasSize = function(a, b) {
-  if (null != this.graph.container) {
-    var c = this.graph.container.offsetHeight;
-    this.canvas.style.width = this.graph.container.offsetWidth < a ? a + "px" : "100%";
-    this.canvas.style.height = c < b ? b + "px" : "100%"
-  }
-};
-mxGraphView.prototype.createHtmlPane = function(a, b) {
-  var c = document.createElement("DIV");
-  null != a && null != b ? (c.style.position = "absolute", c.style.left = "0px", c.style.top = "0px", c.style.width = a, c.style.height = b) : c.style.position = "relative";
-  return c
-};
-mxGraphView.prototype.createVml = function() {
-  var a = this.graph.container;
-  if (null != a) {
-    var b = a.offsetWidth,
-      c = a.offsetHeight;
-    this.canvas = this.createVmlPane(b, c);
-    this.backgroundPane = this.createVmlPane(b, c);
-    this.drawPane = this.createVmlPane(b, c);
-    this.overlayPane = this.createVmlPane(b, c);
-    this.canvas.appendChild(this.backgroundPane);
-    this.canvas.appendChild(this.drawPane);
-    this.canvas.appendChild(this.overlayPane);
-    a.appendChild(this.canvas)
-  }
-};
-mxGraphView.prototype.createVmlPane = function(a, b) {
-  var c = document.createElement(mxClient.VML_PREFIX + ":group");
-  c.style.position = "absolute";
-  c.style.left = "0px";
-  c.style.top = "0px";
-  c.style.width = a + "px";
-  c.style.height = b + "px";
-  c.setAttribute("coordsize", a + "," + b);
-  c.setAttribute("coordorigin", "0,0");
-  return c
-};
-mxGraphView.prototype.createSvg = function() {
-  var a = this.graph.container;
-  this.canvas = document.createElementNS(mxConstants.NS_SVG, "g");
-  this.backgroundPane = document.createElementNS(mxConstants.NS_SVG, "g");
-  this.canvas.appendChild(this.backgroundPane);
-  this.drawPane = document.createElementNS(mxConstants.NS_SVG, "g");
-  this.canvas.appendChild(this.drawPane);
-  this.overlayPane = document.createElementNS(mxConstants.NS_SVG, "g");
-  this.canvas.appendChild(this.overlayPane);
-  var b = document.createElementNS(mxConstants.NS_SVG,
-    "svg");
-  b.style.width = "100%";
-  b.style.height = "100%";
-  b.style.display = "block";
-  b.appendChild(this.canvas);
-  null != a && (a.appendChild(b), "static" == mxUtils.getCurrentStyle(a).position && (a.style.position = "relative"))
-};
-mxGraphView.prototype.destroy = function() {
-  var a = null != this.canvas ? this.canvas.ownerSVGElement : null;
-  null == a && (a = this.canvas);
-  null != a && null != a.parentNode && (this.clear(this.currentRoot, !0), mxEvent.removeGestureListeners(document, null, this.moveHandler, this.endHandler), mxEvent.release(this.graph.container), a
-    .parentNode.removeChild(a), this.overlayPane = this.drawPane = this.backgroundPane = this.canvas = this.endHandler = this.moveHandler = null)
-};
-
-function mxCurrentRootChange(a, b) {
-  this.view = a;
-  this.previous = this.root = b;
-  this.isUp = null == b;
-  if (!this.isUp)
-    for (var c = this.view.currentRoot, d = this.view.graph.getModel(); null != c;) {
-      if (c == b) {
-        this.isUp = !0;
-        break
-      }
-      c = d.getParent(c)
-    }
-}
-mxCurrentRootChange.prototype.execute = function() {
-  var a = this.view.currentRoot;
-  this.view.currentRoot = this.previous;
-  this.previous = a;
-  a = this.view.graph.getTranslateForRoot(this.view.currentRoot);
-  null != a && (this.view.translate = new mxPoint(-a.x, -a.y));
-  this.view.fireEvent(new mxEventObject(this.isUp ? mxEvent.UP : mxEvent.DOWN, "root", this.view.currentRoot, "previous", this.previous));
-  this.isUp ? (this.view.clear(this.view.currentRoot, !0), this.view.validate()) : this.view.refresh();
-  this.isUp = !this.isUp
-};
-
-function mxGraph(a, b, c, d) {
-  this.mouseListeners = null;
-  this.renderHint = c;
-  this.dialect = mxClient.IS_SVG ? mxConstants.DIALECT_SVG : c == mxConstants.RENDERING_HINT_EXACT && mxClient.IS_VML ? mxConstants.DIALECT_VML : c == mxConstants.RENDERING_HINT_FASTEST ? mxConstants
-    .DIALECT_STRICTHTML : c == mxConstants.RENDERING_HINT_FASTER ? mxConstants.DIALECT_PREFERHTML : mxConstants.DIALECT_MIXEDHTML;
-  this.model = null != b ? b : new mxGraphModel;
-  this.multiplicities = [];
-  this.imageBundles = [];
-  this.cellRenderer = this.createCellRenderer();
-  this.setSelectionModel(this.createSelectionModel());
-  this.setStylesheet(null != d ? d : this.createStylesheet());
-  this.view = this.createGraphView();
-  this.graphModelChangeListener = mxUtils.bind(this, function(a, b) {
-    this.graphModelChanged(b.getProperty("edit").changes)
-  });
-  this.model.addListener(mxEvent.CHANGE, this.graphModelChangeListener);
-  this.createHandlers();
-  null != a && this.init(a);
-  this.view.revalidate()
-}
-mxLoadResources && mxResources.add(mxClient.basePath + "/resources/graph");
-mxGraph.prototype = new mxEventSource;
-mxGraph.prototype.constructor = mxGraph;
-mxGraph.prototype.EMPTY_ARRAY = [];
-mxGraph.prototype.mouseListeners = null;
-mxGraph.prototype.isMouseDown = !1;
-mxGraph.prototype.model = null;
-mxGraph.prototype.view = null;
-mxGraph.prototype.stylesheet = null;
-mxGraph.prototype.selectionModel = null;
-mxGraph.prototype.cellEditor = null;
-mxGraph.prototype.cellRenderer = null;
-mxGraph.prototype.multiplicities = null;
-mxGraph.prototype.renderHint = null;
-mxGraph.prototype.dialect = null;
-mxGraph.prototype.gridSize = 10;
-mxGraph.prototype.gridEnabled = !0;
-mxGraph.prototype.portsEnabled = !0;
-mxGraph.prototype.doubleTapEnabled = !0;
-mxGraph.prototype.doubleTapTimeout = 700;
-mxGraph.prototype.doubleTapTolerance = 25;
-mxGraph.prototype.lastTouchY = 0;
-mxGraph.prototype.lastTouchY = 0;
-mxGraph.prototype.lastTouchTime = 0;
-mxGraph.prototype.gestureEnabled = !0;
-mxGraph.prototype.tolerance = 4;
-mxGraph.prototype.defaultOverlap = 0.5;
-mxGraph.prototype.defaultParent = null;
-mxGraph.prototype.alternateEdgeStyle = null;
-mxGraph.prototype.backgroundImage = null;
-mxGraph.prototype.pageVisible = !1;
-mxGraph.prototype.pageBreaksVisible = !1;
-mxGraph.prototype.pageBreakColor = "gray";
-mxGraph.prototype.pageBreakDashed = !0;
-mxGraph.prototype.minPageBreakDist = 20;
-mxGraph.prototype.preferPageSize = !1;
-mxGraph.prototype.pageFormat = mxConstants.PAGE_FORMAT_A4_PORTRAIT;
-mxGraph.prototype.pageScale = 1.5;
-mxGraph.prototype.enabled = !0;
-mxGraph.prototype.escapeEnabled = !0;
-mxGraph.prototype.invokesStopCellEditing = !0;
-mxGraph.prototype.enterStopsCellEditing = !1;
-mxGraph.prototype.useScrollbarsForPanning = !0;
-mxGraph.prototype.exportEnabled = !0;
-mxGraph.prototype.importEnabled = !0;
-mxGraph.prototype.cellsLocked = !1;
-mxGraph.prototype.cellsCloneable = !0;
-mxGraph.prototype.foldingEnabled = !0;
-mxGraph.prototype.cellsEditable = !0;
-mxGraph.prototype.cellsDeletable = !0;
-mxGraph.prototype.cellsMovable = !0;
-mxGraph.prototype.edgeLabelsMovable = !0;
-mxGraph.prototype.vertexLabelsMovable = !1;
-mxGraph.prototype.dropEnabled = !1;
-mxGraph.prototype.splitEnabled = !0;
-mxGraph.prototype.cellsResizable = !0;
-mxGraph.prototype.cellsBendable = !0;
-mxGraph.prototype.cellsSelectable = !0;
-mxGraph.prototype.cellsDisconnectable = !0;
-mxGraph.prototype.autoSizeCells = !1;
-mxGraph.prototype.autoScroll = !0;
-mxGraph.prototype.timerAutoScroll = !1;
-mxGraph.prototype.allowAutoPanning = !1;
-mxGraph.prototype.ignoreScrollbars = !1;
-mxGraph.prototype.autoExtend = !0;
-mxGraph.prototype.maximumGraphBounds = null;
-mxGraph.prototype.minimumGraphSize = null;
-mxGraph.prototype.minimumContainerSize = null;
-mxGraph.prototype.maximumContainerSize = null;
-mxGraph.prototype.resizeContainer = !1;
-mxGraph.prototype.border = 0;
-mxGraph.prototype.ordered = !0;
-mxGraph.prototype.keepEdgesInForeground = !1;
-mxGraph.prototype.keepEdgesInBackground = !0;
-mxGraph.prototype.allowNegativeCoordinates = !0;
-mxGraph.prototype.constrainChildren = !0;
-mxGraph.prototype.extendParents = !0;
-mxGraph.prototype.extendParentsOnAdd = !0;
-mxGraph.prototype.collapseToPreferredSize = !0;
-mxGraph.prototype.zoomFactor = 1.2;
-mxGraph.prototype.keepSelectionVisibleOnZoom = !1;
-mxGraph.prototype.centerZoom = !0;
-mxGraph.prototype.resetViewOnRootChange = !0;
-mxGraph.prototype.resetEdgesOnResize = !1;
-mxGraph.prototype.resetEdgesOnMove = !1;
-mxGraph.prototype.resetEdgesOnConnect = !0;
-mxGraph.prototype.allowLoops = !1;
-mxGraph.prototype.defaultLoopStyle = mxEdgeStyle.Loop;
-mxGraph.prototype.multigraph = !0;
-mxGraph.prototype.connectableEdges = !1;
-mxGraph.prototype.allowDanglingEdges = !0;
-mxGraph.prototype.cloneInvalidEdges = !1;
-mxGraph.prototype.disconnectOnMove = !0;
-mxGraph.prototype.labelsVisible = !0;
-mxGraph.prototype.htmlLabels = !1;
-mxGraph.prototype.swimlaneSelectionEnabled = !0;
-mxGraph.prototype.swimlaneNesting = !0;
-mxGraph.prototype.swimlaneIndicatorColorAttribute = mxConstants.STYLE_FILLCOLOR;
-mxGraph.prototype.imageBundles = null;
-mxGraph.prototype.minFitScale = 0.1;
-mxGraph.prototype.maxFitScale = 8;
-mxGraph.prototype.panDx = 0;
-mxGraph.prototype.panDy = 0;
-mxGraph.prototype.collapsedImage = new mxImage(mxClient.imageBasePath + "/collapsed.gif", 9, 9);
-mxGraph.prototype.expandedImage = new mxImage(mxClient.imageBasePath + "/expanded.gif", 9, 9);
-// mxGraph.prototype.warningImage = new mxImage(mxClient.imageBasePath + "/warning" + (mxClient.IS_MAC ? ".png" : ".gif"), 16, 16);
-mxGraph.prototype.warningImage = new mxImage("/assets/plugins/mxgraph/images/warning.gif", 16, 16);
-
-
-mxGraph.prototype.alreadyConnectedResource = "none" != mxClient.language ? "alreadyConnected" : "";
-mxGraph.prototype.containsValidationErrorsResource = "none" != mxClient.language ? "containsValidationErrors" : "";
-mxGraph.prototype.collapseExpandResource = "none" != mxClient.language ? "collapse-expand" : "";
-mxGraph.prototype.init = function(a) {
-  this.container = a;
-  this.cellEditor = this.createCellEditor();
-  this.view.init();
-  this.sizeDidChange();
-  mxClient.IS_IE && (mxEvent.addListener(window, "unload", mxUtils.bind(this, function() {
-    this.destroy()
-  })), mxEvent.addListener(a, "selectstart", mxUtils.bind(this, function() {
-    return this.isEditing()
-  })));
-  8 == document.documentMode && a.insertAdjacentHTML("beforeend", '\x3cv:group style\x3d"DISPLAY: none;"\x3e\x3c/v:group\x3e')
-};
-mxGraph.prototype.createHandlers = function(a) {
-  this.tooltipHandler = new mxTooltipHandler(this);
-  this.tooltipHandler.setEnabled(!1);
-  this.panningHandler = new mxPanningHandler(this);
-  this.panningHandler.panningEnabled = !1;
-  this.selectionCellsHandler = new mxSelectionCellsHandler(this);
-  this.connectionHandler = new mxConnectionHandler(this);
-  this.connectionHandler.setEnabled(!1);
-  this.graphHandler = new mxGraphHandler(this)
-};
-mxGraph.prototype.createSelectionModel = function() {
-  return new mxGraphSelectionModel(this)
-};
-mxGraph.prototype.createStylesheet = function() {
-  return new mxStylesheet
-};
-mxGraph.prototype.createGraphView = function() {
-  return new mxGraphView(this)
-};
-mxGraph.prototype.createCellRenderer = function() {
-  return new mxCellRenderer
-};
-mxGraph.prototype.createCellEditor = function() {
-  return new mxCellEditor(this)
-};
-mxGraph.prototype.getModel = function() {
-  return this.model
-};
-mxGraph.prototype.getView = function() {
-  return this.view
-};
-mxGraph.prototype.getStylesheet = function() {
-  return this.stylesheet
-};
-mxGraph.prototype.setStylesheet = function(a) {
-  this.stylesheet = a
-};
-mxGraph.prototype.getSelectionModel = function() {
-  return this.selectionModel
-};
-mxGraph.prototype.setSelectionModel = function(a) {
-  this.selectionModel = a
-};
-mxGraph.prototype.getSelectionCellsForChanges = function(a) {
-  for (var b = [], c = 0; c < a.length; c++) {
-    var d = a[c];
-    if (d.constructor != mxRootChange) {
-      var e = null;
-      d instanceof mxChildChange && null == d.previous ? e = d.child : null != d.cell && d.cell instanceof mxCell && (e = d.cell);
-      null != e && 0 > mxUtils.indexOf(b, e) && b.push(e)
-    }
-  }
-  return this.getModel().getTopmostCells(b)
-};
-mxGraph.prototype.graphModelChanged = function(a) {
-  for (var b = 0; b < a.length; b++) this.processChange(a[b]);
-  this.removeSelectionCells(this.getRemovedCellsForChanges(a));
-  this.view.validate();
-  this.sizeDidChange()
-};
-mxGraph.prototype.getRemovedCellsForChanges = function(a) {
-  for (var b = [], c = 0; c < a.length; c++) {
-    var d = a[c];
-    if (d instanceof mxRootChange) break;
-    else d instanceof mxChildChange ? null != d.previous && null == d.parent && (b = b.concat(this.model.getDescendants(d.child))) : d instanceof mxVisibleChange && (b = b.concat(this.model.getDescendants(
-      d.cell)))
-  }
-  return b
-};
-mxGraph.prototype.processChange = function(a) {
-  if (a instanceof mxRootChange) this.clearSelection(), this.removeStateForCell(a.previous), this.resetViewOnRootChange && (this.view.scale = 1, this.view.translate.x = 0, this.view.translate.y = 0),
-    this.fireEvent(new mxEventObject(mxEvent.ROOT));
-  else if (a instanceof mxChildChange) {
-    var b = this.model.getParent(a.child);
-    null != b ? this.view.invalidate(a.child, !0, !1, null != a.previous) : (this.removeStateForCell(a.child), this.view.currentRoot == a.child && this.home());
-    b != a.previous &&
-      (null != b && this.view.invalidate(b, !1, !1), null != a.previous && this.view.invalidate(a.previous, !1, !1))
-  } else a instanceof mxTerminalChange || a instanceof mxGeometryChange ? this.view.invalidate(a.cell) : a instanceof mxValueChange ? this.view.invalidate(a.cell, !1, !1) : a instanceof mxStyleChange ?
-    (this.view.invalidate(a.cell, !0, !0, !1), this.view.removeState(a.cell)) : null != a.cell && a.cell instanceof mxCell && this.removeStateForCell(a.cell)
-};
-mxGraph.prototype.removeStateForCell = function(a) {
-  for (var b = this.model.getChildCount(a), c = 0; c < b; c++) this.removeStateForCell(this.model.getChildAt(a, c));
-  this.view.removeState(a)
-};
-mxGraph.prototype.addCellOverlay = function(a, b) {
-  null == a.overlays && (a.overlays = []);
-  a.overlays.push(b);
-  var c = this.view.getState(a);
-  null != c && this.cellRenderer.redraw(c);
-  this.fireEvent(new mxEventObject(mxEvent.ADD_OVERLAY, "cell", a, "overlay", b));
-  return b
-};
-mxGraph.prototype.getCellOverlays = function(a) {
-  return a.overlays
-};
-mxGraph.prototype.removeCellOverlay = function(a, b) {
-  if (null == b) this.removeCellOverlays(a);
-  else {
-    var c = mxUtils.indexOf(a.overlays, b);
-    0 <= c ? (a.overlays.splice(c, 1), 0 == a.overlays.length && (a.overlays = null), c = this.view.getState(a), null != c && this.cellRenderer.redraw(c), this.fireEvent(new mxEventObject(mxEvent.REMOVE_OVERLAY,
-      "cell", a, "overlay", b))) : b = null
-  }
-  return b
-};
-mxGraph.prototype.removeCellOverlays = function(a) {
-  var b = a.overlays;
-  if (null != b) {
-    a.overlays = null;
-    var c = this.view.getState(a);
-    null != c && this.cellRenderer.redraw(c);
-    for (c = 0; c < b.length; c++) this.fireEvent(new mxEventObject(mxEvent.REMOVE_OVERLAY, "cell", a, "overlay", b[c]))
-  }
-  return b
-};
-mxGraph.prototype.clearCellOverlays = function(a) {
-  a = null != a ? a : this.model.getRoot();
-  this.removeCellOverlays(a);
-  for (var b = this.model.getChildCount(a), c = 0; c < b; c++) {
-    var d = this.model.getChildAt(a, c);
-    this.clearCellOverlays(d)
-  }
-};
-mxGraph.prototype.setCellWarning = function(a, b, c, d) {
-  if (null != b && 0 < b.length) return c = null != c ? c : this.warningImage, b = new mxCellOverlay(c, "\x3cfont color\x3dred\x3e" + b + "\x3c/font\x3e"), d && b.addListener(mxEvent.CLICK, mxUtils
-    .bind(this, function(b, c) {
-      this.isEnabled() && this.setSelectionCell(a)
-    })), this.addCellOverlay(a, b);
-  this.removeCellOverlays(a);
-  return null
-};
-mxGraph.prototype.startEditing = function(a) {
-  this.startEditingAtCell(null, a)
-};
-mxGraph.prototype.startEditingAtCell = function(a, b) {
-  null == a && (a = this.getSelectionCell(), null != a && !this.isCellEditable(a) && (a = null));
-  null != a && (this.fireEvent(new mxEventObject(mxEvent.START_EDITING, "cell", a, "event", b)), this.cellEditor.startEditing(a, b))
-};
-mxGraph.prototype.getEditingValue = function(a, b) {
-  return this.convertValueToString(a)
-};
-mxGraph.prototype.stopEditing = function(a) {
-  this.cellEditor.stopEditing(a)
-};
-mxGraph.prototype.labelChanged = function(a, b, c) {
-  this.model.beginUpdate();
-  try {
-    this.cellLabelChanged(a, b, this.isAutoSizeCell(a)), this.fireEvent(new mxEventObject(mxEvent.LABEL_CHANGED, "cell", a, "value", b, "event", c))
-  } finally {
-    this.model.endUpdate()
-  }
-  return a
-};
-mxGraph.prototype.cellLabelChanged = function(a, b, c) {
-  this.model.beginUpdate();
-  try {
-    this.model.setValue(a, b), c && this.cellSizeUpdated(a, !1)
-  } finally {
-    this.model.endUpdate()
-  }
-};
-mxGraph.prototype.escape = function(a) {
-  this.stopEditing(!0);
-  this.connectionHandler.reset();
-  this.graphHandler.reset();
-  a = this.getSelectionCells();
-  for (var b = 0; b < a.length; b++) {
-    var c = this.view.getState(a[b]);
-    null != c && null != c.handler && c.handler.reset()
-  }
-};
-mxGraph.prototype.click = function(a) {
-  var b = a.getEvent(),
-    c = a.getCell(),
-    d = new mxEventObject(mxEvent.CLICK, "event", b, "cell", c);
-  a.isConsumed() && d.consume();
-  this.fireEvent(d);
-  this.isEnabled() && (!mxEvent.isConsumed(b) && !d.isConsumed()) && (null != c ? this.selectCellForEvent(c, b) : (c = null, this.isSwimlaneSelectionEnabled() && (c = this.getSwimlaneAt(a.getGraphX(),
-    a.getGraphY())), null != c ? this.selectCellForEvent(c, b) : this.isToggleEvent(b) || this.clearSelection()))
-};
-mxGraph.prototype.dblClick = function(a, b) {
-  var c = new mxEventObject(mxEvent.DOUBLE_CLICK, "event", a, "cell", b);
-  this.fireEvent(c);
-  this.isEnabled() && (!mxEvent.isConsumed(a) && !c.isConsumed() && null != b && this.isCellEditable(b)) && this.startEditingAtCell(b, a)
-};
-mxGraph.prototype.scrollPointToVisible = function(a, b, c, d) {
-  if (!this.timerAutoScroll && (this.ignoreScrollbars || mxUtils.hasScrollbars(this.container))) {
-    var e = this.container;
-    d = null != d ? d : 20;
-    if (a >= e.scrollLeft && b >= e.scrollTop && a <= e.scrollLeft + e.clientWidth && b <= e.scrollTop + e.clientHeight) {
-      var f = e.scrollLeft + e.clientWidth - a;
-      if (f < d) {
-        if (a = e.scrollLeft, e.scrollLeft += d - f, c && a == e.scrollLeft) {
-          if (this.dialect == mxConstants.DIALECT_SVG) {
-            a = this.view.getDrawPane().ownerSVGElement;
-            var g = this.container.scrollWidth + d - f
-          } else g =
-            Math.max(e.clientWidth, e.scrollWidth) + d - f, a = this.view.getCanvas();
-          a.style.width = g + "px";
-          e.scrollLeft += d - f
-        }
-      } else f = a - e.scrollLeft, f < d && (e.scrollLeft -= d - f);
-      f = e.scrollTop + e.clientHeight - b;
-      f < d ? (a = e.scrollTop, e.scrollTop += d - f, a == e.scrollTop && c && (this.dialect == mxConstants.DIALECT_SVG ? (a = this.view.getDrawPane().ownerSVGElement, b = this.container.scrollHeight +
-        d - f) : (b = Math.max(e.clientHeight, e.scrollHeight) + d - f, a = this.view.getCanvas()), a.style.height = b + "px", e.scrollTop += d - f)) : (f = b - e.scrollTop, f < d && (e.scrollTop -=
-        d - f))
-    }
-  } else this.allowAutoPanning && !this.panningHandler.active && (null == this.panningManager && (this.panningManager = this.createPanningManager()), this.panningManager.panTo(a + this.panDx, b +
-    this.panDy))
-};
-mxGraph.prototype.createPanningManager = function() {
-  return new mxPanningManager(this)
-};
-mxGraph.prototype.getBorderSizes = function() {
-  function a(a) {
-    var b = 0,
-      b = "thin" == a ? 2 : "medium" == a ? 4 : "thick" == a ? 6 : parseInt(a);
-    isNaN(b) && (b = 0);
-    return b
-  }
-  var b = mxUtils.getCurrentStyle(this.container),
-    c = new mxRectangle;
-  c.x = a(b.borderLeftWidth) + parseInt(b.paddingLeft || 0);
-  c.y = a(b.borderTopWidth) + parseInt(b.paddingTop || 0);
-  c.width = a(b.borderRightWidth) + parseInt(b.paddingRight || 0);
-  c.height = a(b.borderBottomWidth) + parseInt(b.paddingBottom || 0);
-  return c
-};
-mxGraph.prototype.getPreferredPageSize = function(a, b, c) {
-  a = this.view.scale;
-  var d = this.view.translate,
-    e = this.pageFormat,
-    f = a * this.pageScale,
-    e = new mxRectangle(0, 0, e.width * f, e.height * f);
-  b = this.pageBreaksVisible ? Math.ceil(b / e.width) : 1;
-  c = this.pageBreaksVisible ? Math.ceil(c / e.height) : 1;
-  return new mxRectangle(0, 0, b * e.width + 2 + d.x / a, c * e.height + 2 + d.y / a)
-};
-mxGraph.prototype.sizeDidChange = function() {
-  var a = this.getGraphBounds();
-  if (null != this.container) {
-    var b = this.getBorder(),
-      c = Math.max(0, a.x + a.width + 1 + b),
-      b = Math.max(0, a.y + a.height + 1 + b);
-    null != this.minimumContainerSize && (c = Math.max(c, this.minimumContainerSize.width), b = Math.max(b, this.minimumContainerSize.height));
-    this.resizeContainer && this.doResizeContainer(c, b);
-    if (this.preferPageSize || !mxClient.IS_IE && this.pageVisible) {
-      var d = this.getPreferredPageSize(a, c, b);
-      null != d && (c = d.width, b = d.height)
-    }
-    null != this.minimumGraphSize &&
-      (c = Math.max(c, this.minimumGraphSize.width * this.view.scale), b = Math.max(b, this.minimumGraphSize.height * this.view.scale));
-    c = Math.ceil(c - 1);
-    b = Math.ceil(b - 1);
-    this.dialect == mxConstants.DIALECT_SVG ? (d = this.view.getDrawPane().ownerSVGElement, d.style.minWidth = Math.max(1, c) + "px", d.style.minHeight = Math.max(1, b) + "px", d.style.width =
-      "100%", d.style.height = "100%") : mxClient.IS_QUIRKS ? this.view.updateHtmlCanvasSize(Math.max(1, c), Math.max(1, b)) : (this.view.canvas.style.minWidth = Math.max(1, c) + "px", this.view.canvas
-      .style.minHeight =
-      Math.max(1, b) + "px");
-    this.updatePageBreaks(this.pageBreaksVisible, c - 1, b - 1)
-  }
-  this.fireEvent(new mxEventObject(mxEvent.SIZE, "bounds", a))
-};
-mxGraph.prototype.doResizeContainer = function(a, b) {
-  if (mxClient.IS_IE)
-    if (mxClient.IS_QUIRKS) {
-      var c = this.getBorderSizes();
-      a += Math.max(2, c.x + c.width + 1);
-      b += Math.max(2, c.y + c.height + 1)
-    } else 9 <= document.documentMode ? (a += 3, b += 5) : (a += 1, b += 1);
-  else b += 1;
-  null != this.maximumContainerSize && (a = Math.min(this.maximumContainerSize.width, a), b = Math.min(this.maximumContainerSize.height, b));
-  this.container.style.width = Math.ceil(a) + "px";
-  this.container.style.height = Math.ceil(b) + "px"
-};
-mxGraph.prototype.updatePageBreaks = function(a, b, c) {
-  var d = this.view.scale,
-    e = this.view.translate,
-    f = this.pageFormat,
-    g = d * this.pageScale,
-    e = new mxRectangle(d * e.x, d * e.y, f.width * g, f.height * g);
-  a = a && Math.min(e.width, e.height) > this.minPageBreakDist;
-  e.x = mxUtils.mod(e.x, e.width);
-  e.y = mxUtils.mod(e.y, e.height);
-  f = a ? Math.ceil((b - e.x) / e.width) : 0;
-  a = a ? Math.ceil((c - e.y) / e.height) : 0;
-  null == this.horizontalPageBreaks && 0 < f && (this.horizontalPageBreaks = []);
-  if (null != this.horizontalPageBreaks) {
-    for (g = 0; g <= f; g++) {
-      var h = [new mxPoint(e.x +
-        g * e.width, 1), new mxPoint(e.x + g * e.width, c)];
-      null != this.horizontalPageBreaks[g] ? (this.horizontalPageBreaks[g].scale = 1, this.horizontalPageBreaks[g].points = h, this.horizontalPageBreaks[g].redraw()) : (h = new mxPolyline(h, this.pageBreakColor,
-        this.scale), h.dialect = this.dialect, h.isDashed = this.pageBreakDashed, h.scale = d, h.init(this.view.backgroundPane), h.redraw(), this.horizontalPageBreaks[g] = h)
-    }
-    for (g = f; g < this.horizontalPageBreaks.length; g++) this.horizontalPageBreaks[g].destroy();
-    this.horizontalPageBreaks.splice(f,
-      this.horizontalPageBreaks.length - f)
-  }
-  null == this.verticalPageBreaks && 0 < a && (this.verticalPageBreaks = []);
-  if (null != this.verticalPageBreaks) {
-    for (g = 0; g <= a; g++) h = [new mxPoint(1, e.y + g * e.height), new mxPoint(b, e.y + g * e.height)], null != this.verticalPageBreaks[g] ? (this.verticalPageBreaks[g].scale = 1, this.verticalPageBreaks[
-      g].points = h, this.verticalPageBreaks[g].redraw()) : (h = new mxPolyline(h, this.pageBreakColor, d), h.dialect = this.dialect, h.isDashed = this.pageBreakDashed, h.scale = d, h.init(this.view
-        .backgroundPane), h.redraw(),
-      this.verticalPageBreaks[g] = h);
-    for (g = a; g < this.verticalPageBreaks.length; g++) this.verticalPageBreaks[g].destroy();
-    this.verticalPageBreaks.splice(a, this.verticalPageBreaks.length - a)
-  }
-};
-mxGraph.prototype.getCellStyle = function(a) {
-  var b = this.model.getStyle(a),
-    c = null,
-    c = this.model.isEdge(a) ? this.stylesheet.getDefaultEdgeStyle() : this.stylesheet.getDefaultVertexStyle();
-  null != b && (c = this.postProcessCellStyle(this.stylesheet.getCellStyle(b, c)));
-  null == c && (c = mxGraph.prototype.EMPTY_ARRAY);
-  return c
-};
-mxGraph.prototype.postProcessCellStyle = function(a) {
-  if (null != a) {
-    var b = a[mxConstants.STYLE_IMAGE],
-      c = this.getImageFromBundles(b);
-    null != c ? a[mxConstants.STYLE_IMAGE] = c : c = b;
-    null != c && "data:image/" == c.substring(0, 11) && (b = c.indexOf(","), 0 < b && (c = c.substring(0, b) + ";base64," + c.substring(b + 1)), a[mxConstants.STYLE_IMAGE] = c)
-  }
-  return a
-};
-mxGraph.prototype.setCellStyle = function(a, b) {
-  b = b || this.getSelectionCells();
-  if (null != b) {
-    this.model.beginUpdate();
-    try {
-      for (var c = 0; c < b.length; c++) this.model.setStyle(b[c], a)
-    } finally {
-      this.model.endUpdate()
-    }
-  }
-};
-mxGraph.prototype.toggleCellStyle = function(a, b, c) {
-  c = c || this.getSelectionCell();
-  this.toggleCellStyles(a, b, [c])
-};
-mxGraph.prototype.toggleCellStyles = function(a, b, c) {
-  b = null != b ? b : !1;
-  c = c || this.getSelectionCells();
-  if (null != c && 0 < c.length) {
-    var d = this.view.getState(c[0]),
-      d = null != d ? d.style : this.getCellStyle(c[0]);
-    null != d && (b = mxUtils.getValue(d, a, b) ? 0 : 1, this.setCellStyles(a, b, c))
-  }
-};
-mxGraph.prototype.setCellStyles = function(a, b, c) {
-  c = c || this.getSelectionCells();
-  mxUtils.setCellStyles(this.model, c, a, b)
-};
-mxGraph.prototype.toggleCellStyleFlags = function(a, b, c) {
-  this.setCellStyleFlags(a, b, null, c)
-};
-mxGraph.prototype.setCellStyleFlags = function(a, b, c, d) {
-  d = d || this.getSelectionCells();
-  if (null != d && 0 < d.length) {
-    if (null == c) {
-      var e = this.view.getState(d[0]),
-        e = null != e ? e.style : this.getCellStyle(d[0]);
-      null != e && (c = (parseInt(e[a] || 0) & b) != b)
-    }
-    mxUtils.setCellStyleFlags(this.model, d, a, b, c)
-  }
-};
-mxGraph.prototype.alignCells = function(a, b, c) {
-  null == b && (b = this.getSelectionCells());
-  if (null != b && 1 < b.length) {
-    if (null == c)
-      for (var d = 0; d < b.length; d++) {
-        var e = this.getCellGeometry(b[d]);
-        if (null != e && !this.model.isEdge(b[d]))
-          if (null == c)
-            if (a == mxConstants.ALIGN_CENTER) {
-              c = e.x + e.width / 2;
-              break
-            } else if (a == mxConstants.ALIGN_RIGHT) c = e.x + e.width;
-        else if (a == mxConstants.ALIGN_TOP) c = e.y;
-        else if (a == mxConstants.ALIGN_MIDDLE) {
-          c = e.y + e.height / 2;
-          break
-        } else c = a == mxConstants.ALIGN_BOTTOM ? e.y + e.height : e.x;
-        else c = a == mxConstants.ALIGN_RIGHT ?
-          Math.max(c, e.x + e.width) : a == mxConstants.ALIGN_TOP ? Math.min(c, e.y) : a == mxConstants.ALIGN_BOTTOM ? Math.max(c, e.y + e.height) : Math.min(c, e.x)
-      }
-    if (null != c) {
-      this.model.beginUpdate();
-      try {
-        for (d = 0; d < b.length; d++) e = this.getCellGeometry(b[d]), null != e && !this.model.isEdge(b[d]) && (e = e.clone(), a == mxConstants.ALIGN_CENTER ? e.x = c - e.width / 2 : a ==
-          mxConstants.ALIGN_RIGHT ? e.x = c - e.width : a == mxConstants.ALIGN_TOP ? e.y = c : a == mxConstants.ALIGN_MIDDLE ? e.y = c - e.height / 2 : a == mxConstants.ALIGN_BOTTOM ? e.y = c - e
-          .height : e.x = c, this.model.setGeometry(b[d],
-            e));
-        this.fireEvent(new mxEventObject(mxEvent.ALIGN_CELLS, "align", a, "cells", b))
-      } finally {
-        this.model.endUpdate()
-      }
-    }
-  }
-  return b
-};
-mxGraph.prototype.flipEdge = function(a) {
-  if (null != a && null != this.alternateEdgeStyle) {
-    this.model.beginUpdate();
-    try {
-      var b = this.model.getStyle(a);
-      null == b || 0 == b.length ? this.model.setStyle(a, this.alternateEdgeStyle) : this.model.setStyle(a, null);
-      this.resetEdge(a);
-      this.fireEvent(new mxEventObject(mxEvent.FLIP_EDGE, "edge", a))
-    } finally {
-      this.model.endUpdate()
-    }
-  }
-  return a
-};
-mxGraph.prototype.addImageBundle = function(a) {
-  this.imageBundles.push(a)
-};
-mxGraph.prototype.removeImageBundle = function(a) {
-  for (var b = [], c = 0; c < this.imageBundles.length; c++) this.imageBundles[c] != a && b.push(this.imageBundles[c]);
-  this.imageBundles = b
-};
-mxGraph.prototype.getImageFromBundles = function(a) {
-  if (null != a)
-    for (var b = 0; b < this.imageBundles.length; b++) {
-      var c = this.imageBundles[b].getImage(a);
-      if (null != c) return c
-    }
-  return null
-};
-mxGraph.prototype.orderCells = function(a, b) {
-  null == b && (b = mxUtils.sortCells(this.getSelectionCells(), !0));
-  this.model.beginUpdate();
-  try {
-    this.cellsOrdered(b, a), this.fireEvent(new mxEventObject(mxEvent.ORDER_CELLS, "back", a, "cells", b))
-  } finally {
-    this.model.endUpdate()
-  }
-  return b
-};
-mxGraph.prototype.cellsOrdered = function(a, b) {
-  if (null != a) {
-    this.model.beginUpdate();
-    try {
-      for (var c = 0; c < a.length; c++) {
-        var d = this.model.getParent(a[c]);
-        b ? this.model.add(d, a[c], c) : this.model.add(d, a[c], this.model.getChildCount(d) - 1)
-      }
-      this.fireEvent(new mxEventObject(mxEvent.CELLS_ORDERED, "back", b, "cells", a))
-    } finally {
-      this.model.endUpdate()
-    }
-  }
-};
-mxGraph.prototype.groupCells = function(a, b, c) {
-  null == c && (c = mxUtils.sortCells(this.getSelectionCells(), !0));
-  c = this.getCellsForGroup(c);
-  null == a && (a = this.createGroupCell(c));
-  var d = this.getBoundsForGroup(a, c, b);
-  if (0 < c.length && null != d) {
-    var e = this.model.getParent(a);
-    null == e && (e = this.model.getParent(c[0]));
-    this.model.beginUpdate();
-    try {
-      null == this.getCellGeometry(a) && this.model.setGeometry(a, new mxGeometry);
-      var f = this.model.getChildCount(e);
-      this.cellsAdded([a], e, f, null, null, !1);
-      f = this.model.getChildCount(a);
-      this.cellsAdded(c, a, f, null, null, !1, !1);
-      this.cellsMoved(c, -d.x, -d.y, !1, !0);
-      this.cellsResized([a], [d]);
-      this.fireEvent(new mxEventObject(mxEvent.GROUP_CELLS, "group", a, "border", b, "cells", c))
-    } finally {
-      this.model.endUpdate()
-    }
-  }
-  return a
-};
-mxGraph.prototype.getCellsForGroup = function(a) {
-  var b = [];
-  if (null != a && 0 < a.length) {
-    var c = this.model.getParent(a[0]);
-    b.push(a[0]);
-    for (var d = 1; d < a.length; d++) this.model.getParent(a[d]) == c && b.push(a[d])
-  }
-  return b
-};
-mxGraph.prototype.getBoundsForGroup = function(a, b, c) {
-  b = this.getBoundingBoxFromGeometry(b);
-  null != b && (this.isSwimlane(a) && (a = this.getStartSize(a), b.x -= a.width, b.y -= a.height, b.width += a.width, b.height += a.height), b.x -= c, b.y -= c, b.width += 2 * c, b.height += 2 * c);
-  return b
-};
-mxGraph.prototype.createGroupCell = function(a) {
-  a = new mxCell("");
-  a.setVertex(!0);
-  a.setConnectable(!1);
-  return a
-};
-mxGraph.prototype.ungroupCells = function(a) {
-  var b = [];
-  if (null == a) {
-    a = this.getSelectionCells();
-    for (var c = [], d = 0; d < a.length; d++) 0 < this.model.getChildCount(a[d]) && c.push(a[d]);
-    a = c
-  }
-  if (null != a && 0 < a.length) {
-    this.model.beginUpdate();
-    try {
-      for (d = 0; d < a.length; d++) {
-        var e = this.model.getChildren(a[d]);
-        if (null != e && 0 < e.length) {
-          var e = e.slice(),
-            f = this.model.getParent(a[d]),
-            g = this.model.getChildCount(f);
-          this.cellsAdded(e, f, g, null, null, !0);
-          b = b.concat(e)
-        }
-      }
-      this.cellsRemoved(this.addAllEdges(a));
-      this.fireEvent(new mxEventObject(mxEvent.UNGROUP_CELLS,
-        "cells", a))
-    } finally {
-      this.model.endUpdate()
-    }
-  }
-  return b
-};
-mxGraph.prototype.removeCellsFromParent = function(a) {
-  null == a && (a = this.getSelectionCells());
-  this.model.beginUpdate();
-  try {
-    var b = this.getDefaultParent(),
-      c = this.model.getChildCount(b);
-    this.cellsAdded(a, b, c, null, null, !0);
-    this.fireEvent(new mxEventObject(mxEvent.REMOVE_CELLS_FROM_PARENT, "cells", a))
-  } finally {
-    this.model.endUpdate()
-  }
-  return a
-};
-mxGraph.prototype.updateGroupBounds = function(a, b, c) {
-  null == a && (a = this.getSelectionCells());
-  b = null != b ? b : 0;
-  c = null != c ? c : !1;
-  this.model.beginUpdate();
-  try {
-    for (var d = 0; d < a.length; d++) {
-      var e = this.getCellGeometry(a[d]);
-      if (null != e) {
-        var f = this.getChildCells(a[d]);
-        if (null != f && 0 < f.length) {
-          var g = this.getBoundingBoxFromGeometry(f);
-          if (0 < g.width && 0 < g.height) {
-            var h = this.isSwimlane(a[d]) ? this.getStartSize(a[d]) : new mxRectangle,
-              e = e.clone();
-            c && (e.x += g.x - h.width - b, e.y += g.y - h.height - b);
-            e.width = g.width + h.width + 2 * b;
-            e.height =
-              g.height + h.height + 2 * b;
-            this.model.setGeometry(a[d], e);
-            this.moveCells(f, -g.x + h.width + b, -g.y + h.height + b)
-          }
-        }
-      }
-    }
-  } finally {
-    this.model.endUpdate()
-  }
-  return a
-};
-mxGraph.prototype.cloneCells = function(a, b) {
-  b = null != b ? b : !0;
-  var c = null;
-  if (null != a) {
-    for (var d = {}, c = [], e = 0; e < a.length; e++) {
-      var f = mxCellPath.create(a[e]);
-      d[f] = a[e];
-      c.push(a[e])
-    }
-    if (0 < c.length)
-      for (var f = this.view.scale, g = this.view.translate, c = this.model.cloneCells(a, !0), e = 0; e < a.length; e++)
-        if (!b && this.model.isEdge(c[e]) && null != this.getEdgeValidationError(c[e], this.model.getTerminal(c[e], !0), this.model.getTerminal(c[e], !1))) c[e] = null;
-        else {
-          var h = this.model.getGeometry(c[e]);
-          if (null != h) {
-            var k = this.view.getState(a[e]),
-              l = this.view.getState(this.model.getParent(a[e]));
-            if (null != k && null != l) {
-              var m = l.origin.x,
-                l = l.origin.y;
-              if (this.model.isEdge(c[e])) {
-                for (var k = k.absolutePoints, n = this.model.getTerminal(a[e], !0), p = mxCellPath.create(n); null != n && null == d[p];) n = this.model.getParent(n), p = mxCellPath.create(n);
-                null == n && h.setTerminalPoint(new mxPoint(k[0].x / f - g.x, k[0].y / f - g.y), !0);
-                n = this.model.getTerminal(a[e], !1);
-                for (p = mxCellPath.create(n); null != n && null == d[p];) n = this.model.getParent(n), p = mxCellPath.create(n);
-                null == n && (n = k.length -
-                  1, h.setTerminalPoint(new mxPoint(k[n].x / f - g.x, k[n].y / f - g.y), !1));
-                h = h.points;
-                if (null != h)
-                  for (k = 0; k < h.length; k++) h[k].x += m, h[k].y += l
-              } else h.x += m, h.y += l
-            }
-          }
-        } else c = []
-  }
-  return c
-};
-mxGraph.prototype.insertVertex = function(a, b, c, d, e, f, g, h, k) {
-  b = this.createVertex(a, b, c, d, e, f, g, h, k);
-  return this.addCell(b, a)
-};
-mxGraph.prototype.createVertex = function(a, b, c, d, e, f, g, h, k) {
-  a = new mxGeometry(d, e, f, g);
-  a.relative = null != k ? k : !1;
-  c = new mxCell(c, a, h);
-  c.setId(b);
-  c.setVertex(!0);
-  c.setConnectable(!0);
-  return c
-};
-mxGraph.prototype.insertEdge = function(a, b, c, d, e, f) {
-  b = this.createEdge(a, b, c, d, e, f);
-  return this.addEdge(b, a, d, e)
-};
-mxGraph.prototype.createEdge = function(a, b, c, d, e, f) {
-  a = new mxCell(c, new mxGeometry, f);
-  a.setId(b);
-  a.setEdge(!0);
-  a.geometry.relative = !0;
-  return a
-};
-mxGraph.prototype.addEdge = function(a, b, c, d, e) {
-  return this.addCell(a, b, e, c, d)
-};
-mxGraph.prototype.addCell = function(a, b, c, d, e) {
-  return this.addCells([a], b, c, d, e)[0]
-};
-mxGraph.prototype.addCells = function(a, b, c, d, e) {
-  null == b && (b = this.getDefaultParent());
-  null == c && (c = this.model.getChildCount(b));
-  this.model.beginUpdate();
-  try {
-    this.cellsAdded(a, b, c, d, e, !1, !0), this.fireEvent(new mxEventObject(mxEvent.ADD_CELLS, "cells", a, "parent", b, "index", c, "source", d, "target", e))
-  } finally {
-    this.model.endUpdate()
-  }
-  return a
-};
-mxGraph.prototype.cellsAdded = function(a, b, c, d, e, f, g) {
-  if (null != a && null != b && null != c) {
-    this.model.beginUpdate();
-    try {
-      for (var h = f ? this.view.getState(b) : null, k = null != h ? h.origin : null, l = new mxPoint(0, 0), h = 0; h < a.length; h++)
-        if (null == a[h]) c--;
-        else {
-          var m = this.model.getParent(a[h]);
-          if (null != k && a[h] != b && b != m) {
-            var n = this.view.getState(m),
-              p = null != n ? n.origin : l,
-              q = this.model.getGeometry(a[h]);
-            if (null != q) {
-              var s = p.x - k.x,
-                r = p.y - k.y,
-                q = q.clone();
-              q.translate(s, r);
-              !q.relative && (this.model.isVertex(a[h]) && !this.isAllowNegativeCoordinates()) &&
-                (q.x = Math.max(0, q.x), q.y = Math.max(0, q.y));
-              this.model.setGeometry(a[h], q)
-            }
-          }
-          b == m && c + h > this.model.getChildCount(b) && c--;
-          this.model.add(b, a[h], c + h);
-          this.isExtendParentsOnAdd() && this.isExtendParent(a[h]) && this.extendParent(a[h]);
-          (null == g || g) && this.constrainChild(a[h]);
-          null != d && this.cellConnected(a[h], d, !0);
-          null != e && this.cellConnected(a[h], e, !1)
-        }
-      this.fireEvent(new mxEventObject(mxEvent.CELLS_ADDED, "cells", a, "parent", b, "index", c, "source", d, "target", e, "absolute", f))
-    } finally {
-      this.model.endUpdate()
-    }
-  }
-};
-mxGraph.prototype.removeCells = function(a, b) {
-  b = null != b ? b : !0;
-  null == a && (a = this.getDeletableCells(this.getSelectionCells()));
-  b && (a = this.getDeletableCells(this.addAllEdges(a)));
-  this.model.beginUpdate();
-  try {
-    this.cellsRemoved(a), this.fireEvent(new mxEventObject(mxEvent.REMOVE_CELLS, "cells", a, "includeEdges", b))
-  } finally {
-    this.model.endUpdate()
-  }
-  return a
-};
-mxGraph.prototype.cellsRemoved = function(a) {
-  if (null != a && 0 < a.length) {
-    var b = this.view.scale,
-      c = this.view.translate;
-    this.model.beginUpdate();
-    try {
-      for (var d = {}, e = 0; e < a.length; e++) {
-        var f = mxCellPath.create(a[e]);
-        d[f] = a[e]
-      }
-      for (e = 0; e < a.length; e++) {
-        for (var g = this.getConnections(a[e]), h = 0; h < g.length; h++)
-          if (f = mxCellPath.create(g[h]), null == d[f]) {
-            var k = this.model.getGeometry(g[h]);
-            if (null != k) {
-              var l = this.view.getState(g[h]);
-              if (null != l) {
-                var k = k.clone(),
-                  m = l.getVisibleTerminal(!0) == a[e],
-                  n = l.absolutePoints,
-                  p = m ? 0 : n.length -
-                  1;
-                k.setTerminalPoint(new mxPoint(n[p].x / b - c.x, n[p].y / b - c.y), m);
-                this.model.setTerminal(g[h], null, m);
-                this.model.setGeometry(g[h], k)
-              }
-            }
-          }
-        this.model.remove(a[e])
-      }
-      this.fireEvent(new mxEventObject(mxEvent.CELLS_REMOVED, "cells", a))
-    } finally {
-      this.model.endUpdate()
-    }
-  }
-};
-mxGraph.prototype.splitEdge = function(a, b, c, d, e) {
-  d = d || 0;
-  e = e || 0;
-  null == c && (c = this.cloneCells([a])[0]);
-  var f = this.model.getParent(a),
-    g = this.model.getTerminal(a, !0);
-  this.model.beginUpdate();
-  try {
-    this.cellsMoved(b, d, e, !1, !1), this.cellsAdded(b, f, this.model.getChildCount(f), null, null, !0), this.cellsAdded([c], f, this.model.getChildCount(f), g, b[0], !1), this.cellConnected(a, b[
-      0], !0), this.fireEvent(new mxEventObject(mxEvent.SPLIT_EDGE, "edge", a, "cells", b, "newEdge", c, "dx", d, "dy", e))
-  } finally {
-    this.model.endUpdate()
-  }
-  return c
-};
-mxGraph.prototype.toggleCells = function(a, b, c) {
-  null == b && (b = this.getSelectionCells());
-  c && (b = this.addAllEdges(b));
-  this.model.beginUpdate();
-  try {
-    this.cellsToggled(b, a), this.fireEvent(new mxEventObject(mxEvent.TOGGLE_CELLS, "show", a, "cells", b, "includeEdges", c))
-  } finally {
-    this.model.endUpdate()
-  }
-  return b
-};
-mxGraph.prototype.cellsToggled = function(a, b) {
-  if (null != a && 0 < a.length) {
-    this.model.beginUpdate();
-    try {
-      for (var c = 0; c < a.length; c++) this.model.setVisible(a[c], b)
-    } finally {
-      this.model.endUpdate()
-    }
-  }
-};
-mxGraph.prototype.foldCells = function(a, b, c, d) {
-  b = null != b ? b : !1;
-  null == c && (c = this.getFoldableCells(this.getSelectionCells(), a));
-  this.stopEditing(!1);
-  this.model.beginUpdate();
-  try {
-    this.cellsFolded(c, a, b, d), this.fireEvent(new mxEventObject(mxEvent.FOLD_CELLS, "collapse", a, "recurse", b, "cells", c))
-  } finally {
-    this.model.endUpdate()
-  }
-  return c
-};
-mxGraph.prototype.cellsFolded = function(a, b, c, d) {
-  if (null != a && 0 < a.length) {
-    this.model.beginUpdate();
-    try {
-      for (var e = 0; e < a.length; e++)
-        if ((!d || this.isCellFoldable(a[e], b)) && b != this.isCellCollapsed(a[e]))
-          if (this.model.setCollapsed(a[e], b), this.swapBounds(a[e], b), this.isExtendParent(a[e]) && this.extendParent(a[e]), c) {
-            var f = this.model.getChildren(a[e]);
-            this.foldCells(f, b, c)
-          }
-      this.fireEvent(new mxEventObject(mxEvent.CELLS_FOLDED, "cells", a, "collapse", b, "recurse", c))
-    } finally {
-      this.model.endUpdate()
-    }
-  }
-};
-mxGraph.prototype.swapBounds = function(a, b) {
-  if (null != a) {
-    var c = this.model.getGeometry(a);
-    null != c && (c = c.clone(), this.updateAlternateBounds(a, c, b), c.swap(), this.model.setGeometry(a, c))
-  }
-};
-mxGraph.prototype.updateAlternateBounds = function(a, b, c) {
-  if (null != a && null != b) {
-    c = this.view.getState(a);
-    c = null != c ? c.style : this.getCellStyle(a);
-    if (null == b.alternateBounds) {
-      var d = b;
-      this.collapseToPreferredSize && (a = this.getPreferredSizeForCell(a), null != a && (d = a, a = mxUtils.getValue(c, mxConstants.STYLE_STARTSIZE), 0 < a && (d.height = Math.max(d.height, a))));
-      b.alternateBounds = new mxRectangle(0, 0, d.width, d.height)
-    }
-    if (null != b.alternateBounds) {
-      b.alternateBounds.x = b.x;
-      b.alternateBounds.y = b.y;
-      var e = mxUtils.toRadians(c[mxConstants.STYLE_ROTATION] ||
-        "0");
-      0 != e && (a = b.alternateBounds.getCenterX() - b.getCenterX(), c = b.alternateBounds.getCenterY() - b.getCenterY(), d = Math.cos(e), e = Math.sin(e), b.alternateBounds.x += d * a - e * c - a,
-        b.alternateBounds.y += e * a + d * c - c)
-    }
-  }
-};
-mxGraph.prototype.addAllEdges = function(a) {
-  var b = a.slice();
-  return b = b.concat(this.getAllEdges(a))
-};
-mxGraph.prototype.getAllEdges = function(a) {
-  var b = [];
-  if (null != a)
-    for (var c = 0; c < a.length; c++) {
-      for (var d = this.model.getEdgeCount(a[c]), e = 0; e < d; e++) b.push(this.model.getEdgeAt(a[c], e));
-      d = this.model.getChildren(a[c]);
-      b = b.concat(this.getAllEdges(d))
-    }
-  return b
-};
-mxGraph.prototype.updateCellSize = function(a, b) {
-  b = null != b ? b : !1;
-  this.model.beginUpdate();
-  try {
-    this.cellSizeUpdated(a, b), this.fireEvent(new mxEventObject(mxEvent.UPDATE_CELL_SIZE, "cell", a, "ignoreChildren", b))
-  } finally {
-    this.model.endUpdate()
-  }
-  return a
-};
-mxGraph.prototype.cellSizeUpdated = function(a, b) {
-  if (null != a) {
-    this.model.beginUpdate();
-    try {
-      var c = this.getPreferredSizeForCell(a),
-        d = this.model.getGeometry(a);
-      if (null != c && null != d) {
-        var e = this.isCellCollapsed(a),
-          d = d.clone();
-        if (this.isSwimlane(a)) {
-          var f = this.view.getState(a),
-            g = null != f ? f.style : this.getCellStyle(a),
-            h = this.model.getStyle(a);
-          null == h && (h = "");
-          mxUtils.getValue(g, mxConstants.STYLE_HORIZONTAL, !0) ? (h = mxUtils.setStyle(h, mxConstants.STYLE_STARTSIZE, c.height + 8), e && (d.height = c.height + 8), d.width = c.width) :
-            (h = mxUtils.setStyle(h, mxConstants.STYLE_STARTSIZE, c.width + 8), e && (d.width = c.width + 8), d.height = c.height);
-          this.model.setStyle(a, h)
-        } else d.width = c.width, d.height = c.height;
-        if (!b && !e) {
-          var k = this.view.getBounds(this.model.getChildren(a));
-          if (null != k) {
-            var l = this.view.translate,
-              m = this.view.scale,
-              n = (k.y + k.height) / m - d.y - l.y;
-            d.width = Math.max(d.width, (k.x + k.width) / m - d.x - l.x);
-            d.height = Math.max(d.height, n)
-          }
-        }
-        this.cellsResized([a], [d])
-      }
-    } finally {
-      this.model.endUpdate()
-    }
-  }
-};
-mxGraph.prototype.getPreferredSizeForCell = function(a) {
-  var b = null;
-  if (null != a) {
-    var c = this.view.getState(a),
-      d = null != c ? c.style : this.getCellStyle(a);
-    if (null != d && !this.model.isEdge(a)) {
-      var e = d[mxConstants.STYLE_FONTSIZE] || mxConstants.DEFAULT_FONTSIZE,
-        f = 0,
-        b = 0;
-      if ((null != this.getImage(c) || null != d[mxConstants.STYLE_IMAGE]) && d[mxConstants.STYLE_SHAPE] == mxConstants.SHAPE_LABEL) d[mxConstants.STYLE_VERTICAL_ALIGN] == mxConstants.ALIGN_MIDDLE &&
-        (f += parseFloat(d[mxConstants.STYLE_IMAGE_WIDTH]) || mxLabel.prototype.imageSize),
-        d[mxConstants.STYLE_ALIGN] != mxConstants.ALIGN_CENTER && (b += parseFloat(d[mxConstants.STYLE_IMAGE_HEIGHT]) || mxLabel.prototype.imageSize);
-      f += 2 * (d[mxConstants.STYLE_SPACING] || 0);
-      f += d[mxConstants.STYLE_SPACING_LEFT] || 0;
-      f += d[mxConstants.STYLE_SPACING_RIGHT] || 0;
-      b += 2 * (d[mxConstants.STYLE_SPACING] || 0);
-      b += d[mxConstants.STYLE_SPACING_TOP] || 0;
-      b += d[mxConstants.STYLE_SPACING_BOTTOM] || 0;
-      c = this.getFoldingImage(c);
-      null != c && (f += c.width + 8);
-      c = this.getLabel(a);
-      null != c && 0 < c.length ? (this.isHtmlLabel(a) || (c = c.replace(/\n/g,
-        "\x3cbr\x3e")), e = mxUtils.getSizeForString(c, e, d[mxConstants.STYLE_FONTFAMILY]), a = e.width + f, b = e.height + b, mxUtils.getValue(d, mxConstants.STYLE_HORIZONTAL, !0) || (d = b,
-        b = a, a = d), this.gridEnabled && (a = this.snap(a + this.gridSize / 2), b = this.snap(b + this.gridSize / 2)), b = new mxRectangle(0, 0, a, b)) : (d = 4 * this.gridSize, b = new mxRectangle(
-        0, 0, d, d))
-    }
-  }
-  return b
-};
-mxGraph.prototype.handleGesture = function(a, b) {
-  if (0.2 < Math.abs(1 - b.scale)) {
-    var c = this.view.scale,
-      d = this.view.translate,
-      e = a.width * b.scale,
-      f = a.height * b.scale,
-      g = a.y - (f - a.height) / 2,
-      c = new mxRectangle(this.snap((a.x - (e - a.width) / 2) / c) - d.x, this.snap(g / c) - d.y, this.snap(e / c), this.snap(f / c));
-    this.resizeCell(a.cell, c)
-  }
-};
-mxGraph.prototype.resizeCell = function(a, b) {
-  return this.resizeCells([a], [b])[0]
-};
-mxGraph.prototype.resizeCells = function(a, b) {
-  this.model.beginUpdate();
-  try {
-    this.cellsResized(a, b), this.fireEvent(new mxEventObject(mxEvent.RESIZE_CELLS, "cells", a, "bounds", b))
-  } finally {
-    this.model.endUpdate()
-  }
-  return a
-};
-mxGraph.prototype.cellsResized = function(a, b) {
-  if (null != a && null != b && a.length == b.length) {
-    this.model.beginUpdate();
-    try {
-      for (var c = 0; c < a.length; c++) {
-        var d = b[c],
-          e = this.model.getGeometry(a[c]);
-        if (null != e && (e.x != d.x || e.y != d.y || e.width != d.width || e.height != d.height)) {
-          e = e.clone();
-          if (e.relative) {
-            var f = e.offset;
-            null != f && (f.x += d.x - e.x, f.y += d.y - e.y)
-          } else e.x = d.x, e.y = d.y;
-          e.width = d.width;
-          e.height = d.height;
-          !e.relative && (this.model.isVertex(a[c]) && !this.isAllowNegativeCoordinates()) && (e.x = Math.max(0, e.x), e.y = Math.max(0,
-            e.y));
-          this.model.setGeometry(a[c], e);
-          this.isExtendParent(a[c]) && this.extendParent(a[c])
-        }
-      }
-      this.resetEdgesOnResize && this.resetEdges(a);
-      this.fireEvent(new mxEventObject(mxEvent.CELLS_RESIZED, "cells", a, "bounds", b))
-    } finally {
-      this.model.endUpdate()
-    }
-  }
-};
-mxGraph.prototype.extendParent = function(a) {
-  if (null != a) {
-    var b = this.model.getParent(a),
-      c = this.model.getGeometry(b);
-    if (null != b && (null != c && !this.isCellCollapsed(b)) && (a = this.model.getGeometry(a), null != a && (c.width < a.x + a.width || c.height < a.y + a.height))) c = c.clone(), c.width = Math.max(
-      c.width, a.x + a.width), c.height = Math.max(c.height, a.y + a.height), this.cellsResized([b], [c])
-  }
-};
-mxGraph.prototype.importCells = function(a, b, c, d, e) {
-  return this.moveCells(a, b, c, !0, d, e)
-};
-mxGraph.prototype.moveCells = function(a, b, c, d, e, f) {
-  b = null != b ? b : 0;
-  c = null != c ? c : 0;
-  d = null != d ? d : !1;
-  if (null != a && (0 != b || 0 != c || d || null != e)) {
-    this.model.beginUpdate();
-    try {
-      d && (a = this.cloneCells(a, this.isCloneInvalidEdges()), null == e && (e = this.getDefaultParent()));
-      var g = this.isAllowNegativeCoordinates();
-      null != e && this.setAllowNegativeCoordinates(!0);
-      this.cellsMoved(a, b, c, !d && this.isDisconnectOnMove() && this.isAllowDanglingEdges(), null == e);
-      this.setAllowNegativeCoordinates(g);
-      if (null != e) {
-        var h = this.model.getChildCount(e);
-        this.cellsAdded(a, e, h, null, null, !0)
-      }
-      this.fireEvent(new mxEventObject(mxEvent.MOVE_CELLS, "cells", a, "dx", b, "dy", c, "clone", d, "target", e, "event", f))
-    } finally {
-      this.model.endUpdate()
-    }
-  }
-  return a
-};
-mxGraph.prototype.cellsMoved = function(a, b, c, d, e) {
-  if (null != a && (0 != b || 0 != c)) {
-    this.model.beginUpdate();
-    try {
-      d && this.disconnectGraph(a);
-      for (var f = 0; f < a.length; f++) this.translateCell(a[f], b, c), e && this.constrainChild(a[f]);
-      this.resetEdgesOnMove && this.resetEdges(a);
-      this.fireEvent(new mxEventObject(mxEvent.CELLS_MOVED, "cells", a, "dx", c, "dy", c, "disconnect", d))
-    } finally {
-      this.model.endUpdate()
-    }
-  }
-};
-mxGraph.prototype.translateCell = function(a, b, c) {
-  var d = this.model.getGeometry(a);
-  null != d && (d = d.clone(), d.translate(b, c), !d.relative && (this.model.isVertex(a) && !this.isAllowNegativeCoordinates()) && (d.x = Math.max(0, d.x), d.y = Math.max(0, d.y)), d.relative && !
-    this.model.isEdge(a) && (null == d.offset ? d.offset = new mxPoint(b, c) : (d.offset.x += b, d.offset.y += c)), this.model.setGeometry(a, d))
-};
-mxGraph.prototype.getCellContainmentArea = function(a) {
-  if (null != a && !this.model.isEdge(a)) {
-    var b = this.model.getParent(a);
-    if (b == this.getDefaultParent() || b == this.getCurrentRoot()) return this.getMaximumGraphBounds();
-    if (null != b && b != this.getDefaultParent()) {
-      var c = this.model.getGeometry(b);
-      if (null != c) {
-        var d = a = 0,
-          e = c.width,
-          c = c.height;
-        this.isSwimlane(b) && (b = this.getStartSize(b), a = b.width, e -= b.width, d = b.height, c -= b.height);
-        return new mxRectangle(a, d, e, c)
-      }
-    }
-  }
-  return null
-};
-mxGraph.prototype.getMaximumGraphBounds = function() {
-  return this.maximumGraphBounds
-};
-mxGraph.prototype.constrainChild = function(a) {
-  if (null != a) {
-    var b = this.model.getGeometry(a),
-      c = this.isConstrainChild(a) ? this.getCellContainmentArea(a) : this.getMaximumGraphBounds();
-    if (null != b && null != c && !b.relative && (b.x < c.x || b.y < c.y || c.width < b.x + b.width || c.height < b.y + b.height)) a = this.getOverlap(a), 0 < c.width && (b.x = Math.min(b.x, c.x +
-      c.width - (1 - a) * b.width)), 0 < c.height && (b.y = Math.min(b.y, c.y + c.height - (1 - a) * b.height)), b.x = Math.max(b.x, c.x - b.width * a), b.y = Math.max(b.y, c.y - b.height * a)
-  }
-};
-mxGraph.prototype.resetEdges = function(a) {
-  if (null != a) {
-    for (var b = {}, c = 0; c < a.length; c++) {
-      var d = mxCellPath.create(a[c]);
-      b[d] = a[c]
-    }
-    this.model.beginUpdate();
-    try {
-      for (c = 0; c < a.length; c++) {
-        var e = this.model.getEdges(a[c]);
-        if (null != e)
-          for (d = 0; d < e.length; d++) {
-            var f = this.view.getState(e[d]),
-              g = null != f ? f.getVisibleTerminal(!0) : this.view.getVisibleTerminal(e[d], !0),
-              h = null != f ? f.getVisibleTerminal(!1) : this.view.getVisibleTerminal(e[d], !1),
-              k = mxCellPath.create(g),
-              l = mxCellPath.create(h);
-            (null == b[k] || null == b[l]) && this.resetEdge(e[d])
-          }
-        this.resetEdges(this.model.getChildren(a[c]))
-      }
-    } finally {
-      this.model.endUpdate()
-    }
-  }
-};
-mxGraph.prototype.resetEdge = function(a) {
-  var b = this.model.getGeometry(a);
-  null != b && (null != b.points && 0 < b.points.length) && (b = b.clone(), b.points = [], this.model.setGeometry(a, b));
-  return a
-};
-mxGraph.prototype.getAllConnectionConstraints = function(a, b) {
-  return null != a && null != a.shape && null != a.shape.stencil ? a.shape.stencil.constraints : null
-};
-mxGraph.prototype.getConnectionConstraint = function(a, b, c) {
-  b = null;
-  var d = a.style[c ? mxConstants.STYLE_EXIT_X : mxConstants.STYLE_ENTRY_X];
-  if (null != d) {
-    var e = a.style[c ? mxConstants.STYLE_EXIT_Y : mxConstants.STYLE_ENTRY_Y];
-    null != e && (b = new mxPoint(parseFloat(d), parseFloat(e)))
-  }
-  d = !1;
-  null != b && (d = mxUtils.getValue(a.style, c ? mxConstants.STYLE_EXIT_PERIMETER : mxConstants.STYLE_ENTRY_PERIMETER, !0));
-  return new mxConnectionConstraint(b, d)
-};
-mxGraph.prototype.setConnectionConstraint = function(a, b, c, d) {
-  if (null != d) {
-    this.model.beginUpdate();
-    try {
-      null == d || null == d.point ? (this.setCellStyles(c ? mxConstants.STYLE_EXIT_X : mxConstants.STYLE_ENTRY_X, null, [a]), this.setCellStyles(c ? mxConstants.STYLE_EXIT_Y : mxConstants.STYLE_ENTRY_Y,
-        null, [a]), this.setCellStyles(c ? mxConstants.STYLE_EXIT_PERIMETER : mxConstants.STYLE_ENTRY_PERIMETER, null, [a])) : null != d.point && (this.setCellStyles(c ? mxConstants.STYLE_EXIT_X :
-        mxConstants.STYLE_ENTRY_X, d.point.x, [a]), this.setCellStyles(c ?
-        mxConstants.STYLE_EXIT_Y : mxConstants.STYLE_ENTRY_Y, d.point.y, [a]), d.perimeter ? this.setCellStyles(c ? mxConstants.STYLE_EXIT_PERIMETER : mxConstants.STYLE_ENTRY_PERIMETER, null, [
-        a
-      ]) : this.setCellStyles(c ? mxConstants.STYLE_EXIT_PERIMETER : mxConstants.STYLE_ENTRY_PERIMETER, "0", [a]))
-    } finally {
-      this.model.endUpdate()
-    }
-  }
-};
-mxGraph.prototype.getConnectionPoint = function(a, b) {
-  var c = null;
-  if (null != a) {
-    var d = this.view.getPerimeterBounds(a),
-      e = new mxPoint(d.getCenterX(), d.getCenterY()),
-      f = a.style[mxConstants.STYLE_DIRECTION],
-      g = 0;
-    if (null != f && ("north" == f ? g += 270 : "west" == f ? g += 180 : "south" == f && (g += 90), "north" == f || "south" == f)) {
-      d.x += d.width / 2 - d.height / 2;
-      d.y += d.height / 2 - d.width / 2;
-      var h = d.width;
-      d.width = d.height;
-      d.height = h
-    }
-    if (null != b.point) {
-      var k = c = 1,
-        l = 0,
-        m = 0;
-      if (this.getModel().isVertex(a.cell)) {
-        var n = a.style[mxConstants.STYLE_FLIPH],
-          p =
-          a.style[mxConstants.STYLE_FLIPV];
-        null != a.shape.stencil && (n = 1 == mxUtils.getValue(a.style, "stencilFlipH", 0) || n, p = 1 == mxUtils.getValue(a.style, "stencilFlipV", 0) || p);
-        if ("north" == f || "south" == f) h = n, n = p, p = h;
-        n && (c = -1, l = -d.width);
-        p && (k = -1, m = -d.height)
-      }
-      c = new mxPoint(d.x + b.point.x * d.width * c - l, d.y + b.point.y * d.height * k - m)
-    }
-    f = a.style[mxConstants.STYLE_ROTATION] || 0;
-    b.perimeter ? (0 != g && null != c && (h = d = 0, 90 == g ? h = 1 : 180 == g ? d = -1 : 270 == f && (h = -1), c = mxUtils.getRotatedPoint(c, d, h, e)), null != c && b.perimeter && (c = this.view
-      .getPerimeterPoint(a,
-        c, !1))) : f += g;
-    0 != f && null != c && (g = mxUtils.toRadians(f), d = Math.cos(g), h = Math.sin(g), c = mxUtils.getRotatedPoint(c, d, h, e))
-  }
-  return c
-};
-mxGraph.prototype.connectCell = function(a, b, c, d) {
-  this.model.beginUpdate();
-  try {
-    var e = this.model.getTerminal(a, c);
-    this.cellConnected(a, b, c, d);
-    this.fireEvent(new mxEventObject(mxEvent.CONNECT_CELL, "edge", a, "terminal", b, "source", c, "previous", e))
-  } finally {
-    this.model.endUpdate()
-  }
-  return a
-};
-mxGraph.prototype.cellConnected = function(a, b, c, d) {
-  if (null != a) {
-    this.model.beginUpdate();
-    try {
-      var e = this.model.getTerminal(a, c);
-      this.setConnectionConstraint(a, b, c, d);
-      this.isPortsEnabled() && (d = null, this.isPort(b) && (d = b.getId(), b = this.getTerminalForPort(b, c)), this.setCellStyles(c ? mxConstants.STYLE_SOURCE_PORT : mxConstants.STYLE_TARGET_PORT,
-        d, [a]));
-      this.model.setTerminal(a, b, c);
-      this.resetEdgesOnConnect && this.resetEdge(a);
-      this.fireEvent(new mxEventObject(mxEvent.CELL_CONNECTED, "edge", a, "terminal", b, "source",
-        c, "previous", e))
-    } finally {
-      this.model.endUpdate()
-    }
-  }
-};
-mxGraph.prototype.disconnectGraph = function(a) {
-  if (null != a) {
-    this.model.beginUpdate();
-    try {
-      for (var b = this.view.scale, c = this.view.translate, d = {}, e = 0; e < a.length; e++) {
-        var f = mxCellPath.create(a[e]);
-        d[f] = a[e]
-      }
-      for (e = 0; e < a.length; e++)
-        if (this.model.isEdge(a[e])) {
-          var g = this.model.getGeometry(a[e]);
-          if (null != g) {
-            var h = this.view.getState(a[e]),
-              k = this.view.getState(this.model.getParent(a[e]));
-            if (null != h && null != k) {
-              var g = g.clone(),
-                l = -k.origin.x,
-                m = -k.origin.y,
-                n = h.absolutePoints,
-                p = this.model.getTerminal(a[e], !0);
-              if (null !=
-                p && this.isCellDisconnectable(a[e], p, !0)) {
-                for (var q = mxCellPath.create(p); null != p && null == d[q];) p = this.model.getParent(p), q = mxCellPath.create(p);
-                null == p && (g.setTerminalPoint(new mxPoint(n[0].x / b - c.x + l, n[0].y / b - c.y + m), !0), this.model.setTerminal(a[e], null, !0))
-              }
-              var s = this.model.getTerminal(a[e], !1);
-              if (null != s && this.isCellDisconnectable(a[e], s, !1)) {
-                for (var r = mxCellPath.create(s); null != s && null == d[r];) s = this.model.getParent(s), r = mxCellPath.create(s);
-                if (null == s) {
-                  var t = n.length - 1;
-                  g.setTerminalPoint(new mxPoint(n[t].x /
-                    b - c.x + l, n[t].y / b - c.y + m), !1);
-                  this.model.setTerminal(a[e], null, !1)
-                }
-              }
-              this.model.setGeometry(a[e], g)
-            }
-          }
-        }
-    } finally {
-      this.model.endUpdate()
-    }
-  }
-};
-mxGraph.prototype.getCurrentRoot = function() {
-  return this.view.currentRoot
-};
-mxGraph.prototype.getTranslateForRoot = function(a) {
-  return null
-};
-mxGraph.prototype.isPort = function(a) {
-  return !1
-};
-mxGraph.prototype.getTerminalForPort = function(a, b) {
-  return this.model.getParent(a)
-};
-mxGraph.prototype.getChildOffsetForCell = function(a) {
-  return null
-};
-mxGraph.prototype.enterGroup = function(a) {
-  a = a || this.getSelectionCell();
-  null != a && this.isValidRoot(a) && (this.view.setCurrentRoot(a), this.clearSelection())
-};
-mxGraph.prototype.exitGroup = function() {
-  var a = this.model.getRoot(),
-    b = this.getCurrentRoot();
-  if (null != b) {
-    for (var c = this.model.getParent(b); c != a && !this.isValidRoot(c) && this.model.getParent(c) != a;) c = this.model.getParent(c);
-    c == a || this.model.getParent(c) == a ? this.view.setCurrentRoot(null) : this.view.setCurrentRoot(c);
-    null != this.view.getState(b) && this.setSelectionCell(b)
-  }
-};
-mxGraph.prototype.home = function() {
-  var a = this.getCurrentRoot();
-  null != a && (this.view.setCurrentRoot(null), null != this.view.getState(a) && this.setSelectionCell(a))
-};
-mxGraph.prototype.isValidRoot = function(a) {
-  return null != a
-};
-mxGraph.prototype.getGraphBounds = function() {
-  return this.view.getGraphBounds()
-};
-mxGraph.prototype.getCellBounds = function(a, b, c) {
-  var d = [a];
-  b && (d = d.concat(this.model.getEdges(a)));
-  d = this.view.getBounds(d);
-  if (c) {
-    c = this.model.getChildCount(a);
-    for (var e = 0; e < c; e++) {
-      var f = this.getCellBounds(this.model.getChildAt(a, e), b, !0);
-      null != d ? d.add(f) : d = f
-    }
-  }
-  return d
-};
-mxGraph.prototype.getBoundingBoxFromGeometry = function(a, b) {
-  b = null != b ? b : !1;
-  var c = null;
-  if (null != a)
-    for (var d = 0; d < a.length; d++)
-      if (b || this.model.isVertex(a[d])) {
-        var e = this.getCellGeometry(a[d]);
-        if (null != e) {
-          var f = e.points;
-          if (null != f && 0 < f.length) {
-            for (var g = new mxRectangle(f[0].x, f[0].y, 0, 0), h = function(a) {
-                null != a && g.add(new mxRectangle(a.x, a.y, 0, 0))
-              }, k = 1; k < f.length; k++) h(f[k]);
-            h(e.getTerminalPoint(!0));
-            h(e.getTerminalPoint(!1))
-          }
-          null == c ? c = new mxRectangle(e.x, e.y, e.width, e.height) : c.add(e)
-        }
-      }
-  return c
-};
-mxGraph.prototype.refresh = function(a) {
-  this.view.clear(a, null == a);
-  this.view.validate();
-  this.sizeDidChange();
-  this.fireEvent(new mxEventObject(mxEvent.REFRESH))
-};
-mxGraph.prototype.snap = function(a) {
-  this.gridEnabled && (a = Math.round(a / this.gridSize) * this.gridSize);
-  return a
-};
-mxGraph.prototype.panGraph = function(a, b) {
-  if (this.useScrollbarsForPanning && mxUtils.hasScrollbars(this.container)) this.container.scrollLeft = -a, this.container.scrollTop = -b;
-  else {
-    var c = this.view.getCanvas();
-    if (this.dialect == mxConstants.DIALECT_SVG)
-      if (0 == a && 0 == b) {
-        if (mxClient.IS_IE ? c.setAttribute("transform", "translate(" + a + "," + b + ")") : c.removeAttribute("transform"), null != this.shiftPreview1) {
-          for (var d = this.shiftPreview1.firstChild; null != d;) {
-            var e = d.nextSibling;
-            this.container.appendChild(d);
-            d = e
-          }
-          this.shiftPreview1.parentNode.removeChild(this.shiftPreview1);
-          this.shiftPreview1 = null;
-          this.container.appendChild(c.parentNode);
-          for (d = this.shiftPreview2.firstChild; null != d;) e = d.nextSibling, this.container.appendChild(d), d = e;
-          this.shiftPreview2.parentNode.removeChild(this.shiftPreview2);
-          this.shiftPreview2 = null
-        }
-      } else {
-        c.setAttribute("transform", "translate(" + a + "," + b + ")");
-        if (null == this.shiftPreview1) {
-          this.shiftPreview1 = document.createElement("div");
-          this.shiftPreview1.style.position = "absolute";
-          this.shiftPreview1.style.overflow = "visible";
-          this.shiftPreview2 = document.createElement("div");
-          this.shiftPreview2.style.position = "absolute";
-          this.shiftPreview2.style.overflow = "visible";
-          for (var f = this.shiftPreview1, d = this.container.firstChild; null != d;) e = d.nextSibling, d != c.parentNode ? f.appendChild(d) : f = this.shiftPreview2, d = e;
-          this.container.insertBefore(this.shiftPreview1, c.parentNode);
-          this.container.appendChild(this.shiftPreview2)
-        }
-        this.shiftPreview1.style.left = a + "px";
-        this.shiftPreview1.style.top = b + "px";
-        this.shiftPreview2.style.left = a + "px";
-        this.shiftPreview2.style.top = b + "px"
-      } else c.style.left =
-      a + "px", c.style.top = b + "px";
-    this.panDx = a;
-    this.panDy = b;
-    this.fireEvent(new mxEventObject(mxEvent.PAN))
-  }
-};
-mxGraph.prototype.zoomIn = function() {
-  this.zoom(this.zoomFactor)
-};
-mxGraph.prototype.zoomOut = function() {
-  this.zoom(1 / this.zoomFactor)
-};
-mxGraph.prototype.zoomActual = function() {
-  1 == this.view.scale ? this.view.setTranslate(0, 0) : (this.view.translate.x = 0, this.view.translate.y = 0, this.view.setScale(1))
-};
-mxGraph.prototype.zoomTo = function(a, b) {
-  this.zoom(a / this.view.scale, b)
-};
-mxGraph.prototype.zoom = function(a, b) {
-  b = null != b ? b : this.centerZoom;
-  var c = this.view.scale * a,
-    d = this.view.getState(this.getSelectionCell());
-  if (this.keepSelectionVisibleOnZoom && null != d) d = new mxRectangle(d.x * a, d.y * a, d.width * a, d.height * a), this.view.scale = c, this.scrollRectToVisible(d) || (this.view.revalidate(),
-    this.view.setScale(c));
-  else if (b && !mxUtils.hasScrollbars(this.container)) {
-    var d = this.container.offsetWidth,
-      e = this.container.offsetHeight;
-    if (1 < a) var f = (a - 1) / (2 * c),
-      d = d * -f,
-      e = e * -f;
-    else f = (1 / a - 1) / (2 * this.view.scale),
-      d *= f, e *= f;
-    this.view.scaleAndTranslate(c, this.view.translate.x + d, this.view.translate.y + e)
-  } else this.view.setScale(c), mxUtils.hasScrollbars(this.container) && (e = d = 0, b && (d = this.container.offsetWidth * (a - 1) / 2, e = this.container.offsetHeight * (a - 1) / 2), this.container
-    .scrollLeft = Math.round(this.container.scrollLeft * a + d), this.container.scrollTop = Math.round(this.container.scrollTop * a + e))
-};
-mxGraph.prototype.zoomToRect = function(a) {
-  var b = this.container.clientWidth / a.width / (this.container.clientHeight / a.height);
-  a.x = Math.max(0, a.x);
-  a.y = Math.max(0, a.y);
-  var c = Math.min(this.container.scrollWidth, a.x + a.width),
-    d = Math.min(this.container.scrollHeight, a.y + a.height);
-  a.width = c - a.x;
-  a.height = d - a.y;
-  1 > b ? (b = a.height / b, c = (b - a.height) / 2, a.height = b, b = Math.min(a.y, c), a.y -= b, d = Math.min(this.container.scrollHeight, a.y + a.height), a.height = d - a.y) : (b *= a.width, c =
-    (b - a.width) / 2, a.width = b, b = Math.min(a.x, c), a.x -= b,
-    c = Math.min(this.container.scrollWidth, a.x + a.width), a.width = c - a.x);
-  b = this.container.clientWidth / a.width;
-  c = this.view.scale * b;
-  mxUtils.hasScrollbars(this.container) ? (this.view.setScale(c), this.container.scrollLeft = Math.round(a.x * b), this.container.scrollTop = Math.round(a.y * b)) : this.view.scaleAndTranslate(c,
-    this.view.translate.x - a.x / this.view.scale, this.view.translate.y - a.y / this.view.scale)
-};
-mxGraph.prototype.fit = function(a, b) {
-  if (null != this.container) {
-    a = null != a ? a : 0;
-    b = null != b ? b : !1;
-    var c = this.container.clientWidth,
-      d = this.container.clientHeight,
-      e = this.view.getGraphBounds();
-    b && (null != e.x && null != e.y) && (e.width += e.x, e.height += e.y, e.x = 0, e.y = 0);
-    var f = this.view.scale,
-      g = e.width / f,
-      h = e.height / f;
-    null != this.backgroundImage && (g = Math.max(g, this.backgroundImage.width - e.x / f), h = Math.max(h, this.backgroundImage.height - e.y / f));
-    var k = b ? a : 2 * a,
-      c = Math.floor(100 * Math.min(c / (g + k), d / (h + k))) / 100;
-    null != this.minFitScale &&
-      (c = Math.max(c, this.minFitScale));
-    null != this.maxFitScale && (c = Math.min(c, this.maxFitScale));
-    b ? this.view.scale != c && this.view.setScale(c) : mxUtils.hasScrollbars(this.container) ? (this.view.setScale(c), null != e.x && (this.container.scrollLeft = Math.round(e.x / f) * c - a -
-        Math.max(0, (this.container.clientWidth - g * c) / 2)), null != e.y && (this.container.scrollTop = Math.round(e.y / f) * c - a - Math.max(0, (this.container.clientHeight - h * c) / 2))) :
-      this.view.scaleAndTranslate(c, null != e.x ? Math.floor(this.view.translate.x - e.x / f + a + 1) : a, null !=
-        e.y ? Math.floor(this.view.translate.y - e.y / f + a + 1) : a)
-  }
-  return this.view.scale
-};
-mxGraph.prototype.scrollCellToVisible = function(a, b) {
-  var c = -this.view.translate.x,
-    d = -this.view.translate.y,
-    e = this.view.getState(a);
-  null != e && (c = new mxRectangle(c + e.x, d + e.y, e.width, e.height), b && null != this.container && (d = this.container.clientWidth, e = this.container.clientHeight, c.x = c.getCenterX() - d /
-    2, c.width = d, c.y = c.getCenterY() - e / 2, c.height = e), this.scrollRectToVisible(c) && this.view.setTranslate(this.view.translate.x, this.view.translate.y))
-};
-mxGraph.prototype.scrollRectToVisible = function(a) {
-  var b = !1;
-  if (null != a) {
-    var c = this.container.offsetWidth,
-      d = this.container.offsetHeight,
-      e = Math.min(c, a.width),
-      f = Math.min(d, a.height);
-    if (mxUtils.hasScrollbars(this.container)) {
-      c = this.container;
-      a.x += this.view.translate.x;
-      a.y += this.view.translate.y;
-      var g = c.scrollLeft - a.x,
-        d = Math.max(g - c.scrollLeft, 0);
-      0 < g ? c.scrollLeft -= g + 2 : (g = a.x + e - c.scrollLeft - c.clientWidth, 0 < g && (c.scrollLeft += g + 2));
-      e = c.scrollTop - a.y;
-      g = Math.max(0, e - c.scrollTop);
-      0 < e ? c.scrollTop -= e + 2 : (e = a.y +
-        f - c.scrollTop - c.clientHeight, 0 < e && (c.scrollTop += e + 2));
-      !this.useScrollbarsForPanning && (0 != d || 0 != g) && this.view.setTranslate(d, g)
-    } else {
-      var g = -this.view.translate.x,
-        h = -this.view.translate.y,
-        k = this.view.scale;
-      a.x + e > g + c && (this.view.translate.x -= (a.x + e - c - g) / k, b = !0);
-      a.y + f > h + d && (this.view.translate.y -= (a.y + f - d - h) / k, b = !0);
-      a.x < g && (this.view.translate.x += (g - a.x) / k, b = !0);
-      a.y < h && (this.view.translate.y += (h - a.y) / k, b = !0);
-      b && (this.view.refresh(), null != this.selectionCellsHandler && this.selectionCellsHandler.refresh())
-    }
-  }
-  return b
-};
-mxGraph.prototype.getCellGeometry = function(a) {
-  return this.model.getGeometry(a)
-};
-mxGraph.prototype.isCellVisible = function(a) {
-  return this.model.isVisible(a)
-};
-mxGraph.prototype.isCellCollapsed = function(a) {
-  return this.model.isCollapsed(a)
-};
-mxGraph.prototype.isCellConnectable = function(a) {
-  return this.model.isConnectable(a)
-};
-mxGraph.prototype.isOrthogonal = function(a) {
-  var b = a.style[mxConstants.STYLE_ORTHOGONAL];
-  if (null != b) return b;
-  a = this.view.getEdgeStyle(a);
-  return a == mxEdgeStyle.SegmentConnector || a == mxEdgeStyle.ElbowConnector || a == mxEdgeStyle.SideToSide || a == mxEdgeStyle.TopToBottom || a == mxEdgeStyle.EntityRelation || a == mxEdgeStyle.OrthConnector
-};
-mxGraph.prototype.isLoop = function(a) {
-  var b = a.getVisibleTerminalState(!0);
-  a = a.getVisibleTerminalState(!1);
-  return null != b && b == a
-};
-mxGraph.prototype.isCloneEvent = function(a) {
-  return mxEvent.isControlDown(a)
-};
-mxGraph.prototype.isToggleEvent = function(a) {
-  return mxClient.IS_MAC ? mxEvent.isMetaDown(a) : mxEvent.isControlDown(a)
-};
-mxGraph.prototype.isGridEnabledEvent = function(a) {
-  return null != a && !mxEvent.isAltDown(a)
-};
-mxGraph.prototype.isConstrainedEvent = function(a) {
-  return mxEvent.isShiftDown(a)
-};
-mxGraph.prototype.isForceMarqueeEvent = function(a) {
-  return mxEvent.isAltDown(a)
-};
-mxGraph.prototype.validationAlert = function(a) {
-  mxUtils.alert(a)
-};
-mxGraph.prototype.isEdgeValid = function(a, b, c) {
-  return null == this.getEdgeValidationError(a, b, c)
-};
-mxGraph.prototype.getEdgeValidationError = function(a, b, c) {
-  if (null != a && !this.isAllowDanglingEdges() && (null == b || null == c)) return "";
-  if (null != a && null == this.model.getTerminal(a, !0) && null == this.model.getTerminal(a, !1)) return null;
-  if (!this.allowLoops && b == c && null != b || !this.isValidConnection(b, c)) return "";
-  if (null != b && null != c) {
-    var d = "";
-    if (!this.multigraph) {
-      var e = this.model.getEdgesBetween(b, c, !0);
-      if (1 < e.length || 1 == e.length && e[0] != a) d += (mxResources.get(this.alreadyConnectedResource) || this.alreadyConnectedResource) +
-        "\n"
-    }
-    var e = this.model.getDirectedEdgeCount(b, !0, a),
-      f = this.model.getDirectedEdgeCount(c, !1, a);
-    if (null != this.multiplicities)
-      for (var g = 0; g < this.multiplicities.length; g++) {
-        var h = this.multiplicities[g].check(this, a, b, c, e, f);
-        null != h && (d += h)
-      }
-    h = this.validateEdge(a, b, c);
-    null != h && (d += h);
-    return 0 < d.length ? d : null
-  }
-  return this.allowDanglingEdges ? null : ""
-};
-mxGraph.prototype.validateEdge = function(a, b, c) {
-  return null
-};
-mxGraph.prototype.validateGraph = function(a, b) {
-  a = null != a ? a : this.model.getRoot();
-  b = null != b ? b : {};
-  for (var c = !0, d = this.model.getChildCount(a), e = 0; e < d; e++) {
-    var f = this.model.getChildAt(a, e),
-      g = b;
-    this.isValidRoot(f) && (g = {});
-    g = this.validateGraph(f, g);
-    null != g ? this.setCellWarning(f, g.replace(/\n/g, "\x3cbr\x3e")) : this.setCellWarning(f, null);
-    c = c && null == g
-  }
-  d = "";
-  this.isCellCollapsed(a) && !c && (d += (mxResources.get(this.containsValidationErrorsResource) || this.containsValidationErrorsResource) + "\n");
-  d = this.model.isEdge(a) ?
-    d + (this.getEdgeValidationError(a, this.model.getTerminal(a, !0), this.model.getTerminal(a, !1)) || "") : d + (this.getCellValidationError(a) || "");
-  e = this.validateCell(a, b);
-  null != e && (d += e);
-  null == this.model.getParent(a) && this.view.validate();
-  return 0 < d.length || !c ? d : null
-};
-mxGraph.prototype.getCellValidationError = function(a) {
-  var b = this.model.getDirectedEdgeCount(a, !0),
-    c = this.model.getDirectedEdgeCount(a, !1);
-  a = this.model.getValue(a);
-  var d = "";
-  if (null != this.multiplicities)
-    for (var e = 0; e < this.multiplicities.length; e++) {
-      var f = this.multiplicities[e];
-      if (f.source && mxUtils.isNode(a, f.type, f.attr, f.value) && (0 == f.max && 0 < b || 1 == f.min && 0 == b || 1 == f.max && 1 < b)) d += f.countError + "\n";
-      else if (!f.source && mxUtils.isNode(a, f.type, f.attr, f.value) && (0 == f.max && 0 < c || 1 == f.min && 0 == c || 1 == f.max && 1 <
-          c)) d += f.countError + "\n"
-    }
-  return 0 < d.length ? d : null
-};
-mxGraph.prototype.validateCell = function(a, b) {
-  return null
-};
-mxGraph.prototype.getBackgroundImage = function() {
-  return this.backgroundImage
-};
-mxGraph.prototype.setBackgroundImage = function(a) {
-  this.backgroundImage = a
-};
-mxGraph.prototype.getFoldingImage = function(a) {
-  if (null != a && this.foldingEnabled && !this.getModel().isEdge(a.cell)) {
-    var b = this.isCellCollapsed(a.cell);
-    if (this.isCellFoldable(a.cell, !b)) return b ? this.collapsedImage : this.expandedImage
-  }
-  return null
-};
-mxGraph.prototype.convertValueToString = function(a) {
-  a = this.model.getValue(a);
-  if (null != a) {
-    if (mxUtils.isNode(a)) return a.nodeName;
-    if ("function" == typeof a.toString) return a.toString()
-  }
-  return ""
-};
-mxGraph.prototype.getLabel = function(a) {
-  var b = "";
-  if (this.labelsVisible && null != a) {
-    var c = this.view.getState(a),
-      c = null != c ? c.style : this.getCellStyle(a);
-    mxUtils.getValue(c, mxConstants.STYLE_NOLABEL, !1) || (b = this.convertValueToString(a))
-  }
-  return b
-};
-mxGraph.prototype.isHtmlLabel = function(a) {
-  return this.isHtmlLabels()
-};
-mxGraph.prototype.isHtmlLabels = function() {
-  return this.htmlLabels
-};
-mxGraph.prototype.setHtmlLabels = function(a) {
-  this.htmlLabels = a
-};
-mxGraph.prototype.isWrapping = function(a) {
-  var b = this.view.getState(a);
-  a = null != b ? b.style : this.getCellStyle(a);
-  return null != a ? "wrap" == a[mxConstants.STYLE_WHITE_SPACE] : !1
-};
-mxGraph.prototype.isLabelClipped = function(a) {
-  var b = this.view.getState(a);
-  a = null != b ? b.style : this.getCellStyle(a);
-  return null != a ? "hidden" == a[mxConstants.STYLE_OVERFLOW] : !1
-};
-mxGraph.prototype.getTooltip = function(a, b, c, d) {
-  var e = null;
-  if (null != a) {
-    if (null != a.control && (b == a.control.node || b.parentNode == a.control.node)) e = this.collapseExpandResource, e = mxResources.get(e) || e;
-    null == e && null != a.overlays && a.overlays.visit(function(a, c) {
-      if (null == e && (b == c.node || b.parentNode == c.node)) e = c.overlay.toString()
-    });
-    null == e && (c = this.selectionCellsHandler.getHandler(a.cell), null != c && "function" == typeof c.getTooltipForNode && (e = c.getTooltipForNode(b)));
-    null == e && (e = this.getTooltipForCell(a.cell))
-  }
-  return e
-};
-mxGraph.prototype.getTooltipForCell = function(a) {
-  var b = null;
-  return b = null != a && null != a.getTooltip ? a.getTooltip() : this.convertValueToString(a)
-};
-mxGraph.prototype.getCursorForCell = function(a) {
-  return null
-};
-mxGraph.prototype.getStartSize = function(a) {
-  var b = new mxRectangle,
-    c = this.view.getState(a);
-  a = null != c ? c.style : this.getCellStyle(a);
-  null != a && (c = parseInt(mxUtils.getValue(a, mxConstants.STYLE_STARTSIZE, mxConstants.DEFAULT_STARTSIZE)), mxUtils.getValue(a, mxConstants.STYLE_HORIZONTAL, !0) ? b.height = c : b.width = c);
-  return b
-};
-mxGraph.prototype.getImage = function(a) {
-  return null != a && null != a.style ? a.style[mxConstants.STYLE_IMAGE] : null
-};
-mxGraph.prototype.getVerticalAlign = function(a) {
-  return null != a && null != a.style ? a.style[mxConstants.STYLE_VERTICAL_ALIGN] || mxConstants.ALIGN_MIDDLE : null
-};
-mxGraph.prototype.getIndicatorColor = function(a) {
-  return null != a && null != a.style ? a.style[mxConstants.STYLE_INDICATOR_COLOR] : null
-};
-mxGraph.prototype.getIndicatorGradientColor = function(a) {
-  return null != a && null != a.style ? a.style[mxConstants.STYLE_INDICATOR_GRADIENTCOLOR] : null
-};
-mxGraph.prototype.getIndicatorShape = function(a) {
-  return null != a && null != a.style ? a.style[mxConstants.STYLE_INDICATOR_SHAPE] : null
-};
-mxGraph.prototype.getIndicatorImage = function(a) {
-  return null != a && null != a.style ? a.style[mxConstants.STYLE_INDICATOR_IMAGE] : null
-};
-mxGraph.prototype.getBorder = function() {
-  return this.border
-};
-mxGraph.prototype.setBorder = function(a) {
-  this.border = a
-};
-mxGraph.prototype.isSwimlane = function(a) {
-  if (null != a && this.model.getParent(a) != this.model.getRoot()) {
-    var b = this.view.getState(a),
-      b = null != b ? b.style : this.getCellStyle(a);
-    if (null != b && !this.model.isEdge(a)) return b[mxConstants.STYLE_SHAPE] == mxConstants.SHAPE_SWIMLANE
-  }
-  return !1
-};
-mxGraph.prototype.isResizeContainer = function() {
-  return this.resizeContainer
-};
-mxGraph.prototype.setResizeContainer = function(a) {
-  this.resizeContainer = a
-};
-mxGraph.prototype.isEnabled = function() {
-  return this.enabled
-};
-mxGraph.prototype.setEnabled = function(a) {
-  this.enabled = a
-};
-mxGraph.prototype.isEscapeEnabled = function() {
-  return this.escapeEnabled
-};
-mxGraph.prototype.setEscapeEnabled = function(a) {
-  this.escapeEnabled = a
-};
-mxGraph.prototype.isInvokesStopCellEditing = function() {
-  return this.invokesStopCellEditing
-};
-mxGraph.prototype.setInvokesStopCellEditing = function(a) {
-  this.invokesStopCellEditing = a
-};
-mxGraph.prototype.isEnterStopsCellEditing = function() {
-  return this.enterStopsCellEditing
-};
-mxGraph.prototype.setEnterStopsCellEditing = function(a) {
-  this.enterStopsCellEditing = a
-};
-mxGraph.prototype.isCellLocked = function(a) {
-  var b = this.model.getGeometry(a);
-  return this.isCellsLocked() || null != b && this.model.isVertex(a) && b.relative
-};
-mxGraph.prototype.isCellsLocked = function() {
-  return this.cellsLocked
-};
-mxGraph.prototype.setCellsLocked = function(a) {
-  this.cellsLocked = a
-};
-mxGraph.prototype.getCloneableCells = function(a) {
-  return this.model.filterCells(a, mxUtils.bind(this, function(a) {
-    return this.isCellCloneable(a)
-  }))
-};
-mxGraph.prototype.isCellCloneable = function(a) {
-  var b = this.view.getState(a);
-  a = null != b ? b.style : this.getCellStyle(a);
-  return this.isCellsCloneable() && 0 != a[mxConstants.STYLE_CLONEABLE]
-};
-mxGraph.prototype.isCellsCloneable = function() {
-  return this.cellsCloneable
-};
-mxGraph.prototype.setCellsCloneable = function(a) {
-  this.cellsCloneable = a
-};
-mxGraph.prototype.getExportableCells = function(a) {
-  return this.model.filterCells(a, mxUtils.bind(this, function(a) {
-    return this.canExportCell(a)
-  }))
-};
-mxGraph.prototype.canExportCell = function(a) {
-  return this.exportEnabled
-};
-mxGraph.prototype.getImportableCells = function(a) {
-  return this.model.filterCells(a, mxUtils.bind(this, function(a) {
-    return this.canImportCell(a)
-  }))
-};
-mxGraph.prototype.canImportCell = function(a) {
-  return this.importEnabled
-};
-mxGraph.prototype.isCellSelectable = function(a) {
-  return this.isCellsSelectable()
-};
-mxGraph.prototype.isCellsSelectable = function() {
-  return this.cellsSelectable
-};
-mxGraph.prototype.setCellsSelectable = function(a) {
-  this.cellsSelectable = a
-};
-mxGraph.prototype.getDeletableCells = function(a) {
-  return this.model.filterCells(a, mxUtils.bind(this, function(a) {
-    return this.isCellDeletable(a)
-  }))
-};
-mxGraph.prototype.isCellDeletable = function(a) {
-  var b = this.view.getState(a);
-  a = null != b ? b.style : this.getCellStyle(a);
-  return this.isCellsDeletable() && 0 != a[mxConstants.STYLE_DELETABLE]
-};
-mxGraph.prototype.isCellsDeletable = function() {
-  return this.cellsDeletable
-};
-mxGraph.prototype.setCellsDeletable = function(a) {
-  this.cellsDeletable = a
-};
-mxGraph.prototype.isLabelMovable = function(a) {
-  return !this.isCellLocked(a) && (this.model.isEdge(a) && this.edgeLabelsMovable || this.model.isVertex(a) && this.vertexLabelsMovable)
-};
-mxGraph.prototype.getMovableCells = function(a) {
-  return this.model.filterCells(a, mxUtils.bind(this, function(a) {
-    return this.isCellMovable(a)
-  }))
-};
-mxGraph.prototype.isCellMovable = function(a) {
-  var b = this.view.getState(a),
-    b = null != b ? b.style : this.getCellStyle(a);
-  return this.isCellsMovable() && !this.isCellLocked(a) && 0 != b[mxConstants.STYLE_MOVABLE]
-};
-mxGraph.prototype.isCellsMovable = function() {
-  return this.cellsMovable
-};
-mxGraph.prototype.setCellsMovable = function(a) {
-  this.cellsMovable = a
-};
-mxGraph.prototype.isGridEnabled = function() {
-  return this.gridEnabled
-};
-mxGraph.prototype.setGridEnabled = function(a) {
-  this.gridEnabled = a
-};
-mxGraph.prototype.isPortsEnabled = function() {
-  return this.portsEnabled
-};
-mxGraph.prototype.setPortsEnabled = function(a) {
-  this.portsEnabled = a
-};
-mxGraph.prototype.getGridSize = function() {
-  return this.gridSize
-};
-mxGraph.prototype.setGridSize = function(a) {
-  this.gridSize = a
-};
-mxGraph.prototype.getTolerance = function() {
-  return this.tolerance
-};
-mxGraph.prototype.setTolerance = function(a) {
-  this.tolerance = a
-};
-mxGraph.prototype.isVertexLabelsMovable = function() {
-  return this.vertexLabelsMovable
-};
-mxGraph.prototype.setVertexLabelsMovable = function(a) {
-  this.vertexLabelsMovable = a
-};
-mxGraph.prototype.isEdgeLabelsMovable = function() {
-  return this.edgeLabelsMovable
-};
-mxGraph.prototype.setEdgeLabelsMovable = function(a) {
-  this.edgeLabelsMovable = a
-};
-mxGraph.prototype.isSwimlaneNesting = function() {
-  return this.swimlaneNesting
-};
-mxGraph.prototype.setSwimlaneNesting = function(a) {
-  this.swimlaneNesting = a
-};
-mxGraph.prototype.isSwimlaneSelectionEnabled = function() {
-  return this.swimlaneSelectionEnabled
-};
-mxGraph.prototype.setSwimlaneSelectionEnabled = function(a) {
-  this.swimlaneSelectionEnabled = a
-};
-mxGraph.prototype.isMultigraph = function() {
-  return this.multigraph
-};
-mxGraph.prototype.setMultigraph = function(a) {
-  this.multigraph = a
-};
-mxGraph.prototype.isAllowLoops = function() {
-  return this.allowLoops
-};
-mxGraph.prototype.setAllowDanglingEdges = function(a) {
-  this.allowDanglingEdges = a
-};
-mxGraph.prototype.isAllowDanglingEdges = function() {
-  return this.allowDanglingEdges
-};
-mxGraph.prototype.setConnectableEdges = function(a) {
-  this.connectableEdges = a
-};
-mxGraph.prototype.isConnectableEdges = function() {
-  return this.connectableEdges
-};
-mxGraph.prototype.setCloneInvalidEdges = function(a) {
-  this.cloneInvalidEdges = a
-};
-mxGraph.prototype.isCloneInvalidEdges = function() {
-  return this.cloneInvalidEdges
-};
-mxGraph.prototype.setAllowLoops = function(a) {
-  this.allowLoops = a
-};
-mxGraph.prototype.isDisconnectOnMove = function() {
-  return this.disconnectOnMove
-};
-mxGraph.prototype.setDisconnectOnMove = function(a) {
-  this.disconnectOnMove = a
-};
-mxGraph.prototype.isDropEnabled = function() {
-  return this.dropEnabled
-};
-mxGraph.prototype.setDropEnabled = function(a) {
-  this.dropEnabled = a
-};
-mxGraph.prototype.isSplitEnabled = function() {
-  return this.splitEnabled
-};
-mxGraph.prototype.setSplitEnabled = function(a) {
-  this.splitEnabled = a
-};
-mxGraph.prototype.isCellResizable = function(a) {
-  var b = this.view.getState(a),
-    b = null != b ? b.style : this.getCellStyle(a);
-  return this.isCellsResizable() && !this.isCellLocked(a) && 0 != b[mxConstants.STYLE_RESIZABLE]
-};
-mxGraph.prototype.isCellsResizable = function() {
-  return this.cellsResizable
-};
-mxGraph.prototype.setCellsResizable = function(a) {
-  this.cellsResizable = a
-};
-mxGraph.prototype.isTerminalPointMovable = function(a, b) {
-  return !0
-};
-mxGraph.prototype.isCellBendable = function(a) {
-  var b = this.view.getState(a),
-    b = null != b ? b.style : this.getCellStyle(a);
-  return this.isCellsBendable() && !this.isCellLocked(a) && 0 != b[mxConstants.STYLE_BENDABLE]
-};
-mxGraph.prototype.isCellsBendable = function() {
-  return this.cellsBendable
-};
-mxGraph.prototype.setCellsBendable = function(a) {
-  this.cellsBendable = a
-};
-mxGraph.prototype.isCellEditable = function(a) {
-  var b = this.view.getState(a),
-    b = null != b ? b.style : this.getCellStyle(a);
-  return this.isCellsEditable() && !this.isCellLocked(a) && 0 != b[mxConstants.STYLE_EDITABLE]
-};
-mxGraph.prototype.isCellsEditable = function() {
-  return this.cellsEditable
-};
-mxGraph.prototype.setCellsEditable = function(a) {
-  this.cellsEditable = a
-};
-mxGraph.prototype.isCellDisconnectable = function(a, b, c) {
-  return this.isCellsDisconnectable() && !this.isCellLocked(a)
-};
-mxGraph.prototype.isCellsDisconnectable = function() {
-  return this.cellsDisconnectable
-};
-mxGraph.prototype.setCellsDisconnectable = function(a) {
-  this.cellsDisconnectable = a
-};
-mxGraph.prototype.isValidSource = function(a) {
-  return null == a && this.allowDanglingEdges || null != a && (!this.model.isEdge(a) || this.connectableEdges) && this.isCellConnectable(a)
-};
-mxGraph.prototype.isValidTarget = function(a) {
-  return this.isValidSource(a)
-};
-mxGraph.prototype.isValidConnection = function(a, b) {
-  return this.isValidSource(a) && this.isValidTarget(b)
-};
-mxGraph.prototype.setConnectable = function(a) {
-  this.connectionHandler.setEnabled(a)
-};
-mxGraph.prototype.isConnectable = function(a) {
-  return this.connectionHandler.isEnabled()
-};
-mxGraph.prototype.setTooltips = function(a) {
-  this.tooltipHandler.setEnabled(a)
-};
-mxGraph.prototype.setPanning = function(a) {
-  this.panningHandler.panningEnabled = a
-};
-mxGraph.prototype.isEditing = function(a) {
-  if (null != this.cellEditor) {
-    var b = this.cellEditor.getEditingCell();
-    return null == a ? null != b : a == b
-  }
-  return !1
-};
-mxGraph.prototype.isAutoSizeCell = function(a) {
-  var b = this.view.getState(a);
-  a = null != b ? b.style : this.getCellStyle(a);
-  return this.isAutoSizeCells() || 1 == a[mxConstants.STYLE_AUTOSIZE]
-};
-mxGraph.prototype.isAutoSizeCells = function() {
-  return this.autoSizeCells
-};
-mxGraph.prototype.setAutoSizeCells = function(a) {
-  this.autoSizeCells = a
-};
-mxGraph.prototype.isExtendParent = function(a) {
-  return !this.getModel().isEdge(a) && this.isExtendParents()
-};
-mxGraph.prototype.isExtendParents = function() {
-  return this.extendParents
-};
-mxGraph.prototype.setExtendParents = function(a) {
-  this.extendParents = a
-};
-mxGraph.prototype.isExtendParentsOnAdd = function() {
-  return this.extendParentsOnAdd
-};
-mxGraph.prototype.setExtendParentsOnAdd = function(a) {
-  this.extendParentsOnAdd = a
-};
-mxGraph.prototype.isConstrainChild = function(a) {
-  return this.isConstrainChildren() && !this.getModel().isEdge(this.getModel().getParent(a))
-};
-mxGraph.prototype.isConstrainChildren = function() {
-  return this.constrainChildren
-};
-mxGraph.prototype.setConstrainChildren = function(a) {
-  this.constrainChildren = a
-};
-mxGraph.prototype.isAllowNegativeCoordinates = function() {
-  return this.allowNegativeCoordinates
-};
-mxGraph.prototype.setAllowNegativeCoordinates = function(a) {
-  this.allowNegativeCoordinates = a
-};
-mxGraph.prototype.getOverlap = function(a) {
-  return this.isAllowOverlapParent(a) ? this.defaultOverlap : 0
-};
-mxGraph.prototype.isAllowOverlapParent = function(a) {
-  return !1
-};
-mxGraph.prototype.getFoldableCells = function(a, b) {
-  return this.model.filterCells(a, mxUtils.bind(this, function(a) {
-    return this.isCellFoldable(a, b)
-  }))
-};
-mxGraph.prototype.isCellFoldable = function(a, b) {
-  var c = this.view.getState(a),
-    c = null != c ? c.style : this.getCellStyle(a);
-  return 0 < this.model.getChildCount(a) && 0 != c[mxConstants.STYLE_FOLDABLE]
-};
-mxGraph.prototype.isValidDropTarget = function(a, b, c) {
-  return null != a && (this.isSplitEnabled() && this.isSplitTarget(a, b, c) || !this.model.isEdge(a) && (this.isSwimlane(a) || 0 < this.model.getChildCount(a) && !this.isCellCollapsed(a)))
-};
-mxGraph.prototype.isSplitTarget = function(a, b, c) {
-  return this.model.isEdge(a) && null != b && 1 == b.length && this.isCellConnectable(b[0]) && null == this.getEdgeValidationError(a, this.model.getTerminal(a, !0), b[0]) ? (c = this.model.getTerminal(
-    a, !0), a = this.model.getTerminal(a, !1), !this.model.isAncestor(b[0], c) && !this.model.isAncestor(b[0], a)) : !1
-};
-mxGraph.prototype.getDropTarget = function(a, b, c) {
-  if (!this.isSwimlaneNesting())
-    for (var d = 0; d < a.length; d++)
-      if (this.isSwimlane(a[d])) return null;
-  d = mxUtils.convertPoint(this.container, mxEvent.getClientX(b), mxEvent.getClientY(b));
-  d.x -= this.panDx;
-  d.y -= this.panDy;
-  d = this.getSwimlaneAt(d.x, d.y);
-  if (null == c) c = d;
-  else if (null != d) {
-    for (var e = this.model.getParent(d); null != e && this.isSwimlane(e) && e != c;) e = this.model.getParent(e);
-    e == c && (c = d)
-  }
-  for (; null != c && !this.isValidDropTarget(c, a, b) && !this.model.isLayer(c);) c = this.model.getParent(c);
-  return !this.model.isLayer(c) && 0 > mxUtils.indexOf(a, c) ? c : null
-};
-mxGraph.prototype.getDefaultParent = function() {
-  var a = this.defaultParent;
-  null == a && (a = this.getCurrentRoot(), null == a && (a = this.model.getRoot(), a = this.model.getChildAt(a, 0)));
-  return a
-};
-mxGraph.prototype.setDefaultParent = function(a) {
-  this.defaultParent = a
-};
-mxGraph.prototype.getSwimlane = function(a) {
-  for (; null != a && !this.isSwimlane(a);) a = this.model.getParent(a);
-  return a
-};
-mxGraph.prototype.getSwimlaneAt = function(a, b, c) {
-  c = c || this.getDefaultParent();
-  if (null != c)
-    for (var d = this.model.getChildCount(c), e = 0; e < d; e++) {
-      var f = this.model.getChildAt(c, e),
-        g = this.getSwimlaneAt(a, b, f);
-      if (null != g) return g;
-      if (this.isSwimlane(f) && (g = this.view.getState(f), this.intersects(g, a, b))) return f
-    }
-  return null
-};
-mxGraph.prototype.getCellAt = function(a, b, c, d, e) {
-  d = null != d ? d : !0;
-  e = null != e ? e : !0;
-  c = null != c ? c : this.getDefaultParent();
-  if (null != c)
-    for (var f = this.model.getChildCount(c) - 1; 0 <= f; f--) {
-      var g = this.model.getChildAt(c, f),
-        h = this.getCellAt(a, b, g, d, e);
-      if (null != h) return h;
-      if (this.isCellVisible(g) && (e && this.model.isEdge(g) || d && this.model.isVertex(g)))
-        if (h = this.view.getState(g), this.intersects(h, a, b)) return g
-    }
-  return null
-};
-mxGraph.prototype.intersects = function(a, b, c) {
-  if (null != a) {
-    var d = a.absolutePoints;
-    if (null != d) {
-      a = this.tolerance * this.tolerance;
-      for (var e = d[0], f = 1; f < d.length; f++) {
-        var g = d[f];
-        if (mxUtils.ptSegDistSq(e.x, e.y, g.x, g.y, b, c) <= a) return !0;
-        e = g
-      }
-    } else if (e = mxUtils.toRadians(mxUtils.getValue(a.style, mxConstants.STYLE_ROTATION) || 0), 0 != e && (d = Math.cos(-e), e = Math.sin(-e), f = new mxPoint(a.getCenterX(), a.getCenterY()), e =
-        mxUtils.getRotatedPoint(new mxPoint(b, c), d, e, f), b = e.x, c = e.y), mxUtils.contains(a, b, c)) return !0
-  }
-  return !1
-};
-mxGraph.prototype.hitsSwimlaneContent = function(a, b, c) {
-  var d = this.getView().getState(a);
-  a = this.getStartSize(a);
-  if (null != d) {
-    var e = this.getView().getScale();
-    b -= d.x;
-    c -= d.y;
-    if (0 < a.width && 0 < b && b > a.width * e || 0 < a.height && 0 < c && c > a.height * e) return !0
-  }
-  return !1
-};
-mxGraph.prototype.getChildVertices = function(a) {
-  return this.getChildCells(a, !0, !1)
-};
-mxGraph.prototype.getChildEdges = function(a) {
-  return this.getChildCells(a, !1, !0)
-};
-mxGraph.prototype.getChildCells = function(a, b, c) {
-  a = null != a ? a : this.getDefaultParent();
-  a = this.model.getChildCells(a, null != b ? b : !1, null != c ? c : !1);
-  b = [];
-  for (c = 0; c < a.length; c++) this.isCellVisible(a[c]) && b.push(a[c]);
-  return b
-};
-mxGraph.prototype.getConnections = function(a, b) {
-  return this.getEdges(a, b, !0, !0, !1)
-};
-mxGraph.prototype.getIncomingEdges = function(a, b) {
-  return this.getEdges(a, b, !0, !1, !1)
-};
-mxGraph.prototype.getOutgoingEdges = function(a, b) {
-  return this.getEdges(a, b, !1, !0, !1)
-};
-mxGraph.prototype.getEdges = function(a, b, c, d, e, f) {
-  c = null != c ? c : !0;
-  d = null != d ? d : !0;
-  e = null != e ? e : !0;
-  f = null != f ? f : !1;
-  for (var g = [], h = this.isCellCollapsed(a), k = this.model.getChildCount(a), l = 0; l < k; l++) {
-    var m = this.model.getChildAt(a, l);
-    if (h || !this.isCellVisible(m)) g = g.concat(this.model.getEdges(m, c, d))
-  }
-  g = g.concat(this.model.getEdges(a, c, d));
-  h = [];
-  for (l = 0; l < g.length; l++) m = this.view.getState(g[l]), k = null != m ? m.getVisibleTerminal(!0) : this.view.getVisibleTerminal(g[l], !0), m = null != m ? m.getVisibleTerminal(!1) : this.view
-    .getVisibleTerminal(g[l], !1), (e && k == m || k != m && (c && m == a && (null == b || this.isValidAncestor(k, b, f)) || d && k == a && (null == b || this.isValidAncestor(m, b, f)))) && h.push(
-      g[l]);
-  return h
-};
-mxGraph.prototype.isValidAncestor = function(a, b, c) {
-  return c ? this.model.isAncestor(b, a) : this.model.getParent(a) == b
-};
-mxGraph.prototype.getOpposites = function(a, b, c, d) {
-  c = null != c ? c : !0;
-  d = null != d ? d : !0;
-  var e = [],
-    f = {};
-  if (null != a)
-    for (var g = 0; g < a.length; g++) {
-      var h = this.view.getState(a[g]),
-        k = null != h ? h.getVisibleTerminal(!0) : this.view.getVisibleTerminal(a[g], !0),
-        h = null != h ? h.getVisibleTerminal(!1) : this.view.getVisibleTerminal(a[g], !1);
-      if (k == b && null != h && h != b && d) {
-        var l = mxCellPath.create(h);
-        null == f[l] && (f[l] = h, e.push(h))
-      } else h == b && (null != k && k != b && c) && (l = mxCellPath.create(k), null == f[l] && (f[l] = k, e.push(k)))
-    }
-  return e
-};
-mxGraph.prototype.getEdgesBetween = function(a, b, c) {
-  c = null != c ? c : !1;
-  for (var d = this.getEdges(a), e = [], f = 0; f < d.length; f++) {
-    var g = this.view.getState(d[f]),
-      h = null != g ? g.getVisibleTerminal(!0) : this.view.getVisibleTerminal(d[f], !0),
-      g = null != g ? g.getVisibleTerminal(!1) : this.view.getVisibleTerminal(d[f], !1);
-    (h == a && g == b || !c && h == b && g == a) && e.push(d[f])
-  }
-  return e
-};
-mxGraph.prototype.getPointForEvent = function(a, b) {
-  var c = mxUtils.convertPoint(this.container, mxEvent.getClientX(a), mxEvent.getClientY(a)),
-    d = this.view.scale,
-    e = this.view.translate,
-    f = !1 != b ? this.gridSize / 2 : 0;
-  c.x = this.snap(c.x / d - e.x - f);
-  c.y = this.snap(c.y / d - e.y - f);
-  return c
-};
-mxGraph.prototype.getCells = function(a, b, c, d, e, f) {
-  f = null != f ? f : [];
-  if (0 < c || 0 < d) {
-    var g = a + c,
-      h = b + d;
-    e = e || this.getDefaultParent();
-    if (null != e)
-      for (var k = this.model.getChildCount(e), l = 0; l < k; l++) {
-        var m = this.model.getChildAt(e, l),
-          n = this.view.getState(m);
-        if (this.isCellVisible(m) && null != n) {
-          var p = n,
-            n = mxUtils.getValue(n.style, mxConstants.STYLE_ROTATION) || 0;
-          0 != n && (p = mxUtils.getBoundingBox(p, n));
-          p.x >= a && p.y + p.height <= h && p.y >= b && p.x + p.width <= g ? f.push(m) : this.getCells(a, b, c, d, m, f)
-        }
-      }
-  }
-  return f
-};
-mxGraph.prototype.getCellsBeyond = function(a, b, c, d, e) {
-  var f = [];
-  if (d || e)
-    if (null == c && (c = this.getDefaultParent()), null != c)
-      for (var g = this.model.getChildCount(c), h = 0; h < g; h++) {
-        var k = this.model.getChildAt(c, h),
-          l = this.view.getState(k);
-        this.isCellVisible(k) && null != l && (!d || l.x >= a) && (!e || l.y >= b) && f.push(k)
-      }
-  return f
-};
-mxGraph.prototype.findTreeRoots = function(a, b, c) {
-  b = null != b ? b : !1;
-  c = null != c ? c : !1;
-  var d = [];
-  if (null != a) {
-    for (var e = this.getModel(), f = e.getChildCount(a), g = null, h = 0, k = 0; k < f; k++) {
-      var l = e.getChildAt(a, k);
-      if (this.model.isVertex(l) && this.isCellVisible(l)) {
-        for (var m = this.getConnections(l, b ? a : null), n = 0, p = 0, q = 0; q < m.length; q++) this.view.getVisibleTerminal(m[q], !0) == l ? n++ : p++;
-        (c && 0 == n && 0 < p || !c && 0 == p && 0 < n) && d.push(l);
-        m = c ? p - n : n - p;
-        m > h && (h = m, g = l)
-      }
-    }
-    0 == d.length && null != g && d.push(g)
-  }
-  return d
-};
-mxGraph.prototype.traverse = function(a, b, c, d, e) {
-  if (null != c && null != a) {
-    b = null != b ? b : !0;
-    e = e || [];
-    var f = mxCellPath.create(a);
-    if (null == e[f] && (e[f] = a, d = c(a, d), null == d || d))
-      if (d = this.model.getEdgeCount(a), 0 < d)
-        for (f = 0; f < d; f++) {
-          var g = this.model.getEdgeAt(a, f),
-            h = this.model.getTerminal(g, !0) == a;
-          if (!b || h) h = this.model.getTerminal(g, !h), this.traverse(h, b, c, g, e)
-        }
-  }
-};
-mxGraph.prototype.isCellSelected = function(a) {
-  return this.getSelectionModel().isSelected(a)
-};
-mxGraph.prototype.isSelectionEmpty = function() {
-  return this.getSelectionModel().isEmpty()
-};
-mxGraph.prototype.clearSelection = function() {
-  return this.getSelectionModel().clear()
-};
-mxGraph.prototype.getSelectionCount = function() {
-  return this.getSelectionModel().cells.length
-};
-mxGraph.prototype.getSelectionCell = function() {
-  return this.getSelectionModel().cells[0]
-};
-mxGraph.prototype.getSelectionCells = function() {
-  return this.getSelectionModel().cells.slice()
-};
-mxGraph.prototype.setSelectionCell = function(a) {
-  this.getSelectionModel().setCell(a)
-};
-mxGraph.prototype.setSelectionCells = function(a) {
-  this.getSelectionModel().setCells(a)
-};
-mxGraph.prototype.addSelectionCell = function(a) {
-  this.getSelectionModel().addCell(a)
-};
-mxGraph.prototype.addSelectionCells = function(a) {
-  this.getSelectionModel().addCells(a)
-};
-mxGraph.prototype.removeSelectionCell = function(a) {
-  this.getSelectionModel().removeCell(a)
-};
-mxGraph.prototype.removeSelectionCells = function(a) {
-  this.getSelectionModel().removeCells(a)
-};
-mxGraph.prototype.selectRegion = function(a, b) {
-  var c = this.getCells(a.x, a.y, a.width, a.height);
-  this.selectCellsForEvent(c, b);
-  return c
-};
-mxGraph.prototype.selectNextCell = function() {
-  this.selectCell(!0)
-};
-mxGraph.prototype.selectPreviousCell = function() {
-  this.selectCell()
-};
-mxGraph.prototype.selectParentCell = function() {
-  this.selectCell(!1, !0)
-};
-mxGraph.prototype.selectChildCell = function() {
-  this.selectCell(!1, !1, !0)
-};
-mxGraph.prototype.selectCell = function(a, b, c) {
-  var d = this.selectionModel,
-    e = 0 < d.cells.length ? d.cells[0] : null;
-  1 < d.cells.length && d.clear();
-  var d = null != e ? this.model.getParent(e) : this.getDefaultParent(),
-    f = this.model.getChildCount(d);
-  null == e && 0 < f ? (a = this.model.getChildAt(d, 0), this.setSelectionCell(a)) : (null == e || b) && null != this.view.getState(d) && null != this.model.getGeometry(d) ? this.getCurrentRoot() !=
-    d && this.setSelectionCell(d) : null != e && c ? 0 < this.model.getChildCount(e) && (a = this.model.getChildAt(e, 0), this.setSelectionCell(a)) :
-    0 < f && (b = d.getIndex(e), a ? (b++, a = this.model.getChildAt(d, b % f)) : (b--, a = this.model.getChildAt(d, 0 > b ? f - 1 : b)), this.setSelectionCell(a))
-};
-mxGraph.prototype.selectAll = function(a) {
-  a = a || this.getDefaultParent();
-  a = this.model.getChildren(a);
-  null != a && this.setSelectionCells(a)
-};
-mxGraph.prototype.selectVertices = function(a) {
-  this.selectCells(!0, !1, a)
-};
-mxGraph.prototype.selectEdges = function(a) {
-  this.selectCells(!1, !0, a)
-};
-mxGraph.prototype.selectCells = function(a, b, c) {
-  c = c || this.getDefaultParent();
-  var d = mxUtils.bind(this, function(c) {
-    return null != this.view.getState(c) && 0 == this.model.getChildCount(c) && (this.model.isVertex(c) && a || this.model.isEdge(c) && b)
-  });
-  c = this.model.filterDescendants(d, c);
-  this.setSelectionCells(c)
-};
-mxGraph.prototype.selectCellForEvent = function(a, b) {
-  var c = this.isCellSelected(a);
-  this.isToggleEvent(b) ? c ? this.removeSelectionCell(a) : this.addSelectionCell(a) : (!c || 1 != this.getSelectionCount()) && this.setSelectionCell(a)
-};
-mxGraph.prototype.selectCellsForEvent = function(a, b) {
-  this.isToggleEvent(b) ? this.addSelectionCells(a) : this.setSelectionCells(a)
-};
-mxGraph.prototype.createHandler = function(a) {
-  var b = null;
-  null != a && (this.model.isEdge(a.cell) ? (b = this.view.getEdgeStyle(a), b = this.isLoop(a) || b == mxEdgeStyle.ElbowConnector || b == mxEdgeStyle.SideToSide || b == mxEdgeStyle.TopToBottom ?
-    new mxElbowEdgeHandler(a) : b == mxEdgeStyle.SegmentConnector || b == mxEdgeStyle.OrthConnector ? new mxEdgeSegmentHandler(a) : new mxEdgeHandler(a)) : b = new mxVertexHandler(a));
-  return b
-};
-mxGraph.prototype.addMouseListener = function(a) {
-  null == this.mouseListeners && (this.mouseListeners = []);
-  this.mouseListeners.push(a)
-};
-mxGraph.prototype.removeMouseListener = function(a) {
-  if (null != this.mouseListeners)
-    for (var b = 0; b < this.mouseListeners.length; b++)
-      if (this.mouseListeners[b] == a) {
-        this.mouseListeners.splice(b, 1);
-        break
-      }
-};
-mxGraph.prototype.updateMouseEvent = function(a) {
-  if (null == a.graphX || null == a.graphY) {
-    var b = mxUtils.convertPoint(this.container, a.getX(), a.getY());
-    a.graphX = b.x - this.panDx;
-    a.graphY = b.y - this.panDy
-  }
-};
-mxGraph.prototype.fireMouseEvent = function(a, b, c) {
-  null == c && (c = this);
-  this.updateMouseEvent(b);
-  a == mxEvent.MOUSE_DOWN && (this.isMouseDown = !0);
-  if (mxClient.IS_TOUCH && this.doubleTapEnabled && a == mxEvent.MOUSE_DOWN) {
-    var d = (new Date).getTime();
-    d - this.lastTouchTime < this.doubleTapTimeout && Math.abs(this.lastTouchX - b.getX()) < this.doubleTapTolerance && Math.abs(this.lastTouchY - b.getY()) < this.doubleTapTolerance ? (this.lastTouchTime =
-      0, this.dblClick(b.getEvent(), b.getCell()), b.getEvent().cancelBubble = !0) : (this.lastTouchX =
-      b.getX(), this.lastTouchY = b.getY(), this.lastTouchTime = d)
-  }
-  d = 2 != b.getEvent().detail;
-  if (mxClient.IS_IE && "CSS1Compat" == document.compatMode) {
-    if (null != this.lastMouseX && Math.abs(this.lastMouseX - b.getX()) > this.doubleTapTolerance || null != this.lastMouseY && Math.abs(this.lastMouseY - b.getY()) > this.doubleTapTolerance) d = !
-      0;
-    a == mxEvent.MOUSE_UP && (this.lastMouseX = b.getX(), this.lastMouseY = b.getY())
-  }
-  if ((a != mxEvent.MOUSE_UP || this.isMouseDown) && d) {
-    if (a == mxEvent.MOUSE_UP && (this.isMouseDown = !1), !this.isEditing() && (mxClient.IS_OP ||
-        mxClient.IS_SF || mxClient.IS_GC || mxClient.IS_IE && mxClient.IS_SVG || b.getEvent().target != this.container)) {
-      a == mxEvent.MOUSE_MOVE && (this.isMouseDown && this.autoScroll) && this.scrollPointToVisible(b.getGraphX(), b.getGraphY(), this.autoExtend);
-      if (null != this.mouseListeners) {
-        c = [c, b];
-        b.getEvent().returnValue = !0;
-        for (d = 0; d < this.mouseListeners.length; d++) {
-          var e = this.mouseListeners[d];
-          a == mxEvent.MOUSE_DOWN ? e.mouseDown.apply(e, c) : a == mxEvent.MOUSE_MOVE ? e.mouseMove.apply(e, c) : a == mxEvent.MOUSE_UP && e.mouseUp.apply(e, c)
-        }
-      }
-      a ==
-        mxEvent.MOUSE_UP && this.click(b)
-    }
-  } else a == mxEvent.MOUSE_UP && (this.isMouseDown = !1)
-};
-mxGraph.prototype.destroy = function() {
-  this.destroyed || (this.destroyed = !0, null != this.tooltipHandler && this.tooltipHandler.destroy(), null != this.selectionCellsHandler && this.selectionCellsHandler.destroy(), null != this.panningHandler &&
-    this.panningHandler.destroy(), null != this.connectionHandler && this.connectionHandler.destroy(), null != this.graphHandler && this.graphHandler.destroy(), null != this.cellEditor && this.cellEditor
-    .destroy(), null != this.view && this.view.destroy(), null != this.model && null != this.graphModelChangeListener &&
-    (this.model.removeListener(this.graphModelChangeListener), this.graphModelChangeListener = null), this.container = null)
-};
-
-function mxCellOverlay(a, b, c, d, e, f) {
-  this.image = a;
-  this.tooltip = b;
-  this.align = null != c ? c : this.align;
-  this.verticalAlign = null != d ? d : this.verticalAlign;
-  this.offset = null != e ? e : new mxPoint;
-  this.cursor = null != f ? f : "help"
-}
-mxCellOverlay.prototype = new mxEventSource;
-mxCellOverlay.prototype.constructor = mxCellOverlay;
-mxCellOverlay.prototype.image = null;
-mxCellOverlay.prototype.tooltip = null;
-mxCellOverlay.prototype.align = mxConstants.ALIGN_RIGHT;
-mxCellOverlay.prototype.verticalAlign = mxConstants.ALIGN_BOTTOM;
-mxCellOverlay.prototype.offset = null;
-mxCellOverlay.prototype.cursor = null;
-mxCellOverlay.prototype.defaultOverlap = 0.5;
-mxCellOverlay.prototype.getBounds = function(a) {
-  var b = a.view.graph.getModel().isEdge(a.cell),
-    c = a.view.scale,
-    d = null,
-    e = this.image.width,
-    f = this.image.height;
-  b ? (b = a.absolutePoints, 1 == b.length % 2 ? d = b[Math.floor(b.length / 2)] : (d = b.length / 2, a = b[d - 1], b = b[d], d = new mxPoint(a.x + (b.x - a.x) / 2, a.y + (b.y - a.y) / 2))) : (d =
-    new mxPoint, d.x = this.align == mxConstants.ALIGN_LEFT ? a.x : this.align == mxConstants.ALIGN_CENTER ? a.x + a.width / 2 : a.x + a.width, d.y = this.verticalAlign == mxConstants.ALIGN_TOP ?
-    a.y : this.verticalAlign == mxConstants.ALIGN_MIDDLE ?
-    a.y + a.height / 2 : a.y + a.height);
-  return new mxRectangle(Math.round(d.x - (e * this.defaultOverlap - this.offset.x) * c), Math.round(d.y - (f * this.defaultOverlap - this.offset.y) * c), e * c, f * c)
-};
-mxCellOverlay.prototype.toString = function() {
-  return this.tooltip
-};
-
-function mxOutline(a, b) {
-  this.source = a;
-  null != b && this.init(b)
-}
-mxOutline.prototype.source = null;
-mxOutline.prototype.outline = null;
-mxOutline.prototype.graphRenderHint = mxConstants.RENDERING_HINT_FASTER;
-mxOutline.prototype.enabled = !0;
-mxOutline.prototype.showViewport = !0;
-mxOutline.prototype.border = 10;
-mxOutline.prototype.sizerSize = 8;
-mxOutline.prototype.updateOnPan = !1;
-mxOutline.prototype.sizerImage = null;
-mxOutline.prototype.suspended = !1;
-mxOutline.prototype.init = function(a) {
-  this.outline = new mxGraph(a, this.source.getModel(), this.graphRenderHint, this.source.getStylesheet());
-  this.outline.foldingEnabled = !1;
-  this.outline.autoScroll = !1;
-  var b = this.outline.graphModelChanged;
-  this.outline.graphModelChanged = mxUtils.bind(this, function(a) {
-    !this.suspended && null != this.outline && b.apply(this.outline, arguments)
-  });
-  mxClient.IS_SVG && (a = this.outline.getView().getCanvas().parentNode, a.setAttribute("shape-rendering", "optimizeSpeed"), a.setAttribute("image-rendering",
-    "optimizeSpeed"));
-  this.outline.labelsVisible = !1;
-  this.outline.setEnabled(!1);
-  this.updateHandler = mxUtils.bind(this, function(a, b) {
-    !this.suspended && !this.active && this.update()
-  });
-  this.source.getModel().addListener(mxEvent.CHANGE, this.updateHandler);
-  this.outline.addMouseListener(this);
-  a = this.source.getView();
-  a.addListener(mxEvent.SCALE, this.updateHandler);
-  a.addListener(mxEvent.TRANSLATE, this.updateHandler);
-  a.addListener(mxEvent.SCALE_AND_TRANSLATE, this.updateHandler);
-  a.addListener(mxEvent.DOWN, this.updateHandler);
-  a.addListener(mxEvent.UP, this.updateHandler);
-  mxEvent.addListener(this.source.container, "scroll", this.updateHandler);
-  this.panHandler = mxUtils.bind(this, function(a) {
-    this.updateOnPan && this.updateHandler.apply(this, arguments)
-  });
-  this.source.addListener(mxEvent.PAN, this.panHandler);
-  this.refreshHandler = mxUtils.bind(this, function(a) {
-    this.outline.setStylesheet(this.source.getStylesheet());
-    this.outline.refresh()
-  });
-  this.source.addListener(mxEvent.REFRESH, this.refreshHandler);
-  this.bounds = new mxRectangle(0, 0, 0,
-    0);
-  this.selectionBorder = new mxRectangleShape(this.bounds, null, mxConstants.OUTLINE_COLOR, mxConstants.OUTLINE_STROKEWIDTH);
-  this.selectionBorder.dialect = this.outline.dialect != mxConstants.DIALECT_SVG ? mxConstants.DIALECT_VML : mxConstants.DIALECT_SVG;
-  this.selectionBorder.init(this.outline.getView().getOverlayPane());
-  mxEvent.redirectMouseEvents(this.selectionBorder.node, this.outline);
-  this.selectionBorder.node.style.background = "";
-  this.sizer = this.createSizer();
-  this.sizer.init(this.outline.getView().getOverlayPane());
-  this.enabled && (this.sizer.node.style.cursor = "pointer");
-  mxEvent.addListener(this.sizer.node, mxClient.IS_TOUCH ? "touchstart" : "mousedown", mxUtils.bind(this, function(a) {
-    this.outline.fireMouseEvent(mxEvent.MOUSE_DOWN, new mxMouseEvent(a))
-  }));
-  this.selectionBorder.node.style.display = this.showViewport ? "" : "none";
-  this.sizer.node.style.display = this.selectionBorder.node.style.display;
-  this.selectionBorder.node.style.cursor = "move";
-  this.update(!1)
-};
-mxOutline.prototype.isEnabled = function() {
-  return this.enabled
-};
-mxOutline.prototype.setEnabled = function(a) {
-  this.enabled = a
-};
-mxOutline.prototype.setZoomEnabled = function(a) {
-  this.sizer.node.style.visibility = a ? "visible" : "hidden"
-};
-mxOutline.prototype.refresh = function() {
-  this.update(!0)
-};
-mxOutline.prototype.createSizer = function() {
-  var a = null != this.sizerImage ? new mxImageShape(new mxRectangle(0, 0, this.sizerImage.width, this.sizerImage.height), this.sizerImage.src) : new mxRectangleShape(new mxRectangle(0, 0, this.sizerSize,
-    this.sizerSize), mxConstants.OUTLINE_HANDLE_FILLCOLOR, mxConstants.OUTLINE_HANDLE_STROKECOLOR);
-  a.dialect = this.outline.dialect;
-  return a
-};
-mxOutline.prototype.getSourceContainerSize = function() {
-  return new mxRectangle(0, 0, this.source.container.scrollWidth, this.source.container.scrollHeight)
-};
-mxOutline.prototype.getOutlineOffset = function(a) {
-  return null
-};
-mxOutline.prototype.update = function(a) {
-  if (null != this.source) {
-    var b = this.source.view.scale,
-      c = this.source.getGraphBounds(),
-      c = new mxRectangle(c.x / b + this.source.panDx, c.y / b + this.source.panDy, c.width / b, c.height / b),
-      d = new mxRectangle(0, 0, this.source.container.clientWidth / b, this.source.container.clientHeight / b),
-      e = c.clone();
-    e.add(d);
-    var f = this.getSourceContainerSize(),
-      d = Math.max(f.width / b, e.width),
-      b = Math.max(f.height / b, e.height),
-      e = Math.max(0, this.outline.container.clientWidth - this.border),
-      f = Math.max(0, this.outline.container.clientHeight -
-        this.border),
-      e = Math.min(e / d, f / b);
-    if (0 < e) {
-      this.outline.getView().scale != e && (this.outline.getView().scale = e, a = !0);
-      d = this.outline.getView();
-      d.currentRoot != this.source.getView().currentRoot && d.setCurrentRoot(this.source.getView().currentRoot);
-      var b = this.source.view.translate,
-        f = b.x + this.source.panDx,
-        g = b.y + this.source.panDy,
-        e = this.getOutlineOffset(e);
-      null != e && (f += e.x, g += e.y);
-      0 > c.x && (f -= c.x);
-      0 > c.y && (g -= c.y);
-      if (d.translate.x != f || d.translate.y != g) d.translate.x = f, d.translate.y = g, a = !0;
-      var c = d.translate,
-        e = this.source.getView().scale,
-        f = e / d.scale,
-        g = 1 / d.scale,
-        h = this.source.container;
-      this.bounds = new mxRectangle((c.x - b.x - this.source.panDx) / g, (c.y - b.y - this.source.panDy) / g, h.clientWidth / f, h.clientHeight / f);
-      this.bounds.x += this.source.container.scrollLeft * d.scale / e;
-      this.bounds.y += this.source.container.scrollTop * d.scale / e;
-      c = this.selectionBorder.bounds;
-      if (c.x != this.bounds.x || c.y != this.bounds.y || c.width != this.bounds.width || c.height != this.bounds.height) this.selectionBorder.bounds = this.bounds, this.selectionBorder.redraw();
-      c = this.sizer.bounds;
-      d = new mxRectangle(this.bounds.x + this.bounds.width - c.width / 2, this.bounds.y + this.bounds.height - c.height / 2, c.width, c.height);
-      if (c.x != d.x || c.y != d.y || c.width != d.width || c.height != d.height) this.sizer.bounds = d, "hidden" != this.sizer.node.style.visibility && this.sizer.redraw();
-      a && this.outline.view.revalidate()
-    }
-  }
-};
-mxOutline.prototype.mouseDown = function(a, b) {
-  this.enabled && this.showViewport && (this.zoom = b.isSource(this.sizer), this.startX = b.getX(), this.startY = b.getY(), this.active = !0, this.source.useScrollbarsForPanning && mxUtils.hasScrollbars(
-    this.source.container) ? (this.dx0 = this.source.container.scrollLeft, this.dy0 = this.source.container.scrollTop) : this.dy0 = this.dx0 = 0);
-  b.consume()
-};
-mxOutline.prototype.mouseMove = function(a, b) {
-  if (this.active) {
-    this.selectionBorder.node.style.display = this.showViewport ? "" : "none";
-    this.sizer.node.style.display = this.selectionBorder.node.style.display;
-    var c = b.getX() - this.startX,
-      d = b.getY() - this.startY,
-      e = null;
-    if (this.zoom) e = this.source.container, d = c / (e.clientWidth / e.clientHeight), e = new mxRectangle(this.bounds.x, this.bounds.y, Math.max(1, this.bounds.width + c), Math.max(1, this.bounds
-      .height + d)), this.selectionBorder.bounds = e, this.selectionBorder.redraw();
-    else {
-      var f =
-        this.outline.getView().scale,
-        e = new mxRectangle(this.bounds.x + c, this.bounds.y + d, this.bounds.width, this.bounds.height);
-      this.selectionBorder.bounds = e;
-      this.selectionBorder.redraw();
-      c = c / f * this.source.getView().scale;
-      d = d / f * this.source.getView().scale;
-      this.source.panGraph(-c - this.dx0, -d - this.dy0)
-    }
-    c = this.sizer.bounds;
-    this.sizer.bounds = new mxRectangle(e.x + e.width - c.width / 2, e.y + e.height - c.height / 2, c.width, c.height);
-    "hidden" != this.sizer.node.style.visibility && this.sizer.redraw();
-    b.consume()
-  }
-};
-mxOutline.prototype.mouseUp = function(a, b) {
-  if (this.active) {
-    var c = b.getX() - this.startX,
-      d = b.getY() - this.startY;
-    if (0 < Math.abs(c) || 0 < Math.abs(d)) {
-      if (this.zoom) {
-        var d = this.selectionBorder.bounds.width,
-          e = this.source.getView().scale;
-        this.source.zoomTo(e - c * e / d, !1)
-      } else if (!this.source.useScrollbarsForPanning || !mxUtils.hasScrollbars(this.source.container)) this.source.panGraph(0, 0), c /= this.outline.getView().scale, d /= this.outline.getView().scale,
-        e = this.source.getView().translate, this.source.getView().setTranslate(e.x -
-          c, e.y - d);
-      this.update();
-      b.consume()
-    }
-    this.index = null;
-    this.active = !1
-  }
-};
-mxOutline.prototype.destroy = function() {
-  null != this.source && (this.source.removeListener(this.panHandler), this.source.removeListener(this.refreshHandler), this.source.getModel().removeListener(this.updateHandler), this.source.getView()
-    .removeListener(this.updateHandler), mxEvent.addListener(this.source.container, "scroll", this.updateHandler), this.source = null);
-  null != this.outline && (this.outline.removeMouseListener(this), this.outline.destroy(), this.outline = null);
-  null != this.selectionBorder && (this.selectionBorder.destroy(),
-    this.selectionBorder = null);
-  null != this.sizer && (this.sizer.destroy(), this.sizer = null)
-};
-
-function mxMultiplicity(a, b, c, d, e, f, g, h, k, l) {
-  this.source = a;
-  this.type = b;
-  this.attr = c;
-  this.value = d;
-  this.min = null != e ? e : 0;
-  this.max = null != f ? f : "n";
-  this.validNeighbors = g;
-  this.countError = mxResources.get(h) || h;
-  this.typeError = mxResources.get(k) || k;
-  this.validNeighborsAllowed = null != l ? l : !0
-}
-mxMultiplicity.prototype.type = null;
-mxMultiplicity.prototype.attr = null;
-mxMultiplicity.prototype.value = null;
-mxMultiplicity.prototype.source = null;
-mxMultiplicity.prototype.min = null;
-mxMultiplicity.prototype.max = null;
-mxMultiplicity.prototype.validNeighbors = null;
-mxMultiplicity.prototype.validNeighborsAllowed = !0;
-mxMultiplicity.prototype.countError = null;
-mxMultiplicity.prototype.typeError = null;
-mxMultiplicity.prototype.check = function(a, b, c, d, e, f) {
-  var g = "";
-  if (this.source && this.checkTerminal(a, c, b) || !this.source && this.checkTerminal(a, d, b)) {
-    if (null != this.countError && (this.source && (0 == this.max || e >= this.max) || !this.source && (0 == this.max || f >= this.max))) g += this.countError + "\n";
-    null != this.validNeighbors && (null != this.typeError && 0 < this.validNeighbors.length) && (this.checkNeighbors(a, b, c, d) || (g += this.typeError + "\n"))
-  }
-  return 0 < g.length ? g : null
-};
-mxMultiplicity.prototype.checkNeighbors = function(a, b, c, d) {
-  b = a.model.getValue(c);
-  d = a.model.getValue(d);
-  c = !this.validNeighborsAllowed;
-  for (var e = this.validNeighbors, f = 0; f < e.length; f++)
-    if (this.source && this.checkType(a, d, e[f])) {
-      c = this.validNeighborsAllowed;
-      break
-    } else if (!this.source && this.checkType(a, b, e[f])) {
-    c = this.validNeighborsAllowed;
-    break
-  }
-  return c
-};
-mxMultiplicity.prototype.checkTerminal = function(a, b, c) {
-  b = a.model.getValue(b);
-  return this.checkType(a, b, this.type, this.attr, this.value)
-};
-mxMultiplicity.prototype.checkType = function(a, b, c, d, e) {
-  return null != b ? isNaN(b.nodeType) ? b == c : mxUtils.isNode(b, c, d, e) : !1
-};
-
-function mxLayoutManager(a) {
-  this.undoHandler = mxUtils.bind(this, function(a, c) {
-    this.isEnabled() && this.beforeUndo(c.getProperty("edit"))
-  });
-  this.moveHandler = mxUtils.bind(this, function(a, c) {
-    this.isEnabled() && this.cellsMoved(c.getProperty("cells"), c.getProperty("event"))
-  });
-  this.setGraph(a)
-}
-mxLayoutManager.prototype = new mxEventSource;
-mxLayoutManager.prototype.constructor = mxLayoutManager;
-mxLayoutManager.prototype.graph = null;
-mxLayoutManager.prototype.bubbling = !0;
-mxLayoutManager.prototype.enabled = !0;
-mxLayoutManager.prototype.updateHandler = null;
-mxLayoutManager.prototype.moveHandler = null;
-mxLayoutManager.prototype.isEnabled = function() {
-  return this.enabled
-};
-mxLayoutManager.prototype.setEnabled = function(a) {
-  this.enabled = a
-};
-mxLayoutManager.prototype.isBubbling = function() {
-  return this.bubbling
-};
-mxLayoutManager.prototype.setBubbling = function(a) {
-  this.bubbling = a
-};
-mxLayoutManager.prototype.getGraph = function() {
-  return this.graph
-};
-mxLayoutManager.prototype.setGraph = function(a) {
-  if (null != this.graph) {
-    var b = this.graph.getModel();
-    b.removeListener(this.undoHandler);
-    this.graph.removeListener(this.moveHandler)
-  }
-  this.graph = a;
-  null != this.graph && (b = this.graph.getModel(), b.addListener(mxEvent.BEFORE_UNDO, this.undoHandler), this.graph.addListener(mxEvent.MOVE_CELLS, this.moveHandler))
-};
-mxLayoutManager.prototype.getLayout = function(a) {
-  return null
-};
-mxLayoutManager.prototype.beforeUndo = function(a) {
-  a = this.getCellsForChanges(a.changes);
-  var b = this.getGraph().getModel();
-  if (this.isBubbling())
-    for (var c = b.getParents(a); 0 < c.length;) a = a.concat(c), c = b.getParents(c);
-  this.layoutCells(mxUtils.sortCells(a, !1))
-};
-mxLayoutManager.prototype.cellsMoved = function(a, b) {
-  if (null != a && null != b)
-    for (var c = mxUtils.convertPoint(this.getGraph().container, mxEvent.getClientX(b), mxEvent.getClientY(b)), d = this.getGraph().getModel(), e = 0; e < a.length; e++) {
-      var f = this.getLayout(d.getParent(a[e]));
-      null != f && f.moveCell(a[e], c.x, c.y)
-    }
-};
-mxLayoutManager.prototype.getCellsForChanges = function(a) {
-  for (var b = [], c = {}, d = 0; d < a.length; d++) {
-    var e = a[d];
-    if (e instanceof mxRootChange) return [];
-    for (var e = this.getCellsForChange(e), f = 0; f < e.length; f++)
-      if (null != e[f]) {
-        var g = mxCellPath.create(e[f]);
-        null == c[g] && (c[g] = e[f], b.push(e[f]))
-      }
-  }
-  return b
-};
-mxLayoutManager.prototype.getCellsForChange = function(a) {
-  var b = this.getGraph().getModel();
-  return a instanceof mxChildChange ? [a.child, a.previous, b.getParent(a.child)] : a instanceof mxTerminalChange || a instanceof mxGeometryChange ? [a.cell, b.getParent(a.cell)] : []
-};
-mxLayoutManager.prototype.layoutCells = function(a) {
-  if (0 < a.length) {
-    var b = this.getGraph().getModel();
-    b.beginUpdate();
-    try {
-      for (var c = null, d = 0; d < a.length; d++) a[d] != b.getRoot() && a[d] != c && (c = a[d], this.executeLayout(this.getLayout(c), c));
-      this.fireEvent(new mxEventObject(mxEvent.LAYOUT_CELLS, "cells", a))
-    } finally {
-      b.endUpdate()
-    }
-  }
-};
-mxLayoutManager.prototype.executeLayout = function(a, b) {
-  null != a && null != b && a.execute(b)
-};
-mxLayoutManager.prototype.destroy = function() {
-  this.setGraph(null)
-};
-
-function mxSpaceManager(a, b, c, d) {
-  this.resizeHandler = mxUtils.bind(this, function(a, b) {
-    this.isEnabled() && this.cellsResized(b.getProperty("cells"))
-  });
-  this.foldHandler = mxUtils.bind(this, function(a, b) {
-    this.isEnabled() && this.cellsResized(b.getProperty("cells"))
-  });
-  this.shiftRightwards = null != b ? b : !0;
-  this.shiftDownwards = null != c ? c : !0;
-  this.extendParents = null != d ? d : !0;
-  this.setGraph(a)
-}
-mxSpaceManager.prototype = new mxEventSource;
-mxSpaceManager.prototype.constructor = mxSpaceManager;
-mxSpaceManager.prototype.graph = null;
-mxSpaceManager.prototype.enabled = !0;
-mxSpaceManager.prototype.shiftRightwards = !0;
-mxSpaceManager.prototype.shiftDownwards = !0;
-mxSpaceManager.prototype.extendParents = !0;
-mxSpaceManager.prototype.resizeHandler = null;
-mxSpaceManager.prototype.foldHandler = null;
-mxSpaceManager.prototype.isCellIgnored = function(a) {
-  return !this.getGraph().getModel().isVertex(a)
-};
-mxSpaceManager.prototype.isCellShiftable = function(a) {
-  return this.getGraph().getModel().isVertex(a) && this.getGraph().isCellMovable(a)
-};
-mxSpaceManager.prototype.isEnabled = function() {
-  return this.enabled
-};
-mxSpaceManager.prototype.setEnabled = function(a) {
-  this.enabled = a
-};
-mxSpaceManager.prototype.isShiftRightwards = function() {
-  return this.shiftRightwards
-};
-mxSpaceManager.prototype.setShiftRightwards = function(a) {
-  this.shiftRightwards = a
-};
-mxSpaceManager.prototype.isShiftDownwards = function() {
-  return this.shiftDownwards
-};
-mxSpaceManager.prototype.setShiftDownwards = function(a) {
-  this.shiftDownwards = a
-};
-mxSpaceManager.prototype.isExtendParents = function() {
-  return this.extendParents
-};
-mxSpaceManager.prototype.setExtendParents = function(a) {
-  this.extendParents = a
-};
-mxSpaceManager.prototype.getGraph = function() {
-  return this.graph
-};
-mxSpaceManager.prototype.setGraph = function(a) {
-  null != this.graph && (this.graph.removeListener(this.resizeHandler), this.graph.removeListener(this.foldHandler));
-  this.graph = a;
-  null != this.graph && (this.graph.addListener(mxEvent.RESIZE_CELLS, this.resizeHandler), this.graph.addListener(mxEvent.FOLD_CELLS, this.foldHandler))
-};
-mxSpaceManager.prototype.cellsResized = function(a) {
-  if (null != a) {
-    var b = this.graph.getModel();
-    b.beginUpdate();
-    try {
-      for (var c = 0; c < a.length; c++)
-        if (!this.isCellIgnored(a[c])) {
-          this.cellResized(a[c]);
-          break
-        }
-    } finally {
-      b.endUpdate()
-    }
-  }
-};
-mxSpaceManager.prototype.cellResized = function(a) {
-  var b = this.getGraph(),
-    c = b.getView(),
-    d = b.getModel(),
-    e = c.getState(a),
-    f = c.getState(d.getParent(a));
-  if (null != e && null != f) {
-    var g = this.getCellsToShift(e),
-      h = d.getGeometry(a);
-    if (null != g && null != h) {
-      var k = c.translate,
-        l = c.scale,
-        c = e.x - f.origin.x - k.x * l,
-        f = e.y - f.origin.y - k.y * l,
-        k = e.x + e.width,
-        m = e.y + e.height,
-        n = e.width - h.width * l + c - h.x * l,
-        p = e.height - h.height * l + f - h.y * l,
-        q = 1 - h.width * l / e.width,
-        e = 1 - h.height * l / e.height;
-      d.beginUpdate();
-      try {
-        for (h = 0; h < g.length; h++) g[h] != a && this.isCellShiftable(g[h]) &&
-          this.shiftCell(g[h], n, p, c, f, k, m, q, e, this.isExtendParents() && b.isExtendParent(g[h]))
-      } finally {
-        d.endUpdate()
-      }
-    }
-  }
-};
-mxSpaceManager.prototype.shiftCell = function(a, b, c, d, e, f, g, h, k, l) {
-  d = this.getGraph();
-  var m = d.getView().getState(a);
-  if (null != m) {
-    var n = d.getModel(),
-      p = n.getGeometry(a);
-    if (null != p) {
-      n.beginUpdate();
-      try {
-        if (this.isShiftRightwards())
-          if (m.x >= f) p = p.clone(), p.translate(-b, 0);
-          else {
-            var q = Math.max(0, m.x - x0),
-              p = p.clone();
-            p.translate(-h * q, 0)
-          }
-        if (this.isShiftDownwards())
-          if (m.y >= g) p = p.clone(), p.translate(0, -c);
-          else {
-            var s = Math.max(0, m.y - e),
-              p = p.clone();
-            p.translate(0, -k * s)
-          }
-        p != n.getGeometry(a) && (n.setGeometry(a, p), l && d.extendParent(a))
-      } finally {
-        n.endUpdate()
-      }
-    }
-  }
-};
-mxSpaceManager.prototype.getCellsToShift = function(a) {
-  var b = this.getGraph(),
-    c = b.getModel().getParent(a.cell),
-    d = this.isShiftDownwards(),
-    e = this.isShiftRightwards();
-  return b.getCellsBeyond(a.x + (d ? 0 : a.width), a.y + (d && e ? 0 : a.height), c, e, d)
-};
-mxSpaceManager.prototype.destroy = function() {
-  this.setGraph(null)
-};
-
-function mxSwimlaneManager(a, b, c, d) {
-  this.horizontal = null != b ? b : !0;
-  this.addEnabled = null != c ? c : !0;
-  this.resizeEnabled = null != d ? d : !0;
-  this.addHandler = mxUtils.bind(this, function(a, b) {
-    this.isEnabled() && this.isAddEnabled() && this.cellsAdded(b.getProperty("cells"))
-  });
-  this.resizeHandler = mxUtils.bind(this, function(a, b) {
-    this.isEnabled() && this.isResizeEnabled() && this.cellsResized(b.getProperty("cells"))
-  });
-  this.setGraph(a)
-}
-mxSwimlaneManager.prototype = new mxEventSource;
-mxSwimlaneManager.prototype.constructor = mxSwimlaneManager;
-mxSwimlaneManager.prototype.graph = null;
-mxSwimlaneManager.prototype.enabled = !0;
-mxSwimlaneManager.prototype.horizontal = !0;
-mxSwimlaneManager.prototype.addEnabled = !0;
-mxSwimlaneManager.prototype.resizeEnabled = !0;
-mxSwimlaneManager.prototype.addHandler = null;
-mxSwimlaneManager.prototype.resizeHandler = null;
-mxSwimlaneManager.prototype.isEnabled = function() {
-  return this.enabled
-};
-mxSwimlaneManager.prototype.setEnabled = function(a) {
-  this.enabled = a
-};
-mxSwimlaneManager.prototype.isHorizontal = function() {
-  return this.horizontal
-};
-mxSwimlaneManager.prototype.setHorizontal = function(a) {
-  this.horizontal = a
-};
-mxSwimlaneManager.prototype.isAddEnabled = function() {
-  return this.addEnabled
-};
-mxSwimlaneManager.prototype.setAddEnabled = function(a) {
-  this.addEnabled = a
-};
-mxSwimlaneManager.prototype.isResizeEnabled = function() {
-  return this.resizeEnabled
-};
-mxSwimlaneManager.prototype.setResizeEnabled = function(a) {
-  this.resizeEnabled = a
-};
-mxSwimlaneManager.prototype.getGraph = function() {
-  return this.graph
-};
-mxSwimlaneManager.prototype.setGraph = function(a) {
-  null != this.graph && (this.graph.removeListener(this.addHandler), this.graph.removeListener(this.resizeHandler));
-  this.graph = a;
-  null != this.graph && (this.graph.addListener(mxEvent.ADD_CELLS, this.addHandler), this.graph.addListener(mxEvent.CELLS_RESIZED, this.resizeHandler))
-};
-mxSwimlaneManager.prototype.isSwimlaneIgnored = function(a) {
-  return !this.getGraph().isSwimlane(a)
-};
-mxSwimlaneManager.prototype.isCellHorizontal = function(a) {
-  if (this.graph.isSwimlane(a)) {
-    var b = this.graph.view.getState(a);
-    a = null != b ? b.style : this.graph.getCellStyle(a);
-    return 1 == mxUtils.getValue(a, mxConstants.STYLE_HORIZONTAL, 1)
-  }
-  return !this.isHorizontal()
-};
-mxSwimlaneManager.prototype.cellsAdded = function(a) {
-  if (null != a) {
-    var b = this.getGraph().getModel();
-    b.beginUpdate();
-    try {
-      for (var c = 0; c < a.length; c++) this.isSwimlaneIgnored(a[c]) || this.swimlaneAdded(a[c])
-    } finally {
-      b.endUpdate()
-    }
-  }
-};
-mxSwimlaneManager.prototype.swimlaneAdded = function(a) {
-  for (var b = this.getGraph().getModel(), c = b.getParent(a), d = b.getChildCount(c), e = null, f = 0; f < d; f++) {
-    var g = b.getChildAt(c, f);
-    if (g != a && !this.isSwimlaneIgnored(g) && (e = b.getGeometry(g), null != e)) break
-  }
-  null != e && this.resizeSwimlane(a, e.width, e.height)
-};
-mxSwimlaneManager.prototype.cellsResized = function(a) {
-  if (null != a) {
-    var b = this.getGraph().getModel();
-    b.beginUpdate();
-    try {
-      for (var c = 0; c < a.length; c++)
-        if (!this.isSwimlaneIgnored(a[c])) {
-          var d = b.getGeometry(a[c]);
-          if (null != d) {
-            for (var e = new mxRectangle(0, 0, d.width, d.height), f = a[c], g = f; null != g;) {
-              var f = g,
-                g = b.getParent(g),
-                h = this.graph.isSwimlane(g) ? this.graph.getStartSize(g) : new mxRectangle;
-              e.width += h.width;
-              e.height += h.height
-            }
-            this.resizeSwimlane(f, e.width, e.height)
-          }
-        }
-    } finally {
-      b.endUpdate()
-    }
-  }
-};
-mxSwimlaneManager.prototype.resizeSwimlane = function(a, b, c) {
-  var d = this.getGraph().getModel();
-  d.beginUpdate();
-  try {
-    if (!this.isSwimlaneIgnored(a)) {
-      var e = d.getGeometry(a);
-      if (null != e) {
-        var f = this.isCellHorizontal(a);
-        if (f && e.height != c || !f && e.width != b) e = e.clone(), f ? e.height = c : e.width = b, d.setGeometry(a, e)
-      }
-    }
-    var g = this.graph.isSwimlane(a) ? this.graph.getStartSize(a) : new mxRectangle;
-    b -= g.width;
-    c -= g.height;
-    for (var h = d.getChildCount(a), e = 0; e < h; e++) {
-      var k = d.getChildAt(a, e);
-      this.resizeSwimlane(k, b, c)
-    }
-  } finally {
-    d.endUpdate()
-  }
-};
-mxSwimlaneManager.prototype.destroy = function() {
-  this.setGraph(null)
-};
-
-function mxTemporaryCellStates(a, b, c) {
-  this.view = a;
-  b = null != b ? b : 1;
-  this.oldBounds = a.getGraphBounds();
-  this.oldStates = a.getStates();
-  this.oldScale = a.getScale();
-  a.setStates(new mxDictionary);
-  a.setScale(b);
-  if (null != c) {
-    b = a.createState(new mxCell);
-    for (var d = 0; d < c.length; d++) a.validateBounds(b, c[d]);
-    for (var e = null, d = 0; d < c.length; d++) {
-      var f = a.validatePoints(b, c[d]);
-      null == e ? e = f : e.add(f)
-    }
-    null == e && (e = new mxRectangle);
-    a.setGraphBounds(e)
-  }
-}
-mxTemporaryCellStates.prototype.view = null;
-mxTemporaryCellStates.prototype.oldStates = null;
-mxTemporaryCellStates.prototype.oldBounds = null;
-mxTemporaryCellStates.prototype.oldScale = null;
-mxTemporaryCellStates.prototype.destroy = function() {
-  this.view.setScale(this.oldScale);
-  this.view.setStates(this.oldStates);
-  this.view.setGraphBounds(this.oldBounds)
-};
-
-function mxCellStatePreview(a) {
-  this.graph = a;
-  this.deltas = {}
-}
-mxCellStatePreview.prototype.graph = null;
-mxCellStatePreview.prototype.deltas = null;
-mxCellStatePreview.prototype.count = 0;
-mxCellStatePreview.prototype.isEmpty = function() {
-  return 0 == this.count
-};
-mxCellStatePreview.prototype.moveState = function(a, b, c, d, e) {
-  d = null != d ? d : !0;
-  e = null != e ? e : !0;
-  var f = mxCellPath.create(a.cell),
-    g = this.deltas[f];
-  null == g ? (g = new mxPoint(b, c), this.deltas[f] = g, this.count++) : d ? (g.X += b, g.Y += c) : (g.X = b, g.Y = c);
-  e && this.addEdges(a);
-  return g
-};
-mxCellStatePreview.prototype.show = function(a) {
-  var b = this.graph.getModel(),
-    c = b.getRoot(),
-    d;
-  for (d in this.deltas) {
-    var e = mxCellPath.resolve(c, d),
-      f = this.graph.view.getState(e),
-      g = this.deltas[d],
-      e = this.graph.view.getState(b.getParent(e));
-    this.translateState(e, f, g.x, g.y)
-  }
-  for (d in this.deltas) e = mxCellPath.resolve(c, d), f = this.graph.view.getState(e), g = this.deltas[d], e = this.graph.view.getState(b.getParent(e)), this.revalidateState(e, f, g.x, g.y, a)
-};
-mxCellStatePreview.prototype.translateState = function(a, b, c, d) {
-  if (null != b) {
-    var e = this.graph.getModel();
-    if (e.isVertex(b.cell)) {
-      b.invalid = !0;
-      this.graph.view.validateBounds(a, b.cell);
-      a = e.getGeometry(b.cell);
-      var f = mxCellPath.create(b.cell);
-      if ((0 != c || 0 != d) && null != a && (!a.relative || null != this.deltas[f])) b.x += c, b.y += d
-    }
-    a = e.getChildCount(b.cell);
-    for (f = 0; f < a; f++) this.translateState(b, this.graph.view.getState(e.getChildAt(b.cell, f)), c, d)
-  }
-};
-mxCellStatePreview.prototype.revalidateState = function(a, b, c, d, e) {
-  if (null != b) {
-    b.invalid = !0;
-    this.graph.view.validatePoints(a, b.cell);
-    var f = mxCellPath.create(b.cell),
-      g = this.graph.getModel(),
-      h = this.graph.getCellGeometry(b.cell);
-    if ((0 != c || 0 != d) && null != h && h.relative && g.isVertex(b.cell) && (null == a || g.isVertex(a.cell) || null != this.deltas[f])) b.x += c, b.y += d, this.graph.cellRenderer.redraw(b);
-    null != e && e(b);
-    a = g.getChildCount(b.cell);
-    for (f = 0; f < a; f++) this.revalidateState(b, this.graph.view.getState(g.getChildAt(b.cell,
-      f)), c, d, e)
-  }
-};
-mxCellStatePreview.prototype.addEdges = function(a) {
-  for (var b = this.graph.getModel(), c = b.getEdgeCount(a.cell), d = 0; d < c; d++) {
-    var e = this.graph.view.getState(b.getEdgeAt(a.cell, d));
-    null != e && this.moveState(e, 0, 0)
-  }
-};
-
-function mxConnectionConstraint(a, b) {
-  this.point = a;
-  this.perimeter = null != b ? b : !0
-}
-mxConnectionConstraint.prototype.point = null;
-mxConnectionConstraint.prototype.perimeter = null;
-
-function mxGraphHandler(a) {
-  this.graph = a;
-  this.graph.addMouseListener(this);
-  this.panHandler = mxUtils.bind(this, function() {
-    this.updatePreviewShape()
-  });
-  this.graph.addListener(mxEvent.PAN, this.panHandler)
-}
-mxGraphHandler.prototype.graph = null;
-mxGraphHandler.prototype.maxCells = mxClient.IS_IE ? 20 : 50;
-mxGraphHandler.prototype.enabled = !0;
-mxGraphHandler.prototype.highlightEnabled = !0;
-mxGraphHandler.prototype.cloneEnabled = !0;
-mxGraphHandler.prototype.moveEnabled = !0;
-mxGraphHandler.prototype.guidesEnabled = !1;
-mxGraphHandler.prototype.guide = null;
-mxGraphHandler.prototype.currentDx = null;
-mxGraphHandler.prototype.currentDy = null;
-mxGraphHandler.prototype.updateCursor = !0;
-mxGraphHandler.prototype.selectEnabled = !0;
-mxGraphHandler.prototype.removeCellsFromParent = !0;
-mxGraphHandler.prototype.connectOnDrop = !1;
-mxGraphHandler.prototype.scrollOnMove = !0;
-mxGraphHandler.prototype.minimumSize = 6;
-mxGraphHandler.prototype.previewColor = "black";
-mxGraphHandler.prototype.htmlPreview = !1;
-mxGraphHandler.prototype.shape = null;
-mxGraphHandler.prototype.scaleGrid = !1;
-mxGraphHandler.prototype.rotationEnabled = !0;
-mxGraphHandler.prototype.isEnabled = function() {
-  return this.enabled
-};
-mxGraphHandler.prototype.setEnabled = function(a) {
-  this.enabled = a
-};
-mxGraphHandler.prototype.isCloneEnabled = function() {
-  return this.cloneEnabled
-};
-mxGraphHandler.prototype.setCloneEnabled = function(a) {
-  this.cloneEnabled = a
-};
-mxGraphHandler.prototype.isMoveEnabled = function() {
-  return this.moveEnabled
-};
-mxGraphHandler.prototype.setMoveEnabled = function(a) {
-  this.moveEnabled = a
-};
-mxGraphHandler.prototype.isSelectEnabled = function() {
-  return this.selectEnabled
-};
-mxGraphHandler.prototype.setSelectEnabled = function(a) {
-  this.selectEnabled = a
-};
-mxGraphHandler.prototype.isRemoveCellsFromParent = function() {
-  return this.removeCellsFromParent
-};
-mxGraphHandler.prototype.setRemoveCellsFromParent = function(a) {
-  this.removeCellsFromParent = a
-};
-mxGraphHandler.prototype.getInitialCellForEvent = function(a) {
-  return a.getCell()
-};
-mxGraphHandler.prototype.isDelayedSelection = function(a) {
-  return this.graph.isCellSelected(a)
-};
-mxGraphHandler.prototype.mouseDown = function(a, b) {
-  if (!b.isConsumed() && this.isEnabled() && this.graph.isEnabled() && !this.graph.isForceMarqueeEvent(b.getEvent()) && null != b.getState()) {
-    var c = this.getInitialCellForEvent(b);
-    this.cell = null;
-    this.delayedSelection = this.isDelayedSelection(c);
-    this.isSelectEnabled() && !this.delayedSelection && this.graph.selectCellForEvent(c, b.getEvent());
-    if (this.isMoveEnabled()) {
-      var d = this.graph.model,
-        e = d.getGeometry(c);
-      this.graph.isCellMovable(c) && (!d.isEdge(c) || 1 < this.graph.getSelectionCount() ||
-        null != e.points && 0 < e.points.length || null == d.getTerminal(c, !0) || null == d.getTerminal(c, !1) || this.graph.allowDanglingEdges || this.graph.isCloneEvent(b.getEvent()) && this.graph
-        .isCellsCloneable()) && this.start(c, b.getX(), b.getY());
-      this.cellWasClicked = !0;
-      !mxClient.IS_SF && !mxClient.IS_GC || "SELECT" != b.getSource().nodeName ? b.consume() : mxClient.IS_SF && "SELECT" == b.getSource().nodeName && (this.cellWasClicked = !1, this.first = null)
-    }
-  }
-};
-mxGraphHandler.prototype.getGuideStates = function() {
-  var a = this.graph.getDefaultParent(),
-    b = this.graph.getModel(),
-    c = mxUtils.bind(this, function(a) {
-      return null != this.graph.view.getState(a) && b.isVertex(a) && null != b.getGeometry(a) && !b.getGeometry(a).relative
-    });
-  return this.graph.view.getCellStates(b.filterDescendants(c, a))
-};
-mxGraphHandler.prototype.getCells = function(a) {
-  return !this.delayedSelection && this.graph.isCellMovable(a) ? [a] : this.graph.getMovableCells(this.graph.getSelectionCells())
-};
-mxGraphHandler.prototype.getPreviewBounds = function(a) {
-  a = this.getBoundingBox(a);
-  null != a && (a.grow(-1, -1), a.width < this.minimumSize && (a.x -= (this.minimumSize - a.width) / 2, a.width = this.minimumSize), a.height < this.minimumSize && (a.y -= (this.minimumSize - a.height) /
-    2, a.height = this.minimumSize));
-  return a
-};
-mxGraphHandler.prototype.getBoundingBox = function(a) {
-  var b = null;
-  if (null != a && 0 < a.length)
-    for (var c = this.graph.getModel(), d = 0; d < a.length; d++)
-      if (c.isVertex(a[d]) || c.isEdge(a[d])) {
-        var e = this.graph.view.getState(a[d]);
-        if (null != e) {
-          var f = e;
-          c.isVertex(a[d]) && (null != e.shape && null != e.shape.boundingBox) && (f = e.shape.boundingBox);
-          null == b ? b = new mxRectangle(f.x, f.y, f.width, f.height) : b.add(f)
-        }
-      }
-  return b
-};
-mxGraphHandler.prototype.createPreviewShape = function(a) {
-  a = new mxRectangleShape(a, null, this.previewColor);
-  a.isDashed = !0;
-  this.htmlPreview ? (a.dialect = mxConstants.DIALECT_STRICTHTML, a.init(this.graph.container)) : (a.dialect = this.graph.dialect != mxConstants.DIALECT_SVG ? mxConstants.DIALECT_VML : mxConstants.DIALECT_SVG,
-    a.init(this.graph.getView().getOverlayPane()), a.pointerEvents = !1);
-  return a
-};
-mxGraphHandler.prototype.start = function(a, b, c) {
-  this.cell = a;
-  this.first = mxUtils.convertPoint(this.graph.container, b, c);
-  this.cells = this.getCells(this.cell);
-  this.bounds = this.graph.getView().getBounds(this.cells);
-  this.pBounds = this.getPreviewBounds(this.cells);
-  this.guidesEnabled && (this.guide = new mxGuide(this.graph, this.getGuideStates()))
-};
-mxGraphHandler.prototype.useGuidesForEvent = function(a) {
-  return null != this.guide ? this.guide.isEnabledForEvent(a.getEvent()) : !0
-};
-mxGraphHandler.prototype.snap = function(a) {
-  var b = this.scaleGrid ? this.graph.view.scale : 1;
-  a.x = this.graph.snap(a.x / b) * b;
-  a.y = this.graph.snap(a.y / b) * b;
-  return a
-};
-mxGraphHandler.prototype.mouseMove = function(a, b) {
-  var c = this.graph;
-  if (!b.isConsumed() && c.isMouseDown && null != this.cell && null != this.first && null != this.bounds) {
-    var d = mxUtils.convertPoint(c.container, b.getX(), b.getY()),
-      e = d.x - this.first.x,
-      f = d.y - this.first.y,
-      d = c.tolerance;
-    if (null != this.shape || Math.abs(e) > d || Math.abs(f) > d) {
-      null == this.highlight && (this.highlight = new mxCellHighlight(this.graph, mxConstants.DROP_TARGET_COLOR, 3));
-      null == this.shape && (this.shape = this.createPreviewShape(this.bounds));
-      var g = c.isGridEnabledEvent(b.getEvent()),
-        d = !0;
-      if (null != this.guide && this.useGuidesForEvent(b)) f = this.guide.move(this.bounds, new mxPoint(e, f), g), d = !1, e = f.x, f = f.y;
-      else if (g) var h = c.getView().translate,
-        k = c.getView().scale,
-        g = this.bounds.x - (c.snap(this.bounds.x / k - h.x) + h.x) * k,
-        h = this.bounds.y - (c.snap(this.bounds.y / k - h.y) + h.y) * k,
-        f = this.snap(new mxPoint(e, f)),
-        e = f.x - g,
-        f = f.y - h;
-      null != this.guide && d && this.guide.hide();
-      c.isConstrainedEvent(b.getEvent()) && (Math.abs(e) > Math.abs(f) ? f = 0 : e = 0);
-      this.currentDx = e;
-      this.currentDy = f;
-      this.updatePreviewShape();
-      d = null;
-      f = b.getCell();
-      c.isDropEnabled() && this.highlightEnabled && (d = c.getDropTarget(this.cells, b.getEvent(), f));
-      g = d;
-      for (h = c.getModel(); null != g && g != this.cells[0];) g = h.getParent(g);
-      var k = c.isCloneEvent(b.getEvent()) && c.isCellsCloneable() && this.isCloneEnabled(),
-        e = c.getView().getState(d),
-        l = !1;
-      null != e && null == g && (h.getParent(this.cell) != d || k) ? (this.target != d && (this.target = d, this.setHighlightColor(mxConstants.DROP_TARGET_COLOR)), l = !0) : (this.target = null,
-        this.connectOnDrop && (null != f && 1 == this.cells.length && c.getModel().isVertex(f) &&
-          c.isCellConnectable(f)) && (e = c.getView().getState(f), null != e && (c = null == c.getEdgeValidationError(null, this.cell, f) ? mxConstants.VALID_COLOR : mxConstants.INVALID_CONNECT_TARGET_COLOR,
-          this.setHighlightColor(c), l = !0)));
-      null != e && l ? this.highlight.highlight(e) : this.highlight.hide()
-    }
-    b.consume();
-    mxEvent.consume(b.getEvent())
-  } else if ((this.isMoveEnabled() || this.isCloneEnabled()) && this.updateCursor && !b.isConsumed() && null != b.getState() && !c.isMouseDown) e = c.getCursorForCell(b.getCell()), null == e && (c.isEnabled() &&
-      c.isCellMovable(b.getCell())) &&
-    (e = c.getModel().isEdge(b.getCell()) ? mxConstants.CURSOR_MOVABLE_EDGE : mxConstants.CURSOR_MOVABLE_VERTEX), b.getState().setCursor(e), b.consume()
-};
-mxGraphHandler.prototype.updatePreviewShape = function() {
-  null != this.shape && (this.shape.bounds = new mxRectangle(Math.round(this.pBounds.x + this.currentDx - this.graph.panDx), Math.round(this.pBounds.y + this.currentDy - this.graph.panDy), this.pBounds
-    .width, this.pBounds.height), this.shape.redraw())
-};
-mxGraphHandler.prototype.setHighlightColor = function(a) {
-  null != this.highlight && this.highlight.setHighlightColor(a)
-};
-mxGraphHandler.prototype.mouseUp = function(a, b) {
-  if (!b.isConsumed()) {
-    var c = this.graph;
-    if (null != this.cell && null != this.first && null != this.shape && null != this.currentDx && null != this.currentDy) {
-      var d = c.getView().scale,
-        e = c.isCloneEvent(b.getEvent()) && c.isCellsCloneable() && this.isCloneEnabled(),
-        f = this.currentDx / d,
-        d = this.currentDy / d,
-        g = b.getCell();
-      this.connectOnDrop && null == this.target && null != g && c.getModel().isVertex(g) && c.isCellConnectable(g) && c.isEdgeValid(null, this.cell, g) ? c.connectionHandler.connect(this.cell,
-        g, b.getEvent()) : (g = this.target, c.isSplitEnabled() && c.isSplitTarget(g, this.cells, b.getEvent()) ? c.splitEdge(g, this.cells, null, f, d) : this.moveCells(this.cells, f, d, e, this
-        .target, b.getEvent()))
-    } else this.isSelectEnabled() && (this.delayedSelection && null != this.cell) && this.selectDelayed(b)
-  }
-  this.cellWasClicked && b.consume();
-  this.reset()
-};
-mxGraphHandler.prototype.selectDelayed = function(a) {
-  this.graph.selectCellForEvent(this.cell, a.getEvent())
-};
-mxGraphHandler.prototype.reset = function() {
-  this.destroyShapes();
-  this.delayedSelection = this.cellWasClicked = !1;
-  this.target = this.cell = this.first = this.guides = this.currentDy = this.currentDx = null
-};
-mxGraphHandler.prototype.shouldRemoveCellsFromParent = function(a, b, c) {
-  if (this.graph.getModel().isVertex(a)) {
-    a = this.graph.getView().getState(a);
-    c = mxUtils.convertPoint(this.graph.container, mxEvent.getClientX(c), mxEvent.getClientY(c));
-    var d = mxUtils.toRadians(mxUtils.getValue(a.style, mxConstants.STYLE_ROTATION) || 0);
-    if (0 != d) {
-      b = Math.cos(-d);
-      var d = Math.sin(-d),
-        e = new mxPoint(a.getCenterX(), a.getCenterY());
-      c = mxUtils.getRotatedPoint(c, b, d, e)
-    }
-    return null != a && !mxUtils.contains(a, c.x, c.y)
-  }
-  return !1
-};
-mxGraphHandler.prototype.moveCells = function(a, b, c, d, e, f) {
-  d && (a = this.graph.getCloneableCells(a));
-  null == e && (this.isRemoveCellsFromParent() && this.shouldRemoveCellsFromParent(this.graph.getModel().getParent(this.cell), a, f)) && (e = this.graph.getDefaultParent());
-  a = this.graph.moveCells(a, b - this.graph.panDx / this.graph.view.scale, c - this.graph.panDy / this.graph.view.scale, d, e, f);
-  this.isSelectEnabled() && this.scrollOnMove && this.graph.scrollCellToVisible(a[0]);
-  d && this.graph.setSelectionCells(a)
-};
-mxGraphHandler.prototype.destroyShapes = function() {
-  null != this.shape && (this.shape.destroy(), this.shape = null);
-  null != this.guide && (this.guide.destroy(), this.guide = null);
-  null != this.highlight && (this.highlight.destroy(), this.highlight = null)
-};
-mxGraphHandler.prototype.destroy = function() {
-  this.graph.removeMouseListener(this);
-  this.graph.removeListener(this.panHandler);
-  this.destroyShapes()
-};
-
-function mxPanningHandler(a, b) {
-  null != a && (this.graph = a, this.factoryMethod = b, this.graph.addMouseListener(this), this.init())
-}
-mxPanningHandler.prototype = new mxPopupMenu;
-mxPanningHandler.prototype.constructor = mxPanningHandler;
-mxPanningHandler.prototype.graph = null;
-mxPanningHandler.prototype.triggerX = null;
-mxPanningHandler.prototype.triggerY = null;
-mxPanningHandler.prototype.usePopupTrigger = !0;
-mxPanningHandler.prototype.useLeftButtonForPanning = !1;
-mxPanningHandler.prototype.selectOnPopup = !0;
-mxPanningHandler.prototype.clearSelectionOnBackground = !0;
-mxPanningHandler.prototype.ignoreCell = !1;
-mxPanningHandler.prototype.previewEnabled = !0;
-mxPanningHandler.prototype.useGrid = !1;
-mxPanningHandler.prototype.panningEnabled = !0;
-mxPanningHandler.prototype.isPanningEnabled = function() {
-  return this.panningEnabled
-};
-mxPanningHandler.prototype.setPanningEnabled = function(a) {
-  this.panningEnabled = a
-};
-mxPanningHandler.prototype.init = function() {
-  mxPopupMenu.prototype.init.apply(this);
-  mxEvent.addListener(this.div, mxClient.IS_TOUCH ? "touchmove" : "mousemove", mxUtils.bind(this, function(a) {
-    this.graph.tooltipHandler.hide()
-  }))
-};
-mxPanningHandler.prototype.isPanningTrigger = function(a) {
-  var b = a.getEvent();
-  return this.useLeftButtonForPanning && (this.ignoreCell || null == a.getState()) && mxEvent.isLeftMouseButton(b) || mxEvent.isControlDown(b) && mxEvent.isShiftDown(b) || this.usePopupTrigger &&
-    mxEvent.isPopupTrigger(b)
-};
-mxPanningHandler.prototype.mouseDown = function(a, b) {
-  if (!b.isConsumed() && this.isEnabled()) {
-    this.hideMenu();
-    this.dx0 = -this.graph.container.scrollLeft;
-    this.dy0 = -this.graph.container.scrollTop;
-    var c = mxUtils.convertPoint(this.graph.container, b.getX(), b.getY());
-    this.triggerX = c.x;
-    this.triggerY = c.y;
-    this.popupTrigger = this.isPopupTrigger(b);
-    this.panningTrigger = this.isPanningEnabled() && this.isPanningTrigger(b);
-    this.startX = b.getX();
-    this.startY = b.getY();
-    this.panningTrigger && this.consumePanningTrigger(b)
-  }
-};
-mxPanningHandler.prototype.consumePanningTrigger = function(a) {
-  a.consume()
-};
-mxPanningHandler.prototype.mouseMove = function(a, b) {
-  var c = b.getX() - this.startX,
-    d = b.getY() - this.startY;
-  if (this.active) this.previewEnabled && (this.useGrid && (c = this.graph.snap(c), d = this.graph.snap(d)), this.graph.panGraph(c + this.dx0, d + this.dy0)), this.fireEvent(new mxEventObject(
-    mxEvent.PAN, "event", b)), b.consume();
-  else if (this.panningTrigger) {
-    var e = this.active;
-    this.active = Math.abs(c) > this.graph.tolerance || Math.abs(d) > this.graph.tolerance;
-    !e && this.active && this.fireEvent(new mxEventObject(mxEvent.PAN_START,
-      "event", b))
-  }
-};
-mxPanningHandler.prototype.mouseUp = function(a, b) {
-  var c = Math.abs(b.getX() - this.startX),
-    d = Math.abs(b.getY() - this.startY);
-  if (this.active) {
-    if (!this.graph.useScrollbarsForPanning || !mxUtils.hasScrollbars(this.graph.container)) {
-      c = b.getX() - this.startX;
-      d = b.getY() - this.startY;
-      this.useGrid && (c = this.graph.snap(c), d = this.graph.snap(d));
-      var e = this.graph.getView().scale,
-        f = this.graph.getView().translate;
-      this.graph.panGraph(0, 0);
-      this.panGraph(f.x + c / e, f.y + d / e)
-    }
-    this.active = !1;
-    this.fireEvent(new mxEventObject(mxEvent.PAN_END, "event",
-      b));
-    b.consume()
-  } else this.popupTrigger && (c < this.graph.tolerance && d < this.graph.tolerance) && (c = this.getCellForPopupEvent(b), this.graph.isEnabled() && this.selectOnPopup && null != c && !this.graph.isCellSelected(
-    c) ? this.graph.setSelectionCell(c) : this.clearSelectionOnBackground && null == c && this.graph.clearSelection(), this.graph.tooltipHandler.hide(), d = mxUtils.getScrollOrigin(), d = new mxPoint(
-    b.getX() + d.x, b.getY() + d.y), this.popup(d.x + 1, d.y + 1, c, b.getEvent()), b.consume());
-  this.popupTrigger = this.panningTrigger = !1
-};
-mxPanningHandler.prototype.getCellForPopupEvent = function(a) {
-  return a.getCell()
-};
-mxPanningHandler.prototype.panGraph = function(a, b) {
-  this.graph.getView().setTranslate(a, b)
-};
-mxPanningHandler.prototype.destroy = function() {
-  this.graph.removeMouseListener(this);
-  mxPopupMenu.prototype.destroy.apply(this)
-};
-
-function mxCellMarker(a, b, c, d) {
-  mxEventSource.call(this);
-  null != a && (this.graph = a, this.validColor = null != b ? b : mxConstants.DEFAULT_VALID_COLOR, this.invalidColor = null != b ? c : mxConstants.DEFAULT_INVALID_COLOR, this.hotspot = null != d ? d :
-    mxConstants.DEFAULT_HOTSPOT, this.highlight = new mxCellHighlight(a))
-}
-mxUtils.extend(mxCellMarker, mxEventSource);
-mxCellMarker.prototype.graph = null;
-mxCellMarker.prototype.enabled = !0;
-mxCellMarker.prototype.hotspot = mxConstants.DEFAULT_HOTSPOT;
-mxCellMarker.prototype.hotspotEnabled = !1;
-mxCellMarker.prototype.validColor = null;
-mxCellMarker.prototype.invalidColor = null;
-mxCellMarker.prototype.currentColor = null;
-mxCellMarker.prototype.validState = null;
-mxCellMarker.prototype.markedState = null;
-mxCellMarker.prototype.setEnabled = function(a) {
-  this.enabled = a
-};
-mxCellMarker.prototype.isEnabled = function() {
-  return this.enabled
-};
-mxCellMarker.prototype.setHotspot = function(a) {
-  this.hotspot = a
-};
-mxCellMarker.prototype.getHotspot = function() {
-  return this.hotspot
-};
-mxCellMarker.prototype.setHotspotEnabled = function(a) {
-  this.hotspotEnabled = a
-};
-mxCellMarker.prototype.isHotspotEnabled = function() {
-  return this.hotspotEnabled
-};
-mxCellMarker.prototype.hasValidState = function() {
-  return null != this.validState
-};
-mxCellMarker.prototype.getValidState = function() {
-  return this.validState
-};
-mxCellMarker.prototype.getMarkedState = function() {
-  return this.markedState
-};
-mxCellMarker.prototype.reset = function() {
-  this.validState = null;
-  null != this.markedState && (this.markedState = null, this.unmark())
-};
-mxCellMarker.prototype.process = function(a) {
-  var b = null;
-  if (this.isEnabled()) {
-    var b = this.getState(a),
-      c = null != b ? this.isValidState(b) : !1;
-    a = this.getMarkerColor(a.getEvent(), b, c);
-    this.validState = c ? b : null;
-    if (b != this.markedState || a != this.currentColor) this.currentColor = a, null != b && null != this.currentColor ? (this.markedState = b, this.mark()) : null != this.markedState && (this.markedState =
-      null, this.unmark())
-  }
-  return b
-};
-mxCellMarker.prototype.markCell = function(a, b) {
-  var c = this.graph.getView().getState(a);
-  null != c && (this.currentColor = null != b ? b : this.validColor, this.markedState = c, this.mark())
-};
-mxCellMarker.prototype.mark = function() {
-  this.highlight.setHighlightColor(this.currentColor);
-  this.highlight.highlight(this.markedState);
-  this.fireEvent(new mxEventObject(mxEvent.MARK, "state", this.markedState))
-};
-mxCellMarker.prototype.unmark = function() {
-  this.mark()
-};
-mxCellMarker.prototype.isValidState = function(a) {
-  return !0
-};
-mxCellMarker.prototype.getMarkerColor = function(a, b, c) {
-  return c ? this.validColor : this.invalidColor
-};
-mxCellMarker.prototype.getState = function(a) {
-  var b = this.graph.getView();
-  cell = this.getCell(a);
-  b = this.getStateToMark(b.getState(cell));
-  return null != b && this.intersects(b, a) ? b : null
-};
-mxCellMarker.prototype.getCell = function(a) {
-  return a.getCell()
-};
-mxCellMarker.prototype.getStateToMark = function(a) {
-  return a
-};
-mxCellMarker.prototype.intersects = function(a, b) {
-  return this.hotspotEnabled ? mxUtils.intersectsHotspot(a, b.getGraphX(), b.getGraphY(), this.hotspot, mxConstants.MIN_HOTSPOT_SIZE, mxConstants.MAX_HOTSPOT_SIZE) : !0
-};
-mxCellMarker.prototype.destroy = function() {
-  this.graph.getView().removeListener(this.resetHandler);
-  this.graph.getModel().removeListener(this.resetHandler);
-  this.highlight.destroy()
-};
-
-function mxSelectionCellsHandler(a) {
-  mxEventSource.call(this);
-  this.graph = a;
-  this.handlers = new mxDictionary;
-  this.graph.addMouseListener(this);
-  this.refreshHandler = mxUtils.bind(this, function(a, c) {
-    this.isEnabled() && this.refresh()
-  });
-  this.graph.getSelectionModel().addListener(mxEvent.CHANGE, this.refreshHandler);
-  this.graph.getModel().addListener(mxEvent.CHANGE, this.refreshHandler);
-  this.graph.getView().addListener(mxEvent.SCALE, this.refreshHandler);
-  this.graph.getView().addListener(mxEvent.TRANSLATE, this.refreshHandler);
-  this.graph.getView().addListener(mxEvent.SCALE_AND_TRANSLATE, this.refreshHandler);
-  this.graph.getView().addListener(mxEvent.DOWN, this.refreshHandler);
-  this.graph.getView().addListener(mxEvent.UP, this.refreshHandler)
-}
-mxUtils.extend(mxSelectionCellsHandler, mxEventSource);
-mxSelectionCellsHandler.prototype.graph = null;
-mxSelectionCellsHandler.prototype.enabled = !0;
-mxSelectionCellsHandler.prototype.refreshHandler = null;
-mxSelectionCellsHandler.prototype.maxHandlers = 100;
-mxSelectionCellsHandler.prototype.handlers = null;
-mxSelectionCellsHandler.prototype.isEnabled = function() {
-  return this.enabled
-};
-mxSelectionCellsHandler.prototype.setEnabled = function(a) {
-  this.enabled = a
-};
-mxSelectionCellsHandler.prototype.getHandler = function(a) {
-  return this.handlers.get(a)
-};
-mxSelectionCellsHandler.prototype.reset = function() {
-  this.handlers.visit(function(a, b) {
-    b.reset.apply(b)
-  })
-};
-mxSelectionCellsHandler.prototype.refresh = function() {
-  var a = this.handlers;
-  this.handlers = new mxDictionary;
-  for (var b = this.graph.getSelectionCells(), c = 0; c < b.length; c++) {
-    var d = this.graph.view.getState(b[c]);
-    if (null != d) {
-      var e = a.remove(b[c]);
-      null != e && (e.state != d ? (e.destroy(), e = null) : e.redraw());
-      null == e && (e = this.graph.createHandler(d), this.fireEvent(new mxEventObject(mxEvent.ADD, "state", d)));
-      null != e && this.handlers.put(b[c], e)
-    }
-  }
-  a.visit(mxUtils.bind(this, function(a, b) {
-    this.fireEvent(new mxEventObject(mxEvent.REMOVE,
-      "state", b.state));
-    b.destroy()
-  }))
-};
-mxSelectionCellsHandler.prototype.mouseDown = function(a, b) {
-  if (this.graph.isEnabled() && this.isEnabled()) {
-    var c = [a, b];
-    this.handlers.visit(function(a, b) {
-      b.mouseDown.apply(b, c)
-    })
-  }
-};
-mxSelectionCellsHandler.prototype.mouseMove = function(a, b) {
-  if (this.graph.isEnabled() && this.isEnabled()) {
-    var c = [a, b];
-    this.handlers.visit(function(a, b) {
-      b.mouseMove.apply(b, c)
-    })
-  }
-};
-mxSelectionCellsHandler.prototype.mouseUp = function(a, b) {
-  if (this.graph.isEnabled() && this.isEnabled()) {
-    var c = [a, b];
-    this.handlers.visit(function(a, b) {
-      b.mouseUp.apply(b, c)
-    })
-  }
-};
-mxSelectionCellsHandler.prototype.destroy = function() {
-  this.graph.removeMouseListener(this);
-  null != this.refreshHandler && (this.graph.getSelectionModel().removeListener(this.refreshHandler), this.graph.getModel().removeListener(this.refreshHandler), this.graph.getView().removeListener(
-    this.refreshHandler), this.refreshHandler = null)
-};
-
-function mxConnectionHandler(a, b) {
-  mxEventSource.call(this);
-  null != a && (this.graph = a, this.factoryMethod = b, this.init())
-}
-mxUtils.extend(mxConnectionHandler, mxEventSource);
-mxConnectionHandler.prototype.graph = null;
-mxConnectionHandler.prototype.factoryMethod = !0;
-mxConnectionHandler.prototype.moveIconFront = !1;
-mxConnectionHandler.prototype.moveIconBack = !1;
-mxConnectionHandler.prototype.connectImage = null;
-mxConnectionHandler.prototype.targetConnectImage = !1;
-mxConnectionHandler.prototype.enabled = !0;
-mxConnectionHandler.prototype.select = !0;
-mxConnectionHandler.prototype.createTarget = !1;
-mxConnectionHandler.prototype.marker = null;
-mxConnectionHandler.prototype.constraintHandler = null;
-mxConnectionHandler.prototype.error = null;
-mxConnectionHandler.prototype.waypointsEnabled = !1;
-mxConnectionHandler.prototype.tapAndHoldEnabled = !0;
-mxConnectionHandler.prototype.tapAndHoldDelay = 500;
-mxConnectionHandler.prototype.tapAndHoldInProgress = !1;
-mxConnectionHandler.prototype.tapAndHoldValid = !1;
-mxConnectionHandler.prototype.tapAndHoldTolerance = 4;
-mxConnectionHandler.prototype.initialTouchX = 0;
-mxConnectionHandler.prototype.initialTouchY = 0;
-mxConnectionHandler.prototype.ignoreMouseDown = !1;
-mxConnectionHandler.prototype.first = null;
-mxConnectionHandler.prototype.connectIconOffset = new mxPoint(0, mxConstants.TOOLTIP_VERTICAL_OFFSET);
-mxConnectionHandler.prototype.edgeState = null;
-mxConnectionHandler.prototype.changeHandler = null;
-mxConnectionHandler.prototype.drillHandler = null;
-mxConnectionHandler.prototype.mouseDownCounter = 0;
-mxConnectionHandler.prototype.movePreviewAway = mxClient.IS_VML;
-mxConnectionHandler.prototype.isEnabled = function() {
-  return this.enabled
-};
-mxConnectionHandler.prototype.setEnabled = function(a) {
-  this.enabled = a
-};
-mxConnectionHandler.prototype.isCreateTarget = function() {
-  return this.createTarget
-};
-mxConnectionHandler.prototype.setCreateTarget = function(a) {
-  this.createTarget = a
-};
-mxConnectionHandler.prototype.createShape = function() {
-  var a = new mxPolyline([], mxConstants.INVALID_COLOR);
-  a.dialect = this.graph.dialect != mxConstants.DIALECT_SVG ? mxConstants.DIALECT_VML : mxConstants.DIALECT_SVG;
-  a.init(this.graph.getView().getOverlayPane());
-  a.svgStrokeTolerance = 0;
-  a.pointerEvents = !1;
-  a.isDashed = !0;
-  if (this.graph.dialect == mxConstants.DIALECT_SVG) a.node.setAttribute("pointer-events", "none");
-  else {
-    var b = mxUtils.bind(this, function(a) {
-      a = mxUtils.convertPoint(this.graph.container, mxEvent.getClientX(a),
-        mxEvent.getClientY(a));
-      return this.graph.view.getState(this.graph.getCellAt(a.x, a.y))
-    });
-    mxEvent.redirectMouseEvents(a.node, this.graph, b)
-  }
-  return a
-};
-mxConnectionHandler.prototype.init = function() {
-  this.graph.addMouseListener(this);
-  this.marker = this.createMarker();
-  this.constraintHandler = new mxConstraintHandler(this.graph);
-  this.changeHandler = mxUtils.bind(this, function(a) {
-    null != this.iconState && (this.iconState = this.graph.getView().getState(this.iconState.cell));
-    null != this.iconState ? this.redrawIcons(this.icons, this.iconState) : (this.destroyIcons(this.icons), this.previous = null);
-    this.constraintHandler.reset()
-  });
-  this.graph.getModel().addListener(mxEvent.CHANGE,
-    this.changeHandler);
-  this.graph.getView().addListener(mxEvent.SCALE, this.changeHandler);
-  this.graph.getView().addListener(mxEvent.TRANSLATE, this.changeHandler);
-  this.graph.getView().addListener(mxEvent.SCALE_AND_TRANSLATE, this.changeHandler);
-  this.drillHandler = mxUtils.bind(this, function(a) {
-    this.destroyIcons(this.icons)
-  });
-  this.graph.addListener(mxEvent.START_EDITING, this.drillHandler);
-  this.graph.getView().addListener(mxEvent.DOWN, this.drillHandler);
-  this.graph.getView().addListener(mxEvent.UP, this.drillHandler)
-};
-mxConnectionHandler.prototype.isConnectableCell = function(a) {
-  return !0
-};
-mxConnectionHandler.prototype.createMarker = function() {
-  var a = new mxCellMarker(this.graph);
-  a.hotspotEnabled = !0;
-  a.getCell = mxUtils.bind(this, function(b, c) {
-    c = mxCellMarker.prototype.getCell.apply(a, arguments);
-    this.error = null;
-    if (!this.isConnectableCell(c)) return null;
-    null != c ? this.isConnecting() ? null != this.previous && (this.error = this.validateConnection(this.previous.cell, c), null != this.error && 0 == this.error.length && (c = null, this.isCreateTarget() &&
-        (this.error = null))) : this.isValidSource(c) || (c = null) : this.isConnecting() &&
-      (!this.isCreateTarget() && !this.graph.allowDanglingEdges) && (this.error = "");
-    return c
-  });
-  a.isValidState = mxUtils.bind(this, function(b) {
-    return this.isConnecting() ? null == this.error : mxCellMarker.prototype.isValidState.apply(a, arguments)
-  });
-  a.getMarkerColor = mxUtils.bind(this, function(b, c, d) {
-    return null == this.connectImage || this.isConnecting() ? mxCellMarker.prototype.getMarkerColor.apply(a, arguments) : null
-  });
-  a.intersects = mxUtils.bind(this, function(b, c) {
-    return null != this.connectImage || this.isConnecting() ? !0 : mxCellMarker.prototype.intersects.apply(a,
-      arguments)
-  });
-  return a
-};
-mxConnectionHandler.prototype.start = function(a, b, c, d) {
-  this.previous = a;
-  this.first = new mxPoint(b, c);
-  this.edgeState = null != d ? d : this.createEdgeState(null);
-  this.marker.currentColor = this.marker.validColor;
-  this.marker.markedState = a;
-  this.marker.mark();
-  this.fireEvent(new mxEventObject(mxEvent.START, "state", this.previous))
-};
-mxConnectionHandler.prototype.isConnecting = function() {
-  return null != this.first && null != this.shape
-};
-mxConnectionHandler.prototype.isValidSource = function(a) {
-  return this.graph.isValidSource(a)
-};
-mxConnectionHandler.prototype.isValidTarget = function(a) {
-  return !0
-};
-mxConnectionHandler.prototype.validateConnection = function(a, b) {
-  return !this.isValidTarget(b) ? "" : this.graph.getEdgeValidationError(null, a, b)
-};
-mxConnectionHandler.prototype.getConnectImage = function(a) {
-  return this.connectImage
-};
-mxConnectionHandler.prototype.isMoveIconToFrontForState = function(a) {
-  return null != a.text && a.text.node.parentNode == this.graph.container ? !0 : this.moveIconFront
-};
-mxConnectionHandler.prototype.createIcons = function(a) {
-  var b = this.getConnectImage(a);
-  if (null != b && null != a) {
-    this.iconState = a;
-    var c = [],
-      d = new mxRectangle(0, 0, b.width, b.height),
-      e = new mxImageShape(d, b.src, null, null, 0);
-    e.preserveImageAspect = !1;
-    this.isMoveIconToFrontForState(a) ? (e.dialect = mxConstants.DIALECT_STRICTHTML, e.init(this.graph.container)) : (e.dialect = this.graph.dialect == mxConstants.DIALECT_SVG ? mxConstants.DIALECT_SVG :
-      mxConstants.DIALECT_VML, e.init(this.graph.getView().getOverlayPane()), this.moveIconBack &&
-      null != e.node.previousSibling && e.node.parentNode.insertBefore(e.node, e.node.parentNode.firstChild));
-    e.node.style.cursor = mxConstants.CURSOR_CONNECT;
-    var f = mxUtils.bind(this, function() {
-        return null != this.currentState ? this.currentState : a
-      }),
-      b = mxUtils.bind(this, function(a) {
-        mxEvent.isConsumed(a) || (this.icon = e, this.graph.fireMouseEvent(mxEvent.MOUSE_DOWN, new mxMouseEvent(a, f())))
-      });
-    mxEvent.redirectMouseEvents(e.node, this.graph, f, b);
-    c.push(e);
-    this.redrawIcons(c, this.iconState);
-    return c
-  }
-  return null
-};
-mxConnectionHandler.prototype.redrawIcons = function(a, b) {
-  if (null != a && null != a[0] && null != b) {
-    var c = this.getIconPosition(a[0], b);
-    a[0].bounds.x = c.x;
-    a[0].bounds.y = c.y;
-    a[0].redraw()
-  }
-};
-mxConnectionHandler.prototype.getIconPosition = function(a, b) {
-  var c = this.graph.getView().scale,
-    d = b.getCenterX(),
-    e = b.getCenterY();
-  if (this.graph.isSwimlane(b.cell)) {
-    var f = this.graph.getStartSize(b.cell),
-      d = 0 != f.width ? b.x + f.width * c / 2 : d,
-      e = 0 != f.height ? b.y + f.height * c / 2 : e,
-      f = mxUtils.toRadians(mxUtils.getValue(b.style, mxConstants.STYLE_ROTATION) || 0);
-    if (0 != f) var c = Math.cos(f),
-      f = Math.sin(f),
-      g = new mxPoint(b.getCenterX(), b.getCenterY()),
-      e = mxUtils.getRotatedPoint(new mxPoint(d, e), c, f, g),
-      d = e.x,
-      e = e.y
-  }
-  return new mxPoint(d -
-    a.bounds.width / 2, e - a.bounds.height / 2)
-};
-mxConnectionHandler.prototype.destroyIcons = function(a) {
-  if (null != a) {
-    this.iconState = null;
-    for (var b = 0; b < a.length; b++) a[b].destroy()
-  }
-};
-mxConnectionHandler.prototype.isStartEvent = function(a) {
-  return !this.graph.isForceMarqueeEvent(a.getEvent()) && (null != this.constraintHandler.currentFocus && null != this.constraintHandler.currentConstraint || null != this.previous && null == this.error &&
-    (null == this.icons || null != this.icons && null != this.icon))
-};
-mxConnectionHandler.prototype.mouseDown = function(a, b) {
-  this.mouseDownCounter++;
-  if (this.isEnabled() && this.graph.isEnabled() && !b.isConsumed() && !this.isConnecting() && this.isStartEvent(b)) {
-    null != this.constraintHandler.currentConstraint && null != this.constraintHandler.currentFocus && null != this.constraintHandler.currentPoint ? (this.sourceConstraint = this.constraintHandler.currentConstraint,
-      this.previous = this.constraintHandler.currentFocus, this.first = this.constraintHandler.currentPoint.clone()) : this.first = new mxPoint(b.getGraphX(),
-      b.getGraphY());
-    this.edgeState = this.createEdgeState(b);
-    this.mouseDownCounter = 1;
-    this.waypointsEnabled && null == this.shape && (this.waypoints = null, this.shape = this.createShape());
-    if (null == this.previous && null != this.edgeState) {
-      var c = this.graph.getPointForEvent(b.getEvent());
-      this.edgeState.cell.geometry.setTerminalPoint(c, !0)
-    }
-    this.fireEvent(new mxEventObject(mxEvent.START, "state", this.previous));
-    b.consume()
-  } else if (mxClient.IS_TOUCH && this.tapAndHoldEnabled && !this.tapAndHoldInProgress && this.isEnabled() && this.graph.isEnabled() &&
-    !this.isConnecting()) {
-    this.tapAndHoldInProgress = !0;
-    this.initialTouchX = b.getX();
-    this.initialTouchY = b.getY();
-    var d = this.graph.view.getState(this.marker.getCell(b));
-    this.tapAndHoldThread && window.clearTimeout(this.tapAndHoldThread);
-    this.tapAndHoldThread = window.setTimeout(mxUtils.bind(this, function() {
-      this.tapAndHoldValid && this.tapAndHold(b, d);
-      this.tapAndHoldValid = this.tapAndHoldInProgress = !1
-    }), this.tapAndHoldDelay);
-    this.tapAndHoldValid = !0
-  }
-  this.selectedIcon = this.icon;
-  this.icon = null
-};
-mxConnectionHandler.prototype.tapAndHold = function(a, b) {
-  null != b && (this.marker.currentColor = this.marker.validColor, this.marker.markedState = b, this.marker.mark(), this.first = new mxPoint(a.getGraphX(), a.getGraphY()), this.edgeState = this.createEdgeState(
-    a), this.previous = b, this.fireEvent(new mxEventObject(mxEvent.START, "state", this.previous)))
-};
-mxConnectionHandler.prototype.isImmediateConnectSource = function(a) {
-  return !this.graph.isCellMovable(a.cell)
-};
-mxConnectionHandler.prototype.createEdgeState = function(a) {
-  return null
-};
-mxConnectionHandler.prototype.updateCurrentState = function(a) {
-  var b = this.marker.process(a);
-  this.constraintHandler.update(a, null == this.first);
-  this.currentState = b
-};
-mxConnectionHandler.prototype.convertWaypoint = function(a) {
-  var b = this.graph.getView().getScale(),
-    c = this.graph.getView().getTranslate();
-  a.x = a.x / b - c.x;
-  a.y = a.y / b - c.y
-};
-mxConnectionHandler.prototype.mouseMove = function(a, b) {
-  this.tapAndHoldValid && (this.tapAndHoldValid = Math.abs(this.initialTouchX - b.getX()) < this.tapAndHoldTolerance && Math.abs(this.initialTouchY - b.getY()) < this.tapAndHoldTolerance);
-  if (!b.isConsumed() && (this.ignoreMouseDown || null != this.first || !this.graph.isMouseDown)) {
-    !this.isEnabled() && null != this.currentState && (this.destroyIcons(this.icons), this.currentState = null);
-    (null != this.first || this.isEnabled() && this.graph.isEnabled()) && this.updateCurrentState(b);
-    if (null != this.first) {
-      var c = this.graph.getView().scale,
-        c = new mxPoint(this.graph.snap(b.getGraphX() / c) * c, this.graph.snap(b.getGraphY() / c) * c),
-        d = null,
-        e = c;
-      null != this.constraintHandler.currentConstraint && (null != this.constraintHandler.currentFocus && null != this.constraintHandler.currentPoint) && (d = this.constraintHandler.currentConstraint,
-        e = this.constraintHandler.currentPoint.clone());
-      var f = this.first;
-      if (null != this.selectedIcon) {
-        var g = this.selectedIcon.bounds.width,
-          h = this.selectedIcon.bounds.height;
-        null != this.currentState &&
-          this.targetConnectImage ? (g = this.getIconPosition(this.selectedIcon, this.currentState), this.selectedIcon.bounds.x = g.x, this.selectedIcon.bounds.y = g.y) : (g = new mxRectangle(b.getGraphX() +
-            this.connectIconOffset.x, b.getGraphY() + this.connectIconOffset.y, g, h), this.selectedIcon.bounds = g);
-        this.selectedIcon.redraw()
-      }
-      if (null != this.edgeState) {
-        this.edgeState.absolutePoints = [null, null != this.currentState ? null : e];
-        this.graph.view.updateFixedTerminalPoint(this.edgeState, this.previous, !0, this.sourceConstraint);
-        null != this.currentState &&
-          (null == d && (d = this.graph.getConnectionConstraint(this.edgeState, this.previous, !1)), this.edgeState.setAbsoluteTerminalPoint(null, !1), this.graph.view.updateFixedTerminalPoint(this
-            .edgeState, this.currentState, !1, d));
-        f = null;
-        if (null != this.waypoints) {
-          f = [];
-          for (e = 0; e < this.waypoints.length; e++) d = this.waypoints[e].clone(), this.convertWaypoint(d), f[e] = d
-        }
-        this.graph.view.updatePoints(this.edgeState, f, this.previous, this.currentState);
-        this.graph.view.updateFloatingTerminalPoints(this.edgeState, this.previous, this.currentState);
-        e = this.edgeState.absolutePoints[this.edgeState.absolutePoints.length - 1];
-        f = this.edgeState.absolutePoints[0]
-      } else null != this.currentState && null == this.constraintHandler.currentConstraint && (g = this.getTargetPerimeterPoint(this.currentState, b), null != g && (e = g)), null == this.sourceConstraint &&
-        null != this.previous && (g = this.getSourcePerimeterPoint(this.previous, null != this.waypoints && 0 < this.waypoints.length ? this.waypoints[0] : e, b), null != g && (f = g));
-      if (null == this.currentState && this.movePreviewAway) {
-        g = f;
-        null != this.edgeState &&
-          2 < this.edgeState.absolutePoints.length && (d = this.edgeState.absolutePoints[this.edgeState.absolutePoints.length - 2], null != d && (g = d));
-        d = e.x - g.x;
-        g = e.y - g.y;
-        h = Math.sqrt(d * d + g * g);
-        if (0 == h) return;
-        e.x -= 4 * d / h;
-        e.y -= 4 * g / h
-      }
-      if (null == this.shape && (d = Math.abs(c.x - this.first.x), g = Math.abs(c.y - this.first.y), d > this.graph.tolerance || g > this.graph.tolerance)) this.shape = this.createShape(), this.updateCurrentState(
-        b);
-      null != this.shape && (null != this.edgeState ? this.shape.points = this.edgeState.absolutePoints : (c = [f], null != this.waypoints &&
-        (c = c.concat(this.waypoints)), c.push(e), this.shape.points = c), this.drawPreview());
-      mxEvent.consume(b.getEvent());
-      b.consume()
-    } else !this.isEnabled() || !this.graph.isEnabled() ? this.constraintHandler.reset() : this.previous != this.currentState && null == this.edgeState ? (this.destroyIcons(this.icons), this.icons =
-        null, null != this.currentState && null == this.error && (this.icons = this.createIcons(this.currentState), null == this.icons && (this.currentState.setCursor(mxConstants.CURSOR_CONNECT), b
-          .consume())), this.previous = this.currentState) :
-      this.previous == this.currentState && (null != this.currentState && null == this.icons && !this.graph.isMouseDown) && b.consume();
-    null != this.constraintHandler.currentConstraint && this.marker.reset();
-    if (!this.graph.isMouseDown && null != this.currentState && null != this.icons) {
-      c = !1;
-      f = b.getSource();
-      for (e = 0; e < this.icons.length && !c; e++) c = f == this.icons[e].node || f.parentNode == this.icons[e].node;
-      c || this.updateIcons(this.currentState, this.icons, b)
-    }
-  } else this.constraintHandler.reset()
-};
-mxConnectionHandler.prototype.getTargetPerimeterPoint = function(a, b) {
-  var c = null,
-    d = a.view,
-    e = d.getPerimeterFunction(a);
-  if (null != e) {
-    var f = null != this.waypoints && 0 < this.waypoints.length ? this.waypoints[this.waypoints.length - 1] : new mxPoint(this.previous.getCenterX(), this.previous.getCenterY()),
-      d = e(d.getPerimeterBounds(a), this.edgeState, f, !1);
-    null != d && (c = d)
-  } else c = new mxPoint(a.getCenterX(), a.getCenterY());
-  return c
-};
-mxConnectionHandler.prototype.getSourcePerimeterPoint = function(a, b, c) {
-  c = null;
-  var d = a.view,
-    e = d.getPerimeterFunction(a),
-    f = new mxPoint(a.getCenterX(), a.getCenterY());
-  if (null != e) {
-    var g = mxUtils.getValue(a.style, mxConstants.STYLE_ROTATION, 0),
-      h = -g * (Math.PI / 180);
-    0 != g && (b = mxUtils.getRotatedPoint(new mxPoint(b.x, b.y), Math.cos(h), Math.sin(h), f));
-    a = e(d.getPerimeterBounds(a), a, b, !1);
-    null != a && (0 != g && (a = mxUtils.getRotatedPoint(new mxPoint(a.x, a.y), Math.cos(-h), Math.sin(-h), f)), c = a)
-  } else c = f;
-  return c
-};
-mxConnectionHandler.prototype.updateIcons = function(a, b, c) {};
-mxConnectionHandler.prototype.isStopEvent = function(a) {
-  return null != a.getState()
-};
-mxConnectionHandler.prototype.addWaypointForEvent = function(a) {
-  var b = mxUtils.convertPoint(this.graph.container, a.getX(), a.getY()),
-    c = Math.abs(b.x - this.first.x),
-    b = Math.abs(b.y - this.first.y);
-  if (null != this.waypoints || 1 < this.mouseDownCounter && (c > this.graph.tolerance || b > this.graph.tolerance)) null == this.waypoints && (this.waypoints = []), c = this.graph.view.scale, b =
-    new mxPoint(this.graph.snap(a.getGraphX() / c) * c, this.graph.snap(a.getGraphY() / c) * c), this.waypoints.push(b)
-};
-mxConnectionHandler.prototype.mouseUp = function(a, b) {
-  if (!b.isConsumed() && this.isConnecting()) {
-    if (this.waypointsEnabled && !this.isStopEvent(b)) {
-      this.addWaypointForEvent(b);
-      b.consume();
-      return
-    }
-    if (null == this.error) {
-      var c = null != this.previous ? this.previous.cell : null,
-        d = null;
-      null != this.constraintHandler.currentConstraint && null != this.constraintHandler.currentFocus && (d = this.constraintHandler.currentFocus.cell);
-      null == d && this.marker.hasValidState() && (d = this.marker.validState.cell);
-      this.connect(c, d, b.getEvent(),
-        b.getCell())
-    } else null != this.previous && (null != this.marker.validState && this.previous.cell == this.marker.validState.cell) && this.graph.selectCellForEvent(this.marker.source, evt), 0 < this.error.length &&
-      this.graph.validationAlert(this.error);
-    this.destroyIcons(this.icons);
-    b.consume()
-  }
-  null != this.first && this.reset();
-  this.tapAndHoldValid = this.tapAndHoldInProgress = !1
-};
-mxConnectionHandler.prototype.reset = function() {
-  null != this.shape && (this.shape.destroy(), this.shape = null);
-  this.destroyIcons(this.icons);
-  this.icons = null;
-  this.marker.reset();
-  this.constraintHandler.reset();
-  this.sourceConstraint = this.error = this.previous = this.edgeState = this.selectedIcon = null;
-  this.mouseDownCounter = 0;
-  this.icon = this.first = null;
-  this.fireEvent(new mxEventObject(mxEvent.RESET))
-};
-mxConnectionHandler.prototype.drawPreview = function() {
-  var a = null == this.error;
-  this.shape.strokewidth = this.getEdgeWidth(a);
-  a = this.getEdgeColor(a);
-  this.shape.stroke = a;
-  this.shape.redraw()
-};
-mxConnectionHandler.prototype.getEdgeColor = function(a) {
-  return a ? mxConstants.VALID_COLOR : mxConstants.INVALID_COLOR
-};
-mxConnectionHandler.prototype.getEdgeWidth = function(a) {
-  return a ? 3 : 1
-};
-mxConnectionHandler.prototype.connect = function(a, b, c, d) {
-  if (null != b || this.isCreateTarget() || this.graph.allowDanglingEdges) {
-    var e = this.graph.getModel(),
-      f = null;
-    e.beginUpdate();
-    try {
-      if (null != a && (null == b && this.isCreateTarget()) && (b = this.createTargetVertex(c, a), null != b)) {
-        d = this.graph.getDropTarget([b], c, d);
-        if (null == d || !this.graph.getModel().isEdge(d)) {
-          var g = this.graph.getView().getState(d);
-          if (null != g) {
-            var h = e.getGeometry(b);
-            h.x -= g.origin.x;
-            h.y -= g.origin.y
-          }
-        } else d = this.graph.getDefaultParent();
-        this.graph.addCell(b,
-          d)
-      }
-      var k = this.graph.getDefaultParent();
-      null != a && (null != b && e.getParent(a) == e.getParent(b) && e.getParent(e.getParent(a)) != e.getRoot()) && (k = e.getParent(a), null != a.geometry && a.geometry.relative && (null != b.geometry &&
-        b.geometry.relative) && (k = e.getParent(k)));
-      h = g = null;
-      null != this.edgeState && (g = this.edgeState.cell.value, h = this.edgeState.cell.style);
-      f = this.insertEdge(k, null, g, a, b, h);
-      if (null != f) {
-        this.graph.setConnectionConstraint(f, a, !0, this.sourceConstraint);
-        this.graph.setConnectionConstraint(f, b, !1, this.constraintHandler.currentConstraint);
-        null != this.edgeState && e.setGeometry(f, this.edgeState.cell.geometry);
-        var l = e.getGeometry(f);
-        null == l && (l = new mxGeometry, l.relative = !0, e.setGeometry(f, l));
-        if (null != this.waypoints && 0 < this.waypoints.length) {
-          var m = this.graph.view.scale,
-            n = this.graph.view.translate;
-          l.points = [];
-          for (a = 0; a < this.waypoints.length; a++) {
-            var p = this.waypoints[a];
-            l.points.push(new mxPoint(p.x / m - n.x, p.y / m - n.y))
-          }
-        }
-        null == b && (p = this.graph.getPointForEvent(c, !1), p.x -= this.graph.panDx / this.graph.view.scale, p.y -= this.graph.panDy / this.graph.view.scale,
-          l.setTerminalPoint(p, !1));
-        this.fireEvent(new mxEventObject(mxEvent.CONNECT, "cell", f, "event", c, "target", d))
-      }
-    } catch (q) {
-      mxLog.show(), mxLog.debug(q.message)
-    } finally {
-      e.endUpdate()
-    }
-    this.select && this.selectCells(f, b)
-  }
-};
-mxConnectionHandler.prototype.selectCells = function(a, b) {
-  this.graph.setSelectionCell(a)
-};
-mxConnectionHandler.prototype.insertEdge = function(a, b, c, d, e, f) {
-  if (null == this.factoryMethod) return this.graph.insertEdge(a, b, c, d, e, f);
-  b = this.createEdge(c, d, e, f);
-  return b = this.graph.addEdge(b, a, d, e)
-};
-mxConnectionHandler.prototype.createTargetVertex = function(a, b) {
-  for (var c = this.graph.getCellGeometry(b); null != c && c.relative;) b = this.graph.getModel().getParent(b), c = this.graph.getCellGeometry(b);
-  var d = this.graph.cloneCells([b])[0],
-    c = this.graph.getModel().getGeometry(d);
-  if (null != c) {
-    var e = this.graph.getPointForEvent(a);
-    c.x = this.graph.snap(e.x - c.width / 2) - this.graph.panDx / this.graph.view.scale;
-    c.y = this.graph.snap(e.y - c.height / 2) - this.graph.panDy / this.graph.view.scale;
-    if (null != this.first) {
-      var f = this.graph.view.getState(b);
-      if (null != f) {
-        var g = this.getAlignmentTolerance();
-        Math.abs(this.graph.snap(this.first.x) - this.graph.snap(e.x)) <= g ? c.x = f.x : Math.abs(this.graph.snap(this.first.y) - this.graph.snap(e.y)) <= g && (c.y = f.y)
-      }
-    }
-  }
-  return d
-};
-mxConnectionHandler.prototype.getAlignmentTolerance = function() {
-  return this.graph.isGridEnabled() ? this.graph.gridSize : this.graph.tolerance
-};
-mxConnectionHandler.prototype.createEdge = function(a, b, c, d) {
-  var e = null;
-  null != this.factoryMethod && (e = this.factoryMethod(b, c, d));
-  null == e && (e = new mxCell(a || ""), e.setEdge(!0), e.setStyle(d), a = new mxGeometry, a.relative = !0, e.setGeometry(a));
-  return e
-};
-mxConnectionHandler.prototype.destroy = function() {
-  this.graph.removeMouseListener(this);
-  null != this.shape && (this.shape.destroy(), this.shape = null);
-  null != this.marker && (this.marker.destroy(), this.marker = null);
-  null != this.constraintHandler && (this.constraintHandler.destroy(), this.constraintHandler = null);
-  null != this.changeHandler && (this.graph.getModel().removeListener(this.changeHandler), this.graph.getView().removeListener(this.changeHandler), this.changeHandler = null);
-  null != this.drillHandler && (this.graph.removeListener(this.drillHandler),
-    this.graph.getView().removeListener(this.drillHandler), this.drillHandler = null)
-};
-
-function mxConstraintHandler(a) {
-  this.graph = a
-}
-mxConstraintHandler.prototype.pointImage = new mxImage(mxClient.imageBasePath + "/point.gif", 5, 5);
-mxConstraintHandler.prototype.graph = null;
-mxConstraintHandler.prototype.enabled = !0;
-mxConstraintHandler.prototype.highlightColor = mxConstants.DEFAULT_VALID_COLOR;
-mxConstraintHandler.prototype.isEnabled = function() {
-  return this.enabled
-};
-mxConstraintHandler.prototype.setEnabled = function(a) {
-  this.enabled = a
-};
-mxConstraintHandler.prototype.reset = function() {
-  if (null != this.focusIcons) {
-    for (var a = 0; a < this.focusIcons.length; a++) this.focusIcons[a].destroy();
-    this.focusIcons = null
-  }
-  null != this.focusHighlight && (this.focusHighlight.destroy(), this.focusHighlight = null);
-  this.focusPoints = this.currentFocus = this.currentPoint = this.currentFocusArea = this.currentConstraint = null
-};
-mxConstraintHandler.prototype.getTolerance = function() {
-  return this.graph.getTolerance()
-};
-mxConstraintHandler.prototype.getImageForConstraint = function(a, b, c) {
-  return this.pointImage
-};
-mxConstraintHandler.prototype.isEventIgnored = function(a, b) {
-  return !1
-};
-mxConstraintHandler.prototype.update = function(a, b) {
-  if (this.isEnabled() && !this.isEventIgnored(a)) {
-    var c = this.getTolerance(),
-      d = new mxRectangle(a.getGraphX() - c, a.getGraphY() - c, 2 * c, 2 * c),
-      e = null != a.getCell() ? this.graph.isCellConnectable(a.getCell()) : !1;
-    if (null == this.currentFocusArea || !mxUtils.intersects(this.currentFocusArea, d) || null != a.getState() && null != this.currentFocus && e)
-      if (this.currentFocusArea = null, a.getState() != this.currentFocus)
-        if (this.currentFocus = null, this.constraints = null != a.getState() && e ? this.graph.getAllConnectionConstraints(a.getState(),
-            b) : null, null != this.constraints) {
-          this.currentFocus = a.getState();
-          this.currentFocusArea = new mxRectangle(a.getState().x, a.getState().y, a.getState().width, a.getState().height);
-          if (null != this.focusIcons) {
-            for (e = 0; e < this.focusIcons.length; e++) this.focusIcons[e].destroy();
-            this.focusPoints = this.focusIcons = null
-          }
-          this.focusIcons = [];
-          this.focusPoints = [];
-          for (e = 0; e < this.constraints.length; e++) {
-            var f = this.graph.getConnectionPoint(a.getState(), this.constraints[e]),
-              g = this.getImageForConstraint(a.getState(), this.constraints[e],
-                f),
-              h = g.src,
-              g = new mxRectangle(f.x - g.width / 2, f.y - g.height / 2, g.width, g.height),
-              g = new mxImageShape(g, h);
-            g.dialect = this.graph.dialect != mxConstants.DIALECT_SVG ? mxConstants.DIALECT_MIXEDHTML : mxConstants.DIALECT_SVG;
-            g.preserveImageAspect = !1;
-            g.init(this.graph.getView().getOverlayPane());
-            null != g.node.previousSibling && g.node.parentNode.insertBefore(g.node, g.node.parentNode.firstChild);
-            h = mxUtils.bind(this, function() {
-              return null != this.currentFocus ? this.currentFocus : a.getState()
-            });
-            g.redraw();
-            mxEvent.redirectMouseEvents(g.node,
-              this.graph, h);
-            this.currentFocusArea.add(g.bounds);
-            this.focusIcons.push(g);
-            this.focusPoints.push(f)
-          }
-          this.currentFocusArea.grow(c)
-        } else if (null != this.focusIcons) {
-      null != this.focusHighlight && (this.focusHighlight.destroy(), this.focusHighlight = null);
-      for (e = 0; e < this.focusIcons.length; e++) this.focusIcons[e].destroy();
-      this.focusPoints = this.focusIcons = null
-    }
-    this.currentPoint = this.currentConstraint = null;
-    if (null != this.focusIcons && null != this.constraints && (null == a.getState() || this.currentFocus == a.getState()))
-      for (e =
-        0; e < this.focusIcons.length; e++)
-        if (mxUtils.intersects(this.focusIcons[e].bounds, d)) {
-          this.currentConstraint = this.constraints[e];
-          this.currentPoint = this.focusPoints[e];
-          c = this.focusIcons[e].bounds.clone();
-          c.grow(mxClient.IS_IE ? 3 : 2);
-          mxClient.IS_IE && (c.width -= 1, c.height -= 1);
-          null == this.focusHighlight ? (c = new mxRectangleShape(c, null, this.highlightColor, 3), c.dialect = this.graph.dialect == mxConstants.DIALECT_SVG ? mxConstants.DIALECT_SVG : mxConstants
-            .DIALECT_VML, c.init(this.graph.getView().getOverlayPane()), this.focusHighlight =
-            c, h = mxUtils.bind(this, function() {
-              return null != this.currentFocus ? this.currentFocus : a.getState()
-            }), mxEvent.redirectMouseEvents(c.node, this.graph, h)) : (this.focusHighlight.bounds = c, this.focusHighlight.redraw());
-          break
-        }
-    null == this.currentConstraint && null != this.focusHighlight && (this.focusHighlight.destroy(), this.focusHighlight = null)
-  }
-};
-mxConstraintHandler.prototype.destroy = function() {
-  this.reset()
-};
-
-function mxRubberband(a) {
-  null != a && (this.graph = a, this.graph.addMouseListener(this), this.panHandler = mxUtils.bind(this, function() {
-    this.repaint()
-  }), this.graph.addListener(mxEvent.PAN, this.panHandler), mxClient.IS_IE && mxEvent.addListener(window, "unload", mxUtils.bind(this, function() {
-    this.destroy()
-  })))
-}
-mxRubberband.prototype.defaultOpacity = 20;
-mxRubberband.prototype.enabled = !0;
-mxRubberband.prototype.div = null;
-mxRubberband.prototype.sharedDiv = null;
-mxRubberband.prototype.currentX = 0;
-mxRubberband.prototype.currentY = 0;
-mxRubberband.prototype.isEnabled = function() {
-  return this.enabled
-};
-mxRubberband.prototype.setEnabled = function(a) {
-  this.enabled = a
-};
-mxRubberband.prototype.mouseDown = function(a, b) {
-  if (!b.isConsumed() && this.isEnabled() && this.graph.isEnabled() && (this.graph.isForceMarqueeEvent(b.getEvent()) || null == b.getState())) {
-    var c = mxUtils.getOffset(this.graph.container),
-      d = mxUtils.getScrollOrigin(this.graph.container);
-    d.x -= c.x;
-    d.y -= c.y;
-    this.start(b.getX() + d.x, b.getY() + d.y);
-    if (mxClient.IS_NS && !mxClient.IS_SF && !mxClient.IS_GC) {
-      var e = this.graph.container,
-        f = function(a) {
-          a = new mxMouseEvent(a);
-          var b = mxUtils.convertPoint(e, a.getX(), a.getY());
-          a.graphX = b.x;
-          a.graphY = b.y;
-          return a
-        };
-      this.dragHandler = mxUtils.bind(this, function(a) {
-        this.mouseMove(this.graph, f(a))
-      });
-      this.dropHandler = mxUtils.bind(this, function(a) {
-        this.mouseUp(this.graph, f(a))
-      });
-      mxEvent.addListener(document, "mousemove", this.dragHandler);
-      mxEvent.addListener(document, "mouseup", this.dropHandler)
-    }
-    b.consume(!1)
-  }
-};
-mxRubberband.prototype.start = function(a, b) {
-  this.first = new mxPoint(a, b)
-};
-mxRubberband.prototype.mouseMove = function(a, b) {
-  if (!b.isConsumed() && null != this.first) {
-    var c = mxUtils.getScrollOrigin(this.graph.container),
-      d = mxUtils.getOffset(this.graph.container);
-    c.x -= d.x;
-    c.y -= d.y;
-    var d = b.getX() + c.x,
-      c = b.getY() + c.y,
-      e = this.first.x - d,
-      f = this.first.y - c,
-      g = this.graph.tolerance;
-    if (null != this.div || Math.abs(e) > g || Math.abs(f) > g) null == this.div && (this.div = this.createShape()), mxUtils.clearSelection(), this.update(d, c), b.consume()
-  }
-};
-mxRubberband.prototype.createShape = function() {
-  null == this.sharedDiv && (this.sharedDiv = document.createElement("div"), this.sharedDiv.className = "mxRubberband", mxUtils.setOpacity(this.sharedDiv, this.defaultOpacity));
-  this.graph.container.appendChild(this.sharedDiv);
-  return this.sharedDiv
-};
-mxRubberband.prototype.mouseUp = function(a, b) {
-  var c = null != this.div;
-  this.reset();
-  c && (c = new mxRectangle(this.x, this.y, this.width, this.height), this.graph.selectRegion(c, b.getEvent()), b.consume())
-};
-mxRubberband.prototype.reset = function() {
-  null != this.div && this.div.parentNode.removeChild(this.div);
-  null != this.dragHandler && (mxEvent.removeListener(document, "mousemove", this.dragHandler), this.dragHandler = null);
-  null != this.dropHandler && (mxEvent.removeListener(document, "mouseup", this.dropHandler), this.dropHandler = null);
-  this.currentY = this.currentX = 0;
-  this.div = this.first = null
-};
-mxRubberband.prototype.update = function(a, b) {
-  this.currentX = a;
-  this.currentY = b;
-  this.repaint()
-};
-mxRubberband.prototype.repaint = function() {
-  if (null != this.div) {
-    var a = this.currentX - this.graph.panDx,
-      b = this.currentY - this.graph.panDy;
-    this.x = Math.min(this.first.x, a);
-    this.y = Math.min(this.first.y, b);
-    this.width = Math.max(this.first.x, a) - this.x;
-    this.height = Math.max(this.first.y, b) - this.y;
-    a = mxClient.IS_VML ? this.graph.panDy : 0;
-    this.div.style.left = this.x + (mxClient.IS_VML ? this.graph.panDx : 0) + "px";
-    this.div.style.top = this.y + a + "px";
-    this.div.style.width = Math.max(1, this.width) + "px";
-    this.div.style.height = Math.max(1,
-      this.height) + "px"
-  }
-};
-mxRubberband.prototype.destroy = function() {
-  this.destroyed || (this.destroyed = !0, this.graph.removeMouseListener(this), this.graph.removeListener(this.panHandler), this.reset(), null != this.sharedDiv && (this.sharedDiv = null))
-};
-
-function mxVertexHandler(a) {
-  null != a && (this.state = a, this.init())
-}
-mxVertexHandler.prototype.graph = null;
-mxVertexHandler.prototype.state = null;
-mxVertexHandler.prototype.singleSizer = !1;
-mxVertexHandler.prototype.index = null;
-mxVertexHandler.prototype.allowHandleBoundsCheck = !0;
-mxVertexHandler.prototype.handleImage = null;
-mxVertexHandler.prototype.tolerance = 0;
-mxVertexHandler.prototype.rotationEnabled = !1;
-mxVertexHandler.prototype.rotationRaster = !0;
-mxVertexHandler.prototype.init = function() {
-  this.graph = this.state.view.graph;
-  this.selectionBounds = this.getSelectionBounds(this.state);
-  this.bounds = new mxRectangle(this.selectionBounds.x, this.selectionBounds.y, this.selectionBounds.width, this.selectionBounds.height);
-  this.selectionBorder = this.createSelectionShape(this.bounds);
-  this.selectionBorder.dialect = this.graph.dialect != mxConstants.DIALECT_SVG ? mxConstants.DIALECT_VML : mxConstants.DIALECT_SVG;
-  this.selectionBorder.pointerEvents = !1;
-  this.selectionBorder.init(this.graph.getView().getOverlayPane());
-  this.graph.isCellMovable(this.state.cell) && (this.selectionBorder.node.style.cursor = mxConstants.CURSOR_MOVABLE_VERTEX);
-  mxEvent.redirectMouseEvents(this.selectionBorder.node, this.graph, this.state);
-  if (0 >= mxGraphHandler.prototype.maxCells || this.graph.getSelectionCount() < mxGraphHandler.prototype.maxCells) {
-    var a = this.graph.isCellResizable(this.state.cell);
-    this.sizers = [];
-    if (a || this.graph.isLabelMovable(this.state.cell) && 2 <= this.state.width && 2 <= this.state.height) {
-      var b = 0;
-      a && (this.singleSizer || (this.sizers.push(this.createSizer("nw-resize",
-        b++)), this.sizers.push(this.createSizer("n-resize", b++)), this.sizers.push(this.createSizer("ne-resize", b++)), this.sizers.push(this.createSizer("w-resize", b++)), this.sizers.push(
-        this.createSizer("e-resize", b++)), this.sizers.push(this.createSizer("sw-resize", b++)), this.sizers.push(this.createSizer("s-resize", b++))), this.sizers.push(this.createSizer(
-        "se-resize", b++)));
-      a = this.graph.model.getGeometry(this.state.cell);
-      null != a && (!a.relative && !this.graph.isSwimlane(this.state.cell) && this.graph.isLabelMovable(this.state.cell)) &&
-        (this.labelShape = this.createSizer(mxConstants.CURSOR_LABEL_HANDLE, mxEvent.LABEL_HANDLE, mxConstants.LABEL_HANDLE_SIZE, mxConstants.LABEL_HANDLE_FILLCOLOR), this.sizers.push(this.labelShape))
-    } else this.graph.isCellMovable(this.state.cell) && (!this.graph.isCellResizable(this.state.cell) && 2 > this.state.width && 2 > this.state.height) && (this.labelShape = this.createSizer(
-      mxConstants.CURSOR_MOVABLE_VERTEX, null, null, mxConstants.LABEL_HANDLE_FILLCOLOR), this.sizers.push(this.labelShape))
-  }
-  if (this.rotationEnabled && (0 >=
-      mxGraphHandler.prototype.maxCells || this.graph.getSelectionCount() < mxGraphHandler.prototype.maxCells)) this.rotationShape = this.createSizer("pointer", mxEvent.ROTATION_HANDLE, mxConstants
-    .HANDLE_SIZE + 3, mxConstants.HANDLE_FILLCOLOR), this.sizers.push(this.rotationShape);
-  this.redraw()
-};
-mxVertexHandler.prototype.getSelectionBounds = function(a) {
-  return new mxRectangle(Math.round(a.x), Math.round(a.y), Math.round(a.width), Math.round(a.height))
-};
-mxVertexHandler.prototype.createSelectionShape = function(a) {
-  a = new mxRectangleShape(a, null, this.getSelectionColor());
-  a.strokewidth = this.getSelectionStrokeWidth();
-  a.isDashed = this.isSelectionDashed();
-  return a
-};
-mxVertexHandler.prototype.getSelectionColor = function() {
-  return mxConstants.VERTEX_SELECTION_COLOR
-};
-mxVertexHandler.prototype.getSelectionStrokeWidth = function() {
-  return mxConstants.VERTEX_SELECTION_STROKEWIDTH
-};
-mxVertexHandler.prototype.isSelectionDashed = function() {
-  return mxConstants.VERTEX_SELECTION_DASHED
-};
-mxVertexHandler.prototype.createSizer = function(a, b, c, d) {
-  c = c || mxConstants.HANDLE_SIZE;
-  c = new mxRectangle(0, 0, c, c);
-  d = this.createSizerShape(c, b, d);
-  d.isHtmlAllowed() && null != this.state.text && this.state.text.node.parentNode == this.graph.container ? (d.bounds.height -= 1, d.bounds.width -= 1, d.dialect = mxConstants.DIALECT_STRICTHTML, d
-    .init(this.graph.container)) : (d.dialect = this.graph.dialect != mxConstants.DIALECT_SVG ? mxConstants.DIALECT_MIXEDHTML : mxConstants.DIALECT_SVG, d.init(this.graph.getView().getOverlayPane()));
-  mxEvent.redirectMouseEvents(d.node, this.graph, this.state);
-  this.graph.isEnabled() && (d.node.style.cursor = a);
-  this.isSizerVisible(b) || (d.node.style.visibility = "hidden");
-  return d
-};
-mxVertexHandler.prototype.isSizerVisible = function(a) {
-  return !0
-};
-mxVertexHandler.prototype.createSizerShape = function(a, b, c) {
-  return null != this.handleImage ? (a.width = this.handleImage.width, a.height = this.handleImage.height, new mxImageShape(a, this.handleImage.src)) : b == mxEvent.ROTATION_HANDLE ? new mxEllipse(
-    a, c || mxConstants.HANDLE_FILLCOLOR, mxConstants.HANDLE_STROKECOLOR) : new mxRectangleShape(a, c || mxConstants.HANDLE_FILLCOLOR, mxConstants.HANDLE_STROKECOLOR)
-};
-mxVertexHandler.prototype.moveSizerTo = function(a, b, c) {
-  null != a && (a.bounds.x = Math.round(b - a.bounds.width / 2), a.bounds.y = Math.round(c - a.bounds.height / 2), a.redraw())
-};
-mxVertexHandler.prototype.getHandleForEvent = function(a) {
-  if (a.isSource(this.rotationShape)) return mxEvent.ROTATION_HANDLE;
-  if (a.isSource(this.labelShape)) return mxEvent.LABEL_HANDLE;
-  if (null != this.sizers)
-    for (var b = this.tolerance, b = this.allowHandleBoundsCheck && (mxClient.IS_IE || 0 < b) ? new mxRectangle(a.getGraphX() - b, a.getGraphY() - b, 2 * b, 2 * b) : null, c = 0; c < this.sizers.length; c++)
-      if (a.isSource(this.sizers[c]) || null != b && mxUtils.intersects(this.sizers[c].bounds, b)) return c;
-  return null
-};
-mxVertexHandler.prototype.mouseDown = function(a, b) {
-  if (!b.isConsumed() && this.graph.isEnabled() && !this.graph.isForceMarqueeEvent(b.getEvent()) && (0 < this.tolerance || b.getState() == this.state)) {
-    var c = this.getHandleForEvent(b);
-    null != c && (this.start(b.getX(), b.getY(), c), b.consume())
-  }
-};
-mxVertexHandler.prototype.start = function(a, b, c) {
-  a = mxUtils.convertPoint(this.graph.container, a, b);
-  this.startX = a.x;
-  this.startY = a.y;
-  this.index = c;
-  this.selectionBorder.node.style.display = c == mxEvent.ROTATION_HANDLE ? "inline" : "none";
-  this.preview = this.createSelectionShape(this.bounds);
-  !(mxClient.IS_SVG && 0 != Number(this.state.style[mxConstants.STYLE_ROTATION] || "0")) && null != this.state.text && this.state.text.node.parentNode == this.graph.container ? (this.preview.dialect =
-      mxConstants.DIALECT_STRICTHTML, this.preview.init(this.graph.container)) :
-    (this.preview.dialect = this.graph.dialect != mxConstants.DIALECT_SVG ? mxConstants.DIALECT_VML : mxConstants.DIALECT_SVG, this.preview.init(this.graph.view.getOverlayPane()))
-};
-mxVertexHandler.prototype.mouseMove = function(a, b) {
-  if (!b.isConsumed() && null != this.index) {
-    var c = new mxPoint(b.getGraphX(), b.getGraphY()),
-      d = this.graph.isGridEnabledEvent(b.getEvent()),
-      e = this.graph.getView().scale;
-    if (this.index == mxEvent.LABEL_HANDLE) d && (c.x = this.graph.snap(c.x / e) * e, c.y = this.graph.snap(c.y / e) * e), this.moveSizerTo(this.sizers[this.sizers.length - 1], c.x, c.y);
-    else if (this.index == mxEvent.ROTATION_HANDLE) {
-      var f = this.state.x + this.state.width / 2 - c.x,
-        g = this.state.y + this.state.height / 2 - c.y;
-      this.currentAlpha =
-        0 != f ? 180 * Math.atan(g / f) / Math.PI + 90 : 0 > g ? 180 : 0;
-      0 < f && (this.currentAlpha -= 180);
-      this.rotationRaster && (f = c.x - this.state.getCenterX(), g = c.y - this.state.getCenterY(), f = Math.abs(Math.sqrt(f * f + g * g) - this.state.height / 2 - 20), f = Math.max(1, 5 * Math.min(
-        3, Math.max(0, Math.round(80 / Math.abs(f))))), this.currentAlpha = Math.round(this.currentAlpha / f) * f);
-      this.selectionBorder.rotation = this.currentAlpha;
-      this.selectionBorder.redraw()
-    } else {
-      var h = mxUtils.toRadians(this.state.style[mxConstants.STYLE_ROTATION] || "0"),
-        k = Math.cos(-h),
-        l = Math.sin(-h),
-        m = new mxPoint(this.state.getCenterX(), this.state.getCenterY()),
-        f = c.x - this.startX,
-        g = c.y - this.startY,
-        c = this.graph.view.translate,
-        n = l * f + k * g,
-        f = k * f - l * g;
-      this.bounds = this.union(this.selectionBounds, f, n, this.index, d, e, c);
-      k = Math.cos(h);
-      l = Math.sin(h);
-      g = new mxPoint(this.bounds.getCenterX(), this.bounds.getCenterY());
-      f = g.x - m.x;
-      g = g.y - m.y;
-      m = l * f + k * g - g;
-      this.bounds.x += k * f - l * g - f;
-      this.bounds.y += m;
-      this.drawPreview()
-    }
-    b.consume()
-  } else null != this.getHandleForEvent(b) && b.consume(!1)
-};
-mxVertexHandler.prototype.mouseUp = function(a, b) {
-  if (!b.isConsumed() && null != this.index && null != this.state) {
-    var c = new mxPoint(b.getGraphX(), b.getGraphY());
-    this.graph.getModel().beginUpdate();
-    try {
-      if (this.index == mxEvent.ROTATION_HANDLE) null != this.currentAlpha && this.rotateCell(this.state.cell, this.currentAlpha - (this.state.style[mxConstants.STYLE_ROTATION] || 0));
-      else {
-        var d = this.graph.isGridEnabledEvent(b.getEvent()),
-          e = mxUtils.toRadians(this.state.style[mxConstants.STYLE_ROTATION] || "0"),
-          f = Math.cos(-e),
-          g = Math.sin(-e),
-          h = c.x - this.startX,
-          k = c.y - this.startY,
-          c = g * h + f * k,
-          h = f * h - g * k,
-          k = c,
-          l = this.graph.view.scale;
-        this.resizeCell(this.state.cell, h / l, k / l, this.index, d)
-      }
-    } finally {
-      this.graph.getModel().endUpdate()
-    }
-    this.reset();
-    b.consume()
-  }
-};
-mxVertexHandler.prototype.rotateCell = function(a, b) {
-  var c = this.graph.getModel();
-  if (c.isVertex(a)) {
-    var d = a == this.state ? this.state : this.graph.view.getState(a);
-    null != d && this.graph.setCellStyles(mxConstants.STYLE_ROTATION, (d.style[mxConstants.STYLE_ROTATION] || 0) + b, [a]);
-    if (this.state.cell != a && (d = this.graph.getCellGeometry(a), null != d && !d.relative))
-      if (0 != b) {
-        var e = this.graph.getModel().getParent(a),
-          f = this.graph.getCellGeometry(e);
-        if (!d.relative && null != f) {
-          var g = mxUtils.toRadians(b),
-            e = Math.cos(g),
-            g = Math.sin(g),
-            h = new mxPoint(d.getCenterX(), d.getCenterY()),
-            f = new mxPoint(f.width / 2, f.height / 2),
-            e = mxUtils.getRotatedPoint(h, e, g, f),
-            d = d.clone();
-          d.x = e.x - d.width / 2;
-          d.y = e.y - d.height / 2;
-          c.setGeometry(a, d)
-        }
-      } else d = d.clone(), d.x += dx, d.y += dy, c.setGeometry(a, d);
-    d = c.getChildCount(a);
-    for (e = 0; e < d; e++) this.rotateCell(c.getChildAt(a, e), b)
-  }
-};
-mxVertexHandler.prototype.reset = function() {
-  this.index = this.currentAlpha = null;
-  null != this.preview && (this.preview.destroy(), this.preview = null);
-  null != this.selectionBorder && (this.selectionBorder.node.style.display = "inline", this.selectionBounds = this.getSelectionBounds(this.state), this.bounds = new mxRectangle(this.selectionBounds
-    .x, this.selectionBounds.y, this.selectionBounds.width, this.selectionBounds.height), this.drawPreview())
-};
-mxVertexHandler.prototype.resizeCell = function(a, b, c, d, e) {
-  var f = this.graph.model.getGeometry(a);
-  if (null != f)
-    if (d == mxEvent.LABEL_HANDLE) d = this.graph.view.scale, b = (this.labelShape.bounds.getCenterX() - this.startX) / d, c = (this.labelShape.bounds.getCenterY() - this.startY) / d, f = f.clone(),
-      null == f.offset ? f.offset = new mxPoint(b, c) : (f.offset.x += b, f.offset.y += c), this.graph.model.setGeometry(a, f);
-    else {
-      d = this.union(f, b, c, d, e, 1, new mxPoint(0, 0));
-      var g = mxUtils.toRadians(this.state.style[mxConstants.STYLE_ROTATION] || "0");
-      if (0 != g) {
-        b = d.getCenterX() - f.getCenterX();
-        c = d.getCenterY() - f.getCenterY();
-        e = Math.cos(g);
-        var h = Math.sin(g),
-          g = e * b - h * c - b;
-        b = h * b + e * c - c;
-        c = d.x - f.x;
-        var k = d.y - f.y,
-          l = e * c - h * k;
-        e = h * c + e * k;
-        d.x += g;
-        d.y += b;
-        if (!this.graph.isCellCollapsed(a) && (0 != g || 0 != b)) c = f.x - d.x + l, k = f.y - d.y + e, this.moveChildren(a, c, k)
-      }
-      this.graph.resizeCell(a, d)
-    }
-};
-mxVertexHandler.prototype.moveChildren = function(a, b, c) {
-  for (var d = this.graph.getModel(), e = d.getChildCount(a), f = 0; f < e; f++) {
-    var g = d.getChildAt(a, f);
-    if (d.isVertex(g)) {
-      var h = this.graph.getCellGeometry(g);
-      null != h && !h.relative && (h = h.clone(), h.x += b, h.y += c, d.setGeometry(g, h))
-    }
-  }
-};
-mxVertexHandler.prototype.union = function(a, b, c, d, e, f, g) {
-  if (this.singleSizer) {
-    g = a.x + a.width + b;
-    var h = a.y + a.height + c;
-    e && (g = this.graph.snap(g / f) * f, h = this.graph.snap(h / f) * f);
-    f = new mxRectangle(a.x, a.y, 0, 0);
-    f.add(new mxRectangle(g, h, 0, 0));
-    return f
-  }
-  var h = a.x - g.x * f,
-    k = h + a.width,
-    l = a.y - g.y * f;
-  a = l + a.height;
-  4 < d ? (a += c, e && (a = this.graph.snap(a / f) * f)) : 3 > d && (l += c, e && (l = this.graph.snap(l / f) * f));
-  if (0 == d || 3 == d || 5 == d) h += b, e && (h = this.graph.snap(h / f) * f);
-  else if (2 == d || 4 == d || 7 == d) k += b, e && (k = this.graph.snap(k / f) * f);
-  e = k - h;
-  a -=
-    l;
-  0 > e && (h += e, e = Math.abs(e));
-  0 > a && (l += a, a = Math.abs(a));
-  return new mxRectangle(h + g.x * f, l + g.y * f, e, a)
-};
-mxVertexHandler.prototype.redraw = function() {
-  this.selectionBounds = this.getSelectionBounds(this.state);
-  this.bounds = new mxRectangle(this.state.x, this.state.y, this.state.width, this.state.height);
-  var a = this.state;
-  if (null != this.sizers) {
-    var b = a.x + a.width,
-      c = a.y + a.height;
-    if (this.singleSizer) this.moveSizerTo(this.sizers[0], b, c);
-    else {
-      var d = a.x + a.width / 2,
-        e = a.y + a.height / 2;
-      if (1 < this.sizers.length) {
-        var f = mxUtils.toRadians(a.style[mxConstants.STYLE_ROTATION] || "0"),
-          g = Math.cos(f),
-          f = Math.sin(f),
-          h = new mxPoint(a.getCenterX(),
-            a.getCenterY()),
-          k = mxUtils.getRotatedPoint(new mxPoint(a.x, a.y), g, f, h);
-        this.moveSizerTo(this.sizers[0], k.x, k.y);
-        k.x = d;
-        k.y = a.y;
-        k = mxUtils.getRotatedPoint(k, g, f, h);
-        this.moveSizerTo(this.sizers[1], k.x, k.y);
-        k.x = b;
-        k.y = a.y;
-        k = mxUtils.getRotatedPoint(k, g, f, h);
-        this.moveSizerTo(this.sizers[2], k.x, k.y);
-        k.x = a.x;
-        k.y = e;
-        k = mxUtils.getRotatedPoint(k, g, f, h);
-        this.moveSizerTo(this.sizers[3], k.x, k.y);
-        k.x = b;
-        k.y = e;
-        k = mxUtils.getRotatedPoint(k, g, f, h);
-        this.moveSizerTo(this.sizers[4], k.x, k.y);
-        k.x = a.x;
-        k.y = c;
-        k = mxUtils.getRotatedPoint(k,
-          g, f, h);
-        this.moveSizerTo(this.sizers[5], k.x, k.y);
-        k.x = d;
-        k.y = c;
-        k = mxUtils.getRotatedPoint(k, g, f, h);
-        this.moveSizerTo(this.sizers[6], k.x, k.y);
-        k.x = b;
-        k.y = c;
-        k = mxUtils.getRotatedPoint(k, g, f, h);
-        this.moveSizerTo(this.sizers[7], k.x, k.y);
-        this.moveSizerTo(this.sizers[8], d + a.absoluteOffset.x, e + a.absoluteOffset.y)
-      } else 2 <= this.state.width && 2 <= this.state.height ? this.moveSizerTo(this.sizers[0], d + a.absoluteOffset.x, e + a.absoluteOffset.y) : this.moveSizerTo(this.sizers[0], a.x, a.y)
-    }
-  }
-  null != this.rotationShape && (f = mxUtils.toRadians(this.state.style[mxConstants.STYLE_ROTATION] ||
-      "0"), g = Math.cos(f), f = Math.sin(f), h = new mxPoint(this.state.getCenterX(), this.state.getCenterY()), k = mxUtils.getRotatedPoint(new mxPoint(a.x + a.width / 2, a.y - 16), g, f, h),
-    this.moveSizerTo(this.rotationShape, k.x, k.y));
-  this.selectionBorder.rotation = Number(this.state.style[mxConstants.STYLE_ROTATION] || "0");
-  this.drawPreview()
-};
-mxVertexHandler.prototype.drawPreview = function() {
-  null != this.preview && (this.preview.bounds = this.bounds, this.preview.node.parentNode == this.graph.container && (this.preview.bounds.width = Math.max(0, this.preview.bounds.width - 1), this.preview
-    .bounds.height = Math.max(0, this.preview.bounds.height - 1)), this.preview.rotation = Number(this.state.style[mxConstants.STYLE_ROTATION] || "0"), this.preview.redraw());
-  this.selectionBorder.bounds = this.bounds;
-  this.selectionBorder.redraw()
-};
-mxVertexHandler.prototype.destroy = function() {
-  null != this.preview && (this.preview.destroy(), this.preview = null);
-  this.selectionBorder.destroy();
-  this.labelShape = this.selectionBorder = null;
-  if (null != this.sizers)
-    for (var a = 0; a < this.sizers.length; a++) this.sizers[a].destroy(), this.sizers[a] = null
-};
-
-function mxEdgeHandler(a) {
-  null != a && (this.state = a, this.init())
-}
-mxEdgeHandler.prototype.graph = null;
-mxEdgeHandler.prototype.state = null;
-mxEdgeHandler.prototype.marker = null;
-mxEdgeHandler.prototype.constraintHandler = null;
-mxEdgeHandler.prototype.error = null;
-mxEdgeHandler.prototype.shape = null;
-mxEdgeHandler.prototype.bends = null;
-mxEdgeHandler.prototype.labelShape = null;
-mxEdgeHandler.prototype.cloneEnabled = !0;
-mxEdgeHandler.prototype.addEnabled = !1;
-mxEdgeHandler.prototype.removeEnabled = !1;
-mxEdgeHandler.prototype.preferHtml = !1;
-mxEdgeHandler.prototype.allowHandleBoundsCheck = !0;
-mxEdgeHandler.prototype.snapToTerminals = !1;
-mxEdgeHandler.prototype.handleImage = null;
-mxEdgeHandler.prototype.tolerance = 0;
-mxEdgeHandler.prototype.init = function() {
-  this.graph = this.state.view.graph;
-  this.marker = this.createMarker();
-  this.constraintHandler = new mxConstraintHandler(this.graph);
-  this.points = [];
-  this.abspoints = this.getSelectionPoints(this.state);
-  this.shape = this.createSelectionShape(this.abspoints);
-  this.shape.dialect = this.graph.dialect != mxConstants.DIALECT_SVG ? mxConstants.DIALECT_MIXEDHTML : mxConstants.DIALECT_SVG;
-  this.shape.init(this.graph.getView().getOverlayPane());
-  this.shape.svgStrokeTolerance = 0;
-  this.shape.node.style.cursor =
-    mxConstants.CURSOR_MOVABLE_EDGE;
-  mxEvent.addListener(this.shape.node, "dblclick", mxUtils.bind(this, function(a) {
-    this.graph.dblClick(a, this.state.cell)
-  }));
-  mxEvent.addGestureListeners(this.shape.node, mxUtils.bind(this, function(a) {
-    this.addEnabled && this.isAddPointEvent(a) ? this.addPoint(this.state, a) : this.graph.fireMouseEvent(mxEvent.MOUSE_DOWN, new mxMouseEvent(a, this.state))
-  }), mxUtils.bind(this, function(a) {
-    var c = this.state.cell;
-    if (null != this.index) {
-      var d = mxUtils.convertPoint(this.graph.container, mxEvent.getClientX(a),
-          mxEvent.getClientY(a)),
-        c = this.graph.getCellAt(d.x, d.y);
-      this.graph.isSwimlane(c) && this.graph.hitsSwimlaneContent(c, d.x, d.y) && (c = null)
-    }
-    this.graph.fireMouseEvent(mxEvent.MOUSE_MOVE, new mxMouseEvent(a, this.graph.getView().getState(c)))
-  }), mxUtils.bind(this, function(a) {
-    this.graph.fireMouseEvent(mxEvent.MOUSE_UP, new mxMouseEvent(a, this.state))
-  }));
-  this.preferHtml = null != this.state.text && this.state.text.node.parentNode == this.graph.container;
-  if (!this.preferHtml) {
-    var a = this.state.getVisibleTerminalState(!0);
-    null != a && (this.preferHtml = null != a.text && a.text.node.parentNode == this.graph.container);
-    this.preferHtml || (a = this.state.getVisibleTerminalState(!1), null != a && (this.preferHtml = null != a.text && a.text.node.parentNode == this.graph.container))
-  }
-  if (this.graph.getSelectionCount() < mxGraphHandler.prototype.maxCells || 0 >= mxGraphHandler.prototype.maxCells) this.bends = this.createBends();
-  this.label = new mxPoint(this.state.absoluteOffset.x, this.state.absoluteOffset.y);
-  this.labelShape = new mxRectangleShape(new mxRectangle,
-    mxConstants.LABEL_HANDLE_FILLCOLOR, mxConstants.HANDLE_STROKECOLOR);
-  this.labelShape.pointerEvents = !1;
-  this.initBend(this.labelShape);
-  this.labelShape.node.style.cursor = mxConstants.CURSOR_LABEL_HANDLE;
-  mxEvent.redirectMouseEvents(this.labelShape.node, this.graph, this.state);
-  this.redraw()
-};
-mxEdgeHandler.prototype.isAddPointEvent = function(a) {
-  return mxEvent.isShiftDown(a)
-};
-mxEdgeHandler.prototype.isRemovePointEvent = function(a) {
-  return mxEvent.isShiftDown(a)
-};
-mxEdgeHandler.prototype.getSelectionPoints = function(a) {
-  return a.absolutePoints
-};
-mxEdgeHandler.prototype.createSelectionShape = function(a) {
-  a = new mxPolyline(a, this.getSelectionColor());
-  a.strokewidth = this.getSelectionStrokeWidth();
-  a.isDashed = this.isSelectionDashed();
-  return a
-};
-mxEdgeHandler.prototype.getSelectionColor = function() {
-  return mxConstants.EDGE_SELECTION_COLOR
-};
-mxEdgeHandler.prototype.getSelectionStrokeWidth = function() {
-  return mxConstants.EDGE_SELECTION_STROKEWIDTH
-};
-mxEdgeHandler.prototype.isSelectionDashed = function() {
-  return mxConstants.EDGE_SELECTION_DASHED
-};
-mxEdgeHandler.prototype.isConnectableCell = function(a) {
-  return !0
-};
-mxEdgeHandler.prototype.createMarker = function() {
-  var a = new mxCellMarker(this.graph),
-    b = this;
-  a.getCell = function(a) {
-    var d = mxCellMarker.prototype.getCell.apply(this, arguments);
-    if (!b.isConnectableCell(d)) return null;
-    var e = b.graph.getModel();
-    if (d == b.state.cell || null != d && !b.graph.connectableEdges && e.isEdge(d)) d = null;
-    return d
-  };
-  a.isValidState = function(a) {
-    var d = b.graph.getModel(),
-      d = b.graph.view.getTerminalPort(a, b.graph.view.getState(d.getTerminal(b.state.cell, !b.isSource)), !b.isSource),
-      d = null != d ? d.cell : null;
-    b.error = b.validateConnection(b.isSource ? a.cell : d, b.isSource ? d : a.cell);
-    return null == b.error
-  };
-  return a
-};
-mxEdgeHandler.prototype.validateConnection = function(a, b) {
-  return this.graph.getEdgeValidationError(this.state.cell, a, b)
-};
-mxEdgeHandler.prototype.createBends = function() {
-  for (var a = this.state.cell, b = [], c = 0; c < this.abspoints.length; c++)
-    if (this.isHandleVisible(c)) {
-      var d = c == this.abspoints.length - 1;
-      if ((d = 0 == c || d) || this.graph.isCellBendable(a)) {
-        var e = this.createHandleShape(c);
-        this.initBend(e);
-        mxClient.IS_TOUCH && e.node.setAttribute("pointer-events", "none");
-        if (this.isHandleEnabled(c))
-          if (mxClient.IS_TOUCH) {
-            var f = mxUtils.bind(this, function(a) {
-              a = mxUtils.convertPoint(this.graph.container, mxEvent.getClientX(a), mxEvent.getClientY(a));
-              return this.graph.view.getState(this.graph.getCellAt(a.x, a.y))
-            });
-            mxEvent.redirectMouseEvents(e.node, this.graph, f)
-          } else e.node.style.cursor = mxConstants.CURSOR_BEND_HANDLE, mxEvent.redirectMouseEvents(e.node, this.graph, this.state);
-        b.push(e);
-        d || (this.points.push(new mxPoint(0, 0)), e.node.style.visibility = "hidden")
-      }
-    }
-  return b
-};
-mxEdgeHandler.prototype.isHandleEnabled = function(a) {
-  return !0
-};
-mxEdgeHandler.prototype.isHandleVisible = function(a) {
-  return !0
-};
-mxEdgeHandler.prototype.createHandleShape = function(a) {
-  if (null != this.handleImage) return new mxImageShape(new mxRectangle(0, 0, this.handleImage.width, this.handleImage.height), this.handleImage.src);
-  a = mxConstants.HANDLE_SIZE;
-  this.preferHtml && (a -= 1);
-  return new mxRectangleShape(new mxRectangle(0, 0, a, a), mxConstants.HANDLE_FILLCOLOR, mxConstants.HANDLE_STROKECOLOR)
-};
-mxEdgeHandler.prototype.initBend = function(a) {
-  this.preferHtml ? (a.dialect = mxConstants.DIALECT_STRICTHTML, a.init(this.graph.container)) : (a.dialect = this.graph.dialect != mxConstants.DIALECT_SVG ? mxConstants.DIALECT_MIXEDHTML :
-    mxConstants.DIALECT_SVG, a.init(this.graph.getView().getOverlayPane()))
-};
-mxEdgeHandler.prototype.getHandleForEvent = function(a) {
-  if (null != this.bends)
-    for (var b = this.tolerance, b = this.allowHandleBoundsCheck && (mxClient.IS_IE || 0 < b) ? new mxRectangle(a.getGraphX() - b, a.getGraphY() - b, 2 * b, 2 * b) : null, c = 0; c < this.bends.length; c++)
-      if ((a.isSource(this.bends[c]) || null != b && mxUtils.intersects(this.bends[c].bounds, b)) && "hidden" != this.bends[c].node.style.visibility) return c;
-  if (a.isSource(this.labelShape) && "hidden" != this.labelShape.node.style.visibility || a.isSource(this.state.text))
-    if (!mxClient.IS_SF &&
-      !mxClient.IS_GC || "SELECT" != a.getSource().nodeName) return mxEvent.LABEL_HANDLE;
-  return null
-};
-mxEdgeHandler.prototype.mouseDown = function(a, b) {
-  var c = null,
-    c = this.getHandleForEvent(b);
-  null != c && (!b.isConsumed() && this.graph.isEnabled() && !this.graph.isForceMarqueeEvent(b.getEvent())) && (this.removeEnabled && this.isRemovePointEvent(b.getEvent()) ? this.removePoint(this.state,
-    c) : (c != mxEvent.LABEL_HANDLE || this.graph.isLabelMovable(b.getCell())) && this.start(b.getX(), b.getY(), c), b.consume())
-};
-mxEdgeHandler.prototype.start = function(a, b, c) {
-  this.startX = a;
-  this.startY = b;
-  this.isSource = null == this.bends ? !1 : 0 == c;
-  this.isTarget = null == this.bends ? !1 : c == this.bends.length - 1;
-  this.isLabel = c == mxEvent.LABEL_HANDLE;
-  if (this.isSource || this.isTarget) {
-    if (a = this.state.cell, b = this.graph.model.getTerminal(a, this.isSource), null == b && this.graph.isTerminalPointMovable(a, this.isSource) || null != b && this.graph.isCellDisconnectable(a,
-        b, this.isSource)) this.index = c
-  } else this.index = c
-};
-mxEdgeHandler.prototype.clonePreviewState = function(a, b) {
-  return this.state.clone()
-};
-mxEdgeHandler.prototype.getSnapToTerminalTolerance = function() {
-  return this.graph.gridSize * this.graph.view.scale / 2
-};
-mxEdgeHandler.prototype.getPointForEvent = function(a) {
-  var b = new mxPoint(a.getGraphX(), a.getGraphY()),
-    c = this.getSnapToTerminalTolerance(),
-    d = this.graph.getView(),
-    e = !1,
-    f = !1;
-  if (this.snapToTerminals && 0 < c) {
-    var g = function(a) {
-        if (null != a) {
-          var d = a.x;
-          Math.abs(b.x - d) < c && (b.x = d, e = !0);
-          a = a.y;
-          Math.abs(b.y - a) < c && (b.y = a, f = !0)
-        }
-      },
-      h = function(a) {
-        null != a && g.call(this, new mxPoint(d.getRoutingCenterX(a), d.getRoutingCenterY(a)))
-      };
-    h.call(this, this.state.getVisibleTerminalState(!0));
-    h.call(this, this.state.getVisibleTerminalState(!1));
-    if (null != this.abspoints)
-      for (h = 0; h < this.abspoints; h++) h != this.index && g.call(this, this.abspoints[h])
-  }
-  this.graph.isGridEnabledEvent(a.getEvent()) && (a = d.scale, h = d.translate, e || (b.x = (this.graph.snap(b.x / a - h.x) + h.x) * a), f || (b.y = (this.graph.snap(b.y / a - h.y) + h.y) * a));
-  return b
-};
-mxEdgeHandler.prototype.getPreviewTerminalState = function(a) {
-  this.constraintHandler.update(a, this.isSource);
-  this.marker.process(a);
-  a = this.marker.getValidState();
-  var b = null;
-  null != this.constraintHandler.currentFocus && null != this.constraintHandler.currentConstraint && this.marker.reset();
-  null != a ? b = a : null != this.constraintHandler.currentConstraint && null != this.constraintHandler.currentFocus && (b = this.constraintHandler.currentFocus);
-  return b
-};
-mxEdgeHandler.prototype.getPreviewPoints = function(a) {
-  var b = this.graph.getCellGeometry(this.state.cell),
-    b = null != b.points ? b.points.slice() : null;
-  !this.isSource && !this.isTarget ? (this.convertPoint(a, !1), null == b ? b = [a] : b[this.index - 1] = a) : this.graph.resetEdgesOnConnect && (b = null);
-  return b
-};
-mxEdgeHandler.prototype.updatePreviewState = function(a, b, c) {
-  var d = this.isSource ? c : this.state.getVisibleTerminalState(!0),
-    e = this.isTarget ? c : this.state.getVisibleTerminalState(!1),
-    f = this.graph.getConnectionConstraint(a, d, !0),
-    g = this.graph.getConnectionConstraint(a, e, !1),
-    h = this.constraintHandler.currentConstraint;
-  null == h && (h = new mxConnectionConstraint);
-  this.isSource ? f = h : this.isTarget && (g = h);
-  (!this.isSource || null != d) && a.view.updateFixedTerminalPoint(a, d, !0, f);
-  (!this.isTarget || null != e) && a.view.updateFixedTerminalPoint(a,
-    e, !1, g);
-  if ((this.isSource || this.isTarget) && null == c) a.setAbsoluteTerminalPoint(b, this.isSource), null == this.marker.getMarkedState() && (this.error = this.graph.allowDanglingEdges ? null : "");
-  a.view.updatePoints(a, this.points, d, e);
-  a.view.updateFloatingTerminalPoints(a, d, e)
-};
-mxEdgeHandler.prototype.mouseMove = function(a, b) {
-  if (null != this.index && null != this.marker) {
-    var c = this.getPointForEvent(b);
-    if (this.isLabel) this.label.x = c.x, this.label.y = c.y;
-    else {
-      this.points = this.getPreviewPoints(c);
-      var d = this.isSource || this.isTarget ? this.getPreviewTerminalState(b) : null,
-        e = this.clonePreviewState(c, null != d ? d.cell : null);
-      this.updatePreviewState(e, c, d);
-      this.setPreviewColor(null == this.error ? this.marker.validColor : this.marker.invalidColor);
-      this.abspoints = e.absolutePoints;
-      this.active = !0
-    }
-    this.drawPreview();
-    mxEvent.consume(b.getEvent());
-    b.consume()
-  } else mxClient.IS_IE && null != this.getHandleForEvent(b) && b.consume(!1)
-};
-mxEdgeHandler.prototype.mouseUp = function(a, b) {
-  if (null != this.index && null != this.marker) {
-    var c = this.state.cell;
-    if (b.getX() != this.startX || b.getY() != this.startY)
-      if (null != this.error) 0 < this.error.length && this.graph.validationAlert(this.error);
-      else if (this.isLabel) this.moveLabel(this.state, this.label.x, this.label.y);
-    else if (this.isSource || this.isTarget) {
-      var d = null;
-      null != this.constraintHandler.currentConstraint && null != this.constraintHandler.currentFocus && (d = this.constraintHandler.currentFocus.cell);
-      null ==
-        d && this.marker.hasValidState() && (d = this.marker.validState.cell);
-      if (null != d) c = this.connect(c, d, this.isSource, this.graph.isCloneEvent(b.getEvent()) && this.cloneEnabled && this.graph.isCellsCloneable(), b);
-      else if (this.graph.isAllowDanglingEdges()) {
-        d = this.abspoints[this.isSource ? 0 : this.abspoints.length - 1];
-        d.x = d.x / this.graph.view.scale - this.graph.view.translate.x;
-        d.y = d.y / this.graph.view.scale - this.graph.view.translate.y;
-        var e = this.graph.getView().getState(this.graph.getModel().getParent(c));
-        null != e && (d.x -=
-          e.origin.x, d.y -= e.origin.y);
-        d.x -= this.graph.panDx / this.graph.view.scale;
-        d.y -= this.graph.panDy / this.graph.view.scale;
-        this.changeTerminalPoint(c, d, this.isSource)
-      }
-    } else this.active ? this.changePoints(c, this.points) : (this.graph.getView().invalidate(this.state.cell), this.graph.getView().revalidate(this.state.cell));
-    null != this.marker && (this.reset(), c != this.state.cell && this.graph.setSelectionCell(c));
-    b.consume()
-  }
-};
-mxEdgeHandler.prototype.reset = function() {
-  this.points = this.label = this.index = this.error = null;
-  this.isTarget = this.isSource = this.isLabel = this.active = !1;
-  this.marker.reset();
-  this.constraintHandler.reset();
-  this.setPreviewColor(mxConstants.EDGE_SELECTION_COLOR);
-  this.redraw()
-};
-mxEdgeHandler.prototype.setPreviewColor = function(a) {
-  null != this.shape && (this.shape.stroke = a)
-};
-mxEdgeHandler.prototype.convertPoint = function(a, b) {
-  var c = this.graph.getView().getScale(),
-    d = this.graph.getView().getTranslate();
-  b && (a.x = this.graph.snap(a.x), a.y = this.graph.snap(a.y));
-  a.x = Math.round(a.x / c - d.x);
-  a.y = Math.round(a.y / c - d.y);
-  c = this.graph.getView().getState(this.graph.getModel().getParent(this.state.cell));
-  null != c && (a.x -= c.origin.x, a.y -= c.origin.y);
-  return a
-};
-mxEdgeHandler.prototype.moveLabel = function(a, b, c) {
-  var d = this.graph.getModel(),
-    e = d.getGeometry(a.cell);
-  if (null != e) {
-    var e = e.clone(),
-      f = this.graph.getView().getRelativePoint(a, b, c);
-    e.x = f.x;
-    e.y = f.y;
-    var g = this.graph.getView().scale;
-    e.offset = new mxPoint(0, 0);
-    f = this.graph.view.getPoint(a, e);
-    e.offset = new mxPoint((b - f.x) / g, (c - f.y) / g);
-    d.setGeometry(a.cell, e)
-  }
-};
-mxEdgeHandler.prototype.connect = function(a, b, c, d, e) {
-  e = this.graph.getModel();
-  var f = e.getParent(a);
-  e.beginUpdate();
-  try {
-    if (d) {
-      var g = a.clone();
-      e.add(f, g, e.getChildCount(f));
-      var h = e.getTerminal(a, !c);
-      this.graph.connectCell(g, h, !c);
-      a = g
-    }
-    var k = this.constraintHandler.currentConstraint;
-    null == k && (k = new mxConnectionConstraint);
-    this.graph.connectCell(a, b, c, k)
-  } finally {
-    e.endUpdate()
-  }
-  return a
-};
-mxEdgeHandler.prototype.changeTerminalPoint = function(a, b, c) {
-  var d = this.graph.getModel(),
-    e = d.getGeometry(a);
-  if (null != e) {
-    d.beginUpdate();
-    try {
-      e = e.clone(), e.setTerminalPoint(b, c), d.setGeometry(a, e), this.graph.connectCell(a, null, c, new mxConnectionConstraint)
-    } finally {
-      d.endUpdate()
-    }
-  }
-};
-mxEdgeHandler.prototype.changePoints = function(a, b) {
-  var c = this.graph.getModel(),
-    d = c.getGeometry(a);
-  null != d && (d = d.clone(), d.points = b, c.setGeometry(a, d))
-};
-mxEdgeHandler.prototype.addPoint = function(a, b) {
-  var c = mxUtils.convertPoint(this.graph.container, mxEvent.getClientX(b), mxEvent.getClientY(b)),
-    d = this.graph.isGridEnabledEvent(b);
-  this.convertPoint(c, d);
-  this.addPointAt(a, c.x, c.y);
-  mxEvent.consume(b)
-};
-mxEdgeHandler.prototype.addPointAt = function(a, b, c) {
-  var d = this.graph.getCellGeometry(a.cell);
-  b = new mxPoint(b, c);
-  if (null != d) {
-    d = d.clone();
-    c = this.graph.view.translate;
-    var e = this.graph.view.scale;
-    c = mxUtils.findNearestSegment(a, (b.x + c.x) * e, (b.y + c.y) * e);
-    null == d.points ? d.points = [b] : d.points.splice(c, 0, b);
-    this.graph.getModel().setGeometry(a.cell, d);
-    this.destroy();
-    this.init()
-  }
-};
-mxEdgeHandler.prototype.removePoint = function(a, b) {
-  if (0 < b && b < this.abspoints.length - 1) {
-    var c = this.graph.getCellGeometry(this.state.cell);
-    null != c && null != c.points && (c = c.clone(), c.points.splice(b - 1, 1), this.graph.getModel().setGeometry(a.cell, c), this.destroy(), this.init())
-  }
-};
-mxEdgeHandler.prototype.getHandleFillColor = function(a) {
-  a = 0 == a;
-  var b = this.state.cell,
-    c = this.graph.getModel().getTerminal(b, a),
-    d = mxConstants.HANDLE_FILLCOLOR;
-  null != c && !this.graph.isCellDisconnectable(b, c, a) || null == c && !this.graph.isTerminalPointMovable(b, a) ? d = mxConstants.LOCKED_HANDLE_FILLCOLOR : null != c && this.graph.isCellDisconnectable(
-    b, c, a) && (d = mxConstants.CONNECT_HANDLE_FILLCOLOR);
-  return d
-};
-mxEdgeHandler.prototype.redraw = function() {
-  this.abspoints = this.state.absolutePoints.slice();
-  var a = this.state.cell,
-    b = mxConstants.LABEL_HANDLE_SIZE;
-  this.label = new mxPoint(this.state.absoluteOffset.x, this.state.absoluteOffset.y);
-  this.labelShape.bounds = new mxRectangle(Math.round(this.label.x - b / 2), Math.round(this.label.y - b / 2), b, b);
-  this.labelShape.redraw();
-  b = this.graph.getLabel(a);
-  null != b && 0 < b.length && this.graph.isLabelMovable(a) ? this.labelShape.node.style.visibility = "visible" : this.labelShape.node.style.visibility =
-    "hidden";
-  if (null != this.bends && 0 < this.bends.length) {
-    var c = this.abspoints.length - 1,
-      a = this.abspoints[0],
-      d = this.abspoints[0].y,
-      b = this.bends[0].bounds;
-    this.bends[0].bounds = new mxRectangle(Math.round(this.abspoints[0].x - b.width / 2), Math.round(d - b.height / 2), b.width, b.height);
-    this.bends[0].fill = this.getHandleFillColor(0);
-    this.bends[0].redraw();
-    var d = this.abspoints[c],
-      e = this.abspoints[c].x,
-      c = this.abspoints[c].y,
-      f = this.bends.length - 1,
-      b = this.bends[f].bounds;
-    this.bends[f].bounds = new mxRectangle(Math.round(e - b.width /
-      2), Math.round(c - b.height / 2), b.width, b.height);
-    this.bends[f].fill = this.getHandleFillColor(f);
-    this.bends[f].redraw();
-    this.redrawInnerBends(a, d)
-  }
-  this.drawPreview()
-};
-mxEdgeHandler.prototype.redrawInnerBends = function(a, b) {
-  var c = this.graph.getModel().getGeometry(this.state.cell).points;
-  if (null != c) {
-    null == this.points && (this.points = []);
-    for (var d = 1; d < this.bends.length - 1; d++)
-      if (null != this.bends[d])
-        if (null != this.abspoints[d]) {
-          var e = this.abspoints[d].x,
-            f = this.abspoints[d].y,
-            g = this.bends[d].bounds;
-          this.bends[d].node.style.visibility = "visible";
-          this.bends[d].bounds = new mxRectangle(Math.round(e - g.width / 2), Math.round(f - g.height / 2), g.width, g.height);
-          this.bends[d].redraw();
-          this.points[d -
-            1] = c[d - 1]
-        } else this.bends[d].destroy(), this.bends[d] = null
-  }
-};
-mxEdgeHandler.prototype.drawPreview = function() {
-  if (this.isLabel) {
-    var a = mxConstants.LABEL_HANDLE_SIZE,
-      a = new mxRectangle(Math.round(this.label.x - a / 2), Math.round(this.label.y - a / 2), a, a);
-    this.labelShape.bounds = a;
-    this.labelShape.redraw()
-  } else this.shape.points = this.abspoints, this.shape.redraw()
-};
-mxEdgeHandler.prototype.destroy = function() {
-  null != this.marker && (this.marker.destroy(), this.marker = null);
-  null != this.shape && (this.shape.destroy(), this.shape = null);
-  null != this.labelShape && (this.labelShape.destroy(), this.labelShape = null);
-  null != this.constraintHandler && (this.constraintHandler.destroy(), this.constraintHandler = null);
-  if (null != this.bends)
-    for (var a = 0; a < this.bends.length; a++) null != this.bends[a] && (this.bends[a].destroy(), this.bends[a] = null)
-};
-
-function mxElbowEdgeHandler(a) {
-  mxEdgeHandler.call(this, a)
-}
-mxUtils.extend(mxElbowEdgeHandler, mxEdgeHandler);
-mxElbowEdgeHandler.prototype = new mxEdgeHandler;
-mxElbowEdgeHandler.prototype.constructor = mxElbowEdgeHandler;
-mxElbowEdgeHandler.prototype.flipEnabled = !0;
-mxElbowEdgeHandler.prototype.doubleClickOrientationResource = "none" != mxClient.language ? "doubleClickOrientation" : "";
-mxElbowEdgeHandler.prototype.createBends = function() {
-  var a = [],
-    b = this.createHandleShape(0);
-  this.initBend(b);
-  b.node.style.cursor = mxConstants.CURSOR_BEND_HANDLE;
-  mxEvent.redirectMouseEvents(b.node, this.graph, this.state);
-  a.push(b);
-  mxClient.IS_TOUCH && b.node.setAttribute("pointer-events", "none");
-  a.push(this.createVirtualBend());
-  this.points.push(new mxPoint(0, 0));
-  b = this.createHandleShape(2);
-  this.initBend(b);
-  b.node.style.cursor = mxConstants.CURSOR_BEND_HANDLE;
-  mxEvent.redirectMouseEvents(b.node, this.graph, this.state);
-  a.push(b);
-  mxClient.IS_TOUCH && b.node.setAttribute("pointer-events", "none");
-  return a
-};
-mxElbowEdgeHandler.prototype.createVirtualBend = function() {
-  var a = this.createHandleShape();
-  this.initBend(a);
-  var b = this.getCursorForBend();
-  a.node.style.cursor = b;
-  b = mxUtils.bind(this, function(a) {
-    !mxEvent.isConsumed(a) && this.flipEnabled && (this.graph.flipEdge(this.state.cell, a), mxEvent.consume(a))
-  });
-  mxEvent.redirectMouseEvents(a.node, this.graph, this.state, null, null, null, b);
-  this.graph.isCellBendable(this.state.cell) || (a.node.style.display = "none");
-  return a
-};
-mxElbowEdgeHandler.prototype.getCursorForBend = function() {
-  return this.state.style[mxConstants.STYLE_EDGE] == mxEdgeStyle.TopToBottom || this.state.style[mxConstants.STYLE_EDGE] == mxConstants.EDGESTYLE_TOPTOBOTTOM || (this.state.style[mxConstants.STYLE_EDGE] ==
-      mxEdgeStyle.ElbowConnector || this.state.style[mxConstants.STYLE_EDGE] == mxConstants.EDGESTYLE_ELBOW) && this.state.style[mxConstants.STYLE_ELBOW] == mxConstants.ELBOW_VERTICAL ?
-    "row-resize" : "col-resize"
-};
-mxElbowEdgeHandler.prototype.getTooltipForNode = function(a) {
-  var b = null;
-  if (null != this.bends && null != this.bends[1] && (a == this.bends[1].node || a.parentNode == this.bends[1].node)) b = this.doubleClickOrientationResource, b = mxResources.get(b) || b;
-  return b
-};
-mxElbowEdgeHandler.prototype.convertPoint = function(a, b) {
-  var c = this.graph.getView().getScale(),
-    d = this.graph.getView().getTranslate(),
-    e = this.state.origin;
-  b && (a.x = this.graph.snap(a.x), a.y = this.graph.snap(a.y));
-  a.x = Math.round(a.x / c - d.x - e.x);
-  a.y = Math.round(a.y / c - d.y - e.y)
-};
-mxElbowEdgeHandler.prototype.redrawInnerBends = function(a, b) {
-  var c = this.graph.getModel().getGeometry(this.state.cell).points,
-    c = null != c ? c[0] : null,
-    c = null == c ? new mxPoint(a.x + (b.x - a.x) / 2, a.y + (b.y - a.y) / 2) : new mxPoint(this.graph.getView().scale * (c.x + this.graph.getView().translate.x + this.state.origin.x), this.graph.getView()
-      .scale * (c.y + this.graph.getView().translate.y + this.state.origin.y)),
-    d = this.bends[1].bounds,
-    e = d.width,
-    d = d.height;
-  null == this.handleImage && (d = e = mxConstants.HANDLE_SIZE);
-  var f = new mxRectangle(Math.round(c.x -
-    e / 2), Math.round(c.y - d / 2), e, d);
-  null == this.handleImage && ("hidden" != this.labelShape.node.style.visibility && mxUtils.intersects(f, this.labelShape.bounds)) && (e += 3, d += 3, f = new mxRectangle(Math.round(c.x - e / 2),
-    Math.round(c.y - d / 2), e, d));
-  this.bends[1].bounds = f;
-  this.bends[1].redraw()
-};
-
-function mxEdgeSegmentHandler(a) {
-  mxEdgeHandler.call(this, a)
-}
-mxUtils.extend(mxEdgeSegmentHandler, mxEdgeHandler);
-mxEdgeSegmentHandler.prototype = new mxElbowEdgeHandler;
-mxEdgeSegmentHandler.prototype.constructor = mxEdgeSegmentHandler;
-mxEdgeSegmentHandler.prototype.getPreviewPoints = function(a) {
-  if (this.isSource || this.isTarget) return mxElbowEdgeHandler.prototype.getPreviewPoints.apply(this, arguments);
-  this.convertPoint(a, !1);
-  var b = this.state.absolutePoints,
-    c = b[0].clone();
-  this.convertPoint(c, !1);
-  for (var d = [], e = 1; e < b.length; e++) {
-    var f = b[e].clone();
-    this.convertPoint(f, !1);
-    e == this.index && (c.x == f.x ? (c.x = a.x, f.x = a.x) : (c.y = a.y, f.y = a.y));
-    e < b.length - 1 && d.push(f);
-    c = f
-  }
-  if (1 == d.length) {
-    if (c = this.state.view, e = this.state.getVisibleTerminalState(!0),
-      f = this.state.getVisibleTerminalState(!1), null != f & null != e) {
-      var g = this.state.origin.x,
-        h = this.state.origin.y;
-      mxUtils.contains(f, d[0].x + g, d[0].y + h) ? b[1].y == b[2].y ? d[0].y = c.getRoutingCenterY(e) - h : d[0].x = c.getRoutingCenterX(e) - g : mxUtils.contains(e, d[0].x + g, d[0].y + h) && (b[
-        1].y == b[0].y ? d[0].y = c.getRoutingCenterY(f) - h : d[0].x = c.getRoutingCenterX(f) - g)
-    }
-  } else 0 == d.length && (d = [a]);
-  return d
-};
-mxEdgeSegmentHandler.prototype.createBends = function() {
-  var a = [],
-    b = this.createHandleShape(0);
-  this.initBend(b);
-  b.node.style.cursor = mxConstants.CURSOR_BEND_HANDLE;
-  mxEvent.redirectMouseEvents(b.node, this.graph, this.state);
-  a.push(b);
-  mxClient.IS_TOUCH && b.node.setAttribute("pointer-events", "none");
-  var c = this.state.absolutePoints;
-  if (this.graph.isCellBendable(this.state.cell)) {
-    null == this.points && (this.points = []);
-    for (var d = 0; d < c.length - 1; d++) b = this.createVirtualBend(), a.push(b), b.node.style.cursor = 0 == c[d].x -
-      c[d + 1].x ? "col-resize" : "row-resize", this.points.push(new mxPoint(0, 0)), mxClient.IS_TOUCH && b.node.setAttribute("pointer-events", "none")
-  }
-  b = this.createHandleShape(c.length);
-  this.initBend(b);
-  b.node.style.cursor = mxConstants.CURSOR_BEND_HANDLE;
-  mxEvent.redirectMouseEvents(b.node, this.graph, this.state);
-  a.push(b);
-  mxClient.IS_TOUCH && b.node.setAttribute("pointer-events", "none");
-  return a
-};
-mxEdgeSegmentHandler.prototype.redraw = function() {
-  this.refresh();
-  mxEdgeHandler.prototype.redraw.apply(this, arguments)
-};
-mxEdgeSegmentHandler.prototype.refresh = function() {
-  if (null != this.bends) {
-    for (var a = 0; a < this.bends.length; a++) null != this.bends[a] && (this.bends[a].destroy(), this.bends[a] = null);
-    this.bends = this.createBends()
-  }
-};
-mxEdgeSegmentHandler.prototype.redrawInnerBends = function(a, b) {
-  if (this.graph.isCellBendable(this.state.cell)) {
-    var c = mxConstants.HANDLE_SIZE,
-      d = this.state.absolutePoints;
-    if (null != d && 1 < d.length)
-      for (var e = 0; e < this.state.absolutePoints.length - 1; e++)
-        if (null != this.bends[e + 1]) {
-          a = d[e];
-          b = d[e + 1];
-          var f = new mxPoint(a.x + (b.x - a.x) / 2, a.y + (b.y - a.y) / 2);
-          this.bends[e + 1].bounds = new mxRectangle(Math.round(f.x - c / 2), Math.round(f.y - c / 2), c, c);
-          this.bends[e + 1].redraw()
-        }
-  }
-};
-mxEdgeSegmentHandler.prototype.changePoints = function(a, b) {
-  b = [];
-  var c = this.abspoints;
-  if (1 < c.length)
-    for (var d = c[0], e = c[1], f = 2; f < c.length; f++) {
-      var g = c[f];
-      if ((Math.round(d.x) != Math.round(e.x) || Math.round(e.x) != Math.round(g.x)) && (Math.round(d.y) != Math.round(e.y) || Math.round(e.y) != Math.round(g.y))) d = e, e = e.clone(), this.convertPoint(
-        e, !1), b.push(e);
-      e = g
-    }
-  mxElbowEdgeHandler.prototype.changePoints.apply(this, arguments)
-};
-
-function mxKeyHandler(a, b) {
-  null != a && (this.graph = a, this.target = b || document.documentElement, this.normalKeys = [], this.shiftKeys = [], this.controlKeys = [], this.controlShiftKeys = [], mxEvent.addListener(this.target,
-    "keydown", mxUtils.bind(this, function(a) {
-      this.keyDown(a)
-    })), mxClient.IS_IE && mxEvent.addListener(window, "unload", mxUtils.bind(this, function() {
-    this.destroy()
-  })))
-}
-mxKeyHandler.prototype.graph = null;
-mxKeyHandler.prototype.target = null;
-mxKeyHandler.prototype.normalKeys = null;
-mxKeyHandler.prototype.shiftKeys = null;
-mxKeyHandler.prototype.controlKeys = null;
-mxKeyHandler.prototype.controlShiftKeys = null;
-mxKeyHandler.prototype.enabled = !0;
-mxKeyHandler.prototype.isEnabled = function() {
-  return this.enabled
-};
-mxKeyHandler.prototype.setEnabled = function(a) {
-  this.enabled = a
-};
-mxKeyHandler.prototype.bindKey = function(a, b) {
-  this.normalKeys[a] = b
-};
-mxKeyHandler.prototype.bindShiftKey = function(a, b) {
-  this.shiftKeys[a] = b
-};
-mxKeyHandler.prototype.bindControlKey = function(a, b) {
-  this.controlKeys[a] = b
-};
-mxKeyHandler.prototype.bindControlShiftKey = function(a, b) {
-  this.controlShiftKeys[a] = b
-};
-mxKeyHandler.prototype.isControlDown = function(a) {
-  return mxEvent.isControlDown(a)
-};
-mxKeyHandler.prototype.getFunction = function(a) {
-  return null != a ? this.isControlDown(a) ? mxEvent.isShiftDown(a) ? this.controlShiftKeys[a.keyCode] : this.controlKeys[a.keyCode] : mxEvent.isShiftDown(a) ? this.shiftKeys[a.keyCode] : this.normalKeys[
-    a.keyCode] : null
-};
-mxKeyHandler.prototype.isGraphEvent = function(a) {
-  a = mxEvent.getSource(a);
-  if (a == this.target || a.parentNode == this.target || null != this.graph.cellEditor && a == this.graph.cellEditor.textarea) return !0;
-  for (; null != a;) {
-    if (a == this.graph.container) return !0;
-    a = a.parentNode
-  }
-  return !1
-};
-mxKeyHandler.prototype.keyDown = function(a) {
-  if (this.graph.isEnabled() && !mxEvent.isConsumed(a) && this.isGraphEvent(a) && this.isEnabled())
-    if (27 == a.keyCode) this.escape(a);
-    else if (!this.graph.isEditing()) {
-    var b = this.getFunction(a);
-    null != b && (b(a), mxEvent.consume(a))
-  }
-};
-mxKeyHandler.prototype.escape = function(a) {
-  this.graph.isEscapeEnabled() && this.graph.escape(a)
-};
-mxKeyHandler.prototype.destroy = function() {
-  this.target = null
-};
-
-function mxTooltipHandler(a, b) {
-  null != a && (this.graph = a, this.delay = b || 500, this.graph.addMouseListener(this))
-}
-mxTooltipHandler.prototype.zIndex = 10005;
-mxTooltipHandler.prototype.graph = null;
-mxTooltipHandler.prototype.delay = null;
-mxTooltipHandler.prototype.hideOnHover = !1;
-mxTooltipHandler.prototype.enabled = !0;
-mxTooltipHandler.prototype.isEnabled = function() {
-  return this.enabled
-};
-mxTooltipHandler.prototype.setEnabled = function(a) {
-  this.enabled = a
-};
-mxTooltipHandler.prototype.isHideOnHover = function() {
-  return this.hideOnHover
-};
-mxTooltipHandler.prototype.setHideOnHover = function(a) {
-  this.hideOnHover = a
-};
-mxTooltipHandler.prototype.init = function() {
-  null != document.body && (this.div = document.createElement("div"), this.div.className = "mxTooltip", this.div.style.visibility = "hidden", this.div.style.zIndex = this.zIndex, document.body.appendChild(
-    this.div), mxEvent.addListener(this.div, "mousedown", mxUtils.bind(this, function(a) {
-    this.hideTooltip()
-  })))
-};
-mxTooltipHandler.prototype.mouseDown = function(a, b) {
-  this.reset(b, !1);
-  this.hideTooltip()
-};
-mxTooltipHandler.prototype.mouseMove = function(a, b) {
-  if (b.getX() != this.lastX || b.getY() != this.lastY) this.reset(b, !0), (this.isHideOnHover() || b.getState() != this.state || b.getSource() != this.node && (!this.stateSource || null != b.getState() &&
-    this.stateSource == (b.isSource(b.getState().shape) || !b.isSource(b.getState().text)))) && this.hideTooltip();
-  this.lastX = b.getX();
-  this.lastY = b.getY()
-};
-mxTooltipHandler.prototype.mouseUp = function(a, b) {
-  this.reset(b, !0);
-  this.hideTooltip()
-};
-mxTooltipHandler.prototype.resetTimer = function() {
-  null != this.thread && (window.clearTimeout(this.thread), this.thread = null)
-};
-mxTooltipHandler.prototype.reset = function(a, b) {
-  this.resetTimer();
-  if (b && this.isEnabled() && null != a.getState() && (null == this.div || "hidden" == this.div.style.visibility)) {
-    var c = a.getState(),
-      d = a.getSource(),
-      e = a.getX(),
-      f = a.getY(),
-      g = a.isSource(c.shape) || a.isSource(c.text);
-    this.thread = window.setTimeout(mxUtils.bind(this, function() {
-      if (!this.graph.isEditing() && !this.graph.panningHandler.isMenuShowing()) {
-        var a = this.graph.getTooltip(c, d, e, f);
-        this.show(a, e, f);
-        this.state = c;
-        this.node = d;
-        this.stateSource = g
-      }
-    }), this.delay)
-  }
-};
-mxTooltipHandler.prototype.hide = function() {
-  this.resetTimer();
-  this.hideTooltip()
-};
-mxTooltipHandler.prototype.hideTooltip = function() {
-  null != this.div && (this.div.style.visibility = "hidden")
-};
-mxTooltipHandler.prototype.show = function(a, b, c) {
-  if (null != a && 0 < a.length) {
-    null == this.div && this.init();
-    var d = mxUtils.getScrollOrigin();
-    this.div.style.left = b + d.x + "px";
-    this.div.style.top = c + mxConstants.TOOLTIP_VERTICAL_OFFSET + d.y + "px";
-    mxUtils.isNode(a) ? (this.div.innerHTML = "", this.div.appendChild(a)) : this.div.innerHTML = a.replace(/\n/g, "\x3cbr\x3e");
-    this.div.style.visibility = "";
-    mxUtils.fit(this.div)
-  }
-};
-mxTooltipHandler.prototype.destroy = function() {
-  this.graph.removeMouseListener(this);
-  mxEvent.release(this.div);
-  null != this.div && null != this.div.parentNode && this.div.parentNode.removeChild(this.div);
-  this.div = null
-};
-
-function mxCellTracker(a, b, c) {
-  mxCellMarker.call(this, a, b);
-  this.graph.addMouseListener(this);
-  null != c && (this.getCell = c);
-  mxClient.IS_IE && mxEvent.addListener(window, "unload", mxUtils.bind(this, function() {
-    this.destroy()
-  }))
-}
-mxUtils.extend(mxCellTracker, mxCellMarker);
-mxCellTracker.prototype.mouseDown = function(a, b) {};
-mxCellTracker.prototype.mouseMove = function(a, b) {
-  this.isEnabled() && this.process(b)
-};
-mxCellTracker.prototype.mouseUp = function(a, b) {
-  this.reset()
-};
-mxCellTracker.prototype.destroy = function() {
-  this.destroyed || (this.destroyed = !0, this.graph.removeMouseListener(this), mxCellMarker.prototype.destroy.apply(this))
-};
-
-function mxCellHighlight(a, b, c, d) {
-  null != a && (this.graph = a, this.highlightColor = null != b ? b : mxConstants.DEFAULT_VALID_COLOR, this.strokeWidth = null != c ? c : mxConstants.HIGHLIGHT_STROKEWIDTH, this.dashed = null != d ?
-    d : !1, this.repaintHandler = mxUtils.bind(this, function() {
-      this.repaint()
-    }), this.graph.getView().addListener(mxEvent.SCALE, this.repaintHandler), this.graph.getView().addListener(mxEvent.TRANSLATE, this.repaintHandler), this.graph.getView().addListener(mxEvent.SCALE_AND_TRANSLATE,
-      this.repaintHandler), this.graph.getModel().addListener(mxEvent.CHANGE,
-      this.repaintHandler), this.resetHandler = mxUtils.bind(this, function() {
-      this.hide()
-    }), this.graph.getView().addListener(mxEvent.DOWN, this.resetHandler), this.graph.getView().addListener(mxEvent.UP, this.resetHandler))
-}
-mxCellHighlight.prototype.keepOnTop = !1;
-mxCellHighlight.prototype.graph = !0;
-mxCellHighlight.prototype.state = null;
-mxCellHighlight.prototype.spacing = 2;
-mxCellHighlight.prototype.resetHandler = null;
-mxCellHighlight.prototype.setHighlightColor = function(a) {
-  this.highlightColor = a;
-  null != this.shape && (this.shape.stroke = a)
-};
-mxCellHighlight.prototype.drawHighlight = function() {
-  this.shape = this.createShape();
-  this.repaint();
-  !this.keepOnTop && this.shape.node.parentNode.firstChild != this.shape.node && this.shape.node.parentNode.insertBefore(this.shape.node, this.shape.node.parentNode.firstChild)
-};
-mxCellHighlight.prototype.createShape = function() {
-  var a = null,
-    a = this.graph.model.isEdge(this.state.cell) ? new mxPolyline(this.state.absolutePoints, this.highlightColor, this.strokeWidth) : new mxRectangleShape(new mxRectangle, null, this.highlightColor,
-      this.strokeWidth);
-  a.dialect = this.graph.dialect != mxConstants.DIALECT_SVG ? mxConstants.DIALECT_VML : mxConstants.DIALECT_SVG;
-  a.init(this.graph.getView().getOverlayPane());
-  mxEvent.redirectMouseEvents(a.node, this.graph, this.state);
-  a.svgStrokeTolerance = 0;
-  a.pointerEvents = !1;
-  a.isDashed = this.dashed;
-  return a
-};
-mxCellHighlight.prototype.repaint = function() {
-  if (null != this.state && null != this.shape) {
-    var a = 0;
-    this.graph.model.isEdge(this.state.cell) ? this.shape.points = this.state.absolutePoints : (this.shape.bounds = new mxRectangle(this.state.x - this.spacing, this.state.y - this.spacing, this.state
-      .width + 2 * this.spacing, this.state.height + 2 * this.spacing), a = Number(this.state.style[mxConstants.STYLE_ROTATION] || "0"));
-    null != this.state.shape && this.shape.setCursor(this.state.shape.getCursor());
-    0 != a && (this.shape.rotation = a);
-    this.shape.redraw()
-  }
-};
-mxCellHighlight.prototype.hide = function() {
-  this.highlight(null)
-};
-mxCellHighlight.prototype.highlight = function(a) {
-  this.state != a && (null != this.shape && (this.shape.destroy(), this.shape = null), this.state = a, null != this.state && this.drawHighlight())
-};
-mxCellHighlight.prototype.destroy = function() {
-  this.graph.getView().removeListener(this.repaintHandler);
-  this.graph.getModel().removeListener(this.repaintHandler);
-  this.graph.getView().removeListener(this.resetHandler);
-  this.graph.getModel().removeListener(this.resetHandler);
-  null != this.shape && (this.shape.destroy(), this.shape = null)
-};
-
-function mxDefaultKeyHandler(a) {
-  if (null != a) {
-    this.editor = a;
-    this.handler = new mxKeyHandler(a.graph);
-    var b = this.handler.escape;
-    this.handler.escape = function(c) {
-      b.apply(this, arguments);
-      a.hideProperties();
-      a.fireEvent(new mxEventObject(mxEvent.ESCAPE, "event", c))
-    }
-  }
-}
-mxDefaultKeyHandler.prototype.editor = null;
-mxDefaultKeyHandler.prototype.handler = null;
-mxDefaultKeyHandler.prototype.bindAction = function(a, b, c) {
-  var d = mxUtils.bind(this, function() {
-    this.editor.execute(b)
-  });
-  c ? this.handler.bindControlKey(a, d) : this.handler.bindKey(a, d)
-};
-mxDefaultKeyHandler.prototype.destroy = function() {
-  this.handler.destroy();
-  this.handler = null
-};
-
-function mxDefaultPopupMenu(a) {
-  this.config = a
-}
-mxDefaultPopupMenu.prototype.imageBasePath = null;
-mxDefaultPopupMenu.prototype.config = null;
-mxDefaultPopupMenu.prototype.createMenu = function(a, b, c, d) {
-  if (null != this.config) {
-    var e = this.createConditions(a, c, d);
-    this.addItems(a, b, c, d, e, this.config.firstChild, null)
-  }
-};
-mxDefaultPopupMenu.prototype.addItems = function(a, b, c, d, e, f, g) {
-  for (var h = !1; null != f;) {
-    if ("add" == f.nodeName) {
-      var k = f.getAttribute("if");
-      if (null == k || e[k]) {
-        var k = f.getAttribute("as"),
-          k = mxResources.get(k) || k,
-          l = mxUtils.eval(mxUtils.getTextContent(f)),
-          m = f.getAttribute("action"),
-          n = f.getAttribute("icon"),
-          p = f.getAttribute("iconCls");
-        h && (b.addSeparator(g), h = !1);
-        null != n && this.imageBasePath && (n = this.imageBasePath + n);
-        k = this.addAction(b, a, k, n, l, m, c, g, p);
-        this.addItems(a, b, c, d, e, f.firstChild, k)
-      }
-    } else "separator" ==
-      f.nodeName && (h = !0);
-    f = f.nextSibling
-  }
-};
-mxDefaultPopupMenu.prototype.addAction = function(a, b, c, d, e, f, g, h, k) {
-  return a.addItem(c, d, function(a) {
-    "function" == typeof e && e.call(b, b, g, a);
-    null != f && b.execute(f, g, a)
-  }, h, k)
-};
-mxDefaultPopupMenu.prototype.createConditions = function(a, b, c) {
-  var d = a.graph.getModel(),
-    e = d.getChildCount(b),
-    f = [];
-  f.nocell = null == b;
-  f.ncells = 1 < a.graph.getSelectionCount();
-  f.notRoot = d.getRoot() != d.getParent(a.graph.getDefaultParent());
-  f.cell = null != b;
-  d = null != b && 1 == a.graph.getSelectionCount();
-  f.nonEmpty = d && 0 < e;
-  f.expandable = d && a.graph.isCellFoldable(b, !1);
-  f.collapsable = d && a.graph.isCellFoldable(b, !0);
-  f.validRoot = d && a.graph.isValidRoot(b);
-  f.emptyValidRoot = f.validRoot && 0 == e;
-  f.swimlane = d && a.graph.isSwimlane(b);
-  e = this.config.getElementsByTagName("condition");
-  for (d = 0; d < e.length; d++) {
-    var g = mxUtils.eval(mxUtils.getTextContent(e[d])),
-      h = e[d].getAttribute("name");
-    null != h && "function" == typeof g && (f[h] = g(a, b, c))
-  }
-  return f
-};
-
-function mxDefaultToolbar(a, b) {
-  this.editor = b;
-  null != a && null != b && this.init(a)
-}
-mxDefaultToolbar.prototype.editor = null;
-mxDefaultToolbar.prototype.toolbar = null;
-mxDefaultToolbar.prototype.resetHandler = null;
-mxDefaultToolbar.prototype.spacing = 4;
-mxDefaultToolbar.prototype.connectOnDrop = !1;
-mxDefaultToolbar.prototype.init = function(a) {
-  null != a && (this.toolbar = new mxToolbar(a), this.toolbar.addListener(mxEvent.SELECT, mxUtils.bind(this, function(a, c) {
-    var d = c.getProperty("function");
-    this.editor.insertFunction = null != d ? mxUtils.bind(this, function() {
-      d.apply(this, arguments);
-      this.toolbar.resetMode()
-    }) : null
-  })), this.resetHandler = mxUtils.bind(this, function() {
-    null != this.toolbar && this.toolbar.resetMode(!0)
-  }), this.editor.graph.addListener(mxEvent.DOUBLE_CLICK, this.resetHandler), this.editor.addListener(mxEvent.ESCAPE,
-    this.resetHandler))
-};
-mxDefaultToolbar.prototype.addItem = function(a, b, c, d) {
-  var e = mxUtils.bind(this, function() {
-    null != c && 0 < c.length && this.editor.execute(c)
-  });
-  return this.toolbar.addItem(a, b, e, d)
-};
-mxDefaultToolbar.prototype.addSeparator = function(a) {
-  a = a || mxClient.imageBasePath + "/separator.gif";
-  this.toolbar.addSeparator(a)
-};
-mxDefaultToolbar.prototype.addCombo = function() {
-  return this.toolbar.addCombo()
-};
-mxDefaultToolbar.prototype.addActionCombo = function(a) {
-  return this.toolbar.addActionCombo(a)
-};
-mxDefaultToolbar.prototype.addActionOption = function(a, b, c) {
-  var d = mxUtils.bind(this, function() {
-    this.editor.execute(c)
-  });
-  this.addOption(a, b, d)
-};
-mxDefaultToolbar.prototype.addOption = function(a, b, c) {
-  return this.toolbar.addOption(a, b, c)
-};
-mxDefaultToolbar.prototype.addMode = function(a, b, c, d, e) {
-  var f = mxUtils.bind(this, function() {
-    this.editor.setMode(c);
-    null != e && e(this.editor)
-  });
-  return this.toolbar.addSwitchMode(a, b, f, d)
-};
-mxDefaultToolbar.prototype.addPrototype = function(a, b, c, d, e, f) {
-  var g = function() {
-      return "function" == typeof c ? c() : null != c ? c.clone() : null
-    },
-    h = mxUtils.bind(this, function(a, b) {
-      "function" == typeof e ? e(this.editor, g(), a, b) : this.drop(g(), a, b);
-      this.toolbar.resetMode();
-      mxEvent.consume(a)
-    });
-  a = this.toolbar.addMode(a, b, h, d, null, f);
-  this.installDropHandler(a, function(a, b, c) {
-    h(b, c)
-  });
-  return a
-};
-mxDefaultToolbar.prototype.drop = function(a, b, c) {
-  var d = this.editor.graph,
-    e = d.getModel();
-  if (null == c || e.isEdge(c) || !this.connectOnDrop || !d.isCellConnectable(c)) {
-    for (; null != c && !d.isValidDropTarget(c, [a], b);) c = e.getParent(c);
-    this.insert(a, b, c)
-  } else this.connect(a, b, c)
-};
-mxDefaultToolbar.prototype.insert = function(a, b, c) {
-  var d = this.editor.graph;
-  if (d.canImportCell(a)) {
-    var e = mxEvent.getClientX(b),
-      f = mxEvent.getClientY(b),
-      e = mxUtils.convertPoint(d.container, e, f);
-    return d.isSplitEnabled() && d.isSplitTarget(c, [a], b) ? d.splitEdge(c, [a], null, e.x, e.y) : this.editor.addVertex(c, a, e.x, e.y)
-  }
-  return null
-};
-mxDefaultToolbar.prototype.connect = function(a, b, c) {
-  b = this.editor.graph;
-  var d = b.getModel();
-  if (null != c && b.isCellConnectable(a) && b.isEdgeValid(null, c, a)) {
-    var e = null;
-    d.beginUpdate();
-    try {
-      var f = d.getGeometry(c),
-        g = d.getGeometry(a).clone();
-      g.x = f.x + (f.width - g.width) / 2;
-      g.y = f.y + (f.height - g.height) / 2;
-      var h = this.spacing * b.gridSize,
-        k = 20 * d.getDirectedEdgeCount(c, !0);
-      this.editor.horizontalFlow ? g.x += (g.width + f.width) / 2 + h + k : g.y += (g.height + f.height) / 2 + h + k;
-      a.setGeometry(g);
-      var l = d.getParent(c);
-      b.addCell(a, l);
-      b.constrainChild(a);
-      e = this.editor.createEdge(c, a);
-      if (null == d.getGeometry(e)) {
-        var m = new mxGeometry;
-        m.relative = !0;
-        d.setGeometry(e, m)
-      }
-      b.addEdge(e, l, c, a)
-    } finally {
-      d.endUpdate()
-    }
-    b.setSelectionCells([a, e]);
-    b.scrollCellToVisible(a)
-  }
-};
-mxDefaultToolbar.prototype.installDropHandler = function(a, b) {
-  var c = document.createElement("img");
-  c.setAttribute("src", a.getAttribute("src"));
-  var d = mxUtils.bind(this, function(e) {
-    c.style.width = 2 * a.offsetWidth + "px";
-    c.style.height = 2 * a.offsetHeight + "px";
-    mxUtils.makeDraggable(a, this.editor.graph, b, c);
-    mxEvent.removeListener(c, "load", d)
-  });
-  mxClient.IS_IE ? d() : mxEvent.addListener(c, "load", d)
-};
-mxDefaultToolbar.prototype.destroy = function() {
-  null != this.resetHandler && (this.editor.graph.removeListener("dblclick", this.resetHandler), this.editor.removeListener("escape", this.resetHandler), this.resetHandler = null);
-  null != this.toolbar && (this.toolbar.destroy(), this.toolbar = null)
-};
-
-function mxEditor(a) {
-  this.actions = [];
-  this.addActions();
-  if (null != document.body) {
-    this.cycleAttributeValues = [];
-    this.popupHandler = new mxDefaultPopupMenu;
-    this.undoManager = new mxUndoManager;
-    this.graph = this.createGraph();
-    this.toolbar = this.createToolbar();
-    this.keyHandler = new mxDefaultKeyHandler(this);
-    this.configure(a);
-    this.graph.swimlaneIndicatorColorAttribute = this.cycleAttributeName;
-    !mxClient.IS_LOCAL && null != this.urlInit && (this.session = this.createSession());
-    if (null != this.onInit) this.onInit();
-    mxClient.IS_IE &&
-      mxEvent.addListener(window, "unload", mxUtils.bind(this, function() {
-        this.destroy()
-      }))
-  }
-}
-mxLoadResources && mxResources.add(mxClient.basePath + "/resources/editor");
-mxEditor.prototype = new mxEventSource;
-mxEditor.prototype.constructor = mxEditor;
-mxEditor.prototype.askZoomResource = "none" != mxClient.language ? "askZoom" : "";
-mxEditor.prototype.lastSavedResource = "none" != mxClient.language ? "lastSaved" : "";
-mxEditor.prototype.currentFileResource = "none" != mxClient.language ? "currentFile" : "";
-mxEditor.prototype.propertiesResource = "none" != mxClient.language ? "properties" : "";
-mxEditor.prototype.tasksResource = "none" != mxClient.language ? "tasks" : "";
-mxEditor.prototype.helpResource = "none" != mxClient.language ? "help" : "";
-mxEditor.prototype.outlineResource = "none" != mxClient.language ? "outline" : "";
-mxEditor.prototype.outline = null;
-mxEditor.prototype.graph = null;
-mxEditor.prototype.graphRenderHint = null;
-mxEditor.prototype.toolbar = null;
-mxEditor.prototype.session = null;
-mxEditor.prototype.status = null;
-mxEditor.prototype.popupHandler = null;
-mxEditor.prototype.undoManager = null;
-mxEditor.prototype.keyHandler = null;
-mxEditor.prototype.actions = null;
-mxEditor.prototype.dblClickAction = "edit";
-mxEditor.prototype.swimlaneRequired = !1;
-mxEditor.prototype.disableContextMenu = !0;
-mxEditor.prototype.insertFunction = null;
-mxEditor.prototype.forcedInserting = !1;
-mxEditor.prototype.templates = null;
-mxEditor.prototype.defaultEdge = null;
-mxEditor.prototype.defaultEdgeStyle = null;
-mxEditor.prototype.defaultGroup = null;
-mxEditor.prototype.groupBorderSize = null;
-mxEditor.prototype.filename = null;
-mxEditor.prototype.linefeed = "\x26#xa;";
-mxEditor.prototype.postParameterName = "xml";
-mxEditor.prototype.escapePostData = !0;
-mxEditor.prototype.urlPost = null;
-mxEditor.prototype.urlImage = null;
-mxEditor.prototype.urlInit = null;
-mxEditor.prototype.urlNotify = null;
-mxEditor.prototype.urlPoll = null;
-mxEditor.prototype.horizontalFlow = !1;
-mxEditor.prototype.layoutDiagram = !1;
-mxEditor.prototype.swimlaneSpacing = 0;
-mxEditor.prototype.maintainSwimlanes = !1;
-mxEditor.prototype.layoutSwimlanes = !1;
-mxEditor.prototype.cycleAttributeValues = null;
-mxEditor.prototype.cycleAttributeIndex = 0;
-mxEditor.prototype.cycleAttributeName = "fillColor";
-mxEditor.prototype.tasks = null;
-mxEditor.prototype.tasksWindowImage = null;
-mxEditor.prototype.tasksTop = 20;
-mxEditor.prototype.help = null;
-mxEditor.prototype.helpWindowImage = null;
-mxEditor.prototype.urlHelp = null;
-mxEditor.prototype.helpWidth = 300;
-mxEditor.prototype.helpHeight = 260;
-mxEditor.prototype.propertiesWidth = 240;
-mxEditor.prototype.propertiesHeight = null;
-mxEditor.prototype.movePropertiesDialog = !1;
-mxEditor.prototype.validating = !1;
-mxEditor.prototype.modified = !1;
-mxEditor.prototype.isModified = function() {
-  return this.modified
-};
-mxEditor.prototype.setModified = function(a) {
-  this.modified = a
-};
-mxEditor.prototype.addActions = function() {
-  this.addAction("save", function(a) {
-    a.save()
-  });
-  this.addAction("print", function(a) {
-    (new mxPrintPreview(a.graph, 1)).open()
-  });
-  this.addAction("show", function(a) {
-    mxUtils.show(a.graph, null, 10, 10)
-  });
-  this.addAction("exportImage", function(a) {
-    var b = a.getUrlImage();
-    if (null == b || mxClient.IS_LOCAL) a.execute("show");
-    else {
-      var c = mxUtils.getViewXml(a.graph, 1),
-        c = mxUtils.getXml(c, "\n");
-      mxUtils.submit(b, a.postParameterName + "\x3d" + encodeURIComponent(c), document, "_blank")
-    }
-  });
-  this.addAction("refresh",
-    function(a) {
-      a.graph.refresh()
-    });
-  this.addAction("cut", function(a) {
-    a.graph.isEnabled() && mxClipboard.cut(a.graph)
-  });
-  this.addAction("copy", function(a) {
-    a.graph.isEnabled() && mxClipboard.copy(a.graph)
-  });
-  this.addAction("paste", function(a) {
-    a.graph.isEnabled() && mxClipboard.paste(a.graph)
-  });
-  this.addAction("delete", function(a) {
-    a.graph.isEnabled() && a.graph.removeCells()
-  });
-  this.addAction("group", function(a) {
-    a.graph.isEnabled() && a.graph.setSelectionCell(a.groupCells())
-  });
-  this.addAction("ungroup", function(a) {
-    a.graph.isEnabled() &&
-      a.graph.setSelectionCells(a.graph.ungroupCells())
-  });
-  this.addAction("removeFromParent", function(a) {
-    a.graph.isEnabled() && a.graph.removeCellsFromParent()
-  });
-  this.addAction("undo", function(a) {
-    a.graph.isEnabled() && a.undo()
-  });
-  this.addAction("redo", function(a) {
-    a.graph.isEnabled() && a.redo()
-  });
-  this.addAction("zoomIn", function(a) {
-    a.graph.zoomIn()
-  });
-  this.addAction("zoomOut", function(a) {
-    a.graph.zoomOut()
-  });
-  this.addAction("actualSize", function(a) {
-    a.graph.zoomActual()
-  });
-  this.addAction("fit", function(a) {
-    a.graph.fit()
-  });
-  this.addAction("showProperties", function(a, b) {
-    a.showProperties(b)
-  });
-  this.addAction("selectAll", function(a) {
-    a.graph.isEnabled() && a.graph.selectAll()
-  });
-  this.addAction("selectNone", function(a) {
-    a.graph.isEnabled() && a.graph.clearSelection()
-  });
-  this.addAction("selectVertices", function(a) {
-    a.graph.isEnabled() && a.graph.selectVertices()
-  });
-  this.addAction("selectEdges", function(a) {
-    a.graph.isEnabled() && a.graph.selectEdges()
-  });
-  this.addAction("edit", function(a, b) {
-    a.graph.isEnabled() && a.graph.isCellEditable(b) && a.graph.startEditingAtCell(b)
-  });
-  this.addAction("toBack", function(a, b) {
-    a.graph.isEnabled() && a.graph.orderCells(!0)
-  });
-  this.addAction("toFront", function(a, b) {
-    a.graph.isEnabled() && a.graph.orderCells(!1)
-  });
-  this.addAction("enterGroup", function(a, b) {
-    a.graph.enterGroup(b)
-  });
-  this.addAction("exitGroup", function(a) {
-    a.graph.exitGroup()
-  });
-  this.addAction("home", function(a) {
-    a.graph.home()
-  });
-  this.addAction("selectPrevious", function(a) {
-    a.graph.isEnabled() && a.graph.selectPreviousCell()
-  });
-  this.addAction("selectNext", function(a) {
-    a.graph.isEnabled() &&
-      a.graph.selectNextCell()
-  });
-  this.addAction("selectParent", function(a) {
-    a.graph.isEnabled() && a.graph.selectParentCell()
-  });
-  this.addAction("selectChild", function(a) {
-    a.graph.isEnabled() && a.graph.selectChildCell()
-  });
-  this.addAction("collapse", function(a) {
-    a.graph.isEnabled() && a.graph.foldCells(!0)
-  });
-  this.addAction("collapseAll", function(a) {
-    if (a.graph.isEnabled()) {
-      var b = a.graph.getChildVertices();
-      a.graph.foldCells(!0, !1, b)
-    }
-  });
-  this.addAction("expand", function(a) {
-    a.graph.isEnabled() && a.graph.foldCells(!1)
-  });
-  this.addAction("expandAll", function(a) {
-    if (a.graph.isEnabled()) {
-      var b = a.graph.getChildVertices();
-      a.graph.foldCells(!1, !1, b)
-    }
-  });
-  this.addAction("bold", function(a) {
-    a.graph.isEnabled() && a.graph.toggleCellStyleFlags(mxConstants.STYLE_FONTSTYLE, mxConstants.FONT_BOLD)
-  });
-  this.addAction("italic", function(a) {
-    a.graph.isEnabled() && a.graph.toggleCellStyleFlags(mxConstants.STYLE_FONTSTYLE, mxConstants.FONT_ITALIC)
-  });
-  this.addAction("underline", function(a) {
-    a.graph.isEnabled() && a.graph.toggleCellStyleFlags(mxConstants.STYLE_FONTSTYLE,
-      mxConstants.FONT_UNDERLINE)
-  });
-  this.addAction("shadow", function(a) {
-    a.graph.isEnabled() && a.graph.toggleCellStyleFlags(mxConstants.STYLE_FONTSTYLE, mxConstants.FONT_SHADOW)
-  });
-  this.addAction("alignCellsLeft", function(a) {
-    a.graph.isEnabled() && a.graph.alignCells(mxConstants.ALIGN_LEFT)
-  });
-  this.addAction("alignCellsCenter", function(a) {
-    a.graph.isEnabled() && a.graph.alignCells(mxConstants.ALIGN_CENTER)
-  });
-  this.addAction("alignCellsRight", function(a) {
-    a.graph.isEnabled() && a.graph.alignCells(mxConstants.ALIGN_RIGHT)
-  });
-  this.addAction("alignCellsTop", function(a) {
-    a.graph.isEnabled() && a.graph.alignCells(mxConstants.ALIGN_TOP)
-  });
-  this.addAction("alignCellsMiddle", function(a) {
-    a.graph.isEnabled() && a.graph.alignCells(mxConstants.ALIGN_MIDDLE)
-  });
-  this.addAction("alignCellsBottom", function(a) {
-    a.graph.isEnabled() && a.graph.alignCells(mxConstants.ALIGN_BOTTOM)
-  });
-  this.addAction("alignFontLeft", function(a) {
-    a.graph.setCellStyles(mxConstants.STYLE_ALIGN, mxConstants.ALIGN_LEFT)
-  });
-  this.addAction("alignFontCenter", function(a) {
-    a.graph.isEnabled() &&
-      a.graph.setCellStyles(mxConstants.STYLE_ALIGN, mxConstants.ALIGN_CENTER)
-  });
-  this.addAction("alignFontRight", function(a) {
-    a.graph.isEnabled() && a.graph.setCellStyles(mxConstants.STYLE_ALIGN, mxConstants.ALIGN_RIGHT)
-  });
-  this.addAction("alignFontTop", function(a) {
-    a.graph.isEnabled() && a.graph.setCellStyles(mxConstants.STYLE_VERTICAL_ALIGN, mxConstants.ALIGN_TOP)
-  });
-  this.addAction("alignFontMiddle", function(a) {
-    a.graph.isEnabled() && a.graph.setCellStyles(mxConstants.STYLE_VERTICAL_ALIGN, mxConstants.ALIGN_MIDDLE)
-  });
-  this.addAction("alignFontBottom", function(a) {
-    a.graph.isEnabled() && a.graph.setCellStyles(mxConstants.STYLE_VERTICAL_ALIGN, mxConstants.ALIGN_BOTTOM)
-  });
-  this.addAction("zoom", function(a) {
-    var b = 100 * a.graph.getView().scale,
-      b = parseFloat(mxUtils.prompt(mxResources.get(a.askZoomResource) || a.askZoomResource, b)) / 100;
-    isNaN(b) || a.graph.getView().setScale(b)
-  });
-  this.addAction("toggleTasks", function(a) {
-    null != a.tasks ? a.tasks.setVisible(!a.tasks.isVisible()) : a.showTasks()
-  });
-  this.addAction("toggleHelp", function(a) {
-    null !=
-      a.help ? a.help.setVisible(!a.help.isVisible()) : a.showHelp()
-  });
-  this.addAction("toggleOutline", function(a) {
-    null == a.outline ? a.showOutline() : a.outline.setVisible(!a.outline.isVisible())
-  });
-  this.addAction("toggleConsole", function(a) {
-    mxLog.setVisible(!mxLog.isVisible())
-  })
-};
-mxEditor.prototype.createSession = function() {
-  var a = mxUtils.bind(this, function(a) {
-    this.fireEvent(new mxEventObject(mxEvent.SESSION, "session", a))
-  });
-  return this.connect(this.urlInit, this.urlPoll, this.urlNotify, a)
-};
-mxEditor.prototype.configure = function(a) {
-  null != a && ((new mxCodec(a.ownerDocument)).decode(a, this), this.resetHistory())
-};
-mxEditor.prototype.resetFirstTime = function() {
-  document.cookie = "mxgraph\x3dseen; expires\x3dFri, 27 Jul 2001 02:47:11 UTC; path\x3d/"
-};
-mxEditor.prototype.resetHistory = function() {
-  this.lastSnapshot = (new Date).getTime();
-  this.undoManager.clear();
-  this.ignoredChanges = 0;
-  this.setModified(!1)
-};
-mxEditor.prototype.addAction = function(a, b) {
-  this.actions[a] = b
-};
-mxEditor.prototype.execute = function(a, b, c) {
-  var d = this.actions[a];
-  if (null != d) try {
-    var e = arguments;
-    e[0] = this;
-    d.apply(this, e)
-  } catch (f) {
-    throw mxUtils.error("Cannot execute " + a + ": " + f.message, 280, !0), f;
-  } else mxUtils.error("Cannot find action " + a, 280, !0)
-};
-mxEditor.prototype.addTemplate = function(a, b) {
-  this.templates[a] = b
-};
-mxEditor.prototype.getTemplate = function(a) {
-  return this.templates[a]
-};
-mxEditor.prototype.createGraph = function() {
-  var a = new mxGraph(null, null, this.graphRenderHint);
-  a.setTooltips(!0);
-  a.setPanning(!0);
-  this.installDblClickHandler(a);
-  this.installUndoHandler(a);
-  this.installDrillHandler(a);
-  this.installChangeHandler(a);
-  this.installInsertHandler(a);
-  a.panningHandler.factoryMethod = mxUtils.bind(this, function(a, c, d) {
-    return this.createPopupMenu(a, c, d)
-  });
-  a.connectionHandler.factoryMethod = mxUtils.bind(this, function(a, c) {
-    return this.createEdge(a, c)
-  });
-  this.createSwimlaneManager(a);
-  this.createLayoutManager(a);
-  return a
-};
-mxEditor.prototype.createSwimlaneManager = function(a) {
-  a = new mxSwimlaneManager(a, !1);
-  a.isHorizontal = mxUtils.bind(this, function() {
-    return this.horizontalFlow
-  });
-  a.isEnabled = mxUtils.bind(this, function() {
-    return this.maintainSwimlanes
-  });
-  return a
-};
-mxEditor.prototype.createLayoutManager = function(a) {
-  var b = new mxLayoutManager(a),
-    c = this;
-  b.getLayout = function(b) {
-    var e = null,
-      f = c.graph.getModel();
-    if (null != f.getParent(b))
-      if (c.layoutSwimlanes && a.isSwimlane(b)) null == c.swimlaneLayout && (c.swimlaneLayout = c.createSwimlaneLayout()), e = c.swimlaneLayout;
-      else if (c.layoutDiagram && (a.isValidRoot(b) || null == f.getParent(f.getParent(b)))) null == c.diagramLayout && (c.diagramLayout = c.createDiagramLayout()), e = c.diagramLayout;
-    return e
-  };
-  return b
-};
-mxEditor.prototype.setGraphContainer = function(a) {
-  null == this.graph.container && (this.graph.init(a), this.rubberband = new mxRubberband(this.graph), this.disableContextMenu && mxEvent.disableContextMenu(a), mxClient.IS_QUIRKS && new mxDivResizer(
-    a))
-};
-mxEditor.prototype.installDblClickHandler = function(a) {
-  a.addListener(mxEvent.DOUBLE_CLICK, mxUtils.bind(this, function(b, c) {
-    var d = c.getProperty("cell");
-    null != d && (a.isEnabled() && null != this.dblClickAction) && (this.execute(this.dblClickAction, d), c.consume())
-  }))
-};
-mxEditor.prototype.installUndoHandler = function(a) {
-  var b = mxUtils.bind(this, function(a, b) {
-    var e = b.getProperty("edit");
-    this.undoManager.undoableEditHappened(e)
-  });
-  a.getModel().addListener(mxEvent.UNDO, b);
-  a.getView().addListener(mxEvent.UNDO, b);
-  b = function(b, d) {
-    var e = d.getProperty("edit").changes;
-    a.setSelectionCells(a.getSelectionCellsForChanges(e))
-  };
-  this.undoManager.addListener(mxEvent.UNDO, b);
-  this.undoManager.addListener(mxEvent.REDO, b)
-};
-mxEditor.prototype.installDrillHandler = function(a) {
-  var b = mxUtils.bind(this, function(a) {
-    this.fireEvent(new mxEventObject(mxEvent.ROOT))
-  });
-  a.getView().addListener(mxEvent.DOWN, b);
-  a.getView().addListener(mxEvent.UP, b)
-};
-mxEditor.prototype.installChangeHandler = function(a) {
-  var b = mxUtils.bind(this, function(b, d) {
-    this.setModified(!0);
-    !0 == this.validating && a.validateGraph();
-    for (var e = d.getProperty("edit").changes, f = 0; f < e.length; f++) {
-      var g = e[f];
-      if (g instanceof mxRootChange || g instanceof mxValueChange && g.cell == this.graph.model.root || g instanceof mxCellAttributeChange && g.cell == this.graph.model.root) {
-        this.fireEvent(new mxEventObject(mxEvent.ROOT));
-        break
-      }
-    }
-  });
-  a.getModel().addListener(mxEvent.CHANGE, b)
-};
-mxEditor.prototype.installInsertHandler = function(a) {
-  var b = this;
-  a.addMouseListener({
-    mouseDown: function(a, d) {
-      if (null != b.insertFunction && !d.isPopupTrigger() && (b.forcedInserting || null == d.getState())) b.graph.clearSelection(), b.insertFunction(d.getEvent(), d.getCell()), this.isActive = !
-        0, d.consume()
-    },
-    mouseMove: function(a, b) {
-      this.isActive && b.consume()
-    },
-    mouseUp: function(a, b) {
-      this.isActive && (this.isActive = !1, b.consume())
-    }
-  })
-};
-mxEditor.prototype.createDiagramLayout = function() {
-  var a = this.graph.gridSize,
-    b = new mxStackLayout(this.graph, !this.horizontalFlow, this.swimlaneSpacing, 2 * a, 2 * a);
-  b.isVertexIgnored = function(a) {
-    return !b.graph.isSwimlane(a)
-  };
-  return b
-};
-mxEditor.prototype.createSwimlaneLayout = function() {
-  return new mxCompactTreeLayout(this.graph, this.horizontalFlow)
-};
-mxEditor.prototype.createToolbar = function() {
-  return new mxDefaultToolbar(null, this)
-};
-mxEditor.prototype.setToolbarContainer = function(a) {
-  this.toolbar.init(a);
-  mxClient.IS_QUIRKS && new mxDivResizer(a)
-};
-mxEditor.prototype.setStatusContainer = function(a) {
-  null == this.status && (this.status = a, this.addListener(mxEvent.SAVE, mxUtils.bind(this, function() {
-    var a = (new Date).toLocaleString();
-    this.setStatus((mxResources.get(this.lastSavedResource) || this.lastSavedResource) + ": " + a)
-  })), this.addListener(mxEvent.OPEN, mxUtils.bind(this, function() {
-    this.setStatus((mxResources.get(this.currentFileResource) || this.currentFileResource) + ": " + this.filename)
-  })), mxClient.IS_QUIRKS && new mxDivResizer(a))
-};
-mxEditor.prototype.setStatus = function(a) {
-  null != this.status && null != a && (this.status.innerHTML = a)
-};
-mxEditor.prototype.setTitleContainer = function(a) {
-  this.addListener(mxEvent.ROOT, mxUtils.bind(this, function(b) {
-    a.innerHTML = this.getTitle()
-  }));
-  mxClient.IS_QUIRKS && new mxDivResizer(a)
-};
-mxEditor.prototype.treeLayout = function(a, b) {
-  null != a && (new mxCompactTreeLayout(this.graph, b)).execute(a)
-};
-mxEditor.prototype.getTitle = function() {
-  for (var a = "", b = this.graph, c = b.getCurrentRoot(); null != c && null != b.getModel().getParent(b.getModel().getParent(c));) b.isValidRoot(c) && (a = " \x3e " + b.convertValueToString(c) + a),
-    c = b.getModel().getParent(c);
-  return this.getRootTitle() + a
-};
-mxEditor.prototype.getRootTitle = function() {
-  var a = this.graph.getModel().getRoot();
-  return this.graph.convertValueToString(a)
-};
-mxEditor.prototype.undo = function() {
-  this.undoManager.undo()
-};
-mxEditor.prototype.redo = function() {
-  this.undoManager.redo()
-};
-mxEditor.prototype.groupCells = function() {
-  var a = null != this.groupBorderSize ? this.groupBorderSize : this.graph.gridSize;
-  return this.graph.groupCells(this.createGroup(), a)
-};
-mxEditor.prototype.createGroup = function() {
-  return this.graph.getModel().cloneCell(this.defaultGroup)
-};
-mxEditor.prototype.open = function(a) {
-  if (null != a) {
-    var b = mxUtils.load(a).getXml();
-    this.readGraphModel(b.documentElement);
-    this.filename = a;
-    this.fireEvent(new mxEventObject(mxEvent.OPEN, "filename", a))
-  }
-};
-mxEditor.prototype.readGraphModel = function(a) {
-  (new mxCodec(a.ownerDocument)).decode(a, this.graph.getModel());
-  this.resetHistory()
-};
-mxEditor.prototype.save = function(a, b) {
-  a = a || this.getUrlPost();
-  if (null != a && 0 < a.length) {
-    var c = this.writeGraphModel(b);
-    this.postDiagram(a, c);
-    this.setModified(!1)
-  }
-  this.fireEvent(new mxEventObject(mxEvent.SAVE, "url", a))
-};
-mxEditor.prototype.postDiagram = function(a, b) {
-  this.escapePostData && (b = encodeURIComponent(b));
-  mxUtils.post(a, this.postParameterName + "\x3d" + b, mxUtils.bind(this, function(c) {
-    this.fireEvent(new mxEventObject(mxEvent.POST, "request", c, "url", a, "data", b))
-  }))
-};
-mxEditor.prototype.writeGraphModel = function(a) {
-  a = null != a ? a : this.linefeed;
-  var b = (new mxCodec).encode(this.graph.getModel());
-  return mxUtils.getXml(b, a)
-};
-mxEditor.prototype.getUrlPost = function() {
-  return this.urlPost
-};
-mxEditor.prototype.getUrlImage = function() {
-  return this.urlImage
-};
-mxEditor.prototype.connect = function(a, b, c, d) {
-  var e = null;
-  mxClient.IS_LOCAL || (e = new mxSession(this.graph.getModel(), a, b, c), e.addListener(mxEvent.RECEIVE, mxUtils.bind(this, function(a, b) {
-    null != b.getProperty("node").getAttribute("namespace") && this.resetHistory()
-  })), e.addListener(mxEvent.DISCONNECT, d), e.addListener(mxEvent.CONNECT, d), e.addListener(mxEvent.NOTIFY, d), e.addListener(mxEvent.GET, d), e.start());
-  return e
-};
-mxEditor.prototype.swapStyles = function(a, b) {
-  var c = this.graph.getStylesheet().styles[b];
-  this.graph.getView().getStylesheet().putCellStyle(b, this.graph.getStylesheet().styles[a]);
-  this.graph.getStylesheet().putCellStyle(a, c);
-  this.graph.refresh()
-};
-mxEditor.prototype.showProperties = function(a) {
-  a = a || this.graph.getSelectionCell();
-  null == a && (a = this.graph.getCurrentRoot(), null == a && (a = this.graph.getModel().getRoot()));
-  if (null != a) {
-    this.graph.stopEditing(!0);
-    var b = mxUtils.getOffset(this.graph.container),
-      c = b.x + 10,
-      b = b.y;
-    if (null != this.properties && !this.movePropertiesDialog) c = this.properties.getX(), b = this.properties.getY();
-    else {
-      var d = this.graph.getCellBounds(a);
-      null != d && (c += d.x + Math.min(200, d.width), b += d.y)
-    }
-    this.hideProperties();
-    a = this.createProperties(a);
-    null != a && (this.properties = new mxWindow(mxResources.get(this.propertiesResource) || this.propertiesResource, a, c, b, this.propertiesWidth, this.propertiesHeight, !1), this.properties.setVisible(!
-      0))
-  }
-};
-mxEditor.prototype.isPropertiesVisible = function() {
-  return null != this.properties
-};
-mxEditor.prototype.createProperties = function(a) {
-  var b = this.graph.getModel(),
-    c = b.getValue(a);
-  if (mxUtils.isNode(c)) {
-    var d = new mxForm("properties");
-    d.addText("ID", a.getId()).setAttribute("readonly", "true");
-    var e = null,
-      f = null,
-      g = null,
-      h = null,
-      k = null;
-    b.isVertex(a) && (e = b.getGeometry(a), null != e && (f = d.addText("top", e.y), g = d.addText("left", e.x), h = d.addText("width", e.width), k = d.addText("height", e.height)));
-    for (var l = b.getStyle(a), m = d.addText("Style", l || ""), n = c.attributes, p = [], c = 0; c < n.length; c++) p[c] = d.addTextarea(n[c].nodeName,
-      n[c].nodeValue, "label" == n[c].nodeName ? 4 : 2);
-    c = mxUtils.bind(this, function() {
-      this.hideProperties();
-      b.beginUpdate();
-      try {
-        null != e && (e = e.clone(), e.x = parseFloat(g.value), e.y = parseFloat(f.value), e.width = parseFloat(h.value), e.height = parseFloat(k.value), b.setGeometry(a, e));
-        0 < m.value.length ? b.setStyle(a, m.value) : b.setStyle(a, null);
-        for (var c = 0; c < n.length; c++) {
-          var d = new mxCellAttributeChange(a, n[c].nodeName, p[c].value);
-          b.execute(d)
-        }
-        this.graph.isAutoSizeCell(a) && this.graph.updateCellSize(a)
-      } finally {
-        b.endUpdate()
-      }
-    });
-    l = mxUtils.bind(this, function() {
-      this.hideProperties()
-    });
-    d.addButtons(c, l);
-    return d.table
-  }
-  return null
-};
-mxEditor.prototype.hideProperties = function() {
-  null != this.properties && (this.properties.destroy(), this.properties = null)
-};
-mxEditor.prototype.showTasks = function() {
-  if (null == this.tasks) {
-    var a = document.createElement("div");
-    a.style.padding = "4px";
-    a.style.paddingLeft = "20px";
-    var b = document.body.clientWidth,
-      b = new mxWindow(mxResources.get(this.tasksResource) || this.tasksResource, a, b - 220, this.tasksTop, 200);
-    b.setClosable(!0);
-    b.destroyOnClose = !1;
-    var c = mxUtils.bind(this, function(b) {
-      mxEvent.release(a);
-      a.innerHTML = "";
-      this.createTasks(a)
-    });
-    this.graph.getModel().addListener(mxEvent.CHANGE, c);
-    this.graph.getSelectionModel().addListener(mxEvent.CHANGE,
-      c);
-    this.graph.addListener(mxEvent.ROOT, c);
-    null != this.tasksWindowImage && b.setImage(this.tasksWindowImage);
-    this.tasks = b;
-    this.createTasks(a)
-  }
-  this.tasks.setVisible(!0)
-};
-mxEditor.prototype.refreshTasks = function(a) {
-  null != this.tasks && (a = this.tasks.content, mxEvent.release(a), a.innerHTML = "", this.createTasks(a))
-};
-mxEditor.prototype.createTasks = function(a) {};
-mxEditor.prototype.showHelp = function(a) {
-  if (null == this.help) {
-    var b = document.createElement("iframe");
-    b.setAttribute("src", mxResources.get("urlHelp") || this.urlHelp);
-    b.setAttribute("height", "100%");
-    b.setAttribute("width", "100%");
-    b.setAttribute("frameBorder", "0");
-    b.style.backgroundColor = "white";
-    a = document.body.clientWidth;
-    var c = document.body.clientHeight || document.documentElement.clientHeight,
-      d = new mxWindow(mxResources.get(this.helpResource) || this.helpResource, b, (a - this.helpWidth) / 2, (c - this.helpHeight) /
-        3, this.helpWidth, this.helpHeight);
-    d.setMaximizable(!0);
-    d.setClosable(!0);
-    d.destroyOnClose = !1;
-    d.setResizable(!0);
-    null != this.helpWindowImage && d.setImage(this.helpWindowImage);
-    mxClient.IS_NS && (a = function(a) {
-      b.setAttribute("height", d.div.offsetHeight - 26 + "px")
-    }, d.addListener(mxEvent.RESIZE_END, a), d.addListener(mxEvent.MAXIMIZE, a), d.addListener(mxEvent.NORMALIZE, a), d.addListener(mxEvent.SHOW, a));
-    this.help = d
-  }
-  this.help.setVisible(!0)
-};
-mxEditor.prototype.showOutline = function() {
-  if (null == this.outline) {
-    var a = document.createElement("div");
-    a.style.overflow = "hidden";
-    a.style.width = "100%";
-    a.style.height = "100%";
-    a.style.background = "white";
-    a.style.cursor = "move";
-    var b = new mxWindow(mxResources.get(this.outlineResource) || this.outlineResource, a, 600, 480, 200, 200, !1),
-      c = new mxOutline(this.graph, a);
-    b.setClosable(!0);
-    b.setResizable(!0);
-    b.destroyOnClose = !1;
-    b.addListener(mxEvent.RESIZE_END, function() {
-      c.update()
-    });
-    this.outline = b;
-    this.outline.outline = c
-  }
-  this.outline.setVisible(!0);
-  this.outline.outline.update(!0)
-};
-mxEditor.prototype.setMode = function(a) {
-  "select" == a ? (this.graph.panningHandler.useLeftButtonForPanning = !1, this.graph.setConnectable(!1)) : "connect" == a ? (this.graph.panningHandler.useLeftButtonForPanning = !1, this.graph.setConnectable(!
-    0)) : "pan" == a && (this.graph.panningHandler.useLeftButtonForPanning = !0, this.graph.setConnectable(!1))
-};
-mxEditor.prototype.createPopupMenu = function(a, b, c) {
-  this.popupHandler.createMenu(this, a, b, c)
-};
-mxEditor.prototype.createEdge = function(a, b) {
-  var c = null;
-  if (null != this.defaultEdge) c = this.graph.getModel().cloneCell(this.defaultEdge);
-  else {
-    c = new mxCell("");
-    c.setEdge(!0);
-    var d = new mxGeometry;
-    d.relative = !0;
-    c.setGeometry(d)
-  }
-  d = this.getEdgeStyle();
-  null != d && c.setStyle(d);
-  return c
-};
-mxEditor.prototype.getEdgeStyle = function() {
-  return this.defaultEdgeStyle
-};
-mxEditor.prototype.consumeCycleAttribute = function(a) {
-  return null != this.cycleAttributeValues && 0 < this.cycleAttributeValues.length && this.graph.isSwimlane(a) ? this.cycleAttributeValues[this.cycleAttributeIndex++ % this.cycleAttributeValues.length] :
-    null
-};
-mxEditor.prototype.cycleAttribute = function(a) {
-  if (null != this.cycleAttributeName) {
-    var b = this.consumeCycleAttribute(a);
-    null != b && a.setStyle(a.getStyle() + ";" + this.cycleAttributeName + "\x3d" + b)
-  }
-};
-mxEditor.prototype.addVertex = function(a, b, c, d) {
-  for (var e = this.graph.getModel(); null != a && !this.graph.isValidDropTarget(a);) a = e.getParent(a);
-  a = null != a ? a : this.graph.getSwimlaneAt(c, d);
-  var f = this.graph.getView().scale,
-    g = e.getGeometry(b),
-    h = e.getGeometry(a);
-  if (this.graph.isSwimlane(b) && !this.graph.swimlaneNesting) a = null;
-  else {
-    if (null == a && this.swimlaneRequired) return null;
-    if (null != a && null != h) {
-      var k = this.graph.getView().getState(a);
-      if (null != k) {
-        if (c -= k.origin.x * f, d -= k.origin.y * f, this.graph.isConstrainedMoving) {
-          var h =
-            g.width,
-            l = g.height,
-            m = k.x + k.width;
-          c + h > m && (c -= c + h - m);
-          m = k.y + k.height;
-          d + l > m && (d -= d + l - m)
-        }
-      } else null != h && (c -= h.x * f, d -= h.y * f)
-    }
-  }
-  g = g.clone();
-  g.x = this.graph.snap(c / f - this.graph.getView().translate.x - this.graph.gridSize / 2);
-  g.y = this.graph.snap(d / f - this.graph.getView().translate.y - this.graph.gridSize / 2);
-  b.setGeometry(g);
-  null == a && (a = this.graph.getDefaultParent());
-  this.cycleAttribute(b);
-  this.fireEvent(new mxEventObject(mxEvent.BEFORE_ADD_VERTEX, "vertex", b, "parent", a));
-  e.beginUpdate();
-  try {
-    b = this.graph.addCell(b,
-      a), null != b && (this.graph.constrainChild(b), this.fireEvent(new mxEventObject(mxEvent.ADD_VERTEX, "vertex", b)))
-  } finally {
-    e.endUpdate()
-  }
-  null != b && (this.graph.setSelectionCell(b), this.graph.scrollCellToVisible(b), this.fireEvent(new mxEventObject(mxEvent.AFTER_ADD_VERTEX, "vertex", b)));
-  return b
-};
-mxEditor.prototype.destroy = function() {
-  this.destroyed || (this.destroyed = !0, null != this.tasks && this.tasks.destroy(), null != this.outline && this.outline.destroy(), null != this.properties && this.properties.destroy(), null !=
-    this.keyHandler && this.keyHandler.destroy(), null != this.rubberband && this.rubberband.destroy(), null != this.toolbar && this.toolbar.destroy(), null != this.graph && this.graph.destroy(),
-    this.templates = this.status = null)
-};
-var mxCodecRegistry = {
-  codecs: [],
-  aliases: [],
-  register: function(a) {
-    if (null != a) {
-      var b = a.getName();
-      mxCodecRegistry.codecs[b] = a;
-      var c = mxUtils.getFunctionName(a.template.constructor);
-      c != b && mxCodecRegistry.addAlias(c, b)
-    }
-    return a
-  },
-  addAlias: function(a, b) {
-    mxCodecRegistry.aliases[a] = b
-  },
-  getCodec: function(a) {
-    var b = null;
-    if (null != a) {
-      var b = mxUtils.getFunctionName(a),
-        c = mxCodecRegistry.aliases[b];
-      null != c && (b = c);
-      b = mxCodecRegistry.codecs[b];
-      if (null == b) try {
-        b = new mxObjectCodec(new a), mxCodecRegistry.register(b)
-      } catch (d) {}
-    }
-    return b
-  }
-};
-
-function mxCodec(a) {
-  this.document = a || mxUtils.createXmlDocument();
-  this.objects = []
-}
-mxCodec.prototype.document = null;
-mxCodec.prototype.objects = null;
-mxCodec.prototype.encodeDefaults = !1;
-mxCodec.prototype.putObject = function(a, b) {
-  return this.objects[a] = b
-};
-mxCodec.prototype.getObject = function(a) {
-  var b = null;
-  null != a && (b = this.objects[a], null == b && (b = this.lookup(a), null == b && (a = this.getElementById(a), null != a && (b = this.decode(a)))));
-  return b
-};
-mxCodec.prototype.lookup = function(a) {
-  return null
-};
-mxCodec.prototype.getElementById = function(a, b) {
-  return mxUtils.findNodeByAttribute(this.document.documentElement, null != b ? b : "id", a)
-};
-mxCodec.prototype.getId = function(a) {
-  var b = null;
-  null != a && (b = this.reference(a), null == b && a instanceof mxCell && (b = a.getId(), null == b && (b = mxCellPath.create(a), 0 == b.length && (b = "root"))));
-  return b
-};
-mxCodec.prototype.reference = function(a) {
-  return null
-};
-mxCodec.prototype.encode = function(a) {
-  var b = null;
-  if (null != a && null != a.constructor) {
-    var c = mxCodecRegistry.getCodec(a.constructor);
-    null != c ? b = c.encode(this, a) : mxUtils.isNode(a) ? b = mxClient.IS_IE ? a.cloneNode(!0) : this.document.importNode(a, !0) : mxLog.warn("mxCodec.encode: No codec for " + mxUtils.getFunctionName(
-      a.constructor))
-  }
-  return b
-};
-mxCodec.prototype.decode = function(a, b) {
-  var c = null;
-  if (null != a && a.nodeType == mxConstants.NODETYPE_ELEMENT) {
-    var d = null;
-    try {
-      d = eval(a.nodeName)
-    } catch (e) {}
-    try {
-      var f = mxCodecRegistry.getCodec(d);
-      null != f ? c = f.decode(this, a, b) : (c = a.cloneNode(!0), c.removeAttribute("as"))
-    } catch (g) {
-      mxLog.debug("Cannot decode " + a.nodeName + ": " + g.message)
-    }
-  }
-  return c
-};
-mxCodec.prototype.encodeCell = function(a, b, c) {
-  b.appendChild(this.encode(a));
-  if (null == c || c) {
-    c = a.getChildCount();
-    for (var d = 0; d < c; d++) this.encodeCell(a.getChildAt(d), b)
-  }
-};
-mxCodec.prototype.isCellCodec = function(a) {
-  return null != a && "function" == typeof a.isCellCodec ? a.isCellCodec() : !1
-};
-mxCodec.prototype.decodeCell = function(a, b) {
-  b = null != b ? b : !0;
-  var c = null;
-  if (null != a && a.nodeType == mxConstants.NODETYPE_ELEMENT) {
-    c = mxCodecRegistry.getCodec(a.nodeName);
-    if (!this.isCellCodec(c))
-      for (var d = a.firstChild; null != d && !this.isCellCodec(c);) c = mxCodecRegistry.getCodec(d.nodeName), d = d.nextSibling;
-    this.isCellCodec(c) || (c = mxCodecRegistry.getCodec(mxCell));
-    c = c.decode(this, a);
-    b && this.insertIntoGraph(c)
-  }
-  return c
-};
-mxCodec.prototype.insertIntoGraph = function(a) {
-  var b = a.parent,
-    c = a.getTerminal(!0),
-    d = a.getTerminal(!1);
-  a.setTerminal(null, !1);
-  a.setTerminal(null, !0);
-  a.parent = null;
-  null != b && b.insert(a);
-  null != c && c.insertEdge(a, !0);
-  null != d && d.insertEdge(a, !1)
-};
-mxCodec.prototype.setAttribute = function(a, b, c) {
-  null != b && null != c && a.setAttribute(b, c)
-};
-
-function mxObjectCodec(a, b, c, d) {
-  this.template = a;
-  this.exclude = null != b ? b : [];
-  this.idrefs = null != c ? c : [];
-  this.mapping = null != d ? d : [];
-  this.reverse = {};
-  for (var e in this.mapping) this.reverse[this.mapping[e]] = e
-}
-mxObjectCodec.prototype.template = null;
-mxObjectCodec.prototype.exclude = null;
-mxObjectCodec.prototype.idrefs = null;
-mxObjectCodec.prototype.mapping = null;
-mxObjectCodec.prototype.reverse = null;
-mxObjectCodec.prototype.getName = function() {
-  return mxUtils.getFunctionName(this.template.constructor)
-};
-mxObjectCodec.prototype.cloneTemplate = function() {
-  return new this.template.constructor
-};
-mxObjectCodec.prototype.getFieldName = function(a) {
-  if (null != a) {
-    var b = this.reverse[a];
-    null != b && (a = b)
-  }
-  return a
-};
-mxObjectCodec.prototype.getAttributeName = function(a) {
-  if (null != a) {
-    var b = this.mapping[a];
-    null != b && (a = b)
-  }
-  return a
-};
-mxObjectCodec.prototype.isExcluded = function(a, b, c, d) {
-  return b == mxObjectIdentity.FIELD_NAME || 0 <= mxUtils.indexOf(this.exclude, b)
-};
-mxObjectCodec.prototype.isReference = function(a, b, c, d) {
-  return 0 <= mxUtils.indexOf(this.idrefs, b)
-};
-mxObjectCodec.prototype.encode = function(a, b) {
-  var c = a.document.createElement(this.getName());
-  b = this.beforeEncode(a, b, c);
-  this.encodeObject(a, b, c);
-  return this.afterEncode(a, b, c)
-};
-mxObjectCodec.prototype.encodeObject = function(a, b, c) {
-  a.setAttribute(c, "id", a.getId(b));
-  for (var d in b) {
-    var e = d,
-      f = b[e];
-    null != f && !this.isExcluded(b, e, f, !0) && (mxUtils.isNumeric(e) && (e = null), this.encodeValue(a, b, e, f, c))
-  }
-};
-mxObjectCodec.prototype.encodeValue = function(a, b, c, d, e) {
-  if (null != d) {
-    if (this.isReference(b, c, d, !0)) {
-      var f = a.getId(d);
-      if (null == f) {
-        mxLog.warn("mxObjectCodec.encode: No ID for " + this.getName() + "." + c + "\x3d" + d);
-        return
-      }
-      d = f
-    }
-    f = this.template[c];
-    if (null == c || a.encodeDefaults || f != d) c = this.getAttributeName(c), this.writeAttribute(a, b, c, d, e)
-  }
-};
-mxObjectCodec.prototype.writeAttribute = function(a, b, c, d, e) {
-  "object" != typeof d ? this.writePrimitiveAttribute(a, b, c, d, e) : this.writeComplexAttribute(a, b, c, d, e)
-};
-mxObjectCodec.prototype.writePrimitiveAttribute = function(a, b, c, d, e) {
-  d = this.convertValueToXml(d);
-  null == c ? (b = a.document.createElement("add"), "function" == typeof d ? b.appendChild(a.document.createTextNode(d)) : a.setAttribute(b, "value", d), e.appendChild(b)) : "function" != typeof d &&
-    a.setAttribute(e, c, d)
-};
-mxObjectCodec.prototype.writeComplexAttribute = function(a, b, c, d, e) {
-  a = a.encode(d);
-  null != a ? (null != c && a.setAttribute("as", c), e.appendChild(a)) : mxLog.warn("mxObjectCodec.encode: No node for " + this.getName() + "." + c + ": " + d)
-};
-mxObjectCodec.prototype.convertValueToXml = function(a) {
-  if ("undefined" == typeof a.length && (!0 == a || !1 == a)) a = !0 == a ? "1" : "0";
-  return a
-};
-mxObjectCodec.prototype.convertValueFromXml = function(a) {
-  mxUtils.isNumeric(a) && (a = parseFloat(a));
-  //
-  // Marco ([email-masked]) + Andrea Bianco ([email-masked])
-  // 2016-02-24
-  //
-  // mxUtils.isNumeric(a) && (a = ((Number(a) === a) && (a % 1 !== 0)) ? parseFloat(a) : a);
-  return a
-};
-mxObjectCodec.prototype.beforeEncode = function(a, b, c) {
-  return b
-};
-mxObjectCodec.prototype.afterEncode = function(a, b, c) {
-  return c
-};
-mxObjectCodec.prototype.decode = function(a, b, c) {
-  var d = b.getAttribute("id"),
-    e = a.objects[d];
-  null == e && (e = c || this.cloneTemplate(), null != d && a.putObject(d, e));
-  b = this.beforeDecode(a, b, e);
-  this.decodeNode(a, b, e);
-  return this.afterDecode(a, b, e)
-};
-mxObjectCodec.prototype.decodeNode = function(a, b, c) {
-  null != b && (this.decodeAttributes(a, b, c), this.decodeChildren(a, b, c))
-};
-mxObjectCodec.prototype.decodeAttributes = function(a, b, c) {
-  b = b.attributes;
-  if (null != b)
-    for (var d = 0; d < b.length; d++) this.decodeAttribute(a, b[d], c)
-};
-mxObjectCodec.prototype.decodeAttribute = function(a, b, c) {
-  var d = b.nodeName;
-  if ("as" != d && "id" != d) {
-    b = this.convertValueFromXml(b.nodeValue);
-    var e = this.getFieldName(d);
-    if (this.isReference(c, e, b, !1)) {
-      a = a.getObject(b);
-      if (null == a) {
-        mxLog.warn("mxObjectCodec.decode: No object for " + this.getName() + "." + d + "\x3d" + b);
-        return
-      }
-      b = a
-    }
-    this.isExcluded(c, d, b, !1) || (c[d] = b)
-  }
-};
-mxObjectCodec.prototype.decodeChildren = function(a, b, c) {
-  for (b = b.firstChild; null != b;) {
-    var d = b.nextSibling;
-    b.nodeType == mxConstants.NODETYPE_ELEMENT && !this.processInclude(a, b, c) && this.decodeChild(a, b, c);
-    b = d
-  }
-};
-mxObjectCodec.prototype.decodeChild = function(a, b, c) {
-  var d = this.getFieldName(b.getAttribute("as"));
-  if (null == d || !this.isExcluded(c, d, b, !1)) {
-    var e = this.getFieldTemplate(c, d, b),
-      f = null;
-    "add" == b.nodeName ? (f = b.getAttribute("value"), null == f && (f = mxUtils.eval(mxUtils.getTextContent(b)))) : f = a.decode(b, e);
-    this.addObjectValue(c, d, f, e)
-  }
-};
-mxObjectCodec.prototype.getFieldTemplate = function(a, b, c) {
-  a = a[b];
-  a instanceof Array && 0 < a.length && (a = null);
-  return a
-};
-mxObjectCodec.prototype.addObjectValue = function(a, b, c, d) {
-  null != c && c != d && (null != b && 0 < b.length ? a[b] = c : a.push(c))
-};
-mxObjectCodec.prototype.processInclude = function(a, b, c) {
-  if ("include" == b.nodeName) {
-    b = b.getAttribute("name");
-    if (null != b) try {
-      var d = mxUtils.load(b).getDocumentElement();
-      null != d && a.decode(d, c)
-    } catch (e) {}
-    return !0
-  }
-  return !1
-};
-mxObjectCodec.prototype.beforeDecode = function(a, b, c) {
-  return b
-};
-mxObjectCodec.prototype.afterDecode = function(a, b, c) {
-  return c
-};
-mxCodecRegistry.register(function() {
-  var a = new mxObjectCodec(new mxCell, ["children", "edges", "overlays", "mxTransient"], ["parent", "source", "target"]);
-  a.isCellCodec = function() {
-    return !0
-  };
-  a.isExcluded = function(a, c, d, e) {
-    return mxObjectCodec.prototype.isExcluded.apply(this, arguments) || e && "value" == c && d.nodeType == mxConstants.NODETYPE_ELEMENT
-  };
-  a.afterEncode = function(a, c, d) {
-    if (null != c.value && c.value.nodeType == mxConstants.NODETYPE_ELEMENT) {
-      var e = d;
-      d = mxClient.IS_IE ? c.value.cloneNode(!0) : a.document.importNode(c.value, !0);
-      d.appendChild(e);
-      a = e.getAttribute("id");
-      d.setAttribute("id", a);
-      e.removeAttribute("id")
-    }
-    return d
-  };
-  a.beforeDecode = function(a, c, d) {
-    var e = c,
-      f = this.getName();
-    c.nodeName != f ? (e = c.getElementsByTagName(f)[0], null != e && e.parentNode == c ? (mxUtils.removeWhitespace(e, !0), mxUtils.removeWhitespace(e, !1), e.parentNode.removeChild(e)) : e =
-      null, d.value = c.cloneNode(!0), c = d.value.getAttribute("id"), null != c && (d.setId(c), d.value.removeAttribute("id"))) : d.setId(c.getAttribute("id"));
-    if (null != e)
-      for (c = 0; c < this.idrefs.length; c++) {
-        var f =
-          this.idrefs[c],
-          g = e.getAttribute(f);
-        if (null != g) {
-          e.removeAttribute(f);
-          var h = a.objects[g] || a.lookup(g);
-          null == h && (g = a.getElementById(g), null != g && (h = (mxCodecRegistry.codecs[g.nodeName] || this).decode(a, g)));
-          d[f] = h
-        }
-      }
-    return e
-  };
-  return a
-}());
-mxCodecRegistry.register(function() {
-  var a = new mxObjectCodec(new mxGraphModel);
-  a.encodeObject = function(a, c, d) {
-    var e = a.document.createElement("root");
-    a.encodeCell(c.getRoot(), e);
-    d.appendChild(e)
-  };
-  a.decodeChild = function(a, c, d) {
-    "root" == c.nodeName ? this.decodeRoot(a, c, d) : mxObjectCodec.prototype.decodeChild.apply(this, arguments)
-  };
-  a.decodeRoot = function(a, c, d) {
-    var e = null;
-    for (c = c.firstChild; null != c;) {
-      var f = a.decodeCell(c);
-      null != f && null == f.getParent() && (e = f);
-      c = c.nextSibling
-    }
-    null != e && d.setRoot(e)
-  };
-  return a
-}());
-mxCodecRegistry.register(function() {
-  var a = new mxObjectCodec(new mxRootChange, ["model", "previous", "root"]);
-  a.afterEncode = function(a, c, d) {
-    a.encodeCell(c.root, d);
-    return d
-  };
-  a.beforeDecode = function(a, c, d) {
-    if (null != c.firstChild && c.firstChild.nodeType == mxConstants.NODETYPE_ELEMENT) {
-      c = c.cloneNode(!0);
-      var e = c.firstChild;
-      d.root = a.decodeCell(e, !1);
-      d = e.nextSibling;
-      e.parentNode.removeChild(e);
-      for (e = d; null != e;) d = e.nextSibling, a.decodeCell(e), e.parentNode.removeChild(e), e = d
-    }
-    return c
-  };
-  a.afterDecode = function(a, c,
-    d) {
-    d.previous = d.root;
-    return d
-  };
-  return a
-}());
-mxCodecRegistry.register(function() {
-  var a = new mxObjectCodec(new mxChildChange, ["model", "child", "previousIndex"], ["parent", "previous"]);
-  a.isReference = function(a, c, d, e) {
-    return "child" == c && (null != a.previous || !e) ? !0 : 0 <= mxUtils.indexOf(this.idrefs, c)
-  };
-  a.afterEncode = function(a, c, d) {
-    this.isReference(c, "child", c.child, !0) ? d.setAttribute("child", a.getId(c.child)) : a.encodeCell(c.child, d);
-    return d
-  };
-  a.beforeDecode = function(a, c, d) {
-    if (null != c.firstChild && c.firstChild.nodeType == mxConstants.NODETYPE_ELEMENT) {
-      c = c.cloneNode(!0);
-      var e = c.firstChild;
-      d.child = a.decodeCell(e, !1);
-      d = e.nextSibling;
-      e.parentNode.removeChild(e);
-      for (e = d; null != e;) {
-        d = e.nextSibling;
-        if (e.nodeType == mxConstants.NODETYPE_ELEMENT) {
-          var f = e.getAttribute("id");
-          null == a.lookup(f) && a.decodeCell(e)
-        }
-        e.parentNode.removeChild(e);
-        e = d
-      }
-    } else e = c.getAttribute("child"), d.child = a.getObject(e);
-    return c
-  };
-  a.afterDecode = function(a, c, d) {
-    d.child.parent = d.previous;
-    d.previous = d.parent;
-    d.previousIndex = d.index;
-    return d
-  };
-  return a
-}());
-mxCodecRegistry.register(function() {
-  var a = new mxObjectCodec(new mxTerminalChange, ["model", "previous"], ["cell", "terminal"]);
-  a.afterDecode = function(a, c, d) {
-    d.previous = d.terminal;
-    return d
-  };
-  return a
-}());
-var mxGenericChangeCodec = function(a, b) {
-  var c = new mxObjectCodec(a, ["model", "previous"], ["cell"]);
-  c.afterDecode = function(a, c, f) {
-    mxUtils.isNode(f.cell) && (f.cell = a.decodeCell(f.cell, !1));
-    f.previous = f[b];
-    return f
-  };
-  return c
-};
-mxCodecRegistry.register(mxGenericChangeCodec(new mxValueChange, "value"));
-mxCodecRegistry.register(mxGenericChangeCodec(new mxStyleChange, "style"));
-mxCodecRegistry.register(mxGenericChangeCodec(new mxGeometryChange, "geometry"));
-mxCodecRegistry.register(mxGenericChangeCodec(new mxCollapseChange, "collapsed"));
-mxCodecRegistry.register(mxGenericChangeCodec(new mxVisibleChange, "visible"));
-mxCodecRegistry.register(mxGenericChangeCodec(new mxCellAttributeChange, "value"));
-mxCodecRegistry.register(function() {
-  return new mxObjectCodec(new mxGraph, "graphListeners eventListeners view container cellRenderer editor selection".split(" "))
-}());
-mxCodecRegistry.register(function() {
-  var a = new mxObjectCodec(new mxGraphView);
-  a.encode = function(a, c) {
-    return this.encodeCell(a, c, c.graph.getModel().getRoot())
-  };
-  a.encodeCell = function(a, c, d) {
-    var e = c.graph.getModel(),
-      f = c.getState(d),
-      g = e.getParent(d);
-    if (null == g || null != f) {
-      var h = e.getChildCount(d),
-        k = c.graph.getCellGeometry(d),
-        l = null;
-      g == e.getRoot() ? l = "layer" : null == g ? l = "graph" : e.isEdge(d) ? l = "edge" : 0 < h && null != k ? l = "group" : e.isVertex(d) && (l = "vertex");
-      if (null != l) {
-        var m = a.document.createElement(l);
-        null != c.graph.getLabel(d) &&
-          (m.setAttribute("label", c.graph.getLabel(d)), c.graph.isHtmlLabel(d) && m.setAttribute("html", !0));
-        if (null == g) {
-          var n = c.getGraphBounds();
-          null != n && (m.setAttribute("x", Math.round(n.x)), m.setAttribute("y", Math.round(n.y)), m.setAttribute("width", Math.round(n.width)), m.setAttribute("height", Math.round(n.height)));
-          m.setAttribute("scale", c.scale)
-        } else if (null != f && null != k) {
-          for (n in f.style) g = f.style[n], "function" == typeof g && "object" == typeof g && (g = mxStyleRegistry.getName(g)), null != g && ("function" != typeof g && "object" !=
-            typeof g) && m.setAttribute(n, g);
-          g = f.absolutePoints;
-          if (null != g && 0 < g.length) {
-            k = Math.round(g[0].x) + "," + Math.round(g[0].y);
-            for (n = 1; n < g.length; n++) k += " " + Math.round(g[n].x) + "," + Math.round(g[n].y);
-            m.setAttribute("points", k)
-          } else m.setAttribute("x", Math.round(f.x)), m.setAttribute("y", Math.round(f.y)), m.setAttribute("width", Math.round(f.width)), m.setAttribute("height", Math.round(f.height));
-          n = f.absoluteOffset;
-          null != n && (0 != n.x && m.setAttribute("dx", Math.round(n.x)), 0 != n.y && m.setAttribute("dy", Math.round(n.y)))
-        }
-        for (n =
-          0; n < h; n++) f = this.encodeCell(a, c, e.getChildAt(d, n)), null != f && m.appendChild(f)
-      }
-    }
-    return m
-  };
-  return a
-}());
-mxCodecRegistry.register(function() {
-  var a = new mxObjectCodec(new mxStylesheet);
-  a.encode = function(a, c) {
-    var d = a.document.createElement(this.getName()),
-      e;
-    for (e in c.styles) {
-      var f = c.styles[e],
-        g = a.document.createElement("add");
-      if (null != e) {
-        g.setAttribute("as", e);
-        for (var h in f) {
-          var k = this.getStringValue(h, f[h]);
-          if (null != k) {
-            var l = a.document.createElement("add");
-            l.setAttribute("value", k);
-            l.setAttribute("as", h);
-            g.appendChild(l)
-          }
-        }
-        0 < g.childNodes.length && d.appendChild(g)
-      }
-    }
-    return d
-  };
-  a.getStringValue = function(a,
-    c) {
-    var d = typeof c;
-    "function" == d ? c = mxStyleRegistry.getName(style[j]) : "object" == d && (c = null);
-    return c
-  };
-  a.decode = function(a, c, d) {
-    d = d || new this.template.constructor;
-    var e = c.getAttribute("id");
-    null != e && (a.objects[e] = d);
-    for (c = c.firstChild; null != c;) {
-      if (!this.processInclude(a, c, d) && "add" == c.nodeName && (e = c.getAttribute("as"), null != e)) {
-        var f = c.getAttribute("extend"),
-          g = null != f ? mxUtils.clone(d.styles[f]) : null;
-        null == g && (null != f && mxLog.warn("mxStylesheetCodec.decode: stylesheet " + f + " not found to extend"), g = {});
-        for (f = c.firstChild; null != f;) {
-          if (f.nodeType == mxConstants.NODETYPE_ELEMENT) {
-            var h = f.getAttribute("as");
-            if ("add" == f.nodeName) {
-              var k = mxUtils.getTextContent(f),
-                l = null;
-              null != k && 0 < k.length ? l = mxUtils.eval(k) : (l = f.getAttribute("value"), mxUtils.isNumeric(l) && (l = parseFloat(l)));
-              null != l && (g[h] = l)
-            } else "remove" == f.nodeName && delete g[h]
-          }
-          f = f.nextSibling
-        }
-        d.putCellStyle(e, g)
-      }
-      c = c.nextSibling
-    }
-    return d
-  };
-  return a
-}());
-mxCodecRegistry.register(function() {
-  var a = new mxObjectCodec(new mxDefaultKeyHandler);
-  a.encode = function(a, c) {
-    return null
-  };
-  a.decode = function(a, c, d) {
-    if (null != d)
-      for (c = c.firstChild; null != c;) {
-        if (!this.processInclude(a, c, d) && "add" == c.nodeName) {
-          var e = c.getAttribute("as"),
-            f = c.getAttribute("action"),
-            g = c.getAttribute("control");
-          d.bindAction(e, f, g)
-        }
-        c = c.nextSibling
-      }
-    return d
-  };
-  return a
-}());
-mxCodecRegistry.register(function() {
-  var a = new mxObjectCodec(new mxDefaultToolbar);
-  a.encode = function(a, c) {
-    return null
-  };
-  a.decode = function(a, c, d) {
-    if (null != d) {
-      var e = d.editor;
-      for (c = c.firstChild; null != c;) {
-        if (c.nodeType == mxConstants.NODETYPE_ELEMENT && !this.processInclude(a, c, d))
-          if ("separator" == c.nodeName) d.addSeparator();
-          else if ("br" == c.nodeName) d.toolbar.addBreak();
-        else if ("hr" == c.nodeName) d.toolbar.addLine();
-        else if ("add" == c.nodeName) {
-          var f = c.getAttribute("as"),
-            f = mxResources.get(f) || f,
-            g = c.getAttribute("icon"),
-            h = c.getAttribute("pressedIcon"),
-            k = c.getAttribute("action"),
-            l = c.getAttribute("mode"),
-            m = c.getAttribute("template"),
-            n = "0" != c.getAttribute("toggle"),
-            p = mxUtils.getTextContent(c),
-            q = null;
-          if (null != k) q = d.addItem(f, g, k, h);
-          else if (null != l) var s = mxUtils.eval(p),
-            q = d.addMode(f, g, l, h, s);
-          else if (null != m || null != p && 0 < p.length) q = e.templates[m], m = c.getAttribute("style"), null != q && null != m && (q = q.clone(), q.setStyle(m)), m = null, null != p && 0 <
-            p.length && (m = mxUtils.eval(p)), q = d.addPrototype(f, g, q, h, m, n);
-          else if (h = mxUtils.getChildNodes(c),
-            0 < h.length)
-            if (null == g) {
-              m = d.addActionCombo(f);
-              for (f = 0; f < h.length; f++) n = h[f], "separator" == n.nodeName ? d.addOption(m, "---") : "add" == n.nodeName && (g = n.getAttribute("as"), n = n.getAttribute("action"), d.addActionOption(
-                m, g, n))
-            } else {
-              var r = null,
-                t = d.addPrototype(f, g, function() {
-                  var a = e.templates[r.value];
-                  if (null != a) {
-                    var a = a.clone(),
-                      b = r.options[r.selectedIndex].cellStyle;
-                    null != b && a.setStyle(b);
-                    return a
-                  }
-                  mxLog.warn("Template " + a + " not found");
-                  return null
-                }, null, null, n),
-                r = d.addCombo();
-              mxEvent.addListener(r, "change",
-                function() {
-                  d.toolbar.selectMode(t, function(a) {
-                    a = mxUtils.convertPoint(e.graph.container, mxEvent.getClientX(a), mxEvent.getClientY(a));
-                    return e.addVertex(null, s(), a.x, a.y)
-                  });
-                  d.toolbar.noReset = !1
-                });
-              for (f = 0; f < h.length; f++) n = h[f], "separator" == n.nodeName ? d.addOption(r, "---") : "add" == n.nodeName && (g = n.getAttribute("as"), p = n.getAttribute("template"), d.addOption(
-                r, g, p || m).cellStyle = n.getAttribute("style"))
-            }
-          null != q && (m = c.getAttribute("id"), null != m && 0 < m.length && q.setAttribute("id", m))
-        }
-        c = c.nextSibling
-      }
-    }
-    return d
-  };
-  return a
-}());
-mxCodecRegistry.register(function() {
-  var a = new mxObjectCodec(new mxDefaultPopupMenu);
-  a.encode = function(a, c) {
-    return null
-  };
-  a.decode = function(a, c, d) {
-    var e = c.getElementsByTagName("include")[0];
-    null != e ? this.processInclude(a, e, d) : null != d && (d.config = c);
-    return d
-  };
-  return a
-}());
-mxCodecRegistry.register(function() {
-  var a = new mxObjectCodec(new mxEditor, "modified lastSnapshot ignoredChanges undoManager graphContainer toolbarContainer".split(" "));
-  a.afterDecode = function(a, c, d) {
-    a = c.getAttribute("defaultEdge");
-    null != a && (c.removeAttribute("defaultEdge"), d.defaultEdge = d.templates[a]);
-    a = c.getAttribute("defaultGroup");
-    null != a && (c.removeAttribute("defaultGroup"), d.defaultGroup = d.templates[a]);
-    return d
-  };
-  a.decodeChild = function(a, c, d) {
-    if ("Array" == c.nodeName) {
-      if ("templates" == c.getAttribute("as")) {
-        this.decodeTemplates(a,
-          c, d);
-        return
-      }
-    } else if ("ui" == c.nodeName) {
-      this.decodeUi(a, c, d);
-      return
-    }
-    mxObjectCodec.prototype.decodeChild.apply(this, arguments)
-  };
-  a.decodeUi = function(a, c, d) {
-    for (a = c.firstChild; null != a;) {
-      if ("add" == a.nodeName) {
-        c = a.getAttribute("as");
-        var e = a.getAttribute("element"),
-          f = a.getAttribute("style"),
-          g = null;
-        if (null != e) g = document.getElementById(e), null != g && null != f && (g.style.cssText += ";" + f);
-        else {
-          var e = parseInt(a.getAttribute("x")),
-            h = parseInt(a.getAttribute("y")),
-            k = a.getAttribute("width"),
-            l = a.getAttribute("height"),
-            g = document.createElement("div");
-          g.style.cssText = f;
-          (new mxWindow(mxResources.get(c) || c, g, e, h, k, l, !1, !0)).setVisible(!0)
-        }
-        "graph" == c ? d.setGraphContainer(g) : "toolbar" == c ? d.setToolbarContainer(g) : "title" == c ? d.setTitleContainer(g) : "status" == c ? d.setStatusContainer(g) : "map" == c && d.setMapContainer(
-          g)
-      } else "resource" == a.nodeName ? mxResources.add(a.getAttribute("basename")) : "stylesheet" == a.nodeName && mxClient.link("stylesheet", a.getAttribute("name"));
-      a = a.nextSibling
-    }
-  };
-  a.decodeTemplates = function(a, c, d) {
-    null == d.templates &&
-      (d.templates = []);
-    c = mxUtils.getChildNodes(c);
-    for (var e = 0; e < c.length; e++) {
-      for (var f = c[e].getAttribute("as"), g = c[e].firstChild; null != g && 1 != g.nodeType;) g = g.nextSibling;
-      null != g && (d.templates[f] = a.decodeCell(g))
-    }
-  };
-  return a
-}());
\ No newline at end of file
diff --git a/public/assets/plugins/square/js/Actions.js b/public/assets/plugins/square/js/Actions.js
index 891e88f..a0109ba 100644
--- a/public/assets/plugins/square/js/Actions.js
+++ b/public/assets/plugins/square/js/Actions.js
@@ -1,638 +1 @@
-'use strict';
-/**
- * $Id: Actions.js,v 1.7 2013-02-14 07:48:01 gaudenz Exp $
- * Copyright (c) 2006-2012, JGraph Ltd
- */
-/**
- * Constructs the actions object for the given UI.
- */
-function Actions(editorUi) {
-	this.editorUi = editorUi;
-	this.actions = new Object();
-	this.init();
-};
-
-/**
- * Adds the default actions.
- */
-Actions.prototype.init = function() {
-	var ui = this.editorUi;
-	var editor = ui.editor;
-	var graph = editor.graph;
-
-	// File actions
-	this.addAction('new', function() {
-		ui.showDialog(new NewDialog(ui).container, 300, 180, true, true);
-	});
-	this.addAction('open', function() {
-		ui.showDialog(new OpenDialog(ui).container, 300, 180, true, true);
-	});
-	this.addAction('save', function() {
-		ui.saveFile(false);
-	}, null, null, 'Ctrl+S');
-	this.addAction('saveAs', function() {
-		ui.saveFile(true);
-	}, null, null, 'Ctrl+Shift-S');
-	this.addAction('publish', function() {
-		ui.publishFile(false);
-	}, null, null, 'Ctrl+Shift+P');
-	this.addAction('variable', function() {
-		ui.showDialog(new VariableDialog(ui).container, 300, 180, true, true);
-	});
-	this.addAction('description', function() {
-		ui.showDialog(new DescriptionDialog(ui).container, 300, 180, true, true);
-	});
-	this.addAction('import', function() {
-		ui.showDialog(new ImportDialog(ui).container, 300, 200, true, true);
-	});
-	this.addAction('export', function() {
-		ui.showDialog(new ExportDialog(ui).container, 300, 200, true, true);
-	}, null, null, 'Ctrl+E');
-	this.put('editFile', new Action(mxResources.get('edit'), mxUtils.bind(this,
-		function() {
-			this.editorUi.showDialog(new EditFileDialog(ui).container, 620, 420,
-				true, true);
-		})));
-	// this.addAction('rename', function() {
-	// 	ui.showDialog(new RenameDialog(ui).container, 300, 180, true, true);
-	// });
-	this.addAction('print', function() {
-		mxUtils.printScreen(graph);
-	}, null, 'sprite-print', 'Ctrl+P');
-	this.addAction('preview', function() {
-		mxUtils.show(graph, null, 10, 10);
-	});
-
-	// Edit actions
-	this.addAction('undo', function() {
-		editor.undoManager.undo();
-	}, null, 'sprite-undo', 'Ctrl+Z');
-	this.addAction('redo', function() {
-		editor.undoManager.redo();
-	}, null, 'sprite-redo', 'Ctrl+Y');
-	this.addAction('cut', function() {
-		mxClipboard.cut(graph);
-	}, null, 'sprite-cut', 'Ctrl+X');
-	this.addAction('copy', function() {
-		mxClipboard.copy(graph);
-	}, null, 'sprite-copy', 'Ctrl+C');
-	this.addAction('paste', function() {
-		mxClipboard.paste(graph);
-	}, false, 'sprite-paste', 'Ctrl+V');
-	this.addAction('delete', function() {
-		graph.removeCells();
-	}, null, null, 'Delete');
-	this.addAction('duplicate', function() {
-		var s = graph.gridSize;
-		graph.setSelectionCells(graph.moveCells(graph.getSelectionCells(), s, s,
-			true));
-	}, null, null, 'Ctrl+D');
-	this.addAction('selectVertices', function() {
-		graph.selectVertices();
-	}, null, null, 'Ctrl+Shift+V');
-	this.addAction('selectEdges', function() {
-		graph.selectEdges();
-	}, null, null, 'Ctrl+Shift+E');
-	this.addAction('selectAll', function() {
-		graph.selectAll();
-	}, null, null, 'Ctrl+A');
-
-	// Navigation actions
-	this.addAction('home', function() {
-		graph.home();
-	}, null, null, 'Home');
-	this.addAction('exitGroup', function() {
-		graph.exitGroup();
-	}, null, null, 'Page Up');
-	this.addAction('enterGroup', function() {
-		graph.enterGroup();
-	}, null, null, 'Page Down');
-	this.addAction('expand', function() {
-		graph.foldCells(false);
-	}, null, null, 'Enter');
-	this.addAction('collapse', function() {
-		graph.foldCells(true);
-	}, null, null, 'Backspace');
-
-	// Arrange actions
-	this.addAction('toFront', function() {
-		graph.orderCells(false);
-	}, null, null, 'Ctrl+F');
-	this.addAction('toBack', function() {
-		graph.orderCells(true);
-	}, null, null, 'Ctrl+B');
-	this.addAction('group', function() {
-		graph.setSelectionCell(graph.groupCells(null, 0));
-	}, null, null, 'Ctrl+G');
-	this.addAction('ungroup', function() {
-		graph.setSelectionCells(graph.ungroupCells());
-	}, null, null, 'Ctrl+U');
-	this.addAction('removeFromGroup', function() {
-		graph.removeCellsFromParent();
-	});
-	this.addAction('editLink', function() {
-		var cell = graph.getSelectionCell();
-		var link = graph.getLinkForCell(cell);
-
-		if (link == null) {
-			link = '';
-		}
-
-		link = mxUtils.prompt(mxResources.get('enterValue'), link);
-
-		if (link != null) {
-			graph.setLinkForCell(cell, link);
-		}
-	});
-	this.addAction('openLink', function() {
-		var cell = graph.getSelectionCell();
-		var link = graph.getLinkForCell(cell);
-
-		if (link != null) {
-			window.open(link);
-		}
-	});
-	this.addAction('autosize', function() {
-		var cells = graph.getSelectionCells();
-
-		if (cells != null) {
-			graph.getModel().beginUpdate();
-			try {
-				for (var i = 0; i < cells.length; i++) {
-					var cell = cells[i];
-
-					if (graph.getModel().getChildCount(cell)) {
-						graph.updateGroupBounds([cell], 20);
-					} else {
-						graph.updateCellSize(cell);
-					}
-				}
-			} finally {
-				graph.getModel().endUpdate();
-			}
-		}
-	});
-	this.addAction('wordWrap', function() {
-		var state = graph.getView().getState(graph.getSelectionCell());
-		var value = 'wrap';
-
-		if (state != null && state.style[mxConstants.STYLE_WHITE_SPACE] == 'wrap') {
-			value = null;
-		}
-
-		graph.setCellStyles(mxConstants.STYLE_WHITE_SPACE, value);
-	});
-	this.addAction('rotation', function() {
-		var value = '0';
-		var state = graph.getView().getState(graph.getSelectionCell());
-
-		if (state != null) {
-			value = state.style[mxConstants.STYLE_ROTATION] || value;
-		}
-
-		value = mxUtils.prompt(mxResources.get('enterValue') + ' (' +
-			mxResources.get('rotation') + ' 0-360)', value);
-
-		if (value != null) {
-			graph.setCellStyles(mxConstants.STYLE_ROTATION, value);
-		}
-	});
-	this.addAction('tilt', function() {
-		var cells = graph.getSelectionCells();
-
-		if (cells != null) {
-			graph.getModel().beginUpdate();
-			try {
-				for (var i = 0; i < cells.length; i++) {
-					var cell = cells[i];
-
-					if (graph.getModel().isVertex(cell) && graph.getModel().getChildCount(
-							cell) == 0) {
-						var geo = graph.getCellGeometry(cell);
-
-						if (geo != null) {
-							// Rotates the size and position in the geometry
-							geo = geo.clone();
-							geo.x += geo.width / 2 - geo.height / 2;
-							geo.y += geo.height / 2 - geo.width / 2;
-							var tmp = geo.width;
-							geo.width = geo.height;
-							geo.height = tmp;
-							graph.getModel().setGeometry(cell, geo);
-
-							// Reads the current direction and advances by 90 degrees
-							var state = graph.view.getState(cell);
-
-							if (state != null) {
-								var dir = state.style[mxConstants.STYLE_DIRECTION] || 'east' /*default*/ ;
-
-								if (dir == 'east') {
-									dir = 'south';
-								} else if (dir == 'south') {
-									dir = 'west';
-								} else if (dir == 'west') {
-									dir = 'north';
-								} else if (dir == 'north') {
-									dir = 'east';
-								}
-
-								graph.setCellStyles(mxConstants.STYLE_DIRECTION, dir, [cell]);
-							}
-						}
-					}
-				}
-			} finally {
-				graph.getModel().endUpdate();
-			}
-		}
-	}, null, null, 'Ctrl+R');
-
-	// View actions
-	this.addAction('actualSize', function() {
-		graph.zoomTo(1);
-	});
-	this.addAction('zoomIn', function() {
-		graph.zoomIn();
-	}, null, null, 'Add');
-	this.addAction('zoomOut', function() {
-		graph.zoomOut();
-	}, null, null, 'Subtract');
-	this.addAction('fitWindow', function() {
-		graph.fit();
-	});
-
-	this.addAction('fitPage', mxUtils.bind(this, function() {
-		if (!graph.pageVisible) {
-			this.get('pageView').funct();
-		}
-
-		var fmt = graph.pageFormat;
-		var ps = graph.pageScale;
-		var cw = graph.container.clientWidth - 20;
-		var ch = graph.container.clientHeight - 20;
-
-		var scale = Math.floor(100 * Math.min(cw / fmt.width / ps, ch / fmt.height /
-			ps)) / 100;
-		graph.zoomTo(scale);
-
-		graph.container.scrollLeft = Math.round(graph.view.translate.x * scale -
-			Math.max(10, (graph.container.clientWidth - fmt.width * ps * scale) / 2)
-		);
-		graph.container.scrollTop = Math.round(graph.view.translate.y * scale -
-			Math.max(10, (graph.container.clientHeight - fmt.height * ps * scale) /
-				2));
-	}));
-	this.addAction('fitPageWidth', mxUtils.bind(this, function() {
-		if (!graph.pageVisible) {
-			this.get('pageView').funct();
-		}
-
-		var fmt = graph.pageFormat;
-		var ps = graph.pageScale;
-		var cw = graph.container.clientWidth - 20;
-
-		var scale = Math.floor(100 * cw / fmt.width / ps) / 100;
-		graph.zoomTo(scale);
-
-		graph.container.scrollLeft = Math.round(graph.view.translate.x * scale -
-			Math.max(10, (graph.container.clientWidth - fmt.width * ps * scale) / 2)
-		);
-		graph.container.scrollTop = Math.round(graph.view.translate.y * scale -
-			Math.max(10, (graph.container.clientHeight - fmt.height * ps * scale) /
-				2));
-	}));
-	this.put('customZoom', new Action(mxResources.get('custom'), function() {
-		var value = mxUtils.prompt(mxResources.get('enterValue') + ' (%)',
-			parseInt(graph.getView().getScale() * 100));
-
-		if (value != null && value.length > 0 && !isNaN(parseInt(value))) {
-			graph.zoomTo(parseInt(value) / 100);
-		}
-	}));
-
-	// Option actions
-	var action = null;
-	action = this.addAction('grid', function() {
-		graph.setGridEnabled(!graph.isGridEnabled());
-		editor.updateGraphComponents();
-	}, null, null, 'Ctrl+Shift+G');
-	action.setToggleAction(true);
-	action.setSelectedCallback(function() {
-		return graph.isGridEnabled();
-	});
-	action = this.addAction('guides', function() {
-		graph.graphHandler.guidesEnabled = !graph.graphHandler.guidesEnabled;
-	});
-	action.setToggleAction(true);
-	action.setSelectedCallback(function() {
-		return graph.graphHandler.guidesEnabled;
-	});
-	action = this.addAction('tooltips', function() {
-		graph.tooltipHandler.setEnabled(!graph.tooltipHandler.isEnabled());
-	});
-	action.setToggleAction(true);
-	action.setSelectedCallback(function() {
-		return graph.tooltipHandler.isEnabled();
-	});
-	action = this.addAction('navigation', function() {
-		graph.foldingEnabled = !graph.foldingEnabled;
-		graph.view.revalidate();
-	});
-	action.setToggleAction(true);
-	action.setSelectedCallback(function() {
-		return graph.foldingEnabled;
-	});
-	action = this.addAction('scrollbars', function() {
-		graph.scrollbars = !graph.scrollbars;
-		editor.updateGraphComponents();
-
-		if (!graph.scrollbars) {
-			var t = graph.view.translate;
-			graph.view.setTranslate(t.x - graph.container.scrollLeft / graph.view.scale,
-				t.y - graph.container.scrollTop / graph.view.scale);
-			graph.container.scrollLeft = 0;
-			graph.container.scrollTop = 0;
-			graph.sizeDidChange();
-		} else {
-			var dx = graph.view.translate.x;
-			var dy = graph.view.translate.y;
-
-			graph.view.translate.x = 0;
-			graph.view.translate.y = 0;
-			graph.sizeDidChange();
-			graph.container.scrollLeft -= Math.round(dx * graph.view.scale);
-			graph.container.scrollTop -= Math.round(dy * graph.view.scale);
-		}
-	}, !mxClient.IS_TOUCH);
-	action.setToggleAction(true);
-	action.setSelectedCallback(function() {
-		return graph.container.style.overflow == 'auto';
-	});
-	action = this.addAction('pageView', mxUtils.bind(this, function() {
-		graph.pageVisible = !graph.pageVisible;
-		graph.pageBreaksVisible = graph.pageVisible;
-		graph.preferPageSize = graph.pageBreaksVisible;
-		graph.view.validate();
-		graph.sizeDidChange();
-
-		editor.updateGraphComponents();
-		editor.outline.update();
-
-		if (mxUtils.hasScrollbars(graph.container)) {
-			if (graph.pageVisible) {
-				graph.container.scrollLeft -= 20;
-				graph.container.scrollTop -= 20;
-			} else {
-				graph.container.scrollLeft += 20;
-				graph.container.scrollTop += 20;
-			}
-		}
-	}));
-	action.setToggleAction(true);
-	action.setSelectedCallback(function() {
-		return graph.pageVisible;
-	});
-	action = this.addAction('connect', function() {
-		graph.setConnectable(!graph.connectionHandler.isEnabled());
-	}, null, null, 'Ctrl+Q');
-	action.setToggleAction(true);
-	action.setSelectedCallback(function() {
-		return graph.connectionHandler.isEnabled();
-	});
-	action = this.addAction('copyConnect', function() {
-		graph.connectionHandler.setCreateTarget(!graph.connectionHandler.isCreateTarget());
-	});
-	action.setToggleAction(true);
-	action.setSelectedCallback(function() {
-		return graph.connectionHandler.isCreateTarget();
-	});
-
-	// Help actions
-	this.addAction('help', function() {
-		var ext = '';
-
-		if (mxResources.isLanguageSupported(mxClient.language)) {
-			ext = '_' + mxClient.language;
-		}
-
-		window.open("https://wiki.xcallymotion.com/display/XMD/Cally+Square");
-		//window.open(RESOURCES_PATH + '/help' + ext + '.html');
-	});
-	this.put('about', new Action(mxResources.get('about') + ' Cally Square',
-		function() {
-			ui.showDialog(new AboutDialog(ui).container, 320, 280, true, true);
-		}, null, null, 'F1'));
-
-	// Font style actions
-	var toggleFontStyle = mxUtils.bind(this, function(key, style) {
-		this.addAction(key, function() {
-			graph.toggleCellStyleFlags(mxConstants.STYLE_FONTSTYLE, style);
-		});
-	});
-
-	toggleFontStyle('bold', mxConstants.FONT_BOLD);
-	toggleFontStyle('italic', mxConstants.FONT_ITALIC);
-	toggleFontStyle('underline', mxConstants.FONT_UNDERLINE);
-
-	// Format actions
-	this.addAction('shadow', function() {
-		graph.toggleCellStyles(mxConstants.STYLE_SHADOW);
-	});
-	this.addAction('dashed', function() {
-		graph.toggleCellStyles(mxConstants.STYLE_DASHED);
-	});
-	this.addAction('rounded', function() {
-		graph.toggleCellStyles(mxConstants.STYLE_ROUNDED);
-	});
-	this.addAction('curved', function() {
-		graph.toggleCellStyles(mxConstants.STYLE_CURVED);
-	});
-	this.addAction('style', function() {
-		var cells = graph.getSelectionCells();
-
-		if (cells != null && cells.length > 0) {
-			var model = graph.getModel();
-			var style = mxUtils.prompt(mxResources.get('enterValue') + ' (' +
-				mxResources.get('style') + ')',
-				model.getStyle(cells[0]) || '');
-
-			if (style != null) {
-				graph.setCellStyle(style, cells);
-			}
-		}
-	});
-	this.addAction('setAsDefaultEdge', function() {
-		graph.setDefaultEdge(graph.getSelectionCell());
-	});
-	this.addAction('addWaypoint', function() {
-		var cell = graph.getSelectionCell();
-
-		if (cell != null && graph.getModel().isEdge(cell)) {
-			var handler = editor.graph.selectionCellsHandler.getHandler(cell);
-
-			if (handler instanceof mxEdgeHandler) {
-				var t = graph.view.translate;
-				var s = graph.view.scale;
-				var dx = t.x;
-				var dy = t.y;
-
-				var parent = graph.getModel().getParent(cell);
-				var pgeo = graph.getCellGeometry(parent);
-
-				if (graph.getModel().isVertex(parent) && pgeo != null) {
-					dx += pgeo.x;
-					dy += pgeo.y;
-				}
-
-				handler.addPointAt(handler.state, graph.panningHandler.triggerX / s - dx,
-					graph.panningHandler.triggerY / s - dy);
-			}
-		}
-	});
-	this.addAction('removeWaypoint', function() {
-		// TODO: Action should run with "this" set to action
-		var rmWaypointAction = ui.actions.get('removeWaypoint');
-
-		if (rmWaypointAction.handler != null) {
-			// NOTE: Popupevent handled and action updated in Menus.createPopupMenu
-			rmWaypointAction.handler.removePoint(rmWaypointAction.handler.state,
-				rmWaypointAction.index);
-		}
-	});
-	this.addAction('image', function() {
-		function updateImage(value, w, h) {
-			var select = null;
-			var cells = graph.getSelectionCells();
-
-			graph.getModel().beginUpdate();
-			try {
-				// Inserts new cell if no cell is selected
-				if (cells.length == 0) {
-					var gs = graph.getGridSize();
-					cells = [graph.insertVertex(graph.getDefaultParent(), null, '', gs, gs,
-						w, h)];
-					select = cells;
-				}
-
-				graph.setCellStyles(mxConstants.STYLE_IMAGE, value, cells);
-				graph.setCellStyles(mxConstants.STYLE_SHAPE, 'image', cells);
-
-				if (graph.getSelectionCount() == 1) {
-					if (w != null && h != null) {
-						var cell = cells[0];
-						var geo = graph.getModel().getGeometry(cell);
-
-						if (geo != null) {
-							geo = geo.clone();
-							geo.width = w;
-							geo.height = h;
-							graph.getModel().setGeometry(cell, geo);
-						}
-					}
-				}
-			} finally {
-				graph.getModel().endUpdate();
-			}
-
-			if (select != null) {
-				graph.setSelectionCells(select);
-				graph.scrollCellToVisible(select[0]);
-			}
-		};
-
-		var value = '';
-		var state = graph.getView().getState(graph.getSelectionCell());
-
-		if (state != null) {
-			value = state.style[mxConstants.STYLE_IMAGE] || value;
-		}
-
-		value = mxUtils.prompt(mxResources.get('enterValue') + ' (' + mxResources.get(
-			'url') + ')', value);
-
-		if (value != null) {
-			if (value.length > 0) {
-				var img = new Image();
-
-				img.onload = function() {
-					updateImage(value, img.width, img.height);
-				};
-				img.onerror = function() {
-					mxUtils.alert(mxResources.get('fileNotFound'));
-				};
-
-				img.src = value;
-			}
-		}
-	});
-};
-
-/**
- * Registers the given action under the given name.
- */
-Actions.prototype.addAction = function(key, funct, enabled, iconCls, shortcut) {
-	return this.put(key, new Action(mxResources.get(key), funct, enabled, iconCls,
-		shortcut));
-};
-
-/**
- * Registers the given action under the given name.
- */
-Actions.prototype.put = function(name, action) {
-	this.actions[name] = action;
-
-	return action;
-};
-
-/**
- * Returns the action for the given name or null if no such action exists.
- */
-Actions.prototype.get = function(name) {
-	return this.actions[name];
-};
-
-/**
- * Constructs a new action for the given parameters.
- */
-function Action(label, funct, enabled, iconCls, shortcut) {
-	mxEventSource.call(this);
-	this.label = label;
-	this.funct = funct;
-	this.enabled = (enabled != null) ? enabled : true;
-	this.iconCls = iconCls;
-	this.shortcut = shortcut;
-};
-
-// Action inherits from mxEventSource
-mxUtils.extend(Action, mxEventSource);
-
-/**
- * Sets the enabled state of the action and fires a stateChanged event.
- */
-Action.prototype.setEnabled = function(value) {
-	if (this.enabled != value) {
-		this.enabled = value;
-		this.fireEvent(new mxEventObject('stateChanged'));
-	}
-};
-
-/**
- * Sets the enabled state of the action and fires a stateChanged event.
- */
-Action.prototype.setToggleAction = function(value) {
-	this.toggleAction = value;
-};
-
-/**
- * Sets the enabled state of the action and fires a stateChanged event.
- */
-Action.prototype.setSelectedCallback = function(funct) {
-	this.selectedCallback = funct;
-};
-
-/**
- * Sets the enabled state of the action and fires a stateChanged event.
- */
-Action.prototype.isSelected = function() {
-	return this.selectedCallback();
-};
\ No newline at end of file
diff --git a/public/assets/plugins/square/js/Dialogs.js b/public/assets/plugins/square/js/Dialogs.js
index 17e2529..86df5c3 100644
--- a/public/assets/plugins/square/js/Dialogs.js
+++ b/public/assets/plugins/square/js/Dialogs.js
@@ -1,1276 +1 @@
-'use strict';
-/**
- * $Id: Dialogs.js,v 1.5 2013-01-29 17:23:31 gaudenz Exp $
- * Copyright (c) 2006-2012, JGraph Ltd
- */
-/**
- * Constructs a new dialog.
- */
-
-function createCheckbox(value) {
-	var input = document.createElement('input');
-	input.setAttribute('type', 'checkbox');
-	if (value) {
-		input.setAttribute('checked', true);
-	}
-	return input;
-}
-
-function createDropdownFromApi(path, value, option_name, option_value, editorUi, keys, pattern) {
-	var req = new XMLHttpRequest();
-	req.open('GET', path, false); // `false` makes the request synchronous
-	req.setRequestHeader('Authorization', 'Bearer ' + editorUi.editor.data.token);
-	req.send(null);
-	var res = [];
-	if (req.status === 200) {
-		res = JSON.parse(req.response);
-	}
-	var input = document.createElement('select');
-	var option = document.createElement('option');
-	option.text = '-- None --';
-	option.value = '-1';
-	input.appendChild(option);
-	res.rows.forEach(function(elem) {
-		option = document.createElement('option');
-		option.text = elem[option_name];
-		if (keys && pattern) {
-			option.value = pattern;
-			keys.forEach(function(key) {
-				option.value = option.value.replace('%' + key + '%', elem[key]);
-			});
-			option.selected = (option.value == value);
-		} else {
-			option.value = elem[option_value];
-			option.selected = (elem[option_value] == value);
-		}
-		input.appendChild(option);
-	});
-	input.className = 'form-control select2';
-
-	return input;
-}
-
-function createDropdownWithOptgroupFromApi(path, value, option_name, option_value, editorUi, propertyGroup) {
-	var req = new XMLHttpRequest();
-	req.open('GET', path, false); // `false` makes the request synchronous
-	req.setRequestHeader('Authorization', 'Bearer ' + editorUi.editor.data.token);
-	req.send(null);
-	var res = [];
-	if (req.status === 200) {
-		res = JSON.parse(req.response);
-	}
-	var input = document.createElement('select');
-	var option = document.createElement('option');
-	option.text = '-- None --';
-	option.value = '-1';
-	input.appendChild(option);
-
-	var values = _.groupBy(res.rows, propertyGroup);
-
-	for (var group in values) {
-		if (values.hasOwnProperty(group)) {
-			var optgroup = document.createElement('optgroup');
-			optgroup.label = _.capitalize(group);
-
-			var valGroup = values[group];
-			valGroup.forEach(function(elem) {
-				// elem is the option
-				option = document.createElement('option');
-				option.text = elem[option_name];
-				option.value = elem[option_value];
-				option.selected = (elem[option_value] == value);
-				optgroup.appendChild(option);
-			})
-
-			input.appendChild(optgroup);
-		}
-	}
-
-	input.className = 'form-control select2';
-
-	return input;
-}
-
-function createGroupedDropdownFromApi(path, value, option_name, option_value, editorUi, associationArray) {
-	var req = new XMLHttpRequest();
-	req.open('GET', path, false); // `false` makes the request synchronous
-	req.setRequestHeader('Authorization', 'Bearer ' + editorUi.editor.data.token);
-	req.send(null);
-	var res = [];
-	if (req.status === 200) {
-		res = JSON.parse(req.response);
-	}
-	var input = document.createElement('select');
-	var option = document.createElement('option');
-	option.text = '-- None --';
-	option.value = '0';
-	input.appendChild(option);
-	res.rows.forEach(function(elem) {
-		option = document.createElement('option');
-		option.className = 'select-group-father';
-		option.text = elem[option_name].toUpperCase();
-		option.value = elem[option_value];
-		option.selected = (elem[option_value] == value);
-		input.appendChild(option);
-		elem[associationArray].forEach(function(elem) {
-			option = document.createElement('option');
-			option.className = 'select-group-son';
-			option.text = '-' + _.capitalize(elem[option_name]);
-			option.value = elem[option_value];
-			option.selected = (elem[option_value] == value);
-			input.appendChild(option);
-		});
-	})
-	input.className = 'form-control select2';
-
-	return input;
-}
-
-function createDropdownFromArray(array, value) {
-	var input = document.createElement('select');
-
-	for (var item in array) {
-		var option = document.createElement('option');
-		option.text = array[item];
-		option.value = item;
-		if (value > 0 || value != '')
-			option.selected = (value === item) ? true : false;
-
-		input.appendChild(option);
-	}
-
-	input.className = 'form-control select2';
-
-	return input;
-}
-
-function createDropdownFromTigerDialList(value) {
-	var input = document.createElement('select');
-
-	var array = [];
-	var request = new XMLHttpRequest();
-	try {
-		request.open('POST', '/api/rest/list/list', false);
-		request.send(JSON.stringify({
-			page: 1,
-			size: 600000 //Max items ui-grid
-		}));
-
-		if (request.status === 200) {
-			var res = JSON.parse(request.response);
-			if (res.status > 0) {
-				var rows = res.response.RMI.rows;
-				for (var index in rows) {
-					array[rows[index].id] = rows[index].name;
-				}
-			}
-		}
-	} catch (e) {
-		console.log(e);
-	}
-
-	for (var item in array) {
-		var option = document.createElement('option');
-		option.text = array[item];
-		option.value = item;
-		if (value > 0 || value != '')
-			option.selected = (value === item) ? true : false;
-
-		input.appendChild(option);
-	}
-
-	input.className = 'form-control select2';
-
-	return input;
-}
-
-function Dialog(editorUi, elt, w, h, modal, closable, onClose) {
-	var dx = 0;
-
-	if (mxClient.IS_IE && document.documentMode != 9) {
-		dx = 60;
-	}
-
-	w += dx;
-	h += dx;
-
-	var left = Math.max(0, Math.round((document.body.scrollWidth - w) / 2));
-	var top = Math.max(0, Math.round((Math.max(document.body.scrollHeight,
-		document.documentElement.scrollHeight) - h) / 3));
-
-	var div = editorUi.createDiv('geDialog');
-	div.className = 'modal fade in center';
-	div.style.display = 'block';
-	div.style.paddingRight = '12px';
-	// div.style.width = w + 'px';
-	// div.style.height = h + 'px';
-	// div.style.left = left + 'px';
-	// div.style.top = top + 'px';
-
-	var divModalDialog = editorUi.createDiv('geModalDialog');
-	divModalDialog.className = 'modal-dialog';
-
-	divModalDialog.appendChild(elt);
-	div.appendChild(divModalDialog);
-
-	if (this.bg == null) {
-		this.bg = editorUi.createDiv('background');
-		this.bg.className = 'modal-backdrop fade in';
-
-		if (mxClient.IS_QUIRKS) {
-			new mxDivResizer(this.bg);
-		}
-	}
-
-	if (modal) {
-		document.body.appendChild(this.bg);
-	}
-
-	document.body.appendChild(div);
-
-	this.onDialogClose = onClose;
-	this.container = div;
-};
-
-/**
- * Removes the dialog from the DOM.
- */
-Dialog.prototype.close = function() {
-	if (this.onDialogClose != null) {
-		this.onDialogClose();
-		this.onDialogClose = null;
-	}
-
-	this.container.parentNode.removeChild(this.container);
-	this.bg.parentNode.removeChild(this.bg);
-};
-
-/**
- * Constructs a new open dialog.
- */
-function ImportDialog(editorUi) {
-
-	var content = editorUi.createDiv('modal-content');
-	var header = editorUi.createDiv('modal-header');
-	var body = editorUi.createDiv('modal-body');
-	var footer = editorUi.createDiv('modal-footer');
-
-	//--- START HEADER
-	var title = editorUi.createHeader('h4');
-	mxUtils.write(title, mxResources.get('import') + ' XML');
-
-	var x = mxUtils.button('', function() {
-		editorUi.hideDialog();
-	});
-	x.className = 'close';
-
-	header.appendChild(x);
-	header.appendChild(title);
-	//--- END HEADER
-
-	//--- START BODY
-	var row = editorUi.createDiv('row');
-	var col1 = editorUi.createDiv('col-md-12');
-
-	var textarea = document.createElement('textarea');
-	textarea.style.width = '100%';
-	textarea.style.height = '374px';
-
-	var input = document.createElement('input');
-	input.type = 'file';
-	input.setAttribute('accept', 'text/xml');
-
-	input.addEventListener('change', function readSingleFile(evt) {
-		//Retrieve the first (and only!) File from the FileList object
-		var f = evt.target.files[0];
-		console.log(f);
-		if (f) {
-			if (f.type === 'text/xml') {
-				var r = new FileReader();
-				r.onload = function(e) {
-					var contents = e.target.result;
-					mxUtils.write(textarea, contents);
-				};
-				r.readAsText(f);
-			} else {
-				alert('Failed to load format file');
-			}
-		} else {
-			alert('Failed to load file');
-		}
-	}, false);
-
-	col1.appendChild(input);
-	col1.appendChild(textarea);
-
-	row.appendChild(col1);
-	body.appendChild(row);
-	//--- END BODY
-
-	//--- START FOOTER
-	var save = mxUtils.button(mxResources.get('import'), mxUtils.bind(this,
-		function(data) {
-			var doc = mxUtils.parseXml(textarea.value);
-			editorUi.editor.setGraphXml(doc.documentElement);
-			editorUi.hideDialog();
-		}));
-	save.className = 'btn blue';
-
-	var close = mxUtils.button(mxResources.get('cancel'), function() {
-		editorUi.hideDialog();
-	});
-	close.className = 'btn default';
-
-	footer.appendChild(save);
-	footer.appendChild(close);
-	//--- END FOOTER
-
-	//--- START CONTENT
-	content.appendChild(header);
-	content.appendChild(body);
-	content.appendChild(footer);
-	//--- END CONTENT
-
-	this.container = content;
-
-};
-
-/**
- * Constructs a new about dialog.
- */
-function AboutDialog(editorUi) {
-	var content = editorUi.createDiv('modal-content');
-	var header = editorUi.createDiv('modal-header');
-	var body = editorUi.createDiv('modal-body');
-	var footer = editorUi.createDiv('modal-footer');
-
-	//--- START HEADER
-	var title = editorUi.createHeader('h4');
-	mxUtils.write(title, mxResources.get('about') + ' Cally Square');
-
-	var x = mxUtils.button('', function() {
-		editorUi.hideDialog();
-	});
-	x.className = 'close';
-
-	header.appendChild(x);
-	header.appendChild(title);
-	//--- END HEADER
-
-	//--- START BODY
-	var img = document.createElement('img');
-	img.style.border = '0px';
-	img.setAttribute('width', '176');
-	img.setAttribute('width', '151');
-	img.setAttribute('src', IMAGE_PATH + '/logo.png');
-	body.appendChild(img);
-	mxUtils.br(body);
-	mxUtils.write(body, 'Powered by Xenialab ' + mxClient.VERSION);
-	mxUtils.br(body);
-	var link = document.createElement('a');
-	link.setAttribute('href', 'http://www.callysquare.com/');
-	link.setAttribute('target', '_blank');
-	mxUtils.write(link, 'www.callysquare.com');
-	body.appendChild(link);
-	mxUtils.br(body);
-	mxUtils.br(body);
-	//--- END BODY
-
-	var close = mxUtils.button(mxResources.get('close'), function() {
-		editorUi.hideDialog();
-	});
-	close.className = 'btn default';
-
-	footer.appendChild(close);
-	//--- END FOOTER
-
-	//--- START CONTENT
-	content.appendChild(header);
-	content.appendChild(body);
-	content.appendChild(footer);
-	//--- END CONTENT
-
-	this.container = content;
-};
-
-/**
- * Constructs a new save dialog.
- */
-function SaveDialog(editorUi) {
-
-	var content = editorUi.createDiv('modal-content');
-	var header = editorUi.createDiv('modal-header');
-	var body = editorUi.createDiv('modal-body');
-	var footer = editorUi.createDiv('modal-footer');
-
-	//--- START HEADER
-	var title = editorUi.createHeader('h4');
-	mxUtils.write(title, mxResources.get('saveAs'));
-
-	var x = mxUtils.button('', function() {
-		editorUi.hideDialog();
-	});
-	x.className = 'close';
-
-	header.appendChild(x);
-	header.appendChild(title);
-	//--- END HEADER
-
-	//--- START BODY
-	var name = 'name';
-	var id = '_' + name;
-	var value = editorUi.editor.getOrCreateFilename();
-
-	var row = editorUi.createDiv('row');
-	var col1 = editorUi.createDiv('col-md-4');
-	var col2 = editorUi.createDiv('col-md-8');
-
-	var label = document.createElement('label');
-	label.className = 'control-label pull-right';
-	mxUtils.write(label, mxResources.get(name));
-	col1.appendChild(label);
-
-	var select = document.createElement('input');
-	select.setAttribute('value', value + '_copy');
-	select.setAttribute('id', id)
-	select.className = 'form-control';
-	col2.appendChild(select);
-
-	row.appendChild(col1);
-	row.appendChild(col2);
-	body.appendChild(row);
-	//--- END BODY
-
-	//--- START FOOTER
-	var save = mxUtils.button(mxResources.get('save'), function() {
-		editorUi.saveAs(select.value);
-		editorUi.hideDialog();
-	});
-	save.className = 'btn blue';
-
-	var close = mxUtils.button(mxResources.get('cancel'), function() {
-		editorUi.hideDialog();
-	});
-	close.className = 'btn default';
-
-	footer.appendChild(save);
-	footer.appendChild(close);
-	//--- END FOOTER
-
-	//--- START CONTENT
-	content.appendChild(header);
-	content.appendChild(body);
-	content.appendChild(footer);
-	//--- END CONTENT
-
-	this.container = content;
-	//nameInput.setAttribute('value', editorUi.editor.getOrCreateFilename());
-};
-
-/**
- * Constructs a new save dialog.
- */
-function NewDialog(editorUi) {
-
-	var content = editorUi.createDiv('modal-content');
-	var header = editorUi.createDiv('modal-header');
-	var body = editorUi.createDiv('modal-body');
-	var footer = editorUi.createDiv('modal-footer');
-
-	//--- START HEADER
-	var title = editorUi.createHeader('h4');
-	mxUtils.write(title, mxResources.get('new'));
-
-	var x = mxUtils.button('', function() {
-		editorUi.hideDialog();
-	});
-	x.className = 'close';
-
-	header.appendChild(x);
-	header.appendChild(title);
-	//--- END HEADER
-
-	//--- START BODY
-	var name = 'name';
-	var id = '_' + name;
-	var value = editorUi.editor.getOrCreateFilename();
-
-	var row = editorUi.createDiv('row');
-	var col1 = editorUi.createDiv('col-md-4');
-	var col2 = editorUi.createDiv('col-md-8');
-
-	var label = document.createElement('label');
-	label.className = 'control-label pull-right';
-	mxUtils.write(label, mxResources.get(name));
-	col1.appendChild(label);
-
-	var select = document.createElement('input');
-	select.setAttribute('value', value + '_new');
-	select.setAttribute('id', id)
-	select.className = 'form-control';
-	col2.appendChild(select);
-
-	row.appendChild(col1);
-	row.appendChild(col2);
-	body.appendChild(row);
-	//--- END BODY
-
-	//--- START FOOTER
-	var save = mxUtils.button(mxResources.get('new'), function() {
-		editorUi.new(select.value);
-		editorUi.hideDialog();
-	});
-	save.className = 'btn blue';
-
-	var close = mxUtils.button(mxResources.get('cancel'), function() {
-		editorUi.hideDialog();
-	});
-	close.className = 'btn default';
-
-	footer.appendChild(save);
-	footer.appendChild(close);
-	//--- END FOOTER
-
-	//--- START CONTENT
-	content.appendChild(header);
-	content.appendChild(body);
-	content.appendChild(footer);
-	//--- END CONTENT
-
-	this.container = content;
-	//nameInput.setAttribute('value', editorUi.editor.getOrCreateFilename());
-};
-
-/**
- * Constructs a new description dialog.
- */
-function DescriptionDialog(editorUi) {
-	console.log(editorUi.editor.data);
-	var content = editorUi.createDiv('modal-content');
-	var header = editorUi.createDiv('modal-header');
-	var body = editorUi.createDiv('modal-body');
-	var footer = editorUi.createDiv('modal-footer');
-
-	//--- START HEADER
-	var title = editorUi.createHeader('h4');
-	mxUtils.write(title, mxResources.get('description'));
-
-	var x = mxUtils.button('', function() {
-		editorUi.hideDialog();
-	});
-	x.className = 'close';
-
-	header.appendChild(x);
-	header.appendChild(title);
-	//--- END HEADER
-
-	//--- START BODY
-
-	var form = editorUi.createDiv('form-horizontal form-row-seperated');
-
-	// START DESCRIPTION field
-	var name = 'description';
-	var id = '_' + name;
-	var value = editorUi.editor.data.description || '';
-	var group = editorUi.createDiv('form-group');
-
-	var label = document.createElement('label');
-	label.className = 'col-sm-4 control-label';
-	mxUtils.write(label, mxResources.get(name));
-	group.appendChild(label);
-
-	var input = document.createElement('input');
-	input.setAttribute('value', value);
-	input.className = 'form-control';
-	input.setAttribute('id', id);
-
-	var div = editorUi.createDiv('col-sm-8');
-	div.appendChild(input);
-
-	group.appendChild(div);
-	form.appendChild(group);
-	//END DESCRIPTION field
-
-	body.appendChild(form);
-	//--- END BODY
-
-	//--- START FOOTER
-	var save = mxUtils.button(mxResources.get('update'), function() {
-		editorUi.description(input.value);
-		editorUi.hideDialog();
-	});
-	save.className = 'btn blue';
-
-	var close = mxUtils.button(mxResources.get('cancel'), function() {
-		editorUi.hideDialog();
-	});
-	close.className = 'btn default';
-
-	footer.appendChild(save);
-	footer.appendChild(close);
-	//--- END FOOTER
-
-	//--- START CONTENT
-	content.appendChild(header);
-	content.appendChild(body);
-	content.appendChild(footer);
-	//--- END CONTENT
-
-	this.container = content;
-	//nameInput.setAttribute('value', editorUi.editor.getOrCreateFilename());
-}
-
-/**
- * Constructs a new variable dialog.
- */
-function VariableDialog(editorUi) {
-
-	var content = editorUi.createDiv('modal-content');
-	var header = editorUi.createDiv('modal-header');
-	var body = editorUi.createDiv('modal-body');
-	var footer = editorUi.createDiv('modal-footer');
-
-	//--- START HEADER
-	var title = editorUi.createHeader('h4');
-	mxUtils.write(title, mxResources.get('variable'));
-
-	var x = mxUtils.button('', function() {
-		editorUi.hideDialog();
-	});
-	x.className = 'close';
-
-	header.appendChild(x);
-	header.appendChild(title);
-	//--- END HEADER
-
-	//--- START BODY
-
-	var form = editorUi.createDiv('form-horizontal form-row-seperated');
-
-	//NAME field
-	var name = 'name';
-	var id = '_' + name;
-	var value = 'variable name';
-	var group = editorUi.createDiv('form-group');
-
-	var label = document.createElement('label');
-	label.className = 'col-sm-4 control-label';
-	mxUtils.write(label, mxResources.get(name));
-	group.appendChild(label);
-
-	var input = document.createElement('input');
-	input.setAttribute('value', value);
-	input.className = 'form-control';
-	input.setAttribute('id', id);
-
-	var div = editorUi.createDiv('col-sm-8');
-	div.appendChild(input);
-
-	group.appendChild(div);
-	form.appendChild(group);
-	//END NAME field
-
-	//DESCRIPTION field
-	name = 'description';
-	id = '_' + name;
-	value = 'variable description';
-	group = editorUi.createDiv('form-group last');
-
-	label = document.createElement('label');
-	label.className = 'col-sm-4 control-label';
-	mxUtils.write(label, mxResources.get(name));
-	group.appendChild(label);
-
-	var inputDesc = document.createElement('input');
-	inputDesc.setAttribute('value', value);
-	inputDesc.className = 'form-control';
-	inputDesc.setAttribute('id', id);
-
-	div = editorUi.createDiv('col-sm-8');
-	div.appendChild(inputDesc);
-
-	group.appendChild(div);
-	form.appendChild(group);
-	//END DESCRIPTION field
-
-	body.appendChild(form);
-	//--- END BODY
-
-	//--- START FOOTER
-	var save = mxUtils.button(mxResources.get('new'), function() {
-		editorUi.variable(input.value, inputDesc.value);
-		editorUi.hideDialog();
-	});
-	save.className = 'btn blue';
-
-	var close = mxUtils.button(mxResources.get('cancel'), function() {
-		editorUi.hideDialog();
-	});
-	close.className = 'btn default';
-
-	footer.appendChild(save);
-	footer.appendChild(close);
-	//--- END FOOTER
-
-	//--- START CONTENT
-	content.appendChild(header);
-	content.appendChild(body);
-	content.appendChild(footer);
-	//--- END CONTENT
-
-	this.container = content;
-	//nameInput.setAttribute('value', editorUi.editor.getOrCreateFilename());
-}
-
-/**
- * Constructs a new save dialog.
- */
-function OpenDialog(editorUi) {
-
-	var content = editorUi.createDiv('modal-content');
-	var header = editorUi.createDiv('modal-header');
-	var body = editorUi.createDiv('modal-body');
-	var footer = editorUi.createDiv('modal-footer');
-
-	//--- START HEADER
-	var title = editorUi.createHeader('h4');
-	mxUtils.write(title, mxResources.get('open'));
-
-	var x = mxUtils.button('', function() {
-		editorUi.hideDialog();
-	});
-	x.className = 'close';
-
-	header.appendChild(x);
-	header.appendChild(title);
-	//--- END HEADER
-
-	//--- START BODY
-	var row = editorUi.createDiv('row');
-	var col1 = editorUi.createDiv('col-md-4');
-	var col2 = editorUi.createDiv('col-md-8');
-
-	var label = document.createElement('label');
-	label.className = 'control-label pull-right';
-	mxUtils.write(label, mxResources.get('name'));
-	col1.appendChild(label);
-
-	var req = new XMLHttpRequest();
-	req.open('GET', '/api/square/projects', false); // `false` makes the request synchronous
-	req.setRequestHeader('Authorization', 'Bearer ' + editorUi.editor.data.token);
-	req.send(null);
-	var res = [];
-	if (req.status === 200) {
-		res = JSON.parse(req.response);
-	}
-
-	var select = document.createElement('select');
-
-	for (var j = 0; j < res.length; j++) {
-		var option = document.createElement('option');
-		option.text = res[j].name;
-		option.value = res[j].id;
-		select.appendChild(option);
-	}
-	select.className = 'form-control';
-	col2.appendChild(select);
-
-	row.appendChild(col1);
-	row.appendChild(col2);
-	body.appendChild(row);
-	//--- END BODY
-
-	//--- START FOOTER
-	var save = mxUtils.button(mxResources.get('open'), function() {
-		console.log(select);
-		console.log(select.value);
-		window.open('square/project/' + select.value, '_blank');
-		editorUi.hideDialog();
-	});
-	save.className = 'btn blue';
-
-	var close = mxUtils.button(mxResources.get('cancel'), function() {
-		editorUi.hideDialog();
-	});
-	close.className = 'btn default';
-
-	footer.appendChild(save);
-	footer.appendChild(close);
-	//--- END FOOTER
-
-	//--- START CONTENT
-	content.appendChild(header);
-	content.appendChild(body);
-	content.appendChild(footer);
-	//--- END CONTENT
-
-	this.container = content;
-	//nameInput.setAttribute('value', editorUi.editor.getOrCreateFilename());
-};
-/**
- * Constructs a new rename dialog.
- */
-function RenameDialog(editorUi) {
-
-	var content = editorUi.createDiv('modal-content');
-	var header = editorUi.createDiv('modal-header');
-	var body = editorUi.createDiv('modal-body');
-	var footer = editorUi.createDiv('modal-footer');
-
-	//--- START HEADER
-	var title = editorUi.createHeader('h4');
-	mxUtils.write(title, mxResources.get('rename'));
-
-	var x = mxUtils.button('', function() {
-		editorUi.hideDialog();
-	});
-	x.className = 'close';
-
-	header.appendChild(x);
-	header.appendChild(title);
-	//--- END HEADER
-
-	//--- START BODY
-	var row = editorUi.createDiv('row');
-	var col1 = editorUi.createDiv('col-md-4');
-	var col2 = editorUi.createDiv('col-md-8');
-
-	var label = document.createElement('label');
-	label.className = 'control-label pull-right';
-	mxUtils.write(label, mxResources.get('name'));
-	col1.appendChild(label);
-	var name = editorUi.editor.filename;
-	var input = document.createElement('input');
-	input.setAttribute('value', name);
-	input.className = 'form-control';
-
-	col2.appendChild(input);
-
-	row.appendChild(col1);
-	row.appendChild(col2);
-	body.appendChild(row);
-	//--- END BODY
-
-	//--- START FOOTER
-	var save = mxUtils.button(mxResources.get('save'), function() {
-		var req = new XMLHttpRequest();
-
-		req.open("PUT", SAVE_URL + editorUi.editor.data.id, true);
-		req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
-		req.setRequestHeader('Authorization', 'Bearer ' + editorUi.editor.data.token);
-		req.send('name=' + input.value);
-
-		req.onload = function(e) {
-			if (req.status === 200) {
-				editorUi.editor.setStatus('Project successfully renamed');
-				editorUi.editor.filename = input.value;
-
-			} else {
-				console.log(req.response);
-				editorUi.editor.setStatus(JSON.parse(req.response).errors[0].message);
-			}
-		}
-		req.onerror = function(e) {
-			mxUtils.alert(req.statusText);
-		};
-		editorUi.hideDialog();
-	});
-	save.className = 'btn blue';
-
-	var close = mxUtils.button(mxResources.get('cancel'), function() {
-		editorUi.hideDialog();
-	});
-	close.className = 'btn default';
-
-	footer.appendChild(save);
-	footer.appendChild(close);
-	//--- END FOOTER
-
-	//--- START CONTENT
-	content.appendChild(header);
-	content.appendChild(body);
-	content.appendChild(footer);
-	//--- END CONTENT
-
-	this.container = content;
-	//nameInput.setAttribute('value', editorUi.editor.getOrCreateFilename());
-};
-
-/**
- * Constructs a new edit file dialog.
- */
-function EditFileDialog(editorUi) {
-
-	var content = editorUi.createDiv('modal-content');
-	var header = editorUi.createDiv('modal-header');
-	var body = editorUi.createDiv('modal-body');
-	var footer = editorUi.createDiv('modal-footer');
-
-	//--- START HEADER
-	var title = editorUi.createHeader('h4');
-	mxUtils.write(title, mxResources.get('edit'));
-
-	var x = mxUtils.button('', function() {
-		editorUi.hideDialog();
-	});
-	x.className = 'close';
-
-	header.appendChild(x);
-	header.appendChild(title);
-	//--- END HEADER
-
-	//--- START BODY
-	var row = editorUi.createDiv('row');
-	var col1 = editorUi.createDiv('col-md-12');
-
-	var textarea = document.createElement('textarea');
-	textarea.style.width = '100%';
-	textarea.style.height = '374px';
-	textarea.value = mxUtils.getPrettyXml(editorUi.editor.getGraphXml());
-
-	// Enables dropping files
-	if (fileSupport) {
-		function handleDrop(evt) {
-			evt.stopPropagation();
-			evt.preventDefault();
-
-			if (evt.dataTransfer.files.length > 0) {
-				var file = evt.dataTransfer.files[0];
-
-				var reader = new FileReader();
-				reader.onload = function(e) {
-					textarea.value = e.target.result;
-				};
-				reader.readAsText(file);
-			}
-		};
-
-		function handleDragOver(evt) {
-			evt.stopPropagation();
-			evt.preventDefault();
-		};
-
-		// Setup the dnd listeners.
-		textarea.addEventListener('dragover', handleDragOver, false);
-		textarea.addEventListener('drop', handleDrop, false);
-	}
-	col1.appendChild(textarea);
-
-	row.appendChild(col1);
-	body.appendChild(row);
-	//--- END BODY
-
-	//--- START FOOTER
-	var save = mxUtils.button(mxResources.get('save'), function() {
-		var doc = mxUtils.parseXml(textarea.value);
-		editorUi.editor.setGraphXml(doc.documentElement);
-		editorUi.hideDialog();
-	});
-	save.className = 'btn blue';
-
-	var close = mxUtils.button(mxResources.get('cancel'), function() {
-		editorUi.hideDialog();
-	});
-	close.className = 'btn default';
-
-	footer.appendChild(save);
-	footer.appendChild(close);
-	//--- END FOOTER
-
-	//--- START CONTENT
-	content.appendChild(header);
-	content.appendChild(body);
-	content.appendChild(footer);
-	//--- END CONTENT
-
-	this.container = content;
-};
-
-/**
- * Constructs a new export dialog.
- */
-function ExportDialog(editorUi) {
-	var content = editorUi.createDiv('modal-content');
-	var header = editorUi.createDiv('modal-header');
-	var body = editorUi.createDiv('modal-body form');
-	var footer = editorUi.createDiv('modal-footer');
-
-	//--- START HEADER
-	var title = editorUi.createHeader('h4');
-	mxUtils.write(title, mxResources.get('export') + ' XML');
-
-	var x = mxUtils.button('', function() {
-		editorUi.hideDialog();
-	});
-	x.className = 'close';
-
-	header.appendChild(x);
-	header.appendChild(title);
-	//--- END HEADER
-
-	//--- START BODY
-	var form = editorUi.createDiv('form-horizontal form-row-seperated');
-	var group = editorUi.createDiv('form-group last');
-
-	var label = document.createElement('label');
-	label.className = 'col-sm-4 control-label';
-	mxUtils.write(label, mxResources.get('filename'));
-
-	var input = document.createElement('input');
-	input.setAttribute('value', editorUi.editor.getOrCreateFilename());
-	input.className = 'form-control';
-
-	var div = editorUi.createDiv('col-sm-8');
-	div.appendChild(input);
-
-	group.appendChild(label);
-	group.appendChild(div);
-	form.appendChild(group);
-
-	body.appendChild(form);
-	//--- END BODY
-
-	//--- START FOOTER
-	var save = mxUtils.button(mxResources.get('export'), mxUtils.bind(this,
-		function(data) {
-			editorUi.save(false);
-
-			var xml = encodeURIComponent(mxUtils.getXml(editorUi.editor.getGraphXml()));
-			new mxXmlRequest(SAVE_URL + editorUi.editor.data.id + '/download',
-				'filename=' + input.value, 'GET').simulate(document, "_blank");
-			editorUi.hideDialog();
-		}));
-	save.className = 'btn blue';
-
-	var close = mxUtils.button(mxResources.get('cancel'), function() {
-		editorUi.hideDialog();
-	});
-	close.className = 'btn default';
-
-	footer.appendChild(save);
-	footer.appendChild(close);
-	//--- END FOOTER
-
-	//--- START CONTENT
-	content.appendChild(header);
-	content.appendChild(body);
-	content.appendChild(footer);
-	//--- END CONTENT
-
-	this.container = content;
-};
-
-/**
- * Giuseppe Careri
- * Constructs a new general dialog.
- */
-function GeneralDialog(editorUi, cell) {
-	var graph = editorUi.editor.graph;
-
-	var content = editorUi.createDiv('modal-content');
-	var header = editorUi.createDiv('modal-header');
-	var body = editorUi.createDiv('modal-body form modal-body-scroll');
-	var footer = editorUi.createDiv('modal-footer');
-
-	//--- START HEADER
-	var title = editorUi.createHeader('h4');
-	mxUtils.write(title, mxResources.get('edit') + ' ' + mxResources.get(cell.value
-		.nodeName));
-
-	var x = mxUtils.button('', function() {
-		editorUi.hideDialog();
-	});
-	x.className = 'close';
-
-	header.appendChild(x);
-	header.appendChild(title);
-	//--- END HEADER
-
-	//--- START BODY
-	var length = cell.value.attributes.length;
-	var form = editorUi.createDiv('form-horizontal form-row-seperated');
-
-	for (var i = 0; i < length; i++) {
-		var name = cell.value.attributes[i].name;
-		var id = '_' + name;
-		var value = cell.value.attributes[i].value;
-
-		var group = editorUi.createDiv((i == length - 1) ? 'form-group last' :
-			'form-group');
-
-		var label = document.createElement('label');
-		label.className = 'col-sm-4 control-label';
-		mxUtils.write(label, mxResources.get(name));
-		group.appendChild(label);
-
-		var input;
-
-		switch (name) {
-			case 'sip_id':
-				input = createDropdownWithOptgroupFromApi('/api/users/all', value, 'fullname', 'id', editorUi, 'role');
-				break;
-			case 'queue_id':
-				input = createDropdownFromApi('/api/voice/queues', value, 'name', 'name',
-					editorUi);
-				break;
-			case 'trunk_name':
-				input = createDropdownFromApi('/api/trunks', value, 'name', 'name', editorUi);
-				break;
-			case 'variable_id':
-				input = createDropdownFromApi('/api/variables', value, 'name', 'id',
-					editorUi);
-				break;
-			case 'account_id':
-				if (cell.value.nodeName == 'sendMail') {
-					input = createDropdownFromApi('/api/mail/servers/out', value, 'username', 'id',
-						editorUi);
-				} else {
-					input = createDropdownFromApi('/api/sms/accounts', value, 'name', 'id',
-						editorUi);
-				}
-				break;
-			case 'template_id':
-				input = createDropdownFromApi('/api/templates', value, 'name', 'id',
-					editorUi);
-				break;
-			case 'context':
-				input = createDropdownFromApi('/api/voice/contexts', value, 'name', 'name',
-					editorUi);
-				break;
-			case 'mailbox':
-				input = createDropdownFromApi('/api/voice/voicemails', value, 'mailbox',
-					'id', editorUi, ['mailbox', 'context'], '%mailbox%@%context%');
-				break;
-			case 'model':
-				input = createDropdownFromArray(ISPEECHASRMODEL, value);
-				break;
-			case 'ispeech_asr_language':
-				input = createDropdownFromArray(ISPEECHASRLANG, value);
-				break;
-			case 'beep':
-				input = createDropdownFromArray(ISPEECHBEEP, value);
-				break;
-			case 'hiddendigitspos':
-				input = createDropdownFromArray(SECRETDIGITSPOS, value);
-				break;
-			case 'ispeech_tts_language':
-				input = createDropdownFromArray(ISPEECHLANG, value);
-				break;
-			case 'google_tts_language':
-				input = createDropdownFromArray(GOOGLETTSLANG, value);
-				break;
-			case 'intKey':
-				input = createDropdownFromArray(ASRINTKEYS, value);
-				break;
-			case 'recordingFormat':
-				input = createDropdownFromArray(RECORDINGFORMAT, value);
-				break;
-			case 'answer':
-				input = createDropdownFromArray(BOOLSELECT, value);
-				break;
-			case 'list_id':
-				input = createDropdownFromTigerDialList(value);
-				break;
-			case 'interval_id':
-				input = createGroupedDropdownFromApi('/api/intervals', value, 'name', 'id',
-					editorUi, 'SubIntervals');
-				break;
-			case 'project_id':
-				input = createDropdownFromApi('/api/square/projects', value, 'name', 'id',
-					editorUi);
-				break;
-			case 'odbc_id':
-				input = createDropdownFromApi('/api/square/odbc', value, 'name', 'id',
-					editorUi);
-				break;
-			case 'file_id':
-				input = createDropdownFromApi('/api/sounds', value, 'display_name', 'id',
-					editorUi);
-				break;
-			case 'timeout':
-			case 'digit':
-			case 'mindigit':
-			case 'maxdigit':
-			case 'response':
-			case 'retry':
-			case 'speed':
-				input = document.createElement('input');
-				input.setAttribute('type', 'number');
-				input.setAttribute('min', 0);
-				input.setAttribute('max', 1000);
-				input.setAttribute('value', value);
-				input.className = 'form-control';
-				break;
-			case 'text':
-			case 'key':
-			case 'query':
-			case 'condition':
-			case 'command':
-			case 'body':
-				input = document.createElement('textarea');
-				input.innerHTML = value;
-				input.className = 'form-control';
-				break;
-			case 'sms_text':
-				input = document.createElement('textarea');
-				input.innerHTML = value;
-				input.className = 'form-control';
-				input.setAttribute('maxlength', '160');
-				break;
-			default:
-				input = document.createElement('input');
-				input.setAttribute('value', value);
-				input.className = 'form-control';
-				break;
-		}
-
-		input.setAttribute('id', id);
-
-		var div = editorUi.createDiv('col-sm-8');
-		div.appendChild(input);
-
-		// Help
-		if (mxResources.get('help_' + name)) {
-			var help = editorUi.createDiv('p');
-			help.className = 'help-block';
-			mxUtils.write(help, mxResources.get('help_' + name));
-			div.appendChild(help);
-		}
-
-		group.appendChild(div);
-		form.appendChild(group);
-	}
-	body.appendChild(form);
-	//--- END BODY
-
-	//--- START FOOTER
-	var save = mxUtils.button(mxResources.get('save'), mxUtils.bind(this,
-		function(data) {
-			for (var i = 0; i < cell.value.attributes.length; i++) {
-				var id = '_' + cell.value.attributes[i].name;
-				var name = cell.value.attributes[i].name;
-				// console.log(name, document.getElementById(id).value);
-				cell.setAttribute(name, document.getElementById(id).value);
-			};
-			graph.refresh(cell);
-			editorUi.hideDialog();
-		}));
-	save.className = 'btn blue';
-
-	var close = mxUtils.button(mxResources.get('cancel'), function() {
-		editorUi.hideDialog();
-	});
-	close.className = 'btn default';
-
-	footer.appendChild(save);
-	footer.appendChild(close);
-	//--- END FOOTER
-
-	//--- START CONTENT
-	content.appendChild(header);
-	content.appendChild(body);
-	content.appendChild(footer);
-	//--- END CONTENT
-
-	this.container = content;
-};
\ No newline at end of file
diff --git a/public/assets/plugins/square/js/Editor.js b/public/assets/plugins/square/js/Editor.js
index 9858989..e9ee896 100644
--- a/public/assets/plugins/square/js/Editor.js
+++ b/public/assets/plugins/square/js/Editor.js
@@ -1,888 +1 @@
-/**
- * $Id: Editor.js,v 1.14 2013/03/06 17:57:10 boris Exp $
- * Copyright (c) 2006-2012, JGraph Ltd
- */
-// Specifies if local storage should be used (eg. on the iPad which has no filesystem)
-var useLocalStorage = (mxClient.IS_TOUCH || urlParams['storage'] == 'local') && typeof(localStorage) != 'undefined';
-var fileSupport = window.File != null && window.FileReader != null && window.FileList != null;
-
-// Specifies if connector should be shown on selected cells
-var touchStyle = mxClient.IS_TOUCH || urlParams['touch'] == '1';
-
-// Counts open editor tabs (must be global for cross-window access)
-var counter = 0;
-
-// Cross-domain window access is not allowed in FF, so if we
-// were opened from another domain then this will fail.
-try {
-	var op = window;
-
-	while (op.opener != null && !isNaN(op.opener.counter)) {
-		op = op.opener;
-	}
-
-	// Increments the counter in the first opener in the chain
-	if (op != null) {
-		op.counter++;
-		counter = op.counter;
-	}
-} catch (e) {
-	// ignore
-}
-
-/**
- * Editor constructor executed on page load.
- */
-Editor = function() {
-	mxEventSource.call(this);
-	this.init();
-	this.initStencilRegistry();
-	this.graph = new Graph();
-	this.outline = new mxOutline(this.graph);
-	this.outline.updateOnPan = true;
-	this.undoManager = this.createUndoManager();
-	this.status = '';
-
-	// Contains the name which was used for the last save. Default value is null.
-	this.filename = null;
-
-	this.getOrCreateFilename = function() {
-		return this.filename || mxResources.get('drawing', [counter]) + '.xml';
-	};
-
-	this.getFilename = function() {
-		return this.filename;
-	};
-
-	// Sets the status and fires a statusChanged event
-	this.setStatus = function(value) {
-		this.status = value;
-		this.fireEvent(new mxEventObject('statusChanged'));
-	};
-
-	// Returns the current status
-	this.getStatus = function() {
-		return this.status;
-	};
-
-	// Contains the current modified state of the diagram. This is false for
-	// new diagrams and after the diagram was saved.
-	this.modified = false;
-
-	// Updates modified state if graph changes
-	this.graphChangeListener = function() {
-		this.modified = true;
-	};
-	this.graph.getModel().addListener(mxEvent.CHANGE, mxUtils.bind(this, function() {
-		this.graphChangeListener.apply(this, arguments);
-	}));
-
-	// Installs dialog if browser window is closed without saving
-	// This must be disabled during save and image export
-	window.onbeforeunload = mxUtils.bind(this, function() {
-		if (this.modified) {
-			return mxResources.get('allChangesLost');
-		}
-	});
-
-	// Sets persistent graph state defaults
-	this.graph.resetViewOnRootChange = false;
-	this.graph.scrollbars = true;
-	this.graph.background = null;
-};
-
-// Editor inherits from mxEventSource
-mxUtils.extend(Editor, mxEventSource);
-
-/**
- * Specifies the image URL to be used for the grid.
- */
-Editor.prototype.gridImage = IMAGE_PATH + '/grid.gif';
-
-/**
- * Specifies the image URL to be used for the transparent background.
- */
-Editor.prototype.transparentImage = IMAGE_PATH + '/transparent.gif';
-
-/**
- * Sets the XML node for the current diagram.
- */
-Editor.prototype.setGraphXml = function(node) {
-	var dec = new mxCodec(node.ownerDocument);
-
-	if (node.nodeName == 'mxGraphModel') {
-		this.graph.view.scale = 1;
-		this.graph.gridEnabled = node.getAttribute('grid') != '0';
-		this.graph.graphHandler.guidesEnabled = node.getAttribute('guides') != '0';
-		this.graph.setTooltips(node.getAttribute('tooltips') != '0');
-		this.graph.setConnectable(node.getAttribute('connect') != '0');
-		this.graph.foldingEnabled = node.getAttribute('fold') != '0';
-		this.graph.scrollbars = node.getAttribute('scrollbars') != '0';
-
-		if (!this.graph.scrollbars) {
-			this.graph.container.scrollLeft = 0;
-			this.graph.container.scrollTop = 0;
-			this.graph.view.translate.x = Number(node.getAttribute('dx') || 0);
-			this.graph.view.translate.y = Number(node.getAttribute('dy') || 0);
-		}
-
-		this.graph.pageVisible = node.getAttribute('page') == '1';
-		this.graph.pageBreaksVisible = this.graph.pageVisible;
-		this.graph.preferPageSize = this.graph.pageBreaksVisible;
-
-		// Loads the persistent state settings
-		var ps = node.getAttribute('pageScale');
-
-		if (ps != null) {
-			this.graph.pageScale = ps;
-		} else {
-			this.graph.pageScale = 1.5;
-		}
-
-		var pw = node.getAttribute('pageWidth');
-		var ph = node.getAttribute('pageHeight');
-
-		if (pw != null && ph != null) {
-			this.graph.pageFormat = new mxRectangle(0, 0, parseFloat(pw), parseFloat(ph));
-			this.outline.outline.pageFormat = this.graph.pageFormat;
-		}
-
-		// Loads the persistent state settings
-		var bg = node.getAttribute('background');
-
-		if (bg != null && bg.length > 0) {
-			this.graph.background = bg;
-		}
-
-		dec.decode(node, this.graph.getModel());
-		this.updateGraphComponents();
-	}
-};
-
-/**
- * Returns the XML node that represents the current diagram.
- */
-Editor.prototype.getGraphXml = function() {
-	var enc = new mxCodec(mxUtils.createXmlDocument());
-	var node = enc.encode(this.graph.getModel());
-
-	if (this.graph.view.translate.x != 0 || this.graph.view.translate.y != 0) {
-		node.setAttribute('dx', Math.round(this.graph.view.translate.x * 100) / 100);
-		node.setAttribute('dy', Math.round(this.graph.view.translate.y * 100) / 100);
-	}
-
-	node.setAttribute('grid', (this.graph.isGridEnabled()) ? '1' : '0');
-	node.setAttribute('guides', (this.graph.graphHandler.guidesEnabled) ? '1' : '0');
-	node.setAttribute('guides', (this.graph.graphHandler.guidesEnabled) ? '1' : '0');
-	node.setAttribute('tooltips', (this.graph.tooltipHandler.isEnabled()) ? '1' : '0');
-	node.setAttribute('connect', (this.graph.connectionHandler.isEnabled()) ? '1' : '0');
-	node.setAttribute('fold', (this.graph.foldingEnabled) ? '1' : '0');
-	node.setAttribute('page', (this.graph.pageVisible) ? '1' : '0');
-	node.setAttribute('pageScale', this.graph.pageScale);
-	node.setAttribute('pageWidth', this.graph.pageFormat.width);
-	node.setAttribute('pageHeight', this.graph.pageFormat.height);
-
-	if (!this.graph.scrollbars) {
-		node.setAttribute('scrollbars', '0');
-	}
-
-	if (this.graph.background != null) {
-		node.setAttribute('background', this.graph.background);
-	}
-
-	return node;
-};
-
-/**
- * Keeps the graph container in sync with the persistent graph state
- */
-Editor.prototype.updateGraphComponents = function() {
-	var graph = this.graph;
-	var outline = this.outline;
-
-	if (graph.container != null && outline.outline.container != null) {
-		if (graph.background != null) {
-			if (graph.background == 'none') {
-				graph.container.style.backgroundColor = 'transparent';
-			} else {
-				if (graph.view.backgroundPageShape != null) {
-					graph.view.backgroundPageShape.fill = graph.background;
-					graph.view.backgroundPageShape.reconfigure();
-				}
-
-				graph.container.style.backgroundColor = graph.background;
-			}
-		} else {
-			graph.container.style.backgroundColor = '';
-		}
-
-		if (graph.pageVisible) {
-			graph.container.style.backgroundColor = '#ebebeb';
-			graph.container.style.borderStyle = 'solid';
-			graph.container.style.borderColor = '#e5e5e5';
-			graph.container.style.borderTopWidth = '1px';
-			graph.container.style.borderLeftWidth = '1px';
-			graph.container.style.borderRightWidth = '0px';
-			graph.container.style.borderBottomWidth = '0px';
-		} else {
-			graph.container.style.border = '';
-		}
-
-		outline.outline.container.style.backgroundColor = graph.container.style.backgroundColor;
-
-		if (outline.outline.pageVisible != graph.pageVisible ||
-			outline.outline.pageScale != graph.pageScale) {
-			outline.outline.pageScale = graph.pageScale;
-			outline.outline.pageVisible = graph.pageVisible;
-			outline.outline.view.validate();
-		}
-
-		if (graph.scrollbars && graph.container.style.overflow == 'hidden' && !touchStyle) {
-			graph.container.style.overflow = 'auto';
-		} else if (!graph.scrollbars || touchStyle) {
-			graph.container.style.overflow = 'hidden';
-		}
-
-		// Transparent.gif is a workaround for focus repaint problems in IE
-		var noBackground = (mxClient.IS_IE && document.documentMode >= 9) ? 'url(' + this.transparentImage + ')' : 'none';
-		graph.container.style.backgroundImage = (!graph.pageVisible && graph.isGridEnabled()) ? 'url(' + this.gridImage + ')' : noBackground;
-
-		if (graph.view.backgroundPageShape != null) {
-			graph.view.backgroundPageShape.node.style.backgroundImage = (this.graph.isGridEnabled()) ? 'url(' + this.gridImage + ')' : 'none';
-		}
-	}
-};
-
-/**
- * Initializes the environment.
- */
-Editor.prototype.init = function() {
-	// Adds stylesheet for IE6
-	if (mxClient.IS_IE6) {
-		mxClient.link('stylesheet', CSS_PATH + '/grapheditor-ie6.css');
-	}
-
-	// Adds required resources (disables loading of fallback properties, this can only
-	// be used if we know that all keys are defined in the language specific file)
-	mxResources.loadDefaultBundle = false;
-	mxResources.add(RESOURCE_BASE);
-
-	// Makes the connection hotspot smaller
-	mxConstants.DEFAULT_HOTSPOT = 0.3;
-
-	var mxConnectionHandlerCreateMarker = mxConnectionHandler.prototype.createMarker;
-	mxConnectionHandler.prototype.createMarker = function() {
-		var marker = mxConnectionHandlerCreateMarker.apply(this, arguments);
-
-		// Overrides to ignore hotspot only for target terminal
-		marker.intersects = mxUtils.bind(this, function(state, evt) {
-			if (this.isConnecting()) {
-				return true;
-			}
-
-			return mxCellMarker.prototype.intersects.apply(marker, arguments);
-		});
-
-		return marker;
-	};
-
-	// Makes the shadow brighter
-	mxConstants.SHADOWCOLOR = '#d0d0d0';
-
-	// Changes some default colors
-	mxConstants.HANDLE_FILLCOLOR = '#99ccff';
-	mxConstants.HANDLE_STROKECOLOR = '#0088cf';
-	mxConstants.VERTEX_SELECTION_COLOR = '#00a8ff';
-	mxConstants.OUTLINE_COLOR = '#00a8ff';
-	mxConstants.OUTLINE_HANDLE_FILLCOLOR = '#99ccff';
-	mxConstants.OUTLINE_HANDLE_STROKECOLOR = '#00a8ff';
-	mxConstants.CONNECT_HANDLE_FILLCOLOR = '#cee7ff';
-	mxConstants.EDGE_SELECTION_COLOR = '#00a8ff';
-	mxConstants.DEFAULT_VALID_COLOR = '#00a8ff';
-	mxConstants.LABEL_HANDLE_FILLCOLOR = '#cee7ff';
-	mxConstants.GUIDE_COLOR = '#0088cf';
-
-	mxGraph.prototype.pageBreakColor = '#c0c0c0';
-	mxGraph.prototype.pageScale = 1;
-
-	// Increases default rubberband opacity (default is 20)
-	mxRubberband.prototype.defaultOpacity = 30;
-
-	// Changes border color of background page shape
-	mxGraphView.prototype.createBackgroundPageShape = function(bounds) {
-		return new mxRectangleShape(bounds, this.graph.background || 'white', '#cacaca');
-	};
-
-	// Fits the number of background pages to the graph
-	mxGraphView.prototype.getBackgroundPageBounds = function() {
-		var gb = this.getGraphBounds();
-
-		// Computes unscaled, untranslated graph bounds
-		var x = (gb.width > 0) ? gb.x / this.scale - this.translate.x : 0;
-		var y = (gb.height > 0) ? gb.y / this.scale - this.translate.y : 0;
-		var w = gb.width / this.scale;
-		var h = gb.height / this.scale;
-
-		var fmt = this.graph.pageFormat;
-		var ps = this.graph.pageScale;
-
-		var pw = fmt.width * ps;
-		var ph = fmt.height * ps;
-
-		var x0 = Math.floor(Math.min(0, x) / pw);
-		var y0 = Math.floor(Math.min(0, y) / ph);
-		var xe = Math.ceil(Math.max(1, x + w) / pw);
-		var ye = Math.ceil(Math.max(1, y + h) / ph);
-
-		var rows = xe - x0;
-		var cols = ye - y0;
-
-		var bounds = new mxRectangle(this.scale * (this.translate.x + x0 * pw), this.scale *
-			(this.translate.y + y0 * ph), this.scale * rows * pw, this.scale * cols * ph);
-
-		return bounds;
-	};
-
-	// Add panning for background page in VML
-	var graphPanGraph = mxGraph.prototype.panGraph;
-	mxGraph.prototype.panGraph = function(dx, dy) {
-		graphPanGraph.apply(this, arguments);
-
-		if ((this.dialect != mxConstants.DIALECT_SVG && this.view.backgroundPageShape != null) &&
-			(!this.useScrollbarsForPanning || !mxUtils.hasScrollbars(this.container))) {
-			this.view.backgroundPageShape.node.style.marginLeft = dx + 'px';
-			this.view.backgroundPageShape.node.style.marginTop = dy + 'px';
-		}
-	};
-
-	var editor = this;
-
-	// Uses HTML for background pages (to support grid background image)
-	mxGraphView.prototype.validateBackground = function() {
-		var bg = this.graph.getBackgroundImage();
-
-		if (bg != null) {
-			if (this.backgroundImage == null || this.backgroundImage.image != bg.src) {
-				if (this.backgroundImage != null) {
-					this.backgroundImage.destroy();
-				}
-
-				var bounds = new mxRectangle(0, 0, 1, 1);
-
-				this.backgroundImage = new mxImageShape(bounds, bg.src);
-				this.backgroundImage.dialect = this.graph.dialect;
-				this.backgroundImage.init(this.backgroundPane);
-				this.backgroundImage.redraw();
-			}
-
-			this.redrawBackgroundImage(this.backgroundImage, bg);
-		} else if (this.backgroundImage != null) {
-			this.backgroundImage.destroy();
-			this.backgroundImage = null;
-		}
-
-		if (this.graph.pageVisible) {
-			var bounds = this.getBackgroundPageBounds();
-
-			if (this.backgroundPageShape == null) {
-				this.backgroundPageShape = this.createBackgroundPageShape(bounds);
-				this.backgroundPageShape.scale = 1;
-				this.backgroundPageShape.isShadow = true;
-				this.backgroundPageShape.dialect = mxConstants.DIALECT_STRICTHTML;
-				this.backgroundPageShape.init(this.graph.container);
-				// Required for the browser to render the background page in correct order
-				this.graph.container.firstChild.style.position = 'absolute';
-				this.graph.container.insertBefore(this.backgroundPageShape.node, this.graph.container.firstChild);
-				this.backgroundPageShape.redraw();
-
-				this.backgroundPageShape.node.className = 'geBackgroundPage';
-				this.backgroundPageShape.node.style.backgroundPosition = '-1px -1px';
-
-				// Adds listener for double click handling on background
-				mxEvent.addListener(this.backgroundPageShape.node, 'dblclick',
-					mxUtils.bind(this, function(evt) {
-						this.graph.dblClick(evt);
-					})
-				);
-
-				// Adds basic listeners for graph event dispatching outside of the
-				// container and finishing the handling of a single gesture
-				mxEvent.addGestureListeners(this.backgroundPageShape.node,
-					mxUtils.bind(this, function(evt) {
-						this.graph.fireMouseEvent(mxEvent.MOUSE_DOWN, new mxMouseEvent(evt));
-					}),
-					mxUtils.bind(this, function(evt) {
-						// Hides the tooltip if mouse is outside container
-						if (this.graph.tooltipHandler != null &&
-							this.graph.tooltipHandler.isHideOnHover()) {
-							this.graph.tooltipHandler.hide();
-						}
-
-						if (this.graph.isMouseDown &&
-							!mxEvent.isConsumed(evt)) {
-							this.graph.fireMouseEvent(mxEvent.MOUSE_MOVE,
-								new mxMouseEvent(evt));
-						}
-					}),
-					mxUtils.bind(this, function(evt) {
-						this.graph.fireMouseEvent(mxEvent.MOUSE_UP,
-							new mxMouseEvent(evt));
-					}));
-			} else {
-				this.backgroundPageShape.scale = 1;
-				this.backgroundPageShape.bounds = bounds;
-				this.backgroundPageShape.redraw();
-			}
-
-			this.backgroundPageShape.node.style.backgroundImage = (this.graph.isGridEnabled()) ?
-				'url(' + editor.gridImage + ')' : 'none';
-		} else if (this.backgroundPageShape != null) {
-			this.backgroundPageShape.destroy();
-			this.backgroundPageShape = null;
-		}
-	};
-
-	// Draws page breaks only within the page
-	mxGraph.prototype.updatePageBreaks = function(visible, width, height) {
-		var scale = this.view.scale;
-		var tr = this.view.translate;
-		var fmt = this.pageFormat;
-		var ps = scale * this.pageScale;
-
-		var bounds2 = this.view.getBackgroundPageBounds();
-
-		width = bounds2.width;
-		height = bounds2.height;
-		var bounds = new mxRectangle(scale * tr.x, scale * tr.y,
-			fmt.width * ps, fmt.height * ps);
-
-		// Does not show page breaks if the scale is too small
-		visible = visible && Math.min(bounds.width, bounds.height) > this.minPageBreakDist;
-
-		var horizontalCount = (visible) ? Math.ceil(width / bounds.width) - 1 : 0;
-		var verticalCount = (visible) ? Math.ceil(height / bounds.height) - 1 : 0;
-		var right = bounds2.x + width;
-		var bottom = bounds2.y + height;
-
-		if (this.horizontalPageBreaks == null && horizontalCount > 0) {
-			this.horizontalPageBreaks = [];
-		}
-
-		if (this.horizontalPageBreaks != null) {
-			for (var i = 0; i <= horizontalCount; i++) {
-				var pts = [new mxPoint(bounds2.x + (i + 1) * bounds.width, bounds2.y),
-					new mxPoint(bounds2.x + (i + 1) * bounds.width, bottom)
-				];
-
-				if (this.horizontalPageBreaks[i] != null) {
-					this.horizontalPageBreaks[i].scale = 1;
-					this.horizontalPageBreaks[i].points = pts;
-					this.horizontalPageBreaks[i].redraw();
-				} else {
-					var pageBreak = new mxPolyline(pts, this.pageBreakColor, this.scale);
-					pageBreak.dialect = this.dialect;
-					pageBreak.isDashed = this.pageBreakDashed;
-					pageBreak.addPipe = false;
-					pageBreak.scale = scale;
-					pageBreak.init(this.view.backgroundPane);
-					pageBreak.redraw();
-
-					this.horizontalPageBreaks[i] = pageBreak;
-				}
-			}
-
-			for (var i = horizontalCount; i < this.horizontalPageBreaks.length; i++) {
-				this.horizontalPageBreaks[i].destroy();
-			}
-
-			this.horizontalPageBreaks.splice(horizontalCount, this.horizontalPageBreaks.length - horizontalCount);
-		}
-
-		if (this.verticalPageBreaks == null && verticalCount > 0) {
-			this.verticalPageBreaks = [];
-		}
-
-		if (this.verticalPageBreaks != null) {
-			for (var i = 0; i <= verticalCount; i++) {
-				var pts = [new mxPoint(bounds2.x, bounds2.y + (i + 1) * bounds.height),
-					new mxPoint(right, bounds2.y + (i + 1) * bounds.height)
-				];
-
-				if (this.verticalPageBreaks[i] != null) {
-					this.verticalPageBreaks[i].scale = 1; //scale;
-					this.verticalPageBreaks[i].points = pts;
-					this.verticalPageBreaks[i].redraw();
-				} else {
-					var pageBreak = new mxPolyline(pts, this.pageBreakColor, scale);
-					pageBreak.dialect = this.dialect;
-					pageBreak.isDashed = this.pageBreakDashed;
-					pageBreak.addPipe = false;
-					pageBreak.scale = scale;
-					pageBreak.init(this.view.backgroundPane);
-					pageBreak.redraw();
-
-					this.verticalPageBreaks[i] = pageBreak;
-				}
-			}
-
-			for (var i = verticalCount; i < this.verticalPageBreaks.length; i++) {
-				this.verticalPageBreaks[i].destroy();
-			}
-
-			this.verticalPageBreaks.splice(verticalCount, this.verticalPageBreaks.length - verticalCount);
-		}
-	};
-
-	// Enables snapping to off-grid terminals for edge waypoints
-	mxEdgeHandler.prototype.snapToTerminals = true;
-
-	// Enables guides
-	mxGraphHandler.prototype.guidesEnabled = true;
-
-	// Disables removing relative children from parents
-	var mxGraphHandlerShouldRemoveCellsFromParent = mxGraphHandler.prototype.shouldRemoveCellsFromParent;
-	mxGraphHandler.prototype.shouldRemoveCellsFromParent = function(parent, cells, evt) {
-		for (var i = 0; i < cells.length; i++) {
-			if (this.graph.getModel().isVertex(cells[i])) {
-				var geo = this.graph.getCellGeometry(cells[i]);
-
-				if (geo != null && geo.relative) {
-					return false;
-				}
-			}
-		}
-
-		return mxGraphHandlerShouldRemoveCellsFromParent.apply(this, arguments);
-	};
-
-	// Alt-move disables guides
-	mxGuide.prototype.isEnabledForEvent = function(evt) {
-		return !mxEvent.isAltDown(evt);
-	};
-
-	// Consumes click events for disabled menu items
-	mxPopupMenuAddItem = mxPopupMenu.prototype.addItem;
-	mxPopupMenu.prototype.addItem = function(title, image, funct, parent, iconCls, enabled) {
-		var result = mxPopupMenuAddItem.apply(this, arguments);
-
-		if (enabled != null && !enabled) {
-			mxEvent.addListener(result, 'mousedown', function(evt) {
-				mxEvent.consume(evt);
-			});
-		}
-
-		return result;
-	};
-
-	// Selects descendants before children selection mode
-	var graphHandlerGetInitialCellForEvent = mxGraphHandler.prototype.getInitialCellForEvent;
-	mxGraphHandler.prototype.getInitialCellForEvent = function(me) {
-		var model = this.graph.getModel();
-		var psel = model.getParent(this.graph.getSelectionCell());
-		var cell = graphHandlerGetInitialCellForEvent.apply(this, arguments);
-		var parent = model.getParent(cell);
-
-		if (psel == null || (psel != cell && psel != parent)) {
-			while (!this.graph.isCellSelected(cell) && !this.graph.isCellSelected(parent) &&
-				model.isVertex(parent) && !this.graph.isValidRoot(parent)) {
-				cell = parent;
-				parent = this.graph.getModel().getParent(cell);
-			}
-		}
-
-		return cell;
-	};
-
-	// Selection is delayed to mouseup if child selected
-	var graphHandlerIsDelayedSelection = mxGraphHandler.prototype.isDelayedSelection;
-	mxGraphHandler.prototype.isDelayedSelection = function(cell) {
-		var result = graphHandlerIsDelayedSelection.apply(this, arguments);
-		var model = this.graph.getModel();
-		var psel = model.getParent(this.graph.getSelectionCell());
-		var parent = model.getParent(cell);
-
-		if (psel == null || (psel != cell && psel != parent)) {
-			if (!this.graph.isCellSelected(cell) && model.isVertex(parent) && !this.graph.isValidRoot(parent)) {
-				result = true;
-			}
-		}
-
-		return result;
-	};
-
-	// Delayed selection of parent group
-	mxGraphHandler.prototype.selectDelayed = function(me) {
-		var cell = me.getCell();
-
-		if (cell == null) {
-			cell = this.cell;
-		}
-
-		var model = this.graph.getModel();
-		var parent = model.getParent(cell);
-
-		while (this.graph.isCellSelected(cell) && model.isVertex(parent) && !this.graph.isValidRoot(parent)) {
-			cell = parent;
-			parent = model.getParent(cell);
-		}
-
-		this.graph.selectCellForEvent(cell, me.getEvent());
-	};
-
-	// Returns last selected ancestor
-	mxPanningHandler.prototype.getCellForPopupEvent = function(me) {
-		var cell = me.getCell();
-		var model = this.graph.getModel();
-		var parent = model.getParent(cell);
-
-		while (model.isVertex(parent) && !this.graph.isValidRoot(parent)) {
-			if (this.graph.isCellSelected(parent)) {
-				cell = parent;
-			}
-
-			parent = model.getParent(parent);
-		}
-
-		return cell;
-	};
-};
-
-/**
- * Creates and returns a new undo manager.
- */
-Editor.prototype.createUndoManager = function() {
-	var graph = this.graph;
-	var undoMgr = new mxUndoManager();
-
-	// Installs the command history
-	var listener = function(sender, evt) {
-		undoMgr.undoableEditHappened(evt.getProperty('edit'));
-	};
-
-	graph.getModel().addListener(mxEvent.UNDO, listener);
-	graph.getView().addListener(mxEvent.UNDO, listener);
-
-	// Keeps the selection in sync with the history
-	var undoHandler = function(sender, evt) {
-		var cand = graph.getSelectionCellsForChanges(evt.getProperty('edit').changes);
-		var cells = [];
-
-		for (var i = 1; i < cand.length; i++) {
-			if (graph.view.getState(cand[i]) != null) {
-				cells.push(cand[i]);
-			}
-		}
-
-		graph.setSelectionCells(cells);
-	};
-
-	undoMgr.addListener(mxEvent.UNDO, undoHandler);
-	undoMgr.addListener(mxEvent.REDO, undoHandler);
-
-	return undoMgr;
-};
-
-/**
- * Adds basic stencil set (no namespace).
- */
-Editor.prototype.initStencilRegistry = function() {
-	// Loads default stencils
-	mxStencilRegistry.loadStencilSet(STENCIL_PATH + '/general.xml');
-};
-
-/**
- * Overrides stencil registry for dynamic loading of stencils.
- */
-(function() {
-	/**
-	 * Maps from library names to an array of Javascript filenames,
-	 * which are synchronously loaded. Currently only stencil files
-	 * (.xml) and JS files (.js) are supported.
-	 * IMPORTANT: For embedded diagrams to work entries must also
-	 * be added in EmbedServlet.java.
-	 */
-	mxStencilRegistry.libraries = {};
-
-	/**
-	 * Stores all package names that have been dynamically loaded.
-	 * Each package is only loaded once.
-	 */
-	mxStencilRegistry.packages = [];
-
-	// Extends the default stencil registry to add dynamic loading
-	mxStencilRegistry.getStencil = function(name) {
-		var result = mxStencilRegistry.stencils[name];
-
-		if (result == null) {
-			var basename = mxStencilRegistry.getBasenameForStencil(name);
-
-			// Loads stencil files and tries again
-			if (basename != null) {
-				var libs = mxStencilRegistry.libraries[basename];
-
-				if (libs != null) {
-					if (mxStencilRegistry.packages[basename] == null) {
-						mxStencilRegistry.packages[basename] = 1;
-
-						for (var i = 0; i < libs.length; i++) {
-							var fname = libs[i];
-
-							if (fname.toLowerCase().substring(fname.length - 4, fname.length) == '.xml') {
-								mxStencilRegistry.loadStencilSet(fname, null);
-							} else if (fname.toLowerCase().substring(fname.length - 3, fname.length) == '.js') {
-								var req = mxUtils.load(fname);
-
-								if (req != null) {
-									eval.call(window, req.getText());
-								}
-							} else {
-								// FIXME: This does not yet work as the loading is triggered after
-								// the shape was used in the graph, at which point the keys have
-								// typically been translated in the calling method.
-								//mxResources.add(fname);
-							}
-						}
-					}
-				} else {
-					mxStencilRegistry.loadStencilSet(STENCIL_PATH + '/' + basename + '.xml', null);
-				}
-
-				result = mxStencilRegistry.stencils[name];
-			}
-		}
-
-		return result;
-	};
-
-	// Returns the basename for the given stencil or null if no file must be
-	// loaded to render the given stencil.
-	mxStencilRegistry.getBasenameForStencil = function(name) {
-		var parts = name.split('.');
-		var tmp = null;
-
-		if (parts.length > 0 && parts[0] == 'mxgraph') {
-			tmp = parts[1];
-
-			for (var i = 2; i < parts.length - 1; i++) {
-				tmp += '/' + parts[i];
-			}
-		}
-
-		return tmp;
-	};
-
-	// Loads the given stencil set
-	mxStencilRegistry.loadStencilSet = function(stencilFile, postStencilLoad, force) {
-		force = (force != null) ? force : false;
-
-		// Uses additional cache for detecting previous load attempts
-		var xmlDoc = mxStencilRegistry.packages[stencilFile];
-
-		if (force || xmlDoc == null) {
-			var install = false;
-
-			if (xmlDoc == null) {
-				var req = mxUtils.load(stencilFile);
-				xmlDoc = req.getXml();
-				mxStencilRegistry.packages[stencilFile] = xmlDoc;
-				install = true;
-			}
-
-			mxStencilRegistry.parseStencilSet(xmlDoc, postStencilLoad, install);
-		}
-	};
-
-	// Parses the given stencil set
-	mxStencilRegistry.parseStencilSet = function(xmlDocument, postStencilLoad, install) {
-		install = (install != null) ? install : true;
-		var root = xmlDocument.documentElement;
-		var shape = root.firstChild;
-		var packageName = '';
-		var name = root.getAttribute('name');
-
-		if (name != null) {
-			packageName = name + '.';
-		}
-
-		while (shape != null) {
-			if (shape.nodeType == mxConstants.NODETYPE_ELEMENT) {
-				name = shape.getAttribute('name');
-
-				if (name != null) {
-					packageName = packageName.toLowerCase();
-					var stencilName = name.replace(/ /g, "_");
-
-					if (install) {
-						mxStencilRegistry.addStencil(packageName + stencilName.toLowerCase(), new mxStencil(shape));
-					}
-
-					if (postStencilLoad != null) {
-						var w = shape.getAttribute('w');
-						var h = shape.getAttribute('h');
-
-						w = (w == null) ? 80 : parseInt(w, 10);
-						h = (h == null) ? 80 : parseInt(h, 10);
-
-						postStencilLoad(packageName, stencilName, name, w, h);
-					}
-				}
-			}
-
-			shape = shape.nextSibling;
-		}
-	};
-})();
-
-/**
- * Class for asynchronously opening a new window and loading a file at the same
- * time. This acts as a bridge between the open dialog and the new editor.
- */
-OpenFile = function(done) {
-	this.producer = null;
-	this.consumer = null;
-	this.done = done;
-};
-
-/**
- * Registers the editor from the new window.
- */
-OpenFile.prototype.setConsumer = function(value) {
-	this.consumer = value;
-	this.execute();
-};
-
-/**
- * Sets the data from the loaded file.
- */
-OpenFile.prototype.setData = function(value, filename) {
-	this.data = value;
-	this.filename = filename;
-	this.execute();
-};
-
-/**
- * Displays an error message.
- */
-OpenFile.prototype.error = function(msg) {
-	this.cancel();
-	mxUtils.alert(msg);
-};
-
-/**
- * Consumes the data.
- */
-OpenFile.prototype.execute = function() {
-	if (this.consumer != null && this.data != null) {
-		this.consumer(this.data, this.filename);
-		this.cancel();
-	}
-};
-
-/**
- * Cancels the operation.
- */
-OpenFile.prototype.cancel = function() {
-	if (this.done != null) {
-		this.done();
-	}
-};
\ No newline at end of file
diff --git a/public/assets/plugins/square/js/EditorUi.js b/public/assets/plugins/square/js/EditorUi.js
index cfdbef9..b671a9f 100644
--- a/public/assets/plugins/square/js/EditorUi.js
+++ b/public/assets/plugins/square/js/EditorUi.js
@@ -1,1623 +1 @@
-/**
- * $Id: EditorUi.js,v 1.21 2013/03/14 20:46:36 david Exp $
- * Copyright (c) 2006-2012, JGraph Ltd
- */
-/**
- * Constructs a new graph editor
- */
-
-EditorUi = function(editor, container) {
-	this.editor = editor || new Editor();
-	this.container = container || document.getElementById('geEditor');
-	var graph = editor.graph;
-	var self = this;
-
-	// Disables scrollbars
-	this.container.style.overflow = 'hidden';
-
-	// Pre-fetches submenu image
-	new Image().src = mxPopupMenu.prototype.submenuImage;
-
-	// Pre-fetches connect image
-	if (mxConnectionHandler.prototype.connectImage != null) {
-		new Image().src = mxConnectionHandler.prototype.connectImage.src;
-	}
-
-	// Creates the user interface
-	this.actions = new Actions(this);
-	this.menus = new Menus(this);
-	this.createDivs();
-	this.refresh();
-	this.createUi();
-
-	// Disables HTML and text selection
-	var textEditing = mxUtils.bind(this, function(evt) {
-		if (evt == null) {
-			evt = window.event;
-		}
-
-		if (this.isSelectionAllowed(evt)) {
-			return true;
-		}
-
-		return graph.isEditing();
-	});
-
-	// Disables text selection while not editing and no dialog visible
-	if (this.container == document.body) {
-		this.menubarContainer.onselectstart = textEditing;
-		this.menubarContainer.onmousedown = textEditing;
-		this.toolbarContainer.onselectstart = textEditing;
-		this.toolbarContainer.onmousedown = textEditing;
-		this.diagramContainer.onselectstart = textEditing;
-		this.diagramContainer.onmousedown = textEditing;
-		this.sidebarContainer.onselectstart = textEditing;
-		this.sidebarContainer.onmousedown = textEditing;
-		this.footerContainer.onselectstart = textEditing;
-		this.footerContainer.onmousedown = textEditing;
-	}
-
-	// And uses built-in context menu while editing
-	if (mxClient.IS_IE && (typeof(document.documentMode) === 'undefined' ||
-			document.documentMode < 9)) {
-		mxEvent.addListener(this.diagramContainer, 'contextmenu', textEditing);
-		mxEvent.addListener(this.sidebarContainer, 'contextmenu', textEditing);
-	} else {
-		// Allows browser context menu outside of diagram and sidebar
-		this.diagramContainer.oncontextmenu = textEditing;
-		this.sidebarContainer.oncontextmenu = textEditing;
-	}
-
-	// Contains the main graph instance inside the given panel
-	graph.init(this.diagramContainer);
-	graph.refresh();
-
-	// Enables scrollbars and sets cursor style for the container
-	graph.container.setAttribute('tabindex', '0');
-	// graph.container.style.overflow = (touchStyle) ? 'hidden' : 'auto';
-	graph.container.style.cursor = 'default';
-	graph.container.style.backgroundImage = 'url(' + editor.gridImage + ')';
-	graph.container.style.backgroundPosition = '-1px -1px';
-	graph.container.focus();
-
-	// Keeps graph container focused on mouse down
-	var graphFireMouseEvent = graph.fireMouseEvent;
-	graph.fireMouseEvent = function(evtName, me, sender) {
-		if (evtName == mxEvent.MOUSE_DOWN) {
-			this.container.focus();
-		}
-
-		graphFireMouseEvent.apply(this, arguments);
-	};
-
-	// Giuseppe Careri
-	// Defines invalid connections along with the error messages that they produce.
-	this.createMultiplicities(graph.multiplicities, ['start', 'finally', 'end'], [
-		[1, 1],
-		[1, 1],
-		[0, 0]
-	], [
-		[0, 0],
-		[0, 0],
-		[1, 'n']
-	]);
-	this.createMultiplicities(graph.multiplicities, ['answer', 'hangup', 'dial',
-		'ext_dial', 'queue', 'voicemail', 'callback'
-	], [
-		[1, 1],
-		[0, 0],
-		[0, 1],
-		[0, 1],
-		[0, 1],
-		[1, 1],
-		[0, 1]
-	], [
-		[1, 'n'],
-		[1, 'n'],
-		[1, 'n'],
-		[1, 'n'],
-		[1, 'n'],
-		[1, 'n'],
-		[1, 'n']
-	]);
-	this.createMultiplicities(graph.multiplicities, ['set', 'math'], [
-		[1, 1],
-		[1, 1]
-	], [
-		[1, 'n'],
-		[1, 'n']
-	]);
-	this.createMultiplicities(graph.multiplicities, ['background', 'playback',
-		'menu', 'saydigits', 'saynumber', 'sayphonetic', 'tts', 'ispeechtts',
-		'getdigits', 'getsecretdigits'
-	], [
-		[1, 'n'],
-		[1, 1],
-		[1, 'n'],
-		[1, 1],
-		[1, 1],
-		[1, 1],
-		[1, 1],
-		[1, 1],
-		[1, 'n'],
-		[1, 'n']
-	], [
-		[1, 'n'],
-		[1, 'n'],
-		[1, 'n'],
-		[1, 'n'],
-		[1, 'n'],
-		[1, 'n'],
-		[1, 'n'],
-		[1, 'n'],
-		[1, 'n'],
-		[1, 'n']
-	]);
-	this.createMultiplicities(graph.multiplicities, ['record'], [
-		[1, 1]
-	], [
-		[1, 'n']
-	]);
-	this.createMultiplicities(graph.multiplicities, ['database', 'ispeechasr', 'sendSMS', 'sendMail'], [
-		[1, 1],
-		[1, 1],
-		[1, 1],
-		[1, 1]
-	], [
-		[1, 'n'],
-		[1, 'n'],
-		[1, 'n'],
-		[1, 'n']
-	]);
-	this.createMultiplicities(graph.multiplicities, ['gotoc', 'gotoif',
-		'gotoiftime', 'gotoifmultitime', 'vswitch'
-	], [
-		[0, 0],
-		[1, 2],
-		[1, 2],
-		[1, 2],
-		[1, 'n']
-	], [
-		[1, 'n'],
-		[1, 'n'],
-		[1, 'n'],
-		[1, 'n'],
-		[1, 'n']
-	]);
-	this.createMultiplicities(graph.multiplicities, ['queuelog', 'goal'], [
-		[1, 1],
-		[1, 1]
-	], [
-		[1, 'n'],
-		[1, 'n']
-	]);
-	this.createMultiplicities(graph.multiplicities, ['noop', 'system', 'agi',
-		'subproject', 'custom_app'
-	], [
-		[1, 1],
-		[1, 1],
-		[0, 1],
-		[0, 1],
-		[0, 1]
-	], [
-		[1, 'n'],
-		[1, 'n'],
-		[1, 'n'],
-		[1, 'n'],
-		[1, 'n']
-	]);
-
-	// Giuseppe Careri
-	// Processes a doubleclick on an optional cell and fires a <dblclick> event.
-	// The event is fired initially.
-	// If the graph is enabled and the event has not been consumed, then <edit> is called with the given cell.
-	// The event is ignored if no cell was specified.
-	graph.dblClick = function(evt, cell) {
-		var edges = ['background', 'gotoif', 'gotoiftime', 'menu', 'getdigits', 'getsecretdigits',
-			'vswitch'
-		];
-		var mxe = new mxEventObject(mxEvent.DOUBLE_CLICK, 'event', evt, 'cell',
-			cell);
-		this.fireEvent(mxe);
-
-		if (this.isEnabled() && !mxEvent.isConsumed(evt) && !mxe.isConsumed()) {
-			// Override dblClick Vertices and Edges
-			if (this.getModel().isEdge(cell)) {
-				if (edges.indexOf(cell.source.value.tagName) >= 0)
-					this.startEditingAtCell(cell);
-			} else if (this.getModel().isVertex(cell)) {
-				self.showDialog(new GeneralDialog(self, cell).container, 320, 280, true,
-					true);
-			}
-			mxe.consume();
-		}
-	}
-
-	// Configures automatic expand on mouseover
-	graph.panningHandler.autoExpand = true;
-
-	// Installs context menu
-	graph.panningHandler.factoryMethod = mxUtils.bind(this, function(menu, cell,
-		evt) {
-		this.menus.createPopupMenu(menu, cell, evt);
-	});
-
-	// Initializes the outline
-	editor.outline.init(this.outlineContainer);
-
-	// Hides context menu
-	mxEvent.addGestureListeners(document, mxUtils.bind(this, function(evt) {
-		graph.panningHandler.hideMenu();
-	}));
-
-	// Adds gesture handling (pinch to zoom)
-	if (mxClient.IS_TOUCH) {
-		mxEvent.addListener(graph.container, 'gesturechange',
-			mxUtils.bind(this, function(evt) {
-				graph.view.getDrawPane().setAttribute('transform', 'scale(' + evt.scale +
-					')');
-				graph.view.getOverlayPane().style.visibility = 'hidden';
-			})
-		);
-
-		mxEvent.addListener(graph.container, 'gestureend',
-			mxUtils.bind(this, function(evt) {
-				graph.view.getDrawPane().removeAttribute('transform');
-				graph.zoomToCenter = true;
-				graph.zoom(evt.scale);
-				graph.view.getOverlayPane().style.visibility = 'visible';
-			})
-		);
-	}
-
-	// Create handler for key events
-	var keyHandler = this.createKeyHandler(editor);
-
-	// Getter for key handler
-	this.getKeyHandler = function() {
-		return keyHandler;
-	};
-
-	// Updates the editor UI after the window has been resized
-	mxEvent.addListener(window, 'resize', mxUtils.bind(this, function() {
-		this.refresh();
-		graph.sizeDidChange();
-		this.editor.outline.update(false);
-		this.editor.outline.outline.sizeDidChange();
-	}));
-
-	// Updates action and menu states
-	this.init();
-	this.open();
-};
-
-/**
- * Specifies the size of the split bar.
- */
-EditorUi.prototype.splitSize = (mxClient.IS_TOUCH) ? 16 : 8;
-
-/**
- * Specifies the height of the menubar. Default is 34.
- */
-EditorUi.prototype.menubarHeight = 33;
-
-/**
- * Specifies the height of the toolbar. Default is 36.
- */
-EditorUi.prototype.toolbarHeight = 36;
-
-/**
- * Specifies the height of the footer. Default is 28.
- */
-EditorUi.prototype.footerHeight = 28;
-
-/**
- * Specifies the position of the horizontal split bar. Default is 212.
- */
-EditorUi.prototype.hsplitPosition = 204;
-
-/**
- * Specifies the position of the vertical split bar. Default is 190.
- */
-EditorUi.prototype.vsplitPosition = 190;
-
-/**
- * Installs the listeners to update the action states.
- */
-EditorUi.prototype.init = function() {
-	// Updates action states
-	this.addUndoListener();
-	this.addSelectionListener();
-
-	// Overrides clipboard to update paste action state
-	var paste = this.actions.get('paste');
-
-	var updatePaste = function() {
-		paste.setEnabled(!mxClipboard.isEmpty());
-	};
-
-	var mxClipboardCut = mxClipboard.cut;
-	mxClipboard.cut = function() {
-		mxClipboardCut.apply(this, arguments);
-		updatePaste();
-	};
-
-	var mxClipboardCopy = mxClipboard.copy;
-	mxClipboard.copy = function() {
-		mxClipboardCopy.apply(this, arguments);
-		updatePaste();
-	};
-};
-
-/**
- * Hook for allowing selection and context menu for certain events.
- */
-EditorUi.prototype.isSelectionAllowed = function(evt) {
-	return false;
-};
-
-/**
- * Opens the current diagram via the window.opener if one exists.
- */
-EditorUi.prototype.open = function() {
-	// Cross-domain window access is not allowed in FF, so if we
-	// were opened from another domain then this will fail.
-	try {
-		if (window.opener != null && window.opener.openFile != null) {
-			window.opener.openFile.setConsumer(mxUtils.bind(this, function(xml,
-				filename) {
-				try {
-					var doc = mxUtils.parseXml(xml);
-					this.editor.setGraphXml(doc.documentElement);
-					this.editor.modified = false;
-					this.editor.undoManager.clear();
-
-					if (filename != null) {
-						this.editor.filename = filename;
-					}
-				} catch (e) {
-					mxUtils.alert(mxResources.get('invalidOrMissingFile') + ': ' + e.message);
-				}
-			}));
-		}
-	} catch (e) {
-		// ignore
-	}
-};
-
-/**
- * Giuseppe Careri
- * Opens the current diagram via string.
- */
-EditorUi.prototype.openString = function(xml, filename, data) {
-	try {
-		var doc = mxUtils.parseXml(xml);
-		this.editor.setGraphXml(doc.documentElement);
-		this.editor.modified = false;
-		this.editor.undoManager.clear();
-
-		if (filename != null) {
-			this.editor.filename = filename;
-		}
-
-		if (data != null) {
-			this.editor.data = data;
-		}
-	} catch (e) {
-		mxUtils.alert(mxResources.get('invalidOrMissingFile') + ': ' + e.message);
-	}
-};
-
-/**
- * Saves As the current graph under the given project name.
- */
-EditorUi.prototype.new = function(name) {
-	var editor = this.editor;
-
-	if (name != null) {
-		var xml = mxUtils.getPrettyXml(this.editor.getGraphXml());
-		try {
-			if (useLocalStorage) {
-				if (localStorage.getItem(name) != null &&
-					!mxUtils.confirm(mxResources.get('replace', [name]))) {
-					return;
-				}
-
-				localStorage.setItem(name, xml);
-				this.editor.setStatus(mxResources.get('saved') + ' ' + new Date());
-			} else {
-				console.log(xml.length);
-				console.log(MAX_REQUEST_SIZE);
-				if (xml.length < MAX_REQUEST_SIZE) {
-					xml = encodeURIComponent(xml);
-					name = encodeURIComponent(name);
-
-					var xhr = new XMLHttpRequest();
-					xhr.open("POST", SAVE_URL, true);
-					xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
-					xhr.setRequestHeader('Authorization', 'Bearer ' + editor.data.token);
-					xhr.onload = function(e) {
-						if (xhr.readyState === 4) {
-							if (xhr.status === 201) {
-								editor.setStatus('Project ' + JSON.parse(xhr.response).name +
-									' is opening in new window!');
-								setTimeout(function() {
-									window.open('square/projects/view/' + JSON.parse(xhr.response).id,
-										'_blank');
-								}, 1500);
-							} else {
-								try {
-									var response = JSON.parse(xhr.response);
-									editor.setStatus('Error creating project: ' + response.errors[0].message);
-								} catch (e) {
-									editor.setStatus('Error creating project' + ' (' + xhr.status + ' ' + xhr.statusText + ')');
-								}
-							}
-						}
-					};
-					xhr.onerror = function(e) {
-						mxUtils.alert(xhr.statusText);
-					};
-					xhr.send('description=project_new&name=' + name);
-				} else {
-					mxUtils.alert(mxResources.get('drawingTooLarge'));
-					mxUtils.popup(xml);
-
-					return;
-				}
-			}
-
-			this.editor.filename = name;
-			this.editor.modified = false;
-		} catch (e) {
-			this.editor.setStatus('Error creating project');
-		}
-	} else {
-		this.editor.setStatus('Error creating project');
-	}
-};
-
-
-/**
- * Saves the current graph under the given project name.
- */
-EditorUi.prototype.save = function(name) {
-	var editor = this.editor;
-
-	if (name != null) {
-		var xml = mxUtils.getPrettyXml(this.editor.getGraphXml());
-		try {
-			if (useLocalStorage) {
-				if (localStorage.getItem(name) != null &&
-					!mxUtils.confirm(mxResources.get('replace', [name]))) {
-					return;
-				}
-
-				localStorage.setItem(name, xml);
-				this.editor.setStatus(mxResources.get('saved') + ' ' + new Date());
-			} else {
-				console.log(xml.length);
-				console.log(MAX_REQUEST_SIZE);
-				if (xml.length < MAX_REQUEST_SIZE) {
-					xml = encodeURIComponent(xml);
-
-					var xhr = new XMLHttpRequest();
-					xhr.open("PUT", SAVE_URL + this.editor.data.id, true);
-					xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
-					xhr.setRequestHeader('Authorization', 'Bearer ' + editor.data.token);
-					xhr.onload = function(e) {
-						if (xhr.readyState === 4) {
-							if (xhr.status === 200) {
-								editor.setStatus('Updated at ' + JSON.parse(xhr.response).updatedAt +
-									' (' + xhr.status + ' ' + xhr.statusText + ')');
-							} else {
-								try {
-									var response = JSON.parse(xhr.response);
-									editor.setStatus('Error saving project: ' + response.errors[0].message);
-								} catch (e) {
-									editor.setStatus('Error saving project' + ' (' + xhr.status + ' ' + xhr.statusText + ')');
-								}
-							}
-						}
-					};
-					xhr.onerror = function(e) {
-						mxUtils.alert(xhr.statusText);
-					};
-					xhr.send('preproduction=' + xml);
-				} else {
-					mxUtils.alert(mxResources.get('drawingTooLarge'));
-					mxUtils.popup(xml);
-
-					return;
-				}
-			}
-
-			this.editor.filename = name;
-			this.editor.modified = false;
-		} catch (e) {
-			this.editor.setStatus('Error saving file');
-		}
-	} else {
-		this.editor.setStatus('Error saving file');
-	}
-};
-
-/**
- * Saves the current graph under the given project name.
- */
-EditorUi.prototype.description = function(description) {
-	var editor = this.editor;
-
-	if (description !== null) {
-		var xhr = new XMLHttpRequest();
-		xhr.open("PUT", SAVE_URL + this.editor.data.id, true);
-		xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
-		xhr.setRequestHeader('Authorization', 'Bearer ' + editor.data.token);
-
-		xhr.onload = function(e) {
-			if (xhr.readyState === 4) {
-				if (xhr.status === 200) {
-					editor.setStatus('Updated at ' + JSON.parse(xhr.response).updatedAt + ' (' + xhr.status + ' ' + xhr.statusText + ')');
-					editor.data.description = description;
-				} else {
-					try {
-						var response = JSON.parse(xhr.response);
-						editor.setStatus('Error updating description: ' + response.errors[0].message);
-					} catch (e) {
-						editor.setStatus('Error updating description' + ' (' + xhr.status + ' ' + xhr.statusText + ')');
-					}
-				}
-			}
-		};
-		xhr.onerror = function(e) {
-			mxUtils.alert(xhr.statusText);
-		};
-		xhr.send('description=' + description);
-	} else {
-		this.editor.setStatus('Error updating description');
-	}
-};
-
-/**
- * Saves As the current graph under the given project name.
- */
-EditorUi.prototype.saveAs = function(name) {
-	var editor = this.editor;
-
-	if (name != null) {
-		var xml = mxUtils.getPrettyXml(this.editor.getGraphXml());
-		try {
-			if (useLocalStorage) {
-				if (localStorage.getItem(name) != null &&
-					!mxUtils.confirm(mxResources.get('replace', [name]))) {
-					return;
-				}
-
-				localStorage.setItem(name, xml);
-				this.editor.setStatus(mxResources.get('saved') + ' ' + new Date());
-			} else {
-				console.log(xml.length);
-				console.log(MAX_REQUEST_SIZE);
-				if (xml.length < MAX_REQUEST_SIZE) {
-					xml = encodeURIComponent(xml);
-					name = encodeURIComponent(name);
-
-					var xhr = new XMLHttpRequest();
-					xhr.open("POST", SAVE_URL, true);
-					xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
-					xhr.setRequestHeader('Authorization', 'Bearer ' + editor.data.token);
-					xhr.onload = function(e) {
-						if (xhr.readyState === 4) {
-							if (xhr.status === 201) {
-								editor.setStatus('Project ' + JSON.parse(xhr.response).name +
-									' is opening in new window!');
-								setTimeout(function() {
-									window.open('square/projects/view/' + JSON.parse(xhr.response).id,
-										'_blank');
-								}, 1500);
-							} else {
-								try {
-									var response = JSON.parse(xhr.response);
-									editor.setStatus('Error cloning project: ' + response.errors[0].message);
-								} catch (e) {
-									editor.setStatus('Error cloning project' + ' (' + xhr.status + ' ' + xhr.statusText + ')');
-								}
-							}
-						}
-					};
-					xhr.onerror = function(e) {
-						mxUtils.alert(xhr.statusText);
-					};
-					xhr.send('description=project_cloned&name=' + name +
-						'&preproduction=' + xml + '&production=' + xml);
-				} else {
-					mxUtils.alert(mxResources.get('drawingTooLarge'));
-					mxUtils.popup(xml);
-
-					return;
-				}
-			}
-
-			this.editor.filename = name;
-			this.editor.modified = false;
-		} catch (e) {
-			this.editor.setStatus('Error saving file');
-		}
-	} else {
-		this.editor.setStatus('Error saving file');
-	}
-};
-
-/**
- * Plush the current graph under the given project name.
- */
-EditorUi.prototype.validate = function(a, b) {
-	var graph = this.editor.graph;
-	for (var a = a != null ? a : graph.model.getRoot(), b = b != null ? b : {}, c =
-			true, d = graph.model.getChildCount(a), e = 0; e < d; e++) {
-		var f = graph.model.getChildAt(a, e),
-			g = b;
-		graph.isValidRoot(f) && (g = {});
-		g = this.validate(f, g);
-		g != null ? graph.setCellWarning(f, g.replace(/\n/g, "<br>")) : graph.setCellWarning(
-			f, null);
-		c = c && g == null
-	}
-
-	d = "";
-
-	//--- Giuseppe Careri - Modify 12/12/2013 - [email-masked]
-	if (graph.model.isVertex(a)) {
-		switch (a.value.nodeName) {
-			case 'start':
-				d = this.validateBlock('start') ? '' : "Only one Start block is allowed" +
-					"\n";
-				break;
-			case 'finally':
-				d = this.validateBlock('finally') ? '' :
-					"Only one Finally block is allowed" + "\n";
-				break;
-			case 'playback':
-				d = (a.value.getAttribute('file_id') > 0) ? "" : mxResources.get(
-					'noAudioSelected') + "\n";
-				break;
-			case 'background':
-			case 'menu':
-				d = (a.value.getAttribute('file_id') > 0) ? "" : mxResources.get(
-					'noAudioSelected') + "\n";
-				d += (a.value.getAttribute('digit') > 0) ? "" : mxResources.get(
-					'wrongMaxDigit') + "\n";
-				break;
-			case 'getdigits':
-				d = (a.value.getAttribute('file_id') > 0) ? "" : mxResources.get(
-					'noAudioSelected') + "\n";
-				d += (a.value.getAttribute('variable_id') > 0) ? "" : mxResources.get(
-					'noVariableSelected') + "\n";
-				d += (a.value.getAttribute('mindigit') > 0) ? "" : mxResources.get(
-					'wrongMinDigit') + "\n";
-				d += (a.value.getAttribute('maxdigit') > 0) ? "" : mxResources.get(
-					'wrongMaxDigit') + "\n";
-			case 'getsecretdigits':
-				d = (a.value.getAttribute('file_id') > 0) ? "" : mxResources.get(
-					'noAudioSelected') + "\n";
-				d += (a.value.getAttribute('variable_id') > 0) ? "" : mxResources.get(
-					'noVariableSelected') + "\n";
-				d += (a.value.getAttribute('mindigit') > 0) ? "" : mxResources.get(
-					'wrongMinDigit') + "\n";
-				d += (a.value.getAttribute('maxdigit') > 0) ? "" : mxResources.get(
-					'wrongMaxDigit') + "\n";
-				d += (a.value.getAttribute('hiddendigitsnum') >= 0) ? "" : mxResources.get(
-					'wrongHiddenDigitsnum') + "\n";
-				break;
-			case 'vswitch':
-				d = (a.value.getAttribute('variable') !== "") ? "" : mxResources.get(
-					'noVariableSelected') + "\n";
-				break;
-			case 'database':
-				d = (a.value.getAttribute('odbc_id') > 0) ? "" : mxResources.get(
-					'noDatabaseSelected') + "\n";
-				break;
-			case 'ext_dial':
-				d = (a.value.getAttribute('trunk_name') !== '-1') ? "" : mxResources.get(
-					'noTrunkSelected') + "\n";
-				break;
-			case 'set':
-			case 'math':
-				d = (a.value.getAttribute('variable_id') > 0) ? "" : mxResources.get(
-					'noVariableSelected') + "\n";
-				break;
-			case 'gotoc':
-				d = (a.value.getAttribute('extension') !== "") ? "" : mxResources.get(
-					'noExtensionSelected') + "\n";
-				break;
-			case 'system':
-			case 'agi':
-				d = (a.value.getAttribute('command') !== "") ? "" : mxResources.get(
-					'noCommandSelected') + "\n";
-				break;
-			case 'gotoif':
-				d = (a.value.getAttribute('condition') !== "") ? "" : mxResources.get(
-					'noConditionSelected') + "\n";
-				break;
-			case 'saydigits':
-				d = (a.value.getAttribute('digits') !== "") ? "" : mxResources.get(
-					'noDigitsSelected') + "\n";
-				break;
-			case 'saynumber':
-				d = (a.value.getAttribute('number') !== "") ? "" : mxResources.get(
-					'noNumberSelected') + "\n";
-				break;
-			case 'sayphonetic':
-				d = (a.value.getAttribute('text') !== "") ? "" : mxResources.get(
-					'noTextSelected') + "\n";
-				break;
-			case 'record':
-				d = (a.value.getAttribute('file') !== "") ? "" : mxResources.get(
-					'noFileSelected') + "\n";
-				break;
-			case 'goal':
-				d = (a.value.getAttribute('goalname') !== "") ? "" : mxResources.get(
-					'noGoalSelected') + "\n";
-				break;
-			case 'ext_dial':
-				d = (a.value.getAttribute('phone') !== "") ? "" : mxResources.get(
-					'noIdentifierSelected') + "\n";
-				break;
-			case 'dial':
-				d = (a.value.getAttribute('sip_id') > 0) ? "" : mxResources.get(
-					'noIdentifierSelected') + "\n";
-				break;
-			case 'queue':
-				d = (a.value.getAttribute('queue_id') !== "-1") ? "" : mxResources.get(
-					'noQueueSelected') + "\n";
-				break;
-			case 'callback':
-				d = (a.value.getAttribute('list_id') > 0) ? "" : mxResources.get(
-					'noListSelected') + "\n";
-				break;
-			case 'gotoiftime':
-				d = (a.value.getAttribute('interval_id') > 0) ? "" : mxResources.get(
-					'noIntervalSelected') + "\n";
-				break;
-			case 'gotoifmultitime':
-				d = (a.value.getAttribute('interval_id') != "") ? "" : mxResources.get(
-					'noIntervalSelected') + "\n";
-				break;
-			case 'voicemail':
-				d = (a.value.getAttribute('mailbox') !== "") ? "" : mxResources.get(
-					'noBoxNumberSelected') + "\n";
-				break;
-			case 'subproject':
-				d = (a.value.getAttribute('project_id') > 0) ? "" : mxResources.get(
-					'noProjectSelected') + "\n";
-				break;
-			case 'sendSMS':
-				d = (a.value.getAttribute('account_id') > 0) ? "" : mxResources.get(
-					'noAccountSelected') + "\n";
-				d += (a.value.getAttribute('to') !== "") ? "" : mxResources.get(
-					'noRecipientSelected') + "\n";
-				d += (a.value.getAttribute('sms_text') !== "") ? "" : mxResources.get(
-					'noTextSelected') + "\n";
-				break;
-			case 'sendMail':
-				d = (a.value.getAttribute('account_id') > 0) ? "" : mxResources.get(
-					'noAccountSelected') + "\n";
-				d += (a.value.getAttribute('to') !== "") ? "" : mxResources.get(
-					'noRecipientSelected') + "\n";
-				break;
-			case 'tts':
-				d = (a.value.getAttribute('text') !== "") ? "" : mxResources.get(
-					'noTextSelected') + "\n";
-				break;
-			case 'ispeechtts':
-				d = (a.value.getAttribute('text') !== "") ? "" : mxResources.get(
-					'noTextSelected') + "\n";
-				d += (a.value.getAttribute('key') !== "") ? "" : mxResources.get(
-					'noKeySelected') + "\n";
-				break;
-			case 'ispeechasr':
-				d = (a.value.getAttribute('key') !== "") ? "" : mxResources.get(
-					'noKeySelected') + "\n";
-				break;
-		}
-	}
-
-	if (graph.model.isEdge(a)) {
-		var z = graph.model.getCell(a.source.getId());
-		switch (z.value.nodeName) {
-			case 'background':
-				var patt = /^[0-9]{1,45}$|^[i]{1}$|^[t]{1}|^[#]{1}|^[*]{1}$/;
-				d = d + ((patt.test(String(a.getValue()))) ? "" : mxResources.get(
-					'numberOrInvalidOrTimeout') + "\n");
-				break;
-			case 'menu':
-				var patt = /^[0-9]{1,45}$|^[-]{1}$|^[i]{1}$|^[t]{1}|^[#]{1}|^[*]{1}$/;
-				var str = String(a.getValue());
-				var res = str.split(",");
-				res.forEach(function(entry) {
-					d = d + ((patt.test(entry)) ? "" : mxResources.get('numberOrAll') +
-						"\n");
-				});
-				break;
-			case 'getsecretdigits':
-			case 'getdigits':
-				var patt = /^(x|i|-)$/;
-				var str = String(a.getValue());
-				d = d + ((patt.test(str)) ? "" : mxResources.get(
-					'numberOrInvalidOrDefault') + "\n");
-				break;
-			case 'gotoif':
-			case 'gotoiftime':
-			case 'gotoifmultitime':
-				var patt = /^(true){1}$|^(false){1}$/;
-				d = d + ((patt.test(String(a.getValue()))) ? "" : mxResources.get(
-					'trueOrFalse') + "\n");
-				break;
-
-		}
-	}
-	// -----------------------------------------------------------------
-
-
-	graph.isCellCollapsed(a) && !c && (d = d + ((mxResources.get(graph.containsValidationErrorsResource) ||
-		graph.containsValidationErrorsResource) + "\n"));
-	d = graph.model.isEdge(a) ?
-		d + (graph.getEdgeValidationError(a, graph.model.getTerminal(a, true), graph
-			.model.getTerminal(a, false)) || "") : d + (graph.getCellValidationError(a) ||
-			"");
-	e = graph.validateCell(a, b);
-	e != null && (d = d + e);
-	graph.model.getParent(a) == null && graph.view.validate();
-	return d.length > 0 || !c ? d : null
-};
-EditorUi.prototype.validateBlock = function(blockName) {
-	var graph = this.editor.graph;
-	var parent = graph.getDefaultParent();
-	var count = 0;
-	// var model = graph.getModel();
-	//We can also use model.getChildren(parent)
-	parent.children.forEach(function(n) {
-		if (graph.model.isVertex(n) && n.value.nodeName == blockName) {
-			count++;
-		}
-	});
-	return count > 1 ? false : true;
-}
-EditorUi.prototype.publish = function(name) {
-	var editor = this.editor;
-
-	if (name != null) {
-		var response = this.validate();
-		if (response === null) {
-
-			var xml = mxUtils.getPrettyXml(this.editor.getGraphXml());
-			try {
-				if (useLocalStorage) {
-					if (localStorage.getItem(name) != null &&
-						!mxUtils.confirm(mxResources.get('replace', [name]))) {
-						return;
-					}
-
-					localStorage.setItem(name, xml);
-					this.editor.setStatus(mxResources.get('saved') + ' ' + new Date());
-				} else {
-					console.log(xml.length);
-					console.log(MAX_REQUEST_SIZE);
-					if (xml.length < MAX_REQUEST_SIZE) {
-						xml = encodeURIComponent(xml);
-
-						var xhr = new XMLHttpRequest();
-						xhr.open("PUT", SAVE_URL + this.editor.data.id, true);
-						xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
-						xhr.setRequestHeader('Authorization', 'Bearer ' + editor.data.token);
-						xhr.onload = function(e) {
-							if (xhr.readyState === 4) {
-								if (xhr.status === 200) {
-									editor.setStatus('Published at ' + JSON.parse(xhr.response).updatedAt +
-										' (' + xhr.status + ' ' + xhr.statusText + ')');
-								} else {
-									try {
-										var response = JSON.parse(xhr.response);
-										editor.setStatus('Error publishing project: ' + response.errors[0].message);
-									} catch (e) {
-										editor.setStatus('Error publishing project' + ' (' + xhr.status + ' ' + xhr.statusText + ')');
-									}
-								}
-							}
-						};
-						xhr.onerror = function(e) {
-							mxUtils.alert(xhr.statusText);
-						};
-						xhr.send('preproduction=' + xml + '&production=' + xml);
-					} else {
-						mxUtils.alert(mxResources.get('drawingTooLarge'));
-						mxUtils.popup(xml);
-
-						return;
-					}
-				}
-
-				this.editor.filename = name;
-				this.editor.modified = false;
-			} catch (e) {
-				this.editor.setStatus('Error publishing file');
-			}
-		} else {
-			editor.setStatus('Error publishing project: ');
-		}
-	} else {
-		this.editor.setStatus('Error publishing file');
-	}
-};
-
-
-/**
- * Create variable
- */
-EditorUi.prototype.variable = function(name, description) {
-	var editor = this.editor;
-
-	if (name != null) {
-		try {
-
-			var xhr = new XMLHttpRequest();
-			xhr.open("POST", VARIABLE_URL, true);
-			xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
-			xhr.setRequestHeader('Authorization', 'Bearer ' + editor.data.token);
-			xhr.onload = function(e) {
-				if (xhr.readyState === 4) {
-					if (xhr.status === 201) {
-						editor.setStatus('Variable created at ' + JSON.parse(xhr.response).createdAt +
-							' (' + xhr.status + ' ' + xhr.statusText + ')');
-					} else {
-						try {
-							var response = JSON.parse(xhr.response);
-							editor.setStatus('Error creating variable: ' + response.errors[0].message);
-						} catch (e) {
-							editor.setStatus('Error creating variable' + ' (' + xhr.status + ' ' + xhr.statusText + ')');
-						}
-					}
-				}
-			};
-			xhr.onerror = function(e) {
-				mxUtils.alert(xhr.statusText);
-			};
-			xhr.send('name=' + name + '&description=' + description);
-		} catch (e) {
-			this.editor.setStatus('Error creating variable');
-		}
-	} else {
-		this.editor.setStatus('Error creating variable');
-	}
-};
-
-/**
- * Returns the URL for a copy of this editor with no state.
- */
-EditorUi.prototype.getUrl = function(pathname) {
-	var href = (pathname != null) ? pathname : window.location.pathname;
-	var parms = (href.indexOf('?') > 0) ? 1 : 0;
-
-	// Removes template URL parameter for new blank diagram
-	for (var key in urlParams) {
-		if (parms == 0) {
-			href += '?';
-		} else {
-			href += '&';
-		}
-
-		href += key + '=' + urlParams[key];
-		parms++;
-	}
-
-	return href;
-};
-
-/**
- * Updates the states of the given undo/redo items.
- */
-EditorUi.prototype.addUndoListener = function() {
-	var undo = this.actions.get('undo');
-	var redo = this.actions.get('redo');
-
-	var undoMgr = this.editor.undoManager;
-
-	var undoListener = function() {
-		undo.setEnabled(undoMgr.canUndo());
-		redo.setEnabled(undoMgr.canRedo());
-	};
-
-	undoMgr.addListener(mxEvent.ADD, undoListener);
-	undoMgr.addListener(mxEvent.UNDO, undoListener);
-	undoMgr.addListener(mxEvent.REDO, undoListener);
-	undoMgr.addListener(mxEvent.CLEAR, undoListener);
-
-	// Updates the button states once
-	undoListener();
-};
-
-/**
- * Updates the states of the given toolbar items based on the selection.
- */
-EditorUi.prototype.addSelectionListener = function() {
-	var selectionListener = mxUtils.bind(this, function() {
-		var graph = this.editor.graph;
-		var selected = !graph.isSelectionEmpty();
-		var vertexSelected = false;
-		var edgeSelected = false;
-
-		var cells = graph.getSelectionCells();
-
-		if (cells != null) {
-			for (var i = 0; i < cells.length; i++) {
-				var cell = cells[i];
-
-				if (graph.getModel().isEdge(cell)) {
-					edgeSelected = true;
-				}
-
-				if (graph.getModel().isVertex(cell)) {
-					vertexSelected = true;
-				}
-
-				if (edgeSelected && vertexSelected) {
-					break;
-				}
-			}
-		}
-
-		// Updates action states
-		var actions = ['cut', 'copy', 'delete', 'duplicate', 'bold', 'italic',
-			'style', 'underline', 'toFront', 'toBack', 'dashed', 'rounded',
-			'shadow',
-			'tilt', 'autosize'
-		];
-
-		for (var i = 0; i < actions.length; i++) {
-			this.actions.get(actions[i]).setEnabled(selected);
-		}
-
-		this.actions.get('curved').setEnabled(edgeSelected);
-		this.actions.get('rotation').setEnabled(vertexSelected);
-		this.actions.get('wordWrap').setEnabled(vertexSelected);
-		this.actions.get('group').setEnabled(graph.getSelectionCount() > 1);
-		this.actions.get('ungroup').setEnabled(graph.getSelectionCount() == 1 &&
-			graph.getModel().getChildCount(graph.getSelectionCell()) > 0);
-		var oneVertexSelected = vertexSelected && graph.getSelectionCount() == 1;
-		this.actions.get('removeFromGroup').setEnabled(oneVertexSelected &&
-			graph.getModel().isVertex(graph.getModel().getParent(graph.getSelectionCell()))
-		);
-
-		// Updates menu states
-		var menus = ['fontFamily', 'fontSize', 'alignment', 'position', 'text',
-			'format',
-			'arrange', 'linewidth', 'spacing'
-		];
-
-		for (var i = 0; i < menus.length; i++) {
-			this.menus.get(menus[i]).setEnabled(selected);
-		}
-
-		menus = ['line', 'lineend', 'linestart'];
-
-		for (var i = 0; i < menus.length; i++) {
-			this.menus.get(menus[i]).setEnabled(edgeSelected);
-		}
-
-		this.actions.get('setAsDefaultEdge').setEnabled(edgeSelected);
-
-		this.menus.get('align').setEnabled(graph.getSelectionCount() > 1);
-		this.menus.get('direction').setEnabled(vertexSelected || (edgeSelected &&
-			graph.isLoop(graph.view.getState(graph.getSelectionCell()))));
-		this.menus.get('navigation').setEnabled(graph.foldingEnabled && ((graph.view
-				.currentRoot != null) ||
-			(graph.getSelectionCount() == 1 && graph.isValidRoot(graph.getSelectionCell()))
-		));
-		this.actions.get('home').setEnabled(graph.view.currentRoot != null);
-		this.actions.get('exitGroup').setEnabled(graph.view.currentRoot != null);
-		var groupEnabled = graph.getSelectionCount() == 1 && graph.isValidRoot(
-			graph.getSelectionCell());
-		this.actions.get('enterGroup').setEnabled(groupEnabled);
-		this.actions.get('expand').setEnabled(groupEnabled);
-		this.actions.get('collapse').setEnabled(groupEnabled);
-		this.actions.get('editLink').setEnabled(graph.getSelectionCount() == 1);
-		this.actions.get('openLink').setEnabled(graph.getSelectionCount() == 1 &&
-			graph.getLinkForCell(graph.getSelectionCell()) != null);
-	});
-
-	this.editor.graph.getSelectionModel().addListener(mxEvent.CHANGE,
-		selectionListener);
-	selectionListener();
-};
-
-/**
- * Refreshes the viewport.
- */
-EditorUi.prototype.refresh = function() {
-	var quirks = mxClient.IS_IE && (document.documentMode == null || document.documentMode ==
-		5);
-	var w = this.container.clientWidth;
-	var h = this.container.clientHeight;
-
-	if (this.container == document.body) {
-		w = document.body.clientWidth || document.documentElement.clientWidth;
-		h = (quirks) ? document.body.clientHeight || document.documentElement.clientHeight :
-			document.documentElement.clientHeight;
-	}
-
-	var effHsplitPosition = Math.max(0, Math.min(this.hsplitPosition, w - this.splitSize -
-		20));
-	var effVsplitPosition = Math.max(0, Math.min(this.vsplitPosition, h - this.menubarHeight -
-		this.toolbarHeight - this.footerHeight - this.splitSize - 1));
-
-	this.menubarContainer.style.height = this.menubarHeight + 'px';
-	this.toolbarContainer.style.top = this.menubarHeight + 'px';
-	this.toolbarContainer.style.height = this.toolbarHeight + 'px';
-
-	var tmp = this.menubarHeight + this.toolbarHeight;
-
-	if (!mxClient.IS_QUIRKS) {
-		tmp += 1;
-	}
-
-	this.sidebarContainer.style.top = tmp + 'px';
-	this.sidebarContainer.style.width = effHsplitPosition + 'px';
-	this.outlineContainer.style.width = effHsplitPosition + 'px';
-	this.outlineContainer.style.height = effVsplitPosition + 'px';
-	this.outlineContainer.style.bottom = this.footerHeight + 'px';
-	this.diagramContainer.style.left = (effHsplitPosition + this.splitSize) +
-		'px';
-	this.diagramContainer.style.top = this.sidebarContainer.style.top;
-	this.footerContainer.style.height = this.footerHeight + 'px';
-	this.footerContainer.style.display = 'none';
-	this.hsplit.style.top = this.sidebarContainer.style.top;
-	this.hsplit.style.bottom = this.outlineContainer.style.bottom;
-	this.hsplit.style.left = effHsplitPosition + 'px';
-	this.vsplit.style.width = this.sidebarContainer.style.width;
-	this.vsplit.style.bottom = (effVsplitPosition + this.footerHeight) + 'px';
-
-	if (quirks) {
-		this.menubarContainer.style.width = w + 'px';
-		this.toolbarContainer.style.width = this.menubarContainer.style.width;
-		var sidebarHeight = (h - effVsplitPosition - this.splitSize - this.footerHeight -
-			this.menubarHeight - this.toolbarHeight);
-		this.sidebarContainer.style.height = sidebarHeight + 'px';
-		this.diagramContainer.style.width = (w - effHsplitPosition - this.splitSize) +
-			'px';
-		var diagramHeight = (h - this.footerHeight - this.menubarHeight - this.toolbarHeight);
-		this.diagramContainer.style.height = diagramHeight + 'px';
-		this.footerContainer.style.width = this.menubarContainer.style.width;
-		this.hsplit.style.height = diagramHeight + 'px';
-	} else {
-		this.sidebarContainer.style.bottom = (effVsplitPosition + this.splitSize +
-			this.footerHeight) + 'px';
-		this.diagramContainer.style.bottom = this.outlineContainer.style.bottom;
-	}
-};
-
-/**
- * Creates the required containers.
- */
-EditorUi.prototype.createDivs = function() {
-	this.menubarContainer = this.createDiv('geMenubarContainer');
-	this.toolbarContainer = this.createDiv('geToolbarContainer');
-	this.sidebarContainer = this.createDiv('geSidebarContainer');
-	this.outlineContainer = this.createDiv('geOutlineContainer');
-	this.diagramContainer = this.createDiv('geDiagramContainer');
-	this.footerContainer = this.createDiv('geFooterContainer');
-	this.hsplit = this.createDiv('geHsplit');
-	this.vsplit = this.createDiv('geVsplit');
-
-	// Sets static style for containers
-	this.menubarContainer.style.top = '0px';
-	this.menubarContainer.style.left = '0px';
-	this.menubarContainer.style.right = '0px';
-	this.toolbarContainer.style.left = '0px';
-	this.toolbarContainer.style.right = '0px';
-	this.sidebarContainer.style.left = '0px';
-	this.outlineContainer.style.left = '0px';
-	this.diagramContainer.style.right = '0px';
-	this.footerContainer.style.left = '0px';
-	this.footerContainer.style.right = '0px';
-	this.footerContainer.style.bottom = '0px';
-	this.vsplit.style.left = '0px';
-	this.vsplit.style.height = this.splitSize + 'px';
-	this.hsplit.style.width = this.splitSize + 'px';
-};
-
-/**
- * Creates the required containers.
- */
-EditorUi.prototype.createUi = function() {
-	// Creates menubar
-	this.menubar = this.menus.createMenubar(this.createDiv('geMenubar'));
-	this.menubarContainer.appendChild(this.menubar.container);
-
-	// Creates toolbar
-	this.toolbar = this.createToolbar(this.createDiv('geToolbar'));
-	this.toolbarContainer.appendChild(this.toolbar.container);
-
-	// Creates the sidebar
-	this.sidebar = this.createSidebar(this.sidebarContainer);
-
-	// Creates the footer
-	this.footerContainer.appendChild(this.createFooter());
-
-	// Adds status bar in menubar
-	this.statusContainer = this.createStatusContainer();
-
-	// Connects the status bar to the editor status
-	this.editor.addListener('statusChanged', mxUtils.bind(this, function() {
-		this.setStatusText(this.editor.getStatus());
-	}));
-
-	this.setStatusText(this.editor.getStatus());
-	this.menubar.container.appendChild(this.statusContainer);
-
-	// Inserts into DOM
-	this.container.appendChild(this.menubarContainer);
-	this.container.appendChild(this.toolbarContainer);
-	this.container.appendChild(this.sidebarContainer);
-	this.container.appendChild(this.outlineContainer);
-	this.container.appendChild(this.diagramContainer);
-	this.container.appendChild(this.footerContainer);
-	this.container.appendChild(this.hsplit);
-	this.container.appendChild(this.vsplit);
-
-	// HSplit
-	this.addSplitHandler(this.hsplit, true, 0, mxUtils.bind(this, function(
-		value) {
-		this.hsplitPosition = value;
-		this.refresh();
-		this.editor.graph.sizeDidChange();
-		this.editor.outline.update(false);
-		this.editor.outline.outline.sizeDidChange();
-	}));
-
-	// VSplit
-	this.addSplitHandler(this.vsplit, false, this.footerHeight, mxUtils.bind(
-		this,
-		function(value) {
-			this.vsplitPosition = value;
-			this.refresh();
-			this.editor.outline.update(false);
-			this.editor.outline.outline.sizeDidChange();
-		}));
-};
-
-/**
- * Creates a new toolbar for the given container.
- */
-EditorUi.prototype.createStatusContainer = function() {
-	var container = document.createElement('a');
-	container.className = 'geItem geStatus';
-
-	return container;
-};
-
-/**
- * Creates a new toolbar for the given container.
- */
-EditorUi.prototype.createStatusContainer = function() {
-	var container = document.createElement('a');
-	container.className = 'geItem geStatus';
-
-	return container;
-};
-
-/**
- * Creates a new toolbar for the given container.
- */
-EditorUi.prototype.setStatusText = function(value) {
-	this.statusContainer.innerHTML = value;
-};
-
-/**
- * Creates a new toolbar for the given container.
- */
-EditorUi.prototype.createToolbar = function(container) {
-	return new Toolbar(this, container);
-};
-
-/**
- * Creates a new sidebar for the given container.
- */
-EditorUi.prototype.createSidebar = function(container) {
-	return new Sidebar(this, container);
-};
-
-/**
- * Creates and returns a new footer.
- */
-EditorUi.prototype.createFooter = function() {
-	return this.createDiv('geFooter');
-};
-
-/**
- * Creates the actual toolbar for the toolbar container.
- */
-EditorUi.prototype.createDiv = function(classname) {
-	var elt = document.createElement('div');
-	elt.className = classname;
-
-	return elt;
-};
-
-/**
- * Creates the custom header.
- */
-EditorUi.prototype.createHeader = function(classname) {
-	var elt = document.createElement(classname);
-	return elt;
-};
-
-/**
- * Creates the custom header.
- */
-EditorUi.prototype.createForm = function(classname) {
-	var elt = document.createElement('form');
-	elt.className = classname;
-
-	return elt;
-};
-
-/**
- * Updates the states of the given undo/redo items.
- */
-EditorUi.prototype.addSplitHandler = function(elt, horizontal, dx, onChange) {
-	var start = null;
-	var initial = null;
-
-	function getValue() {
-		return parseInt(((horizontal) ? elt.style.left : elt.style.bottom));
-	};
-
-	function moveHandler(evt) {
-		if (start != null) {
-			var pt = new mxPoint(mxEvent.getClientX(evt), mxEvent.getClientY(evt));
-			onChange(Math.max(0, initial + ((horizontal) ? (pt.x - start.x) : (start.y -
-				pt.y)) - dx));
-			mxEvent.consume(evt);
-		}
-	};
-
-	function dropHandler(evt) {
-		moveHandler(evt);
-		start = null;
-		initial = null;
-	};
-
-	mxEvent.addGestureListeners(elt, function(evt) {
-		start = new mxPoint(mxEvent.getClientX(evt), mxEvent.getClientY(evt));
-		initial = getValue();
-		mxEvent.consume(evt);
-	});
-
-	mxEvent.addListener(document, 'mousemove', moveHandler);
-	mxEvent.addListener(document, 'touchmove', moveHandler);
-	mxEvent.addListener(document, 'mouseup', dropHandler);
-	mxEvent.addListener(document, 'touchend', dropHandler);
-};
-
-/**
- * Displays a print dialog.
- */
-EditorUi.prototype.showDialog = function(elt, w, h, modal, closable, onClose) {
-	this.hideDialog();
-	this.dialog = new Dialog(this, elt, w, (mxClient.IS_VML) ? h - 12 : h,
-		modal,
-		closable, onClose);
-};
-
-/**
- * Displays a print dialog.
- */
-EditorUi.prototype.hideDialog = function() {
-	if (this.dialog != null) {
-		this.dialog.close();
-		this.dialog = null;
-		this.editor.graph.container.focus();
-	}
-};
-
-/**
- * Adds the label menu items to the given menu and parent.
- */
-EditorUi.prototype.saveFile = function(forceDialog) {
-	if (!forceDialog && this.editor.filename != null) {
-		this.save(this.editor.getOrCreateFilename());
-	} else {
-		this.showDialog(new SaveDialog(this).container, 300, 100, true, true);
-	}
-};
-
-/**
- * Adds the label menu items to the given menu and parent.
- */
-EditorUi.prototype.publishFile = function(forceDialog) {
-	if (!forceDialog && this.editor.filename != null) {
-		this.publish(this.editor.getOrCreateFilename());
-	} else {
-		//this.showDialog(new SaveDialog(this).container, 300, 100, true, true);
-	}
-};
-
-/**
- * Executes the given layout.
- */
-EditorUi.prototype.executeLayout = function(layout, animate, ignoreChildCount) {
-	var graph = this.editor.graph;
-	var cell = graph.getSelectionCell();
-
-	// Allow global overridding of animation
-	animate = this.animate != null ? this.animate : animate;
-
-	graph.getModel().beginUpdate();
-	try {
-		layout.execute(graph.getDefaultParent(), cell);
-	} catch (e) {
-		throw e;
-	} finally {
-		// Animates the changes in the graph model except
-		// for Camino, where animation is too slow
-		if (animate && navigator.userAgent.indexOf('Camino') < 0) {
-			// New API for animating graph layout results asynchronously
-			var morph = new mxMorphing(graph);
-			morph.addListener(mxEvent.DONE, mxUtils.bind(this, function() {
-				graph.getModel().endUpdate();
-			}));
-
-			morph.startAnimation();
-		} else {
-			graph.getModel().endUpdate();
-		}
-	}
-};
-
-/**
- * Creates the keyboard event handler for the current graph and history.
- */
-EditorUi.prototype.createKeyHandler = function(editor) {
-	var graph = this.editor.graph;
-	var keyHandler = new mxKeyHandler(graph);
-
-	// Routes command-key to control-key on Mac
-	keyHandler.isControlDown = function(evt) {
-		return mxEvent.isControlDown(evt) || (mxClient.IS_MAC && evt.metaKey);
-	};
-
-	// Helper function to move cells with the cursor keys
-	function nudge(keyCode) {
-		if (!graph.isSelectionEmpty()) {
-			var dx = 0;
-			var dy = 0;
-
-			if (keyCode == 37) {
-				dx = -1;
-			} else if (keyCode == 38) {
-				dy = -1;
-			} else if (keyCode == 39) {
-				dx = 1;
-			} else if (keyCode == 40) {
-				dy = 1;
-			}
-
-			graph.moveCells(graph.getSelectionCells(), dx, dy);
-			graph.scrollCellToVisible(graph.getSelectionCell());
-		}
-	};
-
-	// Binds keystrokes to actions
-	var bindAction = mxUtils.bind(this, function(code, control, key, shift) {
-		var action = this.actions.get(key);
-
-		if (action != null) {
-			var f = function() {
-				if (action.enabled) {
-					action.funct();
-				}
-			};
-
-			if (control) {
-				if (shift) {
-					keyHandler.bindControlShiftKey(code, f);
-				} else {
-					keyHandler.bindControlKey(code, f);
-				}
-			} else {
-				if (shift) {
-					keyHandler.bindShiftKey(code, f);
-				} else {
-					keyHandler.bindKey(code, f);
-				}
-			}
-		}
-	});
-
-	var ui = this;
-	var keyHandleEscape = keyHandler.escape;
-	keyHandler.escape = function(evt) {
-		ui.hideDialog();
-		keyHandleEscape.apply(this, arguments);
-	};
-
-	// Ignores enter keystroke. Remove this line if you want the
-	// enter keystroke to stop editing.
-	keyHandler.enter = function() {};
-	keyHandler.bindKey(8, function() {
-		graph.foldCells(true);
-	}); // Backspace
-	keyHandler.bindKey(13, function() {
-		graph.foldCells(false);
-	}); // Enter
-	keyHandler.bindKey(33, function() {
-		graph.exitGroup();
-	}); // Page Up
-	keyHandler.bindKey(34, function() {
-		graph.enterGroup();
-	}); // Page Down
-	keyHandler.bindKey(36, function() {
-		graph.home();
-	}); // Home
-	keyHandler.bindKey(35, function() {
-		graph.refresh();
-	}); // End
-	keyHandler.bindKey(37, function() {
-		nudge(37);
-	}); // Left arrow
-	keyHandler.bindKey(38, function() {
-		nudge(38);
-	}); // Up arrow
-	keyHandler.bindKey(39, function() {
-		nudge(39);
-	}); // Right arrow
-	keyHandler.bindKey(40, function() {
-		nudge(40);
-	}); // Down arrow
-	keyHandler.bindKey(113, function() {
-		graph.startEditingAtCell();
-	});
-	bindAction(46, false, 'delete'); // Delete
-	bindAction(82, true, 'tilt'); // Ctrl+R
-	bindAction(83, true, 'save'); // Ctrl+S
-	bindAction(83, true, 'saveAs', true); // Ctrl+Shift+S
-	bindAction(107, false, 'zoomIn'); // Add
-	bindAction(109, false, 'zoomOut'); // Subtract
-	bindAction(65, true, 'selectAll'); // Ctrl+A
-	bindAction(86, true, 'selectVertices', true); // Ctrl+Shift+V
-	bindAction(69, true, 'selectEdges', true); // Ctrl+Shift+E
-	bindAction(69, true, 'export'); // Ctrl+Shift+E
-	bindAction(66, true, 'toBack'); // Ctrl+B
-	bindAction(70, true, 'toFront'); // Ctrl+F
-	bindAction(68, true, 'duplicate'); // Ctrl+D
-	bindAction(90, true, 'undo'); // Ctrl+Z
-	bindAction(89, true, 'redo'); // Ctrl+Y
-	bindAction(88, true, 'cut'); // Ctrl+X
-	bindAction(67, true, 'copy'); // Ctrl+C
-	bindAction(81, true, 'connect'); // Ctrl+Q
-	bindAction(86, true, 'paste'); // Ctrl+V
-	bindAction(71, true, 'group'); // Ctrl+G
-	bindAction(71, true, 'grid', true); // Ctrl+Shift+G
-	bindAction(85, true, 'ungroup'); // Ctrl+U
-	bindAction(112, false, 'about'); // F1
-	bindAction(80, true, 'publish', true); // Ctrl+Shift+P
-
-	return keyHandler;
-};
-
-/**
- * Giuseppe Careri
- * Creates a new toolbar for the given container.
- */
-EditorUi.prototype.createMultiplicities = function(graph, cells, source,
-	target) {
-	for (var i = 0; i < cells.length; i++) {
-
-		graph.push(new mxMultiplicity(true, cells[i], null, null, source[i][0],
-			source[i][1], null, mxResources.get(cells[i]) + mxResources.get(
-				'musthave') + source[i][0] + mxResources.get('outgoingedge'), null));
-		graph.push(new mxMultiplicity(false, cells[i], null, null, target[i][0],
-			target[i][1], null, mxResources.get(cells[i]) + mxResources.get(
-				'musthave') + target[i][0] + mxResources.get('incomingedge'), null));
-	};
-};
\ No newline at end of file
diff --git a/public/assets/plugins/square/js/Graph.js b/public/assets/plugins/square/js/Graph.js
index dda2a33..2fac1be 100644
--- a/public/assets/plugins/square/js/Graph.js
+++ b/public/assets/plugins/square/js/Graph.js
@@ -1,644 +1 @@
-/**
- * $Id: Graph.js,v 1.14 2013-02-16 10:19:54 gaudenz Exp $
- * Copyright (c) 2006-2012, JGraph Ltd
- */
-/**
- * Constructs a new graph instance. Note that the constructor does not take a
- * container because the graph instance is needed for creating the UI, which
- * in turn will create the container for the graph. Hence, the container is
- * assigned later in EditorUi.
- */
-Graph = function(container, model, renderHint, stylesheet) {
-	mxGraph.call(this, container, model, renderHint, stylesheet);
-
-	this.setConnectable(true);
-	this.setDropEnabled(false);
-	this.setPanning(true);
-	this.setTooltips(!mxClient.IS_TOUCH);
-	this.setAllowLoops(false);
-	this.setMultigraph(false);
-	this.allowAutoPanning = true;
-	this.resetEdgesOnConnect = false;
-	this.constrainChildren = false;
-
-	// Centers the port icon on the target port
-	this.connectionHandler.targetConnectImage = true;
-
-	// Does not allow dangling edges
-	this.setAllowDanglingEdges(false);
-
-	// Enables cloning of connection sources
-	this.connectionHandler.setCreateTarget(false);
-
-	// Disables built-in connection starts
-	this.connectionHandler.isValidSource = function() {
-		return mxConnectionHandler.prototype.isValidSource.apply(this, arguments) && urlParams['connect'] != '2';
-	};
-
-	// Sets the style to be used when an elbow edge is double clicked
-	this.alternateEdgeStyle = 'vertical';
-
-	if (stylesheet == null) {
-		this.loadStylesheet();
-	}
-
-	// Creates rubberband selection
-	var rubberband = new mxRubberband(this);
-
-	this.getRubberband = function() {
-		return rubberband;
-	};
-
-	// Shows hand cursor while panning
-	this.panningHandler.addListener(mxEvent.PAN_START, mxUtils.bind(this, function() {
-		this.container.style.cursor = 'pointer';
-	}));
-
-	this.panningHandler.addListener(mxEvent.PAN_END, mxUtils.bind(this, function() {
-		this.container.style.cursor = 'default';
-	}));
-
-	// Adds support for HTML labels via style. Note: Currently, only the Java
-	// backend supports HTML labels but CSS support is limited to the following:
-	// http://docs.oracle.com/javase/6/docs/api/index.html?javax/swing/text/html/CSS.html
-	this.isHtmlLabel = function(cell) {
-		var state = this.view.getState(cell);
-		var style = (state != null) ? state.style : this.getCellStyle(cell);
-
-		return style['html'] == '1' || style['whiteSpace'] == 'wrap';
-	};
-
-	// HTML entities are displayed as plain text in wrapped plain text labels
-	this.cellRenderer.getLabelValue = function(state) {
-		var result = mxCellRenderer.prototype.getLabelValue.apply(this, arguments);
-
-		if (state.style['whiteSpace'] == 'wrap' && state.style['html'] != 1) {
-			result = mxUtils.htmlEntities(result, false);
-		}
-
-		return result;
-	};
-
-	// Unlocks all cells
-	this.isCellLocked = function(cell) {
-		return false;
-	};
-
-	// Tap and hold brings up context menu.
-	// Tolerance slightly below graph tolerance is better.
-	this.connectionHandler.tapAndHoldTolerance = 16;
-
-	//  Tap and hold on background starts rubberband on cell starts connecting
-	var connectionHandlerTapAndHold = this.connectionHandler.tapAndHold;
-	this.connectionHandler.tapAndHold = function(me, state) {
-		if (state == null) {
-			if (!this.graph.panningHandler.active) {
-				rubberband.start(me.getGraphX(), me.getGraphY());
-				this.graph.panningHandler.panningTrigger = false;
-			}
-		} else if (tapAndHoldStartsConnection) {
-			connectionHandlerTapAndHold.apply(this, arguments);
-		} else if (this.graph.isCellSelected(state.cell) && this.graph.getSelectionCount() > 1) {
-			this.graph.removeSelectionCell(state.cell);
-		}
-	};
-
-	if (touchStyle) {
-		this.initTouch();
-	}
-};
-
-// Graph inherits from mxGraph
-mxUtils.extend(Graph, mxGraph);
-
-/**
- * Allows to all values in fit.
- */
-Graph.prototype.minFitScale = null;
-
-/**
- * Allows to all values in fit.
- */
-Graph.prototype.maxFitScale = null;
-
-/**
- * Loads the stylesheet for this graph.
- */
-Graph.prototype.loadStylesheet = function() {
-	var node = mxUtils.load(STYLE_PATH + '/default.xml').getDocumentElement();
-	var dec = new mxCodec(node.ownerDocument);
-	dec.decode(node, this.getStylesheet());
-};
-
-/**
- * Inverts the elbow edge style without removing existing styles.
- */
-Graph.prototype.flipEdge = function(edge) {
-	if (edge != null) {
-		var state = this.view.getState(edge);
-		var style = (state != null) ? state.style : this.getCellStyle(edge);
-
-		if (style != null) {
-			var elbow = mxUtils.getValue(style, mxConstants.STYLE_ELBOW,
-				mxConstants.ELBOW_HORIZONTAL);
-			var value = (elbow == mxConstants.ELBOW_HORIZONTAL) ?
-				mxConstants.ELBOW_VERTICAL : mxConstants.ELBOW_HORIZONTAL;
-			this.setCellStyles(mxConstants.STYLE_ELBOW, value, [edge]);
-		}
-	}
-};
-
-/**
- * Sets the default edge for future connections.
- */
-Graph.prototype.setDefaultEdge = function(cell) {
-	if (cell != null && this.getModel().isEdge(cell)) {
-		// Take a snapshot of the cell at the moment of calling
-		var proto = this.getModel().cloneCells([cell])[0];
-
-		// Delete existing points
-		if (proto.geometry != null) {
-			proto.geometry.points = null;
-		}
-
-		// Delete entry-/exitXY styles
-		var style = proto.getStyle();
-		style = mxUtils.setStyle(style, mxConstants.STYLE_ENTRY_X, null);
-		style = mxUtils.setStyle(style, mxConstants.STYLE_ENTRY_Y, null);
-		style = mxUtils.setStyle(style, mxConstants.STYLE_EXIT_X, null);
-		style = mxUtils.setStyle(style, mxConstants.STYLE_EXIT_Y, null);
-		proto.setStyle(style);
-
-		// Uses edge template for connect preview
-		this.connectionHandler.createEdgeState = function(me) {
-			return this.graph.view.createState(proto);
-		};
-
-		// Creates new connections from edge template
-		this.connectionHandler.factoryMethod = function() {
-			return this.graph.cloneCells([proto])[0];
-		};
-	}
-};
-
-/**
- * Disables folding for non-swimlanes.
- */
-Graph.prototype.isCellFoldable = function(cell) {
-	return this.foldingEnabled && this.isSwimlane(cell);
-};
-
-/**
- * Disables drill-down for non-swimlanes.
- */
-Graph.prototype.isValidRoot = function(cell) {
-	return this.isSwimlane(cell);
-};
-
-/**
- * Overrides createGroupCell to set the group style for new groups to 'group'.
- */
-Graph.prototype.createGroupCell = function() {
-	var group = mxGraph.prototype.createGroupCell.apply(this, arguments);
-	group.setStyle('group');
-
-	return group;
-};
-
-/**
- * Giuseppe Careri
- * Overrides tooltips to show position and size
- */
-Graph.prototype.getTooltipForCell = function(cell) {
-	var tip = '';
-
-	if (this.getModel().isVertex(cell)) {
-		// var geo = this.getCellGeometry(cell);
-
-		// var f2 = function(x)
-		// {
-		// 	return Math.round(parseFloat(x) * 100) / 100;
-		// };
-
-		// if (geo != null)
-		// {
-		// 	if (tip == null)
-		// 	{
-		// 		tip = '';
-		// 	}
-		// 	else if (tip.length > 0)
-		// 	{
-		// 		tip += '\n';
-		// 	}
-
-		// 	tip += 'X: ' + f2(geo.x) + '\nY: ' + f2(geo.y) + '\nW: ' + f2(geo.width) + '\nH: ' + f2(geo.height);
-		// }
-
-		tip += mxResources.get('description_' + cell.value.nodeName) || '';
-	} else if (this.getModel().isEdge(cell)) {
-		tip = mxGraph.prototype.getTooltipForCell.apply(this, arguments);
-	}
-
-	return tip;
-};
-
-/**
- * Giuseppe Careri
- * Returns the label for the given cell.
- */
-Graph.prototype.convertValueToString = function(cell) {
-	if (cell.value != null && typeof(cell.value) == 'object') {
-		return cell.value.getAttribute('label');
-	}
-
-	return mxGraph.prototype.convertValueToString.apply(this, arguments);
-};
-
-/**
- * Giuseppe Careri
- * Handles label changes for XML user objects.
- */
-Graph.prototype.cellLabelChanged = function(cell, value, autoSize) {
-	if (cell.value != null && typeof(cell.value) == 'object') {
-		var tmp = cell.value.cloneNode(true);
-		tmp.setAttribute('label', value);
-		value = tmp;
-	}
-
-	mxGraph.prototype.cellLabelChanged.apply(this, arguments);
-};
-
-/**
- * Sets the link for the given cell.
- */
-Graph.prototype.setLinkForCell = function(cell, link) {
-	var value = null;
-
-	if (cell.value != null && typeof(cell.value) == 'object') {
-		value = cell.value.cloneNode(true);
-	} else {
-		var doc = mxUtils.createXmlDocument();
-
-		value = doc.createElement('UserObject');
-		value.setAttribute('label', cell.value);
-	}
-
-	if (link != null && link.length > 0) {
-		value.setAttribute('link', link);
-	} else {
-		value.removeAttribute('link');
-	}
-
-	this.model.setValue(cell, value);
-};
-
-/**
- * Returns the link for the given cell.
- */
-Graph.prototype.getLinkForCell = function(cell) {
-	if (cell.value != null && typeof(cell.value) == 'object') {
-		return cell.value.getAttribute('link');
-	}
-
-	return null;
-};
-
-/**
- * Customized graph for touch devices.
- */
-Graph.prototype.initTouch = function() {
-	// Disables new connections via "hotspot"
-	this.connectionHandler.marker.isEnabled = function() {
-		return this.graph.connectionHandler.first != null;
-	};
-
-	// Hides menu when editing starts
-	this.addListener(mxEvent.START_EDITING, function(sender, evt) {
-		this.panningHandler.hideMenu();
-	});
-
-	// Context menu for touchstyle
-	var showMenu = false;
-	var menuCell = null;
-
-	// Checks if native hit detection did not return anything and does custom
-	// hit detection for edges to take into account the tolerance
-	this.updateMouseEvent = function(me) {
-		mxGraph.prototype.updateMouseEvent.apply(this, arguments);
-
-		if (me.getState() == null) {
-			var cell = this.getCellAt(me.graphX, me.graphY);
-
-			if (this.getModel().isEdge(cell)) {
-				me.state = this.view.getState(cell);
-
-				if (me.state != null && me.state.shape != null) {
-					this.container.style.cursor = me.state.shape.node.style.cursor;
-				}
-			}
-		}
-
-		if (me.getState() == null) {
-			this.container.style.cursor = 'default';
-		}
-	};
-
-	// Handles popup menu on touch devices (tap selected cell)
-	this.fireMouseEvent = function(evtName, me, sender) {
-		if (evtName == mxEvent.MOUSE_DOWN) {
-			if (!this.panningHandler.isMenuShowing()) {
-				menuCell = me.getCell();
-				showMenu = (menuCell != null) ? this.isCellSelected(menuCell) : this.isSelectionEmpty();
-			} else {
-				showMenu = false;
-				menuCell = null;
-			}
-		} else if (evtName == mxEvent.MOUSE_UP) {
-			if (showMenu && !this.isEditing()) {
-				if (!this.panningHandler.isMenuShowing()) {
-					var x = mxEvent.getClientX(me.getEvent());
-					var y = mxEvent.getClientY(me.getEvent());
-
-					this.panningHandler.popup(x + 16, y, menuCell, me.getEvent());
-				}
-
-				showMenu = false;
-				menuCell = null;
-				me.consume();
-
-				return;
-			}
-
-			showMenu = false;
-			menuCell = null;
-		}
-
-		mxGraph.prototype.fireMouseEvent.apply(this, arguments);
-
-		if (evtName == mxEvent.MOUSE_MOVE && me.isConsumed()) {
-			showMenu = false;
-			menuCell = null;
-		}
-	};
-};
-
-/**
- * Implements touch devices.
- */
-(function() {
-	// Enables rotation handle
-	mxVertexHandler.prototype.rotationEnabled = true;
-
-	// Matches label positions of mxGraph 1.x
-	mxText.prototype.baseSpacingTop = 5;
-	mxText.prototype.baseSpacingBottom = 1;
-
-	// Touch-specific static overrides
-	if (touchStyle) {
-		// Sets constants for touch style
-		mxConstants.HANDLE_SIZE = 16;
-		mxConstants.LABEL_HANDLE_SIZE = 7;
-
-		// Larger tolerance and grid for real touch devices
-		if (mxClient.IS_TOUCH) {
-			mxVertexHandler.prototype.tolerance = 4;
-			mxEdgeHandler.prototype.tolerance = 6;
-			Graph.prototype.tolerance = 14;
-			Graph.prototype.gridSize = 20;
-
-			// One finger pans (no rubberband selection) must start regardless of mouse button
-			mxPanningHandler.prototype.selectOnPopup = false;
-			mxPanningHandler.prototype.useLeftButtonForPanning = true;
-			mxPanningHandler.prototype.isPanningTrigger = function(me) {
-				var evt = me.getEvent();
-
-				return (this.useLeftButtonForPanning && (this.ignoreCell || me.getState() == null)
-					/* &&
-								 			mxEvent.isLeftMouseButton(evt)*/
-				) || (mxEvent.isControlDown(evt) &&
-					mxEvent.isShiftDown(evt)) || (this.usePopupTrigger &&
-					mxEvent.isPopupTrigger(evt));
-			};
-		}
-
-		// Don't clear selection if multiple cells selected
-		var graphHandlerMouseDown = mxGraphHandler.prototype.mouseDown;
-		mxGraphHandler.prototype.mouseDown = function(sender, me) {
-			graphHandlerMouseDown.apply(this, arguments);
-
-			if (this.graph.isCellSelected(me.getCell()) && this.graph.getSelectionCount() > 1) {
-				this.delayedSelection = false;
-			}
-		};
-
-		// Changes order of panninghandler
-		Graph.prototype.createHandlers = function(container) {
-			this.tooltipHandler = new mxTooltipHandler(this);
-			this.tooltipHandler.setEnabled(false);
-			// Selection cells first
-			this.selectionCellsHandler = new mxSelectionCellsHandler(this);
-			this.panningHandler = new mxPanningHandler(this);
-			this.panningHandler.panningEnabled = false;
-			this.connectionHandler = new mxConnectionHandler(this);
-			this.connectionHandler.setEnabled(false);
-			this.graphHandler = new mxGraphHandler(this);
-		};
-
-		// On connect the target is selected and we clone the cell of the preview edge for insert
-		mxConnectionHandler.prototype.selectCells = function(edge, target) {
-			if (touchStyle && target != null) {
-				this.graph.setSelectionCell(target);
-			} else {
-				this.graph.setSelectionCell(edge);
-			}
-		};
-
-		// Overrides double click handling to use the tolerance
-		// FIXME: Double click on edges in iPad needs focus on textarea
-		var graphDblClick = mxGraph.prototype.dblClick;
-		Graph.prototype.dblClick = function(evt, cell) {
-			if (cell == null) {
-				var pt = mxUtils.convertPoint(this.container,
-					mxEvent.getClientX(evt), mxEvent.getClientY(evt));
-				cell = this.getCellAt(pt.x, pt.y);
-			}
-
-			graphDblClick.call(this, evt, cell);
-		};
-
-		// Rounded edge and vertex handles
-		var touchHandle = new mxImage(IMAGE_PATH + '/touch-handle.png', 16, 16);
-		mxVertexHandler.prototype.handleImage = touchHandle;
-		mxEdgeHandler.prototype.handleImage = touchHandle;
-		mxOutline.prototype.sizerImage = touchHandle;
-
-		// Pre-fetches touch handle
-		new Image().src = touchHandle.src;
-
-		// Adds connect icon to selected vertices
-		var connectorSrc = IMAGE_PATH + '/touch-connector.png';
-
-		var vertexHandlerInit = mxVertexHandler.prototype.init;
-		mxVertexHandler.prototype.init = function() {
-			vertexHandlerInit.apply(this, arguments);
-
-			// Only show connector image on one cell and do not show on containers
-			if (showConnectorImg && this.graph.connectionHandler.isEnabled() &&
-				this.graph.isCellConnectable(this.state.cell) &&
-				!this.graph.isValidRoot(this.state.cell) &&
-				this.graph.getSelectionCount() == 1) {
-				this.connectorImg = mxUtils.createImage(connectorSrc);
-				this.connectorImg.style.cursor = 'pointer';
-				this.connectorImg.style.width = '29px';
-				this.connectorImg.style.height = '29px';
-				this.connectorImg.style.position = 'absolute';
-
-				if (!mxClient.IS_TOUCH) {
-					this.connectorImg.setAttribute('title', mxResources.get('connect'));
-					mxEvent.redirectMouseEvents(this.connectorImg, this.graph, this.state);
-				}
-
-				// Adds 2px tolerance
-				this.connectorImg.style.padding = '2px';
-
-				// Starts connecting on touch/mouse down
-				mxEvent.addGestureListeners(this.connectorImg,
-					mxUtils.bind(this, function(evt) {
-						this.graph.panningHandler.hideMenu();
-						var pt = mxUtils.convertPoint(this.graph.container,
-							mxEvent.getClientX(evt), mxEvent.getClientY(evt));
-						this.graph.connectionHandler.start(this.state, pt.x, pt.y);
-						this.graph.isMouseDown = true;
-						mxEvent.consume(evt);
-					})
-				);
-
-				this.graph.container.appendChild(this.connectorImg);
-			}
-
-			this.redrawTools();
-		};
-
-		var vertexHandlerRedraw = mxVertexHandler.prototype.redraw;
-		mxVertexHandler.prototype.redraw = function() {
-			vertexHandlerRedraw.apply(this);
-			this.redrawTools();
-		};
-
-		mxVertexHandler.prototype.redrawTools = function() {
-			if (this.state != null && this.connectorImg != null) {
-				// Top right for single-sizer
-				if (mxVertexHandler.prototype.singleSizer) {
-					this.connectorImg.style.left = (this.state.x + this.state.width - this.connectorImg.offsetWidth / 2) + 'px';
-					this.connectorImg.style.top = (this.state.y - this.connectorImg.offsetHeight / 2) + 'px';
-				} else {
-					this.connectorImg.style.left = (this.state.x + this.state.width + mxConstants.HANDLE_SIZE / 2 + 4 /* - 2 padding*/ ) + 'px';
-					this.connectorImg.style.top = (this.state.y + (this.state.height - this.connectorImg.offsetHeight) / 2) + 'px';
-				}
-			}
-		};
-
-		var vertexHandlerDestroy = mxVertexHandler.prototype.destroy;
-		mxVertexHandler.prototype.destroy = function(sender, me) {
-			vertexHandlerDestroy.apply(this, arguments);
-
-			if (this.connectorImg != null) {
-				this.connectorImg.parentNode.removeChild(this.connectorImg);
-				this.connectorImg = null;
-			}
-		};
-
-		// Pre-fetches touch connector
-		new Image().src = connectorSrc;
-	} else {
-		var img = new mxImage(IMAGE_PATH + '/connector.png', 15, 15);
-		mxConnectionHandler.prototype.connectImage = img;
-
-		// Pre-fetches img
-		new Image().src = img.src;
-
-		if (urlParams['connect'] == '2') // not touchStyle
-		{
-			var img = new mxImage(IMAGE_PATH + '/connector.png', 15, 15);
-
-			var vertexHandlerInit = mxVertexHandler.prototype.init;
-			mxVertexHandler.prototype.init = function() {
-				vertexHandlerInit.apply(this, arguments);
-
-				// Only show connector image on one cell and do not show on containers
-				if (showConnectorImg && this.graph.connectionHandler.isEnabled() &&
-					this.graph.isCellConnectable(this.state.cell) &&
-					!this.graph.isValidRoot(this.state.cell) &&
-					this.graph.getSelectionCount() == 1) {
-					// Workaround for event redirection via image tag in quirks and IE8
-					if (mxClient.IS_IE && !mxClient.IS_SVG) {
-						this.connectorImg = document.createElement('div');
-						this.connectorImg.style.backgroundImage = 'url(' + img.src + ')';
-						this.connectorImg.style.backgroundPosition = 'center';
-						this.connectorImg.style.backgroundRepeat = 'no-repeat';
-						this.connectorImg.style.width = (img.width + 4) + 'px';
-						this.connectorImg.style.height = (img.height + 4) + 'px';
-						this.connectorImg.style.display = (mxClient.IS_QUIRKS) ? 'inline' : 'inline-block';
-					} else {
-						this.connectorImg = mxUtils.createImage(img.src);
-						this.connectorImg.style.width = img.width + 'px';
-						this.connectorImg.style.height = img.height + 'px';
-					}
-
-					this.connectorImg.style.cursor = 'pointer';
-					this.connectorImg.style.position = 'absolute';
-					this.connectorImg.setAttribute('title', mxResources.get('connect'));
-					mxEvent.redirectMouseEvents(this.connectorImg, this.graph, this.state);
-
-					// Adds 2px tolerance
-					this.connectorImg.style.padding = '2px';
-
-					// Starts connecting on touch/mouse down
-					mxEvent.addListener(this.connectorImg, 'mousedown',
-						mxUtils.bind(this, function(evt) {
-							this.graph.panningHandler.hideMenu();
-							var pt = mxUtils.convertPoint(this.graph.container,
-								mxEvent.getClientX(evt), mxEvent.getClientY(evt));
-							this.graph.connectionHandler.start(this.state, pt.x, pt.y);
-							this.graph.isMouseDown = true;
-							mxEvent.consume(evt);
-						})
-					);
-
-					this.graph.container.appendChild(this.connectorImg);
-				}
-
-				this.redrawTools();
-			};
-
-			var vertexHandlerRedraw = mxVertexHandler.prototype.redraw;
-			mxVertexHandler.prototype.redraw = function() {
-				vertexHandlerRedraw.apply(this);
-				this.redrawTools();
-			};
-
-			mxVertexHandler.prototype.redrawTools = function() {
-				if (this.state != null && this.connectorImg != null) {
-					// Top right for single-sizer
-					if (mxVertexHandler.prototype.singleSizer) {
-						this.connectorImg.style.left = (this.state.x + this.state.width - this.connectorImg.offsetWidth / 2) + 'px';
-						this.connectorImg.style.top = (this.state.y - this.connectorImg.offsetHeight / 2) + 'px';
-					} else {
-						this.connectorImg.style.left = (this.state.x + this.state.width + mxConstants.HANDLE_SIZE / 2 + 2 /* - 2 padding*/ ) + 'px';
-						this.connectorImg.style.top = (this.state.y + (this.state.height - this.connectorImg.offsetHeight) / 2) + 'px';
-					}
-				}
-			};
-
-			var vertexHandlerDestroy = mxVertexHandler.prototype.destroy;
-			mxVertexHandler.prototype.destroy = function(sender, me) {
-				vertexHandlerDestroy.apply(this, arguments);
-
-				if (this.connectorImg != null) {
-					this.connectorImg.parentNode.removeChild(this.connectorImg);
-					this.connectorImg = null;
-				}
-			};
-		}
-	}
-})();
\ No newline at end of file
diff --git a/public/assets/plugins/square/js/Menus.js b/public/assets/plugins/square/js/Menus.js
index f6563c8..cb2c495 100644
--- a/public/assets/plugins/square/js/Menus.js
+++ b/public/assets/plugins/square/js/Menus.js
@@ -1,716 +1 @@
-/**
- * $Id: Menus.js,v 1.13 2013-02-20 16:21:29 gaudenz Exp $
- * Copyright (c) 2006-2012, JGraph Ltd
- */
-/**
- * Constructs a new graph editor
- */
-Menus = function(editorUi) {
-	this.editorUi = editorUi;
-	this.menus = new Object();
-	this.init();
-
-	// Pre-fetches checkmark image
-	new Image().src = IMAGE_PATH + '/checkmark.gif';
-};
-
-/**
- * Adds the label menu items to the given menu and parent.
- */
-Menus.prototype.init = function() {
-	var graph = this.editorUi.editor.graph;
-
-	this.put('fontFamily', new Menu(mxUtils.bind(this, function(menu, parent) {
-		var fonts = ['Helvetica', 'Verdana', 'Times New Roman', 'Garamond',
-			'Comic Sans MS',
-			'Courier New', 'Georgia', 'Lucida Console', 'Tahoma'
-		];
-
-		for (var i = 0; i < fonts.length; i++) {
-			var tr = this.styleChange(menu, fonts[i], [mxConstants.STYLE_FONTFAMILY], [
-				fonts[i]
-			], null, parent);
-			tr.firstChild.nextSibling.style.fontFamily = fonts[i];
-		}
-
-		menu.addSeparator(parent);
-		this.promptChange(menu, mxResources.get('custom'), '', mxConstants.DEFAULT_FONTFAMILY,
-			mxConstants.STYLE_FONTFAMILY, parent);
-	})));
-	this.put('fontSize', new Menu(mxUtils.bind(this, function(menu, parent) {
-		var sizes = [6, 8, 9, 10, 11, 12, 14, 18, 24, 36, 48, 72];
-
-		for (var i = 0; i < sizes.length; i++) {
-			this.styleChange(menu, sizes[i], [mxConstants.STYLE_FONTSIZE], [sizes[i]],
-				null, parent);
-		}
-
-		menu.addSeparator(parent);
-		this.promptChange(menu, mxResources.get('custom'), '(pt)', '12',
-			mxConstants.STYLE_FONTSIZE, parent);
-	})));
-	this.put('linewidth', new Menu(mxUtils.bind(this, function(menu, parent) {
-		var sizes = [1, 2, 3, 4, 8, 12, 16, 24];
-
-		for (var i = 0; i < sizes.length; i++) {
-			this.styleChange(menu, sizes[i] + 'px', [mxConstants.STYLE_STROKEWIDTH], [
-				sizes[i]
-			], null, parent);
-		}
-
-		menu.addSeparator(parent);
-		this.promptChange(menu, mxResources.get('custom'), '(px)', '1',
-			mxConstants.STYLE_STROKEWIDTH, parent);
-	})));
-	this.put('line', new Menu(mxUtils.bind(this, function(menu, parent) {
-		this.styleChange(menu, mxResources.get('straight'), [mxConstants.STYLE_EDGE], [
-			null
-		], null, parent);
-		this.styleChange(menu, mxResources.get('entityRelation'), [mxConstants.STYLE_EDGE], [
-			'entityRelationEdgeStyle'
-		], null, parent);
-		menu.addSeparator(parent);
-		this.styleChange(menu, mxResources.get('horizontal'), [mxConstants.STYLE_EDGE,
-			mxConstants.STYLE_ELBOW
-		], ['elbowEdgeStyle', 'horizontal'], null, parent);
-		this.styleChange(menu, mxResources.get('vertical'), [mxConstants.STYLE_EDGE,
-			mxConstants.STYLE_ELBOW
-		], ['elbowEdgeStyle', 'vertical'], null, parent);
-		menu.addSeparator(parent);
-		this.styleChange(menu, mxResources.get('manual'), [mxConstants.STYLE_EDGE], [
-			'segmentEdgeStyle'
-		], null, parent);
-		this.styleChange(menu, mxResources.get('automatic'), [mxConstants.STYLE_EDGE], [
-			'orthogonalEdgeStyle'
-		], null, parent);
-	})));
-	this.put('lineend', new Menu(mxUtils.bind(this, function(menu, parent) {
-		this.styleChange(menu, mxResources.get('classic'), [mxConstants.STYLE_ENDARROW], [
-			mxConstants.ARROW_CLASSIC
-		], null, parent);
-		this.styleChange(menu, mxResources.get('openArrow'), [mxConstants.STYLE_ENDARROW], [
-			mxConstants.ARROW_OPEN
-		], null, parent);
-		this.styleChange(menu, mxResources.get('block'), [mxConstants.STYLE_ENDARROW], [
-			mxConstants.ARROW_BLOCK
-		], null, parent);
-		menu.addSeparator(parent);
-		this.styleChange(menu, mxResources.get('oval'), [mxConstants.STYLE_ENDARROW], [
-			mxConstants.ARROW_OVAL
-		], null, parent);
-		this.styleChange(menu, mxResources.get('diamond'), [mxConstants.STYLE_ENDARROW], [
-			mxConstants.ARROW_DIAMOND
-		], null, parent);
-		this.styleChange(menu, mxResources.get('diamondThin'), [mxConstants.STYLE_ENDARROW], [
-			mxConstants.ARROW_DIAMOND_THIN
-		], null, parent);
-		menu.addSeparator(parent);
-		this.styleChange(menu, mxResources.get('none'), [mxConstants.STYLE_ENDARROW], [
-			mxConstants.NONE
-		], null, parent);
-		menu.addSeparator(parent);
-		menu.addItem(mxResources.get('transparent'), null, function() {
-			graph.toggleCellStyles('endFill', true);
-		}, parent, null, true);
-		menu.addSeparator(parent);
-		this.promptChange(menu, mxResources.get('size'), '(px)', mxConstants.DEFAULT_MARKERSIZE,
-			mxConstants.STYLE_ENDSIZE, parent);
-	})));
-	this.put('linestart', new Menu(mxUtils.bind(this, function(menu, parent) {
-		this.styleChange(menu, mxResources.get('classic'), [mxConstants.STYLE_STARTARROW], [
-			mxConstants.ARROW_CLASSIC
-		], null, parent);
-		this.styleChange(menu, mxResources.get('openArrow'), [mxConstants.STYLE_STARTARROW], [
-			mxConstants.ARROW_OPEN
-		], null, parent);
-		this.styleChange(menu, mxResources.get('block'), [mxConstants.STYLE_STARTARROW], [
-			mxConstants.ARROW_BLOCK
-		], null, parent);
-		menu.addSeparator(parent);
-		this.styleChange(menu, mxResources.get('oval'), [mxConstants.STYLE_STARTARROW], [
-			mxConstants.ARROW_OVAL
-		], null, parent);
-		this.styleChange(menu, mxResources.get('diamond'), [mxConstants.STYLE_STARTARROW], [
-			mxConstants.ARROW_DIAMOND
-		], null, parent);
-		this.styleChange(menu, mxResources.get('diamondThin'), [mxConstants.STYLE_STARTARROW], [
-			mxConstants.ARROW_DIAMOND_THIN
-		], null, parent);
-		menu.addSeparator(parent);
-		this.styleChange(menu, mxResources.get('none'), [mxConstants.STYLE_STARTARROW], [
-			mxConstants.NONE
-		], null, parent);
-		menu.addSeparator(parent);
-		menu.addItem(mxResources.get('transparent'), null, function() {
-			graph.toggleCellStyles('startFill', true);
-		}, parent, null, true);
-		menu.addSeparator(parent);
-		this.promptChange(menu, mxResources.get('size'), '(px)', mxConstants.DEFAULT_MARKERSIZE,
-			mxConstants.STYLE_STARTSIZE, parent);
-	})));
-	this.put('spacing', new Menu(mxUtils.bind(this, function(menu, parent) {
-		// Uses shadow action and line menu to analyze selection
-		var vertexSelected = this.editorUi.actions.get('shadow').enabled;
-		var edgeSelected = this.get('line').enabled;
-
-		if (vertexSelected || menu.showDisabled) {
-			this.promptChange(menu, mxResources.get('top'), '(px)', '0',
-				mxConstants.STYLE_SPACING_TOP, parent, vertexSelected);
-			this.promptChange(menu, mxResources.get('right'), '(px)', '0',
-				mxConstants.STYLE_SPACING_RIGHT, parent, vertexSelected);
-			this.promptChange(menu, mxResources.get('bottom'), '(px)', '0',
-				mxConstants.STYLE_SPACING_BOTTOM, parent, vertexSelected);
-			this.promptChange(menu, mxResources.get('left'), '(px)', '0',
-				mxConstants.STYLE_SPACING_LEFT, parent, vertexSelected);
-			menu.addSeparator(parent);
-			this.promptChange(menu, mxResources.get('global'), '(px)', '0',
-				mxConstants.STYLE_SPACING, parent, vertexSelected);
-			this.promptChange(menu, mxResources.get('perimeter'), '(px)', '0',
-				mxConstants.STYLE_PERIMETER_SPACING, parent, vertexSelected);
-		}
-
-		if (edgeSelected || menu.showDisabled) {
-			menu.addSeparator(parent);
-			this.promptChange(menu, mxResources.get('sourceSpacing'), '(px)', '0',
-				mxConstants.STYLE_SOURCE_PERIMETER_SPACING, parent, edgeSelected);
-			this.promptChange(menu, mxResources.get('targetSpacing'), '(px)', '0',
-				mxConstants.STYLE_TARGET_PERIMETER_SPACING, parent, edgeSelected);
-		}
-	})));
-	this.put('format', new Menu(mxUtils.bind(this, function(menu, parent) {
-		this.addMenuItem(menu, 'style', parent);
-	})));
-	this.put('text', new Menu(mxUtils.bind(this, function(menu, parent) {
-		var enabled = this.get('text').enabled;
-		menu.addSeparator(parent);
-		this.addSubmenu('fontFamily', menu, parent);
-		this.addSubmenu('fontSize', menu, parent);
-		this.addMenuItems(menu, ['-', 'bold', 'italic', 'underline', '-'],
-			parent);
-		this.addSubmenu('alignment', menu, parent);
-		this.addMenuItem(menu, 'wordWrap', parent);
-		menu.addSeparator(parent);
-		this.promptChange(menu, mxResources.get('textOpacity'), '(%)', '100',
-			mxConstants.STYLE_TEXT_OPACITY, parent, enabled);
-		menu.addItem(mxResources.get('hide'), null, function() {
-			graph.toggleCellStyles(mxConstants.STYLE_NOLABEL, false);
-		}, parent, null, enabled);
-	})));
-	this.put('alignment', new Menu(mxUtils.bind(this, function(menu, parent) {
-		this.styleChange(menu, mxResources.get('leftAlign'), [mxConstants.STYLE_ALIGN], [
-			mxConstants.ALIGN_LEFT
-		], null, parent);
-		this.styleChange(menu, mxResources.get('center'), [mxConstants.STYLE_ALIGN], [
-			mxConstants.ALIGN_CENTER
-		], null, parent);
-		this.styleChange(menu, mxResources.get('rightAlign'), [mxConstants.STYLE_ALIGN], [
-			mxConstants.ALIGN_RIGHT
-		], null, parent);
-		menu.addSeparator(parent);
-		this.styleChange(menu, mxResources.get('topAlign'), [mxConstants.STYLE_VERTICAL_ALIGN], [
-			mxConstants.ALIGN_TOP
-		], null, parent);
-		this.styleChange(menu, mxResources.get('middle'), [mxConstants.STYLE_VERTICAL_ALIGN], [
-			mxConstants.ALIGN_MIDDLE
-		], null, parent);
-		this.styleChange(menu, mxResources.get('bottomAlign'), [mxConstants.STYLE_VERTICAL_ALIGN], [
-			mxConstants.ALIGN_BOTTOM
-		], null, parent);
-		menu.addSeparator(parent);
-		this.addSubmenu('position', menu, parent);
-		this.addSubmenu('spacing', menu, parent);
-		menu.addSeparator(parent);
-		var enabled = this.get('text').enabled;
-		menu.addItem(mxResources.get('vertical'), null, function() {
-			graph.toggleCellStyles(mxConstants.STYLE_HORIZONTAL, true);
-		}, parent, null, enabled);
-	})));
-	this.put('position', new Menu(mxUtils.bind(this, function(menu, parent) {
-		this.styleChange(menu, mxResources.get('left'), [mxConstants.STYLE_LABEL_POSITION,
-			mxConstants.STYLE_ALIGN
-		], [mxConstants.ALIGN_LEFT, mxConstants.ALIGN_RIGHT], null, parent);
-		this.styleChange(menu, mxResources.get('center'), [mxConstants.STYLE_LABEL_POSITION,
-			mxConstants.STYLE_ALIGN
-		], [mxConstants.ALIGN_CENTER, mxConstants.ALIGN_CENTER], null, parent);
-		this.styleChange(menu, mxResources.get('right'), [mxConstants.STYLE_LABEL_POSITION,
-			mxConstants.STYLE_ALIGN
-		], [mxConstants.ALIGN_RIGHT, mxConstants.ALIGN_LEFT], null, parent);
-		menu.addSeparator(parent);
-		this.styleChange(menu, mxResources.get('top'), [mxConstants.STYLE_VERTICAL_LABEL_POSITION,
-			mxConstants.STYLE_VERTICAL_ALIGN
-		], [mxConstants.ALIGN_TOP, mxConstants.ALIGN_BOTTOM], null, parent);
-		this.styleChange(menu, mxResources.get('middle'), [mxConstants.STYLE_VERTICAL_LABEL_POSITION,
-			mxConstants.STYLE_VERTICAL_ALIGN
-		], [mxConstants.ALIGN_MIDDLE, mxConstants.ALIGN_MIDDLE], null, parent);
-		this.styleChange(menu, mxResources.get('bottom'), [mxConstants.STYLE_VERTICAL_LABEL_POSITION,
-			mxConstants.STYLE_VERTICAL_ALIGN
-		], [mxConstants.ALIGN_BOTTOM, mxConstants.ALIGN_TOP], null, parent);
-	})));
-	this.put('direction', new Menu(mxUtils.bind(this, function(menu, parent) {
-		menu.addItem(mxResources.get('flipH'), null, function() {
-			graph.toggleCellStyles(mxConstants.STYLE_FLIPH, false);
-		}, parent);
-		menu.addItem(mxResources.get('flipV'), null, function() {
-			graph.toggleCellStyles(mxConstants.STYLE_FLIPV, false);
-		}, parent);
-		this.addMenuItems(menu, ['-', 'tilt', 'rotation'], parent);
-	})));
-	this.put('align', new Menu(mxUtils.bind(this, function(menu, parent) {
-		menu.addItem(mxResources.get('leftAlign'), null, function() {
-			graph.alignCells(mxConstants.ALIGN_LEFT);
-		}, parent);
-		menu.addItem(mxResources.get('center'), null, function() {
-			graph.alignCells(mxConstants.ALIGN_CENTER);
-		}, parent);
-		menu.addItem(mxResources.get('rightAlign'), null, function() {
-			graph.alignCells(mxConstants.ALIGN_RIGHT);
-		}, parent);
-		menu.addSeparator(parent);
-		menu.addItem(mxResources.get('topAlign'), null, function() {
-			graph.alignCells(mxConstants.ALIGN_TOP);
-		}, parent);
-		menu.addItem(mxResources.get('middle'), null, function() {
-			graph.alignCells(mxConstants.ALIGN_MIDDLE);
-		}, parent);
-		menu.addItem(mxResources.get('bottomAlign'), null, function() {
-			graph.alignCells(mxConstants.ALIGN_BOTTOM);
-		}, parent);
-	})));
-	this.put('layout', new Menu(mxUtils.bind(this, function(menu, parent) {
-		// menu.addItem(mxResources.get('horizontalTree'), null, mxUtils.bind(this, function()
-		// {
-		// 	if (!graph.isSelectionEmpty())
-		// 	{
-		// 		var layout = new mxCompactTreeLayout(graph, true);
-		// 		layout.edgeRouting = false;
-		// 		layout.levelDistance = 30;
-		//    		this.editorUi.executeLayout(layout, true, true);
-		// 	}
-		// }), parent);
-		// menu.addItem(mxResources.get('verticalTree'), null, mxUtils.bind(this, function()
-		// {
-		// 	if (!graph.isSelectionEmpty())
-		// 	{
-		// 		var layout = new mxCompactTreeLayout(graph, false);
-		// 		layout.edgeRouting = false;
-		// 		layout.levelDistance = 30;
-		//    		this.editorUi.executeLayout(layout, true, true);
-		// 	}
-		// }), parent);
-		// menu.addSeparator(parent);
-		menu.addItem(mxResources.get('horizontalFlow'), null, mxUtils.bind(this,
-			function() {
-				var layout = new mxHierarchicalLayout(graph, mxConstants.DIRECTION_WEST);
-				this.editorUi.executeLayout(layout, true, true);
-			}), parent);
-		menu.addItem(mxResources.get('verticalFlow'), null, mxUtils.bind(this,
-			function() {
-				var layout = new mxHierarchicalLayout(graph, mxConstants.DIRECTION_NORTH);
-				this.editorUi.executeLayout(layout, true, true);
-			}), parent);
-		//menu.addSeparator(parent);
-		// menu.addItem(mxResources.get('organic'), null, mxUtils.bind(this, function()
-		// {
-		// 	var layout = new mxFastOrganicLayout(graph);
-		//   		this.editorUi.executeLayout(layout, true, true);
-		// }), parent);
-		// menu.addItem(mxResources.get('circle'), null, mxUtils.bind(this, function()
-		// {
-		// 	var layout = new mxCircleLayout(graph);
-		//   		this.editorUi.executeLayout(layout, true, true, graph.getSelectionCells());
-		// }), parent);
-	})));
-	this.put('navigation', new Menu(mxUtils.bind(this, function(menu, parent) {
-		this.addMenuItems(menu, ['home', '-', 'exitGroup', 'enterGroup', '-',
-			'expand', 'collapse'
-		], parent);
-	})));
-	this.put('arrange', new Menu(mxUtils.bind(this, function(menu, parent) {
-		this.addMenuItems(menu, ['toFront', 'toBack', '-'], parent);
-		//this.addSubmenu('direction', menu, parent);
-		this.addSubmenu('layout', menu, parent);
-		//this.addSubmenu('align', menu, parent);
-		menu.addSeparator(parent);
-		//this.addSubmenu('navigation', menu, parent);
-		this.addMenuItems(menu, ['-', 'group', 'ungroup', 'removeFromGroup'],
-			parent);
-		//this.addMenuItems(menu, ['-', 'group', 'ungroup', 'removeFromGroup', '-', 'autosize'], parent);
-	})));
-	this.put('view', new Menu(mxUtils.bind(this, function(menu, parent) {
-		this.addMenuItems(menu, ['actualSize'], parent);
-		menu.addSeparator();
-		var scales = [0.25, 0.5, 0.75, 1, 2, 4];
-
-		for (var i = 0; i < scales.length; i++) {
-			(function(scale) {
-				menu.addItem((scale * 100) + '%', null, function() {
-					graph.zoomTo(scale);
-				}, parent);
-			})(scales[i]);
-		}
-
-		this.addMenuItems(menu, ['-', 'zoomIn', 'zoomOut', '-', 'fitWindow',
-			'customZoom', '-', 'fitPage', 'fitPageWidth'
-		], parent);
-	})));
-	this.put('file', new Menu(mxUtils.bind(this, function(menu, parent) {
-		this.addMenuItems(menu, ['new', 'open', '-', 'save', 'saveAs', 'publish',
-			'-', 'variable', '-', 'import', 'export', '-', 'editFile', 'description', '-',
-			'print'
-		], parent);
-	})));
-	this.put('edit', new Menu(mxUtils.bind(this, function(menu, parent) {
-		this.addMenuItems(menu, ['undo', 'redo', '-', 'cut', 'copy', 'paste',
-			'delete', '-', 'duplicate', '-',
-			'selectVertices', 'selectEdges', 'selectAll'
-		]);
-	})));
-	this.put('help', new Menu(mxUtils.bind(this, function(menu, parent) {
-		this.addMenuItems(menu, ['help', '-', 'about']);
-	})));
-};
-
-/**
- * Adds the label menu items to the given menu and parent.
- */
-Menus.prototype.put = function(name, menu) {
-	this.menus[name] = menu;
-};
-
-/**
- * Adds the label menu items to the given menu and parent.
- */
-Menus.prototype.get = function(name) {
-	return this.menus[name];
-};
-
-/**
- * Adds the given submenu.
- */
-Menus.prototype.addSubmenu = function(name, menu, parent) {
-	var enabled = this.get(name).enabled;
-
-	if (menu.showDisabled || enabled) {
-		var submenu = menu.addItem(mxResources.get(name), null, null, parent, null,
-			enabled);
-		this.addMenu(name, menu, submenu);
-	}
-};
-
-/**
- * Adds the label menu items to the given menu and parent.
- */
-Menus.prototype.addMenu = function(name, popupMenu, parent) {
-	var menu = this.get(name);
-
-	if (menu != null && (popupMenu.showDisabled || menu.enabled)) {
-		this.get(name).execute(popupMenu, parent);
-	}
-};
-
-/**
- * Adds a style change item to the given menu.
- */
-Menus.prototype.styleChange = function(menu, label, keys, values, sprite,
-	parent) {
-	return menu.addItem(label, null, mxUtils.bind(this, function() {
-		var graph = this.editorUi.editor.graph;
-
-		graph.getModel().beginUpdate();
-		try {
-			for (var i = 0; i < keys.length; i++) {
-				graph.setCellStyles(keys[i], values[i]);
-			}
-		} finally {
-			graph.getModel().endUpdate();
-		}
-	}), parent, sprite);
-};
-
-/**
- * Adds a style change item with a prompt to the given menu.
- */
-Menus.prototype.promptChange = function(menu, label, hint, defaultValue, key,
-	parent, enabled) {
-	return menu.addItem(label, null, mxUtils.bind(this, function() {
-		var graph = this.editorUi.editor.graph;
-		var value = defaultValue;
-		var state = graph.getView().getState(graph.getSelectionCell());
-
-		if (state != null) {
-			value = state.style[key] || value;
-		}
-
-		value = mxUtils.prompt(mxResources.get('enterValue') + ((hint.length > 0) ?
-			(' ' + hint) : ''), value);
-
-		if (value != null && value.length > 0) {
-			graph.setCellStyles(key, value);
-		}
-	}), parent, null, enabled);
-};
-
-/**
- * Creates the keyboard event handler for the current graph and history.
- */
-Menus.prototype.addMenuItem = function(menu, key, parent) {
-	var action = this.editorUi.actions.get(key);
-
-	if (action != null && (menu.showDisabled || action.enabled)) {
-		var item = menu.addItem(action.label, null, action.funct, parent, null,
-			action.enabled);
-
-		// Adds checkmark image
-		if (action.toggleAction && action.isSelected()) {
-			this.addCheckmark(item);
-		}
-
-		this.addShortcut(item, action);
-
-		return item;
-	}
-
-	return null;
-};
-
-/**
- * Adds a checkmark to the given menuitem.
- */
-Menus.prototype.addShortcut = function(item, action) {
-	if (action.shortcut != null) {
-		var td = item.firstChild.nextSibling.nextSibling;
-		var span = document.createElement('span');
-		span.style.color = 'gray';
-		mxUtils.write(span, action.shortcut);
-		td.appendChild(span);
-	}
-};
-
-/**
- * Adds a checkmark to the given menuitem.
- */
-Menus.prototype.addCheckmark = function(item) {
-	var td = item.firstChild.nextSibling;
-	td.style.backgroundImage = 'url(' + IMAGE_PATH + '/checkmark.gif)';
-	td.style.backgroundRepeat = 'no-repeat';
-	td.style.backgroundPosition = '2px 50%';
-};
-
-/**
- * Creates the keyboard event handler for the current graph and history.
- */
-Menus.prototype.addMenuItems = function(menu, keys, parent) {
-	for (var i = 0; i < keys.length; i++) {
-		if (keys[i] == '-') {
-			menu.addSeparator(parent);
-		} else {
-			this.addMenuItem(menu, keys[i], parent);
-		}
-	}
-};
-
-/**
- * Creates the keyboard event handler for the current graph and history.
- */
-Menus.prototype.createPopupMenu = function(menu, cell, evt) {
-	var graph = this.editorUi.editor.graph;
-	menu.smartSeparators = true;
-
-	if (graph.isSelectionEmpty()) {
-		this.addMenuItems(menu, ['undo', 'redo', '-', 'paste', '-']);
-	} else {
-		this.addMenuItems(menu, ['delete', '-', 'cut', 'copy', '-', 'duplicate']);
-
-		if (graph.getSelectionCount() == 1 && graph.getModel().isEdge(graph.getSelectionCell())) {
-			this.addMenuItems(menu, ['setAsDefaultEdge']);
-		}
-
-		menu.addSeparator();
-	}
-
-	if (graph.getSelectionCount() > 0) {
-		this.addMenuItems(menu, ['toFront', 'toBack', '-']);
-
-		if (graph.getModel().isEdge(graph.getSelectionCell())) {
-			var isWaypoint = false;
-			var cell = graph.getSelectionCell();
-
-			if (cell != null && graph.getModel().isEdge(cell)) {
-				var handler = graph.selectionCellsHandler.getHandler(cell);
-
-				if (handler instanceof mxEdgeHandler && handler.bends != null && handler.bends
-					.length > 2) {
-					var index = handler.getHandleForEvent(new mxMouseEvent(evt));
-
-					// Configures removeWaypoint action before execution
-					var rmWaypointAction = this.editorUi.actions.get('removeWaypoint');
-					rmWaypointAction.handler = handler;
-					rmWaypointAction.index = index;
-
-					isWaypoint = index > 0 && index < handler.bends.length;
-				}
-			}
-
-			this.addMenuItems(menu, ['-', (isWaypoint) ? 'removeWaypoint' :
-				'addWaypoint'
-			]);
-		} else if (graph.getSelectionCount() > 1) {
-			menu.addSeparator();
-			this.addMenuItems(menu, ['group']);
-		}
-
-		menu.addSeparator();
-
-		if (graph.getSelectionCount() == 1) {
-			var link = graph.getLinkForCell(graph.getSelectionCell());
-
-			if (link != null) {
-				this.addMenuItems(menu, ['openLink']);
-			}
-		}
-	} else {
-		this.addMenuItems(menu, ['-', 'selectVertices', 'selectEdges', '-',
-			'selectAll'
-		]);
-	}
-};
-
-/**
- * Creates the keyboard event handler for the current graph and history.
- */
-Menus.prototype.createMenubar = function(container) {
-	var menubar = new Menubar(this.editorUi, container);
-	var menus = ['file', 'edit', 'view', 'format', 'text', 'arrange',
-		'help'
-	];
-
-	for (var i = 0; i < menus.length; i++) {
-		menubar.addMenu(mxResources.get(menus[i]), this.get(menus[i]).funct);
-	}
-
-	return menubar;
-};
-
-/**
- * Construcs a new menubar for the given editor.
- */
-function Menubar(editorUi, container) {
-	this.editorUi = editorUi;
-	this.container = container;
-
-	// Global handler to hide the current menu
-	mxEvent.addGestureListeners(document, mxUtils.bind(this, function(evt) {
-		this.hideMenu();
-	}));
-};
-
-/**
- * Adds the menubar elements.
- */
-Menubar.prototype.hideMenu = function() {
-	if (this.currentMenu != null) {
-		this.currentMenu.hideMenu();
-	}
-};
-
-/**
- * Adds a submenu to this menubar.
- */
-Menubar.prototype.addMenu = function(label, funct) {
-	var elt = document.createElement('a');
-	elt.setAttribute('href', 'javascript:void(0);');
-	elt.className = 'geItem';
-	mxUtils.write(elt, label);
-
-	this.addMenuHandler(elt, funct);
-	this.container.appendChild(elt);
-
-	return elt;
-};
-
-/**
- * Adds a handler for showing a menu in the given element.
- */
-Menubar.prototype.addMenuHandler = function(elt, funct) {
-	if (funct != null) {
-		var show = true;
-
-		var clickHandler = mxUtils.bind(this, function(evt) {
-			if (show && elt.enabled == null || elt.enabled) {
-				this.editorUi.editor.graph.panningHandler.hideMenu();
-				var menu = new mxPopupMenu(funct);
-				menu.div.className += ' geMenubarMenu';
-				menu.smartSeparators = true;
-				menu.showDisabled = true;
-				menu.autoExpand = true;
-
-				// Disables autoexpand and destroys menu when hidden
-				menu.hideMenu = mxUtils.bind(this, function() {
-					mxPopupMenu.prototype.hideMenu.apply(menu, arguments);
-					menu.destroy();
-					this.currentMenu = null;
-					this.currentElt = null;
-				});
-
-				// Added width of the page-sidebar
-				var x = elt.offsetLeft + document.getElementById('page-sidebar').offsetWidth +
-					22;
-				// Added static height of the page-navbar
-				var y = elt.offsetTop + elt.offsetHeight + 140;
-
-				menu.popup(x, y, null, evt);
-
-				//menu.popup(elt.offsetLeft + 4, elt.offsetTop + elt.offsetHeight + 4, null, evt);
-				this.currentMenu = menu;
-				this.currentElt = elt;
-			}
-
-			show = true;
-			mxEvent.consume(evt);
-		});
-
-		// Shows menu automatically while in expanded state
-		mxEvent.addListener(elt, 'mousemove', mxUtils.bind(this, function(evt) {
-			if (this.currentMenu != null && this.currentElt != elt) {
-				this.hideMenu();
-				clickHandler(evt);
-			}
-		}));
-
-		// Hides menu if already showing
-		mxEvent.addListener(elt, 'mousedown', mxUtils.bind(this, function() {
-			show = this.currentElt != elt;
-		}));
-
-		mxEvent.addListener(elt, 'click', clickHandler);
-	}
-};
-
-/**
- * Constructs a new action for the given parameters.
- */
-function Menu(funct, enabled) {
-	mxEventSource.call(this);
-	this.funct = funct;
-	this.enabled = (enabled != null) ? enabled : true;
-};
-
-// Menu inherits from mxEventSource
-mxUtils.extend(Menu, mxEventSource);
-
-/**
- * Sets the enabled state of the action and fires a stateChanged event.
- */
-Menu.prototype.setEnabled = function(value) {
-	if (this.enabled != value) {
-		this.enabled = value;
-		this.fireEvent(new mxEventObject('stateChanged'));
-	}
-};
-
-/**
- * Sets the enabled state of the action and fires a stateChanged event.
- */
-Menu.prototype.execute = function(menu, parent) {
-	this.funct(menu, parent);
-};
\ No newline at end of file
diff --git a/public/assets/plugins/square/js/Shapes.js b/public/assets/plugins/square/js/Shapes.js
index 42e13ca..23b9107 100644
--- a/public/assets/plugins/square/js/Shapes.js
+++ b/public/assets/plugins/square/js/Shapes.js
@@ -1,1234 +1 @@
-/**
- * $Id: Shapes.js,v 1.13 2013-02-02 06:44:30 gaudenz Exp $
- * Copyright (c) 2006-2012, JGraph Ltd
- */
-
-/**
- * Registers shapes.
- */
-(function()
-{
-	// Cube Shape, supports size style
-	function CubeShape() { };
-	CubeShape.prototype = new mxCylinder();
-	CubeShape.prototype.constructor = CubeShape;
-	CubeShape.prototype.size = 20;
-	CubeShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
-	{
-		var s = Math.min(w, Math.min(h, mxUtils.getValue(this.style, 'size', this.size)));
-
-		if (isForeground)
-		{
-			path.moveTo(s, h);
-			path.lineTo(s, s);
-			path.lineTo(0, 0);
-			path.moveTo(s, s);
-			path.lineTo(w, s);
-			path.end();
-		}
-		else
-		{
-			path.moveTo(0, 0);
-			path.lineTo(w - s, 0);
-			path.lineTo(w, s);
-			path.lineTo(w, h);
-			path.lineTo(s, h);
-			path.lineTo(0, h - s);
-			path.lineTo(0, 0);
-			path.close();
-			path.end();
-		}
-	};
-
-	mxCellRenderer.prototype.defaultShapes['cube'] = CubeShape;
-
-	// Note Shape, supports size style
-	function NoteShape() { };
-	NoteShape.prototype = new mxCylinder();
-	NoteShape.prototype.constructor = NoteShape;
-	NoteShape.prototype.size = 30;
-	NoteShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
-	{
-		var s = Math.min(w, Math.min(h, mxUtils.getValue(this.style, 'size', this.size)));
-
-		if (isForeground)
-		{
-			path.moveTo(w - s, 0);
-			path.lineTo(w - s, s);
-			path.lineTo(w, s);
-			path.end();
-		}
-		else
-		{
-			path.moveTo(0, 0);
-			path.lineTo(w - s, 0);
-			path.lineTo(w, s);
-			path.lineTo(w, h);
-			path.lineTo(0, h);
-			path.lineTo(0, 0);
-			path.close();
-			path.end();
-		}
-	};
-
-	mxCellRenderer.prototype.defaultShapes['note'] = NoteShape;
-
-	// Folder Shape, supports tabWidth, tabHeight styles
-	function FolderShape() { };
-	FolderShape.prototype = new mxCylinder();
-	FolderShape.prototype.constructor = FolderShape;
-	FolderShape.prototype.tabWidth = 60;
-	FolderShape.prototype.tabHeight = 20;
-	FolderShape.prototype.tabPosition = 'right';
-	FolderShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
-	{
-		var tw = mxUtils.getValue(this.style, 'tabWidth', this.tabWidth);
-		var th = mxUtils.getValue(this.style, 'tabHeight', this.tabHeight);
-		var tp = mxUtils.getValue(this.style, 'tabPosition', this.tabPosition);
-		var dx = Math.min(w, tw);
-		var dy = Math.min(h, th);
-
-		if (isForeground)
-		{
-			if (tp == 'left')
-			{
-				path.moveTo(0, dy);
-				path.lineTo(dx, dy);
-			}
-			// Right is default
-			else
-			{
-				path.moveTo(w - dx, dy);
-				path.lineTo(w, dy);
-			}
-			
-			path.end();
-		}
-		else
-		{
-			if (tp == 'left')
-			{
-				path.moveTo(0, 0);
-				path.lineTo(dx, 0);
-				path.lineTo(dx, dy);
-				path.lineTo(w, dy);
-			}
-			// Right is default
-			else
-			{
-				path.moveTo(0, dy);
-				path.lineTo(w - dx, dy);
-				path.lineTo(w - dx, 0);
-				path.lineTo(w, 0);
-			}
-			
-			path.lineTo(w, h);
-			path.lineTo(0, h);
-			path.lineTo(0, dy);
-			path.close();
-			path.end();
-		}
-	};
-
-	mxCellRenderer.prototype.defaultShapes['folder'] = FolderShape;
-
-	// Card Shape, supports size style
-	function CardShape() { };
-	CardShape.prototype = new mxCylinder();
-	CardShape.prototype.constructor = CardShape;
-	CardShape.prototype.size = 30;
-	CardShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
-	{
-		var s = Math.min(w, Math.min(h, mxUtils.getValue(this.style, 'size', this.size)));
-
-		if (!isForeground)
-		{
-			path.moveTo(s, 0);
-			path.lineTo(w, 0);
-			path.lineTo(w, h);
-			path.lineTo(0, h);
-			path.lineTo(0, s);
-			path.lineTo(s, 0);
-			path.close();
-			path.end();
-		}
-	};
-
-	mxCellRenderer.prototype.defaultShapes['card'] = CardShape;
-
-	// Tape Shape, supports size style
-	function TapeShape() { };
-	TapeShape.prototype = new mxCylinder();
-	TapeShape.prototype.constructor = TapeShape;
-	TapeShape.prototype.size = 0.4;
-	TapeShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
-	{
-		var s = mxUtils.getValue(this.style, 'size', this.size);
-		var dy = h * s;
-		var fy = 1.4;
-
-		if (!isForeground)
-		{
-			path.moveTo(0, dy / 2);
-			path.quadTo(w / 4, dy * fy, w / 2, dy / 2);
-			path.quadTo(w * 3 / 4, dy * (1 - fy), w, dy / 2);
-			path.lineTo(w, h - dy / 2);
-			path.quadTo(w * 3 / 4, h - dy * fy, w / 2, h - dy / 2);
-			path.quadTo(w / 4, h - dy * (1 - fy), 0, h - dy / 2);
-			path.lineTo(0, dy / 2);
-			path.close();
-			path.end();
-		}
-	};
-
-	mxCellRenderer.prototype.defaultShapes['tape'] = TapeShape;
-
-	// Tape Shape, supports size style
-	function StepShape() { };
-	StepShape.prototype = new mxCylinder();
-	StepShape.prototype.constructor = StepShape;
-	StepShape.prototype.size = 0.2;
-	StepShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
-	{
-		var s =  w * mxUtils.getValue(this.style, 'size', this.size);
-
-		if (!isForeground)
-		{
-			path.moveTo(0, 0);
-			path.lineTo(w - s, 0);
-			path.lineTo(w, h / 2);
-			path.lineTo(w - s, h);
-			path.lineTo(0, h);
-			path.lineTo(s, h / 2);
-			path.close();
-			path.end();
-		}
-	};
-
-	mxCellRenderer.prototype.defaultShapes['step'] = StepShape;
-
-	// Plus Shape
-	function PlusShape()
-	{
-		mxRectangleShape.call(this);
-	};
-	mxUtils.extend(PlusShape, mxRectangleShape);
-	PlusShape.prototype.isHtmlAllowed = function()
-	{
-		return false;
-	};
-	PlusShape.prototype.paintForeground = function(c, x, y, w, h)
-	{
-		var border = Math.min(w / 5, h / 5) + 1;
-		
-		c.begin();
-		c.moveTo(x + w / 2, y + border);
-		c.lineTo(x + w / 2, y + h - border);
-		c.moveTo(x + border, y + h / 2);
-		c.lineTo(x + w - border, y + h / 2);
-		c.end();
-		c.stroke();
-		mxRectangleShape.prototype.paintForeground.apply(this, arguments);
-	};
-
-	mxCellRenderer.prototype.defaultShapes['plus'] = PlusShape;
-
-	// CompositeShape
-	function ExtendedShape()
-	{
-		mxRectangleShape.call(this);
-	};
-	mxUtils.extend(ExtendedShape, mxRectangleShape);
-	ExtendedShape.prototype.isHtmlAllowed = function()
-	{
-		return false;
-	};
-	ExtendedShape.prototype.paintForeground = function(c, x, y, w, h)
-	{
-		if (this.style != null)
-		{
-			if (this.style['double'] == 1)
-			{
-				var inset = Math.max(2, this.strokewidth + 1);
-	
-				mxRectangleShape.prototype.paintBackground.call(this, c, x + inset, y + inset, w - 2 * inset, h - 2 * inset);
-				mxRectangleShape.prototype.paintForeground.apply(this, arguments);
-				
-				x += inset;
-				y += inset;
-				w -= 2 * inset;
-				h -= 2 * inset;
-			}
-			
-			c.setDashed(false);
-			
-			// Draws the symbols defined in the style. The symbols are
-			// numbered from 1...n. Possible postfixes are align,
-			// verticalAlign, spacing, arcSpacing, width, height
-			var counter = 0;
-			var shape = null;
-			
-			do
-			{
-				shape = mxCellRenderer.prototype.defaultShapes[this.style['symbol' + counter]];
-				
-				if (shape != null)
-				{
-					var align = this.style['symbol' + counter + 'Align'];
-					var valign = this.style['symbol' + counter + 'VerticalAlign'];
-					var width = this.style['symbol' + counter + 'Width'];
-					var height = this.style['symbol' + counter + 'Height'];
-					var spacing = this.style['symbol' + counter + 'Spacing'] || 0;
-					var arcspacing = this.style['symbol' + counter + 'ArcSpacing'];
-					
-					if (arcspacing != null)
-					{
-						spacing += this.getArcSize(w + this.strokewidth, h + this.strokewidth) * arcspacing;
-					}
-					
-					var x2 = x;
-					var y2 = y;
-					
-					if (align == mxConstants.ALIGN_CENTER)
-					{
-						x2 += (w - width) / 2;
-					}
-					else if (align == mxConstants.ALIGN_RIGHT)
-					{
-						x2 += w - width - spacing;
-					}
-					else
-					{
-						x2 += spacing;
-					}
-					
-					if (valign == mxConstants.ALIGN_MIDDLE)
-					{
-						y2 += (h - height) / 2;
-					}
-					else if (valign == mxConstants.ALIGN_BOTTOM)
-					{
-						y2 += h - height - spacing;
-					}
-					else
-					{
-						y2 += spacing;
-					}
-					
-					c.save();
-					
-					// Small hack to pass style along into subshape
-					var tmp = new shape();
-					// TODO: Clone style and override settings (eg. strokewidth)
-					tmp.style = this.style;
-					shape.prototype.paintVertexShape.call(tmp, c, x2, y2, width, height);
-					c.restore();
-				}
-				
-				counter++;
-			}
-			while (shape != null);
-		}
-	};
-
-	mxCellRenderer.prototype.defaultShapes['ext'] = ExtendedShape;
-	
-	// Tape Shape, supports size style
-	function MessageShape() { };
-	MessageShape.prototype = new mxCylinder();
-	MessageShape.prototype.constructor = MessageShape;
-	MessageShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
-	{
-		if (isForeground)
-		{
-			path.moveTo(0, 0);
-			path.lineTo(w / 2, h / 2);
-			path.lineTo(w, 0);
-			path.end();
-		}
-		else
-		{
-			path.moveTo(0, 0);
-			path.lineTo(w, 0);
-			path.lineTo(w, h);
-			path.lineTo(0, h);
-			path.close();
-		}
-	};
-
-	mxCellRenderer.prototype.defaultShapes['message'] = MessageShape;
-	
-	// New Actor Shape
-	function UmlActorShape() { };
-	UmlActorShape.prototype = new mxCylinder();
-	UmlActorShape.prototype.constructor = UmlActorShape;
-	UmlActorShape.prototype.addPipe = true;
-	UmlActorShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
-	{
-		var width = w / 3;
-		var height = h / 4;
-		
-		if (!isForeground)
-		{
-			path.moveTo(w / 2, height);
-			path.curveTo(w / 2 - width, height, w / 2 - width, 0, w / 2, 0);
-			path.curveTo(w / 2 + width, 0, w / 2 + width, height, w / 2, height);
-			path.close();
-
-			path.moveTo(w / 2, height);
-			path.lineTo(w / 2, 2 * h / 3);
-			
-			// Arms
-			path.moveTo(w / 2, h / 3);
-			path.lineTo(0, h / 3);
-			path.moveTo(w / 2, h / 3);
-			path.lineTo(w, h / 3);
-			
-			// Legs
-			path.moveTo(w / 2, 2 * h / 3);
-			path.lineTo(0, h);
-			path.moveTo(w / 2, 2 * h / 3);
-			path.lineTo(w, h);
-			path.end();
-		}
-	};
-
-	// Replaces existing actor shape
-	mxCellRenderer.prototype.defaultShapes['umlActor'] = UmlActorShape;
-
-	// New Actor Shape
-	function LollipopShape() { };
-	LollipopShape.prototype = new mxCylinder();
-	LollipopShape.prototype.constructor = LollipopShape;
-	LollipopShape.prototype.size = 10;
-	LollipopShape.prototype.addPipe = true;
-	LollipopShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
-	{
-		var ss = mxUtils.getValue(this.style, 'size', this.size);
-		var width = ss * 2 / 3;
-		var height = ss;
-		
-		if (!isForeground)
-		{
-			path.moveTo(w / 2, height);
-			path.curveTo(w / 2 - width, height, w / 2 - width, 0, w / 2, 0);
-			path.curveTo(w / 2 + width, 0, w / 2 + width, height, w / 2, height);
-			path.close();
-
-			path.moveTo(w / 2, height);
-			path.lineTo(w / 2, h);
-			path.end();
-		}
-	};
-
-	// Replaces existing actor shape
-	mxCellRenderer.prototype.defaultShapes['lollipop'] = LollipopShape;
-	
-	// Folder Shape, supports tabWidth, tabHeight styles
-	function ComponentShape() { };
-	ComponentShape.prototype = new mxCylinder();
-	ComponentShape.prototype.constructor = ComponentShape;
-	ComponentShape.prototype.jettyWidth = 32;
-	ComponentShape.prototype.jettyHeight = 12;
-	ComponentShape.prototype.redrawPath = function(path, x, y, w, h, isForeground)
-	{
-		var dx = mxUtils.getValue(this.style, 'jettyWidth', this.jettyWidth);
-		var dy = mxUtils.getValue(this.style, 'jettyHeight', this.jettyHeight);
-		var x0 = dx / 2;
-		var x1 = x0 + dx / 2;
-		var y0 = 0.3 * h - dy / 2;
-		var y1 = 0.7 * h - dy / 2;
-
-		if (isForeground)
-		{
-			path.moveTo(x0, y0);
-			path.lineTo(x1, y0);
-			path.lineTo(x1, y0 + dy);
-			path.lineTo(x0, y0 + dy);
-			path.moveTo(x0, y1);
-			path.lineTo(x1, y1);
-			path.lineTo(x1, y1 + dy);
-			path.lineTo(x0, y1 + dy);
-			path.end();
-		}
-		else
-		{
-			path.moveTo(x0, 0);
-			path.lineTo(w, 0);
-			path.lineTo(w, h);
-			path.lineTo(x0, h);
-			path.lineTo(x0, y1 + dy);
-			path.lineTo(0, y1 + dy);
-			path.lineTo(0, y1);
-			path.lineTo(x0, y1);
-			path.lineTo(x0, y0 + dy);
-			path.lineTo(0, y0 + dy);
-			path.lineTo(0, y0);
-			path.lineTo(x0, y0);
-			path.close();
-			path.end();
-		}
-	};
-
-	mxCellRenderer.prototype.defaultShapes['component'] = ComponentShape;
-	
-	// State Shapes derives from double ellipse
-	function StateShape() { };
-	StateShape.prototype = new mxDoubleEllipse();
-	StateShape.prototype.constructor = StateShape;
-	StateShape.prototype.outerStroke = true;
-	StateShape.prototype.paintVertexShape = function(c, x, y, w, h)
-	{
-		var inset = Math.min(4, Math.min(w / 5, h / 5));
-		
-		if (w > 0 && h > 0)
-		{
-			c.ellipse(x + inset, y + inset, w - 2 * inset, h - 2 * inset);
-			c.fillAndStroke();
-		}
-		
-		c.setShadow(false);
-
-		if (this.outerStroke)
-		{
-			c.ellipse(x, y, w, h);
-			c.stroke();			
-		}
-	};
-
-	mxCellRenderer.prototype.defaultShapes['endState'] = StateShape;
-
-	function StartStateShape() { };
-	StartStateShape.prototype = new StateShape();
-	StartStateShape.prototype.constructor = StartStateShape;
-	StartStateShape.prototype.outerStroke = false;
-	
-	mxCellRenderer.prototype.defaultShapes['startState'] = StartStateShape;
-
-	// Image export for state shapes
-	var imageExportInitShapes = mxImageExport.prototype.initShapes;
-	mxImageExport.prototype.initShapes = function()
-	{
-		imageExportInitShapes.apply(this, arguments);
-
-		function createStateShape(outerStroke)
-		{
-			return {
-				drawShape: function(canvas, state, bounds, background)
-				{
-					var x = bounds.x;
-					var y = bounds.y;
-					var w = bounds.width;
-					var h = bounds.height;
-					
-					if (background)
-					{
-						var inset = Math.min(4, Math.min(w / 5, h / 5));
-						x += inset;
-						y += inset;
-						w -= 2 * inset;
-						h -= 2 * inset;
-						
-						if (w > 0 && h > 0)
-						{
-							canvas.ellipse(x, y, w, h);
-						}
-						
-						return true;
-					}
-					else
-					{
-						canvas.fillAndStroke();
-		
-						if (outerStroke)
-						{
-							canvas.ellipse(x, y, w, h);
-							canvas.stroke();
-						}
-					}
-				}
-			};
-		};
-		
-		this.shapes['endState'] = createStateShape(true);
-		this.shapes['startState'] = createStateShape(false);
-	};
-
-	// Defines custom edge shape
-	function LinkShape()
-	{
-		mxArrow.call(this);
-	};
-	mxUtils.extend(LinkShape, mxArrow);
-	LinkShape.prototype.paintEdgeShape = function(c, pts)
-	{
-		var width = 10;
-
-		// Base vector (between end points)
-		var p0 = pts[0];
-		var pe = pts[pts.length - 1];
-		
-		var dx = pe.x - p0.x;
-		var dy = pe.y - p0.y;
-		var dist = Math.sqrt(dx * dx + dy * dy);
-		var length = dist;
-		
-		// Computes the norm and the inverse norm
-		var nx = dx / dist;
-		var ny = dy / dist;
-		var basex = length * nx;
-		var basey = length * ny;
-		var floorx = width * ny/3;
-		var floory = -width * nx/3;
-		
-		// Computes points
-		var p0x = p0.x - floorx / 2;
-		var p0y = p0.y - floory / 2;
-		var p1x = p0x + floorx;
-		var p1y = p0y + floory;
-		var p2x = p1x + basex;
-		var p2y = p1y + basey;
-		var p3x = p2x + floorx;
-		var p3y = p2y + floory;
-		// p4 not necessary
-		var p5x = p3x - 3 * floorx;
-		var p5y = p3y - 3 * floory;
-		
-		c.begin();
-		c.moveTo(p1x, p1y);
-		c.lineTo(p2x, p2y);
-		c.moveTo(p5x + floorx, p5y + floory);
-		c.lineTo(p0x, p0y);
-		c.stroke();
-	};
-
-	// Registers the link shape
-	mxCellRenderer.prototype.defaultShapes['link'] = LinkShape;
-
-	// Registers and defines the custom marker
-	mxMarker.addMarker('dash', function(canvas, shape, type, pe, unitX, unitY, size, source, sw, filled)
-	{
-		var nx = unitX * (size + sw + 1);
-		var ny = unitY * (size + sw + 1);
-
-		return function()
-		{
-			canvas.begin();
-			canvas.moveTo(pe.x - nx / 2 - ny / 2, pe.y - ny / 2 + nx / 2);
-			canvas.lineTo(pe.x + ny / 2 - 3 * nx / 2, pe.y - 3 * ny / 2 - nx / 2);
-			canvas.stroke();
-		};
-	});
-
-	// Implements custom handlers
-	var SPECIAL_HANDLE_INDEX = -99;
-
-	// Handlers are only added if mxVertexHandler is defined (ie. not in embedded graph)
-	if (typeof(mxVertexHandler) != 'undefined')
-	{
-		function mxExtVertexHandler(state)
-		{
-			mxVertexHandler.call(this, state);
-		};
-	
-		mxUtils.extend(mxExtVertexHandler, mxVertexHandler);
-	
-		mxExtVertexHandler.prototype.useGridForSpecialHandle = false;
-		
-		mxExtVertexHandler.prototype.init = function()
-		{
-			this.horizontal = mxUtils.getValue(this.state.style, mxConstants.STYLE_HORIZONTAL, true);
-			var graph = this.state.view.graph;
-	
-			if (this.handleImage != null)
-			{
-				var bounds = new mxRectangle(0, 0, this.handleImage.width, this.handleImage.height);
-				this.specialHandle = new mxImageShape(bounds, this.handleImage.src);
-			}
-			else
-			{
-				var size = 10;
-				var bounds = new mxRectangle(0, 0, size, size);
-				this.specialHandle = new mxRhombus(bounds, mxConstants.HANDLE_FILLCOLOR, mxConstants.HANDLE_STROKECOLOR);
-			}
-			
-			this.specialHandle.dialect = (graph.dialect != mxConstants.DIALECT_SVG) ?
-					mxConstants.DIALECT_VML : mxConstants.DIALECT_SVG;
-			this.specialHandle.init(graph.getView().getOverlayPane());
-			this.specialHandle.node.style.cursor = this.getSpecialHandleCursor();
-	
-			mxEvent.redirectMouseEvents(this.specialHandle.node, graph, this.state);
-			mxVertexHandler.prototype.init.apply(this, arguments);
-		};
-		
-		mxExtVertexHandler.prototype.getSpecialHandleCursor = function()
-		{
-			return 'default';
-		};
-		
-		mxExtVertexHandler.prototype.redraw = function()
-		{
-			mxVertexHandler.prototype.redraw.apply(this, arguments);
-	
-			var size = this.specialHandle.bounds.width;
-			this.specialHandle.bounds = this.getSpecialHandleBounds(size);
-			this.specialHandle.redraw();
-		};
-
-		mxExtVertexHandler.prototype.destroy = function()
-		{
-			mxVertexHandler.prototype.destroy.apply(this, arguments);
-			
-			if (this.specialHandle != null)
-			{
-				this.specialHandle.destroy();
-				this.specialHandle = null;
-			}
-		};
-		
-		mxExtVertexHandler.prototype.getHandleForEvent = function(me)
-		{
-			if (me.isSource(this.specialHandle))
-			{
-				return SPECIAL_HANDLE_INDEX;
-			}
-			
-			return mxVertexHandler.prototype.getHandleForEvent.apply(this, arguments);
-		};
-
-		mxExtVertexHandler.prototype.mouseMove = function(sender, me)
-		{
-			if (!me.isConsumed() && this.index == SPECIAL_HANDLE_INDEX)
-			{
-				var point = new mxPoint(me.getGraphX(), me.getGraphY());
-				this.constrainPoint(point);
-				var gridEnabled = this.graph.isGridEnabledEvent(me.getEvent());
-				var scale = this.graph.getView().scale;
-				
-				if (gridEnabled && this.useGridForSpecialHandle)
-				{
-					point.x = this.graph.snap(point.x / scale) * scale;
-					point.y = this.graph.snap(point.y / scale) * scale;
-				}
-				
-				this.updateStyle(point);			
-				this.moveSizerTo(this.specialHandle, point.x, point.y);
-				this.state.view.graph.cellRenderer.redraw(this.state, true);
-				me.consume();
-			}
-			else
-			{
-				mxVertexHandler.prototype.mouseMove.apply(this, arguments);
-			}
-		};
-
-		mxExtVertexHandler.prototype.mouseUp = function(sender, me)
-		{
-			if (!me.isConsumed() && this.index == SPECIAL_HANDLE_INDEX)
-			{
-				this.applyStyle();
-				this.reset();
-				me.consume();
-			}
-			else
-			{
-				mxVertexHandler.prototype.mouseUp.apply(this, arguments);
-			}
-		};
-
-		mxExtVertexHandler.prototype.getSpecialHandleBounds = function(size)
-		{
-			var rotation = this.state.shape.getShapeRotation();
-			var alpha = mxUtils.toRadians(rotation);
-			var cos = Math.cos(alpha);
-			var sin = Math.sin(alpha);
-			
-			var bounds = new mxRectangle(this.state.x, this.state.y, this.state.width, this.state.height);
-			
-			if (this.state.shape.isPaintBoundsInverted())
-			{
-				var t = (bounds.width - bounds.height) / 2;
-				bounds.x += t;
-				bounds.y -= t;
-				var tmp = bounds.width;
-				bounds.width = bounds.height;
-				bounds.height = tmp;
-			}
-	
-			var pt = this.getSpecialHandlePoint(bounds);
-
-			if (this.state.shape.flipH)
-			{
-				pt.x = 2 * bounds.x + bounds.width - pt.x;
-			}
-			
-			if (this.state.shape.flipV)
-			{
-				pt.y = 2 * bounds.y + bounds.height - pt.y;
-			}
-			
-			pt = mxUtils.getRotatedPoint(pt, cos, sin,
-				new mxPoint(this.state.getCenterX(), this.state.getCenterY()));
-
-			return new mxRectangle(pt.x - size / 2, pt.y - size / 2, size, size);
-		};
-		
-		mxExtVertexHandler.prototype.getSpecialHandlePoint = function(bounds)
-		{
-			// Hook for subclassers
-			return null;
-		};
-	
-		mxExtVertexHandler.prototype.updateStyle = function(point)
-		{
-			// Hook for subclassers
-		};
-		
-		mxExtVertexHandler.prototype.constrainPoint = function(point)
-		{
-			point.x = Math.max(this.state.x, Math.min(this.state.x + this.state.width, point.x));
-			point.y = Math.max(this.state.y, Math.min(this.state.y + this.state.height, point.y));
-		};
-		
-		mxExtVertexHandler.prototype.applyStyle = function()
-		{
-			// Hook for subclassers
-		};
-
-		// Folder Handler
-		function mxFolderHandler(state)
-		{
-			mxExtVertexHandler.call(this, state);
-		};
-	
-		mxUtils.extend(mxFolderHandler, mxExtVertexHandler);
-
-		mxFolderHandler.prototype.getSpecialHandlePoint = function(bounds)
-		{
-			var scale = this.graph.getView().scale;
-			var tw = Math.min(bounds.width, mxUtils.getValue(this.state.style, 'tabWidth', 60) * scale);
-			var th = Math.min(bounds.height, mxUtils.getValue(this.state.style, 'tabHeight', 20) * scale);
-			
-			var tp = mxUtils.getValue(this.state.style, 'tabPosition', 'right');
-			var x = (tp == 'left') ? bounds.x + tw : bounds.x + bounds.width - tw;
-	
-			return new mxPoint(x, bounds.y + th);
-		};
-		
-		mxFolderHandler.prototype.updateStyle = function(point)
-		{
-			var rotation = this.state.shape.getShapeRotation();
-			var alpha = mxUtils.toRadians(rotation);
-			var cos = Math.cos(-alpha);
-			var sin = Math.sin(-alpha);
-
-			var bounds = new mxRectangle(this.state.x, this.state.y, this.state.width, this.state.height);
-			
-			if (this.state.shape.isPaintBoundsInverted())
-			{
-				var t = (bounds.width - bounds.height) / 2;
-				bounds.x += t;
-				bounds.y -= t;
-				var tmp = bounds.width;
-				bounds.width = bounds.height;
-				bounds.height = tmp;
-			}
-	
-			var pt = new mxPoint(point.x, point.y);
-			pt = mxUtils.getRotatedPoint(pt, cos, sin,
-				new mxPoint(this.state.getCenterX(), this.state.getCenterY()));
-
-			if (this.state.shape.flipH)
-			{
-				pt.x = 2 * bounds.x + bounds.width - pt.x;
-			}
-			
-			if (this.state.shape.flipV)
-			{
-				pt.y = 2 * bounds.y + bounds.height - pt.y;
-			}
-			
-			var result = this.updateStyleUnrotated(pt, bounds);
-		
-			// Modifies point to use rotated coordinates of return value
-			if (result != null)
-			{
-				if (this.state.shape.flipH)
-				{
-					result.x = 2 * bounds.x + bounds.width - result.x;
-				}
-				
-				if (this.state.shape.flipV)
-				{
-					result.y = 2 * bounds.y + bounds.height - result.y;
-				}
-				
-				cos = Math.cos(alpha);
-				sin = Math.sin(alpha);
-				result = mxUtils.getRotatedPoint(result, cos, sin,
-						new mxPoint(this.state.getCenterX(), this.state.getCenterY()));
-				point.x = result.x;
-				point.y = result.y;
-			}
-		};
-		
-		mxFolderHandler.prototype.updateStyleUnrotated = function(pt, bounds)
-		{
-			var tp = mxUtils.getValue(this.state.style, 'tabPosition', 'right');
-			var tw = (tp == 'left') ? pt.x - bounds.x : bounds.x + bounds.width - pt.x;
-			var th = pt.y - bounds.y;
-			
-			var scale = this.graph.getView().scale;
-			this.state.style['tabWidth'] = Math.round(Math.max(1, tw) / scale);
-			this.state.style['tabHeight'] =  Math.round(Math.max(1, th) / scale);
-		};
-		
-		mxFolderHandler.prototype.applyStyle = function()
-		{
-			var model = this.graph.getModel();
-			model.beginUpdate();
-			try
-			{
-				this.state.view.graph.setCellStyles('tabWidth', this.state.style['tabWidth'], [this.state.cell]);
-				this.state.view.graph.setCellStyles('tabHeight', this.state.style['tabHeight'], [this.state.cell]);
-			}
-			finally
-			{
-				model.endUpdate();
-			}
-		};
-		
-		// Swimlane Handler
-		function mxSwimlaneHandler(state)
-		{
-			mxFolderHandler.call(this, state);
-		};
-		
-		mxUtils.extend(mxSwimlaneHandler, mxFolderHandler);
-		
-		mxSwimlaneHandler.prototype.getSpecialHandlePoint = function(bounds)
-		{
-			var scale = this.graph.getView().scale;
-			var startSize = mxUtils.getValue(this.state.style, mxConstants.STYLE_STARTSIZE, mxConstants.DEFAULT_STARTSIZE);
-
-			return new mxPoint(bounds.x + bounds.width / 2, bounds.y + Math.min(bounds.height, startSize * scale));
-		};
-		
-		mxSwimlaneHandler.prototype.updateStyleUnrotated = function(point, bounds)
-		{
-			point.x = bounds.x + bounds.width / 2;
-			startSize = point.y - bounds.y;
-			var scale = this.graph.getView().scale;
-			this.state.style['startSize'] = Math.round(Math.max(1, startSize) / scale);
-			
-			return point;
-		};
-		
-		mxSwimlaneHandler.prototype.applyStyle = function()
-		{
-			this.state.view.graph.setCellStyles('startSize', this.state.style['startSize'], [this.state.cell]);
-		};
-
-		// Cube Handler
-		function mxCubeHandler(state)
-		{
-			mxFolderHandler.call(this, state);
-		};
-	
-		mxUtils.extend(mxCubeHandler, mxFolderHandler);
-		
-		mxCubeHandler.prototype.defaultValue = 20;
-	
-		mxCubeHandler.prototype.scaleFactor = 1;
-		
-		mxCubeHandler.prototype.getSpecialHandlePoint = function(bounds)
-		{
-			var scale = this.graph.getView().scale;
-			var sz = Math.min(bounds.width, Math.min(bounds.height,
-				mxUtils.getValue(this.state.style, 'size', this.defaultValue) * scale / this.scaleFactor));
-			
-			return new mxPoint(bounds.x + sz, bounds.y + sz);
-		};
-	
-		mxCubeHandler.prototype.updateStyleUnrotated = function(pt, bounds)
-		{
-			var size = Math.max(0, Math.min(Math.min(bounds.width / this.scaleFactor, pt.x - bounds.x),
-					Math.min(bounds.height / this.scaleFactor, pt.y - bounds.y)));
-			var scale = this.graph.getView().scale;
-			this.state.style['size'] = Math.round(Math.max(1, size) / scale) * this.scaleFactor;
-			
-			// Stays on the diagonal
-			return new mxPoint(bounds.x + size, bounds.y + size);
-		};
-		
-		mxCubeHandler.prototype.applyStyle = function()
-		{
-			this.state.view.graph.setCellStyles('size', this.state.style['size'], [this.state.cell]);
-		};
-		
-		// Card Handler
-		function mxCardHandler(state)
-		{
-			mxCubeHandler.call(this, state);
-		};
-	
-		mxUtils.extend(mxCardHandler, mxCubeHandler);
-		
-		mxCardHandler.prototype.defaultValue = 30;
-	
-		mxCardHandler.prototype.scaleFactor = 2;
-		
-		// Note Handler
-		function mxNoteHandler(state)
-		{
-			mxCubeHandler.call(this, state);
-		};
-	
-		mxUtils.extend(mxNoteHandler, mxCubeHandler);
-		
-		mxNoteHandler.prototype.defaultValue = 30;
-	
-		mxNoteHandler.prototype.scaleFactor = 1;
-		
-		mxNoteHandler.prototype.getSpecialHandlePoint = function(bounds)
-		{
-			var scale = this.graph.getView().scale;
-			var sz = Math.min(bounds.width, Math.min(bounds.height,
-					mxUtils.getValue(this.state.style, 'size', this.defaultValue) * scale / this.scaleFactor));
-			
-			return new mxPoint(bounds.x + bounds.width - sz, bounds.y + sz);
-		};
-		
-		mxNoteHandler.prototype.updateStyleUnrotated = function(pt, bounds)
-		{
-			var size = Math.max(0, Math.min(Math.min(bounds.width / this.scaleFactor, pt.x - bounds.x + bounds.width),
-					Math.min(bounds.height / this.scaleFactor, pt.y - bounds.y)));
-			var scale = this.graph.getView().scale;
-			this.state.style['size'] = Math.round(Math.max(1, size) / scale) * this.scaleFactor;
-			
-			// Stays on the diagonal
-			return new mxPoint(bounds.x + bounds.width - size, bounds.y + size);
-		};
-		
-		// Step Handler
-		function mxStepHandler(state)
-		{
-			mxCubeHandler.call(this, state);
-		};
-	
-		mxUtils.extend(mxStepHandler, mxCubeHandler);
-		
-		mxStepHandler.prototype.defaultValue = 0.2;
-	
-		mxStepHandler.prototype.scaleFactor = 1;
-		
-		mxStepHandler.prototype.getSpecialHandlePoint = function(bounds)
-		{
-			var sz = mxUtils.getValue(this.state.style, 'size', this.defaultValue);
-			
-			return new mxPoint(bounds.x + bounds.width * sz, bounds.y + bounds.height / 2);
-		};
-	
-		mxStepHandler.prototype.updateStyleUnrotated = function(pt, bounds)
-		{
-			var size = Math.min(1, (pt.x - bounds.x) / bounds.width);
-			this.state.style['size'] = size;
-			
-			return new mxPoint(bounds.x + size * bounds.width, bounds.y + bounds.height / 2);
-		};
-		
-		// Tape Handler
-		function mxTapeHandler(state)
-		{
-			mxCubeHandler.call(this, state);
-		};
-	
-		mxUtils.extend(mxTapeHandler, mxCubeHandler);
-		
-		mxTapeHandler.prototype.defaultValue = 0.4;
-	
-		mxTapeHandler.prototype.scaleFactor = 1;
-		
-		mxTapeHandler.prototype.getSpecialHandlePoint = function(bounds)
-		{
-			var sz = mxUtils.getValue(this.state.style, 'size', this.defaultValue);
-	
-			return new mxPoint(bounds.x + bounds.width / 2, bounds.y + sz * bounds.height / 2);
-		};
-	
-		mxTapeHandler.prototype.updateStyleUnrotated = function(pt, bounds)
-		{
-			var size = Math.max(0, Math.min(1, ((pt.y - bounds.y) / bounds.height) * 2));
-			this.state.style['size'] = size;
-			
-			return new mxPoint(bounds.x + bounds.width / 2, bounds.y + size * bounds.height / 2);
-		};
-		
-		var handlers = {'swimlane': mxSwimlaneHandler, 'folder': mxFolderHandler, 'cube': mxCubeHandler,
-				'card': mxCardHandler, 'note': mxNoteHandler, 'step': mxStepHandler, 'tape': mxTapeHandler};
-
-		var mxGraphCreateHandler = mxGraph.prototype.createHandler;
-		mxGraph.prototype.createHandler = function(state)
-		{
-			if (state != null)
-			{
-				var ctor = handlers[state.style['shape']];
-
-				if (ctor != null)
-				{
-					return new ctor(state);
-				}
-			}
-			
-			return mxGraphCreateHandler.apply(this, arguments);
-		};
-	}
-	
-	// Constraints
-	mxGraph.prototype.getAllConnectionConstraints = function(terminal, source)
-	{
-		if (terminal != null && terminal.shape != null)
-		{
-			if (terminal.shape.stencil != null)
-			{
-				if (terminal.shape.stencil != null)
-				{
-					return terminal.shape.stencil.constraints;
-				}
-			}
-			else if (terminal.shape.constraints != null)
-			{
-				return terminal.shape.constraints;
-			}
-		}
-
-		return null;
-	};
-
-	mxRectangleShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.25, 0), true),
-	                                          new mxConnectionConstraint(new mxPoint(0.5, 0), true),
-	                                          new mxConnectionConstraint(new mxPoint(0.75, 0), true),
-	        	              		 new mxConnectionConstraint(new mxPoint(0, 0.25), true),
-	        	              		 new mxConnectionConstraint(new mxPoint(0, 0.5), true),
-	        	              		 new mxConnectionConstraint(new mxPoint(0, 0.75), true),
-	        	            		 new mxConnectionConstraint(new mxPoint(1, 0.25), true),
-	        	            		 new mxConnectionConstraint(new mxPoint(1, 0.5), true),
-	        	            		 new mxConnectionConstraint(new mxPoint(1, 0.75), true),
-	        	            		 new mxConnectionConstraint(new mxPoint(0.25, 1), true),
-	        	            		 new mxConnectionConstraint(new mxPoint(0.5, 1), true),
-	        	            		 new mxConnectionConstraint(new mxPoint(0.75, 1), true)];
-	mxLabel.prototype.constraints = mxRectangleShape.prototype.constraints;
-	mxImageShape.prototype.constraints = mxRectangleShape.prototype.constraints;
-	mxSwimlane.prototype.constraints = mxRectangleShape.prototype.constraints;
-	PlusShape.prototype.constraints = mxRectangleShape.prototype.constraints;
-	NoteShape.prototype.constraints = mxRectangleShape.prototype.constraints;
-	CardShape.prototype.constraints = mxRectangleShape.prototype.constraints;
-	CubeShape.prototype.constraints = mxRectangleShape.prototype.constraints;
-	FolderShape.prototype.constraints = mxRectangleShape.prototype.constraints;
-	mxCylinder.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.15, 0.05), false),
-                                        new mxConnectionConstraint(new mxPoint(0.5, 0), true),
-                                        new mxConnectionConstraint(new mxPoint(0.85, 0.05), false),
-      	              		 new mxConnectionConstraint(new mxPoint(0, 0.3), true),
-      	              		 new mxConnectionConstraint(new mxPoint(0, 0.5), true),
-      	              		 new mxConnectionConstraint(new mxPoint(0, 0.7), true),
-      	            		 new mxConnectionConstraint(new mxPoint(1, 0.3), true),
-      	            		 new mxConnectionConstraint(new mxPoint(1, 0.5), true),
-      	            		 new mxConnectionConstraint(new mxPoint(1, 0.7), true),
-      	            		 new mxConnectionConstraint(new mxPoint(0.15, 0.95), false),
-      	            		 new mxConnectionConstraint(new mxPoint(0.5, 1), true),
-      	            		 new mxConnectionConstraint(new mxPoint(0.85, 0.95), false)];
-	UmlActorShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.25, 0.1), false),
-	                                          new mxConnectionConstraint(new mxPoint(0.5, 0), false),
-	                                          new mxConnectionConstraint(new mxPoint(0.75, 0.1), false),
-	        	              		 new mxConnectionConstraint(new mxPoint(0, 1/3), false),
-	        	              		 new mxConnectionConstraint(new mxPoint(0, 1), false),
-	        	            		 new mxConnectionConstraint(new mxPoint(1, 1/3), false),
-	        	            		 new mxConnectionConstraint(new mxPoint(1, 1), false),
-	        	            		 new mxConnectionConstraint(new mxPoint(0.5, 0.5), false)];
-	ComponentShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.25, 0), true),
-	                                          new mxConnectionConstraint(new mxPoint(0.5, 0), true),
-	                                          new mxConnectionConstraint(new mxPoint(0.75, 0), true),
-	        	              		 new mxConnectionConstraint(new mxPoint(0, 0.3), true),
-	        	              		 new mxConnectionConstraint(new mxPoint(0, 0.7), true),
-	        	            		 new mxConnectionConstraint(new mxPoint(1, 0.25), true),
-	        	            		 new mxConnectionConstraint(new mxPoint(1, 0.5), true),
-	        	            		 new mxConnectionConstraint(new mxPoint(1, 0.75), true),
-	        	            		 new mxConnectionConstraint(new mxPoint(0.25, 1), true),
-	        	            		 new mxConnectionConstraint(new mxPoint(0.5, 1), true),
-	        	            		 new mxConnectionConstraint(new mxPoint(0.75, 1), true)];
-	mxActor.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.5, 0), true),
-   	              		 new mxConnectionConstraint(new mxPoint(0.25, 0.2), false),
-   	              		 new mxConnectionConstraint(new mxPoint(0.1, 0.5), false),
-   	              		 new mxConnectionConstraint(new mxPoint(0, 0.75), true),
-   	            		 new mxConnectionConstraint(new mxPoint(0.75, 0.25), false),
-   	            		 new mxConnectionConstraint(new mxPoint(0.9, 0.5), false),
-   	            		 new mxConnectionConstraint(new mxPoint(1, 0.75), true),
-   	            		 new mxConnectionConstraint(new mxPoint(0.25, 1), true),
-   	            		 new mxConnectionConstraint(new mxPoint(0.5, 1), true),
-   	            		 new mxConnectionConstraint(new mxPoint(0.75, 1), true)];
-	TapeShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0.35), false),
-	                                   new mxConnectionConstraint(new mxPoint(0, 0.5), false),
-	                                   new mxConnectionConstraint(new mxPoint(0, 0.65), false),
-	                                   new mxConnectionConstraint(new mxPoint(1, 0.35), false),
-		                                new mxConnectionConstraint(new mxPoint(1, 0.5), false),
-		                                new mxConnectionConstraint(new mxPoint(1, 0.65), false),
-										new mxConnectionConstraint(new mxPoint(0.25, 1), false),
-										new mxConnectionConstraint(new mxPoint(0.75, 0), false)];
-	// TODO: Relative ports
-	StepShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.25, 0), true),
-                                       new mxConnectionConstraint(new mxPoint(0.5, 0), true),
-                                       new mxConnectionConstraint(new mxPoint(0.75, 0), true),
-                                       new mxConnectionConstraint(new mxPoint(0.25, 1), true),
-  	        	            		 	new mxConnectionConstraint(new mxPoint(0.5, 1), true),
-  	        	            		 	new mxConnectionConstraint(new mxPoint(0.75, 1), true),
-	                                   new mxConnectionConstraint(new mxPoint(0.1, 0.25), false),
-	                                   new mxConnectionConstraint(new mxPoint(0.2, 0.5), false),
-	                                   new mxConnectionConstraint(new mxPoint(0.1, 0.75), false),
-	                                   new mxConnectionConstraint(new mxPoint(0.9, 0.25), false),
-		                                new mxConnectionConstraint(new mxPoint(1, 0.5), false),
-		                                new mxConnectionConstraint(new mxPoint(0.9, 0.75), false)];
-	mxLine.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0.5), false),
-	                                new mxConnectionConstraint(new mxPoint(0.25, 0.5), false),
-	                                new mxConnectionConstraint(new mxPoint(0.75, 0.5), false),
-									new mxConnectionConstraint(new mxPoint(1, 0.5), false)];
-	LollipopShape.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.5, 0), false),
-										new mxConnectionConstraint(new mxPoint(0.5, 1), false)];
-	mxEllipse.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0), true), new mxConnectionConstraint(new mxPoint(1, 0), true),
-	                                   new mxConnectionConstraint(new mxPoint(0, 1), true), new mxConnectionConstraint(new mxPoint(1, 1), true),
-	                                   new mxConnectionConstraint(new mxPoint(0.5, 0), true), new mxConnectionConstraint(new mxPoint(0.5, 1), true),
-	          	              		   new mxConnectionConstraint(new mxPoint(0, 0.5), true), new mxConnectionConstraint(new mxPoint(1, 0.5))];
-	mxDoubleEllipse.prototype.constraints = mxEllipse.prototype.constraints;
-	mxRhombus.prototype.constraints = mxEllipse.prototype.constraints;
-	mxTriangle.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0, 0.25), true),
-	                                    new mxConnectionConstraint(new mxPoint(0, 0.5), true),
-	                                   new mxConnectionConstraint(new mxPoint(0, 0.75), true),
-	                                   new mxConnectionConstraint(new mxPoint(0.5, 0), true),
-	                                   new mxConnectionConstraint(new mxPoint(0.5, 1), true),
-	                                   new mxConnectionConstraint(new mxPoint(1, 0.5), true)];
-	mxHexagon.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.375, 0), true),
-	                                    new mxConnectionConstraint(new mxPoint(0.5, 0), true),
-	                                   new mxConnectionConstraint(new mxPoint(0.625, 0), true),
-	                                   new mxConnectionConstraint(new mxPoint(0.125, 0.25), false),
-	                                   new mxConnectionConstraint(new mxPoint(0, 0.5), true),
-	                                   new mxConnectionConstraint(new mxPoint(0.125, 0.75), false),
-	                                   new mxConnectionConstraint(new mxPoint(0.875, 0.25), false),
-	                                   new mxConnectionConstraint(new mxPoint(0, 0.5), true),
-	                                   new mxConnectionConstraint(new mxPoint(1, 0.5), true),
-	                                   new mxConnectionConstraint(new mxPoint(0.875, 0.75), false),
-	                                   new mxConnectionConstraint(new mxPoint(0.375, 1), true),
-	                                    new mxConnectionConstraint(new mxPoint(0.5, 1), true),
-	                                   new mxConnectionConstraint(new mxPoint(0.625, 1), true)];
-	mxCloud.prototype.constraints = [new mxConnectionConstraint(new mxPoint(0.25, 0.25), false),
-	                                 new mxConnectionConstraint(new mxPoint(0.4, 0.1), false),
-	                                 new mxConnectionConstraint(new mxPoint(0.16, 0.55), false),
-	                                 new mxConnectionConstraint(new mxPoint(0.07, 0.4), false),
-	                                 new mxConnectionConstraint(new mxPoint(0.31, 0.8), false),
-	                                 new mxConnectionConstraint(new mxPoint(0.13, 0.77), false),
-	                                 new mxConnectionConstraint(new mxPoint(0.8, 0.8), false),
-	                                 new mxConnectionConstraint(new mxPoint(0.55, 0.95), false),
-	                                 new mxConnectionConstraint(new mxPoint(0.875, 0.5), false),
-	                                 new mxConnectionConstraint(new mxPoint(0.96, 0.7), false),
-	                                 new mxConnectionConstraint(new mxPoint(0.625, 0.2), false),
-	                                 new mxConnectionConstraint(new mxPoint(0.88, 0.25), false)];
-	mxArrow.prototype.constraints = null;
-})();
\ No newline at end of file
diff --git a/public/assets/plugins/square/js/Sidebar.js b/public/assets/plugins/square/js/Sidebar.js
index 6e4129c..364d678 100644
--- a/public/assets/plugins/square/js/Sidebar.js
+++ b/public/assets/plugins/square/js/Sidebar.js
@@ -1,932 +1 @@
-'use strict';
-
-/**
- * Construcs a new sidebar for the given editor.
- */
-function Sidebar(editorUi, container) {
-	this.editorUi = editorUi;
-	this.container = container;
-	this.palettes = new Object();
-	this.showTooltips = true;
-	this.graph = new Graph(document.createElement('div'), null, null, this.editorUi
-		.editor.graph.getStylesheet());
-	this.graph.resetViewOnRootChange = false;
-	this.graph.foldingEnabled = false;
-	this.graph.setConnectable(false);
-	this.graph.autoScroll = false;
-	this.graph.setTooltips(false);
-	this.graph.setEnabled(false);
-
-	// Container must be in the DOM for correct HTML rendering
-	this.graph.container.style.visibility = 'hidden';
-	this.graph.container.style.position = 'absolute';
-	document.body.appendChild(this.graph.container);
-
-	if (!mxClient.IS_TOUCH) {
-		mxEvent.addListener(document, 'mouseup', mxUtils.bind(this, function() {
-			this.showTooltips = true;
-		}));
-
-		// Enables tooltips after scroll
-		mxEvent.addListener(container, 'scroll', mxUtils.bind(this, function() {
-			this.showTooltips = true;
-		}));
-
-		mxEvent.addListener(document, 'mousedown', mxUtils.bind(this, function() {
-			this.showTooltips = false;
-			this.hideTooltip();
-		}));
-
-		mxEvent.addListener(document, 'mousemove', mxUtils.bind(this, function(evt) {
-			var src = mxEvent.getSource(evt);
-
-			while (src != null) {
-				if (src == this.currentElt) {
-					return;
-				}
-
-				src = src.parentNode;
-			}
-
-			this.hideTooltip();
-		}));
-
-		// Handles mouse leaving the window
-		mxEvent.addListener(document, 'mouseout', mxUtils.bind(this, function(evt) {
-			if (evt.toElement == null && evt.relatedTarget == null) {
-				this.hideTooltip();
-			}
-		}));
-	}
-
-	this.init();
-
-	// Pre-fetches tooltip image
-	new Image().src = IMAGE_PATH + '/tooltip.png';
-};
-
-/**
- * Adds all palettes to the sidebar.
- */
-Sidebar.prototype.init = function() {
-	var dir = STENCIL_PATH;
-	console.log(dir);
-
-	this.addImagePalette('entry', mxResources.get('entry'), dir + '/entry/',
-		'_128x128.png', ['start', 'finally', 'end'], [mxResources.get('start'),
-			mxResources.get('finally'), mxResources.get('end')
-		]);
-	this.addImagePalette('call_management', mxResources.get('call_management'),
-		dir + '/call_management/', '_128x128.png', ['answer', 'hangup', 'dial',
-			'ext_dial', 'queue', 'voicemail', 'callback'
-		], [mxResources.get('answer'), mxResources.get('hangup'), mxResources.get(
-				'dial'), mxResources.get('ext_dial'), mxResources.get('queue'),
-			mxResources.get('voicemail'), mxResources.get('callback')
-		]);
-	this.addImagePalette('variable', mxResources.get('variable'), dir +
-		'/variable/', '_128x128.png', ['set', 'math'], [mxResources.get('set'),
-			mxResources.get('math')
-		]);
-	this.addImagePalette('playback', mxResources.get('playback'), dir +
-		'/playback/', '_128x128.png', ['playback', 'menu',
-			'saydigits', 'saynumber', 'sayphonetic', 'tts', 'ispeechtts', 'getdigits', 'getsecretdigits'
-		], [mxResources.get('playback'), mxResources
-			.get('menu'), mxResources.get('saydigits'), mxResources.get('saynumber'),
-			mxResources.get('sayphonetic'), mxResources.get('tts'), mxResources.get(
-				'ispeechtts'), mxResources.get('getdigits'), mxResources.get('getsecretdigits')
-		]);
-	this.addImagePalette('recording', mxResources.get('recording'), dir +
-		'/recording/', '_128x128.png', ['record'], [mxResources.get('record')]);
-	this.addImagePalette('integrationServer', mxResources.get('integrationServer'),
-		dir + '/integration_server/', '_128x128.png', ['database', 'ispeechasr',
-			'sendSMS', 'sendMail'
-		], [
-			mxResources.get('database'), mxResources.get('ispeechasr'), mxResources.get(
-				'sendSMS'), mxResources.get(
-				'sendMail')
-		]);
-	this.addImagePalette('callflow', mxResources.get('callflow'), dir +
-		'/callflow/', '_128x128.png', ['gotoc', 'gotoif', 'gotoiftime', 'vswitch'], [
-			mxResources.get('gotoc'), mxResources.get('gotoif'), mxResources.get(
-				'gotoiftime'), mxResources.get('vswitch')
-		]);
-	this.addImagePalette('stats', mxResources.get('stats'), dir + '/stats/',
-		'_128x128.png', [
-			// 'queuelog',
-			'goal'
-		], [
-			// mxResources.get('queuelog'),
-			mxResources.get('goal')
-		]);
-	this.addImagePalette('general', mxResources.get('general'), dir + '/general/',
-		'_128x128.png', ['noop', 'system', 'agi', 'subproject', 'custom_app'], [
-			mxResources.get(
-				'noop'), mxResources.get('system'), mxResources.get('agi'), mxResources.get(
-				'subproject'), mxResources.get(
-				'custom_app')
-		]);
-
-};
-
-/**
- * Specifies if tooltips should be visible. Default is true.
- */
-Sidebar.prototype.enableTooltips = !mxClient.IS_TOUCH;
-
-/**
- * Specifies the delay for the tooltip. Default is 16 px.
- */
-Sidebar.prototype.tooltipBorder = 16;
-
-/**
- * Specifies the delay for the tooltip. Default is 3 px.
- */
-Sidebar.prototype.thumbBorder = 3;
-
-/**
- * Specifies the delay for the tooltip. Default is 300 ms.
- */
-Sidebar.prototype.tooltipDelay = 300;
-
-/**
- * Specifies if edges should be used as templates if clicked. Default is true.
- */
-Sidebar.prototype.installEdges = true;
-
-/**
- * Specifies the URL of the gear image.
- */
-Sidebar.prototype.gearImage = STENCIL_PATH + '/clipart/Gear_128x128.png';
-
-/**
- * Specifies the width of the thumbnails.
- */
-Sidebar.prototype.thumbWidth = 34;
-
-/**
- * Specifies the height of the thumbnails.
- */
-Sidebar.prototype.thumbHeight = 34;
-
-/**
- * Specifies the padding for the thumbnails. Default is 3.
- */
-Sidebar.prototype.thumbPadding = 2;
-
-/**
- * Specifies the size of the sidebar titles.
- */
-Sidebar.prototype.sidebarTitleSize = 9;
-
-/**
- * Specifies if titles in the sidebar should be enabled.
- */
-Sidebar.prototype.sidebarTitles = false;
-
-/**
- * Specifies if titles in the tooltips should be enabled.
- */
-Sidebar.prototype.tooltipTitles = false;
-
-/**
- * Adds all palettes to the sidebar.
- */
-Sidebar.prototype.showTooltip = function(elt, cells, title, showLabel) {
-	if (this.enableTooltips && this.showTooltips) {
-		if (this.currentElt != elt) {
-			if (this.thread != null) {
-				window.clearTimeout(this.thread);
-				this.thread = null;
-			}
-
-			var show = mxUtils.bind(this, function() {
-				// Lazy creation of the DOM nodes and graph instance
-				if (this.tooltip == null) {
-					this.tooltip = document.createElement('div');
-					this.tooltip.className = 'geSidebarTooltip';
-					document.body.appendChild(this.tooltip);
-
-					this.graph2 = new Graph(this.tooltip, null, null, this.editorUi.editor.graph
-						.getStylesheet());
-					this.graph2.view.setTranslate(this.tooltipBorder, this.tooltipBorder);
-					this.graph2.resetViewOnRootChange = false;
-					this.graph2.foldingEnabled = false;
-					this.graph2.autoScroll = false;
-					this.graph2.setTooltips(false);
-					this.graph2.setConnectable(false);
-					this.graph2.setEnabled(false);
-
-					if (!mxClient.IS_SVG) {
-						this.graph2.view.canvas.style.position = 'relative';
-					}
-
-					this.tooltipImage = mxUtils.createImage(IMAGE_PATH + '/tooltip.png');
-					this.tooltipImage.style.position = 'absolute';
-					this.tooltipImage.style.width = '14px';
-					this.tooltipImage.style.height = '27px';
-
-					document.body.appendChild(this.tooltipImage);
-				}
-
-				this.tooltip.style.display = 'block';
-				this.graph2.labelsVisible = (showLabel == null || showLabel);
-				this.graph2.model.clear();
-				this.graph2.addCells(cells);
-
-				var bounds = this.graph2.getGraphBounds();
-				var width = bounds.width + 2 * this.tooltipBorder;
-				var height = bounds.height + 2 * this.tooltipBorder;
-
-				if (mxClient.IS_QUIRKS) {
-					width += 4;
-					height += 4;
-					this.tooltip.style.overflow = 'hidden';
-				} else {
-					this.tooltip.style.overflow = 'visible';
-				}
-
-				this.tooltipImage.style.visibility = 'visible';
-				this.tooltip.style.width = width + 'px';
-
-				// Adds title for entry
-				if (this.tooltipTitles && title != null && title.length > 0) {
-					if (this.tooltipTitle == null) {
-						this.tooltipTitle = document.createElement('div');
-						this.tooltipTitle.style.borderTop = '1px solid gray';
-						this.tooltipTitle.style.textAlign = 'center';
-						this.tooltipTitle.style.width = '100%';
-
-						// Oversize titles are cut-off currently. Should make tooltip wider later.
-						this.tooltipTitle.style.overflow = 'hidden';
-
-						if (mxClient.IS_SVG) {
-							this.tooltipTitle.style.paddingTop = '2px';
-						} else {
-							this.tooltipTitle.style.position = 'absolute';
-							this.tooltipTitle.style.paddingTop = '6px';
-						}
-
-						this.tooltip.appendChild(this.tooltipTitle);
-					} else {
-						this.tooltipTitle.innerHTML = '';
-					}
-
-					this.tooltipTitle.style.display = '';
-					mxUtils.write(this.tooltipTitle, title);
-
-					var dy = this.tooltipTitle.offsetHeight + 10;
-					height += dy;
-
-					if (mxClient.IS_SVG) {
-						this.tooltipTitle.style.marginTop = (-dy) + 'px';
-					} else {
-						height -= 6;
-						this.tooltipTitle.style.top = (height - dy) + 'px';
-					}
-				} else if (this.tooltipTitle != null && this.tooltipTitle.parentNode !=
-					null) {
-					this.tooltipTitle.style.display = 'none';
-				}
-
-				this.tooltip.style.height = height + 'px';
-				var x0 = -Math.min(0, bounds.x - this.tooltipBorder);
-				var y0 = -Math.min(0, bounds.y - this.tooltipBorder);
-
-				var left = this.container.clientWidth + this.editorUi.splitSize + 3;
-				var top = Math.max(0, (this.container.offsetTop + elt.offsetTop - this.container
-					.scrollTop - height / 2 + 16));
-
-				if (mxClient.IS_SVG) {
-					this.graph2.view.canvas.setAttribute('transform', 'translate(' + x0 +
-						',' + y0 + ')');
-				} else {
-					this.graph2.view.drawPane.style.left = x0 + 'px';
-					this.graph2.view.drawPane.style.top = y0 + 'px';
-				}
-
-				// Workaround for ignored position CSS style in IE9
-				// (changes to relative without the following line)
-				// Added width of the page-sidebar
-				left += document.getElementById('page-sidebar').offsetWidth;
-				// Added static height of the page-navbar
-				top += 90;
-
-				this.tooltip.style.position = 'absolute';
-				this.tooltip.style.left = left + 'px';
-				this.tooltip.style.top = top + 'px';
-				this.tooltipImage.style.left = (left - 13) + 'px';
-				this.tooltipImage.style.top = (top + height / 2 - 13) + 'px';
-			});
-
-			if (this.tooltip != null && this.tooltip.style.display != 'none') {
-				show();
-			} else {
-				this.thread = window.setTimeout(show, this.tooltipDelay);
-			}
-
-			this.currentElt = elt;
-		}
-	}
-};
-
-/**
- * Hides the current tooltip.
- */
-Sidebar.prototype.hideTooltip = function() {
-	if (this.thread != null) {
-		window.clearTimeout(this.thread);
-		this.thread = null;
-	}
-
-	if (this.tooltip != null) {
-		this.tooltip.style.display = 'none';
-		this.tooltipImage.style.visibility = 'hidden';
-		this.currentElt = null;
-	}
-};
-
-/**
- * Creates and returns the given title element.
- */
-Sidebar.prototype.createTitle = function(label) {
-	var elt = document.createElement('a');
-	elt.setAttribute('href', 'javascript:void(0);');
-	elt.className = 'geTitle';
-	mxUtils.write(elt, label);
-
-	return elt;
-};
-
-/**
- * Creates a thumbnail for the given cells.
- */
-Sidebar.prototype.createThumb = function(cells, width, height, parent, title,
-	showLabel) {
-	this.graph.labelsVisible = (showLabel == null || showLabel);
-	this.graph.view.scaleAndTranslate(1, 0, 0);
-	this.graph.addCells(cells);
-	var bounds = this.graph.getGraphBounds();
-	var corr = this.thumbBorder;
-	var s = Math.min((width - 2) / (bounds.width - bounds.x + corr), (height - 2) /
-		(bounds.height - bounds.y + corr));
-	var x0 = -Math.min(bounds.x, 0);
-	var y0 = -Math.min(bounds.y, 0);
-	this.graph.view.scaleAndTranslate(s, x0, y0);
-
-	bounds = this.graph.getGraphBounds();
-	var dx = Math.max(0, Math.floor((width - bounds.width - bounds.x) / 2));
-	var dy = Math.max(0, Math.floor((height - bounds.height - bounds.y) / 2));
-
-	var node = null;
-
-	// For supporting HTML labels in IE9 standards mode the container is cloned instead
-	if (this.graph.dialect == mxConstants.DIALECT_SVG && !mxClient.NO_FO) {
-		node = this.graph.view.getCanvas().ownerSVGElement.cloneNode(true);
-	}
-	// LATER: Check if deep clone can be used for quirks if container in DOM
-	else {
-		node = this.graph.container.cloneNode(false);
-		node.innerHTML = this.graph.container.innerHTML;
-	}
-
-	this.graph.getModel().clear();
-
-	// Catch-all event handling
-	if (mxClient.IS_IE6) {
-		parent.style.backgroundImage = 'url(' + this.editorUi.editor.transparentImage +
-			')';
-	}
-
-	var dd = 3;
-	node.style.position = 'relative';
-	node.style.overflow = 'hidden';
-	node.style.cursor = 'pointer';
-	node.style.left = (dx + dd) + 'px';
-	node.style.top = (dy + dd) + 'px';
-	node.style.width = width + 'px';
-	node.style.height = height + 'px';
-	node.style.visibility = '';
-	node.style.minWidth = '';
-	node.style.minHeight = '';
-
-	parent.appendChild(node);
-
-	// Adds title for sidebar entries
-	if (this.sidebarTitles && title != null) {
-		var border = (mxClient.IS_QUIRKS) ? 2 * this.thumbPadding + 2 : 0;
-		parent.style.height = (this.thumbHeight + border + this.sidebarTitleSize + 8) +
-			'px';
-
-		var div = document.createElement('div');
-		div.style.fontSize = this.sidebarTitleSize + 'px';
-		div.style.textAlign = 'center';
-		div.style.whiteSpace = 'nowrap';
-
-		if (mxClient.IS_IE) {
-			div.style.height = (this.sidebarTitleSize + 12) + 'px';
-		}
-
-		div.style.paddingTop = '4px';
-		mxUtils.write(div, title);
-		parent.appendChild(div);
-	}
-};
-
-/**
- * Creates and returns a new palette item for the given image.
- */
-Sidebar.prototype.createItem = function(cells, title, showLabel) {
-	var elt = document.createElement('a');
-	elt.setAttribute('href', 'javascript:void(0);');
-	elt.className = 'geItem';
-	elt.style.overflow = 'hidden';
-	var border = (mxClient.IS_QUIRKS) ? 8 + 2 * this.thumbPadding : 6;
-	elt.style.width = (this.thumbWidth + border) + 'px';
-	elt.style.height = (this.thumbHeight + border) + 'px';
-	elt.style.padding = this.thumbPadding + 'px';
-
-	// Blocks default click action
-	mxEvent.addListener(elt, 'click', function(evt) {
-		mxEvent.consume(evt);
-	});
-
-	this.createThumb(cells, this.thumbWidth, this.thumbHeight, elt, title,
-		showLabel);
-
-	return elt;
-};
-
-/**
- * Creates a drop handler for inserting the given cells.
- */
-Sidebar.prototype.createDropHandler = function(cells, allowSplit) {
-	return function(graph, evt, target, x, y) {
-		if (graph.isEnabled()) {
-			cells = graph.getImportableCells(cells);
-
-			if (cells.length > 0) {
-				var validDropTarget = (target != null) ?
-					graph.isValidDropTarget(target, cells, evt) : false;
-				var select = null;
-
-				if (target != null && !validDropTarget) {
-					target = null;
-				}
-
-				// Splits the target edge or inserts into target group
-				if (allowSplit && graph.isSplitEnabled() && graph.isSplitTarget(target,
-						cells, evt)) {
-					graph.splitEdge(target, cells, null, x, y);
-					select = cells;
-				} else if (cells.length > 0) {
-					select = graph.importCells(cells, x, y, target);
-				}
-
-				if (select != null && select.length > 0) {
-					graph.scrollCellToVisible(select[0]);
-					graph.setSelectionCells(select);
-				}
-			}
-		}
-	};
-};
-
-/**
- * Creates and returns a preview element for the given width and height.
- */
-Sidebar.prototype.createDragPreview = function(width, height) {
-	var elt = document.createElement('div');
-	elt.style.border = '1px dashed black';
-	elt.style.width = width + 'px';
-	elt.style.height = height + 'px';
-
-	return elt;
-};
-
-/**
- * Creates a drag source for the given element.
- */
-Sidebar.prototype.createDragSource = function(elt, dropHandler, preview) {
-	var dragSource = mxUtils.makeDraggable(elt, this.editorUi.editor.graph,
-		dropHandler,
-		preview, 0, 0, this.editorUi.editor.graph.autoscroll, true, true);
-
-	// Allows drop into cell only if target is a valid root
-	dragSource.getDropTarget = function(graph, x, y) {
-		var target = mxDragSource.prototype.getDropTarget.apply(this, arguments);
-
-		if (!graph.isValidRoot(target)) {
-			target = null;
-		}
-
-		return target;
-	};
-
-	return dragSource;
-};
-
-/**
- * Adds a handler for inserting the cell with a single click.
- */
-Sidebar.prototype.addClickHandler = function(elt, ds) {
-	var graph = this.editorUi.editor.graph;
-	var first = null;
-
-	mxEvent.addGestureListeners(elt, function(evt) {
-		first = new mxPoint(mxEvent.getClientX(evt), mxEvent.getClientY(evt));
-	});
-
-	var oldMouseUp = ds.mouseUp;
-	ds.mouseUp = function(evt) {
-		if (!mxEvent.isPopupTrigger(evt) && this.currentGraph == null && first !=
-			null) {
-			var tol = graph.tolerance;
-
-			if (Math.abs(first.x - mxEvent.getClientX(evt)) <= tol &&
-				Math.abs(first.y - mxEvent.getClientY(evt)) <= tol) {
-				var gs = graph.getGridSize();
-				ds.drop(graph, evt, null, gs, gs);
-			}
-		}
-
-		oldMouseUp.apply(this, arguments);
-		first = null;
-	};
-};
-
-/**
- * Giuseppe Careri
- * Create xml document vertex
- */
-Sidebar.prototype.createXmlDocument = function(element, label, variables,
-	values) {
-	var doc = mxUtils.createXmlDocument();
-	var node = doc.createElement(element)
-	node.setAttribute('label', label);
-
-	variables.forEach(function(variable, index) {
-		node.setAttribute(variable, values[index] ? values[index] : '');
-	});
-
-	return node;
-}
-
-/**
- * Giuseppe Careri
- * Creates a drop handler for inserting the given cells.
- */
-Sidebar.prototype.createVertexTemplate = function(style, width, height, value,
-	title, showLabel) {
-	var variables = [];
-	var values = [];
-
-	switch (value) {
-		case 'answer':
-			break;
-		case 'start':
-			variables = ['answer'];
-			values = ['yes'];
-			break;
-		case 'ispeechasr':
-			variables = ['key', 'model', 'ispeech_asr_language', 'timeout', 'intKey',
-				'beep'
-			];
-			values = ['', 0, 'it-IT', 1, '#', true];
-			break;
-		case 'playback':
-			variables = ['file_id', 'opts'];
-			values = ['0'];
-			break;
-		case 'background':
-			variables = ['file_id', 'response', 'digit'];
-			values = ['0', '5', '1'];
-			break;
-		case 'menu':
-			variables = ['file_id', 'response', 'digit', 'retry', 'variable_id'];
-			values = ['0', '5', '1', '1', '0'];
-			break;
-		case 'getdigits':
-			variables = ['file_id', 'response', 'mindigit', 'maxdigit', 'retry',
-				'variable_id'
-			];
-			values = ['0', '5', '1', '10', '1', '0'];
-			break;
-		case 'getsecretdigits':
-			variables = ['file_id', 'response', 'mindigit', 'maxdigit', 'retry', 'hiddendigitsnum', 'hiddendigitspos',
-				'variable_id'
-			];
-			values = ['0', '5', '1', '10', '1', '0', 'first', '0'];
-			break;
-		case 'custom_app':
-			variables = ['application', 'options'];
-			values = ['', ''];
-			break;
-		case 'set':
-			variables = ['variable_id', 'variable_value'];
-			values = ['0', ''];
-			break;
-		case 'database':
-			variables = ['odbc_id', 'query', 'variable_id'];
-			values = ['0', '', '0'];
-			break;
-		case 'noop':
-			variables = ['output'];
-			values = [];
-			break;
-		case 'gotoc':
-			variables = ['context', 'extension'];
-			values = [];
-			break;
-		case 'system':
-			variables = ['variable_id', 'command'];
-			values = [];
-			break;
-		case 'agi':
-			variables = ['args', 'command'];
-			values = [];
-			break;
-		case 'gotoif':
-			variables = ['condition'];
-			values = [];
-			break;
-		case 'gotoiftime':
-			variables = ['interval_id'];
-			values = ['0'];
-			break;
-		case 'gotoifmultitime':
-			variables = ['interval_id'];
-			values = ['0'];
-			break;
-		case 'vswitch':
-			variables = ['variable_id'];
-			values = ['0'];
-			break;
-		case 'saydigits':
-			variables = ['digits', 'escape_digits'];
-			values = ['', '#'];
-			break;
-		case 'saynumber':
-			variables = ['number', 'escape_digits'];
-			values = ['', '#'];
-			break;
-		case 'sayphonetic':
-			variables = ['text', 'escape_digits'];
-			values = ['', '#'];
-			break;
-		case 'record':
-			variables = ['file', 'recordingFormat', 'timeout', 'escape_digits'];
-			values = ['', 'wav', '-1', '#'];
-			break;
-		case 'dial':
-			variables = ['sip_id', 'timeout', 'custom_app', 'url'];
-			values = ['0', '60'];
-			break;
-		case 'ext_dial':
-			variables = ['phone', 'trunk_name', 'timeout', 'opts', 'url'];
-			values = ['', '-1', '60'];
-			break;
-		case 'tts':
-			variables = ['text', 'google_tts_language'];
-			values = ['', 'it'];
-			break;
-		case 'ispeechtts':
-			variables = ['text', 'key', 'ispeech_tts_language', 'speed', 'intKey'];
-			values = ['', '', 'euritalianfemale', '0', '#'];
-			break;
-		case 'queue':
-			variables = ['queue_id', 'opts', 'url', 'file_id', 'timeout', 'agi',
-				'macro', 'gosub', 'position'
-			];
-			values = ['-1', '', '', '0', '300'];
-			break;
-		case 'voicemail':
-			variables = ['mailbox', 'options'];
-			values = ['', ''];
-			break;
-		case 'subproject':
-			variables = ['project_id'];
-			values = ['0'];
-			break;
-		case 'math':
-			variables = ['operation', 'variable_id'];
-			values = ['', '0'];
-			break;
-		case 'queuelog':
-			variables = ['queuename', 'agent', 'queue_event', 'data1', 'data2', 'data3',
-				'data4', 'data5'
-			];
-			values = [];
-			break;
-		case 'goal':
-			variables = ['goalname'];
-			values = [];
-			break;
-		case 'callback':
-			variables = ['name', 'phone', 'list_id', 'delay'];
-			values = ['', '{CALLERID(num)}', '0', '5'];
-			break;
-		case 'sendSMS':
-			variables = ['account_id', 'to', 'sms_text'];
-			values = ['0'];
-			break;
-		case 'sendMail':
-			variables = ['account_id', 'template_id', 'to', 'cc', 'subject', 'text'];
-			values = ['0'];
-			break;
-
-		default:
-			variables = [];
-			values = [];
-			break;
-	}
-
-	var node = this.createXmlDocument(value, title, variables, values);
-
-	//var cells = [new mxCell((value != null) ? value : '', new mxGeometry(0, 0, width, height), style)];
-	var cells = [new mxCell(node, new mxGeometry(0, 0, width, height), style)];
-	cells[0].vertex = true;
-
-	return this.createVertexTemplateFromCells(cells, width, height, title,
-		showLabel);
-};
-
-/**
- * Creates a drop handler for inserting the given cells.
- */
-Sidebar.prototype.createVertexTemplateFromCells = function(cells, width, height,
-	title, showLabel) {
-	var elt = this.createItem(cells, title, showLabel);
-	var ds = this.createDragSource(elt, this.createDropHandler(cells, true), this
-		.createDragPreview(width, height));
-	this.addClickHandler(elt, ds);
-
-	// Uses guides for vertices only if enabled in graph
-	ds.isGuidesEnabled = mxUtils.bind(this, function() {
-		return this.editorUi.editor.graph.graphHandler.guidesEnabled;
-	});
-
-	// Shows a tooltip with the rendered cell
-	if (!touchStyle) {
-		mxEvent.addListener(elt, 'mousemove', mxUtils.bind(this, function(evt) {
-			this.showTooltip(elt, cells, title, showLabel);
-		}));
-	}
-
-	return elt;
-};
-
-/**
- * Creates a drop handler for inserting the given cells.
- */
-Sidebar.prototype.createEdgeTemplate = function(style, width, height, value,
-	title, showLabel) {
-	var cells = [new mxCell((value != null) ? value : '', new mxGeometry(0, 0,
-		width, height), style)];
-	cells[0].geometry.setTerminalPoint(new mxPoint(0, height), true);
-	cells[0].geometry.setTerminalPoint(new mxPoint(width, 0), false);
-	cells[0].geometry.relative = true;
-	cells[0].edge = true;
-
-	return this.createEdgeTemplateFromCells(cells, width, height, title,
-		showLabel);
-};
-
-/**
- * Creates a drop handler for inserting the given cells.
- */
-Sidebar.prototype.createEdgeTemplateFromCells = function(cells, width, height,
-	title, showLabel) {
-	var elt = this.createItem(cells, title, showLabel);
-	this.createDragSource(elt, this.createDropHandler(cells, false), this.createDragPreview(
-		width, height));
-
-	// Installs the default edge
-	var graph = this.editorUi.editor.graph;
-	mxEvent.addListener(elt, 'click', mxUtils.bind(this, function(evt) {
-		if (this.installEdges) {
-			graph.setDefaultEdge(cells[0]);
-		}
-
-		// Highlights the entry for 200ms
-		elt.style.backgroundColor = '#ffffff';
-
-		window.setTimeout(function() {
-			elt.style.backgroundColor = '';
-		}, 300);
-
-		mxEvent.consume(evt);
-	}));
-
-	// Shows a tooltip with the rendered cell
-	if (!touchStyle) {
-		mxEvent.addListener(elt, 'mousemove', mxUtils.bind(this, function(evt) {
-			this.showTooltip(elt, cells, title, showLabel);
-		}));
-	}
-
-	return elt;
-};
-
-/**
- * Adds the given palette.
- */
-Sidebar.prototype.addPalette = function(id, title, expanded, onInit) {
-	var elt = this.createTitle(title);
-	this.container.appendChild(elt);
-
-	var div = document.createElement('div');
-	div.className = 'geSidebar';
-
-	if (expanded) {
-		onInit(div);
-		onInit = null;
-	} else {
-		div.style.display = 'none';
-	}
-
-	this.addFoldingHandler(elt, div, onInit);
-
-	var outer = document.createElement('div');
-	outer.appendChild(div);
-	this.container.appendChild(outer);
-
-	// Keeps references to the DOM nodes
-	if (id != null) {
-		this.palettes[id] = [elt, outer];
-	}
-};
-
-/**
- * Create the given title element.
- */
-Sidebar.prototype.addFoldingHandler = function(title, content, funct) {
-	var initialized = false;
-
-	title.style.backgroundImage = (content.style.display == 'none') ?
-		'url(' + IMAGE_PATH + '/collapsed.gif)' : 'url(' + IMAGE_PATH +
-		'/expanded.gif)';
-	title.style.backgroundRepeat = 'no-repeat';
-	title.style.backgroundPosition = '100% 50%';
-
-	mxEvent.addListener(title, 'click', function(evt) {
-		if (content.style.display == 'none') {
-			if (!initialized) {
-				initialized = true;
-
-				if (funct != null) {
-					title.style.cursor = 'wait';
-					window.setTimeout(function() {
-						funct(content);
-						title.style.cursor = '';
-					}, 0);
-				}
-			}
-
-			title.style.backgroundImage = 'url(' + IMAGE_PATH + '/expanded.gif)';
-			content.style.display = 'block';
-		} else {
-			title.style.backgroundImage = 'url(' + IMAGE_PATH + '/collapsed.gif)';
-			content.style.display = 'none';
-		}
-
-		mxEvent.consume(evt);
-	});
-};
-
-/**
- * Removes the palette for the given ID.
- */
-Sidebar.prototype.removePalette = function(id) {
-	var elts = this.palettes[id];
-
-	if (elts != null) {
-		this.palettes[id] = null;
-
-		for (var i = 0; i < elts.length; i++) {
-			this.container.removeChild(elts[i]);
-		}
-
-		return true;
-	}
-
-	return false;
-};
-
-/**
- * Adds the given image palette.
- */
-Sidebar.prototype.addImagePalette = function(id, title, prefix, postfix, items,
-	titles) {
-	// Giuseppe Careri
-	// Expanded Sidebar only entry
-	this.addPalette(id, title, (id === 'entry'), mxUtils.bind(this, function(
-		content) {
-		var showTitles = titles != null;
-
-		for (var i = 0; i < items.length; i++) {
-			var icon = prefix + items[i] + postfix;
-			content.appendChild(this.createVertexTemplate('image;image=' + icon, 80,
-				80, items[i], (showTitles) ? titles[i] : null, showTitles));
-		}
-	}));
-};
\ No newline at end of file
diff --git a/public/assets/plugins/square/js/Toolbar.js b/public/assets/plugins/square/js/Toolbar.js
index 7eab562..6186b70 100644
--- a/public/assets/plugins/square/js/Toolbar.js
+++ b/public/assets/plugins/square/js/Toolbar.js
@@ -1,407 +1 @@
-/**
- * $Id: Toolbar.js,v 1.3 2013-02-20 16:21:29 gaudenz Exp $
- * Copyright (c) 2006-2012, JGraph Ltd
- */
-/**
- * Construcs a new toolbar for the given editor.
- */
-function Toolbar(editorUi, container)
-{
-	this.editorUi = editorUi;
-	this.container = container;
-	this.init();
-
-	// Global handler to hide the current menu
-	mxEvent.addGestureListeners(document, mxUtils.bind(this, function(evt)
-	{
-		this.hideMenu();
-	}));
-};
-
-/**
- * Adds the toolbar elements.
- */
-Toolbar.prototype.init = function()
-{
-	this.addItems(['save', 'publish', '-', 'print', 'undo', 'redo', '-', 'copy', 'cut', 'paste', 'delete', '-', 'duplicate', '-', 'actualSize', 'zoomIn', 'zoomOut', '-']);
-	var fontElt = this.addMenu('Helvetica', mxResources.get('fontFamily'), true, 'fontFamily');
-	fontElt.style.whiteSpace = 'nowrap';
-	fontElt.style.overflow = 'hidden';
-	fontElt.style.width = '70px';
-	this.addSeparator();
-	var sizeElt = this.addMenu('12', mxResources.get('fontSize'), true, 'fontSize');
-	sizeElt.style.whiteSpace = 'nowrap';
-	sizeElt.style.overflow = 'hidden';
-	sizeElt.style.width = '30px';
-
-	this.addItems(['-', 'bold', 'italic', 'underline']);
-	// Giuseppe Careri
-	// var align = this.addMenuFunction('geSprite-left', mxResources.get('align'), false, mxUtils.bind(this, function(menu)
-	// {
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ALIGN], [mxConstants.ALIGN_LEFT], 'geIcon geSprite geSprite-left', null).setAttribute('title', mxResources.get('left'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ALIGN], [mxConstants.ALIGN_CENTER], 'geIcon geSprite geSprite-center', null).setAttribute('title', mxResources.get('center'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ALIGN], [mxConstants.ALIGN_RIGHT], 'geIcon geSprite geSprite-right', null).setAttribute('title', mxResources.get('right'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_VERTICAL_ALIGN], [mxConstants.ALIGN_TOP], 'geIcon geSprite geSprite-top', null).setAttribute('title', mxResources.get('top'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_VERTICAL_ALIGN], [mxConstants.ALIGN_MIDDLE], 'geIcon geSprite geSprite-middle', null).setAttribute('title', mxResources.get('middle'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_VERTICAL_ALIGN], [mxConstants.ALIGN_BOTTOM], 'geIcon geSprite geSprite-bottom', null).setAttribute('title', mxResources.get('bottom'));
-	// }));
-	// this.addItems(['fontColor', '-']);
-	// var line = this.addMenuFunction('geSprite-straight', mxResources.get('line'), false, mxUtils.bind(this, function(menu)
-	// {
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_EDGE], [null], 'geIcon geSprite geSprite-straight', null).setAttribute('title', mxResources.get('straight'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_EDGE], ['entityRelationEdgeStyle'], 'geIcon geSprite geSprite-entity', null).setAttribute('title', mxResources.get('entityRelation'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_ELBOW], ['elbowEdgeStyle', 'horizontal'], 'geIcon geSprite geSprite-helbow', null).setAttribute('title', mxResources.get('horizontal'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_EDGE, mxConstants.STYLE_ELBOW], ['elbowEdgeStyle', 'vertical'], 'geIcon geSprite geSprite-velbow', null).setAttribute('title', mxResources.get('vertical'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_EDGE], ['segmentEdgeStyle'], 'geIcon geSprite geSprite-segment', null).setAttribute('title', mxResources.get('manual'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_EDGE], ['orthogonalEdgeStyle'], 'geIcon geSprite geSprite-orthogonal', null).setAttribute('title', mxResources.get('automatic'));
-	// }));
-	// var linestart = this.addMenuFunction('geSprite-startclassic', mxResources.get('lineend'), false, mxUtils.bind(this, function(menu)
-	// {
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.NONE, 0], 'geIcon geSprite geSprite-noarrow', null).setAttribute('title', mxResources.get('none'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_CLASSIC, 1], 'geIcon geSprite geSprite-startclassic', null).setAttribute('title', mxResources.get('classic'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_OPEN, 1], 'geIcon geSprite geSprite-startopen', null).setAttribute('title', mxResources.get('openArrow'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_BLOCK, 1], 'geIcon geSprite geSprite-startblock', null).setAttribute('title', mxResources.get('block'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_OVAL, 1], 'geIcon geSprite geSprite-startoval', null).setAttribute('title', mxResources.get('oval'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_DIAMOND, 1], 'geIcon geSprite geSprite-startdiamond', null).setAttribute('title', mxResources.get('diamond'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_DIAMOND_THIN, 1], 'geIcon geSprite geSprite-startthindiamond', null).setAttribute('title', mxResources.get('diamondThin'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_CLASSIC, 0], 'geIcon geSprite geSprite-startclassictrans', null).setAttribute('title', mxResources.get('classic'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_BLOCK, 0], 'geIcon geSprite geSprite-startblocktrans', null).setAttribute('title', mxResources.get('block'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_OVAL, 0], 'geIcon geSprite geSprite-startovaltrans', null).setAttribute('title', mxResources.get('oval'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_DIAMOND, 0], 'geIcon geSprite geSprite-startdiamondtrans', null).setAttribute('title', mxResources.get('diamond'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_STARTARROW, 'startFill'], [mxConstants.ARROW_DIAMOND_THIN, 0], 'geIcon geSprite geSprite-startthindiamondtrans', null).setAttribute('title', mxResources.get('diamondThin'));
-	// }));
-	// var lineend = this.addMenuFunction('geSprite-endclassic', mxResources.get('lineend'), false, mxUtils.bind(this, function(menu)
-	// {
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.NONE, 0], 'geIcon geSprite geSprite-noarrow', null).setAttribute('title', mxResources.get('none'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_CLASSIC, 1], 'geIcon geSprite geSprite-endclassic', null).setAttribute('title', mxResources.get('classic'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_OPEN, 1], 'geIcon geSprite geSprite-endopen', null).setAttribute('title', mxResources.get('openArrow'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_BLOCK, 1], 'geIcon geSprite geSprite-endblock', null).setAttribute('title', mxResources.get('block'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_OVAL, 1], 'geIcon geSprite geSprite-endoval', null).setAttribute('title', mxResources.get('oval'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_DIAMOND, 1], 'geIcon geSprite geSprite-enddiamond', null).setAttribute('title', mxResources.get('diamond'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_DIAMOND_THIN, 1], 'geIcon geSprite geSprite-endthindiamond', null).setAttribute('title', mxResources.get('diamondThin'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_CLASSIC, 0], 'geIcon geSprite geSprite-endclassictrans', null).setAttribute('title', mxResources.get('classic'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_BLOCK, 0], 'geIcon geSprite geSprite-endblocktrans', null).setAttribute('title', mxResources.get('block'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_OVAL, 0], 'geIcon geSprite geSprite-endovaltrans', null).setAttribute('title', mxResources.get('oval'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_DIAMOND, 0], 'geIcon geSprite geSprite-enddiamondtrans', null).setAttribute('title', mxResources.get('diamond'));
-	// 	this.editorUi.menus.styleChange(menu, '', [mxConstants.STYLE_ENDARROW, 'endFill'], [mxConstants.ARROW_DIAMOND_THIN, 0], 'geIcon geSprite geSprite-endthindiamondtrans', null).setAttribute('title', mxResources.get('diamondThin'));
-	// }));
-	// this.addItems(['-', 'strokeColor', 'image', 'fillColor']);
-	// this.addItem('geSprite-gradientcolor', 'gradientColor').setAttribute('title', mxResources.get('gradient'));
-	// this.addItems(['shadow']);
-
-	var graph = this.editorUi.editor.graph;
-
-	// Update font size and font family labels
-	var update = mxUtils.bind(this, function()
-	{
-		var ff = 'Helvetica';
-		var fs = '12';
-    	var state = graph.getView().getState(graph.getSelectionCell());
-
-    	if (state != null)
-    	{
-    		ff = state.style[mxConstants.STYLE_FONTFAMILY] || ff;
-    		fs = state.style[mxConstants.STYLE_FONTSIZE] || fs;
-
-    		if (ff.length > 10)
-    		{
-    			ff = ff.substring(0, 8) + '...';
-    		}
-
-    		fontElt.innerHTML = ff;
-    		sizeElt.innerHTML = fs;
-    	}
-	});
-
-    graph.getSelectionModel().addListener(mxEvent.CHANGE, update);
-    graph.getModel().addListener(mxEvent.CHANGE, update);
-
-	// Giuseppe Careri
-	// Updates button states
-  //this.addEdgeSelectionHandler([line, linestart, lineend]);
-	//this.addSelectionHandler([align]);
-};
-
-/**
- * Hides the current menu.
- */
-Toolbar.prototype.hideMenu = function()
-{
-	if (this.currentMenu != null)
-	{
-		this.currentMenu.hideMenu();
-		this.currentMenu.destroy();
-		this.currentMenu = null;
-	}
-};
-
-/**
- * Adds a label to the toolbar.
- */
-Toolbar.prototype.addMenu = function(label, tooltip, showLabels, name)
-{
-	var menu = this.editorUi.menus.get(name);
-	var elt = this.addMenuFunction(label, tooltip, showLabels, menu.funct);
-
-	menu.addListener('stateChanged', function()
-	{
-		elt.setEnabled(menu.enabled);
-	});
-
-	return elt;
-};
-
-/**
- * Adds a label to the toolbar.
- */
-Toolbar.prototype.addMenuFunction = function(label, tooltip, showLabels, funct)
-{
-	var elt = (showLabels) ? this.createLabel(label) : this.createButton(label);
-	this.initElement(elt, tooltip);
-	this.addMenuHandler(elt, showLabels, funct);
-	this.container.appendChild(elt);
-
-	return elt;
-};
-
-/**
- * Adds a separator to the separator.
- */
-Toolbar.prototype.addSeparator = function()
-{
-	var elt = document.createElement('div');
-	elt.className = 'geSeparator';
-	this.container.appendChild(elt);
-
-	return elt;
-};
-
-/**
- * Adds given action item
- */
-Toolbar.prototype.addItems = function(keys)
-{
-	for (var i = 0; i < keys.length; i++)
-	{
-		var key = keys[i];
-
-		if (key == '-')
-		{
-			this.addSeparator();
-		}
-		else
-		{
-			this.addItem('geSprite-' + key.toLowerCase(), key);
-		}
-	}
-};
-
-/**
- * Adds given action item
- */
-Toolbar.prototype.addItem = function(sprite, key)
-{
-	var action = this.editorUi.actions.get(key);
-	var elt = null;
-
-	if (action != null)
-	{
-		elt = this.addButton(sprite, action.label, action.funct);
-		elt.setEnabled(action.enabled);
-
-		action.addListener('stateChanged', function()
-		{
-			elt.setEnabled(action.enabled);
-		});
-	}
-
-	return elt;
-};
-
-/**
- * Adds a button to the toolbar.
- */
-Toolbar.prototype.addButton = function(classname, tooltip, funct)
-{
-	var elt = this.createButton(classname);
-
-	this.initElement(elt, tooltip);
-	this.addClickHandler(elt, funct);
-	this.container.appendChild(elt);
-
-	return elt;
-};
-
-/**
- * Updates the states of the given toolbar items based on the selection.
- */
-Toolbar.prototype.addSelectionHandler = function(items)
-{
-	var graph = this.editorUi.editor.graph;
-
-	var selectionListener = function()
-    {
-    	var selected = !graph.isSelectionEmpty();
-
-    	for (var i = 0; i < items.length; i++)
-    	{
-    		items[i].setEnabled(selected);
-    	}
-    };
-
-    graph.getSelectionModel().addListener(mxEvent.CHANGE, selectionListener);
-    selectionListener();
-};
-
-/**
- * Updates the states of the given toolbar items based on the selection.
- */
-Toolbar.prototype.addEdgeSelectionHandler = function(items)
-{
-	var graph = this.editorUi.editor.graph;
-
-	var selectionListener = function()
-    {
-		var edgeSelected = false;
-
-		if (!graph.isSelectionEmpty())
-		{
-			var cells = graph.getSelectionCells();
-
-			for (var i = 0; i < cells.length; i++)
-			{
-				if (graph.getModel().isEdge(cells[i]))
-				{
-					edgeSelected = true;
-					break;
-				}
-			}
-		}
-
-    	for (var i = 0; i < items.length; i++)
-    	{
-    		items[i].setEnabled(edgeSelected);
-    	}
-    };
-
-    graph.getSelectionModel().addListener(mxEvent.CHANGE, selectionListener);
-    selectionListener();
-};
-
-/**
- * Initializes the given toolbar element.
- */
-Toolbar.prototype.initElement = function(elt, tooltip)
-{
-	elt.setAttribute('tabindex', '0');
-
-	// Adds tooltip
-	if (tooltip != null)
-	{
-		elt.setAttribute('title', tooltip);
-	}
-
-	this.addEnabledState(elt);
-};
-
-/**
- * Adds enabled state with setter to DOM node (avoids JS wrapper).
- */
-Toolbar.prototype.addEnabledState = function(elt)
-{
-	var classname = elt.className;
-
-	elt.setEnabled = function(value)
-	{
-		elt.enabled = value;
-
-		if (value)
-		{
-			elt.className = classname;
-		}
-		else
-		{
-			elt.className = classname + ' geDisabled';
-		}
-	};
-
-	elt.setEnabled(true);
-};
-
-/**
- * Adds enabled state with setter to DOM node (avoids JS wrapper).
- */
-Toolbar.prototype.addClickHandler = function(elt, funct)
-{
-	if (funct != null)
-	{
-		mxEvent.addListener(elt, 'click', function(evt)
-		{
-			if (elt.enabled)
-			{
-				funct(evt);
-			}
-
-			mxEvent.consume(evt);
-		});
-	}
-};
-
-/**
- * Creates and returns a new button.
- */
-Toolbar.prototype.createButton = function(classname)
-{
-	var elt = document.createElement('a');
-	elt.setAttribute('href', 'javascript:void(0);');
-	elt.className = 'geButton';
-
-	var inner = document.createElement('div');
-	inner.className = 'geSprite ' + classname;
-	elt.appendChild(inner);
-
-	return elt;
-};
-
-/**
- * Creates and returns a new button.
- */
-Toolbar.prototype.createLabel = function(label, tooltip)
-{
-	var elt = document.createElement('a');
-	elt.setAttribute('href', 'javascript:void(0);');
-	elt.className = 'geLabel';
-	mxUtils.write(elt, label);
-
-	return elt;
-};
-
-/**
- * Adds a handler for showing a menu in the given element.
- */
-Toolbar.prototype.addMenuHandler = function(elt, showLabels, funct, showAll)
-{
-	if (funct != null)
-	{
-		var graph = this.editorUi.editor.graph;
-		var menu = null;
-
-		mxEvent.addListener(elt, 'click', mxUtils.bind(this, function(evt)
-		{
-			if (elt.enabled == null || elt.enabled)
-			{
-				graph.panningHandler.hideMenu();
-				menu = new mxPopupMenu(funct);
-				menu.div.className += ' geToolbarMenu';
-				menu.showDisabled = showAll;
-				menu.labels = showLabels;
-				menu.autoExpand = true;
-
-				menu.popup(elt.offsetLeft, elt.offsetTop + elt.offsetHeight + 34, null, evt);
-				this.currentMenu = menu;
-			}
-
-			mxEvent.consume(evt);
-		}));
-	}
-};
\ No newline at end of file
diff --git a/public/assets/plugins/square/js/custom.js b/public/assets/plugins/square/js/custom.js
index 761d95c..6726c18 100644
--- a/public/assets/plugins/square/js/custom.js
+++ b/public/assets/plugins/square/js/custom.js
@@ -1,307 +1 @@
-var urlParams = (function(url) {
-	var result = new Object();
-	var idx = url.lastIndexOf('?');
-
-	if (idx > 0) {
-		var params = url.substring(idx + 1).split('&');
-
-		for (var i = 0; i < params.length; i++) {
-			idx = params[i].indexOf('=');
-
-			if (idx > 0) {
-				result[params[i].substring(0, idx)] = params[i].substring(idx + 1);
-			}
-		}
-	}
-
-	return result;
-})(window.location.href);
-
-var t0 = new Date();
-
-// Public global variables
-var MAX_REQUEST_SIZE = 10485760;
-var MAX_WIDTH = 12000;
-var MAX_HEIGHT = 12000;
-
-// CUSTOM_PARAMETERS - URLs for save and export
-var EXPORT_URL = 'http://exp.draw.io/ImageExport2/export';
-var SHARE_HOST = 'http://localhost:3000';
-
-var SAVE_URL = 'api/square/projects/';
-var VARIABLE_URL = '/api/variables';
-
-// Paths and files
-var STENCIL_PATH = '/assets/plugins/square/stencils';
-var SHAPES_PATH = '/assets/plugins/square/shapes';
-var IMAGE_PATH = '/assets/plugins/mxgraph/images';
-// Path for images inside the diagram
-//var GRAPH_IMAGE_PATH = 'assets/plugins/mxgraph/img';
-//var ICONFINDER_PATH = 'iconfinder';
-var STYLE_PATH = '/assets/plugins/mxgraph/styles';
-var CSS_PATH = '/assets/plugins/mxgraph/styles';
-var OPEN_FORM = 'api/square/projects/open';
-var TEMPLATE_PATH = '/assets/plugins/square/templates';
-
-// Directory for i18 files and basename for main i18n file
-var RESOURCES_PATH = '/assets/plugins/square/resources';
-var RESOURCE_BASE = RESOURCES_PATH + '/dia';
-
-// Specifies connection mode for touch devices (at least one should be true)
-var tapAndHoldStartsConnection = true;
-var showConnectorImg = true;
-
-var mxLoadResources = false;
-var mxLanguage = 'en';
-console.log('custom', localStorage.getItem('NG_TRANSLATE_LANG_KEY'));
-switch (localStorage.getItem('NG_TRANSLATE_LANG_KEY')) {
-	case 'en_EN':
-		mxLanguage = 'en';
-		break;
-	case 'it':
-		mxLanguage = 'it';
-		break;
-	default:
-		mxLanguage = 'en';
-}
-console.log('mxLanguage', mxLanguage);
-
-var mxLanguages = ['ar', 'bs', 'cs', 'da', 'de', 'el', 'es', 'es-ar', 'fr',
-	'hu', 'id', 'it', 'ja', 'ko', 'nl', 'no', 'pl', 'pt-br', 'pt', 'ro', 'ru',
-	'sr', 'sv', 'th', 'tr', 'uk', 'zh'
-];
-var mxBasePath = 'assets/plugins/mxgraph';
-var geBasePath = 'assets/plugins/mxgraph/js';
-
-var ISPEECHLANG = {
-	usenglishfemale: 'US English Female',
-	usenglishmale: 'US English Male',
-	ukenglishfemale: 'UK English Female',
-	ukenglishmale: 'UK English Male',
-	auenglishfemale: 'Australian English',
-	usspanishfemale: 'US Spanish Female',
-	usspanishmale: 'US Spanish Male',
-	chchinesefemale: 'Chinese Female',
-	chchinesemale: 'Chinese Male',
-	hkchinesefemale: 'Hong Kong Cantonese Female',
-	twchinesefemale: 'Taiwan Chinese Female',
-	jpjapanesefemale: 'Japanese Female',
-	jpjapanesemale: 'Japanese Male',
-	krkoreanfemale: 'Korean Female',
-	krkoreanmale: 'Korean Male',
-	caenglishfemale: 'Canadian English Female',
-	huhungarianfemale: 'Hungarian Female',
-	brportuguesefemale: 'Brazilian Portuguese Female',
-	eurportuguesefemale: 'European Portuguese Female',
-	eurportuguesemale: 'European Portuguese Male',
-	eurspanishfemale: 'European Spanish Female',
-	eurspanishmale: 'European Spanish Male',
-	eurcatalanfemale: 'European Catalan Female',
-	eurczechfemale: 'European Czech Female',
-	eurdanishfemale: 'European Danish Female',
-	eurfinnishfemale: 'European Finnish Female',
-	eurfrenchfemale: 'European French Female',
-	eurfrenchmale: 'European French Male',
-	eurnorwegianfemale: 'European Norwegian Female',
-	eurdutchfemale: 'European Dutch Female',
-	eurpolishfemale: 'European Polish Female',
-	euritalianfemale: 'European Italian Female',
-	eurturkishfemale: 'European Turkish Female	',
-	eurturkishmale: 'European Turkish Male',
-	eurgermanfemale: 'European German Female',
-	eurgermanmale: 'European German Male',
-	rurussianfemale: 'Russian Female',
-	rurussianmale: 'Russian Male',
-	swswedishfemale: 'Swedish Female',
-	cafrenchfemale: 'Canadian French Female',
-	cafrenchmale: 'Canadian French Male'
-};
-var BOOLSELECT = {
-	'yes': 'Yes',
-	'no': 'No'
-};
-
-var ISPEECHASRLANG = {
-	'en-US': 'English (US)',
-	'en-CA': 'English (Canada)',
-	'en-GB': 'English (UK)',
-	'en-AU': 'English (Australia)',
-	'es-ES': 'Spanish (Spain)',
-	'es-MX': 'Spanish (Mexico)',
-	'it-IT': 'Italian (Italy) / Finnish (Finland)',
-	'fr-FR': 'French (France)',
-	'fr-CA': 'French (Canada)',
-	'pl-PL': 'Polish (Poland)',
-	'pt-PT': 'Portuguese (Portugal)',
-	'ca-ES': 'Catalan (Catalan)',
-	'zh-TW': 'Chinese (Taiwan)',
-	'da-DK': 'Danish (Denmark)',
-	'fr-FR': 'German (Germany)',
-	'ja-JP': 'Japanese (Japan)',
-	'ko-KR': 'Korean (Korea)',
-	'nl-NL': 'Dutch (Netherlands)',
-	'nb-NO': 'Norwegian (Norway)',
-	'pt-BR': 'Portuguese (Brazil)',
-	'ru-RU': 'Russian (Russia)',
-	'sv-SE': 'Swedish (Sweden)',
-	'zh-CN': 'Chinese (China)',
-	'zh-HK': 'Chinese (Hong Kong)'
-};
-
-var ISPEECHASRMODEL = {
-	0: 'Default',
-	date: 'Date',
-	usmoney: 'US Money',
-	numbersto9: 'Numbers to 9',
-	numbersto99: 'Numbers to 99',
-	numbersto999: 'Numbers to 999',
-	time: 'Time',
-	phonenumber: 'Phone number',
-	streets: 'Streets',
-	citystate: 'US City/States'
-};
-
-var ISPEECHBEEP = {
-	'BEEP': 'Yes',
-	'NOBEEP': 'No'
-};
-
-var RECORDINGFORMAT = {
-	'wav': 'wav',
-	'gsm': 'gsm'
-};
-
-var SECRETDIGITSPOS = {
-	'first': 'First',
-	'last': 'Last'
-};
-
-var ASRINTKEYS = {
-	'#': '#',
-	'*': '*'
-};
-
-var GOOGLETTSLANG = {
-	'af': 'Afrikaans',
-	'sq': 'Albanian',
-	'am': 'Amharic',
-	'ar': 'Arabic',
-	'hy': 'Armenian',
-	'az': 'Azerbaijani',
-	'eu': 'Basque',
-	'be': 'Belarusian',
-	'bn': 'Bengali',
-	'bh': 'Bihari',
-	'bs': 'Bosnian',
-	'br': 'Breton',
-	'bg': 'Bulgarian',
-	'km': 'Cambodian',
-	'ca': 'Catalan',
-	'zh-CN': 'Chinese (Simplified)',
-	'zh-TW': 'Chinese (Traditional)',
-	'co': 'Corsican',
-	'hr': 'Croatian',
-	'cs': 'Czech',
-	'da': 'Danish',
-	'nl': 'Dutch',
-	'en': 'English',
-	'eo': 'Esperanto',
-	'et': 'Estonian',
-	'fo': 'Faroese',
-	'tl': 'Filipino',
-	'fi': 'Finnish',
-	'fr': 'French',
-	'fy': 'Frisian',
-	'gl': 'Galician',
-	'ka': 'Georgian',
-	'de': 'German',
-	'el': 'Greek',
-	'gn': 'Guarani',
-	'gu': 'Gujarati',
-	'xx-hacker': 'Hacker',
-	'ha': 'Hausa',
-	'iw': 'Hebrew',
-	'hi': 'Hindi',
-	'hu': 'Hungarian',
-	'is': 'Icelandic',
-	'id': 'Indonesian',
-	'ia': 'Interlingua',
-	'ga': 'Irish',
-	'it': 'Italian',
-	'jw': 'Javanese',
-	'ja': 'Japanese',
-	'kn': 'Kannada',
-	'kk': 'Kazakh',
-	'rw': 'Kinyarwanda',
-	'rn': 'Kirundi',
-	'xx-klingon': 'Klingon',
-	'ku': 'Kurdish',
-	'ko': 'Korean',
-	'ky': 'Kyrgyz',
-	'lo': 'Laothian',
-	'la': 'Latin',
-	'lv': 'Latvian',
-	'ln': 'Lingala',
-	'lt': 'Lithuanian',
-	'mk': 'Macedonian',
-	'mg': 'Malagasy',
-	'ms': 'Malay',
-	'ml': 'Malayalam',
-	'mt': 'Maltese',
-	'mi': 'Maori',
-	'mr': 'Marathi',
-	'mo': 'Moldavian',
-	'mn': 'Mongolian',
-	'sr-ME': 'Montenegrin',
-	'ne': 'Nepali',
-	'no': 'Norwegian',
-	'nn': 'Norwegian (Nynorsk)',
-	'oc': 'Occitan',
-	'or': 'Oriya',
-	'om': 'Oromo',
-	'ps': 'Pashto',
-	'fa': 'Persian',
-	'xx-pirate': 'Pirate',
-	'pl': 'Polish',
-	'pt-BR': 'Portuguese (Brazil)',
-	'pt-PT': 'Portuguese (Portugal)',
-	'pa': 'Punjabi',
-	'qu': 'Quechua',
-	'ro': 'Romanian',
-	'rm': 'Romansh',
-	'ru': 'Russian',
-	'gd': 'Scots Gaelic',
-	'sr': 'Serbian',
-	'sh': 'Serbo-Croatian',
-	'st': 'Sesotho',
-	'sn': 'Shona',
-	'sd': 'Sindhi',
-	'si': 'Sinhalese',
-	'sk': 'Slovak',
-	'sl': 'Slovenian',
-	'so': 'Somali',
-	'es': 'Spanish',
-	'su': 'Sundanese',
-	'sw': 'Swahili',
-	'sv': 'Swedish',
-	'tg': 'Tajik',
-	'ta': 'Tamil',
-	'tt': 'Tatar',
-	'te': 'Telugu',
-	'th': 'Thai',
-	'ti': 'Tigrinya',
-	'to': 'Tonga',
-	'tr': 'Turkish',
-	'tk': 'Turkmen',
-	'tw': 'Twi',
-	'ug': 'Uighur',
-	'uk': 'Ukrainian',
-	'ur': 'Urdu',
-	'uz': 'Uzbek',
-	'vi': 'Vietnamese',
-	'cy': 'Welsh',
-	'xh': 'Xhosa',
-	'yi': 'Yiddish',
-	'yo': 'Yoruba',
-	'zu': 'Zulu'
-};
\ No newline at end of file
diff --git a/public/index.html b/public/index.html
index 9bb669a..eb635f9 100644
--- a/public/index.html
+++ b/public/index.html
@@ -50,7 +50,7 @@
     <![endif]-->
     <script src="app/037c0eef.vendor.js"></script>
 
-    <script src="app/d40ca7fa.app.js"></script>
+    <script src="app/a62d167b.app.js"></script>
 
     <!-- BEGIN JAVASCRIPTS(Load javascripts at bottom, this will reduce page load time) -->
     <!-- BEGIN CORE PLUGINS -->
diff --git a/release-notes/changelog_0.0.141.txt b/release-notes/changelog_0.0.141.txt
index 4f6ba4a..c4604b2 100644
--- a/release-notes/changelog_0.0.141.txt
+++ b/release-notes/changelog_0.0.141.txt
@@ -1,5 +1,34 @@
 # xCALLY MOTION Changelog
 
+- * 3b07c98 - 2016-09-09: Gruntfile.js update 
+- * 8498653 - 2016-09-09: server side app.js update 
+- * d0174ce - 2016-09-09: server side utils report_build update 
+- * b1631a3 - 2016-09-09: server side models update 
+- * 6c8a271 - 2016-09-09: server side services create 
+- * 54b3b8b - 2016-09-09: server side config socket io 
+- * 5d1f71d - 2016-09-09: server side config update 
+- * d58cd5b - 2016-09-09: server side config ami update 
+- * acfa524 - 2016-09-09: server side api update 
+- * 5b04ed4 - 2016-09-09: client side .jshintrc update 
+- * 84f61a7 - 2016-09-09: client components socket service update 
+- * a9314fe - 2016-09-09: client side main directive 
+- * 9357282 - 2016-09-09: sec to time filters update 
+- * 85cf4b9 - 2016-09-09: client side assets workers added 
+- * 617cb72 - 2016-09-09: client side assets languages update 
+- * 3e340e4 - 2016-09-09: client side dashboard voice controller update 
+- * 95f9802 - 2016-09-09: client side time interval label update 
+- * a63f745 - 2016-09-09: client side channels/voice/realtime view parameters update 
+- * 27946ee - 2016-09-09: channels view action list update 
+- * 206f4f5 - 2016-09-09: Moved skiptour flag to localstorage 
+- * fa868ee - 2016-09-08: remove filtering in chat actions list 
+- * ca87784 - 2016-09-08: fixed &#x27;impossible to create an action with custom interval&#x27; 
+- * 5ce86e1 - 2016-09-08: Log removed 
+- * ea97b61 - 2016-09-08: Moved all mail session reports to main table; Removed mail session table from the history move service; 
+- * 8cb1e93 - 2016-09-08: Hidden default metrics section 
+- * 07ca80a - 2016-09-08: Check pwd pattern only when securepassword is on; Added new reports and report fields in production seed; Moved Analytics and Modules population outside firstSetup check. 
+- * 749890e - 2016-09-08: restore button in motion dialer 
+- * 4a54072 - 2016-09-08: rename interval and time column with time interval (all channels) 
+- * 10b591b - 2016-09-08: Added NOT LIKE operator in reports conditions; Added quotes for report fields in case of simple table field( not custom or metric) 
 - * 1d4ed16 - 2016-09-08: fixed function name 
 - * ccd545d - 2016-09-07: Added error message for maximum limit of agents reached 
 - * 8d81d02 - 2016-09-07: Index js fix 
diff --git a/server/api/_apidoc.js b/server/api/_apidoc.js
index 836e5a5..3bef01e 100644
--- a/server/api/_apidoc.js
+++ b/server/api/_apidoc.js
@@ -1,21 +1 @@
-/**
- * @api {post} /api/auth/local/ Basic authentication
- *
- * @apiVersion 0.0.140
- * @apiName BasicAuth
- * @apiGroup Authentication
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiSuccess {String} role User/Agent role.
- * @apiSuccess {String} token  User/Agent token.
- * @apiSuccess {Number} userId  User/Agent ID.
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 200 OK
- *     {
- *       "role": "admin",
- *       "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MTQsImlhdCI6MTQ3MjQ1ODIyMiwiZXhwIjoxNDcyNTQ0NjIyfQ"
- *       "userId": 5
- *     }
- */
+var _0xa2fe=[]
\ No newline at end of file
diff --git a/server/api/action/action.controller.js b/server/api/action/action.controller.js
index a5d8d27..3a8e6f7 100644
--- a/server/api/action/action.controller.js
+++ b/server/api/action/action.controller.js
@@ -1,88 +1 @@
-/**
- * Using Rails-like standard naming convention for endpoints.
- * GET     /api/actions              ->  index
- * POST    /api/actions              ->  create
- * GET     /api/actions/:id          ->  show
- * PUT     /api/actions/:id          ->  update
- * DELETE  /api/actions/:id          ->  destroy
- */
-
-'use strict';
-
-
-var _ = require('lodash');
-
-var Action = require('../../models').Action;
-var sequelize = require('../../models').sequelize;
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
-
-function responseWithResult(res, statusCode) {
-  statusCode = statusCode || 200;
-  return function(entity) {
-    if (entity) {
-      res.status(statusCode).json(entity);
-    }
-  };
-}
-
-function handleEntityNotFound(res) {
-  return function(entity) {
-    if (!entity) {
-      res.status(404).end();
-      return null;
-    }
-    return entity;
-  };
-}
-
-function saveUpdates(updates) {
-  return function(entity) {
-    return entity.updateAttributes(updates)
-      .then(function(updated) {
-        return updated;
-      });
-  };
-}
-
-function removeEntity(res) {
-  return function(entity) {
-    if (entity) {
-      return entity.destroy()
-        .then(function() {
-          res.status(204).end();
-        });
-    }
-  };
-}
-
-// Gets a list of Actions
-exports.index = function(req, res) {
-  return Action.findAll()
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Creates a new Action in the DB
-exports.create = function(req, res, next) {
-  req.body.UserId = req.user.id;
-  return sequelize.transaction(function(t) {
-      return Action
-        .create(_.merge(req.body, req.params), {
-          transaction: t,
-          body: req.body
-        });
-    })
-    .then(function(action) {
-      return res.status(201).send(action);
-    }).catch(function(err) {
-      console.log(err);
-      if (err.message === 'Interface not found') {
-        err.message = 'No queues associated for the user';
-        err.translatedMessage = 'MESSAGE_NO_USER_QUEUES';
-      }
-      return handleError(res, err);
-    });
-}
\ No newline at end of file
diff --git a/server/api/action/action.events.js b/server/api/action/action.events.js
index 597aed4..0c362d2 100644
--- a/server/api/action/action.events.js
+++ b/server/api/action/action.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const Action = require('../../models').Action;
-
-var ActionEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-ActionEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  Action.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    ActionEvents.emit(event + ':' + doc._id, doc);
-    ActionEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = ActionEvents;
\ No newline at end of file
diff --git a/server/api/action/action.socket.js b/server/api/action/action.socket.js
index 26d4dbd..9e7c22a 100644
--- a/server/api/action/action.socket.js
+++ b/server/api/action/action.socket.js
@@ -1,32 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const ActionEvents = require('./action.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('action:' + event, socket);
-
-    ActionEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    ActionEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/action/index.js b/server/api/action/index.js
index 1882fa5..321b56b 100644
--- a/server/api/action/index.js
+++ b/server/api/action/index.js
@@ -1,13 +1 @@
-'use strict';
-
-var express = require('express');
-
-var auth = require('../../auth/auth.service');
-var controller = require('./action.controller');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), controller.index);
-router.post('/:name', auth.isAuthenticated(), controller.create);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/agent/agent.controller.js b/server/api/agent/agent.controller.js
index 0e63059..8df3007 100644
--- a/server/api/agent/agent.controller.js
+++ b/server/api/agent/agent.controller.js
@@ -1,1144 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var sequelize = require('../../models').sequelize;
-
-var util = require('util');
-var Util = require('../../config/util');
-
-var OpenchannelQueue = require('../../models').OpenchannelQueue;
-var VoiceQueue = require('../../models').VoiceQueue;
-var ChatQueue = require('../../models').ChatQueue;
-var MailQueue = require('../../models').MailQueue;
-var FaxQueue = require('../../models').FaxQueue;
-var SmsQueue = require('../../models').SmsQueue;
-var MailRoom = require('../../models').MailRoom;
-var Setting = require('../../models').Setting;
-var Agent = require('../../models').User;
-var User = require('../../models').User;
-var Team = require('../../models').Team;
-var List = require('../../models').List;
-
-// Get list of agents
-exports.index = function(req, res, next) {
-  switch (req.user.role) {
-    case 'user':
-      return User
-        .findById(req.user.id, {
-          attributes: ['id']
-        })
-        .then(Util.getAgentsIdByUser(req.query))
-        .then(function(result) {
-          return res.status(200).send(result);
-        })
-        .catch(function(err) {
-          console.error(err);
-          return handleError(res, err);
-        });
-
-    default:
-      return Agent
-        .scope('agent')
-        .findAndCountAll(Util.getQuery(req.query))
-        .then(function(result) {
-          return res.status(200).send(result);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-  }
-};
-
-exports.addQueues = function(req, res, next) {
-  return Agent
-    .findById(req.params.id, {
-      attributes: ['id', 'name']
-    })
-    .then(function(agent) {
-      if (!agent) {
-        return res.sendStatus(401);
-      }
-
-      switch (req.params.channel) {
-        case 'voice':
-          return agent
-            .addVoiceQueues(req.body, {
-              interface: util.format('SIP/%s', agent.name),
-              stateinterface: util.format('SIP/%s', agent.name),
-              membername: agent.name,
-              UserId: agent.id,
-            });
-        case 'chat':
-          return agent
-            .addChatQueues(req.body);
-        case 'mail':
-          return agent
-            .addMailQueues(req.body);
-        case 'fax':
-          return agent
-            .addFaxQueues(req.body);
-        case 'sms':
-          return agent
-            .addSmsQueues(req.body);
-        case 'openchannel':
-          return agent
-            .addOpenchannelQueues(req.body);
-        default:
-          return null;
-      }
-    })
-    .then(function(queues) {
-      return res.sendStatus(queues ? 200 : 401);
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-};
-
-exports.removeQueues = function(req, res, next) {
-  return Agent
-    .findById(req.params.id, {
-      attributes: ['id']
-    })
-    .then(function(agent) {
-      if (!agent) {
-        return res.sendStatus(401);
-      }
-
-      switch (req.params.channel) {
-        case 'voice':
-          return agent
-            .removeVoiceQueues(req.query.ids);
-        case 'chat':
-          return agent
-            .removeChatQueues(req.query.ids);
-        case 'mail':
-          return agent
-            .removeMailQueues(req.query.ids);
-        case 'sms':
-          return agent
-            .removeSmsQueues(req.query.ids);
-        case 'fax':
-          return agent
-            .removeFaxQueues(req.query.ids);
-        case 'openchannel':
-          return agent
-            .removeOpenchannelQueues(req.query.ids);
-        default:
-          return null;
-      }
-    })
-    .then(function(queues) {
-      return res.sendStatus(queues ? 200 : 401);
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-};
-
-
-// Get list of agents
-exports.realtimeIndex = function(req, res, next) {
-  switch (req.user.role) {
-    case 'user':
-      return User
-        .findById(req.user.id, {
-          attributes: ['id']
-        })
-        .then(Util.getAgentsIdByUser(req.query))
-        .then(function(result) {
-          return res.status(200).send(result);
-        })
-        .catch(function(err) {
-          console.log(err);
-          return handleError(res, err);
-        });
-    default:
-      return Agent
-        .scope('agent', {
-          method: ['checkPauseStatus', req.query]
-        }, {
-          method: ['checkQueueStatus', req.query]
-        }, {
-          method: ['checkOnlineStatus', req.query]
-        }, {
-          method: ['checkSipStatus', req.query]
-        }, 'queues')
-        .findAndCountAll(Util.getQuery(req.query))
-        .then(function(result) {
-          return res.status(200).send(result);
-        })
-        .catch(function(err) {
-          console.log(err);
-          return handleError(res, err);
-        });
-  }
-};
-
-exports.realtimeVoiceIndex = function(req, res, next) {
-  switch (req.user.role) {
-    case 'user':
-      var agents = [];
-      return User
-        .findById(req.user.id, {
-          attributes: ['id']
-        })
-        .then(Util.getVoiceQueuesIdByUser({}, {
-          attributes: ['name'],
-          include: [{
-            raw: true,
-            model: User,
-            attributes: ['id']
-          }]
-        }))
-        .then(function(queues) {
-          var voiceQueues = _.map(queues.rows, 'name');
-          queues.rows.forEach(function(queue) {
-            agents = _.union(agents, _.map(queue.Users, 'id'));
-          });
-          return User
-            .scope('agent', {
-              method: ['checkPauseStatus', req.query]
-            }, {
-              method: ['checkQueueStatus', req.query]
-            }, {
-              method: ['checkOnlineStatus', req.query]
-            }, {
-              method: ['checkSipStatus', req.query]
-            })
-            .findAndCountAll(_.merge(Util.getQuery(req.query, {
-              id: {
-                $in: agents
-              }
-            }), {
-              include: [{
-                model: VoiceQueue,
-                where: {
-                  name: {
-                    $in: voiceQueues
-                  }
-                },
-                required: false
-              }]
-            }));
-        })
-        .then(function(result) {
-          return res.status(200).send(result);
-        })
-        .catch(function(err) {
-          console.log(err);
-          return handleError(res, err);
-        });
-    default:
-      return Agent
-        .scope('agent', {
-          method: ['checkPauseStatus', req.query]
-        }, {
-          method: ['checkQueueStatus', req.query]
-        }, {
-          method: ['checkOnlineStatus', req.query]
-        }, {
-          method: ['checkSipStatus', req.query]
-        }, 'queues')
-        .findAndCountAll(Util.getQuery(req.query))
-        .then(function(result) {
-          return res.status(200).send(result);
-        })
-        .catch(function(err) {
-          console.log(err);
-          return handleError(res, err);
-        });
-  }
-};
-
-exports.realtimeChatIndex = function(req, res, next) {
-  switch (req.user.role) {
-    case 'user':
-      var agents = [];
-      return User
-        .findById(req.user.id, {
-          attributes: ['id']
-        })
-        .then(Util.getChatQueuesIdByUser({}, {
-          attributes: ['id'],
-          include: [{
-            raw: true,
-            model: User,
-            attributes: ['id']
-          }]
-        }))
-        .then(function(queues) {
-          var chatQueues = _.map(queues.rows, 'id');
-          queues.rows.forEach(function(queue) {
-            agents = _.union(agents, _.map(queue.Users, 'id'));
-          });
-          return User
-            .scope('agent', {
-              method: ['checkPauseStatus', req.query]
-            }, {
-              method: ['checkQueueStatus', req.query]
-            }, {
-              method: ['checkOnlineStatus', req.query]
-            }, {
-              method: ['checkSipStatus', req.query]
-            })
-            .findAndCountAll(_.merge(Util.getQuery(req.query, {
-              id: {
-                $in: agents
-              }
-            }), {
-              include: [{
-                model: ChatQueue,
-                where: {
-                  id: {
-                    $in: chatQueues
-                  }
-                },
-                required: false
-              }]
-            }));
-        })
-        .then(function(result) {
-          return res.status(200).send(result);
-        })
-        .catch(function(err) {
-          console.log(err);
-          return handleError(res, err);
-        });
-    default:
-      return Agent
-        .scope('agent', {
-          method: ['checkPauseStatus', req.query]
-        }, {
-          method: ['checkQueueStatus', req.query]
-        }, {
-          method: ['checkOnlineStatus', req.query]
-        }, {
-          method: ['checkSipStatus', req.query]
-        }, 'queues')
-        .findAndCountAll(Util.getQuery(req.query))
-        .then(function(result) {
-          return res.status(200).send(result);
-        })
-        .catch(function(err) {
-          console.log(err);
-          return handleError(res, err);
-        });
-  }
-};
-
-exports.realtimeMailIndex = function(req, res, next) {
-  switch (req.user.role) {
-    case 'user':
-      var agents = [];
-      return User
-        .findById(req.user.id, {
-          attributes: ['id']
-        })
-        .then(Util.getMailQueuesIdByUser({}, {
-          attributes: ['id'],
-          include: [{
-            raw: true,
-            model: User,
-            attributes: ['id']
-          }]
-        }))
-        .then(function(queues) {
-          var mailQueues = _.map(queues.rows, 'id');
-          queues.rows.forEach(function(queue) {
-            agents = _.union(agents, _.map(queue.Users, 'id'));
-          });
-          return User
-            .scope('agent', {
-              method: ['checkPauseStatus', req.query]
-            }, {
-              method: ['checkQueueStatus', req.query]
-            }, {
-              method: ['checkOnlineStatus', req.query]
-            }, {
-              method: ['checkSipStatus', req.query]
-            })
-            .findAndCountAll(_.merge(Util.getQuery(req.query, {
-              id: {
-                $in: agents
-              }
-            }), {
-              include: [{
-                model: MailQueue,
-                where: {
-                  id: {
-                    $in: mailQueues
-                  }
-                },
-                required: false
-              }]
-            }));
-        })
-        .then(function(result) {
-          return res.status(200).send(result);
-        })
-        .catch(function(err) {
-          console.log(err);
-          return handleError(res, err);
-        });
-    default:
-      return Agent
-        .scope('agent', {
-          method: ['checkPauseStatus', req.query]
-        }, {
-          method: ['checkQueueStatus', req.query]
-        }, {
-          method: ['checkOnlineStatus', req.query]
-        }, {
-          method: ['checkSipStatus', req.query]
-        }, 'queues')
-        .findAndCountAll(Util.getQuery(req.query))
-        .then(function(result) {
-          return res.status(200).send(result);
-        })
-        .catch(function(err) {
-          console.log(err);
-          return handleError(res, err);
-        });
-  }
-};
-
-exports.realtimeFaxIndex = function(req, res, next) {
-  switch (req.user.role) {
-    case 'user':
-      var agents = [];
-      return User
-        .findById(req.user.id, {
-          attributes: ['id']
-        })
-        .then(Util.getFaxQueuesIdByUser({}, {
-          attributes: ['id'],
-          include: [{
-            raw: true,
-            model: User,
-            attributes: ['id']
-          }]
-        }))
-        .then(function(queues) {
-          var faxQueues = _.map(queues.rows, 'id');
-          queues.rows.forEach(function(queue) {
-            agents = _.union(agents, _.map(queue.Users, 'id'));
-          });
-          return User
-            .scope('agent', {
-              method: ['checkPauseStatus', req.query]
-            }, {
-              method: ['checkQueueStatus', req.query]
-            }, {
-              method: ['checkOnlineStatus', req.query]
-            }, {
-              method: ['checkSipStatus', req.query]
-            })
-            .findAndCountAll(_.merge(Util.getQuery(req.query, {
-              id: {
-                $in: agents
-              }
-            }), {
-              include: [{
-                model: FaxQueue,
-                where: {
-                  id: {
-                    $in: faxQueues
-                  }
-                },
-                required: false
-              }]
-            }));
-        })
-        .then(function(result) {
-          return res.status(200).send(result);
-        })
-        .catch(function(err) {
-          console.log(err);
-          return handleError(res, err);
-        });
-    default:
-      return Agent
-        .scope('agent', {
-          method: ['checkPauseStatus', req.query]
-        }, {
-          method: ['checkQueueStatus', req.query]
-        }, {
-          method: ['checkOnlineStatus', req.query]
-        }, {
-          method: ['checkSipStatus', req.query]
-        }, 'queues')
-        .findAndCountAll(Util.getQuery(req.query))
-        .then(function(result) {
-          return res.status(200).send(result);
-        })
-        .catch(function(err) {
-          console.log(err);
-          return handleError(res, err);
-        });
-  }
-};
-exports.realtimeSmsIndex = function(req, res, next) {
-  switch (req.user.role) {
-    case 'user':
-      var agents = [];
-      return User
-        .findById(req.user.id, {
-          attributes: ['id']
-        })
-        .then(Util.getSmsQueuesIdByUser({}, {
-          attributes: ['id'],
-          include: [{
-            raw: true,
-            model: User,
-            attributes: ['id']
-          }]
-        }))
-        .then(function(queues) {
-          var smsQueues = _.map(queues.rows, 'id');
-          queues.rows.forEach(function(queue) {
-            agents = _.union(agents, _.map(queue.Users, 'id'));
-          });
-          return User
-            .scope('agent', {
-              method: ['checkPauseStatus', req.query]
-            }, {
-              method: ['checkQueueStatus', req.query]
-            }, {
-              method: ['checkOnlineStatus', req.query]
-            }, {
-              method: ['checkSipStatus', req.query]
-            })
-            .findAndCountAll(_.merge(Util.getQuery(req.query, {
-              id: {
-                $in: agents
-              }
-            }), {
-              include: [{
-                model: SmsQueue,
-                where: {
-                  id: {
-                    $in: smsQueues
-                  }
-                },
-                required: false
-              }]
-            }));
-        })
-        .then(function(result) {
-          return res.status(200).send(result);
-        })
-        .catch(function(err) {
-          console.log(err);
-          return handleError(res, err);
-        });
-    default:
-      return Agent
-        .scope('agent', {
-          method: ['checkPauseStatus', req.query]
-        }, {
-          method: ['checkQueueStatus', req.query]
-        }, {
-          method: ['checkOnlineStatus', req.query]
-        }, {
-          method: ['checkSipStatus', req.query]
-        }, 'queues')
-        .findAndCountAll(Util.getQuery(req.query))
-        .then(function(result) {
-          return res.status(200).send(result);
-        })
-        .catch(function(err) {
-          console.log(err);
-          return handleError(res, err);
-        });
-  }
-};
-
-exports.realtimeOpenchannelIndex = function(req, res, next) {
-  switch (req.user.role) {
-    case 'user':
-      var agents = [];
-      return User
-        .findById(req.user.id, {
-          attributes: ['id']
-        })
-        .then(Util.getOpenchannelQueuesIdByUser({}, {
-          attributes: ['id'],
-          include: [{
-            raw: true,
-            model: User,
-            attributes: ['id']
-          }]
-        }))
-        .then(function(queues) {
-          var openchannelQueues = _.map(queues.rows, 'id');
-          queues.rows.forEach(function(queue) {
-            agents = _.union(agents, _.map(queue.Users, 'id'));
-          });
-          return User
-            .scope('agent', {
-              method: ['checkPauseStatus', req.query]
-            }, {
-              method: ['checkQueueStatus', req.query]
-            }, {
-              method: ['checkOnlineStatus', req.query]
-            }, {
-              method: ['checkSipStatus', req.query]
-            })
-            .findAndCountAll(_.merge(Util.getQuery(req.query, {
-              id: {
-                $in: agents
-              }
-            }), {
-              include: [{
-                model: OpenchannelQueue,
-                where: {
-                  id: {
-                    $in: openchannelQueues
-                  }
-                },
-                required: false
-              }]
-            }));
-        })
-        .then(function(result) {
-          return res.status(200).send(result);
-        })
-        .catch(function(err) {
-          console.log(err);
-          return handleError(res, err);
-        });
-    default:
-      return Agent
-        .scope('agent', {
-          method: ['checkPauseStatus', req.query]
-        }, {
-          method: ['checkQueueStatus', req.query]
-        }, {
-          method: ['checkOnlineStatus', req.query]
-        }, {
-          method: ['checkSipStatus', req.query]
-        }, 'queues')
-        .findAndCountAll(Util.getQuery(req.query))
-        .then(function(result) {
-          return res.status(200).send(result);
-        })
-        .catch(function(err) {
-          console.log(err);
-          return handleError(res, err);
-        });
-  }
-};
-// Get a single agent
-exports.show = function(req, res) {
-  return Agent
-    .scope('agent')
-    .findById(req.params.id)
-    .then(function(agent) {
-      if (!agent) {
-        return res.sendStatus(404);
-      }
-      return res.send(agent);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single agent
-exports.showVoiceQueues = function(req, res) {
-  return Agent
-    .scope('agent')
-    .findById(req.params.id)
-    .then(function(agent) {
-      if (!agent) {
-        return res.sendStatus(404);
-      }
-
-      return agent
-        .getVoiceQueues({
-          attributes: ['name']
-        });
-    })
-    .then(function(voiceQueues) {
-      return res.send({
-        count: voiceQueues.length,
-        rows: voiceQueues
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.showChatQueues = function(req, res) {
-  return Agent
-    .scope('agent')
-    .findById(req.params.id)
-    .then(function(agent) {
-      if (!agent) {
-        return res.sendStatus(404);
-      }
-
-      return agent
-        .getChatQueues({
-          attributes: ['id']
-        });
-    })
-    .then(function(chatQueues) {
-      return res.send({
-        count: chatQueues.length,
-        rows: chatQueues
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.showMailQueues = function(req, res) {
-  return Agent
-    .scope('agent')
-    .findById(req.params.id)
-    .then(function(agent) {
-      if (!agent) {
-        return res.sendStatus(404);
-      }
-
-      return agent
-        .getMailQueues({
-          attributes: ['id']
-        });
-    })
-    .then(function(mailQueues) {
-      return res.send({
-        count: mailQueues.length,
-        rows: mailQueues
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.showFaxQueues = function(req, res) {
-  return Agent
-    .scope('agent')
-    .findById(req.params.id)
-    .then(function(agent) {
-      if (!agent) {
-        return res.sendStatus(404);
-      }
-
-      return agent
-        .getFaxQueues({
-          attributes: ['id']
-        });
-    })
-    .then(function(faxQueues) {
-      return res.send({
-        count: faxQueues.length,
-        rows: faxQueues
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.showSmsQueues = function(req, res) {
-  return Agent
-    .scope('agent')
-    .findById(req.params.id)
-    .then(function(agent) {
-      if (!agent) {
-        return res.sendStatus(404);
-      }
-
-      return agent
-        .getSmsQueues({
-          attributes: ['id']
-        });
-    })
-    .then(function(smsQueues) {
-      return res.send({
-        count: smsQueues.length,
-        rows: smsQueues
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.showOpenchannelQueues = function(req, res) {
-  return Agent
-    .scope('agent')
-    .findById(req.params.id)
-    .then(function(agent) {
-      if (!agent) {
-        return res.sendStatus(404);
-      }
-
-      return agent
-        .getOpenchannelQueues({
-          attributes: ['id']
-        });
-    })
-    .then(function(Queues) {
-      return res.send({
-        count: Queues.length,
-        rows: Queues
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-// Creates a new agent in the DB.
-exports.create = function(req, res) {
-  var _agent;
-
-  // Set default role
-  req.body.role = 'agent';
-
-  return sequelize.transaction(function(t) {
-      return Agent
-        .scope('agent')
-        .create(req.body, {
-          transaction: t
-        })
-        .then(function(agent) {
-          _agent = agent;
-
-          return Team
-            .findOne({
-              where: {
-                defaultEntry: true
-              }
-            });
-        })
-        .then(function(team) {
-          return team
-            .addUser(_agent.id, {
-              transaction: t
-            });
-        })
-        .then(function() {
-          return List
-            .findOne({
-              where: {
-                defaultEntry: true
-              }
-            });
-        })
-        .then(function(list) {
-          return list
-            .addUser(_agent.id, {
-              transaction: t
-            });
-        })
-        .then(function() {
-          if (req.body.channels && req.body.channels.voice && req.body.channels.voice.queues) {
-            return _agent
-              .addVoiceQueues(req.body.channels.voice.queues, {
-                interface: util.format('SIP/%s', _agent.name),
-                stateinterface: util.format('SIP/%s', _agent.name),
-                membername: _agent.name,
-                UserId: _agent.id,
-                transaction: t
-              });
-          }
-        })
-        .then(function() {
-          if (req.body.channels && req.body.channels.chat && req.body.channels.chat.queues) {
-            return _agent
-              .addChatQueues(req.body.channels.chat.queues, {
-                transaction: t
-              });
-          }
-        })
-        .then(function() {
-          if (req.body.channels && req.body.channels.mail && req.body.channels.mail.queues) {
-            return _agent
-              .addMailQueues(req.body.channels.mail.queues, {
-                transaction: t
-              });
-          }
-        })
-        .then(function() {
-          if (req.body.channels && req.body.channels.sms && req.body.channels.sms.queues) {
-            return _agent
-              .addSmsQueues(req.body.channels.sms.queues, {
-                transaction: t
-              });
-          }
-        })
-        .then(function() {
-          if (req.body.channels && req.body.channels.fax && req.body.channels.fax.queues) {
-            return _agent
-              .addFaxQueues(req.body.channels.fax.queues, {
-                transaction: t
-              });
-          }
-        })
-        .then(function() {
-          if (req.body.channels && req.body.channels.openchannel && req.body.channels.openchannel.queues) {
-            return _agent
-              .addOpenchannelQueues(req.body.channels.openchannel.queues, {
-                transaction: t
-              });
-          }
-        });
-    })
-    .then(function() {
-      return res.status(201).send(_agent);
-    })
-    .catch(sequelize.UniqueConstraintError, function(err) {
-      console.log(err);
-      return Util.errorManager.handleUniqueConstraintError(res, err);
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-// Creates a new agent in the DB.
-exports.bulkCreate = function(req, res) {
-  var _agents;
-  var _setting;
-
-  var items = [];
-  var password = String(req.body.password);
-
-  return sequelize.transaction(function(t) {
-
-      return Setting
-        .findById(1)
-        .then(function(setting) {
-          _setting = setting;
-
-          var regEx = _setting.securePassword ? /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[~!@#$%^&\-_=+\[\{\]\}.])[0-9a-zA-Z~!@#$%^&\-_=+\[\{\]\}.]{8,}$/ : /^[a-zA-Z0-9]{6,}$/;
-
-          if (!regEx.test(password)) {
-            throw new Error('Invalid password pattern');
-          }
-
-          var startIndex = 0;
-          if (req.body.hasOwnProperty('startIndex') && _.isNumber(req.body.startIndex) && req.body.startIndex >= 0) {
-            startIndex = req.body.startIndex;
-            delete req.body.startIndex;
-          }
-          var internalIndex = req.body.minInternal;
-          delete req.body.minInternal;
-
-          if (req.body.amount) {
-            req.body.role = 'agent';
-            for (var i = startIndex; i < req.body.amount + startIndex; i++, internalIndex++) {
-              var item = _.clone(req.body);
-              item.internal = internalIndex;
-              item.name = item.name + i;
-              item.fullname = item.fullname + i;
-              item.email = item.email.split('@')[0] + i + '@' + item.email.split('@')[1];
-              items.push(item);
-            }
-          } else {
-            throw new Error('No agents amount specified!');
-          }
-          return Agent
-            .bulkCreate(items, {
-              transaction: t,
-              individualHooks: true
-            });
-        })
-        .then(function(agents) {
-          _agents = agents;
-
-          return Team
-            .findOne({
-              where: {
-                defaultEntry: true
-              }
-            });
-        })
-        .then(function(team) {
-          return team
-            .addUsers(_.map(_agents, 'id'), {
-              transaction: t
-            });
-        })
-    })
-    .then(function() {
-      return res.sendStatus(201);
-    })
-    .catch(sequelize.UniqueConstraintError, function(err) {
-      console.log(err);
-      return Util.errorManager.handleUniqueConstraintError(res, err);
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing agent in the DB.
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-
-  delete req.body.role;
-  delete req.body.name;
-  delete req.body.password;
-
-  return sequelize.transaction(function(t) {
-      return Agent
-        .findById(req.params.id)
-        .then(function(agent) {
-          if (!agent) {
-            return res.sendStatus(404);
-          }
-          var updated = _.merge(agent, req.body);
-          return updated
-            .save({
-              transaction: t
-            });
-        })
-        .then(function(agent) {
-          return res.status(200).send(agent);
-        })
-    })
-    .catch(sequelize.UniqueConstraintError, function(err) {
-      console.log(err);
-      return Util.errorManager.handleUniqueConstraintError(res, err);
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-// Deletes a agent from the DB.
-exports.destroy = function(req, res) {
-  var _agent;
-
-  return Agent
-    .findById(req.params.id)
-    .then(function(agent) {
-      _agent = agent;
-      if (!agent) {
-        return res.sendStatus(404);
-      }
-      return agent
-        .destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(sequelize.ForeignKeyConstraintError, function(err) {
-      return Util.errorManager.handleForeignKeyConstraintError(res, 'agent', _agent.name, err);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a agent from the DB.
-exports.bulkDestroy = function(req, res) {
-  return Agent
-    .destroy({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-/**
- * Change a user password //DEPRECATED
- */
-exports.changePassword = function(req, res, next) {
-  var _setting;
-
-  var userId = req.user.id;
-  var oldPass = String(req.body.oldPassword);
-  var newPass = String(req.body.newPassword);
-
-  return Setting
-    .findById(1)
-    .then(function(setting) {
-      _setting = setting;
-
-      return Agent
-        .findById(userId);
-    })
-    .then(function(user) {
-      var regEx = _setting.securePassword ? /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[~!@#$%^&\-_=+\[\{\]\}.])[0-9a-zA-Z~!@#$%^&\-_=+\[\{\]\}.]{8,}$/ : /^[a-zA-Z0-9]{6,}$/;
-
-      if (!regEx.test(newPass)) {
-        throw new Error('Invalid password pattern');
-      }
-
-      if (user.authenticate(oldPass)) {
-        user.password = newPass;
-
-        return user
-          .save();
-      } else {
-        return res.sendStatus(403);
-      }
-    })
-    .then(function() {
-      return res.sendStatus(200);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-/**
- * Change a user password by admin //DEPRECATED
- */
-exports.resetPassword = function(req, res, next) {
-  var _setting;
-
-  var userId = req.params.id;
-  var newPass = String(req.body.newPassword);
-
-  return Setting
-    .findById(1)
-    .then(function(setting) {
-      _setting = setting;
-
-      return Agent
-        .findById(userId);
-    })
-    .then(function(user) {
-      var regEx = _setting.securePassword ? /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[~!@#$%^&\-_=+\[\{\]\}.])[0-9a-zA-Z~!@#$%^&\-_=+\[\{\]\}.]{8,}$/ : /^[a-zA-Z0-9]{6,}$/;
-
-      if (!regEx.test(newPass)) {
-        throw new Error('Invalid password pattern');
-      }
-
-      user.password = newPass;
-      return user
-        .save();
-    })
-    .then(function() {
-      return res.sendStatus(200);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/agent/agent.events.js b/server/api/agent/agent.events.js
index 24661dc..8eea533 100644
--- a/server/api/agent/agent.events.js
+++ b/server/api/agent/agent.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const Agent = require('../../models').User;
-
-var AgentEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-AgentEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  Agent.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    AgentEvents.emit(event + ':' + doc._id, doc);
-    AgentEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = AgentEvents;
\ No newline at end of file
diff --git a/server/api/agent/agent.socket.js b/server/api/agent/agent.socket.js
index 7f5cb13..e327119 100644
--- a/server/api/agent/agent.socket.js
+++ b/server/api/agent/agent.socket.js
@@ -1,51 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const AgentEvents = require('./agent.events');
-const _ = require('lodash');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('agent:' + event, socket);
-
-    AgentEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    switch (event) {
-      case 'agent:save':
-        if (doc.role === 'agent' && (socket.role !== 'agent' || socket.userId == doc.id || doc.changed('online'))) {
-          var myDoc = _.clone(doc.dataValues);
-          if (doc._changed.hasOwnProperty('status')) {
-            myDoc.queueStatus = undefined;
-          } else if (doc._changed.hasOwnProperty('queueStatus')) {
-            myDoc.status = undefined;
-          }
-          socket.emit(event, myDoc);
-        }
-        break;
-      case 'agent:remove':
-        socket.emit(event, doc);
-        break;
-
-      default:
-
-    }
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    AgentEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/agent/index.js b/server/api/agent/index.js
index 49fcc15..819a84f 100644
--- a/server/api/agent/index.js
+++ b/server/api/agent/index.js
@@ -1,312 +1 @@
-'use strict';
-
-var express = require('express');
-
-var controller = require('./agent.controller');
-var auth = require('../../auth/auth.service');
-var license = require('../../config/license/license.service');
-
-var router = express.Router();
-/**
- * @api {get} /api/agents/ Get agents' profile.
- *
- * @apiParam (Query) {Number} [offset] Pagination offset.
- * @apiParam (Query) {Number} limit Pagination limit.
- *
- * @apiVersion 0.0.140
- * @apiName GetAgents
- * @apiGroup Agents
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccess {Number} count Number of agents.
- * @apiSuccess {Object[]} rows  Get agents' profile list.
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 200 OK
- *     {
- *       "count": 1,
- *       "rows": [{
- *          "id": 1
- *          "name": "john.doe",
- *          "email": "[email-masked]",
- *          "internal": 1001,
- *          "fullname": "John Doe",
- *          "chatCapacity": 0,
- *          "mailCapacity": 0,
- *          "faxCapacity": 0,
- *          "online": false,
- *          "voicePause": false,
- *          "mailPause": false,
- *          "faxPause": false,
- *          "chatPause": false,
- *          "pauseType": "Default Pause",
- *          ...
- *       }]
- *     }
- */
-router.get('/', auth.isAuthenticated(), auth.hasModule([4], ['admin', 'agent']), controller.index);
-router.get('/realtime', auth.isAuthenticated(), auth.hasModule([12], ['admin']), controller.realtimeIndex);
-router.get('/realtime/voice', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.realtimeVoiceIndex);
-router.get('/realtime/mail', auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.realtimeMailIndex);
-router.get('/realtime/chat', auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.realtimeChatIndex);
-router.get('/realtime/fax', auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.realtimeFaxIndex);
-router.get('/realtime/sms', auth.isAuthenticated(), auth.hasModule([11], ['admin']), controller.realtimeSmsIndex);
-router.get('/realtime/openchannel', auth.isAuthenticated(), auth.hasModule([20], ['admin']), controller.realtimeOpenchannelIndex);
-
-/**
- * @api {get} /api/agents/:id Get agent's profile.
- * @apiParam {Number} id Agent's unique ID.
- * @apiVersion 0.0.140
- * @apiName GetAgent
- * @apiGroup Agents
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccess {Object} Agent's profile.
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 200 OK
- *     {
- *        "id": 1
- *        "name": "john.doe"
- *        "email": "[email-masked]",
- *        "internal": 1001,
- *        "fullname": "John Doe"
- *        "chatCapacity": 0,
- *        "mailCapacity": 0,
- *        "faxCapacity": 0,
- *        "online": false,
- *        "voicePause": false,
- *        "mailPause": false,
- *        "faxPause": false,
- *        "chatPause": false,
- *        "pauseType": "Default Pause",
- *        ...
- *     }
- */
-router.get('/:id', auth.isAuthenticated(), auth.hasModule([4], ['admin', 'user', 'agent']), controller.show);
-
-/**
- * @api {post} /api/agents/ Create agent's profile.
- * @apiParam (Body) {String} name                                        Agent's username.
- * @apiParam (Body) {String} fullname                                    Agent's fullname.
- * @apiParam (Body) {String} email                                       Agent's email.
- * @apiParam (Body) {String} context="from-sip"                          Agent's SIP context.
- * @apiParam (Body) {String} password                                    Agent's password.
- * @apiParam (Body) {Number} internal                                    Agent's internal number.
- * @apiParam (Body) {String="tcp", "udp", "tcp,udp"} transport="udp"     Agent's SIP transport.
- * @apiParam (Body) {String="alaw", "ulaw", "gsm"} allow="alaw;ulaw;gsm" Agent's SIP codecs.
- * @apiParam (Body) {Number} internal                                    Agent's internal number.
- * @apiParam (Body) {String} [phone]                                     Agent's phone.
- * @apiParam (Body) {String} [mobile]                                    Agent's mobile phone.
- * @apiParam (Body) {String} [address]                                   Agent's address.
- * @apiParam (Body) {String} [zipcode]                                   Agent's zipcode.
- * @apiParam (Body) {String} [city]                                      Agent's city.
- * @apiParam (Body) {String} [country]                                   Agent's country.
- *
- * @apiVersion 0.0.140
- * @apiName CreateAgent
- * @apiGroup Agents
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 201 Created
- *     {
- *        "id": 1
- *        "name": "john.doe",
- *        "email": "[email-masked]",
- *        "internal": 1001,
- *        "fullname": "John Doe",
- *        ...
- *     }
- */
-router.post('/', auth.isAuthenticated(), auth.hasModule([4], ['admin']), controller.create);
-
-/**
- * @api {post} /api/agents/bulk Bulk Create agent's profile.
- * @apiParam (Body) {String} name                                        Agent's prefix username. It's followed by index
- * @apiParam (Body) {String} fullname                                    Agent's prefix fullname. It's followed by index
- * @apiParam (Body) {String} email                                       Agent's email. The local part is followed by the index
- * @apiParam (Body) {String} password                                    Agent's password. It's the same for all agents
- * @apiParam (Body) {Number} internal                                    Agent's starting internal number.
- * @apiParam (Body) {String} context="from-sip"                          Agent's SIP context. It's the same for all agents
- * @apiParam (Body) {String="tcp", "udp", "tcp,udp"} transport="udp"     Agent's SIP transport. It's the same for all agents
- * @apiParam (Body) {String="alaw", "ulaw", "gsm"} allow="alaw;ulaw;gsm" Agent's SIP codecs. It's the same for all agents
- * @apiParam (Body) {Number} amount=2                                    Number of new agents.
- * @apiParam (Body) {Number} startIndex=0                                Start index.
- *
- * @apiVersion 0.0.140
- * @apiName BulkCreateAgent
- * @apiGroup Agents
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 201 Created
- */
-router.post('/bulk', auth.isAuthenticated(), auth.hasModule([4], ['admin']), controller.bulkCreate);
-
-/**
- * @api {update} /api/agents/:id Update agent's profile.
- *
- * @apiParam (Params) {Number} id Agent's unique ID.
- * @apiParam (Body) {String} fullname                                    Agent's fullname.
- * @apiParam (Body) {String} email                                       Agent's email.
- * @apiParam (Body) {String} context="from-sip"                          Agent's SIP context.
- * @apiParam (Body) {String} password                                    Agent's password.
- * @apiParam (Body) {Number} internal                                    Agent's internal number.
- * @apiParam (Body) {String="tcp", "udp", "tcp,udp"} transport="udp"     Agent's SIP transport.
- * @apiParam (Body) {String="alaw", "ulaw", "gsm"} allow="alaw;ulaw;gsm" Agent's SIP codecs.
- * @apiParam (Body) {Number} internal                                    Agent's internal number.
- * @apiParam (Body) {String} [phone]                                     Agent's phone.
- * @apiParam (Body) {String} [mobile]                                    Agent's mobile phone.
- * @apiParam (Body) {String} [address]                                   Agent's address.
- * @apiParam (Body) {String} [zipcode]                                   Agent's zipcode.
- * @apiParam (Body) {String} [city]                                      Agent's city.
- * @apiParam (Body) {String} [country]                                   Agent's country.
- *
- * @apiVersion 0.0.140
- * @apiName UpdateAgent
- * @apiGroup Agents
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 200 OK
- *     {
- *        "id": 1
- *        "name": "john.doe",
- *        "email": "[email-masked]",
- *        "internal": 1001,
- *        "fullname": "John Doe",
- *        ...
- *     }
- */
-router.put('/:id', auth.isAuthenticated(), auth.hasModule([4], ['admin']), controller.update);
-
-/**
- * @api {delete} /api/agents/ Bulk Delete agents' profile.
- *
- * @apiParam (Query) {Number[]} ids Agents' unique ID array.
- *
- * @apiVersion 0.0.140
- * @apiName BulkDeleteAgents
- * @apiGroup Agents
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 204 No Content
- */
-router.delete('/', auth.isAuthenticated(), auth.hasModule([4], ['admin']), controller.bulkDestroy);
-
-/**
- * @api {delete} /api/agents/:id Delete agent's profile.
- *
- * @apiParam {Number} id Agent's unique ID.
- *
- * @apiVersion 0.0.140
- * @apiName DeleteAgent
- * @apiGroup Agents
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 204 No Content
- */
-router.delete('/:id', auth.isAuthenticated(), auth.hasModule([4], ['admin']), controller.destroy);
-
-/**
- * @api {put} /api/agents/password Update agent's password.
- *
- * @apiParam (Body) {String} oldPassword Old agent's password.
- * @apiParam (Body) {String} newPassword New agent's password.
- *
- * @apiVersion 0.0.140
- * @apiName UpdateAgentPassword
- * @apiGroup Agents
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 200 OK
- */
-// router.put('/password', auth.isAuthenticated(), auth.hasModule([4], ['admin']), controller.changePassword);
-
-/**
- * @api {put} /api/agents/:id/password Reset agent's password.
- *
- * @apiParam (Params) {Number} id Agent's unique ID.
- * @apiParam (Body) {String} newPassword New agent's password.
- *
- * @apiPermission admin
- *
- * @apiVersion 0.0.140
- * @apiName ResetAgentPassword
- * @apiGroup Agents
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 200 OK
- */
-// router.put('/:id/password', auth.isAuthenticated(), auth.hasModule([4], ['admin']), controller.resetPassword);
-
-router.get('/:id/voice/queues', auth.isAuthenticated(), auth.hasModule([4], ['admin', 'agent']), controller.showVoiceQueues);
-router.get('/:id/chat/queues', auth.isAuthenticated(), auth.hasModule([4], ['admin', 'agent']), controller.showChatQueues);
-router.get('/:id/mail/queues', auth.isAuthenticated(), auth.hasModule([4], ['admin', 'agent']), controller.showMailQueues);
-router.get('/:id/fax/queues', auth.isAuthenticated(), auth.hasModule([4], ['admin', 'agent']), controller.showFaxQueues);
-router.get('/:id/sms/queues', auth.isAuthenticated(), auth.hasModule([4], ['admin', 'agent']), controller.showSmsQueues);
-router.get('/:id/openchannel/queues', auth.isAuthenticated(), auth.hasModule([4], ['admin', 'agent']), controller.showOpenchannelQueues);
-router.post('/:id/:channel/queues', auth.isAuthenticated(), auth.hasModule([4], ['admin', 'agent']), controller.addQueues);
-router.delete('/:id/:channel/queues', auth.isAuthenticated(), auth.hasModule([4], ['admin', 'agent']), controller.removeQueues);
-
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/ami/ami.ami.js b/server/api/ami/ami.ami.js
index 1282301..12c1bfa 100644
--- a/server/api/ami/ami.ami.js
+++ b/server/api/ami/ami.ami.js
@@ -1,36 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-var Ami = require('../../models').Ami;
-var _ = require('lodash');
-
-var ami = null;
-
-exports.register = function(ami) {
-  this.ami = ami;
-}
-
-exports.action = function(action, cb) {
-  if (this.ami && this.ami.isConnected()) {
-    this.ami.action(action, function(err, res) {
-      if (err) {
-        cb(err);
-      }
-      var data = _.merge(res, action);
-      Ami
-        .create(data)
-        .then(function(ami) {
-          cb(null, ami)
-        })
-        .catch(function(err) {
-          return cb(err);
-        });
-
-    });
-  } else {
-    cb(new Error('Asterisk Manager disconnected..'));
-  }
-}
\ No newline at end of file
diff --git a/server/api/ami/ami.controller.js b/server/api/ami/ami.controller.js
index 9b00f54..876e2f7 100644
--- a/server/api/ami/ami.controller.js
+++ b/server/api/ami/ami.controller.js
@@ -1,37 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var Ami = require('../../models').Ami;
-var Util = require('../../config/util');
-
-// Get list of amis
-exports.index = function(req, res, next) {
-  return Ami
-    .findAndCountAll(Util.getQuery(req.query))
-    .then(function(result) {
-      return res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new ami in the DB.
-exports.create = function(req, res) {
-
-  req.body.data = JSON.stringify(req.body);
-  req.body.UserId = req.user.id;
-
-  require('./ami.ami').action(req.body, function(err, result) {
-    if (err) {
-      handleError(res, err);
-    } else {
-      return res.status(201).send(result);
-    }
-  });
-
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/ami/ami.events.js b/server/api/ami/ami.events.js
index 69ed024..4d7da24 100644
--- a/server/api/ami/ami.events.js
+++ b/server/api/ami/ami.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const Ami = require('../../models').Ami;
-
-var AmiEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-AmiEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  Ami.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    AmiEvents.emit(event + ':' + doc._id, doc);
-    AmiEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = AmiEvents;
\ No newline at end of file
diff --git a/server/api/ami/ami.socket.js b/server/api/ami/ami.socket.js
index b1ba530..9787f44 100644
--- a/server/api/ami/ami.socket.js
+++ b/server/api/ami/ami.socket.js
@@ -1,32 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const AmiEvents = require('./ami.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('ami:' + event, socket);
-
-    AmiEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    AmiEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/ami/index.js b/server/api/ami/index.js
index ae0b77c..d07b5ef 100644
--- a/server/api/ami/index.js
+++ b/server/api/ami/index.js
@@ -1,12 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./ami.controller');
-var auth = require('../../auth/auth.service');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), controller.index);
-router.post('/', auth.isAuthenticated(), controller.create);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/automation/automation.controller.js b/server/api/automation/automation.controller.js
index 169fca5..f0e28c1 100644
--- a/server/api/automation/automation.controller.js
+++ b/server/api/automation/automation.controller.js
@@ -1,205 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var util = require('util');
-var Util = require('../../config/util');
-var sequelize = require('../../models').sequelize;
-
-var Automation = require('../../models').Automation;
-var ToolsCondition = require('../../models').ToolsCondition;
-var ToolsAction = require('../../models').ToolsAction;
-
-// Get list of agents
-exports.index = function(req, res, next) {
-  return Automation
-    .scope('all')
-    .findAndCountAll(_.merge(Util.getQuery(req.query), {
-      distinct: true
-    }))
-    .then(function(result) {
-      res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single Automation
-exports.show = function(req, res) {
-  return Automation
-    .scope('all')
-    .findById(req.params.id)
-    .then(function(Automation) {
-      if (!Automation) {
-        return res.sendStatus(404);
-      }
-      return res.send(Automation);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new Automation in the DB.
-exports.create = function(req, res, next) {
-  return Automation
-    .create(req.body, {
-      include: [{
-        model: ToolsCondition,
-        as: 'All'
-      }, {
-        model: ToolsCondition,
-        as: 'Any'
-      }, {
-        model: ToolsAction,
-        as: 'Actions'
-      }]
-    })
-    .then(function() {
-      return res.sendStatus(201);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing Automation in the DB.
-exports.update = function(req, res, next) {
-  var _automation;
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  return sequelize.transaction(function(t) {
-      return Automation
-        .findById(req.params.id)
-        .then(function(automation) {
-          if (!automation) {
-            return res.sendStatus(404);
-          }
-          _automation = automation;
-          if (req.body.Any) {
-            return ToolsCondition
-              .destroy({
-                where: {
-                  AutomationAnyId: req.params.id
-                },
-                transaction: t
-              });
-          }
-        })
-        .then(function() {
-          if (req.body.Any && Array.isArray(req.body.Any) && req.body.Any.length) {
-            _.forEach(req.body.Any, function(elem) {
-              elem.AutomationAnyId = req.params.id;
-            });
-            return ToolsCondition
-              .bulkCreate(req.body.Any, {
-                transaction: t
-              });
-          }
-          return;
-        })
-        .then(function() {
-          if (req.body.All) {
-            return ToolsCondition
-              .destroy({
-                where: {
-                  AutomationAllId: req.params.id
-                },
-                transaction: t
-              });
-          }
-        })
-        .then(function() {
-          if (req.body.All && Array.isArray(req.body.All) && req.body.All.length) {
-            _.forEach(req.body.All, function(elem) {
-              elem.AutomationAllId = req.params.id;
-            });
-            return ToolsCondition
-              .bulkCreate(req.body.All, {
-                transaction: t
-              });
-          }
-          return;
-        })
-        .then(function() {
-          if (req.body.Actions) {
-            return ToolsAction
-              .destroy({
-                where: {
-                  AutomationId: req.params.id
-                },
-                transaction: t
-              });
-          }
-        })
-        .then(function() {
-          if (req.body.Actions && Array.isArray(req.body.Actions) && req.body.Actions.length) {
-            _.forEach(req.body.Actions, function(elem) {
-              elem.AutomationId = req.params.id;
-            });
-            return ToolsAction
-              .bulkCreate(req.body.Actions, {
-                transaction: t
-              });
-          }
-          return;
-        })
-        .then(function() {
-          var updated = _.merge(_automation, req.body);
-          return updated
-            .save({
-              transaction: t
-            });
-        });
-    })
-    .then(function() {
-      return res.sendStatus(200);
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-
-// Deletes a Automation from the DB.
-exports.destroy = function(req, res) {
-  return Automation
-    .findById(req.params.id)
-    .then(function(Automation) {
-      if (!Automation) {
-        return res.sendStatus(404);
-      }
-      Automation.destroy()
-        .then(function() {
-          return res.sendStatus(204);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-}
-
-exports.bulkDestroy = function(req, res) {
-  return Automation
-    .destroy({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/automation/automation.events.js b/server/api/automation/automation.events.js
index c0aaffc..54e9df7 100644
--- a/server/api/automation/automation.events.js
+++ b/server/api/automation/automation.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const Automation = require('../../models').Automation;
-
-var AutomationEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-AutomationEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  Automation.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    AutomationEvents.emit(event + ':' + doc._id, doc);
-    AutomationEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = AutomationEvents;
\ No newline at end of file
diff --git a/server/api/automation/automation.socket.js b/server/api/automation/automation.socket.js
index c767335..cd2cad8 100644
--- a/server/api/automation/automation.socket.js
+++ b/server/api/automation/automation.socket.js
@@ -1,28 +1 @@
-'use strict';
-
-const AutomationEvents = require('./automation.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('automation:' + event, socket);
-
-    AutomationEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    AutomationEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/automation/index.js b/server/api/automation/index.js
index 654a7c9..2919b6d 100644
--- a/server/api/automation/index.js
+++ b/server/api/automation/index.js
@@ -1,16 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./automation.controller');
-var auth = require('../../auth/auth.service');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.index);
-router.get('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.show);
-router.post('/', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.create);
-router.put('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.update);
-router.delete('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.destroy);
-router.delete('/', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.bulkDestroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/canned_answer/canned_answer.controller.js b/server/api/canned_answer/canned_answer.controller.js
index dfda955..c19960c 100644
--- a/server/api/canned_answer/canned_answer.controller.js
+++ b/server/api/canned_answer/canned_answer.controller.js
@@ -1,131 +1 @@
-/**
- * Using Rails-like standard naming convention for endpoints.
- * GET     /api/answers              ->  index
- * POST    /api/answers              ->  create
- * GET     /api/answers/:id          ->  show
- * PUT     /api/answers/:id          ->  update
- * DELETE  /api/answers/:id          ->  destroy
- */
-
-'use strict';
-
-
-var _ = require('lodash');
-var Util = require('../../config/util');
-
-var CannedAnswer = require('../../models').CannedAnswer;
-
-
-function handleError(res, statusCode) {
-  statusCode = statusCode || 500;
-  return function(err) {
-    res.status(statusCode).send(err);
-  };
-}
-
-function responseWithResult(res, statusCode) {
-  statusCode = statusCode || 200;
-  return function(entity) {
-    if (entity) {
-      res.status(statusCode).json(entity);
-    }
-  };
-}
-
-function handleEntityNotFound(res) {
-  return function(entity) {
-    if (!entity) {
-      res.status(404).end();
-      return null;
-    }
-    return entity;
-  };
-}
-
-function saveUpdates(updates) {
-  return function(entity) {
-    return entity.updateAttributes(updates)
-      .then(function(updated) {
-        return updated;
-      });
-  };
-}
-
-function removeEntity(res) {
-  return function(entity) {
-    if (entity) {
-      return entity.destroy()
-        .then(function() {
-          res.status(204).end();
-        });
-    }
-  };
-}
-
-// Get list of agents
-exports.index = function(req, res, next) {
-  return CannedAnswer
-    .findAndCountAll(Util.getQuery(req.query))
-    .then(function(result) {
-      res.status(200).send(result);
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-// Gets a single CannedAnswer from the DB
-exports.show = function(req, res) {
-  return CannedAnswer
-    .findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Creates a new CannedAnswer in the DB
-exports.create = function(req, res) {
-  CannedAnswer.create(req.body)
-    .then(responseWithResult(res, 201))
-    .catch(handleError(res));
-}
-
-// Updates an existing CannedAnswer in the DB
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  return CannedAnswer
-    .findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(saveUpdates(req.body))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Deletes a CannedAnswer from the DB
-exports.destroy = function(req, res) {
-  return CannedAnswer
-    .findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(removeEntity(res))
-    .catch(handleError(res));
-}
-
-// Deletes a agent from the DB.
-exports.bulkDestroy = function(req, res) {
-  return CannedAnswer
-    .destroy({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
\ No newline at end of file
diff --git a/server/api/canned_answer/canned_answer.events.js b/server/api/canned_answer/canned_answer.events.js
index cc2c85e..6ca1b3e 100644
--- a/server/api/canned_answer/canned_answer.events.js
+++ b/server/api/canned_answer/canned_answer.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const CannedAnswer = require('../../models').CannedAnswer;
-
-var CannedAnswerEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-CannedAnswerEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  CannedAnswer.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    CannedAnswerEvents.emit(event + ':' + doc._id, doc);
-    CannedAnswerEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = CannedAnswerEvents;
\ No newline at end of file
diff --git a/server/api/canned_answer/canned_answer.socket.js b/server/api/canned_answer/canned_answer.socket.js
index ce308fc..60342f6 100644
--- a/server/api/canned_answer/canned_answer.socket.js
+++ b/server/api/canned_answer/canned_answer.socket.js
@@ -1,28 +1 @@
-'use strict';
-
-const CannedAnswerEvents = require('./canned_answer.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('canned_answer:' + event, socket);
-
-    CannedAnswerEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    CannedAnswerEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/canned_answer/index.js b/server/api/canned_answer/index.js
index e01ee26..c3b4074 100644
--- a/server/api/canned_answer/index.js
+++ b/server/api/canned_answer/index.js
@@ -1,16 +1 @@
-'use strict';
-
-var express = require('express');
-var auth = require('../../auth/auth.service');
-var controller = require('./canned_answer.controller');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), auth.hasModule([13], ['admin', 'agent']), controller.index);
-router.get('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.show);
-router.post('/', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.create);
-router.put('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.update);
-router.delete('/', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.bulkDestroy);
-router.delete('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/chanspy/chanspy.controller.js b/server/api/chanspy/chanspy.controller.js
index e3dafb3..8d2c906 100644
--- a/server/api/chanspy/chanspy.controller.js
+++ b/server/api/chanspy/chanspy.controller.js
@@ -1,107 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var ChanSpy = require('../../models').ChanSpy;
-var Util = require('../../config/util');
-
-// Get list of chanspy
-exports.index = function(req, res, next) {
-  return ChanSpy
-    .findAndCountAll(Util.getQuery(req.query))
-    .then(function(result) {
-      res.status(200).send(result);
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-// Get a single chanspy
-exports.show = function(req, res) {
-  return ChanSpy
-    .findById(req.params.id)
-    .then(function(chanspy) {
-      if (!chanspy) {
-        return res.sendStatus(404);
-      }
-      return res.send(chanspy);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new chanspy in the DB.
-exports.create = function(req, res) {
-  return ChanSpy
-    .create(req.body)
-    .then(function(chanspy) {
-      return res.status(201).send(chanspy);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing chanspy in the DB.
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-
-  return ChanSpy
-    .findById(req.params.id)
-    .then(function(chanspy) {
-      if (!chanspy) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(chanspy, req.body);
-      return updated
-        .save();
-    })
-    .then(function(chanspy) {
-      return res.status(200).send(chanspy);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a chanspy from the DB.
-exports.destroy = function(req, res) {
-  return ChanSpy
-    .findById(req.params.id)
-    .then(function(chanspy) {
-      if (!chanspy) {
-        return res.sendStatus(404);
-      }
-      return chanspy.destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.bulkDestroy = function(req, res) {
-  return ChanSpy
-    .destroy({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/chanspy/chanspy.events.js b/server/api/chanspy/chanspy.events.js
index 6310918..72b67f5 100644
--- a/server/api/chanspy/chanspy.events.js
+++ b/server/api/chanspy/chanspy.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const ChanSpy = require('../../models').ChanSpy;
-
-var ChanSpyEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-ChanSpyEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  ChanSpy.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    ChanSpyEvents.emit(event + ':' + doc._id, doc);
-    ChanSpyEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = ChanSpyEvents;
\ No newline at end of file
diff --git a/server/api/chanspy/chanspy.socket.js b/server/api/chanspy/chanspy.socket.js
index c0e03c0..29ebddc 100644
--- a/server/api/chanspy/chanspy.socket.js
+++ b/server/api/chanspy/chanspy.socket.js
@@ -1,28 +1 @@
-'use strict';
-
-const ChanSpyEvents = require('./chanspy.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('chanspy:' + event, socket);
-
-    ChanSpyEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    ChanSpyEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/chanspy/index.js b/server/api/chanspy/index.js
index 597a004..f03ff62 100644
--- a/server/api/chanspy/index.js
+++ b/server/api/chanspy/index.js
@@ -1,16 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./chanspy.controller');
-var auth = require('../../auth/auth.service');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.index);
-router.get('/:id', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.show);
-router.post('/', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.create);
-router.put('/:id', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.update);
-router.delete('/', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.bulkDestroy);
-router.delete('/:id', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/chat_application/chat_application.controller.js b/server/api/chat_application/chat_application.controller.js
index cc166a1..323ff13 100644
--- a/server/api/chat_application/chat_application.controller.js
+++ b/server/api/chat_application/chat_application.controller.js
@@ -1,97 +1 @@
-'use strict';
-var _ = require('lodash');
-var ChatApplication = require('../../models').ChatApplication;
-// Get list of chat_applications
-exports.index = function(req, res) {
-  return ChatApplication
-    .findAll({
-      where: req.query,
-      order: 'priority',
-      include: [{
-        all: true
-      }]
-    })
-    .then(function(chat_applications) {
-      return res.status(200).send(chat_applications);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-// Get a single chat_application
-exports.show = function(req, res) {
-  return ChatApplication
-    .findById(req.params.id)
-    .then(function(chat_application) {
-      if (!chat_application) {
-        return res.sendStatus(404);
-      }
-      return res.send(chat_application);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-// Creates a new chat_application in the DB.
-exports.create = function(req, res, next) {
-  return ChatApplication.max('priority', {
-      where: {
-        ChatWebsiteId: req.body.ChatWebsiteId
-      }
-    }).then(function(max) {
-      // SET PRIORITY
-      req.body.priority = max ? ++max : 1;
-      return ChatApplication
-        .create(req.body);
-    })
-    .then(function(mailApplication) {
-      return res.status(201).send(mailApplication);
-    })
-    .catch(function(err) {
-      next(err);
-    });
-};
-// Updates an existing chat_application in the DB.
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  return ChatApplication
-    .findById(req.params.id)
-    .then(function(chat_application) {
-      if (!chat_application) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(chat_application, req.body);
-      return updated
-        .save();
-    })
-    .then(function(chat_application) {
-      return res.status(200).send(chat_application);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-// Deletes a chat_application from the DB.
-exports.destroy = function(req, res) {
-  return ChatApplication
-    .findById(req.params.id)
-    .then(function(chat_application) {
-      if (!chat_application) {
-        return res.sendStatus(404);
-      }
-      return chat_application
-        .destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/chat_application/chat_application.events.js b/server/api/chat_application/chat_application.events.js
index 25f766a..2ef686b 100644
--- a/server/api/chat_application/chat_application.events.js
+++ b/server/api/chat_application/chat_application.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const ChatApplication = require('../../models').ChatApplication;
-
-var ChatApplicationEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-ChatApplicationEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  ChatApplication.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    ChatApplicationEvents.emit(event + ':' + doc._id, doc);
-    ChatApplicationEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = ChatApplicationEvents;
\ No newline at end of file
diff --git a/server/api/chat_application/chat_application.socket.js b/server/api/chat_application/chat_application.socket.js
index 1e82b2e..5ca3df9 100644
--- a/server/api/chat_application/chat_application.socket.js
+++ b/server/api/chat_application/chat_application.socket.js
@@ -1,28 +1 @@
-'use strict';
-
-const ChatApplicationEvents = require('./chat_application.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('chat_application:' + event, socket);
-
-    ChatApplicationEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    ChatApplicationEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/chat_application/index.js b/server/api/chat_application/index.js
index d72780d..e99730b 100644
--- a/server/api/chat_application/index.js
+++ b/server/api/chat_application/index.js
@@ -1,17 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./chat_application.controller');
-var license = require('../../config/license/license.service');
-var auth = require('../../auth/auth.service');
-
-var router = express.Router();
-
-router.get('/', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.index);
-router.get('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.show);
-router.post('/', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.create);
-router.put('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.update);
-router.patch('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.update);
-router.delete('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/chat_disposition/chat_disposition.controller.js b/server/api/chat_disposition/chat_disposition.controller.js
index 4902da1..523133c 100644
--- a/server/api/chat_disposition/chat_disposition.controller.js
+++ b/server/api/chat_disposition/chat_disposition.controller.js
@@ -1,111 +1 @@
-/**
- * Using Rails-like standard naming convention for endpoints.
- * GET     /api/chat/dispositions              ->  index
- * POST    /api/chat/dispositions              ->  create
- * GET     /api/chat/dispositions/:id          ->  show
- * PUT     /api/chat/dispositions/:id          ->  update
- * DELETE  /api/chat/dispositions/:id          ->  destroy
- */
-
-'use strict';
-
-
-var _ = require('lodash');
-
-var ChatDisposition = require('../../models').ChatDisposition;
-
-
-function handleError(res, statusCode) {
-  statusCode = statusCode || 500;
-  return function(err) {
-    res.status(statusCode).send(err);
-  };
-}
-
-function responseWithResult(res, statusCode) {
-  statusCode = statusCode || 200;
-  return function(entity) {
-    if (entity) {
-      res.status(statusCode).json(entity);
-    }
-  };
-}
-
-function responseWithoutResult(res, statusCode) {
-  statusCode = statusCode || 200;
-  return function() {
-    res.sendStatus(statusCode);
-  };
-}
-
-function handleEntityNotFound(res) {
-  return function(entity) {
-    if (!entity) {
-      res.status(404).end();
-      return null;
-    }
-    return entity;
-  };
-}
-
-function saveUpdates(updates) {
-  return function(entity) {
-    return entity.updateAttributes(updates)
-      .then(function(updated) {
-        return updated;
-      });
-  };
-}
-
-function removeEntity(res) {
-  return function(entity) {
-    if (entity) {
-      return entity.destroy()
-        .then(function() {
-          res.status(204).end();
-        });
-    }
-  };
-}
-
-// Gets a list of ChatDispositions
-exports.index = function(req, res) {
-  ChatDisposition.findAndCountAll()
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Gets a single ChatDisposition from the DB
-exports.show = function(req, res) {
-  ChatDisposition.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Creates a new ChatDisposition in the DB
-exports.create = function(req, res) {
-  ChatDisposition.create(req.body)
-    .then(responseWithResult(res, 201))
-    .catch(handleError(res));
-}
-
-// Updates an existing ChatDisposition in the DB
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  ChatDisposition.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(saveUpdates(req.body))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Deletes a ChatDisposition from the DB
-exports.destroy = function(req, res) {
-  ChatDisposition.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(removeEntity(res))
-    .catch(handleError(res));
-}
\ No newline at end of file
diff --git a/server/api/chat_disposition/chat_disposition.events.js b/server/api/chat_disposition/chat_disposition.events.js
index ec5fd9d..22a6965 100644
--- a/server/api/chat_disposition/chat_disposition.events.js
+++ b/server/api/chat_disposition/chat_disposition.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const ChatDisposition = require('../../models').ChatDisposition;
-
-var ChatDispositionEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-ChatDispositionEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  ChatDisposition.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    ChatDispositionEvents.emit(event + ':' + doc._id, doc);
-    ChatDispositionEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = ChatDispositionEvents;
\ No newline at end of file
diff --git a/server/api/chat_disposition/chat_disposition.socket.js b/server/api/chat_disposition/chat_disposition.socket.js
index 8788c23..e68bac5 100644
--- a/server/api/chat_disposition/chat_disposition.socket.js
+++ b/server/api/chat_disposition/chat_disposition.socket.js
@@ -1,32 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const ChatDispositionEvents = require('./chat_disposition.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('chat_disposition:' + event, socket);
-
-    ChatDispositionEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    ChatDispositionEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/chat_disposition/index.js b/server/api/chat_disposition/index.js
index aec3275..8eff950 100644
--- a/server/api/chat_disposition/index.js
+++ b/server/api/chat_disposition/index.js
@@ -1,18 +1 @@
-'use strict';
-
-var express = require('express');
-var auth = require('../../auth/auth.service');
-var controller = require('./chat_disposition.controller');
-var license = require('../../config/license/license.service');
-
-var router = express.Router();
-
-router.get('/', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), controller.index);
-router.get('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), controller.show);
-router.post('/', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), controller.create);
-router.put('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), controller.update);
-router.patch('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), controller.update);
-router.delete('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), controller.destroy);
-
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/chat_enquiry/enquiry.controller.js b/server/api/chat_enquiry/enquiry.controller.js
index 0adc0f6..2710fca 100644
--- a/server/api/chat_enquiry/enquiry.controller.js
+++ b/server/api/chat_enquiry/enquiry.controller.js
@@ -1,123 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var Util = require('../../config/util');
-
-var ChatEnquiry = require('../../models').ChatEnquiry;
-var ChatVisitor = require('../../models').ChatVisitor;
-var ChatWebsite = require('../../models').ChatWebsite;
-var List = require('../../models').List;
-
-// Get list of agents
-exports.index = function(req, res, next) {
-  return ChatEnquiry
-    .findAndCountAll(_.merge(Util.getQuery(req.query), {
-      include: [{
-        model: ChatWebsite,
-        attributes: ['id', 'name']
-      }]
-    }))
-    .then(function(result) {
-      return res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single enquiry
-exports.show = function(req, res) {
-  return ChatEnquiry
-    .findById(req.params.id, {
-      include: [{
-        model: ChatWebsite,
-        attributes: ['id', 'name', 'ListId'],
-      }, {
-        model: ChatVisitor
-      }]
-    })
-    .then(function(enquiry) {
-      if (!enquiry) {
-        return res.sendStatus(404);
-      }
-      return res.send(enquiry);
-    })
-    .catch(function(err) {
-      console.error(err);
-      return handleError(res, err);
-    });
-};
-
-// Creates a new enquiry in the DB.
-exports.create = function(req, res) {
-  return ChatEnquiry
-    .create(req.body)
-    .then(function(enquiry) {
-      return res.status(201).send(enquiry);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing enquiry in the DB.
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  return ChatEnquiry
-    .findById(req.params.id)
-    .then(function(enquiry) {
-      if (!enquiry) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(enquiry, req.body);
-      return updated
-        .save();
-    })
-    .then(function(enquiry) {
-      return res.status(200).send(enquiry);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a enquiry from the DB.
-exports.destroy = function(req, res) {
-  return ChatEnquiry
-    .findById(req.params.id)
-    .then(function(enquiry) {
-      if (!enquiry) {
-        return res.sendStatus(404);
-      }
-      return enquiry
-        .destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.bulkDestroy = function(req, res) {
-  return ChatEnquiry
-    .destroy({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/chat_enquiry/enquiry.events.js b/server/api/chat_enquiry/enquiry.events.js
index e818a2a..9c6f917 100644
--- a/server/api/chat_enquiry/enquiry.events.js
+++ b/server/api/chat_enquiry/enquiry.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const Enquiry = require('../../models').ChatEnquiry;
-
-var EnquiryEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-EnquiryEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  Enquiry.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    EnquiryEvents.emit(event + ':' + doc._id, doc);
-    EnquiryEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = EnquiryEvents;
\ No newline at end of file
diff --git a/server/api/chat_enquiry/enquiry.socket.js b/server/api/chat_enquiry/enquiry.socket.js
index 686f9a1..7c53976 100644
--- a/server/api/chat_enquiry/enquiry.socket.js
+++ b/server/api/chat_enquiry/enquiry.socket.js
@@ -1,28 +1 @@
-'use strict';
-
-const ChatEnquiryEvents = require('./enquiry.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('enquiry:' + event, socket);
-
-    ChatEnquiryEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    ChatEnquiryEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/chat_enquiry/index.js b/server/api/chat_enquiry/index.js
index 0add885..57fea1b 100644
--- a/server/api/chat_enquiry/index.js
+++ b/server/api/chat_enquiry/index.js
@@ -1,19 +1 @@
-'use strict';
-
-var express = require('express');
-
-var controller = require('./enquiry.controller');
-var license = require('../../config/license/license.service');
-var auth = require('../../auth/auth.service');
-
-var router = express.Router();
-
-router.get('/', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.index);
-router.get('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.show);
-router.post('/', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.create);
-router.put('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.update);
-router.patch('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.update);
-router.delete('/', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.bulkDestroy);
-router.delete('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/chat_message/chat_message.controller.js b/server/api/chat_message/chat_message.controller.js
index ac89444..b1c00c8 100644
--- a/server/api/chat_message/chat_message.controller.js
+++ b/server/api/chat_message/chat_message.controller.js
@@ -1,106 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var md5 = require('md5');
-
-var User = require('../../models').User;
-var ChatRoom = require('../../models').ChatRoom;
-var ChatMessage = require('../../models').ChatMessage;
-var ChatVisitor = require('../../models').ChatVisitor;
-
-// Get list of chat_messages
-exports.index = function(req, res) {
-  return ChatMessage
-    .findAll()
-    .then(function(chat_messages) {
-      return res.status(200).send(chat_messages);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.describe = function(req, res) {
-  return ChatMessage
-    .describe()
-    .then(function(fields) {
-      return res.status(200).send(fields);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single chatMessage
-exports.show = function(req, res) {
-  return ChatMessage
-    .findById(req.params.id)
-    .then(function(chatMessage) {
-      if (!chatMessage) {
-        return res.sendStatus(404);
-      }
-      return res.send(chatMessage);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new chatMessage in the DB.
-exports.create = function(req, res, next) {
-  return ChatMessage
-    .create(_.merge(req.body, {
-      UserId: req.user.id
-    }))
-    .then(function(chatMessage) {
-      return res.status(201).send(chatMessage);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing chatMessage in the DB.
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-
-  return ChatMessage
-    .findById(req.params.id)
-    .then(function(chatMessage) {
-      if (!chatMessage) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(chatMessage, req.body);
-      return updated.save();
-    })
-    .then(function(chatMessage) {
-      return res.status(200).send(chatMessage);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a chatMessage from the DB.
-exports.destroy = function(req, res) {
-  return ChatMessage
-    .findById(req.params.id)
-    .then(function(chatMessage) {
-      if (!chatMessage) {
-        return res.sendStatus(404);
-      }
-      return chatMessage.destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/chat_message/chat_message.events.js b/server/api/chat_message/chat_message.events.js
index 64d8887..083d617 100644
--- a/server/api/chat_message/chat_message.events.js
+++ b/server/api/chat_message/chat_message.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const ChatMessage = require('../../models').ChatMessage;
-
-var ChatMessageEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-ChatMessageEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  ChatMessage.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    ChatMessageEvents.emit(event + ':' + doc._id, doc);
-    ChatMessageEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = ChatMessageEvents;
\ No newline at end of file
diff --git a/server/api/chat_message/chat_message.socket.js b/server/api/chat_message/chat_message.socket.js
index df90ddc..2201893 100644
--- a/server/api/chat_message/chat_message.socket.js
+++ b/server/api/chat_message/chat_message.socket.js
@@ -1,62 +1 @@
-'use strict';
-
-const _ = require('lodash');
-
-const ChatMessage = require('../../models').ChatMessage;
-const ChatMessageEvents = require('./chat_message.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('chat_message:' + event, socket);
-
-    ChatMessageEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    return doc
-      .getChatRoom()
-      .then(function(chatRoom) {
-        return [chatRoom
-          .getUsers({
-            attributes: ['id', 'name', 'fullname', 'email', 'role', 'internal', 'userpic'],
-            raw: true
-          }), chatRoom
-          .getChatVisitor({
-            attributes: ['id', 'fullname', 'email'],
-            raw: true
-          })
-        ];
-      })
-      .spread(function(users, visitor) {
-        var sender = _.find(users, {
-          id: doc.UserId
-        });
-
-        users.forEach(function(user) {
-          // SOCKET FILTER
-          if (socket.userId == user.id && (sender || visitor)) {
-            socket.emit(event, _.merge(doc.dataValues, {
-              User: sender, // TODO modify to sender
-              ChatVisitor: sender ? null : visitor // TODO modify to visitor
-            }));
-          }
-        });
-      })
-      .catch(function(err) {
-        console.error(err);
-      });
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    ChatMessageEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/chat_message/index.js b/server/api/chat_message/index.js
index 947b5a8..44b9772 100644
--- a/server/api/chat_message/index.js
+++ b/server/api/chat_message/index.js
@@ -1,18 +1 @@
-'use strict';
-
-var express = require('express');
-
-var controller = require('./chat_message.controller');
-var license = require('../../config/license/license.service');
-var auth = require('../../auth/auth.service');
-
-var router = express.Router();
-
-router.get('/', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin', 'agent']), controller.index);
-router.get('/describe', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.describe);
-router.get('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin', 'agent']), controller.show);
-router.post('/', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin', 'agent']), controller.create);
-router.put('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.update);
-router.delete('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/chat_proactive_action/chat_proactive_action.controller.js b/server/api/chat_proactive_action/chat_proactive_action.controller.js
index 8e3b8ba..f9871cb 100644
--- a/server/api/chat_proactive_action/chat_proactive_action.controller.js
+++ b/server/api/chat_proactive_action/chat_proactive_action.controller.js
@@ -1,112 +1 @@
-/**
- * Using Rails-like standard naming convention for endpoints.
- * GET     /api/chat/proactives              ->  index
- * POST    /api/chat/proactives              ->  create
- * GET     /api/chat/proactives/:id          ->  show
- * PUT     /api/chat/proactives/:id          ->  update
- * DELETE  /api/chat/proactives/:id          ->  destroy
- */
-
-'use strict';
-
-
-var _ = require('lodash');
-var Util = require('../../config/util');
-
-var ChatProactiveAction = require('../../models').ChatProactiveAction;
-
-
-function handleError(res, statusCode) {
-  statusCode = statusCode || 500;
-  return function(err) {
-    res.status(statusCode).send(err);
-  };
-}
-
-function responseWithResult(res, statusCode) {
-  statusCode = statusCode || 200;
-  return function(entity) {
-    if (entity) {
-      res.status(statusCode).json(entity);
-    }
-  };
-}
-
-function responseWithoutResult(res, statusCode) {
-  statusCode = statusCode || 204;
-  return function() {
-    res.sendStatus(statusCode);
-  };
-}
-
-function handleEntityNotFound(res) {
-  return function(entity) {
-    if (!entity) {
-      res.status(404).end();
-      return null;
-    }
-    return entity;
-  };
-}
-
-function saveUpdates(updates) {
-  return function(entity) {
-    return entity.updateAttributes(updates)
-      .then(function(updated) { 
-        return updated;
-      });
-  };
-}
-
-function removeEntity(res) {
-  return function(entity) {
-    if (entity) {
-      return entity.destroy()
-        .then(function() {
-          res.status(204).end();
-        });
-    }
-  };
-}
-
-// Gets a list of ChatProactiveActions
-exports.index = function(req, res) {
-  return ChatProactiveAction.findAll(Util.getQuery(req.query))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Gets a single ChatProactiveAction from the DB
-exports.show = function(req, res) {
-  return ChatProactiveAction.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Creates a new ChatProactiveAction in the DB
-exports.create = function(req, res) {
-  return ChatProactiveAction.create(req.body)
-    .then(responseWithResult(res, 201))
-    .catch(handleError(res));
-}
-
-// Updates an existing ChatProactiveAction in the DB
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  return ChatProactiveAction.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(saveUpdates(req.body))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Deletes a ChatProactiveAction from the DB
-exports.destroy = function(req, res) {
-  return ChatProactiveAction.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(removeEntity(res))
-    .catch(handleError(res));
-}
\ No newline at end of file
diff --git a/server/api/chat_proactive_action/chat_proactive_action.events.js b/server/api/chat_proactive_action/chat_proactive_action.events.js
index 63b128a..2b7e734 100644
--- a/server/api/chat_proactive_action/chat_proactive_action.events.js
+++ b/server/api/chat_proactive_action/chat_proactive_action.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const ChatProactiveAction = require('../../models').ChatProactiveAction;
-
-var ChatProactiveActionEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-ChatProactiveActionEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  ChatProactiveAction.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    ChatProactiveActionEvents.emit(event + ':' + doc._id, doc);
-    ChatProactiveActionEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = ChatProactiveActionEvents;
\ No newline at end of file
diff --git a/server/api/chat_proactive_action/chat_proactive_action.socket.js b/server/api/chat_proactive_action/chat_proactive_action.socket.js
index 2e9d2a7..81aecee 100644
--- a/server/api/chat_proactive_action/chat_proactive_action.socket.js
+++ b/server/api/chat_proactive_action/chat_proactive_action.socket.js
@@ -1,28 +1 @@
-'use strict';
-
-const ChatProactiveActionEvents = require('./chat_proactive_action.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('chat_proactive_action:' + event, socket);
-
-    ChatProactiveActionEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    ChatProactiveActionEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/chat_proactive_action/index.js b/server/api/chat_proactive_action/index.js
index e8e0ecf..29cf7ab 100644
--- a/server/api/chat_proactive_action/index.js
+++ b/server/api/chat_proactive_action/index.js
@@ -1,17 +1 @@
-'use strict';
-
-var express = require('express');
-var auth = require('../../auth/auth.service');
-var controller = require('./chat_proactive_action.controller');
-var license = require('../../config/license/license.service');
-
-var router = express.Router();
-
-router.get('/', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.index);
-router.get('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.show);
-router.post('/', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.create);
-router.put('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.update);
-router.patch('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.update);
-router.delete('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/chat_queue/chat_queue.controller.js b/server/api/chat_queue/chat_queue.controller.js
index fa34821..31cd4be 100644
--- a/server/api/chat_queue/chat_queue.controller.js
+++ b/server/api/chat_queue/chat_queue.controller.js
@@ -1,237 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var Util = require('../../config/util');
-
-var ChatQueue = require('../../models').ChatQueue;
-var User = require('../../models').User;
-var UserHasChatQueue = require('../../models').UserHasChatQueue;
-
-// Get list of mailQueues
-exports.index = function(req, res) {
-  switch (req.user.role) {
-    case 'user':
-      return User
-        .findById(req.user.id, {
-          attributes: ['id']
-        })
-        .then(Util.getChatQueuesIdByUser(req.query))
-        .then(function(result) {
-          res.status(200).send(result);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-
-    default:
-      return ChatQueue
-        .scope('default')
-        .findAndCountAll(_.merge(Util.getQuery(req.query), {
-          distinct: true
-        }))
-        .then(function(result) {
-          return res.status(200).send({
-            rows: result.rows,
-            count: result.rows.length
-          });
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-  }
-};
-
-// Get list of my chat_rooms
-exports.me = function(req, res, next) {
-  return UserHasChatQueue
-    .findAll({
-      where: {
-        UserId: req.user.id
-      }
-    })
-    .then(function(userHasChatQueues) {
-      return res.status(200).send(userHasChatQueues);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single chat_queue
-exports.show = function(req, res) {
-  return ChatQueue
-    .findById(req.params.id)
-    .then(function(chat_queue) {
-      if (!chat_queue) {
-        return res.sendStatus(404);
-      }
-      return res.send(chat_queue);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single queue
-exports.showAgents = function(req, res) {
-  return ChatQueue
-    .findById(req.params.id)
-    .then(function(queue) {
-      if (!queue) {
-        return res.sendStatus(404);
-      }
-      return queue
-        .getUsers({
-          where: {
-            role: 'agent'
-          },
-          attributes: ['id', 'name', 'fullname', 'email']
-        });
-    })
-    .then(function(agents) {
-      return res.status(200).send({
-        rows: agents,
-        count: agents.length
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new chat_queue in the DB.
-exports.create = function(req, res) {
-  var _chatQueue;
-
-  return ChatQueue
-    .create(req.body)
-    .then(function(chatQueue) {
-      _chatQueue = chatQueue;
-
-      if (req.body.agents) {
-        return _chatQueue
-          .addUsers(req.body.agents, {
-            penalty: req.body.penalty || 0,
-            queue: _chatQueue.name
-          });
-      }
-    })
-    .then(function() {
-      return res.status(201).send(_chatQueue);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing chat_queue in the DB.
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  return ChatQueue
-    .findById(req.params.id)
-    .then(function(chat_queue) {
-      if (!chat_queue) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(chat_queue, req.body);
-      return updated.save();
-    })
-    .then(function(chat_queue) {
-      return res.status(200).send(chat_queue);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Add agents to chat queues
-exports.addAgents = function(req, res, next) {
-
-  return ChatQueue
-    .findById(req.params.id)
-    .then(function(chatQueue) {
-      if (!chatQueue) {
-        return res.sendStatus(404);
-      }
-      var userHasChatQueues = _.map(req.body.agents, function(agent) {
-        return {
-          UserId: agent,
-          penalty: req.body.penalty,
-          ChatQueueId: chatQueue.id,
-          queue: chatQueue.name
-        };
-      });
-
-      return UserHasChatQueue
-        .bulkCreate(userHasChatQueues, {
-          individualHooks: true
-        });
-    })
-    .then(function() {
-      return res.sendStatus(200);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.removeAgents = function(req, res, next) {
-  return ChatQueue
-    .findById(req.params.id)
-    .then(function(chatQueue) {
-      if (!chatQueue) {
-        return res.sendStatus(404);
-      }
-      return chatQueue
-        .removeUsers(req.query.agents, {
-          individualHooks: true
-        });
-    })
-    .then(function() {
-      return res.sendStatus(200);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a chat_queue from the DB.
-exports.destroy = function(req, res) {
-  return ChatQueue
-    .findById(req.params.id)
-    .then(function(chat_queue) {
-      if (!chat_queue) {
-        return res.sendStatus(404);
-      }
-      return chat_queue.destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a agent from the DB.
-exports.bulkDestroy = function(req, res) {
-  return ChatQueue
-    .destroy({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/chat_queue/chat_queue.events.js b/server/api/chat_queue/chat_queue.events.js
index 7fe734e..5d6bc8f 100644
--- a/server/api/chat_queue/chat_queue.events.js
+++ b/server/api/chat_queue/chat_queue.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const ChatQueue = require('../../models').ChatQueue;
-
-var ChatQueueEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-ChatQueueEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  ChatQueue.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    ChatQueueEvents.emit(event + ':' + doc._id, doc);
-    ChatQueueEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = ChatQueueEvents;
\ No newline at end of file
diff --git a/server/api/chat_queue/chat_queue.socket.js b/server/api/chat_queue/chat_queue.socket.js
index cee7104..0244843 100644
--- a/server/api/chat_queue/chat_queue.socket.js
+++ b/server/api/chat_queue/chat_queue.socket.js
@@ -1,28 +1 @@
-'use strict';
-
-const ChatQueueEvents = require('./chat_queue.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('chat_queue:' + event, socket);
-
-    ChatQueueEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    ChatQueueEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/chat_queue/index.js b/server/api/chat_queue/index.js
index ecfb13e..1fd54ee 100644
--- a/server/api/chat_queue/index.js
+++ b/server/api/chat_queue/index.js
@@ -1,23 +1 @@
-'use strict';
-
-var express = require('express');
-
-var controller = require('./chat_queue.controller');
-var auth = require('../../auth/auth.service');
-var license = require('../../config/license/license.service');
-
-var router = express.Router();
-
-router.get('/', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.index);
-router.get('/me', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.me);
-router.get('/:id/agents', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.showAgents);
-router.get('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.show);
-router.post('/', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.create);
-router.post('/:id/agents', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.addAgents);
-router.put('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.update);
-router.delete('/:id/agents', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.removeAgents);
-router.patch('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.update);
-router.delete('/', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.bulkDestroy);
-router.delete('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/chat_room/chat_room.controller.js b/server/api/chat_room/chat_room.controller.js
index 47b4932..d14bd1a 100644
--- a/server/api/chat_room/chat_room.controller.js
+++ b/server/api/chat_room/chat_room.controller.js
@@ -1,655 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var md5 = require('md5');
-var moment = require('moment');
-var csv = require('to-csv');
-var util = require('util');
-
-var Util = require('../../config/util');
-
-var User = require('../../models').User;
-var Agent = require('../../models').User;
-var ChatRoom = require('../../models').ChatRoom;
-var ChatMessage = require('../../models').ChatMessage;
-var ChatWebsite = require('../../models').ChatWebsite;
-var ChatApplication = require('../../models').ChatApplication;
-var ChatQueue = require('../../models').ChatQueue;
-var ChatVisitor = require('../../models').ChatVisitor;
-var List = require('../../models').List;
-var UserHasChatRoom = require('../../models').UserHasChatRoom;
-
-// Get list of chat_rooms
-exports.index = function(req, res, next) {
-  return ChatRoom
-    .findAndCountAll(_.merge(Util.getQuery(req.query), {
-      include: [{
-        model: User,
-        attributes: ['id', 'name', 'fullname', 'email', 'role', 'internal']
-      }, {
-        model: ChatMessage
-      }, {
-        model: ChatVisitor
-      }]
-    }))
-    .then(function(result) {
-      res.status(200).send(result);
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-// Get list of fields
-exports.describe = function(req, res) {
-  return ChatRoom
-    .describe()
-    .then(function(fields) {
-      return res.status(200).send(fields);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function getChatQueues(user) {
-  return function() {
-    switch (user.role) {
-      case 'user':
-        return User
-          .findById(user.id, {
-            attributes: ['id']
-          })
-          .then(Util.getChatQueuesIdByUser({}, {
-            attributes: ['id']
-          }))
-          .then(function(userQueues) {
-            return {
-              include: {
-                model: ChatWebsite,
-                include: {
-                  model: ChatApplication,
-                  include: {
-                    model: ChatQueue,
-                    where: {
-                      id: _.map(userQueues, 'id')
-                    }
-                  }
-                }
-              }
-            };
-          });
-      default:
-        return {};
-    }
-  }
-}
-
-exports.unmanaged = function(req, res) {
-  return Promise
-    .all([])
-    .then(getChatQueues(req.user))
-    .then(function(condition) {
-      return ChatRoom
-        .count(_.merge(Util.getQuery(req.query, {
-          status: 'UNMANAGED',
-          updatedAt: {
-            $gte: moment().startOf('day')
-          }
-        }), condition));
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-exports.updatePatch = function(req, res, next) {
-  var _values = {
-    tags: req.body.tags
-  };
-  var _options = {
-    where: {
-      id: req.params.id.split(',')
-    }
-  };
-
-  return ChatRoom
-    .update(_values, _options)
-    .then(function(chatRooms) {
-      if (!chatRooms) {
-        return res.sendStatus(404);
-      }
-      return chatRooms
-    })
-    .then(function(chatRooms) {
-      return res.sendStatus(200);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function checkTags(query) {
-  if (query) {
-    if (query.tags) {
-      query.$and = [];
-      if (_.isArray(query.tags)) {
-        for (var i = 0; i < query.tags.length; i++) {
-          query.$and.push({
-            tags: {
-              $like: '%' + query.tags[i] + ';%'
-            }
-          });
-        }
-      } else {
-        query.$and.push({
-          tags: {
-            $like: '%' + query.tags + ';%'
-          }
-        });
-      }
-
-      delete query.tags;
-    }
-  }
-}
-
-exports.getAgents = function(req, res, next) {
-  switch (req.user.role) {
-    case 'user':
-      return User
-        .findById(req.user.id, {
-          attributes: ['id'],
-          where: {
-            id: {
-              $ne: req.user.id
-            },
-            online: true
-          }
-        })
-        .then(Util.getAgentsIdByUser(_.merge(req.query, {
-          id: {
-            $ne: req.user.id
-          }
-        })))
-        .then(function(result) {
-          return res.status(200).send(result);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-
-    default:
-      return User
-        .scope('all')
-        .findAndCountAll(_.merge(Util.getQuery(req.query), {
-          where: {
-            id: {
-              $ne: req.user.id
-            },
-            online: true
-          }
-        }))
-        .then(function(result) {
-          return res.status(200).send(result);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-  }
-};
-
-exports.getGroups = function(req, res, next) {
-  checkTags(req.query);
-  var _query = {
-    where: _.merge({
-      type: 'group'
-    }, req.query)
-  };
-
-  switch (req.user.role) {
-    case 'agent':
-      _.merge(_query, {
-        include: [{
-          model: User,
-          attributes: ['id'],
-          where: {
-            id: req.user.id
-          }
-        }]
-      })
-      break;
-
-    default:
-  }
-
-  return ChatRoom
-    .findAll(_query)
-    .then(function(chatRooms) {
-      return ChatRoom
-        .findAll({
-          where: {
-            id: {
-              $in: _.map(chatRooms, 'id')
-            }
-          },
-          include: [{
-            model: User,
-            attributes: ['id', 'name', 'fullname', 'role', 'userpic']
-          }, {
-            model: ChatVisitor
-          }]
-        });
-    })
-    .then(function(chatRooms) {
-      return res.status(200).send({
-        rows: chatRooms,
-        count: chatRooms.length
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.getExternals = function(req, res, next) {
-  checkTags(req.query);
-  var _query = {
-    where: _.merge({
-      type: 'external'
-    }, req.query),
-    include: [{
-      model: ChatVisitor,
-      attributes: ['id', 'fullname']
-    }]
-  };
-
-  switch (req.user.role) {
-    case 'agent':
-      _query.include.push({
-        model: User,
-        attributes: ['id'],
-        where: {
-          id: req.user.id
-        }
-      });
-
-      break;
-    default:
-  }
-
-  return ChatRoom
-    .findAll(_query)
-    .then(function(chatRooms) {
-      return res.status(200).send({
-        rows: chatRooms,
-        count: chatRooms.length
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.getAgent = function(req, res, next) {
-  return User
-    .scope('all')
-    .findById(req.params.id)
-    .then(function(result) {
-      return res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.getOnlineRoom = function(req, res, next) {
-  return ChatRoom
-    .scope('online')
-    .findAndCountAll(_.merge(Util.getQuery(req.query), {
-      include: [{
-        model: User,
-        attributes: ['id', 'name', 'fullname', 'email', 'role', 'internal']
-      }, {
-        model: ChatMessage
-      }, {
-        model: ChatVisitor
-      }]
-    }))
-    .then(function(result) {
-      res.status(200).send(result);
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-// Get list of my chat_rooms
-exports.me = function(req, res) {
-  return User
-    .findById(req.user.id)
-    .then(function(user) {
-      return user
-        .getChatRooms({
-          include: [{
-            model: ChatVisitor,
-            attributes: ['id', 'fullname', 'email']
-          }, {
-            model: User,
-            attributes: ['id', 'name', 'fullname', 'email', 'role', 'internal']
-          }]
-        });
-    })
-    .then(function(chatRooms) {
-      if (!chatRooms) {
-        return res.sendStatus(404);
-      }
-      return res.send(chatRooms);
-    })
-    .catch(function(err) {
-      console.error(err);
-      return handleError(res, err);
-    });
-};
-
-// Get a single chatRoom
-exports.show = function(req, res) {
-  return ChatRoom
-    .findById(req.params.id, {
-      include: [{
-        model: ChatMessage,
-        include: [{
-          model: ChatVisitor,
-          attributes: ['id', 'email', 'fullname']
-        }, {
-          model: User,
-          attributes: ['id', 'email', 'name', 'fullname', 'userpic', 'role', 'internal']
-        }]
-      }, {
-        model: User,
-        attributes: ['id', 'email', 'name', 'fullname', 'userpic', 'role', 'internal']
-      }, {
-        model: ChatVisitor
-      }, {
-        model: ChatWebsite,
-        attributes: ['id', 'name', 'address'],
-        include: [List]
-      }]
-    })
-    .then(function(chatRoom) {
-      if (!chatRoom) {
-        return res.sendStatus(404);
-      }
-      return res.send(chatRoom);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single chatRoom by users
-exports.getRoomByUsers = function(req, res, next) {
-
-  var _chatRoom;
-
-  return ChatRoom
-    .findOrCreate({
-      where: {
-        token: md5(JSON.stringify(req.query.users.sort())).toString('base64')
-      },
-      defaults: {
-        type: 'internal',
-        token: md5(JSON.stringify(req.query.users.sort())).toString('base64'),
-        status: 'OPEN'
-      },
-      include: [{
-        model: ChatMessage,
-        include: [{
-          model: ChatVisitor,
-          attributes: ['id', 'email', 'fullname']
-        }, {
-          model: User,
-          attributes: ['id', 'name', 'fullname', 'email', 'role', 'internal']
-        }]
-      }, {
-        model: User,
-        attributes: ['id', 'name', 'fullname', 'email', 'role', 'internal']
-      }]
-    })
-    .spread(function(chatRoom, created) {
-      _chatRoom = chatRoom;
-      if (created) {
-        return _chatRoom
-          .setUsers(req.query.users);
-      }
-    })
-    .then(function() {
-      return _chatRoom
-        .getUsers();
-    })
-    .then(function(users) {
-      return res.status(200).send(_.merge(_chatRoom.dataValues, {
-        Users: users
-      }));
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.createMessage = function(req, res, next) {
-  var _chatRoom;
-
-  return ChatRoom
-    .findById(req.params.id)
-    .then(function(chatRoom) {
-      _chatRoom = chatRoom;
-
-      if (!_chatRoom) {
-        return res.sendStatus(404);
-      }
-    })
-    .then(function() {
-      return ChatMessage
-        .create(_.merge(req.body, {
-          type: _chatRoom.type,
-          ChatRoomId: req.params.id,
-          UserId: req.user.id
-        }));
-    })
-    .then(function(chatMessage) {
-      return res.status(200).send(chatMessage);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.export = function(req, res, next) {
-  return ChatRoom
-    .findById(req.params.id, {
-      include: [{
-        model: ChatMessage,
-        include: [{
-          model: ChatVisitor,
-          attributes: ['id', 'fullname']
-        }, {
-          model: User,
-          attributes: ['id', 'fullname']
-        }]
-      }]
-    })
-    .then(function(chatRoom) {
-      var chatMessageForCSV = [];
-      chatRoom.ChatMessages.forEach(function(chatMessage) {
-        chatMessageForCSV.push({
-          name: chatMessage.User ? chatMessage.User.fullname : chatMessage.ChatVisitor.fullname,
-          text: chatMessage.body.replace(/(\r\n|\n|\r)/gm, " "),
-          date: chatMessage.createdAt
-        });
-      });
-      return res.type('text/csv')
-        .status(200).send(csv(chatMessageForCSV));
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single chatRoom
-exports.getRoomByType = function(req, res) {
-  return User
-    .findById(req.user.id)
-    .then(function(user) {
-      return user
-        .getChatRooms({
-          where: {
-            type: req.params.type
-          },
-          include: [{
-            model: ChatVisitor,
-            attributes: ['id', 'fullname', 'email']
-          }]
-        });
-    })
-    .then(function(chatRooms) {
-      if (!chatRooms) {
-        return res.sendStatus(404);
-      }
-      return res.send(chatRooms);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single chatRoom
-exports.getRoomGroups = function(req, res) {
-  return User
-    .findById(req.user.id)
-    .then(function(user) {
-      return user
-        .getChatRooms({
-          include: [{
-            model: ChatVisitor,
-            attributes: ['id', 'fullname', 'email']
-          }, {
-            model: User,
-            attributes: ['id', 'name', 'fullname', 'email', 'role', 'internal']
-          }]
-        });
-    })
-    .then(function(chatRooms) {
-      if (!chatRooms) {
-        return res.sendStatus(404);
-      }
-      return res.send(chatRooms);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new chatRoom in the DB.
-exports.create = function(req, res) {};
-
-// Updates an existing chatRoom in the DB.
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-
-  return ChatRoom
-    .findById(req.params.id)
-    .then(function(chatRoom) {
-      if (!chatRoom) {
-        return res.sendStatus(404);
-      }
-      return chatRoom
-        .update(req.body);
-    })
-    .then(function(chatRoom) {
-      return res.status(200).send(chatRoom);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing chatRoom in the DB.
-exports.updateUsers = function(req, res) {
-  var _chatRoom;
-
-  if (req.body.id) {
-    delete req.body.id;
-  }
-
-  return ChatRoom
-    .findById(req.params.id)
-    .then(function(chatRoom) {
-      if (!chatRoom || !req.body.users) {
-        return res.sendStatus(404);
-      }
-      return chatRoom;
-    })
-    .then(function(chatRoom) {
-      return chatRoom
-        .update({
-          type: 'group',
-          token: md5(JSON.stringify(req.body.users.sort())).toString('base64')
-        });
-    })
-    .then(function(chatRoom) {
-      _chatRoom = chatRoom;
-      return chatRoom
-        .setUsers(req.body.users.sort(), {
-          individualHooks: true
-        });
-    })
-    .then(function() {
-      return _chatRoom
-        .getUsers();
-    })
-    .then(function(users) {
-      _.merge(_chatRoom.dataValues, {
-        Users: users
-      });
-
-      return res.status(200).send(_chatRoom);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a chatRoom from the DB.
-exports.destroy = function(req, res) {
-  return ChatRoom
-    .findById(req.params.id)
-    .then(function(chatRoom) {
-      if (!chatRoom) {
-        return res.sendStatus(404);
-      }
-      return chatRoom
-        .destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  console.log(err);
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/chat_room/chat_room.events.js b/server/api/chat_room/chat_room.events.js
index b842a41..2e2f3c5 100644
--- a/server/api/chat_room/chat_room.events.js
+++ b/server/api/chat_room/chat_room.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const ChatRoom = require('../../models').ChatRoom;
-
-var ChatRoomEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-ChatRoomEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  ChatRoom.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    ChatRoomEvents.emit(event + ':' + doc._id, doc);
-    ChatRoomEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = ChatRoomEvents;
\ No newline at end of file
diff --git a/server/api/chat_room/chat_room.socket.js b/server/api/chat_room/chat_room.socket.js
index 0f60e68..46ea3be 100644
--- a/server/api/chat_room/chat_room.socket.js
+++ b/server/api/chat_room/chat_room.socket.js
@@ -1,28 +1 @@
-'use strict';
-
-const ChatRoomEvents = require('./chat_room.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('chat_room:' + event, socket);
-
-    ChatRoomEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    ChatRoomEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/chat_room/index.js b/server/api/chat_room/index.js
index 43f0a87..cc5c5d9 100644
--- a/server/api/chat_room/index.js
+++ b/server/api/chat_room/index.js
@@ -1,32 +1 @@
-'use strict';
-
-var express = require('express');
-
-var controller = require('./chat_room.controller');
-var auth = require('../../auth/auth.service');
-var license = require('../../config/license/license.service');
-
-var router = express.Router();
-
-router.get('/', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin', 'agent']), controller.index);
-router.get('/online', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin', 'agent']), controller.getOnlineRoom);
-router.get('/describe', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.describe);
-router.get('/unmanaged', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.unmanaged);
-router.get('/me', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin', 'user', 'agent']), controller.me);
-router.get('/groups', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin', 'agent']), controller.getGroups);
-router.get('/externals', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin', 'agent']), controller.getExternals);
-router.get('/agents', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin', 'agent']), controller.getAgents);
-router.get('/agents/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin', 'agent']), controller.getAgent);
-router.get('/users', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin', 'agent']), controller.getRoomByUsers);
-// router.get('/groups', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin', 'agent']), controller.getRoomGroups);
-router.get('/type/:type', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin', 'agent']), controller.getRoomByType);
-router.get('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin', 'agent']), controller.show);
-router.get('/:id/export', license.isValidDate(), license.hasChat(), controller.export);
-router.post('/', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin', 'agent']), controller.create);
-router.post('/:id/messages', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin', 'agent']), controller.createMessage);
-router.patch('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin', 'agent']), controller.updatePatch);
-router.put('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin', 'agent']), controller.update);
-router.put('/:id/users', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin', 'agent']), controller.updateUsers);
-router.delete('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin', 'agent']), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/chat_visitor/chat_visitor.controller.js b/server/api/chat_visitor/chat_visitor.controller.js
index 38e5d14..338e3fe 100644
--- a/server/api/chat_visitor/chat_visitor.controller.js
+++ b/server/api/chat_visitor/chat_visitor.controller.js
@@ -1,104 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var Util = require('../../config/util');
-
-var ChatVisitor = require('../../models').ChatVisitor;
-var ChatEnquiry = require('../../models').ChatEnquiry;
-var ChatWebsite = require('../../models').ChatWebsite;
-
-// Get list of agents
-exports.index = function(req, res, next) {
-  return ChatVisitor
-    .findAndCountAll(_.merge(Util.getQuery(req.query), {
-      include: [{
-        model: ChatWebsite
-      }]
-    }))
-    .then(function(result) {
-      res.status(200).send(result);
-    })
-    .catch(function(err) {
-      console.error(err);
-      return handleError(res, err);
-    });
-};
-
-// Get a single chatVisitor
-exports.show = function(req, res) {
-  return ChatVisitor
-    .findById(req.params.id, {
-      include: [{
-        model: ChatEnquiry
-      }, {
-        model: ChatWebsite
-      }]
-    })
-    .then(function(chatVisitor) {
-      if (!chatVisitor) {
-        return res.sendStatus(404);
-      }
-      return res.send(chatVisitor);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new chatVisitor in the DB.
-exports.create = function(req, res) {
-  return ChatVisitor
-    .create(req.body)
-    .then(function(chatVisitor) {
-      return res.status(201).send(chatVisitor);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing chatVisitor in the DB.
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  return ChatVisitor
-    .findById(req.params.id)
-    .then(function(chatVisitor) {
-      if (!chatVisitor) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(chatVisitor, req.body);
-      return updated
-        .save();
-    })
-    .then(function(chatVisitor) {
-      return res.status(200).send(chatVisitor);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a chatVisitor from the DB.
-exports.destroy = function(req, res) {
-  return ChatVisitor
-    .findById(req.params.id)
-    .then(function(chatVisitor) {
-      if (!chatVisitor) {
-        return res.sendStatus(404);
-      }
-      return chatVisitor
-        .destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/chat_visitor/chat_visitor.events.js b/server/api/chat_visitor/chat_visitor.events.js
index d4c36db..3124766 100644
--- a/server/api/chat_visitor/chat_visitor.events.js
+++ b/server/api/chat_visitor/chat_visitor.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const ChatVisitor = require('../../models').ChatVisitor;
-
-var ChatVisitorEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-ChatVisitorEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  ChatVisitor.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    ChatVisitorEvents.emit(event + ':' + doc._id, doc);
-    ChatVisitorEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = ChatVisitorEvents;
\ No newline at end of file
diff --git a/server/api/chat_visitor/chat_visitor.socket.js b/server/api/chat_visitor/chat_visitor.socket.js
index 3a627b1..cd61207 100644
--- a/server/api/chat_visitor/chat_visitor.socket.js
+++ b/server/api/chat_visitor/chat_visitor.socket.js
@@ -1,28 +1 @@
-'use strict';
-
-const ChatVisitorEvents = require('./chat_visitor.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('chat_visitor:' + event, socket);
-
-    ChatVisitorEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    ChatVisitorEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/chat_visitor/index.js b/server/api/chat_visitor/index.js
index 829db71..06e7ef7 100644
--- a/server/api/chat_visitor/index.js
+++ b/server/api/chat_visitor/index.js
@@ -1,17 +1 @@
-'use strict';
-
-var express = require('express');
-
-var controller = require('./chat_visitor.controller');
-var auth = require('../../auth/auth.service');
-var license = require('../../config/license/license.service');
-
-var router = express.Router();
-
-router.get('/', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.index);
-router.get('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.show);
-router.post('/', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.create);
-router.put('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.update);
-router.delete('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/chat_website/chat_website.controller.js b/server/api/chat_website/chat_website.controller.js
index 2543fd9..e9e15ac 100644
--- a/server/api/chat_website/chat_website.controller.js
+++ b/server/api/chat_website/chat_website.controller.js
@@ -1,579 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var util = require('util');
-var Mustache = require('mustache');
-var Util = require('../../config/util');
-
-var sequelize = require('../../models').sequelize;
-var ChatWebsite = require('../../models').ChatWebsite;
-var ChatQueue = require('../../models').ChatQueue;
-var User = require('../../models').User;
-var Interval = require('../../models').Interval;
-var ChatApplication = require('../../models').ChatApplication;
-var ChatWebsitesField = require('../../models').ChatWebsitesField;
-var ChatProactiveAction = require('../../models').ChatProactiveAction;
-var ChatDisposition = require('../../models').ChatDisposition;
-var snippet = require('../../components/xchatty').snippet;
-var UploadFile = require('upload-file');
-var path = require('path');
-var sr = require('simple-random');
-var config = require('../../config/environment');
-
-
-// Get list of agents
-exports.index = function(req, res, next) {
-  return ChatWebsite
-    .findAndCountAll(Util.getQuery(req.query))
-    .then(function(result) {
-      res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-// Get a single chat_website
-exports.show = function(req, res) {
-  return ChatWebsite
-    .findById(req.params.id)
-    .then(function(chat_website) {
-      if (!chat_website) {
-        return res.sendStatus(404);
-      }
-      return res.send(chat_website);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-
-exports.changeLogo = function(req, res) {
-
-  var upload = new UploadFile({
-    dest: path.join(config.root, 'server', 'files', 'images'),
-    maxNumberOfFiles: 1,
-    minNumberOfFiles: 0,
-    acceptFileTypes: /(\.|\/)(jpeg|png)$/i,
-    rename: function(name, file) {
-      return sr() + path.extname(file.filename);
-    },
-    messages: {
-      maxNumberOfFiles: "Max number of files upload exceeded",
-      acceptFileTypes: "Only jpeg and png format accepted",
-      invalidRequest: "Invalid request"
-    }
-  });
-
-  upload.on('end', function(fields, files) {
-    if (!files.file.filename) {
-      return res.status(500).send(upload);
-    }
-    return sequelize.transaction(function(t) {
-        return ChatWebsite
-          .findById(req.params.id)
-          .then(function(website) {
-            if (!website) {
-              return res.sendStatus(404);
-            }
-            var body = {};
-            body.logo = files.file.filename;
-            return website
-              .update(body, {
-                transaction: t
-              });
-          })
-          .then(function(user) {
-            return res.status(200).send(user);
-          })
-      })
-      .catch(function(err) {
-        return handleError(res, err);
-      });
-  });
-
-  upload.on('error', function(err) {
-    console.log('********** Upload error :', err)
-    return handleError(res, err);
-  });
-
-  upload.parse(req);
-}
-
-exports.getDispositions = function(req, res, next) {
-  return ChatWebsite
-    .findById(req.params.id)
-    .then(function(chat_website) {
-      if (!chat_website) {
-        return res.sendStatus(404);
-      }
-
-      return chat_website
-        .getChatDispositions();
-    })
-    .then(function(chatDispositions) {
-      return res.status(200).send({
-        rows: chatDispositions,
-        count: chatDispositions.length
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.createDisposition = function(req, res, next) {
-  req.body.ChatWebsiteId = req.params.id;
-
-  return ChatDisposition
-    .create(req.body)
-    .then(function(chatDisposition) {
-      return res.status(201).send(chatDisposition);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.updateDisposition = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-
-  return ChatDisposition
-    .findById(req.params.dispId)
-    .then(function(chatDisposition) {
-      if (!chatDisposition) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(chatDisposition, req.body);
-      return updated
-        .save();
-    })
-    .then(function(chat_website) {
-      return res.status(200).send(chat_website);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.destroyDisposition = function(req, res, next) {
-  return ChatDisposition
-    .findById(req.params.dispId)
-    .then(function(chatDiposition) {
-      if (!chatDiposition) {
-        return res.sendStatus(404);
-      }
-
-      return chatDiposition
-        .destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.showApplications = function(req, res, next) {
-  return ChatWebsite
-    // .scope('default')
-    .findById(req.params.id)
-    .then(function(chatWebsite) {
-      if (!chatWebsite) {
-        return res.sendStatus(404);
-      }
-      return chatWebsite
-        .getChatApplications(_.merge(Util.getQuery(req.query), {
-          include: [{
-            model: ChatQueue,
-            attributes: ['id', 'name']
-          }, {
-            model: User,
-            attributes: ['id', 'name']
-          }, {
-            model: Interval,
-            attributes: ['id', 'name']
-          }]
-        }));
-    })
-    .then(function(chatApplications) {
-      return res.send({
-        count: chatApplications.length,
-        rows: chatApplications
-      });
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-exports.showProactiveActions = function(req, res, next) {
-  return ChatWebsite
-    .findById(req.params.id)
-    .then(function(chatWebsite) {
-      if (!chatWebsite) {
-        return res.sendStatus(404);
-      }
-      return chatWebsite
-        .getChatProactiveActions(Util.getQuery(req.query));
-    })
-    .then(function(chatProactiveActions) {
-      return res.send({
-        count: chatProactiveActions.length,
-        rows: chatProactiveActions
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a snippet for chat_website
-exports.getSnippetCode = function(req, res) {
-  return ChatWebsite
-    .findById(req.params.id)
-    .then(function(chat_website) {
-      var configSnippet = {
-        remote: chat_website.remote,
-        websiteId: req.params.id
-      };
-      var html = Mustache.render(snippet, configSnippet);
-      return res.status(200).send({
-        html: html
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new chat_website in the DB.
-exports.create = function(req, res) {
-  return ChatWebsite
-    .create(req.body)
-    .then(function(chat_website) {
-      return res.status(201).send(chat_website);
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing chat_website in the DB.
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-
-  return ChatWebsite
-    .findById(req.params.id)
-    .then(function(chat_website) {
-      if (!chat_website) {
-        return res.sendStatus(404);
-      }
-
-      return chat_website
-        .update(req.body);
-    })
-    .then(function(chat_website) {
-      return res.status(200).send(chat_website);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.updateApplications = function(req, res) {
-
-  var priority = 0;
-  var apps = req.body;
-
-  apps.forEach(function(app) {
-    delete app.id;
-    delete app.createdAt;
-    delete app.updatedAt;
-
-    app.priority = ++priority;
-  });
-
-  return sequelize.transaction(function(t) {
-    return ChatApplication
-      .destroy({
-        where: {
-          ChatWebsiteId: req.params.id
-        },
-        individualHooks: true,
-        transaction: t
-      }).then(function() {
-        return ChatApplication
-          .bulkCreate(apps, {
-            individualHooks: true,
-            transaction: t
-          });
-      });
-  }).then(function(chatApplications) {
-    return res.status(200).send({
-      count: chatApplications.length,
-      rows: chatApplications
-    });
-  }).catch(function(err) {
-    return handleError(res, err);
-  });
-};
-
-// Deletes a chat_website from the DB.
-exports.destroy = function(req, res) {
-  return ChatWebsite
-    .findById(req.params.id)
-    .then(function(chat_website) {
-      if (!chat_website) {
-        return res.sendStatus(404);
-      }
-      return chat_website
-        .destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a agent from the DB.
-exports.bulkDestroy = function(req, res) {
-  return ChatWebsite
-    .destroy({
-      where: {
-        id: req.query.websites
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a agent from the DB.
-exports.bulkDestroyApplications = function(req, res) {
-  return ChatApplication
-    .destroy({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a mailAccount from the DB.
-exports.destroyApplication = function(req, res, next) {
-  return ChatApplication
-    .findById(req.params.appId)
-    .then(function(chatApplication) {
-      if (!chatApplication) {
-        return res.sendStatus(404);
-      }
-
-      return chatApplication
-        .destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.getForms = function(req, res) {
-  return ChatWebsitesField
-    .scope({
-      method: [req.params.type, req.params.id]
-    })
-    .findAll()
-    .then(function(data) {
-      return res.status(200).json(data);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-}
-
-exports.updateForms = function(req, res, next) {
-  return ChatWebsitesField
-    .destroy({
-      where: req.params.type === 'online' ? {
-        OnlineId: req.params.id
-      } : {
-        OfflineId: req.params.id
-      }
-    })
-    .then(function() {
-      _.forEach(req.body, function(value) {
-        if (req.params.type === 'online') {
-          value.OnlineId = req.params.id;
-        } else if (req.params.type === 'offline') {
-          value.OfflineId = req.params.id;
-        }
-      });
-      return ChatWebsitesField.bulkCreate(req.body);
-    })
-    .then(function(fields) {
-      res.status(201).json(fields);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-}
-
-exports.bulkDestroyProactiveActions = function(req, res) {
-  return ChatProactiveAction
-    .destroy({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.destroyProactiveAction = function(req, res, next) {
-  return ChatProactiveAction
-    .findById(req.params.pactionId)
-    .then(function(chatProactiveAction) {
-      if (!chatProactiveAction) {
-        return res.sendStatus(404);
-      }
-      return chatProactiveAction.destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.createProactiveAction = function(req, res, next) {
-  return ChatWebsite
-    .findById(req.params.id)
-    .then(function(chatWebsite) {
-      if (!chatWebsite) {
-        return res.sendStatus(404);
-      }
-      req.body.ChatWebsiteId = chatWebsite.id;
-      return ChatProactiveAction.create(req.body);
-    })
-    .then(function(chatProactiveAction) {
-      return res.status(201).send(chatProactiveAction);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.updateProactiveAction = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-
-  return ChatProactiveAction
-    .findById(req.params.pactionId)
-    .then(function(chatProactiveAction) {
-      if (!chatProactiveAction) {
-        return res.sendStatus(404);
-      }
-
-      return chatProactiveAction
-        .update(req.body);
-    })
-    .then(function(chatProactiveAction) {
-      return res.status(200).send(chatProactiveAction);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
-
-exports.createApplication = function(req, res, next) {
-  return ChatApplication
-    .max('priority', {
-      where: {
-        ChatWebsiteId: req.params.id
-      }
-    }).then(function(max) {
-      // SET PRIORITY
-      req.body.priority = max ? ++max : 1;
-      req.body.ChatWebsiteId = req.params.id;
-      return ChatApplication
-        .create(req.body);
-    })
-    .then(function(chatApplication) {
-      return res.status(201).send(chatApplication);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.updateApplication = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  return ChatApplication.findById(req.params.appId)
-    .then(function(chatApplication) {
-      if (!chatApplication) {
-        return res.sendStatus(404);
-      }
-
-      return chatApplication
-        .update(req.body);
-    })
-    .then(function(chatApplication) {
-      return res.status(200).send(chatApplication);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-}
-
-exports.showApplication = function(req, res) {
-  return ChatApplication
-    .findById(req.params.appId, {
-      include: [{
-        all: true
-      }]
-    })
-    .then(function(chatApplication) {
-      if (!chatApplication) {
-        return res.sendStatus(404);
-      }
-      return res.send(chatApplication);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-}
\ No newline at end of file
diff --git a/server/api/chat_website/chat_website.events.js b/server/api/chat_website/chat_website.events.js
index f910de1..80b4313 100644
--- a/server/api/chat_website/chat_website.events.js
+++ b/server/api/chat_website/chat_website.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const ChatWebsite = require('../../models').ChatWebsite;
-
-var ChatWebsiteEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-ChatWebsiteEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  ChatWebsite.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    ChatWebsiteEvents.emit(event + ':' + doc._id, doc);
-    ChatWebsiteEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = ChatWebsiteEvents;
\ No newline at end of file
diff --git a/server/api/chat_website/chat_website.socket.js b/server/api/chat_website/chat_website.socket.js
index 5200183..54a59b8 100644
--- a/server/api/chat_website/chat_website.socket.js
+++ b/server/api/chat_website/chat_website.socket.js
@@ -1,28 +1 @@
-'use strict';
-
-const ChatWebsiteEvents = require('./chat_website.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('chat_website:' + event, socket);
-
-    ChatWebsiteEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    ChatWebsiteEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/chat_website/index.js b/server/api/chat_website/index.js
index a197f8f..8d2b767 100644
--- a/server/api/chat_website/index.js
+++ b/server/api/chat_website/index.js
@@ -1,40 +1 @@
-'use strict';
-
-var express = require('express');
-
-var controller = require('./chat_website.controller');
-var auth = require('../../auth/auth.service');
-var license = require('../../config/license/license.service');
-
-var router = express.Router();
-
-router.get('/', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.index);
-router.get('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin', 'agent']), controller.show);
-router.get('/:id/applications', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.showApplications);
-router.get('/:id/applications/:appId', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.showApplication);
-router.get('/:id/dispositions', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin', 'agent']), controller.getDispositions);
-router.get('/:id/proactive', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.showProactiveActions);
-router.get('/:id/fields/:type', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.getForms);
-router.get('/:id/snippet', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.getSnippetCode);
-router.post('/', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.create);
-router.post('/:id/applications', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.createApplication);
-router.post('/:id/dispositions', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.createDisposition);
-router.post('/:id/proactive', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.createProactiveAction);
-router.post('/:id/logo', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.changeLogo);
-router.put('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.update);
-router.put('/:id/applications', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.updateApplications);
-router.put('/:id/applications/:appId', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.updateApplication);
-router.put('/:id/dispositions/:dispId', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.updateDisposition);
-router.put('/:id/proactive/:pactionId', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.updateProactiveAction);
-router.put('/:id/fields/:type', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.updateForms);
-router.patch('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.update);
-router.delete('/', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.bulkDestroy);
-router.delete('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.destroy);
-router.delete('/:id/applications', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.bulkDestroyApplications);
-router.delete('/:id/proactive', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.bulkDestroyProactiveActions);
-router.delete('/:id/applications/:appId', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.destroyApplication);
-router.delete('/:id/proactive/:pactionId', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.destroyProactiveAction);
-router.delete('/:id/dispositions/:dispId', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.destroyDisposition);
-
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/chat_websites_field/chat_websites_field.controller.js b/server/api/chat_websites_field/chat_websites_field.controller.js
index 78c9c47..868414c 100644
--- a/server/api/chat_websites_field/chat_websites_field.controller.js
+++ b/server/api/chat_websites_field/chat_websites_field.controller.js
@@ -1,112 +1 @@
-/**
- * Using Rails-like standard naming convention for endpoints.
- * GET     /api/chat/websites/fields              ->  index
- * POST    /api/chat/websites/fields              ->  create
- * GET     /api/chat/websites/fields/:id          ->  show
- * PUT     /api/chat/websites/fields/:id          ->  update
- * DELETE  /api/chat/websites/fields/:id          ->  destroy
- */
-
-'use strict';
-
-
-var _ = require('lodash');
-var Util = require('../../config/util');
-
-var ChatWebsitesField = require('../../models').ChatWebsitesField;
-
-
-function handleError(res, statusCode) {
-  statusCode = statusCode || 500;
-  return function(err) {
-    res.status(statusCode).send(err);
-  };
-}
-
-function responseWithResult(res, statusCode) {
-  statusCode = statusCode || 200;
-  return function(entity) {
-    if (entity) {
-      res.status(statusCode).json(entity);
-    }
-  };
-}
-
-function responseWithoutResult(res, statusCode) {
-  statusCode = statusCode || 204;
-  return function() {
-    res.sendStatus(statusCode);
-  };
-}
-
-function handleEntityNotFound(res) {
-  return function(entity) {
-    if (!entity) {
-      res.status(404).end();
-      return null;
-    }
-    return entity;
-  };
-}
-
-function saveUpdates(updates) {
-  return function(entity) {
-    return entity.updateAttributes(updates)
-      .then(function(updated) { 
-        return updated;
-      });
-  };
-}
-
-function removeEntity(res) {
-  return function(entity) {
-    if (entity) {
-      return entity.destroy()
-        .then(function() {
-          res.status(204).end();
-        });
-    }
-  };
-}
-
-// Gets a list of ChatWebsitesFields
-exports.index = function(req, res) {
-  return ChatWebsitesField.findAll(Util.getQuery(req.query))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Gets a single ChatWebsitesField from the DB
-exports.show = function(req, res) {
-  return ChatWebsitesField.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Creates a new ChatWebsitesField in the DB
-exports.create = function(req, res) {
-  return ChatWebsitesField.create(req.body)
-    .then(responseWithResult(res, 201))
-    .catch(handleError(res));
-}
-
-// Updates an existing ChatWebsitesField in the DB
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  return ChatWebsitesField.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(saveUpdates(req.body))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Deletes a ChatWebsitesField from the DB
-exports.destroy = function(req, res) {
-  return ChatWebsitesField.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(removeEntity(res))
-    .catch(handleError(res));
-}
\ No newline at end of file
diff --git a/server/api/chat_websites_field/chat_websites_field.events.js b/server/api/chat_websites_field/chat_websites_field.events.js
index 44c852c..529e748 100644
--- a/server/api/chat_websites_field/chat_websites_field.events.js
+++ b/server/api/chat_websites_field/chat_websites_field.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const ChatWebsitesField = require('../../models').ChatWebsitesField;
-
-var ChatWebsitesFieldEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-ChatWebsitesFieldEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  ChatWebsitesField.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    ChatWebsitesFieldEvents.emit(event + ':' + doc._id, doc);
-    ChatWebsitesFieldEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = ChatWebsitesFieldEvents;
\ No newline at end of file
diff --git a/server/api/chat_websites_field/chat_websites_field.socket.js b/server/api/chat_websites_field/chat_websites_field.socket.js
index 8232b06..3efbbd6 100644
--- a/server/api/chat_websites_field/chat_websites_field.socket.js
+++ b/server/api/chat_websites_field/chat_websites_field.socket.js
@@ -1,28 +1 @@
-'use strict';
-
-const ChatWebsitesFieldEvents = require('./chat_websites_field.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('chat_websites_field:' + event, socket);
-
-    ChatWebsitesFieldEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    ChatWebsitesFieldEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/chat_websites_field/index.js b/server/api/chat_websites_field/index.js
index c525bbb..548a88b 100644
--- a/server/api/chat_websites_field/index.js
+++ b/server/api/chat_websites_field/index.js
@@ -1,18 +1 @@
-'use strict';
-
-var express = require('express');
-
-var auth = require('../../auth/auth.service');
-var controller = require('./chat_websites_field.controller');
-var license = require('../../config/license/license.service');
-
-var router = express.Router();
-
-router.get('/', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.index);
-router.get('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.show);
-router.post('/', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.create);
-router.put('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.update);
-router.patch('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.update);
-router.delete('/:id', license.isValidDate(), license.hasChat(), auth.isAuthenticated(), auth.hasModule([8], ['admin']), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/company/company.controller.js b/server/api/company/company.controller.js
index a20f981..231fad2 100644
--- a/server/api/company/company.controller.js
+++ b/server/api/company/company.controller.js
@@ -1,146 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var Company = require('../../models').Company;
-var util = require('util');
-var Util = require('../../config/util');
-
-// Get list of companies
-exports.index = function(req, res, next) {
-  return Company
-    .findAndCountAll(Util.getQuery(req.query))
-    .then(function(result) {
-      res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.companyValidation = function(req, res) {
-  return Company
-    .findAll({
-      where: {
-        name: req.body.name
-      }
-    })
-    .then(function(companies) {
-      if (!companies) {
-        return res.sendStatus(404);
-      }
-      return res.send(companies);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single company
-exports.show = function(req, res) {
-  return Company
-    .findById(req.params.id)
-    .then(function(company) {
-      if (!company) {
-        return res.sendStatus(404);
-      }
-      return res.send(company);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new company in the DB.
-exports.create = function(req, res) {
-  return Company
-    .create(req.body)
-    .then(function(company) {
-      return res.status(201).send(company);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing company in the DB.
-exports.update = function(req, res) {
-  return Company
-    .findAll({
-      where: {
-        name: req.body.name,
-        id: {
-          $ne: req.body.id
-        }
-      }
-    })
-    .then(function(companies) {
-      if (!companies) {
-        return res.sendStatus(404);
-      }
-      if (companies.length > 0) {
-        return res.status(500).send({
-          message: 'MESSAGE_EXIST_COMPANY'
-        })
-      }
-      if (req.body.id) {
-        delete req.body.id;
-      }
-      return Company
-        .find({
-          where: {
-            id: req.params.id
-          }
-        });
-    })
-    .then(function(company) {
-      if (!company) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(company, req.body);
-      return updated.save();
-    })
-    .then(function(company) {
-      return res.status(200).send(company);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a company from the DB.
-exports.destroy = function(req, res) {
-  return Company
-    .findById(req.params.id)
-    .then(function(company) {
-      if (!company) {
-        return res.sendStatus(404);
-      }
-      return company.destroy()
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.bulkDestroy = function(req, res) {
-  return Company
-    .destroy({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/company/company.events.js b/server/api/company/company.events.js
index b232d0d..35f1243 100644
--- a/server/api/company/company.events.js
+++ b/server/api/company/company.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const Company = require('../../models').Company;
-
-var CompanyEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-CompanyEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  Company.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    CompanyEvents.emit(event + ':' + doc._id, doc);
-    CompanyEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = CompanyEvents;
\ No newline at end of file
diff --git a/server/api/company/company.socket.js b/server/api/company/company.socket.js
index 5fb7808..52326f2 100644
--- a/server/api/company/company.socket.js
+++ b/server/api/company/company.socket.js
@@ -1,28 +1 @@
-'use strict';
-
-const CompanyEvents = require('./company.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('company:' + event, socket);
-
-    CompanyEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    CompanyEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/company/index.js b/server/api/company/index.js
index af51e8c..f509a34 100644
--- a/server/api/company/index.js
+++ b/server/api/company/index.js
@@ -1,18 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./company.controller');
-var auth = require('../../auth/auth.service');
-var license = require('../../config/license/license.service');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin', 'agent']), controller.index);
-router.get('/:id', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin', 'agent']), controller.show);
-router.post('/', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin']), controller.create);
-router.post('/validate', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin']), controller.companyValidation);
-router.put('/:id', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin']), controller.update);
-router.delete('/', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin']), controller.bulkDestroy);
-router.delete('/:id', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin']), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/contact_manager/contact_manager.controller.js b/server/api/contact_manager/contact_manager.controller.js
index eea8c8a..bc79711 100644
--- a/server/api/contact_manager/contact_manager.controller.js
+++ b/server/api/contact_manager/contact_manager.controller.js
@@ -1,708 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var moment = require('moment');
-var Contact = require('../../models').Contact;
-var User = require('../../models').User;
-var ContactPhone = require('../../models').ContactPhone;
-var ContactEmail = require('../../models').ContactEmail;
-var CustomField = require('../../models').CustomField;
-var ReportCall = require('../../models').ReportCall;
-var ReportQueue = require('../../models').ReportQueue;
-var ReportQueueHistory = require('../../models').history.ReportQueueHistory;
-var ReportChatRoom = require('../../models').ReportChatRoom;
-var ReportChatRoomHistory = require('../../models').history.ReportChatRoomHistory;
-var ChatRoom = require('../../models').ChatRoom;
-var FaxRoom = require('../../models').FaxRoom;
-var SmsRoom = require('../../models').SmsRoom;
-var ReportIntegration = require('../../models').ReportIntegration;
-var List = require('../../models').List;
-var ReportCallHistory = require('../../models').history.ReportCallHistory;
-var ReportMailSession = require('../../models').ReportMailSession;
-var MailRoom = require('../../models').MailRoom;
-var ReportMailSessionHistory = require('../../models').history.ReportMailSessionHistory;
-var Tag = require('../../models').Tag;
-var stream = require('stream');
-var sequelize = require('../../models').sequelize;
-var util = require('util');
-var Util = require('../../config/util');
-var Async = require('async');
-
-// Get list of contacts
-exports.index = function(req, res, next) {
-  var results, _agentLists;
-  switch (req.user.role) {
-    case 'agent':
-      return User
-        .findById(req.user.id)
-        .then(function(agent) {
-          return agent.getLists();
-        })
-        .then(function(lists) {
-          _agentLists = _.map(lists, 'id');
-          return List
-            .findAll({
-              where: {
-                defaultEntry: true
-              },
-              attributes: ['id']
-            });
-        })
-        .then(function(defaultLists) {
-          var company_list_query = {
-            CompanyId: req.query.CompanyId || null,
-            ListId: req.query.ListId || null,
-          };
-          delete req.query.CompanyId;
-          delete req.query.ListId;
-          return Contact
-            .scope('list', 'company', {
-              method: ['company_list_filter', company_list_query]
-            })
-            .findAndCountAll(Util.getQuery(req.query, company_list_query.ListId ? {} : {
-              ListId: {
-                $in: _agentLists.concat(_.map(defaultLists, 'id'))
-              }
-            }));
-        })
-        .then(function(contacts) {
-          results = {
-            rows: _.map(contacts.rows, 'dataValues'),
-            count: contacts.rows
-          };
-          return Contact
-            .describe();
-        })
-        .then(function(fields) {
-          fields = _.filter(_.keys(fields), function(elem) {
-            return _.includes(elem, 'cf_');
-          });
-          return CustomField
-            .findAll({
-              where: {
-                name: fields
-              }
-            });
-        })
-        .then(function(customFields) {
-          if (customFields.length) {
-            var cfs = _.map(customFields, 'name').join(',');
-            return sequelize.query(util.format('SELECT id,%s FROM cm_contacts WHERE id IN (\'' + _.map(results.rows, 'id').join("','") + '\')', cfs), {
-              type: sequelize.QueryTypes.SELECT
-            });
-          }
-        })
-        .then(function(contactsCf) {
-          _.merge(results.rows, contactsCf);
-          return results;
-        })
-        .then(function(result) {
-          res.status(200).send(result);
-        })
-        .catch(function(err) {
-          console.log(err);
-          return handleError(res, err);
-        });
-    default:
-      var company_list_query = {
-        CompanyId: req.query.CompanyId || null,
-        ListId: req.query.ListId || null,
-      };
-      delete req.query.CompanyId;
-      delete req.query.ListId;
-      return Contact
-        .scope('list', 'company', {
-          method: ['company_list_filter', company_list_query]
-        })
-        .findAndCountAll(Util.getQuery(req.query))
-        .then(function(contacts) {
-          results = {
-            rows: _.map(contacts.rows, 'dataValues'),
-            count: contacts.count
-          };
-          return Contact
-            .describe();
-        })
-        .then(function(fields) {
-          fields = _.filter(_.keys(fields), function(elem) {
-            return _.includes(elem, 'cf_');
-          });
-          return CustomField
-            .findAll({
-              where: {
-                name: fields
-              }
-            });
-        })
-        .then(function(customFields) {
-          if (results.rows.length && customFields.length) {
-            var cfs = _.map(customFields, 'name').join(',');
-            return sequelize.query(util.format('SELECT id,%s FROM cm_contacts WHERE id IN (\'' + _.map(results.rows, 'id').join("','") + '\')', cfs), {
-              type: sequelize.QueryTypes.SELECT
-            });
-          }
-        })
-        .then(function(contactsCf) {
-          if (contactsCf) {
-            _.merge(results.rows, contactsCf);
-          }
-          return results;
-        })
-        .then(function(result) {
-          res.status(200).send(result);
-        })
-        .catch(function(err) {
-          console.log(err);
-          return handleError(res, err);
-        });
-  }
-};
-
-// Get list of fields
-exports.describe = function(req, res) {
-  return Contact
-    .describe()
-    .then(function(fields) {
-      return res.status(200).send(fields);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.getLog = function(req, res, next) {
-  req.query.detail = req.query.detail || 'general';
-  req.query.show = req.query.show || 'phone';
-  req.query.logType = req.query.logType || 'journal';
-  req.query.type = req.query.type || 'inbound';
-  var Api, where = {};
-  return Contact
-    .findById(req.params.id)
-    .then(function(contact) {
-      if (!contact) {
-        return res.sendStatus(404);
-      }
-      switch (req.query.detail) {
-        case 'general':
-          switch (req.query.show) {
-            case 'phone':
-              Api = (req.query.logType === 'history') ? ReportCallHistory : ReportCall;
-              if (req.query.type === 'outbound') {
-                where.destination = [contact.phone, contact.mobile];
-              } else {
-                where.source = [contact.phone, contact.mobile];
-              }
-              break;
-            case 'email':
-              Api = MailRoom;
-              where.from = contact.email;
-              if (req.query.logType === 'history') {
-                where.createdAt = {
-                  $lt: moment().startOf('day')
-                }
-              } else {
-                where.createdAt = {
-                  $gte: moment().startOf('day')
-                }
-              }
-              break;
-            case 'chat':
-              Api = ChatRoom;
-              where.contact = contact.email;
-              if (req.query.logType === 'history') {
-                where.createdAt = {
-                  $lt: moment().startOf('day')
-                }
-              } else {
-                where.createdAt = {
-                  $gte: moment().startOf('day')
-                }
-              }
-              break;
-            case 'fax':
-              Api = FaxRoom;
-              where.contact = contact.fax;
-              if (req.query.logType === 'history') {
-                where.createdAt = {
-                  $lt: moment().startOf('day')
-                }
-              } else {
-                where.createdAt = {
-                  $gte: moment().startOf('day')
-                }
-              }
-              break;
-            case 'sms':
-              Api = SmsRoom;
-              where.contact = [contact.phone, contact.mobile];
-              if (req.query.logType === 'history') {
-                where.createdAt = {
-                  $lt: moment().startOf('day')
-                }
-              } else {
-                where.createdAt = {
-                  $gte: moment().startOf('day')
-                }
-              }
-              break;
-            default:
-              Api = (req.query.logType === 'history') ? ReportCallHistory : ReportCall;
-          }
-          break;
-        case 'queue':
-          switch (req.query.show) {
-            case 'phone':
-              Api = (req.query.logType === 'history') ? ReportQueueHistory : ReportQueue;
-              where.calleridnum = [contact.phone, contact.mobile];
-              break;
-            case 'email':
-              return res.sendStatus(404);
-            default:
-              Api = (req.query.logType === 'history') ? ReportQueueHistory : ReportQueue;
-          }
-          break;
-        default:
-          Api = ReportCall;
-      }
-      delete req.query.detail;
-      delete req.query.show;
-      delete req.query.logType;
-      delete req.query.type;
-      return Api
-        .findAndCountAll(Util.getQuery(req.query, where));
-    })
-    .then(function(result) {
-      res.status(200).send(result);
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-
-};
-
-// Get a single managed_contact
-exports.show = function(req, res) {
-  var _contact;
-  return Contact
-    .scope('list', 'user', 'company')
-    .findById(req.params.id)
-    .then(function(managed_contact) {
-      if (!managed_contact) {
-        return res.sendStatus(404);
-      }
-      _contact = managed_contact;
-      return CustomField
-        .findAll({
-          where: {
-            ListId: _contact.ListId
-          }
-        });
-    })
-    .then(function(customFields) {
-      if (customFields.length) {
-        var cfs = _.map(customFields, 'name').join(',');
-        return sequelize.query(util.format('SELECT %s FROM cm_contacts WHERE id=%s', cfs, req.params.id), {
-          type: sequelize.QueryTypes.SELECT
-        });
-      }
-    })
-    .then(function(cfValues) {
-      if (cfValues) {
-        _.forEach(cfValues[0], function(value, key, array) {
-          if (value === 'null') {
-            array[key] = null;
-          }
-        });
-        _.merge(_contact.dataValues, cfValues[0]);
-      }
-    })
-    .then(function() {
-      return res.status(200).send(_contact);
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-exports.getEventContacts = function(req, res) {
-  return ReportIntegration
-    .findById(req.params.id)
-    .then(function(event) {
-      var where = {};
-      switch (event.eventChannel) {
-        case 'voice':
-          where = {
-            $or: {
-              phone: event.calleridnum,
-              mobile: event.calleridnum
-            }
-          };
-          break;
-        case 'mail':
-          where = {
-            email: event.from
-          };
-          break;
-        default:
-          where = {};
-      }
-      return Contact.findAndCountAll({
-        where: where,
-        include: [{
-          model: List,
-          where: {
-            $or: {
-              id: _.map(_.map(req.user.Lists, 'dataValues'), 'id'),
-              defaultEntry: true
-            }
-          }
-        }]
-      });
-    })
-    .then(function(contacts) {
-      return res.status(200).send(contacts);
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-
-};
-
-// Creates a new managed_contact in the DB.
-exports.create = function(req, res, next) {
-  var _contact;
-  return Tag
-    .findAll()
-    .then(function(tags) {
-      var newTags = [];
-      var tagList = _.map(_.map(tags, 'dataValues'), 'name');
-      if (req.body.tags) {
-        req.body.tags.forEach(function(elem) {
-          if (!_.includes(tagList, elem)) {
-            newTags.push(Tag.create({
-              name: elem
-            }));
-          }
-        });
-      }
-      return newTags;
-    })
-    .all()
-    .then(function() {
-      req.body.UserId = req.user.id;
-      return Contact.create(req.body);
-    })
-    .then(function(contact) {
-      _contact = contact;
-
-      return CustomField
-        .findAll({
-          where: {
-            ListId: _contact.ListId
-          }
-        });
-    })
-    .then(function(customFields) {
-      if (customFields.length) {
-        var cfs = [];
-        customFields.forEach(function(elem) {
-          if (req.body.hasOwnProperty(elem.name)) {
-            cfs.push(util.format('%s=\'%s\'', elem.name, req.body[elem.name]));
-          }
-        });
-        if (cfs.length) {
-          cfs = cfs.join(',');
-          return sequelize.query(util.format('UPDATE cm_contacts SET %s WHERE id=%s', cfs, _contact.id));
-        }
-      }
-    })
-    .then(function() {
-      return res.status(201).send(_contact);
-    })
-    .catch(function(err) {
-      console.log(err);
-      return next(err);
-    });
-};
-
-exports.copy = function(req, res, next) {
-  var _contact, _newContact;
-  return Contact
-    .findById(req.params.id)
-    .then(function(contact) {
-      _contact = contact.dataValues;
-      _newContact = _.clone(contact.dataValues);
-      delete _newContact.id;
-      _newContact.UserId = req.user.id;
-      _newContact.ListId = req.body.ListId;
-      _newContact.tags = _newContact.tags ? _newContact.tags.split(';') : [];
-      if (_newContact.tags.length > 1) {
-        _newContact.tags.pop();
-      }
-      return Contact
-        .create(_newContact);
-    })
-    .then(function(newContact) {
-      _newContact = newContact;
-      if (_contact.ListId === req.body.ListId) {
-        return CustomField
-          .findAll({
-            where: {
-              ListId: _contact.ListId
-            }
-          });
-      }
-    })
-    .then(function(customFields) {
-      if (customFields && customFields.length) {
-        var cfs = _.map(customFields, 'name').join(',');
-        return sequelize.query(util.format('SELECT %s FROM cm_contacts WHERE id=%s', cfs, _contact.id), {
-          type: sequelize.QueryTypes.SELECT
-        });
-      }
-    })
-    .then(function(cfValues) {
-      if (cfValues) {
-        var cfs = [];
-        _.forOwn(cfValues[0], function(value, key) {
-          cfs.push(util.format('%s=\'%s\'', key, value));
-        });
-        if (cfs.length) {
-          cfs = cfs.join(',');
-          return sequelize.query(util.format('UPDATE cm_contacts SET %s WHERE id=%s', cfs, _newContact.id));
-        }
-      }
-    })
-    .then(function() {
-      return res.status(201).send(_newContact);
-    })
-    .catch(function(err) {
-      console.log(err);
-      return next(err);
-    });
-}
-
-// Creates a new managed_contact in the DB.
-exports.bulkCreate = function(req, res, next) {
-  var _contacts = [];
-  var _result = {
-    ok: 0,
-    ko: 0
-  };
-  return Tag
-    .findAll()
-    .then(function(tags) {
-      var newTags = [],
-        contactTags = [];
-      var tagList = _.map(_.map(tags, 'dataValues'), 'name');
-      req.body.contacts.forEach(function(contact) {
-        if (contact.tags) {
-          contactTags = _.union(contactTags, contact.tags);
-        }
-      });
-      contactTags.forEach(function(elem) {
-        if (!_.includes(tagList, elem)) {
-          newTags.push(Tag.create({
-            name: elem
-          }));
-        }
-      });
-      return newTags;
-    })
-    .all()
-    .then(function() {
-      var bulkCreate = [];
-      Async.forEachOf(req.body.contacts, function(contact) {
-        contact.UserId = req.user.id;
-
-        bulkCreate.push(Contact.create(contact)
-          .then(function(contact) {
-            _contacts.push(contact);
-            _result.ok++;
-          })
-          .catch(function(err) {
-            _result.ko++;
-          }));
-      })
-      return bulkCreate;
-    })
-    .all()
-    .then(function() {
-      return CustomField
-        .findAll({
-          where: {
-            ListId: {
-              $in: _.map(req.body.contacts, 'ListId')
-            }
-          }
-        });
-    })
-    .then(function(customFields) {
-      var bulkFields = [];
-      if (customFields.length) {
-        var cfs = [];
-        _contacts.forEach(function(contact) {
-          cfs = [];
-          customFields.forEach(function(elem) {
-            if (contact.hasOwnProperty(elem.name)) {
-              cfs.push(util.format('%s=\'%s\'', elem.name, req.body[elem.name]));
-            }
-          });
-          if (cfs.length) {
-            cfs = cfs.join(',');
-            bulkFields.push(sequelize.query(util.format('UPDATE cm_contacts SET %s WHERE id=%s', cfs, contact.id)));
-          }
-        });
-      }
-      return bulkFields;
-    })
-    .all()
-    .then(function() {
-      return res.status(201).send(_result);
-    })
-    .catch(function(err) {
-      console.log(err);
-      return next(err);
-    });
-};
-
-// Updates an existing managed_contact in the DB.
-exports.update = function(req, res, next) {
-  return Promise
-    .all([])
-    .then(updateContact(req, res))
-    .then(function(contact) {
-      return res.status(200).send(contact);
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-exports.merge = function(req, res, next) {
-  var _contact;
-  return Promise
-    .all([])
-    .then(updateContact(req, res))
-    .then(function(contact) {
-      _contact = contact;
-      if (req.body.oldContact) {
-        return Contact
-          .destroy({
-            where: {
-              id: req.body.oldContact
-            },
-            individualHooks: true
-          });
-      }
-    })
-    .then(function() {
-      return res.status(200).send(_contact);
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-function updateContact(req, res) {
-  return function() {
-    var _contact;
-    return Tag
-      .findAll()
-      .then(function(tags) {
-        var newTags = [];
-        var tagList = _.map(_.map(tags, 'dataValues'), 'name');
-        if (req.body.tags) {
-          req.body.tags.forEach(function(elem) {
-            if (!_.includes(tagList, elem)) {
-              newTags.push(Tag.create({
-                name: elem
-              }));
-            }
-          });
-        }
-        return newTags;
-      })
-      .then(function() {
-        return Contact.findById(req.params.id);
-      })
-      .then(function(contact) {
-        if (!contact) {
-          return res.sendStatus(404);
-        }
-        delete req.body.id;
-        return contact.updateAttributes(req.body)
-      })
-      .then(function(contact) {
-        _contact = contact;
-
-        return CustomField
-          .findAll({
-            where: {
-              ListId: _contact.ListId
-            }
-          });
-      })
-      .then(function(customFields) {
-        if (customFields.length) {
-          var cfs = [];
-          customFields.forEach(function(elem) {
-            if (req.body.hasOwnProperty(elem.name)) {
-              cfs.push(util.format('%s=\'%s\'', elem.name, req.body[elem.name]));
-            }
-          });
-          if (cfs.length) {
-            cfs = cfs.join(',');
-            return sequelize.query(util.format('UPDATE cm_contacts SET %s WHERE id=%s', cfs, _contact.id));
-          }
-        }
-      })
-      .then(function() {
-        return _contact;
-      })
-  }
-}
-
-// Deletes a managed_contact from the DB.
-exports.destroy = function(req, res) {
-  return Contact
-    .findById(req.params.id)
-    .then(function(managed_contact) {
-      if (!managed_contact) {
-        return res.sendStatus(404);
-      }
-      return managed_contact.destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a managed_contact from the DB.
-exports.bulkDestroy = function(req, res) {
-  return Contact
-    .destroy({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/contact_manager/contact_manager.events.js b/server/api/contact_manager/contact_manager.events.js
index dd5bf3e..d0701ff 100644
--- a/server/api/contact_manager/contact_manager.events.js
+++ b/server/api/contact_manager/contact_manager.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const Contact = require('../../models').Contact;
-
-var ContactEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-ContactEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  Contact.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    ContactEvents.emit(event + ':' + doc._id, doc);
-    ContactEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = ContactEvents;
\ No newline at end of file
diff --git a/server/api/contact_manager/contact_manager.socket.js b/server/api/contact_manager/contact_manager.socket.js
index 8432549..abf5ec5 100644
--- a/server/api/contact_manager/contact_manager.socket.js
+++ b/server/api/contact_manager/contact_manager.socket.js
@@ -1,28 +1 @@
-'use strict';
-
-const ContactManagerEvents = require('./contact_manager.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('contact_manager:' + event, socket);
-
-    ContactManagerEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    ContactManagerEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/contact_manager/index.js b/server/api/contact_manager/index.js
index a17e604..48e2234 100644
--- a/server/api/contact_manager/index.js
+++ b/server/api/contact_manager/index.js
@@ -1,23 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./contact_manager.controller');
-var auth = require('../../auth/auth.service');
-var license = require('../../config/license/license.service');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin', 'agent']), controller.index);
-router.get('/describe', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin']), controller.describe);
-router.get('/:id/checkevent', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin', 'agent']), controller.getEventContacts);
-router.get('/:id', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin', 'agent']), controller.show);
-router.get('/:id/log', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin', 'agent']), controller.getLog);
-router.post('/', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin', 'agent']), controller.create);
-router.post('/:id/copy', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin', 'agent']), controller.copy);
-router.post('/:id/merge', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin', 'agent']), controller.merge);
-router.post('/bulk', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin']), controller.bulkCreate);
-router.put('/:id', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin', 'agent']), controller.update);
-router.delete('/', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin']), controller.bulkDestroy);
-router.delete('/:id', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin']), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/custom_report/custom_report.controller.js b/server/api/custom_report/custom_report.controller.js
index b0ead9a..f0e267a 100644
--- a/server/api/custom_report/custom_report.controller.js
+++ b/server/api/custom_report/custom_report.controller.js
@@ -1,568 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var util = require('util');
-var sequelize = require('../../models').sequelize;
-var CustomReport = require('../../models').CustomReport;
-var ReportField = require('../../models').ReportField;
-var Metric = require('../../models').Metric;
-var ExtractedReport = require('../../models').ExtractedReport;
-var extractUtils = require('../../utils/report_extraction');
-var reportBuildUtils = require('../../utils/report_build');
-var Util = require('../../config/util');
-var sr = require('simple-random');
-var moment = require('moment');
-var cp = require('child_process');
-var ReportTree = require('../../models').ReportTree;
-
-// Get list of agents
-exports.index = function(req, res, next) {
-  return CustomReport
-    .findAndCountAll(Util.getQuery(req.query, {
-      deletedAt: null
-    }))
-    .then(function(result) {
-      res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.getReportQuery = function(req, res) {
-  return Promise
-    .all([])
-    .then(getQuery(req, res))
-    .then(function(query) {
-      if (query) {
-        switch (query) {
-          case 'permission':
-            query = 'no sufficient queue permissions for the user';
-            break;
-          default:
-        }
-      }
-      res.status(200).send({
-        query: query
-      });
-    })
-    .catch(function(err) {
-      console.log('Error getting query from api:', err);
-    });
-}
-
-function getQuery(req, res) {
-  var _report;
-  return function() {
-    return CustomReport
-      .scope('fields')
-      .findById(req.params.id)
-      .then(function(report) {
-        console.log('found report');
-        if (!report) {
-          return res.sendStatus(404);
-        }
-        if (req.query.daily && req.query.daily === 'true') {
-          req.query.startDate = moment().format('YYYY-MM-DD');
-          req.query.endDate = moment().format('YYYY-MM-DD');
-          report.dataValues.table = report.dataValues.table.replace(
-            '_history', '');
-        }
-        delete req.query.daily;
-        _report = report.dataValues;
-        return _report.table;
-      })
-      .then(reportBuildUtils.buildFilter(req.user))
-      .then(function(filter) {
-        return [filter, _report];
-      })
-      .spread(reportBuildUtils.buildQuery(req.query))
-  }
-}
-
-exports.preview = function(req, res) {
-  var _countAll;
-  return Promise
-    .all([])
-    .then(getQuery(req, res))
-    .then(reportBuildUtils.checkQuery())
-    .then(function(results) {
-      if (results && _.isArray(results)) {
-        _countAll = results.length;
-        if (req.query.limit) {
-          results = _(results).slice(req.query.offset || 0).take(req.query.limit).value();
-        }
-        _.forEach(results, function(row) {
-          _.forOwn(row, function(property, key) {
-            if (property instanceof Date) {
-              row[key] = moment(property).format("YYYY-MM-DD HH:mm:ss").toString();
-            }
-          });
-        });
-        res.status(200).send({
-          rows: results,
-          count: _countAll
-        });
-      } else {
-        return handleError(res, {
-          message: results || 'query error'
-        });
-      }
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-exports.extractPdf = function(req, res) {
-  // console.log('extractPdf api function');
-  docExtract(req, res, 'PDF')
-};
-
-exports.extractCsv = function(req, res) {
-  // console.log('extractCsv api function');
-  docExtract(req, res, 'CSV');
-};
-
-exports.destroyNodeReports = function(req, res) {
-  return ReportTree
-    .findById(2)
-    .then(function(tree) {
-      tree = JSON.parse(tree.tree);
-      var node = _.find(tree, {
-        id: req.params.id
-      });
-      if (!node) {
-        throw new Error('Node not found');
-      }
-      var nodes = [];
-      findSubNodes(node, tree, nodes);
-      return CustomReport
-        .destroy({
-          where: {
-            parent: nodes
-          },
-          individualHooks: true
-        });
-    })
-    .then(function() {
-      return res.sendStatus(200);
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-function findSubNodes(node, tree, _nodes) { //receive a node, the tree containing the node and an array where to insert all the sub nodes found recursively, including the starting node
-  _nodes.push(node.id);
-  var subNodes = _.filter(tree, {
-    parent: node.id
-  });
-  if (!subNodes || !subNodes.length) {
-    return;
-  }
-  _.forEach(subNodes, function(subNode) {
-    findSubNodes(subNode, tree, _nodes);
-  });
-}
-
-function docExtract(req, res, typeFunction) {
-  var report;
-  // console.log('common docExtract api function');
-  CustomReport //DO NOT ADD RETURN CAUSE THE EXTRACTING FUNCTION WILL KEEP EXTRACTING AFTER THE API HAS RETURNED
-    .scope('fields')
-    .findById(req.params.id)
-    .then(function(_report) {
-      if (!_report) {
-        return res.sendStatus(404);
-      }
-      report = _report;
-      return ReportTree
-        .findById(2);
-    })
-    .then(function(tree) {
-      tree = JSON.parse(tree.tree);
-      var folder = _.find(tree, {
-        id: report.parent
-      });
-      var path = getReportPath(folder, tree, report.name);
-      // console.log('found the report, creating the new DB row for extracted reports..');
-      //CREATE A DB ROW IN A TABLE WITH THE REPORT INFO, QUERY DATES, AND THE STATUS 'ELABORATING'
-      if (req.query.daily && req.query.daily === 'true') {
-        req.query.startDate = moment().format('YYYY-MM-DD');
-        req.query.endDate = moment().format('YYYY-MM-DD');
-        report.dataValues.table = report.dataValues.table.replace('_history',
-          '');
-      }
-      delete req.query.daily;
-      return [report, ExtractedReport.create({
-        name: path,
-        startDate: req.query.startDate ? req.query.startDate + (req.query.startTime ? ' ' + req.query.startTime : '00:00') : null,
-        endDate: req.query.endDate ? req.query.endDate + (req.query.endTime ? ' ' + req.query.endTime : '23:59') : null,
-        output: typeFunction,
-        UserId: req.user.id
-      })]
-    })
-    .spread(function(report, extractedReport) {
-      // console.log('created new extracted reports db entry, calling external extraction function: ' + typeFunction);
-      var child = cp.fork(__dirname + '/../../utils/report_extraction.js');
-      child.on('message', function(data) {
-        console.log('child message', data);
-        child.kill();
-      }).on('close', function() {
-        console.log('child close');
-      }).on('error', function(err) {
-        console.log('child error', err);
-      });
-      child.send({
-        report: report,
-        query: req.query,
-        extractedId: extractedReport.id,
-        user: req.user,
-        type: typeFunction
-      });
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-  return res.sendStatus(200);
-}
-
-function getReportPath(folder, tree, path) {
-  path = folder.text + '/ ' + path;
-  if (folder.parent === '#') {
-    return path;
-  } else {
-    return getReportPath(_.find(tree, {
-      id: folder.parent
-    }), tree, path);
-  }
-}
-
-// Get a single report
-exports.show = function(req, res) {
-  return CustomReport
-    .scope('fields')
-    .findById(req.params.id)
-    .then(function(report) {
-      if (!report) {
-        return res.sendStatus(404);
-      }
-      return res.send(report);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-
-// Get a single report
-exports.export = function(req, res) {
-  return CustomReport
-    .scope({
-      method: ['exportFields', {
-        CustomReportId: req.params.id
-      }]
-    }) //add where condition on customreport id
-    .findById(req.params.id, {
-      attributes: ['conditions', 'description', 'name', 'parent', 'table']
-    })
-    .then(function(report) {
-      if (!report) {
-        return res.sendStatus(404);
-      }
-      return res.send(report);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Copy a custom report
-exports.copy = function(req, res) {
-  var _fields;
-  return sequelize.transaction(function(t) {
-      return CustomReport
-        .scope('fields')
-        .findById(req.params.id)
-        .then(function(report) {
-          if (!report) {
-            return res.sendStatus(404);
-          }
-          var newReport = report.dataValues;
-          delete newReport.id;
-          delete newReport.createdAt;
-          delete newReport.updatedAt;
-          newReport.parent = req.body.parent;
-          _fields = _.map(newReport.Fields, 'dataValues');
-          return CustomReport
-            .create(newReport, {
-              transaction: t
-            });
-        })
-        .then(function(report) {
-          return [report, _fields];
-        })
-        .spread(createFields(t));
-    })
-    .then(function() {
-      return res.sendStatus(201);
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-// Creates a new report in the DB.
-exports.create = function(req, res) {
-  var _report;
-  return sequelize.transaction(function(t) {
-      return CustomReport
-        .create(req.body, {
-          transaction: t
-        })
-        .then(function(report) {
-          _report = report;
-          return [_report, req.body.Fields];
-        })
-        .spread(createFields(t));
-    })
-    .then(function() {
-      return res.status(201).send(_report);
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-// Import a report in the DB.
-exports.import = function(req, res) {
-  var _report;
-  return sequelize.transaction(function(t) {
-      return CustomReport
-        .create(req.body, {
-          transaction: t
-        })
-        .then(function(report) {
-          _report = report;
-          return [_report, req.body.Fields];
-        })
-        .spread(createImportFields(t));
-    })
-    .then(function() {
-      return res.status(201).send(_report);
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-exports.update = function(req, res, next) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  var _report;
-  return sequelize.transaction(function(t) {
-      return CustomReport
-        .findById(req.params.id)
-        .then(function(report) {
-          if (!report) {
-            return res.sendStatus(404);
-          }
-          var updated = _.merge(report, req.body);
-          return report
-            .save({
-              transaction: t
-            });
-        })
-        .then(function(report) {
-          _report = report;
-          if (req.body.Fields) {
-            return ReportField.destroy({
-              where: {
-                CustomReportId: req.params.id
-              },
-              transaction: t
-            });
-          }
-        })
-        .then(function() {
-          return [_report, req.body.Fields];
-        })
-        .spread(createFields(t));
-    })
-    .then(function() {
-      return res.sendStatus(200);
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-}
-
-function createFields(t) {
-  return function(report, fields) {
-    if (fields && Array.isArray(fields) && fields.length) {
-      var tableModel = reportBuildUtils.getTable(report.table);
-      if (tableModel) {
-        var _tableFields;
-        return tableModel
-          .describe()
-          .then(function(tableFields) {
-            _tableFields = _.keys(tableFields);
-            return Metric
-              .findAll();
-          })
-          .then(function(metrics) {
-            var bulkFields = [];
-            metrics = _.map(metrics, 'dataValues');
-            fields.forEach(function(elem) {
-              elem.CustomReportId = report.id;
-              if (elem.MetricId) {
-                var metric = _.find(metrics, {
-                  id: elem.MetricId
-                });
-                if (metric) {
-                  elem.field = metric.metric;
-                  bulkFields.push(ReportField
-                    .create(elem, {
-                      transaction: t
-                    }));
-                } else {
-                  throw new sequelize.Error("The metric with id " +
-                    elem.MetricId + " you specified does not exist");
-                }
-              } else {
-                if (_.includes(_tableFields, elem.field) || elem.custom) {
-                  bulkFields.push(ReportField
-                    .create(elem, {
-                      transaction: t
-                    }));
-                } else {
-                  throw new sequelize.Error("The field " + elem.field +
-                    " you specified does not exist in the table");
-                }
-              }
-            });
-            return bulkFields;
-          })
-          .all();
-      } else {
-        throw new sequelize.Error(
-          "You have not specified the table or the table does not exist");
-      }
-    }
-  }
-}
-
-function createImportFields(t) {
-  return function(report, fields) {
-    if (fields && Array.isArray(fields) && fields.length) {
-      var tableModel = reportBuildUtils.getTable(report.table);
-      if (tableModel) {
-        var _tableFields;
-        return tableModel
-          .describe()
-          .then(function(tableFields) {
-            _tableFields = _.keys(tableFields);
-            var bulkFields = [];
-            var type;
-            if (_.every(fields, function(elem) {
-                return _.has(elem, 'DefaultMetricId');
-              })) {
-              type = 'DefaultMetric'
-            } else if (_.every(fields, function(elem) {
-                return _.has(elem, 'MetricId');
-              })) {
-              type = 'Metric'
-            } else {
-              throw new sequelize.Error("Unsupported Import format (Metric type in report fields is missing)");
-            }
-            var groupedFields = _.groupBy(fields, type + 'Id');
-            _.forOwn(groupedFields, function(value, key) {
-              if (key !== 'undefined' && key !== 'null') {
-                value[0][type].ReportFields.forEach(function(elem) {
-                  elem.CustomReportId = report.id;
-                });
-                value[0][type].name += '_' + sr({
-                  length: 5
-                });
-                bulkFields.push(Metric
-                  .create(value[0][type], {
-                    include: [{
-                      model: ReportField,
-                      as: 'ReportFields'
-                    }],
-                    transaction: t
-                  }));
-              } else {
-                value.forEach(function(elem) {
-                  if (_.includes(_tableFields, elem.field) || elem.custom) {
-                    elem.CustomReportId = report.id;
-                    bulkFields.push(ReportField
-                      .create(elem, {
-                        transaction: t
-                      }));
-                  } else {
-                    throw new sequelize.Error("The field " + elem.field +
-                      " you specified does not exist in the table"
-                    );
-                  }
-                });
-              }
-            });
-            return bulkFields;
-          })
-          .all();
-      } else {
-        throw new sequelize.Error(
-          "You have not specified the table or the table does not exist");
-      }
-    }
-  }
-}
-
-
-// Deletes a report from the DB.
-exports.destroy = function(req, res) {
-  return CustomReport
-    .findById(req.params.id)
-    .then(function(report) {
-      if (!report) {
-        return res.sendStatus(404);
-      }
-      return report.destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.bulkDestroy = function(req, res) {
-  return CustomReport
-    .destroy({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/custom_report/custom_report.events.js b/server/api/custom_report/custom_report.events.js
index ac4b9d7..7523fb9 100644
--- a/server/api/custom_report/custom_report.events.js
+++ b/server/api/custom_report/custom_report.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const CustomReport = require('../../models').CustomReport;
-
-var CustomReportEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-CustomReportEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  CustomReport.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    CustomReportEvents.emit(event + ':' + doc._id, doc);
-    CustomReportEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = CustomReportEvents;
\ No newline at end of file
diff --git a/server/api/custom_report/custom_report.socket.js b/server/api/custom_report/custom_report.socket.js
index ab9086c..c9a69eb 100644
--- a/server/api/custom_report/custom_report.socket.js
+++ b/server/api/custom_report/custom_report.socket.js
@@ -1,28 +1 @@
-'use strict';
-
-const CustomReportEvents = require('./custom_report.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('custom_report:' + event, socket);
-
-    CustomReportEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    CustomReportEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/custom_report/index.js b/server/api/custom_report/index.js
index cf6aa62..04b15c4 100644
--- a/server/api/custom_report/index.js
+++ b/server/api/custom_report/index.js
@@ -1,24 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./custom_report.controller');
-var auth = require('../../auth/auth.service');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.index);
-router.get('/:id/preview', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.preview);
-router.get('/:id', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.show);
-router.get('/:id/query', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.getReportQuery);
-router.get('/:id/export', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.export);
-router.post('/', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.create);
-router.get('/:id/extract/pdf', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.extractPdf);
-router.get('/:id/extract/csv', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.extractCsv);
-router.post('/import', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.import);
-router.post('/:id/copy', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.copy);
-router.put('/:id', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.update);
-router.delete('/', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.bulkDestroy);
-router.delete('/node/:id', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.destroyNodeReports);
-router.delete('/:id', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/dashboard/dashboard.controller.js b/server/api/dashboard/dashboard.controller.js
index 9a1998e..00545c5 100644
--- a/server/api/dashboard/dashboard.controller.js
+++ b/server/api/dashboard/dashboard.controller.js
@@ -1,320 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var util = require('util');
-var Util = require('../../config/util');
-
-var Dashboard = require('../../models').Dashboard;
-var VoiceQueue = require('../../models').VoiceQueue;
-var sequelize = require('../../models').sequelize;
-
-// Get list of dashboards
-exports.index = function(req, res, next) {
-  return Dashboard
-    .findAndCountAll(Util.getQuery(req.query))
-    .then(function(result) {
-      res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.init = function(req, res, next) {
-
-  // QUEUE SET
-  var voice = {
-    queues: {},
-    outbound: {}
-  };
-
-  return VoiceQueue
-    .findAll({
-      attributes: ['name'],
-      raw: true
-    })
-    .then(function(data) {
-      voice.queues = _.keyBy(data, 'name');
-
-      return sequelize
-        .query('SELECT queue, count(*) as waiting \
-        FROM report_queue \
-        WHERE queuecallerleaveAt IS NULL \
-        GROUP BY queue;', {
-          type: sequelize.QueryTypes.SELECT
-        });
-    })
-    .then(function(data) {
-      data.forEach(function(elm) {
-        if (voice.queues[elm.queue]) {
-          voice.queues[elm.queue].waiting = elm.waiting;
-        }
-      });
-
-      return sequelize
-        .query(
-          'SELECT queue, count(*) as active \
-          FROM report_queue \
-          WHERE queuecallerexit = 0 \
-          AND queuecallerabandon = 0 \
-          AND queuecallercomplete = 0 \
-          AND queuecallerleaveAt IS NOT NULL \
-          GROUP BY queue;', {
-            type: sequelize.QueryTypes.SELECT
-          });
-    })
-    .then(function(data) {
-      data.forEach(function(elm) {
-        if (voice.queues[elm.queue]) {
-          voice.queues[elm.queue].active = elm.active;
-        }
-      });
-
-      return sequelize
-        .query(
-          'SELECT queue, count(*) as abandon \
-          FROM report_queue \
-          WHERE queuecallerabandon = 1 \
-          GROUP BY queue;', {
-            type: sequelize.QueryTypes.SELECT
-          });
-    })
-    .then(function(data) {
-      data.forEach(function(elm) {
-        if (voice.queues[elm.queue]) {
-          voice.queues[elm.queue].abandon = elm.abandon;
-        }
-      });
-
-      return sequelize
-        .query(
-          'SELECT queue, count(*) as complete \
-          FROM report_queue \
-          WHERE queuecallercomplete = 1 \
-          GROUP BY queue;', {
-            type: sequelize.QueryTypes.SELECT
-          });
-    })
-    .then(function(data) {
-      data.forEach(function(elm) {
-        if (voice.queues[elm.queue]) {
-          voice.queues[elm.queue].complete = elm.complete;
-        }
-      });
-
-      return sequelize
-        .query('SELECT queue, count(*) as calls, SUM(holdtime) as holdtime \
-        FROM report_agent \
-        WHERE agentcomplete = 1 \
-        GROUP BY queue;', {
-          type: sequelize.QueryTypes.SELECT
-        });
-    })
-    .then(function(data) {
-      data.forEach(function(elm) {
-        if (voice.queues[elm.queue]) {
-          voice.queues[elm.queue].holdtime = elm.holdtime;
-        }
-      });
-
-      return sequelize
-        .query('SELECT queue, count(*) as calls, SUM(talktime) as talktime \
-        FROM report_agent \
-        WHERE agentcomplete = 1 \
-        GROUP BY queue;', {
-          type: sequelize.QueryTypes.SELECT
-        });
-    })
-    .then(function(data) {
-      data.forEach(function(elm) {
-        if (voice.queues[elm.queue]) {
-          voice.queues[elm.queue].talktime = elm.talktime;
-        }
-      });
-
-      return sequelize
-        .query('SELECT queue, count(*) as unmanaged \
-        FROM report_queue \
-        WHERE queuecallerexit = 1 \
-        GROUP BY queue;', {
-          type: sequelize.QueryTypes.SELECT
-        });
-    })
-    .then(function(data) {
-      data.forEach(function(elm) {
-        if (voice.queues[elm.queue]) {
-          voice.queues[elm.queue].unmanaged = elm.unmanaged;
-        }
-      });
-
-      return sequelize
-        .query('SELECT count(*) as answered \
-        FROM report_call \
-        WHERE disposition = \'ANSWERED\' \
-        AND type = \'outbound\';', {
-          type: sequelize.QueryTypes.SELECT
-        });
-    })
-    .then(function(data) {
-      voice.outbound.answered = data[0].answered;
-
-      return sequelize
-        .query('SELECT count(*) as manualOutbound \
-        FROM report_call \
-        WHERE type = \'outbound\';', {
-          type: sequelize.QueryTypes.SELECT
-        });
-    })
-    .then(function(data) {
-      voice.outbound.manualOutbound = data[0].manualOutbound;
-
-      return sequelize
-        .query('SELECT SUM(duration) as globalDuration \
-        FROM report_call \
-        WHERE type = \'outbound\';', {
-          type: sequelize.QueryTypes.SELECT
-        });
-    })
-    .then(function(data) {
-      voice.outbound.globalDuration = data[0].globalDuration || 0;
-
-      return sequelize
-        .query('SELECT AVG(duration) as avgDuration \
-      FROM report_call \
-      WHERE type=\"outbound\"', {
-          type: sequelize.QueryTypes.SELECT
-        });
-    })
-    .then(function(data) {
-      voice.outbound.avgDuration = data[0].avgDuration || 0;
-      voice.outbound.answerRate = voice.outbound.avgDuration ? ((voice.outbound.answered / voice.outbound.globalDuration) * 100) : 0;
-
-      return res.status(200).send(voice);
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-};
-
-// Get a single dashboard
-exports.all = function(req, res) {
-  return Dashboard
-    .findAll()
-    .then(function(dashboards) {
-      if (!dashboards) {
-        return res.sendStatus(404);
-      }
-      return res.status(200).send(dashboards);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single dashboard
-exports.show = function(req, res) {
-  return Dashboard
-    .findById(req.params.id)
-    .then(function(dashboard) {
-      if (!dashboard) {
-        return res.sendStatus(404);
-      }
-      return res.send(dashboard);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new dashboard in the DB.
-exports.create = function(req, res) {
-  return Dashboard
-    .create(req.body)
-    .then(function(dashboard) {
-      return res.status(201).send(dashboard);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Clone a dashboard in the DB.
-exports.clone = function(req, res) {
-  return Dashboard
-    .findById(req.params.id)
-    .then(function(dashboard) {
-      var newDashboard = dashboard.dataValues;
-      delete newDashboard.id;
-      newDashboard.editable = true;
-      newDashboard.defaultEntry = false;
-      newDashboard.name = req.body.name || newDashboard.name;
-      return Dashboard
-        .create(newDashboard);
-    })
-    .then(function(dashboard) {
-      return res.status(201).send(dashboard);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing dashboard in the DB.
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  return Dashboard
-    .findById(req.params.id)
-    .then(function(dashboard) {
-      if (!dashboard) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(dashboard, req.body);
-      return updated.save();
-    })
-    .then(function(dashboard) {
-      return res.status(200).send(dashboard);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a dashboard from the DB.
-exports.destroy = function(req, res) {
-  return Dashboard
-    .findById(req.params.id)
-    .then(function(dashboard) {
-      if (!dashboard) {
-        return res.sendStatus(404);
-      }
-      return dashboard.destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.bulkDestroy = function(req, res) {
-  return Dashboard
-    .destroy({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/dashboard/dashboard.events.js b/server/api/dashboard/dashboard.events.js
index 2097ae7..ce73d56 100644
--- a/server/api/dashboard/dashboard.events.js
+++ b/server/api/dashboard/dashboard.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const Dashboard = require('../../models').Dashboard;
-
-var DashboardEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-DashboardEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  Dashboard.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    DashboardEvents.emit(event + ':' + doc._id, doc);
-    DashboardEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = DashboardEvents;
\ No newline at end of file
diff --git a/server/api/dashboard/dashboard.socket.js b/server/api/dashboard/dashboard.socket.js
index f23e2a0..fd680fd 100644
--- a/server/api/dashboard/dashboard.socket.js
+++ b/server/api/dashboard/dashboard.socket.js
@@ -1,28 +1 @@
-'use strict';
-
-const DashboardEvents = require('./dashboard.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('dashboard:' + event, socket);
-
-    DashboardEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    DashboardEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/dashboard/index.js b/server/api/dashboard/index.js
index 495783a..7a89ef7 100644
--- a/server/api/dashboard/index.js
+++ b/server/api/dashboard/index.js
@@ -1,19 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./dashboard.controller');
-var auth = require('../../auth/auth.service');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), auth.hasModule([2], ['admin', 'user', 'agent']), controller.index);
-router.get('/all', auth.isAuthenticated(), auth.hasModule([2], ['admin']), controller.all);
-router.get('/voice/init', auth.isAuthenticated(), auth.hasModule([2], ['admin', 'user', 'agent']), controller.init);
-router.get('/:id', auth.isAuthenticated(), auth.hasModule([2], ['admin']), controller.show);
-router.post('/', auth.isAuthenticated(), auth.hasModule([2], ['admin']), controller.create);
-router.post('/:id/clone', auth.isAuthenticated(), auth.hasModule([2], ['admin']), controller.clone);
-router.put('/:id', auth.isAuthenticated(), auth.hasModule([2], ['admin']), controller.update);
-router.delete('/', auth.isAuthenticated(), auth.hasModule([2], ['admin']), controller.bulkDestroy);
-router.delete('/:id', auth.isAuthenticated(), auth.hasModule([2], ['admin']), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/default_metric/default_metric.controller.js b/server/api/default_metric/default_metric.controller.js
index 321849c..0352e07 100644
--- a/server/api/default_metric/default_metric.controller.js
+++ b/server/api/default_metric/default_metric.controller.js
@@ -1,158 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var DefaultMetric = require('../../models').DefaultMetric;
-var Metric = require('../../models').Metric;
-var util = require('util');
-var Util = require('../../config/util');
-var sequelize = require('../../models').sequelize;
-var sr = require('simple-random');
-
-// Get list of metrics
-exports.index = function(req, res, next) {
-  return DefaultMetric
-    .findAndCountAll(Util.getQuery(req.query))
-    .then(function(result) {
-      return res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.getMetricsByTable = function(req, res) {
-  return DefaultMetric
-    .findAll({
-      where: {
-        table: req.query.table
-      }
-    })
-    .then(function(metrics) {
-      if (!metrics) {
-        return res.sendStatus(404);
-      }
-      return res.status(200).send({
-        count: metrics.length,
-        rows: metrics
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.cloneMetric = function(req, res) {
-  return DefaultMetric
-    .findById(req.params.id)
-    .then(function(metric) {
-      if (!metric) {
-        return res.sendStatus(404);
-      }
-      delete metric.dataValues.id;
-      metric.dataValues.name += '_' + sr({
-        length: 5
-      })
-      return Metric.create(metric.dataValues);
-    })
-    .then(function() {
-      return res.sendStatus(201);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// // Get a single metric
-// exports.show = function(req, res) {
-//   return Metric
-//     .findById(req.params.id)
-//     .then(function(metric) {
-//       if (!metric) {
-//         return res.sendStatus(404);
-//       }
-//       return res.send(metric);
-//     })
-//     .catch(function(err) {
-//       return handleError(res, err);
-//     });
-// };
-//
-// // Creates a new metric in the DB.
-// exports.create = function(req, res) {
-//   return Metric
-//     .create(req.body)
-//     .then(function(metric) {
-//       return res.status(201).send(metric);
-//     })
-//     .catch(sequelize.UniqueConstraintError, function(err) {
-//       err.translatedMessage = 'MESSAGE_EXIST_METRIC';
-//       err.message = 'A Metric with that name already exists';
-//       return res.status(500).send(err);
-//     })
-//     .catch(function(err) {
-//       return handleError(res, err);
-//     });
-// };
-//
-// // Updates an existing metric in the DB.
-// exports.update = function(req, res) {
-//   return Metric
-//     .findById(req.params.id)
-//     .then(function(metric) {
-//       if (!metric) {
-//         return res.sendStatus(404);
-//       }
-//       var updated = _.merge(metric, req.body);
-//       return updated.save();
-//     })
-//     .then(function() {
-//       return res.sendStatus(200);
-//     })
-//     .catch(sequelize.UniqueConstraintError, function(err) {
-//       err.translatedMessage = 'MESSAGE_EXIST_METRIC';
-//       err.message = 'A Metric with that name already exists';
-//       return res.status(500).send(err);
-//     })
-//     .catch(function(err) {
-//       console.log(err);
-//       return handleError(res, err);
-//     });
-// };
-//
-// // Deletes a metric from the DB.
-// exports.destroy = function(req, res) {
-//   return Metric
-//     .findById(req.params.id)
-//     .then(function(metric) {
-//       if (!metric) {
-//         return res.sendStatus(404);
-//       }
-//       return metric.destroy();
-//     })
-//     .then(function() {
-//       return res.sendStatus(204);
-//     })
-//     .catch(function(err) {
-//       return handleError(res, err);
-//     });
-// };
-//
-// exports.bulkDestroy = function(req, res) {
-//   return Metric
-//     .destroy({
-//       where: {
-//         id: req.query.ids
-//       },
-//       individualHooks: true
-//     })
-//     .then(function() {
-//       return res.sendStatus(204);
-//     })
-//     .catch(function(err) {
-//       return handleError(res, err);
-//     });
-// };
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/default_metric/index.js b/server/api/default_metric/index.js
index 4608ee8..090043f 100644
--- a/server/api/default_metric/index.js
+++ b/server/api/default_metric/index.js
@@ -1,19 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./default_metric.controller');
-var auth = require('../../auth/auth.service');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.index);
-router.get('/table', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.getMetricsByTable);
-router.get('/:id/clone', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.cloneMetric);
-// router.get('/:id', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.show);
-// router.post('/', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.create);
-// router.put('/:id', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.update);
-// router.patch('/:id', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.update);
-// router.delete('/', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.bulkDestroy);
-// router.delete('/:id', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/default_report/default_report.controller.js b/server/api/default_report/default_report.controller.js
index ea51157..96c2b9c 100644
--- a/server/api/default_report/default_report.controller.js
+++ b/server/api/default_report/default_report.controller.js
@@ -1,392 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var util = require('util');
-var DefaultReport = require('../../models').DefaultReport;
-var ReportField = require('../../models').ReportField;
-var Metric = require('../../models').Metric;
-var sequelize = require('../../models').sequelize;
-var CustomReport = require('../../models').CustomReport;
-var ExtractedReport = require('../../models').ExtractedReport;
-var extractUtils = require('../../utils/report_extraction');
-var reportBuildUtils = require('../../utils/report_build');
-var Util = require('../../config/util');
-var moment = require('moment');
-var cp = require('child_process');
-var sr = require('simple-random');
-var ReportTree = require('../../models').ReportTree;
-
-// Get list of agents
-exports.index = function(req, res, next) {
-  return DefaultReport
-    .findAndCountAll(Util.getQuery(req.query))
-    .then(function(result) {
-      res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single report
-exports.export = function(req, res) {
-  return DefaultReport
-    .scope({
-      method: ['exportFields', {
-        DefaultReportId: req.params.id
-      }]
-    }) //add where condition on customreport id
-    .findById(req.params.id, {
-      attributes: ['conditions', 'description', 'name', 'parent', 'table']
-    })
-    .then(function(report) {
-      if (!report) {
-        return res.sendStatus(404);
-      }
-      return res.send(report);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-
-exports.getReportQuery = function(req, res) {
-  return Promise
-    .all([])
-    .then(getQuery(req, res))
-    .then(function(query) {
-      if (query) {
-        switch (query) {
-          case 'permission':
-            query = 'no sufficient queue permissions for the user';
-            break;
-          default:
-        }
-      }
-      res.status(200).send({
-        query: query
-      });
-    })
-    .catch(function(err) {
-      console.log('Error getting query from api:', err);
-    });
-}
-
-function getQuery(req, res) {
-  var _report;
-  return function() {
-    return DefaultReport
-      .scope('fields')
-      .findById(req.params.id)
-      .then(function(report) {
-        console.log('found report');
-        if (!report) {
-          return res.sendStatus(404);
-        }
-        if (req.query.daily && req.query.daily === 'true') {
-          req.query.startDate = moment().format('YYYY-MM-DD');
-          req.query.endDate = moment().format('YYYY-MM-DD');
-          report.dataValues.table = report.dataValues.table.replace(
-            '_history', '');
-        }
-        delete req.query.daily;
-        _report = report.dataValues;
-        return _report.table;
-      })
-      .then(reportBuildUtils.buildFilter(req.user))
-      .then(function(filter) {
-        return [filter, _report];
-      })
-      .spread(reportBuildUtils.buildQuery(req.query))
-  }
-}
-
-exports.preview = function(req, res) {
-  var _countAll;
-  return Promise
-    .all([])
-    .then(getQuery(req, res))
-    .then(reportBuildUtils.checkQuery())
-    .then(function(results) {
-      if (results && _.isArray(results)) {
-        _countAll = results.length;
-        if (req.query.limit) {
-          results = _(results).slice(req.query.offset || 0).take(req.query.limit).value();
-        }
-        _.forEach(results, function(row) {
-          _.forOwn(row, function(property, key) {
-            if (property instanceof Date) {
-              row[key] = moment(property).format("YYYY-MM-DD HH:mm:ss").toString();
-            }
-          });
-        });
-        res.status(200).send({
-          rows: results,
-          count: _countAll
-        });
-      } else {
-        return handleError(res, {
-          message: results || 'query error'
-        });
-      }
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-exports.extractPdf = function(req, res) {
-  // console.log('extractPdf api function');
-  docExtract(req, res, 'PDF')
-};
-
-exports.extractCsv = function(req, res) {
-  // console.log('extractCsv api function');
-  docExtract(req, res, 'CSV');
-};
-
-function docExtract(req, res, typeFunction) {
-  var report;
-  // console.log('common docExtract api function');
-  DefaultReport //DO NOT ADD RETURN CAUSE THE EXTRACTING FUNCTION WILL KEEP EXTRACTING AFTER THE API HAS RETURNED
-    .scope('fields')
-    .findById(req.params.id)
-    .then(function(_report) {
-      if (!_report) {
-        return res.sendStatus(404);
-      }
-      report = _report;
-      return ReportTree
-        .findById(1);
-    })
-    .then(function(tree) {
-      tree = JSON.parse(tree.tree);
-      var folder = _.find(tree, {
-        id: report.parent
-      });
-      var path = getReportPath(folder, tree, report.name);
-      // console.log('found the report, creating the new DB row for extracted reports..');
-      //CREATE A DB ROW IN A TABLE WITH THE REPORT INFO, QUERY DATES, AND THE STATUS 'ELABORATING'
-      if (req.query.daily && req.query.daily === 'true') {
-        req.query.startDate = moment().format('YYYY-MM-DD');
-        req.query.endDate = moment().format('YYYY-MM-DD');
-        report.dataValues.table = report.dataValues.table.replace('_history', '');
-      }
-      delete req.query.daily;
-      return [report, ExtractedReport.create({
-        name: path,
-        startDate: req.query.startDate ? req.query.startDate + (req.query.startTime ? ' ' + req.query.startTime : '00:00') : null,
-        endDate: req.query.endDate ? req.query.endDate + (req.query.endTime ? ' ' + req.query.endTime : '23:59') : null,
-        output: typeFunction,
-        UserId: req.user.id
-      })]
-    })
-    .spread(function(report, extractedReport) {
-      // console.log('created new extracted reports db entry, calling external extraction function: ' + typeFunction);
-      var child = cp.fork(__dirname + '/../../utils/report_extraction.js');
-      child.on('message', function(data) {
-        console.log('child message', data);
-        child.kill();
-      }).on('close', function() {
-        console.log('child close');
-      }).on('error', function(err) {
-        console.log('child error', err);
-      });
-      child.send({
-        report: report,
-        query: req.query,
-        extractedId: extractedReport.id,
-        user: req.user,
-        type: typeFunction
-      });
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-  return res.sendStatus(200);
-}
-
-function getReportPath(folder, tree, path) {
-  path = folder.text + '/ ' + path;
-  if (folder.parent === '#') {
-    return path;
-  } else {
-    return getReportPath(_.find(tree, {
-      id: folder.parent
-    }), tree, path);
-  }
-}
-
-// Get a single report
-exports.show = function(req, res) {
-  return DefaultReport
-    .findById(req.params.id, {
-      include: [{
-        all: true
-      }]
-    })
-    .then(function(report) {
-      if (!report) {
-        return res.sendStatus(404);
-      }
-      return res.send(report);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Copy a default report
-exports.copy = function(req, res) {
-  var _fields;
-  return sequelize.transaction(function(t) {
-      return DefaultReport
-        .scope({
-          method: ['exportFields', {
-            DefaultReportId: req.params.id
-          }]
-        })
-        .findById(req.params.id)
-        .then(function(report) {
-          if (!report) {
-            return res.sendStatus(404);
-          }
-          var newReport = report.dataValues;
-          console.log(newReport);
-          delete newReport.id;
-          delete newReport.createdAt;
-          delete newReport.updatedAt;
-          newReport.parent = req.body.parent;
-          _fields = _.map(newReport.Fields, 'dataValues');
-          return CustomReport.create(newReport, {
-            transaction: t
-          })
-        })
-        .then(function(report) {
-          return [report, _fields];
-        })
-        .spread(createCopyFields(t));
-    })
-    .then(function() {
-      return res.sendStatus(201);
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-function createCopyFields(t) {
-  return function(report, fields) {
-    if (fields && Array.isArray(fields) && fields.length) {
-      var tableModel = reportBuildUtils.getTable(report.table);
-      if (tableModel) {
-        var _tableFields;
-        return tableModel
-          .describe()
-          .then(function(tableFields) {
-            _tableFields = _.keys(tableFields);
-            var bulkFields = [];
-            var groupedFields = _.groupBy(fields, 'DefaultMetricId');
-            _.forOwn(groupedFields, function(value, key) {
-              if (key !== 'undefined' && key !== 'null') {
-                value[0].DefaultMetric.ReportFields.forEach(function(elem) {
-                  elem.CustomReportId = report.id;
-                });
-                value[0].DefaultMetric.name += '_' + sr({
-                  length: 5
-                });
-                bulkFields.push(Metric
-                  .create(value[0].DefaultMetric.dataValues, {
-                    include: [{
-                      model: ReportField,
-                      as: 'ReportFields'
-                    }],
-                    transaction: t
-                  }));
-              } else {
-                value.forEach(function(elem) {
-                  if (_.includes(_tableFields, elem.field) || elem.custom) {
-                    elem.CustomReportId = report.id;
-                    bulkFields.push(ReportField
-                      .create(elem, {
-                        transaction: t
-                      }));
-                  } else {
-                    throw new sequelize.Error("The field " + elem.field +
-                      " you specified does not exist in the table"
-                    );
-                  }
-                });
-              }
-            });
-            return bulkFields;
-          })
-          .all();
-      } else {
-        throw new sequelize.Error(
-          "You have not specified the table or the table does not exist");
-      }
-    }
-  }
-}
-
-
-// Creates a new report in the DB.
-exports.create = function(req, res) {
-  return DefaultReport
-    .create(req.body)
-    .then(function(report) {
-      return res.status(201).send(report);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing report in the DB.
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  return DefaultReport
-    .findById(req.params.id)
-    .then(function(report) {
-      if (!report) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(report, req.body);
-      return updated.save();
-    })
-    .then(function(report) {
-      return res.status(200).send(report);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a report from the DB.
-exports.destroy = function(req, res) {
-  return DefaultReport
-    .findById(req.params.id)
-    .then(function(report) {
-      if (!report) {
-        return res.sendStatus(404);
-      }
-      return report.destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/default_report/default_report.events.js b/server/api/default_report/default_report.events.js
index d10d898..3f5df54 100644
--- a/server/api/default_report/default_report.events.js
+++ b/server/api/default_report/default_report.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const DefaultReport = require('../../models').DefaultReport;
-
-var DefaultReportEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-DefaultReportEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  DefaultReport.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    DefaultReportEvents.emit(event + ':' + doc._id, doc);
-    DefaultReportEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = DefaultReportEvents;
\ No newline at end of file
diff --git a/server/api/default_report/default_report.socket.js b/server/api/default_report/default_report.socket.js
index db50575..12085f0 100644
--- a/server/api/default_report/default_report.socket.js
+++ b/server/api/default_report/default_report.socket.js
@@ -1,28 +1 @@
-'use strict';
-
-const DefaultReportEvents = require('./default_report.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('default_report:' + event, socket);
-
-    DefaultReportEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    DefaultReportEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/default_report/index.js b/server/api/default_report/index.js
index 019d6fb..5546135 100644
--- a/server/api/default_report/index.js
+++ b/server/api/default_report/index.js
@@ -1,21 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./default_report.controller');
-var auth = require('../../auth/auth.service');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.index);
-router.get('/:id/preview', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.preview);
-router.get('/:id/query', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.getReportQuery);
-router.get('/:id', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.show);
-router.get('/:id/export', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.export);
-// router.post('/', controller.create);
-router.get('/:id/extract/pdf', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.extractPdf);
-router.get('/:id/extract/csv', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.extractCsv);
-router.post('/:id/copy', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.copy);
-// router.put('/:id', controller.update);
-// router.delete('/:id', controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/desk_account/desk_account.controller.js b/server/api/desk_account/desk_account.controller.js
index f65313b..61a0c20 100644
--- a/server/api/desk_account/desk_account.controller.js
+++ b/server/api/desk_account/desk_account.controller.js
@@ -1,255 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var util = require('util');
-var desk = require('desk.js');
-
-var DeskAccount = require('../../models').DeskAccount;
-
-// Get list of desk_accounts
-exports.index = function(req, res) {
-  var attributes = ['description', 'name', 'username', 'remoteUri'];
-  var per_page = req.query.per_page ? parseInt(req.query.per_page, 10) : 100;
-  var page = req.query.page ? parseInt(req.query.page, 10) : 0;
-
-  var query = {
-    where: {},
-    limit: per_page,
-    offset: page * per_page
-  };
-
-  _.forIn(req.query, function(value, key) {
-    switch (key) {
-      case 'per_page':
-      case 'page':
-        break;
-      case 'sort_by':
-        query.order = util.format('%s %s', req.query.sort_by, req.query.sort_order || 'ASC') || null;
-        break;
-      case 'sort_order':
-        break;
-      case '$':
-        query.where.$or = [];
-        attributes.forEach(function(attribute) {
-          var tmp = {};
-          tmp[attribute] = {
-            $like: '%' + value + '%'
-          };
-
-          query.where.$or.push(tmp);
-        });
-        break;
-      default:
-        query.where[key] = {
-          $like: {}
-        };
-        query.where[key].$like = '%' + value + '%';
-    }
-  });
-
-  return DeskAccount
-    .findAndCountAll(query)
-    .then(function(result) {
-
-      var total_pages = Math.ceil(result.count / per_page);
-      var next_page = total_pages > (query.offset + 1) ? util.format('%s://%s%s?page=%d', req.protocol, req.headers.host, req.baseUrl, page + 1) : null;
-      var previous_page = page > 0 ? util.format('%s://%s%s?page=%d', req.protocol, req.headers.host, req.baseUrl, page - 1) : null;
-
-      return res.status(200).send({
-        count: result.count,
-        rows: result.rows,
-        next_page: next_page,
-        previous_page: previous_page,
-        total_pages: total_pages
-      });
-    })
-    .catch(function(err) {
-      return res.status(500).send({
-        error: 'Something blew up!'
-      });
-    });
-};
-
-// Get a single desk_account
-exports.show = function(req, res) {
-  DeskAccount
-    .findById(req.params.id)
-    .then(function(desk_account) {
-      if (!desk_account) {
-        return res.sendStatus(404);
-      }
-      return res.send(desk_account);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new desk_account in the DB.
-exports.create = function(req, res, next) {
-  DeskAccount
-    .create(req.body)
-    .then(function(desk_account) {
-      return res.status(201).send(desk_account);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing desk_account in the DB.
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  DeskAccount
-    .findById(req.params.id)
-    .then(function(desk_account) {
-      if (!desk_account) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(desk_account, req.body);
-      updated.save()
-        .then(function() {
-          return res.status(200).send(desk_account);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a desk_account from the DB.
-exports.destroy = function(req, res) {
-  DeskAccount
-    .findById(req.params.id)
-    .then(function(desk_account) {
-      if (!desk_account) {
-        return res.sendStatus(404);
-      }
-      desk_account.destroy()
-        .then(function() {
-          return res.sendStatus(204);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.checkAccount = function(req, res) {
-  DeskAccount
-    .findById(req.params.id)
-    .then(function(account) {
-      var desk_account = {
-        endpoint: stripTrailingSlash(account.remoteUri),
-        retry: false
-      };
-      if (account.authType === 'basic') {
-        desk_account.username = account.username;
-        desk_account.password = account.password;
-      } else if (account.authType === 'oauth') {
-        desk_account.consumerKey = account.consumerKey;
-        desk_account.consumerSecret = account.consumerSecret;
-        desk_account.token = account.token;
-        desk_account.tokenSecret = account.tokenSecret;
-      }
-      var client = desk.createClient(desk_account);
-      client.get('/api/v2/users/me', function(err, body, response) {
-        if (err) {
-          return handleError(res, err);
-        }
-        return res.sendStatus(200);
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.deskValidation = function(req, res) {
-  var where = {};
-  where[req.params.field] = req.body.value;
-  DeskAccount
-    .findAndCountAll({
-      where: where
-    })
-    .then(function(result) {
-      if (result.count) {
-        return res.status(200).send({
-          isValid: false,
-          value: req.body.value
-        });
-      }
-      return res.status(200).send({
-        isValid: true,
-        value: req.body.value
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.getFields = function(req, res) {
-  DeskAccount
-    .findById(req.params.id)
-    .then(function(account) {
-      var desk_account = {
-        endpoint: stripTrailingSlash(account.remoteUri),
-        retry: false
-      };
-      if (account.authType === 'basic') {
-        desk_account.username = account.username;
-        desk_account.password = account.password;
-      } else if (account.authType === 'oauth') {
-        desk_account.consumerKey = account.consumerKey;
-        desk_account.consumerSecret = account.consumerSecret;
-        desk_account.token = account.token;
-        desk_account.tokenSecret = account.tokenSecret;
-      }
-      var client = desk.createClient(desk_account);
-      client.get('/api/v2/custom_fields', function(err, body, response) {
-        if (err) {
-          return handleError(res, err);
-        }
-        return res.status(200).json(body._embedded.entries);
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-}
-
-exports.bulkDestroy = function(req, res) {
-  DeskAccount
-    .destroy({
-      where: {
-        id: req.query.id
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function stripTrailingSlash(str) {
-  if (str.substr(-1) === '/') {
-    return str.substr(0, str.length - 1);
-  }
-  return str;
-}
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/desk_account/desk_account.events.js b/server/api/desk_account/desk_account.events.js
index 3a0d697..19b158f 100644
--- a/server/api/desk_account/desk_account.events.js
+++ b/server/api/desk_account/desk_account.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const DeskAccount = require('../../models').DeskAccount;
-
-var DeskAccountEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-DeskAccountEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  DeskAccount.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    DeskAccountEvents.emit(event + ':' + doc._id, doc);
-    DeskAccountEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = DeskAccountEvents;
\ No newline at end of file
diff --git a/server/api/desk_account/desk_account.socket.js b/server/api/desk_account/desk_account.socket.js
index 1d543a4..190dbf9 100644
--- a/server/api/desk_account/desk_account.socket.js
+++ b/server/api/desk_account/desk_account.socket.js
@@ -1,28 +1 @@
-'use strict';
-
-const DeskAccountEvents = require('./desk_account.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('desk_account:' + event, socket);
-
-    DeskAccountEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    DeskAccountEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/desk_account/index.js b/server/api/desk_account/index.js
index 506e627..7f60ad1 100644
--- a/server/api/desk_account/index.js
+++ b/server/api/desk_account/index.js
@@ -1,18 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./desk_account.controller');
-var auth = require('../../auth/auth.service');
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), auth.hasModule([19, 13], ['admin']), controller.index);
-router.get('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.show);
-router.get('/:id/check', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.checkAccount);
-router.get('/:id/fields', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.getFields);
-router.post('/validate/:field', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.deskValidation);
-router.post('/', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.create);
-router.put('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.update);
-router.delete('/', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.bulkDestroy);
-router.delete('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/desk_configuration/desk_configuration.controller.js b/server/api/desk_configuration/desk_configuration.controller.js
index 3824ca1..14a5960 100644
--- a/server/api/desk_configuration/desk_configuration.controller.js
+++ b/server/api/desk_configuration/desk_configuration.controller.js
@@ -1,145 +1 @@
-/**
- * Using Rails-like standard naming convention for endpoints.
- * GET     /api/desk/configurations              ->  index
- * POST    /api/desk/configurations              ->  create
- * GET     /api/desk/configurations/:id          ->  show
- * PUT     /api/desk/configurations/:id          ->  update
- * DELETE  /api/desk/configurations/:id          ->  destroy
- */
-
-'use strict';
-
-var _ = require('lodash');
-
-var DeskConfiguration = require('../../models').DeskConfiguration;
-var DeskField = require('../../models').DeskField;
-
-function handleError(res, statusCode) {
-  statusCode = statusCode || 500;
-  return function(err) {
-    res.status(statusCode).send(err);
-  };
-}
-
-function responseWithResult(res, statusCode) {
-  statusCode = statusCode || 200;
-  return function(entity) {
-    if (entity) {
-      res.status(statusCode).json(entity);
-    }
-  };
-}
-
-function handleEntityNotFound(res) {
-  return function(entity) {
-    if (!entity) {
-      res.status(404).end();
-      return null;
-    }
-    return entity;
-  };
-}
-
-function saveUpdates(updates) {
-  return function(entity) {
-    return entity.updateAttributes(updates)
-      .then(function(updated) {
-        return updated;
-      });
-  };
-}
-
-function removeEntity(res) {
-  return function(entity) {
-    if (entity) {
-      return entity.destroy()
-        .then(function() {
-          res.status(204).end();
-        });
-    }
-  };
-}
-
-// Gets a list of DeskConfigurations
-exports.index = function(req, res) {
-  DeskConfiguration.findAll({
-      where: req.query
-    })
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Gets a single DeskConfiguration from the DB
-exports.show = function(req, res) {
-  DeskConfiguration.find({
-      where: {
-        id: req.params.id
-      },
-      include: [{
-        model: DeskField,
-        as: 'Subject'
-      }, {
-        model: DeskField,
-        as: 'Description'
-      }, {
-        model: DeskField,
-        as: 'Field'
-      }]
-    })
-    .then(handleEntityNotFound(res))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Creates a new DeskConfiguration in the DB
-exports.create = function(req, res) {
-  DeskConfiguration.create(req.body)
-    .then(responseWithResult(res, 201))
-    .catch(handleError(res));
-}
-
-// Updates an existing DeskConfiguration in the DB
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  DeskConfiguration.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(saveUpdates(req.body))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Deletes a DeskConfiguration from the DB
-exports.destroy = function(req, res) {
-  DeskConfiguration.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(removeEntity(res))
-    .catch(handleError(res));
-}
-
-exports.addConfigurationField = function(req, res, next) {
-  // console.log(req.params);
-  var deskConfiguration;
-  DeskConfiguration
-    .findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(function(desk_configuration) {
-      deskConfiguration = desk_configuration;
-      return DeskField.create(req.body)
-    })
-    .then(function(deskField) {
-      switch (req.params.type) {
-        case 'subject':
-          return [deskConfiguration.addSubject(deskField), deskField];
-        case 'description':
-          return [deskConfiguration.addDescription(deskField), deskField];
-        case 'field':
-          return [deskConfiguration.addField(deskField), deskField];
-      }
-    })
-    .spread(function(data, deskField) {
-      return res.status(201).json(deskField);
-    })
-    .catch(handleError(res));
-};
\ No newline at end of file
diff --git a/server/api/desk_configuration/desk_configuration.events.js b/server/api/desk_configuration/desk_configuration.events.js
index 12fbc47..ba5c894 100644
--- a/server/api/desk_configuration/desk_configuration.events.js
+++ b/server/api/desk_configuration/desk_configuration.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const DeskConfiguration = require('../../models').DeskConfiguration;
-
-var DeskConfigurationEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-DeskConfigurationEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  DeskConfiguration.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    DeskConfigurationEvents.emit(event + ':' + doc._id, doc);
-    DeskConfigurationEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = DeskConfigurationEvents;
\ No newline at end of file
diff --git a/server/api/desk_configuration/desk_configuration.socket.js b/server/api/desk_configuration/desk_configuration.socket.js
index 5bc3ca6..6c036f2 100644
--- a/server/api/desk_configuration/desk_configuration.socket.js
+++ b/server/api/desk_configuration/desk_configuration.socket.js
@@ -1,28 +1 @@
-'use strict';
-
-const DeskConfigurationEvents = require('./desk_configuration.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('desk_configuration:' + event, socket);
-
-    DeskConfigurationEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    DeskConfigurationEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/desk_configuration/index.js b/server/api/desk_configuration/index.js
index 23cf463..c60ce19 100644
--- a/server/api/desk_configuration/index.js
+++ b/server/api/desk_configuration/index.js
@@ -1,18 +1 @@
-'use strict';
-
-var express = require('express');
-var auth = require('../../auth/auth.service');
-var controller = require('./desk_configuration.controller');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), controller.index);
-
-router.get('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.show);
-router.post('/', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.create);
-router.put('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.update);
-router.post('/:id/:type', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.addConfigurationField);
-router.delete('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.destroy);
-
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/desk_field/desk_field.controller.js b/server/api/desk_field/desk_field.controller.js
index 6b39f83..012f871 100644
--- a/server/api/desk_field/desk_field.controller.js
+++ b/server/api/desk_field/desk_field.controller.js
@@ -1,104 +1 @@
-/**
- * Using Rails-like standard naming convention for endpoints.
- * GET     /api/desk/fields              ->  index
- * POST    /api/desk/fields              ->  create
- * GET     /api/desk/fields/:id          ->  show
- * PUT     /api/desk/fields/:id          ->  update
- * DELETE  /api/desk/fields/:id          ->  destroy
- */
-
-'use strict';
-
-
-var _ = require('lodash');
-
-var DeskField = require('../../models').DeskField;
-
-
-function handleError(res, statusCode) {
-  statusCode = statusCode || 500;
-  return function(err) {
-    res.status(statusCode).send(err);
-  };
-}
-
-function responseWithResult(res, statusCode) {
-  statusCode = statusCode || 200;
-  return function(entity) {
-    if (entity) {
-      res.status(statusCode).json(entity);
-    }
-  };
-}
-
-function handleEntityNotFound(res) {
-  return function(entity) {
-    if (!entity) {
-      res.status(404).end();
-      return null;
-    }
-    return entity;
-  };
-}
-
-function saveUpdates(updates) {
-  return function(entity) {
-    return entity.updateAttributes(updates)
-      .then(function(updated) {
-        return updated;
-      });
-  };
-}
-
-function removeEntity(res) {
-  return function(entity) {
-    if (entity) {
-      return entity.destroy()
-        .then(function() {
-          res.status(204).end();
-        });
-    }
-  };
-}
-
-// Gets a list of DeskFields
-exports.index = function(req, res) {
-  DeskField.findAll()
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Gets a single DeskField from the DB
-exports.show = function(req, res) {
-  DeskField.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Creates a new DeskField in the DB
-exports.create = function(req, res) {
-  DeskField.create(req.body)
-    .then(responseWithResult(res, 201))
-    .catch(handleError(res));
-}
-
-// Updates an existing DeskField in the DB
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  DeskField.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(saveUpdates(req.body))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Deletes a DeskField from the DB
-exports.destroy = function(req, res) {
-  DeskField.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(removeEntity(res))
-    .catch(handleError(res));
-}
\ No newline at end of file
diff --git a/server/api/desk_field/desk_field.events.js b/server/api/desk_field/desk_field.events.js
index 90e8c70..5d40ee3 100644
--- a/server/api/desk_field/desk_field.events.js
+++ b/server/api/desk_field/desk_field.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const DeskField = require('../../models').DeskField;
-
-var DeskFieldEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-DeskFieldEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  DeskField.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    DeskFieldEvents.emit(event + ':' + doc._id, doc);
-    DeskFieldEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = DeskFieldEvents;
\ No newline at end of file
diff --git a/server/api/desk_field/desk_field.socket.js b/server/api/desk_field/desk_field.socket.js
index b8144e2..1fd1bc8 100644
--- a/server/api/desk_field/desk_field.socket.js
+++ b/server/api/desk_field/desk_field.socket.js
@@ -1,28 +1 @@
-'use strict';
-
-const DeskFieldEvents = require('./desk_field.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('desk_field:' + event, socket);
-
-    DeskFieldEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    DeskFieldEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/desk_field/index.js b/server/api/desk_field/index.js
index 37342d1..089c6ee 100644
--- a/server/api/desk_field/index.js
+++ b/server/api/desk_field/index.js
@@ -1,16 +1 @@
-'use strict';
-
-var express = require('express');
-var auth = require('../../auth/auth.service');
-var controller = require('./desk_field.controller');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.index);
-router.get('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.show);
-router.post('/', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.create);
-router.put('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.update);
-router.delete('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.destroy);
-
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/extracted_report/extracted_report.controller.js b/server/api/extracted_report/extracted_report.controller.js
index 454f170..5db3915 100644
--- a/server/api/extracted_report/extracted_report.controller.js
+++ b/server/api/extracted_report/extracted_report.controller.js
@@ -1,207 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var ExtractedReport = require('../../models').ExtractedReport;
-var util = require('util');
-var path = require('path');
-var moment = require('moment');
-var config = require('../../config/environment');
-var base64 = require('file-base64');
-var fs = require('fs');
-var Util = require('../../config/util');
-
-// Get list of extracted_reports
-exports.index = function(req, res, next) {
-  switch (req.user.role) {
-    case 'user':
-      return ExtractedReport
-        .findAndCountAll(Util.getQuery(req.query, {
-          UserId: req.user.id
-        }))
-        .then(function(result) {
-          res.status(200).send(result);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-    default:
-      return ExtractedReport
-        .findAndCountAll(Util.getQuery(req.query))
-        .then(function(result) {
-          res.status(200).send(result);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-  }
-};
-
-// Get a single extracted_reports
-exports.show = function(req, res) {
-  return ExtractedReport
-    .findById(req.params.id)
-    .then(function(extracted) {
-      if (!extracted) {
-        return res.sendStatus(404);
-      }
-      return res.send(extracted);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.download = function(req, res) {
-  return ExtractedReport
-    .findById(req.params.id)
-    .then(function(extract) {
-      if (!extract) {
-        return res.status(404).send(extract);
-      }
-      var filepath = path.join(config.root, 'server', 'files', 'reports', extract.savename);
-      base64.encode(filepath, function(err, base64String) {
-        if (err) {
-          return handleError(res, err);
-        } else {
-          return res.status(200).send({
-            downloadString: base64String
-          });
-        }
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new extracted_report in the DB.
-exports.create = function(req, res) {
-  return ExtractedReport
-    .create(req.body)
-    .then(function(extracted) {
-      return res.status(201).send(extracted);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing extracted_report in the DB.
-exports.update = function(req, res) {
-  return ExtractedReport
-    .findAll({
-      where: {
-        name: req.body.name,
-        id: {
-          $ne: req.body.id
-        }
-      }
-    })
-    .then(function(extracted_reports) {
-      if (!extracted_reports) {
-        return res.sendStatus(404);
-      }
-      if (req.body.id) {
-        delete req.body.id;
-      }
-      return ExtractedReport
-        .findById(req.params.id);
-    })
-    .then(function(extracted) {
-      if (!extracted) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(extracted, req.body);
-      return updated.save();
-    })
-    .then(function(extracted) {
-      return res.status(200).send(extracted);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes an extracted_report from the DB.
-exports.destroy = function(req, res) {
-  var _extracted;
-  return ExtractedReport
-    .findById(req.params.id)
-    .then(function(extracted) {
-      _extracted = extracted;
-      if (!extracted) {
-        return res.sendStatus(404);
-      }
-      return extracted.destroy();
-    })
-    .then(function() {
-      if (_extracted.savename) {
-        var filepath = path.join(config.root, 'server', 'files', 'reports', _extracted.savename);
-        fs.access(filepath, fs.R_OK | fs.W_OK, function(err) {
-          if (err) {
-            console.error('File does not exist or operation not permitted');
-          } else {
-            fs.unlink(filepath, function(err) {
-              if (err) {
-                console.error('error deleting file :', err);
-              } else {
-                console.log('file deleted');
-              }
-            })
-          }
-        });
-      }
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.bulkDestroy = function(req, res) {
-  var _extracts;
-  return ExtractedReport
-    .findAll({
-      where: {
-        id: req.query.ids
-      }
-    })
-    .then(function(extracts) {
-      _extracts = extracts;
-      var bulkDelete = [];
-      extracts.forEach(function(extracted) {
-        bulkDelete.push(extracted.destroy());
-      });
-      return bulkDelete;
-    })
-    .all()
-    .then(function() {
-      _extracts.forEach(function(extracted) {
-        if (extracted.savename) {
-          var filepath = path.join(config.root, 'server', 'files', 'reports', extracted.savename);
-          fs.access(filepath, fs.R_OK | fs.W_OK, function(err) {
-            if (err) {
-              console.error('File does not exist or operation not permitted');
-            } else {
-              fs.unlink(filepath, function(err) {
-                if (err) {
-                  console.error('error deleting file :', err);
-                } else {
-                  console.log('file deleted');
-                }
-              })
-            }
-          });
-        }
-      });
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  console.log(err);
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/extracted_report/extracted_report.events.js b/server/api/extracted_report/extracted_report.events.js
index 311b078..91dd508 100644
--- a/server/api/extracted_report/extracted_report.events.js
+++ b/server/api/extracted_report/extracted_report.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const ExtractedReport = require('../../models').ExtractedReport;
-
-var ExtractedReportEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-ExtractedReportEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  ExtractedReport.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    ExtractedReportEvents.emit(event + ':' + doc._id, doc);
-    ExtractedReportEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = ExtractedReportEvents;
\ No newline at end of file
diff --git a/server/api/extracted_report/extracted_report.socket.js b/server/api/extracted_report/extracted_report.socket.js
index 684fc40..0770301 100644
--- a/server/api/extracted_report/extracted_report.socket.js
+++ b/server/api/extracted_report/extracted_report.socket.js
@@ -1,28 +1 @@
-'use strict';
-
-const ExtractedReportEvents = require('./extracted_report.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('extracted_report:' + event, socket);
-
-    ExtractedReportEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    ExtractedReportEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/extracted_report/index.js b/server/api/extracted_report/index.js
index ab71e52..05ce2ab 100644
--- a/server/api/extracted_report/index.js
+++ b/server/api/extracted_report/index.js
@@ -1,17 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./extracted_report.controller');
-var auth = require('../../auth/auth.service');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.index);
-router.get('/:id/download', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.download);
-router.get('/:id', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.show);
-router.post('/', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.create);
-router.put('/:id', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.update);
-router.delete('/', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.bulkDestroy);
-router.delete('/:id', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/fax_account/fax_account.controller.js b/server/api/fax_account/fax_account.controller.js
index 92adae5..35bc9f8 100644
--- a/server/api/fax_account/fax_account.controller.js
+++ b/server/api/fax_account/fax_account.controller.js
@@ -1,474 +1 @@
-/**
- * Using Rails-like standard naming convention for endpoints.
- * GET     /api/fax/accounts              ->  index
- * POST    /api/fax/accounts              ->  create
- * GET     /api/fax/accounts/:id          ->  show
- * PUT     /api/fax/accounts/:id          ->  update
- * DELETE  /api/fax/accounts/:id          ->  destroy
- */
-
-'use strict';
-
-
-var _ = require('lodash');
-var Util = require('../../config/util');
-
-var sequelize = require('../../models').sequelize;
-
-var FaxAccount = require('../../models').FaxAccount;
-var FaxRoom = require('../../models').FaxRoom;
-var FaxApplication = require('../../models').FaxApplication;
-var FaxQueue = require('../../models').FaxQueue;
-var FaxDisposition = require('../../models').FaxDisposition;
-var FaxMessage = require('../../models').FaxMessage;
-var FaxAttachment = require('../../models').FaxAttachment;
-var User = require('../../models').User;
-var Interval = require('../../models').Interval;
-
-
-function handleError(res, statusCode) {
-  statusCode = statusCode || 500;
-  return function(err) {
-    res.status(statusCode).send(err);
-  };
-}
-
-function responseWithResult(res, statusCode) {
-  statusCode = statusCode || 200;
-  return function(entity) {
-    if (entity) {
-      res.status(statusCode).json(entity);
-    }
-  };
-}
-
-function responseWithoutResult(res, statusCode) {
-  statusCode = statusCode || 204;
-  return function() {
-    res.sendStatus(statusCode);
-  };
-}
-
-function handleEntityNotFound(res) {
-  return function(entity) {
-    if (!entity) {
-      res.status(404).end();
-      return null;
-    }
-    return entity;
-  };
-}
-
-function saveUpdates(updates) {
-  return function(entity) {
-    return entity.updateAttributes(updates)
-      .then(function(updated) {
-        return updated;
-      });
-  };
-}
-
-function removeEntity(res) {
-  return function(entity) {
-    if (entity) {
-      return entity.destroy()
-        .then(function() {
-          res.status(204).end();
-        });
-    }
-  };
-}
-
-// Gets a list of FaxAccounts
-exports.index = function(req, res) {
-  return FaxAccount
-    .findAndCountAll(Util.getQuery(req.query))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Gets a single FaxAccount from the DB
-exports.show = function(req, res) {
-  return FaxAccount.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Creates a new FaxAccount in the DB
-exports.create = function(req, res) {
-  return sequelize.transaction(function(t) {
-      return FaxAccount.create(req.body, {
-        transaction: t
-      });
-    })
-    .then(responseWithoutResult(res, 201))
-    .catch(sequelize.ValidationError, function(err) {
-      err.message = 'Extension/context combination already exist';
-      err.translatedMessage = 'MESSAGE_EXIST_ROUTE'
-      return res.status(500).send(err);
-    })
-    .catch(sequelize.UniqueConstraintError, function(err) {
-      return Util.errorManager.handleUniqueConstraintError(res, err);
-    })
-    .catch(handleError(res));
-}
-
-// Updates an existing FaxAccount in the DB
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  return sequelize.transaction(function(t) {
-      return FaxAccount.findById(req.params.id)
-        .then(handleEntityNotFound(res))
-        .then(function(faxAccount) {
-          return faxAccount.updateAttributes(req.body, {
-            transaction: t
-          })
-        })
-    })
-    .then(responseWithoutResult(res))
-    .catch(sequelize.ValidationError, function(err) {
-      err.message = 'Extension/context combination already exist';
-      err.translatedMessage = 'MESSAGE_EXIST_ROUTE'
-      return res.status(500).send(err);
-    })
-    .catch(sequelize.UniqueConstraintError, function(err) {
-      return Util.errorManager.handleUniqueConstraintError(res, err);
-    })
-    .catch(handleError(res));
-}
-
-// Deletes a FaxAccount from the DB
-exports.destroy = function(req, res) {
-  return sequelize.transaction(function(t) {
-      return FaxAccount.findById(req.params.id)
-        .then(handleEntityNotFound(res))
-        .then(function(faxAccount) {
-          return faxAccount.destroy();
-        });
-    })
-    .then(function() {
-      res.status(204).end();
-    })
-    .catch(handleError(res));
-}
-
-exports.bulkDestroy = function(req, res) {
-  return FaxAccount
-    .destroy({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(responseWithoutResult(res))
-    .catch(handleError(res));
-};
-
-exports.showApplications = function(req, res, next) {
-  return FaxAccount
-    .scope('default')
-    .findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(function(faxAccount) {
-      return faxAccount
-        .getFaxApplications(_.merge(Util.getQuery(req.query), {
-          include: [{
-            model: FaxQueue,
-            attributes: ['id', 'name']
-          }, {
-            model: User,
-            attributes: ['id', 'name', 'online']
-          }, {
-            model: Interval,
-            attributes: ['id', 'name']
-          }]
-        }));
-    })
-    .then(function(faxApplications) {
-      return res.send({
-        count: faxApplications.length,
-        rows: faxApplications
-      });
-    })
-    .catch(handleError(res));
-};
-
-exports.createApplication = function(req, res, next) {
-  return FaxApplication
-    .max('priority', {
-      where: {
-        FaxAccountId: req.params.id
-      }
-    }).then(function(max) {
-      // SET PRIORITY
-      req.body.priority = max ? ++max : 1;
-      req.body.FaxAccountId = req.params.id;
-      return FaxApplication
-        .create(req.body);
-    })
-    .then(responseWithResult(res, 201))
-    .catch(handleError(res));
-};
-
-exports.bulkDestroyApplications = function(req, res) {
-  return FaxApplication
-    .destroy({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(responseWithoutResult(res))
-    .catch(handleError(res));
-};
-
-exports.destroyApplication = function(req, res, next) {
-  return FaxApplication
-    .findById(req.params.appId)
-    .then(handleEntityNotFound(res))
-    .then(removeEntity(res))
-    .catch(handleError(res));
-};
-
-exports.updateApplications = function(req, res) {
-
-  var priority = 0;
-  var apps = req.body;
-
-  apps.forEach(function(app) {
-    delete app.id;
-    delete app.createdAt;
-    delete app.updatedAt;
-
-    app.priority = ++priority;
-  });
-
-  return sequelize.transaction(function(t) {
-      return FaxApplication
-        .destroy({
-          where: {
-            FaxAccountId: req.params.id
-          },
-          individualHooks: true,
-          transaction: t
-        })
-        .then(function(faxApplication) {
-          return FaxApplication
-            .bulkCreate(apps, {
-              individualHooks: true,
-              transaction: t
-            });
-        });
-    })
-    .then(function(faxApplications) {
-      return res.status(200).send({
-        count: faxApplications.length,
-        rows: faxApplications
-      });
-    })
-    .catch(handleError(res));
-};
-
-exports.updateApplication = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  return FaxApplication.findById(req.params.appId)
-    .then(handleEntityNotFound(res))
-    .then(saveUpdates(req.body))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-exports.showApplication = function(req, res) {
-  return FaxApplication
-    .findById(req.params.appId, {
-      include: [{
-        all: true
-      }]
-    })
-    .then(handleEntityNotFound(res))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-exports.getFaxRooms = function(req, res, next) {
-  var _query = {
-    where: {
-      FaxAccountId: req.params.id,
-      $and: []
-    },
-    include: [],
-    attributes: ['id', 'contact', 'disposition', 'tags', 'lastEvent', 'updatedAt']
-  };
-
-  // TO MOVE SOON INTO AN EXTENAL UTIL FILE
-  if (req.query) {
-    if (req.query.tags) {
-      if (_.isArray(req.query.tags)) {
-        for (var i = 0; i < req.query.tags.length; i++) {
-          _query.where.$and.push({
-            tags: {
-              $like: '%' + req.query.tags[i] + '%'
-            }
-          });
-        }
-      } else {
-        _query.where.$and.push({
-          tags: {
-            $like: '%' + req.query.tags + '%'
-          }
-        });
-      }
-
-      delete req.query.tags;
-    }
-
-    _.merge(_query.where, req.query);
-  }
-
-  switch (req.user.role) {
-    case 'agent':
-      _query.include.push({
-        model: User,
-        attributes: ['id']
-      });
-
-      var _agents;
-      var _agentQueues;
-      var _accountQueues;
-
-      return User
-        .findById(req.user.id)
-        .then(function(user) {
-          if (user) {
-            return user
-              .getFaxQueues();
-          } else {
-            return [];
-          }
-        })
-        .then(function(queues) {
-          _agentQueues = _.map(queues, 'id');
-          return FaxAccount
-            .findById(req.params.id);
-        })
-        .then(function(account) {
-          return account
-            .getFaxApplications({
-              where: {
-                $or: [{
-                  app: 'queue'
-                }, {
-                  app: 'agent'
-                }]
-              }
-            });
-        })
-        .then(function(apps) {
-
-          _agents = _.map(_.find(apps, {
-            'app': 'agent'
-          }), 'UserId');
-
-          _accountQueues = _.map(_.find(apps, {
-            'app': 'queue'
-          }), 'FaxQueueId');
-
-          if (_.intersection(_agentQueues, _accountQueues).length || _.intersection(_agents, [req.user.id]).length) {
-            return FaxRoom
-              .findAll(_query)
-              .then(function(faxRooms) {
-                return res.status(200).send(faxRooms);
-              })
-              .catch(function(err) {
-                console.error(err);
-                return handleError(res, err);
-              });
-          } else {
-
-            return res.status(200).send([]);
-          }
-        })
-        .catch(function(err) {
-          console.error(err);
-        });
-
-    default:
-      return FaxRoom
-        .findAll(_query)
-        .then(function(faxRooms) {
-          return res.status(200).send(faxRooms);
-        })
-        .catch(handleError(res));
-  }
-};
-
-exports.getDispositions = function(req, res, next) {
-  return FaxAccount
-    .findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(function(faxAccount) {
-      return faxAccount.getFaxDispositions();
-    })
-    .then(function(faxDispositions) {
-      return res.status(200).send({
-        rows: faxDispositions,
-        count: faxDispositions.length
-      });
-    })
-    .catch(handleError(res));
-};
-
-exports.createDisposition = function(req, res, next) {
-  req.body.FaxAccountId = req.params.id;
-
-  return FaxDisposition
-    .create(req.body)
-    .then(responseWithResult(res, 201))
-    .catch(handleError(res));
-};
-
-exports.updateDisposition = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-
-  return FaxDisposition
-    .findById(req.params.dispId)
-    .then(handleEntityNotFound(res))
-    .then(function(faxDisposition) {
-      var updated = _.merge(faxDisposition, req.body);
-      return updated.save();
-    })
-    .then(responseWithResult(res, 200))
-    .catch(handleError(res));
-};
-
-exports.destroyDisposition = function(req, res, next) {
-  return FaxDisposition
-    .findById(req.params.dispId)
-    .then(handleEntityNotFound(res))
-    .then(function(faxDiposition) {
-      return faxDiposition.destroy();
-    })
-    .then(responseWithoutResult(res, 204))
-    .catch(handleError(res));
-};
-
-exports.sendMessage = function(req, res, next) {
-  req.body.UserId = req.user.id;
-
-  return FaxMessage
-    .create(req.body, {
-      include: [{
-        model: FaxAttachment
-      }],
-      user: req.user
-    })
-    .then(responseWithResult(res, 201))
-    .catch(handleError(res));
-};
\ No newline at end of file
diff --git a/server/api/fax_account/fax_account.events.js b/server/api/fax_account/fax_account.events.js
index 076c9bc..8b209e9 100644
--- a/server/api/fax_account/fax_account.events.js
+++ b/server/api/fax_account/fax_account.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const FaxAccount = require('../../models').FaxAccount;
-
-var FaxAccountEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-FaxAccountEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  FaxAccount.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    FaxAccountEvents.emit(event + ':' + doc._id, doc);
-    FaxAccountEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = FaxAccountEvents;
\ No newline at end of file
diff --git a/server/api/fax_account/fax_account.socket.js b/server/api/fax_account/fax_account.socket.js
index 777c337..3913b69 100644
--- a/server/api/fax_account/fax_account.socket.js
+++ b/server/api/fax_account/fax_account.socket.js
@@ -1,28 +1 @@
-'use strict';
-
-const FaxAccountEvents = require('./fax_account.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('fax_account:' + event, socket);
-
-    FaxAccountEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    FaxAccountEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/fax_account/index.js b/server/api/fax_account/index.js
index 52e34bf..a901844 100644
--- a/server/api/fax_account/index.js
+++ b/server/api/fax_account/index.js
@@ -1,31 +1 @@
-'use strict';
-
-var express = require('express');
-
-var auth = require('../../auth/auth.service');
-var controller = require('./fax_account.controller');
-var license = require('../../config/license/license.service');
-
-var router = express.Router();
-
-router.get('/', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin', 'agent']), controller.index);
-router.get('/:id', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin', 'agent']), controller.show);
-router.get('/:id/applications', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.showApplications);
-router.get('/:id/applications/:appId', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.showApplication);
-router.get('/:id/rooms', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin', 'agent']), controller.getFaxRooms);
-router.get('/:id/dispositions', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin', 'agent']), controller.getDispositions);
-router.post('/', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.create);
-router.post('/:id/applications', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.createApplication);
-router.post('/:id/dispositions', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.createDisposition);
-router.post('/:id/send', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin', 'agent']), controller.sendMessage);
-router.put('/:id', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.update);
-router.put('/:id/applications', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.updateApplications);
-router.put('/:id/applications/:appId', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.updateApplication);
-router.put('/:id/dispositions/:dispId', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.updateDisposition);
-router.delete('/', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.bulkDestroy);
-router.delete('/:id', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.destroy);
-router.delete('/:id/applications', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.bulkDestroyApplications);
-router.delete('/:id/applications/:appId', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.destroyApplication);
-router.delete('/:id/dispositions/:dispId', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.destroyDisposition);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/fax_application/fax_application.controller.js b/server/api/fax_application/fax_application.controller.js
index 59b09cb..578ab12 100644
--- a/server/api/fax_application/fax_application.controller.js
+++ b/server/api/fax_application/fax_application.controller.js
@@ -1,94 +1 @@
-'use strict';
-var _ = require('lodash');
-var FaxApplication = require('../../models').FaxApplication;
-// Get list of fax_applications
-exports.index = function(req, res) {
-  FaxApplication.findAll({
-    where: req.query
-  }).then(function(fax_applications) {
-    return res.status(200).send(fax_applications);
-  }).catch(function(err) {
-    return handleError(res, err);
-  });
-};
-// Get a single fax_application
-exports.show = function(req, res) {
-  FaxApplication.findById(req.params.id).then(function(fax_application) {
-    if (!fax_application) {
-      return res.sendStatus(404);
-    }
-    return res.send(fax_application);
-  }).catch(function(err) {
-    return handleError(res, err);
-  });
-};
-// Creates a new fax_application in the DB.
-exports.create = function(req, res, next) {
-  console.log(req.body);
-  FaxApplication.max('priority', {
-    where: {
-      FaxAccountId: req.body.FaxAccountId
-    }
-  }).then(function(max) {
-    // SET PRIORITY
-    req.body.priority = max ? ++max : 1;
-    FaxApplication.create(req.body).then(function(faxApplication) {
-      return res.status(201).send(faxApplication);
-    }).catch(function(err) {
-      return next(err);
-    });
-    console.log(max);
-  }).catch(function(err) {
-    next(err);
-  });
-  // FaxApplication
-  // .create(req.body)
-  // .then(function(fax_application) {
-  //   return res.status(201).send(fax_application);
-  // })
-  // .catch(function(err) {
-  //   return handleError(res, err);
-  // });
-};
-// Updates an existing fax_application in the DB.
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  FaxApplication.findById(req.params.id).then(function(fax_application) {
-    if (!fax_application) {
-      return res.sendStatus(404);
-    }
-    var updated = _.merge(fax_application, req.body);
-    updated.save().then(function() {
-      return res.status(200).send(fax_application);
-    }).catch(function(err) {
-      return handleError(res, err);
-    });
-  }).catch(function(err) {
-    return handleError(res, err);
-  });
-};
-// Deletes a fax_application from the DB.
-exports.destroy = function(req, res) {
-  FaxApplication.find({
-    where: {
-      id: req.params.id
-    }
-  }).then(function(fax_application) {
-    if (!fax_application) {
-      return res.sendStatus(404);
-    }
-    fax_application.destroy().then(function() {
-      return res.sendStatus(204);
-    }).catch(function(err) {
-      return handleError(res, err);
-    });
-  }).catch(function(err) {
-    return handleError(res, err);
-  });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/fax_application/fax_application.events.js b/server/api/fax_application/fax_application.events.js
index 72f4dd0..8a5ac76 100644
--- a/server/api/fax_application/fax_application.events.js
+++ b/server/api/fax_application/fax_application.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const FaxApplication = require('../../models').FaxApplication;
-
-var FaxApplicationEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-FaxApplicationEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  FaxApplication.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    FaxApplicationEvents.emit(event + ':' + doc._id, doc);
-    FaxApplicationEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = FaxApplicationEvents;
\ No newline at end of file
diff --git a/server/api/fax_application/fax_application.socket.js b/server/api/fax_application/fax_application.socket.js
index ce03f3d..9d9e2b7 100644
--- a/server/api/fax_application/fax_application.socket.js
+++ b/server/api/fax_application/fax_application.socket.js
@@ -1,28 +1 @@
-'use strict';
-
-const FaxApplicationEvents = require('./fax_application.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('fax_application:' + event, socket);
-
-    FaxApplicationEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    FaxApplicationEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/fax_application/index.js b/server/api/fax_application/index.js
index 91aae9d..9e81acc 100644
--- a/server/api/fax_application/index.js
+++ b/server/api/fax_application/index.js
@@ -1,15 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./fax_application.controller');
-var auth = require('../../auth/auth.service');
-var license = require('../../config/license/license.service');
-
-var router = express.Router();
-
-router.get('/', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.index);
-router.get('/:id', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.show);
-router.post('/', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.create);
-router.put('/:id', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.update);
-router.delete('/:id', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.destroy);
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/fax_attachment/fax_attachment.controller.js b/server/api/fax_attachment/fax_attachment.controller.js
index 39802ff..dcfcebc 100644
--- a/server/api/fax_attachment/fax_attachment.controller.js
+++ b/server/api/fax_attachment/fax_attachment.controller.js
@@ -1,140 +1 @@
-/**
- * Using Rails-like standard naming convention for endpoints.
- * GET     /api/fax/attachments              ->  index
- * POST    /api/fax/attachments              ->  create
- * GET     /api/fax/attachments/:id          ->  show
- * PUT     /api/fax/attachments/:id          ->  update
- * DELETE  /api/fax/attachments/:id          ->  destroy
- */
-
-'use strict';
-
-
-var _ = require('lodash');
-var path = require('path');
-var Util = require('../../config/util');
-var formidable = require('formidable');
-var Promise = require('bluebird');
-
-var config = require('../../config/environment');
-var FaxAttachment = require('../../models').FaxAttachment;
-
-
-function handleError(res, statusCode) {
-  statusCode = statusCode || 500;
-  return function(err) {
-    res.status(statusCode).send(err);
-  };
-}
-
-function responseWithResult(res, statusCode) {
-  statusCode = statusCode || 200;
-  return function(entity) {
-    if (entity) {
-      res.status(statusCode).json(entity);
-    }
-  };
-}
-
-function responseWithoutResult(res, statusCode) {
-  statusCode = statusCode || 204;
-  return function() {
-    res.sendStatus(statusCode);
-  };
-}
-
-function handleEntityNotFound(res) {
-  return function(entity) {
-    if (!entity) {
-      res.status(404).end();
-      return null;
-    }
-    return entity;
-  };
-}
-
-function saveUpdates(updates) {
-  return function(entity) {
-    return entity.updateAttributes(updates)
-      .then(function(updated) {
-        return updated;
-      });
-  };
-}
-
-function removeEntity(res) {
-  return function(entity) {
-    if (entity) {
-      return entity.destroy()
-        .then(function() {
-          res.status(204).end();
-        });
-    }
-  };
-}
-
-// Gets a list of FaxAttachments
-exports.index = function(req, res) {
-  return FaxAttachment.findAll(Util.getQuery(req.query))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Gets a single FaxAttachment from the DB
-exports.show = function(req, res) {
-  return FaxAttachment.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(function(faxAttachment) {
-      return res.sendFile(faxAttachment.path);
-    })
-    .catch(handleError(res));
-}
-
-// Creates a new FaxAttachment in the DB
-exports.create = function(req, res) {
-
-  var form = new formidable.IncomingForm();
-  form.uploadDir = path.join(config.root, 'server', 'files', 'fax', 'outbound', 'original');
-  form.keepExtensions = true;
-  form.multiples = true;
-  form.hash = true;
-
-  form.parse(req, function(err, form, wrap) {
-    if (err) {
-      return res.status(500).send(err);
-    }
-    return res.status(201).send({
-      path: wrap.file.path,
-      name: wrap.file.name,
-      basename: path.basename(wrap.file.path),
-      type: wrap.file.type
-    });
-  });
-
-}
-
-// Updates an existing FaxAttachment in the DB
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  return FaxAttachment.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(saveUpdates(req.body))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Deletes a FaxAttachment from the DB
-exports.destroy = function(req, res) {
-  var unlink = Promise.promisify(require("fs").unlink);
-  var _path = path.join(config.root, 'server', 'files', 'fax', 'outbound', 'original', req.params.id);
-
-  return unlink(_path)
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-}
\ No newline at end of file
diff --git a/server/api/fax_attachment/fax_attachment.events.js b/server/api/fax_attachment/fax_attachment.events.js
index 173e113..0ef68ee 100644
--- a/server/api/fax_attachment/fax_attachment.events.js
+++ b/server/api/fax_attachment/fax_attachment.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const FaxAttachment = require('../../models').FaxAttachment;
-
-var FaxAttachmentEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-FaxAttachmentEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  FaxAttachment.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    FaxAttachmentEvents.emit(event + ':' + doc._id, doc);
-    FaxAttachmentEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = FaxAttachmentEvents;
\ No newline at end of file
diff --git a/server/api/fax_attachment/fax_attachment.socket.js b/server/api/fax_attachment/fax_attachment.socket.js
index ab07da6..5ead9f0 100644
--- a/server/api/fax_attachment/fax_attachment.socket.js
+++ b/server/api/fax_attachment/fax_attachment.socket.js
@@ -1,28 +1 @@
-'use strict';
-
-const FaxAttachmentEvents = require('./fax_attachment.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('fax_attachment:' + event, socket);
-
-    FaxAttachmentEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    FaxAttachmentEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/fax_attachment/index.js b/server/api/fax_attachment/index.js
index 9dd6190..b6afda1 100644
--- a/server/api/fax_attachment/index.js
+++ b/server/api/fax_attachment/index.js
@@ -1,16 +1 @@
-'use strict';
-
-var express = require('express');
-
-var auth = require('../../auth/auth.service');
-var controller = require('./fax_attachment.controller');
-var license = require('../../config/license/license.service');
-
-var router = express.Router();
-
-router.get('/', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin', 'agent']), controller.index);
-router.get('/:id', license.isValidDate(), license.hasFax(), controller.show);
-router.post('/', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin', 'agent']), controller.create);
-router.put('/:id', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin', 'agent']), controller.update);
-router.delete('/:id', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin', 'agent']), controller.destroy);
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/fax_disposition/fax_disposition.controller.js b/server/api/fax_disposition/fax_disposition.controller.js
index c3dcbb7..595e66e 100644
--- a/server/api/fax_disposition/fax_disposition.controller.js
+++ b/server/api/fax_disposition/fax_disposition.controller.js
@@ -1,112 +1 @@
-/**
- * Using Rails-like standard naming convention for endpoints.
- * GET     /api/fax/dispositions              ->  index
- * POST    /api/fax/dispositions              ->  create
- * GET     /api/fax/dispositions/:id          ->  show
- * PUT     /api/fax/dispositions/:id          ->  update
- * DELETE  /api/fax/dispositions/:id          ->  destroy
- */
-
-'use strict';
-
-
-var _ = require('lodash');
-var Util = require('../../config/util');
-
-var FaxDisposition = require('../../models').FaxDisposition;
-
-
-function handleError(res, statusCode) {
-  statusCode = statusCode || 500;
-  return function(err) {
-    res.status(statusCode).send(err);
-  };
-}
-
-function responseWithResult(res, statusCode) {
-  statusCode = statusCode || 200;
-  return function(entity) {
-    if (entity) {
-      res.status(statusCode).json(entity);
-    }
-  };
-}
-
-function responseWithoutResult(res, statusCode) {
-  statusCode = statusCode || 204;
-  return function() {
-    res.sendStatus(statusCode);
-  };
-}
-
-function handleEntityNotFound(res) {
-  return function(entity) {
-    if (!entity) {
-      res.status(404).end();
-      return null;
-    }
-    return entity;
-  };
-}
-
-function saveUpdates(updates) {
-  return function(entity) {
-    return entity.updateAttributes(updates)
-      .then(function(updated) { 
-        return updated;
-      });
-  };
-}
-
-function removeEntity(res) {
-  return function(entity) {
-    if (entity) {
-      return entity.destroy()
-        .then(function() {
-          res.status(204).end();
-        });
-    }
-  };
-}
-
-// Gets a list of FaxDispositions
-exports.index = function(req, res) {
-  return FaxDisposition.findAll(Util.getQuery(req.query))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Gets a single FaxDisposition from the DB
-exports.show = function(req, res) {
-  return FaxDisposition.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Creates a new FaxDisposition in the DB
-exports.create = function(req, res) {
-  return FaxDisposition.create(req.body)
-    .then(responseWithResult(res, 201))
-    .catch(handleError(res));
-}
-
-// Updates an existing FaxDisposition in the DB
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  return FaxDisposition.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(saveUpdates(req.body))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Deletes a FaxDisposition from the DB
-exports.destroy = function(req, res) {
-  return FaxDisposition.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(removeEntity(res))
-    .catch(handleError(res));
-}
\ No newline at end of file
diff --git a/server/api/fax_disposition/fax_disposition.events.js b/server/api/fax_disposition/fax_disposition.events.js
index ea2756f..17d0b16 100644
--- a/server/api/fax_disposition/fax_disposition.events.js
+++ b/server/api/fax_disposition/fax_disposition.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const FaxDisposition = require('../../models').FaxDisposition;
-
-var FaxDispositionEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-FaxDispositionEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  FaxDisposition.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    FaxDispositionEvents.emit(event + ':' + doc._id, doc);
-    FaxDispositionEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = FaxDispositionEvents;
\ No newline at end of file
diff --git a/server/api/fax_disposition/fax_disposition.socket.js b/server/api/fax_disposition/fax_disposition.socket.js
index 42f6297..b4e60c4 100644
--- a/server/api/fax_disposition/fax_disposition.socket.js
+++ b/server/api/fax_disposition/fax_disposition.socket.js
@@ -1,28 +1 @@
-'use strict';
-
-const FaxDispositionEvents = require('./fax_disposition.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('fax_disposition:' + event, socket);
-
-    FaxDispositionEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    FaxDispositionEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/fax_disposition/index.js b/server/api/fax_disposition/index.js
index 2e61ead..f11e9ad 100644
--- a/server/api/fax_disposition/index.js
+++ b/server/api/fax_disposition/index.js
@@ -1,16 +1 @@
-'use strict';
-
-var express = require('express');
-var auth = require('../../auth/auth.service');
-var controller = require('./fax_disposition.controller');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), controller.index);
-router.get('/:id', auth.isAuthenticated(), controller.show);
-router.post('/', auth.isAuthenticated(), controller.create);
-router.put('/:id', auth.isAuthenticated(), controller.update);
-router.patch('/:id', auth.isAuthenticated(), controller.update);
-router.delete('/:id', auth.isAuthenticated(), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/fax_message/fax_message.ami.js b/server/api/fax_message/fax_message.ami.js
index 8bb89b2..2f77408 100644
--- a/server/api/fax_message/fax_message.ami.js
+++ b/server/api/fax_message/fax_message.ami.js
@@ -1,64 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var util = require('util');
-
-var FaxMessage = require('../../models').FaxMessage;
-var Trunk = require('../../models').User;
-
-exports.register = function(ami) {
-
-  FaxMessage.afterCreate(function(doc) {
-    console.log('FaxMessage afterCreate');
-    // onSave(ami, doc);
-  });
-};
-
-function onSave(ami, doc, cb) {
-  if (doc.status === 'NOT SENT' && !doc.actionid) {
-    // I have to send the fax with the Originate
-    var faxBody = JSON.parse(doc.body);
-    console.log('faxBody', faxBody);
-
-    Trunk
-      .findById(faxBody.trunk.id)
-      .then(function(trunk) {
-        var action = {
-          Action: 'originate',
-          CallerID: faxBody.from,
-          Channel: util.format('%s/%s@%s', faxBody.technology, faxBody.to, trunk.name),
-          Context: 'outbound-fax',
-          Exten: 's',
-          Priority: 1,
-          Async: 'true',
-          Variable: {
-            MAXRATE: faxBody.maxrate,
-            MINRATE: faxBody.minrate,
-            ECM: faxBody.ecm ? 'yes' : 'no',
-            LOCALID: faxBody.fax_localid,
-            FAXFILE: faxBody.fax_file,
-            // 'FAXFILE': 'test.tiff', // Scommentare se si fanno prove in locale!
-            FAXHEADER: faxBody.fax_header,
-            FAXUUID: faxBody.uuid
-          }
-        };
-
-        ami.action(action, function(err, res) {
-          if (err) {
-            doc.updateAttributes({
-              status: 'FAILED'
-            });
-          } else {
-            if (res.response && res.actionid) {
-              doc.updateAttributes({
-                actionid: res.actionid
-              });
-            }
-          }
-        });
-      })
-      .catch(function(err) {
-        console.error(err);
-      });
-  }
-}
\ No newline at end of file
diff --git a/server/api/fax_message/fax_message.controller.js b/server/api/fax_message/fax_message.controller.js
index 39fa261..620217a 100644
--- a/server/api/fax_message/fax_message.controller.js
+++ b/server/api/fax_message/fax_message.controller.js
@@ -1,175 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var fs = require('fs');
-var path = require('path');
-var uploadFile = require('upload-file');
-var uuidLib = require('node-uuid');
-var pdf = require('html-pdf');
-// var spindrift = require('spindrift');
-var formidable = require('formidable');
-var exec = require('child_process').exec;
-var config = require('../../config/environment');
-
-var FaxMessage = require('../../models').FaxMessage;
-var FaxAttachment = require('../../models').FaxAttachment;
-var FaxRoom = require('../../models').FaxRoom;
-var FaxAccount = require('../../models').FaxAccount;
-var FaxAttachment = require('../../models').FaxAttachment;
-var User = require('../../models').User;
-
-// Get list of fax_message
-exports.index = function(req, res, next) {
-  var params = {
-    order: 'createdAt DESC',
-    include: [{
-      all: true,
-      include: [{
-        all: true
-      }]
-    }]
-  };
-
-  switch (req.user.role) {
-    case 'admin':
-      params.where = req.query;
-      break;
-    case 'agent':
-      break;
-    default:
-  }
-
-  return FaxMessage
-    .findAll(params)
-    .then(function(fax_message) {
-      return res.status(200).send(fax_message);
-    })
-    .catch(function(err) {
-      return handleError(res, err, next);
-    });
-};
-
-exports.describe = function(req, res) {
-  return FaxMessage
-    .describe()
-    .then(function(fields) {
-      return res.status(200).send(fields);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single faxMessage
-exports.show = function(req, res, next) {
-  return FaxMessage
-    .findById(req.params.id, {
-      include: [{
-        model: FaxAttachment
-      }, {
-        model: User,
-        attributes: ['id', 'name', 'fullname', 'email']
-      }]
-    })
-    .then(function(faxMessage) {
-      if (!faxMessage) {
-        return res.sendStatus(404);
-      }
-      return res.send(faxMessage);
-    })
-    .catch(function(err) {
-      return handleError(res, err, next);
-    });
-};
-
-// Creates a new faxMessage in the DB.
-exports.create = function(req, res, next) {
-  req.body.UserId = req.user.id;
-  req.body.text = req.body.text;
-
-  return FaxMessage
-    .create(req.body, {
-      include: [{
-        model: FaxAttachment
-      }]
-    })
-    .then(function(faxMessage) {
-      return res.status(201).send(faxMessage);
-    }).catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing faxMessage in the DB.
-exports.update = function(req, res, next) {
-  return FaxMessage
-    .findById(req.params.id, {
-      include: [{
-        all: true
-      }]
-    })
-    .then(function(faxMessage) {
-      if (!faxMessage) {
-        return res.sendStatus(404);
-      }
-      return faxMessage.updateAttributes(req.body, {
-        user: req.user
-      });
-    })
-    .then(function(updated) {
-      return res.status(200).send(updated);
-    })
-    .catch(function(err) {
-      return handleError(res, err, next);
-    });
-};
-
-// Deletes a faxMessage from the DB.
-exports.destroy = function(req, res, next) {
-  return FaxMessage
-    .findById(req.params.id)
-    .then(function(faxMessage) {
-      if (!faxMessage) {
-        return res.sendStatus(404);
-      }
-      return faxMessage
-        .destroy();
-    }).then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err, next);
-    });
-};
-
-// Deletes a faxMessage from the DB.
-exports.bulkDelete = function(req, res, next) {
-  return FaxMessage
-    .bulkUpdate({
-      where: {
-        id: {
-          $in: req.body.id
-        }
-      },
-      attributes: {
-        directory: 'TRASH'
-      }
-    })
-    .then(function(faxMessage) {
-      if (!faxMessage) {
-        return res.sendStatus(404);
-      }
-      return faxMessage
-        .destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err, next);
-    });
-};
-
-function handleError(res, err, next) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/fax_message/fax_message.events.js b/server/api/fax_message/fax_message.events.js
index ca98ec2..527e3d9 100644
--- a/server/api/fax_message/fax_message.events.js
+++ b/server/api/fax_message/fax_message.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const FaxMessage = require('../../models').FaxMessage;
-
-var FaxMessageEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-FaxMessageEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  FaxMessage.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    FaxMessageEvents.emit(event + ':' + doc._id, doc);
-    FaxMessageEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = FaxMessageEvents;
\ No newline at end of file
diff --git a/server/api/fax_message/fax_message.socket.js b/server/api/fax_message/fax_message.socket.js
index fc70af3..993d500 100644
--- a/server/api/fax_message/fax_message.socket.js
+++ b/server/api/fax_message/fax_message.socket.js
@@ -1,28 +1 @@
-'use strict';
-
-const FaxMessageEvents = require('./fax_message.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('fax_message:' + event, socket);
-
-    FaxMessageEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    FaxMessageEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/fax_message/index.js b/server/api/fax_message/index.js
index 60e36a1..8279834 100644
--- a/server/api/fax_message/index.js
+++ b/server/api/fax_message/index.js
@@ -1,30 +1 @@
-'use strict';
-
-var express = require('express');
-
-var controller = require('./fax_message.controller');
-var auth = require('../../auth/auth.service');
-var license = require('../../config/license/license.service');
-
-var router = express.Router();
-
-// router.get('/', controller.index);
-// router.get('/:id/content', controller.getContentFromMessage);
-// router.get('/:id', controller.show);
-// router.post('/', controller.create);
-// router.put('/:id', controller.update);
-// router.patch('/:id', controller.update);
-// router.delete('/:id', controller.destroy);
-
-router.get('/', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin', 'agent']), controller.index);
-router.get('/describe', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.describe);
-router.get('/:id', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin', 'agent']), controller.show);
-router.post('/', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin', 'agent']), controller.create);
-router.put('/', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin', 'agent']), controller.update);
-router.put('/delete/bulk', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.bulkDelete);
-router.put('/delete/:id', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.update);
-router.put('/:id', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin', 'agent']), controller.update);
-router.delete('/:id', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.destroy);
-
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/fax_queue/fax_queue.controller.js b/server/api/fax_queue/fax_queue.controller.js
index 682bc1f..aa1ed57 100644
--- a/server/api/fax_queue/fax_queue.controller.js
+++ b/server/api/fax_queue/fax_queue.controller.js
@@ -1,213 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var Util = require('../../config/util');
-
-var User = require('../../models').User;
-var FaxQueue = require('../../models').FaxQueue;
-var UserHasFaxQueue = require('../../models').UserHasFaxQueue;
-
-// Get list of fax_queues
-exports.index = function(req, res) {
-  switch (req.user.role) {
-    case 'user':
-      return User
-        .findById(req.user.id, {
-          attributes: ['id']
-        })
-        .then(Util.getFaxQueuesIdByUser(req.query))
-        .then(function(result) {
-          res.status(200).send(result);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-
-    default:
-      return FaxQueue
-        .findAndCountAll(Util.getQuery(req.query))
-        .then(function(result) {
-          res.status(200).send(result);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-  }
-};
-
-// Get a single fax_queue
-exports.show = function(req, res) {
-  return FaxQueue
-    .findById(req.params.id)
-    .then(function(fax_queue) {
-      if (!fax_queue) {
-        return res.sendStatus(404);
-      }
-      return res.send(fax_queue);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new fax_queue in the DB.
-exports.create = function(req, res) {
-  var _faxQueue;
-
-  return FaxQueue
-    .create(req.body)
-    .then(function(faxQueue) {
-      _faxQueue = faxQueue;
-
-      if (req.body.agents) {
-        return _faxQueue
-          .addUsers(req.body.agents, {
-            penalty: req.body.penalty || 0,
-            queue: _faxQueue.name
-          });
-      }
-    })
-    .then(function() {
-      return res.status(201).send(_faxQueue);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing fax_queue in the DB.
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  return FaxQueue
-    .findById(req.params.id)
-    .then(function(fax_queue) {
-      if (!fax_queue) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(fax_queue, req.body);
-      return updated.save();
-    })
-    .then(function(fax_queue) {
-      return res.status(200).send(fax_queue);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a fax_queue from the DB.
-exports.destroy = function(req, res) {
-  return FaxQueue
-    .findById(req.params.id)
-    .then(function(fax_queue) {
-      if (!fax_queue) {
-        return res.sendStatus(404);
-      }
-      return fax_queue.destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.addAgents = function(req, res, next) {
-
-  return FaxQueue
-    .findById(req.params.id)
-    .then(function(faxQueue) {
-      if (!faxQueue) {
-        return res.sendStatus(404);
-      }
-      var userHasFaxQueues = _.map(req.body.agents, function(agent) {
-        return {
-          UserId: agent,
-          penalty: req.body.penalty,
-          FaxQueueId: faxQueue.id,
-          queue: faxQueue.name
-        };
-      });
-
-      return UserHasFaxQueue
-        .bulkCreate(userHasFaxQueues, {
-          individualHooks: true
-        });
-    })
-    .then(function() {
-      return res.sendStatus(200);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.showAgents = function(req, res) {
-  return FaxQueue
-    .findById(req.params.id)
-    .then(function(queue) {
-      if (!queue) {
-        return res.sendStatus(404);
-      }
-      return queue
-        .getUsers({
-          where: {
-            role: 'agent'
-          },
-          attributes: ['id', 'name', 'fullname', 'email']
-        });
-    })
-    .then(function(agents) {
-      return res.status(200).send({
-        rows: agents,
-        count: agents.length
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.removeAgents = function(req, res, next) {
-  return FaxQueue
-    .findById(req.params.id)
-    .then(function(queue) {
-      if (!queue) {
-        return res.sendStatus(404);
-      }
-      return queue
-        .removeUsers(req.query.agents, {
-          individualHooks: true
-        });
-    })
-    .then(function() {
-      return res.sendStatus(202);
-    })
-    .catch(function(err) {
-      return next(err);
-    });
-};
-
-// Deletes a agent from the DB.
-exports.bulkDestroy = function(req, res) {
-  return FaxQueue
-    .destroy({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/fax_queue/fax_queue.events.js b/server/api/fax_queue/fax_queue.events.js
index a65c990..63446f1 100644
--- a/server/api/fax_queue/fax_queue.events.js
+++ b/server/api/fax_queue/fax_queue.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const FaxQueue = require('../../models').FaxQueue;
-
-var FaxQueueEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-FaxQueueEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  FaxQueue.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    FaxQueueEvents.emit(event + ':' + doc._id, doc);
-    FaxQueueEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = FaxQueueEvents;
\ No newline at end of file
diff --git a/server/api/fax_queue/fax_queue.socket.js b/server/api/fax_queue/fax_queue.socket.js
index 8d589ab..c89d316 100644
--- a/server/api/fax_queue/fax_queue.socket.js
+++ b/server/api/fax_queue/fax_queue.socket.js
@@ -1,28 +1 @@
-'use strict';
-
-const FaxQueueEvents = require('./fax_queue.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('fax_queue:' + event, socket);
-
-    FaxQueueEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    FaxQueueEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/fax_queue/index.js b/server/api/fax_queue/index.js
index 9f1fac3..c7c8535 100644
--- a/server/api/fax_queue/index.js
+++ b/server/api/fax_queue/index.js
@@ -1,20 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./fax_queue.controller');
-var auth = require('../../auth/auth.service');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), controller.index);
-router.get('/:id', auth.isAuthenticated(), controller.show);
-router.get('/:id/agents', auth.isAuthenticated(), controller.showAgents);
-router.post('/', auth.isAuthenticated(), controller.create);
-router.post('/:id/agents', auth.isAuthenticated(), controller.addAgents);
-router.put('/:id', auth.isAuthenticated(), controller.update);
-router.patch('/:id', auth.isAuthenticated(), controller.update);
-router.delete('/', auth.isAuthenticated(), controller.bulkDestroy);
-router.delete('/:id', auth.isAuthenticated(), controller.destroy);
-router.delete('/:id/agents', auth.isAuthenticated(), controller.removeAgents);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/fax_room/fax_room.controller.js b/server/api/fax_room/fax_room.controller.js
index ab316a3..348e504 100644
--- a/server/api/fax_room/fax_room.controller.js
+++ b/server/api/fax_room/fax_room.controller.js
@@ -1,474 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var util = require('util');
-
-var Util = require('../../config/util');
-var moment = require('moment');
-
-var sequelize = require('../../models').sequelize;
-var User = require('../../models').User;
-var Agent = require('../../models').User;
-var Contact = require('../../models').Contact;
-var FaxRoom = require('../../models').FaxRoom;
-var FaxMessage = require('../../models').FaxMessage;
-var FaxAccount = require('../../models').FaxAccount;
-var FaxApplication = require('../../models').FaxApplication;
-var FaxQueue = require('../../models').FaxQueue;
-var FaxAttachment = require('../../models').FaxAttachment;
-
-// Get list of faxRooms
-exports.index = function(req, res, next) {
-  return FaxRoom
-    .scope('default')
-    .findAndCountAll(Util.getQuery(req.query))
-    .then(function(result) {
-      return res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get list of fields
-exports.describe = function(req, res) {
-  return FaxRoom
-    .describe()
-    .then(function(fields) {
-      return res.status(200).send(fields);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function getFaxQueues(user) {
-  return function() {
-    switch (user.role) {
-      case 'user':
-        return User
-          .findById(user.id, {
-            attributes: ['id']
-          })
-          .then(Util.getFaxQueuesIdByUser({}, {
-            attributes: ['id']
-          }))
-          .then(function(userQueues) {
-            return {
-              include: {
-                model: FaxAccount,
-                include: {
-                  model: FaxApplication,
-                  include: {
-                    model: FaxQueue,
-                    where: {
-                      id: _.map(userQueues, 'id')
-                    }
-                  }
-                }
-              }
-            };
-          });
-      default:
-        return {};
-    }
-  }
-}
-
-exports.pending = function(req, res) {
-  return Promise
-    .all([])
-    .then(getFaxQueues(req.user))
-    .then(function(condition) {
-      return FaxRoom
-        .count(_.merge(Util.getQuery(req.query, {
-          status: 'PENDING',
-          updatedAt: {
-            $gte: moment().startOf('day')
-          }
-        }), condition));
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-exports.new = function(req, res) {
-  return Promise
-    .all([])
-    .then(getFaxQueues(req.user))
-    .then(function(condition) {
-      return FaxRoom
-        .count(_.merge(Util.getQuery(req.query, {
-          status: 'NEW',
-          updatedAt: {
-            $gte: moment().startOf('day')
-          }
-        }), condition));
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-exports.open = function(req, res) {
-  return Promise
-    .all([])
-    .then(getFaxQueues(req.user))
-    .then(function(condition) {
-      return FaxRoom
-        .count(_.merge(Util.getQuery(req.query, {
-          status: 'OPEN',
-          updatedAt: {
-            $gte: moment().startOf('day')
-          }
-        }), condition));
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-exports.closed = function(req, res) {
-  return Promise
-    .all([])
-    .then(getFaxQueues(req.user))
-    .then(function(condition) {
-      return FaxRoom
-        .count(_.merge(Util.getQuery(req.query, {
-          status: 'CLOSED',
-          updatedAt: {
-            $gte: moment().startOf('day')
-          }
-        }), condition));
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-exports.inbox = function(req, res, next) {
-  switch (req.user.role) {
-    case 'agent':
-
-      return sequelize.query(
-          'SELECT `FaxRoom`.`id`, `FaxRoom`.`from`, `FaxRoom`.`account`, `FaxRoom`.`status`, `FaxRoom`.`lastEvent`, `FaxRoom`.`updatedAt` FROM `fax_rooms` AS `FaxRoom` LEFT OUTER JOIN (`user_has_fax_rooms` AS `Users.user_has_fax_rooms` INNER JOIN `users` AS `Users` ON `Users`.`id` = `Users.user_has_fax_rooms`.`UserId`) ON `FaxRoom`.`id` = `Users.user_has_fax_rooms`.`FaxRoomId` WHERE (`FaxRoom`.`deletedAt` IS NULL AND (`FaxRoom`.`status` = :status OR `Users`.`id` = :id))', {
-            replacements: {
-              status: 'UNMANAGED',
-              id: req.user.id
-            },
-            type: sequelize.QueryTypes.SELECT
-          })
-        .then(function(result) {
-          return res.status(200).send(result);
-        })
-        .catch(function(err) {
-          console.error(err);
-          return handleError(res, err);
-        });
-
-    default:
-
-      return sequelize.query(
-          'SELECT `id`, `from`, `account`, `status`, `lastEvent` ,`updatedAt` FROM `fax_rooms` WHERE `fax_rooms`.`deletedAt` IS NULL', {
-            replacements: {
-              status: 'UNMANAGED',
-              id: req.user.id
-            },
-            type: sequelize.QueryTypes.SELECT
-          })
-        .then(function(result) {
-          return res.status(200).send(result);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-  }
-};
-
-// Get list of agent faxRooms
-exports.agentIndex = function(req, res, next) {
-  return FaxRoom
-    .findAll({
-      where: {
-        UserId: req.params.id
-      },
-      include: [{
-        all: true
-      }]
-    })
-    .then(function(faxRooms) {
-      return res.status(200).send(faxRooms);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get list of agent faxRooms
-exports.openRoom = function(req, res, next) {
-  var _faxRoom;
-
-  if (req.user.role === 'agent') {
-    return FaxRoom
-      .findById(req.params.id)
-      .then(function(faxRoom) {
-        _faxRoom = faxRoom;
-        if (!_faxRoom) {
-          return res.sendStatus(404);
-        }
-
-        return _faxRoom
-          .update({
-            status: 'OPEN'
-          }, {
-            userId: req.user.id
-          });
-      })
-      .then(function() {
-        return _faxRoom
-          .addUser(req.user.id);
-      })
-      .then(function() {
-        return res.sendStatus(200);
-      })
-      .catch(function(err) {
-        return handleError(res, err);
-      });
-  }
-};
-
-// Get a single faxRoom
-exports.show = function(req, res, next) {
-  return FaxRoom
-    .scope('default')
-    .findById(req.params.id)
-    .then(function(faxRoom) {
-      if (!faxRoom) {
-        return res.sendStatus(404);
-      }
-      return res.send(faxRoom);
-    })
-    .catch(function(err) {
-      console.error(err);
-      return handleError(res, err);
-    });
-};
-
-// Get a single faxRoom
-exports.showAgents = function(req, res, next) {
-  return FaxRoom
-    .findById(req.params.id)
-    .then(function(faxRoom) {
-      if (!faxRoom) {
-        return res.sendStatus(404);
-      }
-
-      return faxRoom
-        .getUsers({
-          attributes: ['id', 'name', 'fullname', 'email', 'role', 'internal']
-        });
-    })
-    .then(function(users) {
-      return res.send(users);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new faxRoom in the DB.
-exports.create = function(req, res, next) {
-  return FaxRoom
-    .create(req.body)
-    .then(function(faxRoom) {
-      return res.status(201).send(faxRoom);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new mailMessage in the DB.
-exports.createMessage = function(req, res, next) {
-  req.body.UserId = req.user.id;
-  req.body.FaxRoomId = req.params.id;
-  req.body.text = req.body.text;
-
-  return FaxMessage
-    .create(req.body, {
-      include: [{
-        model: FaxAttachment
-      }],
-      user: req.user
-    }).then(function(faxMessage) {
-      return res.status(201).send(faxMessage);
-    }).catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing faxRoom in the DB.
-exports.update = function(req, res, next) {
-  return FaxRoom
-    .findById(req.params.id)
-    .then(function(faxRoom) {
-      if (!faxRoom) {
-        return res.sendStatus(404);
-      }
-      // CHECK IF FAX IS ALREADY ASSIGNED
-      if (faxRoom.jobId) {
-        throw new Error('Fax already assigned');
-      }
-      var updated = _.merge(faxRoom, req.body);
-
-      return updated
-        .save();
-    })
-    .then(function(faxRoom) {
-      return res.status(200).send(faxRoom);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single faxRoom
-exports.updateAgents = function(req, res, next) {
-  return FaxRoom
-    .findById(req.params.id)
-    .then(function(faxRoom) {
-      if (!faxRoom) {
-        return res.sendStatus(404);
-      }
-
-      return faxRoom
-        .setUsers(req.body.agents, {
-          individualHooks: true
-        });
-    })
-    .then(function() {
-      return res.sendStatus(200);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a faxRoom from the DB.
-exports.destroy = function(req, res, next) {
-  return FaxRoom
-    .findById(req.params.id)
-    .then(function(faxRoom) {
-      if (!faxRoom) {
-        return res.sendStatus(404);
-      }
-      return faxRoom.destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a agent from the DB.
-exports.bulkDestroy = function(req, res) {
-  return FaxRoom
-    .destroy({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return res.sendStatus(200);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
-
-exports.updatePatch = function(req, res, next) {
-  var _options = {
-    where: {
-      id: req.params.id.split(',')
-    },
-    user: req.user,
-    individualHooks: true
-  };
-
-  return FaxRoom
-    .update(req.body, _options)
-    .then(function(mailRooms) {
-      if (!mailRooms) {
-        return res.sendStatus(404);
-      }
-      return mailRooms
-    })
-    .then(function(mailRooms) {
-      return res.sendStatus(200);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.getRoomByMessage = function(req, res, next) {
-  return FaxMessage
-    .findById(req.params.id)
-    .then(function(faxMessage) {
-      return faxMessage
-        .getFaxRoom({
-          include: [{
-            model: FaxAccount
-          }, {
-            model: FaxMessage,
-            include: [{
-              model: FaxAttachment
-            }, {
-              model: User,
-              attributes: ['id', 'name', 'fullname', 'email']
-            }]
-          }, {
-            model: User,
-            attributes: ['id', 'name', 'fullname', 'email']
-          }]
-        });
-    })
-    .then(function(faxRoom) {
-      return res.send(faxRoom);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
\ No newline at end of file
diff --git a/server/api/fax_room/fax_room.events.js b/server/api/fax_room/fax_room.events.js
index 0ed0d8a..1141481 100644
--- a/server/api/fax_room/fax_room.events.js
+++ b/server/api/fax_room/fax_room.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const FaxRoom = require('../../models').FaxRoom;
-
-var FaxRoomEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-FaxRoomEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  FaxRoom.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    FaxRoomEvents.emit(event + ':' + doc._id, doc);
-    FaxRoomEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = FaxRoomEvents;
\ No newline at end of file
diff --git a/server/api/fax_room/fax_room.socket.js b/server/api/fax_room/fax_room.socket.js
index 80b8f06..cdb88d4 100644
--- a/server/api/fax_room/fax_room.socket.js
+++ b/server/api/fax_room/fax_room.socket.js
@@ -1,69 +1 @@
-// /**
-//  * Broadcast updates to client when the model changes
-//  */
-//
-// 'use strict';
-//
-// var FaxRoom = require('../../models').FaxRoom;
-//
-// exports.register = function(socket) {
-//   FaxRoom.afterCreate(function(doc, options) {
-//     if (socket.role !== 'agent') {
-//       // ADMIN OR USER
-//       onSave(socket, doc.dataValues);
-//     } else {
-//       // AGENT
-//       switch (doc.status) {
-//         case 'OPEN':
-//           if (socket.userId == options.userId)
-//             onSave(socket, doc.dataValues);
-//           break;
-//
-//         default:
-//       }
-//     }
-//   });
-//   FaxRoom.afterUpdate(function(doc, options) {
-//     onSave(socket, doc.dataValues);
-//   });
-//   FaxRoom.afterDestroy(function(doc) {
-//     onRemove(socket, doc);
-//   });
-// }
-//
-// function onSave(socket, doc, cb) {
-//   socket.emit('fax_room:save', doc);
-// }
-//
-// function onRemove(socket, doc, cb) {
-//   socket.emit('fax_room:remove', doc);
-// }
-
-'use strict';
-
-const FaxRoomEvents = require('./fax_room.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('fax_room:' + event, socket);
-
-    FaxRoomEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc, options) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    FaxRoomEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/fax_room/index.js b/server/api/fax_room/index.js
index e2652dd..615fffe 100644
--- a/server/api/fax_room/index.js
+++ b/server/api/fax_room/index.js
@@ -1,31 +1 @@
-'use strict';
-
-var express = require('express');
-
-var controller = require('./fax_room.controller');
-var auth = require('../../auth/auth.service');
-var license = require('../../config/license/license.service');
-
-var router = express.Router();
-
-router.get('/', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.index);
-router.get('/inbox', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin', 'agent']), controller.inbox);
-router.get('/describe', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.describe);
-router.get('/pending', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10, 17], ['admin']), controller.pending);
-router.get('/new', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10, 17], ['admin']), controller.new);
-router.get('/open', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10, 17], ['admin']), controller.open);
-router.get('/closed', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10, 17], ['admin']), controller.closed);
-router.get('/agent/:id', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.agentIndex);
-router.get('/messages/:id', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin', 'agent']), controller.getRoomByMessage);
-router.get('/:id', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin', 'user', 'agent']), controller.show);
-router.get('/:id/agents', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin', 'agent']), controller.showAgents);
-router.post('/', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.create);
-router.post('/:id/messages', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin', 'user', 'agent']), controller.createMessage);
-router.put('/:id', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin', 'agent']), controller.update);
-router.patch('/:id', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin', 'agent']), controller.updatePatch);
-router.put('/:id/agents', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin', 'agent']), controller.updateAgents);
-router.put('/:id/open', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['agent']), controller.openRoom);
-router.delete('/', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.bulkDestroy);
-router.delete('/:id', license.isValidDate(), license.hasFax(), auth.isAuthenticated(), auth.hasModule([10], ['admin']), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/freshdesk_account/freshdesk_account.controller.js b/server/api/freshdesk_account/freshdesk_account.controller.js
index ae9ab8a..d3541cb 100644
--- a/server/api/freshdesk_account/freshdesk_account.controller.js
+++ b/server/api/freshdesk_account/freshdesk_account.controller.js
@@ -1,239 +1 @@
-/**
- * Using Rails-like standard naming convention for endpoints.
- * GET     /api/freshdesk/accounts              ->  index
- * POST    /api/freshdesk/accounts              ->  create
- * GET     /api/freshdesk/accounts/:id          ->  show
- * PUT     /api/freshdesk/accounts/:id          ->  update
- * DELETE  /api/freshdesk/accounts/:id          ->  destroy
- */
-
-'use strict';
-
-
-var _ = require('lodash');
-var util = require('util');
-var _fd = require('freshdesk');
-
-var FreshdeskAccount = require('../../models').FreshdeskAccount;
-
-
-function handleError(res, statusCode) {
-  statusCode = statusCode || 500;
-  return function(err) {
-    res.status(statusCode).send(err);
-  };
-}
-
-function responseWithResult(res, statusCode) {
-  statusCode = statusCode || 200;
-  return function(entity) {
-    if (entity) {
-      res.status(statusCode).json(entity);
-    }
-  };
-}
-
-function handleEntityNotFound(res) {
-  return function(entity) {
-    if (!entity) {
-      res.status(404).end();
-      return null;
-    }
-    return entity;
-  };
-}
-
-function saveUpdates(updates) {
-  return function(entity) {
-    return entity.updateAttributes(updates)
-      .then(function(updated) {
-        return updated;
-      });
-  };
-}
-
-function removeEntity(res) {
-  return function(entity) {
-    if (entity) {
-      return entity.destroy()
-        .then(function() {
-          res.status(204).end();
-        });
-    }
-  };
-}
-
-// Gets a list of FreshdeskAccounts
-exports.index = function(req, res) {
-  var attributes = ['description', 'name', 'username', 'remoteUri'];
-  var per_page = req.query.per_page ? parseInt(req.query.per_page, 10) : 100;
-  var page = req.query.page ? parseInt(req.query.page, 10) : 0;
-
-  var query = {
-    where: {},
-    limit: per_page,
-    offset: page * per_page
-  };
-
-  _.forIn(req.query, function(value, key) {
-    switch (key) {
-      case 'per_page':
-      case 'page':
-        break;
-      case 'sort_by':
-        query.order = util.format('%s %s', req.query.sort_by, req.query.sort_order || 'ASC') || null;
-        break;
-      case 'sort_order':
-        break;
-      case '$':
-        query.where.$or = [];
-        attributes.forEach(function(attribute) {
-          var tmp = {};
-          tmp[attribute] = {
-            $like: '%' + value + '%'
-          };
-
-          query.where.$or.push(tmp);
-        });
-        break;
-      default:
-        query.where[key] = {
-          $like: {}
-        };
-        query.where[key].$like = '%' + value + '%';
-    }
-  });
-
-  FreshdeskAccount
-    .findAndCountAll(query)
-    .then(function(result) {
-
-      var total_pages = Math.ceil(result.count / per_page);
-      var next_page = total_pages > (query.offset + 1) ? util.format('%s://%s%s?page=%d', req.protocol, req.headers.host, req.baseUrl, page + 1) : null;
-      var previous_page = page > 0 ? util.format('%s://%s%s?page=%d', req.protocol, req.headers.host, req.baseUrl, page - 1) : null;
-
-      return res.status(200).send({
-        count: result.count,
-        rows: result.rows,
-        next_page: next_page,
-        previous_page: previous_page,
-        total_pages: total_pages
-      });
-
-    })
-    .catch(function(err) {
-      return res.status(500).send({
-        error: 'Something blew up!'
-      });
-    });
-}
-
-// Gets a single FreshdeskAccount from the DB
-exports.show = function(req, res) {
-  FreshdeskAccount.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Creates a new FreshdeskAccount in the DB
-exports.create = function(req, res) {
-  FreshdeskAccount.create(req.body)
-    .then(responseWithResult(res, 201))
-    .catch(handleError(res));
-}
-
-// Updates an existing FreshdeskAccount in the DB
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  FreshdeskAccount.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(saveUpdates(req.body))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Deletes a FreshdeskAccount from the DB
-exports.destroy = function(req, res) {
-  FreshdeskAccount.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(removeEntity(res))
-    .catch(handleError(res));
-}
-
-exports.bulkDestroy = function(req, res) {
-  FreshdeskAccount
-    .destroy({
-      where: {
-        id: req.query.id
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.checkAccount = function(req, res) {
-  FreshdeskAccount.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(function(account) {
-      var freshdesk = new _fd(account.remoteUri, account.apiKey);
-      freshdesk.listTickets(function(err, response, body) {
-        if (err) {
-          return res.sendStatus(400);
-        }
-        body = JSON.parse(body);
-        if (body.require_login) {
-          return res.sendStatus(400);
-        }
-        return res.sendStatus(200);
-      })
-    })
-    .catch(handleError(res));
-}
-
-exports.accountValidation = function(req, res) {
-  var where = {};
-  where[req.params.field] = req.body.value;
-  FreshdeskAccount
-    .findAndCountAll({
-      where: where
-    })
-    .then(function(result) {
-      if (result.count) {
-        return res.status(200).send({
-          isValid: false,
-          value: req.body.value
-        });
-      }
-      return res.status(200).send({
-        isValid: true,
-        value: req.body.value
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.getFields = function(req, res, next) {
-  FreshdeskAccount.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(function(account) {
-      var Freshdesk = new _fd(account.remoteUri, account.apiKey);
-      Freshdesk.get('/ticket_fields.json', function(err, response, body) {
-        if (err) {
-          return next(err);
-        }
-        body = JSON.parse(body);
-        return res.status(200).send(body);
-      });
-    })
-    .catch(handleError(res));
-};
\ No newline at end of file
diff --git a/server/api/freshdesk_account/freshdesk_account.events.js b/server/api/freshdesk_account/freshdesk_account.events.js
index 0b71e73..71cb8b4 100644
--- a/server/api/freshdesk_account/freshdesk_account.events.js
+++ b/server/api/freshdesk_account/freshdesk_account.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const FreshdeskAccount = require('../../models').FreshdeskAccount;
-
-var FreshdeskAccountEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-FreshdeskAccountEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  FreshdeskAccount.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    FreshdeskAccountEvents.emit(event + ':' + doc._id, doc);
-    FreshdeskAccountEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = FreshdeskAccountEvents;
\ No newline at end of file
diff --git a/server/api/freshdesk_account/freshdesk_account.socket.js b/server/api/freshdesk_account/freshdesk_account.socket.js
index c41142d..ce88c2e 100644
--- a/server/api/freshdesk_account/freshdesk_account.socket.js
+++ b/server/api/freshdesk_account/freshdesk_account.socket.js
@@ -1,28 +1 @@
-'use strict';
-
-const FreshdeskAccountEvents = require('./freshdesk_account.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('freshdesk_account:' + event, socket);
-
-    FreshdeskAccountEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    FreshdeskAccountEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/freshdesk_account/index.js b/server/api/freshdesk_account/index.js
index a7385b7..9ee9a4d 100644
--- a/server/api/freshdesk_account/index.js
+++ b/server/api/freshdesk_account/index.js
@@ -1,21 +1 @@
-'use strict';
-
-var express = require('express');
-var auth = require('../../auth/auth.service');
-var controller = require('./freshdesk_account.controller');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), controller.index);
-router.get('/:id', auth.isAuthenticated(), controller.show);
-router.get('/:id/fields', auth.isAuthenticated(), controller.getFields);
-router.get('/:id/check', auth.isAuthenticated(), controller.checkAccount);
-router.post('/validate/:field', auth.isAuthenticated(), controller.accountValidation);
-router.post('/', auth.isAuthenticated(), controller.create);
-router.put('/:id', auth.isAuthenticated(), controller.update);
-router.patch('/:id', auth.isAuthenticated(), controller.update);
-router.delete('/', auth.isAuthenticated(), controller.bulkDestroy);
-router.delete('/:id', auth.isAuthenticated(), controller.destroy);
-
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/freshdesk_configuration/freshdesk_configuration.controller.js b/server/api/freshdesk_configuration/freshdesk_configuration.controller.js
index 4c3d44d..575e1eb 100644
--- a/server/api/freshdesk_configuration/freshdesk_configuration.controller.js
+++ b/server/api/freshdesk_configuration/freshdesk_configuration.controller.js
@@ -1,146 +1 @@
-/**
- * Using Rails-like standard naming convention for endpoints.
- * GET     /api/freshdesk/configurations              ->  index
- * POST    /api/freshdesk/configurations              ->  create
- * GET     /api/freshdesk/configurations/:id          ->  show
- * PUT     /api/freshdesk/configurations/:id          ->  update
- * DELETE  /api/freshdesk/configurations/:id          ->  destroy
- */
-
-'use strict';
-
-
-var _ = require('lodash');
-
-var FreshdeskConfiguration = require('../../models').FreshdeskConfiguration;
-var FreshdeskField = require('../../models').FreshdeskField;
-
-function handleError(res, statusCode) {
-  statusCode = statusCode || 500;
-  return function(err) {
-    res.status(statusCode).send(err);
-  };
-}
-
-function responseWithResult(res, statusCode) {
-  statusCode = statusCode || 200;
-  return function(entity) {
-    if (entity) {
-      res.status(statusCode).json(entity);
-    }
-  };
-}
-
-function handleEntityNotFound(res) {
-  return function(entity) {
-    if (!entity) {
-      res.status(404).end();
-      return null;
-    }
-    return entity;
-  };
-}
-
-function saveUpdates(updates) {
-  return function(entity) {
-    return entity.updateAttributes(updates)
-      .then(function(updated) {
-        return updated;
-      });
-  };
-}
-
-function removeEntity(res) {
-  return function(entity) {
-    if (entity) {
-      return entity.destroy()
-        .then(function() {
-          res.status(204).end();
-        });
-    }
-  };
-}
-
-// Gets a list of FreshdeskConfigurations
-exports.index = function(req, res) {
-  FreshdeskConfiguration.findAll({
-      where: req.query
-    })
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Gets a single FreshdeskConfiguration from the DB
-exports.show = function(req, res) {
-  FreshdeskConfiguration.find({
-      where: {
-        id: req.params.id
-      },
-      include: [{
-        model: FreshdeskField,
-        as: 'Subject'
-      }, {
-        model: FreshdeskField,
-        as: 'Description'
-      }, {
-        model: FreshdeskField,
-        as: 'Field'
-      }]
-    })
-    .then(handleEntityNotFound(res))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Creates a new FreshdeskConfiguration in the DB
-exports.create = function(req, res) {
-  FreshdeskConfiguration.create(req.body)
-    .then(responseWithResult(res, 201))
-    .catch(handleError(res));
-}
-
-// Updates an existing FreshdeskConfiguration in the DB
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  FreshdeskConfiguration.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(saveUpdates(req.body))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Deletes a FreshdeskConfiguration from the DB
-exports.destroy = function(req, res) {
-  FreshdeskConfiguration.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(removeEntity(res))
-    .catch(handleError(res));
-}
-
-exports.addConfigurationField = function(req, res, next) {
-  // console.log(req.params);
-  var freshdeskConfiguration;
-  FreshdeskConfiguration
-    .findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(function(salesforce_configuration) {
-      freshdeskConfiguration = salesforce_configuration;
-      return FreshdeskField.create(req.body)
-    })
-    .then(function(freshdeskField) {
-      switch (req.params.type) {
-        case 'subject':
-          return [freshdeskConfiguration.addSubject(freshdeskField), freshdeskField];
-        case 'description':
-          return [freshdeskConfiguration.addDescription(freshdeskField), freshdeskField];
-        case 'field':
-          return [freshdeskConfiguration.addField(freshdeskField), freshdeskField];
-      }
-    })
-    .spread(function(data, freshdeskField) {
-      return res.status(201).json(freshdeskField);
-    })
-    .catch(handleError(res));
-};
\ No newline at end of file
diff --git a/server/api/freshdesk_configuration/freshdesk_configuration.events.js b/server/api/freshdesk_configuration/freshdesk_configuration.events.js
index f36d5f5..6a6f47e 100644
--- a/server/api/freshdesk_configuration/freshdesk_configuration.events.js
+++ b/server/api/freshdesk_configuration/freshdesk_configuration.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const FreshdeskConfiguration = require('../../models').FreshdeskConfiguration;
-
-var FreshdeskConfigurationEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-FreshdeskConfigurationEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  FreshdeskConfiguration.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    FreshdeskConfigurationEvents.emit(event + ':' + doc._id, doc);
-    FreshdeskConfigurationEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = FreshdeskConfigurationEvents;
\ No newline at end of file
diff --git a/server/api/freshdesk_configuration/freshdesk_configuration.socket.js b/server/api/freshdesk_configuration/freshdesk_configuration.socket.js
index 9c77498..b4d7382 100644
--- a/server/api/freshdesk_configuration/freshdesk_configuration.socket.js
+++ b/server/api/freshdesk_configuration/freshdesk_configuration.socket.js
@@ -1,28 +1 @@
-'use strict';
-
-const FreshdeskConfigurationEvents = require('./freshdesk_configuration.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('freshdesk_configuration:' + event, socket);
-
-    FreshdeskConfigurationEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    FreshdeskConfigurationEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/freshdesk_configuration/index.js b/server/api/freshdesk_configuration/index.js
index e08945f..051f9ea 100644
--- a/server/api/freshdesk_configuration/index.js
+++ b/server/api/freshdesk_configuration/index.js
@@ -1,19 +1 @@
-'use strict';
-
-var express = require('express');
-var auth = require('../../auth/auth.service');
-var controller = require('./freshdesk_configuration.controller');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), controller.index);
-
-router.get('/:id', auth.isAuthenticated(), controller.show);
-router.post('/', auth.isAuthenticated(), controller.create);
-router.put('/:id', auth.isAuthenticated(), controller.update);
-router.post('/:id/:type', auth.isAuthenticated(), controller.addConfigurationField);
-router.patch('/:id', auth.isAuthenticated(), controller.update);
-router.delete('/:id', auth.isAuthenticated(), controller.destroy);
-
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/freshdesk_field/freshdesk_field.controller.js b/server/api/freshdesk_field/freshdesk_field.controller.js
index 4a35db8..6d695f8 100644
--- a/server/api/freshdesk_field/freshdesk_field.controller.js
+++ b/server/api/freshdesk_field/freshdesk_field.controller.js
@@ -1,104 +1 @@
-/**
- * Using Rails-like standard naming convention for endpoints.
- * GET     /api/freshdesk/fields              ->  index
- * POST    /api/freshdesk/fields              ->  create
- * GET     /api/freshdesk/fields/:id          ->  show
- * PUT     /api/freshdesk/fields/:id          ->  update
- * DELETE  /api/freshdesk/fields/:id          ->  destroy
- */
-
-'use strict';
-
-
-var _ = require('lodash');
-
-var FreshdeskField = require('../../models').FreshdeskField;
-
-
-function handleError(res, statusCode) {
-  statusCode = statusCode || 500;
-  return function(err) {
-    res.status(statusCode).send(err);
-  };
-}
-
-function responseWithResult(res, statusCode) {
-  statusCode = statusCode || 200;
-  return function(entity) {
-    if (entity) {
-      res.status(statusCode).json(entity);
-    }
-  };
-}
-
-function handleEntityNotFound(res) {
-  return function(entity) {
-    if (!entity) {
-      res.status(404).end();
-      return null;
-    }
-    return entity;
-  };
-}
-
-function saveUpdates(updates) {
-  return function(entity) {
-    return entity.updateAttributes(updates)
-      .then(function(updated) {
-        return updated;
-      });
-  };
-}
-
-function removeEntity(res) {
-  return function(entity) {
-    if (entity) {
-      return entity.destroy()
-        .then(function() {
-          res.status(204).end();
-        });
-    }
-  };
-}
-
-// Gets a list of FreshdeskFields
-exports.index = function(req, res) {
-  FreshdeskField.findAll()
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Gets a single FreshdeskField from the DB
-exports.show = function(req, res) {
-  FreshdeskField.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Creates a new FreshdeskField in the DB
-exports.create = function(req, res) {
-  FreshdeskField.create(req.body)
-    .then(responseWithResult(res, 201))
-    .catch(handleError(res));
-}
-
-// Updates an existing FreshdeskField in the DB
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  FreshdeskField.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(saveUpdates(req.body))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Deletes a FreshdeskField from the DB
-exports.destroy = function(req, res) {
-  FreshdeskField.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(removeEntity(res))
-    .catch(handleError(res));
-}
\ No newline at end of file
diff --git a/server/api/freshdesk_field/freshdesk_field.events.js b/server/api/freshdesk_field/freshdesk_field.events.js
index dcadf5c..83826a6 100644
--- a/server/api/freshdesk_field/freshdesk_field.events.js
+++ b/server/api/freshdesk_field/freshdesk_field.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const FreshdeskField = require('../../models').FreshdeskField;
-
-var FreshdeskFieldEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-FreshdeskFieldEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  FreshdeskField.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    FreshdeskFieldEvents.emit(event + ':' + doc._id, doc);
-    FreshdeskFieldEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = FreshdeskFieldEvents;
\ No newline at end of file
diff --git a/server/api/freshdesk_field/freshdesk_field.socket.js b/server/api/freshdesk_field/freshdesk_field.socket.js
index 41eae7a..756dccf 100644
--- a/server/api/freshdesk_field/freshdesk_field.socket.js
+++ b/server/api/freshdesk_field/freshdesk_field.socket.js
@@ -1,28 +1 @@
-'use strict';
-
-const FreshdeskFieldEvents = require('./freshdesk_field.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('freshdesk_field:' + event, socket);
-
-    FreshdeskFieldEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    FreshdeskFieldEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/freshdesk_field/index.js b/server/api/freshdesk_field/index.js
index d17268f..8f14aa9 100644
--- a/server/api/freshdesk_field/index.js
+++ b/server/api/freshdesk_field/index.js
@@ -1,18 +1 @@
-'use strict';
-
-var express = require('express');
-var auth = require('../../auth/auth.service');
-var controller = require('./freshdesk_field.controller');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), controller.index);
-
-router.get('/:id', auth.isAuthenticated(), controller.show);
-router.post('/', auth.isAuthenticated(), controller.create);
-router.put('/:id', auth.isAuthenticated(), controller.update);
-router.patch('/:id', auth.isAuthenticated(), controller.update);
-router.delete('/:id', auth.isAuthenticated(), controller.destroy);
-
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/integration/index.js b/server/api/integration/index.js
index 74118a8..920ae89 100644
--- a/server/api/integration/index.js
+++ b/server/api/integration/index.js
@@ -1,15 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./integration.controller');
-var auth = require('../../auth/auth.service');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), auth.hasModule([19], ['admin', 'agent']), controller.index);
-router.get('/:id', auth.isAuthenticated(), auth.hasRole('admin'), controller.show);
-router.post('/', auth.isAuthenticated(), auth.hasRole('admin'), controller.create);
-router.put('/:id', auth.isAuthenticated(), auth.hasRole('admin'), controller.update);
-router.delete('/:id', auth.isAuthenticated(), auth.hasRole('admin'), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/integration/integration.controller.js b/server/api/integration/integration.controller.js
index d99521f..1f912ac 100644
--- a/server/api/integration/integration.controller.js
+++ b/server/api/integration/integration.controller.js
@@ -1,168 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var uploadFile = require('upload-file');
-var config = require('../../config/environment');
-var path = require('path');
-var sr = require('simple-random');
-var admZip = require('adm-zip');
-var str2json = require('string-to-json');
-var fs = require('fs');
-var Util = require('../../config/util');
-
-var Integration = require('../../models').Integration;
-
-// Get list of Integration
-exports.index = function(req, res, next) {
-  return Integration
-    .findAndCountAll(Util.getQuery(req.query))
-    .then(function(result) {
-      res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single integration
-exports.show = function(req, res) {
-  return Integration
-    .findById(req.params.id)
-    .then(function(integration) {
-      if (!integration) {
-        return res.sendStatus(404);
-      }
-      return res.send(integration);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new integration in the DB.
-exports.create = function(req, res) {
-  var upload = new uploadFile({
-    dest: path.join(config.root, 'server/files/integrations'),
-    maxFileSize: 5 * 1000000,
-    maxNumberOfFiles: 1,
-    minNumberOfFiles: 1,
-    acceptFileTypes: /(\.|\/)(zip)$/i,
-    messages: {
-      maxNumberOfFiles: "Max number of files upload exceeded",
-      acceptFileTypes: "Only zip format accepted",
-      maxFileSize: "The maximum file size is 5 Mb",
-      invalidRequest: "Invalid request"
-    }
-  });
-
-  upload.on('end', function(fields, files) {
-    var zip = new admZip(files.file.path);
-
-    var manifest = false;
-    var zipEntries = zip.getEntries();
-    zipEntries.forEach(function(zipEntry) {
-      if (zipEntry.name === 'manifest.json') {
-        var str = zipEntry.getData().toString('utf8');
-        console.log('uploadZip', str);
-        try {
-          manifest = JSON.parse(str);
-          console.log('uploadZip', manifest);
-          Integration
-            .create(_.merge(files.file, manifest))
-            .then(function(integration) {
-
-              // Extract All Zip and overwrite old directory
-              zip.extractAllTo(path.join(config.root,
-                'server/files/integrations'), true);
-
-              return res.status(201).send(integration);
-            })
-            .catch(function(err) {
-              return handleError(res, err);
-            });
-        } catch (e) {
-          console.log(e);
-          var err = {
-            errors: [{
-              type: 'json',
-              message: e
-            }]
-          };
-          return handleError(res, err);
-        }
-      }
-    });
-
-    fs.unlinkSync(files.file.path);
-
-    if (!manifest) {
-      var err = {
-        errors: [{
-          type: 'manifest',
-          message: 'manifest.json not found'
-        }]
-      };
-      return handleError(res, err);
-    }
-  });
-
-  upload.on('error', function(e) {
-    var err = {
-      errors: [{
-        type: 'upload',
-        message: e
-      }]
-    };
-    return handleError(res, err);
-  });
-
-  upload.parse(req);
-};
-
-// Updates an existing integration in the DB.
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  return Integration
-    .findById(req.params.id)
-    .then(function(integration) {
-      if (!integration) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(integration, req.body);
-      return updated.save();
-    })
-    .then(function(integration) {
-      return res.status(200).send(integration);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a integration from the DB.
-exports.destroy = function(req, res) {
-  return Integration
-    .find({
-      where: {
-        id: req.params.id
-      }
-    })
-    .then(function(integration) {
-      if (!integration) {
-        return res.sendStatus(404);
-      }
-      return integration.destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/integration/integration.events.js b/server/api/integration/integration.events.js
index 6c9a2bf..8ea1958 100644
--- a/server/api/integration/integration.events.js
+++ b/server/api/integration/integration.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const Integration = require('../../models').Integration;
-
-var IntegrationEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-IntegrationEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  Integration.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    IntegrationEvents.emit(event + ':' + doc._id, doc);
-    IntegrationEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = IntegrationEvents;
\ No newline at end of file
diff --git a/server/api/integration/integration.socket.js b/server/api/integration/integration.socket.js
index 849c2ef..2f379c5 100644
--- a/server/api/integration/integration.socket.js
+++ b/server/api/integration/integration.socket.js
@@ -1,28 +1 @@
-'use strict';
-
-const IntegrationEvents = require('./integration.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('integration:' + event, socket);
-
-    IntegrationEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    IntegrationEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/interval/index.js b/server/api/interval/index.js
index 2fb3ff5..1f3830c 100644
--- a/server/api/interval/index.js
+++ b/server/api/interval/index.js
@@ -1,201 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./interval.controller');
-var auth = require('../../auth/auth.service');
-
-var router = express.Router();
-
-/**
- * @api {get} /api/intervals/ Get intervals' list.
- *
- * @apiParam (Query) {Number} [offset] Pagination offset.
- * @apiParam (Query) {Number} [limit] Pagination limit.
- *
- * @apiVersion 0.0.140
- * @apiName GetIntervals
- * @apiGroup Intervals
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccess {Number} count Number of intervals.
- * @apiSuccess {Object[]} rows Get intervals' list.
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 200 OK
- *     {
- *        "count": 1,
- *        "rows": [{
- *          "id": 1
- *          "name": "I1",
- *          "description": "Interval mon-fri",
- *          "SubIntervals": [{
- *            "name": "SI1"
- *            "interval": "9:00-17:00,mon-fri,*,*"
- *          }]
- *       }]
- *     }
- */
-router.get('/', auth.isAuthenticated(), auth.hasModule([13, 7, 8, 9, 10, 11], ['admin']), controller.index);
-
-/**
- * @api {get} /api/intervals/:id Get interval's details.
- * @apiParam {Number} id Interval's unique ID.
- * @apiVersion 0.0.140
- * @apiName GetInterval
- * @apiGroup Intervals
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccess {Object} Get interval's details.
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 200 OK
- *     {
- *        "id": 1
- *        "name": "I1",
- *        "description": "Interval mon-fri",
- *        "SubIntervals": [{
- *          "name": "SI1"
- *          "interval": "9:00-17:00,mon-fri,*,*"
- *        }]
- *     }
- */
-router.get('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.show);
-
-/**
- * @api {post} /api/intervals/ Create interval.
- *
- * @apiParamExample {json} Request-Example:
- *     {
- *        "name": "I1",
- *        "description": "Interval mon-fri",
- *        "SubIntervals": [{
- *          "name": "SI1"
- *          "interval": "9:00-17:00,mon-fri,*,*"
- *        }]
- *     }
- *
- * @apiParam (Body) {String} name                                        Interval's name.
- * @apiParam (Body) {Object[]} [SubIntervals]                            SubIntervals' array.
- * @apiParam (Body) {String} [description]                               Interval's description.
- *
- * @apiVersion 0.0.140
- * @apiName CreateInterval
- * @apiGroup Intervals
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 201 Created
- *     {
- *        "id": 1
- *        "name": "john.doe",
- *        "email": "[email-masked]",
- *        "internal": 1001,
- *        "fullname": "John Doe",
- *        ...
- *     }
- */
-router.post('/', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.create);
-
-/**
- * @api {put} /api/intervals/:id Update interval.
- *
- * @apiParamExample {json} Request-Example:
- *     {
- *        "name": "I1",
- *        "description": "Interval mon-fri",
- *        "SubIntervals": [{
- *          "name": "SI1"
- *          "interval": "9:00-17:00,mon-fri,*,*"
- *        }]
- *     }
- *
- * @apiParam (Params) {Number} id Interval's unique ID.
- * @apiParam (Body) {String} name                                        Interval's name.
- * @apiParam (Body) {Object[]} [SubIntervals]                            SubIntervals' array.
- * @apiParam (Body) {String} [description]                               Interval's description.
- *
- * @apiVersion 0.0.140
- * @apiName UpdateInterval
- * @apiGroup Intervals
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 200 OK
- *     {
- *        "id": 1
- *        "name": "john.doe",
- *        "email": "[email-masked]",
- *        "internal": 1001,
- *        "fullname": "John Doe",
- *        ...
- *     }
- */
-router.put('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.update);
-
-/**
- * @api {delete} /api/intervals/ Bulk Delete intervals' details.
- *
- * @apiParam (Query) {Number[]} ids Intervals' unique ID array.
- *
- * @apiVersion 0.0.140
- * @apiName BulkDeleteIntervals
- * @apiGroup Intervals
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 204 No Content
- */
-router.delete('/', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.bulkDestroy);
-
-/**
- * @api {delete} /api/intervals/:id Delete interval's details.
- *
- * @apiParam {Number} id Interval's unique ID.
- *
- * @apiVersion 0.0.140
- * @apiName DeleteInterval
- * @apiGroup Intervals
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 204 No Content
- */
-router.delete('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/interval/interval.controller.js b/server/api/interval/interval.controller.js
index 8931ac2..7741abc 100644
--- a/server/api/interval/interval.controller.js
+++ b/server/api/interval/interval.controller.js
@@ -1,195 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var Interval = require('../../models').Interval;
-var VoiceExtension = require('../../models').VoiceExtension;
-var sequelize = require('../../models').sequelize;
-var Promise = require('bluebird');
-
-var Util = require('../../config/util');
-
-// Get list of interval
-exports.index = function(req, res, next) {
-  return Interval
-    .scope('intervals', 'subintervals')
-    .findAndCountAll(_.merge(Util.getQuery(req.query), {
-      distinct: true
-    }))
-    .then(function(result) {
-      res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single interval
-exports.show = function(req, res) {
-  return Interval
-    .scope('subintervals')
-    .findById(req.params.id)
-    .then(function(interval) {
-      if (!interval) {
-        return res.sendStatus(404);
-      }
-      return res.send(interval);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new interval in the DB.
-exports.create = function(req, res) {
-  return Interval
-    .scope('subintervals')
-    .create(req.body)
-    .then(function(interval) {
-      return res.status(201).send(interval);
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing interval in the DB.
-exports.update = function(req, res) {
-  var _interval;
-  return sequelize.transaction(function(t) {
-      if (req.body.id) {
-        delete req.body.id;
-      }
-      return Interval
-        .scope('subintervals')
-        .findById(req.params.id)
-        .then(function(interval) {
-          if (!interval) {
-            return res.sendStatus(404);
-          }
-          _interval = _.clone(interval);
-          return interval
-            .updateAttributes(req.body, {
-              transaction: t
-            });
-        })
-        .then(function() {
-          if (req.body.SubIntervals && !req.body.SubIntervals.length) { //if I pass an empty subintervals object it means I want to delete all the sub-intervals
-            return Interval
-              .destroy({
-                where: {
-                  IntervalId: req.params.id
-                },
-                transaction: t
-              });
-          } else if (req.body.SubIntervals && req.body.SubIntervals.length) { //otherwise i update, add or delete sub-intervals depending on the object content
-            return bulkCreateSubIntervals(req.body.SubIntervals, _interval, t)
-          }
-        })
-    })
-    .then(function() {
-      return res.sendStatus(200);
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-function bulkCreateSubIntervals(subIntervals, _interval, t) {
-  return Promise
-    .all([])
-    .then(function() {
-      var bulkSubInts = [];
-      var oldSubIntervals = _.map(_interval.SubIntervals, 'dataValues');
-      var newInterval;
-      _.forEach(oldSubIntervals, function(element, index) {
-        newInterval = _.find(subIntervals, {
-          id: element.id
-        });
-        if (newInterval) {
-          newInterval.IntervalId = _interval.id;
-          bulkSubInts.push(Interval.update(_.clone(newInterval), {
-            where: {
-              id: element.id
-            },
-            transaction: t,
-            individualHooks: true
-          }));
-          _.remove(subIntervals, {
-            id: element.id
-          });
-        } else {
-          bulkSubInts.push(Interval
-            .destroy({
-              where: {
-                id: element.id
-              },
-              transaction: t
-            }));
-        }
-      });
-      _.forEach(subIntervals, function(element) {
-        element.IntervalId = _interval.id;
-        bulkSubInts.push(Interval.create(element, {
-          transaction: t
-        }));
-      });
-      return bulkSubInts;
-    })
-    .all();
-}
-
-// Deletes a interval from the DB.
-exports.destroy = function(req, res) {
-  return sequelize.transaction(function(t) {
-      return Interval
-        .destroy({
-          where: {
-            id: req.params.id
-          },
-          individualHooks: true,
-          transaction: t
-        });
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(sequelize.ForeignKeyConstraintError, function(err) {
-      err.message = 'The Interval is associated with one or more routes, delete them first';
-      err.translatedMessage = 'MESSAGE_INTERVAL_ROUTE_ASSOCIATED'
-      return handleError(res, err);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes multiple intervals from the DB.
-exports.bulkDestroy = function(req, res) {
-  return sequelize.transaction(function(t) {
-      return Interval
-        .destroy({
-          where: {
-            id: req.query.ids
-          },
-          individualHooks: true,
-          transaction: t
-        });
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(sequelize.ForeignKeyConstraintError, function(err) {
-      err.message = 'The Interval is associated with one or more routes, delete them first';
-      err.translatedMessage = 'MESSAGE_INTERVAL_ROUTE_ASSOCIATED'
-      return handleError(res, err);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/interval/interval.events.js b/server/api/interval/interval.events.js
index cd38713..a9970e4 100644
--- a/server/api/interval/interval.events.js
+++ b/server/api/interval/interval.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const Interval = require('../../models').Interval;
-
-var IntervalEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-IntervalEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  Interval.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    IntervalEvents.emit(event + ':' + doc._id, doc);
-    IntervalEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = IntervalEvents;
\ No newline at end of file
diff --git a/server/api/interval/interval.socket.js b/server/api/interval/interval.socket.js
index 8d62dce..12c8682 100644
--- a/server/api/interval/interval.socket.js
+++ b/server/api/interval/interval.socket.js
@@ -1,28 +1 @@
-'use strict';
-
-const IntervalEvents = require('./interval.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('interval:' + event, socket);
-
-    IntervalEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    IntervalEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/jscripty_project/index.js b/server/api/jscripty_project/index.js
index dba0e5b..05a9827 100644
--- a/server/api/jscripty_project/index.js
+++ b/server/api/jscripty_project/index.js
@@ -1,33 +1 @@
-'use strict';
-
-var express = require('express');
-var auth = require('../../auth/auth.service');
-var controller = require('./jscripty_project.controller');
-var license = require('../../config/license/license.service');
-
-var router = express.Router();
-
-
-router.get('/', license.isValidDate(), license.hasJscripty(), auth.isAuthenticated(), auth.hasModule([15], ['admin', 'agent']), controller.index);
-router.get('/:id', license.isValidDate(), license.hasJscripty(), auth.isAuthenticated(), auth.hasModule([15], ['admin']), controller.show);
-router.get('/:id/download', license.isValidDate(), license.hasJscripty(), auth.isAuthenticated(), auth.hasModule([15], ['admin', 'agent']), controller.download);
-router.get('/:id/sessions', license.isValidDate(), license.hasJscripty(), auth.isAuthenticated(), auth.hasModule([15], ['admin']), controller.showSessions);
-router.get('/:id/sessions/:sessionId', license.isValidDate(), license.hasJscripty(), auth.isAuthenticated(), auth.hasModule([15], ['admin']), controller.showSession);
-router.get('/:id/questions/:questionId/detail', license.isValidDate(), license.hasJscripty(), auth.isAuthenticated(), auth.hasModule([15], ['admin']), controller.showQuestionDetail);
-router.get('/:id/questions', license.isValidDate(), license.hasJscripty(), auth.isAuthenticated(), auth.hasModule([15], ['admin']), controller.showQuestions);
-router.get('/:id/questions/summary', license.isValidDate(), license.hasJscripty(), auth.isAuthenticated(), auth.hasModule([15], ['admin']), controller.showSummary);
-router.get('/:id/inputs', license.isValidDate(), license.hasJscripty(), auth.isAuthenticated(), auth.hasModule([15], ['admin']), controller.showInputs);
-// router.get('/:id/questions/:questionId/otherOption', license.isValidDate(), license.hasJscripty(), auth.isAuthenticated(), auth.hasModule([15], ['admin']), controller.showOther);
-router.get('/:id/questions/detail', license.isValidDate(), license.hasJscripty(), auth.isAuthenticated(), auth.hasModule([15], ['admin']), controller.showDetail);
-router.post('/', license.isValidDate(), license.hasJscripty(), auth.isAuthenticated(), auth.hasModule([15], ['admin']), controller.create);
-router.post('/:id/sessions', license.isValidDate(), license.hasJscripty(), auth.isAuthenticated(), auth.hasModule([15], ['admin', 'agent']), controller.createSession);
-router.post('/:id/sessions/:sessionId/questions', license.isValidDate(), license.hasJscripty(), auth.isAuthenticated(), auth.hasModule([15], ['admin', 'agent']), controller.createQuestions);
-router.put('/:id', license.isValidDate(), license.hasJscripty(), auth.isAuthenticated(), auth.hasModule([15], ['admin']), controller.update);
-router.put('/:id/sessions/:sessionId', license.isValidDate(), license.hasJscripty(), auth.isAuthenticated(), auth.hasModule([15], ['admin', 'agent']), controller.updateSession);
-router.delete('/:id/sessions/:sessionId', license.isValidDate(), license.hasJscripty(), auth.isAuthenticated(), auth.hasModule([15], ['admin']), controller.destroySession);
-router.delete('/', license.isValidDate(), license.hasJscripty(), auth.isAuthenticated(), auth.hasModule([15], ['admin']), controller.bulkDestroy);
-router.delete('/:id', license.isValidDate(), license.hasJscripty(), auth.isAuthenticated(), auth.hasModule([15], ['admin']), controller.destroy);
-
-
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/jscripty_project/jscripty_project.controller.js b/server/api/jscripty_project/jscripty_project.controller.js
index 662f2f9..3991cc1 100644
--- a/server/api/jscripty_project/jscripty_project.controller.js
+++ b/server/api/jscripty_project/jscripty_project.controller.js
@@ -1,1026 +1 @@
-/**
- * Using Rails-like standard naming convention for endpoints.
- * GET     /api/jscripty/projects              ->  index
- * POST    /api/jscripty/projects              ->  create
- * GET     /api/jscripty/projects/:id          ->  show
- * PUT     /api/jscripty/projects/:id          ->  update
- * DELETE  /api/jscripty/projects/:id          ->  destroy
- */
-
-'use strict';
-var xml = require('xml2js');
-
-var _ = require('lodash');
-
-var JscriptyProject = require('../../models').JscriptyProject;
-var Util = require('../../config/util');
-var sequelize = require('../../models').sequelize;
-var ReportJscriptySession = require('../../models').ReportJscriptySession;
-var ReportJscriptyQuestion = require('../../models').ReportJscriptyQuestion;
-var ReportJscriptyInput = require('../../models').ReportJscriptyInput;
-var Promise = require('bluebird');
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
-
-
-
-function responseWithResult(res, statusCode) {
-  statusCode = statusCode || 200;
-  return function(entity) {
-    if (entity) {
-      res.status(statusCode).json(entity);
-    }
-  };
-}
-
-function handleEntityNotFound(res) {
-  return function(entity) {
-    if (!entity) {
-      res.status(404).end();
-      return null;
-    }
-    return entity;
-  };
-}
-
-function saveUpdates(updates) {
-  return function(entity) {
-    return entity.updateAttributes(updates)
-      .then(function(updated) {
-        return updated;
-      });
-  };
-}
-
-function removeEntity(res) {
-  return function(entity) {
-    if (entity) {
-      return entity.destroy()
-        .then(function() {
-          res.status(204).end();
-        });
-    }
-  };
-}
-
-// Gets a list of JscriptyProjects
-
-exports.index = function(req, res, next) {
-  return JscriptyProject
-    .findAndCountAll(Util.getQuery(req.query))
-    .then(function(result) {
-      res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.show = function(req, res) {
-  return JscriptyProject
-    .findById(req.params.id)
-    .then(function(jscripty_project) {
-      if (!jscripty_project) {
-        return res.sendStatus(404);
-      }
-      return res.send(jscripty_project);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-// Gets a all ReportJscriptySession from the DB
-exports.showSessions = function(req, res) {
-    return ReportJscriptySession
-      .scope({
-        method: ['sessions', req.params.id]
-      })
-      .findAndCountAll(Util.getQuery(req.query))
-      .then(handleEntityNotFound(res))
-      .then(responseWithResult(res))
-      .catch(function(err) {
-        console.log(err);
-        return handleError(res, err);
-      });
-  }
-  // Gets a one ReportJscriptySession from the DB
-exports.showSession = function(req, res) {
-    return ReportJscriptySession
-      .find({
-        where: {
-          projectId: req.params.id,
-          session_id: req.params.sessionId
-        },
-        include: [{
-          model: ReportJscriptyQuestion,
-          include: [{
-            model: ReportJscriptyInput
-          }]
-        }]
-
-      })
-      .then(handleEntityNotFound(res))
-      .then(responseWithResult(res))
-      .catch(function(err) {
-        console.log(err);
-        return handleError(res, err);
-      });
-  }
-  // exports.showOther = function(req, res) {
-  //   return ReportJscriptyQuestion
-  //     .scope({
-  //       method: ['otherOption', req.params.id, req.params.questionId]
-  //     })
-  //     .findAndCountAll(Util.getQuery(req.query))
-  //     .then(handleEntityNotFound(res))
-  //     .then(responseWithResult(res))
-  //     .catch(function(err) {
-  //       console.log(err);
-  //       return handleError(res, err);
-  //     });
-  // }
-exports.showInputs = function(req, res) {
-  var inputs = {
-    count: 0,
-    rows: []
-  };
-  return ReportJscriptySession
-    .scope({
-      method: ['inputs', req.params.id]
-    })
-    .findAndCountAll(Util.getQuery(req.query))
-    .then(function(response) {
-      _.forEach(response.rows, function(session) {
-        var session_id = session.session_id;
-        _.forEach(session.ReportJscriptyQuestions, function(question) {
-          var question_id = question.question_id;
-          var question_type = question.question_type;
-          var question_label = question.question_label;
-          var question_text = question.question_text;
-          _.forEach(question.ReportJscriptyInputs, function(input) {
-            inputs.rows.push({
-              session_id: session_id,
-              question_type: question_type,
-              question_id: question_id,
-              question_label: question_label,
-              question_text: question_text,
-              input_label: input.input_label,
-              input_value: input.input_value
-            })
-          })
-        })
-      })
-      inputs.count = inputs.rows.length;
-      return inputs;
-    })
-    .then(handleEntityNotFound(res))
-    .then(responseWithResult(res))
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-}
-
-// Gets a all ReportJscriptyQuestion from the DB
-exports.showQuestions = function(req, res) {
-  return ReportJscriptyQuestion
-    .findAll({
-      where: {
-        projectId: req.params.id
-      },
-      include: [{
-        model: ReportJscriptyInput
-      }],
-
-    })
-    .then(function(jscripty_questions) {
-      if (!jscripty_questions) {
-        return res.sendStatus(404);
-      }
-      return res.status(200).send(jscripty_questions);
-    })
-    .then(handleEntityNotFound(res))
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-}
-
-
-// Gets summary of ReportJscriptyQuestion from the DB
-
-exports.showSummary = function(req, res) {
-  return ReportJscriptyQuestion
-    .scope({
-      method: ['summary', req.params.id]
-    })
-    .findAndCountAll(Util.getQuery(req.query))
-    .then(handleEntityNotFound(res))
-    .then(function(jscripty_summary) {
-      return res.status(200).send(jscripty_summary);
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-
-}
-
-exports.showQuestionDetail = function(req, res) {
-  var temp = {};
-  var jscripty_questions;
-  var total = 0;
-  return ReportJscriptyQuestion
-    .find({
-      where: {
-        projectId: req.params.id,
-        question_id: req.params.questionId
-      },
-      attributes: ['question_type']
-    })
-    .then(function(jscripty_question) {
-      if (!jscripty_question) {
-        return res.sendStatus(404);
-      }
-      // jscripty_questions = jscripty_question;
-      if (jscripty_question.dataValues.question_type == 'input') {
-        return ReportJscriptyQuestion
-          .findAll({
-            where: {
-              projectId: req.params.id,
-              question_id: req.params.questionId
-            },
-            attributes: ['question_type', 'question_id', 'question_label', 'question_text'],
-            include: [{
-              model: ReportJscriptyInput,
-              where: {
-                $or: [{
-                  input_type: 'checkbox',
-                  input_value: '1'
-                }, {
-                  input_type: {
-                    $ne: 'checkbox'
-                  },
-                  input_value: {
-                    $ne: null
-                  }
-                }]
-              },
-              attributes: ['input_label', 'input_value', 'input_type', [sequelize.fn('count', sequelize.col('input_label')),
-                'count'
-              ]]
-            }],
-            group: ['question_id', 'input_label']
-
-          })
-          .then(function(jscripty_question) {
-            jscripty_questions = jscripty_question;
-            return ReportJscriptyQuestion
-              .findAll({
-                where: {
-                  projectId: req.params.id,
-                  question_id: req.params.questionId,
-                  question_type: 'input'
-                },
-                attributes: ['question_id', [sequelize.fn('count', sequelize.col('question_id')),
-                  'count'
-                ]],
-                group: ['question_id']
-              })
-          })
-
-        .then(function(question_count) {
-            total = question_count[0].dataValues.count;
-
-            if (jscripty_questions) {
-              var grouped = _.groupBy(jscripty_questions, 'question_id');
-              _.forEach(grouped, function(value, id) {
-                var answers_count = [];
-                var graphData = [];
-                var graphLabels = [];
-                var graphType = 'bar';
-                _.forEach(value, function(element) {
-                  if (element.ReportJscriptyInputs) {
-                    _.forEach(element.ReportJscriptyInputs, function(input) {
-                      answers_count.push({
-                        checkbox: true,
-                        value: input.input_label,
-                        count: input.dataValues.count
-                      })
-
-                    })
-                  }
-                });
-                var tempGraphdata = [];
-                for (var i = 0; i < answers_count.length; i++) {
-                  tempGraphdata[i] = answers_count[i].count;
-                  graphLabels[i] = answers_count[i].value;
-                  answers_count[i].percentage = total ? (answers_count[i].count / total) * 100 : 0;
-                }
-                graphData[0] = tempGraphdata;
-                temp = {
-                  total: total,
-                  question_type: _.last(value).question_type,
-                  question_id: _.last(value).question_id,
-                  question_label: _.last(value).question_label,
-                  question_text: _.last(value).question_text,
-                  choices: answers_count,
-                  graphData: graphData,
-                  graphLabels: graphLabels,
-                  graphType: graphType
-                };
-              });
-            }
-
-            return ReportJscriptyQuestion
-              .findAll({
-                where: {
-                  projectId: req.params.id,
-                  question_id: req.params.questionId,
-                  question_type: 'input'
-                },
-                attributes: ['question_type', 'question_id', 'question_label', 'question_text'],
-                include: [{
-                  model: ReportJscriptyInput,
-                  attributes: ['input_label']
-                }]
-              })
-
-          })
-          .then(function(inputs) {
-            var input_labels = [];
-            if (inputs) {
-              var grouped = _.groupBy(inputs, 'question_id');
-              _.forEach(grouped, function(question, id) {
-                var allLabels = [];
-                _.forEach(question, function(item) {
-                  allLabels = _.union(allLabels, _.map(item.ReportJscriptyInputs, 'input_label'));
-                });
-                input_labels.push({
-                  question_id: _.last(question).question_id,
-                  labels: allLabels
-                });
-              })
-              _.forEach(input_labels, function(element) {
-                if (Object.keys(temp).length) {
-                  _.forEach(element.labels, function(label) {
-                    var input_label = _.find(temp.choices, {
-                      value: label
-                    });
-                    if (!input_label) {
-                      temp.choices.push({
-                        value: label,
-                        count: 0,
-                        percentage: 0
-                      })
-                      temp.graphData[0].push(0);
-                      temp.graphLabels.push(label);
-                    }
-                  });
-                } else {
-                  var answers_count = [];
-                  var graphData = [];
-                  var tempGraphdata = [];
-                  var graphLabels = [];
-                  _.forEach(element.labels, function(label) {
-                    answers_count.push({
-                      value: label,
-                      count: 0,
-                      percentage: 0
-                    })
-                    tempGraphdata.push(0);
-                    graphLabels.push(label);
-
-                  });
-                  graphData.push(tempGraphdata);
-                  var input = inputs[0];
-                  temp = {
-                    total: total,
-                    question_type: input.question_type,
-                    question_id: input.question_id,
-                    question_label: input.question_label,
-                    question_text: input.question_text,
-                    choices: answers_count,
-                    graphType: 'bar',
-                    graphData: graphData,
-                    graphLabels: graphLabels
-
-                  };
-                }
-              })
-            }
-            return res.status(201).send(temp);
-
-          })
-
-      } else if (jscripty_question.dataValues.question_type == 'question') {
-
-        return ReportJscriptyQuestion
-          .findAll({
-            where: {
-              projectId: req.params.id,
-              question_id: req.params.questionId
-            },
-            attributes: ['question_type', 'question_id', 'question_label', 'question_text', 'question_options', 'question_answer', [sequelize.fn('count', sequelize.col('question_answer')),
-              'count'
-            ]],
-            group: ['question_id', 'question_answer']
-
-          })
-          .then(function(jscripty_question) {
-
-            jscripty_questions = jscripty_question;
-            return ReportJscriptyQuestion
-              .findAll({
-                where: {
-                  projectId: req.params.id,
-                  question_id: req.params.questionId,
-                  question_type: 'question',
-                  question_other_answer: {
-                    $ne: null
-                  }
-                },
-                attributes: ['question_type', 'question_id', 'question_label', 'question_options', 'question_text', 'question_other_answer', 'question_other_label', [sequelize.fn('count',
-                    sequelize.col(
-                      'question_other_label')),
-                  'count'
-                ]],
-                group: ['question_id', 'question_other_label']
-
-              })
-          })
-          .then(function(response) {
-            if (response) {
-              _.forEach(response, function(element) {
-                jscripty_questions.push(element);
-              })
-            }
-
-            var grouped = _.groupBy(jscripty_questions, 'question_id');
-            _.forEach(grouped, function(value, id) {
-              var answers_count = [];
-              var total = 0;
-              var graphData = [];
-              var graphLabels = [];
-              var graphType = 'pie';
-              _.forEach(value, function(element) {
-
-                if (element.question_answer) {
-                  answers_count.push({
-                    value: element.question_answer,
-                    count: element.dataValues.count
-                  })
-                  total = total + element.dataValues.count;
-
-                }
-                if (element.question_other_answer) {
-                  answers_count.push({
-                    other_option: true,
-                    value: element.question_other_label,
-                    count: element.dataValues.count
-                  })
-                }
-
-              });
-              var question_options = _.last(value).question_options ? JSON.parse(_.last(value).question_options) : null;
-              if (question_options) {
-                _.forEach(question_options.options, function(option) {
-                  var edge_label = _.find(answers_count, {
-                    value: option
-                  });
-
-                  if (!edge_label) {
-                    answers_count.push({
-                      value: option,
-                      count: 0,
-                      percentage: 0
-                    });
-
-                  }
-                });
-              }
-              var tempGraphdata = [];
-              var input_type = false
-              for (var i = 0; i < answers_count.length; i++) {
-                if (!answers_count[i].other_option) {
-                  graphData[i] = answers_count[i].count;
-                  graphLabels[i] = answers_count[i].value;
-                  answers_count[i].percentage = total ? (answers_count[i].count / total) * 100 : 0;
-                }
-              }
-
-              temp = {
-                total: total,
-                question_type: _.last(value).question_type,
-                question_id: _.last(value).question_id,
-                question_label: _.last(value).question_label,
-                question_text: _.last(value).question_text,
-                choices: answers_count,
-                graphData: graphData,
-                graphLabels: graphLabels,
-                graphType: graphType
-              };
-            });
-            return res.status(201).send(temp);
-          })
-      } else {
-        console.log('question type not recognized');
-        return res.sendStatus(404);
-      }
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-}
-
-// Gets detail of ReportJscriptyQuestion from the DB
-exports.showDetail = function(req, res) {
-    var temp_questions;
-    var jscripty_questions;
-    var temp_inputs;
-    var question_count;
-
-    return ReportJscriptyQuestion
-      .findAll({
-
-        where: {
-          projectId: req.params.id,
-          question_type: 'question'
-        },
-        attributes: ['question_type', 'question_id', 'question_label', 'question_text', 'question_answer', 'question_options', 'question_other_label', [sequelize.fn('count', sequelize.col(
-            'question_answer')),
-          'count'
-        ]],
-        group: ['question_id', 'question_answer']
-
-      })
-      .then(function(response) {
-        jscripty_questions = response;
-        return ReportJscriptyQuestion
-          .findAll({
-            where: {
-              projectId: req.params.id,
-              question_type: 'question',
-              question_other_answer: {
-                $ne: null
-              }
-            },
-            attributes: ['question_type', 'question_id', 'question_label', 'question_text', 'question_other_answer', 'question_other_label', 'question_options', [sequelize.fn('count', sequelize.col(
-                'question_other_answer')),
-              'count'
-            ]],
-            group: ['question_id', 'question_other_answer']
-
-            // attributes: ['question_type', 'question_id', 'question_label', 'question_text', 'question_other_answer', 'question_other_label', 'question_options', [sequelize.fn('count', sequelize.col(
-            //     'question_other_label')),
-            //   'count'
-            // ]],
-            // group: ['question_id', 'question_other_label']
-
-          })
-      })
-      .then(function(response) {
-        _.forEach(response, function(element) {
-          jscripty_questions.push(element);
-        })
-        var temp = [];
-        var graphType = 'pie';
-
-        var grouped = _.groupBy(jscripty_questions, 'question_id');
-        _.forEach(grouped, function(value, id) {
-          var total = 0;
-          var graphData = [];
-          var graphLabels = [];
-          var answers_count = [];
-
-          _.forEach(value, function(element) {
-            if (element.question_answer) {
-              answers_count.push({
-                value: element.question_answer,
-                count: element.dataValues.count
-              })
-              total = total + element.dataValues.count;
-            }
-            if (element.question_other_answer) {
-              answers_count.push({
-                other_option: true,
-                value: element.question_other_answer,
-                count: element.dataValues.count
-              })
-            }
-
-          });
-          var question_options = JSON.parse(_.last(value).question_options);
-          if (question_options) {
-            _.forEach(question_options.options, function(option) {
-              var edge_label = _.find(answers_count, {
-                value: option
-              });
-              if (!edge_label) {
-                answers_count.push({
-                  value: option,
-                  count: 0,
-                  percentage: 0
-                });
-              }
-            });
-          }
-          for (var i = 0; i < answers_count.length; i++) {
-
-            if (!answers_count[i].other_option && (total != 0)) {
-              answers_count[i].percentage = (answers_count[i].count / total) * 100;
-              graphData.push(answers_count[i].count);
-              graphLabels.push(answers_count[i].value);
-            }
-
-          }
-
-          temp.push({
-            total: total,
-            question_type: _.last(value).question_type,
-            question_id: _.last(value).question_id,
-            question_label: _.last(value).question_label,
-            question_other_label: _.last(value).question_other_label,
-            question_text: _.last(value).question_text,
-            choices: answers_count,
-            graphData: graphData,
-            graphLabels: graphLabels,
-            graphType: graphType
-          })
-
-        });
-        temp_questions = temp;
-        return ReportJscriptyQuestion
-          .findAll({
-            where: {
-              projectId: req.params.id,
-              question_type: 'input'
-            },
-            attributes: ['id', 'question_type', 'question_id', 'question_label', 'question_text', 'question_answer'],
-            include: [{
-              model: ReportJscriptyInput,
-              where: {
-                $or: [{
-                  input_type: 'checkbox',
-                  input_value: '1'
-                }, {
-                  input_type: {
-                    $ne: 'checkbox'
-                  },
-                  input_value: {
-                    $ne: null
-                  }
-                }]
-
-              },
-              attributes: ['input_label', 'input_value', 'input_type', [sequelize.fn('count', sequelize.col('input_label')),
-                'count'
-              ]]
-            }],
-            group: ['question_id', 'input_label']
-          })
-
-      })
-      .then(function(jscripty_question) {
-        jscripty_questions = jscripty_question;
-        return ReportJscriptyQuestion
-          .findAll({
-            where: {
-              projectId: req.params.id,
-              question_type: 'input'
-            },
-            attributes: ['question_id', [sequelize.fn('count', sequelize.col('question_id')),
-              'count'
-            ]],
-            group: ['question_id']
-          })
-      })
-      .then(function(question) {
-        question_count = question;
-        var temp = [];
-        var grouped = _.groupBy(jscripty_questions, 'question_id');
-        _.forEach(grouped, function(value, id) {
-          var answers_count = [];
-          var total = 0;
-          total = _.find(question_count, function(question) {
-            return question.question_id == _.last(value).question_id;
-          }).dataValues.count;
-          var graphData = [];
-          var graphData2 = [];
-          var graphLabels = [];
-          var graphType = 'bar';
-          _.forEach(value, function(element) {
-            var elemt = element;
-            _.forEach(elemt.ReportJscriptyInputs, function(input) {
-              answers_count.push({
-                checkbox: true,
-                value: input.input_label,
-                count: input.dataValues.count
-              })
-            })
-          });
-          var tempGraphdata = [];
-          for (var i = 0; i < answers_count.length; i++) {
-            tempGraphdata[i] = answers_count[i].count;
-            answers_count[i].percentage = (answers_count[i].count / total) * 100;
-            graphLabels[i] = answers_count[i].value;
-          }
-          graphData[0] = tempGraphdata;
-          temp_questions.push({
-            total: total,
-            question_type: _.last(value).question_type,
-            question_id: _.last(value).question_id,
-            question_label: _.last(value).question_label,
-            question_text: _.last(value).question_text,
-            choices: answers_count,
-            graphData: graphData,
-            graphLabels: graphLabels,
-            graphType: graphType
-          })
-        });
-        return ReportJscriptyQuestion
-          .findAll({
-            where: {
-              projectId: req.params.id,
-              question_type: 'input'
-            },
-            attributes: ['id', 'question_id', 'question_label', 'question_text', 'question_type'],
-            include: [{
-              model: ReportJscriptyInput,
-              attributes: ['input_label']
-            }],
-          })
-      })
-      .then(function(inputs) {
-        var grouped = _.groupBy(inputs, 'question_id');
-        var labels = [];
-        _.forEach(grouped, function(question, id) {
-          var allLabels = [];
-          _.forEach(question, function(item) {
-            allLabels = _.union(allLabels, _.map(item.ReportJscriptyInputs, 'input_label'));
-          });
-          labels.push({
-            question_text: _.last(question).question_text,
-            question_type: _.last(question).question_type,
-            question_label: _.last(question).question_label,
-            question_id: _.last(question).question_id,
-            labels: allLabels
-          });
-        })
-
-        _.forEach(labels, function(element) {
-          var question = _.find(temp_questions, {
-            'question_id': element.question_id
-          });
-          if (question) {
-            _.forEach(element.labels, function(label) {
-              var input_label = _.find(question.choices, {
-                value: label
-              });
-              if (!input_label) {
-                question.choices.push({
-                  value: label,
-                  count: 0,
-                  percentage: 0
-                });
-                question.graphData[0].push(0);
-                question.graphLabels.push(label);
-              }
-            });
-          } else {
-            var answers_count = [];
-            var graphData = [];
-            var tempGraphdata = [];
-            var graphLabels = [];
-            _.forEach(element.labels, function(label) {
-              answers_count.push({
-                  value: label,
-                  count: 0,
-                  percentage: 0
-                })
-                // tempGraphdata.push(0);
-                // graphLabels.push(label);
-            });
-            // graphData.push(tempGraphdata);
-            var total = _.find(question_count, function(question) {
-              return question.question_id == element.question_id;
-            }).dataValues.count;
-            temp_questions.push({
-              total: total,
-              question_type: element.question_type,
-              question_id: element.question_id,
-              question_label: element.question_label,
-              question_text: element.question_text,
-              choices: answers_count,
-              graphType: 'bar',
-              graphData: graphData,
-              graphLabels: graphLabels
-            })
-          }
-        })
-        return res.status(201).send(temp_questions);
-      })
-
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-    // })
-
-  }
-  // Creates a new JscriptyProject in the DB
-exports.create = function(req, res) {
-  return JscriptyProject
-    .create(req.body)
-    .then(function(jscripty_project) {
-      return res.status(201).send(jscripty_project);
-    })
-    .catch(sequelize.UniqueConstraintError, function(err) {
-      if (err.fields.name) {
-        err.message = 'Project name already exists';
-        err.translatedMessage = 'MESSAGE_EXIST_PROJECT'
-      }
-      return handleError(res, err);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new ReportJscriptySession in the DB
-exports.createSession = function(req, res) {
-    return ReportJscriptySession
-      .create(req.body)
-      .then(function(jscripty_session) {
-        return res.status(201).send(jscripty_session);
-      })
-      .catch(function(err) {
-        return handleError(res, err);
-      });
-
-  }
-  // Creates a new ReportJscriptyQuestions in the DB
-exports.createQuestions = function(req, res) {
-    return ReportJscriptyQuestion
-      .destroy({
-        where: {
-          sessionId: req.params.sessionId
-        }
-      })
-      .then(function() {
-        var _promises = [];
-        for (var i = 0; i < req.body.length; i++) {
-          _promises[i] = ReportJscriptyQuestion.create(req.body[i], {
-            include: [{
-              model: ReportJscriptyInput
-            }]
-          })
-        }
-        return Promise
-          .all(_promises);
-      })
-      .then(function(jscripty_question) {
-        return res.sendStatus(201);
-      })
-      .catch(function(err) {
-        return handleError(res, err);
-      });
-  }
-  // Updates an existing JscriptyProject in the DB
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  return JscriptyProject
-    .findById(req.params.id)
-    .then(function(jscripty_project) {
-      if (!jscripty_project) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(jscripty_project, req.body);
-      return updated.save();
-    })
-    .then(function(jscripty_project) {
-      return res.status(200).send(jscripty_project);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-// Updates an existing ReportJscriptySession in the DB
-exports.updateSession = function(req, res) {
-  return ReportJscriptySession
-    .findById(req.params.sessionId)
-    .then(function(session) {
-      if (!session) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(session, req.body);
-      return updated.save();
-    })
-    .then(function(jscripty_session) {
-      return res.status(200).send(jscripty_session);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-}
-
-// Deletes a JscriptyProject from the DB
-exports.destroy = function(req, res) {
-  return JscriptyProject
-    .findById(req.params.id)
-    .then(function(jscripty_project) {
-      if (!jscripty_project) {
-        return res.sendStatus(404);
-      }
-      return jscripty_project.destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-exports.destroySession = function(req, res) {
-  return ReportJscriptySession
-    .find({
-      where: {
-        session_id: req.params.sessionId
-      }
-    })
-    .then(function(session) {
-      if (!session) {
-        return res.sendStatus(404);
-      }
-      return session.destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a jscripty_project from the DB.
-exports.bulkDestroy = function(req, res) {
-  return JscriptyProject
-    .destroy({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-exports.download = function(req, res, next) {
-  return JscriptyProject
-    .findById(req.params.id)
-    .then(function(jscripty_project) {
-      if (!jscripty_project) {
-        return res.sendStatus(404);
-      }
-      // console.log(req.query.filename);
-      res.set({
-        "Content-Disposition": "attachment; filename=\"" + req.query.filename +
-          ".xml\"",
-        "Content-Type": "txt/xml"
-      });
-      return res.send(jscripty_project.production);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// exports.projectJson = function(req, res, next) {
-//   JscriptyProject
-//     .findById(req.params.id)
-//     .then(function(jscripty_project) {
-//       if (!jscripty_project) {
-//         return res.sendStatus(404);
-//       }
-//
-//       xml.parseString(jscripty_project.production, {
-//         normalizeTags: true,
-//         explicitArray: false
-//       }, function(err, result) {
-//         console.log(result);
-//         return res.status(200).send(result);
-//
-//       });
-//     })
-//     .catch(function(err) {
-//       return handleError(res, err);
-//     });
-// };
\ No newline at end of file
diff --git a/server/api/jscripty_project/jscripty_project.events.js b/server/api/jscripty_project/jscripty_project.events.js
index fe91bd8..7ef8004 100644
--- a/server/api/jscripty_project/jscripty_project.events.js
+++ b/server/api/jscripty_project/jscripty_project.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const JscriptyProject = require('../../models').JscriptyProject;
-
-var JscriptyProjectEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-JscriptyProjectEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  JscriptyProject.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    JscriptyProjectEvents.emit(event + ':' + doc._id, doc);
-    JscriptyProjectEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = JscriptyProjectEvents;
\ No newline at end of file
diff --git a/server/api/jscripty_project/jscripty_project.socket.js b/server/api/jscripty_project/jscripty_project.socket.js
index 9911b1a..fec1382 100644
--- a/server/api/jscripty_project/jscripty_project.socket.js
+++ b/server/api/jscripty_project/jscripty_project.socket.js
@@ -1,28 +1 @@
-'use strict';
-
-const JscriptyProjectEvents = require('./jscripty_project.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('jscripty_project:' + event, socket);
-
-    JscriptyProjectEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    JscriptyProjectEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/license/index.js b/server/api/license/index.js
index f0a2983..da093ce 100644
--- a/server/api/license/index.js
+++ b/server/api/license/index.js
@@ -1,12 +1 @@
-'use strict';
-
-var express = require('express');
-var auth = require('../../auth/auth.service');
-var controller = require('./license.controller');
-
-var router = express.Router();
-
-router.get('/', controller.index);
-router.post('/request', auth.isAuthenticated(), controller.request);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/license/license.controller.js b/server/api/license/license.controller.js
index a5d47ec..d62e60b 100644
--- a/server/api/license/license.controller.js
+++ b/server/api/license/license.controller.js
@@ -1,135 +1 @@
-'use strict';
-
-/**
- * Using Rails-like standard naming convention for endpoints.
- * GET     /api/licenses              ->  index
- * POST    /api/licenses              ->  create
- * GET     /api/licenses/:id          ->  show
- * PUT     /api/licenses/:id          ->  update
- * DELETE  /api/licenses/:id          ->  destroy
- */
-
-var _ = require('lodash');
-var crypto = require('crypto');
-var moment = require('moment');
-var rp = require('request-promise');
-
-var config = require('../../config/environment');
-var license = require('../../config/license/license.service');
-var License = require('../../models').License;
-var Setting = require('../../models').Setting;
-
-const expirationTh = 7;
-
-function handleError(res, statusCode) {
-  statusCode = statusCode || 500;
-  return function(err) {
-    console.log(err);
-    res.status(statusCode).send(err);
-  };
-}
-
-function handleEntityNotFound(res) {
-  return function(entity) {
-    if (!entity) {
-      entity = {
-        dataValues: {
-          license: license.demoLicense
-        }
-      };
-
-      entity.dataValues.license.token = license.getUuid();
-      res.status(201).json(entity);
-      return null;
-    }
-
-    return entity;
-  };
-}
-
-function saveUpdates(updates) {
-  return function(entity) {
-    return entity
-      .updateAttributes(updates)
-      .then(function(updated) {
-        return updated;
-      });
-  };
-}
-
-function removeEntity(res) {
-  return function(entity) {
-    if (entity) {
-      return entity
-        .destroy()
-        .then(function() {
-          res.status(204).end();
-        });
-    }
-  };
-}
-
-// Gets a list of Licenses
-exports.index = function(req, res, next) {
-  var _settings;
-  var _license;
-
-  return Setting
-    .findById(1)
-    .then(function(settings) {
-      _settings = settings;
-      return License
-        .findById(1);
-    })
-    .then(handleEntityNotFound(res))
-    .then(function(_license) {
-
-      if (!_license) {
-        _license = {};
-      }
-
-      try {
-        if (_license.license) {
-          _license.license = license.decrypt(_license.license, _license.data1);
-          _license.license = JSON.parse(_license.license);
-        } else {
-          _license.license = license.demoLicense;
-        }
-      } catch (err) {
-        console.log('decrypt error', err);
-        _license.license = license.demoLicense;
-      }
-
-      if (_license.data2) {
-        var decipher = crypto.createDecipher('aes-256-ctr', config.session.secret);
-        var dec = decipher.update(_license.data2, 'base64', 'utf8')
-        dec += decipher.final('utf8');
-
-        _license.license.expirationTime = expirationTh - moment().diff(dec, 'days');
-      }
-
-      _license.license.token = _license.data1;
-      _license.license.token2 = license.getUuid();
-      _.merge(_license.dataValues, _settings.dataValues);
-
-      res.status(200).json(_license.dataValues);
-    })
-    .catch(handleError(res));
-}
-
-// Creates a new License in the DB
-exports.request = function(req, res) {
-  return rp({
-      method: 'POST',
-      uri: config.provisioning + '/servers/' + license.getUuid() + '/request',
-      body: req.body,
-      json: true // Automatically stringifies the body to JSON
-    })
-    .then(function(data) {
-      res.status(201).send(data);
-    })
-    .catch(function(err) {
-      console.log(err);
-      return res.status(err.statusCode || 500).send(err);
-    });
-}
\ No newline at end of file
diff --git a/server/api/list/index.js b/server/api/list/index.js
index 2336f13..62ec5e5 100644
--- a/server/api/list/index.js
+++ b/server/api/list/index.js
@@ -1,28 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./list.controller');
-var auth = require('../../auth/auth.service');
-var license = require('../../config/license/license.service');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin', 'agent']), controller.index);
-router.get('/:listId/customfields/:id', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin', 'agent']), controller.showCustomField);
-router.get('/:id/customfields', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin', 'agent']), controller.getCustomFields);
-router.get('/:id/agents', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin', 'agent']), controller.showAgents);
-router.get('/:id/contacts', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin', 'agent']), controller.getContacts);
-router.get('/:id', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin', 'agent']), controller.show);
-router.post('/', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin']), controller.create);
-router.post('/:id/agents', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin']), controller.addAgents);
-router.post('/:id/contacts', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin', 'agent']), controller.getContact);
-router.post('/:id/customfields', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin']), controller.createCustomField);
-router.put('/:listId/customfields/:id', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin']), controller.updateCustomField);
-router.put('/:id', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin']), controller.update);
-router.delete('/:id/agents', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin']), controller.removeAgents);
-router.delete('/', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin']), controller.bulkDestroy);
-router.delete('/:id', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin']), controller.destroy);
-router.delete('/:listId/customfields/:id', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin']), controller.removeCustomField);
-router.delete('/:listId/customfields', auth.isAuthenticated(), license.hasCm(), auth.hasModule([5], ['admin']), controller.removeAllCustomFields);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/list/list.controller.js b/server/api/list/list.controller.js
index 18caabc..bad55c5 100644
--- a/server/api/list/list.controller.js
+++ b/server/api/list/list.controller.js
@@ -1,463 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var util = require('util');
-
-var User = require('../../models').User;
-var List = require('../../models').List;
-var UserHasList = require('../../models').UserHasList;
-var CustomField = require('../../models').CustomField;
-var Contact = require('../../models').Contact;
-var Util = require('../../config/util');
-var sequelize = require('../../models').sequelize;
-
-// Get list of lists
-exports.index = function(req, res, next) {
-  switch (req.user.role) {
-    case 'agent':
-      return User
-        .findById(req.user.id)
-        .then(function(agent) {
-          return agent.getLists();
-        })
-        .then(function(lists) {
-          var agentLists = _.map(lists, 'id');
-          return List
-            .scope('customFields')
-            .findAndCountAll(_.merge(Util.getQuery(req.query, {
-              $or: [{
-                defaultEntry: true
-              }, {
-                id: agentLists
-              }]
-            }), {
-              distinct: true
-            }));
-        })
-        .then(function(result) {
-          res.status(200).send(result);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-    default:
-      return List
-        .scope('customFields')
-        .findAndCountAll(_.merge(Util.getQuery(req.query), {
-          distinct: true
-        }))
-        .then(function(result) {
-          res.status(200).send(result);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-  }
-
-};
-
-// Get all custom_fields
-exports.getCustomFields = function(req, res) {
-  return CustomField
-    .findAndCountAll({
-      where: {
-        ListId: req.params.id
-      }
-    })
-    .then(function(customFields) {
-      return res.status(200).send(customFields);
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-// Get all custom_fields
-exports.getContact = function(req, res) {
-  var where = _.merge(req.body, {
-    ListId: req.params.id
-  });
-
-  return Contact
-    .findOrCreate({
-      where: where,
-      default: req.body
-    })
-    .spread(function(contact) {
-      return res.status(200).send(contact);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.getContacts = function(req, res) {
-  var _baseQuery = {
-    where: {
-      ListId: req.params.id,
-    },
-    attributes: ['phone', 'mobile', 'fax', 'email']
-  };
-
-  _.forIn(req.query, function(value, key) {
-    _baseQuery.where[key] = {
-      $like: '%' + value + '%'
-    };
-  });
-
-  return Contact
-    .findAll(_baseQuery)
-    .then(function(contacts) {
-      return res.status(200).send({
-        rows: contacts,
-        length: contacts.length
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.showCustomField = function(req, res) {
-  return CustomField
-    .findById(req.params.id)
-    .then(function(customField) {
-      if (!customField) {
-        return res.sendStatus(404);
-      }
-      return res.status(200).send(customField);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.updateCustomField = function(req, res) {
-  return CustomField
-    .findById(req.params.id)
-    .then(function(customField) {
-      if (!customField) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(customField, req.body);
-      return updated.save();
-    })
-    .then(function(customField) {
-      return res.status(200).send(customField);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.createCustomField = function(req, res) {
-  var _customField;
-  req.body.ListId = req.params.id;
-  return sequelize.transaction(function(t) {
-      return CustomField
-        .create(req.body)
-        .then(function(customField) {
-          _customField = customField;
-          customField.name = 'cf_' + customField.id;
-          return customField.save();
-        })
-        .then(function() {
-          return sequelize.query(util.format('ALTER TABLE cm_contacts ADD COLUMN %s VARCHAR(255)', _customField.name));
-        })
-        .then(function() {
-          return res.sendStatus(201);
-        })
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single list
-exports.show = function(req, res) {
-  return List
-    .findById(req.params.id)
-    .then(function(list) {
-      if (!list) {
-        return res.sendStatus(404);
-      }
-      return res.send(list);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new list in the DB.
-exports.create = function(req, res) {
-  return sequelize.transaction(function(t) {
-      return List
-        .create(req.body)
-        .then(function(list) {
-          return res.status(201).send(list);
-        })
-    })
-    .catch(sequelize.UniqueConstraintError, function(err) {
-      err.translatedMessage = 'MESSAGE_EXIST_LIST';
-      err.message = 'The list name already exists';
-      return res.status(500).send(err);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing list in the DB.
-exports.update = function(req, res) {
-  return List
-    .findById(req.params.id)
-    .then(function(list) {
-      if (!list) {
-        return res.sendStatus(404);
-      }
-      if (req.body.id) {
-        delete req.body.id;
-      }
-      var updated = _.merge(list, req.body);
-      return updated.save();
-    })
-    .then(function(list) {
-      return res.status(200).send(list);
-    })
-    .catch(sequelize.UniqueConstraintError, function(err) {
-      err.translatedMessage = 'MESSAGE_EXIST_LIST';
-      err.message = 'The list name already exists';
-      return res.status(500).send(err);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.showAgents = function(req, res) {
-  return List
-    .findById(req.params.id)
-    .then(function(list) {
-      if (!list) {
-        return res.sendStatus(404);
-      }
-      return list
-        .getUsers({
-          where: {
-            role: 'agent'
-          },
-          attributes: ['id', 'name', 'fullname', 'email']
-        });
-    })
-    .then(function(agents) {
-      return res.status(200).send({
-        rows: agents,
-        count: agents.length
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing user_has_list in the DB.
-exports.addAgents = function(req, res, next) {
-  return User
-    .findAll({
-      where: {
-        id: req.body.agents
-      }
-    })
-    .then(function(users) {
-      var userHasLists = _.map(users, function(user) {
-        return {
-          list: req.params.id,
-          membername: user.name,
-          UserId: user.id
-        };
-      });
-
-      return UserHasList
-        .bulkCreate(userHasLists, {
-          individualHooks: true
-        });
-    })
-    .then(function() {
-      return res.sendStatus(200);
-    })
-    .catch(function(err) {
-      console.log(err);
-      return next(err);
-    });
-};
-
-exports.removeAgents = function(req, res, next) {
-  return UserHasList
-    .destroy({
-      where: {
-        UserId: req.query.agents,
-        list: req.params.id
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return res.sendStatus(202);
-    })
-    .catch(function(err) {
-      return next(err);
-    });
-};
-
-// Deletes a list from the DB.
-exports.destroy = function(req, res) {
-  return destroyList(req.params.id, res);
-};
-
-// Deletes multiple lists from the DB.
-exports.bulkDestroy = function(req, res) { //add the check for associated contacts
-  return destroyList(req.query.id, res);
-};
-
-function destroyList(id, res) {
-  return delCf(id, res)
-    .all()
-    .then(function() {
-      return List.destroy({
-        where: {
-          id: id
-        },
-        individualHooks: true
-      });
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-}
-
-function delCf(id, res) {
-  var _cfs;
-  return CustomField.findAll({
-      where: {
-        ListId: id
-      }
-    })
-    .then(function(cfs) {
-      if (!cfs) {
-        return res.sendStatus(404);
-      }
-      _cfs = cfs;
-      return CustomField
-        .destroy({
-          where: {
-            id: id
-          }
-        });
-    })
-    .then(function() {
-      return Contact
-        .describe();
-    })
-    .then(function(tableFields) {
-      return _.keys(tableFields);
-    })
-    .then(function(fields) {
-      var bulkDel = [];
-      _.forEach(_cfs, function(elem) {
-        if (_.includes(fields, elem.name)) {
-          bulkDel.push(sequelize.query(util.format('ALTER TABLE cm_contacts DROP COLUMN %s', elem.name)));
-        }
-      });
-      return bulkDel;
-    })
-}
-
-exports.removeCustomField = function(req, res) {
-  var _cf;
-  return CustomField
-    .findById(req.params.id)
-    .then(function(cf) {
-      if (!cf) {
-        return res.sendStatus(404);
-      }
-      _cf = cf;
-      return CustomField
-        .destroy({
-          where: {
-            id: req.params.id
-          }
-        });
-    })
-    .then(function() {
-      return Contact
-        .describe();
-    })
-    .then(function(tableFields) {
-      return _.keys(tableFields);
-    })
-    .then(function(fields) {
-      if (_.includes(fields, _cf.name)) {
-        return sequelize.query(util.format('ALTER TABLE cm_contacts DROP COLUMN %s', _cf.name));
-      }
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.removeAllCustomFields = function(req, res) {
-  var _cfs;
-  return CustomField
-    .findAll({
-      where: {
-        id: req.query.ids
-      }
-    })
-    .then(function(cfs) {
-      if (!cfs) {
-        return res.sendStatus(404);
-      }
-      _cfs = cfs;
-      return CustomField
-        .destroy({
-          where: {
-            id: req.query.ids
-          }
-        });
-    })
-    .then(function() {
-      return Contact
-        .describe();
-    })
-    .then(function(tableFields) {
-      return _.keys(tableFields);
-    })
-    .then(function(fields) {
-      var bulkDel = [];
-      _cfs.forEach(function(elem) {
-        if (_.includes(fields, elem.name)) {
-          bulkDel.push(sequelize.query(util.format('ALTER TABLE cm_contacts DROP COLUMN %s', elem.name)));
-        }
-      });
-      return bulkDel;
-    })
-    .all()
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/list/list.events.js b/server/api/list/list.events.js
index 0cb87f0..c097402 100644
--- a/server/api/list/list.events.js
+++ b/server/api/list/list.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const List = require('../../models').List;
-
-var ListEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-ListEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  List.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    ListEvents.emit(event + ':' + doc._id, doc);
-    ListEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = ListEvents;
\ No newline at end of file
diff --git a/server/api/list/list.socket.js b/server/api/list/list.socket.js
index c79e17b..e96f9fe 100644
--- a/server/api/list/list.socket.js
+++ b/server/api/list/list.socket.js
@@ -1,28 +1 @@
-'use strict';
-
-const ListEvents = require('./list.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('list:' + event, socket);
-
-    ListEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    ListEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/mail_account/index.js b/server/api/mail_account/index.js
index 1a22334..78be65b 100644
--- a/server/api/mail_account/index.js
+++ b/server/api/mail_account/index.js
@@ -1,29 +1 @@
-'use strict';
-
-var express = require('express');
-
-var controller = require('./mail_account.controller');
-var auth = require('../../auth/auth.service');
-var license = require('../../config/license/license.service');
-
-var router = express.Router();
-
-router.get('/', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin', 'agent']), controller.index);
-router.get('/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin', 'agent']), controller.show);
-router.get('/account/:address', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin', 'agent']), controller.showFromAddress);
-router.get('/:id/applications', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.showApplications);
-router.get('/:id/rooms', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin', 'agent']), controller.getMailRooms);
-router.get('/:id/dispositions', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin', 'agent']), controller.getDispositions);
-router.post('/', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.create);
-router.post('/:id/applications', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.createApplication);
-router.post('/:id/dispositions', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.createDisposition);
-router.put('/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.update);
-router.put('/:id/applications', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.updateApplications);
-router.put('/:id/dispositions/:dispId', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.updateDisposition);
-router.delete('/', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.bulkDestroy);
-router.delete('/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.destroy);
-router.delete('/:id/applications', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.bulkDestroyApplications);
-router.delete('/:id/applications/:appId', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.destroyApplication);
-router.delete('/:id/dispositions/:dispId', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.destroyDisposition);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/mail_account/mail_account.controller.js b/server/api/mail_account/mail_account.controller.js
index 21b4a2f..d73d20d 100644
--- a/server/api/mail_account/mail_account.controller.js
+++ b/server/api/mail_account/mail_account.controller.js
@@ -1,487 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var util = require('util');
-var async = require('async');
-
-var Util = require('../../config/util');
-
-var sequelize = require('../../models').sequelize;
-var User = require('../../models').User;
-var MailAttachment = require('../../models').MailAttachment;
-var MailQueue = require('../../models').MailQueue;
-var MailRoom = require('../../models').MailRoom;
-var MailAccount = require('../../models').MailAccount;
-var MailServerIn = require('../../models').MailServerIn;
-var MailServerOut = require('../../models').MailServerOut;
-var MailApplication = require('../../models').MailApplication;
-var MailDisposition = require('../../models').MailDisposition;
-var Interval = require('../../models').Interval;
-
-// Get list of mailAccounts
-exports.index = function(req, res) {
-  return MailAccount
-    .scope('default')
-    .findAndCountAll(Util.getQuery(req.query))
-    .then(function(result) {
-      res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.getMailRooms = function(req, res, next) {
-  var _query = {
-    include: [],
-    where: {
-      MailAccountId: req.params.id,
-      $and: []
-    },
-    attributes: ['id', 'subject', 'from', 'attachment', 'disposition', 'tags', 'waiting', 'lastEvent', 'updatedAt']
-  };
-
-  // TO MOVE SOON INTO AN EXTENAL UTIL FILE
-  if (req.query) {
-    if (req.query.tags) {
-      if (_.isArray(req.query.tags)) {
-        for (var i = 0; i < req.query.tags.length; i++) {
-          _query.where.$and.push({
-            tags: {
-              $like: '%' + req.query.tags[i] + ';%'
-            }
-          });
-        }
-      } else {
-        _query.where.$and.push({
-          tags: {
-            $like: '%' + req.query.tags + ';%'
-          }
-        });
-      }
-      delete req.query.tags;
-    }
-    _.merge(_query.where, req.query);
-  }
-
-  switch (req.user.role) {
-    case 'agent':
-      _query.include.push({
-        model: User,
-        attributes: ['id']
-      });
-
-      var _agents;
-      var _agentQueues;
-      var _accountQueues;
-
-      return User
-        .findById(req.user.id)
-        .then(function(user) {
-          if (user) {
-            return user
-              .getMailQueues();
-          } else {
-            return [];
-          }
-        })
-        .then(function(queues) {
-          _agentQueues = _.map(queues, 'id');
-
-          return MailAccount
-            .findById(req.params.id);
-        })
-        .then(function(account) {
-          return account
-            .getMailApplications({
-              where: {
-                $or: [{
-                  app: 'queue'
-                }, {
-                  app: 'agent'
-                }]
-              }
-            });
-        })
-        .then(function(apps) {
-          _agents = _.map(_.find(apps, {
-            'app': 'agent'
-          }), 'UserId');
-
-          _accountQueues = _.map(_.find(apps, {
-            'app': 'queue'
-          }), 'MailQueueId');
-
-          if (_.intersection(_agentQueues, _accountQueues).length || _.intersection(_agents, [req.user.id]).length) {
-            return MailRoom
-              .findAll(_query)
-              .then(function(mailRooms) {
-                return res.status(200).send(mailRooms);
-              })
-              .catch(function(err) {
-                console.error(err);
-                return handleError(res, err);
-              });
-          } else {
-
-            return res.status(200).send([]);
-          }
-        })
-        .catch(function(err) {
-          console.error(err);
-        });
-
-    default:
-
-      return MailRoom
-        .findAll(_query)
-        .then(function(mailRooms) {
-          return res.status(200).send(mailRooms);
-        })
-        .catch(function(err) {
-          console.error(err);
-          return handleError(res, err);
-        });
-  }
-};
-
-exports.getDispositions = function(req, res, next) {
-  return MailAccount
-    .findById(req.params.id)
-    .then(function(mailAccount) {
-      if (!mailAccount) {
-        return res.sendStatus(404);
-      }
-
-      return mailAccount
-        .getMailDispositions();
-    })
-    .then(function(mailDispositions) {
-      return res.status(200).send({
-        rows: mailDispositions,
-        count: mailDispositions.length
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single mailAccount
-exports.show = function(req, res, next) {
-  return MailAccount
-    .scope('default')
-    .findById(req.params.id)
-    .then(function(mailAccount) {
-      if (!mailAccount) {
-        return res.sendStatus(404);
-      }
-      return res.send(mailAccount);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.showFromAddress = function(req, res, next) {
-  return MailAccount
-    .findOne({
-      where: {
-        address: req.params.address
-      }
-    })
-    .then(function(mailAccount) {
-      if (!mailAccount) {
-        return res.sendStatus(404);
-      }
-      return res.send(mailAccount);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single mailAccount
-exports.showApplications = function(req, res, next) {
-  return MailAccount
-    .scope('default')
-    .findById(req.params.id)
-    .then(function(mailAccount) {
-      if (!mailAccount) {
-        return res.sendStatus(404);
-      }
-      return mailAccount
-        .getMailApplications(_.merge(Util.getQuery(req.query), {
-          include: [{
-            model: MailQueue,
-            attributes: ['id', 'name']
-          }, {
-            model: User,
-            attributes: ['id', 'name', 'online']
-          }, {
-            model: Interval,
-            attributes: ['id', 'name']
-          }]
-        }));
-    })
-    .then(function(mailApplications) {
-      return res.send({
-        count: mailApplications.length,
-        rows: mailApplications
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new mailAccount in the DB.
-exports.create = function(req, res, next) {
-  return sequelize.transaction(function(t) {
-      return MailAccount
-        .create(req.body, {
-          include: [{
-            model: MailServerIn
-          }, {
-            model: MailServerOut
-          }],
-          transaction: t
-        });
-    }).then(function(mailAccount) {
-      return res.status(201).send(mailAccount);
-    })
-    .catch(sequelize.UniqueConstraintError, function(err) {
-      return Util.errorManager.handleUniqueConstraintError(res, err);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new mailApplication in the DB.
-exports.createApplication = function(req, res, next) {
-
-  return MailApplication
-    .max('priority', {
-      where: {
-        MailAccountId: req.params.id
-      }
-    }).then(function(max) {
-      // SET PRIORITY
-      req.body.priority = max ? ++max : 1;
-      req.body.MailAccountId = req.params.id;
-
-      return MailApplication
-        .create(req.body);
-    })
-    .then(function(mailApplication) {
-      return res.status(201).send(mailApplication);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new mailAccount in the DB.
-exports.createDisposition = function(req, res, next) {
-  req.body.MailAccountId = req.params.id;
-
-  return MailDisposition
-    .create(req.body)
-    .then(function(mailDiposition) {
-      return res.status(201).send(mailDiposition);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-
-// Updates an existing mailAccount in the DB.
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-
-  return MailAccount
-    .findById(req.params.id)
-    .then(function(mailAccount) {
-      if (!mailAccount) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(mailAccount, req.body);
-      return updated
-        .save();
-    })
-    .then(function(mailAccount) {
-      return res.status(200).send(mailAccount);
-    })
-    .catch(sequelize.UniqueConstraintError, function(err) {
-      return Util.errorManager.handleUniqueConstraintError(res, err);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing mailAccount in the DB.
-exports.updateDisposition = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-
-  return MailDisposition
-    .findById(req.params.dispId)
-    .then(function(mailDisposition) {
-      if (!mailDisposition) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(mailDisposition, req.body);
-      return updated
-        .save();
-    })
-    .then(function(mailAccount) {
-      return res.status(200).send(mailAccount);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing mailAccount in the DB.
-exports.updateApplications = function(req, res) {
-
-  var priority = 0;
-  var apps = req.body;
-
-  apps.forEach(function(app) {
-    delete app.id;
-    delete app.createdAt;
-    delete app.updatedAt;
-
-    app.priority = ++priority;
-  });
-
-  return sequelize.transaction(function(t) {
-    return MailApplication
-      .destroy({
-        where: {
-          MailAccountId: req.params.id
-        },
-        individualHooks: true,
-        transaction: t
-      }).then(function(mailApplication) {
-        return MailApplication
-          .bulkCreate(apps, {
-            individualHooks: true,
-            transaction: t
-          });
-      });
-  }).then(function(mailAccounts) {
-    return res.status(200).send({
-      count: mailAccounts.length,
-      rows: mailAccounts
-    });
-  }).catch(function(err) {
-    return handleError(res, err);
-  });
-};
-
-// Deletes a mailAccount from the DB.
-exports.destroy = function(req, res, next) {
-  return MailAccount
-    .findById(req.params.id)
-    .then(function(mailAccount) {
-      if (!mailAccount) {
-        return res.sendStatus(404);
-      }
-
-      return mailAccount
-        .destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a mailAccount from the DB.
-exports.destroyApplication = function(req, res, next) {
-  return MailApplication
-    .findById(req.params.appId)
-    .then(function(mailApplication) {
-      if (!mailApplication) {
-        return res.sendStatus(404);
-      }
-
-      return mailApplication
-        .destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a mailAccount from the DB.
-exports.destroyDisposition = function(req, res, next) {
-  return MailDisposition
-    .findById(req.params.dispId)
-    .then(function(mailDiposition) {
-      if (!mailDiposition) {
-        return res.sendStatus(404);
-      }
-
-      return mailDiposition
-        .destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a agent from the DB.
-exports.bulkDestroy = function(req, res) {
-  return MailAccount
-    .destroy({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a agent from the DB.
-exports.bulkDestroyApplications = function(req, res) {
-  return MailApplication
-    .destroy({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  console.log(err);
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/mail_account/mail_account.events.js b/server/api/mail_account/mail_account.events.js
index b5d3ffa..402296a 100644
--- a/server/api/mail_account/mail_account.events.js
+++ b/server/api/mail_account/mail_account.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const MailAccount = require('../../models').MailAccount;
-
-var MailAccountEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-MailAccountEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  MailAccount.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    MailAccountEvents.emit(event + ':' + doc._id, doc);
-    MailAccountEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = MailAccountEvents;
\ No newline at end of file
diff --git a/server/api/mail_account/mail_account.socket.js b/server/api/mail_account/mail_account.socket.js
index 64b2c78..e942587 100644
--- a/server/api/mail_account/mail_account.socket.js
+++ b/server/api/mail_account/mail_account.socket.js
@@ -1,28 +1 @@
-'use strict';
-
-const MailAccountEvents = require('./mail_account.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('mail_account:' + event, socket);
-
-    MailAccountEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    MailAccountEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/mail_application/index.js b/server/api/mail_application/index.js
index 7f53439..52c56ab 100644
--- a/server/api/mail_application/index.js
+++ b/server/api/mail_application/index.js
@@ -1,17 +1 @@
-'use strict';
-
-var express = require('express');
-
-var controller = require('./mail_application.controller');
-var auth = require('../../auth/auth.service');
-var license = require('../../config/license/license.service');
-
-var router = express.Router();
-
-router.get('/', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.index);
-router.get('/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.show);
-router.post('/', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.create);
-router.put('/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.update);
-router.delete('/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/mail_application/mail_application.controller.js b/server/api/mail_application/mail_application.controller.js
index 0a75c15..da2d207 100644
--- a/server/api/mail_application/mail_application.controller.js
+++ b/server/api/mail_application/mail_application.controller.js
@@ -1,102 +1 @@
-'use strict';
-var _ = require('lodash');
-var MailApplication = require('../../models').MailApplication;
-// Get list of mailApplications
-exports.index = function(req, res, next) {
-  return MailApplication
-    .findAll({
-      where: req.query,
-      order: 'priority',
-      include: [{
-        all: true
-      }]
-    })
-    .then(function(mailApplications) {
-      return res.status(200).send(mailApplications);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-// Get a single mailApplication
-exports.show = function(req, res, next) {
-  return MailApplication
-    .findById(req.params.id, {
-      include: [{
-        all: true
-      }]
-    })
-    .then(function(mailApplication) {
-      if (!mailApplication) {
-        return res.sendStatus(404);
-      }
-      return res.send(mailApplication);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-// Creates a new mailApplication in the DB.
-exports.create = function(req, res, next) {
-  return MailApplication
-    .max('priority', {
-      where: {
-        MailAccountId: req.body.MailAccountId
-      }
-    }).then(function(max) {
-      // SET PRIORITY
-      req.body.priority = max ? ++max : 1;
-      return MailApplication
-        .create(req.body);
-    })
-    .then(function(mailApplication) {
-      return res.status(201).send(mailApplication);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-// Updates an existing mailApplication in the DB.
-exports.update = function(req, res, next) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  return MailApplication
-    .findById(req.params.id)
-    .then(function(mailApplication) {
-      if (!mailApplication) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(mailApplication, req.body);
-      return updated
-        .save();
-    })
-    .then(function(mailApplication) {
-      return res.status(200).send(mailApplication);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-// Deletes a mailApplication from the DB.
-exports.destroy = function(req, res, next) {
-  return MailApplication
-    .findById(req.params.id)
-    .then(function(mailApplication) {
-      if (!mailApplication) {
-        return res.sendStatus(404);
-      }
-      return mailApplication
-        .destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/mail_application/mail_application.events.js b/server/api/mail_application/mail_application.events.js
index 99d6421..9c34af3 100644
--- a/server/api/mail_application/mail_application.events.js
+++ b/server/api/mail_application/mail_application.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const MailApplication = require('../../models').MailApplication;
-
-var MailApplicationEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-MailApplicationEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  MailApplication.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    MailApplicationEvents.emit(event + ':' + doc._id, doc);
-    MailApplicationEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = MailApplicationEvents;
\ No newline at end of file
diff --git a/server/api/mail_application/mail_application.socket.js b/server/api/mail_application/mail_application.socket.js
index 4243448..8688671 100644
--- a/server/api/mail_application/mail_application.socket.js
+++ b/server/api/mail_application/mail_application.socket.js
@@ -1,28 +1 @@
-'use strict';
-
-const MailApplicationEvents = require('./mail_application.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('mail_application:' + event, socket);
-
-    MailApplicationEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    MailApplicationEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/mail_attachment/index.js b/server/api/mail_attachment/index.js
index 8118efb..33a5f27 100644
--- a/server/api/mail_attachment/index.js
+++ b/server/api/mail_attachment/index.js
@@ -1,17 +1 @@
-'use strict';
-
-var express = require('express');
-
-var controller = require('./mail_attachment.controller');
-var auth = require('../../auth/auth.service');
-var license = require('../../config/license/license.service');
-
-var router = express.Router();
-
-router.get('/', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin', 'agent']), controller.index);
-router.get('/:id', license.isValidDate(), license.hasMail(), controller.show);
-router.post('/', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin', 'agent']), controller.create);
-router.put('/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin', 'agent']), controller.update);
-router.delete('/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin', 'agent']), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/mail_attachment/mail_attachment.controller.js b/server/api/mail_attachment/mail_attachment.controller.js
index 2d24f24..7d0df2e 100644
--- a/server/api/mail_attachment/mail_attachment.controller.js
+++ b/server/api/mail_attachment/mail_attachment.controller.js
@@ -1,97 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var path = require('path');
-var fs = require('fs');
-var formidable = require('formidable');
-var Promise = require('bluebird');
-
-var config = require('../../config/environment');
-var MailAttachment = require('../../models').MailAttachment;
-
-// Get list of mailAttachments
-exports.index = function(req, res, next) {
-  return MailAttachment
-    .findAll()
-    .then(function(mailAttachments) {
-      return res.status(200).send(mailAttachments);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single mailAttachment
-exports.show = function(req, res, next) {
-  return MailAttachment
-    .findById(req.params.id)
-    .then(function(mailAttachment) {
-      return res.sendFile(mailAttachment.path);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new mailAttachment in the DB.
-exports.create = function(req, res, next) {
-  console.log(req);
-  var form = new formidable.IncomingForm();
-  form.uploadDir = path.join(config.root, 'server', 'files', 'attachments');
-  form.keepExtensions = true;
-  form.multiples = true;
-  form.hash = true;
-
-  form.parse(req, function(err, form, wrap) {
-    if (err) {
-      return res.status(500).send(err);
-    }
-    return res.status(201).send({
-      size: wrap.file.size,
-      path: wrap.file.path,
-      name: wrap.file.name,
-      type: wrap.file.type,
-      basename: path.basename(wrap.file.path)
-    });
-  });
-};
-
-// Updates an existing mailAttachment in the DB.
-exports.update = function(req, res, next) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  return MailAttachment
-    .findById(req.params.id)
-    .then(function(mailAttachment) {
-      if (!mailAttachment) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(mailAttachment, req.body);
-      return updated.save();
-    })
-    .then(function(mailAttachment) {
-      return res.status(200).send(mailAttachment);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a mailAttachment from the DB.
-exports.destroy = function(req, res, next) {
-  var unlink = Promise.promisify(require("fs").unlink);
-  var _path = path.join(config.root, 'server', 'files', 'attachments', req.params.id);
-
-  return unlink(_path)
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/mail_attachment/mail_attachment.events.js b/server/api/mail_attachment/mail_attachment.events.js
index 72cbdbb..74908fb 100644
--- a/server/api/mail_attachment/mail_attachment.events.js
+++ b/server/api/mail_attachment/mail_attachment.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const MailAttachment = require('../../models').MailAttachment;
-
-var MailAttachmentEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-MailAttachmentEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  MailAttachment.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    MailAttachmentEvents.emit(event + ':' + doc._id, doc);
-    MailAttachmentEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = MailAttachmentEvents;
\ No newline at end of file
diff --git a/server/api/mail_attachment/mail_attachment.socket.js b/server/api/mail_attachment/mail_attachment.socket.js
index 4120d58..bf413a1 100644
--- a/server/api/mail_attachment/mail_attachment.socket.js
+++ b/server/api/mail_attachment/mail_attachment.socket.js
@@ -1,28 +1 @@
-'use strict';
-
-const MailAttachmentEvents = require('./mail_attachment.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('mail_attachment:' + event, socket);
-
-    MailAttachmentEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    MailAttachmentEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/mail_disposition/index.js b/server/api/mail_disposition/index.js
index ef8de1a..3d472e3 100644
--- a/server/api/mail_disposition/index.js
+++ b/server/api/mail_disposition/index.js
@@ -1,18 +1 @@
-'use strict';
-
-var express = require('express');
-var auth = require('../../auth/auth.service');
-var controller = require('./mail_disposition.controller');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), controller.index);
-
-router.get('/:id', auth.isAuthenticated(), controller.show);
-router.post('/', auth.isAuthenticated(), controller.create);
-router.put('/:id', auth.isAuthenticated(), controller.update);
-router.patch('/:id', auth.isAuthenticated(), controller.update);
-router.delete('/:id', auth.isAuthenticated(), controller.destroy);
-
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/mail_disposition/mail_disposition.controller.js b/server/api/mail_disposition/mail_disposition.controller.js
index 193b6af..d2bb6b0 100644
--- a/server/api/mail_disposition/mail_disposition.controller.js
+++ b/server/api/mail_disposition/mail_disposition.controller.js
@@ -1,111 +1 @@
-/**
- * Using Rails-like standard naming convention for endpoints.
- * GET     /api/mail/dispositions              ->  index
- * POST    /api/mail/dispositions              ->  create
- * GET     /api/mail/dispositions/:id          ->  show
- * PUT     /api/mail/dispositions/:id          ->  update
- * DELETE  /api/mail/dispositions/:id          ->  destroy
- */
-
-'use strict';
-
-
-var _ = require('lodash');
-
-var MailDisposition = require('../../models').MailDisposition;
-
-
-function handleError(res, statusCode) {
-  statusCode = statusCode || 500;
-  return function(err) {
-    res.status(statusCode).send(err);
-  };
-}
-
-function responseWithResult(res, statusCode) {
-  statusCode = statusCode || 200;
-  return function(entity) {
-    if (entity) {
-      res.status(statusCode).json(entity);
-    }
-  };
-}
-
-function responseWithoutResult(res, statusCode) {
-  statusCode = statusCode || 200;
-  return function() {
-    res.sendStatus(statusCode);
-  };
-}
-
-function handleEntityNotFound(res) {
-  return function(entity) {
-    if (!entity) {
-      res.status(404).end();
-      return null;
-    }
-    return entity;
-  };
-}
-
-function saveUpdates(updates) {
-  return function(entity) {
-    return entity.updateAttributes(updates)
-      .then(function(updated) {
-        return updated;
-      });
-  };
-}
-
-function removeEntity(res) {
-  return function(entity) {
-    if (entity) {
-      return entity.destroy()
-        .then(function() {
-          res.status(204).end();
-        });
-    }
-  };
-}
-
-// Gets a list of MailDispositions
-exports.index = function(req, res) {
-  MailDisposition.findAndCountAll()
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Gets a single MailDisposition from the DB
-exports.show = function(req, res) {
-  MailDisposition.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Creates a new MailDisposition in the DB
-exports.create = function(req, res) {
-  MailDisposition.create(req.body)
-    .then(responseWithResult(res, 201))
-    .catch(handleError(res));
-}
-
-// Updates an existing MailDisposition in the DB
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  MailDisposition.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(saveUpdates(req.body))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Deletes a MailDisposition from the DB
-exports.destroy = function(req, res) {
-  MailDisposition.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(removeEntity(res))
-    .catch(handleError(res));
-}
\ No newline at end of file
diff --git a/server/api/mail_disposition/mail_disposition.events.js b/server/api/mail_disposition/mail_disposition.events.js
index ece78a2..a55edaf 100644
--- a/server/api/mail_disposition/mail_disposition.events.js
+++ b/server/api/mail_disposition/mail_disposition.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const MailDisposition = require('../../models').MailDisposition;
-
-var MailDispositionEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-MailDispositionEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  MailDisposition.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    MailDispositionEvents.emit(event + ':' + doc._id, doc);
-    MailDispositionEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = MailDispositionEvents;
\ No newline at end of file
diff --git a/server/api/mail_disposition/mail_disposition.socket.js b/server/api/mail_disposition/mail_disposition.socket.js
index 49ccf9a..a814814 100644
--- a/server/api/mail_disposition/mail_disposition.socket.js
+++ b/server/api/mail_disposition/mail_disposition.socket.js
@@ -1,28 +1 @@
-'use strict';
-
-const MailDispositionEvents = require('./mail_disposition.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('mail_disposition:' + event, socket);
-
-    MailDispositionEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    MailDispositionEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/mail_message/index.js b/server/api/mail_message/index.js
index 9f3d288..1b6fe26 100644
--- a/server/api/mail_message/index.js
+++ b/server/api/mail_message/index.js
@@ -1,21 +1 @@
-'use strict';
-
-var express = require('express');
-
-var controller = require('./mail_message.controller');
-var auth = require('../../auth/auth.service');
-var license = require('../../config/license/license.service');
-
-var router = express.Router();
-
-router.get('/', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin', 'agent']), controller.index);
-router.get('/describe', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.describe);
-router.get('/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin', 'agent']), controller.show);
-router.post('/', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin', 'agent']), controller.create);
-router.put('/', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin', 'agent']), controller.update);
-router.put('/delete/bulk', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.bulkDelete);
-router.put('/delete/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.update);
-router.put('/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin', 'agent']), controller.update);
-router.delete('/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin', 'agent']), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/mail_message/mail_message.controller.js b/server/api/mail_message/mail_message.controller.js
index 4a701cd..cdb6966 100644
--- a/server/api/mail_message/mail_message.controller.js
+++ b/server/api/mail_message/mail_message.controller.js
@@ -1,207 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var async = require('async');
-
-var htmlToText = require('html-to-text');
-var formidable = require('formidable');
-var moment = require('moment');
-var path = require('path');
-
-var config = require('../../config/environment');
-var sequelize = require('../../models').sequelize;
-var MailMessage = require('../../models').MailMessage;
-var MailAttachment = require('../../models').MailAttachment;
-var MailRoom = require('../../models').MailRoom;
-var MailAccount = require('../../models').MailAccount;
-var ContactEmail = require('../../models').ContactEmail;
-var Contact = require('../../models').Contact;
-var User = require('../../models').User;
-
-// Get list of mail_messages
-exports.index = function(req, res, next) {
-  var params = {
-    order: 'createdAt DESC',
-    include: [{
-      all: true,
-      include: [{
-        all: true
-      }]
-    }]
-  };
-
-  switch (req.user.role) {
-    case 'admin':
-      params.where = req.query;
-      break;
-    case 'agent':
-      break;
-    default:
-  }
-
-  return MailMessage
-    .findAll(params)
-    .then(function(mail_messages) {
-      return res.status(200).send(mail_messages);
-    })
-    .catch(function(err) {
-      return handleError(res, err, next);
-    });
-};
-
-exports.describe = function(req, res) {
-  return MailMessage
-    .describe()
-    .then(function(fields) {
-      return res.status(200).send(fields);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single mailMessage
-exports.show = function(req, res, next) {
-  return MailMessage
-    .findById(req.params.id, {
-      include: [{
-        model: MailAttachment
-      }, {
-        model: User,
-        attributes: ['id', 'name', 'fullname', 'email']
-      }]
-    })
-    .then(function(mailMessage) {
-      if (!mailMessage) {
-        return res.sendStatus(404);
-      }
-      return res.send(mailMessage);
-    })
-    .catch(function(err) {
-      return handleError(res, err, next);
-    });
-};
-
-// Creates a new mailMessage in the DB.
-exports.create = function(req, res, next) {
-  req.body.UserId = req.user.id;
-  req.body.userName = req.user.name;
-  req.body.userFullname = req.user.fullname;
-  req.body.text = req.body.text || htmlToText.fromString(req.body.html, {
-    wordwrap: false
-  });
-
-  return MailAccount
-    .findOne({
-      where: {
-        address: req.body.from[0]
-      }
-    })
-    .then(function(account) {
-      req.body.accountId = account.id;
-      req.body.accountName = account.name;
-
-      return MailRoom
-        .create({
-          from: req.body.from[0],
-          subject: req.body.subject,
-          account: account.name,
-          mailIn: 0,
-          mailOut: 1,
-          status: 'PENDING',
-          openReason: 'agent',
-          lastEvent: 'SENDING',
-          lastEventAt: moment().format('YYYY-MM-DD HH:mm:ss'),
-          MailAccountId: account.id,
-          MailMessages: [req.body]
-        }, {
-          include: [{
-            model: MailMessage,
-            include: [{
-              model: MailAttachment
-            }]
-          }]
-        });
-    })
-    .then(function(mailRoom) {
-      return res.status(201).send(mailRoom);
-    })
-    .catch(function(err) {
-      console.error(err);
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing mailMessage in the DB.
-exports.update = function(req, res, next) {
-  return MailMessage
-    .findById(req.params.id, {
-      include: [{
-        all: true
-      }]
-    })
-    .then(function(mailMessage) {
-      if (!mailMessage) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(mailMessage, req.body);
-      return updated
-        .save();
-    })
-    .then(function(updated) {
-      return res.status(200).send(updated);
-    })
-    .catch(function(err) {
-      return handleError(res, err, next);
-    });
-};
-
-// Deletes a mailMessage from the DB.
-exports.destroy = function(req, res, next) {
-  return MailMessage
-    .findById(req.params.id)
-    .then(function(mailMessage) {
-      if (!mailMessage) {
-        return res.sendStatus(404);
-      }
-      return mailMessage
-        .destroy();
-    }).then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err, next);
-    });
-};
-
-// Deletes a mailMessage from the DB.
-exports.bulkDelete = function(req, res, next) {
-  return MailMessage
-    .bulkUpdate({
-      where: {
-        id: {
-          $in: req.body.id
-        }
-      },
-      attributes: {
-        directory: 'TRASH'
-      }
-    })
-    .then(function(mailMessage) {
-      if (!mailMessage) {
-        return res.sendStatus(404);
-      }
-      return mailMessage
-        .destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err, next);
-    });
-};
-
-function handleError(res, err, next) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/mail_message/mail_message.events.js b/server/api/mail_message/mail_message.events.js
index c7fe99a..f22c411 100644
--- a/server/api/mail_message/mail_message.events.js
+++ b/server/api/mail_message/mail_message.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const MailMessage = require('../../models').MailMessage;
-
-var MailMessageEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-MailMessageEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  MailMessage.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    MailMessageEvents.emit(event + ':' + doc._id, doc);
-    MailMessageEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = MailMessageEvents;
\ No newline at end of file
diff --git a/server/api/mail_message/mail_message.socket.js b/server/api/mail_message/mail_message.socket.js
index bfe4369..d622178 100644
--- a/server/api/mail_message/mail_message.socket.js
+++ b/server/api/mail_message/mail_message.socket.js
@@ -1,28 +1 @@
-'use strict';
-
-const MailMessageEvents = require('./mail_message.events');
-
-// Model events to emit
-var events = ['save', 'save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('mail_message:' + event, socket);
-
-    MailMessageEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    MailMessageEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/mail_queue/index.js b/server/api/mail_queue/index.js
index 89fd8d9..9591cb9 100644
--- a/server/api/mail_queue/index.js
+++ b/server/api/mail_queue/index.js
@@ -1,21 +1 @@
-'use strict';
-
-var express = require('express');
-
-var controller = require('./mail_queue.controller');
-var auth = require('../../auth/auth.service');
-var license = require('../../config/license/license.service');
-
-var router = express.Router();
-
-router.get('/', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.index);
-router.get('/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.show);
-router.get('/:id/agents', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.showAgents);
-router.post('/', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.create);
-router.post('/:id/agents', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.addAgents);
-router.put('/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.update);
-router.delete('/', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.bulkDestroy);
-router.delete('/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.destroy);
-router.delete('/:id/agents', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.removeAgents);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/mail_queue/mail_queue.controller.js b/server/api/mail_queue/mail_queue.controller.js
index 8824524..297923f 100644
--- a/server/api/mail_queue/mail_queue.controller.js
+++ b/server/api/mail_queue/mail_queue.controller.js
@@ -1,235 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var util = require('util');
-var Util = require('../../config/util');
-
-var sequelize = require('../../models').sequelize;
-
-var MailQueue = require('../../models').MailQueue;
-var User = require('../../models').User;
-var UserHasMailQueue = require('../../models').UserHasMailQueue;
-
-// Get list of mailQueues
-exports.index = function(req, res) {
-  switch (req.user.role) {
-    case 'user':
-      return User
-        .findById(req.user.id, {
-          attributes: ['id']
-        })
-        .then(Util.getMailQueuesIdByUser(req.query))
-        .then(function(result) {
-          res.status(200).send(result);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-
-    default:
-      return MailQueue
-        .scope('default')
-        .findAndCountAll(_.merge(Util.getQuery(req.query), {
-          distinct: true
-        }))
-        .then(function(result) {
-          res.status(200).send(result);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-  }
-};
-
-// Get a single mailQueue
-exports.show = function(req, res) {
-  return MailQueue
-    .scope('default')
-    .findById(req.params.id)
-    .then(function(mailQueue) {
-      if (!mailQueue) {
-        return res.sendStatus(404);
-      }
-      return res.send(mailQueue);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new mailQueue in the DB.
-exports.create = function(req, res) {
-  var _mailQueue;
-
-  return MailQueue
-    .create(req.body)
-    .then(function(mailQueue) {
-      _mailQueue = mailQueue;
-
-      if (req.body.agents) {
-        return _mailQueue
-          .addUsers(req.body.agents, {
-            penalty: req.body.penalty || 0,
-            queue: _mailQueue.name
-          });
-      }
-    })
-    .then(function() {
-      return res.status(201).send(_mailQueue);
-    })
-    .catch(sequelize.UniqueConstraintError, function(err) {
-      return Util.errorManager.handleUniqueConstraintError(res, err);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing mailQueue in the DB.
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  return MailQueue
-    .findById(req.params.id)
-    .then(function(mailQueue) {
-      if (!mailQueue) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(mailQueue, req.body);
-      return updated
-        .save();
-    })
-    .then(function(mailQueue) {
-      return res.status(200).send(mailQueue);
-    })
-    .catch(sequelize.UniqueConstraintError, function(err) {
-      return Util.errorManager.handleUniqueConstraintError(res, err);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing user_has_mailQueue in the DB.
-exports.addAgents = function(req, res, next) {
-  return MailQueue
-    .findById(req.params.id)
-    .then(function(mailQueue) {
-      if (!mailQueue) {
-        return res.sendStatus(404);
-      }
-      var userHasMailQueues = _.map(req.body.agents, function(agent) {
-        return {
-          UserId: agent,
-          penalty: req.body.penalty,
-          MailQueueId: mailQueue.id,
-          queue: mailQueue.name
-        };
-      });
-
-      return UserHasMailQueue
-        .bulkCreate(userHasMailQueues, {
-          individualHooks: true
-        });
-    })
-    .then(function() {
-      return res.sendStatus(200);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.removeAgents = function(req, res) {
-  return MailQueue
-    .findById(req.params.id)
-    .then(function(queue) {
-      if (!queue) {
-        return res.sendStatus(404);
-      }
-      return queue
-        .removeUsers(req.query.agents, {
-          individualHooks: true
-        });
-    })
-    .then(function() {
-      return res.sendStatus(200);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a mailQueue from the DB.
-exports.destroy = function(req, res) {
-  var _mailQueue;
-
-  return MailQueue
-    .findById(req.params.id)
-    .then(function(mailQueue) {
-      _mailQueue = mailQueue;
-      if (!mailQueue) {
-        return res.sendStatus(404);
-      }
-      return mailQueue
-        .destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(sequelize.ForeignKeyConstraintError, function(err) {
-      return Util.errorManager.handleForeignKeyConstraintError(res, 'queue', _mailQueue.name, err);
-    })
-    .catch(function(err) {
-      console.error('err', err);
-      return handleError(res, err);
-    });
-};
-
-// Deletes a agent from the DB.
-exports.bulkDestroy = function(req, res) {
-  return MailQueue
-    .destroy({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.showAgents = function(req, res) {
-  return MailQueue
-    .findById(req.params.id)
-    .then(function(queue) {
-      if (!queue) {
-        return res.sendStatus(404);
-      }
-      return queue
-        .getUsers({
-          where: {
-            role: 'agent'
-          },
-          attributes: ['id', 'name', 'fullname', 'email']
-        });
-    })
-    .then(function(agents) {
-      return res.status(200).send({
-        rows: agents,
-        count: agents.length
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/mail_queue/mail_queue.events.js b/server/api/mail_queue/mail_queue.events.js
index 7f926cc..071f0c1 100644
--- a/server/api/mail_queue/mail_queue.events.js
+++ b/server/api/mail_queue/mail_queue.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const MailQueue = require('../../models').MailQueue;
-
-var MailQueueEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-MailQueueEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  MailQueue.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    MailQueueEvents.emit(event + ':' + doc._id, doc);
-    MailQueueEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = MailQueueEvents;
\ No newline at end of file
diff --git a/server/api/mail_queue/mail_queue.socket.js b/server/api/mail_queue/mail_queue.socket.js
index dca86ad..defa06a 100644
--- a/server/api/mail_queue/mail_queue.socket.js
+++ b/server/api/mail_queue/mail_queue.socket.js
@@ -1,28 +1 @@
-'use strict';
-
-const MailQueueEvents = require('./mail_queue.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('mail_queue:' + event, socket);
-
-    MailQueueEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    MailQueueEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/mail_room/index.js b/server/api/mail_room/index.js
index 376f392..3a1de38 100644
--- a/server/api/mail_room/index.js
+++ b/server/api/mail_room/index.js
@@ -1,32 +1 @@
-'use strict';
-
-var express = require('express');
-
-var controller = require('./mail_room.controller');
-var auth = require('../../auth/auth.service');
-var license = require('../../config/license/license.service');
-
-var router = express.Router();
-
-// TODO endpoint to filter just NEW/OPEN
-router.get('/', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.index);
-router.get('/inbox', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin', 'agent']), controller.inbox);
-router.get('/describe', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.describe);
-router.get('/pending', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9, 17], ['admin']), controller.pending);
-router.get('/new', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9, 17], ['admin']), controller.new);
-router.get('/open', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9, 17], ['admin']), controller.open);
-router.get('/closed', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9, 17], ['admin']), controller.closed);
-router.get('/agent/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.agentIndex);
-router.get('/messages/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin', 'agent']), controller.getRoomByMessage);
-router.get('/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin', 'user', 'agent']), controller.show);
-router.get('/:id/agents', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin', 'agent']), controller.showAgents);
-router.post('/', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.create);
-router.post('/:id/messages/send', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin', 'agent']), controller.sendMessage);
-// router.post('/:id/messages/receive', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin', 'agent']), controller.receiveMessage);
-router.put('/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin', 'agent']), controller.update);
-router.patch('/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin', 'agent']), controller.updatePatch);
-router.put('/:id/agents', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin', 'agent']), controller.updateAgents);
-router.delete('/', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.bulkDestroy);
-router.delete('/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/mail_room/mail_room.controller.js b/server/api/mail_room/mail_room.controller.js
index 4d07489..e47c930 100644
--- a/server/api/mail_room/mail_room.controller.js
+++ b/server/api/mail_room/mail_room.controller.js
@@ -1,479 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var util = require('util');
-var htmlToText = require('html-to-text');
-
-var Util = require('../../config/util');
-var moment = require('moment');
-
-var sequelize = require('../../models').sequelize;
-var User = require('../../models').User;
-var Agent = require('../../models').User;
-var Contact = require('../../models').Contact;
-var Status = require('../../models').MailRoomStatus;
-var MailRoom = require('../../models').MailRoom;
-var MailMessage = require('../../models').MailMessage;
-var MailAccount = require('../../models').MailAccount;
-var MailApplication = require('../../models').MailApplication;
-var MailQueue = require('../../models').MailQueue;
-var MailAttachment = require('../../models').MailAttachment;
-
-// Get list of mailRooms
-exports.index = function(req, res, next) {
-  return MailRoom
-    .scope('default')
-    .findAndCountAll(Util.getQuery(req.query))
-    .then(function(result) {
-      return res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get list of fields
-exports.describe = function(req, res) {
-  return MailRoom
-    .describe()
-    .then(function(fields) {
-      return res.status(200).send(fields);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function getMailQueues(user) {
-  return function() {
-    switch (user.role) {
-      case 'user':
-        return User
-          .findById(user.id, {
-            attributes: ['id']
-          })
-          .then(Util.getMailQueuesIdByUser({}, {
-            attributes: ['id']
-          }))
-          .then(function(userQueues) {
-            return {
-              include: {
-                model: MailAccount,
-                include: {
-                  model: MailApplication,
-                  include: {
-                    model: MailQueue,
-                    where: {
-                      id: _.map(userQueues, 'id')
-                    }
-                  }
-                }
-              }
-            };
-          });
-      default:
-        return {};
-    }
-  }
-}
-
-exports.pending = function(req, res) {
-  return Promise
-    .all([])
-    .then(getMailQueues(req.user))
-    .then(function(condition) {
-      return MailRoom
-        .count(_.merge(Util.getQuery(req.query, {
-          status: 'PENDING',
-          updatedAt: {
-            $gte: moment().startOf('day')
-          }
-        }), condition));
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-exports.new = function(req, res) {
-  return Promise
-    .all([])
-    .then(getMailQueues(req.user))
-    .then(function(condition) {
-      return MailRoom
-        .count(_.merge(Util.getQuery(req.query, {
-          status: 'NEW',
-          updatedAt: {
-            $gte: moment().startOf('day')
-          }
-        }), condition));
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-exports.open = function(req, res) {
-  return Promise
-    .all([])
-    .then(getMailQueues(req.user))
-    .then(function(condition) {
-      return MailRoom
-        .count(_.merge(Util.getQuery(req.query, {
-          status: 'OPEN',
-          updatedAt: {
-            $gte: moment().startOf('day')
-          }
-        }), condition));
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-exports.closed = function(req, res) {
-  return Promise
-    .all([])
-    .then(getMailQueues(req.user))
-    .then(function(condition) {
-      return MailRoom
-        .count(_.merge(Util.getQuery(req.query, {
-          status: 'CLOSED',
-          updatedAt: {
-            $gte: moment().startOf('day')
-          }
-        }), condition));
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-exports.inbox = function(req, res, next) {
-  switch (req.user.role) {
-    case 'agent':
-
-      return sequelize.query(
-          'SELECT `MailRoom`.`id`, `MailRoom`.`subject`, `MailRoom`.`from`, `MailRoom`.`account`, `MailRoom`.`status`, `MailRoom`.`lastEvent`, `MailRoom`.`updatedAt` FROM `mail_rooms` AS `MailRoom` LEFT OUTER JOIN (`user_has_mail_rooms` AS `Users.user_has_mail_rooms` INNER JOIN `users` AS `Users` ON `Users`.`id` = `Users.user_has_mail_rooms`.`UserId`) ON `MailRoom`.`id` = `Users.user_has_mail_rooms`.`MailRoomId` WHERE (`MailRoom`.`deletedAt` IS NULL AND (`MailRoom`.`status` = :status OR `Users`.`id` = :id))', {
-            replacements: {
-              status: 'UNMANAGED',
-              id: req.user.id
-            },
-            type: sequelize.QueryTypes.SELECT
-          })
-        .then(function(result) {
-          return res.status(200).send(result);
-        })
-        .catch(function(err) {
-          console.error(err);
-          return handleError(res, err);
-        });
-
-    default:
-
-      return sequelize.query(
-          'SELECT `id`, `subject`, `from`, `account`, `status`, `lastEvent` ,`updatedAt` FROM `mail_rooms` WHERE `mail_rooms`.`deletedAt` IS NULL', {
-            replacements: {
-              status: 'UNMANAGED',
-              id: req.user.id
-            },
-            type: sequelize.QueryTypes.SELECT
-          })
-        .then(function(result) {
-          return res.status(200).send(result);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-  }
-};
-
-// Get list of agent mailRooms
-exports.agentIndex = function(req, res, next) {
-  return MailRoom
-    .findAll({
-      where: {
-        UserId: req.params.id
-      },
-      include: [{
-        all: true
-      }]
-    })
-    .then(function(mailRooms) {
-      return res.status(200).send(mailRooms);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get list of agent mailRooms
-exports.updateRoomStatus = function(req, res, next) {
-  var _mailRoom;
-  var _promises = [];
-
-  console.log(req.body);
-  console.log(req.params);
-
-  return MailRoom
-    .update(req.body, {
-      where: {
-        id: req.params.id.split(',')
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return Status
-        .bulkCreate(_.map(req.params.id.split(','), function(id) {
-          return {
-            status: req.body.status,
-            data1: req.user.name,
-            data2: req.user.fullname,
-            MailRoomId: id,
-            UserId: req.user.id
-          }
-        }));
-    })
-    .then(function(mailRooms) {
-      return res.sendStatus(200);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.getRoomByMessage = function(req, res, next) {
-  return MailMessage
-    .findById(req.params.id)
-    .then(function(mailMessage) {
-      return mailMessage
-        .getMailRoom({
-          include: [{
-            model: MailAccount
-          }, {
-            model: MailMessage,
-            include: [{
-              model: MailAttachment
-            }, {
-              model: User,
-              attributes: ['id', 'name', 'fullname', 'email']
-            }]
-          }, {
-            model: User,
-            attributes: ['id', 'name', 'fullname', 'email']
-          }]
-        });
-    })
-    .then(function(mailRoom) {
-      return res.send(mailRoom);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single mailRoom
-exports.show = function(req, res, next) {
-  return MailRoom
-    .scope('default')
-    .findById(req.params.id)
-    .then(function(mailRoom) {
-      if (!mailRoom) {
-        return res.sendStatus(404);
-      }
-      return res.send(mailRoom);
-    })
-    .catch(function(err) {
-      console.error(err);
-      return handleError(res, err);
-    });
-};
-
-// Get a single mailRoom
-exports.showAgents = function(req, res, next) {
-  return MailRoom
-    .findById(req.params.id)
-    .then(function(mailRoom) {
-      if (!mailRoom) {
-        return res.sendStatus(404);
-      }
-
-      return mailRoom
-        .getUsers({
-          attributes: ['id', 'name', 'fullname', 'email', 'role', 'internal']
-        });
-    })
-    .then(function(users) {
-      return res.send(users);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new mailRoom in the DB.
-exports.create = function(req, res, next) {
-  return MailRoom
-    .create(req.body)
-    .then(function(mailRoom) {
-      return res.status(201).send(mailRoom);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new mailMessage in the DB.
-exports.sendMessage = function(req, res, next) {
-  req.body.UserId = req.user.id;
-  req.body.MailRoomId = req.params.id;
-  req.body.attachment = (req.body.MailAttachments && req.body.MailAttachments.length) ? true : false;
-  req.body.text = req.body.text || htmlToText.fromString(req.body.html, {
-    wordwrap: false
-  });
-  return MailMessage
-    .create(req.body, {
-      include: [{
-        model: MailAttachment
-      }],
-      user: req.user
-    })
-    .then(function(mailMessage) {
-      return res.status(201).send(mailMessage);
-
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing mailRoom in the DB.
-exports.update = function(req, res, next) {
-  return MailRoom
-    .findById(req.params.id)
-    .then(function(mailRoom) {
-      if (!mailRoom) {
-        return res.sendStatus(404);
-      }
-
-      return mailRoom
-        .update(req.body);
-    })
-    .then(function(mailRoom) {
-      return res.status(200).send(mailRoom);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing mailRoom in the DB.
-exports.updatePatch = function(req, res, next) {
-  var _options = {
-    where: {
-      id: req.params.id.split(',')
-    },
-    user: req.user,
-    individualHooks: true
-  };
-
-  return MailRoom
-    .update(req.body, _options)
-    .then(function(mailRooms) {
-      if (!mailRooms) {
-        return res.sendStatus(404);
-      }
-      return mailRooms
-    })
-    .then(function(mailRooms) {
-      return res.sendStatus(200);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single mailRoom
-exports.updateAgents = function(req, res, next) {
-  return MailRoom
-    .findById(req.params.id)
-    .then(function(mailRoom) {
-      if (!mailRoom) {
-        return res.sendStatus(404);
-      }
-
-      return mailRoom
-        .setUsers(req.body.agents, {
-          individualHooks: true
-        });
-    })
-    .then(function() {
-      return res.sendStatus(200);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a mailRoom from the DB.
-exports.destroy = function(req, res, next) {
-  return MailRoom
-    .findById(req.params.id)
-    .then(function(mailRoom) {
-      if (!mailRoom) {
-        return res.sendStatus(404);
-      }
-      return mailRoom.destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a agent from the DB.
-exports.bulkDestroy = function(req, res) {
-  return MailRoom
-    .destroy({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return res.sendStatus(200);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/mail_room/mail_room.events.js b/server/api/mail_room/mail_room.events.js
index b0fc25b..3dd0bec 100644
--- a/server/api/mail_room/mail_room.events.js
+++ b/server/api/mail_room/mail_room.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const MailRoom = require('../../models').MailRoom;
-
-var MailRoomEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-MailRoomEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  MailRoom.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    MailRoomEvents.emit(event + ':' + doc._id, doc);
-    MailRoomEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = MailRoomEvents;
\ No newline at end of file
diff --git a/server/api/mail_room/mail_room.socket.js b/server/api/mail_room/mail_room.socket.js
index 9d2aefc..897340b 100644
--- a/server/api/mail_room/mail_room.socket.js
+++ b/server/api/mail_room/mail_room.socket.js
@@ -1,28 +1 @@
-'use strict';
-
-const MailRoomEvents = require('./mail_room.events');
-
-// Model events to emit
-var events = ['save', 'save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('mail_room:' + event, socket);
-
-    MailRoomEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    MailRoomEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/mail_server_in/index.js b/server/api/mail_server_in/index.js
index 58902a3..c7fe693 100644
--- a/server/api/mail_server_in/index.js
+++ b/server/api/mail_server_in/index.js
@@ -1,17 +1 @@
-'use strict';
-
-var express = require('express');
-
-var controller = require('./mail_server_in.controller');
-var auth = require('../../auth/auth.service');
-var license = require('../../config/license/license.service');
-
-var router = express.Router();
-
-router.get('/', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.index);
-router.get('/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.show);
-router.post('/', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.create);
-router.put('/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.update);
-router.delete('/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/mail_server_in/mail_server_in.controller.js b/server/api/mail_server_in/mail_server_in.controller.js
index 27fda21..c86a1f0 100644
--- a/server/api/mail_server_in/mail_server_in.controller.js
+++ b/server/api/mail_server_in/mail_server_in.controller.js
@@ -1,96 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var Util = require('../../config/util');
-
-var sequelize = require('../../models').sequelize;
-var MailServerIn = require('../../models').MailServerIn;
-
-// Get list of mail_server_ins
-exports.index = function(req, res) {
-  return MailServerIn
-    .findAll()
-    .then(function(mail_server_ins) {
-      return res.status(200).send(mail_server_ins);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single mailServerIn
-exports.show = function(req, res) {
-  return MailServerIn
-    .findById(req.params.id)
-    .then(function(mailServerIn) {
-      if (!mailServerIn) {
-        return res.sendStatus(404);
-      }
-      return res.send(mailServerIn);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new mailServerIn in the DB.
-exports.create = function(req, res) {
-  return MailServerIn
-    .create(req.body)
-    .then(function(mailServerIn) {
-      return res.status(201).send(mailServerIn);
-    })
-    .catch(sequelize.UniqueConstraintError, function(err) {
-      return Util.errorManager.handleUniqueConstraintError(res, err);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing mailServerIn in the DB.
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-
-  return MailServerIn
-    .findById(req.params.id)
-    .then(function(mailServerIn) {
-      if (!mailServerIn) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(mailServerIn, req.body);
-      return updated
-        .save();
-    })
-    .then(function(mailServerIn) {
-      return res.status(200).send(mailServerIn);
-    })
-    .catch(sequelize.UniqueConstraintError, function(err) {
-      return Util.errorManager.handleUniqueConstraintError(res, err);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a mailServerIn from the DB.
-exports.destroy = function(req, res) {
-  return MailServerIn
-    .findById(req.params.id)
-    .then(function(mailServerIn) {
-      if (!mailServerIn) {
-        return res.sendStatus(404);
-      }
-      return mailServerIn
-        .destroy();
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/mail_server_in/mail_server_in.events.js b/server/api/mail_server_in/mail_server_in.events.js
index 540e207..7d88cd7 100644
--- a/server/api/mail_server_in/mail_server_in.events.js
+++ b/server/api/mail_server_in/mail_server_in.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const MailServerIn = require('../../models').MailServerIn;
-
-var MailServerInEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-MailServerInEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  MailServerIn.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    MailServerInEvents.emit(event + ':' + doc._id, doc);
-    MailServerInEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = MailServerInEvents;
\ No newline at end of file
diff --git a/server/api/mail_server_in/mail_server_in.socket.js b/server/api/mail_server_in/mail_server_in.socket.js
index b6bcc34..ae1c658 100644
--- a/server/api/mail_server_in/mail_server_in.socket.js
+++ b/server/api/mail_server_in/mail_server_in.socket.js
@@ -1,42 +1 @@
-'use strict';
-
-const MailServerInEvents = require('./mail_server_in.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('mail_server_in:' + event, socket);
-
-    MailServerInEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    switch (event) {
-      case 'mail_server_in:save':
-        if (doc.changed('state')) {
-          socket.emit('mail_server_in:state', doc);
-        } else {
-          socket.emit('mail_server_in:save', doc);
-        }
-        break;
-
-      case 'mail_server_in:remove':
-        socket.emit(event, doc);
-        break;
-
-      default:
-    }
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    MailServerInEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/mail_server_out/index.js b/server/api/mail_server_out/index.js
index 323abb4..c513199 100644
--- a/server/api/mail_server_out/index.js
+++ b/server/api/mail_server_out/index.js
@@ -1,19 +1 @@
-'use strict';
-
-var express = require('express');
-
-var controller = require('./mail_server_out.controller');
-var auth = require('../../auth/auth.service');
-var license = require('../../config/license/license.service');
-
-var router = express.Router();
-
-router.get('/', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.index);
-router.get('/service', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.indexService);
-router.get('/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.show);
-router.get('/:id/test', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.test);
-router.post('/', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.create);
-router.put('/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.update);
-router.delete('/:id', license.isValidDate(), license.hasMail(), auth.isAuthenticated(), auth.hasModule([9], ['admin']), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/mail_server_out/mail_server_out.controller.js b/server/api/mail_server_out/mail_server_out.controller.js
index 00117cf..a121001 100644
--- a/server/api/mail_server_out/mail_server_out.controller.js
+++ b/server/api/mail_server_out/mail_server_out.controller.js
@@ -1,157 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var MailServerOut = require('../../models').MailServerOut;
-var MailMessage = require('../../models').MailMessage;
-var MailAccount = require('../../models').MailAccount;
-var sequelize = require('../../models').sequelize;
-var Util = require('../../config/util');
-
-// Get list of mailServerOuts
-exports.index = function(req, res, next) {
-  return MailServerOut
-    .findAndCountAll(Util.getQuery(req.query))
-    .then(function(result) {
-      return res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.indexService = function(req, res) {
-  return MailServerOut
-    .findOne({
-      where: {
-        service: true
-      }
-    })
-    .then(function(mailServerOut) {
-      if (!mailServerOut) {
-        throw new Error("Mail service account not found.");
-      }
-
-      return res.status(200).send(mailServerOut);
-    })
-    .catch(function(err) {
-      return handleError(res, {
-        message: err.message
-      });
-    });
-};
-
-// Get a single mailServerOut
-exports.show = function(req, res) {
-  return MailServerOut
-    .findById(req.params.id)
-    .then(function(mailServerOut) {
-      if (!mailServerOut) {
-        return res.sendStatus(404);
-      }
-      return res.send(mailServerOut);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single mailAccount
-exports.showCustom = function(req, res, next) {
-  return MailAccount
-    .findOne({
-      where: {
-        custom: true
-      }
-    })
-    .then(function(mailAccount) {
-      if (!mailAccount) {
-        return res.sendStatus(404);
-      }
-      return res.send(mailAccount);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new mailServerOut in the DB.
-exports.create = function(req, res) {
-  return MailServerOut
-    .create(req.body)
-    .then(function(mailServerOut) {
-      return res.status(201).send(mailServerOut);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing mailServerOut in the DB.
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-
-  req.body.state = 'CONNECTING';
-
-  return MailServerOut
-    .findById(req.params.id)
-    .then(function(mailServerOut) {
-      if (!mailServerOut) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(mailServerOut, req.body);
-      return updated
-        .save();
-    })
-    .then(function(mailServerOut) {
-      return res.status(200).send(mailServerOut);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a mailServerOut from the DB.
-exports.destroy = function(req, res) {
-  return MailServerOut
-    .findById(req.params.id)
-    .then(function(mailServerOut) {
-      if (!mailServerOut) {
-        return res.sendStatus(404);
-      }
-
-      return mailServerOut
-        .destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.test = function(req, res) {
-  var _mailServerOut;
-  var _mailMessage;
-
-  return MailServerOut
-    .findById(req.params.id)
-    .then(function(mailServerOut) {
-      if (!mailServerOut) {
-        return res.sendStatus(404);
-      }
-      return mailServerOut
-        .update({
-          state: 'CONNECTING',
-        });
-    })
-    .then(function() {
-      return res.status(201).send(_mailMessage);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/mail_server_out/mail_server_out.events.js b/server/api/mail_server_out/mail_server_out.events.js
index 997dd0f..7a17691 100644
--- a/server/api/mail_server_out/mail_server_out.events.js
+++ b/server/api/mail_server_out/mail_server_out.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const MailServerOut = require('../../models').MailServerOut;
-
-var MailServerOutEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-MailServerOutEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  MailServerOut.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    MailServerOutEvents.emit(event + ':' + doc._id, doc);
-    MailServerOutEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = MailServerOutEvents;
\ No newline at end of file
diff --git a/server/api/mail_server_out/mail_server_out.socket.js b/server/api/mail_server_out/mail_server_out.socket.js
index 4b7bf76..72ef89b 100644
--- a/server/api/mail_server_out/mail_server_out.socket.js
+++ b/server/api/mail_server_out/mail_server_out.socket.js
@@ -1,42 +1 @@
-'use strict';
-
-const MailServerOutEvents = require('./mail_server_out.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('mail_server_out:' + event, socket);
-
-    MailServerOutEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    switch (event) {
-      case 'mail_server_out:save':
-        if (doc.changed('state')) {
-          socket.emit('mail_server_out:state', doc);
-        } else {
-          socket.emit('mail_server_out:save', doc);
-        }
-        break;
-
-      case 'mail_server_out:remove':
-        socket.emit(event, doc);
-        break;
-
-      default:
-    }
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    MailServerOutEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/metric/index.js b/server/api/metric/index.js
index b802bb1..b79ddf5 100644
--- a/server/api/metric/index.js
+++ b/server/api/metric/index.js
@@ -1,18 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./metric.controller');
-var auth = require('../../auth/auth.service');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.index);
-router.get('/table', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.getMetricsByTable);
-router.get('/:id', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.show);
-router.post('/', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.create);
-router.put('/:id', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.update);
-router.patch('/:id', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.update);
-router.delete('/', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.bulkDestroy);
-router.delete('/:id', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/metric/metric.controller.js b/server/api/metric/metric.controller.js
index 0b82a6a..5646011 100644
--- a/server/api/metric/metric.controller.js
+++ b/server/api/metric/metric.controller.js
@@ -1,135 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var Metric = require('../../models').Metric;
-var util = require('util');
-var Util = require('../../config/util');
-var sequelize = require('../../models').sequelize;
-
-// Get list of metrics
-exports.index = function(req, res, next) {
-  return Metric
-    .findAndCountAll(Util.getQuery(req.query))
-    .then(function(result) {
-      return res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.getMetricsByTable = function(req, res) {
-  return Metric
-    .findAll({
-      where: {
-        table: req.query.table
-      }
-    })
-    .then(function(metrics) {
-      if (!metrics) {
-        return res.sendStatus(404);
-      }
-      return res.status(200).send({
-        count: metrics.length,
-        rows: metrics
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single metric
-exports.show = function(req, res) {
-  return Metric
-    .findById(req.params.id)
-    .then(function(metric) {
-      if (!metric) {
-        return res.sendStatus(404);
-      }
-      return res.send(metric);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new metric in the DB.
-exports.create = function(req, res) {
-  return Metric
-    .create(req.body)
-    .then(function(metric) {
-      return res.status(201).send(metric);
-    })
-    .catch(sequelize.UniqueConstraintError, function(err) {
-      err.translatedMessage = 'MESSAGE_EXIST_METRIC';
-      err.message = 'A Metric with that name already exists';
-      return res.status(500).send(err);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing metric in the DB.
-exports.update = function(req, res) {
-  return Metric
-    .findById(req.params.id)
-    .then(function(metric) {
-      if (!metric) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(metric, req.body);
-      return updated.save();
-    })
-    .then(function() {
-      return res.sendStatus(200);
-    })
-    .catch(sequelize.UniqueConstraintError, function(err) {
-      err.translatedMessage = 'MESSAGE_EXIST_METRIC';
-      err.message = 'A Metric with that name already exists';
-      return res.status(500).send(err);
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-// Deletes a metric from the DB.
-exports.destroy = function(req, res) {
-  return Metric
-    .findById(req.params.id)
-    .then(function(metric) {
-      if (!metric) {
-        return res.sendStatus(404);
-      }
-      return metric.destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.bulkDestroy = function(req, res) {
-  return Metric
-    .destroy({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/metric/metric.events.js b/server/api/metric/metric.events.js
index 6aa5669..20c00d4 100644
--- a/server/api/metric/metric.events.js
+++ b/server/api/metric/metric.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const Metric = require('../../models').Metric;
-
-var MetricEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-MetricEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'update',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  Metric.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    MetricEvents.emit(event + ':' + doc._id, doc);
-    MetricEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = MetricEvents;
\ No newline at end of file
diff --git a/server/api/metric/metric.socket.js b/server/api/metric/metric.socket.js
index 80e152f..691cab6 100644
--- a/server/api/metric/metric.socket.js
+++ b/server/api/metric/metric.socket.js
@@ -1,54 +1 @@
-'use strict';
-
-const MetricEvents = require('./metric.events');
-const ReportField = require('../../models').ReportField;
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('metric:' + event, socket);
-
-    MetricEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    switch (event) {
-      case 'metric:save':
-        socket.emit(event, doc);
-        break;
-      case 'metric:update':
-        updateFields(doc);
-        break;
-      case 'metric:remove':
-        socket.emit(event, doc);
-        break;
-
-      default:
-    }
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    MetricEvents.removeListener(event, listener);
-  };
-}
-
-function updateFields(doc) {
-  return ReportField.update({
-      field: doc.metric
-    }, {
-      where: {
-        MetricId: doc.id
-      }
-    })
-    .catch(function(err) {
-      console.log(err);
-    });
-}
\ No newline at end of file
diff --git a/server/api/module/index.js b/server/api/module/index.js
index b57548b..44c6130 100644
--- a/server/api/module/index.js
+++ b/server/api/module/index.js
@@ -1,11 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./module.controller');
-var auth = require('../../auth/auth.service');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), auth.hasRole('admin'), controller.index);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/module/module.controller.js b/server/api/module/module.controller.js
index 5ccc934..14cfe9f 100644
--- a/server/api/module/module.controller.js
+++ b/server/api/module/module.controller.js
@@ -1,28 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var Module = require('../../models').Module;
-var util = require('util');
-var Util = require('../../config/util');
-var sequelize = require('../../models').sequelize;
-
-// Get list of modules
-exports.index = function(req, res, next) {
-  return Module
-    // .findAndCountAll(Util.getQuery(req.query))
-    .findAndCountAll({
-      include: [{
-        all: true
-      }]
-    })
-    .then(function(result) {
-      return res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/module/module.events.js b/server/api/module/module.events.js
index 2dbb456..d292484 100644
--- a/server/api/module/module.events.js
+++ b/server/api/module/module.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const Module = require('../../models').Module;
-
-var ModuleEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-ModuleEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  Module.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    ModuleEvents.emit(event + ':' + doc._id, doc);
-    ModuleEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = ModuleEvents;
\ No newline at end of file
diff --git a/server/api/module/module.socket.js b/server/api/module/module.socket.js
index ebccd0c..a1a7669 100644
--- a/server/api/module/module.socket.js
+++ b/server/api/module/module.socket.js
@@ -1,28 +1 @@
-'use strict';
-
-const ModuleEvents = require('./module.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('module:' + event, socket);
-
-    ModuleEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    ModuleEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/motionbar/index.js b/server/api/motionbar/index.js
index fd9d420..aa013b2 100644
--- a/server/api/motionbar/index.js
+++ b/server/api/motionbar/index.js
@@ -1,11 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./motionbar.controller');
-var auth = require('../../auth/auth.service');
-
-var router = express.Router();
-
-router.get('/:action/:state', auth.isAuthenticated(), controller.action);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/motionbar/motionbar.controller.js b/server/api/motionbar/motionbar.controller.js
index 275d338..16da23f 100644
--- a/server/api/motionbar/motionbar.controller.js
+++ b/server/api/motionbar/motionbar.controller.js
@@ -1,32 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var Motionbar = require('../../models').Motionbar;
-
-// Get list of motionbars
-exports.action = function(req, res) {
-
-  if (!req.query.userId) {
-    return handleError(res, {
-      message: 'Use userId'
-    });
-  }
-
-  req.body.UserId = parseInt(req.query.userId, 10);
-  req.body.action = req.params.action;
-  req.body.state = req.params.state;
-  req.body.AdminId = req.user.id;
-
-  return Motionbar
-    .create(req.body)
-    .then(function(action) {
-      return res.status(201).send(action);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/motionbar/motionbar.events.js b/server/api/motionbar/motionbar.events.js
index f84fb17..b406f62 100644
--- a/server/api/motionbar/motionbar.events.js
+++ b/server/api/motionbar/motionbar.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const Motionbar = require('../../models').Motionbar;
-
-var MotionbarEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-MotionbarEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  Motionbar.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    MotionbarEvents.emit(event + ':' + doc._id, doc);
-    MotionbarEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = MotionbarEvents;
\ No newline at end of file
diff --git a/server/api/motionbar/motionbar.socket.js b/server/api/motionbar/motionbar.socket.js
index cf3aa56..dd0d0d6 100644
--- a/server/api/motionbar/motionbar.socket.js
+++ b/server/api/motionbar/motionbar.socket.js
@@ -1,30 +1 @@
-'use strict';
-
-const MotionbarEvents = require('./motionbar.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('motionbar:' + event, socket);
-
-    MotionbarEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    if (socket.userId == doc.UserId) {
-      socket.emit(event, doc);
-    }
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    MotionbarEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/network_externip/index.js b/server/api/network_externip/index.js
index c9daa97..37ff1ee 100644
--- a/server/api/network_externip/index.js
+++ b/server/api/network_externip/index.js
@@ -1,16 +1 @@
-'use strict';
-
-var express = require('express');
-var auth = require('../../auth/auth.service');
-var controller = require('./network_externip.controller');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), auth.hasRole('admin'), controller.index);
-router.get('/:id', auth.isAuthenticated(), auth.hasRole('admin'), controller.show);
-router.post('/', auth.isAuthenticated(), auth.hasRole('admin'), controller.create);
-router.put('/:id', auth.isAuthenticated(), auth.hasRole('admin'), controller.update);
-router.delete('/', auth.isAuthenticated(), auth.hasRole('admin'), controller.bulkDestroy);
-router.delete('/:id', auth.isAuthenticated(), auth.hasRole('admin'), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/network_externip/network_externip.controller.js b/server/api/network_externip/network_externip.controller.js
index ecde7da..0fe6739 100644
--- a/server/api/network_externip/network_externip.controller.js
+++ b/server/api/network_externip/network_externip.controller.js
@@ -1,131 +1 @@
-/**
- * Using Rails-like standard naming convention for endpoints.
- * GET     /api/network/externips              ->  index
- * POST    /api/network/externips              ->  create
- * GET     /api/network/externips/:id          ->  show
- * PUT     /api/network/externips/:id          ->  update
- * DELETE  /api/network/externips/:id          ->  destroy
- */
-
-'use strict';
-
-
-var _ = require('lodash');
-var Util = require('../../config/util');
-
-var NetworkExternip = require('../../models').Network;
-
-
-function handleError(res, statusCode) {
-  statusCode = statusCode || 500;
-  return function(err) {
-    res.status(statusCode).send(err);
-  };
-}
-
-function responseWithResult(res, statusCode) {
-  statusCode = statusCode || 200;
-  return function(entity) {
-    if (entity) {
-      res.status(statusCode).json(entity);
-    }
-  };
-}
-
-function responseWithoutResult(res, statusCode) {
-  statusCode = statusCode || 204;
-  return function() {
-    res.sendStatus(statusCode);
-  };
-}
-
-function handleEntityNotFound(res) {
-  return function(entity) {
-    if (!entity) {
-      res.status(404).end();
-      return null;
-    }
-    return entity;
-  };
-}
-
-function saveUpdates(updates) {
-  return function(entity) {
-    return entity.updateAttributes(updates)
-      .then(function(updated) {
-        return updated;
-      });
-  };
-}
-
-function removeEntity(res) {
-  return function(entity) {
-    if (entity) {
-      return entity.destroy()
-        .then(function() {
-          res.status(204).end();
-        });
-    }
-  };
-}
-
-// Gets a list of NetworkExternips
-exports.index = function(req, res) {
-  return NetworkExternip
-    .scope('externip')
-    .findAndCountAll(Util.getQuery(req.query))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Gets a single NetworkExternip from the DB
-exports.show = function(req, res) {
-  return NetworkExternip
-    .findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Creates a new NetworkExternip in the DB
-exports.create = function(req, res) {
-  req.body.type = 'externip';
-  return NetworkExternip
-    .create(req.body)
-    .then(responseWithResult(res, 201))
-    .catch(handleError(res));
-}
-
-// Updates an existing NetworkExternip in the DB
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  return NetworkExternip
-    .findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(saveUpdates(req.body))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Deletes a NetworkExternip from the DB
-exports.destroy = function(req, res) {
-  return NetworkExternip
-    .findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(removeEntity(res))
-    .catch(handleError(res));
-}
-
-exports.bulkDestroy = function(req, res) {
-  return NetworkExternip
-    .destroy({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(responseWithoutResult(res))
-    .catch(handleError(res));
-};
\ No newline at end of file
diff --git a/server/api/network_externip/network_externip.events.js b/server/api/network_externip/network_externip.events.js
index c5f5cbe..a10f5c3 100644
--- a/server/api/network_externip/network_externip.events.js
+++ b/server/api/network_externip/network_externip.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const Network = require('../../models').Network;
-
-var NetworkEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-NetworkEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  Network.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    NetworkEvents.emit(event + ':' + doc._id, doc);
-    NetworkEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = NetworkEvents;
\ No newline at end of file
diff --git a/server/api/network_externip/network_externip.socket.js b/server/api/network_externip/network_externip.socket.js
index 9903ad0..676b7f3 100644
--- a/server/api/network_externip/network_externip.socket.js
+++ b/server/api/network_externip/network_externip.socket.js
@@ -1,28 +1 @@
-'use strict';
-
-const NetworkExternipEvents = require('./network_externip.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('network_externip:' + event, socket);
-
-    NetworkExternipEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    NetworkExternipEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/network_localnet/index.js b/server/api/network_localnet/index.js
index d372448..89e38fd 100644
--- a/server/api/network_localnet/index.js
+++ b/server/api/network_localnet/index.js
@@ -1,16 +1 @@
-'use strict';
-
-var express = require('express');
-var auth = require('../../auth/auth.service');
-var controller = require('./network_localnet.controller');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), auth.hasRole('admin'), controller.index);
-router.get('/:id', auth.isAuthenticated(), auth.hasRole('admin'), controller.show);
-router.post('/', auth.isAuthenticated(), auth.hasRole('admin'), controller.create);
-router.put('/:id', auth.isAuthenticated(), auth.hasRole('admin'), controller.update);
-router.delete('/', auth.isAuthenticated(), auth.hasRole('admin'), controller.bulkDestroy);
-router.delete('/:id', auth.isAuthenticated(), auth.hasRole('admin'), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/network_localnet/network_localnet.controller.js b/server/api/network_localnet/network_localnet.controller.js
index 85e3150..8462469 100644
--- a/server/api/network_localnet/network_localnet.controller.js
+++ b/server/api/network_localnet/network_localnet.controller.js
@@ -1,128 +1 @@
-/**
- * Using Rails-like standard naming convention for endpoints.
- * GET     /api/network/localnets              ->  index
- * POST    /api/network/localnets              ->  create
- * GET     /api/network/localnets/:id          ->  show
- * PUT     /api/network/localnets/:id          ->  update
- * DELETE  /api/network/localnets/:id          ->  destroy
- */
-
-'use strict';
-
-
-var _ = require('lodash');
-var Util = require('../../config/util');
-
-var NetworkLocalnet = require('../../models').Network;
-
-
-function handleError(res, statusCode) {
-  statusCode = statusCode || 500;
-  return function(err) {
-    res.status(statusCode).send(err);
-  };
-}
-
-function responseWithResult(res, statusCode) {
-  statusCode = statusCode || 200;
-  return function(entity) {
-    if (entity) {
-      res.status(statusCode).json(entity);
-    }
-  };
-}
-
-function responseWithoutResult(res, statusCode) {
-  statusCode = statusCode || 204;
-  return function() {
-    res.sendStatus(statusCode);
-  };
-}
-
-function handleEntityNotFound(res) {
-  return function(entity) {
-    if (!entity) {
-      res.status(404).end();
-      return null;
-    }
-    return entity;
-  };
-}
-
-function saveUpdates(updates) {
-  return function(entity) {
-    return entity.updateAttributes(updates)
-      .then(function(updated) {
-        return updated;
-      });
-  };
-}
-
-function removeEntity(res) {
-  return function(entity) {
-    if (entity) {
-      return entity.destroy()
-        .then(function() {
-          res.status(204).end();
-        });
-    }
-  };
-}
-
-// Gets a list of NetworkLocalnets
-exports.index = function(req, res) {
-  return NetworkLocalnet
-    .scope('localnet')
-    .findAndCountAll(Util.getQuery(req.query))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Gets a single NetworkLocalnet from the DB
-exports.show = function(req, res) {
-  return NetworkLocalnet.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Creates a new NetworkLocalnet in the DB
-exports.create = function(req, res) {
-  req.body.type = 'localnet';
-  return NetworkLocalnet.create(req.body)
-    .then(responseWithResult(res, 201))
-    .catch(handleError(res));
-}
-
-// Updates an existing NetworkLocalnet in the DB
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  return NetworkLocalnet.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(saveUpdates(req.body))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Deletes a NetworkLocalnet from the DB
-exports.destroy = function(req, res) {
-  return NetworkLocalnet
-    .findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(removeEntity(res))
-    .catch(handleError(res));
-}
-
-exports.bulkDestroy = function(req, res) {
-  return NetworkLocalnet
-    .destroy({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(responseWithoutResult(res))
-    .catch(handleError(res));
-};
\ No newline at end of file
diff --git a/server/api/network_localnet/network_localnet.events.js b/server/api/network_localnet/network_localnet.events.js
index c5f5cbe..b6159ad 100644
--- a/server/api/network_localnet/network_localnet.events.js
+++ b/server/api/network_localnet/network_localnet.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const Network = require('../../models').Network;
-
-var NetworkEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-NetworkEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  Network.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    NetworkEvents.emit(event + ':' + doc._id, doc);
-    NetworkEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = NetworkEvents;
\ No newline at end of file
diff --git a/server/api/network_localnet/network_localnet.socket.js b/server/api/network_localnet/network_localnet.socket.js
index ccc151b..7304e08 100644
--- a/server/api/network_localnet/network_localnet.socket.js
+++ b/server/api/network_localnet/network_localnet.socket.js
@@ -1,28 +1 @@
-'use strict';
-
-const NetworkLocalnetEvents = require('./network_localnet.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('network_localnet:' + event, socket);
-
-    NetworkLocalnetEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    NetworkLocalnetEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/openchannel_account/index.js b/server/api/openchannel_account/index.js
index 72240c7..94f5b1e 100644
--- a/server/api/openchannel_account/index.js
+++ b/server/api/openchannel_account/index.js
@@ -1,29 +1 @@
-'use strict';
-
-var express = require('express');
-var auth = require('../../auth/auth.service');
-var controller = require('./openchannel_account.controller');
-var license = require('../../config/license/license.service');
-
-var router = express.Router();
-
-
-router.get('/', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin', 'agent']), controller.index);
-router.get('/:id', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin']), controller.show);
-router.get('/:id/applications', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin']), controller.showApplications);
-router.get('/:id/rooms', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin', 'agent']), controller.getOpenchannelRooms);
-router.get('/:id/dispositions', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin', 'agent']), controller.getDispositions);
-router.post('/', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin']), controller.create);
-router.post('/:id/dispositions', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin']), controller.createDisposition);
-router.post('/:id/send', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin', 'agent']), controller.sendMessage);
-router.post('/:id/receive', license.isValidDate(), controller.receiveMessage);
-router.put('/:id', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin']), controller.update);
-router.put('/:id/applications', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin']), controller.updateApplications);
-router.put('/:id/applications/:appId', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin']), controller.updateApplication);
-router.put('/:id/dispositions/:dispId', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin']), controller.updateDisposition);
-router.delete('/:id', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin']), auth.hasModule([20], ['admin']), controller.destroy);
-router.delete('/:id/applications', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin']), controller.bulkDestroyApplications);
-router.delete('/:id/applications/:appId', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin']), controller.destroyApplication);
-router.delete('/:id/dispositions/:dispId', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin']), controller.destroyDisposition);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/openchannel_account/openchannel_account.controller.js b/server/api/openchannel_account/openchannel_account.controller.js
index 91ecf03..fd3d23b 100644
--- a/server/api/openchannel_account/openchannel_account.controller.js
+++ b/server/api/openchannel_account/openchannel_account.controller.js
@@ -1,527 +1 @@
-/**
- * Using Rails-like standard naming convention for endpoints.
- * GET     /api/openchannel/accounts              ->  index
- * POST    /api/openchannel/accounts              ->  create
- * GET     /api/openchannel/accounts/:id          ->  show
- * PUT     /api/openchannel/accounts/:id          ->  update
- * DELETE  /api/openchannel/accounts/:id          ->  destroy
- */
-
-'use strict';
-
-
-var _ = require('lodash');
-var Util = require('../../config/util');
-
-var OpenchannelAccount = require('../../models').OpenchannelAccount;
-var sequelize = require('../../models').sequelize;
-var User = require('../../models').User;
-var OpenchannelQueue = require('../../models').OpenchannelQueue;
-var OpenchannelApplication = require('../../models').OpenchannelApplication;
-var OpenchannelMessage = require('../../models').OpenchannelMessage;
-var OpenchannelRoom = require('../../models').OpenchannelRoom;
-var OpenchannelDisposition = require('../../models').OpenchannelDisposition;
-var Contact = require('../../models').Contact;
-var Interval = require('../../models').Interval;
-var Promise = require('bluebird');
-var moment = require('moment');
-
-
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
-
-// Gets a list of OpenchannelAccount
-exports.index = function(req, res) {
-  return OpenchannelAccount
-    .findAndCountAll(Util.getQuery(req.query))
-    .then(function(account) {
-      res.status(200).send(account);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-
-}
-
-// Gets a single OpenchannelAccount from the DB
-exports.show = function(req, res) {
-  return OpenchannelAccount
-    .findById(req.params.id)
-    .then(function(Account) {
-      if (!Account) {
-        return res.sendStatus(404);
-      }
-      return res.send(Account);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-}
-
-exports.getDispositions = function(req, res, next) {
-  return OpenchannelAccount
-    .findById(req.params.id)
-    .then(function(Account) {
-      if (!Account) {
-        return res.sendStatus(404);
-      }
-
-      return Account
-        .getOpenchannelDispositions();
-    })
-    .then(function(Dispositions) {
-      return res.status(200).send({
-        rows: Dispositions,
-        count: Dispositions.length
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-// Get Applications
-exports.showApplications = function(req, res, next) {
-  return OpenchannelAccount
-    .scope('default')
-    .findById(req.params.id)
-    .then(function(Account) {
-      if (!Account) {
-        return res.sendStatus(404);
-      }
-
-      return Account
-        .getOpenchannelApplications(_.merge(Util.getQuery(req.query), {
-          include: [{
-            model: OpenchannelQueue,
-            attributes: ['id', 'name']
-          }, {
-            model: User,
-            attributes: ['id', 'name', 'online']
-          }, {
-            model: Interval,
-            attributes: ['id', 'name']
-          }]
-        }));
-    })
-    .then(function(Applications) {
-      return res.send({
-        count: Applications.length,
-        rows: Applications
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-// Creates a new OpenchannelAccount in the DB
-exports.create = function(req, res) {
-  return OpenchannelAccount
-    .create(req.body)
-    .then(function(Account) {
-      return res.status(201).send(Account);
-    })
-    .catch(sequelize.UniqueConstraintError, function(err) {
-      return Util.errorManager.handleUniqueConstraintError(res, err);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-
-}
-
-exports.createDisposition = function(req, res, next) {
-  req.body.OpenchannelAccountId = req.params.id;
-
-  return OpenchannelDisposition
-    .create(req.body)
-    .then(function(Diposition) {
-      return res.status(201).send(Diposition);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a send Message in the DB.
-exports.sendMessage = function(req, res, next) {
-  req.body.OpenchannelAccountId = req.params.id;
-  req.body.UserId = req.user.id;
-  return OpenchannelMessage
-    .create(req.body, {
-      user: req.user
-    })
-    .then(function(message) {
-      return res.status(201).send(message);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-// Creates a receive Message in the DB.
-exports.receiveMessage = function(req, res, next) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  var _message = req.body;
-  var _account;
-
-  return OpenchannelAccount
-    .findById(req.params.id)
-    .then(function(Account) {
-      if (!Account) {
-        throw new Error('Account not found');
-      }
-      _account = Account
-      console.log(_message);
-      if (!_message.from) {
-        throw new Error('Received message does not contain sender Id');
-      }
-      return OpenchannelRoom
-        .findAll({
-          limit: 1,
-          where: {
-            contact: _message.from,
-            OpenchannelAccountId: _account.id
-          },
-          order: [
-            ['createdAt', 'DESC']
-          ]
-        })
-    })
-    .then(function(smsroom) {
-      var room = smsroom[0];
-      if (!room || room.status == 'CLOSED') {
-        var parentID = room ? room.id : null;
-        return OpenchannelRoom
-          .create({
-            contact: _message.from,
-            OpenchannelAccountId: _account.id,
-            status: 'NEW',
-            ParentId: parentID,
-            lastEvent: 'RECEIVED',
-            lastEventAt: moment().format('YYYY-MM-DD HH:mm:ss'),
-            openchannelIn: 1
-          })
-      } else {
-        return room
-          .updateAttributes({
-            lastEvent: 'RECEIVED',
-            lastEventAt: moment().format('YYYY-MM-DD HH:mm:ss'),
-            status: 'OPEN',
-            openReason: 'system',
-            openchannelIn: ++room.openchannelIn
-          });
-      }
-
-    })
-    .then(function(room) {
-      _message.OpenchannelAccountId = _account.id;
-      _message.OpenchannelRoomId = room.id;
-      _message.status = 'RECEIVED';
-      return OpenchannelMessage
-        .create(_message)
-
-    })
-    .then(function(Message) {
-      return res.status(201).send(Message);
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-// Updates an existing OpenchannelAccount in the DB
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  return OpenchannelAccount.findById(req.params.id)
-    .then(function(Account) {
-      if (!Account) {
-        return res.sendStatus(404);
-      }
-
-      var updated = _.merge(Account, req.body);
-      return updated
-        .save();
-    })
-    .then(function(Account) {
-      return res.status(200).send(Account);
-    })
-    .catch(sequelize.UniqueConstraintError, function(err) {
-      return Util.errorManager.handleUniqueConstraintError(res, err);
-    })
-    .catch(function(err) {
-      console.log('   err', err);
-      return handleError(res, err);
-    });
-
-}
-
-exports.updateDisposition = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-
-  return OpenchannelDisposition
-    .findById(req.params.dispId)
-    .then(function(Disposition) {
-      if (!Disposition) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(Disposition, req.body);
-      return updated
-        .save();
-    })
-    .then(function(Disposition) {
-      return res.status(200).send(Disposition);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-
-// Updates aapplications
-exports.updateApplications = function(req, res) {
-
-  var priority = 0;
-  var apps = req.body;
-  apps.forEach(function(app) {
-    delete app.id;
-    delete app.createdAt;
-    delete app.updatedAt;
-
-    app.priority = ++priority;
-  });
-  console.log('req app', req.body);
-  return sequelize.transaction(function(t) {
-    return OpenchannelApplication
-      .destroy({
-        where: {
-          OpenchannelAccountId: req.params.id
-        },
-        individualHooks: true,
-        transaction: t
-      }).then(function(Application) {
-        return OpenchannelApplication
-          .bulkCreate(apps, {
-            individualHooks: true,
-            transaction: t
-          });
-      });
-  }).then(function(Accounts) {
-    return res.status(200).send({
-      count: Accounts.length,
-      rows: Accounts
-    });
-  }).catch(function(err) {
-    return handleError(res, err);
-  });
-};
-exports.updateApplication = function(req, res) {
-    if (req.body.id) {
-      delete req.body.id;
-    }
-    return OpenchannelApplication
-      .findById(req.params.appId)
-      .then(function(Application) {
-        if (!Application) {
-          return res.sendStatus(404);
-        }
-        var updated = _.merge(Application, req.body);
-        return updated.save();
-      })
-      .then(function(Application) {
-        return res.status(200).send(Application);
-      })
-      .catch(function(err) {
-        return handleError(res, err);
-      });
-  }
-  // Deletes a  OpenchannelAccount from the DB
-exports.destroy = function(req, res) {
-  return OpenchannelAccount.findById(req.params.id)
-    .then(function(Account) {
-      if (!Account) {
-        return res.sendStatus(404);
-      }
-
-      return Account
-        .destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-}
-exports.destroyApplication = function(req, res, next) {
-  return OpenchannelApplication
-    .findById(req.params.appId)
-    .then(function(Application) {
-      if (!Application) {
-        return res.sendStatus(404);
-      }
-
-      return Application
-        .destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.destroyDisposition = function(req, res, next) {
-  return OpenchannelDisposition
-    .findById(req.params.dispId)
-    .then(function(Diposition) {
-      if (!Diposition) {
-        return res.sendStatus(404);
-      }
-      return Diposition
-        .destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.bulkDestroyApplications = function(req, res) {
-  return OpenchannelApplication
-    .destroy({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-
-exports.getOpenchannelRooms = function(req, res, next) {
-  var _query = {
-    where: {
-      OpenchannelAccountId: req.params.id,
-      $and: []
-    },
-    attributes: ['id', 'contact', 'updatedAt', 'tags', 'disposition', 'lastEvent'],
-    include: []
-  };
-
-  // TO MOVE SOON INTO AN EXTENAL UTIL FILE
-  if (req.query) {
-    if (req.query.tags) {
-      if (_.isArray(req.query.tags)) {
-        for (var i = 0; i < req.query.tags.length; i++) {
-          _query.where.$and.push({
-            tags: {
-              $like: '%' + req.query.tags[i] + '%'
-            }
-          });
-        }
-      } else {
-        _query.where.$and.push({
-          tags: {
-            $like: '%' + req.query.tags + '%'
-          }
-        });
-      }
-
-      delete req.query.tags;
-    }
-
-    _.merge(_query.where, req.query);
-  }
-
-  switch (req.user.role) {
-    case 'agent':
-      _query.include.push({
-        model: User,
-        attributes: ['id']
-      });
-      var _agents;
-      var _agentQueues;
-      var _accountQueues;
-
-      return User
-        .findById(req.user.id)
-        .then(function(user) {
-          // console.log('user');
-          if (user) {
-            return user
-              .getOpenchannelQueues();
-          } else {
-            return [];
-          }
-        })
-        .then(function(queues) {
-          // console.log(queues);
-          _agentQueues = _.map(queues, 'id');
-          return OpenchannelAccount
-            .findById(req.params.id);
-        })
-        .then(function(account) {
-          return account
-            .getOpenchannelApplications({
-              where: {
-                $or: [{
-                  app: 'queue'
-                }, {
-                  app: 'agent'
-                }]
-              }
-            });
-        })
-        .then(function(apps) {
-          _agents = _.map(_.find(apps, {
-            'app': 'agent'
-          }), 'UserId');
-          _accountQueues = _.map(_.find(apps, {
-            'app': 'queue'
-          }), 'OpenchannelQueueId');
-          if (_.intersection(_agentQueues, _accountQueues).length || _.intersection(_agents, [req.user.id]).length) {
-            return OpenchannelRoom
-              .findAll(_query)
-              .then(function(Rooms) {
-                return res.status(200).send(Rooms);
-              })
-              .catch(function(err) {
-                console.error(err);
-                return handleError(res, err);
-              });
-          } else {
-            return res.status(200).send([]);
-          }
-        })
-        .catch(function(err) {
-          console.error(err);
-        });
-
-    default:
-
-      return OpenchannelRoom
-        .findAll(_query)
-        .then(function(Rooms) {
-          return res.status(200).send(Rooms);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-  }
-
-};
\ No newline at end of file
diff --git a/server/api/openchannel_account/openchannel_account.events.js b/server/api/openchannel_account/openchannel_account.events.js
index cc2ccdb..fbecbf7 100644
--- a/server/api/openchannel_account/openchannel_account.events.js
+++ b/server/api/openchannel_account/openchannel_account.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const OpenchannelAccount = require('../../models').OpenchannelAccount;
-
-var OpenchannelAccountEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-OpenchannelAccountEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  OpenchannelAccount.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    OpenchannelAccountEvents.emit(event + ':' + doc._id, doc);
-    OpenchannelAccountEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = OpenchannelAccountEvents;
\ No newline at end of file
diff --git a/server/api/openchannel_account/openchannel_account.socket.js b/server/api/openchannel_account/openchannel_account.socket.js
index 15f955e..052cb83 100644
--- a/server/api/openchannel_account/openchannel_account.socket.js
+++ b/server/api/openchannel_account/openchannel_account.socket.js
@@ -1,32 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const OpenchannelAccountEvents = require('./openchannel_account.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('openchannel_account:' + event, socket);
-
-    OpenchannelAccountEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    OpenchannelAccountEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/openchannel_application/index.js b/server/api/openchannel_application/index.js
index de6d7b3..e788e5f 100644
--- a/server/api/openchannel_application/index.js
+++ b/server/api/openchannel_application/index.js
@@ -1,15 +1 @@
-'use strict';
-
-var express = require('express');
-var auth = require('../../auth/auth.service');
-var controller = require('./openchannel_application.controller');
-var license = require('../../config/license/license.service');
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.index);
-router.get('/:id', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.show);
-router.post('/', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.create);
-router.put('/:id', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.update);
-router.delete('/:id', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/openchannel_application/openchannel_application.controller.js b/server/api/openchannel_application/openchannel_application.controller.js
index c47b66b..c94c18b 100644
--- a/server/api/openchannel_application/openchannel_application.controller.js
+++ b/server/api/openchannel_application/openchannel_application.controller.js
@@ -1,129 +1 @@
-/**
- * Using Rails-like standard naming convention for endpoints.
- * GET     /api/openchannel/applications              ->  index
- * POST    /api/openchannel/applications              ->  create
- * GET     /api/openchannel/applications/:id          ->  show
- * PUT     /api/openchannel/applications/:id          ->  update
- * DELETE  /api/openchannel/applications/:id          ->  destroy
- */
-
-'use strict';
-
-
-var _ = require('lodash');
-var Util = require('../../config/util');
-
-var OpenchannelApplication = require('../../models').OpenchannelApplication;
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
-
-// Gets a list of OpenchannelApplication
-exports.index = function(req, res) {
-  return OpenchannelApplication
-    .findAll({
-      where: req.query,
-      order: 'priority',
-      include: [{
-        all: true
-      }]
-    })
-    .then(function(Applications) {
-      return res.status(200).send(Applications);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-}
-
-// Gets a single OpenchannelApplication from the DB
-exports.show = function(req, res) {
-  return OpenchannelApplication
-    .findById(req.params.id, {
-      include: [{
-        all: true
-      }]
-    })
-    .then(function(Application) {
-      if (!Application) {
-        return res.sendStatus(404);
-      }
-      return res.send(Application);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-
-}
-
-// Creates a new OpenchannelApplication in the DB
-exports.create = function(req, res) {
-
-  return OpenchannelApplication
-    .max('priority', {
-      where: {
-        OpenchannelAccountId: req.body.OpenchannelAccountId
-      }
-    })
-    .then(function(max) {
-      // SET PRIORITY
-      req.body.priority = max ? ++max : 1;
-      return OpenchannelApplication
-        .create(req.body)
-    })
-    .then(function(Application) {
-      return res.status(201).send(Application);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-
-
-}
-
-// Updates an existing OpenchannelApplication in the DB
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  return OpenchannelApplication
-    .findById(req.params.id)
-    .then(function(Application) {
-      if (!Application) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(Application, req.body);
-      return updated
-        .save()
-
-    })
-    .then(function(Application) {
-      return res.status(200).send(Application);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-
-}
-
-
-// Deletes a OpenchannelApplication from the DB
-exports.destroy = function(req, res) {
-  return OpenchannelApplication
-    .findById(req.params.id)
-    .then(function(Application) {
-      if (!Application) {
-        return res.sendStatus(404);
-      }
-      return Application
-        .destroy()
-
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-}
\ No newline at end of file
diff --git a/server/api/openchannel_application/openchannel_application.events.js b/server/api/openchannel_application/openchannel_application.events.js
index 13b8c25..8138560 100644
--- a/server/api/openchannel_application/openchannel_application.events.js
+++ b/server/api/openchannel_application/openchannel_application.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const OpenchannelApplication = require('../../models').OpenchannelApplication;
-
-var OpenchannelApplicationEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-OpenchannelApplicationEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  OpenchannelApplication.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    OpenchannelApplicationEvents.emit(event + ':' + doc._id, doc);
-    OpenchannelApplicationEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = OpenchannelApplicationEvents;
\ No newline at end of file
diff --git a/server/api/openchannel_application/openchannel_application.socket.js b/server/api/openchannel_application/openchannel_application.socket.js
index d8ab577..604245d 100644
--- a/server/api/openchannel_application/openchannel_application.socket.js
+++ b/server/api/openchannel_application/openchannel_application.socket.js
@@ -1,32 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const OpenchannelApplicationEvents = require('./openchannel_application.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('openchannel_application:' + event, socket);
-
-    OpenchannelApplicationEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    OpenchannelApplicationEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/openchannel_disposition/index.js b/server/api/openchannel_disposition/index.js
index b10f1c8..cc35da3 100644
--- a/server/api/openchannel_disposition/index.js
+++ b/server/api/openchannel_disposition/index.js
@@ -1,16 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./openchannel_disposition.controller');
-var auth = require('../../auth/auth.service');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), controller.index);
-router.get('/:id', auth.isAuthenticated(), controller.show);
-router.post('/', auth.isAuthenticated(), controller.create);
-router.put('/:id', auth.isAuthenticated(), controller.update);
-router.patch('/:id', auth.isAuthenticated(), controller.update);
-router.delete('/:id', auth.isAuthenticated(), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/openchannel_disposition/openchannel_disposition.controller.js b/server/api/openchannel_disposition/openchannel_disposition.controller.js
index fb1250f..b80e420 100644
--- a/server/api/openchannel_disposition/openchannel_disposition.controller.js
+++ b/server/api/openchannel_disposition/openchannel_disposition.controller.js
@@ -1,110 +1 @@
-/**
- * Using Rails-like standard naming convention for endpoints.
- * GET     /api/openchannel/disposition              ->  index
- * POST    /api/openchannel/disposition              ->  create
- * GET     /api/openchannel/disposition/:id          ->  show
- * PUT     /api/openchannel/disposition/:id          ->  update
- * DELETE  /api/openchannel/disposition/:id          ->  destroy
- */
-
-'use strict';
-
-
-var _ = require('lodash');
-var Util = require('../../config/util');
-
-var OpenchannelDisposition = require('../../models').OpenchannelDisposition;
-
-
-function handleError(res, statusCode) {
-  statusCode = statusCode || 500;
-  return function(err) {
-    res.status(statusCode).send(err);
-  };
-}
-
-function responseWithResult(res, statusCode) {
-  statusCode = statusCode || 200;
-  return function(entity) {
-    if (entity) {
-      res.status(statusCode).json(entity);
-    }
-  };
-}
-
-function handleEntityNotFound(res) {
-  return function(entity) {
-    if (!entity) {
-      res.status(404).end();
-      return null;
-    }
-    return entity;
-  };
-}
-
-function saveUpdates(updates) {
-  return function(entity) {
-    return entity.updateAttributes(updates)
-      .then(function(updated) {
-        return updated;
-      })
-  };
-}
-
-function removeEntity(res) {
-  return function(entity) {
-    if (entity) {
-      return entity.destroy()
-        .then(function() {
-          res.status(204).end();
-        })
-    }
-  };
-}
-
-// Gets a list of OpenchannelDisposition
-exports.index = function(req, res) {
-  OpenchannelDisposition
-    .findAndCountAll()
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Gets a single OpenchannelDisposition from the DB
-exports.show = function(req, res) {
-  OpenchannelDisposition
-    .findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Creates a new OpenchannelDisposition in the DB
-exports.create = function(req, res) {
-  OpenchannelDisposition
-    .create(req.body)
-    .then(responseWithResult(res, 201))
-    .catch(handleError(res));
-}
-
-// Updates an existing OpenchannelDisposition in the DB
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  OpenchannelDisposition
-    .findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(saveUpdates(req.body))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Deletes a OpenchannelDisposition from the DB
-exports.destroy = function(req, res) {
-  OpenchannelDisposition
-    .findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(removeEntity(res))
-    .catch(handleError(res));
-}
\ No newline at end of file
diff --git a/server/api/openchannel_disposition/openchannel_disposition.events.js b/server/api/openchannel_disposition/openchannel_disposition.events.js
index 178c511..ce7d67d 100644
--- a/server/api/openchannel_disposition/openchannel_disposition.events.js
+++ b/server/api/openchannel_disposition/openchannel_disposition.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const OpenchannelDisposition = require('../../models').OpenchannelDisposition;
-
-var OpenchannelDispositionEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-OpenchannelDispositionEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  OpenchannelDisposition.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    OpenchannelDispositionEvents.emit(event + ':' + doc._id, doc);
-    OpenchannelDispositionEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = OpenchannelDispositionEvents;
\ No newline at end of file
diff --git a/server/api/openchannel_disposition/openchannel_disposition.socket.js b/server/api/openchannel_disposition/openchannel_disposition.socket.js
index 960c110..da6bc05 100644
--- a/server/api/openchannel_disposition/openchannel_disposition.socket.js
+++ b/server/api/openchannel_disposition/openchannel_disposition.socket.js
@@ -1,32 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const OpenchannelDispositionEvents = require('./openchannel_disposition.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('openchannel_disposition:' + event, socket);
-
-    OpenchannelDispositionEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    OpenchannelDispositionEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/openchannel_message/index.js b/server/api/openchannel_message/index.js
index fb26cb8..443d093 100644
--- a/server/api/openchannel_message/index.js
+++ b/server/api/openchannel_message/index.js
@@ -1,18 +1 @@
-'use strict';
-
-var express = require('express');
-var auth = require('../../auth/auth.service');
-var controller = require('./openchannel_message.controller');
-var license = require('../../config/license/license.service');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.index);
-router.get('/describe', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.describe);
-router.get('/:id', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin', 'agent']), controller.show);
-router.post('/', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.create);
-router.put('/:id', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.update);
-router.delete('/:id', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.destroy);
-router.delete('/', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.bulkDelete);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/openchannel_message/openchannel_message.controller.js b/server/api/openchannel_message/openchannel_message.controller.js
index 17f68b9..b27b846 100644
--- a/server/api/openchannel_message/openchannel_message.controller.js
+++ b/server/api/openchannel_message/openchannel_message.controller.js
@@ -1,170 +1 @@
-/**
- * Using Rails-like standard naming convention for endpoints.
- * GET     /api/openchannel/messages              ->  index
- * POST    /api/openchannel/messages              ->  create
- * GET     /api/openchannel/messages/:id          ->  show
- * PUT     /api/openchannel/messages/:id          ->  update
- * DELETE  /api/openchannel/messages/:id          ->  destroy
- */
-
-'use strict';
-
-
-var _ = require('lodash');
-var Util = require('../../config/util');
-
-var OpenchannelMessage = require('../../models').OpenchannelMessage;
-var OpenchannelRoom = require('../../models').OpenchannelRoom;
-var User = require('../../models').User;
-
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
-
-// Gets a list of OpenchannelMessage
-exports.index = function(req, res) {
-  var params = {
-    order: 'createdAt DESC',
-    include: [{
-      all: true,
-      include: [{
-        all: true
-      }]
-    }]
-  };
-
-  switch (req.user.role) {
-    case 'admin':
-      params.where = req.query;
-      break;
-    case 'agent':
-      break;
-    default:
-  }
-
-  return OpenchannelMessage
-    .findAll(params)
-    .then(function(messages) {
-      return res.status(200).send(messages);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-}
-
-exports.describe = function(req, res) {
-  return OpenchannelMessage
-    .describe()
-    .then(function(fields) {
-      return res.status(200).send(fields);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Gets a single OpenchannelMessage from the DB
-exports.show = function(req, res) {
-  return OpenchannelMessage
-    .findById(req.params.id, {
-      include: [{
-        model: User,
-        attributes: ['id', 'name', 'fullname', 'email']
-      }]
-    })
-    .then(function(Message) {
-      if (!Message) {
-        return res.sendStatus(404);
-      }
-      return res.send(Message);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-}
-
-// Creates a new OpenchannelMessage in the DB
-exports.create = function(req, res) {
-  req.body.UserId = req.user.id;
-  return OpenchannelMessage
-    .create(req.body)
-    .then(function(Message) {
-      return res.status(201).send(Message);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-}
-
-// Updates an existing OpenchannelMessage in the DB
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  return OpenchannelMessage
-    .findById(req.params.id, {
-      include: [{
-        all: true
-      }]
-    })
-    .then(function(Message) {
-      if (!Message) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(Message, req.body);
-      return updated
-        .save();
-    })
-    .then(function(updated) {
-      return res.status(200).send(updated);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-}
-
-// Deletes a OpenchannelMessage from the DB
-exports.destroy = function(req, res) {
-  return OpenchannelMessage
-    .findById(req.params.id)
-    .then(function(Message) {
-      if (!Message) {
-        return res.sendStatus(404);
-      }
-      return Message
-        .destroy();
-    }).then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-}
-
-exports.bulkDelete = function(req, res) {
-  return OpenchannelMessage
-    .bulkUpdate({
-      where: {
-        id: {
-          $in: req.body.id
-        }
-      },
-      attributes: {
-        directory: 'TRASH'
-      }
-    })
-    .then(function(Message) {
-      if (!Message) {
-        return res.sendStatus(404);
-      }
-      return Message
-        .destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
\ No newline at end of file
diff --git a/server/api/openchannel_message/openchannel_message.events.js b/server/api/openchannel_message/openchannel_message.events.js
index 5095912..e8583f1 100644
--- a/server/api/openchannel_message/openchannel_message.events.js
+++ b/server/api/openchannel_message/openchannel_message.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const OpenchannelMessage = require('../../models').OpenchannelMessage;
-
-var OpenchannelMessageEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-OpenchannelMessageEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'update',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  OpenchannelMessage.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    OpenchannelMessageEvents.emit(event + ':' + doc._id, doc);
-    OpenchannelMessageEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = OpenchannelMessageEvents;
\ No newline at end of file
diff --git a/server/api/openchannel_message/openchannel_message.socket.js b/server/api/openchannel_message/openchannel_message.socket.js
index 0f942a5..9102672 100644
--- a/server/api/openchannel_message/openchannel_message.socket.js
+++ b/server/api/openchannel_message/openchannel_message.socket.js
@@ -1,47 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const OpenchannelMessageEvents = require('./openchannel_message.events');
-
-// Model events to emit
-var events = ['save', 'update', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('openchannel_message:' + event, socket);
-
-    OpenchannelMessageEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    switch (event) {
-      case 'openchannel_message:save':
-        socket.emit(event, doc);
-        break;
-      case 'openchannel_message:update':
-        if (doc.changed('status')) {
-          socket.emit(event, doc);
-        }
-        break;
-      case 'openchannel_message:remove':
-        socket.emit(event, doc);
-        break;
-
-      default:
-
-    }
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    OpenchannelMessageEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/openchannel_queue/index.js b/server/api/openchannel_queue/index.js
index 65d3d56..f86fab2 100644
--- a/server/api/openchannel_queue/index.js
+++ b/server/api/openchannel_queue/index.js
@@ -1,22 +1 @@
-'use strict';
-
-var express = require('express');
-var auth = require('../../auth/auth.service');
-var controller = require('./openchannel_queue.controller');
-var license = require('../../config/license/license.service');
-
-var router = express.Router();
-
-// router.get('/', auth.isAuthenticated(), license.hasSms(), auth.hasModule([11], ['admin']), controller.index);
-router.get('/', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.index);
-router.get('/:id', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.show);
-router.get('/:id/agents', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.showAgents);
-router.post('/', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.create);
-router.post('/:id/agents', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.addAgents);
-router.put('/:id', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.update);
-router.patch('/:id', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.update);
-router.delete('/:id', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.destroy);
-router.delete('/:id/agents', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.removeAgents);
-router.delete('/', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.bulkDestroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/openchannel_queue/openchannel_queue.controller.js b/server/api/openchannel_queue/openchannel_queue.controller.js
index dde6c2b..c4931f1 100644
--- a/server/api/openchannel_queue/openchannel_queue.controller.js
+++ b/server/api/openchannel_queue/openchannel_queue.controller.js
@@ -1,246 +1 @@
-/**
- * Using Rails-like standard naming convention for endpoints.
- * GET     /api/openchannel/queues              ->  index
- * POST    /api/openchannel/queues              ->  create
- * GET     /api/openchannel/queues/:id          ->  show
- * PUT     /api/openchannel/queues/:id          ->  update
- * DELETE  /api/openchannel/queues/:id          ->  destroy
- */
-
-'use strict';
-
-
-var _ = require('lodash');
-var Util = require('../../config/util');
-
-var OpenchannelQueue = require('../../models').OpenchannelQueue;
-var User = require('../../models').User;
-var sequelize = require('../../models').sequelize;
-var UserHasOpenchannelQueue = require('../../models').UserHasOpenchannelQueue;
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
-
-
-// Gets a list of openchannelQueues
-exports.index = function(req, res) {
-
-  switch (req.user.role) {
-    case 'user':
-      return User
-        .findById(req.user.id, {
-          attributes: ['id']
-        })
-        .then(Util.getOpenchannelQueuesIdByUser(req.query))
-        .then(function(result) {
-          res.status(200).send(result);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-
-    default:
-      return OpenchannelQueue
-        .scope('default')
-        .findAndCountAll(_.merge(Util.getQuery(req.query), {
-          distinct: true
-        }))
-        .then(function(result) {
-          res.status(200).send(result);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-  }
-
-
-
-}
-
-// Gets a single OpenchannelQueue from the DB
-exports.show = function(req, res) {
-  return OpenchannelQueue
-    .scope('default')
-    .findById(req.params.id)
-    .then(function(Queue) {
-      if (!Queue) {
-        return res.sendStatus(404);
-      }
-      return res.send(Queue);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-}
-
-exports.showAgents = function(req, res) {
-  return OpenchannelQueue
-    .findById(req.params.id)
-    .then(function(queue) {
-      if (!queue) {
-        return res.sendStatus(404);
-      }
-      return queue
-        .getUsers({
-          where: {
-            role: 'agent'
-          },
-          attributes: ['id', 'name', 'fullname', 'email']
-        });
-    })
-    .then(function(agents) {
-      // console.log(agents);
-      return res.status(200).send({
-        rows: agents,
-        count: agents.length
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-// Creates a new OpenchannelQueue in the DB
-exports.create = function(req, res) {
-  var _openchannelQueue;
-
-  return OpenchannelQueue
-    .create(req.body)
-    .then(function(openchannelQueue) {
-      _openchannelQueue = openchannelQueue;
-
-      if (req.body.agents) {
-        return _openchannelQueue
-          .addUsers(req.body.agents, {
-            penalty: req.body.penalty || 0,
-            queue: _openchannelQueue.name
-          });
-      }
-    })
-    .then(function() {
-      return res.status(201).send(_openchannelQueue);
-    })
-    .catch(sequelize.UniqueConstraintError, function(err) {
-      return Util.errorManager.handleUniqueConstraintError(res, err);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-}
-
-// Updates an existing OpenchannelQueue in the DB
-exports.update = function(req, res) {
-    if (req.body.id) {
-      delete req.body.id;
-    }
-    return OpenchannelQueue
-      .findById(req.params.id)
-      .then(function(Queue) {
-        if (!Queue) {
-          return res.sendStatus(404);
-        }
-        var updated = _.merge(Queue, req.body);
-        return updated
-          .save();
-      })
-      .then(function(Queue) {
-        return res.status(200).send(Queue);
-      })
-      .catch(sequelize.UniqueConstraintError, function(err) {
-        return Util.errorManager.handleUniqueConstraintError(res, err);
-      })
-      .catch(function(err) {
-        return handleError(res, err);
-      });
-  }
-  // Updates an existing OpenchannelQueue in the DB.
-exports.addAgents = function(req, res, next) {
-  return OpenchannelQueue
-    .findById(req.params.id)
-    .then(function(Queue) {
-      if (!Queue) {
-        return res.sendStatus(404);
-      }
-      var userHasOpenchannelQueues = _.map(req.body.agents, function(agent) {
-        return {
-          UserId: agent,
-          penalty: req.body.penalty,
-          OpenchannelQueueId: Queue.id,
-          queue: Queue.name
-        };
-      });
-
-      return UserHasOpenchannelQueue
-        .bulkCreate(userHasOpenchannelQueues, {
-          individualHooks: true
-        });
-    })
-    .then(function() {
-      return res.sendStatus(200);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.removeAgents = function(req, res) {
-  return OpenchannelQueue
-    .findById(req.params.id)
-    .then(function(Queue) {
-      if (Queue) {
-        return Queue
-          .removeUsers(req.query.agents, {
-            individualHooks: true
-          });
-      } else {
-        throw new Error('Openchannel Queue not found');
-      }
-    })
-    .then(function() {
-      return res.sendStatus(202);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-
-};
-
-// Deletes a OpenchannelQueue from the DB
-exports.destroy = function(req, res) {
-  var _OpenchannelQueue;
-  return OpenchannelQueue
-    .findById(req.params.id)
-    .then(function(Queue) {
-      _OpenchannelQueue = Queue;
-      if (!Queue) {
-        return res.sendStatus(404);
-      }
-      return Queue
-        .destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(sequelize.ForeignKeyConstraintError, function(err) {
-      return Util.errorManager.handleForeignKeyConstraintError(res, 'queue', _OpenchannelQueue.name, err);
-    })
-    .catch(function(err) {
-      console.error('err', err);
-      return handleError(res, err);
-    });
-}
-exports.bulkDestroy = function(req, res) {
-  return OpenchannelQueue
-    .destroy({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
\ No newline at end of file
diff --git a/server/api/openchannel_queue/openchannel_queue.events.js b/server/api/openchannel_queue/openchannel_queue.events.js
index a1ca116..4c30aab 100644
--- a/server/api/openchannel_queue/openchannel_queue.events.js
+++ b/server/api/openchannel_queue/openchannel_queue.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const OpenchannelQueue = require('../../models').OpenchannelQueue;
-
-var OpenchannelQueueEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-OpenchannelQueueEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  OpenchannelQueue.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    OpenchannelQueueEvents.emit(event + ':' + doc._id, doc);
-    OpenchannelQueueEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = OpenchannelQueueEvents;
\ No newline at end of file
diff --git a/server/api/openchannel_queue/openchannel_queue.socket.js b/server/api/openchannel_queue/openchannel_queue.socket.js
index 2ef4161..9df174e 100644
--- a/server/api/openchannel_queue/openchannel_queue.socket.js
+++ b/server/api/openchannel_queue/openchannel_queue.socket.js
@@ -1,32 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const OpenchannelQueueEvents = require('./openchannel_queue.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('openchannel_queue:' + event, socket);
-
-    OpenchannelQueueEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    OpenchannelQueueEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/openchannel_room/index.js b/server/api/openchannel_room/index.js
index 3466839..ff0c48b 100644
--- a/server/api/openchannel_room/index.js
+++ b/server/api/openchannel_room/index.js
@@ -1,25 +1 @@
-'use strict';
-
-var express = require('express');
-var auth = require('../../auth/auth.service');
-var controller = require('./openchannel_room.controller');
-var license = require('../../config/license/license.service');
-
-var router = express.Router();
-router.get('/', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin', 'agent']), controller.index);
-router.get('/pending', auth.isAuthenticated(), license.isValidDate(), license.hasSms(), auth.hasModule([20, 17], ['admin']), controller.pending);
-router.get('/new', auth.isAuthenticated(), license.isValidDate(), license.hasSms(), auth.hasModule([20, 17], ['admin']), controller.new);
-router.get('/open', auth.isAuthenticated(), license.isValidDate(), license.hasSms(), auth.hasModule([20, 17], ['admin']), controller.open);
-router.get('/closed', auth.isAuthenticated(), license.isValidDate(), license.hasSms(), auth.hasModule([20, 17], ['admin']), controller.closed);
-router.get('/:id', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin', 'agent']), controller.show);
-router.get('/describe', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin']), controller.describe);
-router.get('/:id/agents', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin', 'agent']), controller.showAgents);
-router.get('/messages/:id', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin', 'agent']), controller.getRoomByMessage);
-router.post('/', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin']), controller.create);
-router.post('/:id/messages', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin']), controller.createMessage);
-router.put('/:id', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin', 'agent']), controller.update);
-router.put('/:id/agents', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin', 'agent']), controller.updateAgents);
-router.patch('/:id', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin', 'agent']), controller.updatePatch);
-router.delete('/:id', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin']), controller.destroy);
-router.delete('/', license.isValidDate(), license.hasOpenchannel(), auth.isAuthenticated(), auth.hasModule([20], ['admin']), controller.bulkDestroy);
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/openchannel_room/openchannel_room.controller.js b/server/api/openchannel_room/openchannel_room.controller.js
index 05ee965..1a7a2a3 100644
--- a/server/api/openchannel_room/openchannel_room.controller.js
+++ b/server/api/openchannel_room/openchannel_room.controller.js
@@ -1,399 +1 @@
-/**
- * Using Rails-like standard naming convention for endpoints.
- * GET     /api/openchannel/rooms              ->  index
- * POST    /api/openchannel/rooms              ->  create
- * GET     /api/openchannel/rooms/:id          ->  show
- * PUT     /api/openchannel/rooms/:id          ->  update
- * DELETE  /api/openchannel/rooms/:id          ->  destroy
- */
-
-'use strict';
-
-
-var _ = require('lodash');
-var Util = require('../../config/util');
-var moment = require('moment');
-
-var OpenchannelRoom = require('../../models').OpenchannelRoom;
-var OpenchannelMessage = require('../../models').OpenchannelMessage;
-var OpenchannelAccount = require('../../models').OpenchannelAccount;
-var OpenchannelQueue = require('../../models').OpenchannelQueue;
-var OpenchannelApplication = require('../../models').OpenchannelApplication;
-var User = require('../../models').User;
-
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
-
-
-
-// Gets a list of OpenchannelRooms
-exports.index = function(req, res) {
-  switch (req.user.role) {
-    case 'agent':
-      return OpenchannelRoom
-        .scope('default', {
-          method: ['agent', req.user.id]
-        })
-        .findAndCountAll(Util.getQuery(req.query))
-        .then(function(result) {
-          return res.status(200).send(result);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-
-    default:
-      return OpenchannelRoom
-        .scope('default')
-        .findAndCountAll(Util.getQuery(req.query))
-        .then(function(result) {
-          return res.status(200).send(result);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-  }
-
-}
-
-// Get list of fields
-exports.describe = function(req, res) {
-  return OpenchannelRoom
-    .describe()
-    .then(function(fields) {
-      return res.status(200).send(fields);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function getOpenchannelQueues(user) {
-  return function() {
-    switch (user.role) {
-      case 'user':
-        return User
-          .findById(user.id, {
-            attributes: ['id']
-          })
-          .then(Util.getOpenchannelQueuesIdByUser({}, {
-            attributes: ['id'],
-            include: [{
-              raw: true,
-              model: User,
-              attributes: ['id']
-            }]
-          }))
-          .then(function(userQueues) {
-            return {
-              include: {
-                model: OpenchannelAccount,
-                include: {
-                  model: OpenchannelApplication,
-                  include: {
-                    model: OpenchannelQueue,
-                    where: {
-                      id: _.map(userQueues, 'id')
-                    }
-                  }
-                }
-              }
-            };
-          });
-      default:
-        return {};
-    }
-  }
-}
-
-exports.pending = function(req, res) {
-  return Promise
-    .all([])
-    .then(getOpenchannelQueues(req.user))
-    .then(function(condition) {
-      return OpenchannelRoom
-        .count(_.merge(Util.getQuery(req.query, {
-          status: 'PENDING',
-          updatedAt: {
-            $gte: moment().startOf('day')
-          }
-        }), condition));
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-exports.new = function(req, res) {
-  return Promise
-    .all([])
-    .then(getOpenchannelQueues(req.user))
-    .then(function(condition) {
-      return OpenchannelRoom
-        .count(_.merge(Util.getQuery(req.query, {
-          status: 'NEW',
-          updatedAt: {
-            $gte: moment().startOf('day')
-          }
-        }), condition));
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-exports.open = function(req, res) {
-  return Promise
-    .all([])
-    .then(getOpenchannelQueues(req.user))
-    .then(function(condition) {
-      return OpenchannelRoom
-        .count(_.merge(Util.getQuery(req.query, {
-          status: 'OPEN',
-          updatedAt: {
-            $gte: moment().startOf('day')
-          }
-        }), condition));
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-exports.closed = function(req, res) {
-  return Promise
-    .all([])
-    .then(getOpenchannelQueues(req.user))
-    .then(function(condition) {
-      return OpenchannelRoom
-        .count(_.merge(Util.getQuery(req.query, {
-          status: 'CLOSED',
-          updatedAt: {
-            $gte: moment().startOf('day')
-          }
-        }), condition));
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-
-
-// Gets a single OpenchannelRoom from the DB
-exports.show = function(req, res) {
-  return OpenchannelRoom
-    .scope('default')
-    .findById(req.params.id)
-    .then(function(Room) {
-      if (!Room) {
-        return res.sendStatus(404);
-      }
-      return res.send(Room);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-exports.showAgents = function(req, res, next) {
-  return OpenchannelRoom
-    .findById(req.params.id)
-    .then(function(Room) {
-      if (!Room) {
-        return res.sendStatus(404);
-      }
-      return Room
-        .getUsers({
-          attributes: ['id', 'name', 'fullname', 'email', 'role', 'internal']
-        });
-    })
-    .then(function(users) {
-      return res.send(users);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.getRoomByMessage = function(req, res, next) {
-  return OpenchannelMessage
-    .findById(req.params.id)
-    .then(function(Message) {
-      return Message
-        .getOpenchannelRoom({
-          include: [{
-            model: OpenchannelAccount
-          }, {
-            model: OpenchannelMessage,
-            include: [{
-              model: User,
-              attributes: ['id', 'name', 'fullname', 'email']
-            }]
-          }, {
-            model: User,
-            attributes: ['id', 'name', 'fullname', 'email']
-          }]
-        });
-    })
-    .then(function(Room) {
-      return res.send(Room);
-    })
-    .catch(function(err) {
-      console.log('err', err);
-      return handleError(res, err);
-    });
-};
-// Creates a new OpenchannelRoom in the DB
-exports.create = function(req, res) {
-
-  return OpenchannelRoom
-    .create(req.body)
-    .then(function(Message) {
-      return res.status(201).send(Message);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-}
-
-
-// Creates a new Message in the DB.
-exports.createMessage = function(req, res, next) {
-  req.body.UserId = req.user.id;
-  req.body.OpenchannelRoomId = req.params.id;
-  return OpenchannelMessage
-    .create(req.body)
-    .then(function(Message) {
-      return res.status(201).send(Message);
-    }).catch(function(err) {
-      return handleError(res, err);
-    });
-};
-// Updates an existing OpenchannelRoom in the DB
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  return OpenchannelRoom
-    .findById(req.params.id)
-    .then(function(Room) {
-      if (!Room) {
-        return res.sendStatus(404);
-      }
-
-      var updated = _.merge(Room, req.body);
-
-      return updated
-        .save();
-    })
-    .then(function(Room) {
-      return res.status(200).send(Room);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-}
-exports.updateAgents = function(req, res, next) {
-  return OpenchannelRoom
-    .findById(req.params.id)
-    .then(function(Room) {
-      if (!Room) {
-        return res.sendStatus(404);
-      }
-
-      return Room
-        .setUsers(req.body.agents, {
-          individualHooks: true
-        });
-    })
-    .then(function() {
-      return res.sendStatus(200);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a OpenchannelRoom from the DB
-exports.destroy = function(req, res) {
-  return OpenchannelRoom
-    .findById(req.params.id)
-    .then(function(Room) {
-      if (!Room) {
-        return res.sendStatus(404);
-      }
-      return Room.destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-}
-
-exports.bulkDestroy = function(req, res) {
-  return OpenchannelRoom
-    .destroy({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return res.sendStatus(200);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-exports.updatePatch = function(req, res, next) {
-
-  var _options = {
-    where: {
-      id: req.params.id.split(',')
-    },
-    user: req.user,
-    individualHooks: true
-  };
-  return OpenchannelRoom
-    .update(req.body, _options)
-    .then(function(Rooms) {
-      if (!Rooms) {
-        return res.sendStatus(404);
-      }
-      return Rooms
-    })
-    .then(function(Rooms) {
-      return res.sendStatus(200);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
\ No newline at end of file
diff --git a/server/api/openchannel_room/openchannel_room.events.js b/server/api/openchannel_room/openchannel_room.events.js
index 1bea005..e00d216 100644
--- a/server/api/openchannel_room/openchannel_room.events.js
+++ b/server/api/openchannel_room/openchannel_room.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const OpenchannelRoom = require('../../models').OpenchannelRoom;
-
-var OpenchannelRoomEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-OpenchannelRoomEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  OpenchannelRoom.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    OpenchannelRoomEvents.emit(event + ':' + doc._id, doc);
-    OpenchannelRoomEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = OpenchannelRoomEvents;
\ No newline at end of file
diff --git a/server/api/openchannel_room/openchannel_room.socket.js b/server/api/openchannel_room/openchannel_room.socket.js
index 0868959..f98f6d1 100644
--- a/server/api/openchannel_room/openchannel_room.socket.js
+++ b/server/api/openchannel_room/openchannel_room.socket.js
@@ -1,33 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const OpenchannelRoomEvents = require('./openchannel_room.events');
-
-// Model events to emit
-var events = ['save', 'save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('openchannel_room:' + event, socket);
-
-    OpenchannelRoomEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-
-function removeListener(event, listener) {
-  return function() {
-    OpenchannelRoomEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/pause/index.js b/server/api/pause/index.js
index e7ac19a..4149649 100644
--- a/server/api/pause/index.js
+++ b/server/api/pause/index.js
@@ -1,162 +1 @@
-'use strict';
-
-var express = require('express');
-var auth = require('../../auth/auth.service');
-var controller = require('./pause.controller');
-
-var router = express.Router();
-
-/**
- * @api {get} /api/pauses/ Get pauses list.
- *
- * @apiParam (Query) {Number} [offset] Pagination offset.
- * @apiParam (Query) {Number} [limit] Pagination limit.
- *
- * @apiVersion 0.0.140
- * @apiName GetPauses
- * @apiGroup Pauses
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccess {Number} count Number of pauses.
- * @apiSuccess {Object[]} rows Pauses list.
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 200 OK
- *     {
- *       "count": 1,
- *       "rows": [{
- *          "id": 1
- *          "name": "BACKOFFICE"
- *          "description": "BACKOFFICE Pause"
- *       }]
- *     }
- */
-router.get('/', auth.isAuthenticated(), auth.hasModule([6, 13], ['admin', 'agent']), controller.index);
-
-/**
- * @api {get} /api/pauses/:id Get pause.
- * @apiParam {Number} id Pause unique ID.
- * @apiVersion 0.0.140
- * @apiName GetPause
- * @apiGroup Pauses
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 200 OK
- *     {
- *          "id": 1
- *          "name": "BACKOFFICE"
- *          "description": "BACKOFFICE Pause"
- *     }
- */
-router.get('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.show);
-
-/**
- * @api {post} /api/users/ Create pause.
- * @apiParam (Body) {String} name                                        Pause name.
- * @apiParam (Body) {String} [description]                               Pause description.
- *
- * @apiVersion 0.0.140
- * @apiName CreatePause
- * @apiGroup Pauses
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 201 Created
- *     {
- *        "id": 1
- *        "name": "BACKOFFICE"
- *        "description": "BACKOFFICE Pause"
- *     }
- */
-router.post('/', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.create);
-
-/**
- * @api {delete} /api/users/:id Update pause details.
- *
- * @apiParam (Params) {Number} id Pause unique ID.
- * @apiParam (Body) {String} name                                        Pause name.
- * @apiParam (Body) {String} [description]                               Pause description.
- *
- * @apiVersion 0.0.140
- * @apiName UpdatePause
- * @apiGroup Pauses
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 200 OK
- *     {
- *        "id": 1
- *        "name": "BACKOFFICE"
- *        "description": "BACKOFFICE Pause"
- *     }
- */
-router.put('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.update);
-
-/**
- * @api {delete} /api/pauses/ Bulk Delete pauses.
- *
- * @apiParam (Query) {Number[]} ids Pauses unique ID array.
- *
- * @apiVersion 0.0.140
- * @apiName BulkDeletePauses
- * @apiGroup Pauses
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 204 No Content
- */
-router.delete('/', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.bulkDestroy);
-
-/**
- * @api {delete} /api/telephones/:id Delete pause.
- *
- * @apiParam {Number} id Pause unique ID.
- *
- * @apiVersion 0.0.140
- * @apiName DeletePause
- * @apiGroup Pauses
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 204 No Content
- */
-router.delete('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/pause/pause.controller.js b/server/api/pause/pause.controller.js
index d33093a..68586e5 100644
--- a/server/api/pause/pause.controller.js
+++ b/server/api/pause/pause.controller.js
@@ -1,150 +1 @@
-/**
- * Using Rails-like standard naming convention for endpoints.
- * GET     /api/pauses              ->  index
- * POST    /api/pauses              ->  create
- * GET     /api/pauses/:id          ->  show
- * PUT     /api/pauses/:id          ->  update
- * DELETE  /api/pauses/:id          ->  destroy
- */
-
-'use strict';
-
-
-var _ = require('lodash');
-var Util = require('../../config/util');
-
-var Pause = require('../../models').Pause;
-
-
-function handleError(res, statusCode) {
-  statusCode = statusCode || 500;
-  return function(err) {
-    res.status(statusCode).send(err);
-  };
-}
-
-function responseWithResult(res, statusCode) {
-  statusCode = statusCode || 200;
-  return function(entity) {
-    if (entity) {
-      res.status(statusCode).json(entity);
-    }
-  };
-}
-
-function handleEntityNotFound(res) {
-  return function(entity) {
-    if (!entity) {
-      res.status(404).end();
-      return null;
-    }
-    return entity;
-  };
-}
-
-function saveUpdates(updates) {
-  return function(entity) {
-    return entity.updateAttributes(updates)
-      .then(function(updated) {
-        return updated;
-      });
-  };
-}
-
-function removeEntity(res) {
-  return function(entity) {
-    if (entity) {
-      return entity.destroy()
-        .then(function() {
-          res.status(204).end();
-        });
-    }
-  };
-}
-
-// Gets a list of Pauses
-exports.index = function(req, res) {
-  return Pause
-    .findAndCountAll(Util.getQuery(req.query))
-    .then(function(result) {
-      res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-}
-
-// Gets a single Pause from the DB
-exports.show = function(req, res) {
-  return Pause.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Creates a new Pause in the DB
-exports.create = function(req, res) {
-  return Pause.create(req.body)
-    .then(responseWithResult(res, 201))
-    .catch(handleError(res));
-}
-
-// Updates an existing Pause in the DB
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  return Pause.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(saveUpdates(req.body))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Deletes a Pause from the DB
-exports.destroy = function(req, res) {
-  return Pause.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(removeEntity(res))
-    .catch(handleError(res));
-}
-
-// Deletes a agent from the DB.
-exports.bulkDestroy = function(req, res) {
-
-  return Pause
-    .destroy({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function getQuery(query) {
-  var _query = {
-    where: {}
-  };
-
-  _.forEach(query, function(value, key) {
-    switch (key) {
-      case 'limit':
-      case 'offset':
-      case 'order':
-        _query[key] = value;
-        break;
-      default:
-        _query.where[key] = {
-          $like: '%' + value + '%'
-        };
-    }
-  });
-
-  return _query;
-}
\ No newline at end of file
diff --git a/server/api/pause/pause.events.js b/server/api/pause/pause.events.js
index 034b226..faf6947 100644
--- a/server/api/pause/pause.events.js
+++ b/server/api/pause/pause.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const Pause = require('../../models').Pause;
-
-var PauseEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-PauseEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  Pause.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    PauseEvents.emit(event + ':' + doc._id, doc);
-    PauseEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = PauseEvents;
\ No newline at end of file
diff --git a/server/api/pause/pause.socket.js b/server/api/pause/pause.socket.js
index c01be0c..697d514 100644
--- a/server/api/pause/pause.socket.js
+++ b/server/api/pause/pause.socket.js
@@ -1,28 +1 @@
-'use strict';
-
-const PauseEvents = require('./pause.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('pause:' + event, socket);
-
-    PauseEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    PauseEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/report_agent/index.js b/server/api/report_agent/index.js
index c0ded72..78ace18 100644
--- a/server/api/report_agent/index.js
+++ b/server/api/report_agent/index.js
@@ -1,13 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./report_agent.controller');
-var auth = require('../../auth/auth.service');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), auth.hasModule([17], ['admin', 'agent']), controller.index);
-router.get('/describe', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.describe);
-router.get('/active/calls', auth.isAuthenticated(), auth.hasModule([17], ['admin', 'agent']), controller.activeCalls);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/report_agent/report_agent.controller.js b/server/api/report_agent/report_agent.controller.js
index 4f27797..a4130a8 100644
--- a/server/api/report_agent/report_agent.controller.js
+++ b/server/api/report_agent/report_agent.controller.js
@@ -1,107 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var ReportAgent = require('../../models').ReportAgent;
-var User = require('../../models').User;
-var VoiceQueue = require('../../models').VoiceQueue;
-var ReportAgentHistory = require('../../models').history.ReportAgentHistory;
-var Util = require('../../config/util');
-
-// Get list of report_agents
-exports.index = function(req, res, next) {
-  var where = {};
-  if (req.user.role === 'agent') {
-    where.membername = req.user.name;
-  }
-  return ReportAgent
-    .findAndCountAll(Util.getQuery(req.query, where))
-    .then(function(result) {
-      return res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function getVoiceQueues(user) {
-  return function() {
-    switch (user.role) {
-      case 'user':
-        return User
-          .findById(user.id, {
-            attributes: ['id']
-          })
-          .then(Util.getVoiceQueuesIdByUser())
-          .then(function(userQueues) {
-            return _.map(userQueues.rows, 'name');
-          });
-      case 'agent':
-        return User
-          .findById(user.id)
-          .then(function(agent) {
-            return agent
-              .getVoiceQueues({
-                attributes: ['name']
-              });
-          })
-          .then(function(userQueues) {
-            return _.map(userQueues, 'name');
-          });
-      default:
-        return VoiceQueue
-          .findAll()
-          .then(function(queues) {
-            return {
-              rows: queues
-            };
-          })
-          .then(function(userQueues) {
-            return _.map(userQueues.rows, 'name');
-          });
-    }
-  }
-}
-
-// Get active Calls
-exports.activeCalls = function(req, res) {
-  var where = {};
-  if (req.user.role === 'agent') {
-    where.membername = req.user.fullname;
-  }
-  return Promise
-    .all([])
-    .then(getVoiceQueues(req.user))
-    .then(function(userQueues) {
-      return ReportAgent
-        .findAll(Util.getQuery(req.query, _.merge(where, {
-          agentcomplete: false,
-          agentringnoanswer: false,
-          agentdump: false
-        })));
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        rows: data,
-        count: data.length
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get list of fields
-exports.describe = function(req, res) {
-  return ReportAgentHistory
-    .describe()
-    .then(function(fields) {
-      return res.status(200).send(fields);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/report_agent/report_agent.events.js b/server/api/report_agent/report_agent.events.js
index 4a38996..253db35 100644
--- a/server/api/report_agent/report_agent.events.js
+++ b/server/api/report_agent/report_agent.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const ReportAgent = require('../../models').ReportAgent;
-
-var ReportAgentEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-ReportAgentEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'update',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  ReportAgent.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    ReportAgentEvents.emit(event + ':' + doc._id, doc);
-    ReportAgentEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = ReportAgentEvents;
\ No newline at end of file
diff --git a/server/api/report_agent/report_agent.socket.js b/server/api/report_agent/report_agent.socket.js
index 27b95f5..b3ac6fc 100644
--- a/server/api/report_agent/report_agent.socket.js
+++ b/server/api/report_agent/report_agent.socket.js
@@ -1,30 +1 @@
-'use strict';
-
-const ReportAgentEvents = require('./report_agent.events');
-
-// Model events to emit
-var events = ['save', 'update', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('report_agent:' + event, socket);
-
-    ReportAgentEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    if (socket.name === doc.membername || socket.role === 'admin') {
-      socket.emit(event, doc);
-    }
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    ReportAgentEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/report_call/index.js b/server/api/report_call/index.js
index 65350f2..2448e81 100644
--- a/server/api/report_call/index.js
+++ b/server/api/report_call/index.js
@@ -1,19 +1 @@
-'use strict';
-
-var express = require('express');
-var auth = require('../../auth/auth.service');
-var controller = require('./report_call.controller');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.index);
-router.get('/describe', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.describe);
-router.get('/manualoutbound', auth.isAuthenticated(), auth.hasModule([1], ['admin', 'agent']), controller.manualOutbound);
-router.get('/manualoutboundglobalduration', auth.isAuthenticated(), auth.hasModule([1], ['admin', 'agent']), controller.manualOutboundGlobalDuration);
-router.get('/manualoutboundavgduration', auth.isAuthenticated(), auth.hasModule([1], ['admin', 'agent']), controller.manualOutboundAvgDuration);
-router.get('/manualoutboundanswered', auth.isAuthenticated(), auth.hasModule([1], ['admin', 'agent']), controller.manualOutboundAnswered);
-router.get('/manualoutboundanswerrate', auth.isAuthenticated(), auth.hasModule([1], ['admin', 'agent']), controller.manualOutboundAnswerRate);
-router.put('/:uniqueid', auth.isAuthenticated(), auth.hasModule([1], ['admin', 'agent']), controller.update);
-
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/report_call/report_call.controller.js b/server/api/report_call/report_call.controller.js
index 9ba5632..ffdbb28 100644
--- a/server/api/report_call/report_call.controller.js
+++ b/server/api/report_call/report_call.controller.js
@@ -1,176 +1 @@
-/**
- * Using Rails-like standard naming convention for endpoints.
- * GET     /api/report/calls              ->  index
- * POST    /api/report/calls              ->  create
- * GET     /api/report/calls/:id          ->  show
- * PUT     /api/report/calls/:id          ->  update
- * DELETE  /api/report/calls/:id          ->  destroy
- */
-
-'use strict';
-
-
-var _ = require('lodash');
-
-var sequelize = require('../../models').sequelize;
-var ReportCall = require('../../models').ReportCall;
-var ReportCallHistory = require('../../models').history.ReportCallHistory;
-var Util = require('../../config/util');
-
-function handleError(res, statusCode) {
-  statusCode = statusCode || 500;
-  return function(err) {
-    console.log(err);
-    res.status(statusCode).send(err);
-  };
-}
-
-function responseWithResult(res, statusCode) {
-  statusCode = statusCode || 200;
-  return function(entity) {
-    if (entity) {
-      res.status(statusCode).json(entity);
-    }
-  };
-}
-
-function handleEntityNotFound(res) {
-  return function(entity) {
-    if (!entity) {
-      res.status(404).end();
-      return null;
-    }
-    return entity;
-  };
-}
-
-function saveUpdates(updates) {
-  return function(entity) {
-    return entity.updateAttributes(updates)
-      .then(function(updated) {
-        return updated;
-      });
-  };
-}
-
-function removeEntity(res) {
-  return function(entity) {
-    if (entity) {
-      return entity
-        .destroy()
-        .then(function() {
-          res.status(204).end();
-        });
-    }
-  };
-}
-
-// Gets a list of ReportCalls
-exports.index = function(req, res, next) {
-  return ReportCall
-    .findAndCountAll(Util.getQuery(req.query))
-    .then(function(result) {
-      return res.status(200).send(result);
-    })
-    .catch(handleError(res));
-};
-
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  return ReportCall.findOne({
-      where: {
-        uniqueid: req.params.uniqueid
-      }
-    })
-    .then(handleEntityNotFound(res))
-    .then(saveUpdates(req.body))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Get Answered Calls
-exports.manualOutbound = function(req, res) {
-  return ReportCall
-    .count({
-      where: {
-        type: 'outbound'
-      }
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        value: data
-      });
-    })
-    .catch(handleError(res));
-};
-
-// Get Answered Calls
-exports.manualOutboundGlobalDuration = function(req, res) {
-  return sequelize
-    .query('SELECT SEC_TO_TIME(SUM(duration)) as value FROM report_call WHERE type=\"outbound\"', {
-      type: sequelize.QueryTypes.SELECT
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        value: data[0].value
-      });
-    })
-    .catch(handleError(res));
-};
-
-// Get Answered Calls
-exports.manualOutboundAvgDuration = function(req, res) {
-  return sequelize
-    .query('SELECT SEC_TO_TIME(ROUND(AVG(duration), 0)) as value FROM report_call WHERE type=\"outbound\"', {
-      type: sequelize.QueryTypes.SELECT
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        value: data[0].value
-      });
-    })
-    .catch(handleError(res));
-};
-
-// Get Answered Calls
-exports.manualOutboundAnswered = function(req, res) {
-  return ReportCall
-    .count({
-      where: {
-        disposition: 'ANSWERED',
-        type: 'outbound'
-      }
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        value: data
-      });
-    })
-    .catch(handleError(res));
-};
-
-// Get Answered Calls
-exports.manualOutboundAnswerRate = function(req, res) {
-  return sequelize
-    .query('SELECT ROUND(SUM(IF(disposition=\"ANSWERED\", 1, 0)) / COUNT(*) * 100, 1) as value FROM report_call WHERE type=\"outbound\"', {
-      type: sequelize.QueryTypes.SELECT
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        value: data[0].value
-      });
-    })
-    .catch(handleError(res));
-};
-
-// Get list of fields
-exports.describe = function(req, res) {
-  return ReportCallHistory
-    .describe()
-    .then(function(fields) {
-      return res.status(200).send(fields);
-    })
-    .catch(handleError(res));
-};
\ No newline at end of file
diff --git a/server/api/report_call/report_call.events.js b/server/api/report_call/report_call.events.js
index 6ee64f5..c1328eb 100644
--- a/server/api/report_call/report_call.events.js
+++ b/server/api/report_call/report_call.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const ReportCall = require('../../models').ReportCall;
-
-var ReportCallEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-ReportCallEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  ReportCall.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    ReportCallEvents.emit(event + ':' + doc._id, doc);
-    ReportCallEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = ReportCallEvents;
\ No newline at end of file
diff --git a/server/api/report_call/report_call.socket.js b/server/api/report_call/report_call.socket.js
index b76cd89..61ad3d9 100644
--- a/server/api/report_call/report_call.socket.js
+++ b/server/api/report_call/report_call.socket.js
@@ -1,28 +1 @@
-'use strict';
-
-const ReportCallEvents = require('./report_call.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('report_call:' + event, socket);
-
-    ReportCallEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    ReportCallEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/report_chat/index.js b/server/api/report_chat/index.js
index b49820f..24328f7 100644
--- a/server/api/report_chat/index.js
+++ b/server/api/report_chat/index.js
@@ -1,14 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./report_chat.controller');
-var auth = require('../../auth/auth.service');
-var license = require('../../config/license/license.service');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), license.hasChat(), auth.hasModule([17], ['admin', 'agent']), controller.index);
-router.get('/:id/accept/:uniqueid', auth.isAuthenticated(), license.hasChat(), auth.hasRole('agent'), controller.accept);
-router.get('/:id/reject', auth.isAuthenticated(), license.hasChat(), auth.hasRole('agent'), controller.reject);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/report_chat/report_chat.controller.js b/server/api/report_chat/report_chat.controller.js
index f45b278..4df7ec2 100644
--- a/server/api/report_chat/report_chat.controller.js
+++ b/server/api/report_chat/report_chat.controller.js
@@ -1,163 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var md5 = require('md5');
-var moment = require('moment');
-
-var ReportChat = require('../../models').ReportChat;
-var ChatRoom = require('../../models').ChatRoom;
-var ChatVisitor = require('../../models').ChatVisitor;
-var Agent = require('../../models').User;
-var sequelize = require('../../models').sequelize;
-
-var Util = require('../../config/util');
-
-// Get list of agents
-exports.index = function(req, res, next) {
-  return ReportChat
-    .findAndCountAll(Util.getQuery(req.query))
-    .then(function(result) {
-      res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single reportMail
-exports.accept = function(req, res) {
-  var _roomid = req.params.uniqueid.split('.')[1];
-  var _chatRoom;
-
-  return ReportChat
-    .findById(req.params.id)
-    .then(function(reportChat) {
-      if (!reportChat) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(reportChat, {
-        connectid: req.params.uniqueid
-      });
-      return updated.save();
-    })
-    .then(function() {
-      return ChatRoom
-        .findById(_roomid);
-    })
-    .then(function(chatRoom) {
-      _chatRoom = chatRoom;
-      return _chatRoom
-        .addUser(req.user.id, {
-          individualHooks: true
-        });
-    })
-    .then(function() {
-      return _chatRoom
-        .update({
-          token: md5(JSON.stringify([req.user.id])).toString('base64'),
-          status: 'OPEN'
-        })
-    })
-    .then(function() {
-      return ChatVisitor.findById(_chatRoom.ChatVisitorId);
-    })
-    .then(function(chatVisitor) {
-      if (!chatVisitor) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(chatVisitor, {
-        status: 'accepted'
-      });
-      return updated.save();
-    })
-    .then(function() {
-      return res.sendStatus(200);
-    })
-    .catch(sequelize.UniqueConstraintError, function(err) {
-      return res.sendStatus(504);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new reportChat in the DB.
-exports.create = function(req, res) {
-  return ReportChat
-    .create(req.body)
-    .then(function(reportChat) {
-      return res.status(201).send(reportChat);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing reportChat in the DB.
-exports.update = function(req, res, next) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-
-  return ReportChat
-    .findById(req.params.id)
-    .then(function(reportChat) {
-      if (!reportChat) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(reportChat, req.body);
-      return updated
-        .save();
-    })
-    .then(function(reportChat) {
-      return res.status(200).send(reportChat);
-    })
-    .catch(sequelize.ValidationError, function(err) {
-      return handleError(res, err);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a reportChat from the DB.
-exports.destroy = function(req, res) {
-  return ReportChat
-    .findById(req.params.id)
-    .then(function(reportChat) {
-      if (!reportChat) {
-        return res.sendStatus(404);
-      }
-      return reportChat.destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.reject = function(req, res) {
-  return ReportChat
-    .findById(req.params.id)
-    .then(function(reportChat) {
-      if (!reportChat) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(reportChat, {
-        rejectedAt: moment().format("YYYY-MM-DD HH:mm:ss")
-      });
-      return updated.save();
-    })
-    .then(function() {
-      return res.sendStatus(200);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/report_chat/report_chat.events.js b/server/api/report_chat/report_chat.events.js
index dd23889..3c75d85 100644
--- a/server/api/report_chat/report_chat.events.js
+++ b/server/api/report_chat/report_chat.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const ReportChat = require('../../models').ReportChat;
-
-var ReportChatEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-ReportChatEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'update',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  ReportChat.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    ReportChatEvents.emit(event + ':' + doc._id, doc);
-    ReportChatEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = ReportChatEvents;
\ No newline at end of file
diff --git a/server/api/report_chat/report_chat.socket.js b/server/api/report_chat/report_chat.socket.js
index 092868e..e199f13 100644
--- a/server/api/report_chat/report_chat.socket.js
+++ b/server/api/report_chat/report_chat.socket.js
@@ -1,42 +1 @@
-'use strict';
-
-const ReportChatEvents = require('./report_chat.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('report_chat:' + event, socket);
-
-    ReportChatEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    switch (event) {
-      case 'report_chat:save':
-      case 'report_chat:update':
-        if (socket.name === doc.membername || socket.role === 'admin') {
-          socket.emit(event, doc);
-        }
-        break;
-
-      case 'report_chat:remove':
-        socket.emit(event, doc);
-        break;
-
-      default:
-
-    }
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    ReportChatEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/report_chat_session/index.js b/server/api/report_chat_session/index.js
index a90e04c..6275ef3 100644
--- a/server/api/report_chat_session/index.js
+++ b/server/api/report_chat_session/index.js
@@ -1,19 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./report_chat_session.controller');
-var auth = require('../../auth/auth.service');
-var license = require('../../config/license/license.service');
-
-var router = express.Router();
-
-router.get('/', license.isValidDate(), auth.isAuthenticated(), license.hasChat(), auth.hasModule([17], ['admin']), controller.index);
-router.get('/describe', license.isValidDate(), auth.isAuthenticated(), license.hasChat(), auth.hasModule([17], ['admin']), controller.describe);
-router.get('/open', license.isValidDate(), auth.isAuthenticated(), license.hasChat(), auth.hasModule([17], ['admin']), controller.open);
-router.get('/closed', license.isValidDate(), auth.isAuthenticated(), license.hasChat(), auth.hasModule([17], ['admin']), controller.closed);
-router.get('/timeout', license.isValidDate(), auth.isAuthenticated(), license.hasChat(), auth.hasModule([17], ['admin']), controller.timeout);
-router.get('/waiting', license.isValidDate(), auth.isAuthenticated(), license.hasChat(), auth.hasModule([17], ['admin']), controller.waiting);
-router.get('/abandoned', license.isValidDate(), auth.isAuthenticated(), license.hasChat(), auth.hasModule([17], ['admin']), controller.abandoned);
-router.get('/waiting/applications', license.isValidDate(), auth.isAuthenticated(), license.hasChat(), auth.hasModule([8], ['admin', 'agent']), controller.waitingApplications);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/report_chat_session/report_chat_session.controller.js b/server/api/report_chat_session/report_chat_session.controller.js
index 74b5dde..456cc49 100644
--- a/server/api/report_chat_session/report_chat_session.controller.js
+++ b/server/api/report_chat_session/report_chat_session.controller.js
@@ -1,225 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var ReportChatSession = require('../../models').ReportChatSession;
-var User = require('../../models').User;
-var ReportChatSessionHistory = require('../../models').history.ReportChatSessionHistory;
-var Promise = require('bluebird');
-
-var Util = require('../../config/util');
-
-// Get list of agents
-exports.index = function(req, res, next) {
-  return ReportChatSession
-    .findAndCountAll(Util.getQuery(req.query))
-    .then(function(result) {
-      res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-// Get list of fields
-exports.describe = function(req, res) {
-  return ReportChatSessionHistory
-    .describe()
-    .then(function(fields) {
-      return res.status(200).send(fields);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function getChatQueues(user) {
-  return function() {
-    switch (user.role) {
-      case 'user':
-        return User
-          .findById(user.id, {
-            attributes: ['id']
-          })
-          .then(Util.getChatQueuesIdByUser({}, {
-            attributes: ['id'],
-            include: [{
-              raw: true,
-              model: User,
-              attributes: ['id']
-            }]
-          }))
-          .then(function(userQueues) {
-            var users = [];
-            userQueues.rows.forEach(function(queue) {
-              users = _.union(users, _.map(queue.Users, 'id'));
-            });
-            return {
-              $or: {
-                queue: _.map(userQueues.rows, 'id'),
-                memberid: users
-              }
-            };
-          });
-      case 'agent':
-        return User
-          .findById(user.id, {
-            attributes: ['id']
-          })
-          .then(function(agent) {
-            return agent
-              .getChatQueues({
-                attributes: ['id']
-              });
-          })
-          .then(function(userQueues) {
-            return {
-              $or: {
-                queue: _.map(userQueues, 'id'),
-                memberid: user.id
-              }
-            };
-          });
-      default:
-        return {};
-    }
-  }
-}
-
-// Get Waiting apps
-exports.waitingApplications = function(req, res) {
-  return Promise
-    .all([])
-    .then(getChatQueues(req.user))
-    .then(function(condition) {
-      return ReportChatSession
-        .findAll(Util.getQuery(req.query, _.merge({
-          leaveAt: null
-        }, condition)));
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        rows: data
-      });
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-// Get open apps
-exports.open = function(req, res) {
-  return Promise
-    .all([])
-    .then(getChatQueues(req.user))
-    .then(function(condition) {
-      return ReportChatSession
-        .count(Util.getQuery(req.query, _.merge({
-          leaveAt: {
-            $ne: null
-          },
-          complete: null,
-          abandon: null,
-          timeout: null
-        }, condition)));
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-exports.waiting = function(req, res) {
-  return Promise
-    .all([])
-    .then(getChatQueues(req.user))
-    .then(function(condition) {
-      return ReportChatSession
-        .count(Util.getQuery(req.query, _.merge({
-          leaveAt: null
-        }, condition)));
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-// Get closed apps
-exports.closed = function(req, res) {
-  return Promise
-    .all([])
-    .then(getChatQueues(req.user))
-    .then(function(condition) {
-      return ReportChatSession
-        .count(Util.getQuery(req.query, _.merge({
-          complete: true
-        }, condition)));
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-// Get timeout apps
-exports.timeout = function(req, res) {
-  return Promise
-    .all([])
-    .then(getChatQueues(req.user))
-    .then(function(condition) {
-      return ReportChatSession
-        .count(Util.getQuery(req.query, _.merge({
-          timeout: true
-        }, condition)));
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-// Get abandoned apps
-exports.abandoned = function(req, res) {
-  return Promise
-    .all([])
-    .then(getChatQueues(req.user))
-    .then(function(condition) {
-      return ReportChatSession
-        .count(Util.getQuery(req.query, _.merge({
-          abandon: true
-        }, condition)));
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/report_chat_session/report_chat_session.events.js b/server/api/report_chat_session/report_chat_session.events.js
index 5ae9bac..828c8a8 100644
--- a/server/api/report_chat_session/report_chat_session.events.js
+++ b/server/api/report_chat_session/report_chat_session.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const ReportChatSession = require('../../models').ReportChatSession;
-
-var ReportChatSessionEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-ReportChatSessionEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  ReportChatSession.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    ReportChatSessionEvents.emit(event + ':' + doc._id, doc);
-    ReportChatSessionEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = ReportChatSessionEvents;
\ No newline at end of file
diff --git a/server/api/report_chat_session/report_chat_session.socket.js b/server/api/report_chat_session/report_chat_session.socket.js
index f9b1796..8d87613 100644
--- a/server/api/report_chat_session/report_chat_session.socket.js
+++ b/server/api/report_chat_session/report_chat_session.socket.js
@@ -1,102 +1 @@
-'use strict';
-
-const ReportChatSessionEvents = require('./report_chat_session.events');
-const ReportChatSession = require('../../models').ReportChatSession;
-const User = require('../../models').User;
-const Util = require('../../config/util');
-
-const _ = require('lodash');
-const Promise = require('bluebird');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('report_chat_session:' + event, socket);
-
-    ReportChatSessionEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    onSave(socket, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    ReportChatSessionEvents.removeListener(event, listener);
-  };
-}
-
-
-function getChatQueues(user) {
-  return function() {
-    switch (user.role) {
-      case 'user':
-        return User
-          .findById(user.userId, {
-            attributes: ['id']
-          })
-          .then(Util.getChatQueuesIdByUser({}, {
-            attributes: ['id'],
-            include: [{
-              raw: true,
-              model: User,
-              attributes: ['id']
-            }]
-          }))
-          .then(function(userQueues) {
-            var users = [];
-            userQueues.rows.forEach(function(queue) {
-              users = _.union(users, _.map(queue.Users, 'id'));
-            });
-            return {
-              queue: _.map(userQueues.rows, 'id'),
-              memberid: users
-            };
-          });
-      case 'agent':
-        return User
-          .findById(user.userId, {
-            attributes: ['id']
-          })
-          .then(function(agent) {
-            return agent
-              .getChatQueues({
-                attributes: ['id']
-              });
-          })
-          .then(function(userQueues) {
-            return {
-              queue: _.map(userQueues, 'id'),
-              memberid: user.userId
-            };
-          });
-      default:
-        return {};
-    }
-  }
-}
-
-function onSave(socket, doc, cb) {
-  return Promise
-    .all([])
-    .then(getChatQueues(socket))
-    .then(function(condition) {
-      if (socket.role === 'admin' || _.includes(condition.memberid, doc.memberid) || _.includes(condition.queue, doc.queue)) {
-        socket.emit('report_chat_session:save', doc);
-      }
-    })
-    .catch(function(err) {
-      console.log('Error filtering report chat sessions after save', err);
-    });
-}
-
-function onRemove(socket, doc, cb) {
-  socket.emit('report_chat_session:remove', doc);
-}
\ No newline at end of file
diff --git a/server/api/report_dial/index.js b/server/api/report_dial/index.js
index ea59483..bcaee34 100644
--- a/server/api/report_dial/index.js
+++ b/server/api/report_dial/index.js
@@ -1,14 +1 @@
-'use strict';
-
-var express = require('express');
-var auth = require('../../auth/auth.service');
-var controller = require('./report_dial.controller');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), auth.hasModule([17], ['admin', 'agent']), controller.index);
-router.get('/describe', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.describe);
-router.get('/active/calls', auth.isAuthenticated(), auth.hasModule([7], ['admin', 'agent']), controller.activeCalls);
-
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/report_dial/report_dial.controller.js b/server/api/report_dial/report_dial.controller.js
index 5db39fb..ec90b2d 100644
--- a/server/api/report_dial/report_dial.controller.js
+++ b/server/api/report_dial/report_dial.controller.js
@@ -1,116 +1 @@
-/**
- * Using Rails-like standard naming convention for endpoints.
- * GET     /api/report/dials              ->  index
- * POST    /api/report/dials              ->  create
- * GET     /api/report/dials/:id          ->  show
- * PUT     /api/report/dials/:id          ->  update
- * DELETE  /api/report/dials/:id          ->  destroy
- */
-
-'use strict';
-
-
-var _ = require('lodash');
-
-var sequelize = require('../../models').sequelize;
-var ReportDial = require('../../models').ReportDial;
-var ReportDialHistory = require('../../models').history.ReportDialHistory;
-var Util = require('../../config/util');
-
-function handleError(res, statusCode) {
-  statusCode = statusCode || 500;
-  return function(err) {
-    console.log(err);
-    res.status(statusCode).send(err);
-  };
-}
-
-function responseWithResult(res, statusCode) {
-  statusCode = statusCode || 200;
-  return function(entity) {
-    if (entity) {
-      res.status(statusCode).json(entity);
-    }
-  };
-}
-
-function handleEntityNotFound(res) {
-  return function(entity) {
-    if (!entity) {
-      res.status(404).end();
-      return null;
-    }
-    return entity;
-  };
-}
-
-function saveUpdates(updates) {
-  return function(entity) {
-    return entity.updateAttributes(updates)
-      .then(function(updated) {
-        return updated;
-      });
-  };
-}
-
-function removeEntity(res) {
-  return function(entity) {
-    if (entity) {
-      return entity
-        .destroy()
-        .then(function() {
-          res.status(204).end();
-        });
-    }
-  };
-}
-
-// Gets a list of ReportDials
-exports.index = function(req, res, next) {
-  return ReportDial
-    .findAndCountAll(Util.getQuery(req.query))
-    .then(function(data) {
-      if (req.user.role === 'agent') {
-        var filteredData = [];
-        _.forEach(data.rows, function(elem) {
-          if (elem.channel && elem.channel.split(/\/|-/)[1] === req.user.name) {
-            filteredData.push(elem);
-          }
-        });
-        return {
-          rows: filteredData,
-          count: filteredData.length
-        };
-      }
-      return data;
-    })
-    .then(function(data) {
-      return res.status(200).send(data);
-    })
-    .catch(handleError(res));
-};
-
-// Get Active Calls
-exports.activeCalls = function(req, res) {
-  return ReportDial
-    .findAll(Util.getQuery(req.query, {
-      endtime: null
-    }))
-    .then(function(data) {
-      return res.status(200).send({
-        rows: data,
-        count: data.length
-      });
-    })
-    .catch(handleError(res));
-};
-
-// Get list of fields
-exports.describe = function(req, res) {
-  return ReportDialHistory
-    .describe()
-    .then(function(fields) {
-      return res.status(200).send(fields);
-    })
-    .catch(handleError(res));
-};
\ No newline at end of file
diff --git a/server/api/report_dial/report_dial.events.js b/server/api/report_dial/report_dial.events.js
index 385b3cf..a7e403a 100644
--- a/server/api/report_dial/report_dial.events.js
+++ b/server/api/report_dial/report_dial.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const ReportDial = require('../../models').ReportDial;
-
-var ReportDialEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-ReportDialEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'update',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  ReportDial.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    ReportDialEvents.emit(event + ':' + doc._id, doc);
-    ReportDialEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = ReportDialEvents;
\ No newline at end of file
diff --git a/server/api/report_dial/report_dial.socket.js b/server/api/report_dial/report_dial.socket.js
index 7d9498d..fb968bc 100644
--- a/server/api/report_dial/report_dial.socket.js
+++ b/server/api/report_dial/report_dial.socket.js
@@ -1,30 +1 @@
-'use strict';
-
-const ReportDialEvents = require('./report_dial.events');
-
-// Model events to emit
-var events = ['save', 'update', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('report_dial:' + event, socket);
-
-    ReportDialEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    if (socket.role === 'admin' || (doc.channel && doc.channel.split(/\/|-/)[1] === socket.name)) {
-      socket.emit(event, doc);
-    }
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    ReportDialEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/report_fax/index.js b/server/api/report_fax/index.js
index e19c074..f6c3214 100644
--- a/server/api/report_fax/index.js
+++ b/server/api/report_fax/index.js
@@ -1,13 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./report_fax.controller');
-var auth = require('../../auth/auth.service');
-var license = require('../../config/license/license.service');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), license.hasFax(), auth.hasModule([17], ['admin', 'agent']), controller.index);
-router.get('/:id/accept/:uniqueid', auth.isAuthenticated(), license.hasFax(), auth.hasRole('agent'), controller.accept);
-router.get('/:id/reject', auth.isAuthenticated(), license.hasFax(), auth.hasRole('agent'), controller.reject);
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/report_fax/report_fax.controller.js b/server/api/report_fax/report_fax.controller.js
index 55d6694..abcd651 100644
--- a/server/api/report_fax/report_fax.controller.js
+++ b/server/api/report_fax/report_fax.controller.js
@@ -1,127 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var moment = require('moment');
-
-var FaxRoom = require('../../models').FaxRoom;
-var FaxRoomStatus = require('../../models').FaxRoomStatus;
-var ReportFax = require('../../models').ReportFax;
-var sequelize = require('../../models').sequelize;
-var Agent = require('../../models').User;
-
-var Util = require('../../config/util');
-
-// Get list of agents
-exports.index = function(req, res, next) {
-  return ReportFax
-    .findAndCountAll(Util.getQuery(req.query))
-    .then(function(result) {
-      res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single reportMail
-exports.accept = function(req, res) {
-  var _agent;
-  var _roomid = req.params.uniqueid.split('.')[1];
-
-  return Agent
-    .findById(req.user.id, {
-      attributes: ['id', 'faxCapacity']
-    })
-    .then(function(agent) {
-      _agent = agent;
-      return agent
-        .getFaxRooms({
-          where: {
-            status: {
-              $ne: 'CLOSED'
-            },
-            id: {
-              $ne: _roomid
-            }
-          },
-          attributes: ['id']
-        });
-    })
-    .then(function(faxRooms) {
-      return ReportFax
-        .findById(req.params.id);
-    })
-    .then(function(reportFax) {
-      if (!reportFax) {
-        return res.sendStatus(404);
-      }
-
-      var updated = _.merge(reportFax, {
-        connectid: req.params.uniqueid
-      });
-
-      return updated
-        .save();
-    })
-    .then(function() {
-      return FaxRoom
-        .update({
-          status: 'OPEN',
-          openReason: 'agent'
-        }, {
-          where: {
-            id: _roomid
-          },
-          user: req.user,
-          individualHooks: true
-        });
-    })
-    .then(function() {
-      return res.sendStatus(200);
-    })
-    .catch(sequelize.UniqueConstraintError, function(err) {
-      return res.sendStatus(504);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single reportMail
-exports.reject = function(req, res) {
-  var _report;
-
-  return ReportFax
-    .findById(req.params.id)
-    .then(function(reportFax) {
-      _report = reportFax;
-      if (!reportFax) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(reportFax, {
-        rejectedAt: moment().format("YYYY-MM-DD HH:mm:ss")
-      });
-      return updated
-        .save();
-    })
-    .then(function() {
-      return FaxRoomStatus
-        .create({
-          status: 'REJECT',
-          data1: req.user.name,
-          data2: req.user.fullname,
-          UserId: req.user.id,
-          MailRoomId: _report.roomid
-        });
-    })
-    .then(function() {
-      return res.sendStatus(200);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/report_fax/report_fax.events.js b/server/api/report_fax/report_fax.events.js
index f0e5f3e..573955c 100644
--- a/server/api/report_fax/report_fax.events.js
+++ b/server/api/report_fax/report_fax.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const ReportFax = require('../../models').ReportFax;
-
-var ReportFaxEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-ReportFaxEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'update',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  ReportFax.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    ReportFaxEvents.emit(event + ':' + doc._id, doc);
-    ReportFaxEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = ReportFaxEvents;
\ No newline at end of file
diff --git a/server/api/report_fax/report_fax.socket.js b/server/api/report_fax/report_fax.socket.js
index 7d32de9..e9098b5 100644
--- a/server/api/report_fax/report_fax.socket.js
+++ b/server/api/report_fax/report_fax.socket.js
@@ -1,44 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const ReportFaxEvents = require('./report_fax.events');
-
-// Model events to emit
-var events = ['save', 'update', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('report_fax:' + event, socket);
-
-    ReportFaxEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    switch (event) {
-      case 'report_fax:save':
-      case 'report_fax:update':
-        if (socket.name === doc.membername || socket.role === 'admin') {
-          socket.emit(event, doc);
-        }
-        break;
-      case 'report_fax:remove':
-        socket.emit(event, doc);
-        break;
-      default:
-
-    }
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    ReportFaxEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/report_fax_session/index.js b/server/api/report_fax_session/index.js
index 14bf55c..1aee410 100644
--- a/server/api/report_fax_session/index.js
+++ b/server/api/report_fax_session/index.js
@@ -1,15 +1 @@
-'use strict';
-
-var express = require('express');
-var auth = require('../../auth/auth.service');
-var controller = require('./report_fax_session.controller');
-var license = require('../../config/license/license.service');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), license.hasFax(), auth.hasModule([17], ['admin']), controller.index);
-router.get('/describe', auth.isAuthenticated(), license.hasFax(), auth.hasModule([17], ['admin']), controller.describe);
-router.get('/timeout', license.isValidDate(), auth.isAuthenticated(), license.hasFax(), auth.hasModule([17], ['admin']), controller.timeout);
-router.get('/waiting', license.isValidDate(), auth.isAuthenticated(), license.hasFax(), auth.hasModule([17], ['admin']), controller.waiting);
-router.get('/waiting/applications', auth.isAuthenticated(), license.hasFax(), auth.hasModule([10], ['admin', 'agent']), controller.waitingApplications);
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/report_fax_session/report_fax_session.controller.js b/server/api/report_fax_session/report_fax_session.controller.js
index 29bf8ba..75b5838 100644
--- a/server/api/report_fax_session/report_fax_session.controller.js
+++ b/server/api/report_fax_session/report_fax_session.controller.js
@@ -1,238 +1 @@
-/**
- * Using Rails-like standard naming convention for endpoints.
- * GET     /api/report/fax/sessions              ->  index
- * POST    /api/report/fax/sessions              ->  create
- * GET     /api/report/fax/sessions/:id          ->  show
- * PUT     /api/report/fax/sessions/:id          ->  update
- * DELETE  /api/report/fax/sessions/:id          ->  destroy
- */
-
-'use strict';
-
-
-var _ = require('lodash');
-var Util = require('../../config/util');
-
-var ReportFaxSession = require('../../models').ReportFaxSession;
-var ReportFaxSessionHistory = require('../../models').history.ReportFaxSessionHistory;
-var User = require('../../models').User;
-
-
-function handleError(res, statusCode) {
-  statusCode = statusCode || 500;
-  return function(err) {
-    res.status(statusCode).send(err);
-  };
-}
-
-function responseWithResult(res, statusCode) {
-  statusCode = statusCode || 200;
-  return function(entity) {
-    if (entity) {
-      res.status(statusCode).json(entity);
-    }
-  };
-}
-
-function responseWithoutResult(res, statusCode) {
-  statusCode = statusCode || 204;
-  return function() {
-    res.sendStatus(statusCode);
-  };
-}
-
-function handleEntityNotFound(res) {
-  return function(entity) {
-    if (!entity) {
-      res.status(404).end();
-      return null;
-    }
-    return entity;
-  };
-}
-
-function saveUpdates(updates) {
-  return function(entity) {
-    return entity.updateAttributes(updates)
-      .then(function(updated) {
-        return updated;
-      });
-  };
-}
-
-function removeEntity(res) {
-  return function(entity) {
-    if (entity) {
-      return entity.destroy()
-        .then(function() {
-          res.status(204).end();
-        });
-    }
-  };
-}
-
-// Gets a list of ReportFaxSessions
-exports.index = function(req, res) {
-  return ReportFaxSession.findAll(Util.getQuery(req.query))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Gets a single ReportFaxSession from the DB
-exports.show = function(req, res) {
-  return ReportFaxSession.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Creates a new ReportFaxSession in the DB
-exports.create = function(req, res) {
-  return ReportFaxSession.create(req.body)
-    .then(responseWithResult(res, 201))
-    .catch(handleError(res));
-}
-
-// Updates an existing ReportFaxSession in the DB
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  return ReportFaxSession.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(saveUpdates(req.body))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Deletes a ReportFaxSession from the DB
-exports.destroy = function(req, res) {
-  return ReportFaxSession.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(removeEntity(res))
-    .catch(handleError(res));
-}
-
-exports.describe = function(req, res) {
-  return ReportFaxSessionHistory
-    .describe()
-    .then(function(fields) {
-      return res.status(200).send(fields);
-    })
-    .catch(handleError(res));
-};
-
-// Get timeout apps
-exports.timeout = function(req, res) {
-  return Promise
-    .all([])
-    .then(getFaxQueues(req.user))
-    .then(function(condition) {
-      return ReportFaxSession
-        .count(Util.getQuery(req.query, _.merge({
-          timeout: true
-        }, condition)));
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-// Get waiting apps
-exports.waiting = function(req, res) {
-  return Promise
-    .all([])
-    .then(getFaxQueues(req.user))
-    .then(function(condition) {
-      return ReportFaxSession
-        .count(Util.getQuery(req.query, _.merge({
-          leaveAt: null
-        }, condition)));
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-exports.waitingApplications = function(req, res) {
-  return Promise
-    .all([])
-    .then(getFaxQueues(req.user))
-    .then(function(condition) {
-      return ReportFaxSession
-        .findAll(Util.getQuery(req.query, _.merge({
-          leaveAt: null
-        }, condition)));
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        rows: data
-      });
-    })
-    .catch(handleError(res));
-};
-
-function getFaxQueues(user) {
-  return function() {
-    switch (user.role) {
-      case 'user':
-        return User
-          .findById(user.id, {
-            attributes: ['id']
-          })
-          .then(Util.getFaxQueuesIdByUser({}, {
-            attributes: ['id'],
-            include: [{
-              raw: true,
-              model: User,
-              attributes: ['id']
-            }]
-          }))
-          .then(function(userQueues) {
-            var users = [];
-            userQueues.rows.forEach(function(queue) {
-              users = _.union(users, _.map(queue.Users, 'id'));
-            });
-            return {
-              $or: {
-                queue: _.map(userQueues.rows, 'id'),
-                memberid: users
-              }
-            };
-          });
-      case 'agent':
-        return User
-          .findById(user.id, {
-            attributes: ['id']
-          })
-          .then(function(agent) {
-            return agent
-              .getFaxQueues({
-                attributes: ['id']
-              });
-          })
-          .then(function(userQueues) {
-            return {
-              $or: {
-                queue: _.map(userQueues, 'id'),
-                memberid: user.id
-              }
-            };
-          });
-      default:
-        return {};
-    }
-  }
-}
\ No newline at end of file
diff --git a/server/api/report_fax_session/report_fax_session.events.js b/server/api/report_fax_session/report_fax_session.events.js
index 6d9b5cc..3f8c219 100644
--- a/server/api/report_fax_session/report_fax_session.events.js
+++ b/server/api/report_fax_session/report_fax_session.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const ReportFaxSession = require('../../models').ReportFaxSession;
-
-var ReportFaxSessionEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-ReportFaxSessionEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  ReportFaxSession.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    ReportFaxSessionEvents.emit(event + ':' + doc._id, doc);
-    ReportFaxSessionEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = ReportFaxSessionEvents;
\ No newline at end of file
diff --git a/server/api/report_fax_session/report_fax_session.socket.js b/server/api/report_fax_session/report_fax_session.socket.js
index 53585b9..6b09913 100644
--- a/server/api/report_fax_session/report_fax_session.socket.js
+++ b/server/api/report_fax_session/report_fax_session.socket.js
@@ -1,104 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const ReportFaxSession = require('./report_fax_session.events');
-const User = require('../../models').User;
-const Util = require('../../config/util');
-const _ = require('lodash');
-const Promise = require('bluebird');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('report_fax_session:' + event, socket);
-
-    ReportFaxSession.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    switch (event) {
-      case 'report_fax_session:save':
-        return Promise
-          .all([])
-          .then(getFaxQueues(socket))
-          .then(function(condition) {
-            if (socket.role === 'admin' || _.includes(condition.memberid, doc.memberid) || _.includes(condition.queue, doc.queue)) {
-              socket.emit(event, doc);
-            }
-          })
-          .catch(function(err) {
-            console.log('Error filtering report fax sessions after save', err);
-          });
-      case 'report_fax_session:remove':
-        socket.emit(event, doc);
-        break;
-
-      default:
-
-    }
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    ReportFaxSession.removeListener(event, listener);
-  };
-}
-
-function getFaxQueues(user) {
-  return function() {
-    switch (user.role) {
-      case 'user':
-        return User
-          .findById(user.userId, {
-            attributes: ['id']
-          })
-          .then(Util.getFaxQueuesIdByUser({}, {
-            attributes: ['id'],
-            include: [{
-              raw: true,
-              model: User,
-              attributes: ['id']
-            }]
-          }))
-          .then(function(userQueues) {
-            var users = [];
-            userQueues.rows.forEach(function(queue) {
-              users = _.union(users, _.map(queue.Users, 'id'));
-            });
-            return {
-              queue: _.map(userQueues.rows, 'id'),
-              memberid: users
-            };
-          });
-      case 'agent':
-        return User
-          .findById(user.userId, {
-            attributes: ['id']
-          })
-          .then(function(agent) {
-            return agent
-              .getFaxQueues({
-                attributes: ['id']
-              });
-          })
-          .then(function(userQueues) {
-            return {
-              queue: _.map(userQueues, 'id'),
-              memberid: user.userId
-            };
-          });
-      default:
-        return {};
-    }
-  }
-}
\ No newline at end of file
diff --git a/server/api/report_integration/index.js b/server/api/report_integration/index.js
index 80f013c..b76a069 100644
--- a/server/api/report_integration/index.js
+++ b/server/api/report_integration/index.js
@@ -1,13 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./report_integration.controller');
-var auth = require('../../auth/auth.service');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.index);
-router.get('/describe', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.describe);
-router.post('/', auth.isAuthenticated(), controller.create);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/report_integration/report_integration.controller.js b/server/api/report_integration/report_integration.controller.js
index ebc479d..33cf812 100644
--- a/server/api/report_integration/report_integration.controller.js
+++ b/server/api/report_integration/report_integration.controller.js
@@ -1,46 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var ReportIntegration = require('../../models').ReportIntegration;
-var ReportIntegrationHistory = require('../../models').history.ReportIntegrationHistory;
-var Util = require('../../config/util');
-
-// Get list of report_integrations
-exports.index = function(req, res, next) {
-  return ReportIntegration
-    .findAndCountAll(Util.getQuery(req.query))
-    .then(function(result) {
-      return res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get list of fields
-exports.describe = function(req, res) {
-  return ReportIntegrationHistory
-    .describe()
-    .then(function(fields) {
-      return res.status(200).send(fields);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new report_integration in the DB.
-exports.create = function(req, res) {
-  return ReportIntegration
-    .create(req.body)
-    .then(function(report_integration) {
-      return res.status(201).send(report_integration);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/report_integration/report_integration.events.js b/server/api/report_integration/report_integration.events.js
index ea294b9..a05e639 100644
--- a/server/api/report_integration/report_integration.events.js
+++ b/server/api/report_integration/report_integration.events.js
@@ -1,34 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const ReportIntegration = require('../../models').ReportIntegration;
-
-var ReportIntegrationEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-ReportIntegrationEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  ReportIntegration.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    ReportIntegrationEvents.emit(event + ':' + doc._id, doc);
-    ReportIntegrationEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = ReportIntegrationEvents;
\ No newline at end of file
diff --git a/server/api/report_integration/report_integration.socket.js b/server/api/report_integration/report_integration.socket.js
index 78f2dea..e08a421 100644
--- a/server/api/report_integration/report_integration.socket.js
+++ b/server/api/report_integration/report_integration.socket.js
@@ -1,41 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const ReportIntegrationEvents = require('./report_integration.events');
-const util = require('util');
-
-// Model events to emit
-var events = ['save'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('report_integration:' + event, socket);
-
-    ReportIntegrationEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    switch (event) {
-      case 'report_integration:save':
-        if (socket.name === doc.membername) {
-          socket.emit(util.format('report_integration:%s', doc.integration), doc);
-        }
-        break;
-      default:
-
-    }
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    ReportIntegrationEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/report_mail/index.js b/server/api/report_mail/index.js
index 9256f76..b355294 100644
--- a/server/api/report_mail/index.js
+++ b/server/api/report_mail/index.js
@@ -1,14 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./report_mail.controller');
-var auth = require('../../auth/auth.service');
-var license = require('../../config/license/license.service');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), license.hasMail(), auth.hasModule([17], ['admin', 'agent']), controller.index);
-router.get('/:id/accept/:uniqueid', auth.isAuthenticated(), license.hasMail(), auth.hasRole('agent'), controller.accept);
-router.get('/:id/reject', auth.isAuthenticated(), license.hasMail(), auth.hasRole('agent'), controller.reject);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/report_mail/report_mail.controller.js b/server/api/report_mail/report_mail.controller.js
index c0a5cde..1827704 100644
--- a/server/api/report_mail/report_mail.controller.js
+++ b/server/api/report_mail/report_mail.controller.js
@@ -1,113 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var moment = require('moment');
-
-var Report = require('../../models').ReportMail;
-var Room = require('../../models').MailRoom;
-var Status = require('../../models').MailRoomStatus;
-
-var sequelize = require('../../models').sequelize;
-
-var Util = require('../../config/util');
-
-// Get list of agents
-exports.index = function(req, res, next) {
-  var where = {};
-  if (req.user.role === 'agent') {
-    where.membername = req.user.name;
-  }
-  return Report
-    .findAndCountAll(Util.getQuery(req.query, where))
-    .then(function(result) {
-      res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single reportMail
-exports.accept = function(req, res) {
-  var _roomid = req.params.uniqueid.split('.')[1];
-
-  return Report
-    .findById(req.params.id)
-    .then(function(reportMail) {
-      if (!reportMail) {
-        return res.sendStatus(404);
-      }
-
-      var updated = _.merge(reportMail, {
-        connectid: req.params.uniqueid
-      });
-
-      return updated
-        .save();
-    })
-    .then(function() {
-      return Room
-        .update({
-          status: 'OPEN',
-          openReason: 'agent'
-        }, {
-          where: {
-            id: _roomid
-          },
-          user: req.user,
-          individualHooks: true
-        });
-    })
-    .then(function() {
-      return res.sendStatus(200);
-    })
-    .catch(sequelize.UniqueConstraintError, function(err) {
-      return res.sendStatus(504);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single reportMail
-exports.reject = function(req, res) {
-  var _report;
-
-  return Report
-    .findById(req.params.id)
-    .then(function(report) {
-      _report = report;
-
-      if (!_report) {
-        return res.sendStatus(404);
-      }
-
-      var updated = _.merge(report, {
-        rejectedAt: moment().format("YYYY-MM-DD HH:mm:ss")
-      });
-
-      return updated
-        .save();
-    })
-    .then(function() {
-      return Status
-        .create({
-          status: 'REJECT',
-          data1: req.user.name,
-          data2: req.user.fullname,
-          UserId: req.user.id,
-          MailRoomId: _report.roomid
-        });
-    })
-    .then(function() {
-      return res.sendStatus(200);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  console.log(err);
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/report_mail/report_mail.events.js b/server/api/report_mail/report_mail.events.js
index 4a48caa..ed04a4c 100644
--- a/server/api/report_mail/report_mail.events.js
+++ b/server/api/report_mail/report_mail.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const ReportMail = require('../../models').ReportMail;
-
-var ReportMailEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-ReportMailEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'update',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  ReportMail.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    ReportMailEvents.emit(event + ':' + doc._id, doc);
-    ReportMailEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = ReportMailEvents;
\ No newline at end of file
diff --git a/server/api/report_mail/report_mail.socket.js b/server/api/report_mail/report_mail.socket.js
index 0b9cab3..ad64926 100644
--- a/server/api/report_mail/report_mail.socket.js
+++ b/server/api/report_mail/report_mail.socket.js
@@ -1,46 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const ReportMailEvents = require('./report_mail.events');
-
-// Model events to emit
-var events = ['save', 'update', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('report_mail:' + event, socket);
-
-    ReportMailEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    switch (event) {
-      case 'report_mail:save':
-      case 'report_mail:update':
-        if (socket.name === doc.membername || socket.role === 'admin') {
-          socket.emit(event, doc);
-        }
-        break;
-
-      case 'report_mail:remove':
-        socket.emit(event, doc);
-        break;
-
-      default:
-
-    }
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    ReportMailEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/report_mail_session/index.js b/server/api/report_mail_session/index.js
index 3e04193..ecb13f9 100644
--- a/server/api/report_mail_session/index.js
+++ b/server/api/report_mail_session/index.js
@@ -1,16 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./report_mail_session.controller');
-var auth = require('../../auth/auth.service');
-var license = require('../../config/license/license.service');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), license.hasMail(), auth.hasModule([17], ['admin']), controller.index);
-router.get('/describe', auth.isAuthenticated(), license.hasMail(), auth.hasModule([17], ['admin']), controller.describe);
-router.get('/timeout', license.isValidDate(), auth.isAuthenticated(), license.hasMail(), auth.hasModule([17], ['admin']), controller.timeout);
-router.get('/waiting', license.isValidDate(), auth.isAuthenticated(), license.hasMail(), auth.hasModule([17], ['admin']), controller.waiting);
-router.get('/waiting/applications', auth.isAuthenticated(), license.hasMail(), auth.hasModule([9], ['admin', 'agent']), controller.waitingApplications);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/report_mail_session/report_mail_session.controller.js b/server/api/report_mail_session/report_mail_session.controller.js
index aaa2af8..0c0fd06 100644
--- a/server/api/report_mail_session/report_mail_session.controller.js
+++ b/server/api/report_mail_session/report_mail_session.controller.js
@@ -1,155 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var ReportMailSession = require('../../models').ReportMailSession;
-var ReportMailSessionHistory = require('../../models').history.ReportMailSessionHistory;
-
-var Util = require('../../config/util');
-var User = require('../../models').User;
-var Promise = require('bluebird');
-
-// Get list of agents
-exports.index = function(req, res, next) {
-  return ReportMailSession
-    .findAndCountAll(Util.getQuery(req.query))
-    .then(function(result) {
-      res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get list of fields
-exports.describe = function(req, res) {
-  return ReportMailSessionHistory
-    .describe()
-    .then(function(fields) {
-      return res.status(200).send(fields);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function getMailQueues(user) {
-  return function() {
-    switch (user.role) {
-      case 'user':
-        return User
-          .findById(user.id, {
-            attributes: ['id']
-          })
-          .then(Util.getMailQueuesIdByUser({}, {
-            attributes: ['id'],
-            include: [{
-              raw: true,
-              model: User,
-              attributes: ['id']
-            }]
-          }))
-          .then(function(userQueues) {
-            var users = [];
-            userQueues.rows.forEach(function(queue) {
-              users = _.union(users, _.map(queue.Users, 'id'));
-            });
-            return {
-              $or: {
-                queue: _.map(userQueues.rows, 'id'),
-                memberid: users
-              }
-            };
-          });
-      case 'agent':
-        return User
-          .findById(user.id, {
-            attributes: ['id']
-          })
-          .then(function(agent) {
-            return agent
-              .getMailQueues({
-                attributes: ['id']
-              });
-          })
-          .then(function(userQueues) {
-            return {
-              $or: {
-                queue: _.map(userQueues, 'id'),
-                memberid: user.id
-              }
-            };
-          });
-      default:
-        return {};
-    }
-  }
-}
-
-// Get timeout apps
-exports.timeout = function(req, res) {
-  return Promise
-    .all([])
-    .then(getMailQueues(req.user))
-    .then(function(condition) {
-      return ReportMailSession
-        .count(Util.getQuery(req.query, _.merge({
-          timeout: true
-        }, condition)));
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-// Get waiting apps
-exports.waiting = function(req, res) {
-  return Promise
-    .all([])
-    .then(getMailQueues(req.user))
-    .then(function(condition) {
-      return ReportMailSession
-        .count(Util.getQuery(req.query, _.merge({
-          leaveAt: null
-        }, condition)));
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-exports.waitingApplications = function(req, res) {
-  return Promise
-    .all([])
-    .then(getMailQueues(req.user))
-    .then(function(condition) {
-      return ReportMailSession
-        .findAll(Util.getQuery(req.query, _.merge({
-          leaveAt: null
-        }, condition)));
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        rows: data
-      });
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/report_mail_session/report_mail_session.events.js b/server/api/report_mail_session/report_mail_session.events.js
index 95c4a4e..e6ccebc 100644
--- a/server/api/report_mail_session/report_mail_session.events.js
+++ b/server/api/report_mail_session/report_mail_session.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const ReportMailSession = require('../../models').ReportMailSession;
-
-var ReportMailSessionEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-ReportMailSessionEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  ReportMailSession.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    ReportMailSessionEvents.emit(event + ':' + doc._id, doc);
-    ReportMailSessionEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = ReportMailSessionEvents;
\ No newline at end of file
diff --git a/server/api/report_mail_session/report_mail_session.socket.js b/server/api/report_mail_session/report_mail_session.socket.js
index 5014a50..1885a06 100644
--- a/server/api/report_mail_session/report_mail_session.socket.js
+++ b/server/api/report_mail_session/report_mail_session.socket.js
@@ -1,104 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const ReportMailSessionEvents = require('./report_mail_session.events');
-const User = require('../../models').User;
-const Util = require('../../config/util');
-const _ = require('lodash');
-const Promise = require('bluebird');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('report_mail_session:' + event, socket);
-
-    ReportMailSessionEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    switch (event) {
-      case 'report_mail_session:save':
-        return Promise
-          .all([])
-          .then(getMailQueues(socket))
-          .then(function(condition) {
-            if (socket.role === 'admin' || _.includes(condition.memberid, doc.memberid) || _.includes(condition.queue, doc.queue)) {
-              socket.emit(event, doc);
-            }
-          })
-          .catch(function(err) {
-            console.log('Error filtering report mail sessions after save', err);
-          });
-      case 'report_mail_session:remove':
-        socket.emit(event, doc);
-        break;
-
-      default:
-
-    }
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    ReportMailSessionEvents.removeListener(event, listener);
-  };
-}
-
-function getMailQueues(user) {
-  return function() {
-    switch (user.role) {
-      case 'user':
-        return User
-          .findById(user.userId, {
-            attributes: ['id']
-          })
-          .then(Util.getMailQueuesIdByUser({}, {
-            attributes: ['id'],
-            include: [{
-              raw: true,
-              model: User,
-              attributes: ['id']
-            }]
-          }))
-          .then(function(userQueues) {
-            var users = [];
-            userQueues.rows.forEach(function(queue) {
-              users = _.union(users, _.map(queue.Users, 'id'));
-            });
-            return {
-              queue: _.map(userQueues.rows, 'id'),
-              memberid: users
-            };
-          });
-      case 'agent':
-        return User
-          .findById(user.userId, {
-            attributes: ['id']
-          })
-          .then(function(agent) {
-            return agent
-              .getMailQueues({
-                attributes: ['id']
-              });
-          })
-          .then(function(userQueues) {
-            return {
-              queue: _.map(userQueues, 'id'),
-              memberid: user.userId
-            };
-          });
-      default:
-        return {};
-    }
-  }
-}
\ No newline at end of file
diff --git a/server/api/report_member/index.js b/server/api/report_member/index.js
index 0afbd74..0bbc724 100644
--- a/server/api/report_member/index.js
+++ b/server/api/report_member/index.js
@@ -1,12 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./report_member.controller');
-var auth = require('../../auth/auth.service');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.index);
-router.get('/describe', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.describe);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/report_member/report_member.controller.js b/server/api/report_member/report_member.controller.js
index 6864b80..73e5837 100644
--- a/server/api/report_member/report_member.controller.js
+++ b/server/api/report_member/report_member.controller.js
@@ -1,34 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var ReportMember = require('../../models').ReportMember;
-var ReportMemberHistory = require('../../models').history.ReportMemberHistory;
-var Util = require('../../config/util');
-
-// Get list of report_members
-exports.index = function(req, res, next) {
-  return ReportMember
-    .findAndCountAll(Util.getQuery(req.query))
-    .then(function(result) {
-      return res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get list of fields
-exports.describe = function(req, res) {
-  return ReportMemberHistory
-    .describe()
-    .then(function(fields) {
-      return res.status(200).send(fields);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/report_member/report_member.events.js b/server/api/report_member/report_member.events.js
index d42092f..b4d5876 100644
--- a/server/api/report_member/report_member.events.js
+++ b/server/api/report_member/report_member.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const ReportMember = require('../../models').ReportMember;
-
-var ReportMemberEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-ReportMemberEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  ReportMember.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    ReportMemberEvents.emit(event + ':' + doc._id, doc);
-    ReportMemberEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = ReportMemberEvents;
\ No newline at end of file
diff --git a/server/api/report_member/report_member.socket.js b/server/api/report_member/report_member.socket.js
index d0b7de2..683d843 100644
--- a/server/api/report_member/report_member.socket.js
+++ b/server/api/report_member/report_member.socket.js
@@ -1,45 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const ReportMemberEvents = require('./report_member.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('report_member:' + event, socket);
-
-    ReportMemberEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    switch (event) {
-      case 'report_member:save':
-        if (socket.name === doc.membername || socket.role === 'admin') {
-          socket.emit(event, doc);
-        }
-        break;
-
-      case 'report_member:remove':
-        socket.emit(event, doc);
-        break;
-
-      default:
-
-    }
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    ReportMemberEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/report_openchannel/index.js b/server/api/report_openchannel/index.js
index 3703020..e936982 100644
--- a/server/api/report_openchannel/index.js
+++ b/server/api/report_openchannel/index.js
@@ -1,14 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./report_openchannel.controller');
-var auth = require('../../auth/auth.service');
-var license = require('../../config/license/license.service');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([17], ['admin', 'agent']), controller.index);
-router.get('/:id/accept/:uniqueid', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasRole('agent'), controller.accept);
-router.get('/:id/reject', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasRole('agent'), controller.reject);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/report_openchannel/report_openchannel.controller.js b/server/api/report_openchannel/report_openchannel.controller.js
index 8dd23a3..81a2278 100644
--- a/server/api/report_openchannel/report_openchannel.controller.js
+++ b/server/api/report_openchannel/report_openchannel.controller.js
@@ -1,117 +1 @@
-'use strict';
-var _ = require('lodash');
-var ReportOpenchannel = require('../../models').ReportOpenchannel;
-var OpenchannelRoom = require('../../models').OpenchannelRoom;
-var sequelize = require('../../models').sequelize;
-var Agent = require('../../models').User;
-var Util = require('../../config/util');
-var moment = require('moment');
-
-
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
-
-// Gets a list of Report
-
-
-
-exports.index = function(req, res) {
-  return ReportOpenchannel
-    .findAndCountAll(Util.getQuery(req.query))
-    .then(function(result) {
-      res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-
-// Get a single report
-exports.accept = function(req, res) {
-  var _agent;
-  var _roomid = req.params.uniqueid.split('.')[1];
-
-  return Agent
-    .findById(req.user.id, {
-      attributes: ['id', 'openchannelCapacity']
-    })
-    .then(function(agent) {
-      _agent = agent;
-      return agent
-        .getOpenchannelRooms({
-          where: {
-            status: {
-              $ne: 'CLOSED'
-            },
-            id: {
-              $ne: _roomid
-            }
-          },
-          attributes: ['id']
-        });
-    })
-    .then(function(Rooms) {
-      return ReportOpenchannel
-        .findById(req.params.id);
-    })
-    .then(function(report) {
-      if (!report) {
-        return res.sendStatus(404);
-      }
-
-      var updated = _.merge(report, {
-        connectid: req.params.uniqueid
-      });
-
-      return updated
-        .save();
-    })
-    .then(function() {
-      return OpenchannelRoom
-        .update({
-          status: 'OPEN',
-          openReason: 'agent'
-        }, {
-          where: {
-            id: _roomid
-          },
-          user: req.user,
-          individualHooks: true
-        });
-    })
-    .then(function() {
-      return res.sendStatus(200);
-    })
-    .catch(sequelize.UniqueConstraintError, function(err) {
-      return res.sendStatus(504);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-
-};
-
-// Get a single report
-exports.reject = function(req, res) {
-  return ReportOpenchannel
-    .findById(req.params.id)
-    .then(function(report) {
-      if (!report) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(report, {
-        rejectedAt: moment().format("YYYY-MM-DD HH:mm:ss")
-      });
-      return updated
-        .save();
-    })
-    .then(function() {
-      return res.sendStatus(200);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
\ No newline at end of file
diff --git a/server/api/report_openchannel/report_openchannel.events.js b/server/api/report_openchannel/report_openchannel.events.js
index e0277fc..3787c22 100644
--- a/server/api/report_openchannel/report_openchannel.events.js
+++ b/server/api/report_openchannel/report_openchannel.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const ReportOpenchannel = require('../../models').ReportOpenchannel;
-
-var ReportOpenchannelEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-ReportOpenchannelEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'update',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  ReportOpenchannel.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    ReportOpenchannelEvents.emit(event + ':' + doc._id, doc);
-    ReportOpenchannelEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = ReportOpenchannelEvents;
\ No newline at end of file
diff --git a/server/api/report_openchannel/report_openchannel.socket.js b/server/api/report_openchannel/report_openchannel.socket.js
index 994bcd8..1a43ae8 100644
--- a/server/api/report_openchannel/report_openchannel.socket.js
+++ b/server/api/report_openchannel/report_openchannel.socket.js
@@ -1,45 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-//
-'use strict';
-//
-const ReportOpenchannelEvents = require('./report_openchannel.events');
-
-// Model events to emit
-var events = ['save', 'update', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('report_openchannel:' + event, socket);
-
-    ReportOpenchannelEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    switch (event) {
-      case 'report_openchannel:save':
-      case 'report_openchannel:update':
-        if (socket.name === doc.membername || socket.role === 'admin') {
-          socket.emit(event, doc);
-        }
-        break;
-      case 'report_openchannel:remove':
-        socket.emit(event, doc);
-        break;
-
-      default:
-
-    }
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    ReportOpenchannelEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/report_openchannel_session/index.js b/server/api/report_openchannel_session/index.js
index 832ba1c..20a648f 100644
--- a/server/api/report_openchannel_session/index.js
+++ b/server/api/report_openchannel_session/index.js
@@ -1,16 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./report_openchannel_session.controller');
-var auth = require('../../auth/auth.service');
-var license = require('../../config/license/license.service');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.index);
-router.get('/describe', auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.describe);
-router.get('/timeout', license.isValidDate(), auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.timeout);
-router.get('/waiting', license.isValidDate(), auth.isAuthenticated(), license.hasOpenchannel(), auth.hasModule([20], ['admin']), controller.waiting);
-router.get('/waiting/applications', auth.isAuthenticated(), license.hasOpenchannel(), controller.waitingApplications);
-// , auth.hasModule([11], ['admin', 'agent'])
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/report_openchannel_session/report_openchannel_session.controller.js b/server/api/report_openchannel_session/report_openchannel_session.controller.js
index e6a814a..e781884 100644
--- a/server/api/report_openchannel_session/report_openchannel_session.controller.js
+++ b/server/api/report_openchannel_session/report_openchannel_session.controller.js
@@ -1,155 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var ReportOpenchannelSession = require('../../models').ReportOpenchannelSession;
-var ReportOpenchannelSessionHistory = require('../../models').history.ReportOpenchannelSessionHistory;
-
-var Util = require('../../config/util');
-var User = require('../../models').User;
-var Promise = require('bluebird');
-
-// Get list of agents
-exports.index = function(req, res, next) {
-  return ReportOpenchannelSession
-    .findAndCountAll(Util.getQuery(req.query))
-    .then(function(result) {
-      res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get list of fields
-exports.describe = function(req, res) {
-  return ReportOpenchannelSessionHistory
-    .describe()
-    .then(function(fields) {
-      return res.status(200).send(fields);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function getOpenchannelQueues(user) {
-  return function() {
-    switch (user.role) {
-      case 'user':
-        return User
-          .findById(user.id, {
-            attributes: ['id']
-          })
-          .then(Util.getOpenchannelQueuesIdByUser({}, {
-            attributes: ['id'],
-            include: [{
-              raw: true,
-              model: User,
-              attributes: ['id']
-            }]
-          }))
-          .then(function(userQueues) {
-            var users = [];
-            userQueues.rows.forEach(function(queue) {
-              users = _.union(users, _.map(queue.Users, 'id'));
-            });
-            return {
-              $or: {
-                queue: _.map(userQueues.rows, 'id'),
-                memberid: users
-              }
-            };
-          });
-      case 'agent':
-        return User
-          .findById(user.id, {
-            attributes: ['id']
-          })
-          .then(function(agent) {
-            return agent
-              .getOpenchannelQueues({
-                attributes: ['id']
-              });
-          })
-          .then(function(userQueues) {
-            return {
-              $or: {
-                queue: _.map(userQueues, 'id'),
-                memberid: user.id
-              }
-            };
-          });
-      default:
-        return {};
-    }
-  }
-}
-
-// Get timeout apps
-exports.timeout = function(req, res) {
-  return Promise
-    .all([])
-    .then(getOpenchannelQueues(req.user))
-    .then(function(condition) {
-      return ReportOpenchannelSession
-        .count(Util.getQuery(req.query, _.merge({
-          timeout: true
-        }, condition)));
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-// Get waiting apps
-exports.waiting = function(req, res) {
-  return Promise
-    .all([])
-    .then(getOpenchannelQueues(req.user))
-    .then(function(condition) {
-      return ReportOpenchannelSession
-        .count(Util.getQuery(req.query, _.merge({
-          leaveAt: null
-        }, condition)));
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-exports.waitingApplications = function(req, res) {
-  return Promise
-    .all([])
-    .then(getOpenchannelQueues(req.user))
-    .then(function(condition) {
-      return ReportOpenchannelSession
-        .findAll(Util.getQuery(req.query, _.merge({
-          leaveAt: null
-        }, condition)));
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        rows: data
-      });
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/report_openchannel_session/report_openchannel_session.events.js b/server/api/report_openchannel_session/report_openchannel_session.events.js
index 0c9e3ff..04be0f0 100644
--- a/server/api/report_openchannel_session/report_openchannel_session.events.js
+++ b/server/api/report_openchannel_session/report_openchannel_session.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const ReportOpenchannelSession = require('../../models').ReportOpenchannelSession;
-
-var ReportOpenchannelSessionEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-ReportOpenchannelSessionEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  ReportOpenchannelSession.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    ReportOpenchannelSessionEvents.emit(event + ':' + doc._id, doc);
-    ReportOpenchannelSessionEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = ReportOpenchannelSessionEvents;
\ No newline at end of file
diff --git a/server/api/report_openchannel_session/report_openchannel_session.socket.js b/server/api/report_openchannel_session/report_openchannel_session.socket.js
index 36ca924..a790f84 100644
--- a/server/api/report_openchannel_session/report_openchannel_session.socket.js
+++ b/server/api/report_openchannel_session/report_openchannel_session.socket.js
@@ -1,90 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-var ReportOpenchannelSession = require('../../models').ReportOpenchannelSession;
-var User = require('../../models').User;
-var Util = require('../../config/util');
-var _ = require('lodash');
-var Promise = require('bluebird');
-
-exports.register = function(socket) {
-  ReportOpenchannelSession.afterCreate(function(doc) {
-    onSave(socket, doc);
-  });
-  ReportOpenchannelSession.afterUpdate(function(doc) {
-    onSave(socket, doc);
-  });
-  ReportOpenchannelSession.afterDestroy(function(doc) {
-    onRemove(socket, doc);
-  });
-}
-
-function getOpenchannelQueues(user) {
-  return function() {
-    switch (user.role) {
-      case 'user':
-        return User
-          .findById(user.userId, {
-            attributes: ['id']
-          })
-          .then(Util.getOpenchannelQueuesIdByUser({}, {
-            attributes: ['id'],
-            include: [{
-              raw: true,
-              model: User,
-              attributes: ['id']
-            }]
-          }))
-          .then(function(userQueues) {
-            var users = [];
-            userQueues.rows.forEach(function(queue) {
-              users = _.union(users, _.map(queue.Users, 'id'));
-            });
-            return {
-              queue: _.map(userQueues.rows, 'id'),
-              memberid: users
-            };
-          });
-      case 'agent':
-        return User
-          .findById(user.userId, {
-            attributes: ['id']
-          })
-          .then(function(agent) {
-            return agent
-              .getOpenchannelQueues({
-                attributes: ['id']
-              });
-          })
-          .then(function(userQueues) {
-            return {
-              queue: _.map(userQueues, 'id'),
-              memberid: user.userId
-            };
-          });
-      default:
-        return {};
-    }
-  }
-}
-
-function onSave(socket, doc, cb) {
-  return Promise
-    .all([])
-    .then(getOpenchannelQueues(socket))
-    .then(function(condition) {
-      if (socket.role === 'admin' || _.includes(condition.memberid, doc.memberid) || _.includes(condition.queue, doc.queue)) {
-        socket.emit('report_openchannel_session:save', doc);
-      }
-    })
-    .catch(function(err) {
-      console.log('Error filtering report Openchannel sessions after save', err);
-    });
-}
-
-function onRemove(socket, doc, cb) {
-  socket.emit('report_openchannel_session:remove', doc);
-}
\ No newline at end of file
diff --git a/server/api/report_queue/index.js b/server/api/report_queue/index.js
index 2a28045..931c2d6 100644
--- a/server/api/report_queue/index.js
+++ b/server/api/report_queue/index.js
@@ -1,27 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./report_queue.controller');
-var auth = require('../../auth/auth.service');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.index);
-router.get('/describe', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.describe);
-router.get('/waiting', auth.isAuthenticated(), auth.hasModule([1], ['admin', 'agent']), controller.waiting);
-router.get('/parameters', auth.isAuthenticated(), auth.hasModule([1], ['admin']), controller.queueParameters);
-router.get('/waiting/calls', auth.isAuthenticated(), auth.hasModule([7], ['admin', 'agent']), controller.waitingCalls);
-router.get('/active', auth.isAuthenticated(), auth.hasModule([1], ['admin', 'agent']), controller.active);
-router.get('/answered', auth.isAuthenticated(), auth.hasModule([1], ['admin', 'agent']), controller.answered);
-router.get('/abandoned', auth.isAuthenticated(), auth.hasModule([1], ['admin', 'agent']), controller.abandoned);
-router.get('/abandoned/all', auth.isAuthenticated(), auth.hasModule([7], ['admin', 'agent']), controller.abandonedAll);
-router.get('/avganswertime', auth.isAuthenticated(), auth.hasModule([1], ['admin', 'agent']), controller.avganswertime);
-router.get('/avgtalktime', auth.isAuthenticated(), auth.hasModule([1], ['admin', 'agent']), controller.avgtalktime);
-router.get('/answerrate', auth.isAuthenticated(), auth.hasModule([1], ['admin', 'agent']), controller.answerrate);
-router.get('/abandonrate', auth.isAuthenticated(), auth.hasModule([1], ['admin', 'agent']), controller.abandonrate);
-router.get('/totaloffered', auth.isAuthenticated(), auth.hasModule([1], ['admin', 'agent']), controller.totaloffered);
-router.get('/unmanaged', auth.isAuthenticated(), auth.hasModule([1], ['admin', 'agent']), controller.unmanaged);
-router.get('/:queue', auth.isAuthenticated(), controller.show);
-router.put('/:id', auth.isAuthenticated(), controller.update);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/report_queue/report_queue.controller.js b/server/api/report_queue/report_queue.controller.js
index a2757ef..c4fbe4f 100644
--- a/server/api/report_queue/report_queue.controller.js
+++ b/server/api/report_queue/report_queue.controller.js
@@ -1,626 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var sequelize = require('../../models').sequelize;
-var Agent = require('../../models').User;
-var ReportQueue = require('../../models').ReportQueue;
-var VoiceQueue = require('../../models').VoiceQueue;
-var ReportQueueHistory = require('../../models').history.ReportQueueHistory;
-var Util = require('../../config/util');
-var Promise = require('bluebird');
-
-// Get list of reportQueues
-exports.index = function(req, res, next) {
-  return ReportQueue
-    .findAndCountAll(Util.getQuery(req.query))
-    .then(function(result) {
-      return res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.update = function(req, res) {
-  return ReportQueue
-    .findById(req.params.id)
-    .then(function(queue) {
-      if (!queue) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(queue, req.body);
-      return updated.save();
-    })
-    .then(function(queue) {
-      return res.status(200).send(queue);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get list of fields
-exports.describe = function(req, res) {
-  return ReportQueueHistory
-    .describe()
-    .then(function(fields) {
-      return res.status(200).send(fields);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get Waiting Calls
-exports.waiting = function(req, res) {
-  return Promise
-    .all([])
-    .then(getVoiceQueues(req.user))
-    .then(function(userQueues) {
-      return ReportQueue
-        .count({
-          where: {
-            queuecallerleaveAt: null,
-            queue: userQueues
-          }
-        });
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        value: data
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function getVoiceQueues(user) {
-  return function() {
-    switch (user.role) {
-      case 'user':
-        return Agent //also User model
-          .findById(user.id, {
-            attributes: ['id']
-          })
-          .then(Util.getVoiceQueuesIdByUser())
-          .then(function(userQueues) {
-            return _.map(userQueues.rows, 'name');
-          });
-      case 'agent':
-        return Agent
-          .findById(user.id)
-          .then(function(agent) {
-            return agent
-              .getVoiceQueues({
-                attributes: ['name']
-              });
-          })
-          .then(function(userQueues) {
-            return _.map(userQueues, 'name');
-          });
-      default:
-        return VoiceQueue
-          .findAll()
-          .then(function(queues) {
-            return {
-              rows: queues
-            };
-          })
-          .then(function(userQueues) {
-            return _.map(userQueues.rows, 'name');
-          });
-    }
-  }
-}
-
-exports.queueParameters = function(req, res) {
-  var query = {
-    _limit: req.query.limit ? req.query.limit : null,
-    _offset: req.query.offset ? req.query.offset : 0,
-    _name: req.query.name || undefined,
-    _answeredFrom: req.query.answered_uiFrom || req.query.answered_uiFrom === 0 ? req.query.answered_uiFrom : undefined,
-    _answeredTo: req.query.answered_uiTo || req.query.answered_uiTo === 0 ? req.query.answered_uiTo : undefined,
-    _abandonedFrom: req.query.abandoned_uiFrom || req.query.abandoned_uiFrom === 0 ? req.query.abandoned_uiFrom : undefined,
-    _abandonedTo: req.query.abandoned_uiTo || req.query.abandoned_uiTo === 0 ? req.query.abandoned_uiTo : undefined,
-    _unmanagedFrom: req.query.unmanaged_uiFrom || req.query.unmanaged_uiFrom === 0 ? req.query.unmanaged_uiFrom : undefined,
-    _unmanagedTo: req.query.unmanaged_uiTo || req.query.unmanaged_uiTo === 0 ? req.query.unmanaged_uiTo : undefined,
-  }
-  console.log(query);
-  var _parameters, _userQueues, _limit, _offset;
-  delete req.query.limit;
-  delete req.query.offset;
-  delete req.query.answered_uiFrom;
-  delete req.query.answered_uiTo;
-  delete req.query.abandoned_uiFrom;
-  delete req.query.abandoned_uiTo;
-  delete req.query.unmanaged_uiFrom;
-  delete req.query.unmanaged_uiTo;
-
-  return Promise
-    .all([])
-    .then(getVoiceQueues(req.user))
-    .then(function(userQueues) {
-      _userQueues = userQueues;
-      _parameters = _.map(userQueues, function(element) {
-        return {
-          name: element
-        };
-      });
-      //waiting
-      return ReportQueue
-        .findAll({
-          where: {
-            queuecallerleaveAt: null,
-            queue: _userQueues
-          },
-          group: 'queue',
-          attributes: [
-            ['queue', 'name'],
-            [sequelize.fn('COUNT', sequelize.col('id')), 'waiting']
-          ]
-        });
-    })
-    .then(function(waiting) {
-      waiting = _.map(waiting, 'dataValues');
-      _parameters.forEach(function(element, key) {
-        var value = _.find(waiting, {
-          name: element.name
-        });
-        element.waiting = value ? value.waiting : 0;
-      });
-      // console.log('WAITING', _parameters);
-      //active
-      return ReportQueue
-        .findAll({
-          where: {
-            queuecallerexit: false,
-            queuecallerabandon: false,
-            queuecallercomplete: false,
-            queuecallerleaveAt: {
-              $ne: null
-            },
-            queue: _userQueues
-          },
-          group: 'queue',
-          attributes: [
-            ['queue', 'name'],
-            [sequelize.fn('COUNT', sequelize.col('id')), 'active']
-          ]
-        });
-    })
-    .then(function(active) {
-      active = _.map(active, 'dataValues');
-      _parameters.forEach(function(element) {
-        var value = _.find(active, {
-          name: element.name
-        });
-        element.active = value ? value.active : 0;
-      });
-      // console.log('ACTIVE', _parameters);
-      //answered
-      return ReportQueue
-        .findAll({
-          where: {
-            queuecallercomplete: true,
-            queue: _userQueues
-          },
-          group: 'queue',
-          attributes: [
-            ['queue', 'name'],
-            [sequelize.fn('COUNT', sequelize.col('id')), 'answered']
-          ]
-        });
-    })
-    .then(function(answered) {
-      answered = _.map(answered, 'dataValues');
-      // console.log('beforeAnswered', _.map(answered, 'dataValues'));
-      _parameters.forEach(function(element) {
-        var value = _.find(answered, {
-          name: element.name
-        });
-        element.answered = value ? value.answered : 0;
-      });
-      // console.log('ANSWERED', _parameters);
-      //abandoned
-      return ReportQueue
-        .findAll({
-          where: {
-            queuecallerabandon: true,
-            queue: _userQueues
-          },
-          group: 'queue',
-          attributes: [
-            ['queue', 'name'],
-            [sequelize.fn('COUNT', sequelize.col('id')), 'abandoned']
-          ]
-        });
-    })
-    .then(function(abandoned) {
-      abandoned = _.map(abandoned, 'dataValues');
-      _parameters.forEach(function(element) {
-        var value = _.find(abandoned, {
-          name: element.name
-        });
-        element.abandoned = value ? value.abandoned : 0;
-      });
-      // console.log('ABANDONED', _parameters);
-      //unmanaged
-      return ReportQueue
-        .findAll({
-          where: {
-            queuecallerexit: true,
-            queue: _userQueues
-          },
-          group: 'queue',
-          attributes: [
-            ['queue', 'name'],
-            [sequelize.fn('COUNT', sequelize.col('id')), 'unmanaged']
-          ]
-        });
-    })
-    .then(function(unmanaged) {
-      unmanaged = _.map(unmanaged, 'dataValues');
-      _parameters.forEach(function(element) {
-        var value = _.find(unmanaged, {
-          name: element.name
-        });
-        element.unmanaged = value ? value.unmanaged : 0;
-      });
-      // console.log('UNMANAGED', _parameters);
-      //holdtime
-      return sequelize
-        .query('SELECT queue AS \'name\',SEC_TO_TIME(ROUND(AVG(holdtime), 0)) as holdtime FROM report_agent WHERE agentcomplete = 1 AND queue IN (\'' + _userQueues.join("','") +
-          '\') GROUP BY queue', {
-            type: sequelize.QueryTypes.SELECT
-          });
-    })
-    .then(function(holdtime) {
-      _parameters.forEach(function(element) {
-        var value = _.find(holdtime, {
-          name: element.name
-        });
-        element.holdtime = value ? value.holdtime : '00:00:00';
-      });
-      // console.log('HOLDTIME', _parameters);
-      //talktime
-      return sequelize
-        .query('SELECT queue AS \'name\',SEC_TO_TIME(ROUND(AVG(talktime), 0)) as talktime FROM report_agent WHERE agentcomplete = 1 AND queue IN (\'' + _userQueues.join("','") +
-          '\') GROUP BY queue', {
-            type: sequelize.QueryTypes.SELECT
-          });
-    })
-    .then(function(talktime) {
-      _parameters.forEach(function(element) {
-        var value = _.find(talktime, {
-          name: element.name
-        });
-        element.talktime = value ? value.talktime : '00:00:00';
-      });
-      // console.log('TALKTIME', _parameters);
-      //totalcalls
-      return sequelize
-        .query('SELECT queue AS \'name\',COUNT(distinct uniqueid) as totalcalls FROM report_queue WHERE queue IN (\'' + _userQueues.join("','") + '\') GROUP BY queue', {
-          type: sequelize.QueryTypes.SELECT
-        });
-    })
-    .then(function(totalcalls) {
-      _parameters.forEach(function(element) {
-        var value = _.find(totalcalls, {
-          name: element.name
-        });
-        element.totalcalls = value ? value.totalcalls : 0;
-      });
-      // console.log('TOTALCALLS', _parameters);
-      var results = _(_.filter(_parameters, function(element) {
-        var answeredFrom = query._answeredFrom ? (element.answered >= Number(query._answeredFrom)) : true;
-        var answeredTo = query._answeredTo ? (element.answered <= Number(query._answeredTo)) : true;
-        var abandonedFrom = query._abandonedFrom ? (element.abandoned >= Number(query._abandonedFrom)) : true;
-        var abandonedto = query._abandonedTo ? (element.abandoned <= Number(query._abandonedTo)) : true;
-        var unmanagedFrom = query._unmanagedFrom ? (element.unmanaged >= Number(query._unmanagedFrom)) : true;
-        var unmanagedTo = query._unmanagedTo ? (element.unmanaged <= Number(query._unmanagedTo)) : true;
-        var name = query._name ? _.includes(element.name, query._name) : true;
-        return _.reduce([answeredFrom, answeredTo, abandonedFrom, abandonedto, unmanagedFrom, unmanagedTo, name], function(total, n) {
-          return total && n;
-        });
-      }));
-      if (query._limit) {
-        results = results.slice(query._offset).take(query._limit).value();
-      }
-      return [_parameters.length, results];
-    })
-    .spread(function(count, rows) {
-      // console.log('RETURN', rows);
-      return res.status(200).send({
-        rows: rows,
-        count: count
-      });
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-// Get Waiting Calls
-exports.waitingCalls = function(req, res) {
-  var where = {};
-  if (req.user.role === 'agent') {
-    where.connectedlinename = req.user.fullname;
-  }
-  return Promise
-    .all([])
-    .then(getVoiceQueues(req.user))
-    .then(function(userQueues) {
-      return ReportQueue
-        .scope('waiting', {
-          method: ['queueFilter', userQueues]
-        })
-        .findAll(Util.getQuery(req.query, where));
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        rows: data,
-        count: data.length
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get Waiting Calls
-exports.active = function(req, res) {
-  return Promise
-    .all([])
-    .then(getVoiceQueues(req.user))
-    .then(function(userQueues) {
-      return ReportQueue
-        .count({
-          where: {
-            queuecallerexit: false,
-            queuecallerabandon: false,
-            queuecallercomplete: false,
-            queuecallerleaveAt: {
-              $ne: null
-            },
-            queue: userQueues
-          }
-        });
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        value: data
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get Answered Calls
-exports.answered = function(req, res) {
-  return Promise
-    .all([])
-    .then(getVoiceQueues(req.user))
-    .then(function(userQueues) {
-      return ReportQueue
-        .count({
-          where: {
-            queuecallercomplete: true,
-            queue: userQueues
-          }
-        });
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        value: data
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get Abandoned Calls
-exports.abandoned = function(req, res) {
-  return Promise
-    .all([])
-    .then(getVoiceQueues(req.user))
-    .then(function(userQueues) {
-      return ReportQueue
-        .count({
-          where: {
-            queuecallerabandon: true,
-            queue: userQueues
-          }
-        });
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        value: data
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get Answered Calls
-exports.avganswertime = function(req, res) {
-  return Promise
-    .all([])
-    .then(getVoiceQueues(req.user))
-    .then(function(userQueues) {
-      return sequelize
-        .query('SELECT SEC_TO_TIME(ROUND(AVG(holdtime), 0)) as value FROM report_agent WHERE agentcomplete = 1 AND queue IN (\'' + userQueues.join("','") + '\')', {
-          type: sequelize.QueryTypes.SELECT
-        });
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        value: data[0].value
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get Answered Calls
-exports.avgtalktime = function(req, res) {
-  return Promise
-    .all([])
-    .then(getVoiceQueues(req.user))
-    .then(function(userQueues) {
-      return sequelize
-        .query('SELECT SEC_TO_TIME(ROUND(AVG(talktime), 0)) as value FROM report_agent WHERE agentcomplete = 1 AND queue IN (\'' + userQueues.join("','") + '\')', {
-          type: sequelize.QueryTypes.SELECT
-        });
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        value: data[0].value
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get Answered Calls
-exports.answerrate = function(req, res) {
-  return Promise
-    .all([])
-    .then(getVoiceQueues(req.user))
-    .then(function(userQueues) {
-      return sequelize
-        .query('SELECT ROUND(SUM(queuecallercomplete) / (SUM(queuecallercomplete) + SUM(queuecallerabandon)) * 100, 1) as value FROM report_queue WHERE queue IN (\'' + userQueues.join("','") +
-          '\')', {
-            type: sequelize.QueryTypes.SELECT
-          });
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        value: data[0].value
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get Answered Calls
-exports.abandonrate = function(req, res) {
-  return Promise
-    .all([])
-    .then(getVoiceQueues(req.user))
-    .then(function(userQueues) {
-      return sequelize
-        .query('SELECT ROUND(SUM(queuecallerabandon) / (SUM(queuecallercomplete) + SUM(queuecallerabandon)) * 100, 1) as value FROM report_queue WHERE queue IN (\'' + userQueues.join("','") +
-          '\')', {
-            type: sequelize.QueryTypes.SELECT
-          });
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        value: data[0].value
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get Answered Calls
-exports.totaloffered = function(req, res) {
-  return Promise
-    .all([])
-    .then(getVoiceQueues(req.user))
-    .then(function(userQueues) {
-      return sequelize
-        .query('SELECT COUNT(distinct uniqueid) as value FROM report_queue WHERE queue IN (\'' + userQueues.join("','") + '\')', {
-          type: sequelize.QueryTypes.SELECT
-        });
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        value: data[0].value
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get Unmanaged Calls
-exports.unmanaged = function(req, res) {
-  return Promise
-    .all([])
-    .then(getVoiceQueues(req.user))
-    .then(function(userQueues) {
-      return ReportQueue
-        .count({
-          where: {
-            queuecallerexit: true,
-            queue: userQueues
-          }
-        });
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        value: data
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get Unmanaged Calls
-exports.abandonedAll = function(req, res) {
-  return Promise
-    .all([])
-    .then(getVoiceQueues(req.user))
-    .then(function(userQueues) {
-      return ReportQueue
-        .findAndCountAll({
-          where: {
-            queuecallerabandon: true,
-            queue: userQueues
-          }
-        });
-    })
-    .then(function(data) {
-      return res.status(200).send(data);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single reportQueue
-exports.show = function(req, res) {
-  return ReportQueue
-    .findAll({
-      where: {
-        queue: req.params.queue
-      }
-    })
-    .then(function(reportQueue) {
-      if (!reportQueue) {
-        return res.sendStatus(404);
-      }
-      return res.send({
-        count: reportQueue.length,
-        rows: reportQueue
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/report_queue/report_queue.events.js b/server/api/report_queue/report_queue.events.js
index 29eace5..05db4bc 100644
--- a/server/api/report_queue/report_queue.events.js
+++ b/server/api/report_queue/report_queue.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const ReportQueue = require('../../models').ReportQueue;
-
-var ReportQueueEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-ReportQueueEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'update',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  ReportQueue.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    ReportQueueEvents.emit(event + ':' + doc._id, doc);
-    ReportQueueEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = ReportQueueEvents;
\ No newline at end of file
diff --git a/server/api/report_queue/report_queue.socket.js b/server/api/report_queue/report_queue.socket.js
index 3c27c94..c688895 100644
--- a/server/api/report_queue/report_queue.socket.js
+++ b/server/api/report_queue/report_queue.socket.js
@@ -1,93 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const ReportQueueEvents = require('./report_queue.events');
-const VoiceQueue = require('../../models').VoiceQueue;
-const User = require('../../models').User;
-const Util = require('../../config/util');
-const _ = require('lodash');
-const Promise = require('bluebird');
-
-// Model events to emit
-var events = ['save', 'update', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('report_queue:' + event, socket);
-
-    ReportQueueEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    switch (event) {
-      case 'report_queue:save':
-      case 'report_queue:update':
-        return Promise
-          .all([])
-          .then(getVoiceQueues(socket))
-          .then(function(userQueues) {
-            if (_.includes(userQueues, doc.queue)) {
-              socket.emit(event, doc);
-            }
-          })
-          .catch(function(err) {
-            console.log('Error filtering queues after queue save', err);
-          })
-
-      case 'report_queue:remove':
-        socket.emit(event, doc);
-        break;
-
-      default:
-
-    }
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    ReportQueueEvents.removeListener(event, listener);
-  };
-}
-
-function getVoiceQueues(user) {
-  return function() {
-    switch (user.role) {
-      case 'user':
-        return User
-          .findById(user.userId, {
-            attributes: ['id']
-          })
-          .then(Util.getVoiceQueuesIdByUser())
-          .then(function(userQueues) {
-            return _.map(userQueues.rows, 'name');
-          });
-      case 'agent':
-        return User
-          .scope('agent')
-          .findById(user.userId)
-          .then(function(agent) {
-            return agent
-              .getVoiceQueues({
-                attributes: ['name']
-              });
-          })
-          .then(function(agentQueues) {
-            return _.map(agentQueues, 'name');
-          });
-      default:
-        return VoiceQueue //the queue has to exist in my motion queues, otherwise is not manageable from the interface (prbably an error didn' t delete the queue from asterisk)
-          .findAll()
-          .then(function(userQueues) {
-            return _.map(userQueues, 'name');
-          });
-    }
-  }
-}
\ No newline at end of file
diff --git a/server/api/report_sms/index.js b/server/api/report_sms/index.js
index 93dc165..88ece4c 100644
--- a/server/api/report_sms/index.js
+++ b/server/api/report_sms/index.js
@@ -1,16 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./report_sms.controller');
-var auth = require('../../auth/auth.service');
-var license = require('../../config/license/license.service');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), license.hasSms(), auth.hasModule([17], ['admin', 'agent']), controller.index);
-router.get('/:id/accept/:uniqueid', auth.isAuthenticated(), license.hasSms(), auth.hasRole('agent'), controller.accept);
-router.get('/:id/reject', auth.isAuthenticated(), license.hasSms(), auth.hasRole('agent'), controller.reject);
-
-
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/report_sms/report_sms.controller.js b/server/api/report_sms/report_sms.controller.js
index 20e4240..6ea0b6c 100644
--- a/server/api/report_sms/report_sms.controller.js
+++ b/server/api/report_sms/report_sms.controller.js
@@ -1,179 +1 @@
-/**
- * Using Rails-like standard naming convention for endpoints.
- * GET     /api/report/sms              ->  index
- * POST    /api/report/sms              ->  create
- * GET     /api/report/sms/:id          ->  show
- * PUT     /api/report/sms/:id          ->  update
- * DELETE  /api/report/sms/:id          ->  destroy
- */
-
-'use strict';
-var _ = require('lodash');
-var ReportSms = require('../../models').ReportSms;
-var SmsRoom = require('../../models').SmsRoom;
-var sequelize = require('../../models').sequelize;
-var Agent = require('../../models').User;
-var Util = require('../../config/util');
-var moment = require('moment');
-
-
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
-
-// Gets a list of ReportSmss
-
-
-
-exports.index = function(req, res) {
-  return ReportSms
-    .findAndCountAll(Util.getQuery(req.query))
-    .then(function(result) {
-      res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-
-// Get a single reportSMS
-exports.accept = function(req, res) {
-  var _agent;
-  var _roomid = req.params.uniqueid.split('.')[1];
-
-  return Agent
-    .findById(req.user.id, {
-      attributes: ['id', 'smsCapacity']
-    })
-    .then(function(agent) {
-      _agent = agent;
-      return agent
-        .getSmsRooms({
-          where: {
-            status: {
-              $ne: 'CLOSED'
-            },
-            id: {
-              $ne: _roomid
-            }
-          },
-          attributes: ['id']
-        });
-    })
-    .then(function(smsRooms) {
-      return ReportSms
-        .findById(req.params.id);
-    })
-    .then(function(reportSms) {
-      if (!reportSms) {
-        return res.sendStatus(404);
-      }
-
-      var updated = _.merge(reportSms, {
-        connectid: req.params.uniqueid
-      });
-
-      return updated
-        .save();
-    })
-    .then(function() {
-      return SmsRoom
-        .update({
-          status: 'OPEN',
-          openReason: 'agent'
-        }, {
-          where: {
-            id: _roomid
-          },
-          user: req.user,
-          individualHooks: true
-        });
-    })
-    .then(function() {
-      return res.sendStatus(200);
-    })
-    .catch(sequelize.UniqueConstraintError, function(err) {
-      return res.sendStatus(504);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-
-};
-
-// Get a single reportMail
-exports.reject = function(req, res) {
-  return ReportSms
-    .findById(req.params.id)
-    .then(function(reportSms) {
-      if (!reportSms) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(reportSms, {
-        rejectedAt: moment().format("YYYY-MM-DD HH:mm:ss")
-      });
-      return updated
-        .save();
-    })
-    .then(function() {
-      return res.sendStatus(200);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-// Creates a new ReportSms in the DB
-// exports.create = function(req, res) {
-//   return ReportSms
-//     .create(req.body)
-//     .then(function(reportSms) {
-//       return res.status(201).send(reportSms);
-//     })
-//     .catch(function(err) {
-//       return handleError(res, err);
-//     });
-// }
-
-// Updates an existing ReportSms in the DB
-// exports.update = function(req, res) {
-//   if (req.body._id) {
-//     delete req.body._id;
-//   }
-//   return ReportSms
-//     .findById(req.params.id)
-//     .then(function(reportSms) {
-//       if (!reportSms) {
-//         return res.sendStatus(404);
-//       }
-//       var updated = _.merge(reportSms, req.body);
-//       return updated
-//         .save();
-//     })
-//     .then(function(reportSms) {
-//       return res.status(200).send(reportSms);
-//     })
-//     .catch(function(err) {
-//       return handleError(res, err);
-//     });
-// }
-//
-// Deletes a ReportSms from the DB
-// exports.destroy = function(req, res) {
-//   return ReportSms
-//     .findById(req.params.id)
-//     .then(function(reportSms) {
-//       if (!reportSms) {
-//         return res.sendStatus(404);
-//       }
-//       return reportSms
-//         .destroy();
-//     })
-//     .then(function() {
-//       return res.sendStatus(204);
-//     })
-//     .catch(function(err) {
-//       return handleError(res, err);
-//     });
-// }
\ No newline at end of file
diff --git a/server/api/report_sms/report_sms.events.js b/server/api/report_sms/report_sms.events.js
index 85c8624..7aa81a9 100644
--- a/server/api/report_sms/report_sms.events.js
+++ b/server/api/report_sms/report_sms.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const ReportSms = require('../../models').ReportSms;
-
-var ReportSmsEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-ReportSmsEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'update',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  ReportSms.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    ReportSmsEvents.emit(event + ':' + doc._id, doc);
-    ReportSmsEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = ReportSmsEvents;
\ No newline at end of file
diff --git a/server/api/report_sms/report_sms.socket.js b/server/api/report_sms/report_sms.socket.js
index f63cd11..35c3d99 100644
--- a/server/api/report_sms/report_sms.socket.js
+++ b/server/api/report_sms/report_sms.socket.js
@@ -1,46 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const ReportSmsEvents = require('./report_sms.events');
-
-// Model events to emit
-var events = ['save', 'update', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('report_sms:' + event, socket);
-
-    ReportSmsEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    switch (event) {
-      case 'report_sms:save':
-      case 'report_sms:update':
-        if (socket.name === doc.membername || socket.role === 'admin') {
-          socket.emit(event, doc);
-        }
-        break;
-
-      case 'report_sms:remove':
-        socket.emit(event, doc);
-        break;
-
-      default:
-
-    }
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    ReportSmsEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/report_sms_session/index.js b/server/api/report_sms_session/index.js
index eba420d..8d790c6 100644
--- a/server/api/report_sms_session/index.js
+++ b/server/api/report_sms_session/index.js
@@ -1,16 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./report_sms_session.controller');
-var auth = require('../../auth/auth.service');
-var license = require('../../config/license/license.service');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), license.hasSms(), auth.hasModule([17], ['admin']), controller.index);
-router.get('/describe', auth.isAuthenticated(), license.hasSms(), auth.hasModule([17], ['admin']), controller.describe);
-router.get('/timeout', license.isValidDate(), auth.isAuthenticated(), license.hasSms(), auth.hasModule([17], ['admin']), controller.timeout);
-router.get('/waiting', license.isValidDate(), auth.isAuthenticated(), license.hasSms(), auth.hasModule([17], ['admin']), controller.waiting);
-router.get('/waiting/applications', auth.isAuthenticated(), license.hasSms(), auth.hasModule([11], ['admin', 'agent']), controller.waitingApplications);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/report_sms_session/report_sms_session.controller.js b/server/api/report_sms_session/report_sms_session.controller.js
index 0b240ac..3ccb1d0 100644
--- a/server/api/report_sms_session/report_sms_session.controller.js
+++ b/server/api/report_sms_session/report_sms_session.controller.js
@@ -1,155 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var ReportSmsSession = require('../../models').ReportSmsSession;
-var ReportSmsSessionHistory = require('../../models').history.ReportSmsSessionHistory;
-
-var Util = require('../../config/util');
-var User = require('../../models').User;
-var Promise = require('bluebird');
-
-// Get list of agents
-exports.index = function(req, res, next) {
-  return ReportSmsSession
-    .findAndCountAll(Util.getQuery(req.query))
-    .then(function(result) {
-      res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get list of fields
-exports.describe = function(req, res) {
-  return ReportSmsSessionHistory
-    .describe()
-    .then(function(fields) {
-      return res.status(200).send(fields);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function getSmsQueues(user) {
-  return function() {
-    switch (user.role) {
-      case 'user':
-        return User
-          .findById(user.id, {
-            attributes: ['id']
-          })
-          .then(Util.getSmsQueuesIdByUser({}, {
-            attributes: ['id'],
-            include: [{
-              raw: true,
-              model: User,
-              attributes: ['id']
-            }]
-          }))
-          .then(function(userQueues) {
-            var users = [];
-            userQueues.rows.forEach(function(queue) {
-              users = _.union(users, _.map(queue.Users, 'id'));
-            });
-            return {
-              $or: {
-                queue: _.map(userQueues.rows, 'id'),
-                memberid: users
-              }
-            };
-          });
-      case 'agent':
-        return User
-          .findById(user.id, {
-            attributes: ['id']
-          })
-          .then(function(agent) {
-            return agent
-              .getSmsQueues({
-                attributes: ['id']
-              });
-          })
-          .then(function(userQueues) {
-            return {
-              $or: {
-                queue: _.map(userQueues, 'id'),
-                memberid: user.id
-              }
-            };
-          });
-      default:
-        return {};
-    }
-  }
-}
-
-// Get timeout apps
-exports.timeout = function(req, res) {
-  return Promise
-    .all([])
-    .then(getSmsQueues(req.user))
-    .then(function(condition) {
-      return ReportSmsSession
-        .count(Util.getQuery(req.query, _.merge({
-          timeout: true
-        }, condition)));
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-// Get waiting apps
-exports.waiting = function(req, res) {
-  return Promise
-    .all([])
-    .then(getSmsQueues(req.user))
-    .then(function(condition) {
-      return ReportSmsSession
-        .count(Util.getQuery(req.query, _.merge({
-          leaveAt: null
-        }, condition)));
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-exports.waitingApplications = function(req, res) {
-  return Promise
-    .all([])
-    .then(getSmsQueues(req.user))
-    .then(function(condition) {
-      return ReportSmsSession
-        .findAll(Util.getQuery(req.query, _.merge({
-          leaveAt: null
-        }, condition)));
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        rows: data
-      });
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/report_sms_session/report_sms_session.events.js b/server/api/report_sms_session/report_sms_session.events.js
index 6617408..bc44309 100644
--- a/server/api/report_sms_session/report_sms_session.events.js
+++ b/server/api/report_sms_session/report_sms_session.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const ReportSmsSession = require('../../models').ReportSmsSession;
-
-var ReportSmsSessionEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-ReportSmsSessionEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  ReportSmsSession.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    ReportSmsSessionEvents.emit(event + ':' + doc._id, doc);
-    ReportSmsSessionEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = ReportSmsSessionEvents;
\ No newline at end of file
diff --git a/server/api/report_sms_session/report_sms_session.socket.js b/server/api/report_sms_session/report_sms_session.socket.js
index ef20c19..d5327e7 100644
--- a/server/api/report_sms_session/report_sms_session.socket.js
+++ b/server/api/report_sms_session/report_sms_session.socket.js
@@ -1,104 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const ReportSmsSessionEvents = require('./report_sms_session.events');
-const User = require('../../models').User;
-const Util = require('../../config/util');
-const _ = require('lodash');
-const Promise = require('bluebird');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('report_sms_session:' + event, socket);
-
-    ReportSmsSessionEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    switch (event) {
-      case 'report_sms_session:save':
-        return Promise
-          .all([])
-          .then(getSmsQueues(socket))
-          .then(function(condition) {
-            if (socket.role === 'admin' || _.includes(condition.memberid, doc.memberid) || _.includes(condition.queue, doc.queue)) {
-              socket.emit(event, doc);
-            }
-          })
-          .catch(function(err) {
-            console.log('Error filtering report sms sessions after save', err);
-          });
-      case 'report_sms_session:remove':
-        socket.emit(event, doc);
-        break;
-
-      default:
-
-    }
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    ReportSmsSessionEvents.removeListener(event, listener);
-  };
-}
-
-function getSmsQueues(user) {
-  return function() {
-    switch (user.role) {
-      case 'user':
-        return User
-          .findById(user.userId, {
-            attributes: ['id']
-          })
-          .then(Util.getSmsQueuesIdByUser({}, {
-            attributes: ['id'],
-            include: [{
-              raw: true,
-              model: User,
-              attributes: ['id']
-            }]
-          }))
-          .then(function(userQueues) {
-            var users = [];
-            userQueues.rows.forEach(function(queue) {
-              users = _.union(users, _.map(queue.Users, 'id'));
-            });
-            return {
-              queue: _.map(userQueues.rows, 'id'),
-              memberid: users
-            };
-          });
-      case 'agent':
-        return User
-          .findById(user.userId, {
-            attributes: ['id']
-          })
-          .then(function(agent) {
-            return agent
-              .getSmsQueues({
-                attributes: ['id']
-              });
-          })
-          .then(function(userQueues) {
-            return {
-              queue: _.map(userQueues, 'id'),
-              memberid: user.userId
-            };
-          });
-      default:
-        return {};
-    }
-  }
-}
\ No newline at end of file
diff --git a/server/api/report_square/index.js b/server/api/report_square/index.js
index ecde7a2..0be4c48 100644
--- a/server/api/report_square/index.js
+++ b/server/api/report_square/index.js
@@ -1,14 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./report_square.controller');
-var auth = require('../../auth/auth.service');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.index);
-router.get('/describe', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.describe);
-router.get('/realtime', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.realtime);
-router.get('/show', auth.isAuthenticated(), auth.hasModule([14], ['admin', 'agent']), controller.show);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/report_square/report_square.controller.js b/server/api/report_square/report_square.controller.js
index b32d3b6..47d772e 100644
--- a/server/api/report_square/report_square.controller.js
+++ b/server/api/report_square/report_square.controller.js
@@ -1,72 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var ReportSquare = require('../../models').ReportSquare;
-var ReportSquareHistory = require('../../models').history.ReportSquareHistory;
-var Util = require('../../config/util');
-
-// Get list of report_square
-exports.index = function(req, res, next) {
-  return generalIndex(req, res, next);
-};
-
-exports.realtime = function(req, res, next) {
-  return generalIndex(req, res, next, {
-    leaveAt: null
-  });
-};
-
-function generalIndex(req, res, next, extraWhere) {
-  return ReportSquare
-    .findAndCountAll(Util.getQuery(req.query, extraWhere || {}))
-    .then(function(result) {
-      return res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-}
-
-// Get list of fields
-exports.describe = function(req, res) {
-  return ReportSquareHistory
-    .describe()
-    .then(function(fields) {
-      return res.status(200).send(fields);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-exports.show = function(req, res) {
-  return ReportSquare
-    .findOne({
-      where: {
-        uniqueid: req.query.uniqueid
-      }
-    })
-    .then(function(report) {
-      if (report) {
-        return report;
-      }
-      return ReportSquareHistory
-        .findOne({
-          where: {
-            uniqueid: req.query.uniqueid
-          }
-        })
-    })
-    .then(function(report) {
-      if (!report) {
-        return res.sendStatus(404);
-      }
-      return res.status(200).send(report);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/report_square/report_square.events.js b/server/api/report_square/report_square.events.js
index 6dd24aa..8614738 100644
--- a/server/api/report_square/report_square.events.js
+++ b/server/api/report_square/report_square.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const ReportSquare = require('../../models').ReportSquare;
-
-var ReportSquareEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-ReportSquareEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  ReportSquare.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    ReportSquareEvents.emit(event + ':' + doc._id, doc);
-    ReportSquareEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = ReportSquareEvents;
\ No newline at end of file
diff --git a/server/api/report_square/report_square.socket.js b/server/api/report_square/report_square.socket.js
index c919775..39d28dd 100644
--- a/server/api/report_square/report_square.socket.js
+++ b/server/api/report_square/report_square.socket.js
@@ -1,44 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const ReportSquareEvents = require('./report_square.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('report_square:' + event, socket);
-
-    ReportSquareEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    switch (event) {
-      case 'report_square:save':
-        if (socket.role !== 'agent') {
-          socket.emit(event, doc);
-        }
-        break;
-      case 'report_square:remove':
-        socket.emit(event, doc);
-        break;
-
-      default:
-
-    }
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    ReportSquareEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/report_square_detail/index.js b/server/api/report_square_detail/index.js
index 58f916c..4d2bcaf 100644
--- a/server/api/report_square_detail/index.js
+++ b/server/api/report_square_detail/index.js
@@ -1,13 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./report_square_detail.controller');
-var auth = require('../../auth/auth.service');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.index);
-router.get('/describe', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.describe);
-router.get('/realtime', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.realtime);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/report_square_detail/report_square_detail.controller.js b/server/api/report_square_detail/report_square_detail.controller.js
index c903f0f..6179069 100644
--- a/server/api/report_square_detail/report_square_detail.controller.js
+++ b/server/api/report_square_detail/report_square_detail.controller.js
@@ -1,44 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var ReportSquareDetail = require('../../models').ReportSquareDetail;
-var ReportSquareDetailHistory = require('../../models').history.ReportSquareDetailHistory;
-var Util = require('../../config/util');
-
-// Get list of report_square
-exports.index = function(req, res, next) {
-  return generalIndex(req, res, next);
-};
-
-exports.realtime = function(req, res, next) {
-  return generalIndex(req, res, next, {
-    leaveAt: null
-  });
-};
-
-function generalIndex(req, res, next, extraWhere) {
-  return ReportSquareDetail
-    .findAndCountAll(Util.getQuery(req.query, extraWhere || {}))
-    .then(function(result) {
-      return res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-}
-
-// Get list of fields
-exports.describe = function(req, res) {
-  return ReportSquareDetailHistory
-    .describe()
-    .then(function(fields) {
-      return res.status(200).send(fields);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/report_square_detail/report_square_detail.events.js b/server/api/report_square_detail/report_square_detail.events.js
index f5cbed4..56cedee 100644
--- a/server/api/report_square_detail/report_square_detail.events.js
+++ b/server/api/report_square_detail/report_square_detail.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const ReportSquareDetail = require('../../models').ReportSquareDetail;
-
-var ReportSquareDetailEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-ReportSquareDetailEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  ReportSquareDetail.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    ReportSquareDetailEvents.emit(event + ':' + doc._id, doc);
-    ReportSquareDetailEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = ReportSquareDetailEvents;
\ No newline at end of file
diff --git a/server/api/report_square_detail/report_square_detail.socket.js b/server/api/report_square_detail/report_square_detail.socket.js
index ba3a758..4d59509 100644
--- a/server/api/report_square_detail/report_square_detail.socket.js
+++ b/server/api/report_square_detail/report_square_detail.socket.js
@@ -1,45 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const ReportSquareDetailEvents = require('./report_square_detail.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('report_square_detail:' + event, socket);
-
-    ReportSquareDetailEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    switch (event) {
-      case 'report_square_detail:save':
-        if (socket.role !== 'agent') {
-          socket.emit(event, doc);
-        }
-        break;
-
-      case 'report_square_detail:remove':
-        socket.emit(event, doc);
-        break;
-
-      default:
-
-    }
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    ReportSquareDetailEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/report_tree/index.js b/server/api/report_tree/index.js
index 419796c..7e261f1 100644
--- a/server/api/report_tree/index.js
+++ b/server/api/report_tree/index.js
@@ -1,12 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./report_tree.controller');
-var auth = require('../../auth/auth.service');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.index);
-router.put('/:id', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.update);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/report_tree/report_tree.controller.js b/server/api/report_tree/report_tree.controller.js
index e1f947e..24b35b7 100644
--- a/server/api/report_tree/report_tree.controller.js
+++ b/server/api/report_tree/report_tree.controller.js
@@ -1,43 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var util = require('util');
-var ReportTree = require('../../models').ReportTree;
-
-// Get the reports trees
-exports.index = function(req, res) {
-  return ReportTree
-    .findAll()
-    .then(function(trees) {
-      if (!trees) {
-        return res.sendStatus(404);
-      }
-      return res.status(200).send(trees);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing report in the DB.
-exports.update = function(req, res) {
-  return ReportTree
-    .findById(req.params.id)
-    .then(function(tree) {
-      if (!tree) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(tree, req.body);
-      return updated.save();
-    })
-    .then(function(tree) {
-      return res.status(200).send(tree);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/report_tree/report_tree.events.js b/server/api/report_tree/report_tree.events.js
index 650282c..fbbea4f 100644
--- a/server/api/report_tree/report_tree.events.js
+++ b/server/api/report_tree/report_tree.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const ReportTree = require('../../models').ReportTree;
-
-var ReportTreeEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-ReportTreeEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  ReportTree.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    ReportTreeEvents.emit(event + ':' + doc._id, doc);
-    ReportTreeEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = ReportTreeEvents;
\ No newline at end of file
diff --git a/server/api/report_tree/report_tree.socket.js b/server/api/report_tree/report_tree.socket.js
index 0209c1a..01e238b 100644
--- a/server/api/report_tree/report_tree.socket.js
+++ b/server/api/report_tree/report_tree.socket.js
@@ -1,32 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const ReportTreeEvents = require('./report_tree.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('report_tree:' + event, socket);
-
-    ReportTreeEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    ReportTreeEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/salesforce_account/index.js b/server/api/salesforce_account/index.js
index ec28594..31cdd5d 100644
--- a/server/api/salesforce_account/index.js
+++ b/server/api/salesforce_account/index.js
@@ -1,28 +1 @@
-'use strict';
-
-var express = require('express');
-var auth = require('../../auth/auth.service');
-var controller = require('./salesforce_account.controller');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), auth.hasModule([19, 13], ['admin']), controller.index);
-router.get('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.show);
-router.get('/:id/check', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.checkAccount);
-router.get('/:id/fields', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.getFields);
-router.get('/:id/configurations', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.getAccountConfigurations);
-router.get('/:id/configurations/:cid', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.getConfiguration);
-router.post('/validate/:field', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.accountValidation);
-router.post('/', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.create);
-router.post('/:id/configurations', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.createConfiguration);
-router.post('/:id/configurations/:cid/:type', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.createField);
-router.put('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.update);
-router.put('/:id/configurations/:cid/fields/:fid', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.updateField);
-router.delete('/', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.bulkDestroy);
-router.delete('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.destroy);
-router.delete('/:id/configurations', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.bulkDestroyConfigurations);
-router.delete('/:id/configurations/:cid', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.destroyConfiguration);
-router.delete('/:id/configurations/:cid/fields/:fid', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.destroyField);
-
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/salesforce_account/salesforce_account.controller.js b/server/api/salesforce_account/salesforce_account.controller.js
index 008c8f1..b300c8f 100644
--- a/server/api/salesforce_account/salesforce_account.controller.js
+++ b/server/api/salesforce_account/salesforce_account.controller.js
@@ -1,519 +1 @@
-/**
- * Using Rails-like standard naming convention for endpoints.
- * GET     /api/salesforce/accounts              ->  index
- * POST    /api/salesforce/accounts              ->  create
- * GET     /api/salesforce/accounts/:id          ->  show
- * PUT     /api/salesforce/accounts/:id          ->  update
- * DELETE  /api/salesforce/accounts/:id          ->  destroy
- */
-
-'use strict';
-
-
-var _ = require('lodash');
-var util = require('util');
-var jsforce = require('jsforce');
-var Util = require('../../config/util');
-
-var SalesforceAccount = require('../../models').SalesforceAccount;
-var SalesforceConfiguration = require('../../models').SalesforceConfiguration;
-var SalesforceField = require('../../models').SalesforceField;
-
-
-function handleError(res, statusCode) {
-  statusCode = statusCode || 500;
-  return function(err) {
-    res.status(statusCode).send(err);
-  };
-}
-
-function responseWithResult(res, statusCode) {
-  statusCode = statusCode || 200;
-  return function(entity) {
-    if (entity) {
-      res.status(statusCode).json(entity);
-    }
-  };
-}
-
-function responseWithoutResult(res, statusCode) {
-  statusCode = statusCode || 200;
-  return function() {
-    res.sendStatus(statusCode);
-  };
-}
-
-function handleEntityNotFound(res) {
-  return function(entity) {
-    if (!entity) {
-      res.status(404).end();
-      return null;
-    }
-    return entity;
-  };
-}
-
-function saveUpdates(updates) {
-  return function(entity) {
-    return entity.updateAttributes(updates)
-      .then(function(updated) {
-        return updated;
-      });
-  };
-}
-
-function removeEntity(res) {
-  return function(entity) {
-    if (entity) {
-      return entity.destroy()
-        .then(function() {
-          res.status(204).end();
-        });
-    }
-  };
-}
-
-// Gets a list of SalesforceAccounts
-exports.index = function(req, res, next) {
-  return SalesforceAccount
-    .scope('configurations')
-    .findAndCountAll(_.merge(Util.getQuery(req.query), {
-      distinct: true
-    }))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-};
-
-// Gets a single SalesforceAccount from the DB
-exports.show = function(req, res) {
-  return SalesforceAccount
-    .findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Creates a new SalesforceAccount in the DB
-exports.create = function(req, res) {
-  return SalesforceAccount
-    .create(req.body)
-    .then(responseWithResult(res, 201))
-    .catch(handleError(res));
-}
-
-// Updates an existing SalesforceAccount in the DB
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  return SalesforceAccount
-    .findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(saveUpdates(req.body))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Deletes a SalesforceAccount from the DB
-exports.destroy = function(req, res) {
-  return SalesforceAccount
-    .findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(removeEntity(res))
-    .catch(handleError(res));
-}
-
-exports.bulkDestroy = function(req, res) {
-  return SalesforceAccount
-    .destroy({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(responseWithResult(res, 204))
-    .catch(handleError(res));
-};
-
-exports.checkAccount = function(req, res) {
-  return SalesforceAccount.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(function(account) {
-      var conn = new jsforce.Connection({
-        oauth2: {
-          loginUrl: account.remoteUri,
-          clientId: account.clientId,
-          clientSecret: account.clientSecret,
-        }
-      });
-      var pwd = account.password.concat(account.securityToken);
-      conn.login(account.username, pwd, function(err, userInfo) {
-        if (err) {
-          return res.status(400).send(err);
-        }
-        return res.sendStatus(200);
-      });
-    })
-    .catch(handleError(res));
-}
-
-exports.accountValidation = function(req, res) {
-  var where = {};
-  where[req.params.field] = req.body.value;
-  return SalesforceAccount
-    .findAndCountAll({
-      where: where
-    })
-    .then(function(result) {
-      if (result.count) {
-        return res.status(200).send({
-          isValid: false,
-          value: req.body.value
-        });
-      }
-      return res.status(200).send({
-        isValid: true,
-        value: req.body.value
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.getFields = function(req, res) {
-  return SalesforceAccount.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(function(account) {
-      var conn = new jsforce.Connection({
-        oauth2: {
-          loginUrl: account.remoteUri,
-          clientId: account.clientId,
-          clientSecret: account.clientSecret,
-        }
-      });
-      var pwd = account.password.concat(account.securityToken);
-      conn.login(account.username, pwd, function(err, userInfo) {
-        if (err) {
-          return res.status(400).send(err);
-        }
-        conn.sobject("Task").describe(function(err, meta) {
-          if (err) {
-            return res.status(400).send(err);
-          }
-          return res.status(200).send(meta.fields);
-        });
-      });
-    })
-    .catch(handleError(res));
-};
-
-exports.getAccountConfigurations = function(req, res) {
-  return SalesforceConfiguration
-    .scope({
-      method: ['account', req.params.id]
-    })
-    .findAndCountAll(_.merge(Util.getQuery(req.query), {
-      distinct: true
-    }))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-exports.getConfiguration = function(req, res) {
-
-  return SalesforceConfiguration
-    .scope({
-      method: ['account', req.params.id]
-    })
-    .findById(req.params.cid)
-    .then(handleEntityNotFound(res))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-exports.destroyConfiguration = function(req, res) {
-  return SalesforceConfiguration
-    .scope({
-      method: ['account', req.params.id]
-    })
-    .findById(req.params.cid)
-    .then(handleEntityNotFound(res))
-    .then(removeEntity(res))
-    .catch(handleError(res));
-};
-
-exports.bulkDestroyConfigurations = function(req, res) {
-  return SalesforceConfiguration
-    .destroy({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(responseWithResult(res, 204))
-    .catch(handleError(res));
-};
-
-exports.createConfiguration = function(req, res) {
-  req.body['AccountId'] = req.params.id;
-
-  switch (req.body.channel) {
-    case 'voice':
-
-      if (req.body.type === 'Queue') {
-        req.body.Subject = [{
-          "type": "string",
-          "content": "[xCALLY Ticket]",
-          "variableName": null
-        }, {
-          "type": "variable",
-          "content": "",
-          "variableName": "queue"
-        }, {
-          "type": "variable",
-          "content": "",
-          "variableName": "calleridnum"
-        }];
-        req.body.Description = [{
-          "type": "string",
-          "content": "*** Call Info ***",
-          "key": null,
-          "keyType": null,
-          "variableName": null
-        }, {
-          "type": "keyValue",
-          "content": "",
-          "key": "Caller Number",
-          "keyType": "variable",
-          "variableName": "calleridnum"
-        }, {
-          "type": "keyValue",
-          "content": "",
-          "key": "Caller Name",
-          "keyType": "variable",
-          "variableName": "calleridname"
-        }, {
-          "type": "keyValue",
-          "content": "",
-          "key": "Call To",
-          "keyType": "variable",
-          "variableName": "destexten"
-        }, {
-          "type": "keyValue",
-          "content": "",
-          "key": "Queue",
-          "keyType": "variable",
-          "variableName": "queue"
-        }, {
-          "type": "keyValue",
-          "content": "",
-          "key": "UniqueId",
-          "keyType": "variable",
-          "variableName": "uniqueid"
-        }, {
-          "type": "keyValue",
-          "content": "",
-          "key": "Date",
-          "keyType": "variable",
-          "variableName": "agentcalledAt"
-        }, {
-          "type": "string",
-          "content": "*** Agent Info ***",
-          "key": null,
-          "keyType": null,
-          "variableName": null
-        }, {
-          "type": "keyValue",
-          "content": "",
-          "key": "Agent Name",
-          "keyType": "variable",
-          "variableName": "destcalleridname"
-        }, {
-          "type": "keyValue",
-          "content": "",
-          "key": "Agent Number",
-          "keyType": "variable",
-          "variableName": "destcalleridnum"
-        }, {
-          "type": "string",
-          "content": "*** Time Info ***",
-          "key": null,
-          "keyType": null,
-          "variableName": null
-        }, {
-          "type": "keyValue",
-          "content": "",
-          "key": "Agent Ring",
-          "keyType": "variable",
-          "variableName": "agentcalledAt"
-        }, {
-          "type": "keyValue",
-          "content": "",
-          "key": "Agent Connect",
-          "keyType": "variable",
-          "variableName": "agentconnectAt"
-        }, {
-          "type": "keyValue",
-          "content": "",
-          "key": "Agent Complete",
-          "keyType": "variable",
-          "variableName": "agentcompleteAt"
-        }, {
-          "type": "keyValue",
-          "content": "",
-          "key": "Hold Time",
-          "keyType": "variable",
-          "variableName": "holdtime"
-        }, {
-          "type": "keyValue",
-          "content": "",
-          "key": "Talk Time",
-          "keyType": "variable",
-          "variableName": "talktime"
-        }];
-      } else if (req.body.type === 'Outbound') {
-        req.body.Subject = [{
-          "type": "string",
-          "content": "[xCALLY Ticket]",
-          "variableName": null
-        }, {
-          "type": "string",
-          "content": "Outbound Call",
-          "variableName": null
-        }, {
-          "type": "variable",
-          "content": "",
-          "variableName": "destcalleridnum"
-        }];
-        req.body.Description = [{
-          "type": "string",
-          "content": "*** Call Info ***",
-          "variableName": null
-        }, {
-          "type": "keyValue",
-          "content": "",
-          "key": "Called Number",
-          "keyType": "variable",
-          "keyContent": "",
-          "variableName": "destcalleridnum"
-        }, {
-          "type": "keyValue",
-          "content": "",
-          "key": "Member Name",
-          "keyType": "variable",
-          "keyContent": "",
-          "variableName": "membername"
-        }, {
-          "type": "keyValue",
-          "content": "",
-          "key": "UniqueId",
-          "keyType": "variable",
-          "keyContent": "",
-          "variableName": "uniqueid"
-        }, {
-          "type": "keyValue",
-          "content": "",
-          "key": "Date",
-          "keyType": "variable",
-          "keyContent": "",
-          "variableName": "starttime"
-        }, {
-          "type": "string",
-          "content": "*** Time Info ***",
-        }, {
-          "type": "keyValue",
-          "content": "",
-          "key": "Answer Time",
-          "keyType": "variable",
-          "keyContent": "",
-          "variableName": "answertime"
-        }, {
-          "type": "keyValue",
-          "content": "",
-          "key": "Complete Time",
-          "keyType": "variable",
-          "keyContent": "",
-          "variableName": "endtime"
-        }];
-      }
-      break;
-    default:
-      console.log('Channel not available:', req.body.channel);
-  }
-
-  delete req.body.channel;
-  delete req.body.type;
-
-  return SalesforceConfiguration
-    .create(req.body, {
-      include: [{
-        model: SalesforceField,
-        as: 'Subject'
-      }, {
-        model: SalesforceField,
-        as: 'Description'
-      }]
-    })
-    .then(responseWithResult(res, 201))
-    .catch(handleError(res));
-};
-
-exports.createField = function(req, res) {
-  return SalesforceConfiguration
-    .scope({
-      method: ['account', req.params.id]
-    })
-    .findById(req.params.cid)
-    .then(handleEntityNotFound(res))
-    .then(function(configuration) {
-      switch (req.params.type) {
-        case 'subject':
-          req.body['SubjectId'] = req.params.cid;
-          break;
-        case 'description':
-          req.body['DescriptionId'] = req.params.cid;
-          break;
-        case 'field':
-          req.body['FieldId'] = req.params.cid;
-          break;
-      }
-      return SalesforceField.create(req.body);
-    })
-    .then(responseWithResult(res, 201))
-    .catch(handleError(res));
-};
-
-exports.updateField = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  return SalesforceField
-    .findById(req.params.fid)
-    .then(handleEntityNotFound(res))
-    .then(saveUpdates(req.body))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-};
-
-exports.destroyField = function(req, res) {
-  return SalesforceField
-    .findById(req.params.fid)
-    .then(handleEntityNotFound(res))
-    .then(removeEntity(res))
-    .catch(handleError(res));
-};
-
-exports.addConfigurationTags = function(req, res, next) {
-  return SalesforceConfiguration
-    .findById(req.params.cid)
-    .then(handleEntityNotFound(res))
-    .then(function(configuration) {
-      return configuration.setTags(req.body);
-    })
-    .then(responseWithoutResult(res, 200))
-    .catch(function(err) {
-      console.error(err);
-      return handleError(res, err);
-    });
-};
\ No newline at end of file
diff --git a/server/api/salesforce_account/salesforce_account.events.js b/server/api/salesforce_account/salesforce_account.events.js
index 13ee57f..cdc2a98 100644
--- a/server/api/salesforce_account/salesforce_account.events.js
+++ b/server/api/salesforce_account/salesforce_account.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const SalesforceAccount = require('../../models').SalesforceAccount;
-
-var SalesforceAccountEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-SalesforceAccountEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  SalesforceAccount.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    SalesforceAccountEvents.emit(event + ':' + doc._id, doc);
-    SalesforceAccountEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = SalesforceAccountEvents;
\ No newline at end of file
diff --git a/server/api/salesforce_account/salesforce_account.socket.js b/server/api/salesforce_account/salesforce_account.socket.js
index 3ee49f7..88e6c3e 100644
--- a/server/api/salesforce_account/salesforce_account.socket.js
+++ b/server/api/salesforce_account/salesforce_account.socket.js
@@ -1,32 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const SalesforceAccountEvents = require('./salesforce_account.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('salesforce_account:' + event, socket);
-
-    SalesforceAccountEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    SalesforceAccountEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/salesforce_configuration/index.js b/server/api/salesforce_configuration/index.js
index e0f8ff7..37c82e6 100644
--- a/server/api/salesforce_configuration/index.js
+++ b/server/api/salesforce_configuration/index.js
@@ -1,17 +1 @@
-'use strict';
-
-var express = require('express');
-var auth = require('../../auth/auth.service');
-var controller = require('./salesforce_configuration.controller');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), controller.index);
-
-router.get('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.show);
-router.post('/', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.create);
-router.put('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.update);
-router.post('/:id/:type', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.addConfigurationField);
-router.delete('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/salesforce_configuration/salesforce_configuration.controller.js b/server/api/salesforce_configuration/salesforce_configuration.controller.js
index 523aef6..da62f49 100644
--- a/server/api/salesforce_configuration/salesforce_configuration.controller.js
+++ b/server/api/salesforce_configuration/salesforce_configuration.controller.js
@@ -1,147 +1 @@
-/**
- * Using Rails-like standard naming convention for endpoints.
- * GET     /api/salesforce/configurations              ->  index
- * POST    /api/salesforce/configurations              ->  create
- * GET     /api/salesforce/configurations/:id          ->  show
- * PUT     /api/salesforce/configurations/:id          ->  update
- * DELETE  /api/salesforce/configurations/:id          ->  destroy
- */
-
-'use strict';
-
-
-var _ = require('lodash');
-
-var SalesforceConfiguration = require('../../models').SalesforceConfiguration;
-var SalesforceField = require('../../models').SalesforceField;
-
-
-function handleError(res, statusCode) {
-  statusCode = statusCode || 500;
-  return function(err) {
-    res.status(statusCode).send(err);
-  };
-}
-
-function responseWithResult(res, statusCode) {
-  statusCode = statusCode || 200;
-  return function(entity) {
-    if (entity) {
-      res.status(statusCode).json(entity);
-    }
-  };
-}
-
-function handleEntityNotFound(res) {
-  return function(entity) {
-    if (!entity) {
-      res.status(404).end();
-      return null;
-    }
-    return entity;
-  };
-}
-
-function saveUpdates(updates) {
-  return function(entity) {
-    return entity.updateAttributes(updates)
-      .then(function(updated) {
-        return updated;
-      });
-  };
-}
-
-function removeEntity(res) {
-  return function(entity) {
-    if (entity) {
-      return entity.destroy()
-        .then(function() {
-          res.status(204).end();
-        });
-    }
-  };
-}
-
-// Gets a list of SalesforceConfigurations
-exports.index = function(req, res) {
-  SalesforceConfiguration.findAll({
-      where: req.query
-    })
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Gets a single SalesforceConfiguration from the DB
-exports.show = function(req, res) {
-  SalesforceConfiguration.find({
-      where: {
-        id: req.params.id
-      },
-      include: [{
-        model: SalesforceField,
-        as: 'Subject'
-      }, {
-        model: SalesforceField,
-        as: 'Description'
-      }, {
-        model: SalesforceField,
-        as: 'Field'
-      }]
-    })
-    .then(handleEntityNotFound(res))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Creates a new SalesforceConfiguration in the DB
-exports.create = function(req, res) {
-  SalesforceConfiguration.create(req.body)
-    .then(responseWithResult(res, 201))
-    .catch(handleError(res));
-}
-
-// Updates an existing SalesforceConfiguration in the DB
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  SalesforceConfiguration.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(saveUpdates(req.body))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Deletes a SalesforceConfiguration from the DB
-exports.destroy = function(req, res) {
-  SalesforceConfiguration.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(removeEntity(res))
-    .catch(handleError(res));
-}
-
-exports.addConfigurationField = function(req, res, next) {
-  // console.log(req.params);
-  var salesforceConfiguration;
-  SalesforceConfiguration
-    .findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(function(salesforce_configuration) {
-      salesforceConfiguration = salesforce_configuration;
-      return SalesforceField.create(req.body)
-    })
-    .then(function(salesforceField) {
-      switch (req.params.type) {
-        case 'subject':
-          return [salesforceConfiguration.addSubject(salesforceField), salesforceField];
-        case 'description':
-          return [salesforceConfiguration.addDescription(salesforceField), salesforceField];
-        case 'field':
-          return [salesforceConfiguration.addField(salesforceField), salesforceField];
-      }
-    })
-    .spread(function(data, salesforceField) {
-      return res.status(201).json(salesforceField);
-    })
-    .catch(handleError(res));
-};
\ No newline at end of file
diff --git a/server/api/salesforce_configuration/salesforce_configuration.events.js b/server/api/salesforce_configuration/salesforce_configuration.events.js
index 0814fbf..fd95e63 100644
--- a/server/api/salesforce_configuration/salesforce_configuration.events.js
+++ b/server/api/salesforce_configuration/salesforce_configuration.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const SalesforceConfiguration = require('../../models').SalesforceConfiguration;
-
-var SalesforceConfigurationEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-SalesforceConfigurationEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  SalesforceConfiguration.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    SalesforceConfigurationEvents.emit(event + ':' + doc._id, doc);
-    SalesforceConfigurationEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = SalesforceConfigurationEvents;
\ No newline at end of file
diff --git a/server/api/salesforce_configuration/salesforce_configuration.socket.js b/server/api/salesforce_configuration/salesforce_configuration.socket.js
index df21994..42a580d 100644
--- a/server/api/salesforce_configuration/salesforce_configuration.socket.js
+++ b/server/api/salesforce_configuration/salesforce_configuration.socket.js
@@ -1,32 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const SalesforceConfigurationEvents = require('./salesforce_configuration.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('salesforce_configuration:' + event, socket);
-
-    SalesforceConfigurationEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    SalesforceConfigurationEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/salesforce_field/index.js b/server/api/salesforce_field/index.js
index 2dd2a9d..f05b976 100644
--- a/server/api/salesforce_field/index.js
+++ b/server/api/salesforce_field/index.js
@@ -1,17 +1 @@
-'use strict';
-
-var express = require('express');
-var auth = require('../../auth/auth.service');
-var controller = require('./salesforce_field.controller');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), controller.index);
-
-router.get('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.show);
-router.post('/', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.create);
-router.put('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.update);
-router.delete('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.destroy);
-
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/salesforce_field/salesforce_field.controller.js b/server/api/salesforce_field/salesforce_field.controller.js
index bab61d7..924ffa0 100644
--- a/server/api/salesforce_field/salesforce_field.controller.js
+++ b/server/api/salesforce_field/salesforce_field.controller.js
@@ -1,104 +1 @@
-/**
- * Using Rails-like standard naming convention for endpoints.
- * GET     /api/salesforce/fields              ->  index
- * POST    /api/salesforce/fields              ->  create
- * GET     /api/salesforce/fields/:id          ->  show
- * PUT     /api/salesforce/fields/:id          ->  update
- * DELETE  /api/salesforce/fields/:id          ->  destroy
- */
-
-'use strict';
-
-
-var _ = require('lodash');
-
-var SalesforceField = require('../../models').SalesforceField;
-
-
-function handleError(res, statusCode) {
-  statusCode = statusCode || 500;
-  return function(err) {
-    res.status(statusCode).send(err);
-  };
-}
-
-function responseWithResult(res, statusCode) {
-  statusCode = statusCode || 200;
-  return function(entity) {
-    if (entity) {
-      res.status(statusCode).json(entity);
-    }
-  };
-}
-
-function handleEntityNotFound(res) {
-  return function(entity) {
-    if (!entity) {
-      res.status(404).end();
-      return null;
-    }
-    return entity;
-  };
-}
-
-function saveUpdates(updates) {
-  return function(entity) {
-    return entity.updateAttributes(updates)
-      .then(function(updated) {
-        return updated;
-      });
-  };
-}
-
-function removeEntity(res) {
-  return function(entity) {
-    if (entity) {
-      return entity.destroy()
-        .then(function() {
-          res.status(204).end();
-        });
-    }
-  };
-}
-
-// Gets a list of SalesforceFields
-exports.index = function(req, res) {
-  SalesforceField.findAll()
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Gets a single SalesforceField from the DB
-exports.show = function(req, res) {
-  SalesforceField.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Creates a new SalesforceField in the DB
-exports.create = function(req, res) {
-  SalesforceField.create(req.body)
-    .then(responseWithResult(res, 201))
-    .catch(handleError(res));
-}
-
-// Updates an existing SalesforceField in the DB
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  SalesforceField.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(saveUpdates(req.body))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Deletes a SalesforceField from the DB
-exports.destroy = function(req, res) {
-  SalesforceField.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(removeEntity(res))
-    .catch(handleError(res));
-}
\ No newline at end of file
diff --git a/server/api/salesforce_field/salesforce_field.events.js b/server/api/salesforce_field/salesforce_field.events.js
index 44a66ad..0e4741a 100644
--- a/server/api/salesforce_field/salesforce_field.events.js
+++ b/server/api/salesforce_field/salesforce_field.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const SalesforceField = require('../../models').SalesforceField;
-
-var SalesforceFieldEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-SalesforceFieldEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  SalesforceField.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    SalesforceFieldEvents.emit(event + ':' + doc._id, doc);
-    SalesforceFieldEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = SalesforceFieldEvents;
\ No newline at end of file
diff --git a/server/api/salesforce_field/salesforce_field.socket.js b/server/api/salesforce_field/salesforce_field.socket.js
index e394e5b..8db8326 100644
--- a/server/api/salesforce_field/salesforce_field.socket.js
+++ b/server/api/salesforce_field/salesforce_field.socket.js
@@ -1,32 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const SalesforceFieldEvents = require('./salesforce_field.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('salesforce_field:' + event, socket);
-
-    SalesforceFieldEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    SalesforceFieldEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/scheduler/index.js b/server/api/scheduler/index.js
index 7dd28ad..1da58e0 100644
--- a/server/api/scheduler/index.js
+++ b/server/api/scheduler/index.js
@@ -1,19 +1 @@
-'use strict';
-
-var express = require('express');
-var auth = require('../../auth/auth.service');
-var controller = require('./scheduler.controller');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), controller.index);
-
-router.get('/:id', auth.isAuthenticated(), controller.show);
-router.get('/:id/run', auth.isAuthenticated(), controller.runSchedule);
-router.post('/', auth.isAuthenticated(), controller.create);
-router.put('/:id', auth.isAuthenticated(), controller.update);
-router.patch('/:id', auth.isAuthenticated(), controller.update);
-router.delete('/:id', auth.isAuthenticated(), controller.destroy);
-
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/scheduler/scheduler.controller.js b/server/api/scheduler/scheduler.controller.js
index f25aa6a..b16cbae 100644
--- a/server/api/scheduler/scheduler.controller.js
+++ b/server/api/scheduler/scheduler.controller.js
@@ -1,130 +1 @@
-'use strict';
-
-
-var _ = require('lodash');
-
-var Schedule = require('../../models').Schedule;
-var MailServerOut = require('../../models').MailServerOut;
-var Reports = require('../../config/scheduler/reports');
-
-
-function handleError(res, statusCode) {
-  statusCode = statusCode || 500;
-  return function(err) {
-    console.log(err);
-    res.status(statusCode).send(err);
-  };
-}
-
-function responseWithResult(res, statusCode) {
-  statusCode = statusCode || 200;
-  return function(entity) {
-    if (entity) {
-      res.status(statusCode).json(entity);
-    }
-  };
-}
-
-function responseWithoutResult(res, statusCode) {
-  statusCode = statusCode || 200;
-  return function() {
-    res.sendStatus(statusCode);
-  };
-}
-
-function handleEntityNotFound(res) {
-  return function(entity) {
-    if (!entity) {
-      res.status(404).end();
-      return null;
-    }
-    return entity;
-  };
-}
-
-function saveUpdates(updates) {
-  return function(entity) {
-    return entity.updateAttributes(updates)
-      .then(function(updated) {
-        return updated;
-      });
-  };
-}
-
-function removeEntity(res) {
-  return function(entity) {
-    if (entity) {
-      return entity.destroy()
-        .then(function() {
-          res.status(204).end();
-        });
-    }
-  };
-}
-
-function runSchedule(req) {
-  return function(entity) {
-    if (entity) {
-      switch (entity.type) {
-        case 'report':
-          var scheduler = new Reports();
-          scheduler.extractReport(entity, req.user)
-          break;
-        default:
-      }
-    }
-  }
-}
-
-// Gets a list of Schedules
-exports.index = function(req, res) {
-  Schedule.findAndCountAll()
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Gets a single Schedule from the DB
-exports.show = function(req, res) {
-  Schedule.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Execute single Schedule from the DB
-exports.runSchedule = function(req, res) {
-  Schedule.findById(req.params.id, {
-      include: [MailServerOut]
-    })
-    .then(handleEntityNotFound(res))
-    .then(runSchedule(req))
-    .then(responseWithoutResult(res))
-    .catch(handleError(res));
-}
-
-// Creates a new Schedule in the DB
-exports.create = function(req, res) {
-  Schedule.create(req.body)
-    .then(responseWithResult(res, 201))
-    .catch(handleError(res));
-}
-
-// Updates an existing Schedule in the DB
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  Schedule.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(saveUpdates(req.body))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Deletes a Schedule from the DB
-exports.destroy = function(req, res) {
-  Schedule.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(removeEntity(res))
-    .catch(handleError(res));
-}
\ No newline at end of file
diff --git a/server/api/scheduler/scheduler.events.js b/server/api/scheduler/scheduler.events.js
index 7718bf6..e61aad9 100644
--- a/server/api/scheduler/scheduler.events.js
+++ b/server/api/scheduler/scheduler.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const Schedule = require('../../models').Schedule;
-
-var SchedulerEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-SchedulerEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  Schedule.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    SchedulerEvents.emit(event + ':' + doc._id, doc);
-    SchedulerEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = SchedulerEvents;
\ No newline at end of file
diff --git a/server/api/scheduler/scheduler.socket.js b/server/api/scheduler/scheduler.socket.js
index 16264a4..dd4a4af 100644
--- a/server/api/scheduler/scheduler.socket.js
+++ b/server/api/scheduler/scheduler.socket.js
@@ -1,32 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const SchedulerEvents = require('./scheduler.events');
-
-// Model events to emit
-var events = ['save', 'update', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('schedule:' + event, socket);
-
-    SchedulerEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    SchedulerEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/setting/index.js b/server/api/setting/index.js
index cbca952..8b12866 100644
--- a/server/api/setting/index.js
+++ b/server/api/setting/index.js
@@ -1,28 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./setting.controller');
-var auth = require('../../auth/auth.service');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), auth.hasRole('admin'), controller.index);
-router.get('/smtp', auth.isAuthenticated(), auth.hasModule([9], ['admin', 'agent']), controller.showCustom);
-router.get('/internal', auth.isAuthenticated(), auth.hasRole('admin'), controller.getInternal);
-router.get('/mailbox', auth.isAuthenticated(), auth.hasRole('admin'), controller.getMailbox);
-router.get('/logo/main/:filename', controller.getLogo);
-router.get('/logo/login/:filename', controller.getLoginLogo);
-router.get('/system', auth.isAuthenticated(), auth.hasRole('admin'), controller.stats);
-router.get('/logs', auth.isAuthenticated(), auth.hasRole('admin'), controller.logs);
-router.get('/info', controller.getInfo);
-router.get('/:id', auth.isAuthenticated(), controller.show);
-router.post('/', auth.isAuthenticated(), auth.hasRole('admin'), controller.create);
-router.post('/asterisk', auth.isAuthenticated(), auth.hasRole('admin'), controller.asteriskCommand);
-router.post('/logo/main', auth.isAuthenticated(), auth.hasRole('admin'), controller.changeLogo);
-router.post('/logo/login', auth.isAuthenticated(), auth.hasRole('admin'), controller.changeLoginLogo);
-router.post('/smtp', auth.isAuthenticated(), auth.hasRole('admin'), controller.createSmtp);
-router.put('/smtp/:id', auth.isAuthenticated(), auth.hasRole('admin'), controller.updateSmtp);
-router.put('/:id', auth.isAuthenticated(), auth.hasRole('admin'), controller.update);
-router.delete('/:id', auth.isAuthenticated(), auth.hasRole('admin'), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/setting/setting.controller.js b/server/api/setting/setting.controller.js
index f5db6ef..53cb3ca 100644
--- a/server/api/setting/setting.controller.js
+++ b/server/api/setting/setting.controller.js
@@ -1,422 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var Setting = require('../../models').Setting;
-var system = require('../../config/tools/system');
-var Agent = require('../../models').User;
-var VoiceMail = require('../../models').VoiceVoicemail;
-var MailAccount = require('../../models').MailAccount;
-var MailServerOut = require('../../models').MailServerOut;
-var Promise = require('bluebird');
-var UploadFile = require('upload-file');
-var path = require('path');
-var sequelize = require('../../models').sequelize;
-var config = require('../../config/environment');
-var sr = require('simple-random');
-var fs = require('fs');
-
-// Get list of settings
-exports.index = function(req, res) {
-  return Setting
-    .findAll()
-    .then(function(settings) {
-      return res.status(200).send(settings);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.stats = function(req, res) {
-  return Promise
-    .all([])
-    .then(system.checkStatus())
-    .then(function(stats) {
-      return res.status(200).send(stats);
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-}
-
-exports.asteriskCommand = function(req, res) {
-  return Promise
-    .promisify(req.app.locals.ami.action)({
-      action: 'Command',
-      command: req.body.command.trim(),
-    })
-    .then(function(result) {
-      return res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-}
-
-exports.logs = function(req, res) {
-  var logs = {
-    output: '',
-    errors: ''
-  };
-  var readFile = Promise.promisify(fs.readFile);
-  var exists = Promise.promisify(fs.exists);
-  return readFile('/var/log/xcally/motion-err.log', 'utf8')
-    .then(function(errs) {
-      logs.errors = errs;
-    })
-    .catch(function(err) {
-      logs.errors = 'No error log file found!';
-    })
-    .then(function() {
-      return readFile('/var/log/xcally/motion-out.log', 'utf8');
-    })
-    .then(function(out) {
-      logs.output = out;
-    })
-    .catch(function(err) {
-      logs.output = 'No output log file found!';
-    })
-    .then(function(result) {
-      return res.status(200).send(logs);
-    })
-    .catch(function(err) {
-      console.log('logs error:', err.message);
-      return handleError(res, err);
-    });
-}
-
-exports.changeLogo = function(req, res) {
-  changeLogo(req, res, 'logo');
-}
-
-exports.changeLoginLogo = function(req, res) {
-  changeLogo(req, res, 'loginLogo');
-}
-
-function changeLogo(req, res, field) {
-
-  var upload = new UploadFile({
-    dest: path.join(config.root, 'server', 'files', 'images'),
-    maxNumberOfFiles: 1,
-    minNumberOfFiles: 0,
-    acceptFileTypes: /(\.|\/)(jpeg|png)$/i,
-    rename: function(name, file) {
-      return sr() + path.extname(file.filename);
-    },
-    messages: {
-      maxNumberOfFiles: "Max number of files upload exceeded",
-      acceptFileTypes: "Only jpeg and png format accepted",
-      invalidRequest: "Invalid request"
-    }
-  });
-
-  upload.on('end', function(fields, files) {
-    if (!files.file.filename) {
-      return res.status(500).send(upload);
-    }
-    return sequelize.transaction(function(t) {
-        return Setting
-          .findById(1)
-          .then(function(settings) {
-            if (!settings) {
-              return res.sendStatus(404);
-            }
-            var body = {};
-            body[field] = files.file.filename;
-            return settings
-              .update(body, {
-                transaction: t
-              });
-          })
-          .then(function(user) {
-            return res.status(200).send(user);
-          })
-      })
-      .catch(function(err) {
-        return handleError(res, err);
-      });
-  });
-
-  upload.on('error', function(err) {
-    console.log('********** Upload error :', err)
-    return handleError(res, err);
-  });
-
-  upload.parse(req);
-}
-
-
-exports.getLogo = function(req, res) {
-  getLogo(req, res, 'logo.png');
-}
-
-exports.getLoginLogo = function(req, res) {
-  getLogo(req, res, 'logo-big.png');
-}
-
-function getLogo(req, res, image) {
-  var imgPath = path.join(config.root, 'server', 'files', 'images', req.params.filename);
-
-  fs.exists(imgPath, function(exists) {
-    if (!exists) {
-      imgPath = path.join(config.root, 'server', 'files', 'images', 'default', image);
-    }
-
-    return res.sendFile(imgPath);
-  });
-}
-
-// Get internal
-exports.getInternal = function(req, res) {
-  var _settings;
-  return Setting
-    .findById(1)
-    .then(function(settings) {
-      _settings = settings;
-      return Agent
-        .findAll({
-          attributes: ['internal']
-        });
-    })
-    .then(function(internals) {
-      var _internals = _.map(internals, 'internal');
-      var _internal = {
-        value: 0,
-        range: 0 //maximum number of internals before an occupied one, 0 is unlimited
-      };
-      var nextUsed;
-      if (req.query.internal) {
-        _internal.value = Number(req.query.internal);
-        while (_.includes(_internals, _internal.value)) {
-          _internal.value++;
-        }
-        nextUsed = _.filter(_internals, function(elem) {
-          return elem > _internal.value;
-        }).shift();
-        _internal.range = nextUsed - _internal.value;
-      } else {
-        var maxInternal = _.max(_internals);
-        _internal.value = _settings.min_internal; //if the max internal is lower than my lower limit, i just set the limit as the internal
-        if (maxInternal && maxInternal >= _settings.min_internal) { //otherwise i get the first of the used internals and then I increment the value until I find an empty one
-          while (_.includes(_internals, _internal.value)) {
-            _internal.value++;
-          }
-          //then I find the next used internal and calculate the maximum number of free internals before a used one
-          nextUsed = _.filter(_internals, function(elem) {
-            return elem > _internal.value;
-          }).shift();
-          _internal.range = nextUsed - _internal.value;
-        }
-      }
-      return res.status(200).send(_internal);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get mailbox
-exports.getMailbox = function(req, res) {
-  var _settings;
-  return Setting
-    .findById(1)
-    .then(function(settings) {
-      _settings = settings;
-      return VoiceMail
-        .findAll({
-          attributes: ['mailbox']
-        });
-    })
-    .then(function(mailboxes) {
-      var _mailboxes = _.map(mailboxes, function(elem) {
-        return Number(elem.mailbox);
-      });
-      var _mailbox = {
-        value: 0,
-        range: 0 //maximum number of mailboxs before an occupied one, 0 is unlimited
-      };
-      var nextUsed;
-      var maxMailbox = _.max(_mailboxes);
-      _mailbox.value = _settings.min_mailbox; //if the max mailbox is lower than my lower limit, i just set the limit as the mailbox
-      if (maxMailbox && maxMailbox >= _settings.min_mailbox) { //otherwise i get the first of the used mailboxes and then I increment the value until I find an empty one
-        while (_.includes(_mailboxes, _mailbox.value)) {
-          _mailbox.value++;
-        }
-        //then I find the next used mailbox and calculate the maximum number of free mailboxes before a used one
-        nextUsed = _.filter(_mailboxes, function(elem) {
-          return elem > _mailbox.value;
-        }).shift();
-        _mailbox.range = nextUsed - _mailbox.value;
-      }
-
-      return res.status(200).send(_mailbox);
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-// Get list of settings
-exports.getInfo = function(req, res) {
-
-  var info = require('../../../package.json');
-
-  return res.status(200).send({
-    name: info.name,
-    version: info.version,
-    engines: info.engines
-  });
-};
-
-// Get a single setting
-exports.show = function(req, res) {
-  return Setting
-    .findById(req.params.id)
-    .then(function(setting) {
-      if (!setting) {
-        return res.sendStatus(404);
-      }
-      return res.send(setting);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single mailAccount
-exports.showCustom = function(req, res, next) {
-  return MailAccount
-    .findOne({
-      where: {
-        service: true
-      },
-      include: [{
-        model: MailServerOut,
-        attributes: ['id', 'host', 'port', 'username', 'password', 'ssl', 'state', 'source', 'description']
-      }]
-    })
-    .then(function(mailAccount) {
-      console.log('mailAccount', mailAccount);
-      if (!mailAccount) {
-        return res.sendStatus(404);
-      }
-      return res.send(mailAccount);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new setting in the DB.
-exports.create = function(req, res) {
-  return Setting
-    .create(req.body)
-    .then(function(setting) {
-      return res.status(201).send(setting);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new mailAccount in the DB.
-exports.createSmtp = function(req, res, next) {
-  return MailAccount
-    .create(req.body, {
-      include: [{
-        model: MailServerOut
-      }]
-    }).then(function(mailAccount) {
-      return res.status(201).send(mailAccount);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new setting in the DB.
-exports.updateSmtp = function(req, res) {
-  var _mailAccount;
-
-  return MailAccount
-    .findById(req.params.id)
-    .then(function(mailAccount) {
-      _mailAccount = mailAccount;
-
-      return _mailAccount
-        .update({
-          name: req.body.name,
-          address: req.body.address,
-          service: req.body.service,
-          signature: req.body.signature,
-          ListId: req.body.ListId,
-          TemplateId: req.body.TemplateId
-        });
-    })
-    .then(function(mailAccount) {
-      if (req.body.MailServerOut) {
-        req.body.MailServerOut.state = 'CONNECTING';
-        req.body.MailServerOut.source = null;
-
-        return MailServerOut
-          .update(req.body.MailServerOut, {
-            where: {
-              id: req.body.MailServerOut.id
-            },
-            individualHooks: true
-          });
-      }
-    })
-    .then(function(smtp) {
-      return res.sendStatus(200);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing setting in the DB.
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  return Setting
-    .findById(req.params.id)
-    .then(function(setting) {
-      if (!setting) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(setting, req.body);
-      return updated.save();
-    })
-    .then(function(setting) {
-      return res.status(200).send(setting);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a setting from the DB.
-exports.destroy = function(req, res) {
-  return Setting
-    .findById(req.params.id)
-    .then(function(setting) {
-      if (!setting) {
-        return res.sendStatus(404);
-      }
-      return setting.destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/setting/setting.events.js b/server/api/setting/setting.events.js
index 1aa184d..68ae748 100644
--- a/server/api/setting/setting.events.js
+++ b/server/api/setting/setting.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const Setting = require('../../models').Setting;
-
-var SettingEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-SettingEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  Setting.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    SettingEvents.emit(event + ':' + doc._id, doc);
-    SettingEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = SettingEvents;
\ No newline at end of file
diff --git a/server/api/setting/setting.socket.js b/server/api/setting/setting.socket.js
index 6b71535..383b277 100644
--- a/server/api/setting/setting.socket.js
+++ b/server/api/setting/setting.socket.js
@@ -1,32 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const SettingEvents = require('./setting.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('setting:' + event, socket);
-
-    SettingEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    SettingEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/sms_account/index.js b/server/api/sms_account/index.js
index 6870a09..1af68aa 100644
--- a/server/api/sms_account/index.js
+++ b/server/api/sms_account/index.js
@@ -1,31 +1 @@
-'use strict';
-
-var express = require('express');
-var auth = require('../../auth/auth.service');
-var controller = require('./sms_account.controller');
-var license = require('../../config/license/license.service');
-var router = express.Router();
-
-router.get('/', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin', 'agent']), controller.index);
-router.get('/:id', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin']), controller.show);
-router.get('/:id/applications', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin']), controller.showApplications);
-router.get('/:id/check', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin']), controller.checkAccount);
-router.get('/:id/rooms', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin', 'agent']), controller.getSmsRooms);
-router.get('/:id/dispositions', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin', 'agent']), controller.getDispositions);
-router.post('/', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin']), controller.create);
-router.post('/:id/dispositions', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin']), controller.createDisposition);
-router.post('/:id/applications', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin']), controller.createApplication);
-router.post('/:id/send', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin', 'agent']), controller.sendMessage);
-router.post('/:id/receive', license.isValidDate(), license.hasSms(), controller.receiveMessage);
-router.post('/:id/message/:msgId/update', license.isValidDate(), license.hasSms(), controller.updateStatus);
-router.post('/:id/messageStatus', license.isValidDate(), license.hasSms(), controller.messageStatus);
-router.put('/:id', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin']), controller.update);
-router.put('/:id/applications', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin']), controller.updateApplications);
-router.put('/:id/applications/:appId', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin']), controller.updateApplication);
-router.put('/:id/dispositions/:dispId', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin']), controller.updateDisposition);
-router.delete('/:id', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin']), controller.destroy);
-router.delete('/:id/applications', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin']), controller.bulkDestroyApplications);
-router.delete('/:id/applications/:appId', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin']), controller.destroyApplication);
-router.delete('/:id/dispositions/:dispId', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin']), controller.destroyDisposition);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/sms_account/sms_account.controller.js b/server/api/sms_account/sms_account.controller.js
index 78cb631..2b66b67 100644
--- a/server/api/sms_account/sms_account.controller.js
+++ b/server/api/sms_account/sms_account.controller.js
@@ -1,678 +1 @@
-/**
- * Using Rails-like standard naming convention for endpoints.
- * GET     /api/sms_accounts              ->  index
- * POST    /api/sms_accounts              ->  create
- * GET     /api/sms_accounts/:id          ->  show
- * PUT     /api/sms_accounts/:id          ->  update
- * DELETE  /api/sms_accounts/:id          ->  destroy
- */
-
-'use strict';
-
-
-var _ = require('lodash');
-var Util = require('../../config/util');
-var skebby = require('../../config/sms/skebby');
-var sequelize = require('../../models').sequelize;
-var User = require('../../models').User;
-var SmsAccount = require('../../models').SmsAccount;
-var SmsQueue = require('../../models').SmsQueue;
-var SmsApplication = require('../../models').SmsApplication;
-var SmsMessage = require('../../models').SmsMessage;
-var SmsRoom = require('../../models').SmsRoom;
-var SmsDisposition = require('../../models').SmsDisposition;
-var Contact = require('../../models').Contact;
-var Interval = require('../../models').Interval;
-var Promise = require('bluebird');
-var moment = require('moment');
-
-
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
-
-// Gets a list of SmsAccounts
-exports.index = function(req, res) {
-  return SmsAccount
-    .findAndCountAll(Util.getQuery(req.query))
-    .then(function(sms_account) {
-      res.status(200).send(sms_account);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-
-}
-
-// Gets a single SmsAccount from the DB
-exports.show = function(req, res) {
-  return SmsAccount
-    .findById(req.params.id)
-    .then(function(smsAccount) {
-      if (!smsAccount) {
-        return res.sendStatus(404);
-      }
-      return res.send(smsAccount);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-}
-exports.checkAccount = function(req, res) {
-  return SmsAccount
-    .findById(req.params.id)
-    .then(function(smsAccount) {
-      if (!smsAccount) {
-        return res.sendStatus(404);
-      }
-      switch (smsAccount.type) {
-        case 'twilio':
-          var client = require('twilio')(smsAccount.sid, smsAccount.token);
-          var getList = Promise.promisify(client.accounts.list);
-          return getList();
-          break;
-        case 'skebby':
-          var _mMessage = {
-            from: 'Test',
-            to: 'Test',
-            body: 'Test'
-          };
-          smsAccount.smstype = 'test';
-          return skebby.sendMessage(_mMessage, smsAccount)
-          break;
-        default:
-          throw new Error('There is no authentication for this account');
-
-      }
-    })
-    .then(function(response) {
-      return res.sendStatus(200);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-}
-exports.getDispositions = function(req, res, next) {
-  return SmsAccount
-    .findById(req.params.id)
-    .then(function(smsAccount) {
-      if (!smsAccount) {
-        return res.sendStatus(404);
-      }
-
-      return smsAccount
-        .getSmsDispositions();
-    })
-    .then(function(smsDispositions) {
-      return res.status(200).send({
-        rows: smsDispositions,
-        count: smsDispositions.length
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-// Get Applications
-exports.showApplications = function(req, res, next) {
-  return SmsAccount
-    .scope('default')
-    .findById(req.params.id)
-    .then(function(smsAccount) {
-      if (!smsAccount) {
-        return res.sendStatus(404);
-      }
-      return smsAccount
-        .getSmsApplications(_.merge(Util.getQuery(req.query), {
-          include: [{
-            model: SmsQueue,
-            attributes: ['id', 'name']
-          }, {
-            model: User,
-            attributes: ['id', 'name', 'online']
-          }, {
-            model: Interval,
-            attributes: ['id', 'name']
-          }]
-        }));
-    })
-    .then(function(smsApplications) {
-      return res.send({
-        count: smsApplications.length,
-        rows: smsApplications
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-// Creates a new SmsAccount in the DB
-exports.create = function(req, res) {
-  return SmsAccount
-    .create(req.body)
-    .then(function(smsAccount) {
-      console.log(smsAccount);
-      return res.status(201).send(smsAccount);
-    })
-    .catch(sequelize.UniqueConstraintError, function(err) {
-      return Util.errorManager.handleUniqueConstraintError(res, err);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-
-}
-
-exports.createDisposition = function(req, res, next) {
-  req.body.SmsAccountId = req.params.id;
-
-  return SmsDisposition
-    .create(req.body)
-    .then(function(smsDiposition) {
-      return res.status(201).send(smsDiposition);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a send Message in the DB.
-exports.sendMessage = function(req, res, next) {
-  req.body.SmsAccountId = req.params.id;
-  req.body.UserId = req.user.id;
-
-  return SmsMessage
-    .create(req.body, {
-      user: req.user
-    })
-    .then(function(sms_message) {
-      return res.status(201).send(sms_message);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-// Creates a receive Message in the DB.
-function getMessage(message) {
-  var _message;
-  console.log(message);
-  switch (message.accountType) {
-    case 'twilio':
-      if (message.From && message.To && message.Body) {
-        _message = {
-          from: message.From,
-          to: message.To,
-          body: message.Body
-        };
-      }
-      break;
-    case 'skebby':
-      if ((message.sender && message.receiver && message.text)) {
-        _message = {
-          from: message.sender,
-          to: message.receiver,
-          body: message.text
-        };
-      }
-      break;
-    default:
-  }
-  return _message;
-}
-
-exports.receiveMessage = function(req, res, next) {
-  var _message;
-  var _account;
-
-  return SmsAccount
-    .findById(req.params.id)
-    .then(function(smsAccount) {
-      if (!smsAccount) {
-        throw new Error('SMS account not found');
-      }
-      _account = smsAccount;
-      req.body.accountType = _account.type;
-
-      _message = getMessage(req.body);
-      if (!_message) {
-        throw new Error('SMS message format is not known');
-      }
-      // console.log(_message);
-      if (_account.ListId) {
-        return Contact
-          .findOrCreate({
-            where: {
-              ListId: _account.ListId,
-              mobile: _message.from
-            },
-            defaults: {
-              ListId: _account.ListId,
-              mobile: _message.from
-            }
-          });
-      } else {
-        return [];
-      }
-
-    })
-    .then(function(contact) {
-      return SmsRoom
-        .findAll({
-          limit: 1,
-          where: {
-            contact: _message.from,
-            SmsAccountId: _account.id
-          },
-          order: [
-            ['createdAt', 'DESC']
-          ]
-        })
-    })
-    .then(function(smsroom) {
-      var room = smsroom[0];
-      if (!room || room.status === 'CLOSED') {
-        var parentID = room ? room.id : null;
-        return SmsRoom
-          .create({
-            contact: _message.from,
-            SmsAccountId: _account.id,
-            status: 'NEW',
-            ParentId: parentID,
-            lastEvent: 'RECEIVED',
-            lastEventAt: moment().format('YYYY-MM-DD HH:mm:ss'),
-            smsIn: 1
-          })
-      } else {
-        return room
-          .updateAttributes({
-            status: 'OPEN',
-            openReason: 'system',
-            lastEvent: 'RECEIVED',
-            lastEventAt: moment().format('YYYY-MM-DD HH:mm:ss'),
-            smsIn: ++room.smsIn
-          });
-      }
-    })
-    .then(function(room) {
-      // console.log(room);
-      _message.SmsAccountId = _account.id;
-      _message.SmsRoomId = room.id;
-      _message.status = 'RECEIVED';
-
-      return SmsMessage
-        .create(_message)
-    })
-    .then(function(smsMessage) {
-      return res.status(201).send(smsMessage);
-    })
-    .catch(function(err) {
-      console.error(err);
-      return handleError(res, err);
-    });
-};
-// Updates an existing SmsAccount in the DB
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  return SmsAccount.findById(req.params.id)
-    .then(function(smsAccount) {
-      if (!smsAccount) {
-        return res.sendStatus(404);
-      }
-
-      var updated = _.merge(smsAccount, req.body);
-      return updated
-        .save();
-    })
-    .then(function(smsAccount) {
-      return res.status(200).send(smsAccount);
-    })
-    .catch(sequelize.UniqueConstraintError, function(err) {
-      return Util.errorManager.handleUniqueConstraintError(res, err);
-    })
-    .catch(function(err) {
-      console.log('   err', err);
-      return handleError(res, err);
-    });
-
-}
-
-exports.updateDisposition = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-
-  return SmsDisposition
-    .findById(req.params.dispId)
-    .then(function(smsDisposition) {
-      if (!smsDisposition) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(smsDisposition, req.body);
-      return updated
-        .save();
-    })
-    .then(function(mailAccount) {
-      return res.status(200).send(mailAccount);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-// Updates message status in the DB for TWILIO account
-exports.updateStatus = function(req, res) {
-
-  return SmsMessage
-    .findById(req.params.msgId)
-    .then(function(smsMessage) {
-      if (!smsMessage) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(smsMessage, {
-        status: _.toUpper(req.body.MessageStatus),
-        errorcode: req.body.ErrorCode
-      });
-      return updated
-        .save();
-    })
-    .then(function(smsMessage) {
-      return res.status(200).send(smsMessage);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-
-}
-
-exports.messageStatus = function(req, res) {
-
-    return SmsMessage
-      .findOne({
-        where: {
-          skebby_message_id: req.body.skebby_dispatch_id
-        }
-      })
-      .then(function(smsMessage) {
-        if (!smsMessage) {
-          return res.sendStatus(404);
-        }
-        var updated = _.merge(smsMessage, {
-          status: req.body.status,
-          errorcode: req.body.error_code
-        });
-        return updated
-          .save();
-      })
-      .then(function(smsMessage) {
-        return res.status(200).send(smsMessage);
-      })
-      .catch(function(err) {
-        return handleError(res, err);
-      });
-
-  }
-  // Updates aapplications
-exports.updateApplications = function(req, res) {
-
-  var priority = 0;
-  var apps = req.body;
-
-  apps.forEach(function(app) {
-    delete app.id;
-    delete app.createdAt;
-    delete app.updatedAt;
-
-    app.priority = ++priority;
-  });
-
-  return sequelize.transaction(function(t) {
-    return SmsApplication
-      .destroy({
-        where: {
-          SmsAccountId: req.params.id
-        },
-        individualHooks: true,
-        transaction: t
-      }).then(function(smsApplication) {
-        return SmsApplication
-          .bulkCreate(apps, {
-            individualHooks: true,
-            transaction: t
-          });
-      });
-  }).then(function(smsAccounts) {
-    return res.status(200).send({
-      count: smsAccounts.length,
-      rows: smsAccounts
-    });
-  }).catch(function(err) {
-    return handleError(res, err);
-  });
-};
-// Deletes a SmsAccount from the DB
-exports.destroy = function(req, res) {
-  return SmsAccount.findById(req.params.id)
-    .then(function(smsAccount) {
-      if (!smsAccount) {
-        return res.sendStatus(404);
-      }
-
-      return smsAccount
-        .destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-}
-exports.destroyApplication = function(req, res, next) {
-  return SmsApplication
-    .findById(req.params.appId)
-    .then(function(smsApplication) {
-      if (!smsApplication) {
-        return res.sendStatus(404);
-      }
-
-      return smsApplication
-        .destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.destroyDisposition = function(req, res, next) {
-  return SmsDisposition
-    .findById(req.params.dispId)
-    .then(function(smsDiposition) {
-      if (!smsDiposition) {
-        return res.sendStatus(404);
-      }
-      return smsDiposition
-        .destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.bulkDestroyApplications = function(req, res) {
-  return SmsApplication
-    .destroy({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-
-exports.getSmsRooms = function(req, res, next) {
-  var _query = {
-    where: {
-      SmsAccountId: req.params.id,
-      $and: []
-    },
-    attributes: ['id', 'contact', 'updatedAt', 'tags', 'disposition', 'voiceSource', 'lastEvent'],
-    include: []
-  };
-
-  // TO MOVE SOON INTO AN EXTENAL UTIL FILE
-  if (req.query) {
-    if (req.query.tags) {
-      if (_.isArray(req.query.tags)) {
-        for (var i = 0; i < req.query.tags.length; i++) {
-          _query.where.$and.push({
-            tags: {
-              $like: '%' + req.query.tags[i] + '%'
-            }
-          });
-        }
-      } else {
-        _query.where.$and.push({
-          tags: {
-            $like: '%' + req.query.tags + '%'
-          }
-        });
-      }
-
-      delete req.query.tags;
-    }
-
-    _.merge(_query.where, req.query);
-  }
-
-  switch (req.user.role) {
-    case 'agent':
-      _query.include.push({
-        model: User,
-        attributes: ['id']
-      });
-      var _agents;
-      var _agentQueues;
-      var _accountQueues;
-
-      return User
-        .findById(req.user.id)
-        .then(function(user) {
-          if (user) {
-            return user
-              .getSmsQueues();
-          } else {
-            return [];
-          }
-        })
-        .then(function(queues) {
-          _agentQueues = _.map(queues, 'id');
-          return SmsAccount
-            .findById(req.params.id);
-        })
-        .then(function(account) {
-          return account
-            .getSmsApplications({
-              where: {
-                $or: [{
-                  app: 'queue'
-                }, {
-                  app: 'agent'
-                }]
-              }
-            });
-        })
-        .then(function(apps) {
-          _agents = _.map(_.find(apps, {
-            'app': 'agent'
-          }), 'UserId');
-          _accountQueues = _.map(_.find(apps, {
-            'app': 'queue'
-          }), 'SmsQueueId');
-          // _accountQueues = _.map(queues, 'SmsQueueId');
-          if (_.intersection(_agentQueues, _accountQueues).length || _.intersection(_agents, [req.user.id]).length) {
-            return SmsRoom
-              .findAll(_query)
-              .then(function(smsRooms) {
-                return res.status(200).send(smsRooms);
-              })
-              .catch(function(err) {
-                console.error(err);
-                return handleError(res, err);
-              });
-          } else {
-            return res.status(200).send([]);
-          }
-        })
-        .catch(function(err) {
-          console.error(err);
-        });
-
-    default:
-
-      return SmsRoom
-        .findAll(_query)
-        .then(function(smsRooms) {
-          return res.status(200).send(smsRooms);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-  }
-};
-
-exports.createApplication = function(req, res, next) {
-
-  return SmsApplication
-    .max('priority', {
-      where: {
-        SmsAccountId: req.params.id
-      }
-    }).then(function(max) {
-      // SET PRIORITY
-      req.body.priority = max ? ++max : 1;
-      req.body.SmsAccountId = req.params.id;
-
-      return SmsApplication.create(req.body);
-    })
-    .then(function(smsApplication) {
-      return res.status(201).send(smsApplication);
-    })
-    .catch(function(err) {
-      console.log('err', err);
-      return handleError(res, err);
-    });
-};
-
-exports.updateApplication = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  return SmsApplication.findById(req.params.appId)
-    .then(function(smsApplication) {
-      if (!smsApplication) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(smsApplication, req.body);
-      return updated.save();
-    })
-    .then(function(smsApplication) {
-      return res.status(200).send(smsApplication);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-}
\ No newline at end of file
diff --git a/server/api/sms_account/sms_account.events.js b/server/api/sms_account/sms_account.events.js
index 932ef04..7b4c3ca 100644
--- a/server/api/sms_account/sms_account.events.js
+++ b/server/api/sms_account/sms_account.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const SmsAccount = require('../../models').SmsAccount;
-
-var SmsAccountEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-SmsAccountEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  SmsAccount.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    SmsAccountEvents.emit(event + ':' + doc._id, doc);
-    SmsAccountEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = SmsAccountEvents;
\ No newline at end of file
diff --git a/server/api/sms_account/sms_account.socket.js b/server/api/sms_account/sms_account.socket.js
index 4aa38a4..9870326 100644
--- a/server/api/sms_account/sms_account.socket.js
+++ b/server/api/sms_account/sms_account.socket.js
@@ -1,32 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const SmsAccountEvents = require('./sms_account.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('sms_account:' + event, socket);
-
-    SmsAccountEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    SmsAccountEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/sms_application/index.js b/server/api/sms_application/index.js
index fd4d4f1..075288f 100644
--- a/server/api/sms_application/index.js
+++ b/server/api/sms_application/index.js
@@ -1,15 +1 @@
-'use strict';
-
-var express = require('express');
-var auth = require('../../auth/auth.service');
-var controller = require('./sms_application.controller');
-var license = require('../../config/license/license.service');
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), license.hasSms(), auth.hasModule([11], ['admin']), controller.index);
-router.get('/:id', auth.isAuthenticated(), license.hasSms(), auth.hasModule([11], ['admin']), controller.show);
-router.post('/', auth.isAuthenticated(), license.hasSms(), auth.hasModule([11], ['admin']), controller.create);
-router.put('/:id', auth.isAuthenticated(), license.hasSms(), auth.hasModule([11], ['admin']), controller.update);
-router.delete('/:id', auth.isAuthenticated(), license.hasSms(), auth.hasModule([11], ['admin']), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/sms_application/sms_application.controller.js b/server/api/sms_application/sms_application.controller.js
index e1abd0b..a98586d 100644
--- a/server/api/sms_application/sms_application.controller.js
+++ b/server/api/sms_application/sms_application.controller.js
@@ -1,130 +1 @@
-/**
- * Using Rails-like standard naming convention for endpoints.
- * GET     /api/sms/applications              ->  index
- * POST    /api/sms/applications              ->  create
- * GET     /api/sms/applications/:id          ->  show
- * PUT     /api/sms/applications/:id          ->  update
- * DELETE  /api/sms/applications/:id          ->  destroy
- */
-
-'use strict';
-
-
-var _ = require('lodash');
-var Util = require('../../config/util');
-
-var SmsApplication = require('../../models').SmsApplication;
-
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
-
-// Gets a list of SmsApplications
-exports.index = function(req, res) {
-  return SmsApplication
-    .findAll({
-      where: req.query,
-      order: 'priority',
-      include: [{
-        all: true
-      }]
-    })
-    .then(function(smsApplications) {
-      return res.status(200).send(smsApplications);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-}
-
-// Gets a single SmsApplication from the DB
-exports.show = function(req, res) {
-  return SmsApplication
-    .findById(req.params.id, {
-      include: [{
-        all: true
-      }]
-    })
-    .then(function(smsApplication) {
-      if (!smsApplication) {
-        return res.sendStatus(404);
-      }
-      return res.send(smsApplication);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-
-}
-
-// Creates a new SmsApplication in the DB
-exports.create = function(req, res) {
-
-  return SmsApplication
-    .max('priority', {
-      where: {
-        SmsAccountId: req.body.SmsAccountId
-      }
-    })
-    .then(function(max) {
-      // SET PRIORITY
-      req.body.priority = max ? ++max : 1;
-      return SmsApplication
-        .create(req.body)
-    })
-    .then(function(smsApplication) {
-      return res.status(201).send(smsApplication);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-
-
-}
-
-// Updates an existing SmsApplication in the DB
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  return SmsApplication
-    .findById(req.params.id)
-    .then(function(smsApplication) {
-      if (!smsApplication) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(smsApplication, req.body);
-      return updated
-        .save()
-
-    })
-    .then(function(smsApplication) {
-      return res.status(200).send(smsApplication);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-
-}
-
-
-// Deletes a SmsApplication from the DB
-exports.destroy = function(req, res) {
-  return SmsApplication
-    .findById(req.params.id)
-    .then(function(smsApplication) {
-      if (!smsApplication) {
-        return res.sendStatus(404);
-      }
-      return smsApplication
-        .destroy()
-
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-}
\ No newline at end of file
diff --git a/server/api/sms_application/sms_application.events.js b/server/api/sms_application/sms_application.events.js
index 5d95d05..bc64b14 100644
--- a/server/api/sms_application/sms_application.events.js
+++ b/server/api/sms_application/sms_application.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const SmsApplication = require('../../models').SmsApplication;
-
-var SmsApplicationEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-SmsApplicationEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  SmsApplication.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    SmsApplicationEvents.emit(event + ':' + doc._id, doc);
-    SmsApplicationEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = SmsApplicationEvents;
\ No newline at end of file
diff --git a/server/api/sms_application/sms_application.socket.js b/server/api/sms_application/sms_application.socket.js
index 9926f52..86334c5 100644
--- a/server/api/sms_application/sms_application.socket.js
+++ b/server/api/sms_application/sms_application.socket.js
@@ -1,32 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const SmsApplicationEvents = require('./sms_application.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('sms_application:' + event, socket);
-
-    SmsApplicationEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    SmsApplicationEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/sms_disposition/index.js b/server/api/sms_disposition/index.js
index 6e1022b..c5af0b9 100644
--- a/server/api/sms_disposition/index.js
+++ b/server/api/sms_disposition/index.js
@@ -1,16 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./sms_disposition.controller');
-var auth = require('../../auth/auth.service');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), controller.index);
-router.get('/:id', auth.isAuthenticated(), controller.show);
-router.post('/', auth.isAuthenticated(), controller.create);
-router.put('/:id', auth.isAuthenticated(), controller.update);
-router.patch('/:id', auth.isAuthenticated(), controller.update);
-router.delete('/:id', auth.isAuthenticated(), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/sms_disposition/sms_disposition.controller.js b/server/api/sms_disposition/sms_disposition.controller.js
index 066dd7e..1b6814c 100644
--- a/server/api/sms_disposition/sms_disposition.controller.js
+++ b/server/api/sms_disposition/sms_disposition.controller.js
@@ -1,95 +1 @@
-'use strict';
-
-
-var _ = require('lodash');
-
-var SmsDisposition = require('../../models').SmsDisposition;
-
-
-function handleError(res, statusCode) {
-  statusCode = statusCode || 500;
-  return function(err) {
-    res.status(statusCode).send(err);
-  };
-}
-
-function responseWithResult(res, statusCode) {
-  statusCode = statusCode || 200;
-  return function(entity) {
-    if (entity) {
-      res.status(statusCode).json(entity);
-    }
-  };
-}
-
-function handleEntityNotFound(res) {
-  return function(entity) {
-    if (!entity) {
-      res.status(404).end();
-      return null;
-    }
-    return entity;
-  };
-}
-
-function saveUpdates(updates) {
-  return function(entity) {
-    return entity.updateAttributes(updates)
-      .then(function(updated) {
-        return updated;
-      })
-  };
-}
-
-function removeEntity(res) {
-  return function(entity) {
-    if (entity) {
-      return entity.destroy()
-        .then(function() {
-          res.status(204).end();
-        })
-    }
-  };
-}
-
-// Gets a list of SmsDispositions
-exports.index = function(req, res) {
-  SmsDisposition.findAndCountAll()
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Gets a single SmsDisposition from the DB
-exports.show = function(req, res) {
-  SmsDisposition.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Creates a new SmsDisposition in the DB
-exports.create = function(req, res) {
-  SmsDisposition.create(req.body)
-    .then(responseWithResult(res, 201))
-    .catch(handleError(res));
-}
-
-// Updates an existing SmsDisposition in the DB
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  SmsDisposition.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(saveUpdates(req.body))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Deletes a SmsDisposition from the DB
-exports.destroy = function(req, res) {
-  SmsDisposition.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(removeEntity(res))
-    .catch(handleError(res));
-}
\ No newline at end of file
diff --git a/server/api/sms_disposition/sms_disposition.events.js b/server/api/sms_disposition/sms_disposition.events.js
index 5f2d801..30e72b4 100644
--- a/server/api/sms_disposition/sms_disposition.events.js
+++ b/server/api/sms_disposition/sms_disposition.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const SmsDisposition = require('../../models').SmsDisposition;
-
-var SmsDispositionEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-SmsDispositionEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  SmsDisposition.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    SmsDispositionEvents.emit(event + ':' + doc._id, doc);
-    SmsDispositionEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = SmsDispositionEvents;
\ No newline at end of file
diff --git a/server/api/sms_disposition/sms_disposition.socket.js b/server/api/sms_disposition/sms_disposition.socket.js
index 577c85f..9a27ed2 100644
--- a/server/api/sms_disposition/sms_disposition.socket.js
+++ b/server/api/sms_disposition/sms_disposition.socket.js
@@ -1,32 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const SmsDispositionEvents = require('./sms_disposition.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('sms_disposition:' + event, socket);
-
-    SmsDispositionEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    SmsDispositionEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/sms_message/index.js b/server/api/sms_message/index.js
index 5c0b3d0..5449b13 100644
--- a/server/api/sms_message/index.js
+++ b/server/api/sms_message/index.js
@@ -1,18 +1 @@
-'use strict';
-
-var express = require('express');
-var auth = require('../../auth/auth.service');
-var controller = require('./sms_message.controller');
-var license = require('../../config/license/license.service');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), license.hasSms(), auth.hasModule([11], ['admin']), controller.index);
-router.get('/describe', auth.isAuthenticated(), license.hasSms(), auth.hasModule([11], ['admin']), controller.describe);
-router.get('/:id', auth.isAuthenticated(), license.hasSms(), auth.hasModule([11], ['admin', 'agent']), controller.show);
-router.post('/', auth.isAuthenticated(), license.hasSms(), auth.hasModule([11], ['admin']), controller.create);
-router.put('/:id', auth.isAuthenticated(), license.hasSms(), auth.hasModule([11], ['admin']), controller.update);
-router.delete('/:id', auth.isAuthenticated(), license.hasSms(), auth.hasModule([11], ['admin']), controller.destroy);
-router.delete('/', auth.isAuthenticated(), license.hasSms(), auth.hasModule([11], ['admin']), controller.bulkDelete);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/sms_message/sms_message.controller.js b/server/api/sms_message/sms_message.controller.js
index d1dd899..6fb3355 100644
--- a/server/api/sms_message/sms_message.controller.js
+++ b/server/api/sms_message/sms_message.controller.js
@@ -1,170 +1 @@
-/**
- * Using Rails-like standard naming convention for endpoints.
- * GET     /api/sms/messages              ->  index
- * POST    /api/sms/messages              ->  create
- * GET     /api/sms/messages/:id          ->  show
- * PUT     /api/sms/messages/:id          ->  update
- * DELETE  /api/sms/messages/:id          ->  destroy
- */
-
-'use strict';
-
-
-var _ = require('lodash');
-var Util = require('../../config/util');
-
-var SmsMessage = require('../../models').SmsMessage;
-var SmsRoom = require('../../models').SmsRoom;
-var User = require('../../models').User;
-
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
-
-// Gets a list of SmsMessages
-exports.index = function(req, res) {
-  var params = {
-    order: 'createdAt DESC',
-    include: [{
-      all: true,
-      include: [{
-        all: true
-      }]
-    }]
-  };
-
-  switch (req.user.role) {
-    case 'admin':
-      params.where = req.query;
-      break;
-    case 'agent':
-      break;
-    default:
-  }
-
-  return SmsMessage
-    .findAll(params)
-    .then(function(sms_messages) {
-      return res.status(200).send(sms_messages);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-}
-
-exports.describe = function(req, res) {
-  return SmsMessage
-    .describe()
-    .then(function(fields) {
-      return res.status(200).send(fields);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Gets a single SmsMessage from the DB
-exports.show = function(req, res) {
-  return SmsMessage
-    .findById(req.params.id, {
-      include: [{
-        model: User,
-        attributes: ['id', 'name', 'fullname', 'email']
-      }]
-    })
-    .then(function(smsMessage) {
-      if (!smsMessage) {
-        return res.sendStatus(404);
-      }
-      return res.send(smsMessage);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-}
-
-// Creates a new SmsMessage in the DB
-exports.create = function(req, res) {
-  req.body.UserId = req.user.id;
-  return SmsMessage
-    .create(req.body)
-    .then(function(smsMessage) {
-      return res.status(201).send(smsMessage);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-}
-
-// Updates an existing SmsMessage in the DB
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  return SmsMessage
-    .findById(req.params.id, {
-      include: [{
-        all: true
-      }]
-    })
-    .then(function(smsMessage) {
-      if (!smsMessage) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(smsMessage, req.body);
-      return updated
-        .save();
-    })
-    .then(function(updated) {
-      return res.status(200).send(updated);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-}
-
-// Deletes a SmsMessage from the DB
-exports.destroy = function(req, res) {
-  return SmsMessage
-    .findById(req.params.id)
-    .then(function(smsMessage) {
-      if (!smsMessage) {
-        return res.sendStatus(404);
-      }
-      return smsMessage
-        .destroy();
-    }).then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-}
-
-exports.bulkDelete = function(req, res) {
-  return SmsMessage
-    .bulkUpdate({
-      where: {
-        id: {
-          $in: req.body.id
-        }
-      },
-      attributes: {
-        directory: 'TRASH'
-      }
-    })
-    .then(function(smsMessage) {
-      if (!smsMessage) {
-        return res.sendStatus(404);
-      }
-      return smsMessage
-        .destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
\ No newline at end of file
diff --git a/server/api/sms_message/sms_message.events.js b/server/api/sms_message/sms_message.events.js
index 21dd796..8b084e0 100644
--- a/server/api/sms_message/sms_message.events.js
+++ b/server/api/sms_message/sms_message.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const SmsMessage = require('../../models').SmsMessage;
-
-var SmsMessageEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-SmsMessageEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'update',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  SmsMessage.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    SmsMessageEvents.emit(event + ':' + doc._id, doc);
-    SmsMessageEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = SmsMessageEvents;
\ No newline at end of file
diff --git a/server/api/sms_message/sms_message.socket.js b/server/api/sms_message/sms_message.socket.js
index 70931c8..ffeb71c 100644
--- a/server/api/sms_message/sms_message.socket.js
+++ b/server/api/sms_message/sms_message.socket.js
@@ -1,47 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const SmsMessageEvents = require('./sms_message.events');
-
-// Model events to emit
-var events = ['save', 'update', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('sms_message:' + event, socket);
-
-    SmsMessageEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    switch (event) {
-      case 'sms_message:save':
-        socket.emit(event, doc);
-        break;
-      case 'sms_message:update':
-        if (doc.changed('status')) {
-          socket.emit(event, doc);
-        }
-        break;
-      case 'sms_message:remove':
-        socket.emit(event, doc);
-        break;
-
-      default:
-
-    }
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    SmsMessageEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/sms_queue/index.js b/server/api/sms_queue/index.js
index 6c638b3..b87a5c1 100644
--- a/server/api/sms_queue/index.js
+++ b/server/api/sms_queue/index.js
@@ -1,21 +1 @@
-'use strict';
-
-var express = require('express');
-var auth = require('../../auth/auth.service');
-var controller = require('./sms_queue.controller');
-var license = require('../../config/license/license.service');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), license.hasSms(), auth.hasModule([11], ['admin']), controller.index);
-router.get('/:id', auth.isAuthenticated(), license.hasSms(), auth.hasModule([11], ['admin']), controller.show);
-router.get('/:id/agents', auth.isAuthenticated(), license.hasSms(), auth.hasModule([11], ['admin']), controller.showAgents);
-router.post('/', auth.isAuthenticated(), license.hasSms(), auth.hasModule([11], ['admin']), controller.create);
-router.post('/:id/agents', auth.isAuthenticated(), license.hasSms(), auth.hasModule([11], ['admin']), controller.addAgents);
-router.put('/:id', auth.isAuthenticated(), license.hasSms(), auth.hasModule([11], ['admin']), controller.update);
-router.patch('/:id', auth.isAuthenticated(), license.hasSms(), auth.hasModule([11], ['admin']), controller.update);
-router.delete('/:id', auth.isAuthenticated(), license.hasSms(), auth.hasModule([11], ['admin']), controller.destroy);
-router.delete('/:id/agents', auth.isAuthenticated(), license.hasSms(), auth.hasModule([11], ['admin']), controller.removeAgents);
-router.delete('/', auth.isAuthenticated(), license.hasSms(), auth.hasModule([11], ['admin']), controller.bulkDestroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/sms_queue/sms_queue.controller.js b/server/api/sms_queue/sms_queue.controller.js
index da0bf5b..cf06d5e 100644
--- a/server/api/sms_queue/sms_queue.controller.js
+++ b/server/api/sms_queue/sms_queue.controller.js
@@ -1,242 +1 @@
-/**
- * Using Rails-like standard naming convention for endpoints.
- * GET     /api/sms/queues              ->  index
- * POST    /api/sms/queues              ->  create
- * GET     /api/sms/queues/:id          ->  show
- * PUT     /api/sms/queues/:id          ->  update
- * DELETE  /api/sms/queues/:id          ->  destroy
- */
-
-'use strict';
-
-
-var _ = require('lodash');
-var Util = require('../../config/util');
-
-var SmsQueue = require('../../models').SmsQueue;
-var User = require('../../models').User;
-var sequelize = require('../../models').sequelize;
-var UserHasSmsQueue = require('../../models').UserHasSmsQueue;
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
-
-// Gets a list of SmsQueues
-exports.index = function(req, res) {
-
-  switch (req.user.role) {
-    case 'user':
-      return User
-        .findById(req.user.id, {
-          attributes: ['id']
-        })
-        .then(Util.getSmsQueuesIdByUser(req.query))
-        .then(function(result) {
-          res.status(200).send(result);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-
-    default:
-      return SmsQueue
-        .scope('default')
-        .findAndCountAll(Util.getQuery(req.query))
-        .then(function(result) {
-          res.status(200).send(result);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-  }
-
-
-
-}
-
-// Gets a single SmsQueue from the DB
-exports.show = function(req, res) {
-  return SmsQueue
-    .scope('default')
-    .findById(req.params.id)
-    .then(function(smsQueue) {
-      if (!smsQueue) {
-        return res.sendStatus(404);
-      }
-      return res.send(smsQueue);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-}
-
-exports.showAgents = function(req, res) {
-  return SmsQueue
-    .findById(req.params.id)
-    .then(function(queue) {
-      if (!queue) {
-        return res.sendStatus(404);
-      }
-      return queue
-        .getUsers({
-          where: {
-            role: 'agent'
-          },
-          attributes: ['id', 'name', 'fullname', 'email']
-        });
-    })
-    .then(function(agents) {
-      return res.status(200).send({
-        rows: agents,
-        count: agents.length
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-// Creates a new SmsQueue in the DB
-exports.create = function(req, res) {
-  var _smsQueue;
-
-  return SmsQueue
-    .create(req.body)
-    .then(function(smsQueue) {
-      _smsQueue = smsQueue;
-
-      if (req.body.agents) {
-        return _smsQueue
-          .addUsers(req.body.agents, {
-            penalty: req.body.penalty || 0,
-            queue: _smsQueue.name
-          });
-      }
-    })
-    .then(function() {
-      return res.status(201).send(_smsQueue);
-    })
-    .catch(sequelize.UniqueConstraintError, function(err) {
-      return Util.errorManager.handleUniqueConstraintError(res, err);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-}
-
-// Updates an existing SmsQueue in the DB
-exports.update = function(req, res) {
-    if (req.body.id) {
-      delete req.body.id;
-    }
-    return SmsQueue
-      .findById(req.params.id)
-      .then(function(smsQueue) {
-        if (!smsQueue) {
-          return res.sendStatus(404);
-        }
-        var updated = _.merge(smsQueue, req.body);
-        return updated
-          .save();
-      })
-      .then(function(smsQueue) {
-        return res.status(200).send(smsQueue);
-      })
-      .catch(sequelize.UniqueConstraintError, function(err) {
-        return Util.errorManager.handleUniqueConstraintError(res, err);
-      })
-      .catch(function(err) {
-        return handleError(res, err);
-      });
-  }
-  // Updates an existing user_has_smsQueue in the DB.
-exports.addAgents = function(req, res, next) {
-  return SmsQueue
-    .findById(req.params.id)
-    .then(function(smsQueue) {
-      if (!smsQueue) {
-        return res.sendStatus(404);
-      }
-      var userHasSmsQueues = _.map(req.body.agents, function(agent) {
-        return {
-          UserId: agent,
-          penalty: req.body.penalty,
-          SmsQueueId: smsQueue.id,
-          queue: smsQueue.name
-        };
-      });
-
-      return UserHasSmsQueue
-        .bulkCreate(userHasSmsQueues, {
-          individualHooks: true
-        });
-    })
-    .then(function() {
-      return res.sendStatus(200);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.removeAgents = function(req, res) {
-  return SmsQueue
-    .findById(req.params.id)
-    .then(function(smsQueue) {
-      if (smsQueue) {
-        return smsQueue
-          .removeUsers(req.query.agents, {
-            individualHooks: true
-          });
-      } else {
-        throw new Error('SmsQueue not found');
-      }
-    })
-    .then(function() {
-      return res.sendStatus(202);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-
-};
-
-// Deletes a SmsQueue from the DB
-exports.destroy = function(req, res) {
-  var _smsQueue;
-  return SmsQueue
-    .findById(req.params.id)
-    .then(function(smsQueue) {
-      _smsQueue = smsQueue;
-      if (!smsQueue) {
-        return res.sendStatus(404);
-      }
-      return smsQueue
-        .destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(sequelize.ForeignKeyConstraintError, function(err) {
-      return Util.errorManager.handleForeignKeyConstraintError(res, 'queue', _smsQueue.name, err);
-    })
-    .catch(function(err) {
-      console.error('err', err);
-      return handleError(res, err);
-    });
-}
-exports.bulkDestroy = function(req, res) {
-  return SmsQueue
-    .destroy({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
\ No newline at end of file
diff --git a/server/api/sms_queue/sms_queue.events.js b/server/api/sms_queue/sms_queue.events.js
index 31beb9a..3331220 100644
--- a/server/api/sms_queue/sms_queue.events.js
+++ b/server/api/sms_queue/sms_queue.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const SmsQueue = require('../../models').SmsQueue;
-
-var SmsQueueEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-SmsQueueEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  SmsQueue.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    SmsQueueEvents.emit(event + ':' + doc._id, doc);
-    SmsQueueEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = SmsQueueEvents;
\ No newline at end of file
diff --git a/server/api/sms_queue/sms_queue.socket.js b/server/api/sms_queue/sms_queue.socket.js
index 2c6c4f1..f91f497 100644
--- a/server/api/sms_queue/sms_queue.socket.js
+++ b/server/api/sms_queue/sms_queue.socket.js
@@ -1,32 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const SmsQueueEvents = require('./sms_queue.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('sms_queue:' + event, socket);
-
-    SmsQueueEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    SmsQueueEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/sms_room/index.js b/server/api/sms_room/index.js
index 429772f..415faba 100644
--- a/server/api/sms_room/index.js
+++ b/server/api/sms_room/index.js
@@ -1,26 +1 @@
-'use strict';
-
-var express = require('express');
-var auth = require('../../auth/auth.service');
-var controller = require('./sms_room.controller');
-var license = require('../../config/license/license.service');
-
-var router = express.Router();
-
-router.get('/', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin', 'agent']), controller.index);
-router.get('/describe', auth.isAuthenticated(), license.isValidDate(), license.hasSms(), auth.hasModule([1, 11], ['admin']), controller.describe);
-router.get('/pending', auth.isAuthenticated(), license.isValidDate(), license.hasSms(), auth.hasModule([11, 17], ['admin']), controller.pending);
-router.get('/new', auth.isAuthenticated(), license.isValidDate(), license.hasSms(), auth.hasModule([11, 17], ['admin']), controller.new);
-router.get('/open', auth.isAuthenticated(), license.isValidDate(), license.hasSms(), auth.hasModule([11, 17], ['admin']), controller.open);
-router.get('/closed', auth.isAuthenticated(), license.isValidDate(), license.hasSms(), auth.hasModule([11, 17], ['admin']), controller.closed);
-router.get('/:id', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin', 'agent']), controller.show);
-router.get('/:id/agents', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin', 'agent']), controller.showAgents);
-router.get('/messages/:id', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin', 'agent']), controller.getRoomByMessage);
-router.post('/', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin']), controller.create);
-router.post('/:id/messages', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin']), controller.createMessage);
-router.put('/:id', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin', 'agent']), controller.update);
-router.put('/:id/agents', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin', 'agent']), controller.updateAgents);
-router.patch('/:id', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin', 'agent']), controller.updatePatch);
-router.delete('/:id', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin']), controller.destroy);
-router.delete('/', license.isValidDate(), license.hasSms(), auth.isAuthenticated(), auth.hasModule([11], ['admin']), controller.bulkDestroy);
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/sms_room/sms_room.controller.js b/server/api/sms_room/sms_room.controller.js
index e3946f0..f5657bb 100644
--- a/server/api/sms_room/sms_room.controller.js
+++ b/server/api/sms_room/sms_room.controller.js
@@ -1,399 +1 @@
-/**
- * Using Rails-like standard naming convention for endpoints.
- * GET     /api/sms/rooms              ->  index
- * POST    /api/sms/rooms              ->  create
- * GET     /api/sms/rooms/:id          ->  show
- * PUT     /api/sms/rooms/:id          ->  update
- * DELETE  /api/sms/rooms/:id          ->  destroy
- */
-
-'use strict';
-
-
-var _ = require('lodash');
-var Util = require('../../config/util');
-var moment = require('moment');
-
-var SmsRoom = require('../../models').SmsRoom;
-var User = require('../../models').User;
-var SmsMessage = require('../../models').SmsMessage;
-var SmsAccount = require('../../models').SmsAccount;
-var User = require('../../models').User;
-var SmsApplication = require('../../models').SmsApplication;
-var SmsQueue = require('../../models').SmsQueue;
-
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
-
-
-
-// Gets a list of SmsRooms
-exports.index = function(req, res) {
-  switch (req.user.role) {
-    case 'agent':
-      return SmsRoom
-        .scope('default', {
-          method: ['agent', req.user.id]
-        })
-        .findAndCountAll(Util.getQuery(req.query))
-        .then(function(result) {
-          return res.status(200).send(result);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-
-    default:
-      return SmsRoom
-        .scope('default')
-        .findAndCountAll(Util.getQuery(req.query))
-        .then(function(result) {
-          return res.status(200).send(result);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-  }
-}
-
-// Get list of fields
-exports.describe = function(req, res) {
-  return SmsRoom
-    .describe()
-    .then(function(fields) {
-      return res.status(200).send(fields);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function getSmsQueues(user) {
-  return function() {
-    switch (user.role) {
-      case 'user':
-        return User
-          .findById(user.id, {
-            attributes: ['id']
-          })
-          .then(Util.getSmsQueuesIdByUser({}, {
-            attributes: ['id'],
-            include: [{
-              raw: true,
-              model: User,
-              attributes: ['id']
-            }]
-          }))
-          .then(function(userQueues) {
-            return {
-              include: {
-                model: SmsAccount,
-                include: {
-                  model: SmsApplication,
-                  include: {
-                    model: SmsQueue,
-                    where: {
-                      id: _.map(userQueues, 'id')
-                    }
-                  }
-                }
-              }
-            };
-          });
-      default:
-        return {};
-    }
-  }
-}
-
-exports.pending = function(req, res) {
-  return Promise
-    .all([])
-    .then(getSmsQueues(req.user))
-    .then(function(condition) {
-      return SmsRoom
-        .count(_.merge(Util.getQuery(req.query, {
-          status: 'PENDING',
-          updatedAt: {
-            $gte: moment().startOf('day')
-          }
-        }), condition));
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-exports.new = function(req, res) {
-  return Promise
-    .all([])
-    .then(getSmsQueues(req.user))
-    .then(function(condition) {
-      return SmsRoom
-        .count(_.merge(Util.getQuery(req.query, {
-          status: 'NEW',
-          updatedAt: {
-            $gte: moment().startOf('day')
-          }
-        }), condition));
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-exports.open = function(req, res) {
-  return Promise
-    .all([])
-    .then(getSmsQueues(req.user))
-    .then(function(condition) {
-      return SmsRoom
-        .count(_.merge(Util.getQuery(req.query, {
-          status: 'OPEN',
-          updatedAt: {
-            $gte: moment().startOf('day')
-          }
-        }), condition));
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-exports.closed = function(req, res) {
-  return Promise
-    .all([])
-    .then(getSmsQueues(req.user))
-    .then(function(condition) {
-      return SmsRoom
-        .count(_.merge(Util.getQuery(req.query, {
-          status: 'CLOSED',
-          updatedAt: {
-            $gte: moment().startOf('day')
-          }
-        }), condition));
-    })
-    .then(function(data) {
-      return res.status(200).send({
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-// Gets a single SmsRoom from the DB
-exports.show = function(req, res) {
-  return SmsRoom
-    .scope('default')
-    .findById(req.params.id)
-    .then(function(smsRoom) {
-      if (!smsRoom) {
-        return res.sendStatus(404);
-      }
-      return res.send(smsRoom);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-exports.showAgents = function(req, res, next) {
-  return SmsRoom
-    .findById(req.params.id)
-    .then(function(smsRoom) {
-      if (!smsRoom) {
-        return res.sendStatus(404);
-      }
-
-      return smsRoom
-        .getUsers({
-          attributes: ['id', 'name', 'fullname', 'email', 'role', 'internal']
-        });
-    })
-    .then(function(users) {
-      return res.send(users);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-exports.getRoomByMessage = function(req, res, next) {
-  return SmsMessage
-    .findById(req.params.id)
-    .then(function(Message) {
-      return Message
-        .getSmsRoom({
-          include: [{
-            model: SmsAccount
-          }, {
-            model: SmsMessage,
-            include: [{
-              model: User,
-              attributes: ['id', 'name', 'fullname', 'email']
-            }]
-          }, {
-            model: User,
-            attributes: ['id', 'name', 'fullname', 'email']
-          }]
-        });
-    })
-    .then(function(Room) {
-      // console.log('room', Room);
-      return res.send(Room);
-    })
-    .catch(function(err) {
-      console.log('err', err);
-      return handleError(res, err);
-    });
-};
-// Creates a new SmsRoom in the DB
-exports.create = function(req, res) {
-
-  return SmsRoom
-    .create(req.body)
-    .then(function(smsMessage) {
-      return res.status(201).send(smsMessage);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-}
-
-
-// Creates a new mailMessage in the DB.
-exports.createMessage = function(req, res, next) {
-  req.body.UserId = req.user.id;
-  req.body.SmsRoomId = req.params.id;
-  return SmsMessage
-    .create(req.body)
-    .then(function(smsMessage) {
-      return res.status(201).send(smsMessage);
-    }).catch(function(err) {
-      return handleError(res, err);
-    });
-};
-// Updates an existing SmsRoom in the DB
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  return SmsRoom
-    .findById(req.params.id)
-    .then(function(smsRoom) {
-      if (!smsRoom) {
-        return res.sendStatus(404);
-      }
-
-      var updated = _.merge(smsRoom, req.body);
-
-      return updated
-        .save();
-    })
-    .then(function(smsRoom) {
-      return res.status(200).send(smsRoom);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-}
-
-exports.updateAgents = function(req, res, next) {
-  return SmsRoom
-    .findById(req.params.id)
-    .then(function(smsRoom) {
-      if (!smsRoom) {
-        return res.sendStatus(404);
-      }
-
-      return smsRoom
-        .setUsers(req.body.agents, {
-          individualHooks: true
-        });
-    })
-    .then(function() {
-      return res.sendStatus(200);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a SmsRoom from the DB
-exports.destroy = function(req, res) {
-  return SmsRoom
-    .findById(req.params.id)
-    .then(function(smsRoom) {
-      if (!smsRoom) {
-        return res.sendStatus(404);
-      }
-      return smsRoom.destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-}
-
-exports.bulkDestroy = function(req, res) {
-  return SmsRoom
-    .destroy({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return res.sendStatus(200);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-exports.updatePatch = function(req, res, next) {
-  var _options = {
-    where: {
-      id: req.params.id.split(',')
-    },
-    user: req.user,
-    individualHooks: true
-  };
-
-  return SmsRoom
-    .update(req.body, _options)
-    .then(function(smsRooms) {
-      if (!smsRooms) {
-        return res.sendStatus(404);
-      }
-      return smsRooms
-    })
-    .then(function(smsRooms) {
-      return res.sendStatus(200);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
\ No newline at end of file
diff --git a/server/api/sms_room/sms_room.events.js b/server/api/sms_room/sms_room.events.js
index a1390fd..542f9d6 100644
--- a/server/api/sms_room/sms_room.events.js
+++ b/server/api/sms_room/sms_room.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const SmsRoom = require('../../models').SmsRoom;
-
-var SmsRoomEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-SmsRoomEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  SmsRoom.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    SmsRoomEvents.emit(event + ':' + doc._id, doc);
-    SmsRoomEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = SmsRoomEvents;
\ No newline at end of file
diff --git a/server/api/sms_room/sms_room.socket.js b/server/api/sms_room/sms_room.socket.js
index fe08042..d9375cf 100644
--- a/server/api/sms_room/sms_room.socket.js
+++ b/server/api/sms_room/sms_room.socket.js
@@ -1,33 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const SmsRoomEvents = require('./sms_room.events');
-
-// Model events to emit
-var events = ['save', 'save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('sms_room:' + event, socket);
-
-    SmsRoomEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-
-function removeListener(event, listener) {
-  return function() {
-    SmsRoomEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/sound/index.js b/server/api/sound/index.js
index ac4a804..deca1ee 100644
--- a/server/api/sound/index.js
+++ b/server/api/sound/index.js
@@ -1,17 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./sound.controller');
-var auth = require('../../auth/auth.service');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), auth.hasModule([13, 7], ['admin']), controller.index);
-router.get('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.show);
-router.get('/:id/download', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.download);
-router.get('/:id/stream', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.stream);
-router.post('/', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.create);
-router.put('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.update);
-router.delete('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/sound/sound.controller.js b/server/api/sound/sound.controller.js
index 9cc2d15..4d2bf22 100644
--- a/server/api/sound/sound.controller.js
+++ b/server/api/sound/sound.controller.js
@@ -1,278 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var Sound = require('../../models').Sound;
-var uploadFile = require('upload-file');
-var sr = require('simple-random');
-var sox = require('sox');
-var path = require('path');
-var config = require('../../config/environment');
-var fs = require('fs');
-var sequelize = require('../../models').sequelize;
-var base64 = require('file-base64');
-var Promise = require('bluebird');
-var Setting = require('../../models').Setting;
-
-// Get list of Sounds
-exports.index = function(req, res) {
-  return Sound
-    .findAndCountAll()
-    .then(function(Sounds) {
-      return res.status(200).send(Sounds);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single Sound
-exports.show = function(req, res) {
-  return Sound
-    .findById(req.params.id)
-    .then(function(Sound) {
-      if (!Sound) {
-        return res.sendStatus(404);
-      }
-      return res.send(Sound);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new Sound in the DB.
-exports.create = function(req, res) {
-  var upload = new uploadFile({
-    dest: path.join(config.originalSounds),
-    maxFileSize: 15 * 1000000,
-    maxNumberOfFiles: 10,
-    minNumberOfFiles: 0,
-    acceptFileTypes: /(\.|\/)(wav|mp3|gsm|ogg)$/i,
-    rename: function(name, file) {
-      return sr() + path.extname(file.filename);
-    },
-    messages: {
-      maxNumberOfFiles: "Max number of files upload exceeded",
-      acceptFileTypes: "Only wav,mp3,gsm, and ogg format accepted",
-      maxFileSize: "The maximum file size is 15 Mb",
-      invalidRequest: "Invalid request"
-    }
-  });
-
-  upload.on('end', function(fields, files) {
-    if (!files.file.filename) {
-      return res.status(500).send(upload);
-    }
-
-    return Setting
-      .findById(1)
-      .then(function(settings) {
-        var job_details = {};
-        var original_format = path.extname(files.file.filename);
-        job_details.description = "";
-        job_details.original_format = path.extname(files.file.filename).substring(1);
-        job_details.converted_format = 'wav';
-        job_details.name = job_details.display_name = path.basename(files.file.path, original_format);
-        job_details.save_name = path.basename(files.file.filename, original_format);
-
-
-
-        var filepath = path.join(config.originalSounds, job_details.save_name + original_format);
-        var destination = path.join(settings.soundPath || '/var/opt/motion/server/files/sounds/converted', job_details.save_name + '.' + job_details.converted_format);
-        //
-
-        fs.chmodSync(filepath, parseInt('0777', 8));
-        sox.identify(filepath, function(err, result) {
-          // console.log('************** Result: ', result);
-        });
-
-        var job = sox.transcode(filepath, destination, {
-          sampleRate: 8000,
-          format: 'wav',
-          channelCount: 1,
-          bitRate: 192 * 1024,
-          compressionQuality: 5,
-        });
-
-
-
-        job.on('error', function(err) {
-          console.error('********** Conversion Error: ', err);
-          fs.unlink(filepath, function(err) {
-            if (err)
-              return handleError(res, err);
-          });
-          return handleError(res, err);
-        });
-
-        job.on('progress', function(amountDone, amountTotal) {
-          // console.log("*********** Progress", amountDone, amountTotal);
-        });
-
-        job.on('src', function(info) {
-          // console.log('********** src: ', info);
-          /* info looks like:
-          {
-            format: 'wav',
-            duration: 1.5,
-            sampleCount: 66150,
-            channelCount: 1,
-            bitRate: 722944,
-            sampleRate: 44100,
-          }
-          */
-          job_details.original_duration = isNaN(info.duration) ? null : info.duration * 1000;
-          job_details.original_sampleCount = isNaN(info.sampleCount) ? null : info.sampleCount;
-          job_details.original_channelCount = isNaN(info.channelCount) ? null : info.channelCount;
-          job_details.original_bitRate = isNaN(info.bitRate) ? null : info.bitRate;
-          job_details.original_sampleRate = isNaN(info.sampleRate) ? null : info.sampleRate;
-        });
-
-        job.on('dest', function(info) {
-          // console.log('********** dest: ', info);
-          /* info looks like:
-          {
-            sampleRate: 44100,
-            format: 'mp3',
-            channelCount: 2,
-            sampleCount: 67958,
-            duration: 1.540998,
-            bitRate: 196608,
-          }
-          */
-          job_details.converted_duration = isNaN(info.duration) ? null : info.duration * 1000;
-          job_details.converted_sampleCount = isNaN(info.sampleCount) ? null : info.sampleCount;
-          job_details.converted_channelCount = isNaN(info.channelCount) ? null : info.channelCount;
-          job_details.converted_bitRate = isNaN(info.bitRate) ? null : info.bitRate;
-          job_details.converted_sampleRate = isNaN(info.sampleRate) ? null : info.sampleRate;
-        });
-
-        job.on('end', function() {
-          console.log("Conversion completed");
-          fs.chmodSync(destination, parseInt('0777', 8));
-          return Sound
-            .create(job_details)
-            .then(function(sound) {
-              return res.status(201).send(sound);
-            })
-            .catch(function(err) {
-              console.log(err);
-              return handleError(res, err);
-            });
-        });
-
-        job.start();
-      })
-      .catch(function(err) {
-        return handleError(res, err);
-      });
-
-
-  });
-
-  upload.on('error', function(err) {
-    console.log('********** Upload error :', err)
-    return handleError(res, err);
-  });
-
-  upload.parse(req);
-};
-
-// Updates an existing upload in the DB.
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  return Sound
-    .findById(req.params.id)
-    .then(function(sound) {
-      if (!sound) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(sound, req.body);
-      return updated.save();
-    })
-    .then(function(sound) {
-      return res.status(200).send(sound);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a Sound from the DB.
-exports.destroy = function(req, res) {
-  var _settings;
-  return Setting
-    .findById(1)
-    .then(function(settings) {
-      _settings = settings;
-      return Sound
-        .findById(req.params.id);
-    })
-    .then(function(sound) {
-      if (!sound) {
-        return res.sendStatus(404);
-      }
-      var original_filepath = path.join(config.originalSounds, sound.save_name + '.' + sound.original_format);
-      var converted_filepath = path.join(_settings.soundPath || '/var/opt/motion/server/files/sounds/converted', sound.save_name + '.' + sound.converted_format);
-      return sequelize.transaction(function(t) {
-          return sound.destroy({
-              transaction: t
-            })
-            .then(function() {
-              fs.unlink(original_filepath, function(err) {
-                if (err)
-                  return handleError(res, err);
-              });
-              fs.unlink(converted_filepath, function(err) {
-                if (err)
-                  return handleError(res, err);
-              });
-              return res.status(200).send(sound);
-            })
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-//Download an uploaded file
-exports.download = function(req, res) {
-  getStream(req, res, 'original');
-};
-
-//Stream an uploaded file
-exports.stream = function(req, res) {
-  getStream(req, res, 'converted');
-}
-
-
-function getStream(req, res, value) {
-  return Sound
-    .findById(req.params.id)
-    .then(function(sound) {
-      var readFile = Promise.promisify(fs.readFile);
-      return readFile(path.join(config[value + 'Sounds'], sound.save_name + '.' + sound[value + '_format']));
-    })
-    .then(function(result) {
-      var base64String = new Buffer(result, 'binary').toString('base64');
-      return base64String;
-    })
-    .then(function(base64String) {
-      return res.status(200).send({
-        downloadString: base64String
-      });
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-}
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/sound/sound.events.js b/server/api/sound/sound.events.js
index ce73c5a..9680e7e 100644
--- a/server/api/sound/sound.events.js
+++ b/server/api/sound/sound.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const Sound = require('../../models').Sound;
-
-var SoundEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-SoundEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  Sound.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    SoundEvents.emit(event + ':' + doc._id, doc);
-    SoundEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = SoundEvents;
\ No newline at end of file
diff --git a/server/api/sound/sound.socket.js b/server/api/sound/sound.socket.js
index 137a669..c24bc84 100644
--- a/server/api/sound/sound.socket.js
+++ b/server/api/sound/sound.socket.js
@@ -1,32 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const SoundEvents = require('./sound.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('sound:' + event, socket);
-
-    SoundEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    SoundEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/square_odbc/index.js b/server/api/square_odbc/index.js
index b6dd309..334f1b9 100644
--- a/server/api/square_odbc/index.js
+++ b/server/api/square_odbc/index.js
@@ -1,17 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./square_odbc.controller');
-var auth = require('../../auth/auth.service');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.index);
-router.get('/:id/check', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.checkConnection);
-router.get('/:id', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.show);
-router.post('/', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.create);
-router.put('/:id', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.update);
-router.delete('/', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.bulkDestroy);
-router.delete('/:id', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/square_odbc/square_odbc.controller.js b/server/api/square_odbc/square_odbc.controller.js
index 69af149..5babc07 100644
--- a/server/api/square_odbc/square_odbc.controller.js
+++ b/server/api/square_odbc/square_odbc.controller.js
@@ -1,135 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var db = require("odbc")();
-
-var SquareOdbc = require('../../models').SquareOdbc;
-var Util = require('../../config/util');
-
-// Get list of square_odbcs
-exports.index = function(req, res) {
-  return SquareOdbc
-    .findAndCountAll(Util.getQuery(req.query))
-    .then(function(result) {
-      res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single square_odbc
-exports.show = function(req, res) {
-  return SquareOdbc
-    .findById(req.params.id)
-    .then(function(square_odbc) {
-      if (!square_odbc) {
-        return res.sendStatus(404);
-      }
-      return res.send(square_odbc);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new square_odbc in the DB.
-exports.create = function(req, res) {
-  return SquareOdbc
-    .create(req.body)
-    .then(function(square_odbc) {
-      return res.status(201).send(square_odbc);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing square_odbc in the DB.
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  return SquareOdbc
-    .findById(req.params.id)
-    .then(function(square_odbc) {
-      if (!square_odbc) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(square_odbc, req.body);
-      updated.save()
-        .then(function() {
-          return res.status(200).send(square_odbc);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a square_odbc from the DB.
-exports.destroy = function(req, res) {
-  return SquareOdbc
-    .findById(req.params.id)
-    .then(function(odbc) {
-      if (!odbc) {
-        return res.sendStatus(404);
-      }
-      return odbc
-        .destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a square_project from the DB.
-exports.bulkDestroy = function(req, res) {
-  return SquareOdbc
-    .destroy({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.checkConnection = function(req, res) {
-  return SquareOdbc
-    .findById(req.params.id)
-    .then(function(square_odbc) {
-      if (!square_odbc) {
-        return res.sendStatus(404);
-      }
-      db.open(square_odbc.dsn, function(err) {
-        if (err) {
-          return handleError(res, err);
-        }
-        db.close(function(err) {
-          if (err) {
-            return handleError(res, err);
-          }
-          return res.sendStatus(200);
-        })
-      })
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/square_odbc/square_odbc.events.js b/server/api/square_odbc/square_odbc.events.js
index 1f9776a..da8be75 100644
--- a/server/api/square_odbc/square_odbc.events.js
+++ b/server/api/square_odbc/square_odbc.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const SquareOdbc = require('../../models').SquareOdbc;
-
-var SquareOdbcEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-SquareOdbcEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  SquareOdbc.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    SquareOdbcEvents.emit(event + ':' + doc._id, doc);
-    SquareOdbcEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = SquareOdbcEvents;
\ No newline at end of file
diff --git a/server/api/square_odbc/square_odbc.socket.js b/server/api/square_odbc/square_odbc.socket.js
index 34d555e..37de13e 100644
--- a/server/api/square_odbc/square_odbc.socket.js
+++ b/server/api/square_odbc/square_odbc.socket.js
@@ -1,32 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const SquareOdbcEvents = require('./square_odbc.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('square_odbc:' + event, socket);
-
-    SquareOdbcEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    SquareOdbcEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/square_project/index.js b/server/api/square_project/index.js
index 0b1c55e..aacf578 100644
--- a/server/api/square_project/index.js
+++ b/server/api/square_project/index.js
@@ -1,17 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./square_project.controller');
-var auth = require('../../auth/auth.service');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), auth.hasModule([14, 7], ['admin']), controller.index);
-router.get('/:id', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.show);
-router.get('/:id/download', controller.download);
-router.post('/', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.create);
-router.put('/:id', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.update);
-router.delete('/', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.bulkDestroy);
-router.delete('/:id', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/square_project/square_project.controller.js b/server/api/square_project/square_project.controller.js
index 46766e9..9565f9e 100644
--- a/server/api/square_project/square_project.controller.js
+++ b/server/api/square_project/square_project.controller.js
@@ -1,133 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var path = require('path');
-var config = require('../../config/environment');
-var Util = require('../../config/util');
-
-var SquareProject = require('../../models').SquareProject;
-
-// Get list of square_projects
-exports.index = function(req, res) {
-  return SquareProject
-    .findAndCountAll(Util.getQuery(req.query))
-    .then(function(result) {
-      res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single square_project
-exports.show = function(req, res) {
-  return SquareProject
-    .findById(req.params.id)
-    .then(function(square_project) {
-      if (!square_project) {
-        return res.sendStatus(404);
-      }
-      return res.send(square_project);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new square_project in the DB.
-exports.create = function(req, res) {
-  return SquareProject
-    .create(req.body)
-    .then(function(square_project) {
-      return res.status(201).send(square_project);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing square_project in the DB.
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  delete req.body.name;
-  return SquareProject
-    .findById(req.params.id)
-    .then(function(square_project) {
-      if (!square_project) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(square_project, req.body);
-      updated.save()
-        .then(function() {
-          return res.status(200).send(square_project);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a square_project from the DB.
-exports.destroy = function(req, res) {
-  return SquareProject
-    .findById(req.params.id)
-    .then(function(project) {
-      if (!project) {
-        return res.sendStatus(404);
-      }
-      return project
-        .destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a square_project from the DB.
-exports.bulkDestroy = function(req, res) {
-  return SquareProject
-    .destroy({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.download = function(req, res, next) {
-  SquareProject
-    .findById(req.params.id)
-    .then(function(square_project) {
-      if (!square_project) {
-        return res.sendStatus(404);
-      }
-      console.log(req.query.filename);
-      res.set({
-        "Content-Disposition": "attachment; filename=\"" + req.query.filename +
-          ".xml\"",
-        "Content-Type": "txt/xml"
-      });
-      return res.send(square_project.preproduction);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/square_project/square_project.events.js b/server/api/square_project/square_project.events.js
index d592ee2..d2af517 100644
--- a/server/api/square_project/square_project.events.js
+++ b/server/api/square_project/square_project.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const SquareProject = require('../../models').SquareProject;
-
-var SquareProjectEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-SquareProjectEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  SquareProject.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    SquareProjectEvents.emit(event + ':' + doc._id, doc);
-    SquareProjectEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = SquareProjectEvents;
\ No newline at end of file
diff --git a/server/api/square_project/square_project.socket.js b/server/api/square_project/square_project.socket.js
index fc240c5..308fcf6 100644
--- a/server/api/square_project/square_project.socket.js
+++ b/server/api/square_project/square_project.socket.js
@@ -1,32 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const SquareProjectEvents = require('./square_project.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('square_project:' + event, socket);
-
-    SquareProjectEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    SquareProjectEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/square_recording/index.js b/server/api/square_recording/index.js
index 0ac38d5..3cf1e75 100644
--- a/server/api/square_recording/index.js
+++ b/server/api/square_recording/index.js
@@ -1,17 +1 @@
-'use strict';
-
-var express = require('express');
-var auth = require('../../auth/auth.service');
-var controller = require('./square_recording.controller');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.index);
-router.get('/:id', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.show);
-router.get('/:id/stream', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.getStream);
-router.post('/', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.create);
-router.put('/:id', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.update);
-router.delete('/', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.bulkDestroy);
-router.delete('/:id', auth.isAuthenticated(), auth.hasModule([14], ['admin']), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/square_recording/square_recording.controller.js b/server/api/square_recording/square_recording.controller.js
index 12c824a..8dc4f51 100644
--- a/server/api/square_recording/square_recording.controller.js
+++ b/server/api/square_recording/square_recording.controller.js
@@ -1,172 +1 @@
-/**
- * Using Rails-like standard naming convention for endpoints.
- * GET     /api/square/recordings              ->  index
- * POST    /api/square/recordings              ->  create
- * GET     /api/square/recordings/:id          ->  show
- * PUT     /api/square/recordings/:id          ->  update
- * DELETE  /api/square/recordings/:id          ->  destroy
- */
-
-'use strict';
-
-
-var _ = require('lodash');
-var util = require('util');
-
-var SquareRecording = require('../../models').SquareRecording;
-var Promise = require('bluebird');
-// var base64 = Promise.promisifyAll(require('file-base64'));
-var base64 = require('file-base64');
-var fs = require('fs');
-
-function handleError(res) {
-  return function(err) {
-    if (err.cause && err.cause.code === 'ENOENT') {
-      err = {
-        message: 'No file or directory',
-        translatedMessage: 'MESSAGE_NO_FILE_OR_DIRECTORY'
-      };
-    }
-    return res.status(500).send(err);
-  }
-}
-
-function responseWithResult(res, statusCode) {
-  statusCode = statusCode || 200;
-  return function(entity) {
-    if (entity) {
-      res.status(statusCode).json(entity);
-    }
-  };
-}
-
-function handleEntityNotFound(res) {
-  return function(entity) {
-    if (!entity) {
-      res.status(404).end();
-      return null;
-    }
-    return entity;
-  };
-}
-
-function saveUpdates(body) {
-  return function(entity) {
-    return entity
-      .updateAttributes(body);
-  };
-}
-
-function removeEntity(res) {
-  return function(entity) {
-    if (entity) {
-      return entity.destroy()
-        .then(function() {
-          res.status(204).end();
-        });
-    }
-  };
-}
-
-function getQuery(query) {
-  var _query = {};
-  _query.where = {};
-
-  _.forEach(query, function(value, key) {
-    switch (key) {
-      case 'limit':
-      case 'offset':
-        _query[key] = Number(value);
-        break;
-      case 'order':
-        _query[key] = value;
-        break;
-      default:
-        _query.where[key] = {
-          $like: '%' + value + '%'
-        };
-    }
-  });
-
-  return _query;
-}
-
-// Gets a list of SquareRecordings
-exports.index = function(req, res) {
-  var _query = getQuery(req.query);
-  return SquareRecording
-    .findAndCountAll(_query)
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Gets a single SquareRecording from the DB
-exports.show = function(req, res) {
-  return SquareRecording.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Gets a single SquareRecording from the DB
-exports.getStream = function(req, res) {
-  return SquareRecording
-    .findById(req.params.id)
-    .then(function(recording) {
-      var readFile = Promise.promisify(fs.readFile);
-      return readFile(recording.savePath);
-    })
-    .then(function(result) {
-      var base64String = new Buffer(result, 'binary').toString('base64');
-      return base64String;
-    })
-    .then(function(base64String) {
-      return res.status(200).send({
-        downloadString: base64String
-      });
-    })
-    .catch(handleError(res));
-}
-
-
-// Creates a new SquareRecording in the DB
-exports.create = function(req, res) {
-  return SquareRecording.create(req.body)
-    .then(responseWithResult(res, 201))
-    .catch(handleError(res));
-}
-
-// Updates an existing SquareRecording in the DB
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  return SquareRecording.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(saveUpdates(req.body))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Deletes a SquareRecording from the DB
-exports.destroy = function(req, res) {
-  return SquareRecording.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(removeEntity(res))
-    .catch(handleError(res));
-}
-
-// Deletes a recording from the DB.
-exports.bulkDestroy = function(req, res) {
-  return SquareRecording
-    .destroy({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(handleError(res));
-};
\ No newline at end of file
diff --git a/server/api/square_recording/square_recording.events.js b/server/api/square_recording/square_recording.events.js
index 76305fd..fd4cad6 100644
--- a/server/api/square_recording/square_recording.events.js
+++ b/server/api/square_recording/square_recording.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const SquareRecording = require('../../models').SquareRecording;
-
-var SquareRecordingEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-SquareRecordingEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  SquareRecording.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    SquareRecordingEvents.emit(event + ':' + doc._id, doc);
-    SquareRecordingEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = SquareRecordingEvents;
\ No newline at end of file
diff --git a/server/api/square_recording/square_recording.socket.js b/server/api/square_recording/square_recording.socket.js
index 8ca5928..e3990f8 100644
--- a/server/api/square_recording/square_recording.socket.js
+++ b/server/api/square_recording/square_recording.socket.js
@@ -1,32 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const SquareRecordingEvents = require('./square_recording.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('square_recording:' + event, socket);
-
-    SquareRecordingEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    SquareRecordingEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/sugarcrm_account/index.js b/server/api/sugarcrm_account/index.js
index 5927151..8848764 100644
--- a/server/api/sugarcrm_account/index.js
+++ b/server/api/sugarcrm_account/index.js
@@ -1,20 +1 @@
-'use strict';
-
-var express = require('express');
-var auth = require('../../auth/auth.service');
-var controller = require('./sugarcrm_account.controller');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), auth.hasModule([19, 13], ['admin']), controller.index);
-router.get('/:id/check', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.checkAccount);
-router.get('/:id/fields', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.getFields);
-router.get('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.show);
-router.post('/validate/:field', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.accountValidation);
-router.post('/', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.create);
-router.put('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.update);
-router.delete('/', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.bulkDestroy);
-router.delete('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.destroy);
-
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/sugarcrm_account/sugarcrm_account.controller.js b/server/api/sugarcrm_account/sugarcrm_account.controller.js
index 344c0ed..0a5e648 100644
--- a/server/api/sugarcrm_account/sugarcrm_account.controller.js
+++ b/server/api/sugarcrm_account/sugarcrm_account.controller.js
@@ -1,202 +1 @@
-/**
- * Using Rails-like standard naming convention for endpoints.
- * GET     /api/sugarcrm/accounts              ->  index
- * POST    /api/sugarcrm/accounts              ->  create
- * GET     /api/sugarcrm/accounts/:id          ->  show
- * PUT     /api/sugarcrm/accounts/:id          ->  update
- * DELETE  /api/sugarcrm/accounts/:id          ->  destroy
- */
-
-'use strict';
-
-
-var _ = require('lodash');
-var Util = require('../../config/util');
-
-var SugarcrmAccount = require('../../models').SugarcrmAccount;
-
-function handleError(res, statusCode) {
-  statusCode = statusCode || 500;
-  return function(err) {
-    res.status(statusCode).send(err);
-  };
-}
-
-function responseWithResult(res, statusCode) {
-  statusCode = statusCode || 200;
-  return function(entity) {
-    if (entity) {
-      res.status(statusCode).json(entity);
-    }
-  };
-}
-
-function responseWithoutResult(res, statusCode) {
-  statusCode = statusCode || 200;
-  return function() {
-    res.sendStatus(statusCode);
-  };
-}
-
-function handleEntityNotFound(res) {
-  return function(entity) {
-    if (!entity) {
-      res.status(404).end();
-      return null;
-    }
-    return entity;
-  };
-}
-
-function saveUpdates(updates) {
-  return function(entity) {
-    return entity.updateAttributes(updates)
-      .then(function(updated) {
-        return updated;
-      });
-  };
-}
-
-function removeEntity(res) {
-  return function(entity) {
-    if (entity) {
-      return entity.destroy()
-        .then(function() {
-          res.status(204).end();
-        });
-    }
-  };
-}
-
-// Gets a list of SugarcrmAccounts
-exports.index = function(req, res) {
-  return SugarcrmAccount
-    .scope('configurations')
-    .findAndCountAll(_.merge(Util.getQuery(req.query), {
-      distinct: true
-    }))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Gets a single SugarcrmAccount from the DB
-exports.show = function(req, res) {
-  return SugarcrmAccount.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Creates a new SugarcrmAccount in the DB
-exports.create = function(req, res) {
-  return SugarcrmAccount.create(req.body)
-    .then(responseWithResult(res, 201))
-    .catch(handleError(res));
-}
-
-// Updates an existing SugarcrmAccount in the DB
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  return SugarcrmAccount.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(saveUpdates(req.body))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Deletes a SugarcrmAccount from the DB
-exports.destroy = function(req, res) {
-  return SugarcrmAccount.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(removeEntity(res))
-    .catch(handleError(res));
-}
-
-exports.checkAccount = function(req, res) {
-  return SugarcrmAccount.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(function(account) {
-      var sugar = require('node-sugarcrm-client');
-      sugar.init({
-        apiURL: Util.stripTrailingSlash(account.remoteUri) + "/service/v4_1/rest.php",
-        login: account.username,
-        passwd: account.password
-      });
-      sugar.login(function(sessionId) {
-        if (!sessionId) {
-          return res.sendStatus(400);
-        }
-        return res.sendStatus(200);
-      });
-    })
-    .catch(handleError(res));
-}
-
-exports.bulkDestroy = function(req, res) {
-  SugarcrmAccount
-    .destroy({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(handleError(res));
-};
-
-exports.accountValidation = function(req, res) {
-  var where = {};
-  where[req.params.field] = req.body.value;
-  return SugarcrmAccount
-    .findAndCountAll({
-      where: where
-    })
-    .then(function(result) {
-      if (result.count) {
-        return res.status(200).send({
-          isValid: false,
-          value: req.body.value
-        });
-      }
-      return res.status(200).send({
-        isValid: true,
-        value: req.body.value
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.getFields = function(req, res) {
-  var sugar = require('node-sugarcrm-client');
-  return SugarcrmAccount.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(function(account) {
-      sugar.init({
-        apiURL: Util.stripTrailingSlash(account.remoteUri) + "/service/v4_1/rest.php",
-        login: account.username,
-        passwd: account.password
-      });
-      sugar.login(function(sessionId) {
-        if (!sessionId) {
-          return res.sendStatus(400);
-        }
-        var params = {
-          session: sessionId,
-          module_name: "Cases"
-        };
-        sugar.call("get_module_fields", params, function(result, err) {
-          if (err) {
-            return res.sendStatus(400);
-          }
-          return res.status(200).send(result.module_fields);
-        });
-      });
-    })
-    .catch(handleError(res));
-};
\ No newline at end of file
diff --git a/server/api/sugarcrm_account/sugarcrm_account.events.js b/server/api/sugarcrm_account/sugarcrm_account.events.js
index b65ac40..3a51513 100644
--- a/server/api/sugarcrm_account/sugarcrm_account.events.js
+++ b/server/api/sugarcrm_account/sugarcrm_account.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const SugarcrmAccount = require('../../models').SugarcrmAccount;
-
-var SugarcrmAccountEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-SugarcrmAccountEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  SugarcrmAccount.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    SugarcrmAccountEvents.emit(event + ':' + doc._id, doc);
-    SugarcrmAccountEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = SugarcrmAccountEvents;
\ No newline at end of file
diff --git a/server/api/sugarcrm_account/sugarcrm_account.socket.js b/server/api/sugarcrm_account/sugarcrm_account.socket.js
index 5a94608..a2db423 100644
--- a/server/api/sugarcrm_account/sugarcrm_account.socket.js
+++ b/server/api/sugarcrm_account/sugarcrm_account.socket.js
@@ -1,32 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const SugarcrmAccountEvents = require('./sugarcrm_account.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('sugarcrm_account:' + event, socket);
-
-    SugarcrmAccountEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    SugarcrmAccountEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/sugarcrm_configuration/index.js b/server/api/sugarcrm_configuration/index.js
index a7bbe3c..5451880 100644
--- a/server/api/sugarcrm_configuration/index.js
+++ b/server/api/sugarcrm_configuration/index.js
@@ -1,17 +1 @@
-'use strict';
-
-var express = require('express');
-var auth = require('../../auth/auth.service');
-var controller = require('./sugarcrm_configuration.controller');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.index);
-router.get('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.show);
-router.post('/', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.create);
-router.put('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.update);
-router.post('/:id/:type', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.addConfigurationField);
-router.delete('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.destroy);
-
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/sugarcrm_configuration/sugarcrm_configuration.controller.js b/server/api/sugarcrm_configuration/sugarcrm_configuration.controller.js
index 5918283..0d1edd1 100644
--- a/server/api/sugarcrm_configuration/sugarcrm_configuration.controller.js
+++ b/server/api/sugarcrm_configuration/sugarcrm_configuration.controller.js
@@ -1,145 +1 @@
-/**
- * Using Rails-like standard naming convention for endpoints.
- * GET     /api/sugarcrm/configurations              ->  index
- * POST    /api/sugarcrm/configurations              ->  create
- * GET     /api/sugarcrm/configurations/:id          ->  show
- * PUT     /api/sugarcrm/configurations/:id          ->  update
- * DELETE  /api/sugarcrm/configurations/:id          ->  destroy
- */
-
-'use strict';
-
-
-var _ = require('lodash');
-
-var SugarcrmConfiguration = require('../../models').SugarcrmConfiguration;
-var SugarcrmField = require('../../models').SugarcrmField;
-
-function handleError(res, statusCode) {
-  statusCode = statusCode || 500;
-  return function(err) {
-    res.status(statusCode).send(err);
-  };
-}
-
-function responseWithResult(res, statusCode) {
-  statusCode = statusCode || 200;
-  return function(entity) {
-    if (entity) {
-      res.status(statusCode).json(entity);
-    }
-  };
-}
-
-function handleEntityNotFound(res) {
-  return function(entity) {
-    if (!entity) {
-      res.status(404).end();
-      return null;
-    }
-    return entity;
-  };
-}
-
-function saveUpdates(updates) {
-  return function(entity) {
-    return entity.updateAttributes(updates)
-      .then(function(updated) {
-        return updated;
-      });
-  };
-}
-
-function removeEntity(res) {
-  return function(entity) {
-    if (entity) {
-      return entity.destroy()
-        .then(function() {
-          res.status(204).end();
-        });
-    }
-  };
-}
-
-// Gets a list of SugarcrmConfigurations
-exports.index = function(req, res) {
-  SugarcrmConfiguration.findAll({
-      where: req.query
-    })
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Gets a single SugarcrmConfiguration from the DB
-exports.show = function(req, res) {
-  SugarcrmConfiguration.find({
-      where: {
-        id: req.params.id
-      },
-      include: [{
-        model: SugarcrmField,
-        as: 'Subject'
-      }, {
-        model: SugarcrmField,
-        as: 'Description'
-      }, {
-        model: SugarcrmField,
-        as: 'Field'
-      }]
-    })
-    .then(handleEntityNotFound(res))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Creates a new SugarcrmConfiguration in the DB
-exports.create = function(req, res) {
-  SugarcrmConfiguration.create(req.body)
-    .then(responseWithResult(res, 201))
-    .catch(handleError(res));
-}
-
-// Updates an existing SugarcrmConfiguration in the DB
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  SugarcrmConfiguration.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(saveUpdates(req.body))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Deletes a SugarcrmConfiguration from the DB
-exports.destroy = function(req, res) {
-  SugarcrmConfiguration.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(removeEntity(res))
-    .catch(handleError(res));
-}
-
-exports.addConfigurationField = function(req, res, next) {
-  var sugarcrmConfiguration;
-  SugarcrmConfiguration
-    .findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(function(sugarcrm_configuration) {
-      sugarcrmConfiguration = sugarcrm_configuration;
-      return SugarcrmField.create(req.body)
-    })
-    .then(function(sugarcrmField) {
-      switch (req.params.type) {
-        case 'subject':
-          return [sugarcrmConfiguration.addSubject(sugarcrmField), sugarcrmField];
-        case 'description':
-          return [sugarcrmConfiguration.addDescription(sugarcrmField), sugarcrmField];
-        case 'field':
-          return [sugarcrmConfiguration.addField(sugarcrmField), sugarcrmField];
-      }
-    })
-    .spread(function(data, sugarcrmField) {
-      return res.status(201).json(sugarcrmField);
-    })
-    .catch(handleError(res));
-};
\ No newline at end of file
diff --git a/server/api/sugarcrm_configuration/sugarcrm_configuration.events.js b/server/api/sugarcrm_configuration/sugarcrm_configuration.events.js
index f1764e0..c0d9d69 100644
--- a/server/api/sugarcrm_configuration/sugarcrm_configuration.events.js
+++ b/server/api/sugarcrm_configuration/sugarcrm_configuration.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const SugarcrmConfiguration = require('../../models').SugarcrmConfiguration;
-
-var SugarcrmConfigurationEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-SugarcrmConfigurationEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  SugarcrmConfiguration.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    SugarcrmConfigurationEvents.emit(event + ':' + doc._id, doc);
-    SugarcrmConfigurationEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = SugarcrmConfigurationEvents;
\ No newline at end of file
diff --git a/server/api/sugarcrm_configuration/sugarcrm_configuration.socket.js b/server/api/sugarcrm_configuration/sugarcrm_configuration.socket.js
index 3a1b051..12f1842 100644
--- a/server/api/sugarcrm_configuration/sugarcrm_configuration.socket.js
+++ b/server/api/sugarcrm_configuration/sugarcrm_configuration.socket.js
@@ -1,32 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const SugarcrmConfigurationEvents = require('./sugarcrm_configuration.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('sugarcrm_configuration:' + event, socket);
-
-    SugarcrmConfigurationEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    SugarcrmConfigurationEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/sugarcrm_field/index.js b/server/api/sugarcrm_field/index.js
index 30e2ad2..2e2b084 100644
--- a/server/api/sugarcrm_field/index.js
+++ b/server/api/sugarcrm_field/index.js
@@ -1,17 +1 @@
-'use strict';
-
-var express = require('express');
-var auth = require('../../auth/auth.service');
-var controller = require('./sugarcrm_field.controller');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), controller.index);
-
-router.get('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.show);
-router.post('/', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.create);
-router.put('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.update);
-router.delete('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.destroy);
-
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/sugarcrm_field/sugarcrm_field.controller.js b/server/api/sugarcrm_field/sugarcrm_field.controller.js
index eb6fe3d..7937e22 100644
--- a/server/api/sugarcrm_field/sugarcrm_field.controller.js
+++ b/server/api/sugarcrm_field/sugarcrm_field.controller.js
@@ -1,104 +1 @@
-/**
- * Using Rails-like standard naming convention for endpoints.
- * GET     /api/sugarcrm/fields              ->  index
- * POST    /api/sugarcrm/fields              ->  create
- * GET     /api/sugarcrm/fields/:id          ->  show
- * PUT     /api/sugarcrm/fields/:id          ->  update
- * DELETE  /api/sugarcrm/fields/:id          ->  destroy
- */
-
-'use strict';
-
-
-var _ = require('lodash');
-
-var SugarcrmField = require('../../models').SugarcrmField;
-
-
-function handleError(res, statusCode) {
-  statusCode = statusCode || 500;
-  return function(err) {
-    res.status(statusCode).send(err);
-  };
-}
-
-function responseWithResult(res, statusCode) {
-  statusCode = statusCode || 200;
-  return function(entity) {
-    if (entity) {
-      res.status(statusCode).json(entity);
-    }
-  };
-}
-
-function handleEntityNotFound(res) {
-  return function(entity) {
-    if (!entity) {
-      res.status(404).end();
-      return null;
-    }
-    return entity;
-  };
-}
-
-function saveUpdates(updates) {
-  return function(entity) {
-    return entity.updateAttributes(updates)
-      .then(function(updated) { 
-        return updated;
-      });
-  };
-}
-
-function removeEntity(res) {
-  return function(entity) {
-    if (entity) {
-      return entity.destroy()
-        .then(function() {
-          res.status(204).end();
-        });
-    }
-  };
-}
-
-// Gets a list of SugarcrmFields
-exports.index = function(req, res) {
-  SugarcrmField.findAll()
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Gets a single SugarcrmField from the DB
-exports.show = function(req, res) {
-  SugarcrmField.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Creates a new SugarcrmField in the DB
-exports.create = function(req, res) {
-  SugarcrmField.create(req.body)
-    .then(responseWithResult(res, 201))
-    .catch(handleError(res));
-}
-
-// Updates an existing SugarcrmField in the DB
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  SugarcrmField.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(saveUpdates(req.body))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Deletes a SugarcrmField from the DB
-exports.destroy = function(req, res) {
-  SugarcrmField.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(removeEntity(res))
-    .catch(handleError(res));
-}
\ No newline at end of file
diff --git a/server/api/sugarcrm_field/sugarcrm_field.events.js b/server/api/sugarcrm_field/sugarcrm_field.events.js
index 0845bee..3889546 100644
--- a/server/api/sugarcrm_field/sugarcrm_field.events.js
+++ b/server/api/sugarcrm_field/sugarcrm_field.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const SugarcrmField = require('../../models').SugarcrmField;
-
-var SugarcrmFieldEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-SugarcrmFieldEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  SugarcrmField.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    SugarcrmFieldEvents.emit(event + ':' + doc._id, doc);
-    SugarcrmFieldEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = SugarcrmFieldEvents;
\ No newline at end of file
diff --git a/server/api/sugarcrm_field/sugarcrm_field.socket.js b/server/api/sugarcrm_field/sugarcrm_field.socket.js
index 8830ac2..446c335 100644
--- a/server/api/sugarcrm_field/sugarcrm_field.socket.js
+++ b/server/api/sugarcrm_field/sugarcrm_field.socket.js
@@ -1,32 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const SugarcrmFieldEvents = require('./sugarcrm_field.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('sugarcrm_field:' + event, socket);
-
-    SugarcrmFieldEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    SugarcrmFieldEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/tag/index.js b/server/api/tag/index.js
index 1751dda..0aa9091 100644
--- a/server/api/tag/index.js
+++ b/server/api/tag/index.js
@@ -1,171 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./tag.controller');
-var auth = require('../../auth/auth.service');
-
-var router = express.Router();
-/**
- * @api {get} /api/tags/ Get Tags' list.
- *
- * @apiParam (Query) {Number} [offset] Pagination offset.
- * @apiParam (Query) {Number} [limit] Pagination limit.
- *
- * @apiVersion 0.0.140
- * @apiName GetTags
- * @apiGroup Tags
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccess {Number} count Number of tags.
- * @apiSuccess {Object[]} rows  Tags' list.
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 200 OK
- *     {
- *       "count": 2,
- *       "rows": [{
- *          "id": 1
- *          "name": "tag1"
- *          "description": "my tag description"
- *           ...
- *       },{
- *          "id": 2
- *          "name": "newtag"
- *          "description": null
- *          ...
- *       },...]
- *     }
- */
-router.get('/', auth.isAuthenticated(), auth.hasModule([5, 9, 13], ['admin', 'agent']), controller.index);
-/**
- * @api {get} /api/tags/:id Get Tag's details.
- * @apiParam {Number} id Tag's unique ID.
- * @apiVersion 0.0.140
- * @apiName GetTag
- * @apiGroup Tags
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccess {Object} Tag's details.
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 200 OK
- *     {
- *          "id": 1
- *          "name": "tag1"
- *          "description": "my tag description"
- *          ...
- *       }
- */
-router.get('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.show);
-router.get('/chat/:tag', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.getChatByTag);
-router.get('/mail/:tag', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.getMailByTag);
-router.get('/fax/:tag', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.getFaxByTag);
-router.get('/sms/:tag', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.getSmsByTag);
-router.get('/contacts/:tag', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.getContactsByTag);
-/**
- * @api {post} /api/tags/ Create a new tag.
- * @apiParam (body) {String} name Tag's name.
- * @apiParam (body) {String} [description] Tag's description.
- *
- * @apiVersion 0.0.140
- * @apiName CreateTag
- * @apiGroup Tags
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 201 Created
- *     {
- *        "id": 3
- *        "name": "Tag3"
- *        "description": "my tag"
- *        ...
- *     }
- */
-router.post('/', auth.isAuthenticated(), auth.hasModule([5, 13], ['admin', 'agent']), controller.create);
-/**
- * @api {put} /api/tags/:id Update tag's details.
- * @apiParam {Number} id Tag's unique ID.
- * @apiParam (body) {String} name Tag's name.
- * @apiParam (body) {String} [description] Tag's description.
- *
- * @apiVersion 0.0.140
- * @apiName UpdateTag
- * @apiGroup Tags
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 200 OK
- *     {
- *        "id": 3
- *        "name": "Tag 3"
- *        "description": "My new description"
- *        ...
- *     }
- */
-router.put('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.update);
-/**
- * @api {delete} /api/tags/ Bulk Delete tags.
- *
- * @apiParam (Query) {Number[]} ids Tags' unique ID array.
- *
- * @apiVersion 0.0.140
- * @apiName BulkDeleteTags
- * @apiGroup Tags
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 204 No Content
- */
-router.delete('/', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.bulkDestroy);
-/**
- * @api {delete} /api/tags/:id Delete a tag.
- *
- * @apiParam {Number} id Tag's unique ID.
- *
- * @apiVersion 0.0.140
- * @apiName DeleteTag
- * @apiGroup Tags
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 204 No Content
- */
-router.delete('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/tag/tag.controller.js b/server/api/tag/tag.controller.js
index 8caf0e0..be5c4ba 100644
--- a/server/api/tag/tag.controller.js
+++ b/server/api/tag/tag.controller.js
@@ -1,209 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var Tag = require('../../models').Tag;
-var ChatRoom = require('../../models').ChatRoom;
-var ChatWebsite = require('../../models').ChatWebsite;
-var ChatVisitor = require('../../models').ChatVisitor;
-var MailRoom = require('../../models').MailRoom;
-var FaxRoom = require('../../models').FaxRoom;
-var SmsRoom = require('../../models').SmsRoom;
-var Contact = require('../../models').Contact;
-var Util = require('../../config/util');
-
-// Get list of tags
-exports.index = function(req, res, next) {
-  return Tag
-    .findAndCountAll(Util.getQuery(req.query))
-    .then(function(result) {
-      res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single tag
-exports.show = function(req, res) {
-  return Tag
-    .findById(req.params.id)
-    .then(function(tag) {
-      if (!tag) {
-        return res.sendStatus(404);
-      }
-      return res.send(tag);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-
-exports.getChatByTag = function(req, res) {
-  return ChatRoom
-    .findAndCountAll(_.merge(Util.getQuery(req.query, {
-      tags: {
-        $like: '%' + req.params.tag + ';%'
-      }
-    }), {
-      include: [ChatWebsite, ChatVisitor]
-    }))
-    .then(function(result) {
-      res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.getMailByTag = function(req, res) {
-  return MailRoom
-    .scope('default')
-    .findAndCountAll(Util.getQuery(req.query, {
-      tags: {
-        $like: '%' + req.params.tag + ';%'
-      }
-    }))
-    .then(function(result) {
-      res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.getFaxByTag = function(req, res) {
-  return FaxRoom
-    .scope('default')
-    .findAndCountAll(Util.getQuery(req.query, {
-      tags: {
-        $like: '%' + req.params.tag + ';%'
-      }
-    }))
-    .then(function(result) {
-      res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.getSmsByTag = function(req, res) {
-  return SmsRoom
-    .scope('default')
-    .findAndCountAll(Util.getQuery(req.query, {
-      tags: {
-        $like: '%' + req.params.tag + ';%'
-      }
-    }))
-    .then(function(result) {
-      res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.getContactsByTag = function(req, res) {
-  return Contact
-    .scope('list', 'company', {
-      method: ['company_list_filter', req.query]
-    })
-    .findAndCountAll(Util.getQuery(req.query, {
-      tags: {
-        $like: '%' + req.params.tag + ';%'
-      }
-    }))
-    .then(function(result) {
-      res.status(200).send(result);
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-
-// Creates a new tag in the DB.
-exports.create = function(req, res) {
-  return Tag
-    .create(req.body)
-    .then(function(tag) {
-      return res.status(201).send(tag);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing tag in the DB.
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-
-  return Tag
-    .findById(req.params.id)
-    .then(function(tag) {
-      if (!tag) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(tag, req.body);
-      return updated
-        .save();
-    })
-    .then(function(tag) {
-      return res.status(200).send(tag);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a tag from the DB.
-exports.destroy = function(req, res) {
-  return Tag
-    .scope('configuration')
-    .findById(req.params.id)
-    .then(function(tag) {
-      if (!tag) {
-        return res.sendStatus(404);
-      }
-      if (tagHasAssociation(tag)) {
-        var err = new Error();
-        err.message = 'Tag is associated with an integration\'s configuration';
-        throw err;
-      }
-      return tag.destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.bulkDestroy = function(req, res) {
-  return Tag
-    .destroy({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
-
-function tagHasAssociation(tag) {
-  return ((tag.ZendeskConfigurations && tag.ZendeskConfigurations.length > 0));
-}
\ No newline at end of file
diff --git a/server/api/tag/tag.events.js b/server/api/tag/tag.events.js
index 61d6e17..fc1f884 100644
--- a/server/api/tag/tag.events.js
+++ b/server/api/tag/tag.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const Tag = require('../../models').Tag;
-
-var TagEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-TagEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  Tag.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    TagEvents.emit(event + ':' + doc._id, doc);
-    TagEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = TagEvents;
\ No newline at end of file
diff --git a/server/api/tag/tag.socket.js b/server/api/tag/tag.socket.js
index 6fccbd9..1208556 100644
--- a/server/api/tag/tag.socket.js
+++ b/server/api/tag/tag.socket.js
@@ -1,32 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const TagEvents = require('./tag.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('tag:' + event, socket);
-
-    TagEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    TagEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/team/index.js b/server/api/team/index.js
index cfc9a7a..8b14e50 100644
--- a/server/api/team/index.js
+++ b/server/api/team/index.js
@@ -1,247 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./team.controller');
-var auth = require('../../auth/auth.service');
-
-var router = express.Router();
-
-/**
- * @api {get} /api/teams/ Get Teams' list.
- *
- * @apiParam (Query) {Number} [offset] Pagination offset.
- * @apiParam (Query) {Number} [limit] Pagination limit.
- *
- * @apiVersion 0.0.140
- * @apiName GetTeams
- * @apiGroup Teams
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccess {Number} count Number of teams.
- * @apiSuccess {Object[]} rows  Teams' list.
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 200 OK
- *     {
- *       "count": 2,
- *       "rows": [{
- *          "id": 1
- *          "name": "T1"
- *          "description": "Default Team",
- *           ...
- *       },{
- *          "id": 2
- *          "name": "T2"
- *          "description": null
- *          ...
- *       },...]
- *     }
- */
-router.get('/', auth.isAuthenticated(), auth.hasRole('admin'), controller.index);
-router.get('/associations', auth.isAuthenticated(), auth.hasModule([5], ['admin']), controller.associationsIndex);
-/**
- * @api {get} /api/teams/:id Get Team's details.
- * @apiParam {Number} id Team's unique ID.
- * @apiVersion 0.0.140
- * @apiName GetTeam
- * @apiGroup Teams
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccess {Object} Team's details.
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 200 OK
- *     {
- *          "id": 1
- *          "name": "T1"
- *          "description": "Default Team"
- *          ...
- *       }
- */
-router.get('/:id', auth.isAuthenticated(), auth.hasRole('admin'), controller.show);
-/**
- * @api {get} /api/teams/:id/agents Get Team's agents
- * @apiParam {Number} id Team's unique ID.
- * @apiVersion 0.0.140
- * @apiName showAgents
- * @apiGroup Teams
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccess {Number} count Number of agents.
- * @apiSuccess {Object[]} rows  Agents list.
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 200 OK
- *     {
- *       "count": 2,
- *       "rows": [{
- *          "id": 1
- *          "name": "John Doe"
- *          "fullname": "john.doe"
- *          "email": "[email-masked]"
- *          "internal": 1000,
- *           ...
- *       },{
- *          "id": 2
- *          "name": "Jane Miller"
- *          "fullname": "jane.miller",
- *          "email": "[email-masked]"
- *          "internal": 1001,
- *          ...
- *       },...]
- *     }
- */
-router.get('/:id/agents', auth.isAuthenticated(), auth.hasRole('admin'), controller.showAgents);
-/**
- * @api {post} /api/teams/ Create a new team.
- * @apiParam (body) {String} name Team's name.
- * @apiParam (body) {String} [description] Team's description.
- *
- * @apiVersion 0.0.140
- * @apiName CreateTeam
- * @apiGroup Teams
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 201 Created
- *     {
- *        "id": 3
- *        "name": "My Team"
- *        "description": "New Team"
- *        ...
- *     }
- */
-router.post('/', auth.isAuthenticated(), auth.hasRole('admin'), controller.create);
-/**
- * @api {post} /api/teams/:id/agents Add agents to a team.
- * @apiParam {Number} id Team's unique ID.
- * @apiParam (body) {Number[]} agents Array of agents' ID
- *
- * @apiVersion 0.0.140
- * @apiName AddAgents
- * @apiGroup Teams
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 204 No Content
- */
-router.post('/:id/agents', auth.isAuthenticated(), auth.hasRole('admin'), controller.addAgents);
-/**
- * @api {put} /api/teams/:id Update team's details.
- * @apiParam {Number} id Team's unique ID.
- * @apiParam (body) {String} name Team's name.
- * @apiParam (body) {String} [description] Team's description.
- *
- * @apiVersion 0.0.140
- * @apiName UpdateTeam
- * @apiGroup Teams
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 200 OK
- *     {
- *        "id": 3
- *        "name": "Team 3"
- *        "description": "My description"
- *        ...
- *     }
- */
-router.put('/:id', auth.isAuthenticated(), auth.hasRole('admin'), controller.update);
-/**
- * @api {delete} /api/teams/ Bulk Delete teams.
- *
- * @apiParam (Query) {Number[]} ids Teams' unique ID array.
- *
- * @apiVersion 0.0.140
- * @apiName BulkDeleteTeams
- * @apiGroup Teams
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 204 No Content
- */
-router.delete('/', auth.isAuthenticated(), auth.hasRole('admin'), controller.bulkDestroy);
-/**
- * @api {delete} /api/teams/:id Delete a team.
- *
- * @apiParam {Number} id Team's unique ID.
- *
- * @apiVersion 0.0.140
- * @apiName DeleteTeam
- * @apiGroup Teams
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 204 No Content
- */
-router.delete('/:id', auth.isAuthenticated(), auth.hasRole('admin'), controller.destroy);
-/**
- * @api {delete} /api/teams/:id/agents Remove agents from a team.
- * @apiParam {Number} id Team's unique ID.
- * @apiParam (Query) {Number[]} ids Agents' unique ID array.
- *
- * @apiVersion 0.0.140
- * @apiName RemoveAgents
- * @apiGroup Teams
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 204 No Content
- */
-router.delete('/:id/agents', auth.isAuthenticated(), auth.hasRole('admin'), controller.removeAgents);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/team/team.controller.js b/server/api/team/team.controller.js
index cac8024..155d6df 100644
--- a/server/api/team/team.controller.js
+++ b/server/api/team/team.controller.js
@@ -1,252 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var util = require('util');
-var Util = require('../../config/util');
-
-var sequelize = require('../../models').sequelize;
-var Team = require('../../models').Team;
-var Agent = require('../../models').User;
-var User = require('../../models').User;
-
-// Get list of teams
-exports.index = function(req, res) {
-  return Team
-    .scope('default')
-    .findAndCountAll(_.merge(Util.getQuery(req.query)))
-    .then(function(result) {
-      res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.associationsIndex = function(req, res) {
-  switch (req.user.role) {
-    case 'user':
-      return User
-        .findById(req.user.id)
-        .then(function(user) {
-          if (!user) {
-            return res.sendStatus(404);
-          }
-
-          return user;
-        })
-        .then(Util.getAgentsIdByUser(req.query))
-        .then(function(data) {
-          return Team
-            .scope({
-              method: ['agents', _.map(data.rows, 'id')]
-            })
-            .findAll(_.merge(Util.getQuery(req.query)));
-        })
-        .then(function(result) {
-          res.status(200).send({
-            rows: result,
-            count: result.length
-          });
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-
-    default:
-      return Team
-        .scope('agents')
-        .findAll(_.merge(Util.getQuery(req.query)))
-        .then(function(result) {
-          res.status(200).send({
-            rows: result,
-            count: result.length
-          });
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-  }
-};
-
-// Get a single team
-exports.show = function(req, res) {
-  return Team
-    // .scope('default')
-    .findById(req.params.id)
-    .then(function(team) {
-      if (!team) {
-        return res.sendStatus(404);
-      }
-      return res.send(team);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single team
-exports.showAgents = function(req, res) {
-  switch (req.user.role) {
-    case 'user':
-      return User
-        .findById(req.user.id)
-        .then(function(user) {
-          if (!user) {
-            return res.sendStatus(404);
-          }
-          return user;
-        })
-        .then(Util.getAgentsIdByUser(req.query))
-        .then(function(data) {
-          return Team
-            .scope({
-              method: ['agents', _.map(data.rows, 'id')]
-            })
-            .findById(req.params.id);
-        })
-        .then(function(team) {
-          if (!team) {
-            return res.sendStatus(404);
-          }
-          return res.status(200).send({
-            count: team.Users.length,
-            rows: team.Users
-          });
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-    default:
-      return Team
-        .scope('agents')
-        .findById(req.params.id)
-        .then(function(team) {
-          if (!team) {
-            return res.sendStatus(404);
-          }
-          return res.status(200).send({
-            count: team.Users.length,
-            rows: team.Users
-          });
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-  }
-};
-
-// Creates a new team in the DB.
-exports.create = function(req, res) {
-  return Team
-    // .scope('default')
-    .create(req.body)
-    .then(function(team) {
-      return res.status(201).send(team);
-    })
-    .catch(sequelize.UniqueConstraintError, function(err) {
-      return Util.errorManager.handleUniqueConstraintError(res, err);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing team in the DB.
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-
-  return Team
-    .findById(req.params.id)
-    .then(function(team) {
-      if (!team) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(team, req.body);
-      return updated
-        .save();
-    })
-    .then(function(team) {
-      return res.status(200).send(team);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a team from the DB.
-exports.destroy = function(req, res) {
-  return Team
-    .findById(req.params.id)
-    .then(function(team) {
-      if (!team) {
-        return res.sendStatus(404);
-      }
-      return team.destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a agent from the DB.
-exports.bulkDestroy = function(req, res) {
-  return Team
-    .destroy({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing user_has_mail_queue in the DB.
-exports.addAgents = function(req, res, next) {
-  return Team
-    .findById(req.params.id)
-    .then(function(team) {
-      if (!team) {
-        return res.sendStatus(404);
-      }
-      return team
-        .addUsers(req.body.agents);
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return next(err);
-    });
-};
-
-exports.removeAgents = function(req, res, next) {
-  return Team
-    .findById(req.params.id)
-    .then(function(team) {
-      if (!team) {
-        return res.sendStatus(404);
-      }
-      return team
-        .removeUser(req.query.agents);
-    })
-    .then(function() {
-      return res.sendStatus(202);
-    })
-    .catch(function(err) {
-      return next(err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/team/team.events.js b/server/api/team/team.events.js
index 8a9173b..a0d56ad 100644
--- a/server/api/team/team.events.js
+++ b/server/api/team/team.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const Team = require('../../models').Team;
-
-var TeamEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-TeamEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  Team.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    TeamEvents.emit(event + ':' + doc._id, doc);
-    TeamEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = TeamEvents;
\ No newline at end of file
diff --git a/server/api/team/team.socket.js b/server/api/team/team.socket.js
index 8217583..323d094 100644
--- a/server/api/team/team.socket.js
+++ b/server/api/team/team.socket.js
@@ -1,32 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const TeamEvents = require('./team.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('team:' + event, socket);
-
-    TeamEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    TeamEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/telephone/index.js b/server/api/telephone/index.js
index a545c63..b45083d 100644
--- a/server/api/telephone/index.js
+++ b/server/api/telephone/index.js
@@ -1,174 +1 @@
-'use strict';
-
-var express = require('express');
-var auth = require('../../auth/auth.service');
-var controller = require('./telephone.controller');
-var license = require('../../config/license/license.service');
-
-var router = express.Router();
-
-/**
- * @api {get} /api/telephones/ Get telephones list.
- * @apiVersion 0.0.140
- * @apiName GetTelephones
- * @apiGroup Telephones
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccess {Number} count Number of telephones.
- * @apiSuccess {Object[]} rows  Get list of agent detailss.
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 200 OK
- *     {
- *       "count": 1,
- *       "rows": [{
- *          "id": 1
- *          "name": "john.doe"
- *          "internal": 1001
- *          ...
- *       }]
- *     }
- */
-router.get('/', auth.isAuthenticated(), auth.hasRole('admin'), controller.index);
-
-/**
- * @api {get} /api/telephones/:id Get telephone details.
- * @apiParam {Number} id Telephone's unique ID.
- * @apiVersion 0.0.140
- * @apiName GetTelephone
- * @apiGroup Telephones
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccess {Object} Telephone's details.
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 200 OK
- *     {
- *        "id": 1
- *        "name": "john.doe"
- *        "internal": 1001
- *        ...
- *     }
- */
-router.get('/:id', auth.isAuthenticated(), auth.hasRole('admin'), controller.show);
-
-/**
- * @api {post} /api/telephones/ Create telephone.
- * @apiParam (Body) {String} name                                        Telephone's name.
- * @apiParam (Body) {String} context="from-sip"                          Telephone's SIP context.
- * @apiParam (Body) {String} password                                    Telephone's password.
- * @apiParam (Body) {Number} internal                                    Telephone's internal number.
- * @apiParam (Body) {String="tcp", "udp", "tcp,udp"} transport="udp"     Telephone's SIP transport.
- * @apiParam (Body) {String="alaw", "ulaw", "gsm"} allow="alaw;ulaw;gsm" Telephone's SIP codecs.
- * @apiParam (Body) {Number} internal                                    Telephone's internal number.
- *
- * @apiVersion 0.0.140
- * @apiName CreateTelephone
- * @apiGroup Telephones
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 201 Created
- *     {
- *        "id": 1
- *        "name": "john.doe"
- *        "internal": 1001
- *        ...
- *     }
- */
-router.post('/', auth.isAuthenticated(), license.isValidDate(), license.isTelephonesLimit(), auth.hasRole('admin'), controller.create);
-
-/**
- * @api {update} /api/telephones/:id Update telephone details.
- *
- * @apiParam (Params) {Number} id Telephone's unique ID.
- * @apiParam (Body) {String} email                                       Telephone's email.
- * @apiParam (Body) {String} context="from-sip"                          Telephone's SIP context.
- * @apiParam (Body) {String} password                                    Telephone's password.
- * @apiParam (Body) {Number} internal                                    Telephone's internal number.
- * @apiParam (Body) {String="tcp", "udp", "tcp,udp"} transport="udp"     Telephone's SIP transport.
- * @apiParam (Body) {String="alaw", "ulaw", "gsm"} allow="alaw;ulaw;gsm" Telephone's SIP codecs.
- *
- * @apiVersion 0.0.140
- * @apiName UpdateTelephone
- * @apiGroup Telephones
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 200 OK
- *     {
- *        "id": 1
- *        "name": "john.doe"
- *        "internal": 1001
- *        ...
- *     }
- */
-router.put('/:id', auth.isAuthenticated(), auth.hasRole('admin'), controller.update);
-
-/**
- * @api {delete} /api/telephones/ Bulk Delete telephones.
- *
- * @apiParam (Query) {Number[]} ids Telephones' unique ID array.
- *
- * @apiVersion 0.0.140
- * @apiName BulkDeleteTelephones
- * @apiGroup Telephones
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 204 No Content
- */
-router.delete('/', auth.isAuthenticated(), auth.hasRole('admin'), controller.bulkDestroy);
-
-/**
- * @api {delete} /api/telephones/:id Delete telephone.
- *
- * @apiParam {Number} id Telephone's unique ID.
- *
- * @apiVersion 0.0.140
- * @apiName DeleteTelephone
- * @apiGroup Telephones
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 204 No Content
- */
-router.delete('/:id', auth.isAuthenticated(), auth.hasRole('admin'), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/telephone/telephone.controller.js b/server/api/telephone/telephone.controller.js
index 139df32..1ab9214 100644
--- a/server/api/telephone/telephone.controller.js
+++ b/server/api/telephone/telephone.controller.js
@@ -1,157 +1 @@
-/**
- * Using Rails-like standard naming convention for endpoints.
- * GET     /api/telephones              ->  index
- * POST    /api/telephones              ->  create
- * GET     /api/telephones/:id          ->  show
- * PUT     /api/telephones/:id          ->  update
- * DELETE  /api/telephones/:id          ->  destroy
- */
-
-'use strict';
-
-var _ = require('lodash');
-var Util = require('../../config/util');
-
-var sequelize = require('../../models').sequelize;
-var Telephone = require('../../models').User;
-
-function handleError(res, statusCode) {
-  statusCode = statusCode || 500;
-  return function(err) {
-    res.status(statusCode).send(err);
-  };
-}
-
-function responseWithResult(res, statusCode) {
-  statusCode = statusCode || 200;
-  return function(entity) {
-    if (entity) {
-      res.status(statusCode).json(entity);
-    }
-  };
-}
-
-function handleEntityNotFound(res) {
-  return function(entity) {
-    if (!entity) {
-      res.status(404).end();
-      return null;
-    }
-    return entity;
-  };
-}
-
-function saveUpdates(updates, t) {
-  return function(entity) {
-    return entity.updateAttributes(updates, {
-        transaction: t
-      })
-      .then(function(updated) {
-        return updated;
-      });
-  };
-}
-
-function removeEntity(res) {
-  return function(entity) {
-    if (entity) {
-      return entity.destroy()
-        .then(function() {
-          res.status(204).end();
-        });
-    }
-  };
-}
-
-// Gets a list of Telephones
-exports.index = function(req, res) {
-  return Telephone
-    .scope('telephone')
-    .findAndCountAll(Util.getQuery(req.query))
-    .then(function(result) {
-      res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-}
-
-// Gets a single Telephone from the DB
-exports.show = function(req, res) {
-  Telephone.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Creates a new Telephone in the DB
-exports.create = function(req, res) {
-  var password = String(req.body.password);
-  if (!(/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[~!@#$%^&\-_=+\[\{\]\}.])[0-9a-zA-Z~!@#$%^&\-_=+\[\{\]\}.]{8,}$/.test(password))) {
-    throw new Error('Wrong password format!');
-  }
-  // Set default role
-  req.body.role = 'telephone';
-  return sequelize.transaction(function(t) {
-      return Telephone
-        .create(req.body, {
-          transaction: t
-        })
-        .then(responseWithResult(res, 201))
-    })
-    .catch(sequelize.UniqueConstraintError, function(err) {
-      return Util.errorManager.handleUniqueConstraintError(res, err);
-    })
-    .catch(handleError(res));
-}
-
-// Updates an existing Telephone in the DB
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  if (req.body.password) {
-    var password = String(req.body.password);
-    if (!(/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[~!@#$%^&\-_=+\[\{\]\}.])[0-9a-zA-Z~!@#$%^&\-_=+\[\{\]\}.]{8,}$/.test(password))) {
-      throw new Error('Wrong password format!');
-    }
-  }
-
-  delete req.body.name;
-
-  return sequelize.transaction(function(t) {
-      return Telephone.findById(req.params.id)
-        .then(handleEntityNotFound(res))
-        .then(saveUpdates(req.body, t))
-        .then(responseWithResult(res))
-    })
-    .catch(sequelize.UniqueConstraintError, function(err) {
-      return Util.errorManager.handleUniqueConstraintError(res, err);
-    })
-    .catch(handleError(res));
-}
-
-// Deletes a Telephone from the DB
-exports.destroy = function(req, res) {
-  return Telephone.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(removeEntity(res))
-    .catch(handleError(res));
-}
-
-// Deletes a agent from the DB.
-exports.bulkDestroy = function(req, res) {
-  return Telephone
-    .destroy({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
\ No newline at end of file
diff --git a/server/api/telephone/telephone.events.js b/server/api/telephone/telephone.events.js
index 25f4f9a..f042d96 100644
--- a/server/api/telephone/telephone.events.js
+++ b/server/api/telephone/telephone.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const Telephone = require('../../models').Telephone;
-
-var TelephoneEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-TelephoneEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  Telephone.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    TelephoneEvents.emit(event + ':' + doc._id, doc);
-    TelephoneEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = TelephoneEvents;
\ No newline at end of file
diff --git a/server/api/telephone/telephone.socket.js b/server/api/telephone/telephone.socket.js
index 66a9a8e..8ca5bca 100644
--- a/server/api/telephone/telephone.socket.js
+++ b/server/api/telephone/telephone.socket.js
@@ -1,32 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const TelephoneEvents = require('./telephone.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('telephone:' + event, socket);
-
-    TelephoneEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    TelephoneEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/template/index.js b/server/api/template/index.js
index 68e0650..b52947a 100644
--- a/server/api/template/index.js
+++ b/server/api/template/index.js
@@ -1,182 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./template.controller');
-var auth = require('../../auth/auth.service');
-
-var router = express.Router();
-/**
- * @api {get} /api/template/ Get Templates' list.
- *
- * @apiParam (Query) {Number} [offset] Pagination offset.
- * @apiParam (Query) {Number} [limit] Pagination limit.
- *
- * @apiVersion 0.0.140
- * @apiName GetTemplates
- * @apiGroup Templates
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccess {Number} count Number of templates.
- * @apiSuccess {Object[]} rows  Templates list.
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 200 OK
- *     {
- *       "count": 2,
- *       "rows": [{
- *          "id": 1
- *          "name": "Template 1"
- *          "description": "Auto Response"
- *          "subject": "My subject"
- *          "attachment": null
- *          "html": null
- *          "text": "Hi, nice to meet you"
- *           ...
- *       },{
- *          "id": 2
- *          "name": "Template abc"
- *          "description": null
- *          ...
- *       },...]
- *     }
- */
-router.get('/', auth.isAuthenticated(), auth.hasModule([13], ['admin', 'user', 'agent']), controller.index);
-/**
- * @api {get} /api/templates/:id Get Template's details.
- * @apiParam {Number} id Template's unique ID.
- * @apiVersion 0.0.140
- * @apiName GetTemplate
- * @apiGroup Templates
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccess {Object} Template's details.
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 200 OK
- *     {
- *          "id": 1
- *          "name": "Template 1"
- *          "description": "Auto Response"
- *          "subject": "My subject"
- *          "attachment": null
- *          "html": null
- *          "text": "Hi, nice to meet you"
- *          ...
- *       }
- */
-router.get('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.show);
-/**
- * @api {post} /api/templates/ Create a new template.
- * @apiParam (body) {String} name Template's name.
- * @apiParam (body) {String} [description] Template's description.
- * @apiParam (body) {String} [subject] Template's subject.
- * @apiParam (body) {String} [html] Template's content.
- *
- * @apiVersion 0.0.140
- * @apiName CreateTemplate
- * @apiGroup Templates
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 201 Created
- *     {
- *        id": 2
- *          "name": "Template 2"
- *          "description": "My Response",
- *          "subject": "My subject",
- *          "html": null
- *          ...
- *     }
- */
-router.post('/', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.create);
-/**
- * @api {put} /api/templates/:id Update template's details.
- * @apiParam {Number} id Template's unique ID.
- * @apiParam (body) {String} name Template's name.
- * @apiParam (body) {String} [description] Template's description.
- * @apiParam (body) {String} [subject] Template's subject.
- * @apiParam (body) {String} [html] Template's content.
- *
- * @apiVersion 0.0.140
- * @apiName UpdateTemplate
- * @apiGroup Templates
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 200 OK
- *     {
- *         id": 2
- *          "name": "Template 2"
- *          "description": "My Response",
- *          "subject": "My subject",
- *          "html": "Hi, nice to meet you"
- *          ...
- *     }
- */
-router.put('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.update);
-/**
- * @api {delete} /api/templates/:id Delete a template.
- *
- * @apiParam {Number} id Template's unique ID.
- *
- * @apiVersion 0.0.140
- * @apiName DeleteTemplate
- * @apiGroup Templates
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 204 No Content
- */
-router.delete('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.destroy);
-/**
- * @api {delete} /api/templates/ Bulk Delete templates.
- *
- * @apiParam (Query) {Number[]} ids Templates' unique ID array.
- *
- * @apiVersion 0.0.140
- * @apiName BulkDeleteTemplates
- * @apiGroup Templates
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 204 No Content
- */
-router.delete('/', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.bulkDestroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/template/template.controller.js b/server/api/template/template.controller.js
index 79f8d99..aad2ee9 100644
--- a/server/api/template/template.controller.js
+++ b/server/api/template/template.controller.js
@@ -1,108 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var util = require('util');
-var Util = require('../../config/util');
-
-var Template = require('../../models').Template;
-
-// Get list of agents
-exports.index = function(req, res, next) {
-  return Template
-    .findAndCountAll(Util.getQuery(req.query))
-    .then(function(result) {
-      res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single template
-exports.show = function(req, res) {
-  return Template
-    .findById(req.params.id)
-    .then(function(template) {
-      if (!template) {
-        return res.sendStatus(404);
-      }
-      return res.send(template);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new template in the DB.
-exports.create = function(req, res) {
-  return Template
-    .create(req.body)
-    .then(function(template) {
-      return res.status(201).send(template);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing template in the DB.
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  return Template
-    .findById(req.params.id)
-    .then(function(template) {
-      if (!template) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(template, req.body);
-      return updated
-        .save();
-    })
-    .then(function(template) {
-      return res.status(200).send(template);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a template from the DB.
-exports.destroy = function(req, res) {
-  return Template
-    .findById(req.params.id)
-    .then(function(template) {
-      if (!template) {
-        return res.sendStatus(404);
-      }
-      return template
-        .destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.bulkDestroy = function(req, res) {
-  return Template
-    .destroy({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/template/template.events.js b/server/api/template/template.events.js
index aa7bb8e..9191499 100644
--- a/server/api/template/template.events.js
+++ b/server/api/template/template.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const Template = require('../../models').Template;
-
-var TemplateEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-TemplateEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  Template.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    TemplateEvents.emit(event + ':' + doc._id, doc);
-    TemplateEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = TemplateEvents;
\ No newline at end of file
diff --git a/server/api/template/template.socket.js b/server/api/template/template.socket.js
index 1757712..2270b2a 100644
--- a/server/api/template/template.socket.js
+++ b/server/api/template/template.socket.js
@@ -1,32 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const TemplateEvents = require('./template.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('template:' + event, socket);
-
-    TemplateEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    TemplateEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/trigger/index.js b/server/api/trigger/index.js
index 05578f4..7b0a67b 100644
--- a/server/api/trigger/index.js
+++ b/server/api/trigger/index.js
@@ -1,261 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./trigger.controller');
-var auth = require('../../auth/auth.service');
-
-var router = express.Router();
-/**
- * @api {get} /api/triggers/ Get Triggers' list.
- *
- * @apiParam (Query) {Number} [offset] Pagination offset.
- * @apiParam (Query) {Number} [limit] Pagination limit.
- *
- * @apiVersion 0.0.140
- * @apiName GetTriggers
- * @apiGroup Triggers
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccess {Number} count Number of triggers.
- * @apiSuccess {Object[]} rows  Triggers' list.
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 200 OK
- *     {
- *       "count": 2,
- *       "rows": [{
- *          "id": 1
- *          "name": "trigger1"
- *          "description": "my trigger description"
- *           ...
- *       },{
- *          "id": 2
- *          "name": "newtrigger"
- *          "description": null
- *          ...
- *       },...]
- *     }
- */
-router.get('/', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.index);
-/**
- * @api {get} /api/triggers/:id Get Trigger's details.
- * @apiParam {Number} id Trigger's unique ID.
- * @apiVersion 0.0.140
- * @apiName GetTrigger
- * @apiGroup Triggers
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccess {Object} Trigger's details.
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 200 OK
- *    {
- *    "id":1,
- *    "All": [
- *      {
- *      "field": "queue",
- *      "operator": "equals",
- *      "value": "Support"
- *      },
- *      ...
- *    ],
- *    "Any": [
- *      {
- *      "field": "lastevent",
- *      "operator": "equals",
- *      "value": "complete"
- *      },
- *      {
- *      "field": "lastevent",
- *      "operator": "equals",
- *      "value": "abandoned"
- *      },
- *      ...
- *    ],
- *    "Actions": [
- *      {
- *      "action": "contactManager",
- *      "data1": "",
- *      "data2": "",
- *      "data3": "",
- *      "data4": "",
- *      "data5": ""
- *      },
- *      ...
- *    ],
- *    "channel": "voice",
- *    "status": false,
- *    "name": "my trigger",
- *    "description": "my demo trigger",
- *    ...
- *   }
- */
-router.get('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.show);
-/**
- * @api {post} /api/triggers/ Create a new trigger.
- * @apiParam (body) {String} name Trigger's name.
- * @apiParam (body) {String} [description] Trigger's description.
- * @apiParam (body) {Boolean} status Trigger's status (active/inactive).
- * @apiParam (body) {String} channel Trigger's channel.
- * @apiParam (body) {conditions[]} All Trigger's conditions, all of them must be met.
- * @apiParam (body) {conditions[]} Any Trigger's conditions, at least one of them must be met.
- * @apiParam (body) {actions[]} Actions Trigger's actions.
- *
- * @apiParam (Conditions) {string} field Condition field.
- * @apiParam (Conditions) {string} operator Condition operator, to compare field and value.
- * @apiParam (Conditions) {string} value The value to compare the condition field with.
- *
- * @apiParam (Actions) {string} action Trigger action.
- * @apiParam (Actions) {string} data1 Action data.
- * @apiParam (Actions) {string} data2 Action data.
- * @apiParam (Actions) {string} data3 Action data.
- * @apiParam (Actions) {string} data4 Action data.
- * @apiParam (Actions) {string} data5 Action data.
- *
- * @apiVersion 0.0.140
- * @apiName CreateTrigger
- * @apiGroup Triggers
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 201 Created
- *    {
- *    "id":1,
- *    "All": [
- *      {
- *      "field": "queue",
- *      "operator": "equals",
- *      "value": "Support"
- *      },
- *      ...
- *    ],
- *    "Any": [
- *      {
- *      "field": "lastevent",
- *      "operator": "equals",
- *      "value": "complete"
- *      },
- *      {
- *      "field": "lastevent",
- *      "operator": "equals",
- *      "value": "abandoned"
- *      },
- *      ...
- *    ],
- *    "Actions": [
- *      {
- *      "action": "contactManager",
- *      "data1": "",
- *      "data2": "",
- *      "data3": "",
- *      "data4": "",
- *      "data5": ""
- *      },
- *      ...
- *    ],
- *    "channel": "voice",
- *    "status": false,
- *    "name": "my trigger",
- *    "description": "my demo trigger",
- *    ...
- *   }
- */
-router.post('/', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.create);
-/**
- * @api {put} /api/triggers/:id Update an existing trigger.
- * @apiParam {Number} id Trigger's unique ID.
- *
- * @apiParam (body) {String} name Trigger's name.
- * @apiParam (body) {String} [description] Trigger's description.
- * @apiParam (body) {Boolean} status Trigger's status (active/inactive).
- * @apiParam (body) {String} channel Trigger's channel.
- * @apiParam (body) {conditions[]} All Trigger's conditions, all of them must be met.
- * @apiParam (body) {conditions[]} Any Trigger's conditions, at least one of them must be met.
- * @apiParam (body) {actions[]} Actions Trigger's actions.
- *
- * @apiParam (Conditions) {string} field Condition field.
- * @apiParam (Conditions) {string} operator Condition operator, to compare field and value.
- * @apiParam (Conditions) {string} value The value to compare the condition field with.
- *
- * @apiParam (Actions) {string} action Trigger action.
- * @apiParam (Actions) {string} data1 Action data.
- * @apiParam (Actions) {string} data2 Action data.
- * @apiParam (Actions) {string} data3 Action data.
- * @apiParam (Actions) {string} data4 Action data.
- * @apiParam (Actions) {string} data5 Action data.
- *
- * @apiVersion 0.0.140
- * @apiName UpdateTrigger
- * @apiGroup Triggers
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 200 OK
- */
-router.put('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.update);
-/**
- * @api {delete} /api/triggers/:id Delete a trigger.
- *
- * @apiParam {Number} id Trigger's unique ID.
- *
- * @apiVersion 0.0.140
- * @apiName DeleteTrigger
- * @apiGroup Triggers
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 204 No Content
- */
-router.delete('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.destroy);
-/**
- * @api {delete} /api/triggers/ Bulk Delete triggers.
- *
- * @apiParam (Query) {Number[]} ids Triggers' unique ID array.
- *
- * @apiVersion 0.0.140
- * @apiName BulkDeleteTriggers
- * @apiGroup Triggers
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 204 No Content
- */
-router.delete('/', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.bulkDestroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/trigger/trigger.controller.js b/server/api/trigger/trigger.controller.js
index f3a4806..9f161cc 100644
--- a/server/api/trigger/trigger.controller.js
+++ b/server/api/trigger/trigger.controller.js
@@ -1,205 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var util = require('util');
-var Util = require('../../config/util');
-var sequelize = require('../../models').sequelize;
-
-var Trigger = require('../../models').Trigger;
-var ToolsCondition = require('../../models').ToolsCondition;
-var ToolsAction = require('../../models').ToolsAction;
-
-// Get list of agents
-exports.index = function(req, res, next) {
-  return Trigger
-    .scope('all')
-    .findAndCountAll(_.merge(Util.getQuery(req.query), {
-      distinct: true
-    }))
-    .then(function(result) {
-      return res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single Trigger
-exports.show = function(req, res) {
-  return Trigger
-    .scope('all')
-    .findById(req.params.id)
-    .then(function(trigger) {
-      if (!trigger) {
-        return res.sendStatus(404);
-      }
-      return res.status(200).send(trigger);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new Trigger in the DB.
-exports.create = function(req, res) {
-  return Trigger
-    .create(req.body, {
-      include: [{
-        model: ToolsCondition,
-        as: 'All'
-      }, {
-        model: ToolsCondition,
-        as: 'Any'
-      }, {
-        model: ToolsAction,
-        as: 'Actions'
-      }],
-      newTrigger: req.body
-    })
-    .then(function(trigger) {
-      return res.status(201).send(trigger);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing Trigger in the DB.
-exports.update = function(req, res, next) {
-  var _trigger;
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  return sequelize.transaction(function(t) {
-      return Trigger
-        .findById(req.params.id)
-        .then(function(trigger) {
-          _trigger = trigger;
-          if (req.body.Any) {
-            return ToolsCondition
-              .destroy({
-                where: {
-                  TriggerAnyId: req.params.id
-                },
-                transaction: t
-              });
-          }
-          return;
-        })
-        .then(function() {
-          if (req.body.Any && Array.isArray(req.body.Any) && req.body.Any.length) {
-            _.forEach(req.body.Any, function(elem) {
-              elem.TriggerAnyId = req.params.id;
-            });
-            return ToolsCondition
-              .bulkCreate(req.body.Any, {
-                transaction: t
-              });
-          }
-          return;
-        })
-        .then(function() {
-          if (req.body.All) {
-            return ToolsCondition
-              .destroy({
-                where: {
-                  TriggerAllId: req.params.id
-                },
-                transaction: t
-              });
-          }
-          return;
-        })
-        .then(function() {
-          if (req.body.All && Array.isArray(req.body.All) && req.body.All.length) {
-            _.forEach(req.body.All, function(elem) {
-              elem.TriggerAllId = req.params.id;
-            });
-            return ToolsCondition
-              .bulkCreate(req.body.All, {
-                transaction: t
-              });
-          }
-          return;
-        })
-        .then(function() {
-          if (req.body.Actions) {
-            return ToolsAction
-              .destroy({
-                where: {
-                  TriggerId: req.params.id
-                },
-                transaction: t
-              });
-          }
-          return;
-        })
-        .then(function() {
-          if (req.body.Actions && Array.isArray(req.body.Actions) && req.body.Actions.length) {
-            _.forEach(req.body.Actions, function(elem) {
-              elem.TriggerId = req.params.id;
-            });
-            return ToolsAction
-              .bulkCreate(req.body.Actions, {
-                transaction: t
-              });
-          }
-          return;
-        })
-        .then(function() {
-          var updated = _.merge(_trigger, req.body);
-          return updated
-            .save({
-              transaction: t
-            });
-        });
-    })
-    .then(function() {
-      return res.sendStatus(200);
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-// Deletes a Trigger from the DB.
-exports.destroy = function(req, res) {
-  return Trigger
-    .findById(req.params.id)
-    .then(function(Trigger) {
-      if (!Trigger) {
-        return res.sendStatus(404);
-      }
-      Trigger.destroy()
-        .then(function() {
-          return res.sendStatus(204);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.bulkDestroy = function(req, res) {
-  return Trigger
-    .destroy({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/trigger/trigger.events.js b/server/api/trigger/trigger.events.js
index 5978c45..a4fa103 100644
--- a/server/api/trigger/trigger.events.js
+++ b/server/api/trigger/trigger.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const Trigger = require('../../models').Trigger;
-
-var TriggerEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-TriggerEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  Trigger.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    TriggerEvents.emit(event + ':' + doc._id, doc);
-    TriggerEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = TriggerEvents;
\ No newline at end of file
diff --git a/server/api/trigger/trigger.socket.js b/server/api/trigger/trigger.socket.js
index e83aa13..4ca48d4 100644
--- a/server/api/trigger/trigger.socket.js
+++ b/server/api/trigger/trigger.socket.js
@@ -1,32 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const TriggerEvents = require('./trigger.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('trigger:' + event, socket);
-
-    TriggerEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    TriggerEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/trunk/index.js b/server/api/trunk/index.js
index fda6e40..15c1843 100644
--- a/server/api/trunk/index.js
+++ b/server/api/trunk/index.js
@@ -1,226 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./trunk.controller');
-var config = require('../../config/environment');
-var auth = require('../../auth/auth.service');
-
-var router = express.Router();
-
-/**
- * @api {get} /api/trunks/ Get trunks' list.
- *
- * @apiParam (Query) {Number} [offset] Pagination offset.
- * @apiParam (Query) {Number} [limit] Pagination limit.
- *
- * @apiVersion 0.0.140
- * @apiName GetTrunks
- * @apiGroup Trunks
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccess {Number} count Number of trunks.
- * @apiSuccess {Object[]} rows  Get trunks list.
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 200 OK
- *     {
- *       "count": 1,
- *       "rows": [{
- *          "name": "DemoTrunk"
- *          "type": "friend"
- *          "context": "from-sip"
- *          "callingpres": "ALLOWED_NOT_SCREENED"
- *          "permit": "0.0.0.0/0.0.0.0"
- *          "deny": "0.0.0.0/0.0.0.0"
- *          ...
- *       }]
- *     }
- */
-router.get('/', auth.isAuthenticated(), auth.hasModule([13, 7, 10], ['admin']), controller.index);
-
-/**
- * @api {get} /api/trunks/:id Get trunk's details.
- * @apiParam {Number} id Trunk unique ID.
- * @apiVersion 0.0.140
- * @apiName GetTrunk
- * @apiGroup Trunks
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 200 OK
- *     {
- *        "name": "DemoTrunk"
- *        "type": "friend"
- *        "context": "from-sip"
- *        "callingpres": "ALLOWED_NOT_SCREENED"
- *        "permit": "0.0.0.0/0.0.0.0"
- *        "deny": "0.0.0.0/0.0.0.0"
- *        ...
- *     }
- */
-router.get('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.show);
-
-/**
- * @api {post} /api/trunks/ Create trunk.
- *
- * @apiParam (Body) {String} name                                                                   Trunk name.
- * @apiParam (Body) {String="friend", "user", "peer"} [type="friend"]                               Trunk type.
- * @apiParam (Body) {String} [context="from-sip"]                                                   Trunk context.
- * @apiParam (Body) {String="ALLOWED_NOT_SCREENED", "ALLOWED_PASSED_SCREEN", "ALLOWED_FAILED_SCREEN", "ALLOWED", "PROHIB_NOT_SCREENED", "PROHIB_PASSED_SCREEN", "PROHIB_FAILED_SCREEN", "PROHIB"} [callinprogress="ALLOWED_NOT_SCREENED"]   Trunk context.
- * @apiParam (Body) {String} [permit]                                                               Trunk permit.
- * @apiParam (Body) {String} [deny]                                                                 Trunk deny.
- * @apiParam (Body) {String} secret                                                                 Trunk secret.
- * @apiParam (Body) {String="rfc2833", "info", "shortinfo", "inband", "auto"} [dtmfmode="rfc2833"]  Trunk internal number.
- * @apiParam (Body) {String="tcp", "udp", "tcp,udp"} [transport="udp"]                              Trunk SIP transport.
- * @apiParam (Body) {String="alaw", "ulaw", "gsm"} [allow="alaw;ulaw;gsm"]                          Trunk SIP codecs.
- * @apiParam (Body) {String="yes", "no", "nonat", "update", "outgoing"} [directmedia="no"]          Trunk directmedia.
- * @apiParam (Body) {String="yes", "no"} [directrtpsetup="no"]                                      Trunk directrtpsetup.
- * @apiParam (Body) {String} [nat="force_rport,comedia"]                                            Trunk mobile phone.
- * @apiParam (Body) {String} [disallow="all"]                                                       Trunk address.
- * @apiParam (Body) {String} [allow="alaw;ulaw;gsm"]                                                Trunk allow codecs.
- * @apiParam (Body) {String} [callerid='"" <>']                                                     Trunk callerid.
- * @apiParam (Body) {String="yes"} [callcounter="yes, no"]                                          Trunk callcounter.
- * @apiParam (Body) {String="no"} [videosupport="yes, no"]                                          Trunk video support.
- * @apiParam (Body) {String="uas"} [session_refresher="uas, uac"]                                   Trunk session refresher.
- * @apiParam (Body) {String} [host="dynamic"]                                                       Trunk host.
- * @apiParam (Body) {String="yes"} [qualify="yes,no"]                                               Trunk qualify.
- * @apiParam (Body) {String} [insecure="port,invite"]                                               Trunk insicure.
- * @apiParam (Body) {String="no"} [sendrpid="yes,no"]                                               Trunk sendrpid.
- * @apiParam (Body) {String="no"} [encryption="yes,no"]                                             Trunk encryption.
- * @apiParam (Body) {String="no"} [usereqphone="yes,no"]                                            Trunk usereqphone.
- * @apiParam (Body) {String="no"} [canreinvite="yes,no"]                                            Trunk can reinvite.
- *
- * @apiVersion 0.0.140
- * @apiName CreateTrunk
- * @apiGroup Trunks
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 201 Created
- *     {
- *        "id": 1
- *        "name": "john.doe"
- *        "email": "[email-masked]"
- *        "internal": 1001
- *        "fullname": "John Doe"
- *        ...
- *     }
- */
-router.post('/', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.create);
-
-/**
- * @api {delete} /api/trunks/:id Update trunk's details.
- *
- * @apiParam (Params) {Number} id Trunk unique ID.
- * @apiParam (Body) {String} name                                                                   Trunk name.
- * @apiParam (Body) {String="friend", "user", "peer"} [type="friend"]                               Trunk type.
- * @apiParam (Body) {String} [context="from-sip"]                                                   Trunk context.
- * @apiParam (Body) {String="ALLOWED_NOT_SCREENED", "ALLOWED_PASSED_SCREEN", "ALLOWED_FAILED_SCREEN", "ALLOWED", "PROHIB_NOT_SCREENED", "PROHIB_PASSED_SCREEN", "PROHIB_FAILED_SCREEN", "PROHIB"} [callinprogress="ALLOWED_NOT_SCREENED"]   Trunk context.
- * @apiParam (Body) {String} [permit]                                                               Trunk permit.
- * @apiParam (Body) {String} [deny]                                                                 Trunk deny.
- * @apiParam (Body) {String} secret                                                                 Trunk secret.
- * @apiParam (Body) {String="rfc2833", "info", "shortinfo", "inband", "auto"} [dtmfmode="rfc2833"]  Trunk internal number.
- * @apiParam (Body) {String="tcp", "udp", "tcp,udp"} [transport="udp"]                              Trunk SIP transport.
- * @apiParam (Body) {String="alaw", "ulaw", "gsm"} [allow="alaw;ulaw;gsm"]                          Trunk SIP codecs.
- * @apiParam (Body) {String="yes", "no", "nonat", "update", "outgoing"} [directmedia="no"]          Trunk directmedia.
- * @apiParam (Body) {String="yes", "no"} [directrtpsetup="no"]                                      Trunk directrtpsetup.
- * @apiParam (Body) {String} [nat="force_rport,comedia"]                                            Trunk mobile phone.
- * @apiParam (Body) {String} [disallow="all"]                                                       Trunk address.
- * @apiParam (Body) {String} [allow="alaw;ulaw;gsm"]                                                Trunk allow codecs.
- * @apiParam (Body) {String} [callerid='"" <>']                                                     Trunk callerid.
- * @apiParam (Body) {String="yes"} [callcounter="yes, no"]                                          Trunk callcounter.
- * @apiParam (Body) {String="no"} [videosupport="yes, no"]                                          Trunk video support.
- * @apiParam (Body) {String="uas"} [session_refresher="uas, uac"]                                   Trunk session refresher.
- * @apiParam (Body) {String} [host="dynamic"]                                                       Trunk host.
- * @apiParam (Body) {String="yes"} [qualify="yes,no"]                                               Trunk qualify.
- * @apiParam (Body) {String} [insecure="port,invite"]                                               Trunk insicure.
- * @apiParam (Body) {String="no"} [sendrpid="yes,no"]                                               Trunk sendrpid.
- * @apiParam (Body) {String="no"} [encryption="yes,no"]                                             Trunk encryption.
- * @apiParam (Body) {String="no"} [usereqphone="yes,no"]                                            Trunk usereqphone.
- * @apiParam (Body) {String="no"} [canreinvite="yes,no"]                                            Trunk can reinvite.
- *
- * @apiVersion 0.0.140
- * @apiName UpdateTrunk
- * @apiGroup Trunks
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 200 OK
- *     {
- *        "id": 1
- *        "name": "john.doe"
- *        "email": "[email-masked]"
- *        "internal": 1001
- *        "fullname": "John Doe"
- *        ...
- *     }
- */
-router.put('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.update);
-
-/**
- * @api {delete} /api/trunks/ Bulk Delete trunks.
- *
- * @apiParam (Query) {Number[]} ids Trunks unique ID array.
- *
- * @apiVersion 0.0.140
- * @apiName BulkDeleteTrunks
- * @apiGroup Trunks
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 204 No Content
- */
-router.delete('/', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.bulkDestroy);
-
-/**
- * @api {delete} /api/trunks/:id Delete a trunk.
- *
- * @apiParam {Number} id Trunk unique ID.
- *
- * @apiVersion 0.0.140
- * @apiName DeleteTrunk
- * @apiGroup Trunks
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 204 No Content
- */
-router.delete('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/trunk/trunk.controller.js b/server/api/trunk/trunk.controller.js
index 9ee3289..a0e3c48 100644
--- a/server/api/trunk/trunk.controller.js
+++ b/server/api/trunk/trunk.controller.js
@@ -1,111 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var Trunk = require('../../models').Trunk;
-var VoiceExtension = require('../../models').VoiceExtension;
-var sequelize = require('../../models').sequelize;
-var util = require('util');
-var Util = require('../../config/util');
-
-// Get list of agents
-exports.index = function(req, res, next) {
-  return Trunk
-    .findAndCountAll(Util.getQuery(req.query))
-    .then(function(result) {
-      res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single trunk
-exports.show = function(req, res) {
-  return Trunk
-    .findById(req.params.id)
-    .then(function(trunk) {
-      if (!trunk) {
-        return res.sendStatus(404);
-      }
-      return res.send(trunk);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new trunk in the DB.
-exports.create = function(req, res) {
-  return Trunk
-    .create(req.body)
-    .then(function(trunk) {
-      return res.status(201).send(trunk);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-
-  return Trunk
-    .findById(req.params.id)
-    .then(function(trunk) {
-      if (!trunk) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(trunk, req.body);
-      return updated
-        .save();
-    })
-    .then(function(trunk) {
-      return res.status(200).send(trunk);
-    })
-    .catch(function(err) {
-      console.log('trunk update error', err);
-      return handleError(res, err);
-    });
-};
-
-// Deletes a trunk from the DB.
-exports.destroy = function(req, res) {
-  return Trunk
-    .findById(req.params.id)
-    .then(function(trunk) {
-      if (!trunk) {
-        return res.sendStatus(404);
-      }
-      return trunk
-        .destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes multiple trunk from the DB.
-exports.bulkDestroy = function(req, res) {
-  return Trunk
-    .destroy({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/trunk/trunk.events.js b/server/api/trunk/trunk.events.js
index 5ceb1a1..59785f9 100644
--- a/server/api/trunk/trunk.events.js
+++ b/server/api/trunk/trunk.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const Trunk = require('../../models').Trunk;
-
-var TrunkEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-TrunkEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'update',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  Trunk.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    TrunkEvents.emit(event + ':' + doc._id, doc);
-    TrunkEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = TrunkEvents;
\ No newline at end of file
diff --git a/server/api/trunk/trunk.socket.js b/server/api/trunk/trunk.socket.js
index 5dda5a9..6b7d596 100644
--- a/server/api/trunk/trunk.socket.js
+++ b/server/api/trunk/trunk.socket.js
@@ -1,47 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const TrunkEvents = require('./trunk.events');
-
-// Model events to emit
-var events = ['save', 'update', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('trunk:' + event, socket);
-
-    TrunkEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    switch (event) {
-      case 'trunk:save':
-        socket.emit(event, doc);
-        break;
-      case 'trunk:update':
-        if (socket.role !== 'trunk' && (doc.changed('status') || doc.changed('peerstatus'))) {
-          socket.emit(event, doc);
-        }
-        break;
-      case 'trunk:remove':
-        socket.emit(event, doc);
-        break;
-
-      default:
-
-    }
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    TrunkEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/update/index.js b/server/api/update/index.js
index 6c97808..b740ee3 100644
--- a/server/api/update/index.js
+++ b/server/api/update/index.js
@@ -1,13 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./update.controller');
-var auth = require('../../auth/auth.service');
-var license = require('../../config/license/license.service');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), auth.hasRole('admin'), license.hasUpdate(), controller.index);
-router.get('/pull', auth.isAuthenticated(), auth.hasRole('admin'), license.hasUpdate(), controller.pull);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/update/update.controller.js b/server/api/update/update.controller.js
index c6da9ad..0853f94 100644
--- a/server/api/update/update.controller.js
+++ b/server/api/update/update.controller.js
@@ -1,48 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var path = require('path');
-var moment = require('moment');
-var config = require('../../config/environment');
-
-var Git = require('simple-git')(path.join(config.root));
-
-// Get list of updates
-exports.index = function(req, res) {
-  return Git
-    .log(function(err, logs) {
-      if (err) {
-        return handleError(res, err);
-      }
-
-      var rows = [];
-      for (var i = 0; i < 10 && i < logs.all.length; i++) {
-        rows.push({
-          version: logs.all[i].message.split('|')[1] || 'unknown',
-          message: logs.all[i].message.split('|')[0],
-          createdAt: moment(logs.all[i].date).format("YYYY-MM-DD HH:mm:ss")
-        });
-      }
-
-      return res.status(200).send({
-        rows: rows,
-        count: rows.length
-      });
-    });
-};
-
-// Get a single update
-exports.pull = function(req, res) {
-  Git
-    .pull('origin', 'master', function(err, data) {
-      if (err) {
-        console.error('err', err);
-      }
-    });
-
-  return res.sendStatus(200).send();
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/user/index.js b/server/api/user/index.js
index 86e16fb..02bcea9 100644
--- a/server/api/user/index.js
+++ b/server/api/user/index.js
@@ -1,261 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./user.controller');
-var config = require('../../config/environment');
-var auth = require('../../auth/auth.service');
-var license = require('../../config/license/license.service');
-
-var router = express.Router();
-
-/**
- * @api {get} /api/users/ Get users' profile.
- *
- * @api {get} /api/agents/ Get users' profile.
- *
- * @apiParam (Query) {Number} [offset] Pagination offset.
- * @apiParam (Query) {Number} [limit] Pagination limit.
- *
- * @apiVersion 0.0.140
- * @apiName GetUsers
- * @apiGroup Users
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccess {Number} count Number of users.
- * @apiSuccess {Object[]} rows  Get list of user profiles.
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 200 OK
- *     {
- *       "count": 1,
- *       "rows": [{
- *          "id": 1
- *          "name": "john.doe"
- *          "email": "[email-masked]"
- *          "internal": 1001
- *          "fullname": "John Doe"
- *          ...
- *       }]
- *     }
- */
-router.get('/', auth.isAuthenticated(), auth.hasModule([7], ['admin', 'user', 'agent']), controller.index);
-router.get('/describe', auth.isAuthenticated(), auth.hasModule([17], ['admin']), controller.describe);
-
-router.get('/me', auth.isAuthenticated(), controller.me);
-router.get('/all', auth.isAuthenticated(), controller.getUsers);
-router.get('/avatar/:filename', controller.getAvatar);
-/**
- * @api {get} /api/users/:id Get user's profile.
- * @apiParam {Number} id User's unique ID.
- * @apiVersion 0.0.140
- * @apiName GetUser
- * @apiGroup Users
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 200 OK
- *     {
- *        "id": 1
- *        "name": "john.doe"
- *        "email": "[email-masked]"
- *        "internal": 1001
- *        "fullname": "John Doe"
- *        ...
- *     }
- */
-router.get('/:id', auth.isAuthenticated(), auth.hasModule([], ['admin', 'user']), controller.show);
-router.get('/:id/avatar', auth.isAuthenticated(), controller.getAvatarById);
-router.get('/:id/allowed/modules', auth.isAuthenticated(), auth.hasRole('admin'), controller.getAllowedModules);
-router.get('/:id/allowed/:channel/queues', auth.isAuthenticated(), auth.hasRole('admin'), controller.getAllowedQueues);
-
-/**
- * @api {post} /api/users/ Create user's profile.
- * @apiParam (Body) {String} name                                        User's username.
- * @apiParam (Body) {String} fullname                                    User's fullname.
- * @apiParam (Body) {String} email                                       User's email.
- * @apiParam (Body) {String} context="from-sip"                          User's SIP context.
- * @apiParam (Body) {String} password                                    User's password.
- * @apiParam (Body) {Number} internal                                    User's internal number.
- * @apiParam (Body) {String="tcp", "udp", "tcp,udp"} transport="udp"     User's SIP transport.
- * @apiParam (Body) {String="alaw", "ulaw", "gsm"} allow="alaw;ulaw;gsm" User's SIP codecs.
- * @apiParam (Body) {Number} internal                                    User's internal number.
- * @apiParam (Body) {String} [phone]                                     User's phone.
- * @apiParam (Body) {String} [mobile]                                    User's mobile phone.
- * @apiParam (Body) {String} [address]                                   User's address.
- * @apiParam (Body) {String} [zipcode]                                   User's zipcode.
- * @apiParam (Body) {String} [city]                                      User's city.
- * @apiParam (Body) {String} [country]                                   User's country.
- *
- * @apiVersion 0.0.140
- * @apiName CreateUser
- * @apiGroup Users
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 201 Created
- *     {
- *        "id": 1
- *        "name": "john.doe"
- *        "email": "[email-masked]"
- *        "internal": 1001
- *        "fullname": "John Doe"
- *        ...
- *     }
- */
-router.post('/', auth.isAuthenticated(), license.isValidDate(), license.isUsersLimit(), auth.hasRole('admin'), controller.create);
-router.post('/:id/allowed/modules', auth.isAuthenticated(), auth.hasRole('admin'), controller.setAllowedModules);
-router.post('/:id/allowed/:channel/queues', auth.isAuthenticated(), auth.hasRole('admin'), controller.addAllowedQueues);
-/**
- * @api {put} /api/users/password Update user's password.
- *
- * @apiParam (Body) {String} oldPassword Old user's password.
- * @apiParam (Body) {String} newPassword New user's password.
- *
- * @apiVersion 0.0.140
- * @apiName UpdateUserPassword
- * @apiGroup Users
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 200 OK
- */
-router.put('/password', auth.isAuthenticated(), controller.changePassword);
-/**
- * @api {update} /api/users/:id Update user's profile.
- *
- * @apiParam (Params) {Number} id User's unique ID.
- * @apiParam (Body) {String} fullname                                    User's fullname.
- * @apiParam (Body) {String} email                                       User's email.
- * @apiParam (Body) {String} context="from-sip"                          User's SIP context.
- * @apiParam (Body) {String} password                                    User's password.
- * @apiParam (Body) {Number} internal                                    User's internal number.
- * @apiParam (Body) {String="tcp", "udp", "tcp,udp"} transport="udp"     User's SIP transport.
- * @apiParam (Body) {String="alaw", "ulaw", "gsm"} allow="alaw;ulaw;gsm" User's SIP codecs.
- * @apiParam (Body) {Number} internal                                    User's internal number.
- * @apiParam (Body) {String} [phone]                                     User's phone.
- * @apiParam (Body) {String} [mobile]                                    User's mobile phone.
- * @apiParam (Body) {String} [address]                                   User's address.
- * @apiParam (Body) {String} [zipcode]                                   User's zipcode.
- * @apiParam (Body) {String} [city]                                      User's city.
- * @apiParam (Body) {String} [country]                                   User's country.
- *
- * @apiVersion 0.0.140
- * @apiName UpdateUser
- * @apiGroup Users
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 200 OK
- *     {
- *        "id": 1
- *        "name": "john.doe"
- *        "email": "[email-masked]"
- *        "internal": 1001
- *        "fullname": "John Doe"
- *        ...
- *     }
- */
-
-router.put('/:id', auth.isAuthenticated(), auth.hasModule([], ['admin', 'user', 'agent']), controller.update);
-
-/**
- * @api {delete} /api/users/ Bulk Delete users' profile.
- *
- * @apiParam (Query) {Number[]} ids Users' unique ID array.
- *
- * @apiVersion 0.0.140
- * @apiName BulkDeleteUsers
- * @apiGroup Users
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 204 No Content
- */
-router.delete('/', auth.isAuthenticated(), auth.hasRole('admin'), controller.bulkDestroy);
-
-/**
- * @api {delete} /api/users/:id Delete user's profile.
- *
- * @apiParam {Number} id User's unique ID.
- *
- * @apiVersion 0.0.140
- * @apiName DeleteUser
- * @apiGroup Users
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 204 No Content
- */
-router.delete('/:id', auth.isAuthenticated(), auth.hasRole('admin'), controller.destroy);
-router.delete('/:id/allowed/:channel/queues', auth.isAuthenticated(), auth.hasRole('admin'), controller.removeAllowedQueues);
-
-
-/**
- * @api {put} /api/users/:id/password Reset user's password.
- *
- * @apiParam (Params) {Number} id User's unique ID.
- * @apiParam (Body) {String} newPassword New user's password.
- *
- * @apiPermission admin
- *
- * @apiVersion 0.0.140
- * @apiName ResetUserPassword
- * @apiGroup Users
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 200 OK
- */
-router.put('/:id/password', auth.isAuthenticated(), auth.hasRole('admin'), controller.resetPassword);
-router.post('/validate/:field', auth.isAuthenticated(), auth.hasRole('admin'), controller.userValidation);
-router.post('/:id/avatar', auth.isAuthenticated(), auth.hasRole('admin'), controller.changeAvatar);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/user/user.controller.js b/server/api/user/user.controller.js
index 2c37d73..4d3de22 100644
--- a/server/api/user/user.controller.js
+++ b/server/api/user/user.controller.js
@@ -1,734 +1 @@
-'use strict';
-
-var User = require('../../models').User;
-var Module = require('../../models').Module;
-var Setting = require('../../models').Setting;
-var VoiceQueue = require('../../models').VoiceQueue;
-var ChatQueue = require('../../models').ChatQueue;
-var MailQueue = require('../../models').MailQueue;
-var FaxQueue = require('../../models').FaxQueue;
-var SmsQueue = require('../../models').SmsQueue;
-var sequelize = require('../../models').sequelize;
-
-var config = require('../../config/environment');
-var Util = require('../../config/util');
-
-var passport = require('passport');
-var moment = require('moment');
-var jwt = require('jsonwebtoken');
-var uploadFile = require('upload-file');
-var path = require('path');
-var fs = require('fs');
-var _ = require('lodash');
-var util = require('util');
-var sr = require('simple-random');
-
-/**
- * Get list of admin/user
- */
-exports.index = function(req, res, next) {
-  return User
-    .scope('user')
-    .findAndCountAll(Util.getQuery(req.query))
-    .then(function(result) {
-      res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get list of fields
-exports.describe = function(req, res) {
-  return User
-    .describe()
-    .then(function(fields) {
-      return res.status(200).send(fields);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
-
-/**
- * Get list of admin/user/agent/telephone
- */
-exports.getUsers = function(req, res, next) {
-  return User
-    .findAll()
-    .then(function(users) {
-      return res.status(200).send({
-        rows: users
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-/**
- * Get list of allowed modules
- */
-exports.getAllowedModules = function(req, res, next) {
-  return User
-    .findById(req.params.id)
-    .then(function(user) {
-      if (!user) {
-        return res.sendStatus(404);
-      }
-
-      return user.getModules();
-    })
-    .then(function(modules) {
-      return res.status(200).send(modules);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-/**
- * Creates a new user
- */
-exports.create = function(req, res, next) {
-
-  // Set default role
-  req.body.role = req.body.role || 'user';
-  var password = String(req.body.password);
-  if (!(/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[~!@#$%^&\-_=+\[\{\]\}.])[0-9a-zA-Z~!@#$%^&\-_=+\[\{\]\}.]{8,}$/.test(password))) {
-    throw new Error('Wrong password format!');
-  }
-
-  return sequelize.transaction(function(t) {
-      return User
-        .create(req.body, {
-          transaction: t
-        })
-        .then(function(user) {
-          return res.status(201).send(user);
-        })
-    })
-    .catch(sequelize.UniqueConstraintError, function(err) {
-      return Util.errorManager.handleUniqueConstraintError(res, err);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.setAllowedModules = function(req, res, next) {
-  return sequelize.transaction(function(t) {
-      return User
-        .findById(req.params.id)
-        .then(function(user) {
-          if (!user) {
-            return res.sendStatus(404);
-          }
-          return user.setModules(req.body.modules);
-        })
-        .then(function() {
-          return res.sendStatus(201);
-        })
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-/**
- * Get a single user
- */
-exports.show = function(req, res, next) {
-  return User
-    .findById(req.params.id)
-    .then(function(user) {
-      if (!user) {
-        return res.sendStatus(404);
-      }
-
-      return res.status(200).send(user);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-/**
- * Deletes a user
- */
-exports.destroy = function(req, res, next) {
-  var userId = req.params.id;
-  var _user;
-
-  return User
-    .findById(userId)
-    .then(function(user) {
-      _user = user;
-      if (!user) {
-        return res.sendStatus(404);
-      }
-      return user
-        .destroy();
-    })
-    .then(function(user) {
-      return res.status(200).send(user);
-    })
-    .catch(sequelize.ForeignKeyConstraintError, function(err) {
-      return Util.errorManager.handleForeignKeyConstraintError(res, 'user', _user.name, err);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a user from the DB.
-exports.bulkDestroy = function(req, res) {
-  return User
-    .destroy({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-/**
- * Change a user password
- */
-exports.changePassword = function(req, res, next) {
-  var userId = req.user.id;
-  var oldPass = String(req.body.oldPassword);
-  var newPass = String(req.body.newPassword);
-  if (!(/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[~!@#$%^&\-_=+\[\{\]\}.])[0-9a-zA-Z~!@#$%^&\-_=+\[\{\]\}.]{8,}$/.test(newPass))) {
-    throw new Error('Wrong password format!');
-  }
-  return sequelize.transaction(function(t) {
-      return User
-        .findById(userId)
-        .then(function(user) {
-          if (!user.authenticate(oldPass)) {
-            return res.sendStatus(403);
-          } else {
-            user.password = newPass;
-            return user.save({
-              transaction: t
-            }).then(function() {
-              return res.sendStatus(200);
-            })
-          }
-        })
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-/**
- * Change a user password by admin
- */
-exports.resetPassword = function(req, res, next) {
-  var _setting;
-
-  var userId = req.params.id;
-  var newPass = String(req.body.newPassword);
-
-  return sequelize.transaction(function(t) {
-      return Setting
-        .findById(1)
-        .then(function(setting) {
-          _setting = setting;
-
-          return User
-            .findById(userId);
-        })
-        .then(function(user) {
-          var regEx = _setting.securePassword ? /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[~!@#$%^&\-_=+\[\{\]\}.])[0-9a-zA-Z~!@#$%^&\-_=+\[\{\]\}.]{8,}$/ : /^[a-zA-Z0-9]{6,}$/;
-
-          if (!regEx.test(newPass)) {
-            throw new Error('Invalid password pattern');
-          }
-
-          user.password = newPass;
-          return user
-            .save({
-              transaction: t
-            });
-        })
-    })
-    .then(function() {
-      return res.sendStatus(200);
-    })
-    .catch(function(err) {
-      console.error(err);
-      return handleError(res, err);
-    });
-};
-
-/**
- * Change the avatar of the user
- */
-exports.changeAvatar = function(req, res, next) {
-
-  var upload = new uploadFile({
-    dest: path.join(config.root, 'server', 'files', 'images'),
-    maxNumberOfFiles: 1,
-    minNumberOfFiles: 0,
-    acceptFileTypes: /(\.|\/)(jpeg|png)$/i,
-    rename: function(name, file) {
-      return sr() + path.extname(file.filename);
-    },
-    messages: {
-      maxNumberOfFiles: "Max number of files upload exceeded",
-      acceptFileTypes: "Only jpeg and png format accepted",
-      invalidRequest: "Invalid request"
-    }
-  });
-
-  upload.on('end', function(fields, files) {
-    if (!files.file.filename) {
-      return res.status(500).send(upload);
-    }
-    return sequelize.transaction(function(t) {
-        return User
-          .findById(req.params.id)
-          .then(function(user) {
-            if (!user) {
-              return res.sendStatus(404);
-            }
-
-            return user
-              .update({
-                userpic: files.file.filename
-              }, {
-                transaction: t
-              });
-          })
-          .then(function(user) {
-            return res.status(200).send(user);
-          })
-      })
-      .catch(function(err) {
-        return handleError(res, err);
-      });
-  });
-
-  upload.on('error', function(err) {
-    console.log('********** Upload error :', err)
-    return handleError(res, err);
-  });
-
-  upload.parse(req);
-};
-
-
-/**
- * Get my info
- */
-exports.me = function(req, res, next) {
-  var userId = req.user.id;
-
-  return User
-    .findOne({
-      where: {
-        id: userId
-      },
-      attributes: ['id', 'fullname', 'name', 'email', 'role', 'userpic', 'lastLoginAt', 'voicePause',
-        'mailPause',
-        'chatPause',
-        'faxPause',
-        'smsPause',
-        'openchannelPause',
-        'lastPauseAt',
-        'pauseType',
-        'phoneBarRemoteControl',
-        'phoneBarRemoteControlPort'
-      ],
-      include: [Module, {
-        model: VoiceQueue,
-        as: 'PVoiceQueues'
-      }, {
-        model: ChatQueue,
-        as: 'PChatQueues'
-      }, {
-        model: MailQueue,
-        as: 'PMailQueues'
-      }, {
-        model: FaxQueue,
-        as: 'PFaxQueues'
-      }, {
-        model: SmsQueue,
-        as: 'PSmsQueues'
-      }]
-    })
-    .then(function(user) {
-      if (!user) {
-        return res.sendStatus(401);
-      }
-      return res.status(200).send(user);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-/**
- * Update my user
- */
-exports.update = function(req, res, next) {
-  var userId = req.user.id;
-
-  delete req.body.password;
-  delete req.body.name;
-
-  return sequelize.transaction(function(t) {
-      return User
-        .findById(req.params.id)
-        .then(function(user) {
-          if (!user) {
-            return res.sendStatus(500);
-          }
-          return user
-            .update(req.body, {
-              transaction: t
-            });
-        })
-        .then(function(user) {
-          return res.status(200).send(user);
-        })
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-/**
- * Get my avatar
- */
-exports.getAvatar = function(req, res, next) {
-  var imgPath = path.join(config.root, 'server', 'files', 'images', req.params.filename);
-
-  fs.exists(imgPath, function(exists) {
-    if (!exists) {
-      imgPath = path.join(config.root, 'server', 'files', 'images', 'userpic.png');
-    }
-
-    return res.sendFile(imgPath);
-  });
-};
-
-/**
- * Get my avatar by id
- */
-exports.getAvatarById = function(req, res, next) {
-  if (req.params.id === 'visitor') {
-    var imgPath = path.join(config.root, 'server', 'files', 'images', 'customer.png');
-
-    fs.exists(imgPath, function(exists) {
-      return res.sendFile(imgPath);
-    });
-
-  } else {
-    return User
-      .findById(req.params.id)
-      .then(function(user) {
-        if (user) {
-          var imgPath = path.join(config.root, 'server', 'files', 'images', user.userpic ? user.userpic : 'userpic.png');
-
-          fs.exists(imgPath, function(exists) {
-            if (!exists) {
-              imgPath = path.join(config.root, 'server', 'files', 'images', 'userpic.png');
-            }
-
-            return res.sendFile(imgPath);
-          });
-        } else {
-          return res.sendStatus(500);
-        }
-      })
-      .catch(function(err) {
-        return handleError(res, err);
-      });
-  }
-};
-
-/**
- * Get my avatar by id
- */
-// exports.getAllowedQueues = function(req, res, next) {
-//   var _user;
-//   var _permits = {
-//     voice: [],
-//     chat: [],
-//     mail: [],
-//     fax: [],
-//     sms: []
-//   };
-//
-//   return User
-//     .findById(req.params.id, {
-//       attributes: ['id']
-//     })
-//     .then(function(user) {
-//       _user = user;
-//       if (!_user) {
-//         return res.sendStatus(401);
-//       }
-//
-//       return _user
-//         .getPVoiceQueues({
-//           attributes: ['name']
-//         });
-//     })
-//     .then(function(queues) {
-//       _permits.voice = _permits.voice.concat(_.map(queues, 'name'));
-//     })
-//     .then(function() {
-//       return _user
-//         .getPChatQueues({
-//           attributes: ['name']
-//         });
-//     })
-//     .then(function(queues) {
-//       _permits.chat = _permits.chat.concat(_.map(queues, 'name'));
-//     })
-//     .then(function() {
-//       return _user
-//         .getPMailQueues({
-//           attributes: ['name']
-//         });
-//     })
-//     .then(function(queues) {
-//       _permits.mail = _permits.mail.concat(_.map(queues, 'name'));
-//     })
-//     .then(function() {
-//       return _user
-//         .getPFaxQueues({
-//           attributes: ['name']
-//         });
-//     })
-//     .then(function(queues) {
-//       _permits.fax = _permits.fax.concat(_.map(queues, 'name'));
-//     })
-//     // .then(function() {
-//     //   return _user
-//     //     .getPSmsQueues({
-//     //       attributes: ['name']
-//     //     });
-//     // })
-//     // .then(function(queues) {
-//     //   _permits.sms = _permits.sms.concat(_.map(queues, 'name'));
-//     // })
-//     .then(function() {
-//       return res.status(200).send(_permits);
-//     })
-//     .catch(function(err) {
-//       console.error(err);
-//       return handleError(res, err);
-//     });
-// };
-
-exports.getAllowedQueues = function(req, res, next) {
-  var _user;
-
-  return User
-    .findById(req.params.id, {
-      attributes: ['id']
-    })
-    .then(function(user) {
-      _user = user;
-      if (!_user) {
-        return res.sendStatus(401);
-      }
-
-      switch (req.params.channel) {
-        case 'voice':
-          return _user
-            .getPVoiceQueues({
-              attributes: ['name']
-            });
-        case 'chat':
-          return _user
-            .getPChatQueues({
-              attributes: ['id', 'name']
-            });
-        case 'mail':
-          return _user
-            .getPMailQueues({
-              attributes: ['id', 'name']
-            });
-        case 'fax':
-          return _user
-            .getPFaxQueues({
-              attributes: ['id', 'name']
-            });
-        case 'sms':
-          return _user
-            .getPSmsQueues({
-              attributes: ['id', 'name']
-            });
-        case 'openchannel':
-          return _user
-            .getPOpenchannelQueues({
-              attributes: ['id', 'name']
-            });
-        default:
-          throw new Error('The channel does not exist');
-      }
-    })
-    .then(function(queues) {
-      if (queues) {
-        return res.status(200).send(_.map(queues, function(queue) {
-          var _data = {
-            name: queue.name
-          };
-
-          if (queue.id) {
-            _data.id = queue.id;
-          }
-
-          return _data;
-        }));
-      }
-    })
-    .catch(function(err) {
-      console.error(err);
-      return handleError(res, err);
-    });
-};
-
-exports.addAllowedQueues = function(req, res, next) {
-  var _user;
-
-  return User
-    .findById(req.params.id, {
-      attributes: ['id']
-    })
-    .then(function(user) {
-      _user = user;
-      if (!_user) {
-        return res.sendStatus(401);
-      }
-
-      switch (req.params.channel) {
-        case 'voice':
-          return _user
-            .addPVoiceQueues(req.body);
-        case 'chat':
-          return _user
-            .addPChatQueues(req.body);
-        case 'mail':
-          return _user
-            .addPMailQueues(req.body);
-        case 'fax':
-          return _user
-            .addPFaxQueues(req.body);
-        case 'sms':
-          return _user
-            .addPSmsQueues(req.body);
-        case 'openchannel':
-          return _user
-            .addPOpenchannelQueues(req.body);
-        default:
-          return null;
-      }
-    })
-    .then(function(queues) {
-      return res.sendStatus(queues ? 200 : 401);
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-};
-
-exports.removeAllowedQueues = function(req, res, next) {
-  var _user;
-
-  return User
-    .findById(req.params.id, {
-      attributes: ['id']
-    })
-    .then(function(user) {
-      _user = user;
-      if (!_user) {
-        return res.sendStatus(401);
-      }
-
-      switch (req.params.channel) {
-        case 'voice':
-          return _user
-            .removePVoiceQueues(req.query.ids);
-        case 'chat':
-          return _user
-            .removePChatQueues(req.query.ids);
-        case 'mail':
-          return _user
-            .removePMailQueues(req.query.ids);
-        case 'sms':
-          return _user
-            .removePSmsQueues(req.query.ids);
-        case 'fax':
-          return _user
-            .removePFaxQueues(req.query.ids);
-        case 'openchannel':
-          return _user
-            .removePOpenchannelQueues(req.query.ids);
-        default:
-          return null;
-      }
-    })
-    .then(function(queues) {
-      return res.sendStatus(queues ? 200 : 401);
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-};
-
-exports.userValidation = function(req, res) {
-  var where = {};
-  where[req.params.field] = req.body.value;
-
-  return User
-    .findAndCountAll({
-      where: where
-    })
-    .then(function(result) {
-      if (result.count) {
-        return res.status(200).send({
-          isValid: false,
-          value: req.body.value
-        });
-      }
-      return res.status(200).send({
-        isValid: true,
-        value: req.body.value
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-
-};
-
-/**
- * Authentication callback
- */
-exports.authCallback = function(req, res, next) {
-  res.redirect('/');
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/user/user.events.js b/server/api/user/user.events.js
index 7052b15..a721b11 100644
--- a/server/api/user/user.events.js
+++ b/server/api/user/user.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const User = require('../../models').User;
-
-var UserEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-UserEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  User.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    UserEvents.emit(event + ':' + doc._id, doc);
-    UserEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = UserEvents;
\ No newline at end of file
diff --git a/server/api/user/user.socket.js b/server/api/user/user.socket.js
index a5f1bc9..64676ff 100644
--- a/server/api/user/user.socket.js
+++ b/server/api/user/user.socket.js
@@ -1,34 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const UserEvents = require('./user.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('user:' + event, socket);
-
-    UserEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    if (doc.role === 'user' || doc.role === 'admin') {
-      socket.emit(event, doc);
-    }
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    UserEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/user_has_chat_queue/index.js b/server/api/user_has_chat_queue/index.js
index bce94e7..df8c2ff 100644
--- a/server/api/user_has_chat_queue/index.js
+++ b/server/api/user_has_chat_queue/index.js
@@ -1,15 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./user_has_chat_queue.controller');
-
-var router = express.Router();
-
-router.get('/', controller.index);
-router.get('/:id', controller.show);
-router.post('/', controller.create);
-router.put('/:id', controller.update);
-router.patch('/:id', controller.update);
-router.delete('/:id', controller.destroy);
-
-module.exports = router;
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/user_has_chat_queue/user_has_chat_queue.controller.js b/server/api/user_has_chat_queue/user_has_chat_queue.controller.js
index b399892..e49af83 100644
--- a/server/api/user_has_chat_queue/user_has_chat_queue.controller.js
+++ b/server/api/user_has_chat_queue/user_has_chat_queue.controller.js
@@ -1,103 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var UserHasChatQueue = require('../../models').UserHasChatQueue;
-
-// Get list of userHasChatQueues
-exports.index = function(req, res) {
-  UserHasChatQueue
-    .findAll(req.query ? {
-      where: req.query
-    } : {})
-    .then(function(userHasChatQueues) {
-      return res.status(200).send(userHasChatQueues);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single userHasChatQueue
-exports.show = function(req, res) {
-  UserHasChatQueue
-    .findById(req.params.id)
-    .then(function(userHasChatQueue) {
-      if (!userHasChatQueue) {
-        return res.sendStatus(404);
-      }
-      return res.send(userHasChatQueue);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new userHasChatQueue in the DB.
-exports.create = function(req, res) {
-  UserHasChatQueue
-    .create(req.body)
-    .then(function(userHasChatQueue) {
-      return res.status(201).send(userHasChatQueue);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing userHasChatQueue in the DB.
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  UserHasChatQueue
-    .find({
-      where: {
-        id: req.params.id
-      }
-    })
-    .then(function(userHasChatQueue) {
-      if (!userHasChatQueue) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(userHasChatQueue, req.body);
-      updated.save()
-        .then(function() {
-          return res.status(200).send(userHasChatQueue);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a userHasChatQueue from the DB.
-exports.destroy = function(req, res) {
-  UserHasChatQueue
-    .find({
-      where: {
-        id: req.params.id
-      }
-    })
-    .then(function(userHasChatQueue) {
-      if (!userHasChatQueue) {
-        return res.sendStatus(404);
-      }
-      userHasChatQueue.destroy()
-        .then(function() {
-          return res.sendStatus(204);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/user_has_chat_queue/user_has_chat_queue.events.js b/server/api/user_has_chat_queue/user_has_chat_queue.events.js
index 7289f5f..c2a447b 100644
--- a/server/api/user_has_chat_queue/user_has_chat_queue.events.js
+++ b/server/api/user_has_chat_queue/user_has_chat_queue.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const UserHasChatQueue = require('../../models').UserHasChatQueue;
-
-var UserHasChatQueueEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-UserHasChatQueueEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  UserHasChatQueue.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    UserHasChatQueueEvents.emit(event + ':' + doc._id, doc);
-    UserHasChatQueueEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = UserHasChatQueueEvents;
\ No newline at end of file
diff --git a/server/api/user_has_chat_queue/user_has_chat_queue.socket.js b/server/api/user_has_chat_queue/user_has_chat_queue.socket.js
index cbe8860..63b929a 100644
--- a/server/api/user_has_chat_queue/user_has_chat_queue.socket.js
+++ b/server/api/user_has_chat_queue/user_has_chat_queue.socket.js
@@ -1,32 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const UserHasChatQueueEvents = require('./user_has_chat_queue.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('user_has_chat_queue:' + event, socket);
-
-    UserHasChatQueueEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    UserHasChatQueueEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/user_has_chat_queue/user_has_chat_queue_permit.events.js b/server/api/user_has_chat_queue/user_has_chat_queue_permit.events.js
index 985d823..ac890a6 100644
--- a/server/api/user_has_chat_queue/user_has_chat_queue_permit.events.js
+++ b/server/api/user_has_chat_queue/user_has_chat_queue_permit.events.js
@@ -1,35 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const UserHasChatQueuePermit = require('../../models').UserHasChatQueuePermit;
-
-var UserHasChatQueuePermitEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-UserHasChatQueuePermitEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  UserHasChatQueuePermit.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    UserHasChatQueuePermitEvents.emit(event + ':' + doc._id, doc);
-    UserHasChatQueuePermitEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = UserHasChatQueuePermitEvents;
\ No newline at end of file
diff --git a/server/api/user_has_chat_queue/user_has_chat_queue_permit.socket.js b/server/api/user_has_chat_queue/user_has_chat_queue_permit.socket.js
index 4ffea53..4ad4d57 100644
--- a/server/api/user_has_chat_queue/user_has_chat_queue_permit.socket.js
+++ b/server/api/user_has_chat_queue/user_has_chat_queue_permit.socket.js
@@ -1,34 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const UserHasChatQueuePermitEvents = require('./user_has_chat_queue_permit.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('user_has_chat_queue_permit:' + event, socket);
-
-    UserHasChatQueuePermitEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    if (socket.userId === doc.Userid) {
-      socket.emit('user_has_chat_queue_permit:change');
-    }
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    UserHasChatQueuePermitEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/user_has_chat_room/index.js b/server/api/user_has_chat_room/index.js
index 381448d..95d17f5 100644
--- a/server/api/user_has_chat_room/index.js
+++ b/server/api/user_has_chat_room/index.js
@@ -1,16 +1 @@
-'use strict';
-
-var express     = require('express');
-var controller  = require('./user_has_chat_room.controller');
-var auth        = require('../../auth/auth.service');
-
-var router = express.Router();
-
-// router.get('/', controller.index);
-// router.get('/:id', controller.show);
-// router.post('/', controller.create);
-router.put('/:userId/:chatRoomId', controller.update);
-// router.patch('/:id', controller.update);
-// router.delete('/:id', controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/user_has_chat_room/user_has_chat_room.controller.js b/server/api/user_has_chat_room/user_has_chat_room.controller.js
index d747380..e43a816 100644
--- a/server/api/user_has_chat_room/user_has_chat_room.controller.js
+++ b/server/api/user_has_chat_room/user_has_chat_room.controller.js
@@ -1,96 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var UserHasChatRoom = require('../../models').UserHasChatRoom;
-
-// Get list of user_has_chat_rooms
-exports.index = function(req, res) {
-  UserHasChatRoom
-  .findAll()
-  .then(function (user_has_chat_rooms) {
-    return res.status(200).send(user_has_chat_rooms);
-  })
-  .catch(function(err) {
-    return handleError(res, err);
-  });
-};
-
-// Get a single user_has_chat_room
-exports.show = function(req, res) {
-  UserHasChatRoom
-  .findById(req.params.id)
-  .then(function (user_has_chat_room) {
-    if(!user_has_chat_room) { return res.sendStatus(404); }
-    return res.send(user_has_chat_room);
-  })
-  .catch(function(err){
-    return handleError(res, err);
-  });
-};
-
-// Creates a new user_has_chat_room in the DB.
-exports.create = function(req, res) {
-
-  UserHasChatRoom
-    .create(req.body)
-    .then(function(user_has_chat_room) {
-      return res.status(201).send(user_has_chat_room);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing user_has_chat_room in the DB.
-exports.update = function(req, res) {
-
-  UserHasChatRoom
-    .findOne({
-      where: {
-        UserId: req.params.userId,
-        ChatRoomId: req.params.chatRoomId
-      },
-      limit: 1
-    })
-    .then(function (user_has_chat_room) {
-      if (!user_has_chat_room) {
-        return res.sendStatus(404);
-      }
-
-      user_has_chat_room
-        .updateAttributes(req.body)
-        .then(function () {
-          return res.status(200).send(user_has_chat_room);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a user_has_chat_room from the DB.
-exports.destroy = function(req, res) {
-
-  UserHasChatRoom
-  .findById(req.params.id)
-  .then(function (user_has_chat_room) {
-    if(!user_has_chat_room) { return res.sendStatus(404); }
-    user_has_chat_room.destroy()
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-  })
-  .catch(function(err) {
-    return handleError(res, err);
-  });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/user_has_chat_room/user_has_chat_room.events.js b/server/api/user_has_chat_room/user_has_chat_room.events.js
index 619a0ae..a3daf3d 100644
--- a/server/api/user_has_chat_room/user_has_chat_room.events.js
+++ b/server/api/user_has_chat_room/user_has_chat_room.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const UserHasChatRoom = require('../../models').UserHasChatRoom;
-
-var UserHasChatRoomEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-UserHasChatRoomEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  UserHasChatRoom.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    UserHasChatRoomEvents.emit(event + ':' + doc._id, doc);
-    UserHasChatRoomEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = UserHasChatRoomEvents;
\ No newline at end of file
diff --git a/server/api/user_has_chat_room/user_has_chat_room.socket.js b/server/api/user_has_chat_room/user_has_chat_room.socket.js
index 20d7dd6..0f53bff 100644
--- a/server/api/user_has_chat_room/user_has_chat_room.socket.js
+++ b/server/api/user_has_chat_room/user_has_chat_room.socket.js
@@ -1,60 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const UserHasChatRoomEvents = require('./user_has_chat_room.events');
-const ChatRoom = require('../../models').ChatRoom;
-const User = require('../../models').User;
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('user_has_chat_room:' + event, socket);
-
-    UserHasChatRoomEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    switch (event) {
-      case 'user_has_chat_room:save':
-        return ChatRoom
-          .findById(doc.ChatRoomId, {
-            include: [{
-              model: User,
-              attributes: ['id']
-            }]
-          })
-          .then(function(chatRoom) {
-            chatRoom.Users.forEach(function(user) {
-              if (socket.userId == user.id) {
-                socket.emit(event, doc);
-              }
-            });
-          })
-          .catch(function(err) {
-            console.error(err);
-          });
-
-      case 'user_has_chat_room:remove':
-        socket.emit(event, doc);
-        break;
-
-      default:
-
-    }
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    UserHasChatRoomEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/user_has_fax_queue/index.js b/server/api/user_has_fax_queue/index.js
index 5805e3d..1f0eed1 100644
--- a/server/api/user_has_fax_queue/index.js
+++ b/server/api/user_has_fax_queue/index.js
@@ -1,15 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./user_has_fax_queue.controller');
-
-var router = express.Router();
-
-router.get('/', controller.index);
-router.get('/:id', controller.show);
-router.post('/', controller.create);
-router.put('/:id', controller.update);
-router.patch('/:id', controller.update);
-router.delete('/:id', controller.destroy);
-
-module.exports = router;
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/user_has_fax_queue/user_has_fax_queue.controller.js b/server/api/user_has_fax_queue/user_has_fax_queue.controller.js
index f92e570..ac0370e 100644
--- a/server/api/user_has_fax_queue/user_has_fax_queue.controller.js
+++ b/server/api/user_has_fax_queue/user_has_fax_queue.controller.js
@@ -1,103 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var UserHasFaxQueue = require('../../models').UserHasFaxQueue;
-
-// Get list of user_has_fax_queues
-exports.index = function(req, res) {
-  UserHasFaxQueue
-    .findAll(req.query ? {
-      where: req.query
-    } : {})
-    .then(function(user_has_fax_queues) {
-      return res.status(200).send(user_has_fax_queues);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single user_has_fax_queue
-exports.show = function(req, res) {
-  UserHasFaxQueue
-    .findById(req.params.id)
-    .then(function(user_has_fax_queue) {
-      if (!user_has_fax_queue) {
-        return res.sendStatus(404);
-      }
-      return res.send(user_has_fax_queue);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new user_has_fax_queue in the DB.
-exports.create = function(req, res) {
-  UserHasFaxQueue
-    .create(req.body)
-    .then(function(user_has_fax_queue) {
-      return res.status(201).send(user_has_fax_queue);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing user_has_fax_queue in the DB.
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  UserHasFaxQueue
-    .find({
-      where: {
-        id: req.params.id
-      }
-    })
-    .then(function(user_has_fax_queue) {
-      if (!user_has_fax_queue) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(user_has_fax_queue, req.body);
-      updated.save()
-        .then(function() {
-          return res.status(200).send(user_has_fax_queue);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a user_has_fax_queue from the DB.
-exports.destroy = function(req, res) {
-  UserHasFaxQueue
-    .find({
-      where: {
-        id: req.params.id
-      }
-    })
-    .then(function(user_has_fax_queue) {
-      if (!user_has_fax_queue) {
-        return res.sendStatus(404);
-      }
-      user_has_fax_queue.destroy()
-        .then(function() {
-          return res.sendStatus(204);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/user_has_fax_queue/user_has_fax_queue.events.js b/server/api/user_has_fax_queue/user_has_fax_queue.events.js
index 081e428..5da0aa0 100644
--- a/server/api/user_has_fax_queue/user_has_fax_queue.events.js
+++ b/server/api/user_has_fax_queue/user_has_fax_queue.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const UserHasFaxQueue = require('../../models').UserHasFaxQueue;
-
-var UserHasFaxQueueEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-UserHasFaxQueueEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  UserHasFaxQueue.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    UserHasFaxQueueEvents.emit(event + ':' + doc._id, doc);
-    UserHasFaxQueueEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = UserHasFaxQueueEvents;
\ No newline at end of file
diff --git a/server/api/user_has_fax_queue/user_has_fax_queue.socket.js b/server/api/user_has_fax_queue/user_has_fax_queue.socket.js
index 93b3bcc..030eb92 100644
--- a/server/api/user_has_fax_queue/user_has_fax_queue.socket.js
+++ b/server/api/user_has_fax_queue/user_has_fax_queue.socket.js
@@ -1,32 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const UserHasFaxQueueEvents = require('./user_has_fax_queue.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('user_has_fax_queue:' + event, socket);
-
-    UserHasFaxQueueEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    UserHasFaxQueueEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/user_has_fax_queue/user_has_fax_queue_permit.events.js b/server/api/user_has_fax_queue/user_has_fax_queue_permit.events.js
index 67646f7..2fceefb 100644
--- a/server/api/user_has_fax_queue/user_has_fax_queue_permit.events.js
+++ b/server/api/user_has_fax_queue/user_has_fax_queue_permit.events.js
@@ -1,35 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const UserHasFaxQueuePermit = require('../../models').UserHasFaxQueuePermit;
-
-var UserHasFaxQueuePermitEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-UserHasFaxQueuePermitEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  UserHasFaxQueuePermit.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    UserHasFaxQueuePermitEvents.emit(event + ':' + doc._id, doc);
-    UserHasFaxQueuePermitEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = UserHasFaxQueuePermitEvents;
\ No newline at end of file
diff --git a/server/api/user_has_fax_queue/user_has_fax_queue_permit.socket.js b/server/api/user_has_fax_queue/user_has_fax_queue_permit.socket.js
index 2a923b2..47116c8 100644
--- a/server/api/user_has_fax_queue/user_has_fax_queue_permit.socket.js
+++ b/server/api/user_has_fax_queue/user_has_fax_queue_permit.socket.js
@@ -1,34 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const UserHasFaxQueuePermitEvents = require('./user_has_fax_queue_permit.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('user_has_fax_queue_permit:' + event, socket);
-
-    UserHasFaxQueuePermitEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    if (socket.userId === doc.Userid) {
-      socket.emit('user_has_fax_queue_permit:change');
-    }
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    UserHasFaxQueuePermitEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/user_has_list/index.js b/server/api/user_has_list/index.js
index ee1b9af..db61c00 100644
--- a/server/api/user_has_list/index.js
+++ b/server/api/user_has_list/index.js
@@ -1,15 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./user_has_list.controller');
-
-var router = express.Router();
-
-router.get('/', controller.index);
-router.get('/:id', controller.show);
-router.post('/', controller.create);
-router.put('/:id', controller.update);
-router.patch('/:id', controller.update);
-router.delete('/:id', controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/user_has_list/user_has_list.controller.js b/server/api/user_has_list/user_has_list.controller.js
index f0a66dd..f51b2a7 100644
--- a/server/api/user_has_list/user_has_list.controller.js
+++ b/server/api/user_has_list/user_has_list.controller.js
@@ -1,98 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var UserHasList = require('../../models').UserHasList;
-
-// Get list of user_has_voice_queues
-exports.index = function(req, res) {
-  UserHasList
-    .findAll(req.query ? {
-      where: req.query
-    } : {})
-    .then(function(user_has_voice_queues) {
-      return res.status(200).send(user_has_voice_queues);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single userHasList
-exports.show = function(req, res) {
-  UserHasList
-    .findById(req.params.id)
-    .then(function(userHasList) {
-      if (!userHasList) {
-        return res.sendStatus(404);
-      }
-      return res.send(userHasList);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new userHasList in the DB.
-exports.create = function(req, res, next) {
-  console.log(req.body);
-  UserHasList
-    .create(req.body)
-    .then(function(userHasList) {
-      return res.status(201).send(userHasList);
-    })
-    .catch(function(err) {
-      console.error(err);
-      return next(err);
-      // return handleError(res, err);
-    });
-};
-
-// Updates an existing userHasList in the DB.
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  UserHasList
-    .findById(req.params.id)
-    .then(function(userHasList) {
-      if (!userHasList) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(userHasList, req.body);
-      updated.save()
-        .then(function() {
-          return res.status(200).send(userHasList);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a userHasList from the DB.
-exports.destroy = function(req, res) {
-  UserHasList
-    .findById(req.params.id)
-    .then(function(userHasList) {
-      if (!userHasList) {
-        return res.sendStatus(404);
-      }
-      userHasList.destroy()
-        .then(function() {
-          return res.sendStatus(204);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/user_has_list/user_has_list.events.js b/server/api/user_has_list/user_has_list.events.js
index d0988e3..dd4f940 100644
--- a/server/api/user_has_list/user_has_list.events.js
+++ b/server/api/user_has_list/user_has_list.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const UserHasList = require('../../models').UserHasList;
-
-var UserHasListEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-UserHasListEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  UserHasList.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    UserHasListEvents.emit(event + ':' + doc._id, doc);
-    UserHasListEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = UserHasListEvents;
\ No newline at end of file
diff --git a/server/api/user_has_list/user_has_list.socket.js b/server/api/user_has_list/user_has_list.socket.js
index 505a97b..ad4693b 100644
--- a/server/api/user_has_list/user_has_list.socket.js
+++ b/server/api/user_has_list/user_has_list.socket.js
@@ -1,32 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const UserHasListEvents = require('./user_has_list.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('user_has_list:' + event, socket);
-
-    UserHasListEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    UserHasListEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/user_has_mail_queue/index.js b/server/api/user_has_mail_queue/index.js
index 50b083e..122a24c 100644
--- a/server/api/user_has_mail_queue/index.js
+++ b/server/api/user_has_mail_queue/index.js
@@ -1,15 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./user_has_mail_queue.controller');
-
-var router = express.Router();
-
-router.get('/', controller.index);
-router.get('/:id', controller.show);
-router.post('/', controller.create);
-router.put('/:id', controller.update);
-router.patch('/:id', controller.update);
-router.delete('/:id', controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/user_has_mail_queue/user_has_mail_queue.controller.js b/server/api/user_has_mail_queue/user_has_mail_queue.controller.js
index c15bc9d..620ed88 100644
--- a/server/api/user_has_mail_queue/user_has_mail_queue.controller.js
+++ b/server/api/user_has_mail_queue/user_has_mail_queue.controller.js
@@ -1,95 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var UserHasMailQueue = require('../../models').UserHasMailQueue;
-
-// Get list of user_has_mail_queues
-exports.index = function(req, res) {
-  UserHasMailQueue
-    .findAll(req.query ? {
-      where: req.query
-    } : {})
-    .then(function(user_has_mail_queues) {
-      return res.status(200).send(user_has_mail_queues);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single user_has_mail_queue
-exports.show = function(req, res) {
-  UserHasMailQueue
-    .findById(req.params.id)
-    .then(function(user_has_mail_queue) {
-      if (!user_has_mail_queue) {
-        return res.sendStatus(404);
-      }
-      return res.send(user_has_mail_queue);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new user_has_mail_queue in the DB.
-exports.create = function(req, res) {
-  UserHasMailQueue
-    .create(req.body)
-    .then(function(user_has_mail_queue) {
-      return res.status(201).send(user_has_mail_queue);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing user_has_mail_queue in the DB.
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  UserHasMailQueue
-    .findById(req.params.id)
-    .then(function(user_has_mail_queue) {
-      if (!user_has_mail_queue) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(user_has_mail_queue, req.body);
-      updated.save()
-        .then(function() {
-          return res.status(200).send(user_has_mail_queue);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a user_has_mail_queue from the DB.
-exports.destroy = function(req, res) {
-  UserHasMailQueue
-    .findById(req.params.id)
-    .then(function(user_has_mail_queue) {
-      if (!user_has_mail_queue) {
-        return res.sendStatus(404);
-      }
-      user_has_mail_queue.destroy()
-        .then(function() {
-          return res.sendStatus(204);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/user_has_mail_queue/user_has_mail_queue.events.js b/server/api/user_has_mail_queue/user_has_mail_queue.events.js
index 46a7c73..0445891 100644
--- a/server/api/user_has_mail_queue/user_has_mail_queue.events.js
+++ b/server/api/user_has_mail_queue/user_has_mail_queue.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const UserHasMailQueue = require('../../models').UserHasMailQueue;
-
-var UserHasMailQueueEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-UserHasMailQueueEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  UserHasMailQueue.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    UserHasMailQueueEvents.emit(event + ':' + doc._id, doc);
-    UserHasMailQueueEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = UserHasMailQueueEvents;
\ No newline at end of file
diff --git a/server/api/user_has_mail_queue/user_has_mail_queue.socket.js b/server/api/user_has_mail_queue/user_has_mail_queue.socket.js
index 1635bbe..c0f0d28 100644
--- a/server/api/user_has_mail_queue/user_has_mail_queue.socket.js
+++ b/server/api/user_has_mail_queue/user_has_mail_queue.socket.js
@@ -1,32 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const UserHasMailQueueEvents = require('./user_has_mail_queue.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('user_has_mail_queue:' + event, socket);
-
-    UserHasMailQueueEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    UserHasMailQueueEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/user_has_mail_queue/user_has_mail_queue_permit.events.js b/server/api/user_has_mail_queue/user_has_mail_queue_permit.events.js
index 519ac53..3d057e3 100644
--- a/server/api/user_has_mail_queue/user_has_mail_queue_permit.events.js
+++ b/server/api/user_has_mail_queue/user_has_mail_queue_permit.events.js
@@ -1,35 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const UserHasMailQueuePermit = require('../../models').UserHasMailQueuePermit;
-
-var UserHasMailQueuePermitEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-UserHasMailQueuePermitEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  UserHasMailQueuePermit.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    UserHasMailQueuePermitEvents.emit(event + ':' + doc._id, doc);
-    UserHasMailQueuePermitEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = UserHasMailQueuePermitEvents;
\ No newline at end of file
diff --git a/server/api/user_has_mail_queue/user_has_mail_queue_permit.socket.js b/server/api/user_has_mail_queue/user_has_mail_queue_permit.socket.js
index d4786d1..68bab37 100644
--- a/server/api/user_has_mail_queue/user_has_mail_queue_permit.socket.js
+++ b/server/api/user_has_mail_queue/user_has_mail_queue_permit.socket.js
@@ -1,34 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const UserHasMailQueuePermitEvents = require('./user_has_mail_queue_permit.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('user_has_mail_queue_permit:' + event, socket);
-
-    UserHasMailQueuePermitEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    if (socket.userId === doc.Userid) {
-      socket.emit('user_has_mail_queue_permit:change');
-    }
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    UserHasMailQueuePermitEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/user_has_openchannel_queue/index.js b/server/api/user_has_openchannel_queue/index.js
index 2548a35..f23b3df 100644
--- a/server/api/user_has_openchannel_queue/index.js
+++ b/server/api/user_has_openchannel_queue/index.js
@@ -1,16 +1 @@
-'use strict';
-
-var express = require('express');
-var auth = require('../../auth/auth.service');
-var controller = require('./user_has_openchannel_queue.controller');
-
-var router = express.Router();
-
-router.get('/', controller.index);
-router.get('/:id', controller.show);
-router.post('/', controller.create);
-router.put('/:id', controller.update);
-router.patch('/:id', controller.update);
-router.delete('/:id', controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/user_has_openchannel_queue/user_has_openchannel_queue.controller.js b/server/api/user_has_openchannel_queue/user_has_openchannel_queue.controller.js
index 6e3c857..23e7275 100644
--- a/server/api/user_has_openchannel_queue/user_has_openchannel_queue.controller.js
+++ b/server/api/user_has_openchannel_queue/user_has_openchannel_queue.controller.js
@@ -1,109 +1 @@
-/**
- * Using Rails-like standard naming convention for endpoints.
- * GET     /api/openchannel/user_has_queues              ->  index
- * POST    /api/openchannel/user_has_queues              ->  create
- * GET     /api/openchannel/user_has_queues/:id          ->  show
- * PUT     /api/openchannel/user_has_queues/:id          ->  update
- * DELETE  /api/openchannel/user_has_queues/:id          ->  destroy
- */
-
-'use strict';
-
-
-var _ = require('lodash');
-var Util = require('../../config/util');
-
-var UserHasOpenchannelQueue = require('../../models').UserHasOpenchannelQueue;
-
-
-
-// Get list of user_has_openchannel_queues
-exports.index = function(req, res) {
-  UserHasOpenchannelQueue
-    .findAll(req.query ? {
-      where: req.query
-    } : {})
-    .then(function(user_has_openchannel_queues) {
-      return res.status(200).send(user_has_openchannel_queues);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single user_has_openchannel_queues
-exports.show = function(req, res) {
-  UserHasOpenchannelQueue
-    .findById(req.params.id)
-    .then(function(user_has_openchannel_queues) {
-      if (!user_has_openchannel_queues) {
-        return res.sendStatus(404);
-      }
-      return res.send(user_has_openchannel_queues);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new user_has_openchannel_queues in the DB.
-exports.create = function(req, res) {
-  UserHasOpenchannelQueue
-    .create(req.body)
-    .then(function(user_has_openchannel_queues) {
-      return res.status(201).send(user_has_openchannel_queues);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing user_has_openchannel_queues in the DB.
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  UserHasOpenchannelQueue
-    .findById(req.params.id)
-    .then(function(user_has_openchannel_queue) {
-      if (!user_has_openchannel_queue) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(user_has_openchannel_queue, req.body);
-      updated.save()
-        .then(function() {
-          return res.status(200).send(user_has_openchannel_queue);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a user_has_openchannel_queues from the DB.
-exports.destroy = function(req, res) {
-  UserHasOpenchannelQueue
-    .findById(req.params.id)
-    .then(function(user_has_openchannel_queue) {
-      if (!user_has_openchannel_queue) {
-        return res.sendStatus(404);
-      }
-      user_has_mail_queue.destroy()
-        .then(function() {
-          return res.sendStatus(204);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/user_has_openchannel_queue/user_has_openchannel_queue.events.js b/server/api/user_has_openchannel_queue/user_has_openchannel_queue.events.js
index 1be5c74..ffd412e 100644
--- a/server/api/user_has_openchannel_queue/user_has_openchannel_queue.events.js
+++ b/server/api/user_has_openchannel_queue/user_has_openchannel_queue.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const UserHasOpenchannelQueue = require('../../models').UserHasOpenchannelQueue;
-
-var UserHasOpenchannelQueueEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-UserHasOpenchannelQueueEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  UserHasOpenchannelQueue.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    UserHasOpenchannelQueueEvents.emit(event + ':' + doc._id, doc);
-    UserHasOpenchannelQueueEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = UserHasOpenchannelQueueEvents;
\ No newline at end of file
diff --git a/server/api/user_has_openchannel_queue/user_has_openchannel_queue.socket.js b/server/api/user_has_openchannel_queue/user_has_openchannel_queue.socket.js
index 26d8caa..12db06f 100644
--- a/server/api/user_has_openchannel_queue/user_has_openchannel_queue.socket.js
+++ b/server/api/user_has_openchannel_queue/user_has_openchannel_queue.socket.js
@@ -1,32 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const UserHasOpenchannelQueueEvents = require('./user_has_openchannel_queue.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('user_has_openchannel_queue:' + event, socket);
-
-    UserHasOpenchannelQueueEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    UserHasOpenchannelQueueEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/user_has_openchannel_queue/user_has_openchannel_queue_permit.events.js b/server/api/user_has_openchannel_queue/user_has_openchannel_queue_permit.events.js
index 0caae70..a400d15 100644
--- a/server/api/user_has_openchannel_queue/user_has_openchannel_queue_permit.events.js
+++ b/server/api/user_has_openchannel_queue/user_has_openchannel_queue_permit.events.js
@@ -1,35 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const UserHasOpenchannelQueuePermit = require('../../models').UserHasOpenchannelQueuePermit;
-
-var UserHasOpenchannelQueuePermitEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-UserHasOpenchannelQueuePermitEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  UserHasOpenchannelQueuePermit.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    UserHasOpenchannelQueuePermitEvents.emit(event + ':' + doc._id, doc);
-    UserHasOpenchannelQueuePermitEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = UserHasOpenchannelQueuePermitEvents;
\ No newline at end of file
diff --git a/server/api/user_has_openchannel_queue/user_has_openchannel_queue_permit.socket.js b/server/api/user_has_openchannel_queue/user_has_openchannel_queue_permit.socket.js
index 1c7289d..d1b0fd7 100644
--- a/server/api/user_has_openchannel_queue/user_has_openchannel_queue_permit.socket.js
+++ b/server/api/user_has_openchannel_queue/user_has_openchannel_queue_permit.socket.js
@@ -1,34 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const UserHasOpenchannelQueuePermitEvents = require('./user_has_openchannel_queue_permit.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('user_has_openchannel_queue_permit:' + event, socket);
-
-    UserHasOpenchannelQueuePermitEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    if (socket.userId === doc.Userid) {
-      socket.emit('user_has_openchannel_queue_permit:change');
-    }
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    UserHasOpenchannelQueuePermitEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/user_has_sms_queue/index.js b/server/api/user_has_sms_queue/index.js
index 5e63266..d528bff 100644
--- a/server/api/user_has_sms_queue/index.js
+++ b/server/api/user_has_sms_queue/index.js
@@ -1,15 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./user_has_sms_queue.controller');
-
-var router = express.Router();
-
-router.get('/', controller.index);
-router.get('/:id', controller.show);
-router.post('/', controller.create);
-router.put('/:id', controller.update);
-router.patch('/:id', controller.update);
-router.delete('/:id', controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/user_has_sms_queue/user_has_sms_queue.controller.js b/server/api/user_has_sms_queue/user_has_sms_queue.controller.js
index 9293afa..823cfce 100644
--- a/server/api/user_has_sms_queue/user_has_sms_queue.controller.js
+++ b/server/api/user_has_sms_queue/user_has_sms_queue.controller.js
@@ -1,103 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var UserHasSmsQueue = require('../../models').UserHasSmsQueue;
-
-// Get list of UserHasSmsQueues
-exports.index = function(req, res) {
-  UserHasSmsQueue
-    .findAll(req.query ? {
-      where: req.query
-    } : {})
-    .then(function(UserHasSmsQueues) {
-      return res.status(200).send(UserHasSmsQueues);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single UserHasSmsQueue
-exports.show = function(req, res) {
-  UserHasSmsQueue
-    .findById(req.params.id)
-    .then(function(UserHasSmsQueue) {
-      if (!UserHasSmsQueue) {
-        return res.sendStatus(404);
-      }
-      return res.send(UserHasSmsQueue);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new UserHasSmsQueue in the DB.
-exports.create = function(req, res) {
-  UserHasSmsQueue
-    .create(req.body)
-    .then(function(UserHasSmsQueue) {
-      return res.status(201).send(UserHasSmsQueue);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing UserHasSmsQueue in the DB.
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  UserHasSmsQueue
-    .find({
-      where: {
-        id: req.params.id
-      }
-    })
-    .then(function(UserHasSmsQueue) {
-      if (!UserHasSmsQueue) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(UserHasSmsQueue, req.body);
-      updated.save()
-        .then(function() {
-          return res.status(200).send(UserHasSmsQueue);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a UserHasSmsQueue from the DB.
-exports.destroy = function(req, res) {
-  UserHasSmsQueue
-    .find({
-      where: {
-        id: req.params.id
-      }
-    })
-    .then(function(UserHasSmsQueue) {
-      if (!UserHasSmsQueue) {
-        return res.sendStatus(404);
-      }
-      UserHasSmsQueue.destroy()
-        .then(function() {
-          return res.sendStatus(204);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/user_has_sms_queue/user_has_sms_queue.events.js b/server/api/user_has_sms_queue/user_has_sms_queue.events.js
index 2104253..28a533a 100644
--- a/server/api/user_has_sms_queue/user_has_sms_queue.events.js
+++ b/server/api/user_has_sms_queue/user_has_sms_queue.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const UserHasSmsQueue = require('../../models').UserHasSmsQueue;
-
-var UserHasSmsQueueEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-UserHasSmsQueueEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  UserHasSmsQueue.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    UserHasSmsQueueEvents.emit(event + ':' + doc._id, doc);
-    UserHasSmsQueueEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = UserHasSmsQueueEvents;
\ No newline at end of file
diff --git a/server/api/user_has_sms_queue/user_has_sms_queue.socket.js b/server/api/user_has_sms_queue/user_has_sms_queue.socket.js
index 7dfde5c..39ad244 100644
--- a/server/api/user_has_sms_queue/user_has_sms_queue.socket.js
+++ b/server/api/user_has_sms_queue/user_has_sms_queue.socket.js
@@ -1,32 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const UserHasSmsQueueEvents = require('./user_has_sms_queue.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('user_has_sms_queue:' + event, socket);
-
-    UserHasSmsQueueEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    UserHasSmsQueueEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/user_has_sms_queue/user_has_sms_queue_permit.events.js b/server/api/user_has_sms_queue/user_has_sms_queue_permit.events.js
index b6b7a01..b4da10f 100644
--- a/server/api/user_has_sms_queue/user_has_sms_queue_permit.events.js
+++ b/server/api/user_has_sms_queue/user_has_sms_queue_permit.events.js
@@ -1,35 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const UserHasSmsQueuePermit = require('../../models').UserHasSmsQueuePermit;
-
-var UserHasSmsQueuePermitEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-UserHasSmsQueuePermitEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  UserHasSmsQueuePermit.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    UserHasSmsQueuePermitEvents.emit(event + ':' + doc._id, doc);
-    UserHasSmsQueuePermitEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = UserHasSmsQueuePermitEvents;
\ No newline at end of file
diff --git a/server/api/user_has_sms_queue/user_has_sms_queue_permit.socket.js b/server/api/user_has_sms_queue/user_has_sms_queue_permit.socket.js
index 2c2b49c..60f5186 100644
--- a/server/api/user_has_sms_queue/user_has_sms_queue_permit.socket.js
+++ b/server/api/user_has_sms_queue/user_has_sms_queue_permit.socket.js
@@ -1,34 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const UserHasSmsQueuePermitEvents = require('./user_has_sms_queue_permit.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('user_has_sms_queue_permit:' + event, socket);
-
-    UserHasSmsQueuePermitEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    if (socket.userId === doc.Userid) {
-      socket.emit('user_has_sms_queue_permit:change');
-    }
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    UserHasSmsQueuePermitEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/user_has_team/index.js b/server/api/user_has_team/index.js
index 723bdc1..94c71b4 100644
--- a/server/api/user_has_team/index.js
+++ b/server/api/user_has_team/index.js
@@ -1,15 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./user_has_team.controller');
-
-var router = express.Router();
-
-router.get('/', controller.index);
-router.get('/:id', controller.show);
-router.post('/', controller.create);
-router.put('/:id', controller.update);
-router.patch('/:id', controller.update);
-router.delete('/:id', controller.destroy);
-
-module.exports = router;
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/user_has_team/user_has_team.controller.js b/server/api/user_has_team/user_has_team.controller.js
index 7f0f426..7701299 100644
--- a/server/api/user_has_team/user_has_team.controller.js
+++ b/server/api/user_has_team/user_has_team.controller.js
@@ -1,96 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var UserHasTeam = require('../../models').UserHasTeam;
-
-// Get list of user_has_teams
-exports.index = function(req, res) {
-  console.log(req.query);
-  UserHasTeam
-    .findAll({
-      where: req.query
-    })
-    .then(function(user_has_teams) {
-      return res.status(200).send(user_has_teams);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single user_has_team
-exports.show = function(req, res) {
-  UserHasTeam
-    .findById(req.params.id)
-    .then(function(user_has_team) {
-      if (!user_has_team) {
-        return res.sendStatus(404);
-      }
-      return res.send(user_has_team);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new user_has_team in the DB.
-exports.create = function(req, res) {
-  UserHasTeam
-    .create(req.body)
-    .then(function(user_has_team) {
-      return res.status(201).send(user_has_team);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing user_has_team in the DB.
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  UserHasTeam
-    .findById(req.params.id)
-    .then(function(user_has_team) {
-      if (!user_has_team) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(user_has_team, req.body);
-      updated.save()
-        .then(function() {
-          return res.status(200).send(user_has_team);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a user_has_team from the DB.
-exports.destroy = function(req, res) {
-  UserHasTeam
-    .findById(req.params.id)
-    .then(function(user_has_team) {
-      if (!user_has_team) {
-        return res.sendStatus(404);
-      }
-      user_has_team.destroy()
-        .then(function() {
-          return res.sendStatus(204);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/user_has_team/user_has_team.events.js b/server/api/user_has_team/user_has_team.events.js
index ce02e87..7760104 100644
--- a/server/api/user_has_team/user_has_team.events.js
+++ b/server/api/user_has_team/user_has_team.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const UserHasTeam = require('../../models').UserHasTeam;
-
-var UserHasTeamEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-UserHasTeamEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  UserHasTeam.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    UserHasTeamEvents.emit(event + ':' + doc._id, doc);
-    UserHasTeamEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = UserHasTeamEvents;
\ No newline at end of file
diff --git a/server/api/user_has_team/user_has_team.socket.js b/server/api/user_has_team/user_has_team.socket.js
index 423b31f..ea6e57b 100644
--- a/server/api/user_has_team/user_has_team.socket.js
+++ b/server/api/user_has_team/user_has_team.socket.js
@@ -1,32 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const UserHasTeamEvents = require('./user_has_team.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('user_has_team:' + event, socket);
-
-    UserHasTeamEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    UserHasTeamEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/user_has_voice_queue/index.js b/server/api/user_has_voice_queue/index.js
index 72551d5..5fcfea8 100644
--- a/server/api/user_has_voice_queue/index.js
+++ b/server/api/user_has_voice_queue/index.js
@@ -1,15 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./user_has_voice_queue.controller');
-
-var router = express.Router();
-
-router.get('/', controller.index);
-router.get('/:id', controller.show);
-router.post('/', controller.create);
-router.put('/:id', controller.update);
-router.patch('/:id', controller.update);
-router.delete('/:id', controller.destroy);
-
-module.exports = router;
\ No newline at end of file
\ No newline at end of file
diff --git a/server/api/user_has_voice_queue/user_has_voice_queue.controller.js b/server/api/user_has_voice_queue/user_has_voice_queue.controller.js
index f3e5d22..73480f6 100644
--- a/server/api/user_has_voice_queue/user_has_voice_queue.controller.js
+++ b/server/api/user_has_voice_queue/user_has_voice_queue.controller.js
@@ -1,98 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var UserHasVoiceQueue = require('../../models').UserHasVoiceQueue;
-
-// Get list of user_has_voice_queues
-exports.index = function(req, res) {
-  UserHasVoiceQueue
-    .findAll(req.query ? {
-      where: req.query
-    } : {})
-    .then(function(user_has_voice_queues) {
-      return res.status(200).send(user_has_voice_queues);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single userHasVoiceQueue
-exports.show = function(req, res) {
-  UserHasVoiceQueue
-    .findById(req.params.id)
-    .then(function(userHasVoiceQueue) {
-      if (!userHasVoiceQueue) {
-        return res.sendStatus(404);
-      }
-      return res.send(userHasVoiceQueue);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new userHasVoiceQueue in the DB.
-exports.create = function(req, res, next) {
-  console.log(req.body);
-  UserHasVoiceQueue
-    .create(req.body)
-    .then(function(userHasVoiceQueue) {
-      return res.status(201).send(userHasVoiceQueue);
-    })
-    .catch(function(err) {
-      console.error(err);
-      return next(err);
-      // return handleError(res, err);
-    });
-};
-
-// Updates an existing userHasVoiceQueue in the DB.
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  UserHasVoiceQueue
-    .findById(req.params.id)
-    .then(function(userHasVoiceQueue) {
-      if (!userHasVoiceQueue) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(userHasVoiceQueue, req.body);
-      updated.save()
-        .then(function() {
-          return res.status(200).send(userHasVoiceQueue);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a userHasVoiceQueue from the DB.
-exports.destroy = function(req, res) {
-  UserHasVoiceQueue
-    .findById(req.params.id)
-    .then(function(userHasVoiceQueue) {
-      if (!userHasVoiceQueue) {
-        return res.sendStatus(404);
-      }
-      userHasVoiceQueue.destroy()
-        .then(function() {
-          return res.sendStatus(204);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/user_has_voice_queue/user_has_voice_queue.events.js b/server/api/user_has_voice_queue/user_has_voice_queue.events.js
index aacd9a7..8f256ec 100644
--- a/server/api/user_has_voice_queue/user_has_voice_queue.events.js
+++ b/server/api/user_has_voice_queue/user_has_voice_queue.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const UserHasVoiceQueue = require('../../models').UserHasVoiceQueue;
-
-var UserHasVoiceQueueEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-UserHasVoiceQueueEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  UserHasVoiceQueue.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    UserHasVoiceQueueEvents.emit(event + ':' + doc._id, doc);
-    UserHasVoiceQueueEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = UserHasVoiceQueueEvents;
\ No newline at end of file
diff --git a/server/api/user_has_voice_queue/user_has_voice_queue.socket.js b/server/api/user_has_voice_queue/user_has_voice_queue.socket.js
index 5056bed..6c898cf 100644
--- a/server/api/user_has_voice_queue/user_has_voice_queue.socket.js
+++ b/server/api/user_has_voice_queue/user_has_voice_queue.socket.js
@@ -1,58 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const UserHasVoiceQueueEvents = require('./user_has_voice_queue.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('user_has_voice_queue:' + event, socket);
-
-    UserHasVoiceQueueEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    switch (event) {
-      case 'user_has_voice_queue:save':
-        socket.emit(event, {
-          logged: doc.logged,
-          loggedAt: doc.loggedAt,
-          queue: doc.queue,
-          membername: doc.membername,
-          interface: doc.interface,
-          callstaken: doc.callstaken,
-          lastcall: doc.lastcall,
-          status: doc.status,
-          statusdesc: doc.statusdesc,
-          statusAt: doc.statusAt,
-          paused: doc.paused,
-          pausedAt: doc.pausedAt,
-          reason: doc.reason,
-          UserId: doc.UserId
-        });
-        break;
-
-      case 'user_has_voice_queue:remove':
-        socket.emit(event, doc);
-        break;
-
-      default:
-
-    }
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    UserHasVoiceQueueEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/user_has_voice_queue/user_has_voice_queue_permit.events.js b/server/api/user_has_voice_queue/user_has_voice_queue_permit.events.js
index edcd78c..f375ac4 100644
--- a/server/api/user_has_voice_queue/user_has_voice_queue_permit.events.js
+++ b/server/api/user_has_voice_queue/user_has_voice_queue_permit.events.js
@@ -1,35 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const UserHasVoiceQueuePermit = require('../../models').UserHasVoiceQueuePermit;
-
-var UserHasVoiceQueuePermitEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-UserHasVoiceQueuePermitEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  UserHasVoiceQueuePermit.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    UserHasVoiceQueuePermitEvents.emit(event + ':' + doc._id, doc);
-    UserHasVoiceQueuePermitEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = UserHasVoiceQueuePermitEvents;
\ No newline at end of file
diff --git a/server/api/user_has_voice_queue/user_has_voice_queue_permit.socket.js b/server/api/user_has_voice_queue/user_has_voice_queue_permit.socket.js
index 877e1e4..1cbc31a 100644
--- a/server/api/user_has_voice_queue/user_has_voice_queue_permit.socket.js
+++ b/server/api/user_has_voice_queue/user_has_voice_queue_permit.socket.js
@@ -1,34 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const UserHasVoiceQueuePermitEvents = require('./user_has_voice_queue_permit.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('user_has_voice_queue_permit:' + event, socket);
-
-    UserHasVoiceQueuePermitEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    if (socket.userId === doc.Userid) {
-      socket.emit('user_has_voice_queue_permit:change');
-    }
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    UserHasVoiceQueuePermitEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/variable/index.js b/server/api/variable/index.js
index 3af9541..47389f7 100644
--- a/server/api/variable/index.js
+++ b/server/api/variable/index.js
@@ -1,166 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./variable.controller');
-var auth = require('../../auth/auth.service');
-
-var router = express.Router();
-/**
- * @api {get} /api/variables/ Get Variables' list.
- *
- * @apiParam (Query) {Number} [offset] Pagination offset.
- * @apiParam (Query) {Number} [limit] Pagination limit.
- *
- * @apiVersion 0.0.140
- * @apiName GetVariables
- * @apiGroup Variables
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccess {Number} count Number of variables.
- * @apiSuccess {Object[]} rows  Variables' list.
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 200 OK
- *     {
- *       "count": 2,
- *       "rows": [{
- *          "id": 1
- *          "name": "variable1"
- *          "description": "my variable description"
- *           ...
- *       },{
- *          "id": 2
- *          "name": "newvariable"
- *          "description": null
- *          ...
- *       },...]
- *     }
- */
-router.get('/', auth.isAuthenticated(), auth.hasModule([13, 14], ['admin']), controller.index);
-/**
- * @api {get} /api/variables/:id Get Variable's details.
- * @apiParam {Number} id Variable's unique ID.
- * @apiVersion 0.0.140
- * @apiName GetVariable
- * @apiGroup Variables
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccess {Object} Variable's details.
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 200 OK
- *     {
- *          "id": 1
- *          "name": "variable1"
- *          "description": "my variable description"
- *          ...
- *       }
- */
-router.get('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.show);
-/**
- * @api {post} /api/variables/ Create a new variable.
- * @apiParam (body) {String} name Variable's name.
- * @apiParam (body) {String} [description] Variable's description.
- *
- * @apiVersion 0.0.140
- * @apiName CreateVariable
- * @apiGroup Variables
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 201 Created
- *     {
- *        "id": 3
- *        "name": "Variable3"
- *        "description": "my variable"
- *        ...
- *     }
- */
-router.post('/', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.create);
-/**
- * @api {put} /api/variables/:id Update variable's details.
- * @apiParam {Number} id Variable's unique ID.
- * @apiParam (body) {String} name Variable's name.
- * @apiParam (body) {String} [description] Variable's description.
- *
- * @apiVersion 0.0.140
- * @apiName UpdateVariable
- * @apiGroup Variables
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 200 OK
- *     {
- *        "id": 3
- *        "name": "Variable 3"
- *        "description": "My new description"
- *        ...
- *     }
- */
-router.put('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.update);
-/**
- * @api {delete} /api/variables/ Bulk Delete variables.
- *
- * @apiParam (Query) {Number[]} ids Variables' unique ID array.
- *
- * @apiVersion 0.0.140
- * @apiName BulkDeleteVariables
- * @apiGroup Variables
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 204 No Content
- */
-router.delete('/', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.bulkDestroy);
-/**
- * @api {delete} /api/variables/:id Delete a variable.
- *
- * @apiParam {Number} id Variable's unique ID.
- *
- * @apiVersion 0.0.140
- * @apiName DeleteVariable
- * @apiGroup Variables
- *
- * @apiHeader (Header) {String} Authorization Authorization access token.
- *
- * @apiHeaderExample {json} Header-Example:
- *     {
- *       "Authentication": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI"
- *     }
- *
- * @apiSuccessExample {json} Success-Response:
- *     HTTP/1.1 204 No Content
- */
-router.delete('/:id', auth.isAuthenticated(), auth.hasModule([13], ['admin']), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/variable/variable.controller.js b/server/api/variable/variable.controller.js
index 2378a95..547b2d6 100644
--- a/server/api/variable/variable.controller.js
+++ b/server/api/variable/variable.controller.js
@@ -1,117 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var Variable = require('../../models').Variable;
-var Util = require('../../config/util');
-
-// Get list of variables
-exports.index = function(req, res, next) {
-  return Variable
-    .findAndCountAll(Util.getQuery(req.query))
-    .then(function(result) {
-      res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single variable
-exports.show = function(req, res) {
-  return Variable
-    .findById(req.params.id)
-    .then(function(variable) {
-      if (!variable) {
-        return res.sendStatus(404);
-      }
-      return res.send(variable);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new variable in the DB.
-exports.create = function(req, res) {
-  return Variable
-    .create(req.body)
-    .then(function(variable) {
-      return res.status(201).send(variable);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing variable in the DB.
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-
-  return Variable
-    .findById(req.params.id)
-    .then(function(variable) {
-      if (!variable) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(variable, req.body);
-      return updated
-        .save();
-    })
-    .then(function(variable) {
-      return res.status(200).send(variable);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a variable from the DB.
-exports.destroy = function(req, res) {
-  return Variable
-    .scope('fields')
-    .findById(req.params.id)
-    .then(function(variable) {
-      if (!variable) {
-        return res.sendStatus(404);
-      }
-      if (variableHasAssociation(variable)) {
-        var err = new Error();
-        err.message = 'Variable is associated with an integration\'s configuration';
-        throw err;
-      }
-      return variable.destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.bulkDestroy = function(req, res) {
-  return Variable
-    .destroy({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
-
-function variableHasAssociation(variable) {
-  return ((variable.ZendeskFields && variable.ZendeskFields.length > 0) || (variable.DeskFields && variable.DeskFields.length > 0) || (variable.SalesforceFields && variable.SalesforceFields.length >
-    0) || (variable.FreshdeskFields && variable.FreshdeskFields.length > 0) || (variable.SugarcrmFields && variable.SugarcrmFields.length > 0));
-}
\ No newline at end of file
diff --git a/server/api/variable/variable.events.js b/server/api/variable/variable.events.js
index 2f51fee..d6d807f 100644
--- a/server/api/variable/variable.events.js
+++ b/server/api/variable/variable.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const Variable = require('../../models').Variable;
-
-var VariableEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-VariableEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  Variable.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    VariableEvents.emit(event + ':' + doc._id, doc);
-    VariableEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = VariableEvents;
\ No newline at end of file
diff --git a/server/api/variable/variable.socket.js b/server/api/variable/variable.socket.js
index 32f14e8..4a86c73 100644
--- a/server/api/variable/variable.socket.js
+++ b/server/api/variable/variable.socket.js
@@ -1,32 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const VariableEvents = require('./variable.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('variable:' + event, socket);
-
-    VariableEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    VariableEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/voice_context/index.js b/server/api/voice_context/index.js
index 8f14e04..3ec5883 100644
--- a/server/api/voice_context/index.js
+++ b/server/api/voice_context/index.js
@@ -1,16 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./voice_context.controller');
-var auth = require('../../auth/auth.service');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.index);
-router.get('/:id', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.show);
-router.post('/', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.create);
-router.post('/validate', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.contextValidation);
-router.put('/:id', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.update);
-router.delete('/', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.bulkDestroy);
-router.delete('/:id', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.destroy);
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/voice_context/voice_context.controller.js b/server/api/voice_context/voice_context.controller.js
index c6ec224..190956a 100644
--- a/server/api/voice_context/voice_context.controller.js
+++ b/server/api/voice_context/voice_context.controller.js
@@ -1,227 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var util = require('util');
-
-var Util = require('../../config/util');
-var sequelize = require('../../models').sequelize;
-
-var VoiceContext = require('../../models').VoiceContext;
-var VoiceExtension = require('../../models').VoiceExtension;
-
-// Get list of agents
-exports.index = function(req, res, next) {
-  return VoiceContext
-    .findAndCountAll(Util.getQuery(req.query))
-    .then(function(result) {
-      res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single voiceContext
-exports.show = function(req, res) {
-  return VoiceContext
-    .findById(req.params.id)
-    .then(function(voiceContext) {
-      if (!voiceContext) {
-        return res.sendStatus(404);
-      }
-      return res.send(voiceContext);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Validate the existence of a context
-exports.contextValidation = function(req, res) {
-  return VoiceContext
-    .findAll({
-      where: {
-        name: req.body.name
-      }
-    })
-    .then(function(voiceContexts) {
-      if (!voiceContexts) {
-        return res.sendStatus(404);
-      }
-      return res.send(voiceContexts);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new voiceContext in the DB.
-exports.create = function(req, res) {
-  return VoiceContext
-    .create(req.body)
-    .then(function(voiceContext) {
-      return res.status(201).send(voiceContext);
-    })
-    .catch(sequelize.UniqueConstraintError, function(err) {
-      err.message = 'The context name already exists';
-      err.translatedMessage = 'MESSAGE_EXIST_CONTEXT'
-      return handleError(res, err);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-
-};
-
-// Updates an existing voiceContext in the DB.
-exports.update = function(req, res) {
-  return VoiceContext
-    .findAll({
-      where: {
-        name: req.body.name,
-        id: {
-          $ne: req.body.id
-        }
-      }
-    })
-    .then(function(existingContexts) {
-      if (!existingContexts) {
-        return res.sendStatus(404);
-      }
-      if (existingContexts.length > 0) {
-        return res.status(500).send({
-          message: 'MESSAGE_EXIST_CONTEXT'
-        });
-      }
-      if (req.body.id) {
-        delete req.body.id;
-      }
-      return VoiceContext
-        .findById(req.params.id);
-    })
-    .then(function(voiceContext) {
-      if (!voiceContext) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(voiceContext, req.body);
-      return updated
-        .save();
-    })
-    .then(function(voiceContext) {
-      return res.status(200).send(voiceContext);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-
-};
-
-// Deletes a voiceContext from the DB.
-exports.destroy = function(req, res) {
-  var _voiceContext;
-
-  return VoiceContext
-    .findById(req.params.id)
-    .then(function(voiceContext) {
-      _voiceContext = voiceContext;
-      if (!_voiceContext) {
-        return res.sendStatus(404);
-      }
-      if (_voiceContext.defaultEntry) {
-        return res.status(500).send({
-          message: 'You can\'t delete a default entry!',
-          translatedMessage: 'MESSAGE_DEFAULT_ENTRY'
-        });
-      }
-      return VoiceExtension
-        .findAll({
-          where: {
-            context: _voiceContext.name,
-            VoiceContextId: null
-          }
-        });
-    })
-    .then(function(contextExtensions) {
-      console.log(contextExtensions);
-      if (contextExtensions.length > 0) {
-        return res.status(500).send({
-          message: 'The context is associated to a route, delete or change it first',
-          translatedMessage: 'MESSAGE_CONTEXT_ROUTE_ASSOCIATED'
-        });
-      }
-      return _voiceContext
-        .destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      console.log('err', err);
-      return handleError(res, err);
-    });
-
-};
-
-// Deletes a context from the DB.
-exports.bulkDestroy = function(req, res) {
-
-  var _voiceContexts;
-
-  return VoiceContext
-    .findAll({
-      where: {
-        id: req.query.ids
-      }
-    })
-    .then(function(voiceContexts) {
-      _voiceContexts = voiceContexts;
-      var isDefault = _.find(_voiceContexts, {
-        defaultEntry: true
-      });
-      if (isDefault) {
-        return res.status(500).send({
-          message: 'You can\'t delete a default entry!',
-          translatedMessage: 'MESSAGE_DEFAULT_ENTRY'
-        });
-      }
-      if (!_voiceContexts) {
-        return res.sendStatus(404);
-      }
-      var destroyContextsNames = _.map(_.map(_voiceContexts, 'dataValues'), 'name');
-
-      return VoiceExtension
-        .findAll({
-          where: {
-            context: destroyContextsNames,
-            VoiceContextId: null
-          }
-        });
-    })
-    .then(function(contextExtensions) {
-      if (contextExtensions.length > _voiceContexts.length) {
-        return res.status(500).send({
-          message: 'The context is associated to a route, delete or change it first',
-          translatedMessage: 'MESSAGE_CONTEXT_ROUTE_ASSOCIATED'
-        });
-      }
-
-      return VoiceContext
-        .destroy({
-          where: {
-            id: req.query.ids
-          },
-          individualHooks: true
-        });
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/voice_context/voice_context.events.js b/server/api/voice_context/voice_context.events.js
index c7c0711..3f51b18 100644
--- a/server/api/voice_context/voice_context.events.js
+++ b/server/api/voice_context/voice_context.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const VoiceContext = require('../../models').VoiceContext;
-
-var VoiceContextEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-VoiceContextEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  VoiceContext.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    VoiceContextEvents.emit(event + ':' + doc._id, doc);
-    VoiceContextEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = VoiceContextEvents;
\ No newline at end of file
diff --git a/server/api/voice_context/voice_context.socket.js b/server/api/voice_context/voice_context.socket.js
index 34a2d6e..e61bc9c 100644
--- a/server/api/voice_context/voice_context.socket.js
+++ b/server/api/voice_context/voice_context.socket.js
@@ -1,32 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const VoiceContextEvents = require('./voice_context.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('voice_context:' + event, socket);
-
-    VoiceContextEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    VoiceContextEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/voice_disposition/index.js b/server/api/voice_disposition/index.js
index 2c15433..e02463b 100644
--- a/server/api/voice_disposition/index.js
+++ b/server/api/voice_disposition/index.js
@@ -1,18 +1 @@
-'use strict';
-
-var express = require('express');
-var auth = require('../../auth/auth.service');
-var controller = require('./voice_disposition.controller');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), controller.index);
-
-router.get('/:id', auth.isAuthenticated(), controller.show);
-router.post('/', auth.isAuthenticated(), controller.create);
-router.put('/:id', auth.isAuthenticated(), controller.update);
-router.patch('/:id', auth.isAuthenticated(), controller.update);
-router.delete('/:id', auth.isAuthenticated(), controller.destroy);
-
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/voice_disposition/voice_disposition.controller.js b/server/api/voice_disposition/voice_disposition.controller.js
index 96b0f15..2b5e5c9 100644
--- a/server/api/voice_disposition/voice_disposition.controller.js
+++ b/server/api/voice_disposition/voice_disposition.controller.js
@@ -1,112 +1 @@
-/**
- * Using Rails-like standard naming convention for endpoints.
- * GET     /api/voice/dispositions              ->  index
- * POST    /api/voice/dispositions              ->  create
- * GET     /api/voice/dispositions/:id          ->  show
- * PUT     /api/voice/dispositions/:id          ->  update
- * DELETE  /api/voice/dispositions/:id          ->  destroy
- */
-
-'use strict';
-
-
-var _ = require('lodash');
-
-var VoiceDisposition = require('../../models').VoiceDisposition;
-
-
-function handleError(res, statusCode) {
-  statusCode = statusCode || 500;
-  return function(err) {
-    console.log(err);
-    res.status(statusCode).send(err);
-  };
-}
-
-function responseWithResult(res, statusCode) {
-  statusCode = statusCode || 200;
-  return function(entity) {
-    if (entity) {
-      res.status(statusCode).json(entity);
-    }
-  };
-}
-
-function responseWithoutResult(res, statusCode) {
-  statusCode = statusCode || 200;
-  return function() {
-    res.sendStatus(statusCode);
-  };
-}
-
-function handleEntityNotFound(res) {
-  return function(entity) {
-    if (!entity) {
-      res.status(404).end();
-      return null;
-    }
-    return entity;
-  };
-}
-
-function saveUpdates(updates) {
-  return function(entity) {
-    return entity.updateAttributes(updates)
-      .then(function(updated) {
-        return updated;
-      });
-  };
-}
-
-function removeEntity(res) {
-  return function(entity) {
-    if (entity) {
-      return entity.destroy()
-        .then(function() {
-          res.status(204).end();
-        });
-    }
-  };
-}
-
-// Gets a list of VoiceDispositions
-exports.index = function(req, res) {
-  VoiceDisposition.findAndCountAll()
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Gets a single VoiceDisposition from the DB
-exports.show = function(req, res) {
-  VoiceDisposition.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Creates a new VoiceDisposition in the DB
-exports.create = function(req, res) {
-  VoiceDisposition.create(req.body)
-    .then(responseWithResult(res, 201))
-    .catch(handleError(res));
-}
-
-// Updates an existing VoiceDisposition in the DB
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  VoiceDisposition.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(saveUpdates(req.body))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Deletes a VoiceDisposition from the DB
-exports.destroy = function(req, res) {
-  VoiceDisposition.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(removeEntity(res))
-    .catch(handleError(res));
-}
\ No newline at end of file
diff --git a/server/api/voice_disposition/voice_disposition.events.js b/server/api/voice_disposition/voice_disposition.events.js
index 8436878..b169644 100644
--- a/server/api/voice_disposition/voice_disposition.events.js
+++ b/server/api/voice_disposition/voice_disposition.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const VoiceDisposition = require('../../models').VoiceDisposition;
-
-var VoiceDispositionEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-VoiceDispositionEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  VoiceDisposition.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    VoiceDispositionEvents.emit(event + ':' + doc._id, doc);
-    VoiceDispositionEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = VoiceDispositionEvents;
\ No newline at end of file
diff --git a/server/api/voice_disposition/voice_disposition.socket.js b/server/api/voice_disposition/voice_disposition.socket.js
index 6cfaf1c..febccbd 100644
--- a/server/api/voice_disposition/voice_disposition.socket.js
+++ b/server/api/voice_disposition/voice_disposition.socket.js
@@ -1,32 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const VoiceDispositionEvents = require('./voice_disposition.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('voice_disposition:' + event, socket);
-
-    VoiceDispositionEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    VoiceDispositionEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/voice_extension/index.js b/server/api/voice_extension/index.js
index 29591db..2ede82f 100644
--- a/server/api/voice_extension/index.js
+++ b/server/api/voice_extension/index.js
@@ -1,16 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./voice_extension.controller');
-var auth = require('../../auth/auth.service');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.index);
-router.get('/:id', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.show);
-router.post('/', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.create);
-router.put('/:id', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.update);
-router.delete('/', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.bulkDestroy); //check it for apps
-router.delete('/:id', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.destroy); //check it for apps
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/voice_extension/voice_extension.controller.js b/server/api/voice_extension/voice_extension.controller.js
index 8a6ec34..5cf34d7 100644
--- a/server/api/voice_extension/voice_extension.controller.js
+++ b/server/api/voice_extension/voice_extension.controller.js
@@ -1,148 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var VoiceExtension = require('../../models').VoiceExtension;
-var Interval = require('../../models').Interval;
-var sequelize = require('../../models').sequelize;
-var Sequelize = require('../../models').Sequelize;
-var util = require('util');
-var async = require('async');
-var veUtil = require('../../utils/voice_extension');
-var Util = require('../../config/util');
-
-var Applications = veUtil.Applications;
-
-// Get list of extensions
-exports.index = function(req, res, next) {
-  return VoiceExtension
-    .scope('routes', 'application')
-    .findAndCountAll(_.merge(Util.getQuery(req.query), {
-      distinct: true
-    }))
-    .then(function(result) {
-      res.status(200).send(result);
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-// Get a single voice_extension or application
-exports.show = function(req, res) {
-  return VoiceExtension
-    .scope('application')
-    .findOne({
-      where: {
-        id: req.params.id,
-        VoiceExtensionId: null
-      }
-    })
-    .then(function(voice_extension) {
-      if (!voice_extension) {
-        return res.sendStatus(404);
-      }
-      return res.send(voice_extension);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.create = function(req, res) {
-  var _route;
-  return sequelize.transaction(function(t) {
-      return VoiceExtension
-        .create(req.body, {
-          transaction: t
-        })
-        .then(function(route) {
-          _route = route;
-          if (req.body.Applications && Array.isArray(req.body.Applications) && req.body.Applications.length) {
-            return route;
-          }
-        })
-        .then(veUtil.createApps(req.body.Applications, t, res));
-    })
-    .then(function() {
-      return res.status(201).send(_route);
-    })
-    .catch(sequelize.UniqueConstraintError, function(err) {
-      err.message = 'Extension/context combination already exist';
-      err.translatedMessage = 'MESSAGE_EXIST_ROUTE'
-      return handleError(res, err);
-    })
-    .catch(sequelize.ValidationError, function(err) {
-      err.message = 'Extension/context combination already exist';
-      err.translatedMessage = 'MESSAGE_EXIST_ROUTE'
-      return handleError(res, err);
-    })
-    .catch(function(err) {
-      console.log('err', err);
-      return handleError(res, err);
-    });
-}
-
-
-
-// Updates an existing voice_extension in the DB.
-exports.update = function(req, res) {
-  return sequelize.transaction(function(t) {
-      return veUtil.routeUpdate(req, t);
-    })
-    .then(function() {
-      return res.sendStatus(200);
-    })
-    .catch(sequelize.UniqueConstraintError, function(err) {
-      err.message = 'Extension/context combination already exist';
-      err.translatedMessage = 'MESSAGE_EXIST_ROUTE'
-      console.log(err);
-      return handleError(res, err);
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-}
-
-// Deletes a voice_extension from the DB.
-exports.destroy = function(req, res, next) {
-  return sequelize.transaction(function(t) {
-      return VoiceExtension
-        .findById(req.params.id)
-        .then(function(voice_extension) {
-          if (!voice_extension) {
-            return res.sendStatus(404);
-          }
-          return voice_extension.destroy();
-        });
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-// Deletes from the DB.
-exports.bulkDestroy = function(req, res) {
-  return VoiceExtension
-    .destroy({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/voice_extension/voice_extension.events.js b/server/api/voice_extension/voice_extension.events.js
index 2facad8..de8195d 100644
--- a/server/api/voice_extension/voice_extension.events.js
+++ b/server/api/voice_extension/voice_extension.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const VoiceExtension = require('../../models').VoiceExtension;
-
-var VoiceExtensionEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-VoiceExtensionEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'update',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  VoiceExtension.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    VoiceExtensionEvents.emit(event + ':' + doc._id, doc);
-    VoiceExtensionEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = VoiceExtensionEvents;
\ No newline at end of file
diff --git a/server/api/voice_extension/voice_extension.socket.js b/server/api/voice_extension/voice_extension.socket.js
index 7f2dca6..e315e70 100644
--- a/server/api/voice_extension/voice_extension.socket.js
+++ b/server/api/voice_extension/voice_extension.socket.js
@@ -1,32 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const VoiceExtensionEvents = require('./voice_extension.events');
-
-// Model events to emit
-var events = ['save', 'update', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('voice_extension:' + event, socket);
-
-    VoiceExtensionEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    VoiceExtensionEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/voice_musiconhold/index.js b/server/api/voice_musiconhold/index.js
index 8bcbd0e..d23a599 100644
--- a/server/api/voice_musiconhold/index.js
+++ b/server/api/voice_musiconhold/index.js
@@ -1,21 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./voice_musiconhold.controller');
-var auth = require('../../auth/auth.service');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.index);
-router.get('/stream', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.stream);
-router.get('/:id', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.show);
-router.get('/:id/files', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.showAudioFiles);
-router.post('/', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.create);
-router.post('/validate', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.mohValidation);
-router.post('/:id/files', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.addFiles);
-router.put('/:id', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.update);
-router.delete('/', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.bulkDestroy);
-router.delete('/:id', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.destroy);
-router.delete('/:id/files', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.deleteAudioFiles);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/voice_musiconhold/voice_musiconhold.controller.js b/server/api/voice_musiconhold/voice_musiconhold.controller.js
index 83c6288..7998520 100644
--- a/server/api/voice_musiconhold/voice_musiconhold.controller.js
+++ b/server/api/voice_musiconhold/voice_musiconhold.controller.js
@@ -1,290 +1 @@
-'use strict';
-
-var fs = require('fs');
-var _ = require('lodash');
-var path = require('path');
-var util = require('util');
-var fse = require('fs-extra');
-var remove = require('remove');
-var base64 = require('file-base64');
-
-var config = require('../../config/environment');
-var Util = require('../../config/util');
-
-var Sound = require('../../models').Sound;
-var Setting = require('../../models').Setting;
-var sequelize = require('../../models').sequelize;
-var VoiceMusicOnHold = require('../../models').VoiceMusicOnHold;
-
-
-// Get list of voice_musiconholds
-exports.index = function(req, res) {
-  return VoiceMusicOnHold
-    .findAndCountAll(Util.getQuery(req.query))
-    .then(function(result) {
-      res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single voiceMusiconhold
-exports.show = function(req, res) {
-  return VoiceMusicOnHold
-    .findById(req.params.id)
-    .then(function(voiceMusiconhold) {
-      if (!voiceMusiconhold) {
-        return res.sendStatus(404);
-      }
-      return res.send(voiceMusiconhold);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Add files to moh class
-exports.addFiles = function(req, res) {
-  var _voiceMusiconhold, _soundFiles;
-  return VoiceMusicOnHold
-    .findById(req.params.id)
-    .then(function(voiceMusiconhold) {
-      if (!voiceMusiconhold) {
-        return res.sendStatus(404);
-      }
-      _voiceMusiconhold = voiceMusiconhold;
-
-      return Sound
-        .findAll({
-          where: {
-            id: req.body.sounds
-          }
-        });
-    })
-    .then(function(soundFiles) {
-      _soundFiles = soundFiles;
-
-      return Setting
-        .findById(1);
-    })
-    .then(function(settings) {
-
-      var dest;
-      _soundFiles.forEach(function(elem) {
-        dest = path.join(_voiceMusiconhold.directory, elem.display_name + '.wav');
-        fse.copySync(path.join(settings.soundPath || '/var/opt/motion/server/files/sounds/converted', elem.save_name + '.wav'), dest);
-      });
-      fs.chmodSync(dest, parseInt('0777', 8));
-      res.sendStatus(200);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.showAudioFiles = function(req, res) {
-  var fileObject = {};
-  VoiceMusicOnHold
-    .findById(req.params.id)
-    .then(function(voiceMusiconhold) {
-      if (!voiceMusiconhold) {
-        return res.sendStatus(404);
-      }
-      fileObject.path = voiceMusiconhold.directory;
-      fs.readdir(voiceMusiconhold.directory, function(err, files) {
-        if (!err) {
-          fileObject.files = files;
-          return res.send(fileObject);
-        } else {
-          throw err;
-        }
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.deleteAudioFiles = function(req, res) {
-  return VoiceMusicOnHold
-    .findById(req.params.id)
-    .then(function(voiceMusiconhold) {
-      if (!voiceMusiconhold) {
-        return res.sendStatus(404);
-      }
-      var deletePath = voiceMusiconhold.directory + '/' + req.query.filename;
-      fs.unlink(deletePath, function(err) {
-        if (err) {
-          return handleError(res, err);
-        } else {
-          return res.sendStatus(204);
-        }
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Validate the existence of a route
-exports.mohValidation = function(req, res) {
-  console.log(req.body);
-  return VoiceMusicOnHold
-    .findAll({
-      where: {
-        name: req.body.name,
-      }
-    })
-    .then(function(voice_mohs) {
-      if (!voice_mohs) {
-        return res.sendStatus(404);
-      }
-      return res.send(voice_mohs);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new voiceMusiconhold in the DB.
-exports.create = function(req, res) {
-  return sequelize.transaction().then(function(t) {
-    req.body.directory = path.join(config.root, 'server/files/moh', req.body.name);
-    return VoiceMusicOnHold
-      .create(req.body, {
-        transaction: t
-      })
-      .then(function(voiceMusiconhold) {
-        fs.mkdir(voiceMusiconhold.directory, parseInt('0777', 8), function(err) {
-          if (err) {
-            console.log('file error');
-            t.rollback();
-            return res.status(500).send({
-              message: 'MESSAGE_FILE_CREATION_ERROR'
-            });
-          }
-          t.commit();
-          console.log('file created');
-          return res.status(201).send(voiceMusiconhold);
-        });
-      })
-      .catch(function(err) {
-        t.rollback();
-      });
-  })
-};
-
-// Updates an existing voiceMusiconhold in the DB.
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-
-  return VoiceMusicOnHold
-    .findById(req.params.id)
-    .then(function(voiceMusiconhold) {
-      if (!voiceMusiconhold) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(voiceMusiconhold, req.body);
-
-      return updated
-        .save();
-    })
-    .then(function(voiceMusiconhold) {
-      return res.status(200).send(voiceMusiconhold);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a voiceMusiconhold from the DB.
-exports.destroy = function(req, res) {
-  var _voicemoh;
-  return sequelize.transaction(function(t) {
-      return VoiceMusicOnHold
-        .findById(req.params.id)
-        .then(function(voiceMusiconhold) {
-          if (!voiceMusiconhold) {
-            return res.sendStatus(404);
-          }
-          _voicemoh = voiceMusiconhold;
-          return voiceMusiconhold.destroy({
-            transaction: t
-          });
-        })
-        .then(function() {
-          remove(_voicemoh.directory, function(err) {
-            if (err) {
-              console.log(err);
-            }
-            return res.sendStatus(204);
-          });
-        })
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes multiple voice_musiconholds from the DB.
-exports.bulkDestroy = function(req, res) {
-  var _voicemohs;
-  return sequelize.transaction(function(t) {
-      return VoiceMusicOnHold
-        .findAll({
-          where: {
-            id: req.query.ids
-          }
-        })
-        .then(function(voice_musiconholds) {
-          if (!voice_musiconholds) {
-            return res.sendStatus(404);
-          }
-          _voicemohs = voice_musiconholds;
-          var bulkDest = [];
-          voice_musiconholds.forEach(function(element) {
-            bulkDest.push(element.destroy({
-              transaction: t
-            }));
-          });
-          return bulkDest;
-        })
-        .all()
-        .then(function() {
-          _voicemohs.forEach(function(element) {
-            remove(element.directory, function(err) {
-              if (err) {
-                console.log(err);
-                throw err
-              }
-            });
-          })
-        });
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// stream a moh file
-exports.stream = function(req, res) {
-  var filepath = decodeURI(req.query.path);
-  base64.encode(filepath, function(err, base64String) {
-    if (err) {
-      return handleError(res, err);
-    } else {
-      return res.status(200).send(base64String);
-    }
-  });
-};
-
-function handleError(res, err) {
-  console.log(err);
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/voice_musiconhold/voice_musiconhold.events.js b/server/api/voice_musiconhold/voice_musiconhold.events.js
index e3d8587..a74b51d 100644
--- a/server/api/voice_musiconhold/voice_musiconhold.events.js
+++ b/server/api/voice_musiconhold/voice_musiconhold.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const VoiceMusicOnHold = require('../../models').VoiceMusicOnHold;
-
-var VoiceMusicOnHoldEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-VoiceMusicOnHoldEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  VoiceMusicOnHold.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    VoiceMusicOnHoldEvents.emit(event + ':' + doc._id, doc);
-    VoiceMusicOnHoldEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = VoiceMusicOnHoldEvents;
\ No newline at end of file
diff --git a/server/api/voice_musiconhold/voice_musiconhold.socket.js b/server/api/voice_musiconhold/voice_musiconhold.socket.js
index cbc19a2..31aa39f 100644
--- a/server/api/voice_musiconhold/voice_musiconhold.socket.js
+++ b/server/api/voice_musiconhold/voice_musiconhold.socket.js
@@ -1,32 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const VoiceMusicOnHoldEvents = require('./voice_musiconhold.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('voice_musiconhold:' + event, socket);
-
-    VoiceMusicOnHoldEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    VoiceMusicOnHoldEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/voice_queue/index.js b/server/api/voice_queue/index.js
index f1f9c3f..9cad331 100644
--- a/server/api/voice_queue/index.js
+++ b/server/api/voice_queue/index.js
@@ -1,20 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./voice_queue.controller');
-var auth = require('../../auth/auth.service');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), auth.hasModule([7, 13], ['admin']), controller.index);
-router.get('/:name', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.show);
-router.get('/realtime/voice', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.getRealtimeQueues);
-router.get('/:name/agents', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.showAgents);
-router.post('/', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.create);
-router.post('/:name/agents', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.addAgents);
-router.put('/:name', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.update);
-router.delete('/:name/agents', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.removeAgents);
-router.delete('/', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.bulkDestroy);
-router.delete('/:name', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/voice_queue/voice_queue.controller.js b/server/api/voice_queue/voice_queue.controller.js
index 2f70952..36e180d 100644
--- a/server/api/voice_queue/voice_queue.controller.js
+++ b/server/api/voice_queue/voice_queue.controller.js
@@ -1,304 +1 @@
-'use strict';
-
-var _ = require('lodash');
-
-var util = require('util');
-var Util = require('../../config/util');
-
-var sequelize = require('../../models').sequelize;
-var User = require('../../models').User;
-var VoiceQueue = require('../../models').VoiceQueue;
-var UserHasVoiceQueue = require('../../models').UserHasVoiceQueue;
-var VoiceExtension = require('../../models').VoiceExtension;
-
-// Get list of voiceQueues
-exports.index = function(req, res) {
-  switch (req.user.role) {
-    case 'user':
-      return User
-        .findById(req.user.id, {
-          attributes: ['id']
-        })
-        .then(Util.getVoiceQueuesIdByUser(req.query))
-        .then(function(result) {
-          res.status(200).send(result);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-
-    default:
-      return VoiceQueue
-        .findAndCountAll(Util.getQuery(req.query))
-        .then(function(result) {
-          res.status(200).send(result);
-        })
-        .catch(function(err) {
-          console.log(err);
-          return handleError(res, err);
-        });
-  }
-};
-
-exports.getRealtimeQueues = function(req, res, next) {
-  switch (req.user.role) {
-    case 'user':
-      var agents = [];
-      return User
-        .findById(req.user.id, {
-          attributes: ['id']
-        })
-        .then(Util.getVoiceQueuesIdByUser({}, {
-          attributes: ['name'],
-          include: [{
-            raw: true,
-            model: User,
-            attributes: ['id']
-          }]
-        }))
-        .then(function(queues) {
-          var voiceQueues = _.map(queues.rows, 'name');
-          queues.rows.forEach(function(queue) {
-            agents = _.union(agents, _.map(queue.Users, 'id'));
-          });
-          return VoiceQueue
-            .findAndCountAll(_.merge(Util.getQuery(req.query, {
-              name: voiceQueues
-            }), {
-              include: [{
-                model: User,
-                where: {
-                  id: agents
-                },
-                required: false
-              }]
-            }));
-        })
-        .then(function(result) {
-          return res.status(200).send(result);
-        })
-        .catch(function(err) {
-          console.log(err);
-          return handleError(res, err);
-        });
-    default:
-      return VoiceQueue
-        .findAndCountAll(_.merge(Util.getQuery(req.query), {
-          include: [{
-            model: User,
-            required: false
-          }]
-        }))
-        .then(function(result) {
-          return res.status(200).send(result);
-        })
-        .catch(function(err) {
-          console.log(err);
-          return handleError(res, err);
-        });
-  }
-};
-
-
-// Get a single voiceQueue
-exports.show = function(req, res) {
-  return VoiceQueue
-    .findById(req.params.name)
-    .then(function(voiceQueue) {
-      if (!voiceQueue) {
-        return res.sendStatus(404);
-      }
-      return res.send(voiceQueue);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single queue
-exports.showAgents = function(req, res) {
-  return VoiceQueue
-    .findById(req.params.name)
-    .then(function(queue) {
-      if (!queue) {
-        return res.sendStatus(404);
-      }
-      return queue
-        .getUsers({
-          where: {
-            role: 'agent'
-          },
-          attributes: ['id', 'name', 'fullname', 'email']
-        });
-    })
-    .then(function(agents) {
-      return res.status(200).send({
-        rows: agents,
-        count: agents.length
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new voiceQueue in the DB.
-exports.create = function(req, res) {
-  var _voiceQueue;
-
-  return VoiceQueue
-    .create(req.body)
-    .then(function(voiceQueue) {
-      _voiceQueue = voiceQueue;
-
-      if (req.body.agents) {
-        return _voiceQueue
-          .addUsers(req.body.agents, {
-            penalty: req.body.penalty || 0
-          });
-      }
-    })
-    .then(function() {
-      return res.status(201).send(_voiceQueue);
-    })
-    .catch(sequelize.UniqueConstraintError, function(err) {
-      var paths = [];
-
-      err.errors.forEach(function(error) {
-        switch (error.path) {
-          case 'PRIMARY':
-            paths.push('name');
-            break;
-          default:
-            paths.push(error.path);
-        }
-      });
-
-      paths.push(' must be unique');
-      err.message = paths.join();
-      err.translatedMessage = 'MESSAGE_EXIST_QUEUE';
-
-      return res.status(500).send(err);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing voiceQueue in the DB.
-exports.update = function(req, res) {
-  if (req.body.name) {
-    delete req.body.name;
-  }
-
-  return VoiceQueue
-    .findById(req.params.name)
-    .then(function(voiceQueue) {
-      if (!voiceQueue) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(voiceQueue, req.body);
-      return updated
-        .save();
-    })
-    .then(function(voiceQueue) {
-      return res.status(200).send(voiceQueue);
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-
-// Add agents to voice queues
-exports.addAgents = function(req, res, next) {
-  return User
-    .findAll({
-      where: {
-        id: {
-          $in: req.body.agents
-        }
-      }
-    })
-    .then(function(users) {
-      var userHasVoiceQueues = _.map(users, function(user) {
-        return {
-          queue: req.params.name,
-          interface: util.format('SIP/%s', user.name),
-          stateinterface: util.format('SIP/%s', user.name),
-          membername: user.name,
-          UserId: user.id,
-          penalty: req.body.penalty
-        };
-      });
-
-      return UserHasVoiceQueue
-        .bulkCreate(userHasVoiceQueues, {
-          individualHooks: true
-        });
-    })
-    .then(function() {
-      return res.sendStatus(200);
-    })
-    .catch(function(err) {
-      console.log(err);
-      return next(err);
-    });
-};
-
-exports.removeAgents = function(req, res, next) {
-  return UserHasVoiceQueue
-    .destroy({
-      where: {
-        UserId: req.query.agents,
-        queue: req.params.name
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return res.sendStatus(202);
-    })
-    .catch(function(err) {
-      return next(err);
-    });
-};
-
-// Deletes a voiceQueue from the DB.
-exports.destroy = function(req, res) {
-  return VoiceQueue
-    .destroy({
-      where: {
-        name: req.params.name
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes multiple voiceQueues from the DB.
-exports.bulkDestroy = function(req, res) {
-  return VoiceQueue
-    .destroy({
-      where: {
-        name: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/voice_queue/voice_queue.events.js b/server/api/voice_queue/voice_queue.events.js
index 47e7ba6..69cdbc5 100644
--- a/server/api/voice_queue/voice_queue.events.js
+++ b/server/api/voice_queue/voice_queue.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const VoiceQueue = require('../../models').VoiceQueue;
-
-var VoiceQueueEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-VoiceQueueEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  VoiceQueue.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    VoiceQueueEvents.emit(event + ':' + doc._id, doc);
-    VoiceQueueEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = VoiceQueueEvents;
\ No newline at end of file
diff --git a/server/api/voice_queue/voice_queue.socket.js b/server/api/voice_queue/voice_queue.socket.js
index 1036ff9..f085273 100644
--- a/server/api/voice_queue/voice_queue.socket.js
+++ b/server/api/voice_queue/voice_queue.socket.js
@@ -1,86 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const VoiceQueueEvents = require('./voice_queue.events');
-const VoiceQueue = require('../../models').VoiceQueue;
-const User = require('../../models').User;
-const Util = require('../../config/util');
-const _ = require('lodash');
-const Promise = require('bluebird');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('voice_queue:' + event, socket);
-
-    VoiceQueueEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    switch (event) {
-      case 'voice_queue:save':
-        return Promise
-          .all([])
-          .then(getVoiceQueues(socket))
-          .then(function(userQueues) {
-            if (_.includes(userQueues, doc.name)) {
-              socket.emit(event, doc);
-            }
-          })
-          .catch(function(err) {
-            console.log('Error filtering queues after queue save', err);
-          })
-        break;
-      case 'voice_queue:remove':
-        socket.emit(event, doc);
-        break;
-
-      default:
-
-    }
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    VoiceQueueEvents.removeListener(event, listener);
-  };
-}
-
-function getVoiceQueues(user) {
-  return function() {
-    switch (user.role) {
-      case 'user':
-        return User
-          .findById(user.userId, {
-            attributes: ['id']
-          })
-          .then(Util.getVoiceQueuesIdByUser())
-          .then(function(userQueues) {
-            return _.map(userQueues.rows, 'name');
-          });
-      case 'admin':
-        return VoiceQueue
-          .findAll()
-          .then(function(queues) {
-            return {
-              rows: queues
-            };
-          })
-          .then(function(userQueues) {
-            return _.map(userQueues.rows, 'name');
-          });
-      default:
-        return [];
-    }
-  }
-}
\ No newline at end of file
diff --git a/server/api/voice_recording/index.js b/server/api/voice_recording/index.js
index bc07dc3..6cfdaaa 100644
--- a/server/api/voice_recording/index.js
+++ b/server/api/voice_recording/index.js
@@ -1,19 +1 @@
-'use strict';
-
-var express = require('express');
-var auth = require('../../auth/auth.service');
-var controller = require('./voice_recording.controller');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), auth.hasModule([7], ['admin', 'agent']), controller.index);
-router.get('/describe', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.describe);
-router.get('/:id', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.show);
-router.get('/:id/download', controller.getStreamById);
-router.get('/:id/stream', auth.isAuthenticated(), auth.hasModule([7], ['admin', 'agent']), controller.getStream);
-router.post('/', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.create);
-router.put('/:id', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.update);
-router.delete('/', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.bulkDestroy);
-router.delete('/:id', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/voice_recording/voice_recording.controller.js b/server/api/voice_recording/voice_recording.controller.js
index 032e36d..7e1252d 100644
--- a/server/api/voice_recording/voice_recording.controller.js
+++ b/server/api/voice_recording/voice_recording.controller.js
@@ -1,215 +1 @@
-/**
- * Using Rails-like standard naming convention for endpoints.
- * GET     /api/voice/recordings              ->  index
- * POST    /api/voice/recordings              ->  create
- * GET     /api/voice/recordings/:id          ->  show
- * PUT     /api/voice/recordings/:id          ->  update
- * DELETE  /api/voice/recordings/:id          ->  destroy
- */
-
-'use strict';
-
-
-var _ = require('lodash');
-var util = require('util');
-var Util = require('../../config/util');
-
-var VoiceRecording = require('../../models').VoiceRecording;
-var User = require('../../models').User;
-var Promise = require('bluebird');
-// var base64 = Promise.promisifyAll(require('file-base64'));
-var base64 = require('file-base64');
-var fs = require('fs');
-var path = require('path');
-
-function handleError(res) {
-  return function(err) {
-    if (err.cause && err.cause.code === 'ENOENT') {
-      err = {
-        message: 'No file or directory',
-        translatedMessage: 'MESSAGE_NO_FILE_OR_DIRECTORY'
-      };
-    }
-    return res.status(500).send(err);
-  }
-}
-
-function responseWithResult(res, statusCode) {
-  statusCode = statusCode || 200;
-  return function(entity) {
-    if (entity) {
-      res.status(statusCode).json(entity);
-    }
-  };
-}
-
-function handleEntityNotFound(res) {
-  return function(entity) {
-    if (!entity) {
-      res.status(404).end();
-      return null;
-    }
-    return entity;
-  };
-}
-
-function saveUpdates(body) {
-  return function(entity) {
-    return entity
-      .updateAttributes(body);
-  };
-}
-
-function removeEntity(res) {
-  return function(entity) {
-    if (entity) {
-      return entity.destroy()
-        .then(function() {
-          res.status(204).end();
-        });
-    }
-  };
-}
-
-// Gets a list of VoiceRecordings
-exports.index = function(req, res) {
-  switch (req.user.role) {
-    case 'user':
-      return User
-        .findById(req.user.id, {
-          attributes: ['id']
-        })
-        .then(Util.getVoiceQueuesIdByUser())
-        .then(function(userQueues) {
-          var users = [];
-          var _userQueues = _.map(userQueues.rows, 'name');
-          userQueues.rows.forEach(function(queue) {
-            users = _.union(users, _.map(queue.Users, 'name'));
-          });
-          return VoiceRecording
-            .findAndCountAll(Util.getQuery(req.query, {
-              $or: {
-                queue: _userQueues,
-                membername: users
-              }
-            }))
-        })
-        .then(responseWithResult(res))
-        .catch(handleError(res));
-    case 'agent':
-      return VoiceRecording
-        .findAndCountAll(Util.getQuery(req.query, {
-          membername: req.user.name
-        }))
-        .then(responseWithResult(res))
-        .catch(handleError(res));
-    default:
-      return VoiceRecording
-        .findAndCountAll(Util.getQuery(req.query))
-        .then(responseWithResult(res))
-        .catch(handleError(res));
-  }
-}
-
-// Gets a single VoiceRecording from the DB
-exports.show = function(req, res) {
-  return VoiceRecording.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Get list of fields
-exports.describe = function(req, res) {
-  return VoiceRecording
-    .describe()
-    .then(function(fields) {
-      return res.status(200).send(fields);
-    })
-    .catch(handleError(res));
-};
-
-
-// Gets a single VoiceRecording from the DB
-exports.getStream = function(req, res) {
-  return VoiceRecording
-    .findById(req.params.id)
-    .then(function(recording) {
-      var readFile = Promise.promisify(fs.readFile);
-      return readFile(recording.value);
-    })
-    .then(function(result) {
-      var base64String = new Buffer(result, 'binary').toString('base64');
-      return base64String;
-    })
-    .then(function(base64String) {
-      return res.status(200).send({
-        downloadString: base64String
-      });
-    })
-    .catch(handleError(res));
-}
-
-//Download a Vocie Recordings: Not authenticated
-exports.getStreamById = function(req, res) {
-  var where = {};
-
-  if (req.query && req.query.hasOwnProperty('type') && req.query.type === 'uniqueid') {
-    where.uniqueid = req.params.id;
-  } else {
-    where.id = req.params.id;
-  }
-
-  return VoiceRecording
-    .findOne({
-      where: where
-    })
-    .then(handleEntityNotFound(res))
-    .then(function(recording) {
-      return res.download(recording.value, path.basename(recording.value));
-    })
-    .catch(handleError(res));
-}
-
-
-// Creates a new VoiceRecording in the DB
-exports.create = function(req, res) {
-  return VoiceRecording.create(req.body)
-    .then(responseWithResult(res, 201))
-    .catch(handleError(res));
-}
-
-// Updates an existing VoiceRecording in the DB
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  return VoiceRecording.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(saveUpdates(req.body))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-// Deletes a VoiceRecording from the DB
-exports.destroy = function(req, res) {
-  return VoiceRecording.findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(removeEntity(res))
-    .catch(handleError(res));
-}
-
-// Deletes a agent from the DB.
-exports.bulkDestroy = function(req, res) {
-  return VoiceRecording
-    .destroy({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(handleError(res));
-};
\ No newline at end of file
diff --git a/server/api/voice_recording/voice_recording.events.js b/server/api/voice_recording/voice_recording.events.js
index ac0c175..ae9a879 100644
--- a/server/api/voice_recording/voice_recording.events.js
+++ b/server/api/voice_recording/voice_recording.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const VoiceRecording = require('../../models').VoiceRecording;
-
-var VoiceRecordingEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-VoiceRecordingEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  VoiceRecording.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    VoiceRecordingEvents.emit(event + ':' + doc._id, doc);
-    VoiceRecordingEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = VoiceRecordingEvents;
\ No newline at end of file
diff --git a/server/api/voice_recording/voice_recording.socket.js b/server/api/voice_recording/voice_recording.socket.js
index 6b7ee22..95561bb 100644
--- a/server/api/voice_recording/voice_recording.socket.js
+++ b/server/api/voice_recording/voice_recording.socket.js
@@ -1,32 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const VoiceRecordingEvents = require('./voice_recording.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('voice_recording:' + event, socket);
-
-    VoiceRecordingEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    VoiceRecordingEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/voice_voicemail/index.js b/server/api/voice_voicemail/index.js
index db2e635..c5113c6 100644
--- a/server/api/voice_voicemail/index.js
+++ b/server/api/voice_voicemail/index.js
@@ -1,17 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./voice_voicemail.controller');
-var auth = require('../../auth/auth.service');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.index);
-router.get('/:uniqueid', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.show);
-router.post('/', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.create);
-router.post('/validate', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.mailboxValidation);
-router.put('/:uniqueid', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.update);
-router.delete('/', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.bulkDestroy);
-router.delete('/:uniqueid', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/voice_voicemail/voice_voicemail.controller.js b/server/api/voice_voicemail/voice_voicemail.controller.js
index 69a1139..235831d 100644
--- a/server/api/voice_voicemail/voice_voicemail.controller.js
+++ b/server/api/voice_voicemail/voice_voicemail.controller.js
@@ -1,190 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var stream = require('stream');
-var Util = require('../../config/util');
-
-var VoiceVoicemail = require('../../models').VoiceVoicemail;
-var VoiceVoicemailMessages = require('../../models').VoiceVoicemailMessages;
-
-// Get list of voice_voicemails
-exports.index = function(req, res) {
-  return VoiceVoicemail
-    .findAndCountAll(Util.getQuery(req.query))
-    .then(function(result) {
-      res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single voice_voicemail
-exports.show = function(req, res) {
-  VoiceVoicemail
-    .find({
-      where: {
-        uniqueid: req.params.uniqueid
-      }
-    })
-    .then(function(voice_voicemail) {
-      if (!voice_voicemail) {
-        return res.sendStatus(404);
-      }
-      return res.send(voice_voicemail);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// validate mailbox uniqueness
-exports.mailboxValidation = function(req, res) {
-  console.log(req.body);
-  VoiceVoicemail
-    .findAll({
-      where: {
-        mailbox: req.body.mailbox,
-        context: req.body.context
-      }
-    })
-    .then(function(voicemails) {
-      if (!voicemails) {
-        return res.sendStatus(404);
-      }
-      return res.send(voicemails);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-// Creates a new voice_voicemail in the DB.
-exports.create = function(req, res) {
-  VoiceVoicemail
-    .findAll({
-      where: {
-        mailbox: req.body.mailbox,
-        context: req.body.context
-      }
-    })
-    .then(function(voicemails) {
-      if (!voicemails) {
-        return res.sendStatus(404);
-      }
-      if (voicemails.length > 0) {
-        return res.status(500).send({
-          message: 'MESSAGE_EXIST_MAILBOX'
-        })
-      }
-      VoiceVoicemail
-        .create(req.body)
-        .then(function(voice_voicemail) {
-          return res.status(201).send(voice_voicemail);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-    })
-};
-
-// Updates an existing voice_voicemail in the DB.
-exports.update = function(req, res) {
-  VoiceVoicemail
-    .findAll({
-      where: {
-        mailbox: req.body.mailbox,
-        context: req.body.context,
-        uniqueid: {
-          $ne: req.body.uniqueid
-        }
-      }
-    })
-    .then(function(voicemails) {
-      if (!voicemails) {
-        return res.sendStatus(404);
-      }
-      if (voicemails.length > 0) {
-        return res.status(500).send({
-          message: 'MESSAGE_EXIST_MAILBOX'
-        })
-      }
-      if (req.body.uniqueid) {
-        delete req.body.uniqueid;
-      }
-      VoiceVoicemail
-        .find({
-          where: {
-            uniqueid: req.params.uniqueid
-          }
-        })
-        .then(function(voice_voicemail) {
-          if (!voice_voicemail) {
-            return res.sendStatus(404);
-          }
-          var updated = _.merge(voice_voicemail, req.body);
-          updated.save()
-            .then(function() {
-              return res.status(200).send(voice_voicemail);
-            })
-            .catch(function(err) {
-              return handleError(res, err);
-            });
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-
-};
-
-// Deletes a voice_voicemail from the DB.
-exports.destroy = function(req, res) {
-  VoiceVoicemail
-    .find({
-      where: {
-        uniqueid: req.params.uniqueid
-      }
-    })
-    .then(function(voice_voicemail) {
-      if (!voice_voicemail) {
-        return res.sendStatus(404);
-      }
-      voice_voicemail.destroy()
-        .then(function() {
-          return res.sendStatus(204);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a voice_voicemail from the DB.
-exports.bulkDestroy = function(req, res) {
-  VoiceVoicemail
-    .destroy({
-      where: {
-        uniqueid: req.query.uniqueid
-      },
-      individualHooks: true
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/voice_voicemail/voice_voicemail.events.js b/server/api/voice_voicemail/voice_voicemail.events.js
index 7f8360b..03400a6 100644
--- a/server/api/voice_voicemail/voice_voicemail.events.js
+++ b/server/api/voice_voicemail/voice_voicemail.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const VoiceVoicemail = require('../../models').VoiceVoicemail;
-
-var VoiceVoicemailEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-VoiceVoicemailEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  VoiceVoicemail.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    VoiceVoicemailEvents.emit(event + ':' + doc._id, doc);
-    VoiceVoicemailEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = VoiceVoicemailEvents;
\ No newline at end of file
diff --git a/server/api/voice_voicemail/voice_voicemail.socket.js b/server/api/voice_voicemail/voice_voicemail.socket.js
index 1c63f6d..cffb96d 100644
--- a/server/api/voice_voicemail/voice_voicemail.socket.js
+++ b/server/api/voice_voicemail/voice_voicemail.socket.js
@@ -1,32 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const VoiceVoicemailEvents = require('./voice_voicemail.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('voice_voicemail:' + event, socket);
-
-    VoiceVoicemailEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    VoiceVoicemailEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/voice_voicemail_messages/index.js b/server/api/voice_voicemail_messages/index.js
index 94f57a6..a09698e 100644
--- a/server/api/voice_voicemail_messages/index.js
+++ b/server/api/voice_voicemail_messages/index.js
@@ -1,15 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./voice_voicemail_messages.controller');
-var auth = require('../../auth/auth.service');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.index);
-router.get('/:id', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.show);
-router.get('/:id/download', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.download);
-router.delete('/', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.bulkDestroy);
-router.delete('/:id', auth.isAuthenticated(), auth.hasModule([7], ['admin']), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/voice_voicemail_messages/voice_voicemail_messages.controller.js b/server/api/voice_voicemail_messages/voice_voicemail_messages.controller.js
index f97d1a1..94417a2 100644
--- a/server/api/voice_voicemail_messages/voice_voicemail_messages.controller.js
+++ b/server/api/voice_voicemail_messages/voice_voicemail_messages.controller.js
@@ -1,106 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var stream = require('stream');
-var Util = require('../../config/util');
-
-var VoiceVoicemailMessages = require('../../models').VoiceVoicemailMessages;
-
-// Get list of voicemail messages
-exports.index = function(req, res) {
-  return VoiceVoicemailMessages
-    .scope({
-      method: ['mailbox', req.query]
-    })
-    .findAndCountAll(Util.getQuery(req.query))
-    .then(function(result) {
-      res.status(200).send(result);
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-// Get a single voicemail_message
-exports.show = function(req, res) {
-  return VoiceVoicemailMessages
-    .findById(req.params.id)
-    .then(function(voicemail_message) {
-      if (!voicemail_message) {
-        return res.sendStatus(404);
-      }
-      return res.send(voicemail_message);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a voicemail_message from the DB.
-exports.destroy = function(req, res) {
-  return VoiceVoicemailMessages
-    .findById(req.params.id)
-    .then(function(voicemail_message) {
-      if (!voicemail_message) {
-        return res.sendStatus(404);
-      }
-      voicemail_message.recording = null;
-      voicemail_message.destroy();
-    })
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes all voicemail_messages from the DB.
-exports.bulkDestroy = function(req, res) {
-  return VoiceVoicemailMessages
-    .findAll({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(function(voicemail_messages) {
-      var bulkDest = [];
-      voicemail_messages.forEach(function(message) {
-        message.recording = null;
-        bulkDest.push(message.destroy());
-      });
-      return bulkDest;
-    })
-    .all()
-    .then(function() {
-      return res.sendStatus(204);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.download = function(req, res) {
-  return VoiceVoicemailMessages
-    .findById(req.params.id)
-    .then(function(message) {
-      var base64String = new Buffer(message.recording, 'binary').toString('base64');
-      return base64String;
-    })
-    .then(function(base64String) {
-      return res.status(200).send({
-        downloadString: base64String
-      });
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/voice_voicemail_messages/voice_voicemail_messages.events.js b/server/api/voice_voicemail_messages/voice_voicemail_messages.events.js
index aa3edd9..b435112 100644
--- a/server/api/voice_voicemail_messages/voice_voicemail_messages.events.js
+++ b/server/api/voice_voicemail_messages/voice_voicemail_messages.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const VoiceVoicemailMessages = require('../../models').VoiceVoicemailMessages;
-
-var VoiceVoicemailMessagesEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-VoiceVoicemailMessagesEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  VoiceVoicemailMessages.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    VoiceVoicemailMessagesEvents.emit(event + ':' + doc._id, doc);
-    VoiceVoicemailMessagesEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = VoiceVoicemailMessagesEvents;
\ No newline at end of file
diff --git a/server/api/voice_voicemail_messages/voice_voicemail_messages.socket.js b/server/api/voice_voicemail_messages/voice_voicemail_messages.socket.js
index 3e1dac1..4017b90 100644
--- a/server/api/voice_voicemail_messages/voice_voicemail_messages.socket.js
+++ b/server/api/voice_voicemail_messages/voice_voicemail_messages.socket.js
@@ -1,32 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const VoiceVoicemailMessagesEvents = require('./voice_voicemail_messages.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('voice_voicemail_messages:' + event, socket);
-
-    VoiceVoicemailMessagesEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    VoiceVoicemailMessagesEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/widget/index.js b/server/api/widget/index.js
index 8fec508..34f154c 100644
--- a/server/api/widget/index.js
+++ b/server/api/widget/index.js
@@ -1,13 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./widget.controller');
-var auth = require('../../auth/auth.service');
-
-var router = express.Router();
-
-router.get('/counter', auth.isAuthenticated(), auth.hasModule([2], ['admin']), controller.counter);
-router.get('/table', auth.isAuthenticated(), auth.hasModule([2], ['admin']), controller.table);
-router.get('/piechart', auth.isAuthenticated(), auth.hasModule([2], ['admin']), controller.piechart);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/widget/widget.controller.js b/server/api/widget/widget.controller.js
index dbcb701..b072b50 100644
--- a/server/api/widget/widget.controller.js
+++ b/server/api/widget/widget.controller.js
@@ -1,147 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var util = require('util');
-var sequelize = require('../../models').sequelize;
-var reportBuildUtils = require('../../utils/report_build');
-var Promise = require('bluebird');
-
-// var ReportAgent = require('../../models').ReportAgent;
-// var ReportCall = require('../../models').ReportCall;
-// var ReportDial = require('../../models').ReportDial;
-// var ReportMember = require('../../models').ReportMember;
-// var ReportQueue = require('../../models').ReportQueue;
-
-
-
-exports.counter = function(req, res) {
-  return Promise
-    .all([])
-    .then(function() {
-      return req.query.table;
-    })
-    .then(reportBuildUtils.buildFilter(req.user))
-    .then(function(filter) {
-      var query = util.format("SELECT %s FROM %s", req.query.select, req.query.table);
-      if (req.query.condition) {
-        query += util.format(" WHERE %s", decodeURIComponent(req.query.condition))
-      }
-      if (!filter || filter !== 'empty') {
-        if (filter) {
-          query += req.query.condition ? ' AND ' + filter : ' WHERE ' + filter;
-        }
-        console.log(' ==== RESULTING QUERY ====');
-        console.log(query);
-        console.log(' =========================');
-        return sequelize.query(query, {
-          type: sequelize.QueryTypes.SELECT
-        });
-      } else {
-        console.log(' ==== RESULTING QUERY ====');
-        console.log('NO SUFFICIENT PERMISSIONS');
-        console.log(' =========================');
-        return [];
-      }
-    })
-    .then(function(result) {
-      return res.status(200).send({
-        result: result
-      });
-    })
-    .catch(function(err) {
-      console.log(err);
-      return handleError(res, err);
-    });
-};
-
-exports.table = function(req, res) {
-  var columns = [];
-  var elem;
-  if (req.query.fields) {
-    if (_.isArray(req.query.fields)) {
-      req.query.fields.forEach(function(element) {
-        elem = JSON.parse(element);
-        if (elem.column && elem.alias) {
-          columns.push(elem.column + ' AS "' + elem.alias + '"');
-        }
-      });
-    } else if (_.isString(req.query.fields)) {
-      elem = JSON.parse(req.query.fields);
-      if (elem.column && elem.alias) {
-        columns.push(elem.column + ' AS "' + elem.alias + '"');
-      }
-    }
-  }
-  var select = columns.length ? columns.join(',') : '*';
-  sequelize.query(util.format("SELECT %s FROM %s WHERE %s", select, 'report' + req.query.table, decodeURIComponent(req.query.condition)), {
-      type: sequelize.QueryTypes.SELECT
-    })
-    .then(function(result) {
-      return res.status(200).send(result);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.piechart = function(req, res) {
-  return Promise
-    .all([])
-    .then(function() {
-      return req.query.table;
-    })
-    .then(reportBuildUtils.buildFilter(req.user))
-    .then(function(filter) {
-      var columns = [];
-      var elem;
-      if (req.query.fields) {
-        if (_.isArray(req.query.fields)) {
-          req.query.fields.forEach(function(element) {
-            elem = JSON.parse(element);
-            if (elem.column && elem.alias) {
-              columns.push(elem.column + ' AS "' + elem.alias + '"');
-            }
-          });
-        } else if (_.isString(req.query.fields)) {
-          elem = JSON.parse(req.query.fields);
-          if (elem.column && elem.alias) {
-            columns.push(elem.column + ' AS "' + elem.alias + '"');
-          }
-        }
-      }
-      var select = columns.length ? columns.join(',') : '*';
-      var where = '';
-      if (req.query.condition !== 'undefined') {
-        where = util.format(' WHERE %s', decodeURIComponent(req.query.condition));
-      }
-      if (!filter || filter !== 'empty') {
-        if (filter) {
-          where += ' AND ' + filter;
-        }
-        var query = util.format("SELECT %s FROM %s%s", select, req.query.table, where);
-        console.log(' ==== RESULTING QUERY ====');
-        console.log(query);
-        console.log(' =========================');
-        return sequelize.query(query, {
-          type: sequelize.QueryTypes.SELECT
-        });
-      } else {
-        console.log(' ==== RESULTING QUERY ====');
-        console.log('NO SUFFICIENT PERMISSIONS');
-        console.log(' =========================');
-        return [];
-      }
-    })
-    .then(function(result) {
-      return res.status(200).send({
-        result: result
-      });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/xchatty/index.js b/server/api/xchatty/index.js
index d408579..ad3e57a 100644
--- a/server/api/xchatty/index.js
+++ b/server/api/xchatty/index.js
@@ -1,28 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./xchatty.controller');
-var license = require('../../config/license/license.service');
-
-var router = express.Router();
-
-router.get('/jquery', controller.getJqueryLibrary);
-router.get('/assets', controller.getAssets);
-
-router.get('/submit', controller.submitEnquiry);
-router.get('/rating', controller.setRating);
-
-router.get('/:id', license.isValidDate(), license.hasChat(), controller.getJsByWebsite);
-router.get('/:id/abandon', license.isValidDate(), license.hasChat(), controller.abandonCustomer);
-router.get('/:id/html', license.isValidDate(), license.hasChat(), controller.getHtmlByWebsite);
-router.get('/:id/proactive', license.isValidDate(), license.hasChat(), controller.getProactiveActionsByWebsite);
-router.get('/:id/read', license.isValidDate(), license.hasChat(), controller.getMessages);
-router.get('/:id/send', license.isValidDate(), license.hasChat(), controller.sendMessage);
-router.get('/:id/signout', license.isValidDate(), license.hasChat(), controller.signoutCustomer);
-router.get('/:id/signup', license.isValidDate(), license.hasChat(), controller.signupCustomer);
-router.get('/:id/status', license.isValidDate(), license.hasChat(), controller.getStatusByWebsite);
-router.get('/:id/styles', license.isValidDate(), license.hasChat(), controller.getStyleByWebsite);
-router.get('/:id/transcript', license.isValidDate(), license.hasChat(), controller.getTranscript);
-router.get('/:id/unserved', license.isValidDate(), license.hasChat(), controller.unservedCustomer);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/xchatty/xchatty.controller.js b/server/api/xchatty/xchatty.controller.js
index 44ed89c..2b5daf1 100644
--- a/server/api/xchatty/xchatty.controller.js
+++ b/server/api/xchatty/xchatty.controller.js
@@ -1,1126 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var jsmin = require('jsmin').jsmin;
-var Mustache = require('mustache');
-var querystring = require('querystring');
-var path = require('path');
-var md5 = require('md5');
-var fs = require('fs');
-var UAParser = require('ua-parser-js');
-var uaParser = new UAParser();
-var languageParser = require('accept-language-parser');
-var ipaddr = require('ipaddr.js');
-var geoip = require('geoip-lite');
-var csv = require('to-csv');
-var util = require('util');
-var moment = require('moment');
-
-var Scheduler = require('../../config/routing/scheduler');
-var config = require('../../config/environment');
-var xchatty_components = require('../../components/xchatty');
-var Util = require('../../config/util');
-var license = require('../../config/license/license.service');
-var demoLicense = {
-  users: 1,
-  agents: 1,
-  telephones: 0,
-  chat: false,
-  mail: false,
-  fax: false,
-  messaging: false,
-  cm: false,
-  dialer: false,
-  jscripty: false,
-  update: false,
-  custom: false,
-  description: 'DEMO LICENSE'
-};
-
-var sequelize = require('../../models').sequelize;
-var User = require('../../models').User;
-var Agent = require('../../models').User;
-var ChatRoom = require('../../models').ChatRoom;
-var ChatEnquiry = require('../../models').ChatEnquiry;
-var ChatVisitor = require('../../models').ChatVisitor;
-var ChatMessage = require('../../models').ChatMessage;
-var ChatWebsite = require('../../models').ChatWebsite;
-var ChatWebsitesField = require('../../models').ChatWebsitesField;
-var ChatProactiveAction = require('../../models').ChatProactiveAction;
-var ReportChatSession = require('../../models').ReportChatSession;
-var ChatQueue = require('../../models').ChatQueue;
-var License = require('../../models').License;
-var Xchatty = require('../../models').Xchatty;
-var Setting = require('../../models').Setting;
-const Contact = require('../../models').Contact;
-
-
-var id = 1;
-
-// Get list of xchattys
-exports.index = function(req, res, next) {
-  return Xchatty
-    .findAll()
-    .then(function(xchattys) {
-      return res.status(200).send(xchattys);
-    })
-    .catch(function(err) {
-      return next(err);
-    });
-};
-
-exports.getJsByWebsite = function(req, res, next) {
-
-  // TO DO: Find the configuration of the website and replace configuration in the file
-  ChatWebsite
-    .findById(req.params.id)
-    .then(function(chatWebsite) {
-      res.set({
-        'Content-Type': 'application/javascript',
-        'x-timestamp': Date.now(),
-        'x-sent': true
-      });
-
-      var js = xchatty_components.js;
-      /*jshint multistr: true */
-      var configJS = {
-        websiteId: req.params.id,
-        // rootPath: path.join(chatWebsite.remote, 'api', 'xchatty/'),
-        rootPath: Util.stripTrailingSlash(chatWebsite.remote) + '/api/xchatty/',
-        signedUp: 'false',
-        windowFocused: 'false',
-        isNewPage: 'true',
-        processingSignUp: 'false',
-        processingEnquiry: 'false',
-        processingSend: 'false',
-        processingRating: 'false',
-        visitorFullname: '""',
-        visitorAvatar: '""',
-        timerReadMessages: 'null',
-        timerCheckStatus: 'null',
-        isOnline: 'false',
-        decayHistory: 0,
-        defaultTimeout: 5000,
-        isInitialStatusCheck: 'true',
-        muteNotificationSoundOnce: 'false',
-        assetBase: Util.stripTrailingSlash(chatWebsite.remote) + '/api/xchatty/assets',
-        hasSessionSaf: 'false',
-        restoreOpenState: 'false',
-        animateHover: chatWebsite.animation,
-        hideEmail: 'false',
-        hideOffline: 'false',
-        headerShape: chatWebsite.header_shape,
-        HeaderOnline: chatWebsite.header_online,
-        OnlineMessage: chatWebsite.online_message,
-        UsernamePlaceholder: chatWebsite.username_placeholder,
-        EmailPlaceholder: chatWebsite.email_placeholder,
-        StartChatButtonText: chatWebsite.start_chat_button,
-        OfflineMessage: chatWebsite.offline_message,
-        HeaderOffline: chatWebsite.header_offline,
-        EnquiryMessagePlaceholder: chatWebsite.enquiry_message_placeholder,
-        EnquiryButtonText: chatWebsite.enquiry_button,
-        downloadTranscript: chatWebsite.download_transcript,
-        RatingMessage: chatWebsite.rating_message,
-        RatingSend: chatWebsite.rating_send,
-        RatingSkip: chatWebsite.rating_skip,
-        MessageAgentsBusy: chatWebsite.agents_busy,
-        NameTitle: chatWebsite.name_title,
-        EmailTitle: chatWebsite.email_title,
-        MessageTitle: chatWebsite.message_title
-      };
-
-      js = Mustache.render(js, configJS);
-      res.send(js);
-
-    })
-    .catch(function(err) {
-      next(err);
-    });
-
-};
-
-exports.getStyleByWebsite = function(req, res, next) {
-
-  // TO DO: Find the configuration of the website and replace configuration in the file
-  ChatWebsite
-    .findById(req.params.id)
-    .then(function(chatWebsite) {
-
-      res.set({
-        'Content-Type': 'text/css',
-        'x-timestamp': Date.now(),
-        'x-sent': true
-      });
-
-      var css = xchatty_components.css;
-
-      var configCSS = {
-        // assetBase: path.join(chatWebsite.remote, 'api', 'xchatty',
-        //   'assets'),
-        assetBase: Util.stripTrailingSlash(chatWebsite.remote) + '/api/xchatty/assets',
-        color: chatWebsite.color,
-        colorFocus: chatWebsite.color_focus,
-        colorButton: chatWebsite.color_button
-      };
-
-      css = Mustache.render(css, configCSS);
-      res.send(css);
-    })
-    .catch(function(err) {
-      next(err);
-    });
-};
-
-exports.getAssets = function(req, res, next) {
-  if (req.query.hasOwnProperty('uploaded')) {
-    res.download(path.join(config.root, 'server', 'files', req.query.resource));
-  } else {
-    res.download(path.join(config.root, 'server', 'components', 'xchatty', 'assets', req.query.resource));
-  }
-};
-
-exports.getJqueryLibrary = function(req, res, next) {
-
-  // TODO: Find the configuration of the website and replace configuration in the file
-  res.set({
-    'Content-Type': 'application/javascript',
-    'x-timestamp': Date.now(),
-    'x-sent': true
-  });
-
-  var jquery = xchatty_components.jquery;
-  res.send(jquery);
-
-};
-
-exports.getStatus = function(req, res, next) {
-
-  if (!req.session.xchatty) {
-    req.session.xchatty = {};
-  }
-
-  var _jsonResponse = {};
-
-  return Agent
-    .findAll({
-      where: {
-        online: true,
-        role: 'agent'
-      }
-    })
-    .then(function(agents) {
-      if (req.query.data.open_state)
-        req.session.xchatty.open_state = req.query.data.open_state === 'true' ? true : false;
-      _jsonResponse = {
-        success: true,
-        has_session_saf: null,
-        signed_up: req.session.xchatty.room_id ? true : false,
-        fullname: req.session.xchatty.fullname ? req.session.xchatty.fullname : '',
-        email: req.session.xchatty.email ? req.session.xchatty.email : '',
-        avatar: req.session.xchatty.avatar ? req.session.xchatty.avatar : '',
-        open_state: req.session.xchatty.open_state || req.session.xchatty.room_id ? true : false,
-        online: agents.length ? true : false,
-        is_unserved: false,
-        room_id: 0
-      };
-      return;
-    })
-    .then(function() {
-      if (req.session.xchatty.visitor_id) {
-        return ChatRoom
-          .findOne({
-            where: {
-              ChatVisitorId: req.session.xchatty.visitor_id,
-              status: 'OPEN',
-              token: {
-                $ne: ''
-              }
-            }
-          });
-      }
-      return;
-    })
-    .then(function(chatRoom) {
-      if (chatRoom) {
-        req.session.xchatty.room_id = chatRoom.id;
-        _jsonResponse.room_id = chatRoom.id;
-        _jsonResponse.signed_up = true;
-      } else {
-        _jsonResponse.signed_up = false;
-      }
-      return;
-    })
-    .then(function() {
-      if (req.session.xchatty.visitor_id) {
-        return ChatVisitor
-          .findOne({
-            where: {
-              id: req.session.xchatty.visitor_id,
-              status: 'unserved'
-            }
-          })
-      }
-      return;
-    })
-    .then(function(visitor) {
-      if (visitor) {
-        _jsonResponse.is_unserved = true;
-      }
-      return res.send(req.query.callback + '(' + JSON.stringify(_jsonResponse) + ')');
-    })
-    .catch(function(err) {
-      return next(err);
-    });
-};
-
-exports.getMessages = function(req, res, next) {
-
-  var _websiteId = req.params.id;
-
-  /*jshint multistr: true */
-  var condition = {
-    where: {
-      ChatRoomId: req.session.xchatty[_websiteId].room_id
-    },
-    include: [{
-      model: User,
-      attributes: ['id', 'name', 'fullname', 'email']
-    }, {
-      model: ChatVisitor,
-      attributes: ['id', 'fullname', 'email']
-    }]
-  };
-
-  if (req.query.data.is_new_page === 'false') {
-    condition.where.id = {
-      $gt: req.query.data.last_id
-    };
-  }
-
-  ChatMessage
-    .findAll(condition)
-    .then(function(chatMessages) {
-      var json = {
-        success: true,
-        messages: chatMessages,
-        composing: false,
-        composing_fullname: null
-      };
-
-      res.send(req.query.callback + '(' + JSON.stringify(json) + ')');
-    })
-    .catch(function(err) {
-      next(err);
-    });
-};
-
-exports.sendMessage = function(req, res, next) {
-
-  var _websiteId = req.params.id;
-
-  /*jshint multistr: true */
-  var condition = {
-    where: {
-      ChatRoomId: req.session.xchatty[_websiteId].room_id
-    },
-    include: [{
-      model: User,
-      attributes: ['id', 'name', 'fullname', 'email']
-    }, {
-      model: ChatVisitor,
-      attributes: ['id', 'fullname', 'email']
-    }]
-  };
-
-  if (req.query.data.is_new_page === 'false') {
-    condition.where.id = {
-      $gt: req.query.data.last_id
-    };
-  }
-
-  ChatMessage
-    .create({
-      body: req.query.data.Message.message,
-      ChatRoomId: req.session.xchatty[_websiteId].room_id,
-      ChatVisitorId: req.session.xchatty[_websiteId].visitor_id
-    })
-    .then(function(chatMessage) {
-      ChatMessage
-        .findAll(condition)
-        .then(function(chatMessages) {
-          var json = {
-            errors: [],
-            success: true,
-            data: chatMessage,
-            messages: chatMessages
-          };
-
-          res.send(req.query.callback + '(' + JSON.stringify(json) + ')');
-        })
-        .catch(function(err) {
-          next(err);
-        });
-    })
-    .catch(function(err) {
-      next(err);
-    });
-
-};
-
-exports.signoutCustomer = function(req, res, next) {
-
-  var _websiteId = req.params.id;
-
-  return ChatRoom
-    .findById(req.session.xchatty[_websiteId].room_id)
-    .then(function(chatRoom) {
-      return chatRoom
-        .update({
-          status: 'CLOSED',
-          completeReason: 'requester'
-        });
-    })
-    .then(function() {
-      var json = {
-        success: true,
-        errors: []
-      };
-      req.session.xchatty[_websiteId] = {};
-      res.send(req.query.callback + '(' + JSON.stringify(json) + ')');
-    })
-    .catch(function(err) {
-      next(err);
-    });
-};
-
-exports.signupCustomer = function(req, res, next) {
-
-  var _websiteId = req.params.id;
-
-  var ua = uaParser.setUA(req.headers['user-agent']).getResult();
-  var languages = languageParser.parse(req.headers['accept-language']);
-  var remoteAddress = req.headers['x-forwarded-for'] ? req.headers['x-forwarded-for'] : req.connection.remoteAddress || req.ip;
-
-  var body = {
-    fullname: req.query.data.Discussion.fullname,
-    email: req.query.data.Discussion.email,
-    remote_address: remoteAddress,
-    user_agent: req.headers['user-agent'],
-    visitor_language: req.headers['accept-language'],
-    referer: req.headers.referer,
-    origin: 'webchat',
-    browser: ua.browser.name + ' ' + ua.browser.version,
-    engine: ua.engine.name + ' ' + ua.engine.version,
-    os: ua.os.name + ' ' + ua.os.version,
-    device: ua.device.model ? ua.device.model + ' ' + ua.device.vendor + ' ' + ua.device.type : null,
-    ChatWebsiteId: req.query.chatWebsiteId
-  };
-
-  if (req.query.data.Discussion.data1 && req.query.data.Discussion.labelData1) {
-    body.data1 = req.query.data.Discussion.data1;
-    if (_.isArray(body.data1)) {
-      body.data1 = _.join(body.data1, ',');
-    }
-    body.labelData1 = req.query.data.Discussion.labelData1;
-  }
-  if (req.query.data.Discussion.data2 && req.query.data.Discussion.labelData2) {
-    body.data2 = req.query.data.Discussion.data2;
-    if (_.isArray(body.data2)) {
-      body.data2 = _.join(body.data2, ',');
-    }
-    body.labelData2 = req.query.data.Discussion.labelData2;
-  }
-  if (req.query.data.Discussion.data3 && req.query.data.Discussion.labelData3) {
-    body.data3 = req.query.data.Discussion.data3;
-    if (_.isArray(body.data3)) {
-      body.data3 = _.join(body.data3, ',');
-    }
-    body.labelData3 = req.query.data.Discussion.labelData3;
-  }
-
-  var _chatVisitor, _chatWebsite, _chatRoom;
-
-  return ChatVisitor
-    .create(body)
-    .then(function(chatVisitor) {
-
-      _chatVisitor = chatVisitor;
-      return ChatWebsite
-        .findById(_chatVisitor.ChatWebsiteId);
-    })
-    .then(function(website) {
-      _chatWebsite = website;
-
-      if (_chatWebsite.ListId) {
-        return Contact
-          .findOrCreate({
-            where: {
-              email: _chatVisitor.email,
-            },
-            defaults: {
-              email: _chatVisitor.email,
-              firstName: _chatVisitor.fullname,
-              ListId: _chatWebsite.ListId
-            }
-          });
-      }
-    })
-    .then(function() {
-      return ChatRoom
-        .create({
-          type: 'external',
-          ChatVisitorId: _chatVisitor.id,
-          ChatWebsiteId: _chatWebsite.id,
-          contact: _chatVisitor.email,
-          website: _chatWebsite.name
-        });
-    })
-    .then(function(chatRoom) {
-      _chatRoom = chatRoom;
-
-      var scheduler = new Scheduler({
-        channel: 'chat',
-        uniqueid: util.format('%s.%s', moment().unix(), _chatRoom.id),
-        roomid: _chatRoom.id,
-        websiteid: _chatWebsite.id,
-        websitename: _chatWebsite.name,
-        websiteaddress: _chatWebsite.address,
-        accountid: _chatWebsite.id,
-        accountname: _chatWebsite.name,
-        accountaddress: _chatWebsite.address,
-        visitorid: _chatVisitor.id,
-        visitorname: _chatVisitor.fullname,
-        visitoremail: _chatVisitor.email
-      })
-
-      scheduler.init();
-
-      req.session.xchatty[_websiteId].fullname = _chatVisitor.fullname;
-      req.session.xchatty[_websiteId].email = _chatVisitor.email;
-      req.session.xchatty[_websiteId].avatar = md5(_chatVisitor.email).toString('base64');
-      req.session.xchatty[_websiteId].visitor_id = _chatVisitor.id;
-
-      var json = {
-        success: true,
-        errors: [],
-        chatVisitor: {
-          id: _chatVisitor.id
-        }
-      };
-
-      /*jshint multistr: true */
-      res.send(req.query.callback + '(' + JSON.stringify(json) + ')');
-    })
-    .catch(function(err) {
-      next(err);
-    });
-};
-
-exports.unservedCustomer = function(req, res, next) {
-
-  var _websiteId = req.params.id;
-
-  return ChatVisitor
-    .findById(req.session.xchatty[_websiteId].visitor_id)
-    .then(function(chatVisitor) {
-      return chatVisitor
-        .update({
-          status: 'unserved'
-        });
-    })
-    .then(function() {
-      var json = {
-        success: true,
-        errors: []
-      };
-      req.session.xchatty[_websiteId] = {};
-      res.send(req.query.callback + '(' + JSON.stringify(json) + ')');
-    })
-    .catch(function(err) {
-      next(err);
-    });
-};
-
-exports.submitEnquiry = function(req, res, next) {
-
-  return sequelize.transaction().then(function(t) {
-
-    var remoteAddress = req.headers['x-forwarded-for'] ? req.headers['x-forwarded-for'] : req.connection.remoteAddress || req.ip;
-
-    var ua = uaParser.setUA(req.headers['user-agent']).getResult();
-    var languages = languageParser.parse(req.headers['accept-language']);
-    var body = {
-      fullname: req.query.data.Enquiry.fullname,
-      email: req.query.data.Enquiry.email,
-      remote_address: remoteAddress,
-      user_agent: req.headers['user-agent'],
-      visitor_language: req.headers['accept-language'],
-      browser: ua.browser.name + ' ' + ua.browser.version,
-      engine: ua.engine.name + ' ' + ua.engine.version,
-      os: ua.os.name + ' ' + ua.os.version,
-      device: ua.device.model ? ua.device.model + ' ' + ua.device.vendor + ' ' + ua.device.type : null,
-      referer: req.headers.referer,
-      origin: 'enquiry',
-      status: 'unserved',
-      ChatWebsiteId: parseInt(req.query.data.Enquiry.websiteId, 10),
-      ChatEnquiry: {
-        username: req.query.data.Enquiry.fullname,
-        email: req.query.data.Enquiry.email,
-        text: req.query.data.Enquiry.message,
-        ChatWebsiteId: parseInt(req.query.data.Enquiry.websiteId, 10)
-      }
-    };
-
-    if (req.query.data.Enquiry.offlineData1 && req.query.data.Enquiry.labelOfflineData1) {
-      body.offlineData1 = req.query.data.Enquiry.offlineData1;
-      if (_.isArray(body.offlineData1)) {
-        body.offlineData1 = _.join(body.offlineData1, ',');
-      }
-      body.labelOfflineData1 = req.query.data.Enquiry.labelOfflineData1;
-    }
-    if (req.query.data.Enquiry.offlineData2 && req.query.data.Enquiry.labelOfflineData2) {
-      body.offlineData2 = req.query.data.Enquiry.offlineData2;
-      if (_.isArray(body.offlineData2)) {
-        body.offlineData2 = _.join(body.offlineData2, ',');
-      }
-      body.labelOfflineData2 = req.query.data.Enquiry.labelOfflineData2;
-    }
-    if (req.query.data.Enquiry.offlineData3 && req.query.data.Enquiry.labelOfflineData3) {
-      body.offlineData3 = req.query.data.Enquiry.offlineData3;
-      if (_.isArray(body.offlineData3)) {
-        body.offlineData3 = _.join(body.offlineData3, ',');
-      }
-      body.labelOfflineData3 = req.query.data.Enquiry.labelOfflineData3;
-    }
-    var _chatVisitor;
-    return ChatVisitor
-      .create(body, {
-        transaction: t,
-        include: [{
-          model: ChatEnquiry
-        }]
-      })
-      .then(function(chatVisitor) {
-
-        _chatVisitor = chatVisitor;
-        return ChatWebsite
-          .findById(_chatVisitor.ChatWebsiteId);
-      })
-      .then(function(website) {
-        if (website.ListId) {
-          return Contact
-            .findOrCreate({
-              where: {
-                email: _chatVisitor.email,
-              },
-              defaults: {
-                email: _chatVisitor.email,
-                firstName: _chatVisitor.fullname,
-                ListId: website.ListId
-              }
-            });
-        }
-      })
-      .then(function() {
-        t.commit();
-        res.send(req.query.callback + '(' + JSON.stringify({
-          success: true,
-          errors: []
-        }) + ')');
-      })
-      .catch(function(err) {
-        t.rollback();
-        next(err);
-      });
-  });
-};
-
-exports.getTranscript = function(req, res, next) {
-
-  var _websiteId = req.params.id;
-
-  if (req.session.xchatty[_websiteId] && req.session.xchatty[_websiteId].visitor_id && req.session.xchatty[_websiteId].room_id) {
-    ChatMessage
-      .findAll({
-        where: {
-          ChatRoomId: req.session.xchatty[_websiteId].room_id
-        },
-        include: [{
-          model: Agent,
-          attributes: ['id', 'fullname']
-        }, {
-          model: ChatVisitor,
-          attributes: ['id', 'fullname']
-        }]
-      })
-      .then(function(chatMessages) {
-        var chatMessageForCSV = [];
-        chatMessages.forEach(function(chatMessage) {
-          var chatMsg = {
-            name: chatMessage.UserId ? chatMessage.User.fullname : chatMessage.ChatVisitor.fullname,
-            text: chatMessage.body.replace(/(\r\n|\n|\r)/gm, " "),
-            date: chatMessage.createdAt
-          };
-          chatMessageForCSV.push(chatMsg);
-        });
-        var csv_transcript = csv(chatMessageForCSV);
-        res.type('text/csv').status(200).send(csv_transcript);
-      })
-      .catch(function(err) {
-        next(err);
-      });
-  }
-};
-
-// Get a single xchatty
-exports.show = function(req, res, next) {
-  return Xchatty
-    .findById(req.params.id)
-    .then(function(xchatty) {
-      if (!xchatty) {
-        return res.sendStatus(404);
-      }
-      return res.send(xchatty);
-    })
-    .catch(function(err) {
-      return next(err);
-    });
-};
-
-// Creates a new xchatty in the DB.
-exports.create = function(req, res, next) {
-  return Xchatty
-    .create(req.body)
-    .then(function(xchatty) {
-      return res.status(201).send(xchatty);
-    })
-    .catch(function(err) {
-      return next(err);
-    });
-};
-
-// Updates an existing xchatty in the DB.
-exports.update = function(req, res, next) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-
-  return Xchatty
-    .findById(req.params.id)
-    .then(function(xchatty) {
-      if (!xchatty) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(xchatty, req.body);
-      updated.save()
-        .then(function() {
-          return res.status(200).send(xchatty);
-        })
-        .catch(function(err) {
-          return next(err);
-        });
-    })
-    .catch(function(err) {
-      return next(err);
-    });
-};
-
-// Deletes a xchatty from the DB.
-exports.destroy = function(req, res, next) {
-  return Xchatty
-    .findById(req.params.id)
-    .then(function(xchatty) {
-      if (!xchatty) {
-        return res.sendStatus(404);
-      }
-      xchatty.destroy()
-        .then(function() {
-          return res.sendStatus(204);
-        })
-        .catch(function(err) {
-          return next(err);
-        });
-    })
-    .catch(function(err) {
-      return next(err);
-    });
-};
-
-
-exports.getHtmlByWebsite = function(req, res, next) {
-  var chatWebsite, myLicense, _settings;
-  var template = xchatty_components.template;
-  return ChatWebsite
-    .findById(req.params.id, {
-      include: [{
-        all: true
-      }]
-    })
-    .then(function(_chatWebsite) {
-      chatWebsite = _chatWebsite;
-      return Setting
-        .findById(1);
-    })
-    .then(function(settings) {
-      _settings = settings;
-      return License
-        .findById(1);
-    })
-    .then(function(_license) {
-
-      if (_license) {
-        myLicense = JSON.parse(license.decrypt(_license.dataValues.license, _license.data1));
-      } else {
-        myLicense = demoLicense;
-      }
-
-      var configWebsite = {
-        rootPath: Util.stripTrailingSlash(chatWebsite.remote) + '/api/xchatty/',
-        assetBase: Util.stripTrailingSlash(chatWebsite.remote) + '/api/xchatty/assets',
-        websiteId: chatWebsite.id,
-        headerShape: chatWebsite.header_shape,
-        enquiryEnable: chatWebsite.enquiry_enable,
-        onlineFields: chatWebsite.Online,
-        logo: function() {
-          if (myLicense.custom && !chatWebsite.defaultLogo && chatWebsite.logo) {
-            return 'images/' + chatWebsite.logo + '&uploaded';
-          } else {
-            return 'images/motionLogo.png';
-          }
-        },
-        whiteLabel: function() {
-          if (myLicense.custom && !chatWebsite.defaultWhiteLabel) {
-            return chatWebsite.whiteLabel;
-          } else {
-            return '<a href="http://www.xcallymotion.com/" target="_blank">Powered by xCALLY</a>';
-          }
-        },
-        renderedOnlineField: function() {
-          var renderedElement = '';
-          var element = this;
-          switch (this.component) {
-            case 'textInput':
-              renderedElement = '<div class="xc_div_group">';
-              renderedElement += util.format('<label class="xc_label" for="%d">%s %s</label>', element.index, element.label, element.required ? '*' : '');
-              renderedElement += util.format('<input data-label="%s" type="text" id="%d" name="data[Discussion][data%d]" placeholder="%s" %s/>', element.label, element.index, element.index +
-                1,
-                element.placeholder, element.required ?
-                'required' :
-                '');
-              renderedElement += '</div>';
-              break;
-            case 'textArea':
-              renderedElement = '<div class="xc_div_group">';
-              renderedElement += util.format('<label class="xc_label" for="%d">%s %s</label>', element.index, element.label, element.required ? '*' : '');
-              renderedElement += util.format('<textarea id="%d" data-label="%s" name="data[Discussion][data%d]" placeholder="%s" %s></textarea>', element.index, element.label, element.index +
-                1,
-                element.placeholder, element.required ?
-                'required' :
-                '');
-              renderedElement += '</div>';
-              break;
-            case 'checkbox':
-              renderedElement = '<div class="xc_div_group">';
-              renderedElement += util.format('<label class="xc_label">%s</label>', element.label);
-              _.forEach(element.options, function(item) {
-                renderedElement += '<label style="display:block;">';
-                renderedElement += util.format('<input type="checkbox" name="data[Discussion][data%d]" value="%s"> %s<br>', element.index + 1, item, item);
-                renderedElement += '</label>';
-              });
-              renderedElement += '</div>';
-              break;
-            case 'radio':
-              renderedElement = '<div class="xc_div_group">';
-              renderedElement += util.format('<label class="xc_label">%s</label>', element.label);
-              _.forEach(element.options, function(item) {
-                renderedElement += '<label style="display:block;">';
-                renderedElement += util.format('<input type="radio" name="data[Discussion][data%d]" value="%s"> %s<br>', element.index + 1, item, item);
-                renderedElement += '</label>';
-              });
-              renderedElement += '</div>';
-              break;
-            case 'select':
-              renderedElement = '<div class="xc_div_group">';
-              renderedElement += util.format('<label class="xc_label" for="%d">%s</label>', element.index, element.label);
-              renderedElement += util.format('<select name="data[Discussion][data%d]">', element.index + 1);
-              _.forEach(element.options, function(item) {
-                renderedElement += util.format('<option value="%s">%s</option>', item, item);
-              });
-              renderedElement += '</select></div>';
-              break;
-          }
-          renderedElement += '<br>';
-          renderedElement += util.format('<input type="hidden" name="data[Discussion][labelData%d]" value="%s">', element.index + 1, element.label);
-          return renderedElement;
-        },
-        offlineFields: chatWebsite.Offline,
-        renderedOfflineField: function() {
-          var renderedElement = '';
-          var element = this;
-          switch (this.component) {
-            case 'textInput':
-              renderedElement = '<div class="xc_div_group">';
-              renderedElement += util.format('<label class="xc_label" for="offline%d">%s %s</label>', element.index, element.label, element.required ? '*' : '');
-              renderedElement += util.format('<input data-label="%s" type="text" id="offline%d" name="data[Enquiry][offlineData%d]" placeholder="%s" %s/>', element.label, element.index,
-                element.index +
-                1,
-                element.placeholder, element.required ?
-                'required' :
-                '');
-              renderedElement += '</div>';
-              break;
-            case 'textArea':
-              renderedElement = '<div class="xc_div_group">';
-              renderedElement += util.format('<label class="xc_label" for="offline%d">%s %s</label>', element.index, element.label, element.required ? '*' : '');
-              renderedElement += util.format('<textarea id="offline%d" data-label="%s" name="data[Enquiry][offlineData%d]" placeholder="%s" %s></textarea>', element.index, element.label,
-                element.index +
-                1,
-                element.placeholder, element.required ?
-                'required' :
-                '');
-              renderedElement += '</div>';
-              break;
-            case 'checkbox':
-              renderedElement = '<div class="xc_div_group">';
-              renderedElement += util.format('<label class="xc_label">%s</label>', element.label);
-              _.forEach(element.options, function(item) {
-                renderedElement += '<label style="display:block;">';
-                renderedElement += util.format('<input type="checkbox" name="data[Enquiry][offlineData%d]" value="%s"> %s<br>', element.index + 1, item, item);
-                renderedElement += '</label>';
-              });
-              renderedElement += '</div>';
-              break;
-            case 'radio':
-              renderedElement = '<div class="xc_div_group">';
-              renderedElement += util.format('<label class="xc_label">%s</label>', element.label);
-              _.forEach(element.options, function(item) {
-                renderedElement += '<label style="display:block;">';
-                renderedElement += util.format('<input type="radio" name="data[Enquiry][offlineData%d]" value="%s"> %s<br>', element.index + 1, item, item);
-                renderedElement += '</label>';
-              });
-              renderedElement += '</div>';
-              break;
-            case 'select':
-              renderedElement = '<div class="xc_div_group">';
-              renderedElement += util.format('<label class="xc_label">%s</label>', element.label);
-              renderedElement += util.format('<select name="data[Enquiry][offlineData%d]">', element.index + 1);
-              _.forEach(element.options, function(item) {
-                renderedElement += util.format('<option value="%s">%s</option>', item, item);
-              });
-              renderedElement += '</select></div>';
-              break;
-          }
-          renderedElement += '<br>';
-          renderedElement += util.format('<input type="hidden" name="data[Enquiry][labelOfflineData%d]" value="%s">', element.index + 1, element.label);
-          return renderedElement;
-        }
-      };
-      template = Mustache.render(template, configWebsite);
-      return res.status(200).jsonp(template);
-    })
-    .catch(function(err) {
-      return next(err);
-    });
-};
-
-exports.getProactiveActionsByWebsite = function(req, res, next) {
-  return ChatWebsite
-    .findById(req.params.id, {
-      include: [{
-        model: ChatProactiveAction
-      }]
-    })
-    .then(function(chatWebsite) {
-      if (!chatWebsite) {
-        return res.status(400).jsonp({});
-      }
-      return res.status(200).jsonp(chatWebsite.ChatProactiveActions);
-    })
-    .catch(function(err) {
-      return next(err);
-    });
-};
-
-exports.setRating = function(req, res, next) {
-  return ChatRoom
-    .findById(req.query.data.Rating.room_id)
-    .then(function(chatRoom) {
-      if (!chatRoom) {
-        return res.status(400).jsonp({});
-      }
-      if (req.query.data.Rating.hasOwnProperty('rating') && req.query.data.Rating.hasOwnProperty('message')) {
-        return chatRoom
-          .update({
-            rating: req.query.data.Rating.rating,
-            ratingMessage: req.query.data.Rating.message
-          });
-      }
-      return;
-    })
-    .then(function() {
-      return res.status(200).jsonp({});
-    })
-    .catch(function(err) {
-      return res.status(400).jsonp(err);
-    });
-}
-
-exports.abandonCustomer = function(req, res, next) {
-  var _websiteId = req.params.id;
-  if (req.session && req.session.xchatty) {
-    if (req.session.xchatty.hasOwnProperty(_websiteId) && req.session.xchatty[_websiteId].hasOwnProperty('visitor_id') && req.session.xchatty[_websiteId].visitor_id > 0) {
-      return ReportChatSession
-        .find({
-          where: {
-            visitorid: req.session.xchatty[_websiteId].visitor_id,
-            leaveAt: null
-          }
-        })
-        .then(function(reportChatSession) {
-          if (!reportChatSession) {
-            return;
-          }
-          return reportChatSession
-            .update({
-              abandon: true,
-              leaveAt: moment().format("YYYY-MM-DD HH:mm:ss")
-            });
-        })
-        .then(function() {
-          return res.status(200).jsonp({});
-        })
-        .catch(function(err) {
-          res.status(500).jsonp({});
-        });
-    }
-  }
-  return res.status(200).jsonp({});
-}
-
-exports.getStatusByWebsite = function(req, res, next) {
-
-  /*
-    Create params for the same session chat.
-    The session is created for each browser and not for each tab in the browser.
-  */
-
-  if (!req.session.xchatty) {
-    req.session.xchatty = {};
-  }
-
-  if (!req.session.xchatty[req.params.id]) {
-    req.session.xchatty[req.params.id] = {};
-  }
-
-
-  var _websiteId = req.params.id;
-  var _website;
-  var _jsonResponse = {};
-  var _users = [];
-
-  return ChatWebsite
-    .findById(_websiteId)
-    .then(function(website) {
-      if (!website) {
-        // return res.status(500).jsonp({});
-        return res.sendStatus(500);
-      }
-      _website = website;
-      return _website.getChatApplications({
-        include: [{
-          model: ChatQueue,
-          include: [{
-            model: Agent
-          }]
-        }, {
-          model: Agent
-        }]
-      });
-    })
-    .then(function(chatApplications) {
-      _.forEach(chatApplications, function(app) {
-        if (app.app === 'queue') {
-          if (app.ChatQueue.hasOwnProperty('Users') && app.ChatQueue.Users.length > 0) {
-            _users = _.uniq(_.merge(_users, _.map(app.ChatQueue.Users, 'id')));
-          }
-        } else if (app.app === 'agent') {
-          _users.push(app.User.id);
-          _users = _.uniq(_users);
-        }
-      });
-      return Agent.findAndCountAll({
-        where: {
-          online: true,
-          id: {
-            $in: _users
-          }
-        }
-      });
-    })
-    .then(function(result) {
-
-      if (req.query.data.open_state)
-        req.session.xchatty[_websiteId].open_state = req.query.data.open_state === 'true' ? true : false;
-
-      _jsonResponse = {
-        success: true,
-        has_session_saf: null,
-        signed_up: req.session.xchatty[_websiteId].room_id ? true : false,
-        fullname: req.session.xchatty[_websiteId].fullname || '',
-        email: req.session.xchatty[_websiteId].email || '',
-        avatar: req.session.xchatty[_websiteId].avatar || '',
-        open_state: req.session.xchatty[_websiteId].open_state || req.session.xchatty[_websiteId].room_id ? true : false,
-        online: result.count ? true : false,
-        is_unserved: false,
-        room_id: 0
-      };
-
-      if (req.session.xchatty[_websiteId].visitor_id) {
-        return ChatRoom
-          .findOne({
-            where: {
-              ChatVisitorId: req.session.xchatty[_websiteId].visitor_id,
-              status: 'OPEN',
-              token: {
-                $ne: ''
-              }
-            }
-          });
-      }
-
-      return;
-    })
-    .then(function(chatRoom) {
-      if (chatRoom) {
-        req.session.xchatty[_websiteId].room_id = chatRoom.id;
-        _jsonResponse.room_id = chatRoom.id;
-        _jsonResponse.signed_up = true;
-      } else {
-        _jsonResponse.signed_up = false;
-      }
-
-      if (req.session.xchatty[_websiteId].visitor_id) {
-        return ChatVisitor
-          .findOne({
-            where: {
-              id: req.session.xchatty[_websiteId].visitor_id,
-              status: 'unserved'
-            }
-          })
-      }
-
-      return;
-    })
-    .then(function(visitor) {
-      if (visitor) {
-        _jsonResponse.is_unserved = true;
-      }
-      // return res.status(200).send(_jsonResponse);
-      return res.status(200).jsonp(_jsonResponse);
-    })
-    .catch(function(err) {
-      console.log('err', err);
-      // return res.sendStatus(500);
-      return res.status(500).jsonp({});
-    });
-}
\ No newline at end of file
diff --git a/server/api/zendesk_account/index.js b/server/api/zendesk_account/index.js
index 46ca688..89dbc01 100644
--- a/server/api/zendesk_account/index.js
+++ b/server/api/zendesk_account/index.js
@@ -1,28 +1 @@
-'use strict';
-
-var express = require('express');
-var auth = require('../../auth/auth.service');
-var controller = require('./zendesk_account.controller');
-
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), auth.hasModule([19, 13], ['admin']), controller.index);
-router.get('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.show);
-router.get('/:id/check', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.checkAccount);
-router.get('/:id/fields', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.getFields);
-router.get('/:id/configurations', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.getAccountConfigurations);
-router.get('/:id/configurations/:cid', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.getConfiguration);
-router.post('/validate/:field', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.zendeskValidation);
-router.post('/', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.create);
-router.post('/:id/configurations', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.createConfiguration);
-router.post('/:id/configurations/:cid/:type', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.createField);
-router.put('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.update);
-router.put('/:id/configurations/:cid/tags', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.addConfigurationTags);
-router.put('/:id/configurations/:cid/fields/:fid', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.updateField);
-router.delete('/', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.bulkDestroy);
-router.delete('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.destroy);
-router.delete('/:id/configurations', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.bulkDestroyConfigurations);
-router.delete('/:id/configurations/:cid', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.destroyConfiguration);
-router.delete('/:id/configurations/:cid/fields/:fid', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.destroyField);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/zendesk_account/zendesk_account.controller.js b/server/api/zendesk_account/zendesk_account.controller.js
index 22ceb99..9ae3e5d 100644
--- a/server/api/zendesk_account/zendesk_account.controller.js
+++ b/server/api/zendesk_account/zendesk_account.controller.js
@@ -1,515 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var Util = require('../../config/util');
-var zendesk = require('node-zendesk');
-
-var ZendeskAccount = require('../../models').ZendeskAccount;
-var ZendeskConfiguration = require('../../models').ZendeskConfiguration;
-var ZendeskField = require('../../models').ZendeskField;
-
-function handleError(res, statusCode) {
-  statusCode = statusCode || 500;
-  return function(err) {
-    res.status(statusCode).send(err);
-  };
-}
-
-function responseWithResult(res, statusCode) {
-  statusCode = statusCode || 200;
-  return function(entity) {
-    if (entity) {
-      res.status(statusCode).json(entity);
-    }
-  };
-}
-
-function responseWithoutResult(res, statusCode) {
-  statusCode = statusCode || 200;
-  return function() {
-    res.sendStatus(statusCode);
-  };
-}
-
-function handleEntityNotFound(res) {
-  return function(entity) {
-    if (!entity) {
-      res.status(404).end();
-      return null;
-    }
-    return entity;
-  };
-}
-
-function saveUpdates(updates) {
-  return function(entity) {
-    return entity.updateAttributes(updates)
-      .then(function(updated) {
-        return updated;
-      });
-  };
-}
-
-function removeEntity(res) {
-  return function(entity) {
-    if (entity) {
-      return entity.destroy()
-        .then(function() {
-          res.status(204).end();
-        });
-    }
-  };
-}
-
-// Get list of zendesk_accounts
-exports.index = function(req, res, next) {
-  return ZendeskAccount
-    .scope('configurations')
-    .findAndCountAll(_.merge(Util.getQuery(req.query), {
-      distinct: true
-    }))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-};
-
-// Get a single zendesk_account
-exports.show = function(req, res) {
-  return ZendeskAccount
-    .findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-};
-
-// Creates a new zendesk_account in the DB.
-exports.create = function(req, res) {
-  return ZendeskAccount
-    .create(req.body)
-    .then(responseWithResult(res, 201))
-    .catch(handleError(res));
-};
-
-// Updates an existing zendesk_account in the DB.
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  return ZendeskAccount
-    .findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(saveUpdates(req.body))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-};
-
-// Deletes a zendesk_account from the DB.
-exports.destroy = function(req, res) {
-  return ZendeskAccount
-    .findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(removeEntity(res))
-    .catch(handleError(res));
-};
-
-exports.bulkDestroy = function(req, res) {
-  return ZendeskAccount
-    .destroy({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(responseWithResult(res, 204))
-    .catch(handleError(res));
-};
-
-exports.zendeskValidation = function(req, res) {
-  var where = {};
-  where[req.params.field] = req.body.value;
-  return ZendeskAccount
-    .findAndCountAll({
-      where: where
-    })
-    .then(function(result) {
-      if (result.count) {
-        return res.status(200).send({
-          isValid: false,
-          value: req.body.value
-        });
-      }
-      return res.status(200).send({
-        isValid: true,
-        value: req.body.value
-      });
-    })
-    .catch(handleError(res));
-
-};
-
-exports.checkAccount = function(req, res) {
-  return ZendeskAccount
-    .findById(req.params.id)
-    .then(function(account) {
-      var accountZendesk = {
-        username: account.username,
-        remoteUri: account.remoteUri,
-        // debug: true
-      };
-      if (account.authType === 'password') {
-        accountZendesk.password = account.password;
-      } else if (account.authType === 'token') {
-        accountZendesk.token = account.token;
-        // accountZendesk.oauth = true;
-      }
-      // console.log(accountZendesk);
-      var client = zendesk.createClient(accountZendesk);
-      client.users.auth(function(err, res2, result) {
-        if (err) {
-          console.error(err);
-          return handleError(res, err);
-        }
-        // console.log(result);
-        if (!result.verified) {
-          return res.sendStatus(500);
-        }
-        return res.sendStatus(204);
-      });
-    })
-    .catch(handleError(res));
-};
-
-exports.getFields = function(req, res) {
-  return ZendeskAccount
-    .findById(req.params.id)
-    .then(function(account) {
-      var accountZendesk = {
-        username: account.username,
-        remoteUri: account.remoteUri,
-        // debug: true
-      };
-      if (account.authType === 'password') {
-        accountZendesk.password = account.password;
-      } else if (account.authType === 'token') {
-        accountZendesk.token = account.token;
-      }
-      var client = zendesk.createClient(accountZendesk);
-      client.ticketfields.list(function(err, res2, result) {
-        if (err) {
-          console.error(err);
-          return handleError(res, err);
-        }
-        return res.status(200).send(result);
-      });
-    })
-    .catch(handleError(res));
-}
-
-exports.getAccountConfigurations = function(req, res) {
-  return ZendeskConfiguration
-    .scope({
-      method: ['account', req.params.id]
-    })
-    .findAndCountAll(_.merge(Util.getQuery(req.query), {
-      distinct: true
-    }))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-exports.getConfiguration = function(req, res) {
-
-  return ZendeskConfiguration
-    .scope({
-      method: ['account', req.params.id]
-    })
-    .findById(req.params.cid)
-    .then(handleEntityNotFound(res))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-}
-
-exports.destroyConfiguration = function(req, res) {
-  return ZendeskConfiguration
-    .scope({
-      method: ['account', req.params.id]
-    })
-    .findById(req.params.cid)
-    .then(handleEntityNotFound(res))
-    .then(removeEntity(res))
-    .catch(handleError(res));
-};
-
-exports.bulkDestroyConfigurations = function(req, res) {
-  return ZendeskConfiguration
-    .destroy({
-      where: {
-        id: req.query.ids
-      },
-      individualHooks: true
-    })
-    .then(responseWithResult(res, 204))
-    .catch(handleError(res));
-};
-
-exports.createConfiguration = function(req, res) {
-  req.body['AccountId'] = req.params.id;
-
-  switch (req.body.channel) {
-    case 'voice':
-
-      if (req.body.type === 'Queue') {
-        req.body.Subject = [{
-          "type": "string",
-          "content": "[xCALLY Ticket]",
-          "variableName": null
-        }, {
-          "type": "variable",
-          "content": "",
-          "variableName": "queue"
-        }, {
-          "type": "variable",
-          "content": "",
-          "variableName": "calleridnum"
-        }];
-        req.body.Description = [{
-          "type": "string",
-          "content": "*** Call Info ***",
-          "key": null,
-          "keyType": null,
-          "variableName": null
-        }, {
-          "type": "keyValue",
-          "content": "",
-          "key": "Caller Number",
-          "keyType": "variable",
-          "variableName": "calleridnum"
-        }, {
-          "type": "keyValue",
-          "content": "",
-          "key": "Caller Name",
-          "keyType": "variable",
-          "variableName": "calleridname"
-        }, {
-          "type": "keyValue",
-          "content": "",
-          "key": "Call To",
-          "keyType": "variable",
-          "variableName": "destexten"
-        }, {
-          "type": "keyValue",
-          "content": "",
-          "key": "Queue",
-          "keyType": "variable",
-          "variableName": "queue"
-        }, {
-          "type": "keyValue",
-          "content": "",
-          "key": "UniqueId",
-          "keyType": "variable",
-          "variableName": "uniqueid"
-        }, {
-          "type": "keyValue",
-          "content": "",
-          "key": "Date",
-          "keyType": "variable",
-          "variableName": "agentcalledAt"
-        }, {
-          "type": "string",
-          "content": "*** Agent Info ***",
-          "key": null,
-          "keyType": null,
-          "variableName": null
-        }, {
-          "type": "keyValue",
-          "content": "",
-          "key": "Agent Name",
-          "keyType": "variable",
-          "variableName": "destcalleridname"
-        }, {
-          "type": "keyValue",
-          "content": "",
-          "key": "Agent Number",
-          "keyType": "variable",
-          "variableName": "destcalleridnum"
-        }, {
-          "type": "string",
-          "content": "*** Time Info ***",
-          "key": null,
-          "keyType": null,
-          "variableName": null
-        }, {
-          "type": "keyValue",
-          "content": "",
-          "key": "Agent Ring",
-          "keyType": "variable",
-          "variableName": "agentcalledAt"
-        }, {
-          "type": "keyValue",
-          "content": "",
-          "key": "Agent Connect",
-          "keyType": "variable",
-          "variableName": "agentconnectAt"
-        }, {
-          "type": "keyValue",
-          "content": "",
-          "key": "Agent Complete",
-          "keyType": "variable",
-          "variableName": "agentcompleteAt"
-        }, {
-          "type": "keyValue",
-          "content": "",
-          "key": "Hold Time",
-          "keyType": "variable",
-          "variableName": "holdtime"
-        }, {
-          "type": "keyValue",
-          "content": "",
-          "key": "Talk Time",
-          "keyType": "variable",
-          "variableName": "talktime"
-        }];
-      } else if (req.body.type === 'Outbound') {
-        req.body.Subject = [{
-          "type": "string",
-          "content": "[xCALLY Ticket]",
-          "variableName": null
-        }, {
-          "type": "string",
-          "content": "Outbound Call",
-          "variableName": null
-        }, {
-          "type": "variable",
-          "content": "",
-          "variableName": "destcalleridnum"
-        }];
-        req.body.Description = [{
-          "type": "string",
-          "content": "*** Call Info ***",
-          "variableName": null
-        }, {
-          "type": "keyValue",
-          "content": "",
-          "key": "Called Number",
-          "keyType": "variable",
-          "keyContent": "",
-          "variableName": "destcalleridnum"
-        }, {
-          "type": "keyValue",
-          "content": "",
-          "key": "Member Name",
-          "keyType": "variable",
-          "keyContent": "",
-          "variableName": "membername"
-        }, {
-          "type": "keyValue",
-          "content": "",
-          "key": "UniqueId",
-          "keyType": "variable",
-          "keyContent": "",
-          "variableName": "uniqueid"
-        }, {
-          "type": "keyValue",
-          "content": "",
-          "key": "Date",
-          "keyType": "variable",
-          "keyContent": "",
-          "variableName": "starttime"
-        }, {
-          "type": "string",
-          "content": "*** Time Info ***",
-        }, {
-          "type": "keyValue",
-          "content": "",
-          "key": "Answer Time",
-          "keyType": "variable",
-          "keyContent": "",
-          "variableName": "answertime"
-        }, {
-          "type": "keyValue",
-          "content": "",
-          "key": "Complete Time",
-          "keyType": "variable",
-          "keyContent": "",
-          "variableName": "endtime"
-        }];
-      }
-      break;
-    default:
-      console.log('Channel not available:', req.body.channel);
-  }
-
-  delete req.body.channel;
-  delete req.body.type;
-
-  return ZendeskConfiguration
-    .create(req.body, {
-      include: [{
-        model: ZendeskField,
-        as: 'Subject'
-      }, {
-        model: ZendeskField,
-        as: 'Description'
-      }]
-    })
-    .then(responseWithResult(res, 201))
-    .catch(handleError(res));
-};
-
-exports.createField = function(req, res) {
-  return ZendeskConfiguration
-    .scope({
-      method: ['account', req.params.id]
-    })
-    .findById(req.params.cid)
-    .then(handleEntityNotFound(res))
-    .then(function(configuration) {
-      switch (req.params.type) {
-        case 'subject':
-          req.body['SubjectId'] = req.params.cid;
-          break;
-        case 'description':
-          req.body['DescriptionId'] = req.params.cid;
-          break;
-        case 'field':
-          req.body['FieldId'] = req.params.cid;
-          break;
-      }
-      return ZendeskField.create(req.body);
-    })
-    .then(responseWithResult(res, 201))
-    .catch(handleError(res));
-};
-
-exports.updateField = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  return ZendeskField
-    .findById(req.params.fid)
-    .then(handleEntityNotFound(res))
-    .then(saveUpdates(req.body))
-    .then(responseWithResult(res))
-    .catch(handleError(res));
-};
-
-exports.destroyField = function(req, res) {
-  return ZendeskField
-    .findById(req.params.fid)
-    .then(handleEntityNotFound(res))
-    .then(removeEntity(res))
-    .catch(handleError(res));
-};
-
-exports.addConfigurationTags = function(req, res, next) {
-  return ZendeskConfiguration
-    .findById(req.params.cid)
-    .then(handleEntityNotFound(res))
-    .then(function(configuration) {
-      return configuration.setTags(req.body);
-    })
-    .then(responseWithoutResult(res, 200))
-    .catch(function(err) {
-      console.error(err);
-      return handleError(res, err);
-    });
-};
\ No newline at end of file
diff --git a/server/api/zendesk_account/zendesk_account.events.js b/server/api/zendesk_account/zendesk_account.events.js
index cf5855e..71e42b9 100644
--- a/server/api/zendesk_account/zendesk_account.events.js
+++ b/server/api/zendesk_account/zendesk_account.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const ZendeskAccount = require('../../models').ZendeskAccount;
-
-var ZendeskAccountEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-ZendeskAccountEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  ZendeskAccount.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    ZendeskAccountEvents.emit(event + ':' + doc._id, doc);
-    ZendeskAccountEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = ZendeskAccountEvents;
\ No newline at end of file
diff --git a/server/api/zendesk_account/zendesk_account.socket.js b/server/api/zendesk_account/zendesk_account.socket.js
index c2f0be2..dc58018 100644
--- a/server/api/zendesk_account/zendesk_account.socket.js
+++ b/server/api/zendesk_account/zendesk_account.socket.js
@@ -1,32 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const ZendeskAccountEvents = require('./zendesk_account.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('zendesk_account:' + event, socket);
-
-    ZendeskAccountEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    ZendeskAccountEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/zendesk_configuration/index.js b/server/api/zendesk_configuration/index.js
index f91b034..0a14bc3 100644
--- a/server/api/zendesk_configuration/index.js
+++ b/server/api/zendesk_configuration/index.js
@@ -1,16 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./zendesk_configuration.controller');
-var auth = require('../../auth/auth.service');
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.index);
-router.get('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.show);
-router.post('/', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.create);
-router.put('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.update);
-router.post('/:id/tags', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.addConfigurationTags);
-router.post('/:id/:type', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.addConfigurationField);
-router.delete('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/zendesk_configuration/zendesk_configuration.controller.js b/server/api/zendesk_configuration/zendesk_configuration.controller.js
index e299424..89bd9cb 100644
--- a/server/api/zendesk_configuration/zendesk_configuration.controller.js
+++ b/server/api/zendesk_configuration/zendesk_configuration.controller.js
@@ -1,181 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var ZendeskConfiguration = require('../../models').ZendeskConfiguration;
-var ZendeskField = require('../../models').ZendeskField;
-
-// Get list of zendesk_configurations
-exports.index = function(req, res) {
-  ZendeskConfiguration
-    .findAll({
-      where: req.query
-    })
-    .then(function(zendesk_configurations) {
-      return res.status(200).send(zendesk_configurations);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single zendesk_configuration
-exports.show = function(req, res) {
-  ZendeskConfiguration
-    .find({
-      where: {
-        id: req.params.id
-      },
-      include: [{
-        all: true
-      }]
-    })
-    .then(function(zendesk_configuration) {
-      if (!zendesk_configuration) {
-        return res.sendStatus(404);
-      }
-      return res.send(zendesk_configuration);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new zendesk_configuration in the DB.
-exports.create = function(req, res) {
-  ZendeskConfiguration
-    .create(req.body)
-    .then(function(zendesk_configuration) {
-      return res.status(201).send(zendesk_configuration);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing zendesk_configuration in the DB.
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  ZendeskConfiguration
-    .findById(req.params.id)
-    .then(function(zendesk_configuration) {
-      if (!zendesk_configuration) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(zendesk_configuration, req.body);
-      updated.save()
-        .then(function() {
-          return res.status(200).send(zendesk_configuration);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a zendesk_configuration from the DB.
-exports.destroy = function(req, res) {
-  ZendeskConfiguration
-    .findById(req.params.id)
-    .then(function(zendesk_configuration) {
-      if (!zendesk_configuration) {
-        return res.sendStatus(404);
-      }
-      zendesk_configuration.destroy()
-        .then(function() {
-          return res.sendStatus(204);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-exports.addConfigurationField = function(req, res, next) {
-  // console.log(req.params);
-  ZendeskConfiguration
-    .findById(req.params.id)
-    .then(function(configuration) {
-      if (!configuration) {
-        return res.sendStatus(500);
-      }
-      ZendeskField
-        .create(req.body)
-        .then(function(field) {
-          switch (req.params.type) {
-            case 'subject':
-              configuration.addSubject(field)
-                .then(function() {
-                  return res.status(200).send(field);
-                })
-                .catch(function(err) {
-                  return handleError(res, err);
-                });
-              break;
-            case 'description':
-              configuration.addDescription(field)
-                .then(function() {
-                  return res.status(200).send(field);
-                })
-                .catch(function(err) {
-                  return handleError(res, err);
-                });
-              break;
-            case 'field':
-              configuration.addField(field)
-                .then(function() {
-                  return res.status(200).send(field);
-                })
-                .catch(function(err) {
-                  return handleError(res, err);
-                });
-              break;
-          }
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-          // return next(err);
-        });
-    })
-    .catch(function(err) {
-      // return next(err);
-      return handleError(res, err);
-    });
-};
-
-exports.addConfigurationTags = function(req, res, next) {
-  ZendeskConfiguration
-    .findById(req.params.id)
-    .then(handleEntityNotFound(res))
-    .then(function(configuration) {
-      return configuration.setTags(req.body);
-    })
-    .then(function(data) {
-      return res.sendStatus(200);
-    })
-    .catch(function(err) {
-      console.error(err);
-      return handleError(res, err);
-    });
-};
-
-function handleEntityNotFound(res) {
-  return function(entity) {
-    if (!entity) {
-      res.status(404).end();
-      return null;
-    }
-    return entity;
-  };
-}
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/zendesk_configuration/zendesk_configuration.events.js b/server/api/zendesk_configuration/zendesk_configuration.events.js
index f745627..5ebef9b 100644
--- a/server/api/zendesk_configuration/zendesk_configuration.events.js
+++ b/server/api/zendesk_configuration/zendesk_configuration.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const ZendeskConfiguration = require('../../models').ZendeskConfiguration;
-
-var ZendeskConfigurationEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-ZendeskConfigurationEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  ZendeskConfiguration.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    ZendeskConfigurationEvents.emit(event + ':' + doc._id, doc);
-    ZendeskConfigurationEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = ZendeskConfigurationEvents;
\ No newline at end of file
diff --git a/server/api/zendesk_configuration/zendesk_configuration.socket.js b/server/api/zendesk_configuration/zendesk_configuration.socket.js
index e6e6b68..7041be5 100644
--- a/server/api/zendesk_configuration/zendesk_configuration.socket.js
+++ b/server/api/zendesk_configuration/zendesk_configuration.socket.js
@@ -1,32 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const ZendeskConfigurationEvents = require('./zendesk_configuration.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('zendesk_configuration:' + event, socket);
-
-    ZendeskConfigurationEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    ZendeskConfigurationEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/api/zendesk_field/index.js b/server/api/zendesk_field/index.js
index e84b58d..9de03a4 100644
--- a/server/api/zendesk_field/index.js
+++ b/server/api/zendesk_field/index.js
@@ -1,14 +1 @@
-'use strict';
-
-var express = require('express');
-var controller = require('./zendesk_field.controller');
-var auth = require('../../auth/auth.service');
-var router = express.Router();
-
-router.get('/', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.index);
-router.get('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.show);
-router.post('/', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.create);
-router.put('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.update);
-router.delete('/:id', auth.isAuthenticated(), auth.hasModule([19], ['admin']), controller.destroy);
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/api/zendesk_field/zendesk_field.controller.js b/server/api/zendesk_field/zendesk_field.controller.js
index 48d0c38..bc99dd0 100644
--- a/server/api/zendesk_field/zendesk_field.controller.js
+++ b/server/api/zendesk_field/zendesk_field.controller.js
@@ -1,93 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var ZendeskField = require('../../models').ZendeskField;
-
-// Get list of zendesk_fields
-exports.index = function(req, res) {
-  ZendeskField
-    .findAll()
-    .then(function(zendesk_fields) {
-      return res.status(200).send(zendesk_fields);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Get a single zendesk_field
-exports.show = function(req, res) {
-  ZendeskField
-    .findById(req.params.id)
-    .then(function(zendesk_field) {
-      if (!zendesk_field) {
-        return res.sendStatus(404);
-      }
-      return res.send(zendesk_field);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Creates a new zendesk_field in the DB.
-exports.create = function(req, res) {
-  ZendeskField
-    .create(req.body)
-    .then(function(zendesk_field) {
-      return res.status(201).send(zendesk_field);
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Updates an existing zendesk_field in the DB.
-exports.update = function(req, res) {
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  ZendeskField
-    .findById(req.params.id)
-    .then(function(zendesk_field) {
-      if (!zendesk_field) {
-        return res.sendStatus(404);
-      }
-      var updated = _.merge(zendesk_field, req.body);
-      updated.save()
-        .then(function() {
-          return res.status(200).send(zendesk_field);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-// Deletes a zendesk_field from the DB.
-exports.destroy = function(req, res) {
-  ZendeskField
-    .findById(req.params.id)
-    .then(function(zendesk_field) {
-      if (!zendesk_field) {
-        return res.sendStatus(404);
-      }
-      zendesk_field.destroy()
-        .then(function() {
-          return res.sendStatus(204);
-        })
-        .catch(function(err) {
-          return handleError(res, err);
-        });
-    })
-    .catch(function(err) {
-      return handleError(res, err);
-    });
-};
-
-function handleError(res, err) {
-  return res.status(500).send(err);
-}
\ No newline at end of file
diff --git a/server/api/zendesk_field/zendesk_field.events.js b/server/api/zendesk_field/zendesk_field.events.js
index 3b68978..aef5119 100644
--- a/server/api/zendesk_field/zendesk_field.events.js
+++ b/server/api/zendesk_field/zendesk_field.events.js
@@ -1,36 +1 @@
-/**
- * Thing model events
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const ZendeskField = require('../../models').ZendeskField;
-
-var ZendeskFieldEvents = new EventEmitter();
-
-// Set max event listeners (0 == unlimited)
-ZendeskFieldEvents.setMaxListeners(0);
-
-// Model events
-var events = {
-  'afterCreate': 'save',
-  'afterUpdate': 'save',
-  'afterDestroy': 'remove'
-};
-
-// Register the event emitter to the model events
-for (var e in events) {
-  var event = events[e];
-  ZendeskField.hook(e, emitEvent(event));
-}
-
-function emitEvent(event) {
-  return function(doc, options, done) {
-    ZendeskFieldEvents.emit(event + ':' + doc._id, doc);
-    ZendeskFieldEvents.emit(event, doc);
-    done(null);
-  }
-}
-
-module.exports = ZendeskFieldEvents;
\ No newline at end of file
diff --git a/server/api/zendesk_field/zendesk_field.socket.js b/server/api/zendesk_field/zendesk_field.socket.js
index 891c45b..375d268 100644
--- a/server/api/zendesk_field/zendesk_field.socket.js
+++ b/server/api/zendesk_field/zendesk_field.socket.js
@@ -1,32 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-const ZendeskFieldEvents = require('./zendesk_field.events');
-
-// Model events to emit
-var events = ['save', 'remove'];
-
-exports.register = function(socket) {
-  for (var i = 0, eventsLength = events.length; i < eventsLength; i++) {
-    var event = events[i];
-    var listener = createListener('zendesk_field:' + event, socket);
-
-    ZendeskFieldEvents.on(event, listener);
-    socket.on('disconnect', removeListener(event, listener));
-  }
-}
-
-function createListener(event, socket) {
-  return function(doc) {
-    socket.emit(event, doc);
-  };
-}
-
-function removeListener(event, listener) {
-  return function() {
-    ZendeskFieldEvents.removeListener(event, listener);
-  };
-}
\ No newline at end of file
diff --git a/server/app.js b/server/app.js
index c27c4a6..9d620a6 100644
--- a/server/app.js
+++ b/server/app.js
@@ -1,113 +1 @@
-'use strict';
-
-/**
- * Main application file
- */
-
-// Set default node environment to development
-process.env.NODE_ENV = process.env.NODE_ENV || 'development';
-process.env.NODE_TLS_REJECT_UNAUTHORIZED = 0;
-
-process.on('uncaughtException', function(err) {
-  if (typeof err === 'object') {
-    if (err.message) {
-      console.log('\nMessage: ' + err.message)
-    }
-    if (err.stack) {
-      console.log('\nStacktrace:')
-      console.log('====================')
-      console.log(err.stack);
-    }
-  } else {
-    console.log('dumpError :: argument is not an object');
-  }
-});
-
-var os = require('os');
-var http = require('http');
-var util = require('util');
-var crypto = require('crypto');
-var cronjob = require('cron').CronJob;
-var shelljs = require('shelljs/global');
-
-var express = require('express');
-var models = require('./models');
-var config = require('./config/environment');
-
-// Setup server
-var app = express();
-var server = require('http').createServer(app);
-
-var io = require('socket.io')(server, {
-  serveClient: (config.env === 'production') ? false : true,
-  path: '/socket.io-client'
-});
-var redis = require('socket.io-redis');
-io.adapter(redis({
-  host: config.ip,
-  port: 6379
-}));
-
-var ami = require('asterisk-manager')(config.asterisk.port,
-  config.asterisk.host,
-  config.asterisk.username,
-  config.asterisk.password,
-  true);
-
-ami.keepConnected();
-
-require('./config/express')(app);
-require('./routes')(app, ami);
-
-models
-  .sequelize
-  .sync()
-  .then(function() {
-
-    // Populate DB Develop with sample data
-
-    if (config.seedDB) {
-      require('./config/seed');
-    }
-    // Populate DB Production with sample data
-    if (config.seedPDB) {
-      require('./config/seedp');
-    }
-
-    // Start Cally Square Projects
-    require('./config/socketio')(io, require('./services/dashboard')(io));
-    require('./config/automations/mail')();
-    require('./config/automations/fax')();
-    require('./config/automations/chat')();
-    require('./config/triggers')(ami);
-    require('./config/scheduler')();
-    require('./config/imap')();
-    require('./config/smtp')()
-    require('./config/sms')();
-    require('./config/chat')();
-    require('./config/openchannel')();
-    require('./config/tools')();
-    require('./config/ami')(ami);
-    require('./config/agi')();
-    require('./config/license')();
-
-    // Start server
-    server.listen(config.port, config.ip, function() {
-      console.log('Express server listening on %d, in %s mode', config.port, app.get('env'));
-    });
-  })
-  .then(function() {
-    // Connect to database history
-    return models
-      .sequelize_history
-      .sync();
-  })
-  .then(function() {
-    require('./config/history/history')(cronjob);
-  })
-  .catch(function(err) {
-    console.error(err);
-  });
-
-// Expose app
-exports = module.exports = app;
\ No newline at end of file
diff --git a/server/auth/auth.service.js b/server/auth/auth.service.js
index e82ba59..af10882 100644
--- a/server/auth/auth.service.js
+++ b/server/auth/auth.service.js
@@ -1,150 +1 @@
-'use strict';
-
-//var mongoose = require('mongoose');
-var passport = require('passport');
-var config = require('../config/environment');
-var jwt = require('jsonwebtoken');
-var expressJwt = require('express-jwt');
-var compose = require('composable-middleware');
-// var User = require('../api/user/user.model');
-var User = require('../models').User;
-var List = require('../models').List;
-var validateJwt = expressJwt({
-  secret: config.session.secret
-});
-var Promise = require('bluebird');
-var _ = require('lodash');
-
-/**
- * Attaches the user object to the request if authenticated
- * Otherwise returns 403
- */
-function isAuthenticated() {
-  return compose()
-    // Validate jwt
-    .use(function(req, res, next) {
-      // allow access_token to be passed through query parameter as well
-      if (req.query && req.query.hasOwnProperty('access_token')) {
-        req.headers.authorization = 'Bearer ' + req.query.access_token;
-      }
-      if (req.headers && req.headers.authorization && _.startsWith(req.headers.authorization, 'Basic')) {
-        var arrAuth = _.split(req.headers.authorization, ' ');
-        var authString = new Buffer(arrAuth[1], 'base64').toString("ascii");
-        var username = _.split(authString, ':')[0];
-        var pwd = _.split(authString, ':')[1];
-        return User.findOne({
-            where: {
-              name: username
-            }
-          })
-          .then(function(user) {
-            if (!user || !user.authenticate(pwd)) {
-              next(new Error('Wrong credentials.'));
-            }
-            req.user = {
-              id: user.id
-            };
-            next();
-          })
-      } else {
-        validateJwt(req, res, next);
-      }
-    })
-    // Attach user to request
-    .use(function(req, res, next) {
-      User
-        .findById(req.user.id, {
-          include: [{
-            model: List
-          }]
-        })
-        .then(function(user) {
-          if (!user) return res.sendStatus(401);
-          req.user = user;
-          return next();
-        })
-        .catch(function(err) {
-          return next(err);
-        });
-    });
-}
-
-/**
- * Checks if the module meets the requirements
- */
-function hasModule(modules, roles) {
-  return compose()
-    .use(function(req, res, next) {
-      return User
-        .findById(req.user.id)
-        .then(function(user) {
-          var bulkModule = [];
-          modules.forEach(function(element) {
-            bulkModule.push(user.hasModule(element));
-          });
-          return Promise.all(bulkModule);
-        })
-        .then(function(hasModuleArr) {
-          var hasModule = (_.reduce(hasModuleArr, function(total, n) {
-            return total || n;
-          }));
-          if (_.includes(roles, req.user.role) || hasModule) {
-            return next();
-          } else {
-            res.sendStatus(403);
-          }
-        })
-        .catch(function(err) {
-          return next(err);
-        });
-    });
-}
-
-/**
- * Checks if the user role meets the minimum requirements of the route
- */
-function hasRole(roleRequired) {
-  if (!roleRequired) throw new Error('Required role needs to be set');
-
-  return compose()
-    .use(isAuthenticated())
-    .use(function meetsRequirements(req, res, next) {
-      if (config.userRoles.indexOf(req.user.role) >= config.userRoles.indexOf(roleRequired)) {
-        return next();
-      } else {
-        return res.sendStatus(403);
-      }
-    });
-}
-
-/**
- * Returns a jwt token signed by the app secret
- */
-function signToken(id, role, remember) {
-  var expiresIn = 60 * 24 * 365 * 5; //If remember, it expires in 5 years
-  if (!remember)
-    expiresIn = "1d"; //Expire in one day
-  return jwt.sign({
-    id: id
-  }, config.session.secret, {
-    expiresIn: expiresIn
-  });
-}
-
-/**
- * Set token cookie directly for oAuth strategies
- */
-function setTokenCookie(req, res) {
-  if (!req.user) return res.json(404, {
-    message: 'Something went wrong, please try again.'
-  });
-  var token = signToken(req.user.id, req.user.role);
-  res.cookie('token', JSON.stringify(token));
-  res.redirect('/');
-}
-
-exports.isAuthenticated = isAuthenticated;
-exports.hasRole = hasRole;
-exports.hasModule = hasModule;
-exports.signToken = signToken;
-exports.setTokenCookie = setTokenCookie;
\ No newline at end of file
diff --git a/server/auth/facebook/index.js b/server/auth/facebook/index.js
index 4a6f878..ccceef4 100644
--- a/server/auth/facebook/index.js
+++ b/server/auth/facebook/index.js
@@ -1,21 +1 @@
-'use strict';
-
-var express = require('express');
-var passport = require('passport');
-var auth = require('../auth.service');
-
-var router = express.Router();
-
-router
-  .get('/', passport.authenticate('facebook', {
-    scope: ['email', 'user_about_me'],
-    failureRedirect: '/signup',
-    session: false
-  }))
-
-  .get('/callback', passport.authenticate('facebook', {
-    failureRedirect: '/signup',
-    session: false
-  }), auth.setTokenCookie);
-
-module.exports = router;
\ No newline at end of file
\ No newline at end of file
diff --git a/server/auth/facebook/passport.js b/server/auth/facebook/passport.js
index 90ae489..fdbe9f7 100644
--- a/server/auth/facebook/passport.js
+++ b/server/auth/facebook/passport.js
@@ -1,37 +1 @@
-var passport = require('passport');
-var FacebookStrategy = require('passport-facebook').Strategy;
-
-exports.setup = function (User, config) {
-  passport.use(new FacebookStrategy({
-      clientID: config.facebook.clientID,
-      clientSecret: config.facebook.clientSecret,
-      callbackURL: config.facebook.callbackURL
-    },
-    function(accessToken, refreshToken, profile, done) {
-      User.findOne({
-        'facebook.id': profile.id
-      },
-      function(err, user) {
-        if (err) {
-          return done(err);
-        }
-        if (!user) {
-          user = new User({
-            name: profile.displayName,
-            email: profile.emails[0].value,
-            role: 'user',
-            username: profile.username,
-            provider: 'facebook',
-            facebook: profile._json
-          });
-          user.save(function(err) {
-            if (err) done(err);
-            return done(err, user);
-          });
-        } else {
-          return done(err, user);
-        }
-      })
-    }
-  ));
-};
\ No newline at end of file
\ No newline at end of file
diff --git a/server/auth/google/index.js b/server/auth/google/index.js
index 9b1ce39..d594164 100644
--- a/server/auth/google/index.js
+++ b/server/auth/google/index.js
@@ -1,24 +1 @@
-'use strict';
-
-var express = require('express');
-var passport = require('passport');
-var auth = require('../auth.service');
-
-var router = express.Router();
-
-router
-  .get('/', passport.authenticate('google', {
-    failureRedirect: '/signup',
-    scope: [
-      'https://www.googleapis.com/auth/userinfo.profile',
-      'https://www.googleapis.com/auth/userinfo.email'
-    ],
-    session: false
-  }))
-
-  .get('/callback', passport.authenticate('google', {
-    failureRedirect: '/signup',
-    session: false
-  }), auth.setTokenCookie);
-
-module.exports = router;
\ No newline at end of file
\ No newline at end of file
diff --git a/server/auth/google/passport.js b/server/auth/google/passport.js
index d304e8a..af25685 100644
--- a/server/auth/google/passport.js
+++ b/server/auth/google/passport.js
@@ -1,33 +1 @@
-var passport = require('passport');
-var GoogleStrategy = require('passport-google-oauth').OAuth2Strategy;
-
-exports.setup = function (User, config) {
-  passport.use(new GoogleStrategy({
-      clientID: config.google.clientID,
-      clientSecret: config.google.clientSecret,
-      callbackURL: config.google.callbackURL
-    },
-    function(accessToken, refreshToken, profile, done) {
-      User.findOne({
-        'google.id': profile.id
-      }, function(err, user) {
-        if (!user) {
-          user = new User({
-            name: profile.displayName,
-            email: profile.emails[0].value,
-            role: 'user',
-            username: profile.username,
-            provider: 'google',
-            google: profile._json
-          });
-          user.save(function(err) {
-            if (err) done(err);
-            return done(err, user);
-          });
-        } else {
-          return done(err, user);
-        }
-      });
-    }
-  ));
-};
\ No newline at end of file
diff --git a/server/auth/index.js b/server/auth/index.js
index 42c323f..fbfa861 100644
--- a/server/auth/index.js
+++ b/server/auth/index.js
@@ -1,22 +1 @@
-'use strict';
-
-var express = require('express');
-var passport = require('passport');
-var config = require('../config/environment');
-var User = require('../models').User;
-
-
-// Passport Configuration
-require('./local/passport').setup(User, config);
-require('./facebook/passport').setup(User, config);
-require('./google/passport').setup(User, config);
-require('./twitter/passport').setup(User, config);
-
-var router = express.Router();
-
-router.use('/local', require('./local'));
-router.use('/facebook', require('./facebook'));
-router.use('/twitter', require('./twitter'));
-router.use('/google', require('./google'));
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/auth/local/index.js b/server/auth/local/index.js
index 54f86ad..afcf727 100644
--- a/server/auth/local/index.js
+++ b/server/auth/local/index.js
@@ -1,213 +1 @@
-'use strict';
-
-var express = require('express');
-var passport = require('passport');
-var async = require('async');
-var Promise = require('bluebird');
-var nodemailer = require('nodemailer');
-var smtpTransport = require('nodemailer-smtp-transport');
-var crypto = require('crypto');
-var moment = require('moment');
-
-var auth = require('../auth.service');
-var User = require('../../models').User;
-var Action = require('../../models').Action;
-var ReportMember = require('../../models').ReportMember;
-var MailServerOut = require('../../models').MailServerOut;
-var license = require('../../config/license/license.service');
-
-var channels = ['voice', 'chat', 'mail', 'fax'];
-var router = express.Router();
-
-router.post('/', function(req, res, next) {
-  passport.authenticate('local-login', function(err, user, info) {
-    if (err) return res.status(401).json({
-      message: err.message
-    });
-    if (!user) return res.status(404).json(info || {
-      message: 'Something went wrong, please try again.'
-    });
-    return Promise
-      .all([])
-      .then(function() {
-        if (req.body.hasOwnProperty('queueLogin') && req.body.queueLogin === false) {
-          return;
-        }
-        return Action
-          .create({
-            name: 'login',
-            data1: user.id,
-            data2: user.name,
-            UserId: user.id
-          });
-      })
-      .then(function() {
-        return res.json({
-          role: user.role,
-          token: auth.signToken(user.id, user.role, req.body.remember || false),
-          userId: user.id
-        });
-      })
-      .catch(function(err) {
-        return next(err);
-      });
-
-  })(req, res, next)
-});
-
-router.post('/recover', function(req, res, next) {
-  var _token, _user, _server;
-  return User
-    .findOne({
-      where: {
-        email: req.body.email
-      }
-    })
-    .then(function(user) {
-      if (!user) {
-        throw new Error('Email not found in database!');
-      }
-      _user = user;
-      return MailServerOut
-        .findOne({
-          where: {
-            service: true
-          }
-        });
-    })
-    .then(function(mailServer) {
-      if (!mailServer) {
-        throw new Error('No SMTP service configured');
-      }
-      _server = mailServer;
-      return Promise
-        .promisify(crypto.randomBytes)(20);
-    })
-    .then(function(buffer) {
-      _token = buffer.toString('hex');
-      _user.resetPasswordToken = _token;
-      _user.resetPasswordExpires = moment().add(1, 'hour');
-      return _user.save();
-    })
-    .then(function() {
-      var smtp = nodemailer.createTransport(smtpTransport({
-        host: _server.host,
-        port: _server.port,
-        secure: _server.ssl,
-        pool: true,
-        auth: {
-          user: _server.username,
-          pass: _server.password
-        }
-      }));
-      var mailOptions = {
-        to: _user.email,
-        from: _server.host,
-        subject: 'xCALLY Motion Password Reset',
-        text: 'You are receiving this because you (or someone else) have requested the reset of the password for your account.\n\n' +
-          'Please click on the following link, or paste this into your browser to complete the process:\n\n' +
-          'http://' + req.headers.host + '/reset/' + _token + '\n\n' +
-          'The link will be valid for the next 60 minutes.' +
-          'If you did not request this, please ignore this email and your password will remain unchanged.\n'
-      };
-      return smtp
-        .sendMail(mailOptions);
-    })
-    .then(function(info) {
-      res.sendStatus(200);
-    })
-    .catch(function(err) {
-      return handleError(res, err)
-    });
-});
-
-router.post('/reset/:token', function(req, res, next) {
-  var _user, _server;
-  return User
-    .findOne({
-      where: {
-        resetPasswordToken: req.params.token,
-        resetPasswordExpires: {
-          $gt: moment()
-        }
-      },
-    })
-    .then(function(user) {
-      if (!user) {
-        throw new Error('Password reset token is invalid or has expired');
-      }
-      var newPass = String(req.body.password);
-      if (!(/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[~!@#$%^&\-_=+\[\{\]\}.])[0-9a-zA-Z~!@#$%^&\-_=+\[\{\]\}.]{8,}$/.test(newPass))) {
-        throw new Error('Wrong password format!');
-      }
-      user.password = newPass;
-      user.resetPasswordToken = null;
-      user.resetPasswordExpires = null;
-      return user.save();
-    })
-    .then(function(user) {
-      _user = user;
-      return MailServerOut
-        .findOne({
-          where: {
-            service: true
-          }
-        });
-    })
-    .then(function(mailServer) {
-      if (!mailServer) {
-        throw new Error('No SMTP service configured');
-      }
-      var smtp = nodemailer.createTransport(smtpTransport({
-        host: mailServer.host,
-        port: mailServer.port,
-        secure: mailServer.ssl,
-        pool: true,
-        auth: {
-          user: mailServer.username,
-          pass: mailServer.password
-        }
-      }));
-      var mailOptions = {
-        to: _user.email,
-        from: mailServer.host,
-        subject: 'Your password has been changed',
-        text: 'Hello,\n\n' +
-          'This is a confirmation that the password for your account ' + _user.email + ' has just been changed.\n'
-      };
-      return smtp
-        .sendMail(mailOptions);
-    })
-    .then(function(info) {
-      res.sendStatus(200);
-    })
-    .catch(function(err) {
-      return handleError(res, err)
-    });
-});
-
-router
-  .get('/logout', auth.isAuthenticated(), function(req, res, next) {
-    return Action
-      .create({
-        name: 'logout',
-        data1: req.user.id,
-        data2: req.user.name,
-        UserId: req.user.id
-      })
-      .then(function() {
-        req.logout();
-        res.redirect('/');
-      })
-      .catch(function(err) {
-        return next(err);
-      });
-  });
-
-function handleError(res, err) {
-  return res.status(500).send({
-    message: err.message
-  });
-}
-
-module.exports = router;
\ No newline at end of file
diff --git a/server/auth/local/local.ami.js b/server/auth/local/local.ami.js
index bfb533d..2439174 100644
--- a/server/auth/local/local.ami.js
+++ b/server/auth/local/local.ami.js
@@ -1,51 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-var util = require('util');
-var amiController = require('../../api/ami/ami.ami');
-
-exports.logout = function(userid, username, queuename, callback) {
-  var body = {
-    action: 'QueuePause',
-    queue: queuename,
-    interface: util.format('SIP/%s', username),
-    paused: false
-  };
-  body.data = JSON.stringify(body);
-  body.UserId = userid;
-
-  amiController.action(body, function(err, res) {
-    if (err) {
-      console.log(err);
-    }
-    var body = {
-      action: 'QueueRemove',
-      queue: queuename,
-      interface: util.format('SIP/%s', username)
-    };
-    body.data = JSON.stringify(body);
-    body.UserId = userid;
-
-    amiController.action(body, callback);
-  });
-}
-
-exports.login = function(userid, username, queuename, callback) {
-
-  var body = {
-    action: 'QueueAdd',
-    queue: queuename,
-    interface: util.format('SIP/%s', username),
-    penalty: 0,
-    paused: false,
-    membername: username
-  };
-
-  body.data = JSON.stringify(body);
-  body.UserId = userid;
-
-  amiController.action(body, callback);
-}
\ No newline at end of file
diff --git a/server/auth/local/passport.js b/server/auth/local/passport.js
index ab09929..43f019a 100644
--- a/server/auth/local/passport.js
+++ b/server/auth/local/passport.js
@@ -1,42 +1 @@
-var passport = require('passport');
-var LocalStrategy = require('passport-local').Strategy;
-var license = require('../../config/license/license.service');
-
-exports.setup = function(User, config) {
-  passport.use('local-login', new LocalStrategy({
-      usernameField: 'name',
-      passwordField: 'password' // this is the virtual field on the model
-    },
-    function(name, password, done) {
-      var _user;
-
-      return User.findOne({
-          where: {
-            name: name
-          }
-        })
-        .then(function(user) {
-          _user = user;
-
-          if (!_user || !user.authenticate(password)) {
-            throw new Error('Wrong credentials');
-          }
-
-          return _user;
-        })
-        .then(license.isValidAgent())
-        .then(function(valid) {
-          if (valid) {
-            return done(null, _user);
-          } else {
-            return done(null, false, {
-              message: 'Maximum login limit has been reached.'
-            });
-          }
-        })
-        .catch(function(err) {
-          return done(err, false, null);
-        });
-    }
-  ));
-};
\ No newline at end of file
diff --git a/server/auth/twitter/index.js b/server/auth/twitter/index.js
index 8360247..f96f3c7 100644
--- a/server/auth/twitter/index.js
+++ b/server/auth/twitter/index.js
@@ -1,20 +1 @@
-'use strict';
-
-var express = require('express');
-var passport = require('passport');
-var auth = require('../auth.service');
-
-var router = express.Router();
-
-router
-  .get('/', passport.authenticate('twitter', {
-    failureRedirect: '/signup',
-    session: false
-  }))
-
-  .get('/callback', passport.authenticate('twitter', {
-    failureRedirect: '/signup',
-    session: false
-  }), auth.setTokenCookie);
-
-module.exports = router;
\ No newline at end of file
\ No newline at end of file
diff --git a/server/auth/twitter/passport.js b/server/auth/twitter/passport.js
index a2eb4a5..52343d4 100644
--- a/server/auth/twitter/passport.js
+++ b/server/auth/twitter/passport.js
@@ -1,35 +1 @@
-exports.setup = function (User, config) {
-  var passport = require('passport');
-  var TwitterStrategy = require('passport-twitter').Strategy;
-
-  passport.use(new TwitterStrategy({
-    consumerKey: config.twitter.clientID,
-    consumerSecret: config.twitter.clientSecret,
-    callbackURL: config.twitter.callbackURL
-  },
-  function(token, tokenSecret, profile, done) {
-    User.findOne({
-      'twitter.id_str': profile.id
-    }, function(err, user) {
-      if (err) {
-        return done(err);
-      }
-      if (!user) {
-        user = new User({
-          name: profile.displayName,
-          username: profile.username,
-          role: 'user',
-          provider: 'twitter',
-          twitter: profile._json
-        });
-        user.save(function(err) {
-          if (err) return done(err);
-          return done(err, user);
-        });
-      } else {
-        return done(err, user);
-      }
-    });
-    }
-  ));
-};
\ No newline at end of file
\ No newline at end of file
diff --git a/server/config/agi/agi.js b/server/config/agi/agi.js
index 589efd2..6eef73b 100644
--- a/server/config/agi/agi.js
+++ b/server/config/agi/agi.js
@@ -1,1959 +1 @@
-'use  strict';
-
-var _ = require('lodash');
-
-var agi = require('agi');
-var util = require('util');
-var moment = require('moment');
-var xml = require('xml2js');
-var wait = require('wait.for');
-var sr = require('simple-random');
-var path = require('path');
-var config = require('../environment');
-var sh = require('shelljs');
-var Promise = require('bluebird');
-var rp = require('request-promise');
-const googleTTS = require('google-tts-api');
-const fs = require('fs');
-const sox = require('sox');
-const request = require('request');
-const base64 = require('file-base64');
-
-var db = require("odbc")();
-
-var SquareProject = require('../../models').SquareProject;
-var Variable = require('../../models').Variable;
-var SquareOdbc = require('../../models').SquareOdbc;
-var Setting = require('../../models').Setting;
-var User = require('../../models').User;
-var VoiceQueue = require('../../models').VoiceQueue;
-var Interval = require('../../models').Interval;
-var Sound = require('../../models').Sound;
-var SquareRecording = require('../../models').SquareRecording;
-var SmsAccount = require('../../models').SmsAccount;
-var MailServerOut = require('../../models').MailServerOut;
-var Mustache = require('mustache');
-var Template = require('../../models').Template;
-
-var collections = {};
-var weekDaysCollection = {
-  mon: 1,
-  tue: 2,
-  wed: 3,
-  thu: 4,
-  fri: 5,
-  sat: 6,
-  sun: 7
-};
-var monthsCollection = {
-  jan: 1,
-  feb: 2,
-  mar: 3,
-  apr: 4,
-  may: 5,
-  jun: 6,
-  jul: 7,
-  aug: 8,
-  sep: 9,
-  oct: 10,
-  nov: 11,
-  dec: 12
-};
-
-var methods = {};
-
-process
-  .on('close', function(code) {
-    console.log(util.format('AGI SERVER EXITED WITH CODE %s, PROCESS ID: %s ', code, process.pid));
-  })
-  .on('error', function(err) {
-    console.error(err);
-  });
-
-console.log(util.format('AGI SERVER STARTING, PROCESS ID: %s ', process.pid));
-
-methods.answer = function(context, vertex, callback) {
-  console.log('--ANSWER BLOCK--');
-  console.log('Answering the call...');
-  context.send('ANSWER\n', function(err, res) {
-    callback(err, res);
-  });
-};
-
-methods.custom_app = function(context, vertex, callback) {
-  console.log('--CUSTOM APP BLOCK--');
-  console.log('Executing custom app "' + vertex.application + '"...');
-  context.exec(vertex.application, vertex.options, function(err, res) {
-    if (callback) {
-      callback(err, res);
-    }
-  });
-};
-
-
-methods.dial = function(context, vertex, callback) {
-  console.log('--INTERNAL_DIAL BLOCK--');
-  if (!collections.users) {
-    getUsers(false);
-  }
-  var sip = _.find(collections.users, {
-    id: parseInt(vertex.sip_id)
-  });
-  console.log('Calling ' + util.format('SIP/%s', sip.name) + '...');
-  var parameters = [util.format('SIP/%s', sip.name), vertex.timeout, vertex.opts,
-    vertex.url
-  ];
-  context.exec('DIAL', parameters.join(','),
-    function(err, res) {
-      callback(err, res);
-    });
-};
-
-methods.start = function(context, vertex, callback) {
-  console.log('--START BLOCK--');
-  if (vertex.answer === 'yes') {
-    context.send('ANSWER\n', function(err, res) {
-      callback(err, res);
-    });
-  } else {
-    callback(null, {
-      code: 200,
-      result: 1
-    });
-  }
-};
-
-methods.ext_dial = function(context, vertex, callback) {
-  console.log('--EXTERNAL_DIAL BLOCK--');
-  console.log('Calling ' + util.format('SIP/%s', vertex.trunk_name) + '...');
-  var parameters = [util.format('SIP/%s/%s', vertex.trunk_name, vertex.phone),
-    vertex.timeout, vertex.opts, vertex.url
-  ];
-  context.exec('DIAL', parameters.join(','),
-    function(err, res) {
-      callback(err, res);
-    });
-};
-
-methods.queue = function(context, vertex, callback) {
-  console.log('--QUEUE BLOCK--');
-
-  if (!collections.queues) {
-    getQueues(false);
-  }
-  var queue = _.find(collections.queues, {
-    name: vertex.queue_id
-  });
-  var squareDetail = {
-    uniqueid: context.uniqueid,
-    node: vertex.label,
-    application: vertex.tag,
-    data: queue.name,
-    project_name: context.project_name,
-    callerid: context.callerid,
-    message: 'detail'
-  }
-  process.send(squareDetail);
-  getFilePath(vertex.file_id).then(function(announceOverride) {
-    var parameters = [queue.name, vertex.opts, vertex.url,
-      announceOverride, vertex.timeout, vertex.agi, vertex.macro,
-      vertex.gosub, '', vertex.position
-    ];
-    console.log('Joining ' + queue.name + ' queue...');
-    context.exec('QUEUE', parameters.join(','), function(err, res) {
-      callback(err, res);
-    });
-  })
-};
-
-methods.voicemail = function(context, vertex, callback) {
-  console.log('--VOICEMAIL BLOCK--');
-  var parameters = [vertex.mailbox, vertex.opts];
-  var squareDetail = {
-    uniqueid: context.uniqueid,
-    node: vertex.label,
-    application: vertex.tag,
-    data: parameters.join(',') || null,
-    project_name: context.project_name,
-    callerid: context.callerid,
-    message: 'detail'
-  }
-  process.send(squareDetail);
-  console.log('Starting voicemail recording...');
-  context.exec('VOICEMAIL', parameters.join(','), function(err, res) {
-    callback(err, res);
-  });
-};
-
-methods.callback = function(context, vertex, callback) {
-  console.log('--CALLBACK BLOCK--');
-  var options = {
-    method: 'POST',
-    uri: 'http://localhost/api/rest/contact/insert',
-    body: {
-      id_list: parseInt(vertex.list_id),
-      name: vertex.name || '',
-      phones: vertex.phone.trim().split(','),
-      description: vertex.label || '',
-      planningtime: moment().add(vertex.delay || 5, 'minutes').format('YYYY-MM-DD HH:mm:ss')
-    },
-    json: true // Automatically stringifies the body to JSON
-  };
-
-  rp(options)
-    .then(function(parsedBody) {
-      if (parsedBody.status > 0) {
-        console.log(parsedBody.response.RMI);
-      } else {
-        console.log(parsedBody.response.RMI.errors);
-      }
-    })
-    .catch(function(err) {
-      console.error('TD problem with request:', err.message);
-    })
-    .finally(function() {
-      console.log('TD finally');
-      callback(null, {
-        code: 200,
-        result: 1
-      });
-    });
-};
-
-methods.math = function(context, vertex, callback) {
-  console.log('--MATH BLOCK--');
-  console.log('Calculating expression...');
-  try {
-    var result = eval(vertex.operation);
-    console.log('Saving result in variable...');
-    var varName = getVariableName(vertex.variable_id);
-    if (_.isArray(result)) {
-      result.forEach(function(elem, index) {
-        wait.for(setVariable, context, varName + '[' + index + ']', '"' + elem + '"');
-      });
-    } else {
-      wait.for(setVariable, context, varName, '"' + result + '"');
-    }
-  } catch (err) {
-    console.log('Error evaluating expression');
-    callback(null, {
-      code: 200,
-      result: 1
-    });
-  }
-
-}
-
-// methods.background = function(context, vertex, callback) {
-//   var parameters = [getFilePath(vertex.file_id), vertex.opts];
-//   context.exec('BACKGROUND', parameters.join('|'), function(err, res) {
-//     callback(err, res);
-//   });
-// };
-
-methods.playback = function(context, vertex, callback) {
-  console.log('--PLAYBACK BLOCK--');
-  getFilePath(vertex.file_id).then(function(audiofile) {
-    // var audiofile = '/var/www/html/files/sounds/d0269ff87187df665ece75538e4cddfd';
-    var parameters = [audiofile, vertex.opts];
-    console.log('Executing playback...');
-    context.exec('PLAYBACK', parameters.join(','), function(err, res) {
-      callback(err, res);
-    });
-  })
-};
-
-methods.menu = function(context, vertex, callback) {
-  console.log('--MENU BLOCK--');
-  var res = {};
-  console.log('There are ' + vertex.retry + ' retries');
-  if (vertex.retry > 0) {
-    vertex.retry--;
-    getFilePath(vertex.file_id).then(function(announce) {
-      // var announce = '/var/www/html/files/sounds/b19642d2f71e9cfffbd783fcc79c7415';
-      // console.log(announce);
-      console.log('Announcing and waiting for user entry...');
-      context.send(util.format('GET DATA %s %s %s\n', announce, parseInt(vertex.response) * 1000, vertex.digit),
-        function(err, res) {
-          var squareDetail = {
-            uniqueid: context.uniqueid,
-            node: vertex.label,
-            application: vertex.tag,
-            data: res.result || null,
-            project_name: context.project_name,
-            callerid: context.callerid,
-            message: 'detail'
-          }
-          process.send(squareDetail);
-          res.result = res.result.replace('(timeout)', '').trim();
-          if (res.result.length) {
-            if (res.result === '-1') {
-              callback(null, res);
-            } else {
-              res.data = res.result;
-              if (vertex.variable_id !== '-1') {
-                console.log('Saving user entry in a variable...');
-                var varName = getVariableName(vertex.variable_id);
-                setVariable(context, varName, '"' + res.data + '"', function() {
-                  callback(null, res);
-                });
-              } else {
-                callback(null, res);
-              }
-            }
-          } else {
-            console.log('Menu timeout!');
-            res = {
-              code: 200,
-              result: '0',
-              data: 't'
-            };
-            callback(null, res);
-          }
-        });
-    });
-  } else {
-    console.log('Run out of retries!');
-    res = {
-      code: 200,
-      result: '0',
-      data: '-'
-    };
-    callback(null, res);
-  }
-};
-
-methods.saynumber = function(context, vertex, callback) {
-  console.log('--SAYNUMBER BLOCK--');
-  console.log('Saying number...');
-  context.send(util.format('SAY NUMBER %s "%s"\n', vertex.number, vertex.escape_digits),
-    function(err, res) {
-      callback(err, res);
-    });
-};
-
-methods.sayphonetic = function(context, vertex, callback) {
-  console.log('--SAYPHONETIC BLOCK--');
-  console.log('Saying phonetic...');
-  context.send(util.format('SAY PHONETIC %s "%s"\n', vertex.text, vertex.escape_digits),
-    function(err, res) {
-      callback(err, res);
-    });
-};
-
-// methods.tts = function(context, vertex, callback) {
-//   console.log('--GOOGLE_TTS BLOCK--');
-//   var parameters = [path.join(config.root, 'server/config/agi_scripts', 'googletts.agi'), encodeURIComponent(vertex.text), vertex.google_tts_language];
-//   // var parameters = ['/var/www/html/agisquare/agiscripts/googletts.agi', encodeURIComponent(vertex.text), vertex.google_tts_language];
-//   console.log('Calling Google TTS API...');
-//   context.exec('AGI', parameters.join(','),
-//     function(err, res) {
-//       callback(err, res);
-//     });
-// };
-
-methods.tts = function(context, vertex, callback) {
-  console.log('--GOOGLE_TTS BLOCK--');
-  googleTTS(vertex.text, vertex.google_tts_language, 1)
-    .then(function(url) {
-      // console.log('The google tts url is: ', url);
-      console.log('Calling Google TTS API...');
-      saveAndPlayTTS(context, vertex, url, 'playback', callback);
-    })
-    .catch(function(err) {
-      console.error('Google TTS error: ', err.message);
-      callback(err, {
-        code: 200,
-        result: '0'
-      })
-    });
-};
-
-function saveAndPlayTTS(context, vertex, url, asteriskFunction, callback) {
-  var item = {
-    _saveName: '',
-    _savePath: '',
-    _convertedPath: ''
-  };
-
-  var options = {
-    url: url,
-  };
-
-  item._saveName = sr({
-    length: 6
-  });
-
-  item._savePath = util.format("/tmp/%s.mp3", item._saveName);
-  var mp3File = fs.createWriteStream(item._savePath);
-
-  // Make API request
-  request
-    .get(options)
-    .on('error', function(err) {
-      console.log('TTS request error:', err);
-    })
-    .on('data', function(data) {
-      mp3File.write(data);
-    })
-    .on('end', function() {
-      console.log('Got audio buffer!');
-      mp3File.end();
-
-      console.log('Audio saved to ', item._savePath);
-      item._convertedPath = util.format("/tmp/%s.wav", item._saveName);
-      console.log('Setting original audio file access permissions!');
-      fs.chmodSync(item._savePath, parseInt('0777', 8));
-      console.log('Converting original audio file and saving in ', item._convertedPath);
-      var job = sox.transcode(item._savePath, item._convertedPath, {
-        sampleRate: 8000,
-        format: 'wav',
-        channelCount: 1,
-        bitRate: 192 * 1024,
-        compressionQuality: 5,
-      });
-
-      job.on('error', function(err) {
-        console.error('**********TTS audio Conversion Error: ', err);
-        deleteTempFile(item._savePath);
-        callback(err, {
-          code: 200,
-          result: '0'
-        })
-      });
-
-      job.on('end', function() {
-        console.log("TTS audio conversion completed");
-        console.log('Setting converted audio file access permissions!');
-        fs.chmodSync(item._convertedPath, parseInt('0777', 8));
-        switch (asteriskFunction) {
-          case 'playback':
-            console.log('Calling asterisk playback...');
-            context.exec('PLAYBACK', util.format("/tmp/%s", item._saveName), function(err, res) {
-              if (err) {
-                console.log('Asterisk playback error: ', err);
-              }
-              console.log('Deleting temp audio files...');
-              deleteTempFile(item._savePath);
-              deleteTempFile(item._convertedPath);
-              callback(err, {
-                code: 200,
-                result: '0'
-              })
-            });
-            break;
-          case 'stream':
-            console.log('Calling asterisk stream file...');
-            context.send(util.format('STREAM FILE %s "%s"\n', util.format("/tmp/%s", item._saveName), vertex.intKey), function(err, res) {
-              if (err) {
-                console.log('Asterisk stream file error: ', err);
-              }
-              console.log('Deleting temp audio files...');
-              deleteTempFile(item._savePath);
-              deleteTempFile(item._convertedPath);
-              callback(err, {
-                code: 200,
-                result: '0'
-              })
-            });
-            break;
-          default:
-            console.log('Calling asterisk playback...');
-            context.exec('PLAYBACK', util.format("/tmp/%s", item._saveName), function(err, res) {
-              if (err) {
-                console.log('Asterisk playback error: ', err);
-              }
-              console.log('Deleting temp audio files...');
-              deleteTempFile(item._savePath);
-              deleteTempFile(item._convertedPath);
-              callback(err, {
-                code: 200,
-                result: '0'
-              })
-            });
-        }
-      });
-      job.start();
-    });
-}
-
-function deleteTempFile(file) {
-  Promise
-    .promisify(fs.unlink)(file)
-    .then(function() {
-      console.log('Temp audio file ' + file + ' deleted!');
-    })
-    .catch(function(err) {
-      // console.log('Error deleting temp audio file: ', err);
-    });
-}
-
-// methods.ispeechtts = function(context, vertex, callback) {
-//   console.log('--ISPEECH_TTS BLOCK--');
-//   // var parameters = [path.join(config.root, 'server/config/agi_scripts', 'ispeech-tts.agi'), encodeURIComponent(vertex.text), vertex.ispeech_tts_language, '', '', vertex.key];
-//   var parameters = ['/var/www/html/agisquare/agiscripts/ispeech-tts.agi', encodeURIComponent(vertex.text), vertex.ispeech_tts_language, vertex.intKey, vertex.speed, vertex.key];
-//   console.log('Calling iSpeech TTS API...');
-//   context.exec('AGI', parameters.join(','),
-//     function(err, res) {
-//       callback(err, res);
-//     });
-// };
-
-methods.ispeechtts = function(context, vertex, callback) {
-  console.log('--ISPEECH_TTS BLOCK--');
-  var url = util.format('https://api.ispeech.org/api/rest?apikey=%s&action=convert&text=%s&voice=%s&speed=%s&format=mp3', vertex.key, encodeURIComponent(vertex.text), vertex.ispeech_tts_language,
-    vertex.speed);
-  try {
-    console.log('The ispeech tts url is: ', url);
-    console.log('Calling iSpeech TTS API...');
-    saveAndPlayTTS(context, vertex, url, 'stream', callback);
-  } catch (err) {
-    console.error('iSPeech TTS error: ', err);
-    callback(err, {
-      code: 200,
-      result: '0'
-    });
-  }
-};
-
-methods.getdigits = function(context, vertex, callback) {
-  console.log('--GETDIGITS BLOCK--');
-  var res = {};
-  console.log('There are ' + vertex.retry + ' retries');
-  if (vertex.retry > 0) {
-    vertex.retry--;
-    getFilePath(vertex.file_id).then(function(announce) {
-      // var announce = '/var/www/html/files/sounds/b19642d2f71e9cfffbd783fcc79c7415';
-      console.log('Announcing and waiting for user entry...');
-      context.send(util.format('GET DATA %s %s %s\n', announce, parseInt(vertex.response) * 1000, vertex.maxdigit),
-        function(err, res) {
-          var squareDetail = {
-            uniqueid: context.uniqueid,
-            node: vertex.label,
-            application: vertex.tag,
-            data: res.result || null,
-            project_name: context.project_name,
-            callerid: context.callerid,
-            message: 'detail'
-          }
-          process.send(squareDetail);
-          res.result = res.result.replace('(timeout)', '').trim();
-          if (res.result.length >= parseInt(vertex.mindigit)) {
-            if (res.result !== '-1') {
-              console.log('There is a result, is over the minimum length and not due to an hangup!');
-              if (vertex.variable_id !== '-1') {
-                console.log('Saving user entry in a variable...');
-                var varName = getVariableName(vertex.variable_id);
-                setVariable(context, varName, '"' + res.result + '"', function() {
-                  res = {
-                    code: 200,
-                    result: '0',
-                    data: 'x'
-                  };
-                  callback(null, res);
-                });
-              } else {
-                console.log('Variable not found, unable to save the result!');
-                res = {
-                  code: 200,
-                  result: '0',
-                  data: 'i'
-                };
-                callback(null, res);
-              }
-            } else {
-              console.log('Channel hangup!');
-              res = {
-                code: 500,
-                result: '-1'
-              };
-              callback(null, res);
-            }
-          } else {
-            console.log('No entry or not long enough!');
-            res = {
-              code: 200,
-              result: '0',
-              data: 'i'
-            };
-            callback(null, res);
-          }
-        });
-    })
-  } else {
-    console.log('Run out of retries!');
-    res = {
-      code: 500,
-      result: '-1'
-    };
-    callback(null, res);
-  }
-};
-
-methods.getsecretdigits = function(context, vertex, callback) {
-  console.log('--GETSECRETDIGITS BLOCK--');
-  var res = {};
-  console.log('There are ' + vertex.retry + ' retries');
-  if (vertex.retry > 0) {
-    vertex.retry--;
-    getFilePath(vertex.file_id).then(function(announce) {
-      // var announce = '/var/www/html/files/sounds/b19642d2f71e9cfffbd783fcc79c7415';
-      console.log('Announcing and waiting for user entry...');
-      context.send(util.format('GET DATA %s %s %s\n', announce, parseInt(vertex.response) * 1000, vertex.maxdigit),
-        function(err, res) {
-          var squareDetail = {
-            uniqueid: context.uniqueid,
-            node: vertex.label,
-            application: vertex.tag,
-            data: res.result || null,
-            project_name: context.project_name,
-            callerid: context.callerid,
-            message: 'detail'
-          }
-          res.result = res.result.replace('(timeout)', '').trim();
-          if (res.result.length >= parseInt(vertex.mindigit)) {
-            if (res.result !== '-1') {
-              console.log('There is a result, is over the minimum length and not due to an hangup!');
-              if (vertex.variable_id !== '-1') {
-                var stringArray = res.result.split('');
-                var length = stringArray.length;
-                var i;
-                var limit = Number(vertex.hiddendigitsnum);
-                if (vertex.hiddendigitspos === 'first') {
-                  for (i = 0; i < limit && i < length; i++) {
-                    stringArray[i] = '*';
-                  }
-                } else {
-                  for (i = length - 1; i >= 0 && limit > 0; i--, limit--) {
-                    stringArray[i] = '*';
-                  }
-                }
-                squareDetail.data = stringArray.join('');
-                process.send(squareDetail);
-                console.log('Saving user entry in a variable...');
-                var varName = getVariableName(vertex.variable_id);
-                setVariable(context, varName, '"' + res.result + '"', function() {
-                  res = {
-                    code: 200,
-                    result: '0',
-                    data: 'x'
-                  };
-                  callback(null, res);
-                });
-              } else {
-                process.send(squareDetail);
-                console.log('Variable not found, unable to save the result!');
-                res = {
-                  code: 200,
-                  result: '0'
-                };
-                callback(null, res);
-              }
-            } else {
-              process.send(squareDetail);
-              console.log('Channel hangup!');
-              res = {
-                code: 500,
-                result: '-1'
-              };
-              callback(null, res);
-            }
-          } else {
-            process.send(squareDetail);
-            console.log('No entry or not long enough!');
-            res = {
-              code: 200,
-              result: '0',
-              data: 'i'
-            };
-            callback(null, res);
-          }
-        });
-    })
-  } else {
-    console.log('Run out of retries!');
-    res = {
-      code: 500,
-      result: '-1'
-    };
-    callback(null, res);
-  }
-};
-
-methods.record = function(context, vertex, callback) {
-  console.log('--RECORD BLOCK--');
-  var saveName = sr({
-    length: 4
-  });
-  console.log('Starting call recording...');
-  context.send(util.format('RECORD FILE %s %s "%s" %s %s %s %s\n', path.join(config.root, 'server/files/recordings', context.uniqueid + '_' + saveName), vertex.recordingFormat || 'wav', vertex.escape_digits, vertex.timeout * 1000, null, true, null),
-    function(
-      err, res) {
-      if (res.code === 200 && res.result !== '-1') {
-        SquareRecording
-          .create({
-            uniqueid: context.uniqueid,
-            callerid: context.callerid,
-            calleridname: context.calleridname,
-            context: context.context,
-            extension: context.extension,
-            priority: context.priority,
-            accountcode: context.accountcode,
-            dnid: context.dnid,
-            project_name: context.project_name,
-            saveName: context.uniqueid + '_' + saveName,
-            filename: vertex.file || null,
-            savePath: path.join(config.root, 'server/files/recordings', context.uniqueid + '_' + saveName + '.wav')
-          })
-          .catch(function(err) {
-            console.log('Error saving ' + vertex.tag + ':' + vertex.label + ' block log', err);
-          });
-        console.log('Saving recording filename in RECORDING_SAVENAME variable...');
-        context.send(util.format('SET VARIABLE %s %s\n', 'RECORDING_SAVENAME', context.uniqueid + '_' + saveName), function(err, res) {
-          callback(err, res);
-        });
-      } else {
-        callback(err, res);
-      }
-    });
-};
-
-methods.gotoiftime = function(context, vertex, callback) { //single or multiple intervals
-  console.log('--GOTOIFTIME BLOCK--');
-  var res;
-  var valid = 'false';
-  var gotoIntervals;
-  if (!collections.intervals) {
-    getIntervals(false);
-  }
-  var interval = _.find(collections.intervals, {
-    id: parseInt(vertex.interval_id)
-  });
-  if (!interval.IntervalId) {
-    gotoIntervals = _.filter(collections.intervals, {
-      IntervalId: parseInt(interval.id)
-    });
-  }
-  if (gotoIntervals) {
-    console.log('Is a group of intervals!');
-    if (gotoIntervals.length) {
-      console.log('There are ' + gotoIntervals.length + ' intervals!');
-      var subInterval;
-      console.log('Checking if at least one interval is valid...');
-      gotoIntervals.forEach(function(elem, index) {
-        subInterval = splitInterval(elem.interval);
-        if (isIntervalValid(subInterval)) {
-          console.log('Interval ' + index + ' is valid!');
-          valid = 'true';
-        }
-      });
-    } else {
-      console.log('There are no sub intervals, so it will be always true!');
-      valid = 'true';
-    }
-  } else {
-    console.log('Is a single interval!');
-    var splittedInterval = splitInterval(interval.interval);
-    if (isIntervalValid(splittedInterval)) {
-      console.log('The interval is valid!');
-      valid = 'true';
-    }
-  }
-  console.log('The final result for the intervals is "' + valid + '"!');
-  res = {
-    code: 200,
-    result: '0',
-    data: valid
-  };
-  callback(null, res);
-};
-
-methods.vswitch = function(context, vertex, callback) {
-  console.log('--VARIABLE_SWITCH BLOCK--');
-  console.log('Getting the variable value and searching the right exit...');
-  var varName = getVariableName(vertex.variable_id);
-  getVariable(context, varName, function(err, res) {
-    if (!res.data) {
-      res.data = '-';
-    }
-    callback(null, res);
-  });
-
-};
-
-methods.goal = function(context, vertex, callback) {
-  var squareDetail = {
-    uniqueid: context.uniqueid,
-    node: vertex.label,
-    application: vertex.tag,
-    data: vertex.goalname || null,
-    project_name: context.project_name,
-    callerid: context.callerid,
-    message: 'detail'
-  }
-  process.send(squareDetail);
-  var res = {
-    code: 200,
-    result: '1'
-  };
-  callback(null, res);
-};
-methods.sendmail = function(context, vertex, callback) {
-  console.log('--sendMail BLOCK--');
-
-  var squareDetail = {
-    uniqueid: context.uniqueid,
-    node: vertex.label,
-    application: vertex.tag,
-    data: vertex.account_id,
-    project_name: context.project_name,
-    callerid: context.callerid,
-    message: 'detail'
-  }
-  process.send(squareDetail);
-
-  var res;
-
-  if (vertex.account_id !== '-1') {
-    var server = _.find(collections.mailServerOut, {
-      id: Number(vertex.account_id)
-    });
-    if (server) {
-      var _message = {
-        from: [server.username],
-        to: vertex.to.split(","),
-        cc: vertex.cc ? vertex.cc.split(",") : [],
-        subject: vertex.subject,
-        html: vertex.text,
-        voiceSource: context.uniqueid,
-        auto: true,
-        message: 'createMail'
-      };
-      if (vertex.template_id !== '-1') {
-        var template = _.find(collections.templates, {
-          id: Number(vertex.template_id)
-        });
-        if (template) {
-          var msg = {
-            from: _message.from,
-            to: _message.to,
-            cc: _message.cc,
-            subject: _message.subject,
-            body: _message.html
-          };
-          _message.subject = template.subject ? Mustache.render(template.subject, msg) : null;
-          _message.html = template.html ? Mustache.render(template.html, msg) : null;
-          process.send(_message);
-          res = {
-            code: 200,
-            result: '1'
-          };
-          callback(null, res);
-        } else {
-          console.log('Error finding template');
-          res = {
-            code: 200,
-            result: '1'
-          };
-          callback(null, res);
-        }
-      } else {
-
-        process.send(_message);
-        res = {
-          code: 200,
-          result: '1'
-        };
-        callback(null, res);
-      }
-
-    } else {
-      console.log(vertex.account_id ? 'Error finding mailAccount address' : 'Error finding general SMTP address');
-      res = {
-        code: 200,
-        result: '1'
-      };
-      callback(null, res);
-    }
-  } else {
-    console.log('The configured account is not valid');
-    res = {
-      code: 200,
-      result: '1'
-    };
-    callback(null, res);
-  }
-
-};
-
-methods.sendsms = function(context, vertex, callback) {
-  console.log('--sendSMS BLOCK--');
-  var squareDetail = {
-    uniqueid: context.uniqueid,
-    node: vertex.label,
-    application: vertex.tag,
-    data: vertex.account_id,
-    project_name: context.project_name,
-    callerid: context.callerid,
-    message: 'detail'
-  }
-  process.send(squareDetail);
-
-  var _message = {
-    body: vertex.sms_text,
-    SmsAccountId: vertex.account_id,
-    source: context.uniqueid,
-    auto: true,
-    message: 'createSms'
-  }
-  var res;
-  if (vertex.account_id !== '-1') {
-    var server = _.find(collections.smsAccounts, {
-      id: Number(vertex.account_id)
-    });
-    if (server) {
-      if (server.type === 'twilio') {
-        _message.from = /^[\+][0-9]+$/.test(server.phone) ? server.phone : '+' + server.phone;
-        _message.to = /^[\+][0-9]+$/.test(vertex.to) ? vertex.to : '+' + vertex.to;
-      } else {
-        _message.from = /^[\+][0-9]+$/.test(server.phone) ? server.phone.replace('+', '') : server.phone;
-        _message.to = /^[\+][0-9]+$/.test(vertex.to) ? vertex.to.replace('+', '') : vertex.to;
-      }
-      process.send(_message);
-      res = {
-        code: 200,
-        result: '1'
-      };
-      callback(null, res);
-    } else {
-      console.log('Error finding SMS account');
-      res = {
-        code: 200,
-        result: '1'
-      };
-      callback(null, res);
-    }
-  } else {
-    console.log('The configured account is not valid');
-    res = {
-      code: 200,
-      result: '1'
-    };
-    callback(null, res);
-  }
-
-};
-
-methods.system = function(context, vertex, callback) {
-  console.log('--SYSTEM BLOCK--');
-  var squareDetail = {
-    uniqueid: context.uniqueid,
-    node: vertex.label,
-    application: vertex.tag,
-    data: _.trim(vertex.command) || null,
-    project_name: context.project_name,
-    callerid: context.callerid,
-    message: 'detail'
-  }
-  process.send(squareDetail);
-  console.log('Executing the system command...');
-  sh.exec(_.trim(vertex.command), function(code, output) {
-    var formattedOutput = output.replace(/(\r\n|\n|\r)/gm, "");
-    console.log('Program output:', formattedOutput);
-    console.log('Saving the output in a variable...');
-    var varName = getVariableName(vertex.variable_id);
-    setVariable(context, varName, '"' + formattedOutput + '"', callback);
-  });
-};
-
-methods.agi = function(context, vertex, callback) {
-  console.log('--AGI BLOCK--');
-  console.log('Executing the AGI command...');
-  context.exec('AGI', vertex.command, vertex.args,
-    function(err, res) {
-      callback(err, res);
-    });
-};
-
-methods.subproject = function(context, vertex, callback) {
-  console.log('--SUBPROJECT BLOCK--');
-  if (!collections.projects) {
-    getProjects(false);
-  }
-  var project = _.find(collections.projects, {
-    id: parseInt(vertex.project_id)
-  });
-  console.log('Moving to project ""' + project.name + '"...');
-  context.exec('AGI', util.format('"agi://127.0.0.1/square,%s"', project.name),
-    function(err, res) {
-      callback(err, res);
-    });
-};
-
-// methods.ispeechasr = function(context, vertex, callback) {
-//   console.log('--ISPEECH_ASR BLOCK--');
-//   // var parameters = ['/var/www/html/agisquare/agiscripts/ispeech-asr.agi', vertex.ispeech_asr_language, '', (vertex.model === '0' ? '' : vertex.model), '1', '#', '', vertex.key];
-//   var parameters = [path.join(config.root, 'server/config/agi_scripts', 'ispeech-asr.agi'), vertex.ispeech_asr_language, '', (vertex.model === '0' ? '' : vertex.model), vertex.timeout, vertex.intKey,
-//     vertex.beep === 'BEEP' ? '' : vertex.beep, vertex.key
-//   ];
-//   console.log('Calling Ispeech ASR API...');
-//   context.exec('AGI', parameters.join(','),
-//     function(err, res) {
-//       callback(err, res);
-//     });
-// };
-
-methods.ispeechasr = function(context, vertex, callback) {
-  console.log('--ISPEECH_ASR BLOCK--');
-  wait.for(setVariable, context, 'utterance', '"-1"');
-  wait.for(setVariable, context, 'status', '"-1"');
-  wait.for(setVariable, context, 'confidence', '"-1"');
-  var vars = wait.for(asr, context, vertex);
-  if (!_.isEmpty(vars)) {
-    console.log('Saving server response into variables...');
-    _.forOwn(vars, function(value, key) {
-      wait.for(setVariable, context, key, '"' + value + '"');
-    });
-  } else {
-    console.log('Error: No response from the server!');
-    wait.for(setVariable, context, 'ASR_ERROR', '"No response from the server!"');
-  }
-};
-
-function asr(context, vertex, callback) { //wait.for creates automatically a callback that have to be called to exit from the called function
-  var item = {
-    _saveName: '',
-    _savePath: '',
-    _convertedPath: ''
-  };
-  //reinitialize in case of wrong variables format passed from the function
-  var vars = {};
-
-  item._saveName = sr({
-    length: 6
-  });
-
-  item._savePath = util.format("/tmp/%s.wav", item._saveName);
-  // console.log('Temp file is ', item._saveName);
-  var recordParams = util.format('%s,%s,,', item._savePath, vertex.timeout ? vertex.timeout : '');
-  if (vertex.beep && vertex.beep !== 'BEEP') {
-    recordParams += 'q';
-  }
-  if (vertex.intKey && vertex.intKey !== '#') {
-    recordParams += 't';
-  }
-  context.exec('RECORD', recordParams, function(err, res) {
-    if (err) {
-      console.log('Asterisk record file error: ', err);
-      callback(err, null);
-    } else {
-      console.log('Getting ASR url...');
-      var url = util.format('https://api.ispeech.org/api/rest?apikey=%s&action=recognize&locale=%s', vertex.key, vertex.ispeech_asr_language);
-      if (vertex.model && vertex.model !== '0') {
-        url += util.format('&model=%s', encodeURIComponent(vertex.model));
-      } else {
-        url += '&freeform=3';
-      }
-      console.log('Reading temp ASR audio file...');
-      Promise.promisify(fs.readFile)(item._savePath)
-        .then(function(result) {
-          console.log('Got audio file from filesystem, generating url...');
-          var base64audio = new Buffer(result, 'binary').toString('base64');
-          url += util.format('&content-type=audio/x-wav&audio=%s', base64audio);
-          var options = {
-            url: url
-          };
-          console.log('Calling ASR server...');
-          return rp(options);
-        })
-        .then(function(asrResponse) {
-          console.log('Got response from the ASR server, elaborating response...');
-          asrResponse = asrResponse.split('&');
-          // console.log('The ASR response is ', asrResponse);
-          var property, error;
-          _.forEach(asrResponse, function(elem) {
-            property = elem.split('=');
-            if (property.length === 2) {
-              switch (property[0]) {
-                case 'text':
-                  vars.utterance = property[1].replace(/\+/g, ' ');
-                  break;
-                case 'result':
-                  if (property[1] === 'success') {
-                    vars.status = 0;
-                  }
-                  break;
-                case 'confidence':
-                  vars.confidence = decodeURIComponent(property[1]);
-                  break;
-                case 'message':
-                  vars.ASR_ERROR = decodeURIComponent(property[1].replace(/\+/g, ' '));
-                  break;
-                default:
-              }
-            }
-          });
-        })
-        .catch(function(err) {
-          console.log('ASR request error: ', err);
-        })
-        .finally(function() {
-          console.log('Deleting temp ASR file...');
-          deleteTempFile(item._savePath);
-          callback(null, vars);
-        });
-    }
-  });
-}
-
-methods.database = function(context, vertex, callback) {
-  console.log('--DATABASE BLOCK--');
-  if (!collections.dbConnections) {
-    getDbConnections(false);
-  }
-  var connection = _.find(collections.dbConnections, {
-    id: parseInt(vertex.odbc_id)
-  });
-  console.log('Trying to get ODBC connection...');
-  var squareDetail = {
-    uniqueid: context.uniqueid,
-    node: vertex.label,
-    application: vertex.tag,
-    data: vertex.query || null,
-    project_name: context.project_name,
-    callerid: context.callerid,
-    message: 'detail'
-  }
-  process.send(squareDetail);
-  try {
-    db.openSync(connection.dsn);
-    var data = db.querySync(vertex.query);
-    db.closeSync();
-    setVariablesMatrix(context, vertex, callback, data);
-  } catch (e) {
-    console.log(e.message);
-    wait.for(setVariable, context, 'ERROR', 'true');
-    wait.for(setVariable, context, 'MESSAGE', '"' + e.message + '"');
-  }
-};
-
-methods.gotoc = function(context, vertex, callback) {
-  console.log('--GOTO BLOCK--');
-  console.log('Going to extension ' + vertex.extension + ' ...');
-  context.exec('DIAL', util.format('Local/%s@%s', vertex.extension, vertex.context),
-    function(err, res) {
-      callback(err, res);
-    });
-};
-
-methods.gotoif = function(context, vertex, callback) {
-  console.log('--GOTOIF BLOCK--');
-  var res = {
-    code: 200,
-    result: '0'
-  };
-  context.exec('NOOP', '"Condition: ' + vertex.condition + '"',
-    function(err, res) {
-      console.log('Evaluating condition...');
-      try {
-        res.data = String(eval(vertex.condition) ? 'true' : 'false');
-      } catch (err) {
-        console.log('Error evaluating condition, going into the false branch...');
-        res.data = 'false';
-      }
-      console.log('The result is ' + res.data);
-      callback(null, res);
-    });
-};
-
-methods.hangup = function(context, vertex, callback) {
-  console.log('--HANGUP BLOCK--');
-  console.log('Hangin up the call...');
-  context.hangup();
-};
-
-methods.noop = function(context, vertex, callback) {
-  console.log('--NOOP BLOCK--');
-  var output = (vertex.output) ? '\"' + vertex.output + '\"' : '\"' +
-    vertex.label + '\"';
-  console.log('NOOP value is ' + output);
-  context.exec('NOOP', output,
-    function(err, res) {
-      callback(err, res);
-    });
-};
-
-methods.saydigits = function(context, vertex, callback) {
-  console.log('--SAYDIGITS BLOCK--');
-  console.log('Saying digits...');
-  context.send(util.format('SAY DIGITS %s "%s"\n', vertex.digits, vertex.escape_digits),
-    function(err, res) {
-      callback(err, res);
-    });
-};
-
-methods.set = function(context, vertex, callback) {
-  console.log('--SET BLOCK--');
-  console.log('Saving value in a variable...');
-  var varName = getVariableName(vertex.variable_id);
-  wait.for(setVariable, context, varName, '"' + vertex.variable_value + '"');
-};
-
-function getVertices(root) {
-  return _.reduce(root, function(result, edge, tag) {
-
-    if (tag === 'mxcell') {
-      return result;
-    }
-
-    if (_.isArray(edge)) {
-      _.forIn(edge, function(value, key) {
-        result[value.$.id] = value.$;
-        result[value.$.id].tag = tag;
-      });
-      return result;
-    }
-
-    result[edge.$.id] = edge.$;
-    result[edge.$.id].tag = tag;
-    return result;
-
-  }, {});
-}
-
-function getTargetBySource(root, source, value, menu) {
-  return _.result(_.find(root.mxcell, function(edge) {
-    if (edge.$.edge && edge.$.source) {
-      if (edge.$.source === source) {
-        if (edge.$.value && edge.$.value !== value) {
-          if (menu) {
-            var values = edge.$.value.split(',');
-            if (_.includes(values, value)) {
-              return true;
-            }
-          }
-          return false;
-        }
-        return true;
-      }
-    }
-    return false;
-  }), '$.target');
-}
-
-// function replaceAllVariables(context, vertex, callback) {
-//   var obj = vertex;
-//   for (var key in obj) {
-//     var res = obj[key].match(/{+(.*?)}/gi);
-//     if (res) {
-//       console.log('res', res);
-//       res.forEach(function(variable, index) {
-//         console.log('variable', res[index].substring(1, res[index].length - 1));
-//         var value = wait.for(getVariable, context, res[index].substring(1, res[index].length - 1));
-//         console.log('value', value);
-//         if (value.data) {
-//           obj[key] = obj[key].replace(res[index], value.data);
-//           // console.log('Replace', res[index], string);
-//         }
-//       })
-//     }
-//   }
-//   obj.replaced = true;
-//   return obj;
-// }
-
-function recurReplace(text, context, start) { //the start parameter says that i'm at the first instance of the recursion, so I don' t have to check if the text is an asterisk variable cause I already have the wanted value
-  // if (start) {
-  //   console.log('First call, the text arrived from function call is: ', text);
-  // } else {
-  //   console.log('Recursive Call, the text arrived is: ', text);
-  // }
-  var a = 0,
-    r = {},
-    i;
-  var count = 0;
-  for (i = 0; i < text.length; i++) {
-    if (text.charAt(i) === '{') {
-      if (count === 0) {
-        a = i;
-      }
-      count++;
-    }
-    if (text.charAt(i) === '}') {
-      count--;
-      if (count === 0) {
-        r[text.substring(a + 1, i)] = text.substring(a + 1, i);
-      }
-    }
-  }
-  if (Object.keys(r).length !== 0) {
-    // console.log('Extracted words are: ', r);
-    for (var key in r) {
-      // console.log('Current text element is: ', key);
-      r[key] = recurReplace(key, context);
-      // console.log('Replaced text is: ', r[key]);
-    }
-    for (var key2 in r) {
-      text = text.replace(new RegExp('{' + key2.replace(/[.*+?^${}()|[\]\\]/g, "\\$&") + '}', 'g'), r[key2]);
-    }
-  }
-  if (start) {
-    // console.log('Exiting recursive function!');
-    return text;
-  } else {
-    // console.log('Returning single word value: ', text);
-    var value = wait.for(getVariable, context, text);
-    return value.data || '{' + text + '}';
-  }
-}
-
-function replaceAllVariables(context, vertex, callback) {
-  var obj = _.clone(vertex);
-  for (var key in obj) {
-    obj[key] = recurReplace(obj[key], context, true);
-    console.log('Text after variables replace: ', obj[key]);
-  }
-  return obj;
-}
-
-function xstart(context) {
-  var root = context.root;
-  var vertices = context.vertices;
-
-  if (root.start) {
-    if (!_.isArray(root.start)) {
-      var source = root.start.$.id;
-      var res = {};
-      do {
-        try {
-          var vertex = replaceAllVariables(context, vertices[source]);
-          if (vertex) {
-            if (_.isFunction(methods[vertex.tag])) {
-              res = wait.for(methods[vertex.tag], context, vertex);
-            } else {
-              res = wait.for(methods.noop, context, vertex);
-            }
-            if (res.code === 200 && res.result !== '-1') {
-              if (vertex.tag === 'menu' || vertex.tag === 'getdigits' || vertex.tag === 'getsecretdigits') {
-                vertices[source].retry = vertex.retry;
-              }
-              var target = getTargetBySource(root, source, res.data, vertex.tag === 'menu');
-              if (!target) {
-                if (vertex.tag === 'menu') {
-                  if (vertex.retry > 0) {
-                    target = getTargetBySource(root, source, 'i', true);
-                    if (!target) {
-                      target = source;
-                    }
-                  } else {
-                    target = getTargetBySource(root, source, '-', true);
-                  }
-                }
-                if ((vertex.tag === 'getdigits' || vertex.tag === 'getsecretdigits') && vertex.retry > 0) {
-                  target = source;
-                }
-                if (vertex.tag === 'vswitch' && res.data !== '-') { // if I didn't find the target and I didn't fail to get the variable value I try to go to the minus branch
-                  target = getTargetBySource(root, source, '-');
-                }
-              }
-              source = target;
-            } else {
-              source = null;
-            }
-          } else {
-            source = null;
-          }
-        } catch (err) {
-          console.log(err);
-        }
-      }
-      while (source);
-      console.log('No target found, hangup!');
-      context.hangup();
-    }
-  }
-}
-
-
-function xfinally(context) {
-  var root = context.root;
-  var vertices = context.vertices;
-
-  if (root.finally) {
-    if (!_.isArray(root.finally)) {
-      var source = root.finally.$.id;
-      var res = {};
-      do {
-        try {
-          var vertex = vertices[source].replaced ? vertices[source] : replaceAllVariables(context, vertices[source]);
-          if (vertex) {
-            if (_.isFunction(methods[vertex.tag])) {
-              res = wait.for(methods[vertex.tag], context, vertex);
-            } else {
-              res = wait.for(methods.noop, context, vertex);
-            }
-            if (res.code === 200 && res.result !== '-1') {
-              var target = getTargetBySource(root, source, res.data, vertex.tag === 'menu');
-              if (!target) {
-                if (vertex.tag === 'menu') {
-                  if (vertex.retry > 0) {
-                    target = getTargetBySource(root, source, 'i', true);
-                    if (!target) {
-                      target = source;
-                    }
-                  } else {
-                    target = getTargetBySource(root, source, '-', true);
-                  }
-                }
-                if (vertex.tag === 'getdigits' && vertex.retry > 0) {
-                  target = source;
-                }
-                if (vertex.tag === 'vswitch' && res.data !== '-') { // if I didn't find the target and I didn't fail to get the variable value I try to go to the minus branch
-                  target = getTargetBySource(root, source, '-');
-                }
-              }
-              source = target;
-            } else {
-              source = null;
-            }
-          } else {
-            source = null;
-          }
-        } catch (err) {
-          console.log(err);
-        }
-      } while (source);
-      context.hangup();
-      console.log('No target found, stopping "Finally" branch!');
-    }
-  }
-  context.end();
-}
-
-
-function main(context) {
-
-  context.on('error', function(err) {
-    console.log('//Error:', err);
-  });
-
-  context.on('close', function() {
-    console.log('//Context close');
-  });
-
-  context.on('hangup', function() {
-    if (context.finally) {
-      context.finally = false;
-      console.log('//Starting "Finally" branch!');
-      wait.launchFiber(xfinally, context);
-    } else {
-      process.send({
-        message: 'update',
-        uniqueid: context.uniqueid,
-        leaveAt: moment().format("YYYY-MM-DD HH:mm:ss")
-      });
-      console.log('//Context Hangup');
-    }
-  });
-
-  context.on('response', function(res) {
-    //console.log('Response:', res);
-  });
-
-  context.on('variables', function(vars) {
-    console.log(vars);
-    console.log('Received new call from: ' + vars.agi_callerid +
-      ' with uniqueid: ' + vars.agi_uniqueid);
-    var squareLog = {
-      network: vars.agi_network,
-      network_script: vars.agi_network_script,
-      request: vars.agi_request,
-      channel: vars.agi_channel,
-      language: vars.agi_language,
-      type: vars.agi_type,
-      uniqueid: vars.agi_uniqueid,
-      version: vars.agi_version,
-      callerid: vars.agi_callerid,
-      calleridname: vars.agi_calleridname,
-      callingpres: vars.agi_callingpres,
-      callingani2: vars.agi_callingani2,
-      callington: vars.agi_callington,
-      callingtns: vars.agi_callingtns,
-      dnid: vars.agi_dnid,
-      rdnis: vars.agi_rdnis,
-      context: vars.agi_context,
-      extension: vars.agi_extension,
-      priority: vars.agi_priority,
-      enhanced: vars.agi_enhanced,
-      accountcode: vars.agi_accountcode,
-      threadid: vars.agi_threadid,
-      project_name: vars.agi_arg_1,
-      joinAt: moment().format("YYYY-MM-DD HH:mm:ss"),
-      message: 'create'
-    };
-
-    process.send(squareLog);
-
-    if (vars.agi_arg_1) {
-      SquareProject
-        .findOne({
-          where: {
-            name: vars.agi_arg_1
-          },
-          attributes: ['id', 'production']
-        })
-        .then(function(project) {
-          if (project) {
-            if (project.production) {
-              xml.parseString(project.production, {
-                normalizeTags: true,
-                explicitArray: false
-              }, function(err, result) {
-                var root = result.mxgraphmodel.root;
-                if (root) {
-                  context.root = root;
-                  context.finally = true;
-                  context.uniqueid = vars.agi_uniqueid;
-                  context.callerid = vars.agi_callerid;
-                  context.calleridname = vars.agi_calleridname;
-                  context.context = vars.agi_context;
-                  context.extension = vars.agi_extension;
-                  context.priority = vars.agi_priority;
-                  context.accountcode = vars.agi_accountcode;
-                  context.dnid = vars.agi_dnid;
-                  context.project_name = vars.agi_arg_1;
-                  context.vertices = getVertices(root);
-                  wait.launchFiber(xstart, context);
-                } else {
-                  console.log('No root in project!');
-                  context.end();
-                }
-              });
-            } else {
-              console.log('No project published!');
-              context.end();
-            }
-          } else {
-            console.log('No project found!');
-            context.end();
-          }
-        })
-        .catch(function(err) {
-          console.log('Error:', err);
-          context.end();
-        });
-    } else {
-      console.log('No project argument!');
-      context.end();
-    }
-  });
-}
-
-function splitInterval(interval) {
-  var finalInterval = {};
-  var splittedInterval = interval.split(',');
-  var intValues;
-  splittedInterval.forEach(function(element, index) {
-    switch (index) {
-      case 0:
-        if (element !== '*') {
-          intValues = element.split('-');
-          finalInterval.t_from = moment(intValues[0], 'HH:mm');
-          finalInterval.t_to = moment(intValues[1], 'HH:mm');
-        } else {
-          finalInterval.t_from = null;
-          finalInterval.t_to = null;
-        }
-        break;
-      case 1:
-        if (element !== '*') {
-          intValues = element.split('-');
-          finalInterval.wd_from = weekDaysCollection[intValues[0]];
-          finalInterval.wd_to = intValues[1] ? weekDaysCollection[intValues[1]] : null;
-        } else {
-          finalInterval.wd_from = null;
-          finalInterval.wd_to = null;
-        }
-        break;
-      case 2:
-        if (element !== '*') {
-          intValues = element.split('-');
-          finalInterval.md_from = intValues[0];
-          finalInterval.md_to = intValues[1] ? intValues[1] : null;
-        } else {
-          finalInterval.md_from = null;
-          finalInterval.md_to = null;
-        }
-        break;
-      case 3:
-        if (element !== '*') {
-          intValues = element.split('-');
-          finalInterval.m_from = monthsCollection[intValues[0]];
-          finalInterval.m_to = intValues[1] ? monthsCollection[intValues[1]] : null;
-        } else {
-          finalInterval.m_from = null;
-          finalInterval.m_to = null;
-        }
-        break;
-      default:
-
-    }
-
-
-  });
-  return finalInterval;
-}
-
-function isIntervalValid(interval) {
-  var hour = moment().format("HH:mm");
-  var day = moment().format("E");
-  var monthDay = moment().format("D");
-  var month = moment().format("M");
-  console.log('Now: Hour: ', hour, ', Day: ', day, ', MonthDay: ', monthDay, ', Month: ', month);
-  console.log('Interval:');
-  console.log(' Hours:', moment(interval.t_from, "HH:mm").format('HH:mm'), ' - ', moment(interval.t_to, "HH:mm").format('HH:mm'));
-  console.log(' weekday:', interval.wd_from, ' - ', interval.wd_to);
-  console.log(' monthday:', interval.md_from, ' - ', interval.md_to);
-  console.log(' month:', interval.m_from, ' - ', interval.m_to);
-  var tValid, wdValid, mdValid, mValid;
-  var monthsNumbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
-  var weekDaysNumbers = [1, 2, 3, 4, 5, 6, 7];
-  var daysOfMonthsNumbers = [];
-  for (var i = 1; i <= 31; i++) {
-    daysOfMonthsNumbers.push(i);
-  }
-  tValid = (interval.t_from && interval.t_to) ? moment(hour, "HH:mm").isBetween(moment(interval.t_from, "HH:mm"), moment(interval.t_to, "HH:mm")) : true;
-  if (interval.wd_from) {
-    if (interval.wd_to) {
-      var validWeekdays = _.filter(weekDaysNumbers, function(elem) {
-        return (elem >= interval.wd_from) && (elem <= interval.wd_to);
-      });
-      console.log('valid weekdays', validWeekdays);
-      wdValid = (validWeekdays.indexOf(parseInt(day)) !== -1) ? true : false;
-    } else {
-      wdValid = (parseInt(day) === interval.wd_from) ? true : false;
-    }
-  } else {
-    wdValid = true;
-  }
-  if (interval.md_from) {
-    if (interval.md_to) {
-      var validMonthsdays = _.filter(daysOfMonthsNumbers, function(elem) {
-        return (elem >= interval.md_from) && (elem <= interval.md_to);
-      });
-      console.log('valid monthsdays', validMonthsdays);
-      mdValid = (validMonthsdays.indexOf(parseInt(monthDay)) !== -1) ? true : false;
-    } else {
-      mdValid = (parseInt(monthDay) === interval.md_from) ? true : false;
-    }
-  } else {
-    mdValid = true;
-  }
-  if (interval.m_from) {
-    if (interval.m_to) {
-      var validMonths = _.filter(monthsNumbers, function(elem) {
-        return (elem >= interval.m_from) && (elem <= interval.m_to);
-      });
-      console.log('valid months', validMonths);
-      mValid = (validMonths.indexOf(parseInt(month)) !== -1) ? true : false;
-    } else {
-      mValid = (parseInt(month) === interval.m_from) ? true : false;
-    }
-  } else {
-    mValid = true;
-  }
-  console.log('Time is ', tValid, ', WeekDay is ', wdValid, ', MonthDay is ', mdValid, ', Month is ', mValid);
-  return tValid && wdValid && mdValid && mValid;
-}
-
-function setVariable(context, name, value, callback) {
-  console.log('Setting variable...');
-  console.log('Sending set variable,variable is ' + name + ', value is ', value);
-  context.send(util.format('SET VARIABLE %s %s\n', name, value), function(err, res) {
-    if (callback) {
-      callback(err, res);
-    }
-  });
-}
-
-function getVariableName(id) {
-  if (!collections.variables) {
-    getVariables(false);
-  }
-  var variable = {
-    name: 'placeholder' //if for any reason i don't receive both the name and the id of the variable, the value will be saved in a placeholder variable
-  };
-  var searchVar;
-  if (id) {
-    searchVar = _.find(collections.variables, {
-      id: parseInt(id)
-    });
-  }
-  return searchVar ? searchVar.name : variable.name;
-}
-
-function setVariablesMatrix(context, vertex, callback, data) {
-  if (data && data.length) {
-    var varName = getVariableName(vertex.variable_id);
-    _.forEach(data, function(row, index) {
-      _.forOwn(row, function(value, key) {
-        wait.for(setVariable, context, varName + '[' + index + '][' + key + ']', '"' + value + '"');
-      });
-    });
-    wait.for(setVariable, context, varName + '_ROWS_COUNT', data.length);
-  } else {
-    callback(null, {
-      code: 200,
-      result: 0
-    });
-  }
-}
-
-function getVariable(context, name, callback) {
-  context.getVariable(name, function(err, res) {
-    if (res.code === 200 && res.result !== '0') {
-      res.data = res.result.substring(res.result.lastIndexOf("(") + 1,
-        res.result.lastIndexOf(")"));
-    } else {
-      res.data = '';
-    }
-    callback(null, res);
-  })
-}
-
-function getFilePath(id) {
-  if (!collections.sounds) {
-    getSounds(false);
-  }
-  return Setting
-    .findOne()
-    .then(function(result) {
-      if (id !== '-1') {
-        if (result) {
-          var file = _.find(collections.sounds, {
-            id: parseInt(id)
-          });
-          return util.format('%s/%s', result.soundPath || '/var/opt/motion/server/files/sounds/converted', file.save_name);
-        }
-        return '';
-      } else {
-        return '';
-      }
-    })
-    .catch(function(err) {
-      console.log(err);
-    });
-}
-
-function getUsers(synch) {
-  return User
-    .findAll()
-    .then(function(result) {
-      collections.users = _.clone(result);
-      if (synch) {
-        synchUpdates('User', 'users', 'id');
-      }
-    })
-    .catch(function(err) {
-      console.log(err);
-    });
-}
-
-function getQueues(synch) {
-  return VoiceQueue
-    .findAll()
-    .then(function(result) {
-      collections.queues = _.clone(result);
-      if (synch) {
-        synchUpdates('VoiceQueue', 'queues', 'name');
-      }
-    })
-    .catch(function(err) {
-      console.log(err);
-    });
-}
-
-function getVariables(synch) {
-  return Variable
-    .findAll()
-    .then(function(result) {
-      collections.variables = _.clone(result);
-      if (synch) {
-        synchUpdates('Variable', 'variables', 'id');
-      }
-    })
-    .catch(function(err) {
-      console.log(err);
-    });
-}
-
-function getDbConnections(synch) {
-  return SquareOdbc
-    .findAll()
-    .then(function(result) {
-      collections.dbConnections = _.clone(result);
-      if (synch) {
-        synchUpdates('SquareOdbc', 'dbConnections', 'id');
-      }
-    })
-    .catch(function(err) {
-      console.log(err);
-    });
-}
-
-function getIntervals(synch) {
-  return Interval
-    .findAll()
-    .then(function(result) {
-      collections.intervals = _.clone(result);
-      if (synch) {
-        synchUpdates('Interval', 'intervals');
-      }
-    })
-    .catch(function(err) {
-      console.log(err);
-    });
-}
-
-function getProjects(synch) {
-  return SquareProject
-    .findAll()
-    .then(function(result) {
-      collections.projects = _.clone(result);
-      if (synch) {
-        synchUpdates('SquareProject', 'projects', 'id');
-      }
-    })
-    .catch(function(err) {
-      console.log(err);
-    });
-}
-
-function getSounds(synch) {
-  return Sound
-    .findAll()
-    .then(function(result) {
-      collections.sounds = _.clone(result);
-      if (synch) {
-        synchUpdates('Sound', 'sounds', 'id');
-      }
-    })
-    .catch(function(err) {
-      console.log(err);
-    });
-}
-
-function getMailServerOut(synch) {
-  return MailServerOut
-    .findAll()
-    .then(function(result) {
-      collections.mailServerOut = _.clone(result);
-      if (synch) {
-        synchUpdates('MailServerOut', 'mailServerOut', 'id');
-      }
-    })
-    .catch(function(err) {
-      console.log(err);
-    });
-}
-
-function getTemplates(synch) {
-  return Template
-    .findAll()
-    .then(function(result) {
-      collections.templates = _.clone(result);
-      if (synch) {
-        synchUpdates('Template', 'templates', 'id');
-      }
-    })
-    .catch(function(err) {
-      console.log(err);
-    });
-}
-
-function getSmsAccounts(synch) {
-  return SmsAccount
-    .findAll()
-    .then(function(result) {
-      collections.smsAccounts = _.clone(result);
-      if (synch) {
-        synchUpdates('SmsAccount', 'smsAccounts', 'id');
-      }
-    })
-    .catch(function(err) {
-      console.log(err);
-    });
-}
-
-
-
-function synchUpdates(model, collection, key) {
-  process.send({
-    message: key ? 'synch' : 'forceSynch',
-    model: model,
-    collection: collection,
-    key: key
-  });
-}
-
-function updateCollection(collection, condition, doc) {
-  var oldItem = _.find(collections[collection], condition);
-  if (oldItem) {
-    _.merge(oldItem, doc);
-  } else {
-    collections[collection].unshift(doc);
-  }
-}
-
-function replaceCollection(collection, doc) {
-  collections[collection] = doc;
-}
-
-function getPort() {
-  return function() {
-    return Setting
-      .findOne()
-      .then(function(result) {
-        if (result) {
-          return result.agi_port;
-        }
-      })
-      .catch(function(err) {
-        console.log(err);
-      });
-  }
-}
-
-Promise
-  .all([])
-  .then(getPort())
-  .then(function(agiPort) {
-    agi.createServer(main).listen(agiPort || 4573);
-    getUsers(true);
-    getQueues(true);
-    getVariables(true);
-    getIntervals(true);
-    getProjects(true);
-    getSounds(true);
-    getDbConnections(true);
-    getMailServerOut(true);
-    getTemplates(true);
-    getSmsAccounts(true);
-    process.on('message', function(data) {
-      switch (data.message) {
-        case 'updateCollection':
-          updateCollection(data.collection, data.condition, data.doc);
-          break;
-        case 'replaceCollection':
-          replaceCollection(data.collection, data.doc);
-          break;
-        case 'removeFromCollection':
-          _.remove(collections[data.collection], data.condition);
-          break;
-        default:
-      }
-    });
-  })
-  .catch(function(err) {
-    console.error('Failed initializing AGI service', err);
-  });
\ No newline at end of file
diff --git a/server/config/agi/index.js b/server/config/agi/index.js
index b2c8a79..cd930d2 100644
--- a/server/config/agi/index.js
+++ b/server/config/agi/index.js
@@ -1,127 +1 @@
-var cp = require('child_process');
-var util = require('util');
-var models = require('../../models');
-
-module.exports = function() {
-  var child = cp
-    .fork(__dirname + '/agi')
-    .on('message', function(data) {
-      switch (data.message) {
-        case 'update':
-          return models.ReportSquare.update({
-              leaveAt: data.leaveAt
-            }, {
-              where: {
-                uniqueid: data.uniqueid
-              },
-              individualHooks: true
-            })
-            .catch(function(err) {
-              console.log('Error saving exit time from IVR', err);
-            });
-        case 'create':
-          delete data.message;
-          return models.ReportSquare
-            .create(data)
-            .catch(function(err) {
-              console.log('Error saving enter time for IVR', err);
-            });
-        case 'detail':
-          delete data.message;
-          return models.ReportSquareDetail
-            .create(data)
-            .catch(function(err) {
-              console.log('Error saving ' + data.application + ':' + data.node + ' block log', err);
-            });
-        case 'synch':
-          synchCollection(data, child);
-          break;
-        case 'forceSynch': //in case of collections with sub-collections (es: voiceextension, interval)
-          replaceCollection(data, child);
-          break;
-        case 'createSms':
-          delete data.message;
-          return models.SmsMessage
-            .create(data)
-            .catch(function(err) {
-              console.log('Error creating sms message', err);
-            });
-        case 'createMail':
-          delete data.message;
-          return models.MailMessage
-            .create(data)
-            .catch(function(err) {
-              console.log('Error creating sms message', err);
-            });
-        default:
-      }
-    })
-    .on('close', function(code) {
-      console.log(util.format('AGI SERVER EXITED WITH CODE %s', code));
-    })
-    .on('error', function(err) {
-      console.error(err);
-    });
-
-  process.on('exit', function(code) {
-    child.kill();
-  });
-};
-
-function synchCollection(data, child) {
-  var condition = {};
-  models[data.model].afterCreate(function(doc) {
-    condition[data.key] = doc[data.key];
-    child.send({
-      message: 'updateCollection',
-      collection: data.collection,
-      condition: condition,
-      doc: doc
-    });
-  });
-  models[data.model].afterUpdate(function(doc) {
-    condition[data.key] = doc[data.key];
-    child.send({
-      message: 'updateCollection',
-      collection: data.collection,
-      condition: condition,
-      doc: doc
-    });
-  });
-  models[data.model].afterDestroy(function(doc) {
-    condition[data.key] = doc[data.key];
-    child.send({
-      message: 'removeFromCollection',
-      collection: data.collection,
-      condition: condition
-    });
-  });
-}
-
-function replaceCollection(data, child) {
-  var condition = {};
-  models[data.model].afterCreate(function(doc) {
-    getCollection(data, child, doc);
-  });
-  models[data.model].afterUpdate(function(doc) {
-    getCollection(data, child, doc);
-  });
-  models[data.model].afterDestroy(function(doc) {
-    getCollection(data, child, doc);
-  });
-}
-
-function getCollection(data, child, doc) {
-  models[data.model]
-    .findAll()
-    .then(function(results) {
-      child.send({
-        message: 'replaceCollection',
-        collection: data.collection,
-        doc: results
-      });
-    })
-    .catch(function(err) {
-      console.log('AGI error on replacing ', data.collection, ' collection', err);
-    });
-}
\ No newline at end of file
diff --git a/server/config/ami/action.js b/server/config/ami/action.js
index 44a3ba4..9b6479b 100644
--- a/server/config/ami/action.js
+++ b/server/config/ami/action.js
@@ -1,724 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-var moment = require('moment');
-var util = require('util');
-var Promise = require('bluebird');
-
-var Agent = require('../../models').User;
-var _Action = require('../../models').Action;
-var Sequelize = require('../../models').sequelize;
-var VoiceQueue = require('../../models').VoiceQueue;
-var ReportMember = require('../../models').ReportMember;
-var UserHasVoiceQueue = require('../../models').UserHasVoiceQueue;
-var UserHasChatQueue = require('../../models').UserHasChatQueue;
-var UserHasMailQueue = require('../../models').UserHasMailQueue;
-var UserHasFaxQueue = require('../../models').UserHasFaxQueue;
-var UserHasSmsQueue = require('../../models').UserHasSmsQueue;
-var UserHasOpenchannelQueue = require('../../models').UserHasOpenchannelQueue;
-
-function Action(ami) {
-  console.log('Action Initialization...');
-  var channels = ['voice', 'chat', 'mail', 'fax', 'sms', 'openchannel'];
-
-  _Action.afterCreate(function(doc, options) {
-    return onSave(doc, options, ami);
-  });
-
-  ReportMember.beforeCreate(function(doc, options) {
-    return ReportMember
-      .findAll({
-        where: {
-          channel: doc.channel,
-          membername: doc.membername,
-          interface: doc.interface,
-          type: doc.type,
-          exitAt: null
-        }
-      })
-      .then(function(elms) {
-        var queries = [];
-        elms.forEach(function(elm) {
-          queries.push(elm.update({
-            exitAt: moment().format("YYYY-MM-DD HH:mm:ss"),
-          }));
-        });
-
-        return Promise
-          .all(queries);
-      });
-  });
-
-  // HANDLE PAUSE FUNCTION
-  function handlePause(options, action) {
-    return function(agent) {
-      return Promise
-        .promisify(ami.action)({
-          action: 'QueuePause',
-          interface: util.format('%s/%s', 'SIP', agent.name),
-          paused: true,
-          reason: options.body.type || action.data1,
-        })
-        .then(function(astData) {
-          return agent
-            .update({
-              voicePause: true,
-              chatPause: true,
-              mailPause: true,
-              faxPause: true,
-              smsPause: true,
-              openchannelPause: true,
-              pauseType: options.body.type || action.data1,
-              lastPauseAt: moment().format("YYYY-MM-DD HH:mm:ss")
-            }, {
-              transaction: options.transaction || null
-            });
-        })
-        .then(function(agent) {
-          var reportMembers = [];
-          channels.forEach(function(channel) {
-            reportMembers.push({
-              channel: channel,
-              membername: agent.name,
-              interface: util.format('%s/%s', 'SIP', agent.name),
-              type: 'PAUSE',
-              enterAt: moment().format("YYYY-MM-DD HH:mm:ss"),
-              data1: options.body.type || action.data1,
-              data2: action.data2,
-              data3: action.data3,
-              data4: action.data4,
-              role: agent.role,
-              internal: agent.internal
-            });
-          })
-          return ReportMember
-            .bulkCreate(reportMembers, {
-              individualHooks: true,
-              transaction: options.transaction || null
-            });
-        });
-    }
-  }
-
-  // HANDLE PAUSE FUNCTION
-  function handlePauseLogin(options, action) {
-    return function(agent) {
-      if (agent.loginInPause && !agent.online) {
-        return Promise
-          .promisify(ami.action)({
-            action: 'QueuePause',
-            interface: util.format('%s/%s', 'SIP', agent.name),
-            paused: true,
-            reason: 'DEFAULT PAUSE',
-          })
-          .then(function(astData) {
-            return agent
-              .update({
-                voicePause: true,
-                chatPause: true,
-                mailPause: true,
-                faxPause: true,
-                smsPause: true,
-                openchannelPause: true,
-                pauseType: 'DEFAULT PAUSE',
-                lastPauseAt: moment().format("YYYY-MM-DD HH:mm:ss")
-              }, {
-                transaction: options.transaction || null
-              });
-          })
-          .then(function(agent) {
-            var reportMembers = [];
-            channels.forEach(function(channel) {
-              reportMembers.push({
-                channel: channel,
-                membername: agent.name,
-                interface: util.format('%s/%s', 'SIP', agent.name),
-                type: 'PAUSE',
-                enterAt: moment().format("YYYY-MM-DD HH:mm:ss"),
-                data1: 'DEFAULT PAUSE',
-                data2: action.data2,
-                data3: action.data3,
-                data4: 'DEFAULT PAUSE',
-                role: agent.role,
-                internal: agent.internal
-              });
-            })
-            return ReportMember
-              .bulkCreate(reportMembers, {
-                individualHooks: true,
-                transaction: options.transaction || null
-              });
-          });
-      }
-    }
-  }
-
-  // HANDLE UNPAUSE FUNCTION
-  function handleUnpause(options, action) {
-    return function(agent) {
-      if (!options.body) options.body = {};
-
-      switch (options.body.channel) {
-        case 'voice':
-
-          return Promise
-            .promisify(ami.action)({
-              action: 'QueuePause',
-              interface: util.format('%s/%s', 'SIP', agent.name),
-              paused: false,
-              reason: options.body.type
-            })
-            .then(function() {
-              return agent
-                .update({
-                  voicePause: false,
-                }, {
-                  transaction: options.transaction || null
-                });
-            })
-            .then(function(agent) {
-              return ReportMember
-                .findOne({
-                  where: {
-                    channel: options.body.channel,
-                    membername: agent.name,
-                    interface: util.format('%s/%s', 'SIP', agent.name),
-                    type: 'PAUSE',
-                    exitAt: null
-                  }
-                });
-            })
-            .then(handleEntityNotFound({
-              message: 'Already Pause Off'
-            }))
-            .then(function(reportMember) {
-              return reportMember
-                .update({
-                  exitAt: moment().format("YYYY-MM-DD HH:mm:ss"),
-                }, {
-                  individualHooks: true,
-                  transaction: options.transaction || null
-                });
-            })
-            .then(function() {
-              return agent;
-            });
-
-        case 'chat':
-        case 'mail':
-        case 'fax':
-        case 'sms':
-        case 'openchannel':
-
-          var data = {};
-          data[util.format('%s%s', options.body.channel, 'Pause')] = false;
-
-          return agent
-            .update(data, {
-              transaction: options.transaction || null
-            })
-            .then(function(agent) {
-
-              return ReportMember
-                .findOne({
-                  where: {
-                    channel: options.body.channel,
-                    membername: agent.name,
-                    interface: util.format('%s/%s', 'SIP', agent.name),
-                    type: 'PAUSE',
-                    exitAt: null
-                  }
-                });
-            })
-            .then(handleEntityNotFound({
-              message: 'Already Pause Off'
-            }))
-            .then(function(reportMember) {
-              return reportMember
-                .update({
-                  exitAt: moment().format("YYYY-MM-DD HH:mm:ss"),
-                }, {
-                  individualHooks: true,
-                  transaction: options.transaction || null
-                });
-            })
-            .then(function() {
-              return agent;
-            });
-
-        default:
-          var action = Promise.promisify(ami.action);
-          return action({
-              action: 'QueuePause',
-              interface: util.format('%s/%s', 'SIP', agent.name),
-              paused: false
-            })
-            .catch(function(err) {
-              console.error(err);
-            })
-            .then(function() {
-              return agent
-                .update({
-                  voicePause: false,
-                  mailPause: false,
-                  chatPause: false,
-                  faxPause: false,
-                  smsPause: false,
-                  openchannelPause: false
-                }, {
-                  transaction: options.transaction || null
-                });
-            })
-            .then(function(agent) {
-              return ReportMember
-                .findAll({
-                  where: {
-                    membername: agent.name,
-                    interface: util.format('%s/%s', 'SIP', agent.name),
-                    type: 'PAUSE',
-                    exitAt: null
-                  },
-                });
-            })
-            .then(function(members) {
-              var promises = [];
-
-              members.forEach(function(member) {
-                promises.push(member.update({
-                  exitAt: moment().format("YYYY-MM-DD HH:mm:ss")
-                }));
-              });
-
-              return Promise
-                .all(promises);
-            })
-            .then(function() {
-              return agent;
-            });
-      }
-    }
-  }
-
-  // HANDLE LOGIN FUNCTION
-  function handleLogin(options, action) {
-    return function(agent) {
-      if (!agent.online) {
-        return agent
-          .getVoiceQueues()
-          .then(function(voiceQueues) {
-            var actions = [];
-            voiceQueues.forEach(function(voiceQueue) {
-              actions.push(ami.action({
-                action: 'QueueAdd',
-                queue: voiceQueue.name,
-                interface: util.format('%s/%s', 'SIP', agent.name),
-                membername: agent.name
-              }));
-            });
-            return Promise.all(actions);
-          })
-          .then(function(astData) {
-            var reportMembers = [];
-            channels.forEach(function(channel) {
-              reportMembers.push({
-                channel: channel,
-                membername: agent.name,
-                interface: util.format('%s/%s', 'SIP', agent.name),
-                type: 'LOGIN',
-                enterAt: moment().format("YYYY-MM-DD HH:mm:ss"),
-                role: agent.role,
-                internal: agent.internal
-              });
-            });
-            return ReportMember
-              .bulkCreate(reportMembers, {
-                individualHooks: true
-              });
-          });
-      }
-    }
-  }
-
-  // HANDLE LOGOUT FUNCTION
-  function handleLogout(options, action) {
-    return function(agent) {
-      return VoiceQueue
-        .findAll()
-        .then(function(voiceQueues) {
-          var actions = [];
-          voiceQueues.forEach(function(voiceQueue) {
-            actions.push(ami.action({
-              action: 'QueueRemove',
-              queue: voiceQueue.name,
-              interface: util.format('%s/%s', 'SIP', agent.name)
-            }));
-          });
-          return Promise
-            .all(actions)
-            .catch(function(err) {
-              console.error(err);
-            });
-        })
-        .then(function(astData) {
-          return ReportMember
-            .findAll({
-              where: {
-                membername: agent.name,
-                interface: util.format('%s/%s', 'SIP', agent.name),
-                type: 'LOGIN',
-                exitAt: null
-              },
-            });
-        })
-        .then(function(members) {
-          //single update
-          var promises = [];
-
-          members.forEach(function(member) {
-            promises.push(member.update({
-              exitAt: moment().format("YYYY-MM-DD HH:mm:ss")
-            }));
-          });
-
-          return Promise
-            .all(promises);
-        });
-    }
-  }
-
-  // HANDLE QUEUEADD FUNCTION
-  function handleQueueAdd(options, action) {
-    return function(agent) {
-      var bulkQueues = [];
-      switch (options.body.channel) {
-        case 'voice':
-          options.body.queues.forEach(function(queue) {
-            bulkQueues.push(UserHasVoiceQueue
-              .findOrCreate({
-                where: {
-                  UserId: agent.id,
-                  queue: queue
-                },
-                defaults: {
-                  queue: queue,
-                  location: util.format('SIP/%s', agent.name),
-                  membername: agent.name,
-                  UserId: agent.id,
-                },
-                transaction: options.transaction || null
-              }));
-          });
-          return Promise
-            .all(bulkQueues)
-            .then(function() {
-              var actions = [];
-              options.body.queues.forEach(function(queue) {
-                actions.push(ami.action({
-                  action: 'QueueAdd',
-                  queue: queue,
-                  interface: util.format('%s/%s', 'SIP', agent.name),
-                  membername: agent.name
-                }));
-              });
-              return Promise
-                .all(actions);
-            })
-            .catch(function(err) {
-              console.error(err);
-            })
-        case 'chat':
-          options.body.queues.forEach(function(queue) {
-            bulkQueues.push(UserHasChatQueue
-              .findOrCreate({
-                where: {
-                  UserId: agent.id,
-                  ChatQueueId: queue.id
-                },
-                defaults: {
-                  ChatQueueId: queue.id,
-                  queue: queue.name,
-                  UserId: agent.id,
-                },
-                transaction: options.transaction || null
-              }));
-          });
-          return Promise
-            .all(bulkQueues)
-            .catch(function(err) {
-              console.log(err);
-            });
-        case 'mail':
-          options.body.queues.forEach(function(queue) {
-            bulkQueues.push(UserHasMailQueue
-              .findOrCreate({
-                where: {
-                  UserId: agent.id,
-                  MailQueueId: queue.id
-                },
-                defaults: {
-                  MailQueueId: queue.id,
-                  queue: queue.name,
-                  UserId: agent.id,
-                },
-                transaction: options.transaction || null
-              }));
-          });
-          return Promise
-            .all(bulkQueues)
-            .catch(function(err) {
-              console.log(err);
-            });
-        case 'sms':
-          options.body.queues.forEach(function(queue) {
-            bulkQueues.push(UserHasSmsQueue
-              .findOrCreate({
-                where: {
-                  UserId: agent.id,
-                  SmsQueueId: queue.id
-                },
-                defaults: {
-                  SmsQueueId: queue.id,
-                  queue: queue.name,
-                  UserId: agent.id,
-                },
-                transaction: options.transaction || null
-              }));
-          });
-          return Promise
-            .all(bulkQueues)
-            .catch(function(err) {
-              console.log(err);
-            });
-        case 'openchannel':
-          options.body.queues.forEach(function(queue) {
-            bulkQueues.push(UserHasOpenchannelQueue
-              .findOrCreate({
-                where: {
-                  UserId: agent.id,
-                  OpenchannelQueueId: queue.id
-                },
-                defaults: {
-                  OpenchannelQueueId: queue.id,
-                  queue: queue.name,
-                  UserId: agent.id,
-                },
-                transaction: options.transaction || null
-              }));
-          });
-          return Promise
-            .all(bulkQueues)
-            .catch(function(err) {
-              console.log(err);
-            });
-        case 'fax':
-          options.body.queues.forEach(function(queue) {
-            bulkQueues.push(UserHasFaxQueue
-              .findOrCreate({
-                where: {
-                  UserId: agent.id,
-                  FaxQueueId: queue.id
-                },
-                defaults: {
-                  faxQueueId: queue.id,
-                  queue: queue.name,
-                  UserId: agent.id,
-                },
-                transaction: options.transaction || null
-              }));
-          });
-          return Promise
-            .all(bulkQueues)
-            .catch(function(err) {
-              console.log(err);
-            });
-        default:
-      }
-    }
-  }
-
-  // HANDLE QUEUEREMOVE FUNCTION
-  function handleQueueRemove(options, action) {
-    return function(agent) {
-      switch (options.body.channel) {
-        case 'voice':
-          return UserHasVoiceQueue
-            .destroy({
-              where: {
-                UserId: agent.id,
-                queue: options.body.queue
-              },
-              transaction: options.transaction || null,
-              individualHooks: true
-            })
-            .then(function() {
-              var newAction = Promise.promisify(ami.action);
-              return newAction({
-                action: 'QueueRemove',
-                queue: options.body.queue,
-                interface: util.format('%s/%s', 'SIP', agent.name),
-              });
-            })
-            .catch(function(err) {
-              console.error('queue association remove error :', err);
-            });
-        case 'chat':
-          return UserHasChatQueue
-            .destroy({
-              where: {
-                UserId: agent.id,
-                ChatQueueId: options.body.queueId
-              },
-              transaction: options.transaction || null,
-              individualHooks: true
-            })
-            .catch(function(err) {
-              console.error('queue association remove error :', err);
-            });
-        case 'mail':
-          return UserHasMailQueue
-            .destroy({
-              where: {
-                UserId: agent.id,
-                MailQueueId: options.body.queueId
-              },
-              transaction: options.transaction || null,
-              individualHooks: true
-            })
-            .catch(function(err) {
-              console.error('queue association remove error :', err);
-            });
-        case 'sms':
-          return UserHasSmsQueue
-            .destroy({
-              where: {
-                UserId: agent.id,
-                SmsQueueId: options.body.queueId
-              },
-              transaction: options.transaction || null,
-              individualHooks: true
-            })
-            .catch(function(err) {
-              console.error('queue association remove error :', err);
-            });
-        case 'openchannel':
-          return UserHasOpenchannelQueue
-            .destroy({
-              where: {
-                UserId: agent.id,
-                OpenchannelQueueId: options.body.queueId
-              },
-              transaction: options.transaction || null,
-              individualHooks: true
-            })
-            .catch(function(err) {
-              console.error('queue association remove error :', err);
-            });
-        case 'fax':
-          return UserHasFaxQueue
-            .destroy({
-              where: {
-                UserId: agent.id,
-                FaxQueueId: options.body.queueId
-              },
-              transaction: options.transaction || null,
-              individualHooks: true
-            })
-            .catch(function(err) {
-              console.error('queue association remove error :', err);
-            });
-        default:
-      }
-    }
-  }
-
-  // HANDLE ENTITY NOT FOUND
-  function handleEntityNotFound(error) {
-    return function(entity) {
-      if (!entity) {
-        throw error;
-      }
-      return entity;
-    };
-  }
-
-  function onSave(action, options, ami) {
-    // START ACTION STATEMENT
-    switch (action.name) {
-      case 'pause':
-        // START HANDLE PAUSE
-        return Agent
-          .findById(options.body.agent)
-          .then(handleEntityNotFound({
-            message: 'Unknown Agent'
-          }))
-          .then(handlePause(options, action));
-        // END HANDLE PAUSE
-      case 'unpause':
-        // START HANDLE UNPAUSE
-        return Agent
-          .findById(options.body.agent)
-          .then(handleEntityNotFound({
-            message: 'Unknown Agent'
-          }))
-          .then(handleUnpause(options, action));
-        // END HANDLE UNPAUSE
-
-      case 'login':
-        // START HANDLE LOGIN
-        return Agent
-          .findById(action.data1)
-          .then(handleEntityNotFound({
-            message: 'Unknown Agent'
-          }))
-          .then(handleLogin(options, action))
-          .then(function() {
-            return Agent
-              .findById(action.data1)
-          })
-          .then(handlePauseLogin(options, action));
-        // END HANDLE LOGING
-
-      case 'logout':
-        // START HANDLE LOGOUT
-        return Agent
-          .findById(action.data1)
-          .then(handleEntityNotFound({
-            message: 'Unknown Agent'
-          }))
-          .then(handleUnpause(options, action))
-          .then(handleLogout(options, action));
-        // END HANDLE LOGOUT
-      case 'QueueAdd':
-        // START HANDLE QUEUEADD
-        return Agent
-          .findById(options.body.agent)
-          .then(handleEntityNotFound({
-            message: 'Unknown Agent'
-          }))
-          .then(handleQueueAdd(options, action));
-        // END HANDLE QUEUEADD
-      case 'QueueRemove':
-        // START HANDLE QUEUEREMOVE
-        return Agent
-          .findById(options.body.agent)
-          .then(handleEntityNotFound({
-            message: 'Unknown Agent'
-          }))
-          .then(handleQueueRemove(options, action));
-        // END HANDLE QUEUEREMOVE
-
-      default:
-        throw {
-          message: 'Unknown Action'
-        };
-    }
-    // END ACTION STATEMENT
-  }
-
-  return {};
-}
-
-module.exports = Action;
\ No newline at end of file
diff --git a/server/config/ami/acw.js b/server/config/ami/acw.js
index f634adc..2958706 100644
--- a/server/config/ami/acw.js
+++ b/server/config/ami/acw.js
@@ -1,152 +1 @@
-var moment = require('moment');
-var _ = require('lodash');
-var VoiceQueue = require('../../models').VoiceQueue;
-var Agent = require('../../models').User;
-var Action = require('../../models').Action;
-var ReportAgent = require('../../models').ReportAgent;
-var _voiceQueues;
-var _agents;
-var activeAcw = {};
-
-
-function ACW(ami) {
-  console.log('ACW Initialization...');
-  VoiceQueue
-    .findAll()
-    .then(function(voiceQueues) {
-      _voiceQueues = voiceQueues;
-      // console.log('_voiceQueues', _.map(_voiceQueues, 'dataValues'));
-      synchCollection(VoiceQueue, _voiceQueues, 'name');
-      return Agent
-        .scope('agent')
-        .findAll();
-    })
-    .then(function(agents) {
-      _agents = agents;
-      // console.log('_agents', _.map(_agents, 'dataValues'));
-      synchCollection(Agent, _agents, 'id');
-      Action.afterCreate(function(doc, options) {
-        return onSave(doc, options);
-      });
-    })
-    .catch(function(err) {
-      console.log(err);
-    });
-}
-
-function onSave(doc, options) {
-  var acwTime;
-  if ((doc.name === 'pause' || doc.name === 'unpause') && activeAcw[options.body.agent]) {
-    if (doc.name === 'unpause' && activeAcw[options.body.agent].unpause) {
-      acwTime = activeAcw[options.body.agent].acwTime;
-    } else {
-      clearTimeout(activeAcw[options.body.agent].timeout);
-      acwTime = moment.duration(moment() - activeAcw[options.body.agent].acwAt).asSeconds();
-    }
-    return ReportAgent
-      .update({
-        agentacw: true,
-        acwtime: acwTime
-      }, {
-        where: {
-          uniqueid: activeAcw[options.body.agent].uniqueid,
-          destuniqueid: activeAcw[options.body.agent].destuniqueid
-        },
-        transaction: options.transaction,
-        individualHooks: true
-      })
-      .catch(function(err) {
-        console.log(err);
-      })
-      .finally(function() {
-        delete activeAcw[options.body.agent];
-      });
-  }
-}
-
-ACW.prototype.agentcomplete = function(evt) {
-  var queueIsAcw = _.find(_voiceQueues, {
-    name: evt.queue,
-    acw: true
-  });
-  if (queueIsAcw) {
-    var agent = _.find(_agents, {
-      name: evt.membername
-    });
-    Action
-      .create({
-        name: 'pause',
-        data1: 'ACW',
-        data2: queueIsAcw.acwTimeout,
-        data3: evt.uniqueid,
-        data4: evt.queue
-      }, {
-        body: {
-          agent: agent.id,
-          type: 'ACW'
-        }
-      })
-      .then(function() {
-        console.log('PAUSED BY ACW');
-        activeAcw[agent.id] = {
-          uniqueid: evt.uniqueid,
-          destuniqueid: evt.destuniqueid,
-          acwTime: queueIsAcw.acwTimeout,
-          acwAt: moment(),
-          unpause: false
-        };
-
-        activeAcw[agent.id].timeout = setTimeout(function() {
-          console.log('UNPAUSED BY ACW');
-          activeAcw[agent.id].unpause = true;
-          return Action
-            .create({
-              name: 'unpause',
-              data1: 'ACW',
-              data2: queueIsAcw.acwTimeout,
-              data3: evt.uniqueid,
-              data4: evt.queue
-            }, {
-              body: {
-                agent: agent.id,
-                type: 'ACW'
-              }
-            })
-            .catch(function(err) {
-              console.log(err);
-            });
-        }, queueIsAcw.acwTimeout * 1000);
-      })
-      .catch(function(err) {
-        console.log(err);
-      });
-  }
-}
-
-function synchCollection(model, array, uniqueProperty) {
-  var condition = {};
-  model.afterCreate(function(doc) {
-    condition[uniqueProperty] = doc[uniqueProperty]
-    updateCollection(array, doc, condition);
-  });
-  model.afterUpdate(function(doc) {
-    condition[uniqueProperty] = doc[uniqueProperty]
-    updateCollection(array, doc, condition);
-  });
-  model.afterDestroy(function(doc) {
-    condition[uniqueProperty] = doc[uniqueProperty]
-    _.remove(array, condition);
-  });
-}
-
-function updateCollection(collection, doc, condition) {
-  var oldItem = _.find(collection, condition);
-  var index = collection.indexOf(oldItem);
-  if (oldItem) {
-    _.merge(collection[index], doc);
-  } else {
-    collection.unshift(doc);
-  }
-}
-
-module.exports = ACW;
\ No newline at end of file
diff --git a/server/config/ami/agent.js b/server/config/ami/agent.js
index 4a7d5e4..10764bd 100644
--- a/server/config/ami/agent.js
+++ b/server/config/ami/agent.js
@@ -1,97 +1 @@
-var moment = require('moment');
-var ReportAgent = require('../../models').ReportAgent;
-
-function Agent() {
-  console.log('Agent Initialization...');
-}
-
-Agent.prototype.called = function(evt) {
-  evt.lastevent = 'called';
-  evt.agentcalledAt = moment().format("YYYY-MM-DD HH:mm:ss");
-  return createAgent(evt);
-}
-
-Agent.prototype.connect = function(evt) {
-  evt.lastevent = 'connect';
-  evt.agentconnectAt = moment().format("YYYY-MM-DD HH:mm:ss");
-  updateAgents(evt);
-  updateAgents({
-    agentringnoanswer: true,
-    agentringnoanswerAt: moment().format("YYYY-MM-DD HH:mm:ss"),
-    reason: 'answered_elsewhere',
-    lastevent: 'answered_elsewhere',
-    answeredelsewheredestinationuniqueid: evt.destuniqueid,
-    answeredelsewheremembername: evt.membername
-  }, {
-    uniqueid: evt.uniqueid,
-    destuniqueid: {
-      $ne: evt.destuniqueid
-    },
-    reason: null
-  });
-}
-
-Agent.prototype.complete = function(evt) {
-  evt.lastevent = 'complete';
-  evt.agentcomplete = true;
-  evt.agentcompleteAt = moment().format("YYYY-MM-DD HH:mm:ss");
-  return updateAgents(evt);
-}
-
-Agent.prototype.dump = function(evt) {
-  evt.lastevent = 'dump';
-
-  evt.agentdump = true;
-  evt.agentdumpAt = moment().format("YYYY-MM-DD HH:mm:ss");
-  return updateAgents(evt);
-}
-
-Agent.prototype.ringnoanswer = function(evt) {
-  evt.lastevent = 'rejected';
-  evt.agentringnoanswer = true;
-  evt.agentringnoanswerAt = moment().format("YYYY-MM-DD HH:mm:ss");
-  evt.reason = 'rejected';
-  return updateAgents(evt);
-}
-
-Agent.prototype.callerabandon = function(evt) {
-  evt.lastevent = 'abandoned';
-  evt.agentringnoanswer = true;
-  evt.agentringnoanswerAt = moment().format("YYYY-MM-DD HH:mm:ss");
-  evt.reason = 'abandoned';
-  return updateAgents(evt, {
-    uniqueid: evt.uniqueid,
-    reason: null
-  });
-}
-
-function createAgent(evt) {
-  return ReportAgent
-    .create(evt)
-    .then(function(agent) {
-      console.log('[report] agent begin created');
-    })
-    .catch(function(err) {
-      console.error('[report] agent ' + err);
-    });
-}
-
-function updateAgents(evt, where) {
-  return ReportAgent
-    .update(evt, {
-      where: (where) ? where : {
-        uniqueid: evt.uniqueid,
-        destuniqueid: evt.destuniqueid
-      },
-      individualHooks: true
-    })
-    .then(function(agent) {
-      console.log('[agent] agent')
-    })
-    .catch(function(err) {
-      console.error('[agent] agent error: ' + err);
-    });
-}
-
-
-module.exports = Agent;
\ No newline at end of file
diff --git a/server/config/ami/call.js b/server/config/ami/call.js
index b7b6167..d3eabc2 100644
--- a/server/config/ami/call.js
+++ b/server/config/ami/call.js
@@ -1,60 +1 @@
-'use strict';
-
-var moment = require('moment');
-
-function Call() {
-  console.log('Call Initialization...');
-}
-
-Call.prototype.add = function(evt) {
-  if (evt.type) {
-    create(evt);
-  }
-}
-
-function create(evt) {
-  var call = require('../../models').ReportCall;
-  var _answerTime;
-
-  call
-    .findOrCreate({
-      where: {
-        uniqueid: evt.uniqueid
-      },
-      defaults: evt
-    })
-    .spread(function(call, created) {
-      if (!created) {
-
-        if (evt.answertime) {
-          console.log('[report] call uniqueid', evt.uniqueid, 'answertime', evt.answertime, 'updated');
-          call.answertime = evt.answertime;
-        }
-
-        if (evt.endtime && call.endtime) {
-          if (moment(evt.endtime).isAfter(call.endtime)) {
-            console.log('[report] call uniqueid', evt.uniqueid, 'endtime', evt.endtime, 'updated');
-
-            call.endtime = evt.endtime;
-            call.disposition = evt.disposition;
-            call.destinationchannel = evt.destinationchannel;
-            call.lastapplication = evt.lastapplication;
-            call.lastdata = evt.lastdata;
-
-            call.duration = moment(call.endtime).diff(call.starttime, 'seconds');
-            call.billableseconds = moment(call.endtime).diff(call.answertime, 'seconds');
-          }
-        }
-
-        return call
-          .save();
-      } else {
-        console.log('[report] call', evt.uniqueid, 'created');
-      }
-    })
-    .catch(function(err) {
-      console.error('[report] call ' + err);
-    });
-}
-
-module.exports = Call;
\ No newline at end of file
diff --git a/server/config/ami/cleaner.js b/server/config/ami/cleaner.js
index 4470e4a..16e9cc9 100644
--- a/server/config/ami/cleaner.js
+++ b/server/config/ami/cleaner.js
@@ -1,110 +1 @@
-'use strict';
-
-var moment = require('moment');
-var _ = require('lodash');
-var Promise = require('bluebird');
-
-var ReportQueue = require('../../models').ReportQueue;
-var ReportSquare = require('../../models').ReportSquare;
-var ReportDial = require('../../models').ReportDial;
-
-function Cleaner(ami) {
-  console.log('Cleaner Initialization...');
-  removeInactiveCalls(ami);
-  setInterval(function() {
-    removeInactiveCalls(ami);
-  }, 10 * 60 * 1000);
-}
-
-function removeInactiveCalls(ami) {
-  console.log('Removing inactive calls...');
-  var _bulkClean = [],
-    _activeCalls = [];
-  return Promise
-    .promisify(ami.action)({
-      action: 'Command',
-      command: 'core show channels concise',
-    })
-    .then(function(result) {
-      var tmpArray;
-      if (result && result.content) {
-        var res = result.content.split('\n');
-        _.forEach(res, function(elem) {
-          if (elem) {
-            tmpArray = elem.split('!');
-            tmpArray.length === 14 && _activeCalls.push(tmpArray.pop());
-          }
-        });
-      }
-      return ReportQueue
-        .findAll({
-          where: {
-            $or: [{
-              queuecallerleaveAt: null
-            }, {
-              queuecallerexit: false,
-              queuecallerabandon: false,
-              queuecallercomplete: false,
-              queuecallerleaveAt: {
-                $ne: null
-              }
-            }]
-          }
-        });
-    })
-    .then(function(queueCalls) {
-      _.forEach(queueCalls, function(call) {
-        if (!_.includes(_activeCalls, call.uniqueid)) {
-          _bulkClean.push(call.updateAttributes({
-            queuecallerleaveAt: moment().format("YYYY-MM-DD HH:mm:ss"),
-            queuecallerexitAt: moment().format("YYYY-MM-DD HH:mm:ss"),
-            queuecallerexit: true,
-            queuecallerexitreason: 'zombie'
-          }))
-        }
-      });
-      return ReportSquare
-        .findAll({
-          where: {
-            leaveAt: null
-          }
-        });
-    })
-    .then(function(squareCalls) {
-      _.forEach(squareCalls, function(call) {
-        if (!_.includes(_activeCalls, call.uniqueid)) {
-          _bulkClean.push(call.updateAttributes({
-            leaveAt: moment().format("YYYY-MM-DD HH:mm:ss"),
-            network: 'no'
-          }))
-        }
-      });
-
-      return ReportDial
-        .findAll({
-          where: {
-            endtime: null
-          }
-        });
-    })
-    .then(function(dialCalls) {
-      _.forEach(dialCalls, function(call) {
-        if (!_.includes(_activeCalls, call.uniqueid)) {
-          _bulkClean.push(call.updateAttributes({
-            endtime: moment().format("YYYY-MM-DD HH:mm:ss"),
-            dialstatus: 'ZOMBIE'
-          }))
-        }
-      });
-      return _bulkClean;
-    })
-    .all()
-    .then(function() {
-      console.log('Inactive calls cleaning completed!');
-    })
-    .catch(function(err) {
-      console.log('Inactive calls remove error:', err);
-    });
-}
-
-module.exports = Cleaner;
\ No newline at end of file
diff --git a/server/config/ami/dial.js b/server/config/ami/dial.js
index eb6ed61..addb207 100644
--- a/server/config/ami/dial.js
+++ b/server/config/ami/dial.js
@@ -1,84 +1 @@
-var moment = require('moment');
-var ReportDial = require('../../models').ReportDial;
-
-function Dial() {
-  console.log('Agent Initialization...');
-}
-
-Dial.prototype.beforeDial = function(evt) {
-  return createDial(evt);
-}
-
-Dial.prototype.begin = function(evt) {
-  if (evt.dialstring) {
-    var dialString = evt.dialstring.split('/');
-    if (dialString.length > 1 && dialString[0] !== 'SIP') {
-      evt.starttime = moment().format("YYYY-MM-DD HH:mm:ss");
-      evt.lastevent = 'called';
-      return updateDial(evt);
-    }
-  }
-}
-
-Dial.prototype.end = function(evt) {
-  evt.endtime = moment().format("YYYY-MM-DD HH:mm:ss");
-  if (evt.dialstatus === 'ANSWER') {
-    evt.lastevent = 'connect';
-    evt.answertime = moment().format("YYYY-MM-DD HH:mm:ss");
-  } else {
-    evt.lastevent = 'rejected';
-  }
-  return updateDial(evt);
-}
-
-Dial.prototype.hangup = function(evt) {
-  return ReportDial
-    .findOne({
-      where: {
-        uniqueid: evt.uniqueid
-      },
-      order: 'createdAt DESC'
-    })
-    .then(function(dial) {
-      if (dial) {
-        evt.endtime = moment().format("YYYY-MM-DD HH:mm:ss");
-        evt.lastevent = dial.answertime ? 'complete' : 'rejected';
-        return updateDial(evt);
-      }
-    })
-}
-
-function createDial(evt) {
-  return ReportDial
-    .create(evt)
-    .then(function(dial) {
-      console.log('[dial] begin')
-    })
-    .catch(function(err) {
-      console.error('[dial] dial creation error: ' + err);
-    });
-}
-
-function updateDial(evt, where) {
-  return ReportDial
-    .findOne({
-      where: (where) ? where : {
-        uniqueid: evt.uniqueid
-      },
-      order: 'createdAt DESC'
-    })
-    .then(function(row) {
-      if (row) {
-        return row
-          .updateAttributes(evt);
-      }
-    })
-    .then(function(dial) {
-      console.log('[dial] update')
-    })
-    .catch(function(err) {
-      console.error('[dial] update error: ' + err);
-    });
-}
-
-module.exports = Dial;
\ No newline at end of file
diff --git a/server/config/ami/fax.js b/server/config/ami/fax.js
index 7bc697b..73a5741 100644
--- a/server/config/ami/fax.js
+++ b/server/config/ami/fax.js
@@ -1,582 +1 @@
-var fs = require('fs');
-var util = require('util');
-var path = require('path');
-var config = require('../../config/environment');
-var _ = require('lodash');
-var Promise = require('bluebird');
-// var tiff2pdf = Promise.promisify(require('tiff2pdf'));
-var exec = require('child-process-promise').exec;
-var fse = require('fs-extra');
-var moment = require('moment');
-
-var FaxAccount = require('../../models').FaxAccount;
-var FaxRoom = require('../../models').FaxRoom;
-var FaxMessage = require('../../models').FaxMessage;
-var FaxAttachment = require('../../models').FaxAttachment;
-var Trunk = require('../../models').Trunk;
-var User = require('../../models').User;
-var Contact = require('../../models').Contact;
-var ReportFax = require('../../models').ReportFax;
-var Util = require('../util');
-
-var Scheduler = require('../routing/scheduler');
-var faxaccounts;
-
-function Fax(ami) {
-  console.log('Fax Initialization...');
-
-  FaxMessage.afterCreate(function(doc, opt) {
-    sendfax(doc, ami, 0, opt);
-  });
-
-  FaxMessage.afterUpdate(function(doc, opt) {
-    if (doc.changed('status') && doc.status === 'SENDING') {
-      sendfax(doc, ami, doc.retry + 1, opt);
-    }
-  });
-
-  FaxAccount
-    .findAll()
-    .then(function(accounts) {
-      faxaccounts = accounts;
-      synch(faxaccounts);
-      ReportFax.afterUpdate(function(doc) {
-        var account = _.find(faxaccounts, {
-          id: parseInt(doc.accountid)
-        });
-        if (account && doc.changed('connectid')) {
-          webhook(doc, account, 'accept');
-        }
-        if (account && doc.changed('rejectedAt')) {
-          webhook(doc, account, 'reject');
-        }
-      });
-      FaxRoom.afterUpdate(function(doc) {
-        var account = _.find(faxaccounts, {
-          id: doc.FaxAccountId
-        });
-        if (account && doc.changed('status') && doc.status === 'CLOSED') {
-          webhook(doc, account, 'close');
-        }
-      })
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
-
-function synch(faxaccounts) {
-  FaxAccount.afterCreate(function(doc) {
-    faxaccounts.push(doc);
-  });
-  FaxAccount.afterUpdate(function(doc) {
-    var oldItem = _.find(faxaccounts, {
-      id: doc.id
-    });
-    if (oldItem) {
-      console.log('Fax account: ' + oldItem.name + ' Update');
-      _.merge(oldItem, doc);
-    } else {
-      faxaccounts.unshift(doc);
-    }
-  });
-  FaxAccount.afterDestroy(function(doc) {
-    _.remove(faxaccounts, {
-      id: doc.id
-    });
-  });
-
-}
-
-function webhook(doc, account, hook) {
-  var _Account = account;
-  switch (hook) {
-    case 'accept':
-      if (_Account.acceptMethod && _Account.acceptUrl) {
-        console.log('Fax account <' + _Account.name + '> executing accept webhook');
-        execRequest(doc.dataValues, _Account.acceptMethod, _Account.acceptUrl);
-      }
-      if (_Account.actions.length) {
-        _.forEach(_Account.actions, function(action) {
-          if (action.enabled) {
-            Util.execAction(action, doc);
-          }
-        })
-      }
-      break;
-    case 'reject':
-      if (_Account.rejectMethod && _Account.rejectUrl) {
-        console.log('Fax account <' + _Account.name + '> executing reject webhook');
-        execRequest(doc.dataValues, _Account.rejectMethod, _Account.rejectUrl);
-      }
-      break;
-    case 'close':
-      if (_Account.closeMethod && _Account.closeUrl) {
-        console.log('Fax account <' + _Account.name + '> executing close webhook');
-        execRequest(doc.dataValues, _Account.closeMethod, _Account.closeUrl);
-      }
-      break;
-    default:
-      console.log('Webhook not recognized');
-  }
-}
-
-function execRequest(doc, method, url) {
-  Util.sendRequest(doc, method, url)
-    .then(function(values) {
-      console.log('request successeful!');
-
-    })
-    .catch(function(err) {
-      console.log('request failed!');
-
-    })
-}
-Fax.prototype.updateError = function(evt) {
-  return FaxMessage
-    .findOne({
-      where: {
-        channel: evt.channel
-      }
-    })
-    .then(function(faxMessage) {
-      if (!faxMessage) {
-        throw new Error('Fax message not found');
-      }
-      return faxMessage.updateAttributes({
-        error: evt.value
-      });
-    })
-    .catch(function(err) {
-      console.log('Error', err);
-    });
-};
-
-Fax.prototype.updateMessage = function(evt) {
-  return FaxMessage
-    .findOne({
-      where: {
-        filename: evt.filename,
-        localstationid: evt.localstationid
-      }
-    })
-    .then(function(faxMessage) {
-      if (!faxMessage) {
-        throw new Error('Fax message not found');
-      }
-
-      return faxMessage
-        .updateAttributes({
-          channel: evt.channel,
-          channelstate: evt.channelstate,
-          channelstatedesc: evt.channelstatedesc,
-          calleridnum: evt.calleridnum,
-          calleridname: evt.calleridname,
-          connectedlinenum: evt.connectedlinenum,
-          connectedlinename: evt.connectedlinename,
-          accountcode: evt.accountcode,
-          context: evt.context,
-          exten: evt.exten,
-          priority: evt.priority,
-          uniqueid: evt.uniqueid,
-          linkedid: evt.linkedid,
-          lastStatus: evt.status
-        });
-
-    })
-    .catch(function(err) {
-      console.log('Error', err);
-    });
-}
-
-Fax.prototype.updateSend = function(evt) {
-  var _fMessage;
-
-  return FaxMessage
-    .findOne({
-      where: {
-        filename: evt.filename,
-        localstationid: evt.localstationid
-      }
-    })
-    .then(function(faxMessage) {
-      if (!faxMessage) {
-        throw new Error('Fax message not found');
-      }
-
-      _fMessage = faxMessage;
-
-      var status = 'SENT';
-      if (evt.pagestransferred == '0') {
-        status = 'FAILED';
-      }
-
-      return _fMessage
-        .updateAttributes({
-          remotestationid: evt.remotestationid,
-          pagestransferred: evt.pagestransferred,
-          resolution: evt.resolution,
-          transferrate: evt.transferrate,
-          status: status
-        });
-
-    })
-    .then(function() {
-      return _fMessage.getFaxRoom();
-    })
-    .then(function(faxRoom) {
-      if (!faxRoom) {
-        throw new Error('Fax room not found');
-      }
-      return faxRoom
-        .updateAttributes({
-          lastEvent: 'SENT'
-        }, {
-          individualHooks: true
-        });
-    })
-    .catch(function(err) {
-      console.log('Error', err);
-    });
-}
-
-Fax.prototype.receivefax = function(evt) {
-
-  console.log(util.format('New Fax message from %s', evt.calleridnum));
-  var _message = _.clone(evt);
-  var _account;
-  var _fMessage, _fRoom;
-
-  //Get the FaxAccount based on localstationid
-  return FaxAccount
-    .findOne({
-      where: {
-        localstationid: evt.localstationid
-      }
-    })
-    .then(function(faxAccount) {
-      if (!faxAccount) {
-        throw new Error('Fax account not found');
-      }
-      console.log('Fax account found:', evt.localstationid);
-      _account = faxAccount;
-      if (_account.ListId) {
-        return Contact
-          .findOrCreate({
-            where: {
-              ListId: _account.ListId,
-              $or: [{
-                phone: evt.calleridnum
-              }, {
-                fax: evt.calleridnum
-              }]
-            },
-            defaults: {
-              phone: evt.calleridnum,
-              fax: evt.calleridnum,
-              firstName: evt.calleridnum,
-              ListId: _account.ListId
-            }
-          });
-      } else {
-        return [];
-      }
-    })
-    .spread(function(contact, created) {
-      if (created != undefined && !created) {
-        return contact.updateAttributes({
-          fax: evt.calleridnum
-        });
-      }
-      return;
-    })
-    .then(function() {
-      return FaxRoom
-        .findAll({
-          limit: 1,
-          where: {
-            contact: _message.calleridnum,
-            FaxAccountId: _account.id,
-            status: {
-              $ne: 'CLOSED'
-            }
-          },
-          order: [
-            ['createdAt', 'DESC']
-          ]
-        })
-    })
-    .then(function(room) {
-      if (room.length) {
-        // console.log('Fax room to update');
-        room = _.first(room);
-        return room
-          .updateAttributes({
-            lastEvent: 'RECEIVED',
-            lastEventAt: moment().format('YYYY-MM-DD HH:mm:ss'),
-            status: 'OPEN',
-            openReason: 'system',
-            faxIn: ++room.faxIn
-          });
-      } else {
-        // console.log('Fax room to create');
-        return FaxRoom
-          .create({
-            contact: _message.calleridnum,
-            account: _account.name,
-            status: 'NEW',
-            lastEvent: 'RECEIVED',
-            lastEventAt: moment().format('YYYY-MM-DD HH:mm:ss'),
-            FaxAccountId: _account.id,
-            faxIn: 1
-          });
-      }
-    })
-    .then(function(room) {
-      if (!room) {
-        throw new Error('Fax room not found/created');
-      }
-      // console.log('Fax room found/created:', room.id);
-      _fRoom = room;
-      _message.FaxRoomId = room.id;
-      _message.status = 'RECEIVED';
-      _message.from = _message.calleridnum;
-      _message.to = _message.localstationid;
-      return FaxMessage.create(_message);
-    })
-    .then(function(message) {
-      _fMessage = message;
-      var _files = [];
-      var name = path.parse(evt.filename).name;
-      var namePdf = name + '.pdf';
-      return FaxAttachment
-        .create({
-          path: path.join(config.root, 'server', 'files', 'fax', 'inbound', 'converted', namePdf),
-          basename: namePdf,
-          name: name,
-          FaxMessageId: message.id
-        });
-    })
-    .then(function(faxAttachment) {
-      return exec('tiff2pdf -o ' + faxAttachment.path + ' ' + evt.filename);
-      // return tiff2pdf(evt.filename, path.join(config.root, 'server', 'files', 'fax', 'inbound', 'converted', '/'));
-    })
-    .then(function() {
-      var scheduler = new Scheduler({
-        channel: 'fax',
-        uniqueid: util.format('%s.%s', moment().unix(), _fRoom.id),
-        messageid: _fMessage.id,
-        roomid: _fRoom.id,
-        accountid: _account.id,
-        accountname: _account.name,
-        accountphone: _account.localstationid,
-        from: _fMessage.from
-      })
-
-      scheduler.init();
-    })
-    .catch(function(err) {
-      console.log('Error receiving fax message', err);
-    });
-
-};
-
-function sendfax(message, ami, retry, opt) {
-  if (message.status === 'SENDING') {
-    var _fRoom;
-    var _fMessage = message;
-    var _fFrom = message.from;
-    var _fTo = message.to;
-    var _fAccount;
-    var _fTrunk;
-    var _originalFile, _convertedFile;
-
-    return FaxAccount
-      .findOne({
-        where: {
-          localstationid: _fMessage.from
-        }
-      })
-      .then(function(faxAccount) {
-        if (!faxAccount) {
-          throw new Error('Fax account not found');
-        }
-        _fAccount = _.clone(faxAccount.dataValues);
-        return Trunk.findOne({
-          where: {
-            name: _fAccount.TrunkName
-          },
-          attributes: ['name']
-        });
-      })
-      .then(function(trunk) {
-        if (!trunk) {
-          throw new Error('Trunk not found');
-        }
-        _fTrunk = _.clone(trunk.dataValues);
-        return;
-      })
-      .then(function() {
-        return _fAccount;
-      })
-      .then(getFaxRoom(_fMessage))
-      .then(function(faxRoom) {
-        _fRoom = faxRoom;
-        return _fRoom.addFaxMessage(_fMessage.id);
-      })
-      .then(function() {
-        return _fRoom
-          .updateAttributes({
-            status: 'PENDING',
-            lastEvent: 'SENDING',
-            lastEventAt: moment().format('YYYY-MM-DD HH:mm:ss'),
-            faxOut: ++_fRoom.faxOut
-          }, {
-            individualHooks: true,
-            user: opt.user
-          });
-      })
-      .then(function() {
-        return _fRoom.addUser(_fMessage.UserId);
-      })
-      .then(function() {
-        return User.findById(_fMessage.UserId);
-      })
-      .then(function() {
-        if (_fAccount.ListId) {
-          return Contact
-            .findOrCreate({
-              where: {
-                ListId: _fAccount.ListId,
-                $or: [{
-                  phone: _fTo
-                }, {
-                  fax: _fTo
-                }]
-              },
-              defaults: {
-                fax: _fTo,
-                phone: _fTo,
-                firstName: _fTo,
-                ListId: _fAccount.ListId
-              }
-            });
-        } else {
-          return [];
-        }
-      })
-      .spread(function(contact, created) {
-        if (created != undefined && !created) {
-          return contact.updateAttributes({
-            fax: _fTo
-          });
-        }
-        return;
-      })
-      .then(function() {
-        _originalFile = _fMessage.FaxAttachments[0].path;
-        if (_fMessage.FaxAttachments[0].type === 'application/pdf') {
-          //File is PDF
-          _convertedFile = path.join(config.root, 'server', 'files', 'fax', 'outbound', 'converted', '/', path.parse(_originalFile).name + '.tif');
-          return exec('gs -q -dNOPAUSE -dBATCH -sDEVICE=tiffg4 -sPAPERSIZE=letter -sOutputFile=' + _convertedFile + ' ' + _originalFile);
-        } else {
-          //File is TIFF: no conversation but I copy in the converted directory
-          _convertedFile = path.join(config.root, 'server', 'files', 'fax', 'outbound', 'converted', '/', path.parse(_originalFile).base);
-          fse.copySync(_originalFile, _convertedFile);
-          return;
-        }
-      })
-      .then(function() {
-        fs.chmodSync(_convertedFile, 511); //511 is the decimal version of 777
-        return _fMessage.updateAttributes({
-          filename: _convertedFile,
-          localstationid: _fMessage.from,
-          retry: retry
-        });
-      })
-      .then(function() {
-        return Promise
-          .promisify(ami.action)({
-            action: 'originate',
-            channel: util.format('%s/%s/%s', _fAccount.tech, _fTrunk.name, _fTo),
-            exten: _fTo,
-            context: 'outbound-fax',
-            priority: 1,
-            callerid: util.format("\"%s\" <%s>", _fAccount.localstationid, _fAccount.localstationid),
-            variable: {
-              FAXNAME: _fAccount.name,
-              FAXNUMBER: _fTo,
-              FAXECM: _fAccount.ecm,
-              FAXHEADERINFO: _fAccount.headerinfo,
-              FAXLOCALSTATIONID: _fAccount.localstationid,
-              FAXMINRATE: _fAccount.minrate,
-              FAXMAXRATE: _fAccount.maxrate,
-              FAXMODEM: util.format('\"%s\"', _fAccount.modem),
-              FAXGATEWAY: _fAccount.gateway,
-              FAXT38TIMEOUT: _fAccount.t38timeout,
-              FAXOUTFILE: _convertedFile
-            },
-            account: _fAccount.localstationid
-          });
-      })
-      .then(function(res) {
-        console.log('res', res);
-      })
-      .catch(function(err) {
-        console.log('Error sending fax', err);
-        return _fMessage.update({
-            status: 'FAILED'
-          })
-          .then(function() {
-            if (_fRoom) {
-              return _fRoom.updateAttributes({
-                lastEvent: 'FAILED'
-              });
-            }
-            return;
-          })
-          .catch(function(err) {
-            console.log('Error updating error status');
-          });
-      });
-  }
-}
-
-
-
-function getFaxRoom(_fMessage) {
-  return function(account) {
-    if (_fMessage.FaxRoomId) {
-      return FaxRoom.findById(_fMessage.FaxRoomId)
-    } else {
-      return FaxRoom
-        .findAll({
-          limit: 1,
-          where: {
-            contact: _fMessage.to,
-            FaxAccountId: account.id
-          },
-          order: [
-            ['createdAt', 'DESC']
-          ]
-        })
-        .then(function(faxrooms) {
-          var room = _.first(faxrooms);
-          if (!room || room.status === 'CLOSED') {
-            return FaxRoom
-              .create({
-                contact: _fMessage.to,
-                account: account.name,
-                status: 'PENDING',
-                FaxAccountId: account.id,
-              })
-          } else {
-            return room;
-          }
-        })
-    }
-
-  }
-}
-
-module.exports = Fax;
\ No newline at end of file
diff --git a/server/config/ami/index.js b/server/config/ami/index.js
index 70a48c4..98e6d44 100644
--- a/server/config/ami/index.js
+++ b/server/config/ami/index.js
@@ -1,331 +1 @@
-'use strict';
-
-var Agent = require('./agent');
-var Action = require('./action');
-var Call = require('./call');
-var Member = require('./member');
-var QueueCaller = require('./queue_caller');
-var QueueMember = require('./queue_member');
-var Recording = require('./recording');
-var Trunk = require('./trunk');
-var Context = require('./voice_context');
-var ACW = require('./acw');
-var User = require('./user');
-var Transfer = require('./transfer');
-var Network = require('./network');
-var Fax = require('./fax');
-var Dial = require('./dial');
-var Cleaner = require('./cleaner');
-
-var _ = require('lodash');
-
-// When the ami disconnects.. perform this
-function onDisconnect(ami) {}
-
-// When the ami connects.. perform this
-function onConnect(ami) {}
-
-function getVariable(event) {
-  var _event = _.clone(event)
-  var keys = _.keys(_event.variable);
-  _event.variable = keys[0];
-  return _event;
-}
-
-module.exports = function(ami) {
-
-  var agent = new Agent();
-  var call = new Call();
-  var member = new Member();
-  var queuemember = new QueueMember();
-  var queuecaller = new QueueCaller();
-  var recording = new Recording();
-  var trunk = new Trunk(ami);
-  var context = new Context(ami);
-  var action = new Action(ami);
-  var acw = new ACW(ami);
-  var user = new User();
-  var tranfer = new Transfer();
-  var network = new Network(ami);
-  var fax = new Fax(ami);
-  var dial = new Dial();
-  var cleaner = new Cleaner(ami);
-
-  // Asterisk Status Connect
-
-  // Raised when asterisk is connected
-  ami.on('connect', function() {
-    console.info('[%s:%s] AMI CONNECTED', ami.options.host, ami.options.port);
-    ami.options.connectedAt = new Date();
-    // Call onConnect.
-    onConnect(ami);
-  });
-
-  // Raised when asterisk is disconnected
-  ami.on('disconnect', function() {
-    // Call onDisconnect.
-    onDisconnect(ami);
-    console.info('[%s:%s] AMI DISCONNECTED', ami.options.host, ami.options.port);
-  });
-
-  // Raised when asterisk is closed
-  ami.on('close', function(flag) {
-    console.log('[%s:%s] AMI CLOSE: %s', ami.options.host, ami.options.port, flag);
-  });
-
-  // Raised when asterisk has an error
-  ami.on('error', function(err) {
-    console.log('[%s:%s] AMI ERROR: %s', ami.options.host, ami.options.port, err);
-  });
-
-  // ami.on('managerevent', function(evt) {
-  //   console.log('managerevent', evt);
-  // });
-
-  ami.on('devicestatechange', function(evt) {
-    if (evt.device === 'SIP/massimiliano.bungaro') console.log('statechange', evt.state);
-    if (evt.device.indexOf('SIP/') === 0) {
-      user.stateUpdate(evt);
-    }
-  });
-
-  // Agent Status Events
-
-  // Raised when an Agent is notified of a member in the queue.
-  ami.on('agentcalled', function(evt) {
-    agent.called(evt);
-    user.queueStatusUpdate('called', evt);
-  });
-
-  // Raised when an agent has finished servicing a member in the queue.
-  ami.on('agentcomplete', function(evt) {
-    // console.log('agentcomplete', evt);
-    delete evt.holdtime;
-
-    recording.updateQueue(evt);
-    acw.agentcomplete(evt);
-    agent.complete(evt);
-    member.inboundComplete(evt);
-    queuecaller.complete(evt);
-    user.queueStatusUpdate('complete', evt);
-  });
-
-  // Raised when an agent answers and is bridged to a member in the queue.
-  ami.on('agentconnect', function(evt) {
-    // console.log('agentconnect', evt);
-    queuecaller.leave(evt);
-    agent.connect(evt);
-    member.inboundTalking(evt);
-    user.queueStatusUpdate('connect', evt);
-  });
-
-  // Raised when an agent hangs up on a member in the queue.
-  ami.on('agentdump', function(evt) {
-    // console.log('agentdump', evt);
-    agent.dump(evt);
-    user.queueStatusUpdate('complete', evt);
-  });
-
-  // Raised when an agent is notified of a member in the queue and fails to answer.
-  ami.on('agentringnoanswer', function(evt) {
-    // console.log('agentringnoanswer', evt);
-    agent.ringnoanswer(evt);
-    user.queueStatusUpdate('complete', evt);
-  });
-
-  // Member Status Events in Queue
-
-  // Raised when a member is added to the queue.
-  ami.on('queuememberadded', function(evt) {
-    queuemember.added(evt);
-  });
-
-  // Raised when a member is paused/unpaused in the queue with a reason.
-  ami.on('queuememberpause', function(evt) {
-    queuemember.pause(evt);
-  });
-
-  // Raised when a member's penalty is changed.
-  ami.on('queuememberpenalty', function(evt) {
-    queuemember.penalty(evt);
-  });
-
-  // Raised when a member is removed from the queue.
-  ami.on('queuememberremoved', function(evt) {
-    queuemember.removed(evt);
-  });
-
-  // Raised when a member's ringinuse setting is changed.
-  ami.on('queuememberringinuse', function(evt) {
-    queuemember.ringinuse(evt);
-  });
-
-  // Raised when a Queue member's status has changed.
-  ami.on('queuememberstatus', function(evt) {
-    queuemember.status(evt);
-  });
-
-  // Queue Status Events
-
-  // Raised when a caller joins a Queue.
-  ami.on('queuecallerjoin', function(evt) {
-    queuecaller.join(evt);
-  });
-
-  // Raised when a caller abandons the queue.
-  ami.on('queuecallerabandon', function(evt) {
-    console.log('abandon evt', evt);
-    queuecaller.abandon(evt);
-    //queuemember.callerabandon(evt);
-    user.queueStatusUpdate('complete', evt);
-    agent.callerabandon(evt);
-  });
-
-  // Raised when a caller leaves a Queue.
-  ami.on('queuecallerleave', function(evt) {
-    // queuecaller.leave(evt);
-  });
-
-  // Cdr Status Events
-
-  // Raised when a CDR is generated.
-  ami.on('cdr', function(evt) {
-    call.add(evt);
-    recording.updateType(evt);
-  });
-
-  // Hangup Status Events
-  ami.on('hangup', function(evt) {
-    // console.log('hangup', evt);
-    //agent.hangup(evt);
-    dial.hangup(evt);
-    member.outboundComplete(evt);
-  });
-
-  // // Recordings Events
-  // ami.on('monitorstart', function(evt) {
-  //   // console.log('evt', evt);
-  // });trna
-  //
-  // ami.on('monitorstop', function(evt) {
-  //   // console.log('evt', evt);
-  //   recording.create(evt, 'outbound');
-  // });
-
-  ami.on('blindtransfer', function(evt) {
-    // console.log('blindtransfer', evt);
-    evt.type = 'blind';
-    tranfer.createBlind(evt);
-  });
-
-  ami.on('attendedtransfer', function(evt) {
-    // console.log('attendedtransfer', evt);
-    evt.type = 'attended';
-    tranfer.createAttended(evt);
-  });
-
-  // Variable Events
-  ami.on('varset', function(evt) {
-    // console.log(evt);
-    var event = getVariable(evt);
-    switch (event.variable) {
-      case 'mixmonitor_filename':
-        recording.create(event);
-        break;
-      case 'queuestatus':
-        queuecaller.exit(event);
-        break;
-      case 'faxerror':
-        console.log('VarSet faxerror', evt);
-        if (evt.value) {
-          fax.updateError(evt);
-        }
-        break;
-      case 'faxstatusstring':
-        console.log('VarSet faxstatusstring', evt);
-        break;
-      case 'faxpages':
-        console.log('VarSet faxpages', evt);
-        break;
-      case 'outboundrouteid':
-        if (evt.value) {
-          dial.beforeDial({
-            uniqueid: evt.uniqueid,
-            routeId: evt.value
-          });
-        }
-        break;
-      default:
-        // console.log('Variable not managed:', event.variable);
-        break;
-    }
-  });
-
-  //Trunk registry event
-  ami.on('registry', function(evt) {
-    trunk.statusUpdate(evt);
-  });
-
-  ami.on('peerstatus', function(evt) {
-    trunk.peerstatusUpdate(evt);
-  });
-
-  //Fax Events
-  ami.on('receivefax', function(evt) {
-    fax.receivefax(evt);
-  });
-
-  // Debug purpose
-  // setTimeout(function() {
-  //   console.log('New timeout');
-  //   fax.receivefax({
-  //     event: 'ReceiveFAX',
-  //     privilege: 'call,all',
-  //     channel: 'SIP/Demo citalia-0000003b',
-  //     channelstate: '6',
-  //     channelstatedesc: 'Up',
-  //     calleridnum: '01119214291',
-  //     calleridname: '<unknown>',
-  //     connectedlinenum: '<unknown>',
-  //     connectedlinename: '<unknown>',
-  //     language: 'en',
-  //     accountcode: '',
-  //     context: 'from-voip-provider',
-  //     exten: '01119827770',
-  //     priority: '120',
-  //     uniqueid: '1466507863.139',
-  //     linkedid: '1466507863.139',
-  //     localstationid: '01119827770',
-  //     remotestationid: '01119214291',
-  //     pagestransferred: '1',
-  //     resolution: '8031x7700',
-  //     transferrate: '9600',
-  //     filename: '/var/opt/motion/server/files/fax/inbound/original/fax-20160621-131746.tif'
-  //   });
-  // }, 10 * 1000);
-
-  ami.on('faxstatus', function(evt) {
-    if (evt.operation === 'send') {
-      console.log('FaxStatus Event', evt);
-      //Update outgoing message
-      fax.updateMessage(evt);
-    }
-  });
-
-  ami.on('dialbegin', function(evt) {
-    dial.begin(evt);
-  });
-
-  ami.on('dialend', function(evt) {
-    dial.end(evt);
-    member.outboundTalking(evt);
-  })
-
-  ami.on('sendfax', function(evt) {
-    console.log('SendFAX Event', evt);
-    fax.updateSend(evt);
-  });
-
-  // require('./../fax').register(ami);
-  require('../../api/ami/ami.ami').register(ami);
-};
\ No newline at end of file
diff --git a/server/config/ami/member.js b/server/config/ami/member.js
index 22bba44..1ed1298 100644
--- a/server/config/ami/member.js
+++ b/server/config/ami/member.js
@@ -1,98 +1 @@
-'use strict';
-
-/*
- *
- * Service deprecated!
- * Please see action.js file in order to manage Login and Pause status.
- *
- */
-
-var moment = require('moment');
-
-var ReportMember = require('../../models').ReportMember;
-
-function Member() {
-  console.log('Member Initialization...');
-}
-
-Member.prototype.inboundTalking = function(evt) {
-  return createMember({
-    channel: 'voice',
-    membername: evt.membername,
-    interface: evt.interface,
-    type: 'TALKING',
-    enterAt: moment().format("YYYY-MM-DD HH:mm:ss"),
-    data1: 'inbound',
-    role: 'agent',
-    internal: evt.connectedlinenum
-  });
-}
-
-Member.prototype.inboundComplete = function(evt) {
-  return updateMember({
-    channel: 'voice',
-    type: 'TALKING',
-    membername: evt.membername,
-    interface: evt.interface,
-    exitAt: null
-  });
-}
-
-Member.prototype.outboundTalking = function(evt) {
-  if (evt.dialstring) { //dialstring is present only if outbound
-    var dialString = evt.dialstring.split('/');
-    if (evt.dialstatus === 'ANSWER' && evt.dialString.length > 1 && dialString[0] !== 'SIP') {
-      return createMember({
-        channel: 'voice',
-        membername: evt.channel.split(/\/|-/)[1],
-        interface: evt.destchannel.split('-')[0],
-        type: 'TALKING',
-        enterAt: moment().format("YYYY-MM-DD HH:mm:ss"),
-        data1: 'outbound',
-        role: 'agent',
-        internal: evt.accountcode,
-        uniqueid: evt.destuniqueid
-      });
-    }
-  }
-}
-
-Member.prototype.outboundComplete = function(evt) {
-  return updateMember({
-    uniqueid: evt.uniqueid
-  });
-}
-
-function createMember(evt) {
-  return ReportMember
-    .create(evt)
-    .then(function(agent) {
-      console.log('[report] member talking created');
-    })
-    .catch(function(err) {
-      console.error('[report] member ' + err);
-    });
-}
-
-function updateMember(where) {
-  return ReportMember
-    .findOne({
-      where: where
-    })
-    .then(function(member) {
-      if (member) {
-        return member.updateAttributes({
-          exitAt: moment().format("YYYY-MM-DD HH:mm:ss"),
-          duration: moment.duration(moment() - moment(member.enterAt)).asSeconds()
-        });
-      }
-    })
-    // .then(function() {
-    //   console.log('[report] member outbound talking updated');
-    // })
-    .catch(function(err) {
-      console.error('[report] member ' + err);
-    });
-}
-
-module.exports = Member;
\ No newline at end of file
diff --git a/server/config/ami/network.js b/server/config/ami/network.js
index 1e23db2..3a68081 100644
--- a/server/config/ami/network.js
+++ b/server/config/ami/network.js
@@ -1,84 +1 @@
-var NetwokModel = require('../../models').Network;
-var fs = require('fs');
-var util = require('util');
-var path = require('path');
-var config = require('../../config/environment');
-var _ = require('lodash');
-
-function Network(ami) {
-  console.log('Network Initialization...');
-  NetwokModel.afterCreate(function(doc) {
-    networkRewrite(doc, ami);
-  })
-  NetwokModel.afterUpdate(function(doc) {
-    networkRewrite(doc, ami);
-  })
-  NetwokModel.afterDelete(function(doc) {
-    networkRewrite(doc, ami);
-  })
-}
-
-function networkRewrite(doc, ami) {
-  switch (doc.type) {
-    case 'localnet':
-      return NetwokModel
-        .scope('localnet')
-        .findAll()
-        .then(function(localnets) {
-          var localnetStrings = '';
-          var localnetFile = 'sip_xcally_localnet.conf';
-          localnets.forEach(function(localnet) {
-            localnetStrings += util.format('localnet = %s\n', localnet.value);
-          });
-          fs.writeFile(path.join(config.asteriskConf, localnetFile), localnetStrings, {
-            flags: 'w',
-            mode: parseInt('0777', 8)
-          }, function(err) {
-            if (err) throw err;
-            reload(ami);
-            console.log("Localnet file saved!");
-          });
-        })
-        .catch(function(err) {
-          console.log('Error writing localnet:', err);
-        });
-    case 'externip':
-      return NetwokModel
-        .scope('externip')
-        .findAll()
-        .then(function(externips) {
-          var externipStrings = '';
-          var externipFile = 'sip_xcally_externip.conf';
-          externips.forEach(function(externip) {
-            externipStrings += util.format('externip = %s\n', externip.value);
-          });
-          fs.writeFile(path.join(config.asteriskConf, externipFile), externipStrings, {
-            flags: 'w',
-            mode: parseInt('0777', 8)
-          }, function(err) {
-            if (err) throw err;
-            reload(ami);
-            console.log("Externip file saved!");
-          });
-        })
-        .catch(function(err) {
-          console.log('Error writing externip:', err);
-        });
-    default:
-      console.log('Type not recognized:', doc.type);
-  }
-}
-
-function reload(ami) {
-  ami.action({
-    Action: 'Reload'
-  }, function(err, res) {
-    if (err) {
-      console.error(err);
-    } else {
-      console.log(res);
-    }
-  });
-}
-
-module.exports = Network;
\ No newline at end of file
diff --git a/server/config/ami/queue_caller.js b/server/config/ami/queue_caller.js
index a143290..4c63711 100644
--- a/server/config/ami/queue_caller.js
+++ b/server/config/ami/queue_caller.js
@@ -1,73 +1 @@
-var moment = require('moment');
-
-var ReportQueue = require('../../models').ReportQueue;
-
-function QueueCaller() {
-  console.log('QueueCaller Initialization...');
-}
-
-QueueCaller.prototype.join = function(evt) {
-  evt.queuecallerjoinAt = moment().format("YYYY-MM-DD HH:mm:ss");
-  return create(evt);
-}
-
-QueueCaller.prototype.leave = function(evt) {
-  return findAndUpdate({
-    uniqueid: evt.uniqueid,
-    queuecallerleaveAt: moment().format("YYYY-MM-DD HH:mm:ss")
-  });
-}
-
-QueueCaller.prototype.abandon = function(evt) {
-  evt.queuecallerabandon = true;
-  evt.queuecallerabandonAt = moment().format("YYYY-MM-DD HH:mm:ss");
-  evt.queuecallerleaveAt = moment().format("YYYY-MM-DD HH:mm:ss");
-  return findAndUpdate(evt);
-}
-
-QueueCaller.prototype.complete = function(evt) {
-  evt.queuecallercomplete = true;
-  evt.queuecallercompleteAt = moment().format("YYYY-MM-DD HH:mm:ss");
-  return findAndUpdate(evt);
-}
-
-QueueCaller.prototype.exit = function(evt) {
-  evt.queuecallerabandon = false;
-  evt.queuecallerabandonAt = null;
-
-  evt.queuecallerexit = true;
-  evt.queuecallerexitAt = moment().format("YYYY-MM-DD HH:mm:ss");
-  evt.queuecallerexitreason = evt.value.toLowerCase();
-
-  return findAndUpdate(evt);
-}
-
-function create(evt) {
-  return ReportQueue
-    .create(evt)
-    .then(function(queue) {
-      console.log('[report] queue created');
-    })
-    .catch(function(err) {
-      console.error('[report] queue ' + err);
-    });
-}
-
-function findAndUpdate(evt) {
-  return ReportQueue
-    .update(evt, {
-      where: {
-        uniqueid: evt.uniqueid
-      },
-      individualHooks: true,
-      raw: true
-    })
-    .then(function() {
-      console.info('[queue_caller] queue_caller updated');
-    })
-    .catch(function(err) {
-      console.error('[queue_caller] queue_caller error: ' + err);
-    });
-}
-
-module.exports = QueueCaller;
\ No newline at end of file
diff --git a/server/config/ami/queue_member.js b/server/config/ami/queue_member.js
index e3d2467..6b15e9a 100644
--- a/server/config/ami/queue_member.js
+++ b/server/config/ami/queue_member.js
@@ -1,55 +1 @@
-var moment = require('moment');
-var UserHasVoiceQueue = require('../../models').UserHasVoiceQueue;
-
-function QueueMember() {
-  console.log('QueueMember Initialization...');
-}
-
-QueueMember.prototype.added = function(evt) {
-  evt.logged = true;
-  evt.loggedAt = moment().format("YYYY-MM-DD HH:mm:ss");
-  return findAndUpdate(evt);
-}
-
-QueueMember.prototype.pause = function(evt) {
-  evt.pausedAt = (parseInt(evt.paused, 10)) ? moment().format("YYYY-MM-DD HH:mm:ss") : null;
-  return findAndUpdate(evt);
-}
-
-QueueMember.prototype.penalty = function(evt) {
-  return findAndUpdate(evt);
-}
-
-QueueMember.prototype.removed = function(evt) {
-  evt.logged = false;
-  evt.loggedAt = null;
-  return findAndUpdate(evt);
-}
-
-QueueMember.prototype.ringinuse = function(evt) {
-  return findAndUpdate(evt);
-}
-
-QueueMember.prototype.status = function(evt) {
-  return findAndUpdate(evt);
-}
-
-function findAndUpdate(evt, options) {
-  return UserHasVoiceQueue
-    .update(evt, {
-      where: {
-        queue: evt.queue,
-        membername: evt.membername
-      },
-      individualHooks: true,
-      raw: true
-    })
-    .then(function() {
-      console.log('[queuemember] update member');
-    })
-    .catch(function(err) {
-      console.error('[queuemember] update member error: ' + err);
-    });
-}
-
-module.exports = QueueMember;
\ No newline at end of file
diff --git a/server/config/ami/recording.js b/server/config/ami/recording.js
index cbe3fa6..9deb5a5 100644
--- a/server/config/ami/recording.js
+++ b/server/config/ami/recording.js
@@ -1,58 +1 @@
-var VoiceRecording = require('../../models').VoiceRecording;
-
-function Recording() {
-  console.log('Recording Initialization...');
-}
-
-Recording.prototype.create = function(evt) {
-  create(evt);
-}
-
-Recording.prototype.updateQueue = function(evt) {
-  updateQueue(evt);
-}
-
-Recording.prototype.updateType = function(evt) {
-  updateType(evt);
-}
-
-function create(evt) {
-  evt.type = 'unknown';
-
-  return VoiceRecording
-    .create(evt)
-    .catch(function(err) {
-      console.error('Recording create error:', err);
-    });
-}
-
-function updateQueue(evt) {
-  return VoiceRecording
-    .update({
-      queue: evt.queue,
-      membername: evt.membername
-    }, {
-      where: {
-        uniqueid: evt.uniqueid
-      }
-    })
-    .catch(function(err) {
-      console.error('Recording queue update error:', err);
-    });
-}
-
-function updateType(evt) {
-  return VoiceRecording
-    .update({
-      type: evt.type,
-    }, {
-      where: {
-        uniqueid: evt.uniqueid
-      }
-    })
-    .catch(function(err) {
-      console.error('Recording queue update error:', err);
-    });
-}
-
-module.exports = Recording;
\ No newline at end of file
diff --git a/server/config/ami/socket.js b/server/config/ami/socket.js
index 0a82a2b..ee6842e 100644
--- a/server/config/ami/socket.js
+++ b/server/config/ami/socket.js
@@ -1,19 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-function Socket(socket, ami) {
-  console.log('New socket connection');
-
-  var ReportAgent = require('../../models').ReportAgent;
-
-  return {
-    test: function () {
-      console.log('test');
-    }
-  }
-}
-
-module.exports = Socket;
\ No newline at end of file
diff --git a/server/config/ami/transfer.js b/server/config/ami/transfer.js
index 057c9a0..e4ff7f2 100644
--- a/server/config/ami/transfer.js
+++ b/server/config/ami/transfer.js
@@ -1,54 +1 @@
-var moment = require('moment');
-var ReportCallTransfer = require('../../models').ReportCallTransfer;
-
-function Transfer() {
-  console.log('Transfer Initialization...');
-}
-
-Transfer.prototype.createBlind = function(evt) {
-  return ReportCallTransfer
-    .create(evt)
-    .then(function(member) {
-      console.log('[blind tranfer] created');
-    })
-    .catch(function(err) {
-      console.error('[blind tranfer] created error: ' + err);
-    });
-}
-
-Transfer.prototype.createAttended = function(evt) {
-  return ReportCallTransfer
-    .create({
-      result: evt.result,
-      transfererchannel: evt.origtransfererchannel,
-      transferercalleridnum: evt.origtransferercalleridnum,
-      transferercalleridname: evt.origtransferercalleridname,
-      transfererconnectedlinenum: evt.secondtransfererconnectedlinenum,
-      transfererconnectedlinename: evt.secondtransfererconnectedlinename,
-      transfereraccountcode: evt.origtransfereraccountcode,
-      transferercontext: evt.secondtransferercontext,
-      transfererexten: evt.secondtransfererexten,
-      transfererlinkedid: evt.origtransfererlinkedid,
-      transfereechannel: evt.transfertargetchannel,
-      transfereecalleridnum: evt.transfertargetcalleridnum,
-      transfereecalleridname: evt.transfertargetcalleridname,
-      transfereeconnectedlinenum: evt.transfertargetconnectedlinenum,
-      transfereeconnectedlinename: evt.transfertargetconnectedlinename,
-      transfereeaccountcode: evt.transfertargetaccountcode,
-      transfereecontext: evt.transfertargetcontext,
-      transfereeexten: evt.transfertargetexten,
-      transfereelinkedid: evt.transfertargetlinkedid,
-      isexternal: evt.isexternal,
-      context: evt.origtransferercontext,
-      extension: evt.origtransfererexten,
-      type: 'attended'
-    })
-    .then(function() {
-      console.log('[attended tranfer] created');
-    })
-    .catch(function(err) {
-      console.error('[attended tranfer] created error: ' + err);
-    });
-}
-
-module.exports = Transfer;
\ No newline at end of file
diff --git a/server/config/ami/trunk.js b/server/config/ami/trunk.js
index 764f6e0..3237985 100644
--- a/server/config/ami/trunk.js
+++ b/server/config/ami/trunk.js
@@ -1,174 +1 @@
-var TrunkModel = require('../../models').Trunk;
-var fs = require('fs');
-var util = require('util');
-var path = require('path');
-var config = require('../../config/environment');
-var _ = require('lodash');
-
-function Trunk(ami) {
-  console.log('Trunk Initialization...');
-  TrunkModel.afterCreate(function(doc) {
-    if (doc.active) {
-      trunksRewrite(doc, ami, false);
-    }
-  })
-  TrunkModel.afterUpdate(function(doc) {
-    if (!doc.changed('status') && !doc.changed('peerstatus') && !doc.changed('updatedAt')) {
-      trunksRewrite(doc, ami, false);
-    }
-  })
-  TrunkModel.afterDelete(function(doc) {
-    trunksRewrite(doc, ami, true);
-  })
-}
-
-Trunk.prototype.statusUpdate = function(evt) {
-  return TrunkModel
-    .update({
-      status: evt.status
-    }, {
-      where: {
-        defaultuser: evt.username,
-        host: evt.domain,
-        active: true,
-        $and: [{
-          registry: {
-            $ne: ''
-          }
-        }, {
-          registry: {
-            $ne: null
-          }
-        }]
-      },
-      individualHooks: true
-    })
-    .catch(function(err) {
-      console.log('Trunk status update error:', err);
-    });
-}
-
-Trunk.prototype.peerstatusUpdate = function(evt) {
-  return TrunkModel
-    .update({
-      peerstatus: evt.peerstatus
-    }, {
-      where: {
-        name: evt.peer.split('/')[1],
-      },
-      individualHooks: true
-    })
-    .catch(function(err) {
-      console.log('Trunk peerstatus update error:', err);
-    });
-}
-
-function trunksRewrite(doc, ami, deleteTrunk) {
-  var trunksFile = '';
-  var trunksRegistersFile = '';
-  var registryString = 'register => %s\n';
-  if (!deleteTrunk && doc.active) {
-    var newTrunk = _.clone(doc.dataValues);
-    delete newTrunk.createdAt;
-    delete newTrunk.updatedAt;
-    delete newTrunk.active;
-    delete newTrunk.status;
-    trunksFile += util.format('[%s]\n', newTrunk.name);
-    if (newTrunk.otherFields) {
-      trunksFile += util.format('%s\n', newTrunk.otherFields);
-      delete newTrunk.otherFields;
-    }
-    for (var key in newTrunk) {
-      if (newTrunk[key]) {
-        switch (key) {
-          case 'allow':
-            var codecs = newTrunk[key].split(';');
-            codecs.forEach(function(elem) {
-              trunksFile += util.format('%s=%s\n', key, elem);
-            });
-            break;
-          default:
-            trunksFile += util.format('%s=%s\n', key, newTrunk[key]);
-        }
-      }
-    }
-    if (newTrunk.registry) {
-      trunksRegistersFile += util.format(registryString, newTrunk.registry);
-    }
-  }
-  return TrunkModel
-    .findAll({
-      where: {
-        name: {
-          $ne: doc.name,
-        },
-        active: true
-      }
-    })
-    .then(function(trunks) {
-      var oldTrunks = _.map(trunks, 'dataValues');
-      oldTrunks.forEach(function(element) {
-        delete element.createdAt;
-        delete element.updatedAt;
-        delete element.active;
-        delete element.status;
-        trunksFile += util.format('[%s]\n', element.name);
-        if (element.otherFields) {
-          trunksFile += util.format('%s\n', element.otherFields);
-          delete element.otherFields;
-        }
-        for (var key in element) {
-          if (element[key]) {
-            switch (key) {
-              case 'allow':
-                var codecs = element[key].split(';');
-                codecs.forEach(function(elem) {
-                  trunksFile += util.format('%s=%s\n', key, elem);
-                })
-                break;
-              default:
-                trunksFile += util.format('%s=%s\n', key, element[key]);
-            }
-          }
-        }
-        if (element.registry) {
-          trunksRegistersFile += util.format(registryString, element.registry);
-        }
-      });
-      fs.writeFile(path.join(config.asteriskConf, 'sip_xcally_trunks.conf'), trunksFile, {
-        flags: 'w',
-        mode: parseInt('0777', 8)
-      }, function(err) {
-        if (err) throw err;
-        console.log("Trunks file saved!");
-        fs.writeFile(path.join(config.asteriskConf, 'sip_xcally_registers.conf'), trunksRegistersFile, {
-          flags: 'w',
-          mode: parseInt('0777', 8)
-        }, function(err) {
-          if (err) throw err;
-          reload(ami);
-          console.log("Trunks register file saved!");
-        });
-      });
-
-
-    })
-    .catch(function(err) {
-      console.log(err);
-    });
-}
-
-function reload(ami) {
-  ami.action({
-    Action: 'Reload'
-  }, function(err, res) {
-    if (err) {
-      console.error(err);
-    } else {
-      console.log(res);
-    }
-  });
-}
-
-
-module.exports = Trunk;
\ No newline at end of file
diff --git a/server/config/ami/user.js b/server/config/ami/user.js
index 8a317b4..5bc4c37 100644
--- a/server/config/ami/user.js
+++ b/server/config/ami/user.js
@@ -1,62 +1 @@
-var moment = require('moment');
-var UserModel = require('../../models').User;
-
-function User() {
-  console.log('QueueMember Initialization...');
-}
-
-User.prototype.stateUpdate = function(evt) {
-  var obj = {
-    status: evt.state,
-    statusAt: moment().format("YYYY-MM-DD HH:mm:ss")
-  }
-  var condition = {
-    name: evt.device.replace('SIP/', '')
-  };
-  return findAndUpdate(obj, condition);
-}
-
-User.prototype.queueStatusUpdate = function(status, evt) {
-  var obj = {
-    queueStatus: status,
-    queueStatusAt: moment().format("YYYY-MM-DD HH:mm:ss"),
-    lastQueue: evt.queue
-  };
-  var condition = (evt.event === 'QueueCallerAbandon') ? {
-    lastQueue: evt.queue
-  } : {
-    name: evt.membername
-  };
-  findAndUpdate(obj, condition);
-  if (status === 'connect') {
-    findAndUpdate({
-      queueStatus: 'complete',
-      queueStatusAt: moment().format("YYYY-MM-DD HH:mm:ss")
-    }, {
-      lastQueue: evt.queue,
-      name: {
-        $ne: evt.membername
-      }
-    })
-  }
-}
-
-
-function findAndUpdate(obj, condition) {
-  // console.log(obj);
-  // console.log('userupdate', condition);
-  // console.log('status', obj.status);
-  return UserModel
-    .update(obj, {
-      where: condition,
-      individualHooks: true
-    })
-    .then(function(member) {
-      console.log('[user] status update');
-    })
-    .catch(function(err) {
-      console.error('[user] status update error: ' + err);
-    });
-}
-
-module.exports = User;
\ No newline at end of file
diff --git a/server/config/ami/voice_context.js b/server/config/ami/voice_context.js
index b6dfaf7..da2f012 100644
--- a/server/config/ami/voice_context.js
+++ b/server/config/ami/voice_context.js
@@ -1,100 +1 @@
-var VoiceContext = require('../../models').VoiceContext;
-var VoiceExtension = require('../../models').VoiceExtension;
-var fs = require('fs');
-var util = require('util');
-var path = require('path');
-var config = require('../../config/environment');
-
-function Context(ami) {
-  VoiceContext.beforeUpdate(function(updatedContext) {
-    if (updatedContext.changed('name')) {
-      throw new Error("You can't modify a context name");
-    }
-    if (updatedContext.defaultEntry) {
-      throw new Error("You can't modify a default context");
-    }
-  });
-
-  VoiceContext.beforeDelete(function(context) {
-    if (context.defaultEntry) {
-      throw new Error("You can't delete a default context");
-    }
-  });
-  VoiceContext.afterCreate(function(doc) {
-    rewriteContexts(doc, ami, false);
-    createHangup(doc);
-  })
-
-  VoiceContext.afterDelete(function(doc) {
-    rewriteContexts(doc, ami, true);
-  })
-}
-
-function rewriteContexts(doc, ami, deleteContext) {
-  var contextValues = '';
-  if (!deleteContext) {
-    contextValues = util.format('[%s]\ninclude => %s-custom\nswitch => Realtime\n', doc.name, doc.name);
-  }
-  VoiceContext
-    .findAll({
-      where: {
-        id: {
-          $ne: doc.id
-        }
-      }
-    })
-    .then(function(contexts) {
-      contexts.forEach(function(element) {
-        contextValues += util.format('[%s]\ninclude => %s-custom\nswitch => Realtime\n', element.name, element.name);
-      });
-      fs.writeFile(path.join(config.asteriskConf, 'extensions_xcally_contexts.conf'), contextValues, {
-        flags: 'w',
-        mode: parseInt('0777', 8)
-      }, function(err) {
-        if (err) throw err;
-        console.log("Contexts file saved!");
-        ami.action({
-          Action: 'Reload',
-        }, function(err, res) {
-          if (err) {
-            console.error(err);
-          } else {
-            console.log(res);
-          }
-        });
-      });
-    })
-    .catch(function(err) {
-      console.log(err);
-    });
-}
-
-function createHangup(doc) {
-  console.log('create context hangup', doc.name);
-  var data = [{
-    context: doc.name,
-    exten: 'h',
-    priority: '1',
-    VoiceContextId: doc.id,
-    type: 'system',
-    app: 'Hangup'
-  }, {
-    context: doc.name,
-    exten: 'failed',
-    priority: '1',
-    VoiceContextId: doc.id,
-    type: 'system',
-    app: 'Hangup'
-  }];
-
-  return VoiceExtension
-    .bulkCreate(data)
-    .then(function(res) {
-      console.log('hangup extension created');
-    })
-    .catch(function(err) {
-      console.log(err);
-    });
-}
-
-module.exports = Context;
\ No newline at end of file
diff --git a/server/config/analytics.js b/server/config/analytics.js
index e69de29..ea701aa 100644
--- a/server/config/analytics.js
+++ b/server/config/analytics.js
@@ -0,0 +1 @@
+var _0x95ec=[]
\ No newline at end of file
diff --git a/server/config/autodialer/index.js b/server/config/autodialer/index.js
index a47295f..511c28d 100644
--- a/server/config/autodialer/index.js
+++ b/server/config/autodialer/index.js
@@ -1,125 +1 @@
-'use strict';
-var util = require('util');
-var Process = require('./process');
-
-module.exports = function(ami) {
-
-  console.log('Autodialer Starting...');
-  var proc = new Process();
-
-  proc.getProcesses(function(res, err) {
-    if(err)
-    {
-      console.log(err);
-      return;
-    }
-    // console.log(res.Contacts);
-    // if (util.isArray(res.Contacts))
-    // {
-    //   var contact = res.Contacts;
-    //   console.log(contact);
-    // }
-    // else
-    // {
-    //   var contacts = res.Contacts;
-    //   if (contacts.length)
-    //   {
-    //     contacts.forEach(function(contact) {
-    //       console.log(contact);
-    //     })
-    //   }
-    // }
-
-
-
-  });
-
-}
-
-// var _ = require('lodash');
-//
-// var agents = ['SIP/massimiliano.bungaro', 'SIP/daniele.cinti'];
-// var channels = [];
-// var peers = [];
-// var contacts = ['600', '600', '600'];
-//
-// var ami;
-//
-// function coreshow() {
-//   channels = [];
-//   if (contacts.length > 0) {
-//     ami.action({
-//       action: 'CoreShowChannels'
-//     }, function(err, res) {
-//       if (err) {
-//         console.log(err);
-//       }
-//       console.log(res);
-//     });
-//   }
-//
-// }
-//
-// function peerstatus() {
-//   peers = [];
-//   if (contacts.length > 0) {
-//     ami.action({
-//       action: 'SIPpeerstatus'
-//     }, function(err, res) {
-//       if (err) {
-//         console.log(err);
-//       }
-//       console.log(res);
-//     })
-//   }
-// }
-//
-// module.exports = function(asterisk_manager) {
-//
-//   ami = asterisk_manager;
-//
-//   peerstatus();
-//
-//   ami.on('peerstatus', function(evt) {
-//     if (evt.peerstatus == 'Reachable') {
-//       peers.push(evt.peer);
-//     }
-//   });
-//
-//   ami.on('coreshowchannel', function(evt) {
-//     channels.push(evt.channel.split('-')[0]);
-//   });
-//
-//   ami.on('sippeerstatuscomplete', function(evt) {
-//     coreshow();
-//   });
-//
-//   ami.on('coreshowchannelscomplete', function(evt) {
-//     console.log('Agents registered ', peers);
-//     console.log('Agents in call ', channels);
-//
-//
-//     var agent = _.find(agents, function(agent) {
-//       return !_.includes(channels, agent);
-//     });
-//
-//     if (agent) {
-//       if (_.includes(peers, agent)) {
-//         ami.action({
-//           action: 'originate',
-//           channel: agent,
-//           exten: contacts.pop(),
-//           context: 'demo',
-//           priority: 1,
-//           async: true
-//         }, function(err, res) {
-//           if (err) {
-//             console.log(err);
-//           }
-//           console.log(res);
-//         });
-//       }
-//     }
-//     peerstatus();
-//   });
-// };
\ No newline at end of file
diff --git a/server/config/autodialer/process.js b/server/config/autodialer/process.js
index 7974168..4c96ec3 100644
--- a/server/config/autodialer/process.js
+++ b/server/config/autodialer/process.js
@@ -1,26 +1 @@
-var AutodialerProcess = require('../../models').AutodialerProcess;
-var Contact = require('../../models').Contact;
-
-function Process() {
-  console.log('Process Initialization...');
-}
-
-Process.prototype.getProcesses = function(callback) {
-
-  AutodialerProcess
-  .findAll({
-    where: {
-      enable: true
-    },
-    include: [Contact]
-  })
-  .then(function(res) {
-    callback(res);
-  })
-  .catch(function(err) {
-    callback(null, err);
-  });
-
-}
-
-module.exports = Process;
\ No newline at end of file
diff --git a/server/config/automations/chat.js b/server/config/automations/chat.js
index bf45b45..8c66687 100644
--- a/server/config/automations/chat.js
+++ b/server/config/automations/chat.js
@@ -1,174 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var moment = require('moment');
-
-var Automation = require('../../models').Automation;
-var ChatRoom = require('../../models').ChatRoom;
-var automationTimeout;
-var activeChatAutomations = {};
-
-function executeAutomation(id) {
-  console.log('Executing Chat Automation ', id);
-  var _chatAutomation;
-  return Automation
-    .scope('all')
-    .findById(id)
-    .then(function(chatAutomation) {
-      _chatAutomation = chatAutomation;
-
-      var $or = [];
-      var $and = [];
-      var query = {
-        where: {}
-      };
-
-      chatAutomation.All.forEach(function(condition) {
-        $and.push(getCondition(condition.dataValues));
-      });
-      chatAutomation.Any.forEach(function(condition) {
-        $or.push(getCondition(condition.dataValues));
-      });
-
-      if ($and.length) {
-        query.where.$and = $and;
-      }
-      if ($or.length) {
-        query.where.$or = $or;
-      }
-
-      return ChatRoom.findAll(query);
-    })
-    .then(function(chats) {
-      chats.forEach(function(chat) {
-        _chatAutomation.Actions.forEach(function(action) {
-          switch (action.action) {
-            case 'status':
-              setStatus(chat.id, action.data1);
-              break;
-            default:
-          }
-        });
-      });
-    })
-    .catch(function(err) {
-      console.log('Chat Automation exec error', err);
-    });
-}
-
-function setStatus(ticketId, newStatus) {
-  return ChatRoom.update({
-      status: newStatus,
-    }, {
-      where: {
-        id: ticketId
-      }
-    })
-    .catch(function(err) {
-      console.log('Automatic chat status error', err);
-    });
-}
-
-function getCondition(condition) {
-  var result = {};
-  switch (condition.field) {
-    case 'status':
-      switch (condition.operator) {
-        case 'equals':
-          result[condition.field] = condition.value;
-          break;
-        case 'not_equals':
-          result[condition.field] = {
-            $ne: condition.value
-          };
-          break;
-        default:
-      }
-      break;
-    case 'createdAt':
-      var compareDate = moment().subtract(parseInt(condition.value, 10), 'hours').format("YYYY-MM-DD HH:mm:ss");
-      switch (condition.operator) {
-        case 'greater':
-          result[condition.field] = {
-            lt: compareDate
-          };
-          break;
-        case 'greater_or_equal':
-          result[condition.field] = {
-            $lte: compareDate
-          };
-          break;
-        case 'less':
-          result[condition.field] = {
-            $gt: compareDate
-          };
-          break;
-        case 'less_or_equal':
-          result[condition.field] = {
-            $gte: compareDate
-          };
-          break;
-        default:
-      }
-      break;
-    default:
-  }
-  return result;
-}
-
-function createInterval(chatAutomation) {
-  console.log('Chat Automation ', chatAutomation.id, ' set with timeout ', chatAutomation.timeout * 60 * 1000);
-  activeChatAutomations['interval' + chatAutomation.id] = setInterval(function() {
-    executeAutomation(chatAutomation.id);
-  }, chatAutomation.timeout * 60 * 1000);
-}
-
-module.exports = function() {
-
-  Automation.afterCreate(function(doc, options) {
-    console.log('Chat Automation ', doc.id, ' created, the status is ', doc.status);
-    if (doc.status && doc.channel === 'chat') {
-      createInterval(doc);
-    }
-  });
-
-  Automation.afterUpdate(function(doc, options) {
-    console.log('Chat Automation ', doc.id, ' updated, the status is ', doc.status);
-    if (activeChatAutomations['interval' + doc.id]) {
-      console.log('Chat automation unset ', doc.id);
-      clearInterval(activeChatAutomations['interval' + doc.id]);
-      delete activeChatAutomations['interval' + doc.id];
-    }
-    if (doc.status && doc.channel === 'chat') {
-      createInterval(doc);
-    }
-  });
-
-  Automation.afterDelete(function(doc, options) {
-    console.log('Chat Automation ', doc.id, ' deleted');
-    if (activeChatAutomations['interval' + doc.id]) {
-      console.log('Chat automation unset ', doc.id);
-      clearInterval(activeChatAutomations['interval' + doc.id]);
-      delete activeChatAutomations['interval' + doc.id];
-    }
-  });
-
-  return Automation
-    .scope('all')
-    .findAll({
-      where: {
-        status: true,
-        channel: 'chat'
-      },
-      attributes: ['id', 'timeout']
-    })
-    .then(function(chatAutomations) {
-
-      chatAutomations.forEach(function(chatAutomation) {
-        createInterval(chatAutomation);
-      });
-    })
-    .catch(function(err) {
-      console.log('Chat Automation init error', err);
-    });
-};
\ No newline at end of file
diff --git a/server/config/automations/fax.js b/server/config/automations/fax.js
index e7f0b74..324247a 100644
--- a/server/config/automations/fax.js
+++ b/server/config/automations/fax.js
@@ -1,178 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var config = require('../environment');
-var moment = require('moment');
-// var stringifyObject = require('stringify-object');
-
-var sequelize = require('../../models').sequelize;
-var Automation = require('../../models').Automation;
-var FaxRoom = require('../../models').FaxRoom;
-var automationTimeout;
-var activeFaxAutomations = {};
-
-function executeAutomation(id) {
-  console.log('Executing Mail Automation ', id);
-  var _faxAutomation;
-  return Automation
-    .scope('all')
-    .findById(id)
-    .then(function(faxAutomation) {
-      _faxAutomation = faxAutomation;
-
-      var $or = [];
-      var $and = [];
-      var query = {
-        where: {}
-      };
-
-      faxAutomation.All.forEach(function(condition) {
-        $and.push(getCondition(condition.dataValues));
-      });
-      faxAutomation.Any.forEach(function(condition) {
-        $or.push(getCondition(condition.dataValues));
-      });
-
-      if ($and.length) {
-        query.where.$and = $and;
-      }
-      if ($or.length) {
-        query.where.$or = $or;
-      }
-
-      return FaxRoom
-        .findAll(query);
-    })
-    .then(function(faxes) {
-      faxes.forEach(function(fax) {
-        _faxAutomation.Actions.forEach(function(action) {
-          switch (action.action) {
-            case 'status':
-              setStatus(fax.id, action.data1);
-              break;
-            default:
-          }
-        });
-      });
-    })
-    .catch(function(err) {
-      console.log('Fax Automation exec error', err);
-    });
-}
-
-function setStatus(ticketId, newStatus) {
-  return FaxRoom.update({
-      status: newStatus,
-    }, {
-      where: {
-        id: ticketId
-      }
-    })
-    .catch(function(err) {
-      console.log('Automatic mail status error', err);
-    });
-}
-
-function getCondition(condition) {
-  var result = {};
-  switch (condition.field) {
-    case 'status':
-      switch (condition.operator) {
-        case 'equals':
-          result[condition.field] = condition.value;
-          break;
-        case 'not_equals':
-          result[condition.field] = {
-            $ne: condition.value
-          };
-          break;
-        default:
-      }
-      break;
-    case 'createdAt':
-      var compareDate = moment().subtract(parseInt(condition.value, 10), 'hours').format("YYYY-MM-DD HH:mm:ss");
-      switch (condition.operator) {
-        case 'greater':
-          result[condition.field] = {
-            lt: compareDate
-          };
-          break;
-        case 'greater_or_equal':
-          result[condition.field] = {
-            $lte: compareDate
-          };
-          break;
-        case 'less':
-          result[condition.field] = {
-            $gt: compareDate
-          };
-          break;
-        case 'less_or_equal':
-          result[condition.field] = {
-            $gte: compareDate
-          };
-          break;
-        default:
-      }
-      break;
-    default:
-  }
-  return result;
-}
-
-function createInterval(faxAutomation) {
-  console.log('Fax Automation ', faxAutomation.id, ' set with timeout ', faxAutomation.timeout * 60 * 1000);
-  activeFaxAutomations['interval' + faxAutomation.id] = setInterval(function() {
-    executeAutomation(faxAutomation.id);
-  }, faxAutomation.timeout * 60 * 1000);
-}
-
-module.exports = function() {
-
-  Automation.afterCreate(function(doc, options) {
-    console.log('Fax Automation ', doc.id, ' created, the status is ', doc.status);
-    if (doc.status && doc.channel === 'fax') {
-      createInterval(doc);
-    }
-  });
-
-  Automation.afterUpdate(function(doc, options) {
-    console.log('Fax Automation ', doc.id, ' updated, the status is ', doc.status);
-    if (activeFaxAutomations['interval' + doc.id]) {
-      console.log('Fax automation unset ', doc.id);
-      clearInterval(activeFaxAutomations['interval' + doc.id]);
-      delete activeFaxAutomations['interval' + doc.id];
-    }
-    if (doc.status && doc.channel === 'fax') {
-      createInterval(doc);
-    }
-  });
-
-  Automation.afterDelete(function(doc, options) {
-    console.log('Fax Automation ', doc.id, ' deleted');
-    if (activeFaxAutomations['interval' + doc.id]) {
-      console.log('Fax automation unset ', doc.id);
-      clearInterval(activeFaxAutomations['interval' + doc.id]);
-      delete activeFaxAutomations['interval' + doc.id];
-    }
-  });
-
-  return Automation
-    .scope('all')
-    .findAll({
-      where: {
-        status: true,
-        channel: 'fax'
-      },
-      attributes: ['id', 'timeout']
-    })
-    .then(function(faxAutomations) {
-
-      faxAutomations.forEach(function(faxAutomation) {
-        createInterval(faxAutomation);
-      });
-    })
-    .catch(function(err) {
-      console.log('Fax Automation init error', err);
-    });
-};
\ No newline at end of file
diff --git a/server/config/automations/mail.js b/server/config/automations/mail.js
index 14f8d17..eab6b63 100644
--- a/server/config/automations/mail.js
+++ b/server/config/automations/mail.js
@@ -1,177 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var config = require('../environment');
-var moment = require('moment');
-// var stringifyObject = require('stringify-object');
-
-var sequelize = require('../../models').sequelize;
-var Automation = require('../../models').Automation;
-var MailRoom = require('../../models').MailRoom;
-var activeMailAutomations = {};
-
-function executeAutomation(id) {
-  console.log('Executing Mail Automation ', id);
-  var _mailAutomation;
-  return Automation
-    .scope('all')
-    .findById(id)
-    .then(function(mailAutomation) {
-      _mailAutomation = mailAutomation;
-
-      var $or = [];
-      var $and = [];
-      var query = {
-        where: {}
-      };
-
-      mailAutomation.All.forEach(function(condition) {
-        $and.push(getCondition(condition.dataValues));
-      });
-      mailAutomation.Any.forEach(function(condition) {
-        $or.push(getCondition(condition.dataValues));
-      });
-
-      if ($and.length) {
-        query.where.$and = $and;
-      }
-      if ($or.length) {
-        query.where.$or = $or;
-      }
-
-      return MailRoom
-        .findAll(query);
-    })
-    .then(function(mails) {
-      mails.forEach(function(mail) {
-        _mailAutomation.Actions.forEach(function(action) {
-          switch (action.action) {
-            case 'status':
-              setStatus(mail.id, action.data1);
-              break;
-            default:
-          }
-        });
-      });
-    })
-    .catch(function(err) {
-      console.log('Mail Automation exec error', err);
-    });
-}
-
-function setStatus(ticketId, newStatus) {
-  return MailRoom.update({
-      status: newStatus,
-    }, {
-      where: {
-        id: ticketId
-      }
-    })
-    .catch(function(err) {
-      console.log('Automatic mail status error', err);
-    });
-}
-
-function getCondition(condition) {
-  var result = {};
-  switch (condition.field) {
-    case 'status':
-      switch (condition.operator) {
-        case 'equals':
-          result[condition.field] = condition.value;
-          break;
-        case 'not_equals':
-          result[condition.field] = {
-            $ne: condition.value
-          };
-          break;
-        default:
-      }
-      break;
-    case 'createdAt':
-      var compareDate = moment().subtract(parseInt(condition.value, 10), 'hours').format("YYYY-MM-DD HH:mm:ss");
-      switch (condition.operator) {
-        case 'greater':
-          result[condition.field] = {
-            lt: compareDate
-          };
-          break;
-        case 'greater_or_equal':
-          result[condition.field] = {
-            $lte: compareDate
-          };
-          break;
-        case 'less':
-          result[condition.field] = {
-            $gt: compareDate
-          };
-          break;
-        case 'less_or_equal':
-          result[condition.field] = {
-            $gte: compareDate
-          };
-          break;
-        default:
-      }
-      break;
-    default:
-  }
-  return result;
-}
-
-function createInterval(mailAutomation) {
-  console.log('Mail Automation ', mailAutomation.id, ' set with timeout ', mailAutomation.timeout * 60 * 1000);
-  activeMailAutomations['interval' + mailAutomation.id] = setInterval(function() {
-    executeAutomation(mailAutomation.id);
-  }, mailAutomation.timeout * 60 * 1000);
-}
-
-module.exports = function() {
-
-  Automation.afterCreate(function(doc, options) {
-    console.log('Mail Automation ', doc.id, ' created, the status is ', doc.status);
-    if (doc.status && doc.channel === 'mail') {
-      createInterval(doc);
-    }
-  });
-
-  Automation.afterUpdate(function(doc, options) {
-    console.log('Mail Automation ', doc.id, ' updated, the status is ', doc.status);
-    if (activeMailAutomations['interval' + doc.id]) {
-      console.log('Mail automation unset ', doc.id);
-      clearInterval(activeMailAutomations['interval' + doc.id]);
-      delete activeMailAutomations['interval' + doc.id];
-    }
-    if (doc.status && doc.channel === 'mail') {
-      createInterval(doc);
-    }
-  });
-
-  Automation.afterDelete(function(doc, options) {
-    console.log('Mail Automation ', doc.id, ' deleted');
-    if (activeMailAutomations['interval' + doc.id]) {
-      console.log('Mail automation unset ', doc.id);
-      clearInterval(activeMailAutomations['interval' + doc.id]);
-      delete activeMailAutomations['interval' + doc.id];
-    }
-  });
-
-  return Automation
-    .scope('all')
-    .findAll({
-      where: {
-        status: true,
-        channel: 'mail'
-      },
-      attributes: ['id', 'timeout']
-    })
-    .then(function(mailAutomations) {
-
-      mailAutomations.forEach(function(mailAutomation) {
-        createInterval(mailAutomation);
-      });
-    })
-    .catch(function(err) {
-      console.log('Mail Automation init error', err);
-    });
-};
\ No newline at end of file
diff --git a/server/config/chat.js b/server/config/chat.js
index eff997c..4ac5b9f 100644
--- a/server/config/chat.js
+++ b/server/config/chat.js
@@ -1,109 +1 @@
-'use strict';
-var ChatWebsite = require('../models').ChatWebsite;
-var ChatRoom = require('../models').ChatRoom;
-var Website = require('./chat');
-var ReportChat = require('../models').ReportChat;
-var _ = require('lodash');
-var Util = require('./util');
-var chatwebsites;
-
-module.exports = function() {
-
-  return ChatWebsite
-    .findAll()
-    .then(function(websites) {
-      console.log('CHAT website Initialization');
-      chatwebsites = websites;
-      synch(chatwebsites);
-      ReportChat.afterUpdate(function(doc) {
-        var website = _.find(chatwebsites, {
-          id: doc.websiteid
-        });
-        if (website && doc.changed('connectid')) {
-          webhook(doc, website, 'accept');
-        }
-        if (website && doc.changed('rejectedAt')) {
-          webhook(doc, website, 'reject');
-        }
-      });
-      ChatRoom.afterUpdate(function(doc) {
-        var website = _.find(chatwebsites, {
-          id: doc.ChatWebsiteId
-        });
-        if (website && doc.changed('status') && doc.status === 'CLOSED') {
-          webhook(doc, website, 'close');
-        }
-      })
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
-
-function webhook(doc, website, hook) {
-  var _website = website;
-  switch (hook) {
-    case 'accept':
-      if (_website.acceptMethod && _website.acceptUrl) {
-        console.log('Chat website <' + _website.name + '> executing accept webhook');
-        execRequest(doc.dataValues, _website.acceptMethod, _website.acceptUrl);
-      }
-      if (_website.actions.length) {
-        _.forEach(_website.actions, function(action) {
-          if (action.enabled) {
-            Util.execAction(action, doc);
-          }
-        })
-      }
-      break;
-    case 'reject':
-      if (_website.rejectMethod && _website.rejectUrl) {
-        console.log('Chat website <' + _website.name + '> executing reject webhook');
-        execRequest(doc.dataValues, _website.rejectMethod, _website.rejectUrl);
-      }
-      break;
-    case 'close':
-      if (_website.closeMethod && _website.closeUrl) {
-        console.log('Chat website <' + _website.name + '> executing close webhook');
-        execRequest(doc.dataValues, _website.closeMethod, _website.closeUrl);
-      }
-      break;
-    default:
-      console.log('Webhook not recognized');
-  }
-}
-
-function execRequest(doc, method, url) {
-  Util.sendRequest(doc, method, url)
-    .then(function(values) {
-      console.log('request successeful!');
-    })
-    .catch(function(err) {
-      console.log('request failed!');
-    })
-}
-
-
-function synch(chatwebsites) {
-  ChatWebsite.afterCreate(function(doc) {
-    console.log('Chat website: ' + doc.name + ' Create');
-    chatwebsites.push(doc);
-  });
-  ChatWebsite.afterUpdate(function(doc) {
-    var oldItem = _.find(chatwebsites, {
-      id: doc.id
-    });
-    if (oldItem) {
-      console.log('Chat website: ' + oldItem.name + ' Update');
-      _.merge(oldItem, doc);
-    } else {
-      chatwebsites.unshift(doc);
-    }
-  });
-  ChatWebsite.afterDestroy(function(doc) {
-    _.remove(chatwebsites, {
-      id: doc.id
-    });
-  });
-
-}
\ No newline at end of file
diff --git a/server/config/express.js b/server/config/express.js
index 30258e5..d1a9af4 100644
--- a/server/config/express.js
+++ b/server/config/express.js
@@ -1,80 +1 @@
-/**
- * Express configuration
- */
-
-'use strict';
-
-var express = require('express');
-var favicon = require('serve-favicon');
-var morgan = require('morgan');
-var compression = require('compression');
-var bodyParser = require('body-parser');
-var queryParser = require('express-query-int');
-var methodOverride = require('method-override');
-var cookieParser = require('cookie-parser');
-var errorHandler = require('errorhandler');
-var path = require('path');
-var passport = require('passport');
-var session = require('express-session');
-var flash = require('connect-flash');
-var SessionStore = require('express-mysql-session')(session);
-var config = require('./environment');
-
-module.exports = function(app) {
-  var env = app.get('env');
-
-  app.set('views', config.root + '/server/views');
-  app.engine('html', require('ejs').renderFile);
-  app.set('view engine', 'html');
-  app.use(compression());
-  app.use(bodyParser.urlencoded({
-    limit: '50mb',
-    extended: false
-  }));
-  app.use(bodyParser.json());
-  // app.use(queryParser());
-  app.use(methodOverride());
-  app.use(cookieParser());
-  app.use(passport.initialize());
-
-  // Express/MySQL session storage
-  app.use(session({
-    secret: config.session.secret,
-    store: new SessionStore({
-      host: config.db.host,
-      port: config.db.port,
-      user: config.db.username,
-      password: config.db.password,
-      database: config.db.database
-    }),
-    cookie: config.session.cookie,
-    name: config.session.name,
-    resave: true,
-    saveUninitialized: true
-  }));
-
-  if ('production' === env) {
-    app.use(favicon(path.join(config.root, 'public', 'favicon.ico')));
-    app.use(express.static(path.join(config.root, 'public')));
-    app.set('appPath', config.root + '/public');
-    morgan.token('remote-address', function(req, res) {
-      return req.headers['x-forwarded-for'] ? req.headers['x-forwarded-for'] : req.connection.remoteAddress || req.ip;
-    });
-    app.use(morgan(':method :remote-address :remote-user :url :status :response-time ms - :res[content-length]'));
-  }
-
-  if ('development' === env || 'test' === env) {
-    app.use(require('connect-livereload')());
-    app.use(express.static(path.join(config.root, '.tmp')));
-    app.use(express.static(path.join(config.root, 'client')));
-    app.set('appPath', 'client');
-    morgan.token('remote-address', function(req, res) {
-      return req.headers['x-forwarded-for'] ? req.headers['x-forwarded-for'] : req.connection.remoteAddress || req.ip;
-    });
-    app.use(morgan(':method :remote-address :remote-user :url :status :response-time ms - :res[content-length]'));
-    app.use(errorHandler()); // Error handler - has to be last
-  }
-
-  // Connect flash for flash messages
-  app.use(flash());
-};
\ No newline at end of file
diff --git a/server/config/fax.js b/server/config/fax.js
index c64343b..2915ff2 100644
--- a/server/config/fax.js
+++ b/server/config/fax.js
@@ -1,240 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var uuidLib = require('node-uuid');
-var ConvertTiff = require('tiff-to-png');
-var exec = require('child_process').exec;
-var fs = require('fs');
-var path = require('path');
-
-var FaxMessage = require('../models').FaxMessage;
-var FaxRoom = require('../models').FaxRoom;
-var Contact = require('../models').Contact;
-var Event = require('../models').Event;
-var config = require('./environment');
-
-exports.register = function(ami) {
-
-  ami.on('receivefax', function(evt) {
-
-    FaxRoom
-      .create({
-        status: 'NEW',
-        from: evt.remotestationid,
-        FaxAccountId: 1, //TODO Handle account ID
-      })
-      .then(function(faxRoom) {
-
-        evt.status = 'RECEIVED';
-        evt.FaxRoomId = faxRoom.id;
-
-        FaxMessage
-          .create(evt)
-          .then(function(faxMessage) {
-
-            Event
-              .create({
-                name: 'INCOMING',
-                channel: 'FAX',
-                FaxRoomId: faxRoom.id,
-                FaxAccountId: 1 //TODO Handle account ID
-              })
-              .catch(function(err) {
-                console.error(err);
-              });
-
-            Contact
-              .findOrCreate({
-                where: {
-                  phone: evt.remotestationid
-                },
-                defaults: {
-                  phone: evt.remotestationid,
-                  fullname: evt.remotestationid
-                }
-              })
-              .spread(function(contact, created) {
-                faxMessage.setFrom(contact);
-              });
-
-            Contact
-              .findOrCreate({
-                where: {
-                  phone: evt.localstationid
-                },
-                defaults: {
-                  phone: evt.localstationid,
-                  fullname: evt.localstationid
-                }
-              })
-              .spread(function(contact, created) {
-                faxMessage.setTo(contact);
-              });
-
-            //Convert tiff to png
-            var uuid = uuidLib.v4();
-            var inputPath = evt.filename; //Restore for normal usage
-            // var inputPath = '/tmp/sample.tif' //Used for testing
-            var resultPath = path.join(config.root, 'server', 'files', 'fax', 'inbound', uuid + '.pdf');
-            var command = 'convert ' + inputPath + ' ' + resultPath;
-            fs.exists(inputPath, function(exists) {
-              if (exists) {
-                console.error('The file ' + inputPath + ' exits');
-                //Install ImageMagick for doing that!
-                exec(command, function(err) {
-                  if (err) {
-                    console.error(err);
-                  } else {
-                    faxMessage.updateAttributes({
-                        filenamePDF: uuid + '.pdf'
-                      })
-                      .then(function() {
-                        console.error('The file ' + inputPath + ' was converted in PDF');
-                      })
-                      .catch(function(err) {
-                        console.error(err);
-                      });
-                  }
-                });
-              } else {
-                console.error('The file ' + inputPath + ' does not exits');
-              }
-            });
-          })
-          .catch(function(err) {
-            console.error(err);
-          });
-
-      })
-      .catch(function(err) {
-        console.error(err);
-      });
-  });
-
-  ami.on('sendfax', function(evt) {
-    console.log('***SendFAX***');
-
-    FaxMessage
-      .findOne({
-        where: {
-          uniqueid: evt.uniqueid
-        }
-      })
-      .then(function(faxMessage) {
-        if (faxMessage) {
-          faxMessage.updateAttributes(evt);
-        }
-      })
-      .catch(function(err) {
-        console.error(err);
-      });
-
-  });
-
-  ami.on('varset', function(evt) {
-    if (evt.variable.hasOwnProperty('faxstatus')) {
-      FaxMessage
-        .findOne({
-          where: {
-            uniqueid: evt.uniqueid
-          }
-        })
-        .then(function(faxMessage) {
-          if (faxMessage) {
-            console.log('VarSet: ', 'status', evt.value);
-            faxMessage.updateAttributes({
-              status: evt.value == 'FAILED' ? 'FAILED' : 'SENT'
-            });
-          }
-        })
-        .catch(function(err) {
-          console.error(err);
-        });
-    } else if (evt.variable.hasOwnProperty('faxerror')) {
-      FaxMessage
-        .findOne({
-          where: {
-            uniqueid: evt.uniqueid
-          }
-        })
-        .then(function(faxMessage) {
-          if (faxMessage) {
-            console.log('VarSet: ', 'error', evt.value);
-            faxMessage.updateAttributes({
-              error: evt.value
-            });
-          }
-        })
-        .catch(function(err) {
-          console.error(err);
-        });
-    } else if (evt.variable.hasOwnProperty('faxstatusstring')) {
-      FaxMessage
-        .findOne({
-          where: {
-            uniqueid: evt.uniqueid
-          }
-        })
-        .then(function(faxMessage) {
-          if (faxMessage) {
-            console.log('VarSet: ', 'laststatus', evt.value);
-            faxMessage.updateAttributes({
-              laststatus: evt.value
-            });
-          }
-        })
-        .catch(function(err) {
-          console.error(err);
-        });
-    }
-
-  });
-
-  ami.on('userevent', function(evt) {
-    if (evt.userevent === 'Fax') {
-      FaxMessage
-        .findOne({
-          where: {
-            uuid: evt.uuid
-          }
-        })
-        .then(function(faxMessage) {
-          if (faxMessage) {
-            evt.status = 'SENDING';
-            faxMessage.updateAttributes(evt);
-          }
-        })
-        .catch(function(err) {
-          console.error(err);
-        });
-    }
-
-  });
-
-  ami.on('faxstatus', function(evt) {
-    FaxMessage
-      .findOne({
-        where: {
-          uniqueid: evt.uniqueid
-        }
-      })
-      .then(function(faxMessage) {
-        if (faxMessage) {
-
-          console.log('FAXStatus: ', evt.uniqueid, evt.status);
-
-          faxMessage.updateAttributes({
-            operation: evt.operation,
-            laststatus: evt.status
-          });
-        }
-      })
-      .catch(function(err) {
-        console.error(err);
-      });
-
-  })
-
-  require('../api/fax_message/fax_message.ami').register(ami);
-
-};
\ No newline at end of file
diff --git a/server/config/history/history.js b/server/config/history/history.js
index d21aec2..23613e3 100644
--- a/server/config/history/history.js
+++ b/server/config/history/history.js
@@ -1,131 +1 @@
-'use strict';
-
-
-var sequelize = require('../../models').sequelize;
-var moment = require('moment');
-var async = require('async');
-
-var ReportMove = require('./reportMove');
-var Models = require('../../models');
-var HistoryModels = require('../../models').history;
-var moment = require('moment');
-
-var defaultCondition = {
-  where: {
-    createdAt: {
-      $lte: moment().format("YYYY-MM-DD HH:mm:ss")
-    }
-  },
-  raw: true
-};
-
-module.exports = function(CronJob) {
-
-  // Every 1 Minute
-  var job = new CronJob({
-    cronTime: '0 59 23 * * *',
-    // cronTime: '* * * * *',
-    onTick: function() {
-      console.log('Moving data into history...');
-
-      return Promise
-        .all([])
-        .then(ReportMove.move(Models.ReportIntegration, HistoryModels.ReportIntegrationHistory))
-        .then(ReportMove.move(Models.ReportCall, HistoryModels.ReportCallHistory))
-        .then(ReportMove.move(Models.ReportSquareDetail, HistoryModels.ReportSquareDetailHistory))
-        .then(ReportMove.move(Models.ReportTigerDial, HistoryModels.ReportTigerDialHistory))
-        .then(ReportMove.move(Models.ReportDial, HistoryModels.ReportDialHistory))
-        .then(ReportMove.move(Models.ReportCallTransfer, HistoryModels.ReportCallTransferHistory))
-        .then(ReportMove.move(Models.ReportAgent, HistoryModels.ReportAgentHistory, {
-          reason: {
-            $ne: null
-          }
-        }))
-        .then(ReportMove.move(Models.ReportMember, HistoryModels.ReportMemberHistory, {
-          exitAt: {
-            $ne: null
-          }
-        }))
-        .then(ReportMove.move(Models.ReportQueue, HistoryModels.ReportQueueHistory, {
-          queuecallerleaveAt: {
-            $ne: null
-          }
-        }))
-        .then(ReportMove.move(Models.ReportChat, HistoryModels.ReportChatHistory, {
-          reason: {
-            $ne: null
-          }
-        }))
-        .then(ReportMove.move(Models.ReportChatSession, HistoryModels.ReportChatSessionHistory, {
-          leaveAt: {
-            $ne: null
-          }
-        }))
-        .then(ReportMove.move(Models.ReportChatRoom, HistoryModels.ReportChatRoomHistory, {
-          leaveAt: {
-            $ne: null
-          }
-        }))
-        .then(ReportMove.move(Models.ReportMail, HistoryModels.ReportMailHistory, {
-          reason: {
-            $ne: null
-          }
-        }))
-        .then(ReportMove.move(Models.ReportMailSession, HistoryModels.ReportMailSessionHistory, {
-          leaveAt: {
-            $ne: null
-          }
-        }))
-        .then(ReportMove.move(Models.ReportMailRoom, HistoryModels.ReportMailRoomHistory, {
-          leaveAt: {
-            $ne: null
-          }
-        }))
-        .then(ReportMove.move(Models.ReportSms, HistoryModels.ReportSmsHistory, {
-          reason: {
-            $ne: null
-          }
-        }))
-        .then(ReportMove.move(Models.ReportSmsSession, HistoryModels.ReportSmsSessionHistory, {
-          leaveAt: {
-            $ne: null
-          }
-        }))
-        .then(ReportMove.move(Models.ReportSquare, HistoryModels.ReportSquareHistory, {
-          leaveAt: {
-            $ne: null
-          }
-        }))
-        .then(ReportMove.move(Models.ReportFax, HistoryModels.ReportFaxHistory, {
-          reason: {
-            $ne: null
-          }
-        }))
-        .then(ReportMove.move(Models.ReportFaxSession, HistoryModels.ReportFaxSessionHistory, {
-          leaveAt: {
-            $ne: null
-          }
-        }))
-        .then(ReportMove.move(Models.ReportFaxRoom, HistoryModels.ReportFaxRoomHistory, {
-          leaveAt: {
-            $ne: null
-          }
-        }))
-        .then(ReportMove.move(Models.ReportOpenchannel, HistoryModels.ReportOpenchannelHistory, {
-          reason: {
-            $ne: null
-          }
-        }))
-        .then(ReportMove.move(Models.ReportOpenchannelSession, HistoryModels.ReportOpenchannelSessionHistory, {
-          leaveAt: {
-            $ne: null
-          }
-        }))
-        .catch(function(err) {
-          console.error(err);
-        });
-    }
-  });
-
-  job.start();
-}
\ No newline at end of file
diff --git a/server/config/history/reportMove.js b/server/config/history/reportMove.js
index de5d2c8..c8b899e 100644
--- a/server/config/history/reportMove.js
+++ b/server/config/history/reportMove.js
@@ -1,50 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var moment = require('moment');
-var sequelize = require('../../models').sequelize;
-var util = require('util');
-
-exports.move = function(Report, ReportHistory, where) {
-  var _items;
-  var _where = {
-    createdAt: {
-      $lte: moment().format("YYYY-MM-DD HH:mm:ss")
-    }
-  };
-
-  return function() {
-    return sequelize.transaction(function(t) {
-        return Report
-          .findAll({
-            where: where ? _.merge(_where, where) : _where,
-            raw: true
-          })
-          .then(function(items) {
-            _items = items;
-            return ReportHistory
-              .bulkCreate(items, {
-                individualHooks: true,
-                transaction: t
-              });
-          })
-          .then(function() {
-            return Report
-              .destroy({
-                where: {
-                  id: _.map(_items, 'id')
-                }
-              }, {
-                individualHooks: true,
-                transaction: t
-              });
-          });
-      })
-      .then(function() {
-        console.log(util.format('Moving %s - DONE', Report.tableName));
-      })
-      .catch(function(err) {
-        console.error(util.format('Moving %s error: %s.', Report.tableName, _.map(err.errors, 'message').join('; ')));
-      });
-  }
-}
\ No newline at end of file
diff --git a/server/config/imap/imap.js b/server/config/imap/imap.js
index 93bfa0d..fd591fd 100644
--- a/server/config/imap/imap.js
+++ b/server/config/imap/imap.js
@@ -1,105 +1 @@
-'use strict';
-
-var util = require('util');
-var path = require('path');
-
-var _ = require('lodash');
-var Promise = require('bluebird');
-var ImapListener = require("mail-listener2");
-var writeFile = Promise.promisify(require("fs").writeFile);
-
-var config = require('../environment');
-
-var Server = require('../../models').MailServerIn;
-var Room = require('../../models').MailRoom;
-var Message = require('../../models').MailMessage;
-var Account = require('../../models').MailAccount;
-var Attachment = require('../../models').MailAttachment;
-
-var imap;
-var timeout;
-
-process
-  .on('close', function(code) {
-    console.log(util.format('IMAP SERVER %s EXITED WITH CODE %s, PROCESS ID: %s ', process.argv[3], code, process.pid));
-  })
-  .on('error', function(err) {
-    console.error(err);
-  });
-
-console.log(util.format('IMAP SERVER %s STARTING, PROCESS ID: %s ', process.argv[3], process.pid));
-
-process.send({
-  type: 'state',
-  state: 'CONNECTING'
-});
-
-function onSave(server) {
-  imap = new ImapListener({
-      username: server.username,
-      password: server.password,
-      host: server.host,
-      port: server.port,
-      tls: server.ssl,
-      tlsOptions: {
-        rejectUnauthorized: false
-      },
-      mailbox: server.mailbox, // mailbox to monitor
-      searchFilter: [server.filter], // the search filter being used after an IDLE notification has been retrieved
-      markSeen: true, // all fetched email willbe marked as seen and not fetched next time
-      fetchUnreadOnStart: true, // use it only if you want to get all unread email on lib start. Default is `false`,,
-      connTimeout: server.connTimeout * 1000, // *1000 because there are set and get on the model
-      authTimeout: server.authTimeout * 1000, // *1000 because there are set and get on the model
-      keepalive: server.keepalive
-    })
-    .on('server:connected', function() {
-      console.log(util.format('IMAP SERVER %s CONNECTED, PROCESS ID: %s ', server.username, process.pid));
-
-      process.send({
-        type: 'state',
-        state: 'CONNECTED'
-      });
-    })
-    .on('server:disconnected', function(err) {
-      console.error(util.format('IMAP SERVER %s DISCONNECTED, PROCESS ID: %s ', server.username, process.pid), err);
-
-      imap.stop();
-      imap = null;
-
-      process.send({
-        type: 'state',
-        state: 'DISCONNECTED'
-      });
-    })
-    .on("error", function(err) {
-      console.error(util.format('IMAP SERVER %s ERRROR, PROCESS ID: %s ', server.username, process.pid), err);
-
-      process.send({
-        type: 'state',
-        state: 'ERROR',
-        source: JSON.stringify(err)
-      });
-    })
-    .on("mail", function(msg, seqno, attributes) {
-      console.log(util.format('IMAP SERVER %s NEW MSG FROM %s ', process.argv[3], _.map(msg.from, 'address').join(';')));
-
-      msg.type = 'msg';
-      msg.mailServerInId = imap.mailServerInId;
-      msg.mailAccountId = imap.mailAccountId;
-      process.send(msg);
-    });
-
-  imap.mailServerInId = server.id;
-  imap.mailAccountId = server.MailAccountId;
-
-  imap.start();
-}
-
-Server
-  .findById(process.argv[2])
-  .then(function(server) {
-    onSave(server);
-  })
-  .catch(function(err) {
-    console.error(err);
-  });
\ No newline at end of file
diff --git a/server/config/imap/index.js b/server/config/imap/index.js
index 053702c..b50b5fe 100644
--- a/server/config/imap/index.js
+++ b/server/config/imap/index.js
@@ -1,600 +1 @@
-'use strict';
-
-const _ = require('lodash');
-const util = require('util');
-const path = require('path');
-const cp = require('child_process');
-const ms = require('../../models').MailServerIn;
-const msg = require('../../models').MailMessage;
-const Room = require('../../models').MailRoom;
-const Status = require('../../models').MailRoomStatus;
-const Message = require('../../models').MailMessage;
-const Account = require('../../models').MailAccount;
-const Contact = require('../../models').Contact;
-const Company = require('../../models').Company;
-const Attachment = require('../../models').MailAttachment;
-const ReportMail = require('../../models').ReportMail;
-const ReportMailRoom = require('../../models').ReportMailRoom;
-const ReportMailSession = require('../../models').ReportMailSession;
-const Promise = require('bluebird');
-const moment = require('moment');
-const open = Promise.promisify(require("fs").open);
-const close = Promise.promisify(require("fs").close);
-const write = Promise.promisify(require("fs").write);
-const config = require('../environment');
-var mailaccounts;
-var Scheduler = require('../routing/scheduler');
-var Util = require('../util');
-
-function handleMessage(msg) {
-  var _mRoom;
-  var _mMessage;
-  var _mAccount;
-  var _mContact;
-  var _mCompany;
-  var _mFrom, _mTo, _mCc, _mBcc;
-
-  if (msg.inReplyTo) {
-    return Message
-      .findOne({
-        where: {
-          messageId: msg.inReplyTo[0]
-        }
-      })
-      .then(function(mailMessageParent) {
-        if (mailMessageParent) {
-          return mailMessageParent
-            .getMailRoom()
-            .then(function(mailRoom) {
-              _mRoom = mailRoom;
-              if (mailRoom.status !== 'CLOSED') {
-                return _mRoom
-                  .update({
-                    status: 'OPEN',
-                    openReason: 'system'
-                  }, {
-                    individualHooks: true
-                  })
-                  .then(function() {
-                    return Account
-                      .findById(msg.mailAccountId)
-                      .then(function(mailAccount) {
-                        _mAccount = mailAccount;
-
-                        if (_mAccount.ListId) {
-                          return Company
-                            .findOne({
-                              where: {
-                                emailDomain: msg.from[0].address.split('@')[1]
-                              }
-                            })
-                            .then(function(company) {
-                              return Contact
-                                .findOrCreate({
-                                  where: {
-                                    email: msg.from[0].address,
-                                  },
-                                  defaults: {
-                                    email: msg.from[0].address,
-                                    firstName: msg.from[0].name || msg.from[0].address.split('@')[0],
-                                    ListId: _mAccount.ListId,
-                                    CompanyId: company ? company.id : null
-                                  }
-                                });
-                            });
-
-                        } else {
-                          return [];
-                        }
-                      })
-                      .spread(function(contact) {
-                        _mContact = contact;
-                      });
-                  })
-
-              } else {
-
-                return Account
-                  .findById(msg.mailAccountId)
-                  .then(function(mailAccount) {
-                    _mAccount = mailAccount;
-
-                    if (_mAccount.ListId) {
-                      return Company
-                        .findOne({
-                          where: {
-                            emailDomain: msg.from[0].address.split('@')[1]
-                          }
-                        })
-                        .then(function(company) {
-                          return Contact
-                            .findOrCreate({
-                              where: {
-                                email: msg.from[0].address,
-                              },
-                              defaults: {
-                                email: msg.from[0].address,
-                                firstName: msg.from[0].name || msg.from[0].address.split('@')[0],
-                                ListId: _mAccount.ListId,
-                                CompanyId: company ? company.id : null
-                              }
-                            });
-                        });
-
-                    } else {
-                      return [];
-                    }
-                  })
-                  .spread(function(contact) {
-                    _mContact = contact;
-                    return Room
-                      .create({
-                        subject: msg.subject,
-                        from: _.map(msg.from, 'address').join(';'),
-                        account: _mAccount.name,
-                        attachment: msg.attachments && msg.attachments.length,
-                        lastEvent: 'RECEIVED',
-                        lastEventAt: moment().format("YYYY-MM-DD HH:mm:ss"),
-                        arrivedAt: moment().format("YYYY-MM-DD HH:mm:ss"),
-                        MailAccountId: _mAccount.id,
-                        ParentId: mailRoom.id
-                      });
-                  })
-                  .then(function(mailRoom) {
-                    _mRoom = mailRoom;
-                  });
-              }
-            });
-        } else {
-          return Account
-            .findById(msg.mailAccountId)
-            .then(function(mailAccount) {
-              _mAccount = mailAccount;
-              if (_mAccount.ListId) {
-                return Company
-                  .findOne({
-                    where: {
-                      emailDomain: msg.from[0].address.split('@')[1]
-                    }
-                  })
-                  .then(function(company) {
-                    return Contact
-                      .findOrCreate({
-                        where: {
-                          email: msg.from[0].address,
-                        },
-                        defaults: {
-                          email: msg.from[0].address,
-                          firstName: msg.from[0].name || msg.from[0].address.split('@')[0],
-                          ListId: _mAccount.ListId,
-                          CompanyId: company ? company.id : null
-                        }
-                      });
-                  });
-
-              } else {
-                return [];
-              }
-            })
-            .spread(function(contact) {
-              _mContact = contact;
-              return Room
-                .create({
-                  subject: msg.subject,
-                  from: _.map(msg.from, 'address').join(';'),
-                  account: _mAccount.name,
-                  attachment: msg.attachments && msg.attachments.length,
-                  lastEvent: 'RECEIVED',
-                  lastEventAt: moment().format("YYYY-MM-DD HH:mm:ss"),
-                  arrivedAt: moment().format("YYYY-MM-DD HH:mm:ss"),
-                  MailAccountId: _mAccount.id
-                });
-            })
-            .then(function(mailRoom) {
-              _mRoom = mailRoom;
-            })
-        }
-      })
-      .then(function() {
-        return _mRoom
-          .update({
-            lastEvent: 'RECEIVED',
-            mailIn: ++_mRoom.mailIn
-          });
-      })
-      .then(function(mailRoom) {
-
-        return Message
-          .create({
-            fromId: _mContact ? _mContact.id : null,
-            messageId: msg.messageId,
-            status: 'RECEIVED',
-            subject: msg.subject,
-            from: _.map(msg.from, 'address'),
-            to: msg.to ? _.map(msg.to, 'address') : [],
-            cc: msg.cc ? _.map(msg.cc, 'address') : [],
-            bcc: msg.bcc ? _.map(msg.bcc, 'address') : [],
-            text: msg.text || null,
-            MailRoomId: _mRoom.id,
-            accountName: _mAccount.name,
-            accountId: _mAccount.id
-          });
-      })
-      .then(function(mailMessage) {
-        var _attachments = [];
-        var _mailMessage = mailMessage;
-
-        var scheduler = new Scheduler({
-          channel: 'mail',
-          uniqueid: util.format('%s.%s', moment().unix(), _mRoom.id),
-          subject: msg.subject,
-          messageid: _mailMessage.id,
-          roomid: _mRoom.id,
-          accountid: _mAccount.id,
-          accountname: _mAccount.name,
-          accountaddress: _mAccount.address,
-          from: msg.from[0].address,
-          cc: msg.cc ? _.map(msg.cc, 'address') : []
-        }, _mailMessage.dataValues);
-        scheduler.init();
-
-        if (msg.attachments && msg.attachments.length) {
-          msg.attachments.forEach(function(attachment) {
-            var _basename = 'download_' + Math.random(32);
-            var _fd;
-            _attachments.push(
-              Attachment
-              .create({
-                name: attachment.fileName,
-                basename: _basename,
-                path: path.join(config.root, 'server', 'files', 'attachments', '/', _basename),
-                type: attachment.contentType,
-                size: attachment.length,
-                MailMessageId: _mailMessage.id
-              })
-              .then(function(mailAttachment) {
-                return open(mailAttachment.path, 'w');
-              })
-              .then(function(fd) {
-                _fd = fd;
-                return write(_fd, new Buffer(attachment.content.data), 0, attachment.length);
-              })
-              .then(function() {
-                return close(_fd);
-              })
-              .then(function() {
-                console.log('File', attachment.fileName, 'properly saved.');
-              })
-              .catch(function(err) {
-                console.error(err);
-              }));
-          });
-        }
-
-        return Promise
-          .all(_attachments);
-      })
-      .catch(function(err) {
-        console.error(err);
-      });
-
-  } else {
-
-    return Account
-      .findById(msg.mailAccountId)
-      .then(function(mailAccount) {
-        _mAccount = mailAccount;
-
-        if (_mAccount.ListId) {
-          return Company
-            .findOne({
-              where: {
-                emailDomain: msg.from[0].address.split('@')[1]
-              }
-            })
-            .then(function(company) {
-              return Contact
-                .findOrCreate({
-                  where: {
-                    email: msg.from[0].address,
-                  },
-                  defaults: {
-                    email: msg.from[0].address,
-                    firstName: msg.from[0].name || msg.from[0].address.split('@')[0],
-                    ListId: _mAccount.ListId,
-                    CompanyId: company ? company.id : null
-                  }
-                });
-            });
-        } else {
-          return [];
-        }
-      })
-      .spread(function(contact) {
-        _mContact = contact;
-
-        return Room
-          .create({
-            mailIn: 1,
-            account: _mAccount.name,
-            subject: msg.subject,
-            from: _.map(msg.from, 'address').join(';'),
-            status: 'NEW',
-            lastEvent: 'RECEIVED',
-            lastEventAt: moment().format("YYYY-MM-DD HH:mm:ss"),
-            arrivedAt: moment().format("YYYY-MM-DD HH:mm:ss"),
-            attachment: msg.attachments && msg.attachments.length,
-            MailMessages: [{
-              messageId: msg.messageId,
-              subject: msg.subject,
-              from: _.map(msg.from, 'address'),
-              fromId: _mContact ? _mContact.id : null,
-              to: msg.to ? _.map(msg.to, 'address') : [],
-              cc: msg.cc ? _.map(msg.cc, 'address') : [],
-              bcc: msg.bcc ? _.map(msg.bcc, 'address') : [],
-              status: 'RECEIVED',
-              text: msg.text || null,
-              accountName: _mAccount.name,
-              accountId: _mAccount.id
-            }],
-            MailAccountId: msg.mailAccountId
-          }, {
-            include: [{
-              model: Message
-            }]
-          });
-      })
-      .then(function(room) {
-        var _attachments = [];
-        var _room = room;
-
-        var scheduler = new Scheduler({
-          channel: 'mail',
-          uniqueid: util.format('%s.%s', moment().unix(), _room.id),
-          subject: msg.subject,
-          messageid: _room.MailMessages[0].id,
-          roomid: _room.id,
-          accountid: _mAccount.id,
-          accountname: _mAccount.name,
-          accountaddress: _mAccount.address,
-          from: msg.from[0].address,
-          cc: msg.cc ? _.map(msg.cc, 'address') : []
-        }, _room.MailMessages[0].dataValues);
-        scheduler.init();
-
-        if (msg.attachments && msg.attachments.length) {
-          msg.attachments.forEach(function(attachment) {
-            var _basename = 'download_' + Math.random(32);
-            var _fd;
-
-            _attachments.push(
-              Attachment
-              .create({
-                name: attachment.fileName,
-                basename: _basename,
-                path: path.join(config.root, 'server', 'files', 'attachments', '/', _basename),
-                type: attachment.contentType,
-                size: attachment.length,
-                MailMessageId: _room.MailMessages[0].id
-              })
-              .then(function(mailAttachment) {
-                return open(mailAttachment.path, 'w');
-              })
-              .then(function(fd) {
-                _fd = fd;
-                return write(_fd, new Buffer(attachment.content.data), 0, attachment.length);
-              })
-              .then(function() {
-                return close(_fd);
-              })
-              .then(function() {
-                console.log('File', attachment.fileName, 'properly saved.');
-              })
-              .catch(function(err) {
-                console.error(err);
-              }));
-          });
-        }
-
-        return Promise
-          .all(_attachments);
-      })
-      .catch(function(err) {
-        console.error(err);
-      });
-  }
-}
-
-function handleState(id, data) {
-  return ms
-    .findById(id)
-    .then(function(server) {
-      return server
-        .update({
-          state: data.state,
-          source: data.source || null
-        });
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
-
-function fork(id, username) {
-  return cp
-    .fork(__dirname + '/imap', [id, username])
-    .on('message', function(data) {
-      switch (data.type) {
-        case 'msg':
-          handleMessage(data);
-          break;
-
-        case 'state':
-          handleState(id, data)
-          break;
-
-        default:
-      }
-    })
-    .on('close', function(code) {
-      console.log(util.format('IMAP SERVER %s EXITED WITH CODE %s', username, code));
-    })
-    .on('error', function(err) {
-      console.error(err);
-    });
-}
-
-function execRequest(doc, method, url) {
-  Util.sendRequest(doc, method, url)
-    .then(function(res) {
-      console.log('request successeful!');
-
-    })
-    .catch(function(err) {
-      console.log('request failed!');
-
-    })
-}
-
-function webhook(doc, account, hook) {
-  var _Account = account;
-  switch (hook) {
-    case 'accept':
-      if (_Account.acceptMethod && _Account.acceptUrl) {
-        console.log('Mail account <' + _Account.name + '> executing accept webhook');
-        execRequest(doc.dataValues, _Account.acceptMethod, _Account.acceptUrl);
-      }
-      if (_Account.actions.length) {
-        _.forEach(_Account.actions, function(action) {
-          if (action.enabled) {
-            Util.execAction(action, doc);
-          }
-        })
-      }
-      break;
-    case 'reject':
-      if (_Account.rejectMethod && _Account.rejectUrl) {
-        console.log('Mail account <' + _Account.name + '> executing reject webhook');
-        execRequest(doc.dataValues, _Account.rejectMethod, _Account.rejectUrl);
-      }
-      break;
-    case 'close':
-      if (_Account.closeMethod && _Account.closeUrl) {
-        console.log('Mail account <' + _Account.name + '> executing close webhook');
-        execRequest(doc.dataValues, _Account.closeMethod, _Account.closeUrl);
-      }
-      break;
-    default:
-      console.log('Webhook not recognized');
-  }
-}
-
-function synch(mailaccounts) {
-  Account.afterDestroy(function(doc) {
-    _.remove(mailaccounts, {
-      id: doc.id
-    });
-  });
-  Account.afterCreate(function(doc) {
-    console.log('Mail account: ' + doc.name + ' Create');
-    mailaccounts.push(doc);
-  });
-  Account.afterUpdate(function(doc) {
-    var oldItem = _.find(mailaccounts, {
-      id: doc.id
-    });
-    if (oldItem) {
-      console.log('Mail account: ' + oldItem.name + ' Update');
-      _.merge(oldItem, doc);
-    } else {
-      mailaccounts.unshift(doc);
-    }
-  });
-}
-
-module.exports = function() {
-  var childs = {};
-  var timeout;
-
-  process.on('exit', function(code) {
-    for (var key in childs) {
-      if (childs[key]) {
-        childs[key].kill();
-      }
-    }
-  });
-  Account
-    .findAll()
-    .then(function(accounts) {
-      mailaccounts = accounts;
-      synch(mailaccounts);
-      ReportMail.afterUpdate(function(doc) {
-        var account = _.find(mailaccounts, {
-          id: parseInt(doc.accountid)
-        });
-        if (account && doc.changed('connectid')) {
-          webhook(doc, account, 'accept');
-        }
-        if (account && doc.changed('rejectedAt')) {
-          webhook(doc, account, 'reject');
-        }
-      });
-      Room.afterUpdate(function(doc) {
-        var account = _.find(mailaccounts, {
-          id: doc.MailAccountId
-        });
-        if (account && doc.changed('status') && doc.status === 'CLOSED') {
-          webhook(doc, account, 'close');
-        }
-      })
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-  ms.afterCreate(function(server) {
-    childs[server.id] = fork(server.id, server.username);
-  });
-
-  ms.afterUpdate(function(server) {
-    if (childs[server.id]) {
-      if (server.changed('state') || server.changed('source')) {
-        console.log(util.format('IMAP SERVER %s UPDATED, PROCESS ID: %s ', server.id, childs[server.id].pid));
-        clearTimeout(timeout);
-
-        switch (server.state) {
-          case 'DISCONNECTED':
-            timeout = setTimeout(function() {
-              childs[server.id] = fork(server.id, server.username);
-            }, 10000);
-
-            break;
-          default:
-        }
-
-      } else {
-        childs[server.id].kill();
-        childs[server.id] = null;
-        childs[server.id] = fork(server.id, server.username);
-      }
-    }
-  });
-
-  ms.afterDestroy(function(server) {
-    if (childs[server.id]) {
-      console.log(util.format('IMAP SERVER %s DESTROYED, PROCESS ID: %s ', server.id, childs[server.id].pid));
-
-      childs[server.id].kill();
-      childs[server.id] = null;
-    }
-  });
-
-  ms.findAll()
-    .then(function(servers) {
-      servers.forEach(function(server) {
-        childs[server.id] = fork(server.id, server.username);
-      });
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-};
\ No newline at end of file
diff --git a/server/config/integration.js b/server/config/integration.js
index 8b87bc5..4768c35 100644
--- a/server/config/integration.js
+++ b/server/config/integration.js
@@ -1,24 +1 @@
-'use strict';
-
-var path = require('path');
-var fs = require('fs');
-
-var Integration = require('../models').Integration;
-
-module.exports = function(io, ami) {
-
-  Integration
-    .findAll()
-    .then(function(integrations) {
-      integrations.forEach(function(integration) {
-        var info = path.parse(integration.path);
-        var file = path.join(info.dir, info.name, integration.main);
-        if (fs.existsSync(file)) {
-          require(file)(io, ami);
-        }
-      });
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-};
\ No newline at end of file
diff --git a/server/config/integrations/index.js b/server/config/integrations/index.js
index 1fa5f58..20cdd7b 100644
--- a/server/config/integrations/index.js
+++ b/server/config/integrations/index.js
@@ -1,87 +1 @@
-'use strict';
-
-// Library
-var _ = require('lodash');
-// Models
-var IntegrationModel = require('../../models').Integration;
-var Variable = require('../../models').Variable;
-// Integration service
-var Zendesk = require('./zendesk');
-var Salesforce = require('./salesforce');
-var Motionbar = require('./motionbar');
-// Variables
-var MAX_CALLS = 200;
-
-function Integration(ami) {
-  console.log('Trigger Integration Initialization...');
-
-  var zendesk = new Zendesk();
-  var salesforce = new Salesforce();
-  var motionbar = new Motionbar();
-
-  var activeIntegrations = [];
-
-  IntegrationModel
-    .findAll({
-      where: {
-        active: 1
-      }
-    })
-    .then(function(integrations) {
-      activeIntegrations = integrations;
-      synchIntegrations(activeIntegrations);
-    });
-
-  this.manageEvent = function(rule, doc, channel, subtype, variables) {
-    if (integrationIsActive(rule.data1, activeIntegrations)) {
-      switch (rule.data1) {
-        case 'zendesk':
-          zendesk.handleEvent(rule.data2, rule.data3, channel, subtype, doc, variables);
-          break;
-        case 'salesforce':
-          salesforce.handleEvent(rule.data2, rule.data3, channel, subtype, doc, variables);
-          break;
-        default:
-          console.log('Integration not recognized: ', rule.data1);
-      }
-    }
-    if (rule.action === 'motionbar') {
-      motionbar.handleEvent(rule, channel, doc, variables);
-    }
-  }
-}
-
-function integrationIsActive(integration, active) {
-  var integratioNames = _.map(active, 'state');
-  if (_.indexOf(integratioNames, integration) >= 0) {
-    return true;
-  }
-  return false;
-}
-
-function synchIntegrations(active) {
-  IntegrationModel.afterUpdate(function(doc) {
-    if (doc.active) {
-      updateCollection(active, doc);
-    } else {
-      _.remove(active, {
-        id: doc.id
-      });
-    }
-    console.log('After update, integrations are ', active.length);
-  });
-}
-
-function updateCollection(collection, doc) {
-  var oldItem = _.find(collection, {
-    id: doc.id
-  });
-  var index = collection.indexOf(oldItem);
-  if (oldItem) {
-    _.merge(collection[index], doc);
-  } else {
-    collection.unshift(doc);
-  }
-}
-
-module.exports = Integration;
\ No newline at end of file
diff --git a/server/config/integrations/motionbar.js b/server/config/integrations/motionbar.js
index a8e6195..1284066 100644
--- a/server/config/integrations/motionbar.js
+++ b/server/config/integrations/motionbar.js
@@ -1,101 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var util = require('util');
-var Mustache = require('mustache');
-
-var ReportIntegration = require('../../models').ReportIntegration;
-var Template = require('../../models').Template;
-
-function Motionbar() {
-  console.log('Motionbar integration initialization...');
-}
-
-Motionbar.prototype.handleEvent = function(rule, channel, data, variables) {
-
-  if (!rule.data1 || !rule.data2) {
-    console.error('Passed parameters are not enough to manage Motionbar integration');
-    return;
-  }
-
-  // variables = _.reduce(variables, function(result, value, key) {
-  //   result[value.name] = value.value;
-  //   return result;
-  // }, {});
-  delete data.id;
-  var mergedVars = _.merge(_.clone(data), variables);
-
-  console.log('Type:', rule.data1);
-
-  switch (rule.data1) {
-    case '0':
-      //POPUP
-      return Template
-        .findById(rule.data2)
-        .then(function(template) {
-          data.html = template.html ? Mustache.render(template.html, mergedVars) : '<html><body>Empty Template</body></html>';
-          data.subject = template.subject ? Mustache.render(template.subject.toString(), mergedVars) : 'No Title';
-          data.integration = 'motionbar';
-          data.eventChannel = channel;
-          data.exitStatus = 'success';
-          data.integrationId = rule.data1;
-          return ReportIntegration.create(data);
-        })
-        .then(function() {
-          console.log('[Motionbar] Popup created');
-        })
-        .catch(handleError(channel, data, rule.data1));
-    case '1':
-      //URL
-      data.url = rule.data2 ? Mustache.render(rule.data2, mergedVars) : 'https://wiki.xcallymotion.com/';
-      data.integration = 'motionbar';
-      data.eventChannel = channel;
-      data.exitStatus = 'success';
-      data.integrationId = rule.data1;
-      return ReportIntegration.create(data)
-        .then(function() {
-          console.log('[Motionbar] URL created');
-        })
-        .catch(handleError(channel, data, rule.data1));
-    case '2':
-      //WINDOWS APPLICATION
-      data.app = rule.data2;
-      data.appdata = rule.data3 ? Mustache.render(rule.data3, mergedVars) : '';
-      data.integration = 'motionbar';
-      data.eventChannel = channel;
-      data.exitStatus = 'success';
-      data.integrationId = rule.data1;
-      return ReportIntegration.create(data)
-        .then(function() {
-          console.log('[Motionbar] Windows Application opened');
-        })
-        .catch(handleError(channel, data, rule.data1));
-    default:
-      console.log('[Motionbar] Type not recognized:', rule.data1);
-  }
-
-};
-
-function handleError(channel, data, integrationId) {
-  return function(err) {
-    console.error('[Motionbar] Error in ticket creation');
-    console.error('[Motionbar] Message:', err.message);
-    console.error('[Motionbar] Stack:', err.stack);
-
-    data.integration = 'motionbar';
-    data.eventChannel = channel;
-    data.exitStatus = 'failed';
-    data.integrationId = integrationId;
-    ReportIntegration
-      .create(data)
-      .then(function() {
-        return;
-      })
-      .catch(function(err) {
-        console.error('[Motionbar] Error in Report integration create');
-        return;
-      });
-  }
-}
-
-module.exports = Motionbar;
\ No newline at end of file
diff --git a/server/config/integrations/salesforce.js b/server/config/integrations/salesforce.js
index ae05aa5..632bec2 100644
--- a/server/config/integrations/salesforce.js
+++ b/server/config/integrations/salesforce.js
@@ -1,583 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var util = require('util');
-var jsforce = require('jsforce');
-var moment = require('moment');
-
-var SalesforceIntegration = require('../../models').SalesforceIntegration;
-var SalesforceConfiguration = require('../../models').SalesforceConfiguration;
-var ReportIntegration = require('../../models').ReportIntegration;
-var VoiceQueue = require('../../models').VoiceQueue;
-var VoiceExtension = require('../../models').VoiceExtension;
-
-function Salesforce() {
-  console.log('Salesforce integration initialization...');
-}
-
-Salesforce.prototype.handleEvent = function(integrationId, configurationId, channel, subtype, data, variables) {
-
-  var salesforceData = {
-    connection: undefined,
-    configuration: undefined,
-    agent: undefined,
-    enduser: undefined,
-    taskId: undefined,
-    recordEnable: false,
-    serverURL: undefined
-  };
-
-  if (!integrationId || !configurationId) {
-    console.error('Passed parameters are not enough to create a new ticket: miss IntegrationId or ConfigurationId');
-    return;
-  }
-
-  SalesforceConfiguration
-    .find({
-      where: {
-        id: configurationId,
-        AccountId: integrationId
-      },
-      include: [{
-        all: true,
-        include: [{
-          all: true
-        }]
-      }]
-    })
-    .then(handleEntityNotFound())
-    .then(handleConnection(salesforceData))
-    .then(searchQueue(data))
-    .then(handleQueueRecordings(salesforceData, data))
-    .then(searchRoute(data))
-    .then(handleOutboundRecordings(salesforceData, data))
-    .then(searchAgent(salesforceData, channel, data))
-    .then(handleAgent(salesforceData, channel, data))
-    .then(searchAdmin(salesforceData))
-    .then(handleAdmin(salesforceData))
-    .then(searchContact(salesforceData, channel, data, subtype))
-    .then(handleContact(salesforceData, channel, data, subtype))
-    .then(searchLead(salesforceData, channel, data, subtype))
-    .then(handleLead(salesforceData, channel, data, subtype))
-    .then(leadCreation(salesforceData, channel, data, subtype))
-    .then(handleLeadCreation(salesforceData, channel, data, subtype))
-    .then(taskCreation(salesforceData, data, variables))
-    .then(handleTaskDisplay(salesforceData))
-    .then(handleReportIntegration(salesforceData, channel, data, integrationId))
-    .then(handleEnd(salesforceData))
-    .catch(handleError(salesforceData, channel, data, integrationId));
-
-};
-
-function handleEntityNotFound() {
-  return function(entity) {
-    if (!entity) {
-      return null;
-    }
-    return entity;
-  };
-}
-
-function handleConnection(salesforceData) {
-  return function(configuration) {
-    salesforceData.connection = new jsforce.Connection({
-      oauth2: {
-        loginUrl: configuration.SalesforceAccount.remoteUri ? configuration.SalesforceAccount.remoteUri : 'https://login.salesforce.com',
-        clientId: configuration.SalesforceAccount.clientId,
-        clientSecret: configuration.SalesforceAccount.clientSecret
-      }
-    });
-    var pwd = configuration.SalesforceAccount.password.concat(configuration.SalesforceAccount.securityToken);
-    salesforceData.configuration = configuration;
-    salesforceData.serverURL = configuration.SalesforceAccount.serverUrl;
-    return salesforceData.connection.login(configuration.SalesforceAccount.username, pwd);
-  }
-}
-
-function searchQueue(data) {
-  return function() {
-    if (data.queue) {
-      return VoiceQueue.findOne({
-        where: {
-          name: data.queue
-        },
-        attributes: ['name', 'monitor_format']
-      });
-    } else {
-      return;
-    }
-  }
-}
-
-function handleQueueRecordings(salesforceData, data) {
-  return function(queue) {
-    if (data.queue) {
-      if (queue && queue.monitor_format) {
-        console.log('[Salesforce] Recording enabled for the Queue', queue.name);
-        salesforceData.recordEnable = true;
-      } else {
-        salesforceData.recordEnable = false;
-        console.log('[Salesforce] Queue not found or Recording not enabled');
-      }
-    }
-    return;
-  }
-}
-
-function searchRoute(data) {
-  return function() {
-    if (data.routeId) {
-      return VoiceExtension.findOne({
-        where: {
-          id: data.routeId
-        },
-        attributes: ['id', 'record']
-      });
-    } else {
-      return;
-    }
-  }
-}
-
-function handleOutboundRecordings(salesforceData, data) {
-  return function(route) {
-    if (data.routeId) {
-      if (route && route.record) {
-        console.log('[Salesforce] Recording enabled for the Route Outbound', route.id);
-        salesforceData.recordEnable = true;
-      } else {
-        salesforceData.recordEnable = false;
-        console.log('[Salesforce] Route Outbound not found or Recording not enabled');
-      }
-    }
-    return;
-  }
-}
-
-function searchAgent(salesforceData, channel, data) {
-  return function() {
-    console.log('[Salesforce] Agent to search:', getValueFromPropertyName(data, getAgentSearchPropertyFromChannel(channel)));
-    return salesforceData.connection.sobject("User")
-      .find({
-        Name: getValueFromPropertyName(data, getAgentSearchPropertyFromChannel(channel))
-      }, {
-        Id: 1,
-        Username: 1,
-        Name: 1
-      })
-      .execute();
-  }
-}
-
-function getAgentSearchPropertyFromChannel(channel) {
-  var property = '';
-  if (channel) {
-    switch (channel) {
-      case 'voice':
-        property = 'membername';
-        break;
-      default:
-        property = 'membername';
-        console.error('Channel not recognized:', channel);
-    }
-  }
-  return property;
-}
-
-function getValueFromPropertyName(data, property, salesforceData) {
-  if (property === 'recordingURL') {
-    if (salesforceData && salesforceData.recordEnable && salesforceData.serverURL) {
-      return util.format('%s/api/voice/recordings/%s/download?type=uniqueid', stripTrailingSlash(salesforceData.serverURL), data.uniqueid);
-    } else {
-      return null;
-    }
-  } else {
-    return _.result(data, property);
-  }
-}
-
-function handleAgent(salesforceData, channel, event) {
-  return function(data) {
-    if (data.length > 0) {
-      console.log('[Salesforce] Agent found:', getValueFromPropertyName(event, getAgentSearchPropertyFromChannel(channel)));
-      salesforceData.agent = getMatchObject(data, 'Name', getValueFromPropertyName(event, getAgentSearchPropertyFromChannel(channel)));
-      return salesforceData.agent;
-    }
-    return;
-  }
-}
-
-function getMatchObject(collection, property, valueToSearch) {
-  var valueFound = _.find(collection, {
-    property: valueToSearch
-  });
-  if (valueFound) {
-    return valueFound;
-  }
-  return _.first(collection);
-}
-
-function searchAdmin(salesforceData) {
-  return function(data) {
-    if (data) {
-      return;
-    }
-    console.log('[Salesforce] Agent not found. Use the admin account');
-    return salesforceData.connection.identity();
-  }
-}
-
-function handleAdmin(salesforceData) {
-  return function(data) {
-    if (!data) {
-      return;
-    }
-    if (data) {
-      console.log('[Salesforce] Admin selected');
-      salesforceData.agent = {
-        Id: data.user_id,
-        Name: data.display_name,
-        Username: data.username
-      };
-    }
-    return;
-  }
-}
-
-function searchContact(salesforceData, channel, data, subtype) {
-  return function() {
-    console.log('[Salesforce] Contact to search:', getValueFromPropertyName(data, getEndUserSearchPropertyFromChannel(channel, subtype)));
-    var query = {};
-    query[getEndUserSearchQueryFromChannel(channel)] = getValueFromPropertyName(data, getEndUserSearchPropertyFromChannel(channel, subtype));
-    return salesforceData.connection
-      .sobject("Contact")
-      .find(query, {
-        Id: 1,
-        Name: 1
-      })
-      .execute();
-  }
-}
-
-function getEndUserSearchQueryFromChannel(channel) {
-  var property = '';
-  if (channel) {
-    switch (channel) {
-      case 'voice':
-        property = 'Phone';
-        break;
-      default:
-        property = 'Phone';
-        console.error('Channel not recognized:', channel);
-    }
-  }
-  return property;
-}
-
-function getEndUserSearchPropertyFromChannel(channel, subtype) {
-  var property = '';
-  if (channel) {
-    switch (channel) {
-      case 'voice':
-        if (subtype === 'outbound') {
-          property = 'destcalleridnum';
-        } else if (subtype === 'queue') {
-          property = 'calleridnum';
-        }
-        break;
-      default:
-        property = 'calleridnum';
-        console.error('Channel not recognized:', channel);
-    }
-  }
-  return property;
-}
-
-function getEndUserNamePropertyFromChannel(channel, subtype) {
-  var property = '';
-  if (channel) {
-    switch (channel) {
-      case 'voice':
-        if (subtype === 'outbound') {
-          property = 'destcalleridname';
-        } else if (subtype === 'queue') {
-          property = 'calleridname';
-        }
-        break;
-      default:
-        property = 'calleridname';
-        console.error('Channel not recognized:', channel);
-    }
-  }
-  return property;
-}
-
-function handleContact(salesforceData, channel, event, subtype) {
-  return function(data) {
-    if (data.length > 0) {
-      console.log('[Salesforce] Contact found:', getValueFromPropertyName(event, getEndUserSearchPropertyFromChannel(channel, subtype)));
-      salesforceData.enduser = data[0];
-      return salesforceData.enduser;
-    }
-    console.log('[Salesforce] Contact not found:', getValueFromPropertyName(event, getEndUserSearchPropertyFromChannel(channel, subtype)));
-    return;
-  }
-}
-
-function searchLead(salesforceData, channel, event, subtype) {
-  return function(data) {
-    if (!data) {
-      console.log('[Salesforce] Lead to search:', getValueFromPropertyName(event, getEndUserSearchPropertyFromChannel(channel, subtype)));
-      var query = {};
-      query[getEndUserSearchQueryFromChannel(channel)] = getValueFromPropertyName(event, getEndUserSearchPropertyFromChannel(channel, subtype));
-      return salesforceData.connection
-        .sobject("Lead")
-        .find(query, {
-          Id: 1,
-          Name: 1
-        })
-        .execute();
-    }
-    return;
-  }
-}
-
-function handleLead(salesforceData, channel, event, subtype) {
-  return function(data) {
-    if (data && data.length > 0) {
-      console.log('[Salesforce] Lead found:', getValueFromPropertyName(event, getEndUserSearchPropertyFromChannel(channel, subtype)));
-      salesforceData.enduser = data[0];
-      return salesforceData.enduser;
-    }
-    return;
-  }
-}
-
-function leadCreation(salesforceData, channel, event, subtype) {
-  return function(data) {
-    if (data || salesforceData.enduser) {
-      return;
-    }
-    console.log('[Salesforce] Contact/Lead not found:', getValueFromPropertyName(event, getEndUserSearchPropertyFromChannel(channel, subtype)));
-    return salesforceData.connection
-      .sobject("Lead")
-      .create(getJsonForEndUserCreation(channel, event, subtype));
-  }
-}
-
-function getJsonForEndUserCreation(channel, data, subtype) {
-  var user = {
-    Company: 'No Company'
-  };
-
-  switch (channel) {
-    case 'voice':
-      if (subtype === 'queue') {
-        if (isValidName(data.calleridname)) {
-          user.LastName = getValueFromPropertyName(data, getEndUserNamePropertyFromChannel(channel, subtype));
-        } else {
-          user.LastName = util.format('Caller - %s', getValueFromPropertyName(data, getEndUserSearchPropertyFromChannel(channel, subtype)))
-        }
-      } else if (subtype === 'outbound') {
-        if (isValidName(data.destcalleridname)) {
-          user.LastName = getValueFromPropertyName(data, getEndUserNamePropertyFromChannel(channel, subtype));
-        } else {
-          user.LastName = util.format('Caller - %s', getValueFromPropertyName(data, getEndUserSearchPropertyFromChannel(channel, subtype)))
-        }
-      }
-      user.Phone = getValueFromPropertyName(data, getEndUserSearchPropertyFromChannel(channel, subtype));
-      break;
-    default:
-      console.error('Channel not recognized:', channel);
-  }
-
-  return user;
-}
-
-function isValidName(name) {
-  return name && name !== '<unknown>';
-}
-
-function handleLeadCreation(salesforceData, channel, event, subtype) {
-  return function(data) {
-    if (!data) {
-      return;
-    }
-    if (data && data.success) {
-      console.log('[Salesforce] Lead created: ', getValueFromPropertyName(event, getEndUserSearchPropertyFromChannel(channel, subtype)));
-      salesforceData.enduser = {
-        Id: data.id
-      };
-    }
-    return;
-  }
-}
-
-function taskCreation(salesforceData, event, variables) {
-  return function() {
-    var taskBody = {
-      //Standard Field
-      WhoId: salesforceData.enduser.Id,
-      OwnerId: salesforceData.agent.Id,
-      ActivityDate: moment.utc(),
-      IsReminderSet: false,
-      IsRecurrence: false,
-      //Configurated Field
-      Subject: createSubjectFromConfiguration(salesforceData, event, variables),
-      Description: createDescriptionFromConfiguration(salesforceData, event, variables)
-    };
-    var fields = createCustomFieldsFromConfiguration(salesforceData, event, variables);
-    if (fields.length > 0) {
-      _.forEach(fields, function(item) {
-        taskBody[item.id] = item.value;
-      });
-    }
-    // console.log('[Salesforce] Task body:', taskBody);
-    return salesforceData.connection
-      .sobject("Task")
-      .create(taskBody);
-  }
-}
-
-function createSubjectFromConfiguration(salesforceData, event, variables) {
-  var subject = '';
-  var stringsArray = [];
-  if (salesforceData.configuration.Subject.length > 0) {
-    var subjectConfiguration = _.sortBy(salesforceData.configuration.Subject, ['id']);
-    _.forEach(subjectConfiguration, function(value) {
-      if (value.type === 'string') {
-        stringsArray.push(value.content);
-      } else if (value.type === 'variable' && value.variableName) {
-        var prop = getValueFromPropertyName(event, value.variableName, salesforceData);
-        if (prop) {
-          stringsArray.push(prop.toString());
-        }
-      } else if (value.type === 'customVariable') {
-        variables[value.Variable.name] && stringsArray.push(variables[value.Variable.name].toString());
-      }
-    });
-    subject = stringsArray.join(' ');
-  }
-  return subject;
-}
-
-function createDescriptionFromConfiguration(salesforceData, event, variables) {
-  var description = '';
-  var stringsArray = [];
-  if (salesforceData.configuration.Description.length > 0) {
-    var descriptionConfiguration = _.sortBy(salesforceData.configuration.Description, ['id']);
-    _.forEach(descriptionConfiguration, function(value) {
-      if (value.type === 'string') {
-        stringsArray.push(value.content);
-      } else if (value.type === 'keyValue') {
-        if (value.keyType === 'string') {
-          stringsArray.push(util.format('%s: %s', value.key, value.keyContent));
-        } else if (value.keyType === 'variable' && value.variableName) {
-          var prop = getValueFromPropertyName(event, value.variableName, salesforceData);
-          if (prop) {
-            stringsArray.push(util.format('%s: %s', value.key, prop.toString()));
-          }
-        } else if (value.keyType === 'customVariable') {
-          variables[value.Variable.name] && stringsArray.push(util.format('%s: %s', value.key, variables[value.Variable.name]));
-        }
-      }
-    });
-    description = stringsArray.join('\n');
-  }
-  return description;
-}
-
-function createCustomFieldsFromConfiguration(salesforceData, event, variables) {
-  var customFields = [];
-  var fieldArray = [];
-  if (salesforceData.configuration.Field.length > 0) {
-    customFields = salesforceData.configuration.Field;
-    _.forEach(customFields, function(item) {
-      if (item.type === 'string') {
-        fieldArray.push({
-          id: item.idField,
-          value: item.content
-        });
-      } else if (item.type === 'variable') {
-        var prop = getValueFromPropertyName(event, item.variableName, salesforceData);
-        if (prop) {
-          fieldArray.push({
-            id: item.idField,
-            value: prop.toString()
-          });
-        }
-      } else if (item.type === 'customVariable') {
-        variables[item.Variable.name] && fieldArray.push({
-          id: item.idField,
-          value: variables[item.Variable.name].toString()
-        });
-      }
-    });
-  }
-  return fieldArray;
-}
-
-function handleTaskDisplay(salesforceData) {
-  return function(data) {
-    if (data && data.success) {
-      console.log('[Salesforce] Task created ', data.id);
-      salesforceData.taskId = data.id;
-      return;
-    }
-    return;
-  }
-}
-
-function handleReportIntegration(salesforceData, channel, data, integrationId) {
-  return function() {
-    delete data.id;
-    data.integration = 'salesforce';
-    data.eventChannel = channel;
-    data.exitStatus = 'success';
-    data.ticketId = salesforceData.taskId;
-    data.integrationId = integrationId;
-    data.url = util.format('%s/%s/e', salesforceData.connection.instanceUrl, salesforceData.taskId);
-    return ReportIntegration.create(data);
-  }
-}
-
-function handleEnd(salesforceData, data, channel) {
-  return function() {
-    console.log(util.format('[Salesforce] Task %s displayed to agent %s', salesforceData.taskId, salesforceData.agent.Id));
-    salesforceData = undefined;
-    return;
-  }
-}
-
-function handleError(salesforceData, channel, data, integrationId) {
-  return function(err) {
-    console.error('[Salesforce] Error in task creation');
-    console.error('[Salesforce] Message:', err.message);
-    console.error('[Salesforce] Stack:', err.stack);
-    salesforceData = undefined;
-
-    delete data.id;
-    data.integration = 'salesforce';
-    data.eventChannel = channel;
-    data.exitStatus = 'failed';
-    data.integrationId = integrationId;
-    ReportIntegration
-      .create(data)
-      .then(function() {
-        return;
-      })
-      .catch(function(err) {
-        console.error('[Salesforce] Error in Report integration create');
-        return;
-      });
-  }
-}
-
-function stripTrailingSlash(str) {
-  if (str.substr(-1) === '/') {
-    return str.substr(0, str.length - 1);
-  }
-  return str;
-}
-
-module.exports = Salesforce;
\ No newline at end of file
diff --git a/server/config/integrations/zendesk.js b/server/config/integrations/zendesk.js
index a96b6a6..228badc 100644
--- a/server/config/integrations/zendesk.js
+++ b/server/config/integrations/zendesk.js
@@ -1,637 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var util = require('util');
-var rp = require('request-promise');
-
-var ZendeskIntegration = require('../../models').ZendeskIntegration;
-var ZendeskConfiguration = require('../../models').ZendeskConfiguration;
-var ReportIntegration = require('../../models').ReportIntegration;
-var VoiceQueue = require('../../models').VoiceQueue;
-var VoiceExtension = require('../../models').VoiceExtension;
-var Agent = require('../../models').User;
-
-function Zendesk() {
-  console.log('Zendesk integration initialization...');
-}
-
-Zendesk.prototype.handleEvent = function(integrationId, configurationId, channel, subtype, data, variables) {
-
-  var zendeskData = {
-    uri: undefined,
-    headers: undefined,
-    agent: undefined,
-    enduser: undefined,
-    ticket: undefined,
-    configuration: undefined,
-    recordEnable: false,
-    serverURL: undefined,
-    agentName: undefined
-  };
-
-  if (!integrationId || !configurationId) {
-    console.error('Passed parameters are not enough to create a new ticket: miss IntegrationId or ConfigurationId');
-    return;
-  }
-
-  ZendeskConfiguration
-    .find({
-      where: {
-        id: configurationId,
-        AccountId: integrationId
-      },
-      include: [{
-        all: true,
-        include: [{
-          all: true
-        }]
-      }]
-    })
-    .then(handleEntityNotFound())
-    .then(handleConnection(zendeskData))
-    .then(searchMotionAgent(channel, data))
-    .then(handleMotionAgent(zendeskData))
-    .then(searchQueue(data))
-    .then(handleQueueRecordings(zendeskData, data))
-    .then(searchRoute(data))
-    .then(handleOutboundRecordings(zendeskData, data))
-    .then(searchAgent(zendeskData))
-    .then(handleAgent(zendeskData))
-    .then(searchAdmin(zendeskData))
-    .then(handleAdmin(zendeskData))
-    .then(searchEndUser(zendeskData, channel, data, subtype))
-    .then(handleEndUser(zendeskData, channel, data, subtype))
-    .then(endUserCreation(zendeskData, channel, data, subtype))
-    .then(handleEndUserCreation(zendeskData, channel, data, subtype))
-    .then(ticketCreation(zendeskData, data, variables))
-    .then(handleTicketDisplay(zendeskData))
-    .then(handleReportIntegration(zendeskData, channel, data, integrationId))
-    .then(handleEnd(zendeskData))
-    .catch(handleError(zendeskData, channel, data, integrationId));
-
-};
-
-function handleEntityNotFound() {
-  return function(entity) {
-    if (!entity) {
-      return null;
-    }
-    return entity;
-  };
-}
-
-function handleConnection(zendeskData) {
-  return function(configuration) {
-    var accConfiguration = getAccountConfiguration(configuration.ZendeskAccount);
-    zendeskData.configuration = configuration;
-    zendeskData.uri = accConfiguration.uri;
-    zendeskData.headers = accConfiguration.headers;
-    zendeskData.serverURL = configuration.ZendeskAccount.serverUrl;
-  }
-}
-
-function searchMotionAgent(channel, data) {
-  return function() {
-    return Agent
-      .scope('agent')
-      .findOne({
-        where: {
-          name: getValueFromPropertyName(data, getAgentSearchPropertyFromChannel(channel))
-        },
-        attributes: ['fullname']
-      });
-  }
-}
-
-function handleMotionAgent(zendeskData) {
-  return function(agent) {
-    if (agent && agent.fullname) {
-      zendeskData.agentName = agent.fullname;
-    }
-    return;
-  }
-}
-
-function searchQueue(data) {
-  return function() {
-    console.log('Searching Queue...');
-    if (data.queue) {
-      return VoiceQueue.findOne({
-        where: {
-          name: data.queue
-        },
-        attributes: ['name', 'monitor_format']
-      });
-    } else {
-      return;
-    }
-  }
-}
-
-function handleQueueRecordings(zendeskData, data) {
-  return function(queue) {
-    if (data.queue) {
-      if (queue && queue.monitor_format) {
-        console.log('[Zendesk] Recording enabled for the Queue', queue.name);
-        zendeskData.recordEnable = true;
-      } else {
-        zendeskData.recordEnable = false;
-        console.log('[Zendesk] Queue not found or Recording not enabled');
-      }
-    }
-    return;
-  }
-}
-
-function searchRoute(data) {
-  return function() {
-    if (data.routeId) {
-      return VoiceExtension.findOne({
-        where: {
-          id: data.routeId
-        },
-        attributes: ['id', 'record']
-      });
-    } else {
-      return;
-    }
-  }
-}
-
-function handleOutboundRecordings(zendeskData, data) {
-  return function(route) {
-    if (data.routeId) {
-      if (route && route.record) {
-        console.log('[Zendesk] Recording enabled for the Route Outbound', route.id);
-        zendeskData.recordEnable = true;
-      } else {
-        zendeskData.recordEnable = false;
-        console.log('[Zendesk] Route Outbound not found or Recording not enabled');
-      }
-    }
-    return;
-  }
-}
-
-function getAccountConfiguration(account) {
-  var authJson = {
-    uri: stripTrailingSlash(account.remoteUri),
-    headers: {
-      'Authorization': undefined,
-      'Content-Type': 'application/json',
-      'Accept': 'application/json'
-    }
-  };
-  var auth = account.username;
-  if (account.authType === 'password') {
-    auth = auth + ':' + account.password;
-  } else if (account.authType === 'token') {
-    auth = auth + '/token:' + account.token;
-  }
-  authJson.headers.Authorization = 'Basic ' + new Buffer(auth).toString('base64');
-  return authJson;
-}
-
-function searchAgent(zendeskData) {
-  return function() {
-    console.log('[Zendesk] Agent to search:', zendeskData.agentName);
-    return rp({
-      uri: zendeskData.uri + '/search.json',
-      qs: {
-        // 'query': "type:user role:agent name:Andrea Bianco"
-        'query': util.format("type:user role:agent name:%s", zendeskData.agentName)
-      },
-      headers: zendeskData.headers,
-      json: true
-    });
-  }
-}
-
-function getAgentSearchPropertyFromChannel(channel) {
-  var property = '';
-  if (channel) {
-    switch (channel) {
-      case 'voice':
-        property = 'membername';
-        break;
-      default:
-        property = 'membername';
-        console.error('Channel not recognized:', channel);
-    }
-  }
-  return property;
-}
-
-function getValueFromPropertyName(data, property, zendeskData) {
-  if (property === 'recordingURL') {
-    if (zendeskData && zendeskData.recordEnable && zendeskData.serverURL) {
-      return util.format('%s/api/voice/recordings/%s/download?type=uniqueid', stripTrailingSlash(zendeskData.serverURL), data.uniqueid);
-    } else {
-      return null;
-    }
-  } else {
-    return _.result(data, property);
-  }
-}
-
-function handleAgent(zendeskData) {
-  return function(data) {
-    if (data.results.length > 0 && data.count > 0) {
-      console.log('[Zendesk] Agent found:', zendeskData.agentName);
-      zendeskData.agent = getMatchObject(data.results, 'name', zendeskData.agentName);
-      return zendeskData.agent;
-    }
-    return;
-  }
-}
-
-function getMatchObject(collection, property, valueToSearch) {
-  var valueFound = _.find(collection, {
-    property: valueToSearch
-  });
-  if (valueFound) {
-    return valueFound;
-  }
-  return _.first(collection);
-}
-
-function searchAdmin(zendeskData) {
-  return function(data) {
-    if (data) {
-      return;
-    }
-    console.log('[Zendesk] Agent not found. Use the admin account');
-    return rp({
-      uri: zendeskData.uri + '/users/me.json',
-      headers: zendeskData.headers,
-      json: true
-    });
-  }
-}
-
-function handleAdmin(zendeskData) {
-  return function(data) {
-    if (!data) {
-      return;
-    }
-    if (data.user) {
-      console.log('[Zendesk] Admin selected');
-      zendeskData.agent = data.user;
-    }
-    return;
-  }
-}
-
-function searchEndUser(zendeskData, channel, data, subtype) {
-  return function() {
-    console.log('[Zendesk] End User to search:', getValueFromPropertyName(data, getEndUserSearchPropertyFromChannel(channel, subtype)));
-    return rp({
-      uri: zendeskData.uri + '/search.json',
-      qs: {
-        'query': util.format("type:user role:end-user %s:%s", getEndUserSearchQueryFromChannel(channel), getValueFromPropertyName(data, getEndUserSearchPropertyFromChannel(channel, subtype)))
-      },
-      headers: zendeskData.headers,
-      json: true
-    });
-  }
-}
-
-function getEndUserSearchQueryFromChannel(channel) {
-  var property = '';
-  if (channel) {
-    switch (channel) {
-      case 'voice':
-        property = 'phone';
-        break;
-      default:
-        property = 'phone';
-        console.error('Channel not recognized:', channel);
-    }
-  }
-  return property;
-}
-
-function getEndUserSearchPropertyFromChannel(channel, subtype) {
-  var property = '';
-  if (channel) {
-    switch (channel) {
-      case 'voice':
-        if (subtype === 'outbound') {
-          property = 'destcalleridnum';
-        } else if (subtype === 'queue') {
-          property = 'calleridnum';
-        }
-        break;
-      default:
-        property = 'calleridnum';
-        console.error('Channel not recognized:', channel);
-    }
-  }
-  return property;
-}
-
-function getEndUserNamePropertyFromChannel(channel, subtype) {
-  var property = '';
-  if (channel) {
-    switch (channel) {
-      case 'voice':
-        if (subtype === 'outbound') {
-          property = 'destcalleridname';
-        } else if (subtype === 'queue') {
-          property = 'calleridname';
-        }
-        break;
-      default:
-        property = 'calleridname';
-        console.error('Channel not recognized:', channel);
-    }
-  }
-  return property;
-}
-
-function handleEndUser(zendeskData, channel, event, subtype) {
-  return function(data) {
-    if (data.results.length > 0 && data.count > 0) {
-      console.log('[Zendesk] End User found:', getValueFromPropertyName(event, getEndUserSearchPropertyFromChannel(channel, subtype)));
-      zendeskData.enduser = data.results[0];
-      return zendeskData.enduser;
-    }
-    return;
-  }
-}
-
-function endUserCreation(zendeskData, channel, event, subtype) {
-  return function(data) {
-    if (data) {
-      return;
-    }
-    console.log('[Zendesk] End User not found:', getValueFromPropertyName(event, getEndUserSearchPropertyFromChannel(channel, subtype)));
-    console.log(getJsonForEndUserCreation(channel, event, subtype));
-    return rp({
-      uri: zendeskData.uri + '/users.json',
-      method: 'POST',
-      body: {
-        user: getJsonForEndUserCreation(channel, event, subtype)
-      },
-      headers: zendeskData.headers,
-      json: true
-    });
-  }
-}
-
-function getJsonForEndUserCreation(channel, data, subtype) {
-  var user = {
-    role: 'end-user'
-  };
-
-  switch (channel) {
-    case 'voice':
-      if (subtype === 'queue') {
-        if (isValidName(data.calleridname)) {
-          user.name = getValueFromPropertyName(data, getEndUserNamePropertyFromChannel(channel, subtype));
-        } else {
-          user.name = util.format('Caller - %s', getValueFromPropertyName(data, getEndUserSearchPropertyFromChannel(channel, subtype)))
-        }
-      } else if (subtype === 'outbound') {
-        if (isValidName(data.destcalleridname)) {
-          user.name = getValueFromPropertyName(data, getEndUserNamePropertyFromChannel(channel, subtype));
-        } else {
-          user.name = util.format('Caller - %s', getValueFromPropertyName(data, getEndUserSearchPropertyFromChannel(channel, subtype)))
-        }
-      }
-      user.phone = getValueFromPropertyName(data, getEndUserSearchPropertyFromChannel(channel, subtype));
-      break;
-    default:
-      console.error('Channel not recognized:', channel);
-  }
-
-  return user;
-}
-
-function isValidName(name) {
-  return name && name !== '<unknown>';
-}
-
-function handleEndUserCreation(zendeskData, channel, event, subtype) {
-  return function(data) {
-    if (!data) {
-      return;
-    }
-    if (data.user) {
-      console.log('[Zendesk] End User created:', getValueFromPropertyName(event, getEndUserSearchPropertyFromChannel(channel, subtype)));
-      zendeskData.enduser = data.user;
-    }
-    return;
-  }
-}
-
-function ticketCreation(zendeskData, event, variables) {
-  return function() {
-    var ticketBody = {
-      //Standard Field
-      requester_id: zendeskData.agent.id,
-      submitter_id: zendeskData.enduser.id,
-      assignee_id: zendeskData.enduser.id,
-      //Tag
-      tags: createTagsFromConfiguration(zendeskData),
-      //Configurated Field
-      subject: createSubjectFromConfiguration(zendeskData, event, variables),
-      description: createDescriptionFromConfiguration(zendeskData, event, variables),
-      custom_fields: createCustomFieldsFromConfiguration(zendeskData, event, variables)
-    };
-    var fields = createFieldsFromConfiguration(zendeskData);
-    if (fields.length > 0) {
-      _.forEach(fields, function(item) {
-        ticketBody[item.id] = item.value;
-      });
-    }
-    console.log('[Zendesk] Ticket body:', ticketBody);
-    return rp({
-      uri: zendeskData.uri + '/tickets.json',
-      method: 'POST',
-      body: {
-        ticket: ticketBody
-      },
-      headers: zendeskData.headers,
-      json: true
-    });
-  }
-}
-
-function createTagsFromConfiguration(zendeskData) {
-  var tags = [];
-  if (zendeskData.configuration.Tags.length > 0) {
-    tags = _.map(zendeskData.configuration.Tags, 'name');
-  }
-  return tags;
-}
-
-function createSubjectFromConfiguration(zendeskData, event, variables) {
-  var subject = '';
-  var stringsArray = [];
-  if (zendeskData.configuration.Subject.length > 0) {
-    var subjectConfiguration = _.sortBy(zendeskData.configuration.Subject, ['id']);
-    _.forEach(subjectConfiguration, function(value) {
-      if (value.type === 'string') {
-        stringsArray.push(value.content);
-      } else if (value.type === 'variable' && value.variableName) {
-        var prop = getValueFromPropertyName(event, value.variableName, zendeskData);
-        if (prop) {
-          stringsArray.push(prop.toString());
-        }
-      } else if (value.type === 'customVariable') {
-        variables[value.Variable.name] && stringsArray.push(variables[value.Variable.name].toString());
-      }
-    });
-    subject = stringsArray.join(' ');
-  }
-  return subject;
-}
-
-function createDescriptionFromConfiguration(zendeskData, event, variables) {
-  var description = '';
-  var stringsArray = [];
-  if (zendeskData.configuration.Description.length > 0) {
-    var descriptionConfiguration = _.sortBy(zendeskData.configuration.Description, ['id']);
-    _.forEach(descriptionConfiguration, function(value) {
-      if (value.type === 'string') {
-        stringsArray.push(value.content);
-      } else if (value.type === 'keyValue') {
-        if (value.keyType === 'string') {
-          stringsArray.push(util.format('%s: %s', value.key, value.keyContent));
-        } else if (value.keyType === 'variable' && value.variableName) {
-          var prop = getValueFromPropertyName(event, value.variableName, zendeskData);
-          if (prop) {
-            stringsArray.push(util.format('%s: %s', value.key, prop.toString()));
-          }
-        } else if (value.keyType === 'customVariable') {
-          variables[value.Variable.name] && stringsArray.push(util.format('%s: %s', value.key, variables[value.Variable.name]));
-        }
-      }
-    });
-    description = stringsArray.join('\n');
-  }
-  return description;
-}
-
-function createCustomFieldsFromConfiguration(zendeskData, event, variables) {
-  var customFields = [];
-  var fieldArray = [];
-  if (zendeskData.configuration.Field.length > 0) {
-    customFields = _.filter(zendeskData.configuration.Field, {
-      'customField': true
-    });
-    _.forEach(customFields, function(item) {
-      if (item.type === 'string') {
-        fieldArray.push({
-          id: item.idField,
-          value: item.content
-        });
-      } else if (item.type === 'variable') {
-        var prop = getValueFromPropertyName(event, item.variableName, zendeskData);
-        if (prop) {
-          fieldArray.push({
-            id: item.idField,
-            value: prop.toString()
-          });
-        }
-      } else if (item.type === 'customVariable') {
-        variables[item.Variable.name] && fieldArray.push({
-          id: item.idField,
-          value: variables[item.Variable.name].toString()
-        });
-      }
-    });
-  }
-  return fieldArray;
-}
-
-function createFieldsFromConfiguration(zendeskData) {
-  var fields = [];
-  var fieldArray = [];
-  if (zendeskData.configuration.Field.length > 0) {
-    fields = _.filter(zendeskData.configuration.Field, {
-      'customField': false
-    });
-    _.forEach(fields, function(item) {
-      if (item.type === 'string') {
-        fieldArray.push({
-          id: item.nameField,
-          value: item.content
-        });
-      }
-    });
-  }
-  return fieldArray;
-}
-
-function handleTicketDisplay(zendeskData) {
-  return function(data) {
-    if (data.ticket) {
-      console.log('[Zendesk] Ticket created');
-      zendeskData.ticket = data.ticket;
-      var urlDisplay = util.format('/channels/voice/agents/%d/tickets/%d/display.json', zendeskData.agent.id, zendeskData.ticket.id);
-      return rp({
-        uri: zendeskData.uri + urlDisplay,
-        method: 'POST',
-        headers: zendeskData.headers,
-        json: true
-      });
-    }
-    return;
-  }
-}
-
-function handleReportIntegration(zendeskData, channel, data, integrationId) {
-  return function() {
-    delete data.id;
-    data.integration = 'zendesk';
-    data.eventChannel = channel;
-    data.exitStatus = 'success';
-    data.ticketId = zendeskData.ticket.id;
-    data.url = zendeskData.ticket.url;
-    data.integrationId = integrationId;
-    return ReportIntegration.create(data);
-  }
-}
-
-function handleEnd(zendeskData, data, channel) {
-  return function() {
-    console.log(util.format('[Zendesk] Ticket %d displayed to agent %d', zendeskData.ticket.id, zendeskData.agent.id));
-    zendeskData = undefined;
-    return;
-  }
-}
-
-function handleError(zendeskData, channel, data, integrationId) {
-  return function(err) {
-    console.error('[Zendesk] Error in ticket creation');
-    console.error('[Zendesk] Message:', err.message);
-    console.error('[Zendesk] Stack:', err.stack);
-    zendeskData = undefined;
-
-    delete data.id;
-    data.integration = 'zendesk';
-    data.eventChannel = channel;
-    data.exitStatus = 'failed';
-    data.integrationId = integrationId;
-    ReportIntegration
-      .create(data)
-      .then(function() {
-        return;
-      })
-      .catch(function(err) {
-        console.error('[Zendesk] Error in Report integration create');
-        return;
-      });
-  }
-}
-
-function stripTrailingSlash(str) {
-  if (str.substr(-1) === '/') {
-    return str.substr(0, str.length - 1);
-  }
-  return str;
-}
-
-module.exports = Zendesk;
\ No newline at end of file
diff --git a/server/config/license/hardware.js b/server/config/license/hardware.js
index 57ddc35..9529ae0 100644
--- a/server/config/license/hardware.js
+++ b/server/config/license/hardware.js
@@ -1,59 +1 @@
-'use strict';
-/**
- * Imports
- */
-var os = require('os'),
-  crypto = require('crypto'),
-  path = require('path'),
-  machineId = require('machine-uuid'),
-  machine = require('bimedia-machine-uuid'),
-  async = require('async');
-
-
-function getInterfaces() {
-  var ifaces = [];
-  var interfaces = os.networkInterfaces();
-  for (var dev in interfaces) {
-    // ... and find the one that matches the criteria
-    var iface = interfaces[dev].filter(function(details) {
-      return details.family === 'IPv4' && details.internal === false;
-    });
-    ifaces = ifaces.concat(iface);
-  }
-
-  return ifaces;
-}
-
-/**
- * Retrieve unique MAC addresses
- *
- * @returns   {string}   array of MAC addresses
- */
-function macAddress() {
-  var ifaces = getInterfaces();
-  return (ifaces.length > 0) ? ifaces[0].mac : '00:00:00:00:00:00';
-}
-
-/**
- * Retrieve unique IP addresses
- *
- * @returns   {string}   array of IP addresses
- */
-function ipAddress() {
-  var ifaces = getInterfaces();
-  return (ifaces.length > 0) ? ifaces[0].address : '127.0.0.1';
-}
-
-/**
- * Generate the machine ID
- *
- * @param   {Bolean}    [format]    true to return a formatted ID
- * @returns {String}    machine ID
- */
-module.exports = function(format) {
-  var s = machine.uuid + '|' + macAddress() + '|' + ipAddress();
-  var ID = crypto.createHash('md5').update(s).digest('hex');
-  var FORMATTED = ID.substring(0, 8) + '-' + ID.substring(8, 12) + '-' + ID.substring(12, 16) + '-' + ID.substring(16, 20) + '-' + ID.substring(20);
-
-  return format === true ? FORMATTED : ID;
-};
\ No newline at end of file
diff --git a/server/config/license/index.js b/server/config/license/index.js
index a134cf7..39b6c4e 100644
--- a/server/config/license/index.js
+++ b/server/config/license/index.js
@@ -1,87 +1 @@
-'use strict';
-
-var rp = require('request-promise');
-var util = require('util');
-var url = require('url');
-var crypto = require('crypto');
-var moment = require('moment');
-var CronJob = require('cron').CronJob;
-var licenseService = require('./license.service');
-var config = require('../environment');
-var License = require('../../models').License;
-var session = require('../environment').session;
-
-const expirationTh = 7;
-
-// Define the factory
-function licenseManager() {
-  // Store the settings in a closure
-  var job = new CronJob({
-    cronTime: '* * * * *',
-    onTick: function() {
-
-      return License
-        .findOrCreate({
-          where: {
-            id: 1
-          }
-        })
-        .spread(function(license) {
-          var data = {};
-
-          if (license.data2) {
-            var decipher = crypto.createDecipher('aes-256-ctr', session.secret);
-            var dec = decipher.update(license.data2, 'base64', 'utf8')
-            dec += decipher.final('utf8');
-
-            if (moment().diff(dec, 'days') > expirationTh) {
-              data.data1 = licenseService.getUuid();
-              data.data2 = null;
-            }
-          }
-
-          if (!license.data1) {
-            // No token saved
-            data.data1 = licenseService.getUuid();
-          } else {
-            // Token saved
-            if ((data.data1 !== licenseService.getUuid()) && !license.data2) {
-
-              var cipher = crypto.createCipher('aes-256-ctr', session.secret);
-              data.data2 = cipher.update(moment().format("YYYY-MM-DD HH:mm"), 'utf8', 'base64');
-              // moment().format("YYYY-MM-DD HH:mm")
-              data.data2 += cipher.final('base64');
-            }
-          }
-
-          return license
-            .update(data)
-            .then(function(data) {
-              return rp({
-                uri: config.provisioning + '/servers/' + licenseService.getUuid() + '/check',
-                json: true // Automatically stringifies the body to JSON
-              });
-            })
-            .then(function(data) {
-              if (license.data1 === data.uuid) {
-                return license
-                  .update({
-                    license: data.license,
-                    data2: null
-                  });
-              }
-            });
-        })
-        .catch(function(err) {
-          console.error(err);
-        });
-    },
-    start: true
-  });
-
-  job.start();
-
-  return {};
-}
-
-module.exports = licenseManager;
\ No newline at end of file
diff --git a/server/config/license/license.service.js b/server/config/license/license.service.js
index 8a052d0..e5c8793 100644
--- a/server/config/license/license.service.js
+++ b/server/config/license/license.service.js
@@ -1,365 +1 @@
-'use strict';
-
-var compose = require('composable-middleware');
-var moment = require('moment');
-var crypto = require('crypto');
-var util = require('util');
-var os = require('os');
-var exec = require('child_process').execSync;
-var config = require('../environment');
-
-var User = require('../../models').User;
-var Telephone = require('../../models').Telephone;
-var Setting = require('../../models').Setting;
-var License = require('../../models').License;
-
-var demoLicense = {
-  users: 1,
-  agents: 1,
-  telephones: 0,
-  chat: false,
-  mail: false,
-  fax: false,
-  jscripty: false,
-  messaging: false,
-  openchannel: false,
-  custom: false,
-  cm: false,
-  dialer: false,
-  update: false,
-  description: 'DEMO LICENSE'
-};
-
-function getUuid() {
-  switch (os.platform()) {
-    case 'win32':
-      return exec('dmidecode --string system-uuid', {
-        encoding: 'utf8'
-      }).replace('\r\n', '');
-    default:
-
-      return require('./hardware')(true);
-  }
-}
-
-/**
- * Checks if the chat meets the requirements
- */
-
-function checkLicense(type) {
-  return compose()
-    .use(function(req, res, next) {
-      return License
-        .findOrCreate({
-          where: {
-            id: 1
-          }
-        })
-        .spread(function(license) {
-          var _license = null;
-          var validLicense = false;
-
-          try {
-            if (license.license) {
-              _license = decrypt(license.license, license.data1);
-              _license = JSON.parse(_license);
-            } else {
-              _license = demoLicense;
-            }
-          } catch (err) {
-            console.log('decrypt error', err);
-            _license = demoLicense;
-          }
-
-          validLicense = _license[type];
-
-          if (!validLicense) return res.sendStatus(403);
-          return next();
-        })
-        .catch(function(err) {
-          return next(err);
-        });
-    });
-
-}
-
-function hasChat() {
-  return checkLicense('chat');
-}
-
-/**
- * Checks if the sms meets the requirements
- */
-function hasSms() {
-  return checkLicense('messaging');
-}
-
-/**
- * Checks if the cm meets the requirements
- */
-function hasCm() {
-  return checkLicense('cm');
-}
-
-/**
- * Checks if the update meets the requirements
- */
-function hasUpdate() {
-  return checkLicense('update');
-}
-
-/**
- * Checks if the mail meets the requirements
- */
-function hasMail() {
-  return checkLicense('mail');
-}
-
-/**
- * Checks if the fax meets the requirements
- */
-function hasFax() {
-  return checkLicense('fax');
-}
-
-/**
- * Checks if the jscripty meets the requirements
- */
-function hasJscripty() {
-  return checkLicense('jscripty');
-}
-
-function hasCustom() {
-  return checkLicense('custom');
-}
-
-/**
- * Checks if the openchannel meets the requirements
- */
-function hasOpenchannel() {
-  return checkLicense('openchannel');
-}
-
-/**
- * Checks if the date meets the requirements
- */
-function isValidDate() {
-  return compose()
-    .use(function(req, res, next) {
-      return License
-        .findOrCreate({
-          where: {
-            id: 1
-          }
-        })
-        .spread(function(license) {
-          var _license = null,
-            date = false;
-
-          try {
-            if (license.license) {
-              _license = decrypt(license.license, license.data1);
-              _license = JSON.parse(_license);
-
-              if (moment().isSameOrBefore(_license.expiration)) {
-                date = true;
-              }
-            }
-          } catch (err) {
-            console.log('decrypt error', err);
-          }
-
-          if (!date) return res.sendStatus(403);
-          return next();
-        })
-        .catch(function(err) {
-          return next(err);
-        });
-    });
-}
-
-/**
- * Checks if the users meets the requirements
- */
-function isUsersLimit() {
-  return compose()
-    .use(function(req, res, next) {
-      var license;
-
-      return License
-        .findOrCreate({
-          where: {
-            id: 1
-          }
-        })
-        .spread(function(myLicense) {
-          license = myLicense;
-
-          return User
-            .count({
-              where: {
-                $or: [{
-                  role: 'admin'
-                }, {
-                  role: 'user'
-                }]
-              }
-            });
-        })
-        .then(function(users) {
-          var _license = null,
-            valid = false;
-          try {
-            if (license.license) {
-              _license = decrypt(license.license, license.data1);
-              _license = JSON.parse(_license);
-            } else {
-              _license = demoLicense;
-            }
-          } catch (err) {
-            console.log('decrypt error', err);
-            _license = demoLicense;
-          }
-
-          if (_license.users > users) valid = true;
-
-          if (!valid) return res.status(403).send({
-            message: 'Maximum users limit have been reached'
-          });
-          return next();
-        })
-        .catch(function(err) {
-          return next(err);
-        });
-    });
-}
-
-/**
- * Checks if the telephone meets the requirements
- */
-function isTelephonesLimit() {
-  return compose()
-    .use(function(req, res, next) {
-      var license;
-
-      return License
-        .findOrCreate({
-          where: {
-            id: 1
-          }
-        })
-        .spread(function(myLicense) {
-          license = myLicense;
-
-          return User
-            .count({
-              where: {
-                role: 'telephone'
-              }
-            });
-        })
-        .then(function(telephones) {
-          var _license = null,
-            valid = false;
-          try {
-            if (license.license) {
-              _license = decrypt(license.license, license.data1);
-              _license = JSON.parse(_license);
-            } else {
-              _license = demoLicense;
-            }
-          } catch (err) {
-            console.log('decrypt error', err);
-            _license = demoLicense;
-          }
-
-          if (_license.telephones > telephones) valid = true;
-
-          if (!valid) return res.status(403).send({
-            message: 'Maximum telephones limit have been reached'
-          });
-          return next();
-        })
-        .catch(function(err) {
-          return next(err);
-        });
-    });
-}
-
-/**
- * Checks if the telephone meets the requirements
- */
-function isValidAgent() {
-  return function(user) {
-    var license;
-    var _valid = false;
-
-    if (user.role === 'admin' || user.role === 'user' || (user.role === 'agent' && user.online)) {
-      _valid = true;
-    }
-
-    return License
-      .findOrCreate({
-        where: {
-          id: 1
-        }
-      })
-      .spread(function(myLicense) {
-        license = myLicense;
-
-        return User
-          .count({
-            where: {
-              role: 'agent',
-              online: true
-            }
-          });
-      })
-      .then(function(agents) {
-        var _license = null;
-        try {
-          if (license.license) {
-            _license = decrypt(license.license, license.data1);
-            _license = JSON.parse(_license);
-          } else {
-            _license = demoLicense;
-          }
-        } catch (err) {
-          console.log('decrypt error', err);
-          _license = demoLicense;
-        }
-
-        if (_license.agents > agents) _valid = true;
-
-        return _valid;
-      });
-  }
-}
-
-function decrypt(cypher, uuid) {
-  // var uuid = getUuid();
-  var prefix = uuid.split('-')[4];
-  var suffix = uuid.split('-')[0];
-
-  var decipher = crypto.createDecipher('aes-256-ctr', util.format('%s:%s:%s', prefix, uuid, suffix));
-  var license = decipher.update(cypher, 'base64', 'utf8')
-  license += decipher.final('utf8');
-
-  return license;
-}
-
-exports.getUuid = getUuid;
-exports.isValidDate = isValidDate;
-exports.isUsersLimit = isUsersLimit;
-exports.isTelephonesLimit = isTelephonesLimit;
-exports.hasChat = hasChat;
-exports.hasMail = hasMail;
-exports.hasFax = hasFax;
-exports.hasOpenchannel = hasOpenchannel;
-exports.hasSms = hasSms;
-exports.hasJscripty = hasJscripty;
-exports.hasCm = hasCm;
-exports.hasUpdate = hasUpdate;
-exports.isValidAgent = isValidAgent;
-exports.demoLicense = demoLicense;
-exports.decrypt = decrypt;
\ No newline at end of file
diff --git a/server/config/local.env.sample.js b/server/config/local.env.sample.js
index 58ae668..114f9ff 100644
--- a/server/config/local.env.sample.js
+++ b/server/config/local.env.sample.js
@@ -1,23 +1 @@
-'use strict';
-
-// Use local.env.js for environment variables that grunt will set when the server starts locally.
-// Use for your api keys, secrets, etc. This file should not be tracked by git.
-//
-// You will need to set these on the server you deploy to.
-
-module.exports = {
-  DOMAIN:           'http://localhost:9000',
-  SESSION_SECRET:   'xcallyshuttle-secret',
-
-  FACEBOOK_ID:      'app-id',
-  FACEBOOK_SECRET:  'secret',
-
-  TWITTER_ID:       'app-id',
-  TWITTER_SECRET:   'secret',
-
-  GOOGLE_ID:        'app-id',
-  GOOGLE_SECRET:    'secret',
-
-  // Control debug level for modules using visionmedia/debug
-  DEBUG: ''
-};
\ No newline at end of file
diff --git a/server/config/logger.js b/server/config/logger.js
index 1542f7e..3f9d87a 100644
--- a/server/config/logger.js
+++ b/server/config/logger.js
@@ -1,120 +1 @@
-var winston = require('winston');
-var path = require('path');
-var config = require('./environment');
-
-winston.emitErrs = true;
-
-var debug = new winston.Logger({
-  transports: [
-    new winston.transports.Console({
-      level: 'debug',
-      handleExceptions: true,
-      json: false,
-      colorize: true
-    })
-  ]
-});
-
-if (config.logging.debugToFile) {
-  debug.add(
-    winston.transports.File, {
-      name: 'debug-file',
-      level: 'debug',
-      filename: config.logging.debug,
-      handleExceptions: true,
-      json: true,
-      maxsize: 5242880, //5MB
-      maxFiles: 5,
-      colorize: false
-    }
-  );
-}
-
-var info = new winston.Logger({
-  transports: [
-    new winston.transports.File({
-      name: 'info-file',
-      level: 'info',
-      filename: config.logging.info,
-      handleExceptions: true,
-      json: true,
-      maxsize: 5242880, //5MB
-      maxFiles: 5,
-      colorize: false
-    }),
-    new winston.transports.Console({
-      level: 'info',
-      handleExceptions: true,
-      json: false,
-      colorize: true
-    })
-  ]
-});
-
-var warn = new winston.Logger({
-  transports: [
-    new winston.transports.File({
-      name: 'warn-file',
-      level: 'warn',
-      filename: config.logging.warn,
-      handleExceptions: true,
-      json: true,
-      maxsize: 5242880, //5MB
-      maxFiles: 5,
-      colorize: false
-    }),
-    new winston.transports.Console({
-      level: 'warn',
-      handleExceptions: true,
-      json: false,
-      colorize: true
-    })
-  ]
-});
-
-var error = new winston.Logger({
-  transports: [
-    new winston.transports.File({
-      name: 'error-file',
-      level: 'error',
-      filename: config.logging.error,
-      handleExceptions: true,
-      json: true,
-      maxsize: 5242880, //5MB
-      maxFiles: 5,
-      colorize: false
-    }),
-    new winston.transports.Console({
-      level: 'error',
-      handleExceptions: true,
-      json: false,
-      colorize: true
-    })
-  ]
-});
-
-var loggers = {
-  debug: function(msg, callback) {
-    debug.debug(msg, callback);
-  },
-  info: function(msg, callback) {
-    info.info(msg, callback);
-  },
-  warn: function(msg, callback) {
-    warn.warn(msg, callback);
-  },
-  error: function(msg, callback) {
-    error.error(msg, callback);
-  },
-  log: function(level, msg, callback) {
-    var lvl = exports[level];
-    lvl(msg, callback);
-  }
-};
-
-module.exports = loggers;
-module.exports.stream = {
-  write: function(message, encoding) {
-    loggers.info(message);
-  }
-};
\ No newline at end of file
diff --git a/server/config/openchannel/custom.js b/server/config/openchannel/custom.js
index ba3c589..1d721e4 100644
--- a/server/config/openchannel/custom.js
+++ b/server/config/openchannel/custom.js
@@ -1,274 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var Promise = require('bluebird');
-var Util = require('../util');
-var moment = require('moment');
-var path = require('path');
-var util = require('util');
-var fs = require('fs');
-var Agent = require('../../models').User;
-var OpenchannelRoom = require('../../models').OpenchannelRoom;
-var OpenchannelMessage = require('../../models').OpenchannelMessage;
-var OpenchannelAccount = require('../../models').OpenchannelAccount;
-var ReportOpenchannel = require('../../models').ReportOpenchannel;
-var Action = require('../../models').Action;
-var path = require('path');
-var fs = require('fs');
-var Contact = require('../../models').Contact;
-
-
-var Scheduler = require('../routing/scheduler');
-
-function Custom() {
-  console.log('open channel Initialization...');
-  this.account = null;
-}
-
-Custom.prototype.init = function(doc) {
-  var self = this;
-  console.log("Open channel - Account " + doc.name + " CREATE");
-  self.account = doc;
-  OpenchannelAccount.afterUpdate(function(doc) {
-    if (self.account && doc.id === self.account.id) {
-      self.onUpdate(doc);
-    }
-  });
-  ReportOpenchannel.afterUpdate(function(doc) {
-    if (self.account && doc.accountid == self.account.id) {
-      if (doc.changed('connectid')) {
-        self.webhook(doc, 'accept');
-      }
-      if (doc.changed('rejectedAt')) {
-        self.webhook(doc, 'reject');
-      }
-    }
-  });
-  OpenchannelRoom.afterUpdate(function(doc) {
-    if (self.account && doc.OpenchannelAccountId == self.account.id) {
-      if (doc.changed('status') && doc.status === 'CLOSED') {
-        self.webhook(doc, 'close');
-      }
-    }
-  })
-  OpenchannelAccount.afterDestroy(function(doc) {
-    if (self.account && doc.id === self.account.id) {
-      self.onRemove(doc);
-    }
-  });
-  OpenchannelMessage.afterCreate(function(doc, opt) {
-
-    if (self.account && self.account.id == doc.dataValues.OpenchannelAccountId) {
-
-      if (doc.status === 'RECEIVED') {
-        var scheduler = new Scheduler({
-          channel: 'openchannel',
-          uniqueid: util.format('%s.%s', moment().unix(), doc.OpenchannelRoomId),
-          messageid: doc.id,
-          roomid: doc.OpenchannelRoomId,
-          accountid: self.account.id,
-          accountname: self.account.name,
-          from: doc.from
-        })
-
-        scheduler.init();
-      }
-
-      self.onSend(doc, opt);
-    }
-  });
-};
-
-Custom.prototype.onUpdate = function(doc) {
-  if (!doc.changed('state')) {
-    console.log("Open channel - Account " + doc.name + " UPDATE");
-    this.account = null;
-    this.account = doc;
-  }
-}
-
-Custom.prototype.onRemove = function(doc) {
-  console.log("[Open channel - Account " + doc.name + " DESTROY");
-  this.account = null;
-}
-
-Custom.prototype.onSend = function(Message, opt) {
-  // var self = this;
-  var _Account = this.account;
-  var _mMessage = Message;
-  var _Room;
-  var _mAgent;
-
-  if (_mMessage.status === 'SENDING') {
-
-    return Promise
-      .all([])
-      .then(getRoom(_mMessage))
-      .then(function(Room) {
-        _Room = Room;
-        return _mMessage
-          .setOpenchannelRoom(Room.id);
-      })
-      .then(function() {
-        return _Room
-          .updateAttributes({
-            status: 'PENDING',
-            lastEvent: 'SENDING',
-            lastEventAt: moment().format('YYYY-MM-DD HH:mm:ss'),
-            openchannelOut: ++_Room.openchannelOut
-          }, {
-            individualHooks: true,
-            user: opt.user
-          });
-      })
-      .then(function(message) {
-        return Agent.
-        findById(_mMessage.UserId);
-      })
-      .then(function(mAgent) {
-        _mAgent = mAgent;
-        return _Room
-          .addUser(_mAgent);
-      })
-      .then(function() {
-        console.log("SENDING Message...");
-        if (_Account.replyMethod && _Account.replyUrl) {
-          var message = {
-            from: _mMessage.from,
-            to: _mMessage.to,
-            body: _mMessage.body,
-            UserId: _mMessage.UserId,
-            OpenchannelAccountId: _mMessage.OpenchannelAccountId,
-            OpenchannelRoomId: _mMessage.OpenchannelRoomId
-          };
-          return Util
-            .sendRequest(message, _Account.replyMethod, _Account.replyUrl)
-        } else {
-          throw {
-            name: "ERROR",
-            message: " Account HTTP Method or URL is not configured. Contact your administrator!!"
-          };
-
-        }
-      })
-      .then(function(res) {
-        // console.log('response', res);
-        console.log(" Message SENT...");
-        return _mMessage
-          .update({
-            status: 'SENT',
-            res_data: JSON.stringify(res)
-          })
-      })
-      .then(function() {
-        return _Room
-          .updateAttributes({
-            lastEvent: 'SENT',
-            lastEventAt: moment().format('YYYY-MM-DD HH:mm:ss')
-          });
-      })
-      .catch(function(err) {
-        console.log('err', err);
-        _mMessage
-          .update({
-            status: 'FAILED',
-            res_data: JSON.stringify(err)
-          })
-          .then(function() {
-            return _Room
-              .updateAttributes({
-                lastEvent: 'FAILED',
-                lastEventAt: moment().format('YYYY-MM-DD HH:mm:ss')
-              });
-          })
-          .catch(function(err) {
-            console.log('Error updating error status');
-          });
-
-      })
-  }
-}
-
-function getRoom(_mMessage) {
-  return function() {
-    if (_mMessage.OpenchannelRoomId) {
-      return OpenchannelRoom
-        .findById(_mMessage.OpenchannelRoomId)
-    } else {
-      return OpenchannelRoom
-        .findAll({
-          limit: 1,
-          where: {
-            contact: _mMessage.to,
-            OpenchannelAccountId: _mMessage.OpenchannelAccountId
-          },
-          order: [
-            ['createdAt', 'DESC']
-          ]
-        })
-        .then(function(room) {
-          var room = room[0];
-          if (!room || room.status === 'CLOSED') {
-            var parentID = room ? room.id : null;
-            return OpenchannelRoom
-              .create({
-                contact: _mMessage.to,
-                OpenchannelAccountId: _mMessage.OpenchannelAccountId,
-                status: 'PENDING',
-                ParentId: parentID
-              })
-          }
-          return room;
-        })
-    }
-
-  }
-}
-
-
-function execRequest(doc, method, url) {
-  Util.sendRequest(doc, method, url)
-    .then(function(values) {
-      console.log('request successeful!');
-
-    })
-    .catch(function(err) {
-      console.log('request failed!');
-
-    })
-}
-Custom.prototype.webhook = function(doc, hook) {
-  var _Account = this.account;
-
-  switch (hook) {
-    case 'accept':
-      if (_Account.acceptMethod && _Account.acceptUrl) {
-        console.log('Openchannel account <' + _Account.name + '> executing accept webhook');
-        execRequest(doc.dataValues, _Account.acceptMethod, _Account.acceptUrl);
-      }
-      if (_Account.actions.length) {
-        _.forEach(_Account.actions, function(action) {
-          if (action.enabled) {
-            Util.execAction(action, doc);
-          }
-        })
-      }
-      break;
-    case 'reject':
-      if (_Account.rejectMethod && _Account.rejectUrl) {
-        console.log('Openchannel account <' + _Account.name + '> executing reject webhook');
-        execRequest(doc.dataValues, _Account.rejectMethod, _Account.rejectUrl);
-      }
-      break;
-    case 'close':
-      if (_Account.closeMethod && _Account.closeUrl) {
-        console.log('Openchannel account <' + _Account.name + '> executing close webhook');
-        execRequest(doc.dataValues, _Account.closeMethod, _Account.closeUrl);
-      }
-      break;
-    default:
-      console.log('Webhook not recognized');
-  }
-}
-
-module.exports = Custom;
\ No newline at end of file
diff --git a/server/config/openchannel/index.js b/server/config/openchannel/index.js
index f6a56c3..cd74eb0 100644
--- a/server/config/openchannel/index.js
+++ b/server/config/openchannel/index.js
@@ -1,23 +1 @@
-'use strict';
-var OpenchannelAccount = require('../../models').OpenchannelAccount;
-var Custom = require('./custom');
-
-
-module.exports = function() {
-  OpenchannelAccount.afterCreate(function(server) {
-    var custom = new Custom();
-    custom.init(server);
-  });
-
-  return OpenchannelAccount
-    .findAll()
-    .then(function(accounts) {
-      accounts.forEach(function(account) {
-        var custom = new Custom();
-        custom.init(account);
-      });
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
\ No newline at end of file
diff --git a/server/config/routing/agent.js b/server/config/routing/agent.js
index d2231e5..f64b451 100644
--- a/server/config/routing/agent.js
+++ b/server/config/routing/agent.js
@@ -1,118 +1 @@
-'use strict';
-
-const _ = require('lodash');
-const config = require('../environment');
-const structure = require('./structure');
-
-// NODEJS API
-const cp = require('child_process');
-const util = require('util');
-const moment = require('moment');
-
-// MODELS
-const User = require('../../models').User;
-
-// Define the factory
-function Agent(app, data, next) {
-  this.app = app;
-  this.data = data;
-  this.called = [];
-  this.rejected = [];
-  //callbacks
-  this.next = next;
-}
-
-Agent.prototype.init = function init() {
-  var self = this;
-  var query = {
-    where: {
-      id: self.app.UserId,
-      online: true
-    },
-    include: []
-  };
-
-  query.where[structure.labels.pauses[self.data.channel]] = false;
-  query.include.push({
-    model: structure.models.rooms[self.data.channel],
-    attributes: ['id']
-  });
-
-  return User
-    .findAll(query)
-    .then(function(agents) {
-      self._agents = agents;
-
-      console.info(self.data.channel.toUpperCase(), 'APP AGENT, INTERACTION:', self.data.uniqueid, 'TIMEOUT', self.app.timeout, 'SEC');
-
-      if (self._agents.length && available(
-          self._agents[0].online,
-          self._agents[0][structure.labels.pauses[self.data.channel]],
-          _.filter(self._agents[0][structure.labels.rooms[self.data.channel]], {
-            status: 'OPEN'
-          }),
-          self._agents[0][structure.labels.capacities[self.data.channel]])) {
-        self.writeReport();
-
-        self.timeout = setTimeout(function() {
-          self.next();
-        }, self.app.timeout * 1000);
-      } else {
-        console.info(self.data.channel.toUpperCase(), 'APP FIDELITY SKIP INTERACTION:', self.data.roomId);
-        self.next();
-      }
-    })
-    .then(function() {
-      return structure.models.rooms[self.data.channel]
-        .update({
-          waiting: true
-        }, {
-          where: {
-            id: self.data.roomid,
-          },
-          individualHooks: true
-        })
-        .then(function() {
-          console.log('AGENT ACTION STARTED');
-        })
-        .catch(function(err) {
-          console.error();
-        });
-    });
-}
-
-Agent.prototype.writeReport = function writeReport() {
-  var self = this;
-  var values = _.map(self._agents, function(agent) {
-    return _.merge(self.data, {
-      timeslot: self.app.timeout,
-      application: 'agent',
-      membername: agent.name,
-      memberid: agent.id,
-      calledAt: moment().format("YYYY-MM-DD HH:mm:ss"),
-      joinAt: moment().format("YYYY-MM-DD HH:mm:ss")
-    });
-  });
-
-  return structure.models.sessions[self.data.channel]
-    .bulkCreate(values, {
-      individualHooks: true
-    })
-    .then(function() {
-      return structure.models.reports[self.data.channel]
-        .bulkCreate(values, {
-          individualHooks: true
-        });
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
-
-function available(online, pause, rooms, capacity) {
-  // CHECK CAPACITY
-  return online && !pause && ((rooms.length < capacity) || capacity === 0);
-}
-
-// Export this file as a module
-module.exports = Agent;
\ No newline at end of file
diff --git a/server/config/routing/fidelity.js b/server/config/routing/fidelity.js
index eef584f..0e0bd03 100644
--- a/server/config/routing/fidelity.js
+++ b/server/config/routing/fidelity.js
@@ -1,105 +1 @@
-'use strict';
-
-const _ = require('lodash');
-const config = require('../environment');
-const structure = require('./structure');
-
-// NODEJS API
-const cp = require('child_process');
-const util = require('util');
-const moment = require('moment');
-
-// MODELS
-const Agent = require('../../models').User;
-
-// Define the factory
-function Fidelity(app, data, next) {
-  this.app = app;
-  this.data = data;
-  //callbacks
-  this.next = next;
-}
-
-Fidelity.prototype.init = function init() {
-  var self = this;
-  var query = {
-    where: {
-      online: true
-    },
-    attributes: ['id', 'name', 'fullname'],
-    raw: true
-  };
-
-  query.where[structure.labels.pauses[self.data.channel]] = false;
-
-  return structure.models.rooms[self.data.channel]
-    .findById(self.data.roomid)
-    .then(function(room) {
-      return room
-        .getUsers(query);
-    })
-    .then(function(agents) {
-      self._agents = agents;
-      console.info(self.data.channel.toUpperCase(), 'APP FIDELITY INTERACTION:', self.data.roomid, 'TIMEOUT', self.app.timeout, 'SEC');
-      if (self._agents.length) {
-        self.writeReport();
-
-        self.timeout = setTimeout(function() {
-          self.next();
-        }, self.app.timeout * 1000);
-
-      } else {
-        console.info(self.data.channel.toUpperCase(), 'APP FIDELITY SKIP INTERACTION:', self.data.roomid);
-        self.next();
-      }
-    })
-    .then(function() {
-      return structure.models.rooms[self.data.channel]
-        .update({
-          waiting: true
-        }, {
-          where: {
-            id: self.data.roomid,
-          },
-          individualHooks: true
-        })
-        .then(function() {
-          console.log('FIDELITY ACTION STARTED');
-        })
-        .catch(function(err) {
-          console.error();
-        });
-    });
-}
-
-Fidelity.prototype.writeReport = function writeReport() {
-  var self = this;
-  var values = _.map(self._agents, function(agent) {
-    return _.merge(self.data, {
-      timeslot: self.app.timeout,
-      application: 'fidelity',
-      membername: agent.name,
-      memberid: agent.id,
-      calledAt: moment().format("YYYY-MM-DD HH:mm:ss"),
-      joinAt: moment().format("YYYY-MM-DD HH:mm:ss"),
-      fidelity: self.app.timeout
-    });
-  });
-
-  return structure.models.sessions[self.data.channel]
-    .bulkCreate(values, {
-      individualHooks: true
-    })
-    .then(function() {
-      return structure.models.reports[self.data.channel]
-        .bulkCreate(values, {
-          individualHooks: true
-        });
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
-
-// Export this file as a module
-module.exports = Fidelity;
\ No newline at end of file
diff --git a/server/config/routing/queue.js b/server/config/routing/queue.js
index 1cd5a73..27c21df 100644
--- a/server/config/routing/queue.js
+++ b/server/config/routing/queue.js
@@ -1,301 +1 @@
-'use strict';
-
-const _ = require('lodash');
-const config = require('../environment');
-const structure = require('./structure');
-
-// NODEJS API
-const cp = require('child_process');
-const util = require('util');
-const moment = require('moment');
-
-const Agent = require('../../models').User;
-
-// Define the factory
-function Queue(app, data, next) {
-  this.app = app;
-  this.data = data;
-  this.elapsed = 0;
-  //callbacks
-  this.next = next;
-  this.called = [];
-  this.rejected = [];
-}
-
-Queue.prototype.init = function init() {
-  var self = this;
-
-  return structure.models.queues[self.data.channel]
-    .findById(self.app[structure.labels.appQueues[self.data.channel]], {
-      attributes: ['id', 'name', 'timeout', 'strategy', 'lastAgent'],
-      include: [{
-        model: Agent,
-        attributes: ['id'],
-        order: [
-          ['penalty', 'ASC']
-        ]
-      }]
-    })
-    .then(function(queue) {
-      console.info(util.format('%s QUEUE INSTANCE FOR ACCOUNT %s', self.data.channel.toUpperCase(), self.data.accountname));
-
-      self._queue = queue;
-      self._duration = self.app.timeout;
-
-      switch (self._queue.strategy) {
-        case 'beepall':
-          console.info(self.data.channel.toUpperCase(), 'QUEUE BEEPALL STRATEGY, DURATION', self.app.timeout);
-
-          self._agents = _.values(_.groupBy(queue.Users, structure.labels.penaltyTables[self.data.channel]));
-          self.beepall();
-          break;
-        case 'roundrobin':
-          console.info(self.data.channel.toUpperCase(), 'QUEUE ROUND ROBIN STRATEGY, DURATION', self.app.timeout);
-          self._agents = queue.Users;
-          self.rr();
-          break;
-        case 'rrmemory':
-          console.info(self.data.channel.toUpperCase(), 'QUEUE RR MEMORY STRATEGY, DURATION', self.app.timeout);
-          self._agents = queue.Users;
-          if (self._queue.lastAgent) {
-            var agent;
-            for (var i = 0; i < self._agents.length; i++) {
-              agent = self._agents.shift();
-              self._agents.push(agent);
-
-              if (agent.id === self._queue.lastAgent) {
-                break;
-              }
-            }
-          }
-
-          self.rr();
-          break;
-        default:
-      }
-    })
-    .then(function() {
-      var values = [_.merge(self.data, {
-        timeslot: self.app.timeout,
-        application: 'queue',
-        queue: self._queue.id,
-        queuename: self._queue.name,
-        calledAt: moment().format("YYYY-MM-DD HH:mm:ss"),
-        joinAt: moment().format("YYYY-MM-DD HH:mm:ss"),
-        membername: null,
-        memberid: null
-      })];
-      return structure.models.sessions[self.data.channel]
-        .bulkCreate(values, {
-          individualHooks: true
-        });
-    })
-    .then(function() {
-      return structure.models.rooms[self.data.channel]
-        .update({
-          waiting: true
-        }, {
-          where: {
-            id: self.data.roomid,
-          },
-          individualHooks: true
-        })
-        .then(function() {
-          console.log('QUEUE ACTION STARTED');
-        })
-        .catch(function(err) {
-          console.error();
-        });
-    });
-}
-
-Queue.prototype.beepall = function beepall() {
-  var self = this;
-  var attempts = self._agents.shift();
-  self._agents.push(attempts);
-
-  var query = {
-    where: {
-      id: {
-        $in: _.map(attempts, 'id')
-      },
-      online: true
-    },
-    include: [{
-      model: structure.models.rooms[self.data.channel],
-      attributes: ['id', 'status']
-    }],
-    attributes: ['id', 'name', 'fullname', 'online', 'mailPause', 'chatPause', 'faxPause', 'smsPause', 'openchannelPause', 'mailCapacity', 'chatCapacity', 'faxCapacity', 'smsCapacity',
-      'openchannelCapacity'
-    ]
-  };
-
-  query.where[structure.labels.pauses[self.data.channel]] = false;
-
-  var timeslot = ((self.app.timeout - self.elapsed) > self._queue.timeout) ? self._queue.timeout : (self.app.timeout - self.elapsed);
-
-  self.timeout = setTimeout(function() {
-    self.elapsed += self._queue.timeout;
-    self.rr();
-  }, timeslot * 1000);
-
-  if (timeslot > 0) {
-    Agent
-      .findAll(query)
-      .then(function(agents) {
-        // REMOVE AGENTS BY CAPACITY
-        agents = _.remove(agents, function(agent) {
-          if (available(agent,
-              agent[structure.labels.pauses[self.data.channel]],
-              self.rejected,
-              _.filter(agent[structure.labels.rooms[self.data.channel]], {
-                status: 'OPEN'
-              }),
-              agent[structure.labels.capacities[self.data.channel]])) {
-            return true;
-          } else {
-            return false;
-          }
-        });
-
-        var values = _.map(agents, function(agent) {
-          var value = _.merge(self.data, {
-            timeslot: timeslot,
-            application: 'queue',
-            membername: agent.name,
-            memberid: agent.id,
-            queue: self._queue.id,
-            queuename: self._queue.name,
-            calledAt: moment().format("YYYY-MM-DD HH:mm:ss")
-          });
-
-          return _.clone(value);
-        });
-
-        structure.models.reports[self.data.channel]
-          .bulkCreate(values, {
-            individualHooks: true
-          })
-          .catch(function(err) {
-            console.error(err);
-          });
-      })
-      .catch(function(err) {
-        console.error(err);
-      });
-  } else {
-    clearTimeout(self.timeout);
-    this.next();
-  }
-}
-
-Queue.prototype.rr = function rr() {
-  var self = this;
-  var timeslot = ((self.app.timeout - self.elapsed) > self._queue.timeout) ? self._queue.timeout : (self.app.timeout - self.elapsed);
-
-  self.timeout = setTimeout(function() {
-    self.elapsed += self._queue.timeout;
-    self.rr();
-  }, timeslot * 1000);
-
-  var query = {
-    where: {
-      id: {
-        $in: _.map(self._agents, 'id')
-      }
-    },
-    include: [{
-      model: structure.models.rooms[self.data.channel],
-      attributes: ['id']
-    }],
-    attributes: ['id', 'name', 'fullname', 'online', 'mailPause', 'chatPause', 'faxPause', 'smsPause', 'openchannelPause', 'mailCapacity', 'chatCapacity', 'faxCapacity', 'smsCapacity',
-      'openchannelCapacity'
-    ]
-  };
-
-  if (_.map(self._agents, 'id').join().length) {
-    query.order = [
-      [{
-        raw: 'FIELD(User.id,' + _.map(self._agents, 'id').join() + ')'
-      }]
-    ];
-  }
-
-  if (timeslot > 0) {
-    Agent
-      .findAll(query)
-      .then(function(agents) {
-        if (agents.length) {
-          self._agents = agents;
-
-          for (var i = 0; i < self._agents.length; i++) {
-
-            if (available(self._agents[0],
-                self._agents[0][structure.labels.pauses[self.data.channel]],
-                self.rejected,
-                _.filter(self._agents[0][structure.labels.rooms[self.data.channel]], {
-                  status: 'OPEN'
-                }),
-                self._agents[0][structure.labels.capacities[self.data.channel]]
-              )) {
-
-              var values = [_.merge(self.data, {
-                timeslot: timeslot,
-                application: 'queue',
-                membername: self._agents[0].name,
-                memberid: self._agents[0].id,
-                queue: self._queue.id,
-                queuename: self._queue.name,
-                calledAt: moment().format("YYYY-MM-DD HH:mm:ss")
-              })];
-
-              return structure.models.reports[self.data.channel]
-                .bulkCreate(values, {
-                  individualHooks: true
-                })
-                .then(function() {
-                  return structure.models.queues[self.data.channel]
-                    .update({
-                      lastAgent: self._agents[0].id
-                    }, {
-                      where: {
-                        id: self._queue.id
-                      }
-                    });
-                })
-                .catch(function(err) {
-                  console.error(err);
-                });
-
-            } else {
-              var agent = self._agents.shift();
-              self._agents.push(agent);
-            }
-          }
-        }
-      })
-      .then(function() {
-        var agent = self._agents.shift();
-        self._agents.push(agent);
-      })
-      .catch(function(err) {
-        console.error(err);
-      });
-  } else {
-    clearTimeout(self.timeout);
-    this.next();
-  }
-}
-
-function available(agent, pause, rejected, rooms, capacity) {
-  // CHECK REJECTED
-  var reject = _.find(rejected, {
-    id: agent.id
-  }) ? true : false;
-  // CHECK CAPACITY
-
-  return agent.online && !pause && !reject && ((rooms.length < capacity) || (capacity === 0));
-}
-
-// Export this file as a module
-module.exports = Queue;
\ No newline at end of file
diff --git a/server/config/routing/replyMail.js b/server/config/routing/replyMail.js
index 1dcc63a..c9a98ed 100644
--- a/server/config/routing/replyMail.js
+++ b/server/config/routing/replyMail.js
@@ -1,86 +1 @@
-'use strict';
-
-const _ = require('lodash');
-const config = require('../environment');
-const structure = require('./structure');
-
-// NODEJS API
-const cp = require('child_process');
-const util = require('util');
-const moment = require('moment');
-const Mustache = require('mustache');
-
-// MODELS
-const User = require('../../models').User;
-const Message = require('../../models').MailMessage;
-const Account = require('../../models').MailAccount;
-const Template = require('../../models').Template;
-
-// Define the factory
-function ReplyMail(app, data, next, msg) {
-  this.app = app;
-  this.data = data;
-  this.msg = msg;
-  console.log(msg);
-  //callbacks
-  this.next = next;
-}
-
-ReplyMail.prototype.init = function init() {
-  var self = this;
-  var _smtp;
-  var _message = {
-    from: [],
-    to: []
-  };
-
-  return Account
-    .findById(self.app.data8)
-    .then(function(account) {
-      return account
-        .getMailServerOut();
-    })
-    .then(function(smtp) {
-      _smtp = smtp;
-      _message.from.push(_smtp.username);
-      _message.to.push(self.data.from);
-
-      switch (self.app.data1) {
-        case 'replyAll':
-          _message.cc = self.data.cc;
-          break;
-        default:
-      }
-
-      return Template
-        .findById(self.app.data9);
-    })
-    .then(function(template) {
-      var msg = {
-        subject: self.msg.subject,
-        from: self.msg.from,
-        to: self.msg.to,
-        cc: self.msg.cc,
-        bcc: self.msg.bcc,
-        accountName: self.msg.accountName,
-        interactionId: self.msg.MailRoomId,
-        createdAt: self.msg.createdAt
-      }
-      _message.subject = template.subject ? Mustache.render(template.subject, msg) : null;
-      _message.html = template.html ? Mustache.render(template.html, msg) : null;
-      _message.auto = true;
-      _message.MailRoomId = self.data.roomid;
-
-      return Message
-        .create(_message);
-    })
-    .then(function() {
-      self.next();
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
-
-// Export this file as a module
-module.exports = ReplyMail;
\ No newline at end of file
diff --git a/server/config/routing/scheduler.js b/server/config/routing/scheduler.js
index 8a262b4..1275df3 100644
--- a/server/config/routing/scheduler.js
+++ b/server/config/routing/scheduler.js
@@ -1,475 +1 @@
-'use strict';
-
-const _ = require('lodash');
-const moment = require('moment');
-const config = require('../environment');
-const structure = require('./structure');
-
-// NODEJS API
-const cp = require('child_process');
-const util = require('util');
-// MODELS
-const User = require('../../models').User;
-const Interval = require('../../models').Interval;
-
-const MailAccount = require('../../models').MailAccount;
-
-const ReportMail = require('../../models').ReportMail;
-const ReportChat = require('../../models').ReportChat;
-const ReportSms = require('../../models').ReportSms;
-const ReportFax = require('../../models').ReportFax;
-const ReportOpenchannel = require('../../models').ReportOpenchannel;
-
-const weekDaysCollection = {
-  mon: 1,
-  tue: 2,
-  wed: 3,
-  thu: 4,
-  fri: 5,
-  sat: 6,
-  sun: 7
-};
-
-const monthsCollection = {
-  jan: 1,
-  feb: 2,
-  mar: 3,
-  apr: 4,
-  may: 5,
-  jun: 6,
-  jul: 7,
-  aug: 8,
-  sep: 9,
-  oct: 10,
-  nov: 11,
-  dec: 12
-};
-
-var Fidelity = require('./fidelity');
-var Agent = require('./agent');
-var Queue = require('./queue');
-var SendMail = require('./sendMail');
-var SendSms = require('./sendSms');
-var ReplyMail = require('./replyMail');
-
-// Define the factory
-function Scheduler(data, msg) {
-  this.data = data;
-  this.msg = msg;
-
-  this._apps = [];
-}
-
-function splitInterval(interval) {
-  console.log('splitInterval', interval);
-  var finalInterval = {};
-  var splittedInterval = interval.split(',');
-  var intValues;
-  splittedInterval.forEach(function(element, index) {
-    switch (index) {
-      case 0:
-        if (element !== '*') {
-          intValues = element.split('-');
-          finalInterval.t_from = moment(intValues[0], 'HH:mm');
-          finalInterval.t_to = moment(intValues[1], 'HH:mm');
-        } else {
-          finalInterval.t_from = null;
-          finalInterval.t_to = null;
-        }
-        break;
-      case 1:
-        if (element !== '*') {
-          intValues = element.split('-');
-          finalInterval.wd_from = weekDaysCollection[intValues[0]];
-          finalInterval.wd_to = intValues[1] ? weekDaysCollection[intValues[1]] : null;
-        } else {
-          finalInterval.wd_from = null;
-          finalInterval.wd_to = null;
-        }
-        break;
-      case 2:
-        if (element !== '*') {
-          intValues = element.split('-');
-          finalInterval.md_from = intValues[0];
-          finalInterval.md_to = intValues[1] ? intValues[1] : null;
-        } else {
-          finalInterval.md_from = null;
-          finalInterval.md_to = null;
-        }
-        break;
-      case 3:
-        if (element !== '*') {
-          intValues = element.split('-');
-          finalInterval.m_from = monthsCollection[intValues[0]];
-          finalInterval.m_to = intValues[1] ? monthsCollection[intValues[1]] : null;
-        } else {
-          finalInterval.m_from = null;
-          finalInterval.m_to = null;
-        }
-        break;
-      default:
-
-    }
-
-
-  });
-  return finalInterval;
-}
-
-function isIntervalValid(interval) {
-  var hour = moment().format("HH:mm");
-  var day = moment().format("E");
-  var monthDay = moment().format("D");
-  var month = moment().format("M");
-
-  var tValid, wdValid, mdValid, mValid;
-  var monthsNumbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
-  var weekDaysNumbers = [1, 2, 3, 4, 5, 6, 7];
-  var daysOfMonthsNumbers = [];
-  for (var i = 1; i <= 31; i++) {
-    daysOfMonthsNumbers.push(i);
-  }
-  tValid = (interval.t_from && interval.t_to) ? moment(hour, "HH:mm").isBetween(moment(interval.t_from, "HH:mm"), moment(interval.t_to, "HH:mm")) : true;
-  if (interval.wd_from) {
-    if (interval.wd_to) {
-      var validWeekdays = _.filter(weekDaysNumbers, function(elem) {
-        return (elem >= interval.wd_from) && (elem <= interval.wd_to);
-      });
-      console.log('valid weekdays', validWeekdays);
-      wdValid = (validWeekdays.indexOf(parseInt(day)) !== -1) ? true : false;
-    } else {
-      wdValid = (parseInt(day) === interval.wd_from) ? true : false;
-    }
-  } else {
-    wdValid = true;
-  }
-  if (interval.md_from) {
-    if (interval.md_to) {
-      var validMonthsdays = _.filter(daysOfMonthsNumbers, function(elem) {
-        return (elem >= interval.md_from) && (elem <= interval.md_to);
-      });
-      console.log('valid monthsdays', validMonthsdays);
-      mdValid = (validMonthsdays.indexOf(parseInt(monthDay)) !== -1) ? true : false;
-    } else {
-      mdValid = (parseInt(monthDay) === interval.md_from) ? true : false;
-    }
-  } else {
-    mdValid = true;
-  }
-  if (interval.m_from) {
-    if (interval.m_to) {
-      var validMonths = _.filter(monthsNumbers, function(elem) {
-        return (elem >= interval.m_from) && (elem <= interval.m_to);
-      });
-      console.log('valid months', validMonths);
-      mValid = (validMonths.indexOf(parseInt(month)) !== -1) ? true : false;
-    } else {
-      mValid = (parseInt(month) === interval.m_from) ? true : false;
-    }
-  } else {
-    mValid = true;
-  }
-  console.log('Time is ', tValid, ', WeekDay is ', wdValid, ', MonthDay is ', mdValid, ', Month is ', mValid);
-  return tValid && wdValid && mdValid && mValid;
-}
-
-// Define a method with async internals
-Scheduler.prototype.init = function init() {
-  var self = this; // Use a closure to preserve `this`
-  var attributes = ['id', 'app', 'timeout', 'interval', 'UserId'];
-  // HOOKS
-
-  attributes.push(structure.labels.appQueues[self.data.channel]);
-  structure.models.rooms[self.data.channel].addHook('afterUpdate', function(doc, options) {
-    if (self.data.roomid === doc.id) {
-      if (doc.changed('status')) {
-        console.info(util.format('STOP SCHEDULER INSTANCE, INTERACTION:', doc.id));
-
-        clearTimeout(self.app.timeout);
-        clearInterval(self.app.interval);
-      }
-    }
-  });
-
-  structure.models.reports[self.data.channel].addHook('afterUpdate', function(doc, options) {
-    if (self.data.roomid === doc.roomid) {
-      if (doc.changed('connectid')) {
-        console.info(util.format('STOP SCHEDULER INSTANCE, INTERACTION:', doc.roomid));
-
-        clearTimeout(self.app.timeout);
-        clearInterval(self.app.interval);
-
-        return structure.models.sessions[self.data.channel]
-          .update({
-            memberid: doc.memberid,
-            membername: doc.membername,
-            leaveAt: moment().format("YYYY-MM-DD HH:mm:ss")
-          }, {
-            where: {
-              uniqueid: doc.uniqueid,
-              leaveAt: null
-            },
-            individualHooks: true
-          })
-          .then(function() {
-            return structure.models.rooms[self.data.channel]
-              .update({
-                waiting: false
-              }, {
-                where: {
-                  id: doc.roomid,
-                },
-                individualHooks: true
-              })
-              .then(function() {
-                console.log('dialplan ended');
-              })
-              .catch(function(err) {
-                console.error();
-              });
-          });
-      }
-
-      if (doc.changed('rejectedAt')) {
-        console.info(util.format('STOP SCHEDULER INSTANCE REJECTED, INTERACTION:', doc.roomid, 'AGENT:', doc.membername));
-
-        self.app.rejected.push({
-          id: doc.memberid
-        });
-      }
-    }
-  });
-
-  if (self.data.channel === 'chat') {
-    structure.models.sessions[self.data.channel].addHook('afterUpdate', function(doc, options) {
-      if (doc.changed('abandon') && doc.abandon) {
-        console.info(util.format('STOP SCHEDULER INSTANCE, INTERACTION:', doc.roomid));
-
-        clearTimeout(self.app.timeout);
-        clearInterval(self.app.interval);
-
-        return structure.models.rooms[self.data.channel]
-          .update({
-            status: 'ABANDON'
-          }, {
-            where: {
-              id: self.data.roomid,
-            },
-            individualHooks: true
-          })
-          .then(function() {
-            console.log('dialplan ended');
-          })
-          .catch(function(err) {
-            console.error();
-          });
-      }
-    });
-  }
-
-  return structure.models.accounts[self.data.channel]
-    .findById(self.data.accountid, {
-      attributes: ['id', 'name', 'fidelity', 'timeout']
-    })
-    .then(function(account) {
-      console.info(util.format('CREATE SCHEDULER INSTANCE FOR ACCOUNT %s', account.name));
-
-      if (account.fidelity) {
-        self._apps.push({
-          app: 'fidelity',
-          timeout: account.timeout
-        });
-      }
-
-      switch (self.data.channel) {
-        case 'mail':
-          return account
-            .getMailApplications({
-              order: 'MailApplication.priority ASC',
-              include: [{
-                model: Interval,
-                include: [{
-                  all: true
-                }]
-              }]
-            });
-        case 'chat':
-          return account
-            .getChatApplications({
-              order: 'ChatApplication.priority ASC',
-              include: [{
-                model: Interval,
-                include: [{
-                  all: true
-                }]
-              }]
-            });
-        case 'fax':
-          return account
-            .getFaxApplications({
-              order: 'FaxApplication.priority ASC',
-              include: [{
-                model: Interval,
-                include: [{
-                  all: true
-                }]
-              }]
-            });
-        case 'sms':
-          return account
-            .getSmsApplications({
-              order: 'SmsApplication.priority ASC',
-              include: [{
-                model: Interval,
-                include: [{
-                  all: true
-                }]
-              }]
-            });
-        case 'openchannel':
-          return account
-            .getOpenchannelApplications({
-              order: 'OpenchannelApplication.priority ASC',
-              include: [{
-                model: Interval,
-                include: [{
-                  all: true
-                }]
-              }]
-            });
-        default:
-          return [];
-      }
-    })
-    .then(function(apps) {
-      var valid;
-
-      for (var i = 0; i < apps.length; i++) {
-        valid = true;
-
-        if (apps[i].Interval) {
-          for (var j = 0; j < apps[i].Interval.SubIntervals.length; j++) {
-            if (isIntervalValid(splitInterval(apps[i].Interval.SubIntervals[j].interval))) {
-              break;
-            } else {
-              console.info(self.data.channel.toUpperCase(), 'APP', apps[i].app.toUpperCase(), 'SKIP BY INTERVAL. INTERACTION:', self.data.roomid);
-              valid = false;
-            }
-          }
-        } else {
-          if (!isIntervalValid(splitInterval(apps[i].interval))) {
-            valid = false;
-            console.info(self.data.channel.toUpperCase(), 'APP', apps[i].app.toUpperCase(), 'SKIP BY INTERVAL. INTERACTION:', self.data.roomid);
-          }
-        }
-
-        if (valid) {
-          self._apps.push(apps[i].dataValues)
-        }
-      }
-
-      self.next();
-    });
-};
-
-// Define a method with async internals
-Scheduler.prototype.next = function next() {
-  var self = this; // Use a closure to preserve `this`
-  var app = self._apps.shift();
-
-  if (app) {
-    structure.models.reports[self.data.channel].removeHook('afterUpdate', structure.labels.reports[self.data.channel]);
-
-    switch (app.app) {
-      case 'fidelity':
-        self.app = new Fidelity(app, self.data, function() {
-          return structure.models.sessions[self.data.channel]
-            .update({
-              leaveAt: moment().format("YYYY-MM-DD HH:mm:ss"),
-              timeout: true
-            }, {
-              where: {
-                leaveAt: null,
-                uniqueid: self.data.uniqueid,
-              },
-              individualHooks: true
-            })
-            .then(function() {
-              self.next();
-            });
-        });
-        break;
-      case 'agent':
-        self.app = new Agent(app, self.data, function() {
-          return structure.models.sessions[self.data.channel]
-            .update({
-              leaveAt: moment().format("YYYY-MM-DD HH:mm:ss"),
-              timeout: true
-            }, {
-              where: {
-                leaveAt: null,
-                uniqueid: self.data.uniqueid,
-              },
-              individualHooks: true
-            })
-            .then(function() {
-              self.next();
-            });
-        });
-        break;
-      case 'queue':
-        self.app = new Queue(app, self.data, function() {
-          return structure.models.sessions[self.data.channel]
-            .update({
-              leaveAt: moment().format("YYYY-MM-DD HH:mm:ss"),
-              timeout: true
-            }, {
-              where: {
-                leaveAt: null,
-                uniqueid: self.data.uniqueid,
-              },
-              individualHooks: true
-            })
-            .then(function() {
-              self.next();
-            });
-        });
-        break;
-      case 'sendMail':
-        self.app = new SendMail(app, self.data, function() {
-          self.next();
-        });
-        break;
-      case 'replyMail':
-        self.app = new ReplyMail(app, self.data, function() {
-          self.next();
-        }, self.msg);
-        break;
-      case 'sendSms':
-        self.app = new SendSms(app, self.data, function() {
-          self.next();
-        });
-        break;
-      default:
-        console.log('unknown app');
-    }
-
-    self.app.init();
-  } else {
-    structure.models.rooms[self.data.channel]
-      .update({
-        waiting: false
-      }, {
-        where: {
-          id: self.data.roomid,
-        },
-        individualHooks: true
-      })
-      .catch(function(err) {
-        console.error();
-      });
-  }
-};
-
-// Export this file as a module
-module.exports = Scheduler;
\ No newline at end of file
diff --git a/server/config/routing/sendMail.js b/server/config/routing/sendMail.js
index a726daa..2080158 100644
--- a/server/config/routing/sendMail.js
+++ b/server/config/routing/sendMail.js
@@ -1,86 +1 @@
-'use strict';
-
-const _ = require('lodash');
-const config = require('../environment');
-const structure = require('./structure');
-
-// NODEJS API
-const cp = require('child_process');
-const util = require('util');
-const moment = require('moment');
-const Mustache = require('mustache');
-
-// MODELS
-const User = require('../../models').User;
-const Message = require('../../models').MailMessage;
-const Account = require('../../models').MailAccount;
-const Template = require('../../models').Template;
-
-// Define the factory
-function SendMail(app, data, next) {
-  this.app = app;
-  this.data = data;
-  //callbacks
-  this.next = next;
-}
-
-SendMail.prototype.init = function init() {
-  var self = this;
-
-  var _smtp;
-  var _message = {
-    from: [],
-    to: []
-  };
-
-  return Account
-    .findById(self.app.data8)
-    .then(function(account) {
-      return account
-        .getMailServerOut();
-    })
-    .then(function(smtp) {
-      _smtp = smtp;
-      _message.from.push(_smtp.username);
-      _message.to.push(self.app.data2);
-
-      return Template
-        .findById(self.app.data9);
-    })
-    .then(function(template) {
-      switch (self.data.channel) {
-        case 'mail':
-          _message.subject = template.subject;
-          return Message
-            .findById(self.data.messageid)
-            .then(function(data) {
-
-              _message.html = Mustache.render(template.html, {
-                interactionId: self.data.roomid,
-                subject: self.data.subject,
-                body: data.text,
-                accountName: self.data.accountname,
-                from: _message.from.join(', '),
-                to: _message.to.join(', '),
-                cc: self.data.cc.join(', '),
-                createdAt: self.app.createdAt
-              });
-            });
-
-        default:
-      }
-    })
-    .then(function() {
-      return Message
-        .create(_message);
-    })
-    .then(function() {
-      self.next();
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
-
-// Export this file as a module
-module.exports = SendMail;
\ No newline at end of file
diff --git a/server/config/routing/sendSms.js b/server/config/routing/sendSms.js
index 133849f..5ddd361 100644
--- a/server/config/routing/sendSms.js
+++ b/server/config/routing/sendSms.js
@@ -1,54 +1 @@
-'use strict';
-
-const _ = require('lodash');
-const config = require('../environment');
-const structure = require('./structure');
-
-// NODEJS API
-const cp = require('child_process');
-const util = require('util');
-const moment = require('moment');
-const Mustache = require('mustache');
-
-// MODELS
-const User = require('../../models').User;
-const Message = require('../../models').SmsMessage;
-const Account = require('../../models').SmsAccount;
-
-// Define the factory
-function SendSms(app, data, next) {
-  this.app = app;
-  this.data = data;
-  //callbacks
-  this.next = next;
-}
-
-SendSms.prototype.init = function init() {
-  var self = this;
-  var _smtp;
-  var _message = {
-    from: '',
-    to: '',
-    body: ''
-  };
-
-  return Account
-    .findById(self.app.data8)
-    .then(function(account) {
-      _message.SmsAccountId = account.id;
-      _message.from = account.phone;
-      _message.to = self.app.data2;
-      _message.body = self.app.data6;
-      return Message
-        .create(_message);
-    })
-    .then(function(message) {
-      self.next();
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
-
-// Export this file as a module
-module.exports = SendSms;
\ No newline at end of file
diff --git a/server/config/routing/structure.js b/server/config/routing/structure.js
index 1feb304..eb48905 100644
--- a/server/config/routing/structure.js
+++ b/server/config/routing/structure.js
@@ -1,127 +1 @@
-'use strict';
-
-const _ = require('lodash');
-const moment = require('moment');
-const config = require('../environment');
-// NODEJS API
-const cp = require('child_process');
-const util = require('util');
-// MODELS
-const User = require('../../models').User;
-const Interval = require('../../models').Interval;
-
-const ReportMail = require('../../models').ReportMail;
-const ReportChat = require('../../models').ReportChat;
-const ReportSms = require('../../models').ReportSms;
-const ReportFax = require('../../models').ReportFax;
-const ReportOpenchannel = require('../../models').ReportOpenchannel;
-
-const MailAccount = require('../../models').MailAccount;
-const ChatWebsite = require('../../models').ChatWebsite;
-const SmsAccount = require('../../models').SmsAccount;
-const FaxAccount = require('../../models').FaxAccount;
-const OpenchannelAccount = require('../../models').OpenchannelAccount;
-
-const MailQueue = require('../../models').MailQueue;
-const ChatQueue = require('../../models').ChatQueue;
-const SmsQueue = require('../../models').SmsQueue;
-const FaxQueue = require('../../models').FaxQueue;
-const OpenchannelQueue = require('../../models').OpenchannelQueue;
-
-const MailRoom = require('../../models').MailRoom;
-const ChatRoom = require('../../models').ChatRoom;
-const SmsRoom = require('../../models').SmsRoom;
-const FaxRoom = require('../../models').FaxRoom;
-const OpenchannelRoom = require('../../models').OpenchannelRoom;
-
-const MailSession = require('../../models').ReportMailSession;
-const ChatSession = require('../../models').ReportChatSession;
-const SmsSession = require('../../models').ReportSmsSession;
-const FaxSession = require('../../models').ReportFaxSession;
-const OpenchannelSession = require('../../models').ReportOpenchannelSession;
-
-// Export this file as a module
-module.exports = {
-  labels: {
-    rooms: {
-      mail: 'MailRooms',
-      chat: 'ChatRooms',
-      sms: 'SmsRooms',
-      fax: 'FaxRooms',
-      openchannel: 'OpenchannelRooms'
-    },
-    pauses: {
-      mail: 'mailPause',
-      chat: 'chatPause',
-      sms: 'smsPause',
-      fax: 'faxPause',
-      openchannel: 'openchannelPause'
-    },
-    capacities: {
-      mail: 'mailCapacity',
-      chat: 'chatCapacity',
-      sms: 'smsCapacity',
-      fax: 'faxCapacity',
-      openchannel: 'openchannelCapacity'
-    },
-    appQueues: {
-      mail: 'MailQueueId',
-      chat: 'ChatQueueId',
-      sms: 'SmsQueueId',
-      fax: 'FaxQueueId',
-      openchannel: 'OpenchannelQueueId'
-    },
-    penaltyTables: {
-      mail: 'UserHasMailQueue.penalty',
-      chat: 'UserHasChatQueue.penalty',
-      sms: 'UserHasSmsQueue.penalty',
-      fax: 'UserHasFaxQueue.penalty',
-      openchannel: 'UserHasOpenchannelQueue.penalty'
-    },
-    reports: {
-      mail: 'report_mail',
-      chat: 'report_chat',
-      sms: 'report_sms',
-      fax: 'report_fax',
-      openchannel: 'report_openchannel'
-    }
-  },
-
-  models: {
-    reports: {
-      mail: ReportMail,
-      chat: ReportChat,
-      sms: ReportSms,
-      fax: ReportFax,
-      openchannel: ReportOpenchannel
-    },
-    accounts: {
-      mail: MailAccount,
-      chat: ChatWebsite,
-      sms: SmsAccount,
-      fax: FaxAccount,
-      openchannel: OpenchannelAccount
-    },
-    queues: {
-      mail: MailQueue,
-      chat: ChatQueue,
-      sms: SmsQueue,
-      fax: FaxQueue,
-      openchannel: OpenchannelQueue
-    },
-    rooms: {
-      mail: MailRoom,
-      chat: ChatRoom,
-      sms: SmsRoom,
-      fax: FaxRoom,
-      openchannel: OpenchannelRoom
-    },
-    sessions: {
-      mail: MailSession,
-      chat: ChatSession,
-      sms: SmsSession,
-      fax: FaxSession,
-      openchannel: OpenchannelSession
-    }
-  }
-};
\ No newline at end of file
diff --git a/server/config/scheduler/index.js b/server/config/scheduler/index.js
index 429d7a2..39da773 100644
--- a/server/config/scheduler/index.js
+++ b/server/config/scheduler/index.js
@@ -1,103 +1 @@
-var Schedule = require('../../models').Schedule;
-var MailServerOut = require('../../models').MailServerOut;
-var CronJobManager = require('cron-job-manager');
-var _ = require('lodash');
-var Reports = require('./reports');
-
-
-function deleteSchedule(data, manager) {
-  console.log("Deleting " + data.name + " job");
-  if (manager.exists(data.id.toString())) {
-    manager.deleteJob(data.id.toString());
-    console.log("I got the current jobs: " + manager);
-  } else {
-    console.log("Job " + data.name + " does not exist");
-  }
-}
-
-function updateSchedule(data, manager, reports) {
-  console.log("Updating " + data.name + " job");
-  if (data.active) {
-    createJob(data, manager, reports);
-  } else {
-    deleteSchedule(data, manager);
-  }
-}
-
-module.exports = function() {
-  var manager = new CronJobManager();
-  var reports = new Reports();
-
-  Schedule
-    .findAll({
-      where: {
-        active: true
-      },
-      attributes: ['id', 'name', 'type', 'active']
-    })
-    .then(function(schedules) {
-      _.forEach(schedules.rows, function(schedule) {
-        createJob(schedule, manager, reports);
-      });
-    })
-    .finally(function() {
-      synchSchedules(manager, reports);
-    })
-    .catch(function(err) {
-      console.log('Error getting/setting schedules');
-    });
-};
-
-function createJob(schedule, manager, reports) {
-  console.log("Creating '" + schedule.name + "' job");
-  manager.add(schedule.id.toString(),
-    "00 " + schedule.cron,
-    // "00 */2 * * * *",
-    function() {
-      executeSchedule(schedule.id, reports);
-    }, {
-      start: true,
-      completion: function() {
-        console.log("Job " + schedule.name + " stopped");
-      }
-    });
-  console.log("Job '" + schedule.name + "' created!");
-  console.log("I got the current jobs: " + manager);
-}
-
-function executeSchedule(scheduleId, reports) {
-  console.log('Executing schedule ', scheduleId);
-  return Schedule
-    .findById(scheduleId, {
-      include: [MailServerOut]
-    })
-    .then(function(schedule) {
-      if (!schedule) {
-        console.log('Schedule not found!');
-        return;
-      }
-      switch (schedule.type) {
-        case 'report':
-          reports.extractReport(schedule);
-          break;
-        default:
-      }
-    })
-    .catch(function(err) {
-      console.log('Error retrieving schedule!');
-    });
-}
-
-function synchSchedules(manager, reports) {
-  Schedule.afterCreate(function(doc, options) {
-    if (doc.active) {
-      createJob(doc.dataValues, manager, reports);
-    }
-  });
-  Schedule.afterUpdate(function(doc, options) {
-    updateSchedule(doc.dataValues, manager, reports);
-  });
-  Schedule.afterDestroy(function(doc) {
-    deleteSchedule(doc.dataValues, manager);
-  });
-}
\ No newline at end of file
diff --git a/server/config/scheduler/reports.js b/server/config/scheduler/reports.js
index 70e212f..cecaafb 100644
--- a/server/config/scheduler/reports.js
+++ b/server/config/scheduler/reports.js
@@ -1,228 +1 @@
-var cp = require('child_process');
-var moment = require('moment');
-require('moment-range');
-var CustomReport = require('../../models').CustomReport;
-var DefaultReport = require('../../models').DefaultReport;
-var ExtractedReport = require('../../models').ExtractedReport;
-var MailAttachment = require('../../models').MailAttachment;
-var MailServerOut = require('../../models').MailServerOut;
-var MailMessage = require('../../models').MailMessage;
-var path = require('path');
-var config = require('../../config/environment');
-var fs = require('fs-extra');
-var _ = require('lodash');
-var ReportTree = require('../../models').ReportTree;
-
-function Reports() {
-  console.log('Reports schedules launcher Initialization...');
-}
-
-Reports.prototype.extractReport = function(schedule, user) {
-  console.log('Extracting report...');
-  extract(schedule, user);
-}
-
-function extract(schedule, user) {
-  switch (schedule.cronType) {
-    case 'currentDay':
-      extractTodayReport(schedule, user);
-      break;
-    default:
-      extractRangeReport(schedule, user);
-      break;
-  }
-}
-
-function extractTodayReport(schedule, user) {
-  console.log('Checking today schedule range validity...');
-  if (user || checkValidity(schedule.validityStart, schedule.validityEnd)) {
-    console.log('The hours range is valid, extracting today report...');
-    docExtract(schedule, moment().format('YYYY-MM-DD'), moment().format('YYYY-MM-DD'), user, '00:00', '23:59');
-  } else {
-    console.log('Out of hours range, skipping record extraction!');
-  }
-}
-
-function extractRangeReport(schedule, user) {
-  switch (schedule.reportRange) {
-    case 'yesterday':
-      docExtract(schedule, moment().subtract(1, 'days').format('YYYY-MM-DD'), moment().subtract(1, 'days').format('YYYY-MM-DD'), user)
-      break;
-    case 'last7':
-      docExtract(schedule, moment().subtract(7, 'days').format('YYYY-MM-DD'), moment().subtract(1, 'days').format('YYYY-MM-DD'), user)
-      break;
-    case 'last30':
-      docExtract(schedule, moment().subtract(30, 'days').format('YYYY-MM-DD'), moment().subtract(1, 'days').format('YYYY-MM-DD'), user)
-      break;
-    case 'lastMonth':
-      docExtract(schedule, moment().subtract(1, 'months').startOf('month').format('YYYY-MM-DD'), moment().subtract(1, 'months').endOf('month').format('YYYY-MM-DD'), user)
-      break;
-  }
-}
-
-function checkValidity(startHour, endHour) {
-  return moment().range(moment(startHour, "h"), moment(endHour, "h")).contains(moment());
-}
-
-function getReportPath(folder, tree, path) {
-  path = folder.text + '/ ' + path;
-  if (folder.parent === '#') {
-    return path;
-  } else {
-    return getReportPath(_.find(tree, {
-      id: folder.parent
-    }), tree, path);
-  }
-}
-
-function docExtract(schedule, startDate, endDate, user, startTime, endTime) {
-  // console.log('common docExtract api function');
-  var resource = schedule.reportType === 'default' ? DefaultReport : CustomReport;
-  var report;
-  resource //DO NOT ADD RETURN CAUSE THE EXTRACTING FUNCTION WILL KEEP EXTRACTING AFTER THE API HAS RETURNED
-    .scope('fields')
-    .findById(schedule.reportId)
-    .then(function(_report) {
-      if (!_report) {
-        console.log('Report not found!');
-        return;
-      }
-      report = _report;
-      return ReportTree
-        .findById(schedule.reportType === 'default' ? 1 : 2);
-    })
-    .then(function(tree) {
-      tree = JSON.parse(tree.tree);
-      var folder = _.find(tree, {
-        id: report.parent
-      });
-      var path = getReportPath(folder, tree, report.name);
-      // console.log('found the report, creating the new DB row for extracted reports..');
-      //CREATE A DB ROW IN A TABLE WITH THE REPORT INFO, QUERY DATES, AND THE STATUS 'ELABORATING'
-      if (schedule.cronType === 'currentDay') {
-        report.dataValues.table = report.dataValues.table.replace('_history', '');
-      }
-      return [report, ExtractedReport.create({
-        name: report.name,
-        startDate: startDate,
-        endDate: endDate,
-        output: schedule.reportOutput,
-        type: user ? 'manual' : 'scheduled',
-        UserId: user ? user.id : null
-      })]
-    })
-    .spread(function(report, extractedReport) {
-      // console.log('created new extracted reports db entry, calling external extraction function: ' + typeFunction);
-      var child = cp.fork(__dirname + '/../../utils/report_extraction.js');
-      child.on('message', function(data) {
-        console.log('child message', data);
-        if (schedule.sendMail && data.status === 'completed') {
-          sendReportByMail(schedule, extractedReport.id, user, child);
-        } else {
-          child.kill();
-        }
-      }).on('close', function() {
-        console.log('child close');
-      }).on('error', function(err) {
-        console.log('child error', err);
-      });
-      child.send({
-        report: report,
-        query: {
-          startDate: startDate,
-          endDate: endDate,
-          startTime: startTime || null,
-          endTime: endTime || null
-        },
-        extractedId: extractedReport.id,
-        user: user ? user : {
-          role: 'admin'
-        },
-        type: schedule.reportOutput
-      });
-    })
-    .catch(function(err) {
-      console.log('Scheduled report extraction error: ', err);
-    });
-}
-
-function sendReportByMail(schedule, extractedId, user, child) {
-  var _extract;
-  return ExtractedReport
-    .findById(extractedId)
-    .then(function(extract) {
-      if (!extract) {
-        console.log('Extracted report not found!');
-        return;
-      }
-      _extract = extract;
-      if (schedule.MailServerOut && schedule.MailServerOut.username) {
-        var attachment = getAttachment(_extract);
-        var message = {
-          subject: 'Scheduled Report',
-          from: [schedule.MailServerOut.username],
-          to: [schedule.email],
-          cc: [],
-          html: null,
-          text: null,
-          inReplyTo: null,
-          status: 'SENDING',
-          attachment: true,
-          UserId: user ? user.id : null, //how to get user if sent automatically??
-          MailAttachments: [attachment]
-        };
-        return MailMessage
-          .create(message, {
-            include: [{
-              model: MailAttachment
-            }]
-          })
-      } else {
-        throw new Error("No Account or SMTP address configured");
-      }
-    })
-    .then(function(mailMessage) {
-      return _extract.setMailMessage(mailMessage);
-    })
-    .then(function() {
-      console.log('Scheduled message sent!');
-    })
-    .catch(function(err) {
-      console.log('Error sending extracted report by mail!', err);
-    })
-    .finally(function() {
-      child.kill();
-    });
-}
-
-function getAttachment(extract) {
-  var oldFile = path.join(config.root, 'server', 'files', 'reports', extract.savename);
-  var newPath = path.join(config.root, 'server', 'files', 'attachments');
-  var newSavename = path.basename(extract.savename, '.' + extract.output.toLowerCase());
-  try {
-    fs.copySync(oldFile, path.join(newPath, newSavename));
-    console.log("success!");
-  } catch (err) {
-    console.error('Error getting the extracted report attachment!');
-    return null;
-  }
-  return {
-    size: getFilesizeInBytes(oldFile),
-    path: path.join(newPath, newSavename),
-    name: extract.name + '_' + moment(extract.startDate).format("DD-MM-YYYY") + '_' + moment(extract.endDate).format("DD-MM-YYYY") + '.' + extract.output.toLowerCase(),
-    type: 'application/' + extract.output.toLowerCase(),
-    basename: newSavename
-  };
-}
-
-function getFilesizeInBytes(filename) {
-  try {
-    var stats = fs.statSync(filename)
-    var fileSizeInBytes = stats.size;
-    return fileSizeInBytes
-  } catch (err) {
-    return 0;
-  }
-}
-
-module.exports = Reports;
\ No newline at end of file
diff --git a/server/config/seed.js b/server/config/seed.js
index 33e666d..cdec0b5 100644
--- a/server/config/seed.js
+++ b/server/config/seed.js
@@ -1,3957 +1 @@
-/**
- * Populate DB with sample data on server start
- * to disable, edit config/environment/index.js, and set `seedDB: false`
- */
-'use strict';
-
-var _ = require('lodash');
-var models = require('../models');
-var sequelize = require('../models').sequelize;
-
-models.User.bulkCreate([{
-  provider: 'local',
-  role: 'agent',
-  fullname: 'Giuseppe Careri',
-  email: [email-masked]',
-  name: 'giuseppe.careri',
-  password: '75xcally75',
-  defaultuser: 'giuseppe.careri',
-  host: 'dynamic',
-  type: 'FRIEND',
-  transport: 'udp',
-  allow: 'alaw;ulaw;gsm',
-  qualify: 'yes',
-  nat: 'force_rport,comedia',
-  disallow: 'all',
-  context: 'from-sip',
-  internal: 1000
-}, {
-  provider: 'local',
-  role: 'agent',
-  fullname: 'Daniele Cinti',
-  email: [email-masked]',
-  name: 'daniele.cinti',
-  password: '75xcally75',
-  defaultuser: 'daniele.cinti',
-  host: 'dynamic',
-  type: 'FRIEND',
-  transport: 'udp',
-  allow: 'alaw;ulaw;gsm',
-  qualify: 'yes',
-  nat: 'force_rport,comedia',
-  disallow: 'all',
-  context: 'from-sip',
-  internal: 1001
-}, {
-  provider: 'local',
-  role: 'agent',
-  fullname: 'Andrea Bianco',
-  email: [email-masked]',
-  name: 'andrea.bianco',
-  password: '75xcally75',
-  defaultuser: 'andrea.bianco',
-  host: 'dynamic',
-  type: 'FRIEND',
-  transport: 'udp',
-  allow: 'alaw;ulaw;gsm',
-  qualify: 'yes',
-  nat: 'force_rport,comedia',
-  disallow: 'all',
-  context: 'from-sip',
-  internal: 1002
-}, {
-  provider: 'local',
-  role: 'agent',
-  fullname: 'Massimiliano Bungaro',
-  email: [email-masked]',
-  name: 'massimiliano.bungaro',
-  password: '75xcally75',
-  defaultuser: 'massimiliano.bungaro',
-  host: 'dynamic',
-  type: 'FRIEND',
-  transport: 'udp',
-  allow: 'alaw;ulaw;gsm',
-  qualify: 'yes',
-  nat: 'force_rport,comedia',
-  disallow: 'all',
-  context: 'from-sip',
-  internal: 1003
-}, {
-  provider: 'local',
-  role: 'agent',
-  fullname: 'Valerio Ciotta',
-  email: [email-masked]',
-  name: 'valerio.ciotta',
-  password: '75xcally75',
-  defaultuser: 'valerio.ciotta',
-  host: 'dynamic',
-  type: 'FRIEND',
-  transport: 'udp',
-  allow: 'alaw;ulaw;gsm',
-  qualify: 'yes',
-  nat: 'force_rport,comedia',
-  disallow: 'all',
-  context: 'from-sip',
-  internal: 1004
-}, {
-  provider: 'local',
-  role: 'admin',
-  fullname: 'Clarotech',
-  email: [email-masked]',
-  name: 'clarotech',
-  password: 'clarotech',
-  defaultuser: 'clarotech',
-  host: 'dynamic',
-  type: 'FRIEND',
-  transport: 'udp',
-  allow: 'alaw;ulaw;gsm',
-  qualify: 'yes',
-  nat: 'force_rport,comedia',
-  disallow: 'all',
-  context: 'from-sip',
-  internal: 1005
-}, {
-  provider: 'local',
-  role: 'agent',
-  fullname: 'Abigael',
-  email: [email-masked]',
-  name: 'abigael',
-  password: '75xcally75',
-  defaultuser: 'abigael',
-  host: 'dynamic',
-  type: 'FRIEND',
-  transport: 'udp',
-  allow: 'alaw;ulaw;gsm',
-  qualify: 'yes',
-  nat: 'force_rport,comedia',
-  disallow: 'all',
-  context: 'from-sip',
-  internal: 1006
-}, {
-  provider: 'local',
-  role: 'agent',
-  fullname: 'Tony Russell',
-  email: [email-masked]',
-  name: 'tony.russell',
-  password: 'clarotech',
-  defaultuser: 'tony.russell',
-  host: 'dynamic',
-  type: 'FRIEND',
-  transport: 'udp',
-  allow: 'alaw;ulaw;gsm',
-  qualify: 'yes',
-  nat: 'force_rport,comedia',
-  disallow: 'all',
-  context: 'from-sip',
-  internal: 1007
-}, {
-  provider: 'local',
-  role: 'agent',
-  fullname: 'Colin Fair',
-  email: [email-masked]',
-  name: 'colin.fair',
-  password: 'clarotech',
-  defaultuser: 'colin.fair',
-  host: 'dynamic',
-  type: 'FRIEND',
-  transport: 'udp',
-  allow: 'alaw;ulaw;gsm',
-  qualify: 'yes',
-  nat: 'force_rport,comedia',
-  disallow: 'all',
-  context: 'from-sip',
-  internal: 1008
-}, {
-  provider: 'local',
-  role: 'agent',
-  fullname: 'Diego Gosmar',
-  email: [email-masked]',
-  name: 'diego.gosmar',
-  password: '75xcally75',
-  defaultuser: 'diego.gosmar',
-  host: 'dynamic',
-  type: 'FRIEND',
-  transport: 'udp',
-  allow: 'alaw;ulaw;gsm',
-  qualify: 'yes',
-  nat: 'force_rport,comedia',
-  disallow: 'all',
-  context: 'from-sip',
-  internal: 1009
-}, {
-  provider: 'local',
-  role: 'agent',
-  fullname: 'Giuseppe Innamorato',
-  email: [email-masked]',
-  name: 'giuseppe.innamorato',
-  password: '75xcally75',
-  defaultuser: 'giuseppe.innamorato',
-  host: 'dynamic',
-  type: 'FRIEND',
-  transport: 'upd',
-  allow: 'alaw;ulaw;gsm',
-  qualify: 'yes',
-  nat: 'force_rport,comedia',
-  disallow: 'all',
-  context: 'from-sip',
-  internal: 1010
-}, {
-  provider: 'local',
-  role: 'agent',
-  fullname: 'Alessandra Bessone',
-  email: [email-masked]',
-  name: 'alessandra.bessone',
-  password: '75xcally75',
-  defaultuser: 'alessandra.bessone',
-  host: 'dynamic',
-  type: 'FRIEND',
-  transport: 'upd',
-  allow: 'alaw;ulaw;gsm',
-  qualify: 'yes',
-  nat: 'force_rport,comedia',
-  disallow: 'all',
-  context: 'from-sip',
-  internal: 1011
-}, {
-  provider: 'local',
-  role: 'agent',
-  fullname: 'Felice Briscese',
-  email: [email-masked]',
-  name: 'felice.briscese',
-  password: '75xcally75',
-  defaultuser: 'felice.briscese',
-  host: 'dynamic',
-  type: 'FRIEND',
-  transport: 'upd',
-  allow: 'alaw;ulaw;gsm',
-  qualify: 'yes',
-  nat: 'force_rport,comedia',
-  disallow: 'all',
-  context: 'from-sip',
-  internal: 1012
-}, {
-  provider: 'local',
-  role: 'admin',
-  fullname: 'xCally',
-  email: [email-masked]',
-  name: 'xcally',
-  password: '388xshuttle388',
-  defaultuser: 'xcally',
-  host: 'dynamic',
-  type: 'FRIEND',
-  transport: 'udp',
-  allow: 'alaw;ulaw;gsm',
-  qualify: 'yes',
-  nat: 'force_rport,comedia',
-  disallow: 'all',
-  context: 'from-sip',
-  internal: 1013
-}, {
-  provider: 'local',
-  role: 'agent',
-  fullname: 'John Doe',
-  email: [email-masked]',
-  name: 'john.doe',
-  password: '75xcally75',
-  defaultuser: 'john.doe',
-  host: 'dynamic',
-  type: 'FRIEND',
-  transport: 'udp',
-  allow: 'alaw;ulaw;gsm',
-  qualify: 'yes',
-  nat: 'force_rport,comedia',
-  disallow: 'all',
-  context: 'from-sip',
-  internal: 1014
-}, {
-  provider: 'local',
-  role: 'agent',
-  fullname: 'Jane Miller',
-  email: [email-masked]',
-  name: 'jane.miller',
-  password: '75xcally75',
-  defaultuser: 'jane.miller',
-  host: 'dynamic',
-  type: 'FRIEND',
-  transport: 'udp',
-  allow: 'alaw;ulaw;gsm',
-  qualify: 'yes',
-  nat: 'force_rport,comedia',
-  disallow: 'all',
-  context: 'from-sip',
-  internal: 1015
-}], {
-  ignoreDuplicates: true,
-  individualHooks: true
-}).then(function() {
-  console.log('Finished populating users');
-});
-
-models.Trunk.bulkCreate([{
-  name: 'citalia',
-  type: 'friend',
-  insecure: 'port,invite',
-  defaultuser: '01119827770',
-  secret: 'T!NPnv-qjCMe9v',
-  password: 'T!NPnv-qjCMe9v',
-  context: 'from-voip-provider',
-  language: 'it',
-  host: 'voip.eutelia.it',
-  fromdomain: 'voip.eutelia.it',
-  dtmfmode: 'rfc2833',
-  qualify: 'yes',
-  nat: 'force_rport,comedia',
-  callerid: ' "" <>',
-  limitonpeers: 'yes',
-  callcounter: 'yes',
-  disallow: 'all',
-  allow: 'ulaw;alaw;gsm',
-  canreinvite: 'no',
-  directmedia: 'no'
-}], {
-  ignoreDuplicates: true,
-  individualHooks: true
-}).then(function() {
-  console.log('Finished populating trunks');
-});
-
-// Init modules table
-var newModules = [{
-  id: 1,
-  name: "dashboard",
-  title: "APPLICATION_DASHBOARD",
-  ModuleId: null,
-  path: '/dashboard/voice'
-}, {
-  id: 2,
-  name: "yourdashboards",
-  title: "APPLICATION_YOUR_DASHBOARDS",
-  ModuleId: null,
-  path: '/tools/yourdashboards/show/1'
-}, {
-  id: 3,
-  name: "staff",
-  title: "APPLICATION_STAFF",
-  ModuleId: null,
-  path: '/staff/agents/list'
-}, {
-  id: 4,
-  name: "agents",
-  title: "APPLICATION_AGENTS",
-  ModuleId: 3,
-  path: '/staff/agents/list'
-}, {
-  id: 5,
-  name: "contactmanager",
-  title: "APPLICATION_CONTACT_MANAGER",
-  ModuleId: null,
-  path: '/contactmanager/contacts/list'
-}, {
-  id: 6,
-  name: "channels",
-  title: "APPLICATION_CHANNELS",
-  ModuleId: null,
-  path: '/channels/voice/queues/list'
-}, {
-  id: 7,
-  name: "voice",
-  title: "APPLICATION_VOICE",
-  ModuleId: 6,
-  path: '/channels/voice/queues/list'
-}, {
-  id: 8,
-  name: "chat",
-  title: "APPLICATION_CHAT",
-  ModuleId: 6,
-  path: '/channels/chat/websites/list'
-}, {
-  id: 9,
-  name: "mail",
-  title: "APPLICATION_MAIL",
-  ModuleId: 6,
-  path: '/channels/mail/accounts/list'
-}, {
-  id: 10,
-  name: "fax",
-  title: "APPLICATION_FAX",
-  ModuleId: 6,
-  path: '/channels/fax/accounts/list'
-}, {
-  id: 11,
-  name: "sms",
-  title: "APPLICATION_SMS",
-  ModuleId: 6,
-  path: '/channels/sms/accounts/list'
-}, {
-  id: 12,
-  name: "realtime",
-  title: "APPLICATION_REALTIME",
-  ModuleId: 6,
-  path: '/channels/realtime/view/agents'
-}, {
-  id: 13,
-  name: "tools",
-  title: "APPLICATION_TOOLS",
-  ModuleId: null,
-  path: '/tools/triggers/list'
-}, {
-  id: 14,
-  name: "square",
-  title: "APPLICATION_CALLYSQUARE",
-  ModuleId: null,
-  path: '/square/projects/list'
-}, {
-  id: 15,
-  name: "jscripty",
-  title: "APPLICATION_JSCRIPTY",
-  ModuleId: null,
-  path: '/jscripty/projects/list'
-}, {
-  id: 16,
-  name: "motiondialer",
-  title: "APPLICATION_MOTION_DIALER",
-  ModuleId: null,
-  path: '/motiondialer/lists/list'
-}, {
-  id: 17,
-  name: "analytics",
-  title: "APPLICATION_ANALYTICS",
-  ModuleId: null,
-  path: '/analytics/reports/list'
-}, {
-  id: 18,
-  name: "setting",
-  title: "APPLICATION_SETTINGS",
-  ModuleId: null,
-  path: '/setting/updates/list'
-}, {
-  id: 19,
-  name: "integration",
-  title: "APPLICATION_INTEGRATION",
-  ModuleId: null,
-  path: '/market'
-}, {
-  id: 20,
-  name: "openchannel",
-  title: "APPLICATION_OPEN_CHANNEL",
-  ModuleId: 6,
-  path: '/channels/openchannel/accounts/list'
-}];
-
-models.Module.findAll().then(function(oldModules) {
-  var bulkModules = [];
-  oldModules = _.map(oldModules, 'id');
-  newModules.forEach(function(module) {
-    if (_.includes(oldModules, module.id)) {
-      bulkModules.push(models.Module.update(module, {
-        where: {
-          id: module.id
-        }
-      }));
-    } else {
-      bulkModules.push(models.Module.create(module));
-    }
-  });
-  return bulkModules;
-}).all().then(function() {
-  console.log('Finished populating modules');
-}).catch(function(err) {
-  console.log('Error populating modules:', err);
-});
-
-models.Team.create({
-  name: "T1",
-  description: "Default Team",
-  defaultEntry: true
-}).then(function(team) {
-  models.User.findAll({
-    where: {
-      role: 'agent'
-    }
-  }).then(function(users) {
-    team.addUsers(_.map(users, 'id')).then(function() {
-      models.ChatQueue.create({
-        name: "CQ1",
-        description: "CQ1 Desc",
-        timeout: 5,
-        strategy: "rrmemory"
-      }).then(function(chatQueue) {
-        console.log('Finished populating chat queue 1');
-        models.Team.findOne({
-          where: {
-            name: 'T1'
-          },
-          include: [{
-            all: true
-          }]
-        }).then(function(team) {
-          chatQueue.addUsers(_.map(team.Users, 'id')).catch(function(err) {
-            // console.error(err);
-          });
-        }).catch(function(err) {
-          // console.error(err);
-        });
-      });
-      models.MailQueue.create({
-        name: "MQ1",
-        description: "MQ1 Desc",
-        timeout: 5,
-        strategy: "rrmemory"
-      }).then(function(mailQueue) {
-        console.log('Finished populating mail queue 1');
-        models.Team.findOne({
-          where: {
-            name: 'T1'
-          },
-          include: [{
-            all: true
-          }]
-        }).then(function(team) {
-          if (team) {
-            console.log('team found');
-          } else {
-            console.log('test');
-          }
-          mailQueue.addUsers(_.map(team.Users, 'id')).catch(function(err) {
-            // console.error(err);
-          });
-        }).catch(function(err) {
-          // console.error(err);
-        });
-      });
-      models.FaxQueue.create({
-        name: "FQ1",
-        description: "FQ1 Desc",
-        timeout: 5,
-        strategy: "rrmemory"
-      }).then(function(faxQueue) {
-        console.log('Finished populating fax queue 1');
-        models.Team.findOne({
-          where: {
-            name: 'T1'
-          },
-          include: [{
-            all: true
-          }]
-        }).then(function(team) {
-          faxQueue.addUsers(_.map(team.Users, 'id')).catch(function(err) {
-            // console.error(err);
-          });
-        }).catch(function(err) {
-          // console.error(err);
-        });
-      });
-    }).catch(function(err) {
-      // console.error(err);
-    });
-  }).catch(function(err) {
-    // console.error(err);
-  });
-}).catch(function(err) {
-  // console.error(err);
-});
-
-models.MailAccount.create({
-  name: "xCally Development",
-  description: "xCally Development",
-  address: "[email-masked]"
-}).then(function(mailAccount) {
-  console.log('Finished populating mail account');
-  models.MailServerIn.create({
-    description: 'xcally',
-    host: 'imap.xcally.com',
-    username: [email-masked]',
-    password: 'phokucloka',
-    port: 143,
-    mailbox: 'INBOX',
-    ssl: false,
-    delete: false,
-    filter: 'UNSEEN',
-    protocol: 'IMAP',
-    MailAccountId: mailAccount.id
-  }).then(function() {
-    console.log('Finished populating mail server in');
-    models.MailServerOut.create({
-      description: 'xcally',
-      host: 'smtp.xcally.com',
-      username: [email-masked]',
-      password: 'phokucloka',
-      port: 587,
-      ssl: false,
-      MailAccountId: mailAccount.id
-    }).then(function() {
-      console.log('Finished populating mail server out');
-    }).catch(function(err) {
-      // console.error(err);
-    });
-  }).catch(function(err) {
-    // console.error(err);
-  });
-});
-// models.FaxAccount
-//   .create({
-//     description: 'FA1 Desc',
-//     name: 'FA1',
-//     phone: '01119827770',
-//     ecm: true,
-//     faxheader: 'xCALLY',
-//     localid: '01119827770',
-//     maxrate: '9600',
-//     minrate: '14400',
-//   })
-//   .then(function(faxAccount) {
-//     console.log('Finished populating fax account');
-//
-//     models.Trunk
-//       .findOne({
-//         where: {
-//           name: 'citalia'
-//         }
-//       })
-//       .then(function(trunk) {
-//         faxAccount
-//           .setTrunk(trunk)
-//           .catch(function(err) {
-//             // console.error(err);
-//           });
-//
-//
-//         models.VoiceExtension
-//           .create({
-//             context: 'from-voip-provider',
-//             exten: '01119827770',
-//             priority: 1,
-//             app: 'Goto',
-//             appdata: 'inbound-fax,s,1',
-//             type: 'inbound-fax'
-//           })
-//
-//       })
-//       .catch(function(err) {
-//         // console.error(err);
-//       });
-//
-//     models.FaxQueue
-//       .findAll()
-//       .then(function(faxQueues) {
-//         models.FaxApplication
-//           .create({
-//             app: 'queue',
-//             appdata: faxQueues[0].id,
-//             priority: 1,
-//             timeout: 30,
-//             FaxAccountId: faxAccount.id,
-//             FaxQueueId: faxQueues[0].id
-//           })
-//           .then(function() {
-//             console.log('Finished populating chat website application 1');
-//           })
-//           .catch(function(err) {
-//             // console.error(err);
-//           });
-//
-//         models.FaxApplication
-//           .create({
-//             app: 'queue',
-//             appdata: faxQueues[1].id,
-//             priority: 2,
-//             timeout: 30,
-//             FaxAccountId: faxAccount.id,
-//             FaxQueueId: faxQueues[1].id
-//           })
-//           .then(function() {
-//             console.log('Finished populating chat website application 2');
-//           })
-//           .catch(function(err) {
-//             // console.error(err);
-//           });
-//       })
-//       .catch(function(err) {
-//         // console.error(err);
-//       });
-//   })
-//   .catch(function(err) {
-//     // console.error(err);
-//   });
-// models.FaxAccount
-//   .create({
-//     description: 'FA1 Desc',
-//     name: 'FA1',
-//     phone: '01119827770',
-//     ecm: true,
-//     faxheader: 'xCALLY',
-//     localid: '01119827770',
-//     maxrate: '9600',
-//     minrate: '14400',
-//   })
-//   .then(function (faxAccount) {
-//     console.log('Finished populating fax account');
-//
-//     models.Trunk
-//       .findOne({
-//         where: {
-//           name: 'citalia'
-//         }
-//       })
-//       .then(function (trunk) {
-//         faxAccount
-//           .setTrunk(trunk)
-//           .catch(function (err) {
-//             // console.error(err);
-//           });
-//
-//
-//         models.VoiceExtension
-//           .create({
-//             context: 'from-voip-provider',
-//             exten: '01119827770',
-//             priority: 1,
-//             app: 'Goto',
-//             appdata: 'inbound-fax,s,1',
-//             type: 'inbound-fax',
-//             TrunkId: trunk.name
-//           })
-//
-//       })
-//       .catch(function (err) {
-//         // console.error(err);
-//       });
-//
-//     models.FaxQueue
-//       .findAll()
-//       .then(function (faxQueues) {
-//         models.FaxApplication
-//           .create({
-//             app: 'queue',
-//             appdata: faxQueues[0].id,
-//             priority: 1,
-//             timeout: 30,
-//             FaxAccountId: faxAccount.id,
-//             FaxQueueId: faxQueues[0].id
-//           })
-//           .then(function () {
-//             console.log('Finished populating chat website application 1');
-//           })
-//           .catch(function (err) {
-//             // console.error(err);
-//           });
-//
-//         models.FaxApplication
-//           .create({
-//             app: 'queue',
-//             appdata: faxQueues[1].id,
-//             priority: 2,
-//             timeout: 30,
-//             FaxAccountId: faxAccount.id,
-//             FaxQueueId: faxQueues[1].id
-//           })
-//           .then(function () {
-//             console.log('Finished populating chat website application 2');
-//           })
-//           .catch(function (err) {
-//             // console.error(err);
-//           });
-//       })
-//       .catch(function (err) {
-//         // console.error(err);
-//       });
-//   })
-//   .catch(function (err) {
-//     // console.error(err);
-//   });
-// models.VoiceExtension
-//   .bulkCreate([{
-//     context: 'outbound-fax',
-//     exten: 's',
-//     priority: 1,
-//     app: 'NoOp',
-//     appdata: 'Fax UUID: ${FAXUUID}',
-//     type: 'outbound-fax'
-//   }, {
-//     context: 'outbound-fax',
-//     exten: 's',
-//     priority: 2,
-//     app: 'UserEvent',
-//     appdata: 'Fax,uuid: ${FAXUUID}',
-//     type: 'outbound-fax'
-//   }, {
-//     context: 'outbound-fax',
-//     exten: 's',
-//     priority: 3,
-//     app: 'Set',
-//     appdata: 'FAXOPT(filename):${FAXFILE}',
-//     type: 'outbound-fax'
-//   }, {
-//     context: 'outbound-fax',
-//     exten: 's',
-//     priority: 4,
-//     app: 'Set',
-//     appdata: 'FAXOPT(ecm):${ECM}',
-//     type: 'outbound-fax'
-//   }, {
-//     context: 'outbound-fax',
-//     exten: 's',
-//     priority: 5,
-//     app: 'Set',
-//     appdata: 'FAXOPT(headerinfo):${FAXHEADER}',
-//     type: 'outbound-fax'
-//   }, {
-//     context: 'outbound-fax',
-//     exten: 's',
-//     priority: 6,
-//     app: 'Set',
-//     appdata: 'FAXOPT(localstationid):${LOCALID}',
-//     type: 'outbound-fax'
-//   }, {
-//     context: 'outbound-fax',
-//     exten: 's',
-//     priority: 7,
-//     app: 'Set',
-//     appdata: 'FAXOPT(maxrate):${MAXRATE}',
-//     type: 'outbound-fax'
-//   }, {
-//     context: 'outbound-fax',
-//     exten: 's',
-//     priority: 8,
-//     app: 'Set',
-//     appdata: 'FAXOPT(minrate):${MINRATE}',
-//     type: 'outbound-fax'
-//   }, {
-//     context: 'outbound-fax',
-//     exten: 's',
-//     priority: 9,
-//     app: 'SendFAX',
-//     appdata: '${FAXFILE},d',
-//     type: 'outbound-fax'
-//   }, {
-//     context: 'outbound-fax',
-//     exten: 's',
-//     priority: 10,
-//     app: 'NoOp',
-//     appdata: 'ERROR "${TIMESTAMP}" "NO_STATUS" "NO_PAGES"',
-//     type: 'outbound-fax'
-//   }, {
-//     context: 'outbound-fax',
-//     exten: 'h',
-//     priority: 1,
-//     app: 'NoOp',
-//     appdata: 'FAXOPT(ecm) : ${FAXOPT(ecm)}',
-//     type: 'outbound-fax'
-//   }, {
-//     context: 'outbound-fax',
-//     exten: 'h',
-//     priority: 2,
-//     app: 'NoOp',
-//     appdata: 'FaxStatus : ${FAXSTATUS}',
-//     type: 'outbound-fax'
-//   }, {
-//     context: 'outbound-fax',
-//     exten: 'h',
-//     priority: 3,
-//     app: 'NoOp',
-//     appdata: 'FaxStatusString : ${FAXSTATUSSTRING}',
-//     type: 'outbound-fax'
-//   }, {
-//     context: 'outbound-fax',
-//     exten: 'h',
-//     priority: 4,
-//     app: 'NoOp',
-//     appdata: 'FaxError : ${FAXERROR}',
-//     type: 'outbound-fax'
-//   }, {
-//     context: 'outbound-fax',
-//     exten: 'h',
-//     priority: 5,
-//     app: 'NoOp',
-//     appdata: 'RemoteStationID : ${REMOTESTATIONID}',
-//     type: 'outbound-fax'
-//   }, {
-//     context: 'outbound-fax',
-//     exten: 'h',
-//     priority: 6,
-//     app: 'NoOp',
-//     appdata: 'FaxPages : ${FAXPAGES}',
-//     type: 'outbound-fax'
-//   }, {
-//     context: 'outbound-fax',
-//     exten: 'h',
-//     priority: 7,
-//     app: 'NoOp',
-//     appdata: 'FaxBitRate : ${FAXBITRATE}',
-//     type: 'outbound-fax'
-//   }, {
-//     context: 'outbound-fax',
-//     exten: 'h',
-//     priority: 8,
-//     app: 'NoOp',
-//     appdata: 'FaxResolution : ${FAXRESOLUTION}',
-//     type: 'outbound-fax'
-//   }, {
-//     context: 'outbound-fax',
-//     exten: 'h',
-//     priority: 9,
-//     app: 'NoOp',
-//     appdata: 'OK "${TIMESTAMP}" "${FAXSTATUSSTRING}" "${FAXPAGES}"',
-//     type: 'outbound-fax'
-//   }], {
-//     ignoreDuplicates: true
-//   })
-//   .then(function() {
-//     console.log('Finished populating fax outbound voice extension');
-//   });
-//
-// models.VoiceExtension
-//   .bulkCreate([{
-//     context: 'inbound-fax',
-//     exten: 's',
-//     priority: 1,
-//     app: 'NoOp',
-//     appdata: '**** FAX RECEIVED from ${CALLERID(num)} ${STRFTIME(${EPOCH},,%c)} ****',
-//     type: 'inbound-fax'
-//   }, {
-//     context: 'inbound-fax',
-//     exten: 's',
-//     priority: 2,
-//     app: 'Set',
-//     appdata: 'FAXOPT(ecm):yes',
-//     type: 'inbound-fax'
-//   }, {
-//     context: 'inbound-fax',
-//     exten: 's',
-//     priority: 3,
-//     app: 'Set',
-//     appdata: 'FILENAME:${UNIQUEID}',
-//     type: 'inbound-fax'
-//   }, {
-//     context: 'inbound-fax',
-//     exten: 's',
-//     priority: 4,
-//     app: 'Set',
-//     appdata: 'FAXFILE:${FILENAME}.tif',
-//     type: 'inbound-fax'
-//   }, {
-//     context: 'inbound-fax',
-//     exten: 's',
-//     priority: 5,
-//     app: 'Set',
-//     appdata: 'FAXOPT(headerinfo):Received by XeniaLAB ${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M)}',
-//     type: 'inbound-fax'
-//   }, {
-//     context: 'inbound-fax',
-//     exten: 's',
-//     priority: 6,
-//     app: 'Set',
-//     appdata: 'FAXOPT(localstationid):${LOCALID}',
-//     type: 'inbound-fax'
-//   }, {
-//     context: 'inbound-fax',
-//     exten: 's',
-//     priority: 7,
-//     app: 'Set',
-//     appdata: 'FAXOPT(maxrate):${MAXRATE}',
-//     type: 'inbound-fax'
-//   }, {
-//     context: 'inbound-fax',
-//     exten: 's',
-//     priority: 8,
-//     app: 'Set',
-//     appdata: 'FAXOPT(minrate):${MINRATE}',
-//     type: 'inbound-fax'
-//   }, {
-//     context: 'inbound-fax',
-//     exten: 's',
-//     priority: 9,
-//     app: 'NoOp',
-//     appdata: 'FAXOPT(ecm) : ${FAXOPT(ecm)}',
-//     type: 'inbound-fax'
-//   }, {
-//     context: 'inbound-fax',
-//     exten: 's',
-//     priority: 10,
-//     app: 'NoOp',
-//     appdata: 'FAXOPT(headerinfo) : ${FAXOPT(headerinfo)}',
-//     type: 'inbound-fax'
-//   }, {
-//     context: 'inbound-fax',
-//     exten: 's',
-//     priority: 11,
-//     app: 'NoOp',
-//     appdata: 'FAXOPT(localstationid) : ${FAXOPT(localstationid)}',
-//     type: 'inbound-fax'
-//   }, {
-//     context: 'inbound-fax',
-//     exten: 's',
-//     priority: 12,
-//     app: 'NoOp',
-//     appdata: 'FAXOPT(maxrate) : ${FAXOPT(maxrate)}',
-//     type: 'inbound-fax'
-//   }, {
-//     context: 'inbound-fax',
-//     exten: 's',
-//     priority: 13,
-//     app: 'NoOp',
-//     appdata: 'FAXOPT(minrate) : ${FAXOPT(minrate)}',
-//     type: 'inbound-fax'
-//   }, {
-//     context: 'inbound-fax',
-//     exten: 's',
-//     priority: 14,
-//     app: 'NoOp',
-//     appdata: '**** RECEIVING FAX : ${FAXFILE} ****',
-//     type: 'inbound-fax'
-//   }, {
-//     context: 'inbound-fax',
-//     exten: 's',
-//     priority: 15,
-//     app: 'ReceiveFax',
-//     appdata: '/tmp/${FAXFILE}',
-//     type: 'inbound-fax'
-//   }, {
-//     context: 'inbound-fax',
-//     exten: 's',
-//     priority: 16,
-//     app: 'Hangup',
-//     type: 'inbound-fax'
-//   }, {
-//     context: 'inbound-fax',
-//     exten: 'h',
-//     priority: 1,
-//     app: 'NoOp',
-//     appdata: 'FAXOPT(ecm) : ${FAXOPT(ecm)}',
-//     type: 'inbound-fax'
-//   }], {
-//     ignoreDuplicates: true
-//   })
-//   .then(function() {
-//     console.log('Finished populating fax outbound voice extension');
-//   });
-
-models.SquareProject.bulkCreate([{
-  name: "project1",
-  description: "description project"
-}], {
-  ignoreDuplicates: true
-}).then(function() {
-  console.log('Finished populating square projects');
-});
-
-models.ChatWebsite.create({
-  name: 'xCally Shop',
-  description: 'xCally Shop',
-  address: 'http://www.xcally.com/shop/',
-  color: '#f51111',
-  color_focus: '#f51111',
-  color_button: '#f51111',
-  remote: 'http://localhost:9000',
-  animation: true,
-  header_shape: 'squared',
-  header_online: 'We are here!',
-  online_message: 'Questions? Insert your name and email address to start a live-chat with our support team.',
-  username_placeholder: 'Your name',
-  email_placeholder: 'Your email address',
-  start_chat_button: 'Chat',
-  header_offline: 'Contact us',
-  offline_message: "<strong>We're not online.</strong><br />It doesn't mean we're not there to help - leave your message below and we'll be in touch as soon as possible.'",
-  enquiry_message_placeholder: 'Your message...',
-  enquiry_button: 'Leave message',
-  download_transcript: true
-}).then(function(chatWebsite) {
-  console.log('Finished populating chat website');
-  models.ChatQueue.findAll().then(function(chatQueues) {
-    models.ChatApplication.create({
-      app: 'queue',
-      appdata: chatQueues[0].id,
-      priority: 1,
-      timeout: 30,
-      ChatWebsiteId: chatWebsite.id,
-      ChatQueueId: chatQueues[0].id
-    }).then(function() {
-      console.log('Finished populating chat website application 1');
-    }).catch(function(err) {
-      // console.error(err);
-    });
-    models.ChatApplication.create({
-      app: 'queue',
-      appdata: chatQueues[1].id,
-      priority: 2,
-      timeout: 30,
-      ChatWebsiteId: chatWebsite.id,
-      ChatQueueId: chatQueues[1].id
-    }).then(function() {
-      console.log('Finished populating chat website application 2');
-    }).catch(function(err) {
-      // console.error(err);
-    });
-  }).catch(function(err) {
-    // console.error(err);
-  });
-}).catch(function(err) {
-  // console.error(err);
-});
-
-models.Variable.bulkCreate([{
-  name: "variable1",
-  description: "description project"
-}], {
-  ignoreDuplicates: true
-}).then(function() {
-  console.log('Finished populating variables');
-});
-
-models.VoiceContext.bulkCreate([{
-  name: "from-sip",
-  description: "Default context (DO NOT DELETE)",
-  defaultEntry: true
-}, {
-  name: "from-voip-provider",
-  description: "Default context (DO NOT DELETE)",
-  defaultEntry: true
-}, {
-  name: "inbound-fax",
-  description: "Default context (DO NOT DELETE)",
-  defaultEntry: true
-}, {
-  name: "outbound-fax",
-  description: "Default context (DO NOT DELETE)",
-  defaultEntry: true
-}, {
-  name: "from-voicemail",
-  description: "Default context (DO NOT DELETE)",
-  defaultEntry: true
-}], {
-  ignoreDuplicates: true,
-  individualHooks: true
-}).then(function() {
-  console.log('Finished populating context variables');
-});
-
-models.VoiceMusicOnHold.bulkCreate([{
-  name: "default",
-  mode: "files",
-  directory: 'var/lib/asterisk/moh',
-  sort: 'alpha',
-  format: 'wav',
-  defaultEntry: true
-}], {
-  ignoreDuplicates: true,
-  individualHooks: true
-}).then(function() {
-  console.log('Finished populating moh variables');
-});
-
-models.Setting.bulkCreate([{
-  id: 1,
-  min_internal: 1000,
-  soundPath: '/var/opt/motion/server/files/sounds/converted'
-}], {
-  ignoreDuplicates: true,
-  individualHooks: true
-}).then(function() {
-  console.log('Finished populating moh variables');
-});
-
-models.Dashboard.bulkCreate([{
-  id: 1,
-  name: 'Motion Dashboard',
-  model: JSON.stringify({
-    title: 'Motion Dashboard',
-    rows: [{
-      columns: [{
-        styleClass: 'col-md-4',
-        widgets: [{
-          type: 'clock',
-          title: 'Clock',
-          config: {
-            timePattern: 'hh:mm:ss a',
-            datePattern: 'dddd, MMMM Do YYYY'
-          }
-        }]
-      }, {
-        styleClass: 'col-md-8',
-        widgets: [{
-          type: 'iframe',
-          title: 'Iframe',
-          config: {
-            url: 'https://demo.xcally.com/shop/'
-          }
-        }]
-      }]
-    }]
-  }),
-  defaultEntry: true,
-  editable: false
-}], {
-  ignoreDuplicates: true,
-  individualHooks: true
-}).then(function() {
-  console.log('Finished populating moh variables');
-});
-
-var newIntegrations = [{
-  name: 'Zendesk',
-  version: '1.0.0',
-  author: 'XeniaLAB s.r.l.',
-  logo: 'assets/images/media/zendesk2.png',
-  state: 'zendesk',
-  description: 'Start using xCALLY - Zendesk integration: Auto-Generated Tickets, fully customizable comments, Custom Fields management, Tag support and Simple Setup',
-  link: 'https://wiki.xcallymotion.com/display/XMD/Zendesk+integration'
-}, {
-  name: 'Salesforce',
-  version: '1.0.0',
-  author: 'XeniaLAB s.r.l.',
-  logo: 'assets/images/media/salesforce2.png',
-  state: 'salesforce',
-  description: 'Start using xCALLY - Salesforce integration: Auto-Generated Tasks, fully customizable comments, Custom Fields management and OpenCTI support',
-  link: 'https://wiki.xcallymotion.com/display/XMD/Salesforce+integration'
-}, {
-  name: 'iFrame',
-  version: '1.0.0',
-  author: 'XeniaLAB s.r.l.',
-  logo: 'assets/images/media/iframe.png',
-  state: 'iframe',
-  description: 'Start using iFrame integration: enable your agents to view external pages (like your CRM) directly from Motion GUI',
-  link: 'https://wiki.xcallymotion.com/display/XMD/iFrame+Integration'
-}, {
-  name: 'Desk.com',
-  version: '1.0.0',
-  author: 'XeniaLAB s.r.l.',
-  logo: 'assets/images/media/desk2.png',
-  state: 'desk',
-  description: 'Description for Desk.com asdnvlsdbjv saeklbvqwoVBQ'
-}, {
-  name: 'Freshdesk',
-  version: '1.0.0',
-  author: 'XeniaLAB s.r.l.',
-  logo: 'assets/images/media/freshdesk.png',
-  state: 'freshdesk',
-  description: 'Description for Freshdesk'
-}, {
-  name: 'SugarCRM',
-  version: '1.0.0',
-  author: 'XeniaLAB s.r.l.',
-  logo: 'assets/images/media/sugarcrm2.png',
-  state: 'sugarcrm',
-  description: 'Description for SugarCRM'
-}];
-
-models.Integration
-  .findAll()
-  .then(function(oldIntegrations) {
-    var bulkIntegrations = [];
-    oldIntegrations = _.map(oldIntegrations, 'state');
-    newIntegrations.forEach(function(integration) {
-      if (_.includes(oldIntegrations, integration.state)) {
-        bulkIntegrations.push(models.Integration.update(integration, {
-          where: {
-            state: integration.state
-          }
-        }));
-      } else {
-        bulkIntegrations.push(models.Integration.create(integration));
-      }
-    });
-    return bulkIntegrations;
-  })
-  .all()
-  .then(function() {
-    console.log('Finished populating integrations');
-  })
-  .catch(function(err) {
-    console.log('Error populating integrations:', err);
-  });
-
-var newDefaulReports = [{
-  "id": 1,
-  "name": "Queue - Details",
-  "description": null,
-  "parent": "j4_3",
-  "table": "report_queue_history",
-  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
-}, {
-  "id": 2,
-  "name": "Details",
-  "description": "Calls details (cdr)",
-  "parent": "j20_1",
-  "table": "report_call_history",
-  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
-}, {
-  "id": 3,
-  "name": "Outbound",
-  "description": "Manual outbound calls detail",
-  "parent": "j20_1",
-  "table": "report_call_history",
-  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"type\",\"value\":\"outbound\"}]}}"
-}, {
-  "id": 4,
-  "name": "Calls by Queue",
-  "description": null,
-  "parent": "j4_7",
-  "table": "report_queue_history",
-  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
-}, {
-  "id": 5,
-  "name": "Details",
-  "description": null,
-  "parent": "j4_5",
-  "table": "report_agent_history",
-  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"agentcomplete\",\"value\":\"1\"}]}}"
-}, {
-  "id": 6,
-  "name": "Calls by Agent",
-  "description": null,
-  "parent": "j4_5",
-  "table": "report_agent_history",
-  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
-}, {
-  "id": 7,
-  "name": "Calls by Queue",
-  "description": null,
-  "parent": "j4_5",
-  "table": "report_agent_history",
-  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"agentcomplete\",\"value\":\"1\"}]}}"
-}, {
-  "id": 8,
-  "name": "Answer Time by Queue",
-  "description": null,
-  "parent": "j4_5",
-  "table": "report_agent_history",
-  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"agentcomplete\",\"value\":\"1\"}]}}"
-}, {
-  "id": 9,
-  "name": "Disconnection Cause",
-  "description": null,
-  "parent": "j4_5",
-  "table": "report_agent_history",
-  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"agentcomplete\",\"value\":\"1\"}]}}"
-}, {
-  "id": 10,
-  "name": "Details",
-  "description": null,
-  "parent": "j4_6",
-  "table": "report_queue_history",
-  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"queuecallercomplete\",\"value\":\"0\"}]}}"
-}, {
-  "id": 11,
-  "name": "Unanswered by Queue",
-  "description": null,
-  "parent": "j4_6",
-  "table": "report_queue_history",
-  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"queuecallercomplete\",\"value\":\"0\"}]}}"
-}, {
-  "id": 12,
-  "name": "Exit Cause",
-  "description": null,
-  "parent": "j4_6",
-  "table": "report_queue_history",
-  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"queuecallerexit\",\"value\":\"1\"}]}}"
-}, {
-  "id": 13,
-  "name": "Abandon Time by Queue",
-  "description": null,
-  "parent": "j4_6",
-  "table": "report_queue_history",
-  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"queuecallerabandon\",\"value\":\"1\"}]}}"
-}, {
-  "id": 14,
-  "name": "Calls by Date",
-  "description": null,
-  "parent": "j4_7",
-  "table": "report_queue_history",
-  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
-}, {
-  "id": 15,
-  "name": "Calls by Hour",
-  "description": null,
-  "parent": "j4_7",
-  "table": "report_queue_history",
-  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
-}, {
-  "id": 16,
-  "name": "Calls by Day",
-  "description": null,
-  "parent": "j4_7",
-  "table": "report_queue_history",
-  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
-}, {
-  "id": 17,
-  "name": "Calls by Type",
-  "description": null,
-  "parent": "j20_1",
-  "table": "report_call_history",
-  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
-}, {
-  "id": 18,
-  "name": "Outbound Calls Disposition",
-  "description": "Outbound calls grouped by disposition",
-  "parent": "j20_1",
-  "table": "report_call_history",
-  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"type\",\"value\":\"outbound\"}]}}"
-}, {
-  "id": 19,
-  "name": "Pause Time",
-  "description": null,
-  "parent": "j4_4",
-  "table": "report_member_history",
-  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"type\",\"value\":\"PAUSE\"},{\"condition\":\"=\",\"field\":\"channel\",\"value\":\"voice\"}]}}"
-}, {
-  "id": 20,
-  "name": "Login Time",
-  "description": null,
-  "parent": "j4_4",
-  "table": "report_member_history",
-  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"type\",\"value\":\"LOGIN\"},{\"condition\":\"=\",\"field\":\"channel\",\"value\":\"voice\"}]}}"
-}, {
-  "id": 21,
-  "name": "Website Summary",
-  "description": null,
-  "parent": "j4_1",
-  "table": "report_chat_session_history",
-  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
-}, {
-  "id": 22,
-  "name": "Session Detail",
-  "description": null,
-  "parent": "j4_1",
-  "table": "report_chat_session_history",
-  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}",
-}, {
-  "id": 23,
-  "name": "Chat by Agent",
-  "description": null,
-  "parent": "j4_1",
-  "table": "report_chat_session_history",
-  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"complete\",\"value\":\"1\"}]}}"
-}, {
-  "id": 24,
-  "name": "Chat by Queue",
-  "description": null,
-  "parent": "j4_1",
-  "table": "report_chat_session_history",
-  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"application\",\"value\":\"queue\"}]}}"
-}, {
-  "id": 25,
-  "name": "Details",
-  "description": "Agents status details",
-  "parent": "j4_4",
-  "table": "report_member_history",
-  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"channel\",\"value\":\"voice\"}]}}"
-}, {
-  "id": 26,
-  "name": "Summary",
-  "description": "CallySquare Summary",
-  "parent": "j112_1",
-  "table": "report_square_history",
-  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
-}, {
-  "id": 27,
-  "name": "Blocks",
-  "description": "CallySquare Blocks",
-  "parent": "j112_1",
-  "table": "report_square_details_history",
-  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
-}, {
-  "id": 28,
-  "name": "Login Details",
-  "description": "Agents status details",
-  "parent": "j24_1",
-  "table": "report_member_history",
-  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"channel\",\"value\":\"voice\"},{\"condition\":\"=\",\"field\":\"type\",\"value\":\"LOGIN\"}]}}"
-}, {
-  "id": 29,
-  "name": "Pause Time by Channel",
-  "description": "",
-  "parent": "j24_1",
-  "table": "report_member_history",
-  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"type\",\"value\":\"PAUSE\"}]}}"
-}, {
-  "id": 30,
-  "name": "Pause Details",
-  "description": "Agents status details",
-  "parent": "j4_4",
-  "table": "report_member_history",
-  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"channel\",\"value\":\"voice\"},{\"condition\":\"=\",\"field\":\"type\",\"value\":\"PAUSE\"}]}}"
-}, {
-  "id": 31,
-  "name": "Rating by Agent",
-  "description": null,
-  "parent": "j20_3",
-  "table": "voice_recordings",
-  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
-}, {
-  "id": 32,
-  "name": "Rating by Queue",
-  "description": null,
-  "parent": "j20_3",
-  "table": "voice_recordings",
-  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"IS NOT EMPTY\",\"field\":\"queue\",\"value\":\"\",\"required\":false}]}}"
-}, {
-  "id": 33,
-  "name": "Queue - Calls",
-  "description": null,
-  "parent": "j4_3",
-  "table": "report_queue_history",
-  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
-}, {
-  "id": 34,
-  "name": "Answer Time by Hour",
-  "description": null,
-  "parent": "j4_5",
-  "table": "report_agent_history",
-  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"agentcomplete\",\"value\":\"1\"}]}}"
-}, {
-  "id": 35,
-  "name": "Received emails by account",
-  "description": "Summary of the emails accepted by application for each account",
-  "parent": "j4_2",
-  "table": "report_mail_session_history",
-  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
-}, {
-  "id": 36,
-  "name": "Received emails by queue",
-  "description": "Summary of received email by queue",
-  "parent": "j4_2",
-  "table": "report_mail_session_history",
-  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"application\",\"value\":\"queue\",\"required\":true}]}}"
-}, {
-  "id": 37,
-  "name": "Accepted emails by agent",
-  "description": "Summary of accepted email by agent",
-  "parent": "j4_2",
-  "table": "report_mail_session_history",
-  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"timeout\",\"value\":\"0\",\"required\":true}]}}"
-}, {
-  "id": 38,
-  "name": "Messages Summary by Date",
-  "description": "Global messages summary by date",
-  "parent": "j4_2",
-  "table": "mail_messages",
-  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"auto\",\"value\":false}]}}"
-}, {
-  "id": 39,
-  "name": "Interactions detail",
-  "description": "Detailed report about the interactions",
-  "parent": "j4_2",
-  "table": "mail_rooms",
-  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
-}, {
-  "id": 40,
-  "name": "Disposition Summary",
-  "description": "Closed interactions by disposition (filtered by disposition not null)",
-  "parent": "j4_2",
-  "table": "mail_rooms",
-  "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"IS NOT NULL\",\"field\":\"disposition\",\"value\":\"\",\"required\":false}]}}"
-}, {
-  "id": 41,
-  "name": "Closed interactions by date",
-  "description": "Summary of closed interactions grouped by date + average handle time (from when the first email arrived to when the interaction has been closed)",
-  "parent": "j4_2",
-  "table": "mail_rooms",
-  "conditions": "{\"group\":{\"operator\":\"OR\",\"rules\":[{\"condition\":\"=\",\"field\":\"status\",\"value\":\"'CLOSED'\",\"required\":true}]}}"
-}];
-
-var newDefaultMetrics = [{
-  "id": 1,
-  "name": "Queue - TalkTime",
-  "table": "report_queue_history",
-  "metric": "UNIX_TIMESTAMP(queuecallercompleteAt)-UNIX_TIMESTAMP(queuecallerleaveAt)"
-}, {
-  "id": 2,
-  "name": "Queue - Abandon Time",
-  "table": "report_queue_history",
-  "metric": "UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt)"
-}, {
-  "id": 3,
-  "name": "Abandoned <10s",
-  "table": "report_queue_history",
-  "metric": "COUNT(IF(UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) <10,1,NULL))",
-  "description": "Count of abandoned calls within 10 seconds (Short Calls)"
-}, {
-  "id": 4,
-  "name": "Queue - AnswerTime",
-  "table": "report_queue_history",
-  "metric": "IF(queuecallercomplete=1,holdtime,null)"
-}, {
-  "id": 5,
-  "name": "Answered < 10s",
-  "table": "report_agent_history",
-  "metric": "COUNT(IF(holdtime<10,1,NULL))",
-  "description": "Count of answered calls within 10 seconds"
-}, {
-  "id": 6,
-  "name": "Answered 10-20s",
-  "table": "report_agent_history",
-  "metric": "COUNT(IF(holdtime >=10 AND holdtime <20,1,NULL))",
-  "description": "Count of answered calls between 10 and 20 seconds"
-}, {
-  "id": 7,
-  "name": "Answered 20-30s",
-  "table": "report_agent_history",
-  "metric": "COUNT(IF(holdtime >=20 AND holdtime <30,1,NULL))",
-  "description": "Count of answered calls between 20 and 30 seconds"
-}, {
-  "id": 8,
-  "name": "Answered >30s",
-  "table": "report_agent_history",
-  "metric": "COUNT(IF(holdtime >=30,1,NULL))",
-  "description": "Count of answered calls over 30 seconds"
-}, {
-  "id": 9,
-  "name": "Queue - Exit Time",
-  "table": "report_queue_history",
-  "metric": "UNIX_TIMESTAMP(queuecallerExitAt)-UNIX_TIMESTAMP(queuecallerjoinAt)"
-}, {
-  "id": 10,
-  "name": "Abandoned 10-60s",
-  "table": "report_queue_history",
-  "metric": "COUNT(IF(UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) >=10 AND UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) <60,1,NULL))",
-  "description": "Count of abandoned calls between 10 and 60 seconds"
-}, {
-  "id": 11,
-  "name": "Abandoned 60-120s",
-  "table": "report_queue_history",
-  "metric": "COUNT(IF(UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) >=60 AND UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) <120,1,NULL))",
-  "description": "Count of abandoned calls between 60 and 120 seconds"
-}, {
-  "id": 12,
-  "name": "Queue - Abandoned >120s",
-  "table": "report_queue_history",
-  "metric": "COUNT(IF(UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) >=120,1,NULL))",
-  "description": "Count of abandoned calls over 120 seconds"
-}, {
-  "id": 13,
-  "name": "Queue - JoinDate",
-  "table": "report_queue_history",
-  "metric": "DATE(queuecallerjoinat)",
-  "description": "Extract the date of the join queue"
-}, {
-  "id": 14,
-  "name": "Queue - JoinHour",
-  "table": "report_queue_history",
-  "metric": "HOUR(queuecallerjoinat)",
-  "description": "Extract the hour of the join queue"
-}, {
-  "id": 15,
-  "name": "Queue - JoinDay",
-  "table": "report_queue_history",
-  "metric": "DAY(queuecallerjoinat)",
-  "description": "Extract the day of the join queue"
-}, {
-  "id": 16,
-  "name": "Member - Event Duration",
-  "table": "report_member_history",
-  "metric": "UNIX_TIMESTAMP(exitAt)-UNIX_TIMESTAMP(enterAt)",
-  "description": "Member event duration in seconds"
-}, {
-  "id": 17,
-  "name": "Member - Total Event Duration",
-  "table": "report_member_history",
-  "metric": "SEC_TO_TIME(SUM(UNIX_TIMESTAMP(exitAt)-UNIX_TIMESTAMP(enterAt)))",
-  "description": "Total event duration"
-}, {
-  "id": 18,
-  "name": "Chat - Session Time",
-  "table": "report_chat_session_history",
-  "metric": "UNIX_TIMESTAMP(completeAt)-UNIX_TIMESTAMP(leaveAt)",
-  "description": "Session Time",
-}, {
-  "id": 19,
-  "name": "Chat - Queue",
-  "table": "report_chat_session_history",
-  "metric": "COUNT(IF(application=\"queue\",1,NULL))",
-  "description": "Chat queue application count",
-}, {
-  "id": 20,
-  "name": "Chat - Agent",
-  "table": "report_chat_session_history",
-  "metric": "COUNT(IF(application=\"agent\",1,NULL))",
-  "description": "Chat agent application count",
-}, {
-  "id": 21,
-  "name": "Chat - Avg Session Time",
-  "table": "report_chat_session_history",
-  "metric": "ROUND(AVG(UNIX_TIMESTAMP(completeAt)-UNIX_TIMESTAMP(leaveAt)))",
-  "description": "Average session time"
-}, {
-  "id": 22,
-  "name": "Member - Event Duration (HH:mm:ss)",
-  "table": "report_member_history",
-  "metric": "SEC_TO_TIME(UNIX_TIMESTAMP(exitAt)-UNIX_TIMESTAMP(enterAt))",
-  "description": "Member events duration in time format"
-}, {
-  "id": 23,
-  "name": "Square - Duration",
-  "table": "report_square_history",
-  "metric": "UNIX_TIMESTAMP(leaveAt)-UNIX_TIMESTAMP(joinAt)",
-  "description": "IVR Duration"
-}, {
-  "id": 24,
-  "name": "Queue - EndTime Call",
-  "table": "report_queue_history",
-  "metric": "CASE WHEN queuecallercomplete=1 THEN queuecallercompleteAt ELSE queuecallerLeaveAt END",
-  "description": null
-}, {
-  "id": 25,
-  "name": "Queue - Calls Result",
-  "table": "report_queue_history",
-  "metric": "CASE WHEN queuecallercomplete=1 THEN \"YES\" ELSE \"NO\" END",
-  "description": "Show if a call is answered or not"
-}];
-
-models.ReportTree.destroy({
-    where: {
-      id: 1
-    }
-  })
-  .then(function() {
-    return models.ReportTree.create({
-      id: 1,
-    })
-  })
-  .then(function() {
-    return models.ReportTree.findOrCreate({
-      where: {
-        id: 2
-      },
-      defaults: {
-        id: 2,
-        tree: '[{"id":"1","text":"Custom Reports","icon":"icon-book-open","li_attr":{"id":"1"},"a_attr":{"href":"#","id":"1_anchor"},"state":{"loaded":true,"opened":true,"selected":false,"disabled":false},"data":{},"parent":"#"},{"id":"2","text":"Basic Node","icon":true,"li_attr":{"id":"2"},"a_attr":{"href":"#","id":"2_anchor"},"state":{"loaded":true,"opened":true,"selected":false,"disabled":false},"data":{},"parent":"1"}]'
-      }
-    })
-  })
-  .then(function() {
-    return models.DefaultMetric.findAll();
-  })
-  .then(function(oldDefaultMetrics) {
-    var bulkDefaultMetrics = [];
-    oldDefaultMetrics = _.map(oldDefaultMetrics, 'id');
-    newDefaultMetrics.forEach(function(defaultMet) {
-      if (_.includes(oldDefaultMetrics, defaultMet.id)) {
-        bulkDefaultMetrics.push(models.DefaultMetric.update(defaultMet, {
-          where: {
-            id: defaultMet.id
-          }
-        }));
-      } else {
-        bulkDefaultMetrics.push(models.DefaultMetric.create(defaultMet));
-      }
-    });
-    return bulkDefaultMetrics;
-  })
-  .all()
-  .then(function() {
-    return models.DefaultReport.findAll()
-  })
-  .then(function(oldDefaultReports) {
-    var bulkDefaultReports = [];
-    oldDefaultReports = _.map(oldDefaultReports, 'id');
-    newDefaulReports.forEach(function(defaultRep) {
-      if (_.includes(oldDefaultReports, defaultRep.id)) {
-        bulkDefaultReports.push(models.DefaultReport.update(defaultRep, {
-          where: {
-            id: defaultRep.id
-          }
-        }));
-      } else {
-        bulkDefaultReports.push(models.DefaultReport.create(defaultRep));
-      }
-    });
-    return bulkDefaultReports;
-  })
-  .all()
-  .then(function() {
-    return models.ReportField.destroy({
-      where: {
-        DefaultReportId: {
-          $gt: 0
-        }
-      }
-    })
-  })
-  .then(function() {
-    return models.ReportField.bulkCreate([{
-      "field": "uniqueid",
-      "alias": "UniqueId",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 1
-    }, {
-      "field": "calleridnum",
-      "alias": "CallerIdNum",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 1
-    }, {
-      "field": "calleridname",
-      "alias": "CallerIdName",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 1
-    }, {
-      "field": "queue",
-      "alias": "Queue",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 1
-    }, {
-      "field": "queuecallerjoinAt",
-      "alias": "QueueJoinAt",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 1
-    }, {
-      "field": "queuecallerleaveAt",
-      "alias": "QueueLeaveAt",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 1
-    }, {
-      "field": "queuecallerabandon",
-      "alias": "QueueAbandon",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 1
-    }, {
-      "field": "queuecallerabandonAt",
-      "alias": "QueueAbandonAt",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 1
-    }, {
-      "field": "queuecallercomplete",
-      "alias": "Complete",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 1
-    }, {
-      "field": "queuecallercompleteAt",
-      "alias": "CompleteAt",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 1
-    }, {
-      "field": "queuecallerexit",
-      "alias": "QueueExit",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 1
-    }, {
-      "field": "queuecallerexitAt",
-      "alias": "QueueExitAt",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 1
-    }, {
-      "field": "queuecallerexitreason",
-      "alias": "QueueExitReason",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 1
-    }, {
-      "field": "exten",
-      "alias": "DID",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 1
-    }, {
-      "field": "UNIX_TIMESTAMP(queuecallercompleteAt)-UNIX_TIMESTAMP(queuecallerleaveAt)",
-      "alias": "TalkTime",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultMetricId": 1,
-      "DefaultReportId": 1
-    }, {
-      "field": "IF(queuecallercomplete=1,holdtime,null)",
-      "alias": "AnswerTime",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultMetricId": 4,
-      "DefaultReportId": 1
-    }, {
-      "field": "UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt)",
-      "alias": "AbandonTime",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultMetricId": 2,
-      "DefaultReportId": 1
-    }, {
-      "field": "uniqueid",
-      "alias": "UniqueID",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 2
-    }, {
-      "field": "type",
-      "alias": "Type",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 2
-    }, {
-      "field": "tag",
-      "alias": "Tag",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 2
-    }, {
-      "field": "source",
-      "alias": "Source",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 2
-    }, {
-      "field": "destination",
-      "alias": "Destination",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 2
-    }, {
-      "field": "callerid",
-      "alias": "CallerID",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 2
-    }, {
-      "field": "destinationchannel",
-      "alias": "DestChannel",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 2
-    }, {
-      "field": "lastapplication",
-      "alias": "LastApp",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 2
-    }, {
-      "field": "lastdata",
-      "alias": "LastData",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 2
-    }, {
-      "field": "starttime",
-      "alias": "StartTime",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 2
-    }, {
-      "field": "answertime",
-      "alias": "AnswerTime",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 2
-    }, {
-      "field": "endtime",
-      "alias": "EndTime",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 2
-    }, {
-      "field": "duration",
-      "alias": "Duration",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 2
-    }, {
-      "field": "disposition",
-      "alias": "Disposition",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 2
-    }, {
-      "field": "uniqueid",
-      "alias": "UniqueID",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 3
-    }, {
-      "field": "accountcode",
-      "alias": "AgentExtension",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 3
-    }, {
-      "field": "source",
-      "alias": "Source",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 3
-    }, {
-      "field": "destination",
-      "alias": "Destination",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 3
-    }, {
-      "field": "callerid",
-      "alias": "CallerId",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 3
-    }, {
-      "field": "starttime",
-      "alias": "StartTime",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 3
-    }, {
-      "field": "answertime",
-      "alias": "AnswerTime",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 3
-    }, {
-      "field": "endtime",
-      "alias": "EndTIme",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 3
-    }, {
-      "field": "duration",
-      "alias": "Duration",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 3
-    }, {
-      "field": "billableseconds",
-      "alias": "Billsec",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 3
-    }, {
-      "field": "disposition",
-      "alias": "Disposition",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 3
-    }, {
-      "field": "tag",
-      "alias": "Tag",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 3
-    }, {
-      "field": "queue",
-      "alias": "Queue",
-      "function": null,
-      "groupBy": 1,
-      "orderBy": null,
-      "DefaultReportId": 4
-    }, {
-      "field": "uniqueid",
-      "alias": "Offered",
-      "function": "COUNT",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 4
-    }, {
-      "field": "queuecallercomplete",
-      "alias": "Completed",
-      "function": "SUM",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 4
-    }, {
-      "field": "queuecallerabandon",
-      "alias": "Abandoned",
-      "function": "SUM",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 4
-    }, {
-      "field": "queuecallerexit",
-      "alias": "Unmanaged",
-      "function": "SUM",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 4
-    }, {
-      "field": "UNIX_TIMESTAMP(queuecallercompleteAt)-UNIX_TIMESTAMP(queuecallerleaveAt)",
-      "alias": "AvgTalkTime",
-      "function": "AVG",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultMetricId": 1,
-      "DefaultReportId": 4
-    }, {
-      "field": "UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt)",
-      "alias": "AvgAbandonTime",
-      "function": "AVG",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultMetricId": 1,
-      "DefaultReportId": 4
-    }, {
-      "field": "IF(queuecallercomplete=1,holdtime,null)",
-      "alias": "AvgAnswerTime",
-      "function": "AVG",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultMetricId": 4,
-      "DefaultReportId": 4
-    }, {
-      "field": "uniqueid",
-      "alias": "UniqueId",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 5
-    }, {
-      "field": "calleridnum",
-      "alias": "CallerIdNum",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 5
-    }, {
-      "field": "calleridname",
-      "alias": "CallerIdName",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 5
-    }, {
-      "field": "queue",
-      "alias": "Queue",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 5
-    }, {
-      "field": "membername",
-      "alias": "Agent",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 5
-    }, {
-      "field": "agentcalledAt",
-      "alias": "AgentCalledAt",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 5
-    }, {
-      "field": "agentconnectAt",
-      "alias": "AgentConnectAt",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 5
-    }, {
-      "field": "agentcompleteAt",
-      "alias": "AgentCompleteAt",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 5
-    }, {
-      "field": "holdtime",
-      "alias": "AnswerTime",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 5
-    }, {
-      "field": "talktime",
-      "alias": "TalkTime",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 5
-    }, {
-      "field": "agentacw",
-      "alias": "AgentACW",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 5
-    }, {
-      "field": "acwtime",
-      "alias": "AgentACWTime",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 5
-    }, {
-      "field": "agentcomplete",
-      "alias": "AgentComplete",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 5
-    }, {
-      "field": "reason",
-      "alias": "HangupReason",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 5
-    }, {
-      "field": "lastevent",
-      "alias": "LastEvent",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 5
-    }, {
-      "field": "exten",
-      "alias": "DID",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 5
-    }, {
-      "field": "membername",
-      "alias": "Agent",
-      "function": null,
-      "groupBy": 1,
-      "orderBy": null,
-      "DefaultReportId": 6
-    }, {
-      "field": "agentcomplete",
-      "alias": "Completed",
-      "function": "SUM",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 6
-    }, {
-      "field": "agentringnoanswer",
-      "alias": "RingNoAnswer",
-      "function": "SUM",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 6
-    }, {
-      "field": "talktime",
-      "alias": "TotTalkTime",
-      "function": "SUM",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 6
-    }, {
-      "field": "acwtime",
-      "alias": "TotACWTime",
-      "function": "SUM",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 6
-    }, {
-      "field": "talktime",
-      "alias": "AvgTalkTime",
-      "function": "AVG",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 6
-    }, {
-      "field": "acwtime",
-      "alias": "AvgACWTime",
-      "function": "AVG",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 6
-    }, {
-      "field": "queue",
-      "alias": "Queue",
-      "function": null,
-      "groupBy": 1,
-      "orderBy": null,
-      "DefaultReportId": 7
-    }, {
-      "field": "agentcomplete",
-      "alias": "Completed",
-      "function": "SUM",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 7
-    }, {
-      "field": "talktime",
-      "alias": "Tot TalkTime",
-      "function": "SUM",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 7
-    }, {
-      "field": "talktime",
-      "alias": "Avg TalkTime",
-      "function": "AVG",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 7
-    }, {
-      "field": "holdtime",
-      "alias": "Tot HoldTime",
-      "function": "SUM",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 7
-    }, {
-      "field": "holdtime",
-      "alias": "Avg HoldTime",
-      "function": "AVG",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 7
-    }, {
-      "field": "acwtime",
-      "alias": "Tot ACWTime",
-      "function": "SUM",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 7
-    }, {
-      "field": "acwtime",
-      "alias": "Avg ACWTime",
-      "function": "AVG",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 7
-    }, {
-      "field": "queue",
-      "alias": "Queue",
-      "function": null,
-      "groupBy": 1,
-      "orderBy": null,
-      "DefaultReportId": 8
-    }, {
-      "field": "agentcomplete",
-      "alias": "Tot Answered",
-      "function": "SUM",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 8
-    }, {
-      "field": "COUNT(IF(holdtime<10,1,NULL))",
-      "alias": "Answered <10s",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultMetricId": 5,
-      "DefaultReportId": 8
-    }, {
-      "field": "COUNT(IF(holdtime >=10 AND holdtime <20,1,NULL))",
-      "alias": "Answered 10-20s",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultMetricId": 6,
-      "DefaultReportId": 8
-    }, {
-      "field": "COUNT(IF(holdtime >=20 AND holdtime <30,1,NULL))",
-      "alias": "Answered 20-30s",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultMetricId": 7,
-      "DefaultReportId": 8
-    }, {
-      "field": "COUNT(IF(holdtime >=30,1,NULL))",
-      "alias": "Answered >30s",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultMetricId": 8,
-      "DefaultReportId": 8
-    }, {
-      "field": "reason",
-      "alias": "Reason",
-      "function": null,
-      "groupBy": 1,
-      "orderBy": null,
-      "DefaultReportId": 9
-    }, {
-      "field": "uniqueid",
-      "alias": "Calls",
-      "function": "COUNT",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 9
-    }, {
-      "field": "uniqueid",
-      "alias": "UniqueId",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 10
-    }, {
-      "field": "calleridnum",
-      "alias": "CallerIdNum",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 10
-    }, {
-      "field": "queue",
-      "alias": "Queue",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 10
-    }, {
-      "field": "queuecallerjoinAt",
-      "alias": "QueueJoinAt",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 10
-    }, {
-      "field": "queuecallerleaveAt",
-      "alias": "QueueLeaveAt",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 10
-    }, {
-      "field": "queuecallerabandon",
-      "alias": "QueueAbandon",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 10
-    }, {
-      "field": "queuecallerabandonAt",
-      "alias": "QueueAbandonAt",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 10
-    }, {
-      "field": "UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt)",
-      "alias": "Abandon Time",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultMetricId": 2,
-      "DefaultReportId": 10
-    }, {
-      "field": "queuecallerexit",
-      "alias": "QueueExit",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 10
-    }, {
-      "field": "queuecallerexitAt",
-      "alias": "QueueExitAt",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 10
-    }, {
-      "field": "queuecallerexitreason",
-      "alias": "QueueExitReason",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 10
-    }, {
-      "field": "UNIX_TIMESTAMP(queuecallerExitAt)-UNIX_TIMESTAMP(queuecallerjoinAt)",
-      "alias": "Exit Time",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultMetricId": 9,
-      "DefaultReportId": 10
-    }, {
-      "field": "position",
-      "alias": "QueuePosition",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 10
-    }, {
-      "field": "exten",
-      "alias": "DID",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 10
-    }, {
-      "field": "queue",
-      "alias": "Queue",
-      "function": null,
-      "groupBy": 1,
-      "orderBy": null,
-      "DefaultReportId": 11
-    }, {
-      "field": "queuecallerabandon",
-      "alias": "Abandoned",
-      "function": "SUM",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 11
-    }, {
-      "field": "UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt)",
-      "alias": "AvgAbandonTime",
-      "function": "AVG",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultMetricId": 2,
-      "DefaultReportId": 11
-    }, {
-      "field": "UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt)",
-      "alias": "Tot AbandonTime",
-      "function": "SUM",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultMetricId": 2,
-      "DefaultReportId": 11
-    }, {
-      "field": "queuecallerexit",
-      "alias": "Exited",
-      "function": "SUM",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 11
-    }, {
-      "field": "UNIX_TIMESTAMP(queuecallerExitAt)-UNIX_TIMESTAMP(queuecallerjoinAt)",
-      "alias": "Avg ExitedTIme",
-      "function": "AVG",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultMetricId": 9,
-      "DefaultReportId": 11
-    }, {
-      "field": "UNIX_TIMESTAMP(queuecallerExitAt)-UNIX_TIMESTAMP(queuecallerjoinAt)",
-      "alias": "Tot ExitedTime",
-      "function": "SUM",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultMetricId": 9,
-      "DefaultReportId": 11
-    }, {
-      "field": "queuecallerexitreason",
-      "alias": "Reason",
-      "function": null,
-      "groupBy": 1,
-      "orderBy": null,
-      "DefaultReportId": 12
-    }, {
-      "field": "queuecallerexit",
-      "alias": "Calls",
-      "function": "SUM",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 12
-    }, {
-      "field": "UNIX_TIMESTAMP(queuecallerExitAt)-UNIX_TIMESTAMP(queuecallerjoinAt)",
-      "alias": "Tot ExitTime",
-      "function": "SUM",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultMetricId": 9,
-      "DefaultReportId": 12
-    }, {
-      "field": "queue",
-      "alias": "Queue",
-      "function": null,
-      "groupBy": 1,
-      "orderBy": null,
-      "DefaultReportId": 13
-    }, {
-      "field": "queuecallerabandon",
-      "alias": "Tot Abandoned",
-      "function": "SUM",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 13
-    }, {
-      "field": "COUNT(IF(UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) <10,1,NULL))",
-      "alias": "Abandoned<10s",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultMetricId": 3,
-      "DefaultReportId": 13
-    }, {
-      "field": "COUNT(IF(UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) >=10 AND UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) <60,1,NULL))",
-      "alias": "Abandoned 10-60s",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultMetricId": 10,
-      "DefaultReportId": 13
-    }, {
-      "field": "COUNT(IF(UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) >=60 AND UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) <120,1,NULL))",
-      "alias": "Abandoned 60-120s",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultMetricId": 11,
-      "DefaultReportId": 13
-    }, {
-      "field": "COUNT(IF(UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) >=120,1,NULL))",
-      "alias": "Abandoned>120s",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultMetricId": 12,
-      "DefaultReportId": 13
-    }, {
-      "field": "DATE(queuecallerjoinat)",
-      "alias": "Date",
-      "function": null,
-      "groupBy": 1,
-      "orderBy": null,
-      "DefaultMetricId": 13,
-      "DefaultReportId": 14
-    }, {
-      "field": "uniqueid",
-      "alias": "Offered",
-      "function": "COUNT",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 14
-    }, {
-      "field": "queuecallercomplete",
-      "alias": "Completed",
-      "function": "SUM",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 14
-    }, {
-      "field": "queuecallerabandon",
-      "alias": "Abandoned",
-      "function": "SUM",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 14
-    }, {
-      "field": "queuecallerexit",
-      "alias": "Unmanaged",
-      "function": "SUM",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 14
-    }, {
-      "field": "UNIX_TIMESTAMP(queuecallercompleteAt)-UNIX_TIMESTAMP(queuecallerleaveAt)",
-      "alias": "AvgTalkTime",
-      "function": "AVG",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultMetricId": 1,
-      "DefaultReportId": 14
-    }, {
-      "field": "UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt)",
-      "alias": "AvgAbandonTime",
-      "function": "AVG",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultMetricId": 2,
-      "DefaultReportId": 14
-    }, {
-      "field": "IF(queuecallercomplete=1,holdtime,null)",
-      "alias": "AvgAnswerTime",
-      "function": "AVG",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultMetricId": 4,
-      "DefaultReportId": 14
-    }, {
-      "field": "HOUR(queuecallerjoinat)",
-      "alias": "Hour",
-      "function": null,
-      "groupBy": 1,
-      "orderBy": null,
-      "DefaultMetricId": 14,
-      "DefaultReportId": 15
-    }, {
-      "field": "uniqueid",
-      "alias": "Offered",
-      "function": "COUNT",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 15
-    }, {
-      "field": "queuecallercomplete",
-      "alias": "Completed",
-      "function": "SUM",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 15
-    }, {
-      "field": "queuecallerabandon",
-      "alias": "Abandoned",
-      "function": "SUM",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 15
-    }, {
-      "field": "queuecallerexit",
-      "alias": "Unmanaged",
-      "function": "SUM",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 15
-    }, {
-      "field": "UNIX_TIMESTAMP(queuecallercompleteAt)-UNIX_TIMESTAMP(queuecallerleaveAt)",
-      "alias": "AvgTalkTime",
-      "function": "AVG",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultMetricId": 1,
-      "DefaultReportId": 15
-    }, {
-      "field": "UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt)",
-      "alias": "AvgAbandonTime",
-      "function": "AVG",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultMetricId": 2,
-      "DefaultReportId": 15
-    }, {
-      "field": "IF(queuecallercomplete=1,holdtime,null)",
-      "alias": "AvgAnswerTime",
-      "function": "AVG",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultMetricId": 4,
-      "DefaultReportId": 15
-    }, {
-      "field": "DAY(queuecallerjoinat)",
-      "alias": "Day",
-      "function": null,
-      "groupBy": 1,
-      "orderBy": null,
-      "DefaultMetricId": 15,
-      "DefaultReportId": 16
-    }, {
-      "field": "uniqueid",
-      "alias": "Offered",
-      "function": "COUNT",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 16
-    }, {
-      "field": "queuecallercomplete",
-      "alias": "Completed",
-      "function": "SUM",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 16
-    }, {
-      "field": "queuecallerabandon",
-      "alias": "Abandoned",
-      "function": "SUM",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 16
-    }, {
-      "field": "queuecallerexit",
-      "alias": "Unmanaged",
-      "function": "SUM",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 16
-    }, {
-      "field": "UNIX_TIMESTAMP(queuecallercompleteAt)-UNIX_TIMESTAMP(queuecallerleaveAt)",
-      "alias": "AvgTalkTime",
-      "function": "AVG",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultMetricId": 1,
-      "DefaultReportId": 16
-    }, {
-      "field": "UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt)",
-      "alias": "AvgAbandonTime",
-      "function": "AVG",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultMetricId": 2,
-      "DefaultReportId": 16
-    }, {
-      "field": "IF(queuecallercomplete=1,holdtime,null)",
-      "alias": "AvgAnswerTime",
-      "function": "AVG",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultMetricId": 4,
-      "DefaultReportId": 16
-    }, {
-      "field": "type",
-      "alias": "Type",
-      "function": null,
-      "groupBy": 1,
-      "orderBy": null,
-      "DefaultReportId": 17
-    }, {
-      "field": "uniqueid",
-      "alias": "Calls",
-      "function": "COUNT",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 17
-    }, {
-      "field": "duration",
-      "alias": "Tot Duration",
-      "function": "SUM",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 17
-    }, {
-      "field": "duration",
-      "alias": "Avg Duration",
-      "function": "AVG",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 17
-    }, {
-      "field": "disposition",
-      "alias": "Disposition",
-      "function": null,
-      "groupBy": 1,
-      "orderBy": null,
-      "DefaultReportId": 18
-    }, {
-      "field": "uniqueid",
-      "alias": "Calls",
-      "function": "COUNT",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 18
-    }, {
-      "field": "duration",
-      "alias": "Tot Duration",
-      "function": "SUM",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 18
-    }, {
-      "field": "duration",
-      "alias": "Avg Duration",
-      "function": "AVG",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 18
-    }, {
-      "field": "membername",
-      "alias": "Agent",
-      "function": null,
-      "groupBy": 1,
-      "orderBy": "ASC",
-      "DefaultReportId": 19
-    }, {
-      "field": "data1",
-      "alias": "PauseType",
-      "function": null,
-      "groupBy": 1,
-      "orderBy": "ASC",
-      "DefaultReportId": 19
-    }, {
-      "field": "SEC_TO_TIME(SUM(UNIX_TIMESTAMP(exitAt)-UNIX_TIMESTAMP(enterAt)))",
-      "alias": "Duration",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultMetricId": 17,
-      "DefaultReportId": 19
-    }, {
-      "field": "membername",
-      "alias": "Agent",
-      "function": null,
-      "groupBy": 1,
-      "orderBy": "ASC",
-      "DefaultReportId": 20,
-    }, {
-      "field": "SEC_TO_TIME(SUM(UNIX_TIMESTAMP(exitAt)-UNIX_TIMESTAMP(enterAt)))",
-      "alias": "Duration",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultMetricId": 17,
-      "DefaultReportId": 20,
-    }, {
-      "field": "uniqueid",
-      "alias": "UniqueId",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 22,
-      "format": null
-    }, {
-      "field": "websitename",
-      "alias": "Website",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 22,
-      "format": null
-    }, {
-      "field": "visitorname",
-      "alias": "VisitorName",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 22,
-    }, {
-      "field": "visitoremail",
-      "alias": "VisitorEmail",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 22,
-      "format": null
-    }, {
-      "field": "membername",
-      "alias": "MemeberName",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 22,
-      "format": null
-    }, {
-      "field": "queuename",
-      "alias": "QueueName",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 22,
-      "format": null
-    }, {
-      "field": "joinAt",
-      "alias": "JoinAt",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 22,
-      "format": null
-    }, {
-      "field": "leaveAt",
-      "alias": "LeaveAt",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 22,
-      "format": null
-    }, {
-      "field": "completeAt",
-      "alias": "CompleteAt",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 22,
-      "format": null
-    }, {
-      "field": "complete",
-      "alias": "Complete",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 22,
-      "format": null
-    }, {
-      "field": "completeReason",
-      "alias": "CompleteReason",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 22,
-      "format": null
-    }, {
-      "field": "abandon",
-      "alias": "Abandon",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 22,
-      "format": null
-    }, {
-      "field": "unmanaged",
-      "alias": "Unmanage",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 22,
-      "format": null
-    }, {
-      "field": "membername",
-      "alias": "Agent",
-      "function": null,
-      "groupBy": 1,
-      "orderBy": null,
-      "DefaultReportId": 23,
-      "format": null
-    }, {
-      "field": "complete",
-      "alias": "Session",
-      "function": "SUM",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 23,
-      "format": null
-    }, {
-      "field": "COUNT(IF(application=\"queue\",1,NULL))",
-      "alias": "FromQueue",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "createdAt": "2016-05-14 18:13:01",
-      "updatedAt": "2016-05-14 18:13:01",
-      "DefaultMetricId": 19,
-      "DefaultReportId": 23,
-      "format": null
-    }, {
-      "field": "COUNT(IF(application=\"agent\",1,NULL))",
-      "alias": "DirectToAgent",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultMetricId": 20,
-      "DefaultReportId": 23,
-      "format": null
-    }, {
-      "field": "UNIX_TIMESTAMP(completeAt)-UNIX_TIMESTAMP(leaveAt)",
-      "alias": "Tot Session Time",
-      "function": "SUM",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultMetricId": 18,
-      "DefaultReportId": 23,
-      "format": "SEC_TO_TIME"
-    }, {
-      "field": "UNIX_TIMESTAMP(completeAt)-UNIX_TIMESTAMP(leaveAt)",
-      "alias": "Avg Session Time",
-      "function": "AVG",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultMetricId": 18,
-      "DefaultReportId": 23,
-      "format": "SEC_TO_TIME"
-    }, {
-      "field": "websitename",
-      "alias": "WebSite",
-      "function": null,
-      "groupBy": 1,
-      "orderBy": null,
-      "DefaultReportId": 21,
-      "format": null
-    }, {
-      "field": "uniqueid",
-      "alias": "Sessions",
-      "function": "COUNT DISTINCT",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 21,
-      "format": null
-    }, {
-      "field": "complete",
-      "alias": "Completed",
-      "function": "SUM",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 21,
-      "format": null
-    }, {
-      "field": "abandon",
-      "alias": "Abandoned",
-      "function": "SUM",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 21,
-      "format": null
-    }, {
-      "field": "UNIX_TIMESTAMP(completeAt)-UNIX_TIMESTAMP(leaveAt)",
-      "alias": "Session Time",
-      "function": "SUM",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultMetricId": 18,
-      "DefaultReportId": 21,
-      "format": "SEC_TO_TIME"
-    }, {
-      "field": "ROUND(AVG(UNIX_TIMESTAMP(completeAt)-UNIX_TIMESTAMP(leaveAt)))",
-      "alias": "Avg Session Time",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultMetricId": 21,
-      "DefaultReportId": 21,
-      "format": "SEC_TO_TIME"
-    }, {
-      "field": "queuename",
-      "alias": "Queue",
-      "function": null,
-      "groupBy": 1,
-      "orderBy": null,
-      "DefaultReportId": 24,
-      "format": null
-    }, {
-      "field": "uniqueid",
-      "alias": "Sessions",
-      "function": "COUNT",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 24,
-      "format": null
-    }, {
-      "field": "complete",
-      "alias": "Completed",
-      "function": "SUM",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 24,
-      "format": null
-    }, {
-      "field": "abandon",
-      "alias": "Abandoned",
-      "function": "SUM",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 24,
-      "format": null
-    }, {
-      "field": "unmanaged",
-      "alias": "Unmanaged",
-      "function": "SUM",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 24,
-      "format": null
-    }, {
-      "field": "UNIX_TIMESTAMP(completeAt)-UNIX_TIMESTAMP(leaveAt)",
-      "alias": "Session Time",
-      "function": "SUM",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultMetricId": 18,
-      "DefaultReportId": 24,
-      "format": "SEC_TO_TIME"
-    }, {
-      "field": "ROUND(AVG(UNIX_TIMESTAMP(completeAt)-UNIX_TIMESTAMP(leaveAt)))",
-      "alias": "Avg Session Time",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultMetricId": 21,
-      "DefaultReportId": 24,
-      "format": "SEC_TO_TIME"
-    }, {
-      "field": "membername",
-      "alias": "Agent",
-      "function": null,
-      "format": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 25,
-    }, {
-      "field": "interface",
-      "alias": "Interface",
-      "function": null,
-      "format": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 25,
-    }, {
-      "field": "type",
-      "alias": "Event",
-      "function": null,
-      "format": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 25,
-    }, {
-      "field": "data1",
-      "alias": "Pause/ACW Queue",
-      "function": null,
-      "format": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 25,
-    }, {
-      "field": "enterAt",
-      "alias": "EnterAt",
-      "function": null,
-      "format": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 25,
-    }, {
-      "field": "exitAt",
-      "alias": "ExitAt",
-      "function": null,
-      "format": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 25,
-    }, {
-      "field": "SEC_TO_TIME(UNIX_TIMESTAMP(exitAt)-UNIX_TIMESTAMP(enterAt))",
-      "alias": "Duration",
-      "function": null,
-      "format": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultMetricId": 22,
-      "DefaultReportId": 25
-    }, {
-      "field": "project_name",
-      "alias": "Project Name",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 26
-    }, {
-      "field": "uniqueid",
-      "alias": "UniqueID",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 26,
-    }, {
-      "field": "callerid",
-      "alias": "CallerID",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 26,
-    }, {
-      "field": "dnid",
-      "alias": "DID",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 26,
-    }, {
-      "field": "joinAt",
-      "alias": "Start Time",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": "ASC",
-      "DefaultReportId": 26,
-    }, {
-      "field": "leaveAt",
-      "alias": "End Time",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 26,
-    }, {
-      "field": "UNIX_TIMESTAMP(leaveAt)-UNIX_TIMESTAMP(joinAt)",
-      "alias": "Duration",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultMetricId": 23,
-      "DefaultReportId": 26,
-      "format": "SEC_TO_TIME"
-    }, {
-      "field": "project_name",
-      "alias": "Project Name",
-      "function": null,
-      "format": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 27,
-    }, {
-      "field": "callerid",
-      "alias": "Caller Id",
-      "function": null,
-      "format": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 27,
-    }, {
-      "field": "uniqueid",
-      "alias": "Unique Id",
-      "function": null,
-      "format": null,
-      "groupBy": 1,
-      "orderBy": null,
-      "DefaultReportId": 27,
-    }, {
-      "field": "node",
-      "alias": "Blocks",
-      "function": "GROUP_CONCAT",
-      "format": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 27,
-    }, {
-      "field": "membername",
-      "alias": "Agent",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 28,
-    }, {
-      "field": "enterAt",
-      "alias": "EnterAt",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 28,
-    }, {
-      "field": "exitAt",
-      "alias": "ExitAt",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 28,
-    }, {
-      "field": "duration",
-      "alias": "Duration",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 28,
-      "format": "SEC_TO_TIME"
-    }, {
-      "field": "channel",
-      "alias": "Channel",
-      "function": null,
-      "groupBy": 1,
-      "orderBy": null,
-      "DefaultReportId": 29,
-    }, {
-      "field": "data1",
-      "alias": "Type",
-      "function": null,
-      "groupBy": 1,
-      "orderBy": null,
-      "DefaultReportId": 29,
-    }, {
-      "field": "duration",
-      "alias": "Duration",
-      "function": "SUM",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 29,
-      "format": "SEC_TO_TIME"
-    }, {
-      "field": "membername",
-      "alias": "Agent",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 30
-    }, {
-      "field": "enterAt",
-      "alias": "EnterAt",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 30
-    }, {
-      "field": "exitAt",
-      "alias": "ExitAt",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 30
-    }, {
-      "field": "data1",
-      "alias": "Pause",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 30
-    }, {
-      "field": "duration",
-      "alias": "Duration",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 30,
-      "format": "SEC_TO_TIME"
-    }, {
-      "field": "connectedlinename",
-      "alias": "Agent",
-      "function": null,
-      "groupBy": 1,
-      "orderBy": null,
-      "DefaultReportId": 31
-    }, {
-      "field": "uniqueid",
-      "alias": "Recorded Calls",
-      "function": "COUNT",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 31
-    }, {
-      "field": "rating",
-      "alias": "Total Rating",
-      "function": "SUM",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 31
-    }, {
-      "field": "rating",
-      "alias": "Avg Rating",
-      "function": "AVG",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 31
-    }, {
-      "field": "queue",
-      "alias": "Queue",
-      "function": null,
-      "groupBy": 1,
-      "orderBy": null,
-      "DefaultReportId": 32
-    }, {
-      "field": "uniqueid",
-      "alias": "Recorded Calls",
-      "function": "COUNT",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 32
-    }, {
-      "field": "rating",
-      "alias": "Total Rating",
-      "function": "SUM",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 32
-    }, {
-      "field": "rating",
-      "alias": "Avg Rating",
-      "function": "AVG",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 32
-    }, {
-      "field": "calleridnum",
-      "alias": "CallerIdNum",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 33
-    }, {
-      "field": "queue",
-      "alias": "Queue",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 33
-    }, {
-      "field": "queuecallerjoinAt",
-      "alias": "StartTime",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 33
-    }, {
-      "field": "CASE WHEN queuecallercomplete=1 THEN queuecallercompleteAt ELSE queuecallerLeaveAt END",
-      "alias": "EndTime",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 33,
-      "DefaultMetricId": 24
-    }, {
-      "field": "CASE WHEN queuecallercomplete=1 THEN \"YES\" ELSE \"NO\" END",
-      "alias": "Answered",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 33,
-      "DefaultMetricId": 25
-    }, {
-      "field": "agentconnectAt",
-      "alias": "Hour",
-      "function": null,
-      "groupBy": 1,
-      "orderBy": null,
-      "DefaultReportId": 34,
-      "format": "HOUR"
-    }, {
-      "field": "agentcomplete",
-      "alias": "Tot Answered",
-      "function": "SUM",
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultReportId": 34,
-    }, {
-      "field": "COUNT(IF(holdtime<10,1,NULL))",
-      "alias": "Answered <10s",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultMetricId": 5,
-      "DefaultReportId": 34
-    }, {
-      "field": "COUNT(IF(holdtime >=10 AND holdtime <20,1,NULL))",
-      "alias": "Answered 10-20s",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultMetricId": 6,
-      "DefaultReportId": 34
-    }, {
-      "field": "COUNT(IF(holdtime >=20 AND holdtime <30,1,NULL))",
-      "alias": "Answered 20-30s",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultMetricId": 7,
-      "DefaultReportId": 34
-    }, {
-      "field": "COUNT(IF(holdtime >=30,1,NULL))",
-      "alias": "Answered >30s",
-      "function": null,
-      "groupBy": 0,
-      "orderBy": null,
-      "DefaultMetricId": 8,
-      "DefaultReportId": 34
-    }, {
-      "field": "accountname",
-      "alias": "Account",
-      "groupBy": 1,
-      "custom": 0,
-      "DefaultReportId": 35
-    }, {
-      "field": "uniqueid",
-      "alias": "Received",
-      "function": "COUNT DISTINCT",
-      "groupBy": 0,
-      "custom": 0,
-      "DefaultReportId": 35
-    }, {
-      "field": "IF(timeout=0,1,null)",
-      "alias": "Accepted",
-      "function": "SUM",
-      "groupBy": 0,
-      "custom": 1,
-      "DefaultReportId": 35
-    }, {
-      "field": "ROUND(SUM(IF(timeout=0,1,null))/COUNT(DISTINCT(uniqueid))*100,1)",
-      "alias": "Accept Rate",
-      "groupBy": 0,
-      "custom": 1,
-      "DefaultReportId": 35
-    }, {
-      "field": "IF(timeout=0 AND application=\"queue\",1,null)",
-      "alias": "Accepted by Queue",
-      "function": "SUM",
-      "groupBy": 0,
-      "custom": 1,
-      "DefaultReportId": 35
-    }, {
-      "field": "IF(timeout=0 AND application=\"fidelity\",1,null)",
-      "alias": "Accept by Fidelity",
-      "function": "SUM",
-      "groupBy": 0,
-      "custom": 1,
-      "DefaultReportId": 35
-    }, {
-      "field": "IF(timeout=0 AND application=\"agent\",1,null)",
-      "alias": "Accepted by Agent",
-      "function": "SUM",
-      "groupBy": 0,
-      "custom": 1,
-      "DefaultReportId": 35
-    }, {
-      "field": "queuename",
-      "alias": "Queue",
-      "groupBy": 1,
-      "custom": 0,
-      "DefaultReportId": 36
-    }, {
-      "field": "uniqueid",
-      "alias": "Received",
-      "function": "COUNT",
-      "groupBy": 0,
-      "custom": 0,
-      "DefaultReportId": 36
-    }, {
-      "field": "IF(timeout=0,1,0)",
-      "alias": "Accepted",
-      "function": "SUM",
-      "groupBy": 0,
-      "custom": 1,
-      "DefaultReportId": 36
-    }, {
-      "field": "timeout",
-      "alias": "Timeout",
-      "function": "SUM",
-      "groupBy": 0,
-      "DefaultReportId": 36
-    }, {
-      "field": "ROUND(SUM(IF(timeout=0,1,null))/COUNT(uniqueid)*100,1)",
-      "alias": "Accept Rate",
-      "groupBy": 0,
-      "custom": 1,
-      "DefaultReportId": 36
-    }, {
-      "field": "ROUND(AVG(IF(timeout=0,UNIX_TIMESTAMP(leaveat)- UNIX_TIMESTAMP(joinat),NULL)))",
-      "alias": "Avg Accept Time",
-      "groupBy": 0,
-      "format": "SEC_TO_TIME",
-      "custom": 1,
-      "DefaultReportId": 36
-    }, {
-      "field": "membername",
-      "alias": "membername",
-      "groupBy": 1,
-      "custom": 0,
-      "DefaultReportId": 36
-    }, {
-      "field": "uniqueid",
-      "alias": "Tot Accepted",
-      "function": "COUNT",
-      "groupBy": 0,
-      "custom": 0,
-      "DefaultReportId": 37
-    }, {
-      "field": "IF(application=\"fidelity\",1,0)",
-      "alias": "Fidelity",
-      "function": "SUM",
-      "groupBy": 0,
-      "custom": 1,
-      "DefaultReportId": 37
-    }, {
-      "field": "IF(application=\"agent\",1,0)",
-      "alias": "Agent",
-      "function": "SUM",
-      "groupBy": 0,
-      "custom": 1,
-      "DefaultReportId": 37
-    }, {
-      "field": "IF(application=\"queue\",1,0)",
-      "alias": "Queue",
-      "function": "SUM",
-      "groupBy": 0,
-      "custom": 1,
-      "DefaultReportId": 37
-    }, {
-      "field": "createdAt",
-      "alias": "Date",
-      "groupBy": 1,
-      "custom": 0,
-      "format": "DATE",
-      "DefaultReportId": 38
-    }, {
-      "field": "IF(status=\"RECEIVED\",1,0)",
-      "alias": "Received",
-      "function": "SUM",
-      "groupBy": 0,
-      "custom": 1,
-      "DefaultReportId": 38
-    }, {
-      "field": "IF(status=\"SENT\",1,0)",
-      "alias": "Sent",
-      "function": "SUM",
-      "groupBy": 0,
-      "custom": 1,
-      "DefaultReportId": 38
-    }, {
-      "field": "id",
-      "alias": "id",
-      "groupBy": 0,
-      "DefaultReportId": 39,
-      "custom": 0
-    }, {
-      "field": "account",
-      "alias": "account",
-      "groupBy": 0,
-      "DefaultReportId": 39,
-      "custom": 0
-    }, {
-      "field": "status",
-      "alias": "status",
-      "groupBy": 0,
-      "DefaultReportId": 39,
-      "custom": 0
-    }, {
-      "field": "lastEvent",
-      "alias": "lastEvent",
-      "groupBy": 0,
-      "DefaultReportId": 39,
-      "custom": 0
-    }, {
-      "field": "createdAt",
-      "alias": "createdAt",
-      "groupBy": 0,
-      "DefaultReportId": 39,
-      "custom": 0
-    }, {
-      "field": "arrivedAt",
-      "alias": "arrivedAt",
-      "groupBy": 0,
-      "DefaultReportId": 39,
-      "custom": 0
-    }, {
-      "field": "openedAt",
-      "alias": "openedAt",
-      "groupBy": 0,
-      "DefaultReportId": 39,
-      "custom": 0
-    }, {
-      "field": "closedAt",
-      "alias": "closedAt",
-      "groupBy": 0,
-      "DefaultReportId": 39,
-      "custom": 0
-    }, {
-      "field": "mailIn",
-      "alias": "mailIn",
-      "groupBy": 0,
-      "DefaultReportId": 39,
-      "custom": 0
-    }, {
-      "field": "mailOut",
-      "alias": "mailOut",
-      "groupBy": 0,
-      "DefaultReportId": 39,
-      "custom": 0
-    }, {
-      "field": "tags",
-      "alias": "tags",
-      "groupBy": 0,
-      "DefaultReportId": 39,
-      "custom": 0
-    }, {
-      "field": "disposition",
-      "alias": "disposition",
-      "groupBy": 0,
-      "DefaultReportId": 39,
-      "custom": 0
-    }, {
-      "field": "ParentId",
-      "alias": "ParentId",
-      "groupBy": 0,
-      "DefaultReportId": 39,
-      "custom": 0
-    }, {
-      "field": "disposition",
-      "alias": "disposition",
-      "groupBy": 1,
-      "DefaultReportId": 40,
-      "custom": 0
-    }, {
-      "field": "count(*)",
-      "alias": "interactions",
-      "groupBy": 0,
-      "DefaultReportId": 40,
-      "custom": 1
-    }, {
-      "field": "closedAt",
-      "alias": "closedAt",
-      "groupBy": 1,
-      "DefaultReportId": 41,
-      "format": "DATE",
-      "custom": 0
-    }, {
-      "field": "id",
-      "alias": "Interactions",
-      "function": "COUNT",
-      "groupBy": 0,
-      "DefaultReportId": 41,
-      "custom": 0
-    }, {
-      "field": "ROUND(AVG(UNIX_TIMESTAMP(closedAt)-UNIX_TIMESTAMP(arrivedAt)))",
-      "alias": "Avg Handle Time",
-      "groupBy": 0,
-      "DefaultReportId": 41,
-      "format": "SEC_TO_TIME",
-      "custom": 1
-    }], {
-      ignoreDuplicates: true,
-      individualHooks: true
-    })
-  }).then(function() {
-    console.log('Populating Analytics');
-  }).catch(function(err) {
-    console.log('Error populating Analytics:', err);
-  });
-
-models.List.bulkCreate([{
-  id: 1,
-  name: 'Motion Service',
-  defaultEntry: true
-}], {
-  ignoreDuplicates: true,
-  individualHooks: true
-}).then(function() {
-  console.log('Finished populating integrations');
-});
-
-models.VoiceExtension
-  .destroy({
-    where: {
-      context: 'outbound-fax'
-    }
-  })
-  .then(function() {
-    models.VoiceExtension.bulkCreate([{
-      context: 'outbound-fax',
-      exten: '_.',
-      priority: 1,
-      app: 'NoOp',
-      appdata: 'Outgoing fax to ${FAXNUMBER}',
-      type: 'system'
-    }, {
-      context: 'outbound-fax',
-      exten: '_.',
-      priority: 2,
-      app: 'NoOp',
-      appdata: 'Account ${FAXNAME}',
-      type: 'system'
-    }, {
-      context: 'outbound-fax',
-      exten: '_.',
-      priority: 3,
-      app: 'Set',
-      appdata: 'CDR(type)=outbound-fax',
-      type: 'system'
-    }, {
-      context: 'outbound-fax',
-      exten: '_.',
-      priority: 4,
-      app: 'Answer',
-      appdata: '',
-      type: 'system'
-    }, {
-      context: 'outbound-fax',
-      exten: '_.',
-      priority: 5,
-      app: 'Wait',
-      appdata: '2',
-      type: 'system'
-    }, {
-      context: 'outbound-fax',
-      exten: '_.',
-      priority: 6,
-      app: 'Set',
-      appdata: 'FAXOPT(ecm)=${FAXECM}',
-      type: 'system'
-    }, {
-      context: 'outbound-fax',
-      exten: '_.',
-      priority: 7,
-      app: 'Set',
-      appdata: 'FAXOPT(headerinfo)=${FAXHEADERINFO}',
-      type: 'system'
-    }, {
-      context: 'outbound-fax',
-      exten: '_.',
-      priority: 8,
-      app: 'Set',
-      appdata: 'FAXOPT(localstationid)=${FAXLOCALSTATIONID}',
-      type: 'system'
-    }, {
-      context: 'outbound-fax',
-      exten: '_.',
-      priority: 9,
-      app: 'Set',
-      appdata: 'FAXOPT(minrate)=${FAXMINRATE}',
-      type: 'system'
-    }, {
-      context: 'outbound-fax',
-      exten: '_.',
-      priority: 10,
-      app: 'Set',
-      appdata: 'FAXOPT(maxrate)=${FAXMAXRATE}',
-      type: 'system'
-    }, {
-      context: 'outbound-fax',
-      exten: '_.',
-      priority: 11,
-      app: 'Set',
-      appdata: 'FAXOPT(modem)=${FAXMODEM}',
-      type: 'system'
-    }, {
-      context: 'outbound-fax',
-      exten: '_.',
-      priority: 12,
-      app: 'Set',
-      appdata: 'FAXOPT(gateway)=${FAXGATEWAY}',
-      type: 'system'
-    }, {
-      context: 'outbound-fax',
-      exten: '_.',
-      priority: 13,
-      app: 'Set',
-      appdata: 'FAXOPT(t38timeout)=${FAXT38TIMEOUT}',
-      type: 'system'
-    }, {
-      context: 'outbound-fax',
-      exten: '_.',
-      priority: 14,
-      app: 'SendFAX',
-      appdata: '${FAXOUTFILE},ds',
-      type: 'system'
-    }, {
-      context: 'outbound-fax',
-      exten: '_.',
-      priority: 15,
-      app: 'Hangup',
-      appdata: '',
-      type: 'system'
-    }], {
-      ignoreDuplicates: true,
-      individualHooks: true
-    })
-  })
-  .then(function() {
-    console.log('Finished populating VoiceExtension for Outgoing Fax');
-  });
-
-models.User
-  .findAll({
-    include: [{
-      model: models.VoiceExtension,
-      as: 'UserExtensions',
-      where: {
-        app: 'Dial'
-      }
-    }]
-  })
-  .then(function(users) {
-    console.log('Rewriting Users extensions...');
-    var bulkUpdates = [];
-    _.forEach(users, function(user) {
-      _.forEach(user.UserExtensions, function(elem) {
-        elem.appdata = 'SIP/' + user.name + ',,tTxX';
-        bulkUpdates.push(elem.save());
-        // console.log('extension updated');
-      });
-    });
-    return bulkUpdates;
-  })
-  .all()
-  .catch(function(err) {
-    console.log(err);
-  });
\ No newline at end of file
diff --git a/server/config/seedp.js b/server/config/seedp.js
index 7ccf0d8..a40df78 100644
--- a/server/config/seedp.js
+++ b/server/config/seedp.js
@@ -1,5819 +1 @@
-/**
- * Populate DB with sample data on server start
- * to disable, edit config/environment/index.js, and set `seedDB: false`
- */
-
-'use strict';
-
-var _ = require('lodash');
-var util = require('util');
-
-var models = require('../models');
-var sequelize = require('../models').sequelize;
-
-var _agents = [];
-var _voiceQueues = [];
-var _mailQueues = [];
-var _chatQueues = [];
-var _miller, _doe;
-var _setting;
-
-models.Setting
-  .findById(1)
-  .then(function(setting) {
-    _setting = setting;
-
-    if (_setting.firstSetup) {
-      models.User
-        .bulkCreate([{
-          role: 'admin',
-          fullname: 'Administrator',
-          email: [email-masked]',
-          name: 'admin',
-          password: 'password',
-          defaultuser: 'admin',
-          internal: 1000
-        }], {
-          ignoreDuplicates: true,
-          individualHooks: true
-        }).then(function(users) {
-          console.log(util.format('Populating Users: %s - DONE ', _.map(users, 'name').join()));
-          return models.Team
-            .create({
-              name: "Default Team",
-              description: "Default Team",
-              defaultEntry: true,
-              Users: [{
-                role: 'agent',
-                fullname: 'John Doe',
-                email: [email-masked]',
-                name: 'john.doe',
-                password: 'shuttle55',
-                defaultuser: 'john.doe',
-                internal: 1001
-              }, {
-                role: 'agent',
-                fullname: 'Jane Miller',
-                email: [email-masked]',
-                name: 'jane.miller',
-                password: 'shuttle55',
-                defaultuser: 'jane.miller',
-                internal: 1002
-              }]
-            }, {
-              include: [{
-                model: models.User
-              }]
-            });
-        })
-        .then(function(team) {
-          _agents = team.Users;
-
-          console.log(util.format('Populating Agents: %s - DONE ', _.map(team.Users, 'name').join()));
-          console.log(util.format('Populating Teams: %s - DONE ', team.name));
-
-          return models.VoiceQueue
-            .bulkCreate([{
-              name: 'Sales',
-              musiconhold: 'default',
-              strategy: 'rrmemory'
-            }, {
-              name: 'Support',
-              musiconhold: 'default',
-              strategy: 'ringall'
-            }], {
-              ignoreDuplicates: true,
-              individualHooks: true
-            });
-        })
-        .then(function(voiceQueues) {
-          console.log(util.format('Populating Voice Queues: %s - DONE ', _.map(voiceQueues, 'name').join()));
-          _voiceQueues = voiceQueues;
-
-          _miller = _.find(_agents, {
-            name: 'jane.miller'
-          });
-          _doe = _.find(_agents, {
-            name: 'john.doe'
-          });
-
-          return _voiceQueues[0]
-            .addUser(_miller.id);
-        })
-        .then(function() {
-          return _voiceQueues[1]
-            .addUsers([_miller.id, _doe.id]);
-        })
-        .then(function() {
-          return models.MailQueue
-            .bulkCreate([{
-              name: 'Sales',
-              timeout: 5,
-              strategy: 'rrmemory'
-            }, {
-              name: 'Support',
-              timeout: 5,
-              strategy: 'beepall'
-            }], {
-              ignoreDuplicates: true,
-              individualHooks: true
-            });
-        })
-        .then(function(mailQueues) {
-          console.log(util.format('Populating Mail Queues: %s - DONE ', _.map(mailQueues, 'name').join()));
-          _mailQueues = mailQueues;
-
-          return _mailQueues[0]
-            .addUser(_miller.id);
-        })
-        .then(function() {
-          return _mailQueues[1]
-            .addUsers([_miller.id, _doe.id]);
-        })
-        .then(function() {
-          return models.ChatQueue
-            .bulkCreate([{
-              name: 'Sales',
-              timeout: 5,
-              strategy: 'rrmemory'
-            }, {
-              name: 'Support',
-              timeout: 5,
-              strategy: 'beepall'
-            }], {
-              ignoreDuplicates: true,
-              individualHooks: true
-            });
-        })
-        .then(function(chatQueues) {
-          console.log(util.format('Populating Mail Queues: %s - DONE ', _.map(chatQueues, 'name').join()));
-          _chatQueues = chatQueues;
-
-          return _chatQueues[0]
-            .addUser(_miller.id);
-        })
-        .then(function() {
-          return _chatQueues[1]
-            .addUsers([_miller.id, _doe.id]);
-        })
-        .catch(function(err) {
-          console.log(err);
-        });
-
-      models.ChanSpy
-        .bulkCreate([{
-          name: 'ChanSpy1',
-          prefix: 'spy1',
-          description: 'The supervisor can listen and talk to the agent. The customer will not listen to the supervisor voice.',
-          options: 'bw'
-        }, {
-          name: 'ChanSpy2',
-          prefix: 'spy2',
-          description: 'The supervisor can only listen the agent channel (neither the agent nor the customer will listen to the supervisor voice.',
-          options: 'bo'
-        }, {
-          name: 'ChanSpy3',
-          prefix: 'spy3',
-          description: 'The supervisor can listen and talk both to the agent and to the customer, like a pure 3 way conference room.',
-          options: 'bW'
-        }], {
-          ignoreDuplicates: true,
-          individualHooks: true
-        })
-        .then(function(chanSpys) {
-          console.log(util.format('Populating ChanSpy: %s - DONE ', _.map(chanSpys, 'name').join()));
-        });
-
-      models.List
-        .create({
-          name: 'System List',
-          description: 'Default List',
-          defaultEntry: true
-        })
-        .then(function(list) {
-          console.log(util.format('Populating CM List: %s - DONE ', list.name));
-        });
-
-      models.VoiceMusicOnHold
-        .create({
-          name: 'default',
-          directory: '/var/lib/asterisk/moh/',
-          mode: 'files',
-          sort: 'random',
-          format: 'wav',
-          defaultEntry: true
-        })
-        .then(function(voiceMusicOnHold) {
-          console.log(util.format('Populating Voice Music On Hold: %s - DONE ', voiceMusicOnHold.name));
-        });
-
-      models.Variable
-        .bulkCreate([{
-          name: 'CHOICE'
-        }, {
-          description: 'Order number',
-          name: 'ORDERNUM'
-        }, {
-          description: 'Data Base Query Result',
-          name: 'DBRESULT'
-        }, {
-          name: 'RATE'
-        }], {
-          ignoreDuplicates: true,
-          individualHooks: true
-        })
-        .then(function(variables) {
-          console.log(util.format('Populating Variables: %s - DONE ', _.map(variables, 'name').join()));
-        });
-
-      models.Pause
-        .bulkCreate([{
-          name: 'BACKOFFICE'
-        }, {
-          name: 'AFTERCALL'
-        }], {
-          ignoreDuplicates: true,
-          individualHooks: true
-        })
-        .then(function(pauses) {
-          console.log(util.format('Populating Pauses: %s - DONE ', _.map(pauses, 'name').join()));
-        });
-
-      models.Trunk
-        .create({
-          name: 'DemoTrunk',
-          context: 'from-voip-provider',
-          callingpres: 'ALLOWED_NOT_SCREENED',
-          deny: '0.0.0.0/0.0.0.0',
-          permit: '0.0.0.0/0.0.0.0',
-          secret: '55xcally55'
-        })
-        .then(function(trunk) {
-          console.log(util.format('Populating Trunk: %s - DONE ', trunk.name));
-        });
-
-      models.VoiceContext
-        .bulkCreate([{
-          name: 'from-sip',
-          description: 'Default context (DO NOT DELETE)'
-        }, {
-          name: 'from-voip-provider',
-          description: 'Default context (DO NOT DELETE)'
-        }, {
-          name: 'inbound-fax',
-          description: 'Default context (DO NOT DELETE)'
-        }, {
-          name: 'outbound-fax',
-          description: 'Default context (DO NOT DELETE)'
-        }, {
-          name: 'from-voicemail',
-          description: 'Default context (DO NOT DELETE)'
-        }], {
-          ignoreDuplicates: true,
-          individualHooks: true
-        })
-        .then(function(pauses) {
-          console.log(util.format('Populating Contexts: %s - DONE ', _.map(pauses, 'name').join()));
-        });
-
-      models.VoiceExtension
-        .create({
-          context: 'from-sip',
-          exten: '_600',
-          priority: '1',
-          app: 'NoOp',
-          appdata: 'Internal Call',
-          type: 'internal',
-          description: 'Echo Test',
-          Applications: [{
-            context: 'from-sip',
-            exten: '_600',
-            priority: '2',
-            app: 'Set',
-            appdata: 'CDR(type)=internal',
-            type: 'internal'
-          }, {
-            context: 'from-sip',
-            exten: '_600',
-            priority: '3',
-            app: 'GotoIfTime',
-            appdata: '*,*,*,*?from-sip,${EXTEN},4:from-sip,${EXTEN},9',
-            type: 'internal'
-          }, {
-            context: 'from-sip',
-            exten: '_600',
-            priority: '4',
-            app: 'NoOP',
-            appdata: 'Skipped CallerID Set',
-            type: 'internal'
-          }, {
-            context: 'from-sip',
-            exten: '_600',
-            priority: '5',
-            app: 'NoOP',
-            appdata: 'Skipped MixMonitor',
-            type: 'internal'
-          }, {
-            context: 'from-sip',
-            exten: '_600',
-            priority: '6',
-            app: 'NoOP',
-            appdata: 'Skipped Progress',
-            type: 'internal'
-          }, {
-            context: 'from-sip',
-            exten: '_600',
-            priority: '7',
-            app: 'Playback',
-            appdata: 'demo-echotest',
-            type: 'internal',
-            interval: '*,*,*,*',
-            isApp: true
-          }, {
-            context: 'from-sip',
-            exten: '_600',
-            priority: '8',
-            app: 'NoOP',
-            appdata: 'Skipped StopMixMonitor',
-            type: 'internal'
-          }, {
-            context: 'from-sip',
-            exten: '_600',
-            priority: '9',
-            app: 'NoOP',
-            appdata: 'Playback Application End',
-            type: 'internal'
-          }, {
-            context: 'from-sip',
-            exten: '_600',
-            priority: '10',
-            app: 'GotoIfTime',
-            appdata: '*,*,*,*?from-sip,${EXTEN},11:from-sip,${EXTEN},16',
-            type: 'internal'
-          }, {
-            context: 'from-sip',
-            exten: '_600',
-            priority: '11',
-            app: 'NoOP',
-            appdata: 'Skipped CallerID Set',
-            type: 'internal'
-          }, {
-            context: 'from-sip',
-            exten: '_600',
-            priority: '12',
-            app: 'NoOP',
-            appdata: 'Skipped MixMonitor',
-            type: 'internal'
-          }, {
-            context: 'from-sip',
-            exten: '_600',
-            priority: '13',
-            app: 'NoOP',
-            appdata: 'Skipped Progress',
-            type: 'internal'
-          }, {
-            context: 'from-sip',
-            exten: '_600',
-            priority: '14',
-            app: 'Echo',
-            appdata: '',
-            type: 'internal',
-            interval: '*,*,*,*',
-            isApp: true
-          }, {
-            context: 'from-sip',
-            exten: '_600',
-            priority: '15',
-            app: 'NoOP',
-            appdata: 'Skipped StopMixMonitor',
-            type: 'internal'
-          }, {
-            context: 'from-sip',
-            exten: '_600',
-            priority: '16',
-            app: 'NoOP',
-            appdata: 'Echo Application End',
-            type: 'internal'
-          }, {
-            context: 'from-sip',
-            exten: '_600',
-            priority: '17',
-            app: 'GotoIfTime',
-            appdata: '*,*,*,*?from-sip,${EXTEN},18:from-sip,${EXTEN},23',
-            type: 'internal'
-          }, {
-            context: 'from-sip',
-            exten: '_600',
-            priority: '18',
-            app: 'NoOP',
-            appdata: 'Skipped CallerID Set',
-            type: 'internal'
-          }, {
-            context: 'from-sip',
-            exten: '_600',
-            priority: '19',
-            app: 'NoOP',
-            appdata: 'Skipped MixMonitor',
-            type: 'internal'
-          }, {
-            context: 'from-sip',
-            exten: '_600',
-            priority: '20',
-            app: 'NoOP',
-            appdata: 'Skipped Progress',
-            type: 'internal'
-          }, {
-            context: 'from-sip',
-            exten: '_600',
-            priority: '21',
-            app: 'Playback',
-            appdata: 'demo-echotest',
-            type: 'internal',
-            interval: '*,*,*,*',
-            isApp: true
-          }, {
-            context: 'from-sip',
-            exten: '_600',
-            priority: '22',
-            app: 'NoOP',
-            appdata: 'Skipped StopMixMonitor',
-            type: 'internal'
-          }, {
-            context: 'from-sip',
-            exten: '_600',
-            priority: '23',
-            app: 'NoOP',
-            appdata: 'Playback Application End',
-            type: 'internal'
-          }]
-        }, {
-          include: [{
-            model: models.VoiceExtension,
-            as: 'Applications'
-          }]
-        })
-        .then(function(voiceExtension) {
-          console.log(util.format('Populating Voice Extension: %s %s - DONE ', voiceExtension.context, voiceExtension.exten));
-        });
-
-      models.VoiceExtension
-        .create({
-          context: 'from-sip',
-          exten: '_6000',
-          priority: '1',
-          app: 'NoOp',
-          appdata: 'Internal Call',
-          type: 'internal',
-          description: 'Support Queue',
-          Applications: [{
-            context: 'from-sip',
-            exten: '_6000',
-            priority: '2',
-            app: 'Set',
-            appdata: 'CDR(type)=internal',
-            type: 'internal'
-          }, {
-            context: 'from-sip',
-            exten: '_6000',
-            priority: '3',
-            app: 'GotoIfTime',
-            appdata: '*,*,*,*?from-sip,${EXTEN},4:from-sip,${EXTEN},9',
-            type: 'internal'
-          }, {
-            context: 'from-sip',
-            exten: '_6000',
-            priority: '4',
-            app: 'NoOP',
-            appdata: 'Skipped CallerID Set',
-            type: 'internal'
-          }, {
-            context: 'from-sip',
-            exten: '_6000',
-            priority: '5',
-            app: 'NoOP',
-            appdata: 'Skipped MixMonitor',
-            type: 'internal'
-          }, {
-            context: 'from-sip',
-            exten: '_6000',
-            priority: '6',
-            app: 'Progress',
-            type: 'internal'
-          }, {
-            context: 'from-sip',
-            exten: '_6000',
-            priority: '7',
-            app: 'Queue',
-            appdata: 'Support,,,,',
-            type: 'internal',
-            interval: '*,*,*,*',
-            isApp: true
-          }, {
-            context: 'from-sip',
-            exten: '_6000',
-            priority: '8',
-            app: 'NoOP',
-            appdata: 'Skipped StopMixMonitor',
-            type: 'internal'
-          }, {
-            context: 'from-sip',
-            exten: '_6000',
-            priority: '9',
-            app: 'NoOP',
-            appdata: 'Queue Application End',
-            type: 'internal'
-          }]
-        }, {
-          include: [{
-            model: models.VoiceExtension,
-            as: 'Applications'
-          }]
-        })
-        .then(function(voiceExtension) {
-          console.log(util.format('Populating Voice Extension: %s %s - DONE ', voiceExtension.context, voiceExtension.exten));
-        });
-
-      models.VoiceExtension
-        .create({
-          context: 'from-sip',
-          exten: '_6666',
-          priority: '1',
-          app: 'NoOp',
-          appdata: 'Internal Call',
-          type: 'internal',
-          description: 'Support Queue',
-          Applications: [{
-            context: 'from-sip',
-            exten: '_6666',
-            priority: '2',
-            app: 'Set',
-            appdata: 'CDR(type)=internal',
-            type: 'internal'
-          }, {
-            context: 'from-sip',
-            exten: '_6666',
-            priority: '3',
-            app: 'GotoIfTime',
-            appdata: '*,*,*,*?from-sip,${EXTEN},4:from-sip,${EXTEN},9',
-            type: 'internal'
-          }, {
-            context: 'from-sip',
-            exten: '_6666',
-            priority: '4',
-            app: 'NoOP',
-            appdata: 'Skipped CallerID Set',
-            type: 'internal'
-          }, {
-            context: 'from-sip',
-            exten: '_6666',
-            priority: '5',
-            app: 'NoOP',
-            appdata: 'Skipped MixMonitor',
-            type: 'internal'
-          }, {
-            context: 'from-sip',
-            exten: '_6666',
-            priority: '6',
-            app: 'NoOP',
-            appdata: 'Skipped Progress',
-            type: 'internal'
-          }, {
-            context: 'from-sip',
-            exten: '_6666',
-            priority: '7',
-            app: 'AGI',
-            appdata: 'agi://127.0.0.1/square,Auto Attendant',
-            type: 'internal',
-            interval: '*,*,*,*',
-            isApp: true
-          }, {
-            context: 'from-sip',
-            exten: '_6666',
-            priority: '8',
-            app: 'NoOP',
-            appdata: 'Skipped StopMixMonitor',
-            type: 'internal'
-          }, {
-            context: 'from-sip',
-            exten: '_6666',
-            priority: '9',
-            app: 'NoOP',
-            appdata: 'AGI Application End',
-            type: 'internal'
-          }]
-        }, {
-          include: [{
-            model: models.VoiceExtension,
-            as: 'Applications'
-          }]
-        })
-        .then(function(voiceExtension) {
-          console.log(util.format('Populating Voice Extension: %s %s - DONE ', voiceExtension.context, voiceExtension.exten));
-        });
-
-      models.VoiceExtension
-        .create({
-          context: 'from-sip',
-          exten: '_6667',
-          priority: '1',
-          app: 'NoOp',
-          appdata: 'Internal Call',
-          type: 'internal',
-          description: 'Support Queue',
-          Applications: [{
-            context: 'from-sip',
-            exten: '_6667',
-            priority: '2',
-            app: 'Set',
-            appdata: 'CDR(type)=internal',
-            type: 'internal'
-          }, {
-            context: 'from-sip',
-            exten: '_6667',
-            priority: '3',
-            app: 'GotoIfTime',
-            appdata: '*,*,*,*?from-sip,${EXTEN},4:from-sip,${EXTEN},9',
-            type: 'internal'
-          }, {
-            context: 'from-sip',
-            exten: '_6667',
-            priority: '4',
-            app: 'NoOP',
-            appdata: 'Skipped CallerID Set',
-            type: 'internal'
-          }, {
-            context: 'from-sip',
-            exten: '_6667',
-            priority: '5',
-            app: 'NoOP',
-            appdata: 'Skipped MixMonitor',
-            type: 'internal'
-          }, {
-            context: 'from-sip',
-            exten: '_6667',
-            priority: '6',
-            app: 'NoOP',
-            appdata: 'Skipped Progress',
-            type: 'internal'
-          }, {
-            context: 'from-sip',
-            exten: '_6667',
-            priority: '7',
-            app: 'AGI',
-            appdata: 'agi://127.0.0.1/square,Orders',
-            type: 'internal',
-            interval: '*,*,*,*',
-            isApp: true
-          }, {
-            context: 'from-sip',
-            exten: '_6667',
-            priority: '8',
-            app: 'NoOP',
-            appdata: 'Skipped StopMixMonitor',
-            type: 'internal'
-          }, {
-            context: 'from-sip',
-            exten: '_6667',
-            priority: '9',
-            app: 'NoOP',
-            appdata: 'AGI Application End',
-            type: 'internal'
-          }]
-        }, {
-          include: [{
-            model: models.VoiceExtension,
-            as: 'Applications'
-          }]
-        })
-        .then(function(voiceExtension) {
-          console.log(util.format('Populating Voice Extension: %s %s - DONE ', voiceExtension.context, voiceExtension.exten));
-        });
-
-      models.VoiceExtension
-        .create({
-          context: 'from-sip',
-          exten: '_6668',
-          priority: '1',
-          app: 'NoOp',
-          appdata: 'Internal Call',
-          type: 'internal',
-          description: 'Support Queue',
-          Applications: [{
-            context: 'from-sip',
-            exten: '_6668',
-            priority: '2',
-            app: 'Set',
-            appdata: 'CDR(type)=internal',
-            type: 'internal'
-          }, {
-            context: 'from-sip',
-            exten: '_6668',
-            priority: '3',
-            app: 'GotoIfTime',
-            appdata: '*,*,*,*?from-sip,${EXTEN},4:from-sip,${EXTEN},9',
-            type: 'internal'
-          }, {
-            context: 'from-sip',
-            exten: '_6668',
-            priority: '4',
-            app: 'NoOP',
-            appdata: 'Skipped CallerID Set',
-            type: 'internal'
-          }, {
-            context: 'from-sip',
-            exten: '_6668',
-            priority: '5',
-            app: 'NoOP',
-            appdata: 'Skipped MixMonitor',
-            type: 'internal'
-          }, {
-            context: 'from-sip',
-            exten: '_6668',
-            priority: '6',
-            app: 'NoOP',
-            appdata: 'Skipped Progress',
-            type: 'internal'
-          }, {
-            context: 'from-sip',
-            exten: '_6668',
-            priority: '7',
-            app: 'AGI',
-            appdata: 'agi://127.0.0.1/square,CSI',
-            type: 'internal',
-            interval: '*,*,*,*',
-            isApp: true
-          }, {
-            context: 'from-sip',
-            exten: '_6668',
-            priority: '8',
-            app: 'NoOP',
-            appdata: 'Skipped StopMixMonitor',
-            type: 'internal'
-          }, {
-            context: 'from-sip',
-            exten: '_6668',
-            priority: '9',
-            app: 'NoOP',
-            appdata: 'AGI Application End',
-            type: 'internal'
-          }]
-        }, {
-          include: [{
-            model: models.VoiceExtension,
-            as: 'Applications'
-          }]
-        })
-        .then(function(voiceExtension) {
-          console.log(util.format('Populating Voice Extension: %s %s - DONE ', voiceExtension.context, voiceExtension.exten));
-        });
-
-      models.VoiceExtension
-        .create({
-          context: 'from-sip',
-          exten: '_X.',
-          priority: '1',
-          app: 'NoOp',
-          appdata: 'Outbound Call',
-          type: 'outbound',
-          description: 'Support Queue',
-          Applications: [{
-            context: 'from-sip',
-            exten: '_X.',
-            priority: '2',
-            app: 'Set',
-            appdata: 'CDR(type)=outbound',
-            type: 'outbound'
-          }, {
-            context: 'from-sip',
-            exten: '_X.',
-            priority: '3',
-            app: 'Set',
-            appdata: 'CDR(tag)=--',
-            type: 'outbound'
-          }, {
-            context: 'from-sip',
-            exten: '_X.',
-            priority: '4',
-            app: 'GotoIfTime',
-            appdata: '*,*,*,*?from-sip,${EXTEN},5:from-sip,${EXTEN},10',
-            type: 'outbound'
-          }, {
-            context: 'from-sip',
-            exten: '_X.',
-            priority: '5',
-            app: 'NoOP',
-            appdata: 'Skipped CallerID Set',
-            type: 'outbound'
-          }, {
-            context: 'from-sip',
-            exten: '_X.',
-            priority: '6',
-            app: 'NoOP',
-            appdata: 'Skipped MixMonitor',
-            type: 'outbound'
-          }, {
-            context: 'from-sip',
-            exten: '_X.',
-            priority: '7',
-            app: 'NoOP',
-            appdata: 'Skipped Progress',
-            type: 'outbound'
-          }, {
-            context: 'from-sip',
-            exten: '_X.',
-            priority: '8',
-            app: 'Dial',
-            appdata: 'SIP/Demo Trunk/${EXTEN:0}',
-            type: 'outbound',
-            interval: '*,*,*,*',
-            isApp: true
-          }, {
-            context: 'from-sip',
-            exten: '_X.',
-            priority: '9',
-            app: 'NoOP',
-            appdata: 'Skipped StopMixMonitor',
-            type: 'outbound'
-          }, {
-            context: 'from-sip',
-            exten: '_X.',
-            priority: '10',
-            app: 'NoOP',
-            appdata: 'Dial Application End',
-            type: 'outbound'
-          }]
-        }, {
-          include: [{
-            model: models.VoiceExtension,
-            as: 'Applications'
-          }]
-        })
-        .then(function(voiceExtension) {
-          console.log(util.format('Populating Voice Extension: %s %s - DONE ', voiceExtension.context, voiceExtension.exten));
-        });
-
-      models.VoiceExtension
-        .create({
-          context: 'from-sip',
-          exten: '_6001',
-          priority: '1',
-          app: 'NoOp',
-          appdata: 'Internal Call',
-          type: 'internal',
-          description: 'Sales Queue',
-          Applications: [{
-            context: 'from-sip',
-            exten: '_6001',
-            priority: '2',
-            app: 'Set',
-            appdata: 'CDR(type)=internal',
-            type: 'internal'
-          }, {
-            context: 'from-sip',
-            exten: '_6001',
-            priority: '3',
-            app: 'GotoIfTime',
-            appdata: '*,*,*,*?from-sip,${EXTEN},4:from-sip,${EXTEN},9',
-            type: 'internal'
-          }, {
-            context: 'from-sip',
-            exten: '_6001',
-            priority: '4',
-            app: 'NoOP',
-            appdata: 'Skipped CallerID Set',
-            type: 'internal'
-          }, {
-            context: 'from-sip',
-            exten: '_6001',
-            priority: '5',
-            app: 'NoOP',
-            appdata: 'Skipped MixMonitor',
-            type: 'internal'
-          }, {
-            context: 'from-sip',
-            exten: '_6001',
-            priority: '6',
-            app: 'Progress',
-            type: 'internal'
-          }, {
-            context: 'from-sip',
-            exten: '_6001',
-            priority: '7',
-            app: 'Queue',
-            appdata: 'Sales,,,,',
-            type: 'internal',
-            interval: '*,*,*,*',
-            isApp: true
-          }, {
-            context: 'from-sip',
-            exten: '_6001',
-            priority: '8',
-            app: 'NoOP',
-            appdata: 'Skipped StopMixMonitor',
-            type: 'internal'
-          }, {
-            context: 'from-sip',
-            exten: '_6001',
-            priority: '9',
-            app: 'NoOP',
-            appdata: 'Queue Application End',
-            type: 'internal'
-          }]
-        }, {
-          include: [{
-            model: models.VoiceExtension,
-            as: 'Applications'
-          }]
-        })
-        .then(function(voiceExtension) {
-          console.log(util.format('Populating Voice Extension: %s %s - DONE ', voiceExtension.context, voiceExtension.exten));
-        });
-
-      models.SquareProject
-        .bulkCreate([{
-          name: 'Auto Attendant',
-          description: 'IVR SAMPLE 1',
-          preproduction: '<mxGraphModel grid=\"1\" guides=\"1\" tooltips=\"1\" connect=\"1\" fold=\"1\" page=\"0\" pageScale=\"1\" pageWidth=\"826\" pageHeight=\"1169\">\n  <root>\n    <mxCell id=\"0\"/>\n    <mxCell id=\"1\" parent=\"0\"/>\n    <start label=\"Start\" id=\"2\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/entry/start_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"20\" y=\"149.99999999999997\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </start>\n    <menu label=\"Menu\" file_id=\"1\" response=\"5\" digit=\"1\" retry=\"2\" variable_id=\"1\" id=\"3\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/playback/menu_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"130\" y=\"150\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </menu>\n    <mxCell id=\"4\" parent=\"1\" source=\"2\" target=\"3\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <queue label=\"Queue Sales\" queue_id=\"1\" opts=\"\" url=\"\" file_id=\"0\" timeout=\"300\" agi=\"\" macro=\"\" gosub=\"\" position=\"\" id=\"5\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/call_management/queue_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"470\" y=\"9.999999999999993\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </queue>\n    <queue label=\"Queue Support\" queue_id=\"2\" opts=\"\" url=\"\" file_id=\"0\" timeout=\"300\" agi=\"\" macro=\"\" gosub=\"\" position=\"\" id=\"6\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/call_management/queue_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"540\" y=\"149.99999999999997\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </queue>\n    <dial label=\"Internal Dial John Doe\" sip_id=\"1\" timeout=\"60\" opts=\"\" url=\"\" id=\"7\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/call_management/dial_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"470\" y=\"310\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </dial>\n    <mxCell id=\"8\" value=\"1\" parent=\"1\" source=\"3\" target=\"5\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <mxCell id=\"9\" value=\"2\" parent=\"1\" source=\"3\" target=\"6\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <noop label=\"NoOp choice view\" output=\"Choice: {CHOICE}\" id=\"11\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/general/noop_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"300\" y=\"310\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </noop>\n    <end label=\"End\" id=\"15\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/entry/end_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"720\" y=\"150\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </end>\n    <mxCell id=\"16\" value=\"3\" parent=\"1\" source=\"3\" target=\"11\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <mxCell id=\"17\" parent=\"1\" source=\"5\" target=\"15\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <mxCell id=\"18\" parent=\"1\" source=\"6\" target=\"15\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <mxCell id=\"19\" parent=\"1\" source=\"7\" target=\"15\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <mxCell id=\"20\" parent=\"1\" source=\"11\" target=\"7\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n  </root>\n</mxGraphModel>\n',
-          production: '<mxGraphModel grid=\"1\" guides=\"1\" tooltips=\"1\" connect=\"1\" fold=\"1\" page=\"0\" pageScale=\"1\" pageWidth=\"826\" pageHeight=\"1169\">\n  <root>\n    <mxCell id=\"0\"/>\n    <mxCell id=\"1\" parent=\"0\"/>\n    <start label=\"Start\" id=\"2\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/entry/start_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"20\" y=\"149.99999999999997\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </start>\n    <menu label=\"Menu\" file_id=\"1\" response=\"5\" digit=\"1\" retry=\"2\" variable_id=\"1\" id=\"3\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/playback/menu_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"130\" y=\"150\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </menu>\n    <mxCell id=\"4\" parent=\"1\" source=\"2\" target=\"3\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <queue label=\"Queue Sales\" queue_id=\"1\" opts=\"\" url=\"\" file_id=\"0\" timeout=\"300\" agi=\"\" macro=\"\" gosub=\"\" position=\"\" id=\"5\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/call_management/queue_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"470\" y=\"9.999999999999993\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </queue>\n    <queue label=\"Queue Support\" queue_id=\"2\" opts=\"\" url=\"\" file_id=\"0\" timeout=\"300\" agi=\"\" macro=\"\" gosub=\"\" position=\"\" id=\"6\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/call_management/queue_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"540\" y=\"149.99999999999997\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </queue>\n    <dial label=\"Internal Dial John Doe\" sip_id=\"1\" timeout=\"60\" opts=\"\" url=\"\" id=\"7\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/call_management/dial_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"470\" y=\"310\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </dial>\n    <mxCell id=\"8\" value=\"1\" parent=\"1\" source=\"3\" target=\"5\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <mxCell id=\"9\" value=\"2\" parent=\"1\" source=\"3\" target=\"6\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <noop label=\"NoOp choice view\" output=\"Choice: {CHOICE}\" id=\"11\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/general/noop_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"300\" y=\"310\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </noop>\n    <end label=\"End\" id=\"15\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/entry/end_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"720\" y=\"150\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </end>\n    <mxCell id=\"16\" value=\"3\" parent=\"1\" source=\"3\" target=\"11\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <mxCell id=\"17\" parent=\"1\" source=\"5\" target=\"15\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <mxCell id=\"18\" parent=\"1\" source=\"6\" target=\"15\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <mxCell id=\"19\" parent=\"1\" source=\"7\" target=\"15\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <mxCell id=\"20\" parent=\"1\" source=\"11\" target=\"7\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n  </root>\n</mxGraphModel>\n'
-        }, {
-          name: 'CSI',
-          description: 'Customer Satisfaction Index example',
-          preproduction: '<mxGraphModel grid=\"1\" guides=\"1\" tooltips=\"1\" connect=\"1\" fold=\"1\" page=\"0\" pageScale=\"1\" pageWidth=\"826\" pageHeight=\"1169\">\n  <root>\n    <mxCell id=\"0\"/>\n    <mxCell id=\"1\" parent=\"0\"/>\n    <start label=\"Start\" id=\"2\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/entry/start_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"90\" y=\"110\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </start>\n    <queue label=\"Queue OPTION C to continue\" queue_id=\"2\" opts=\"c\" url=\"\" file_id=\"0\" timeout=\"10\" agi=\"\" macro=\"\" gosub=\"\" position=\"\" id=\"3\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/call_management/queue_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"260\" y=\"110\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </queue>\n    <mxCell id=\"4\" parent=\"1\" source=\"2\" target=\"3\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <subproject label=\"SubProject Survey\" project_id=\"4\" id=\"5\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/general/subproject_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"430\" y=\"110\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </subproject>\n    <mxCell id=\"6\" parent=\"1\" source=\"3\" target=\"5\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <end label=\"End\" id=\"7\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/entry/end_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"600\" y=\"110\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </end>\n    <mxCell id=\"8\" parent=\"1\" source=\"5\" target=\"7\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n  </root>\n</mxGraphModel>\n',
-          production: '<mxGraphModel grid=\"1\" guides=\"1\" tooltips=\"1\" connect=\"1\" fold=\"1\" page=\"0\" pageScale=\"1\" pageWidth=\"826\" pageHeight=\"1169\">\n  <root>\n    <mxCell id=\"0\"/>\n    <mxCell id=\"1\" parent=\"0\"/>\n    <start label=\"Start\" id=\"2\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/entry/start_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"90\" y=\"110\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </start>\n    <queue label=\"Queue OPTION C to continue\" queue_id=\"2\" opts=\"c\" url=\"\" file_id=\"0\" timeout=\"10\" agi=\"\" macro=\"\" gosub=\"\" position=\"\" id=\"3\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/call_management/queue_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"260\" y=\"110\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </queue>\n    <mxCell id=\"4\" parent=\"1\" source=\"2\" target=\"3\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <subproject label=\"SubProject Survey\" project_id=\"4\" id=\"5\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/general/subproject_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"430\" y=\"110\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </subproject>\n    <mxCell id=\"6\" parent=\"1\" source=\"3\" target=\"5\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <end label=\"End\" id=\"7\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/entry/end_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"600\" y=\"110\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </end>\n    <mxCell id=\"8\" parent=\"1\" source=\"5\" target=\"7\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n  </root>\n</mxGraphModel>\n'
-        }, {
-          name: 'Orders',
-          description: 'Order DB IVR Sample',
-          preproduction: '<mxGraphModel scale=\"0.694\" grid=\"1\" guides=\"1\" tooltips=\"1\" connect=\"1\" fold=\"1\" page=\"0\" pageScale=\"1\" pageWidth=\"826\" pageHeight=\"1169\">\n  <root>\n    <mxCell id=\"0\"/>\n    <mxCell id=\"1\" parent=\"0\"/>\n    <start label=\"Start\" id=\"2\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/entry/start_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"90\" y=\"110\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </start>\n    <menu label=\"Menu\" file_id=\"2\" response=\"5\" digit=\"5\" retry=\"1\" variable_id=\"2\" id=\"4\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/playback/menu_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"250\" y=\"110\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </menu>\n    <mxCell id=\"5\" parent=\"1\" source=\"2\" target=\"4\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <noop label=\"NoOp Debug ORDERNUM\" output=\"ORDER NUMBER: {ORDERNUM}\" id=\"6\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/general/noop_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"400\" y=\"109.56782713085232\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </noop>\n    <mxCell id=\"7\" value=\"-\" parent=\"1\" source=\"4\" target=\"6\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <database label=\"Database Query EXAMPLE\" database_id=\"1\" query=\"SELECT status from orders WHERE id={ORDERNUM}\" variable_id=\"3\" id=\"8\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/integration_server/database_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"560\" y=\"110\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </database>\n    <mxCell id=\"9\" parent=\"1\" source=\"6\" target=\"8\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <gotoif label=\"GotoIf\" condition=\"{DBRESULT} == 1\" id=\"10\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/callflow/gotoif_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"730\" y=\"109.56782713085231\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </gotoif>\n    <mxCell id=\"11\" parent=\"1\" source=\"8\" target=\"10\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <playback label=\"Playback Order shipped\" file_id=\"3\" skip=\"0\" noanswer=\"0\" id=\"12\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/playback/playback_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"1010\" y=\"50\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </playback>\n    <mxCell id=\"13\" value=\"true\" parent=\"1\" source=\"10\" target=\"12\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <playback label=\"Playback Order on elaboration\" file_id=\"4\" skip=\"0\" noanswer=\"0\" id=\"14\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/playback/playback_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"1010\" y=\"189.56782713085232\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </playback>\n    <mxCell id=\"15\" value=\"false\" parent=\"1\" source=\"10\" target=\"14\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <hangup label=\"Hangup\" id=\"16\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/call_management/hangup_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"1180\" y=\"109.5678271308523\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </hangup>\n    <mxCell id=\"17\" parent=\"1\" source=\"12\" target=\"16\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <mxCell id=\"18\" parent=\"1\" source=\"14\" target=\"16\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n  </root>\n</mxGraphModel>\n',
-          production: '<mxGraphModel scale=\"0.694\" grid=\"1\" guides=\"1\" tooltips=\"1\" connect=\"1\" fold=\"1\" page=\"0\" pageScale=\"1\" pageWidth=\"826\" pageHeight=\"1169\">\n  <root>\n    <mxCell id=\"0\"/>\n    <mxCell id=\"1\" parent=\"0\"/>\n    <start label=\"Start\" id=\"2\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/entry/start_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"90\" y=\"110\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </start>\n    <menu label=\"Menu\" file_id=\"2\" response=\"5\" digit=\"5\" retry=\"1\" variable_id=\"2\" id=\"4\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/playback/menu_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"250\" y=\"110\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </menu>\n    <mxCell id=\"5\" parent=\"1\" source=\"2\" target=\"4\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <noop label=\"NoOp Debug ORDERNUM\" output=\"ORDER NUMBER: {ORDERNUM}\" id=\"6\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/general/noop_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"400\" y=\"109.56782713085232\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </noop>\n    <mxCell id=\"7\" value=\"-\" parent=\"1\" source=\"4\" target=\"6\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <database label=\"Database Query EXAMPLE\" database_id=\"1\" query=\"SELECT status from orders WHERE id={ORDERNUM}\" variable_id=\"3\" id=\"8\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/integration_server/database_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"560\" y=\"110\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </database>\n    <mxCell id=\"9\" parent=\"1\" source=\"6\" target=\"8\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <gotoif label=\"GotoIf\" condition=\"{DBRESULT} == 1\" id=\"10\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/callflow/gotoif_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"730\" y=\"109.56782713085231\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </gotoif>\n    <mxCell id=\"11\" parent=\"1\" source=\"8\" target=\"10\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <playback label=\"Playback Order shipped\" file_id=\"3\" skip=\"0\" noanswer=\"0\" id=\"12\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/playback/playback_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"1010\" y=\"50\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </playback>\n    <mxCell id=\"13\" value=\"true\" parent=\"1\" source=\"10\" target=\"12\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <playback label=\"Playback Order on elaboration\" file_id=\"4\" skip=\"0\" noanswer=\"0\" id=\"14\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/playback/playback_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"1010\" y=\"189.56782713085232\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </playback>\n    <mxCell id=\"15\" value=\"false\" parent=\"1\" source=\"10\" target=\"14\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <hangup label=\"Hangup\" id=\"16\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/call_management/hangup_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"1180\" y=\"109.5678271308523\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </hangup>\n    <mxCell id=\"17\" parent=\"1\" source=\"12\" target=\"16\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <mxCell id=\"18\" parent=\"1\" source=\"14\" target=\"16\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n  </root>\n</mxGraphModel>\n'
-        }, {
-          name: 'Survey',
-          description: 'Survey IVR example',
-          preproduction: '<mxGraphModel scale=\"0.833\" grid=\"1\" guides=\"1\" tooltips=\"1\" connect=\"1\" fold=\"1\" page=\"0\" pageScale=\"1\" pageWidth=\"826\" pageHeight=\"1169\">\n  <root>\n    <mxCell id=\"0\"/>\n    <mxCell id=\"1\" parent=\"0\"/>\n    <start label=\"Start\" id=\"2\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/entry/start_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"70\" y=\"110\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </start>\n    <menu label=\"Menu\" file_id=\"5\" response=\"5\" digit=\"1\" retry=\"1\" variable_id=\"4\" id=\"3\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/playback/menu_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"222\" y=\"110\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </menu>\n    <mxCell id=\"4\" parent=\"1\" source=\"2\" target=\"3\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <noop label=\"NoOp\" output=\"\" id=\"5\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/general/noop_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"378.99999999999994\" y=\"110.13565426170464\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </noop>\n    <mxCell id=\"6\" value=\"1,2,3,4,5\" parent=\"1\" source=\"3\" target=\"5\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <database label=\"Database\" database_id=\"2\" query=\"INSERT INTO survey (agent, queue, result)&#xa;VALUES ({MEMBERINTERFACE}, {QUEUENAME}, {RATE})\" variable_id=\"4\" id=\"7\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/integration_server/database_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"670\" y=\"110.13565426170464\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </database>\n    <hangup label=\"Hangup\" id=\"10\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/call_management/hangup_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"838\" y=\"110.13565426170464\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </hangup>\n    <mxCell id=\"12\" parent=\"1\" source=\"7\" target=\"10\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <playback label=\"Playback Thank you\" file_id=\"6\" skip=\"0\" noanswer=\"0\" id=\"13\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/playback/playback_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"520\" y=\"110.13565426170464\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </playback>\n    <mxCell id=\"14\" parent=\"1\" source=\"5\" target=\"13\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <mxCell id=\"15\" parent=\"1\" source=\"13\" target=\"7\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n  </root>\n</mxGraphModel>\n',
-          production: '<mxGraphModel scale=\"0.833\" grid=\"1\" guides=\"1\" tooltips=\"1\" connect=\"1\" fold=\"1\" page=\"0\" pageScale=\"1\" pageWidth=\"826\" pageHeight=\"1169\">\n  <root>\n    <mxCell id=\"0\"/>\n    <mxCell id=\"1\" parent=\"0\"/>\n    <start label=\"Start\" id=\"2\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/entry/start_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"70\" y=\"110\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </start>\n    <menu label=\"Menu\" file_id=\"5\" response=\"5\" digit=\"1\" retry=\"1\" variable_id=\"4\" id=\"3\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/playback/menu_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"222\" y=\"110\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </menu>\n    <mxCell id=\"4\" parent=\"1\" source=\"2\" target=\"3\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <noop label=\"NoOp\" output=\"\" id=\"5\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/general/noop_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"378.99999999999994\" y=\"110.13565426170464\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </noop>\n    <mxCell id=\"6\" value=\"1,2,3,4,5\" parent=\"1\" source=\"3\" target=\"5\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <database label=\"Database\" database_id=\"2\" query=\"INSERT INTO survey (agent, queue, result)&#xa;VALUES ({MEMBERINTERFACE}, {QUEUENAME}, {RATE})\" variable_id=\"4\" id=\"7\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/integration_server/database_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"670\" y=\"110.13565426170464\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </database>\n    <hangup label=\"Hangup\" id=\"10\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/call_management/hangup_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"838\" y=\"110.13565426170464\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </hangup>\n    <mxCell id=\"12\" parent=\"1\" source=\"7\" target=\"10\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <playback label=\"Playback Thank you\" file_id=\"6\" skip=\"0\" noanswer=\"0\" id=\"13\">\n      <mxCell style=\"image;image=/assets/plugins/square/stencils/playback/playback_128x128.png\" parent=\"1\" vertex=\"1\">\n        <mxGeometry x=\"520\" y=\"110.13565426170464\" width=\"80\" height=\"80\" as=\"geometry\"/>\n      </mxCell>\n    </playback>\n    <mxCell id=\"14\" parent=\"1\" source=\"5\" target=\"13\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n    <mxCell id=\"15\" parent=\"1\" source=\"13\" target=\"7\" edge=\"1\">\n      <mxGeometry relative=\"1\" as=\"geometry\"/>\n    </mxCell>\n  </root>\n</mxGraphModel>\n'
-        }])
-        .then(function(projects) {
-          console.log(util.format('Populating Square Project: %s - DONE ', _.map(projects, 'name').join()));
-        });
-
-      models.SquareOdbc
-        .create({
-          name: 'xcally',
-          dsn: 'DRIVER=MySQL;SERVER=127.0.0.1;UID=xcall;PWD=xC@LL1234;DATABASE=motion'
-        })
-        .then(function(squareOdbc) {
-          console.log(util.format('Populating Square ODBC: %s - DONE ', squareOdbc.name));
-        });
-
-      var newIntegrations = [{
-        name: 'Zendesk',
-        version: '1.0.0',
-        author: 'XeniaLAB s.r.l.',
-        logo: 'assets/images/media/zendesk2.png',
-        state: 'zendesk',
-        description: 'Start using xCALLY - Zendesk integration: Auto-Generated Tickets, fully customizable comments, Custom Fields management, Tag support and Simple Setup',
-        link: 'https://wiki.xcallymotion.com/display/XMD/Zendesk+integration'
-      }, {
-        name: 'Salesforce',
-        version: '1.0.0',
-        author: 'XeniaLAB s.r.l.',
-        logo: 'assets/images/media/salesforce2.png',
-        state: 'salesforce',
-        description: 'Start using xCALLY - Salesforce integration: Auto-Generated Tasks, fully customizable comments, Custom Fields management and OpenCTI support',
-        link: 'https://wiki.xcallymotion.com/display/XMD/Salesforce+integration'
-      }, {
-        name: 'iFrame',
-        version: '1.0.0',
-        author: 'XeniaLAB s.r.l.',
-        logo: 'assets/images/media/iframe.png',
-        state: 'iframe',
-        description: 'Start using iFrame integration: enable your agents to view external pages (like your CRM) directly from Motion GUI',
-        link: 'https://wiki.xcallymotion.com/display/XMD/iFrame+Integration'
-      }];
-
-      models.Integration
-        .findAll()
-        .then(function(oldIntegrations) {
-          var bulkIntegrations = [];
-          oldIntegrations = _.map(oldIntegrations, 'state');
-          newIntegrations.forEach(function(integration) {
-            if (_.includes(oldIntegrations, integration.state)) {
-              bulkIntegrations.push(models.Integration.update(integration, {
-                where: {
-                  state: integration.state
-                }
-              }));
-            } else {
-              bulkIntegrations.push(models.Integration.create(integration));
-            }
-          });
-          return bulkIntegrations;
-        })
-        .all()
-        .then(function() {
-          console.log('Finished populating integrations');
-        })
-        .catch(function(err) {
-          console.log('Error populating integrations:', err);
-        });
-
-      models.Company
-        .bulkCreate([{
-          name: 'Acme',
-          type: 'ltd',
-          street: 'Acme Sreet',
-        }, {
-          name: 'Xenialab',
-          type: 'srl',
-          street: 'C.so Vittorio Emanuele II, 111',
-          postalCode: '10128',
-          country: 'Italy',
-          city: 'Turin',
-          vat: '09668910012',
-          website: 'http://www.xenialab.com/',
-          phone: '+39 011.19886500',
-          fax: '+39 011.0960070',
-          email: [email-masked]'
-        }])
-        .then(function(companies) {
-          console.log(util.format('Populating Companies: %s - DONE ', _.map(companies, 'name').join()));
-        });
-
-      models.Dashboard
-        .destroy({
-          where: {
-            defaultEntry: true
-          }
-        })
-        .then(function() {
-          return models.Dashboard
-            .bulkCreate([{
-              name: 'Inbound Calls',
-              model: JSON.stringify({
-                "title": "Voice Inbound",
-                "rows": [{
-                  "columns": [{
-                    "styleClass": "col-md-3",
-                    "widgets": [{
-                      "type": "counter",
-                      "config": {
-                        "timeout": 5,
-                        "color": "blue-madison",
-                        "icon": "fa-comments",
-                        "link": "#",
-                        "linkText": "VIEW MORE",
-                        "reportTables": [{
-                          "name": "Agents",
-                          "value": "report_agent"
-                        }, {
-                          "name": "Calls",
-                          "value": "report_call"
-                        }, {
-                          "name": "Dials",
-                          "value": "report_dial"
-                        }, {
-                          "name": "Queues",
-                          "value": "report_queue"
-                        }, {
-                          "name": "Users",
-                          "value": "users"
-                        }, {
-                          "name": "Chat Sessions",
-                          "value": "report_chat_session"
-                        }, {
-                          "name": "Mail Sessions",
-                          "value": "report_mail_session"
-                        }],
-                        "colors": [{
-                          "name": "Blue",
-                          "value": "blue-madison"
-                        }, {
-                          "name": "Red",
-                          "value": "red-intense"
-                        }, {
-                          "name": "Green",
-                          "value": "green-haze"
-                        }, {
-                          "name": "Purple",
-                          "value": "purple-plum"
-                        }, {
-                          "name": "Orange",
-                          "value": "yellow-casablanca"
-                        }, {
-                          "name": "Yellow",
-                          "value": "yellow-crusta"
-                        }],
-                        "icons": [{
-                          "name": "Talk bubbles",
-                          "value": "fa-comments"
-                        }, {
-                          "name": "Bar Chart",
-                          "value": "fa-bar-chart"
-                        }, {
-                          "name": "Shopping Cart",
-                          "value": "fa-shopping-cart"
-                        }, {
-                          "name": "Globe",
-                          "value": "fa-globe"
-                        }],
-                        "report": "report_queue_history",
-                        "condition": "queuecallerabandon=0 AND queuecallercomplete=0 AND queuecallerexit=0 AND queuecallerleaveAt is not null",
-                        "details": "Active Calls",
-                        "select": "COUNT(*)"
-                      },
-                      "title": "CALLS",
-                      "titleTemplateUrl": "../src/templates/widget-title.html",
-                      "wid": "1454772532346-10"
-                    }, {
-                      "type": "counter",
-                      "config": {
-                        "timeout": 5,
-                        "color": "blue-madison",
-                        "icon": "fa-comments",
-                        "link": "#",
-                        "linkText": "VIEW MORE",
-                        "reportTables": [{
-                          "name": "Agents",
-                          "value": "report_agent"
-                        }, {
-                          "name": "Calls",
-                          "value": "report_call"
-                        }, {
-                          "name": "Dials",
-                          "value": "report_dial"
-                        }, {
-                          "name": "Queues",
-                          "value": "report_queue"
-                        }, {
-                          "name": "Users",
-                          "value": "users"
-                        }, {
-                          "name": "Chat Sessions",
-                          "value": "report_chat_session"
-                        }, {
-                          "name": "Mail Sessions",
-                          "value": "report_mail_session"
-                        }],
-                        "colors": [{
-                          "name": "Blue",
-                          "value": "blue-madison"
-                        }, {
-                          "name": "Red",
-                          "value": "red-intense"
-                        }, {
-                          "name": "Green",
-                          "value": "green-haze"
-                        }, {
-                          "name": "Purple",
-                          "value": "purple-plum"
-                        }, {
-                          "name": "Orange",
-                          "value": "yellow-casablanca"
-                        }, {
-                          "name": "Yellow",
-                          "value": "yellow-crusta"
-                        }],
-                        "icons": [{
-                          "name": "Talk bubbles",
-                          "value": "fa-comments"
-                        }, {
-                          "name": "Bar Chart",
-                          "value": "fa-bar-chart"
-                        }, {
-                          "name": "Shopping Cart",
-                          "value": "fa-shopping-cart"
-                        }, {
-                          "name": "Globe",
-                          "value": "fa-globe"
-                        }],
-                        "report": "report_queue_history",
-                        "condition": "queuecallercomplete=1",
-                        "details": "Total Answered",
-                        "select": "COUNT(*)"
-                      },
-                      "title": "CALLS",
-                      "titleTemplateUrl": "../src/templates/widget-title.html",
-                      "wid": "1456841031111-8"
-                    }, {
-                      "type": "counter",
-                      "config": {
-                        "timeout": 5,
-                        "color": "blue-madison",
-                        "icon": "fa-comments",
-                        "link": "#",
-                        "linkText": "VIEW MORE",
-                        "reportTables": [{
-                          "name": "Agents",
-                          "value": "report_agent"
-                        }, {
-                          "name": "Calls",
-                          "value": "report_call"
-                        }, {
-                          "name": "Dials",
-                          "value": "report_dial"
-                        }, {
-                          "name": "Queues",
-                          "value": "report_queue"
-                        }, {
-                          "name": "Users",
-                          "value": "users"
-                        }, {
-                          "name": "Chat Sessions",
-                          "value": "report_chat_session"
-                        }, {
-                          "name": "Mail Sessions",
-                          "value": "report_mail_session"
-                        }],
-                        "colors": [{
-                          "name": "Blue",
-                          "value": "blue-madison"
-                        }, {
-                          "name": "Red",
-                          "value": "red-intense"
-                        }, {
-                          "name": "Green",
-                          "value": "green-haze"
-                        }, {
-                          "name": "Purple",
-                          "value": "purple-plum"
-                        }, {
-                          "name": "Orange",
-                          "value": "yellow-casablanca"
-                        }, {
-                          "name": "Yellow",
-                          "value": "yellow-crusta"
-                        }],
-                        "icons": [{
-                          "name": "Talk bubbles",
-                          "value": "fa-comments"
-                        }, {
-                          "name": "Bar Chart",
-                          "value": "fa-bar-chart"
-                        }, {
-                          "name": "Shopping Cart",
-                          "value": "fa-shopping-cart"
-                        }, {
-                          "name": "Globe",
-                          "value": "fa-globe"
-                        }],
-                        "select": "ROUND(SUM(queuecallercomplete) / (SUM(queuecallercomplete)+SUM(queuecallerabandon)) *100,1)",
-                        "report": "report_queue_history",
-                        "condition": "1",
-                        "details": "Answer Rate(%)"
-                      },
-                      "title": "CALLS",
-                      "titleTemplateUrl": "../src/templates/widget-title.html",
-                      "wid": "1457270124802-4"
-                    }, {
-                      "type": "counter",
-                      "config": {
-                        "timeout": 5,
-                        "color": "blue-madison",
-                        "icon": "fa-comments",
-                        "link": "#",
-                        "linkText": "VIEW MORE",
-                        "reportTables": [{
-                          "name": "Agents",
-                          "value": "report_agent"
-                        }, {
-                          "name": "Calls",
-                          "value": "report_call"
-                        }, {
-                          "name": "Dials",
-                          "value": "report_dial"
-                        }, {
-                          "name": "Queues",
-                          "value": "report_queue"
-                        }, {
-                          "name": "Users",
-                          "value": "users"
-                        }, {
-                          "name": "Chat Sessions",
-                          "value": "report_chat_session"
-                        }, {
-                          "name": "Mail Sessions",
-                          "value": "report_mail_session"
-                        }],
-                        "colors": [{
-                          "name": "Blue",
-                          "value": "blue-madison"
-                        }, {
-                          "name": "Red",
-                          "value": "red-intense"
-                        }, {
-                          "name": "Green",
-                          "value": "green-haze"
-                        }, {
-                          "name": "Purple",
-                          "value": "purple-plum"
-                        }, {
-                          "name": "Orange",
-                          "value": "yellow-casablanca"
-                        }, {
-                          "name": "Yellow",
-                          "value": "yellow-crusta"
-                        }],
-                        "icons": [{
-                          "name": "Talk bubbles",
-                          "value": "fa-comments"
-                        }, {
-                          "name": "Bar Chart",
-                          "value": "fa-bar-chart"
-                        }, {
-                          "name": "Shopping Cart",
-                          "value": "fa-shopping-cart"
-                        }, {
-                          "name": "Globe",
-                          "value": "fa-globe"
-                        }],
-                        "select": "SEC_TO_TIME(ROUND(AVG(talktime),0))",
-                        "report": "report_agent_history",
-                        "condition": "agentcomplete=1",
-                        "details": "Avg Talk Time"
-                      },
-                      "title": "CALLS",
-                      "titleTemplateUrl": "../src/templates/widget-title.html",
-                      "wid": "1457270214766-5"
-                    }, {
-                      "type": "counter",
-                      "config": {
-                        "timeout": 5,
-                        "color": "green-haze",
-                        "icon": "fa-comments",
-                        "link": "#",
-                        "linkText": "VIEW MORE",
-                        "reportTables": [{
-                          "name": "Agents",
-                          "value": "report_agent"
-                        }, {
-                          "name": "Calls",
-                          "value": "report_call"
-                        }, {
-                          "name": "Dials",
-                          "value": "report_dial"
-                        }, {
-                          "name": "Queues",
-                          "value": "report_queue"
-                        }, {
-                          "name": "Users",
-                          "value": "users"
-                        }, {
-                          "name": "Chat Sessions",
-                          "value": "report_chat_session"
-                        }, {
-                          "name": "Mail Sessions",
-                          "value": "report_mail_session"
-                        }],
-                        "colors": [{
-                          "name": "Blue",
-                          "value": "blue-madison"
-                        }, {
-                          "name": "Red",
-                          "value": "red-intense"
-                        }, {
-                          "name": "Green",
-                          "value": "green-haze"
-                        }, {
-                          "name": "Purple",
-                          "value": "purple-plum"
-                        }, {
-                          "name": "Orange",
-                          "value": "yellow-casablanca"
-                        }, {
-                          "name": "Yellow",
-                          "value": "yellow-crusta"
-                        }],
-                        "icons": [{
-                          "name": "Talk bubbles",
-                          "value": "fa-comments"
-                        }, {
-                          "name": "Bar Chart",
-                          "value": "fa-bar-chart"
-                        }, {
-                          "name": "Shopping Cart",
-                          "value": "fa-shopping-cart"
-                        }, {
-                          "name": "Globe",
-                          "value": "fa-globe"
-                        }],
-                        "select": "ROUND(SUM(CASE WHEN queuecallercomplete=1 AND (UNIX_TIMESTAMP(queuecallerleaveAt)-UNIX_TIMESTAMP(queuecallerjoinAt) < 10) THEN 1 ELSE 0 END)/(SUM(queuecallercomplete) + SUM(CASE WHEN queuecallerabandon=1 AND (UNIX_TIMESTAMP(queuecallerleaveAt)-UNIX_TIMESTAMP(queuecallerjoinAt) > 10) THEN 1 ELSE 0 END)) *100,1)",
-                        "report": "report_queue_history",
-                        "condition": "1",
-                        "details": "Service Level 10 (%)"
-                      },
-                      "title": "SERVICE LEVEL",
-                      "titleTemplateUrl": "../src/templates/widget-title.html",
-                      "wid": "1457366965794-3"
-                    }],
-                    "cid": "1456841191661-21"
-                  }, {
-                    "styleClass": "col-md-3",
-                    "widgets": [{
-                      "type": "counter",
-                      "config": {
-                        "timeout": 5,
-                        "color": "red-intense",
-                        "icon": "fa-comments",
-                        "link": "#",
-                        "linkText": "VIEW MORE",
-                        "reportTables": [{
-                          "name": "Agents",
-                          "value": "report_agent"
-                        }, {
-                          "name": "Calls",
-                          "value": "report_call"
-                        }, {
-                          "name": "Dials",
-                          "value": "report_dial"
-                        }, {
-                          "name": "Queues",
-                          "value": "report_queue"
-                        }, {
-                          "name": "Users",
-                          "value": "users"
-                        }, {
-                          "name": "Chat Sessions",
-                          "value": "report_chat_session"
-                        }, {
-                          "name": "Mail Sessions",
-                          "value": "report_mail_session"
-                        }],
-                        "colors": [{
-                          "name": "Blue",
-                          "value": "blue-madison"
-                        }, {
-                          "name": "Red",
-                          "value": "red-intense"
-                        }, {
-                          "name": "Green",
-                          "value": "green-haze"
-                        }, {
-                          "name": "Purple",
-                          "value": "purple-plum"
-                        }, {
-                          "name": "Orange",
-                          "value": "yellow-casablanca"
-                        }, {
-                          "name": "Yellow",
-                          "value": "yellow-crusta"
-                        }],
-                        "icons": [{
-                          "name": "Talk bubbles",
-                          "value": "fa-comments"
-                        }, {
-                          "name": "Bar Chart",
-                          "value": "fa-bar-chart"
-                        }, {
-                          "name": "Shopping Cart",
-                          "value": "fa-shopping-cart"
-                        }, {
-                          "name": "Globe",
-                          "value": "fa-globe"
-                        }],
-                        "report": "report_queue_history",
-                        "condition": "queuecallerleaveAt IS NULL",
-                        "details": "Waiting Calls",
-                        "select": "COUNT(*)"
-                      },
-                      "title": "CALLS",
-                      "titleTemplateUrl": "../src/templates/widget-title.html",
-                      "wid": "1456839870449-5"
-                    }, {
-                      "type": "counter",
-                      "config": {
-                        "timeout": 5,
-                        "color": "red-intense",
-                        "icon": "fa-comments",
-                        "link": "#",
-                        "linkText": "VIEW MORE",
-                        "reportTables": [{
-                          "name": "Agents",
-                          "value": "report_agent"
-                        }, {
-                          "name": "Calls",
-                          "value": "report_call"
-                        }, {
-                          "name": "Dials",
-                          "value": "report_dial"
-                        }, {
-                          "name": "Queues",
-                          "value": "report_queue"
-                        }, {
-                          "name": "Users",
-                          "value": "users"
-                        }, {
-                          "name": "Chat Sessions",
-                          "value": "report_chat_session"
-                        }, {
-                          "name": "Mail Sessions",
-                          "value": "report_mail_session"
-                        }],
-                        "colors": [{
-                          "name": "Blue",
-                          "value": "blue-madison"
-                        }, {
-                          "name": "Red",
-                          "value": "red-intense"
-                        }, {
-                          "name": "Green",
-                          "value": "green-haze"
-                        }, {
-                          "name": "Purple",
-                          "value": "purple-plum"
-                        }, {
-                          "name": "Orange",
-                          "value": "yellow-casablanca"
-                        }, {
-                          "name": "Yellow",
-                          "value": "yellow-crusta"
-                        }],
-                        "icons": [{
-                          "name": "Talk bubbles",
-                          "value": "fa-comments"
-                        }, {
-                          "name": "Bar Chart",
-                          "value": "fa-bar-chart"
-                        }, {
-                          "name": "Shopping Cart",
-                          "value": "fa-shopping-cart"
-                        }, {
-                          "name": "Globe",
-                          "value": "fa-globe"
-                        }],
-                        "report": "report_queue_history",
-                        "condition": "queuecallerabandon=1",
-                        "details": "Total Abandoned",
-                        "select": "COUNT(*)"
-                      },
-                      "title": "CALLS",
-                      "titleTemplateUrl": "../src/templates/widget-title.html",
-                      "wid": "1456841244931-27"
-                    }, {
-                      "type": "counter",
-                      "config": {
-                        "timeout": 5,
-                        "color": "red-intense",
-                        "icon": "fa-comments",
-                        "link": "#",
-                        "linkText": "VIEW MORE",
-                        "reportTables": [{
-                          "name": "Agents",
-                          "value": "report_agent"
-                        }, {
-                          "name": "Calls",
-                          "value": "report_call"
-                        }, {
-                          "name": "Dials",
-                          "value": "report_dial"
-                        }, {
-                          "name": "Queues",
-                          "value": "report_queue"
-                        }, {
-                          "name": "Users",
-                          "value": "users"
-                        }, {
-                          "name": "Chat Sessions",
-                          "value": "report_chat_session"
-                        }, {
-                          "name": "Mail Sessions",
-                          "value": "report_mail_session"
-                        }],
-                        "colors": [{
-                          "name": "Blue",
-                          "value": "blue-madison"
-                        }, {
-                          "name": "Red",
-                          "value": "red-intense"
-                        }, {
-                          "name": "Green",
-                          "value": "green-haze"
-                        }, {
-                          "name": "Purple",
-                          "value": "purple-plum"
-                        }, {
-                          "name": "Orange",
-                          "value": "yellow-casablanca"
-                        }, {
-                          "name": "Yellow",
-                          "value": "yellow-crusta"
-                        }],
-                        "icons": [{
-                          "name": "Talk bubbles",
-                          "value": "fa-comments"
-                        }, {
-                          "name": "Bar Chart",
-                          "value": "fa-bar-chart"
-                        }, {
-                          "name": "Shopping Cart",
-                          "value": "fa-shopping-cart"
-                        }, {
-                          "name": "Globe",
-                          "value": "fa-globe"
-                        }],
-                        "select": "ROUND(SUM(queuecallerabandon) / (SUM(queuecallercomplete)+SUM(queuecallerabandon)) *100,1)",
-                        "report": "report_queue_history",
-                        "condition": "1",
-                        "details": "Abandon Rate (%)"
-                      },
-                      "title": "CALLS",
-                      "titleTemplateUrl": "../src/templates/widget-title.html",
-                      "wid": "1457269033923-3"
-                    }, {
-                      "type": "counter",
-                      "config": {
-                        "timeout": 5,
-                        "color": "yellow-casablanca",
-                        "icon": "fa-comments",
-                        "link": "#",
-                        "linkText": "VIEW MORE",
-                        "reportTables": [{
-                          "name": "Agents",
-                          "value": "report_agent"
-                        }, {
-                          "name": "Calls",
-                          "value": "report_call"
-                        }, {
-                          "name": "Dials",
-                          "value": "report_dial"
-                        }, {
-                          "name": "Queues",
-                          "value": "report_queue"
-                        }, {
-                          "name": "Users",
-                          "value": "users"
-                        }, {
-                          "name": "Chat Sessions",
-                          "value": "report_chat_session"
-                        }, {
-                          "name": "Mail Sessions",
-                          "value": "report_mail_session"
-                        }],
-                        "colors": [{
-                          "name": "Blue",
-                          "value": "blue-madison"
-                        }, {
-                          "name": "Red",
-                          "value": "red-intense"
-                        }, {
-                          "name": "Green",
-                          "value": "green-haze"
-                        }, {
-                          "name": "Purple",
-                          "value": "purple-plum"
-                        }, {
-                          "name": "Orange",
-                          "value": "yellow-casablanca"
-                        }, {
-                          "name": "Yellow",
-                          "value": "yellow-crusta"
-                        }],
-                        "icons": [{
-                          "name": "Talk bubbles",
-                          "value": "fa-comments"
-                        }, {
-                          "name": "Bar Chart",
-                          "value": "fa-bar-chart"
-                        }, {
-                          "name": "Shopping Cart",
-                          "value": "fa-shopping-cart"
-                        }, {
-                          "name": "Globe",
-                          "value": "fa-globe"
-                        }],
-                        "select": "SEC_TO_TIME(ROUND(AVG(holdtime),0))",
-                        "report": "report_agent_history",
-                        "condition": "agentcomplete=1",
-                        "details": "Avg Answer Time"
-                      },
-                      "title": "CALLS",
-                      "titleTemplateUrl": "../src/templates/widget-title.html",
-                      "wid": "1457270230324-8"
-                    }, {
-                      "type": "counter",
-                      "config": {
-                        "timeout": 5,
-                        "condition": "1",
-                        "color": "green-haze",
-                        "icon": "fa-comments",
-                        "link": "#",
-                        "linkText": "VIEW MORE",
-                        "reportTables": [{
-                          "name": "Agents",
-                          "value": "report_agent"
-                        }, {
-                          "name": "Calls",
-                          "value": "report_call"
-                        }, {
-                          "name": "Dials",
-                          "value": "report_dial"
-                        }, {
-                          "name": "Queues",
-                          "value": "report_queue"
-                        }, {
-                          "name": "Users",
-                          "value": "users"
-                        }, {
-                          "name": "Chat Sessions",
-                          "value": "report_chat_session"
-                        }, {
-                          "name": "Mail Sessions",
-                          "value": "report_mail_session"
-                        }],
-                        "colors": [{
-                          "name": "Blue",
-                          "value": "blue-madison"
-                        }, {
-                          "name": "Red",
-                          "value": "red-intense"
-                        }, {
-                          "name": "Green",
-                          "value": "green-haze"
-                        }, {
-                          "name": "Purple",
-                          "value": "purple-plum"
-                        }, {
-                          "name": "Orange",
-                          "value": "yellow-casablanca"
-                        }, {
-                          "name": "Yellow",
-                          "value": "yellow-crusta"
-                        }],
-                        "icons": [{
-                          "name": "Talk bubbles",
-                          "value": "fa-comments"
-                        }, {
-                          "name": "Bar Chart",
-                          "value": "fa-bar-chart"
-                        }, {
-                          "name": "Shopping Cart",
-                          "value": "fa-shopping-cart"
-                        }, {
-                          "name": "Globe",
-                          "value": "fa-globe"
-                        }],
-                        "select": "ROUND(SUM(CASE WHEN queuecallercomplete=1 AND (UNIX_TIMESTAMP(queuecallerleaveAt)-UNIX_TIMESTAMP(queuecallerjoinAt) < 15) THEN 1 ELSE 0 END)/(SUM(queuecallercomplete) + SUM(CASE WHEN queuecallerabandon=1 AND (UNIX_TIMESTAMP(queuecallerleaveAt)-UNIX_TIMESTAMP(queuecallerjoinAt) > 15) THEN 1 ELSE 0 END)) *100,1)",
-                        "report": "report_queue_history",
-                        "details": "Service Level 15 (%)"
-                      },
-                      "title": "SERVICE LEVEL 15",
-                      "titleTemplateUrl": "../src/templates/widget-title.html",
-                      "wid": "1457952734590-1"
-                    }],
-                    "cid": "1456841191662-22"
-                  }, {
-                    "styleClass": "col-md-3",
-                    "widgets": [{
-                      "type": "counter",
-                      "config": {
-                        "timeout": 5,
-                        "color": "blue-madison",
-                        "icon": "fa-comments",
-                        "link": "#",
-                        "linkText": "VIEW MORE",
-                        "reportTables": [{
-                          "name": "Agents",
-                          "value": "report_agent"
-                        }, {
-                          "name": "Calls",
-                          "value": "report_call"
-                        }, {
-                          "name": "Dials",
-                          "value": "report_dial"
-                        }, {
-                          "name": "Queues",
-                          "value": "report_queue"
-                        }, {
-                          "name": "Users",
-                          "value": "users"
-                        }, {
-                          "name": "Chat Sessions",
-                          "value": "report_chat_session"
-                        }, {
-                          "name": "Mail Sessions",
-                          "value": "report_mail_session"
-                        }],
-                        "colors": [{
-                          "name": "Blue",
-                          "value": "blue-madison"
-                        }, {
-                          "name": "Red",
-                          "value": "red-intense"
-                        }, {
-                          "name": "Green",
-                          "value": "green-haze"
-                        }, {
-                          "name": "Purple",
-                          "value": "purple-plum"
-                        }, {
-                          "name": "Orange",
-                          "value": "yellow-casablanca"
-                        }, {
-                          "name": "Yellow",
-                          "value": "yellow-crusta"
-                        }],
-                        "icons": [{
-                          "name": "Talk bubbles",
-                          "value": "fa-comments"
-                        }, {
-                          "name": "Bar Chart",
-                          "value": "fa-bar-chart"
-                        }, {
-                          "name": "Shopping Cart",
-                          "value": "fa-shopping-cart"
-                        }, {
-                          "name": "Globe",
-                          "value": "fa-globe"
-                        }],
-                        "select": "SEC_TO_TIME(MAX(UNIX_TIMESTAMP()-UNIX_TIMESTAMP(queuecallerleaveAt)))",
-                        "report": "report_queue_history",
-                        "condition": "queuecallerabandon=0 AND queuecallercomplete=0 AND queuecallerexit=0 AND queuecallerleaveAt is not null",
-                        "details": "Longest Active Call"
-                      },
-                      "title": "CALLS",
-                      "titleTemplateUrl": "../src/templates/widget-title.html",
-                      "wid": "1457275258494-11"
-                    }, {
-                      "type": "counter",
-                      "config": {
-                        "timeout": 5,
-                        "color": "yellow-casablanca",
-                        "icon": "fa-bar-chart",
-                        "link": "#",
-                        "linkText": "VIEW MORE",
-                        "reportTables": [{
-                          "name": "Agents",
-                          "value": "report_agent"
-                        }, {
-                          "name": "Calls",
-                          "value": "report_call"
-                        }, {
-                          "name": "Dials",
-                          "value": "report_dial"
-                        }, {
-                          "name": "Queues",
-                          "value": "report_queue"
-                        }, {
-                          "name": "Users",
-                          "value": "users"
-                        }, {
-                          "name": "Chat Sessions",
-                          "value": "report_chat_session"
-                        }, {
-                          "name": "Mail Sessions",
-                          "value": "report_mail_session"
-                        }],
-                        "colors": [{
-                          "name": "Blue",
-                          "value": "blue-madison"
-                        }, {
-                          "name": "Red",
-                          "value": "red-intense"
-                        }, {
-                          "name": "Green",
-                          "value": "green-haze"
-                        }, {
-                          "name": "Purple",
-                          "value": "purple-plum"
-                        }, {
-                          "name": "Orange",
-                          "value": "yellow-casablanca"
-                        }, {
-                          "name": "Yellow",
-                          "value": "yellow-crusta"
-                        }],
-                        "icons": [{
-                          "name": "Talk bubbles",
-                          "value": "fa-comments"
-                        }, {
-                          "name": "Bar Chart",
-                          "value": "fa-bar-chart"
-                        }, {
-                          "name": "Shopping Cart",
-                          "value": "fa-shopping-cart"
-                        }, {
-                          "name": "Globe",
-                          "value": "fa-globe"
-                        }],
-                        "select": "COUNT(distinct uniqueid)",
-                        "report": "report_queue_history",
-                        "details": "Total Offered",
-                        "condition": "1"
-                      },
-                      "title": "CALLS",
-                      "titleTemplateUrl": "../src/templates/widget-title.html",
-                      "wid": "1457269010616-1"
-                    }, {
-                      "type": "counter",
-                      "config": {
-                        "timeout": 5,
-                        "color": "yellow-casablanca",
-                        "icon": "fa-bar-chart",
-                        "link": "#",
-                        "linkText": "VIEW MORE",
-                        "reportTables": [{
-                          "name": "Agents",
-                          "value": "report_agent"
-                        }, {
-                          "name": "Calls",
-                          "value": "report_call"
-                        }, {
-                          "name": "Dials",
-                          "value": "report_dial"
-                        }, {
-                          "name": "Queues",
-                          "value": "report_queue"
-                        }, {
-                          "name": "Users",
-                          "value": "users"
-                        }, {
-                          "name": "Chat Sessions",
-                          "value": "report_chat_session"
-                        }, {
-                          "name": "Mail Sessions",
-                          "value": "report_mail_session"
-                        }],
-                        "colors": [{
-                          "name": "Blue",
-                          "value": "blue-madison"
-                        }, {
-                          "name": "Red",
-                          "value": "red-intense"
-                        }, {
-                          "name": "Green",
-                          "value": "green-haze"
-                        }, {
-                          "name": "Purple",
-                          "value": "purple-plum"
-                        }, {
-                          "name": "Orange",
-                          "value": "yellow-casablanca"
-                        }, {
-                          "name": "Yellow",
-                          "value": "yellow-crusta"
-                        }],
-                        "icons": [{
-                          "name": "Talk bubbles",
-                          "value": "fa-comments"
-                        }, {
-                          "name": "Bar Chart",
-                          "value": "fa-bar-chart"
-                        }, {
-                          "name": "Shopping Cart",
-                          "value": "fa-shopping-cart"
-                        }, {
-                          "name": "Globe",
-                          "value": "fa-globe"
-                        }],
-                        "select": "ROUND(COUNT(DISTINCT uniqueid)/HOUR(CURRENT_TIMESTAMP()),1)",
-                        "report": "report_queue_history",
-                        "condition": "1",
-                        "details": "Avg Offered Per Hour"
-                      },
-                      "title": "CALLS",
-                      "titleTemplateUrl": "../src/templates/widget-title.html",
-                      "wid": "1457275263022-12"
-                    }, {
-                      "type": "counter",
-                      "config": {
-                        "timeout": 5,
-                        "color": "red-intense",
-                        "icon": "fa-comments",
-                        "link": "#",
-                        "linkText": "VIEW MORE",
-                        "reportTables": [{
-                          "name": "Agents",
-                          "value": "report_agent"
-                        }, {
-                          "name": "Calls",
-                          "value": "report_call"
-                        }, {
-                          "name": "Dials",
-                          "value": "report_dial"
-                        }, {
-                          "name": "Queues",
-                          "value": "report_queue"
-                        }, {
-                          "name": "Users",
-                          "value": "users"
-                        }, {
-                          "name": "Chat Sessions",
-                          "value": "report_chat_session"
-                        }, {
-                          "name": "Mail Sessions",
-                          "value": "report_mail_session"
-                        }],
-                        "colors": [{
-                          "name": "Blue",
-                          "value": "blue-madison"
-                        }, {
-                          "name": "Red",
-                          "value": "red-intense"
-                        }, {
-                          "name": "Green",
-                          "value": "green-haze"
-                        }, {
-                          "name": "Purple",
-                          "value": "purple-plum"
-                        }, {
-                          "name": "Orange",
-                          "value": "yellow-casablanca"
-                        }, {
-                          "name": "Yellow",
-                          "value": "yellow-crusta"
-                        }],
-                        "icons": [{
-                          "name": "Talk bubbles",
-                          "value": "fa-comments"
-                        }, {
-                          "name": "Bar Chart",
-                          "value": "fa-bar-chart"
-                        }, {
-                          "name": "Shopping Cart",
-                          "value": "fa-shopping-cart"
-                        }, {
-                          "name": "Globe",
-                          "value": "fa-globe"
-                        }],
-                        "select": "SEC_TO_TIME(ROUND(AVG(UNIX_TIMESTAMP(queuecallerabandonAt)- UNIX_TIMESTAMP(queuecallerJoinAt)),0))",
-                        "report": "report_queue_history",
-                        "condition": "queuecallerabandon=1",
-                        "details": "Avg Abandon Time"
-                      },
-                      "title": "CALLS",
-                      "titleTemplateUrl": "../src/templates/widget-title.html",
-                      "wid": "1457270223870-7"
-                    }, {
-                      "type": "counter",
-                      "config": {
-                        "timeout": 5,
-                        "condition": "1",
-                        "color": "green-haze",
-                        "icon": "fa-comments",
-                        "link": "#",
-                        "linkText": "VIEW MORE",
-                        "reportTables": [{
-                          "name": "Agents",
-                          "value": "report_agent"
-                        }, {
-                          "name": "Calls",
-                          "value": "report_call"
-                        }, {
-                          "name": "Dials",
-                          "value": "report_dial"
-                        }, {
-                          "name": "Queues",
-                          "value": "report_queue"
-                        }, {
-                          "name": "Users",
-                          "value": "users"
-                        }, {
-                          "name": "Chat Sessions",
-                          "value": "report_chat_session"
-                        }, {
-                          "name": "Mail Sessions",
-                          "value": "report_mail_session"
-                        }],
-                        "colors": [{
-                          "name": "Blue",
-                          "value": "blue-madison"
-                        }, {
-                          "name": "Red",
-                          "value": "red-intense"
-                        }, {
-                          "name": "Green",
-                          "value": "green-haze"
-                        }, {
-                          "name": "Purple",
-                          "value": "purple-plum"
-                        }, {
-                          "name": "Orange",
-                          "value": "yellow-casablanca"
-                        }, {
-                          "name": "Yellow",
-                          "value": "yellow-crusta"
-                        }],
-                        "icons": [{
-                          "name": "Talk bubbles",
-                          "value": "fa-comments"
-                        }, {
-                          "name": "Bar Chart",
-                          "value": "fa-bar-chart"
-                        }, {
-                          "name": "Shopping Cart",
-                          "value": "fa-shopping-cart"
-                        }, {
-                          "name": "Globe",
-                          "value": "fa-globe"
-                        }],
-                        "select": "ROUND(SUM(CASE WHEN queuecallercomplete=1 AND (UNIX_TIMESTAMP(queuecallerleaveAt)-UNIX_TIMESTAMP(queuecallerjoinAt) < 20) THEN 1 ELSE 0 END)/(SUM(queuecallercomplete) + SUM(CASE WHEN queuecallerabandon=1 AND (UNIX_TIMESTAMP(queuecallerleaveAt)-UNIX_TIMESTAMP(queuecallerjoinAt) > 20) THEN 1 ELSE 0 END)) *100,1)",
-                        "report": "report_queue_history",
-                        "details": "Service Level 20 (%)"
-                      },
-                      "title": "SERVICE LEVEL 20",
-                      "titleTemplateUrl": "../src/templates/widget-title.html",
-                      "wid": "1457952751605-2"
-                    }],
-                    "cid": "1456841191663-23"
-                  }, {
-                    "styleClass": "col-md-3",
-                    "widgets": [{
-                      "type": "counter",
-                      "config": {
-                        "timeout": 5,
-                        "color": "red-intense",
-                        "icon": "fa-comments",
-                        "link": "#",
-                        "linkText": "VIEW MORE",
-                        "reportTables": [{
-                          "name": "Agents",
-                          "value": "report_agent"
-                        }, {
-                          "name": "Calls",
-                          "value": "report_call"
-                        }, {
-                          "name": "Dials",
-                          "value": "report_dial"
-                        }, {
-                          "name": "Queues",
-                          "value": "report_queue"
-                        }, {
-                          "name": "Users",
-                          "value": "users"
-                        }, {
-                          "name": "Chat Sessions",
-                          "value": "report_chat_session"
-                        }, {
-                          "name": "Mail Sessions",
-                          "value": "report_mail_session"
-                        }],
-                        "colors": [{
-                          "name": "Blue",
-                          "value": "blue-madison"
-                        }, {
-                          "name": "Red",
-                          "value": "red-intense"
-                        }, {
-                          "name": "Green",
-                          "value": "green-haze"
-                        }, {
-                          "name": "Purple",
-                          "value": "purple-plum"
-                        }, {
-                          "name": "Orange",
-                          "value": "yellow-casablanca"
-                        }, {
-                          "name": "Yellow",
-                          "value": "yellow-crusta"
-                        }],
-                        "icons": [{
-                          "name": "Talk bubbles",
-                          "value": "fa-comments"
-                        }, {
-                          "name": "Bar Chart",
-                          "value": "fa-bar-chart"
-                        }, {
-                          "name": "Shopping Cart",
-                          "value": "fa-shopping-cart"
-                        }, {
-                          "name": "Globe",
-                          "value": "fa-globe"
-                        }],
-                        "select": "SEC_TO_TIME(MAX(UNIX_TIMESTAMP()-UNIX_TIMESTAMP(queuecallerjoinAt)))",
-                        "report": "report_queue_history",
-                        "condition": "queuecallerleaveAt IS NULL",
-                        "details": "Oldest Waiting Call"
-                      },
-                      "title": "CALLS",
-                      "titleTemplateUrl": "../src/templates/widget-title.html",
-                      "wid": "1457275254061-10"
-                    }, {
-                      "type": "counter",
-                      "config": {
-                        "timeout": 5,
-                        "color": "red-intense",
-                        "icon": "fa-comments",
-                        "link": "#",
-                        "linkText": "VIEW MORE",
-                        "reportTables": [{
-                          "name": "Agents",
-                          "value": "report_agent"
-                        }, {
-                          "name": "Calls",
-                          "value": "report_call"
-                        }, {
-                          "name": "Dials",
-                          "value": "report_dial"
-                        }, {
-                          "name": "Queues",
-                          "value": "report_queue"
-                        }, {
-                          "name": "Users",
-                          "value": "users"
-                        }, {
-                          "name": "Chat Sessions",
-                          "value": "report_chat_session"
-                        }, {
-                          "name": "Mail Sessions",
-                          "value": "report_mail_session"
-                        }],
-                        "colors": [{
-                          "name": "Blue",
-                          "value": "blue-madison"
-                        }, {
-                          "name": "Red",
-                          "value": "red-intense"
-                        }, {
-                          "name": "Green",
-                          "value": "green-haze"
-                        }, {
-                          "name": "Purple",
-                          "value": "purple-plum"
-                        }, {
-                          "name": "Orange",
-                          "value": "yellow-casablanca"
-                        }, {
-                          "name": "Yellow",
-                          "value": "yellow-crusta"
-                        }],
-                        "icons": [{
-                          "name": "Talk bubbles",
-                          "value": "fa-comments"
-                        }, {
-                          "name": "Bar Chart",
-                          "value": "fa-bar-chart"
-                        }, {
-                          "name": "Shopping Cart",
-                          "value": "fa-shopping-cart"
-                        }, {
-                          "name": "Globe",
-                          "value": "fa-globe"
-                        }],
-                        "select": "COUNT(*)",
-                        "condition": "queuecallerexit=1",
-                        "report": "report_queue_history",
-                        "details": "Unmanaged"
-                      },
-                      "title": "CALLS",
-                      "titleTemplateUrl": "../src/templates/widget-title.html",
-                      "wid": "1457269022062-2"
-                    }, {
-                      "type": "counter",
-                      "config": {
-                        "timeout": 5,
-                        "color": "yellow-crusta",
-                        "icon": "fa-comments",
-                        "link": "#",
-                        "linkText": "VIEW MORE",
-                        "reportTables": [{
-                          "name": "Agents",
-                          "value": "report_agent"
-                        }, {
-                          "name": "Calls",
-                          "value": "report_call"
-                        }, {
-                          "name": "Dials",
-                          "value": "report_dial"
-                        }, {
-                          "name": "Queues",
-                          "value": "report_queue"
-                        }, {
-                          "name": "Users",
-                          "value": "users"
-                        }, {
-                          "name": "Chat Sessions",
-                          "value": "report_chat_session"
-                        }, {
-                          "name": "Mail Sessions",
-                          "value": "report_mail_session"
-                        }],
-                        "colors": [{
-                          "name": "Blue",
-                          "value": "blue-madison"
-                        }, {
-                          "name": "Red",
-                          "value": "red-intense"
-                        }, {
-                          "name": "Green",
-                          "value": "green-haze"
-                        }, {
-                          "name": "Purple",
-                          "value": "purple-plum"
-                        }, {
-                          "name": "Orange",
-                          "value": "yellow-casablanca"
-                        }, {
-                          "name": "Yellow",
-                          "value": "yellow-crusta"
-                        }],
-                        "icons": [{
-                          "name": "Talk bubbles",
-                          "value": "fa-comments"
-                        }, {
-                          "name": "Bar Chart",
-                          "value": "fa-bar-chart"
-                        }, {
-                          "name": "Shopping Cart",
-                          "value": "fa-shopping-cart"
-                        }, {
-                          "name": "Globe",
-                          "value": "fa-globe"
-                        }],
-                        "select": "SEC_TO_TIME(ROUND(AVG(acwtime),0))",
-                        "report": "report_agent_history",
-                        "condition": "agentcomplete=1",
-                        "details": "Avg ACW Time"
-                      },
-                      "title": "CALLS",
-                      "titleTemplateUrl": "../src/templates/widget-title.html",
-                      "wid": "1457270219355-6"
-                    }],
-                    "cid": "1456841191664-24"
-                  }]
-                }],
-                "titleTemplateUrl": "../src/templates/dashboard-title.html",
-                "structure": "3-3-3-3"
-              }),
-              defaultEntry: true,
-              editable: true
-            }, {
-              name: 'Outbound Calls',
-              model: JSON.stringify({
-                "title": "Outbound Calls",
-                "rows": [{
-                  "columns": [{
-                    "styleClass": "col-md-3",
-                    "widgets": [{
-                      "type": "counter",
-                      "config": {
-                        "timeout": 5,
-                        "color": "purple-plum",
-                        "icon": "fa-globe",
-                        "link": "#",
-                        "linkText": "VIEW MORE",
-                        "reportTables": [{
-                          "name": "Agents",
-                          "value": "report_agent"
-                        }, {
-                          "name": "Calls",
-                          "value": "report_call"
-                        }, {
-                          "name": "Dials",
-                          "value": "report_dial"
-                        }, {
-                          "name": "Queues",
-                          "value": "report_queue"
-                        }, {
-                          "name": "Users",
-                          "value": "users"
-                        }, {
-                          "name": "Chat Sessions",
-                          "value": "report_chat_session"
-                        }, {
-                          "name": "Mail Sessions",
-                          "value": "report_mail_session"
-                        }],
-                        "colors": [{
-                          "name": "Blue",
-                          "value": "blue-madison"
-                        }, {
-                          "name": "Red",
-                          "value": "red-intense"
-                        }, {
-                          "name": "Green",
-                          "value": "green-haze"
-                        }, {
-                          "name": "Purple",
-                          "value": "purple-plum"
-                        }, {
-                          "name": "Orange",
-                          "value": "yellow-casablanca"
-                        }, {
-                          "name": "Yellow",
-                          "value": "yellow-crusta"
-                        }],
-                        "icons": [{
-                          "name": "Talk bubbles",
-                          "value": "fa-comments"
-                        }, {
-                          "name": "Bar Chart",
-                          "value": "fa-bar-chart"
-                        }, {
-                          "name": "Shopping Cart",
-                          "value": "fa-shopping-cart"
-                        }, {
-                          "name": "Globe",
-                          "value": "fa-globe"
-                        }],
-                        "select": "COUNT(*)",
-                        "report": "report_call_history",
-                        "condition": "type=\"outbound\"",
-                        "details": "Manual Outbound"
-                      },
-                      "title": "CALLS",
-                      "titleTemplateUrl": "../src/templates/widget-title.html",
-                      "wid": "1457276458424-14"
-                    }, {
-                      "type": "counter",
-                      "config": {
-                        "timeout": 5,
-                        "condition": "type=\"outbound\" AND disposition=\"ANSWERED\"",
-                        "color": "green-haze",
-                        "icon": "fa-globe",
-                        "link": "#",
-                        "linkText": "VIEW MORE",
-                        "reportTables": [{
-                          "name": "Agents",
-                          "value": "report_agent"
-                        }, {
-                          "name": "Calls",
-                          "value": "report_call"
-                        }, {
-                          "name": "Dials",
-                          "value": "report_dial"
-                        }, {
-                          "name": "Queues",
-                          "value": "report_queue"
-                        }, {
-                          "name": "Users",
-                          "value": "users"
-                        }, {
-                          "name": "Chat Sessions",
-                          "value": "report_chat_session"
-                        }, {
-                          "name": "Mail Sessions",
-                          "value": "report_mail_session"
-                        }],
-                        "colors": [{
-                          "name": "Blue",
-                          "value": "blue-madison"
-                        }, {
-                          "name": "Red",
-                          "value": "red-intense"
-                        }, {
-                          "name": "Green",
-                          "value": "green-haze"
-                        }, {
-                          "name": "Purple",
-                          "value": "purple-plum"
-                        }, {
-                          "name": "Orange",
-                          "value": "yellow-casablanca"
-                        }, {
-                          "name": "Yellow",
-                          "value": "yellow-crusta"
-                        }],
-                        "icons": [{
-                          "name": "Talk bubbles",
-                          "value": "fa-comments"
-                        }, {
-                          "name": "Bar Chart",
-                          "value": "fa-bar-chart"
-                        }, {
-                          "name": "Shopping Cart",
-                          "value": "fa-shopping-cart"
-                        }, {
-                          "name": "Globe",
-                          "value": "fa-globe"
-                        }],
-                        "select": "COUNT(*)",
-                        "report": "report_call_history",
-                        "details": "Answered"
-                      },
-                      "title": "CALLS",
-                      "titleTemplateUrl": "../src/templates/widget-title.html",
-                      "wid": "1457718579522-2"
-                    }],
-                    "cid": "1456841191661-21"
-                  }, {
-                    "styleClass": "col-md-3",
-                    "widgets": [{
-                      "type": "counter",
-                      "config": {
-                        "timeout": 5,
-                        "color": "purple-plum",
-                        "icon": "fa-globe",
-                        "link": "#",
-                        "linkText": "VIEW MORE",
-                        "reportTables": [{
-                          "name": "Agents",
-                          "value": "report_agent"
-                        }, {
-                          "name": "Calls",
-                          "value": "report_call"
-                        }, {
-                          "name": "Dials",
-                          "value": "report_dial"
-                        }, {
-                          "name": "Queues",
-                          "value": "report_queue"
-                        }, {
-                          "name": "Users",
-                          "value": "users"
-                        }, {
-                          "name": "Chat Sessions",
-                          "value": "report_chat_session"
-                        }, {
-                          "name": "Mail Sessions",
-                          "value": "report_mail_session"
-                        }],
-                        "colors": [{
-                          "name": "Blue",
-                          "value": "blue-madison"
-                        }, {
-                          "name": "Red",
-                          "value": "red-intense"
-                        }, {
-                          "name": "Green",
-                          "value": "green-haze"
-                        }, {
-                          "name": "Purple",
-                          "value": "purple-plum"
-                        }, {
-                          "name": "Orange",
-                          "value": "yellow-casablanca"
-                        }, {
-                          "name": "Yellow",
-                          "value": "yellow-crusta"
-                        }],
-                        "icons": [{
-                          "name": "Talk bubbles",
-                          "value": "fa-comments"
-                        }, {
-                          "name": "Bar Chart",
-                          "value": "fa-bar-chart"
-                        }, {
-                          "name": "Shopping Cart",
-                          "value": "fa-shopping-cart"
-                        }, {
-                          "name": "Globe",
-                          "value": "fa-globe"
-                        }],
-                        "select": "SEC_TO_TIME(SUM(duration))",
-                        "report": "report_call_history",
-                        "condition": "type=\"outbound\"",
-                        "details": "Global Duration"
-                      },
-                      "title": "CALLS",
-                      "titleTemplateUrl": "../src/templates/widget-title.html",
-                      "wid": "1457276453465-13"
-                    }, {
-                      "type": "counter",
-                      "config": {
-                        "timeout": 5,
-                        "condition": "type=\"outbound\"",
-                        "color": "yellow-casablanca",
-                        "icon": "fa-comments",
-                        "link": "#",
-                        "linkText": "VIEW MORE",
-                        "reportTables": [{
-                          "name": "Agents",
-                          "value": "report_agent"
-                        }, {
-                          "name": "Calls",
-                          "value": "report_call"
-                        }, {
-                          "name": "Dials",
-                          "value": "report_dial"
-                        }, {
-                          "name": "Queues",
-                          "value": "report_queue"
-                        }, {
-                          "name": "Users",
-                          "value": "users"
-                        }, {
-                          "name": "Chat Sessions",
-                          "value": "report_chat_session"
-                        }, {
-                          "name": "Mail Sessions",
-                          "value": "report_mail_session"
-                        }],
-                        "colors": [{
-                          "name": "Blue",
-                          "value": "blue-madison"
-                        }, {
-                          "name": "Red",
-                          "value": "red-intense"
-                        }, {
-                          "name": "Green",
-                          "value": "green-haze"
-                        }, {
-                          "name": "Purple",
-                          "value": "purple-plum"
-                        }, {
-                          "name": "Orange",
-                          "value": "yellow-casablanca"
-                        }, {
-                          "name": "Yellow",
-                          "value": "yellow-crusta"
-                        }],
-                        "icons": [{
-                          "name": "Talk bubbles",
-                          "value": "fa-comments"
-                        }, {
-                          "name": "Bar Chart",
-                          "value": "fa-bar-chart"
-                        }, {
-                          "name": "Shopping Cart",
-                          "value": "fa-shopping-cart"
-                        }, {
-                          "name": "Globe",
-                          "value": "fa-globe"
-                        }],
-                        "select": "ROUND(SUM(IF(disposition=\"ANSWERED\",1,0))/COUNT(*)*100,1)",
-                        "report": "report_call_history",
-                        "details": "Answer Rate (%)"
-                      },
-                      "title": "CALLS",
-                      "titleTemplateUrl": "../src/templates/widget-title.html",
-                      "wid": "1457718591243-3"
-                    }],
-                    "cid": "1456841191662-22"
-                  }, {
-                    "styleClass": "col-md-3",
-                    "widgets": [{
-                      "type": "counter",
-                      "config": {
-                        "timeout": 5,
-                        "condition": "type=\"outbound\"",
-                        "color": "blue-madison",
-                        "icon": "fa-comments",
-                        "link": "#",
-                        "linkText": "VIEW MORE",
-                        "reportTables": [{
-                          "name": "Agents",
-                          "value": "report_agent"
-                        }, {
-                          "name": "Calls",
-                          "value": "report_call"
-                        }, {
-                          "name": "Dials",
-                          "value": "report_dial"
-                        }, {
-                          "name": "Queues",
-                          "value": "report_queue"
-                        }, {
-                          "name": "Users",
-                          "value": "users"
-                        }, {
-                          "name": "Chat Sessions",
-                          "value": "report_chat_session"
-                        }, {
-                          "name": "Mail Sessions",
-                          "value": "report_mail_session"
-                        }],
-                        "colors": [{
-                          "name": "Blue",
-                          "value": "blue-madison"
-                        }, {
-                          "name": "Red",
-                          "value": "red-intense"
-                        }, {
-                          "name": "Green",
-                          "value": "green-haze"
-                        }, {
-                          "name": "Purple",
-                          "value": "purple-plum"
-                        }, {
-                          "name": "Orange",
-                          "value": "yellow-casablanca"
-                        }, {
-                          "name": "Yellow",
-                          "value": "yellow-crusta"
-                        }],
-                        "icons": [{
-                          "name": "Talk bubbles",
-                          "value": "fa-comments"
-                        }, {
-                          "name": "Bar Chart",
-                          "value": "fa-bar-chart"
-                        }, {
-                          "name": "Shopping Cart",
-                          "value": "fa-shopping-cart"
-                        }, {
-                          "name": "Globe",
-                          "value": "fa-globe"
-                        }],
-                        "select": "SEC_TO_TIME(ROUND(AVG(duration),0))",
-                        "report": "report_call_history",
-                        "details": "Avg Duration"
-                      },
-                      "title": "CALLS",
-                      "titleTemplateUrl": "../src/templates/widget-title.html",
-                      "wid": "1457718482396-1"
-                    }],
-                    "cid": "1456841191663-23"
-                  }, {
-                    "styleClass": "col-md-3",
-                    "widgets": [],
-                    "cid": "1456841191664-24"
-                  }]
-                }],
-                "titleTemplateUrl": "../src/templates/dashboard-title.html",
-                "structure": "3-3-3-3"
-              }),
-              defaultEntry: true,
-              editable: true
-            }, {
-              name: 'Agents Status',
-              model: JSON.stringify({
-                "title": "Agents Status",
-                "rows": [{
-                  "columns": [{
-                    "styleClass": "col-md-3",
-                    "widgets": [{
-                      "type": "counter",
-                      "config": {
-                        "timeout": 5,
-                        "color": "purple-plum",
-                        "icon": "fa-globe",
-                        "link": "#",
-                        "linkText": "VIEW MORE",
-                        "reportTables": [{
-                          "name": "Agents",
-                          "value": "report_agent"
-                        }, {
-                          "name": "Calls",
-                          "value": "report_call"
-                        }, {
-                          "name": "Dials",
-                          "value": "report_dial"
-                        }, {
-                          "name": "Queues",
-                          "value": "report_queue"
-                        }, {
-                          "name": "Users",
-                          "value": "users"
-                        }, {
-                          "name": "Chat Sessions",
-                          "value": "report_chat_session"
-                        }, {
-                          "name": "Mail Sessions",
-                          "value": "report_mail_session"
-                        }],
-                        "colors": [{
-                          "name": "Blue",
-                          "value": "blue-madison"
-                        }, {
-                          "name": "Red",
-                          "value": "red-intense"
-                        }, {
-                          "name": "Green",
-                          "value": "green-haze"
-                        }, {
-                          "name": "Purple",
-                          "value": "purple-plum"
-                        }, {
-                          "name": "Orange",
-                          "value": "yellow-casablanca"
-                        }, {
-                          "name": "Yellow",
-                          "value": "yellow-crusta"
-                        }],
-                        "icons": [{
-                          "name": "Talk bubbles",
-                          "value": "fa-comments"
-                        }, {
-                          "name": "Bar Chart",
-                          "value": "fa-bar-chart"
-                        }, {
-                          "name": "Shopping Cart",
-                          "value": "fa-shopping-cart"
-                        }, {
-                          "name": "Globe",
-                          "value": "fa-globe"
-                        }],
-                        "select": "COUNT(*)",
-                        "report": "users",
-                        "condition": "online=1 AND role=\"agent\"",
-                        "details": "Logged"
-                      },
-                      "title": "AGENTS",
-                      "titleTemplateUrl": "../src/templates/widget-title.html",
-                      "wid": "1457275248521-9"
-                    }],
-                    "cid": "1456841191661-21"
-                  }, {
-                    "styleClass": "col-md-3",
-                    "widgets": [{
-                      "type": "counter",
-                      "config": {
-                        "timeout": 5,
-                        "color": "yellow-crusta",
-                        "icon": "fa-globe",
-                        "link": "#",
-                        "linkText": "VIEW MORE",
-                        "reportTables": [{
-                          "name": "Agents",
-                          "value": "report_agent"
-                        }, {
-                          "name": "Calls",
-                          "value": "report_call"
-                        }, {
-                          "name": "Dials",
-                          "value": "report_dial"
-                        }, {
-                          "name": "Queues",
-                          "value": "report_queue"
-                        }, {
-                          "name": "Users",
-                          "value": "users"
-                        }, {
-                          "name": "Chat Sessions",
-                          "value": "report_chat_session"
-                        }, {
-                          "name": "Mail Sessions",
-                          "value": "report_mail_session"
-                        }],
-                        "colors": [{
-                          "name": "Blue",
-                          "value": "blue-madison"
-                        }, {
-                          "name": "Red",
-                          "value": "red-intense"
-                        }, {
-                          "name": "Green",
-                          "value": "green-haze"
-                        }, {
-                          "name": "Purple",
-                          "value": "purple-plum"
-                        }, {
-                          "name": "Orange",
-                          "value": "yellow-casablanca"
-                        }, {
-                          "name": "Yellow",
-                          "value": "yellow-crusta"
-                        }],
-                        "icons": [{
-                          "name": "Talk bubbles",
-                          "value": "fa-comments"
-                        }, {
-                          "name": "Bar Chart",
-                          "value": "fa-bar-chart"
-                        }, {
-                          "name": "Shopping Cart",
-                          "value": "fa-shopping-cart"
-                        }, {
-                          "name": "Globe",
-                          "value": "fa-globe"
-                        }],
-                        "select": "COUNT(*)",
-                        "report": "users",
-                        "condition": "online=1 AND role=\"agent\" AND (voicePause=1 OR chatPause=1 OR mailPause=1 OR faxPAuse=1) and pauseType !=\"ACW\"",
-                        "details": "Paused"
-                      },
-                      "title": "AGENTS",
-                      "titleTemplateUrl": "../src/templates/widget-title.html",
-                      "wid": "1457276462846-15"
-                    }],
-                    "cid": "1456841191662-22"
-                  }, {
-                    "styleClass": "col-md-3",
-                    "widgets": [{
-                      "type": "counter",
-                      "config": {
-                        "timeout": 5,
-                        "color": "yellow-casablanca",
-                        "icon": "fa-comments",
-                        "link": "#",
-                        "linkText": "VIEW MORE",
-                        "reportTables": [{
-                          "name": "Agents",
-                          "value": "report_agent"
-                        }, {
-                          "name": "Calls",
-                          "value": "report_call"
-                        }, {
-                          "name": "Dials",
-                          "value": "report_dial"
-                        }, {
-                          "name": "Queues",
-                          "value": "report_queue"
-                        }, {
-                          "name": "Users",
-                          "value": "users"
-                        }, {
-                          "name": "Chat Sessions",
-                          "value": "report_chat_session"
-                        }, {
-                          "name": "Mail Sessions",
-                          "value": "report_mail_session"
-                        }],
-                        "colors": [{
-                          "name": "Blue",
-                          "value": "blue-madison"
-                        }, {
-                          "name": "Red",
-                          "value": "red-intense"
-                        }, {
-                          "name": "Green",
-                          "value": "green-haze"
-                        }, {
-                          "name": "Purple",
-                          "value": "purple-plum"
-                        }, {
-                          "name": "Orange",
-                          "value": "yellow-casablanca"
-                        }, {
-                          "name": "Yellow",
-                          "value": "yellow-crusta"
-                        }],
-                        "icons": [{
-                          "name": "Talk bubbles",
-                          "value": "fa-comments"
-                        }, {
-                          "name": "Bar Chart",
-                          "value": "fa-bar-chart"
-                        }, {
-                          "name": "Shopping Cart",
-                          "value": "fa-shopping-cart"
-                        }, {
-                          "name": "Globe",
-                          "value": "fa-globe"
-                        }],
-                        "select": "COUNT(*)",
-                        "report": "users",
-                        "condition": "voicePause=1 and pauseType=\"ACW\"",
-                        "details": "ACW"
-                      },
-                      "title": "AGENTS",
-                      "titleTemplateUrl": "../src/templates/widget-title.html",
-                      "wid": "1457360464208-1"
-                    }],
-                    "cid": "1456841191663-23"
-                  }, {
-                    "styleClass": "col-md-3",
-                    "widgets": [],
-                    "cid": "1456841191664-24"
-                  }]
-                }],
-                "titleTemplateUrl": "../src/templates/dashboard-title.html",
-                "structure": "3-3-3-3"
-              }),
-              defaultEntry: true,
-              editable: true
-            }], {
-              ignoreDuplicates: true,
-              individualHooks: true
-            });
-        })
-        .then(function(dashboards) {
-          console.log(util.format('Populating Dashboards: %s - DONE ', _.map(dashboards, 'name').join()));
-        });
-
-      models.Setting
-        .bulkCreate([{
-          id: 1,
-          min_internal: 1000,
-          min_mailbox: 1000,
-          agi_port: 4573,
-          automation_timeout: 3600,
-          soundPath: '/var/opt/motion/server/files/sounds/converted'
-        }], {
-          ignoreDuplicates: true,
-          individualHooks: true
-        }).then(function() {
-          console.log(util.format('Populating Setting - DONE '));
-        });
-
-      // Init modules table
-
-      var newModules = [{
-        id: 1,
-        name: "dashboard",
-        title: "APPLICATION_DASHBOARD",
-        ModuleId: null,
-        path: '/dashboard/voice'
-      }, {
-        id: 2,
-        name: "yourdashboards",
-        title: "APPLICATION_YOUR_DASHBOARDS",
-        ModuleId: null,
-        path: '/tools/yourdashboards/show/1'
-      }, {
-        id: 3,
-        name: "staff",
-        title: "APPLICATION_STAFF",
-        ModuleId: null,
-        path: '/staff/agents/list'
-      }, {
-        id: 4,
-        name: "agents",
-        title: "APPLICATION_AGENTS",
-        ModuleId: 3,
-        path: '/staff/agents/list'
-      }, {
-        id: 5,
-        name: "contactmanager",
-        title: "APPLICATION_CONTACT_MANAGER",
-        ModuleId: null,
-        path: '/contactmanager/contacts/list'
-      }, {
-        id: 6,
-        name: "channels",
-        title: "APPLICATION_CHANNELS",
-        ModuleId: null,
-        path: null
-      }, {
-        id: 7,
-        name: "voice",
-        title: "APPLICATION_VOICE",
-        ModuleId: 6,
-        path: '/channels/voice/queues/list'
-      }, {
-        id: 8,
-        name: "chat",
-        title: "APPLICATION_CHAT",
-        ModuleId: 6,
-        path: '/channels/chat/websites/list'
-      }, {
-        id: 9,
-        name: "mail",
-        title: "APPLICATION_MAIL",
-        ModuleId: 6,
-        path: '/channels/mail/accounts/list'
-      }, {
-        id: 10,
-        name: "fax",
-        title: "APPLICATION_FAX",
-        ModuleId: 6,
-        path: '/channels/fax/accounts/list'
-      }, {
-        id: 11,
-        name: "sms",
-        title: "APPLICATION_SMS",
-        ModuleId: 6,
-        path: '/channels/sms/accounts/list'
-      }, {
-        id: 12,
-        name: "realtime",
-        title: "APPLICATION_REALTIME",
-        ModuleId: 6,
-        path: '/channels/realtime/view/agents'
-      }, {
-        id: 13,
-        name: "tools",
-        title: "APPLICATION_TOOLS",
-        ModuleId: null,
-        path: '/tools/triggers/list'
-      }, {
-        id: 14,
-        name: "square",
-        title: "APPLICATION_CALLYSQUARE",
-        ModuleId: null,
-        path: '/square/projects/list'
-      }, {
-        id: 15,
-        name: "jscripty",
-        title: "APPLICATION_JSCRIPTY",
-        ModuleId: null,
-        path: '/jscripty/projects/list'
-      }, {
-        id: 16,
-        name: "motiondialer",
-        title: "APPLICATION_MOTION_DIALER",
-        ModuleId: null,
-        path: '/motiondialer/lists/list'
-      }, {
-        id: 17,
-        name: "analytics",
-        title: "APPLICATION_ANALYTICS",
-        ModuleId: null,
-        path: '/analytics/reports/list'
-      }, {
-        id: 18,
-        name: "setting",
-        title: "APPLICATION_SETTINGS",
-        ModuleId: null,
-        path: '/setting/updates/list'
-      }, {
-        id: 19,
-        name: "integration",
-        title: "APPLICATION_INTEGRATION",
-        ModuleId: null,
-        path: '/integrations/list'
-      }, {
-        id: 20,
-        name: "openchannel",
-        title: "APPLICATION_OPEN_CHANNEL",
-        ModuleId: 6,
-        path: '/channels/openchannel/accounts/list'
-      }];
-
-      models.Module
-        .findAll()
-        .then(function(oldModules) {
-          var bulkModules = [];
-          oldModules = _.map(oldModules, 'id');
-          newModules.forEach(function(module) {
-            if (_.includes(oldModules, module.id)) {
-              bulkModules.push(models.Module.update(module, {
-                where: {
-                  id: module.id
-                }
-              }));
-            } else {
-              bulkModules.push(models.Module.create(module));
-            }
-          });
-          return bulkModules;
-        })
-        .all()
-        .then(function() {
-          console.log('Finished populating modules');
-        })
-        .catch(function(err) {
-          console.log('Error populating modules:', err);
-        });
-
-      var newDefaulReports = [{
-        "id": 1,
-        "name": "Queue - Details",
-        "description": null,
-        "parent": "j4_3",
-        "table": "report_queue_history",
-        "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
-      }, {
-        "id": 2,
-        "name": "Details",
-        "description": "Calls details (cdr)",
-        "parent": "j20_1",
-        "table": "report_call_history",
-        "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
-      }, {
-        "id": 3,
-        "name": "Outbound",
-        "description": "Manual outbound calls detail",
-        "parent": "j20_1",
-        "table": "report_call_history",
-        "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"type\",\"value\":\"'outbound'\"}]}}"
-      }, {
-        "id": 4,
-        "name": "Calls by Queue",
-        "description": null,
-        "parent": "j4_7",
-        "table": "report_queue_history",
-        "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
-      }, {
-        "id": 5,
-        "name": "Details",
-        "description": null,
-        "parent": "j4_5",
-        "table": "report_agent_history",
-        "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"agentcomplete\",\"value\":\"1\"}]}}"
-      }, {
-        "id": 6,
-        "name": "Calls by Agent",
-        "description": null,
-        "parent": "j4_5",
-        "table": "report_agent_history",
-        "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
-      }, {
-        "id": 7,
-        "name": "Calls by Queue",
-        "description": null,
-        "parent": "j4_5",
-        "table": "report_agent_history",
-        "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"agentcomplete\",\"value\":\"1\"}]}}"
-      }, {
-        "id": 8,
-        "name": "Answer Time by Queue",
-        "description": null,
-        "parent": "j4_5",
-        "table": "report_agent_history",
-        "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"agentcomplete\",\"value\":\"1\"}]}}"
-      }, {
-        "id": 9,
-        "name": "Disconnection Cause",
-        "description": null,
-        "parent": "j4_5",
-        "table": "report_agent_history",
-        "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"agentcomplete\",\"value\":\"1\"}]}}"
-      }, {
-        "id": 10,
-        "name": "Details",
-        "description": null,
-        "parent": "j4_6",
-        "table": "report_queue_history",
-        "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"queuecallercomplete\",\"value\":\"0\"}]}}"
-      }, {
-        "id": 11,
-        "name": "Unanswered by Queue",
-        "description": null,
-        "parent": "j4_6",
-        "table": "report_queue_history",
-        "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"queuecallercomplete\",\"value\":\"0\"}]}}"
-      }, {
-        "id": 12,
-        "name": "Exit Cause",
-        "description": null,
-        "parent": "j4_6",
-        "table": "report_queue_history",
-        "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"queuecallerexit\",\"value\":\"1\"}]}}"
-      }, {
-        "id": 13,
-        "name": "Abandon Time by Queue",
-        "description": null,
-        "parent": "j4_6",
-        "table": "report_queue_history",
-        "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"queuecallerabandon\",\"value\":\"1\"}]}}"
-      }, {
-        "id": 14,
-        "name": "Calls by Date",
-        "description": null,
-        "parent": "j4_7",
-        "table": "report_queue_history",
-        "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
-      }, {
-        "id": 15,
-        "name": "Calls by Hour",
-        "description": null,
-        "parent": "j4_7",
-        "table": "report_queue_history",
-        "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
-      }, {
-        "id": 16,
-        "name": "Calls by Day",
-        "description": null,
-        "parent": "j4_7",
-        "table": "report_queue_history",
-        "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
-      }, {
-        "id": 17,
-        "name": "Calls by Type",
-        "description": null,
-        "parent": "j20_1",
-        "table": "report_call_history",
-        "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
-      }, {
-        "id": 18,
-        "name": "Outbound Calls Disposition",
-        "description": "Outbound calls grouped by disposition",
-        "parent": "j20_1",
-        "table": "report_call_history",
-        "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"type\",\"value\":\"'outbound'\"}]}}"
-      }, {
-        "id": 19,
-        "name": "Pause Time",
-        "description": null,
-        "parent": "j4_4",
-        "table": "report_member_history",
-        "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"type\",\"value\":\"'PAUSE'\"},{\"condition\":\"=\",\"field\":\"channel\",\"value\":\"'voice'\"}]}}"
-      }, {
-        "id": 20,
-        "name": "Login Time",
-        "description": null,
-        "parent": "j4_4",
-        "table": "report_member_history",
-        "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"type\",\"value\":\"'LOGIN'\"},{\"condition\":\"=\",\"field\":\"channel\",\"value\":\"'voice'\"}]}}"
-      }, {
-        "id": 21,
-        "name": "Website Summary",
-        "description": null,
-        "parent": "j4_1",
-        "table": "report_chat_session_history",
-        "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
-      }, {
-        "id": 22,
-        "name": "Session Detail",
-        "description": null,
-        "parent": "j4_1",
-        "table": "report_chat_session_history",
-        "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}",
-      }, {
-        "id": 23,
-        "name": "Chat by Agent",
-        "description": null,
-        "parent": "j4_1",
-        "table": "report_chat_session_history",
-        "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"complete\",\"value\":\"1\"}]}}"
-      }, {
-        "id": 24,
-        "name": "Chat by Queue",
-        "description": null,
-        "parent": "j4_1",
-        "table": "report_chat_session_history",
-        "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"application\",\"value\":\"'queue'\"}]}}"
-      }, {
-        "id": 25,
-        "name": "Details",
-        "description": "Agents status details",
-        "parent": "j4_4",
-        "table": "report_member_history",
-        "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"channel\",\"value\":\"'voice'\"}]}}"
-      }, {
-        "id": 26,
-        "name": "Summary",
-        "description": "CallySquare Summary",
-        "parent": "j112_1",
-        "table": "report_square_history",
-        "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
-      }, {
-        "id": 27,
-        "name": "Blocks",
-        "description": "CallySquare Blocks",
-        "parent": "j112_1",
-        "table": "report_square_details_history",
-        "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
-      }, {
-        "id": 28,
-        "name": "Login Details",
-        "description": "Agents status details",
-        "parent": "j24_1",
-        "table": "report_member_history",
-        "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"channel\",\"value\":\"'voice'\"},{\"condition\":\"=\",\"field\":\"type\",\"value\":\"'LOGIN'\"}]}}"
-      }, {
-        "id": 29,
-        "name": "Pause Time by Channel",
-        "description": "",
-        "parent": "j24_1",
-        "table": "report_member_history",
-        "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"type\",\"value\":\"'PAUSE'\"}]}}"
-      }, {
-        "id": 30,
-        "name": "Pause Details",
-        "description": "Agents status details",
-        "parent": "j4_4",
-        "table": "report_member_history",
-        "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"channel\",\"value\":\"'voice'\"},{\"condition\":\"=\",\"field\":\"type\",\"value\":\"'PAUSE'\"}]}}"
-      }, {
-        "id": 31,
-        "name": "Rating by Agent",
-        "description": null,
-        "parent": "j20_3",
-        "table": "voice_recordings",
-        "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
-      }, {
-        "id": 32,
-        "name": "Rating by Queue",
-        "description": null,
-        "parent": "j20_3",
-        "table": "voice_recordings",
-        "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"IS NOT EMPTY\",\"field\":\"queue\",\"value\":\"\",\"required\":false}]}}"
-      }, {
-        "id": 33,
-        "name": "Queue - Calls",
-        "description": null,
-        "parent": "j4_3",
-        "table": "report_queue_history",
-        "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
-      }, {
-        "id": 34,
-        "name": "Answer Time by Hour",
-        "description": null,
-        "parent": "j4_5",
-        "table": "report_agent_history",
-        "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"agentcomplete\",\"value\":\"1\"}]}}"
-      }, {
-        "id": 35,
-        "name": "Received emails by account",
-        "description": "Summary of the emails accepted by application for each account",
-        "parent": "j4_2",
-        "table": "report_mail_session_history",
-        "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
-      }, {
-        "id": 36,
-        "name": "Received emails by queue",
-        "description": "Summary of received email by queue",
-        "parent": "j4_2",
-        "table": "report_mail_session_history",
-        "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"application\",\"value\":\"'queue'\",\"required\":true}]}}"
-      }, {
-        "id": 37,
-        "name": "Accepted emails by agent",
-        "description": "Summary of accepted email by agent",
-        "parent": "j4_2",
-        "table": "report_mail_session_history",
-        "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"timeout\",\"value\":\"0\",\"required\":true}]}}"
-      }, {
-        "id": 38,
-        "name": "Messages Summary by Date",
-        "description": "Global messages summary by date",
-        "parent": "j4_2",
-        "table": "mail_messages",
-        "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"=\",\"field\":\"auto\",\"value\":false}]}}"
-      }, {
-        "id": 39,
-        "name": "Interactions detail",
-        "description": "Detailed report about the interactions",
-        "parent": "j4_2",
-        "table": "mail_rooms",
-        "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[]}}"
-      }, {
-        "id": 40,
-        "name": "Disposition Summary",
-        "description": "Closed interactions by disposition (filtered by disposition not null)",
-        "parent": "j4_2",
-        "table": "mail_rooms",
-        "conditions": "{\"group\":{\"operator\":\"AND\",\"rules\":[{\"condition\":\"IS NOT NULL\",\"field\":\"disposition\",\"value\":\"\",\"required\":false}]}}"
-      }, {
-        "id": 41,
-        "name": "Closed interactions by date",
-        "description": "Summary of closed interactions grouped by date + average handle time (from when the first email arrived to when the interaction has been closed)",
-        "parent": "j4_2",
-        "table": "mail_rooms",
-        "conditions": "{\"group\":{\"operator\":\"OR\",\"rules\":[{\"condition\":\"=\",\"field\":\"status\",\"value\":\"'CLOSED'\",\"required\":true}]}}"
-      }];
-
-      var newDefaultMetrics = [{
-        "id": 1,
-        "name": "Queue - TalkTime",
-        "table": "report_queue_history",
-        "metric": "UNIX_TIMESTAMP(queuecallercompleteAt)-UNIX_TIMESTAMP(queuecallerleaveAt)"
-      }, {
-        "id": 2,
-        "name": "Queue - Abandon Time",
-        "table": "report_queue_history",
-        "metric": "UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt)"
-      }, {
-        "id": 3,
-        "name": "Abandoned <10s",
-        "table": "report_queue_history",
-        "metric": "COUNT(IF(UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) <10,1,NULL))",
-        "description": "Count of abandoned calls within 10 seconds (Short Calls)"
-      }, {
-        "id": 4,
-        "name": "Queue - AnswerTime",
-        "table": "report_queue_history",
-        "metric": "IF(queuecallercomplete=1,holdtime,null)"
-      }, {
-        "id": 5,
-        "name": "Answered < 10s",
-        "table": "report_agent_history",
-        "metric": "COUNT(IF(holdtime<10,1,NULL))",
-        "description": "Count of answered calls within 10 seconds"
-      }, {
-        "id": 6,
-        "name": "Answered 10-20s",
-        "table": "report_agent_history",
-        "metric": "COUNT(IF(holdtime >=10 AND holdtime <20,1,NULL))",
-        "description": "Count of answered calls between 10 and 20 seconds"
-      }, {
-        "id": 7,
-        "name": "Answered 20-30s",
-        "table": "report_agent_history",
-        "metric": "COUNT(IF(holdtime >=20 AND holdtime <30,1,NULL))",
-        "description": "Count of answered calls between 20 and 30 seconds"
-      }, {
-        "id": 8,
-        "name": "Answered >30s",
-        "table": "report_agent_history",
-        "metric": "COUNT(IF(holdtime >=30,1,NULL))",
-        "description": "Count of answered calls over 30 seconds"
-      }, {
-        "id": 9,
-        "name": "Queue - Exit Time",
-        "table": "report_queue_history",
-        "metric": "UNIX_TIMESTAMP(queuecallerExitAt)-UNIX_TIMESTAMP(queuecallerjoinAt)"
-      }, {
-        "id": 10,
-        "name": "Abandoned 10-60s",
-        "table": "report_queue_history",
-        "metric": "COUNT(IF(UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) >=10 AND UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) <60,1,NULL))",
-        "description": "Count of abandoned calls between 10 and 60 seconds"
-      }, {
-        "id": 11,
-        "name": "Abandoned 60-120s",
-        "table": "report_queue_history",
-        "metric": "COUNT(IF(UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) >=60 AND UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) <120,1,NULL))",
-        "description": "Count of abandoned calls between 60 and 120 seconds"
-      }, {
-        "id": 12,
-        "name": "Queue - Abandoned >120s",
-        "table": "report_queue_history",
-        "metric": "COUNT(IF(UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) >=120,1,NULL))",
-        "description": "Count of abandoned calls over 120 seconds"
-      }, {
-        "id": 13,
-        "name": "Queue - JoinDate",
-        "table": "report_queue_history",
-        "metric": "DATE(queuecallerjoinat)",
-        "description": "Extract the date of the join queue"
-      }, {
-        "id": 14,
-        "name": "Queue - JoinHour",
-        "table": "report_queue_history",
-        "metric": "HOUR(queuecallerjoinat)",
-        "description": "Extract the hour of the join queue"
-      }, {
-        "id": 15,
-        "name": "Queue - JoinDay",
-        "table": "report_queue_history",
-        "metric": "DAY(queuecallerjoinat)",
-        "description": "Extract the day of the join queue"
-      }, {
-        "id": 16,
-        "name": "Member - Event Duration",
-        "table": "report_member_history",
-        "metric": "UNIX_TIMESTAMP(exitAt)-UNIX_TIMESTAMP(enterAt)",
-        "description": "Member event duration in seconds"
-      }, {
-        "id": 17,
-        "name": "Member - Total Event Duration",
-        "table": "report_member_history",
-        "metric": "SEC_TO_TIME(SUM(UNIX_TIMESTAMP(exitAt)-UNIX_TIMESTAMP(enterAt)))",
-        "description": "Total event duration"
-      }, {
-        "id": 18,
-        "name": "Chat - Session Time",
-        "table": "report_chat_session_history",
-        "metric": "UNIX_TIMESTAMP(completeAt)-UNIX_TIMESTAMP(leaveAt)",
-        "description": "Session Time",
-      }, {
-        "id": 19,
-        "name": "Chat - Queue",
-        "table": "report_chat_session_history",
-        "metric": "COUNT(IF(application=\"queue\",1,NULL))",
-        "description": "Chat queue application count",
-      }, {
-        "id": 20,
-        "name": "Chat - Agent",
-        "table": "report_chat_session_history",
-        "metric": "COUNT(IF(application=\"agent\",1,NULL))",
-        "description": "Chat agent application count",
-      }, {
-        "id": 21,
-        "name": "Chat - Avg Session Time",
-        "table": "report_chat_session_history",
-        "metric": "ROUND(AVG(UNIX_TIMESTAMP(completeAt)-UNIX_TIMESTAMP(leaveAt)))",
-        "description": "Average session time"
-      }, {
-        "id": 22,
-        "name": "Member - Event Duration (HH:mm:ss)",
-        "table": "report_member_history",
-        "metric": "SEC_TO_TIME(UNIX_TIMESTAMP(exitAt)-UNIX_TIMESTAMP(enterAt))",
-        "description": "Member events duration in time format"
-      }, {
-        "id": 23,
-        "name": "Square - Duration",
-        "table": "report_square_history",
-        "metric": "UNIX_TIMESTAMP(leaveAt)-UNIX_TIMESTAMP(joinAt)",
-        "description": "IVR Duration"
-      }, {
-        "id": 24,
-        "name": "Queue - EndTime Call",
-        "table": "report_queue_history",
-        "metric": "CASE WHEN queuecallercomplete=1 THEN queuecallercompleteAt ELSE queuecallerLeaveAt END",
-        "description": null
-      }, {
-        "id": 25,
-        "name": "Queue - Calls Result",
-        "table": "report_queue_history",
-        "metric": "CASE WHEN queuecallercomplete=1 THEN \"YES\" ELSE \"NO\" END",
-        "description": "Show if a call is answered or not"
-      }];
-
-      models.ReportTree.destroy({
-          where: {
-            id: 1
-          }
-        })
-        .then(function() {
-          return models.ReportTree.create({
-            id: 1,
-          })
-        })
-        .then(function() {
-          return models.ReportTree.findOrCreate({
-            where: {
-              id: 2
-            },
-            defaults: {
-              id: 2,
-              tree: '[{"id":"1","text":"Custom Reports","icon":"icon-book-open","li_attr":{"id":"1"},"a_attr":{"href":"#","id":"1_anchor"},"state":{"loaded":true,"opened":true,"selected":false,"disabled":false},"data":{},"parent":"#"},{"id":"2","text":"Basic Node","icon":true,"li_attr":{"id":"2"},"a_attr":{"href":"#","id":"2_anchor"},"state":{"loaded":true,"opened":true,"selected":false,"disabled":false},"data":{},"parent":"1"}]'
-            }
-          })
-        })
-        .then(function() {
-          return models.DefaultMetric.findAll();
-        })
-        .then(function(oldDefaultMetrics) {
-          var bulkDefaultMetrics = [];
-          oldDefaultMetrics = _.map(oldDefaultMetrics, 'id');
-          newDefaultMetrics.forEach(function(defaultMet) {
-            if (_.includes(oldDefaultMetrics, defaultMet.id)) {
-              bulkDefaultMetrics.push(models.DefaultMetric.update(defaultMet, {
-                where: {
-                  id: defaultMet.id
-                }
-              }));
-            } else {
-              bulkDefaultMetrics.push(models.DefaultMetric.create(defaultMet));
-            }
-          });
-          return bulkDefaultMetrics;
-        })
-        .all()
-        .then(function() {
-          return models.DefaultReport.findAll()
-        })
-        .then(function(oldDefaultReports) {
-          var bulkDefaultReports = [];
-          oldDefaultReports = _.map(oldDefaultReports, 'id');
-          newDefaulReports.forEach(function(defaultRep) {
-            if (_.includes(oldDefaultReports, defaultRep.id)) {
-              bulkDefaultReports.push(models.DefaultReport.update(defaultRep, {
-                where: {
-                  id: defaultRep.id
-                }
-              }));
-            } else {
-              bulkDefaultReports.push(models.DefaultReport.create(defaultRep));
-            }
-          });
-          return bulkDefaultReports;
-        })
-        .all()
-        .then(function() {
-          return models.ReportField.destroy({
-            where: {
-              DefaultReportId: {
-                $gt: 0
-              }
-            }
-          })
-        })
-        .then(function() {
-          return models.ReportField.bulkCreate([{
-            "field": "uniqueid",
-            "alias": "UniqueId",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 1
-          }, {
-            "field": "calleridnum",
-            "alias": "CallerIdNum",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 1
-          }, {
-            "field": "calleridname",
-            "alias": "CallerIdName",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 1
-          }, {
-            "field": "queue",
-            "alias": "Queue",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 1
-          }, {
-            "field": "queuecallerjoinAt",
-            "alias": "QueueJoinAt",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 1
-          }, {
-            "field": "queuecallerleaveAt",
-            "alias": "QueueLeaveAt",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 1
-          }, {
-            "field": "queuecallerabandon",
-            "alias": "QueueAbandon",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 1
-          }, {
-            "field": "queuecallerabandonAt",
-            "alias": "QueueAbandonAt",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 1
-          }, {
-            "field": "queuecallercomplete",
-            "alias": "Complete",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 1
-          }, {
-            "field": "queuecallercompleteAt",
-            "alias": "CompleteAt",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 1
-          }, {
-            "field": "queuecallerexit",
-            "alias": "QueueExit",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 1
-          }, {
-            "field": "queuecallerexitAt",
-            "alias": "QueueExitAt",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 1
-          }, {
-            "field": "queuecallerexitreason",
-            "alias": "QueueExitReason",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 1
-          }, {
-            "field": "exten",
-            "alias": "DID",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 1
-          }, {
-            "field": "UNIX_TIMESTAMP(queuecallercompleteAt)-UNIX_TIMESTAMP(queuecallerleaveAt)",
-            "alias": "TalkTime",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultMetricId": 1,
-            "DefaultReportId": 1
-          }, {
-            "field": "IF(queuecallercomplete=1,holdtime,null)",
-            "alias": "AnswerTime",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultMetricId": 4,
-            "DefaultReportId": 1
-          }, {
-            "field": "UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt)",
-            "alias": "AbandonTime",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultMetricId": 2,
-            "DefaultReportId": 1
-          }, {
-            "field": "uniqueid",
-            "alias": "UniqueID",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 2
-          }, {
-            "field": "type",
-            "alias": "Type",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 2
-          }, {
-            "field": "tag",
-            "alias": "Tag",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 2
-          }, {
-            "field": "source",
-            "alias": "Source",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 2
-          }, {
-            "field": "destination",
-            "alias": "Destination",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 2
-          }, {
-            "field": "callerid",
-            "alias": "CallerID",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 2
-          }, {
-            "field": "destinationchannel",
-            "alias": "DestChannel",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 2
-          }, {
-            "field": "lastapplication",
-            "alias": "LastApp",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 2
-          }, {
-            "field": "lastdata",
-            "alias": "LastData",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 2
-          }, {
-            "field": "starttime",
-            "alias": "StartTime",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 2
-          }, {
-            "field": "answertime",
-            "alias": "AnswerTime",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 2
-          }, {
-            "field": "endtime",
-            "alias": "EndTime",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 2
-          }, {
-            "field": "duration",
-            "alias": "Duration",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 2
-          }, {
-            "field": "disposition",
-            "alias": "Disposition",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 2
-          }, {
-            "field": "uniqueid",
-            "alias": "UniqueID",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 3
-          }, {
-            "field": "accountcode",
-            "alias": "AgentExtension",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 3
-          }, {
-            "field": "source",
-            "alias": "Source",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 3
-          }, {
-            "field": "destination",
-            "alias": "Destination",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 3
-          }, {
-            "field": "callerid",
-            "alias": "CallerId",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 3
-          }, {
-            "field": "starttime",
-            "alias": "StartTime",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 3
-          }, {
-            "field": "answertime",
-            "alias": "AnswerTime",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 3
-          }, {
-            "field": "endtime",
-            "alias": "EndTIme",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 3
-          }, {
-            "field": "duration",
-            "alias": "Duration",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 3
-          }, {
-            "field": "billableseconds",
-            "alias": "Billsec",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 3
-          }, {
-            "field": "disposition",
-            "alias": "Disposition",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 3
-          }, {
-            "field": "tag",
-            "alias": "Tag",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 3
-          }, {
-            "field": "queue",
-            "alias": "Queue",
-            "function": null,
-            "groupBy": 1,
-            "orderBy": null,
-            "DefaultReportId": 4
-          }, {
-            "field": "uniqueid",
-            "alias": "Offered",
-            "function": "COUNT",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 4
-          }, {
-            "field": "queuecallercomplete",
-            "alias": "Completed",
-            "function": "SUM",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 4
-          }, {
-            "field": "queuecallerabandon",
-            "alias": "Abandoned",
-            "function": "SUM",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 4
-          }, {
-            "field": "queuecallerexit",
-            "alias": "Unmanaged",
-            "function": "SUM",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 4
-          }, {
-            "field": "UNIX_TIMESTAMP(queuecallercompleteAt)-UNIX_TIMESTAMP(queuecallerleaveAt)",
-            "alias": "AvgTalkTime",
-            "function": "AVG",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultMetricId": 1,
-            "DefaultReportId": 4
-          }, {
-            "field": "UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt)",
-            "alias": "AvgAbandonTime",
-            "function": "AVG",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultMetricId": 1,
-            "DefaultReportId": 4
-          }, {
-            "field": "IF(queuecallercomplete=1,holdtime,null)",
-            "alias": "AvgAnswerTime",
-            "function": "AVG",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultMetricId": 4,
-            "DefaultReportId": 4
-          }, {
-            "field": "uniqueid",
-            "alias": "UniqueId",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 5
-          }, {
-            "field": "calleridnum",
-            "alias": "CallerIdNum",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 5
-          }, {
-            "field": "calleridname",
-            "alias": "CallerIdName",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 5
-          }, {
-            "field": "queue",
-            "alias": "Queue",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 5
-          }, {
-            "field": "membername",
-            "alias": "Agent",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 5
-          }, {
-            "field": "agentcalledAt",
-            "alias": "AgentCalledAt",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 5
-          }, {
-            "field": "agentconnectAt",
-            "alias": "AgentConnectAt",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 5
-          }, {
-            "field": "agentcompleteAt",
-            "alias": "AgentCompleteAt",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 5
-          }, {
-            "field": "holdtime",
-            "alias": "AnswerTime",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 5
-          }, {
-            "field": "talktime",
-            "alias": "TalkTime",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 5
-          }, {
-            "field": "agentacw",
-            "alias": "AgentACW",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 5
-          }, {
-            "field": "acwtime",
-            "alias": "AgentACWTime",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 5
-          }, {
-            "field": "agentcomplete",
-            "alias": "AgentComplete",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 5
-          }, {
-            "field": "reason",
-            "alias": "HangupReason",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 5
-          }, {
-            "field": "lastevent",
-            "alias": "LastEvent",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 5
-          }, {
-            "field": "exten",
-            "alias": "DID",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 5
-          }, {
-            "field": "membername",
-            "alias": "Agent",
-            "function": null,
-            "groupBy": 1,
-            "orderBy": null,
-            "DefaultReportId": 6
-          }, {
-            "field": "agentcomplete",
-            "alias": "Completed",
-            "function": "SUM",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 6
-          }, {
-            "field": "agentringnoanswer",
-            "alias": "RingNoAnswer",
-            "function": "SUM",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 6
-          }, {
-            "field": "talktime",
-            "alias": "TotTalkTime",
-            "function": "SUM",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 6
-          }, {
-            "field": "acwtime",
-            "alias": "TotACWTime",
-            "function": "SUM",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 6
-          }, {
-            "field": "talktime",
-            "alias": "AvgTalkTime",
-            "function": "AVG",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 6
-          }, {
-            "field": "acwtime",
-            "alias": "AvgACWTime",
-            "function": "AVG",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 6
-          }, {
-            "field": "queue",
-            "alias": "Queue",
-            "function": null,
-            "groupBy": 1,
-            "orderBy": null,
-            "DefaultReportId": 7
-          }, {
-            "field": "agentcomplete",
-            "alias": "Completed",
-            "function": "SUM",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 7
-          }, {
-            "field": "talktime",
-            "alias": "Tot TalkTime",
-            "function": "SUM",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 7
-          }, {
-            "field": "talktime",
-            "alias": "Avg TalkTime",
-            "function": "AVG",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 7
-          }, {
-            "field": "holdtime",
-            "alias": "Tot HoldTime",
-            "function": "SUM",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 7
-          }, {
-            "field": "holdtime",
-            "alias": "Avg HoldTime",
-            "function": "AVG",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 7
-          }, {
-            "field": "acwtime",
-            "alias": "Tot ACWTime",
-            "function": "SUM",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 7
-          }, {
-            "field": "acwtime",
-            "alias": "Avg ACWTime",
-            "function": "AVG",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 7
-          }, {
-            "field": "queue",
-            "alias": "Queue",
-            "function": null,
-            "groupBy": 1,
-            "orderBy": null,
-            "DefaultReportId": 8
-          }, {
-            "field": "agentcomplete",
-            "alias": "Tot Answered",
-            "function": "SUM",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 8
-          }, {
-            "field": "COUNT(IF(holdtime<10,1,NULL))",
-            "alias": "Answered <10s",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultMetricId": 5,
-            "DefaultReportId": 8
-          }, {
-            "field": "COUNT(IF(holdtime >=10 AND holdtime <20,1,NULL))",
-            "alias": "Answered 10-20s",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultMetricId": 6,
-            "DefaultReportId": 8
-          }, {
-            "field": "COUNT(IF(holdtime >=20 AND holdtime <30,1,NULL))",
-            "alias": "Answered 20-30s",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultMetricId": 7,
-            "DefaultReportId": 8
-          }, {
-            "field": "COUNT(IF(holdtime >=30,1,NULL))",
-            "alias": "Answered >30s",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultMetricId": 8,
-            "DefaultReportId": 8
-          }, {
-            "field": "reason",
-            "alias": "Reason",
-            "function": null,
-            "groupBy": 1,
-            "orderBy": null,
-            "DefaultReportId": 9
-          }, {
-            "field": "uniqueid",
-            "alias": "Calls",
-            "function": "COUNT",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 9
-          }, {
-            "field": "uniqueid",
-            "alias": "UniqueId",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 10
-          }, {
-            "field": "calleridnum",
-            "alias": "CallerIdNum",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 10
-          }, {
-            "field": "queue",
-            "alias": "Queue",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 10
-          }, {
-            "field": "queuecallerjoinAt",
-            "alias": "QueueJoinAt",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 10
-          }, {
-            "field": "queuecallerleaveAt",
-            "alias": "QueueLeaveAt",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 10
-          }, {
-            "field": "queuecallerabandon",
-            "alias": "QueueAbandon",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 10
-          }, {
-            "field": "queuecallerabandonAt",
-            "alias": "QueueAbandonAt",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 10
-          }, {
-            "field": "UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt)",
-            "alias": "Abandon Time",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultMetricId": 2,
-            "DefaultReportId": 10
-          }, {
-            "field": "queuecallerexit",
-            "alias": "QueueExit",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 10
-          }, {
-            "field": "queuecallerexitAt",
-            "alias": "QueueExitAt",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 10
-          }, {
-            "field": "queuecallerexitreason",
-            "alias": "QueueExitReason",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 10
-          }, {
-            "field": "UNIX_TIMESTAMP(queuecallerExitAt)-UNIX_TIMESTAMP(queuecallerjoinAt)",
-            "alias": "Exit Time",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultMetricId": 9,
-            "DefaultReportId": 10
-          }, {
-            "field": "position",
-            "alias": "QueuePosition",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 10
-          }, {
-            "field": "exten",
-            "alias": "DID",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 10
-          }, {
-            "field": "queue",
-            "alias": "Queue",
-            "function": null,
-            "groupBy": 1,
-            "orderBy": null,
-            "DefaultReportId": 11
-          }, {
-            "field": "queuecallerabandon",
-            "alias": "Abandoned",
-            "function": "SUM",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 11
-          }, {
-            "field": "UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt)",
-            "alias": "AvgAbandonTime",
-            "function": "AVG",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultMetricId": 2,
-            "DefaultReportId": 11
-          }, {
-            "field": "UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt)",
-            "alias": "Tot AbandonTime",
-            "function": "SUM",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultMetricId": 2,
-            "DefaultReportId": 11
-          }, {
-            "field": "queuecallerexit",
-            "alias": "Exited",
-            "function": "SUM",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 11
-          }, {
-            "field": "UNIX_TIMESTAMP(queuecallerExitAt)-UNIX_TIMESTAMP(queuecallerjoinAt)",
-            "alias": "Avg ExitedTIme",
-            "function": "AVG",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultMetricId": 9,
-            "DefaultReportId": 11
-          }, {
-            "field": "UNIX_TIMESTAMP(queuecallerExitAt)-UNIX_TIMESTAMP(queuecallerjoinAt)",
-            "alias": "Tot ExitedTime",
-            "function": "SUM",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultMetricId": 9,
-            "DefaultReportId": 11
-          }, {
-            "field": "queuecallerexitreason",
-            "alias": "Reason",
-            "function": null,
-            "groupBy": 1,
-            "orderBy": null,
-            "DefaultReportId": 12
-          }, {
-            "field": "queuecallerexit",
-            "alias": "Calls",
-            "function": "SUM",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 12
-          }, {
-            "field": "UNIX_TIMESTAMP(queuecallerExitAt)-UNIX_TIMESTAMP(queuecallerjoinAt)",
-            "alias": "Tot ExitTime",
-            "function": "SUM",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultMetricId": 9,
-            "DefaultReportId": 12
-          }, {
-            "field": "queue",
-            "alias": "Queue",
-            "function": null,
-            "groupBy": 1,
-            "orderBy": null,
-            "DefaultReportId": 13
-          }, {
-            "field": "queuecallerabandon",
-            "alias": "Tot Abandoned",
-            "function": "SUM",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 13
-          }, {
-            "field": "COUNT(IF(UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) <10,1,NULL))",
-            "alias": "Abandoned<10s",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultMetricId": 3,
-            "DefaultReportId": 13
-          }, {
-            "field": "COUNT(IF(UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) >=10 AND UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) <60,1,NULL))",
-            "alias": "Abandoned 10-60s",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultMetricId": 10,
-            "DefaultReportId": 13
-          }, {
-            "field": "COUNT(IF(UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) >=60 AND UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) <120,1,NULL))",
-            "alias": "Abandoned 60-120s",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultMetricId": 11,
-            "DefaultReportId": 13
-          }, {
-            "field": "COUNT(IF(UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt) >=120,1,NULL))",
-            "alias": "Abandoned>120s",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultMetricId": 12,
-            "DefaultReportId": 13
-          }, {
-            "field": "DATE(queuecallerjoinat)",
-            "alias": "Date",
-            "function": null,
-            "groupBy": 1,
-            "orderBy": null,
-            "DefaultMetricId": 13,
-            "DefaultReportId": 14
-          }, {
-            "field": "uniqueid",
-            "alias": "Offered",
-            "function": "COUNT",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 14
-          }, {
-            "field": "queuecallercomplete",
-            "alias": "Completed",
-            "function": "SUM",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 14
-          }, {
-            "field": "queuecallerabandon",
-            "alias": "Abandoned",
-            "function": "SUM",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 14
-          }, {
-            "field": "queuecallerexit",
-            "alias": "Unmanaged",
-            "function": "SUM",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 14
-          }, {
-            "field": "UNIX_TIMESTAMP(queuecallercompleteAt)-UNIX_TIMESTAMP(queuecallerleaveAt)",
-            "alias": "AvgTalkTime",
-            "function": "AVG",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultMetricId": 1,
-            "DefaultReportId": 14
-          }, {
-            "field": "UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt)",
-            "alias": "AvgAbandonTime",
-            "function": "AVG",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultMetricId": 2,
-            "DefaultReportId": 14
-          }, {
-            "field": "IF(queuecallercomplete=1,holdtime,null)",
-            "alias": "AvgAnswerTime",
-            "function": "AVG",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultMetricId": 4,
-            "DefaultReportId": 14
-          }, {
-            "field": "HOUR(queuecallerjoinat)",
-            "alias": "Hour",
-            "function": null,
-            "groupBy": 1,
-            "orderBy": null,
-            "DefaultMetricId": 14,
-            "DefaultReportId": 15
-          }, {
-            "field": "uniqueid",
-            "alias": "Offered",
-            "function": "COUNT",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 15
-          }, {
-            "field": "queuecallercomplete",
-            "alias": "Completed",
-            "function": "SUM",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 15
-          }, {
-            "field": "queuecallerabandon",
-            "alias": "Abandoned",
-            "function": "SUM",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 15
-          }, {
-            "field": "queuecallerexit",
-            "alias": "Unmanaged",
-            "function": "SUM",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 15
-          }, {
-            "field": "UNIX_TIMESTAMP(queuecallercompleteAt)-UNIX_TIMESTAMP(queuecallerleaveAt)",
-            "alias": "AvgTalkTime",
-            "function": "AVG",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultMetricId": 1,
-            "DefaultReportId": 15
-          }, {
-            "field": "UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt)",
-            "alias": "AvgAbandonTime",
-            "function": "AVG",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultMetricId": 2,
-            "DefaultReportId": 15
-          }, {
-            "field": "IF(queuecallercomplete=1,holdtime,null)",
-            "alias": "AvgAnswerTime",
-            "function": "AVG",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultMetricId": 4,
-            "DefaultReportId": 15
-          }, {
-            "field": "DAY(queuecallerjoinat)",
-            "alias": "Day",
-            "function": null,
-            "groupBy": 1,
-            "orderBy": null,
-            "DefaultMetricId": 15,
-            "DefaultReportId": 16
-          }, {
-            "field": "uniqueid",
-            "alias": "Offered",
-            "function": "COUNT",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 16
-          }, {
-            "field": "queuecallercomplete",
-            "alias": "Completed",
-            "function": "SUM",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 16
-          }, {
-            "field": "queuecallerabandon",
-            "alias": "Abandoned",
-            "function": "SUM",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 16
-          }, {
-            "field": "queuecallerexit",
-            "alias": "Unmanaged",
-            "function": "SUM",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 16
-          }, {
-            "field": "UNIX_TIMESTAMP(queuecallercompleteAt)-UNIX_TIMESTAMP(queuecallerleaveAt)",
-            "alias": "AvgTalkTime",
-            "function": "AVG",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultMetricId": 1,
-            "DefaultReportId": 16
-          }, {
-            "field": "UNIX_TIMESTAMP(queuecallerAbandonAt)-UNIX_TIMESTAMP(queuecallerjoinAt)",
-            "alias": "AvgAbandonTime",
-            "function": "AVG",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultMetricId": 2,
-            "DefaultReportId": 16
-          }, {
-            "field": "IF(queuecallercomplete=1,holdtime,null)",
-            "alias": "AvgAnswerTime",
-            "function": "AVG",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultMetricId": 4,
-            "DefaultReportId": 16
-          }, {
-            "field": "type",
-            "alias": "Type",
-            "function": null,
-            "groupBy": 1,
-            "orderBy": null,
-            "DefaultReportId": 17
-          }, {
-            "field": "uniqueid",
-            "alias": "Calls",
-            "function": "COUNT",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 17
-          }, {
-            "field": "duration",
-            "alias": "Tot Duration",
-            "function": "SUM",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 17
-          }, {
-            "field": "duration",
-            "alias": "Avg Duration",
-            "function": "AVG",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 17
-          }, {
-            "field": "disposition",
-            "alias": "Disposition",
-            "function": null,
-            "groupBy": 1,
-            "orderBy": null,
-            "DefaultReportId": 18
-          }, {
-            "field": "uniqueid",
-            "alias": "Calls",
-            "function": "COUNT",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 18
-          }, {
-            "field": "duration",
-            "alias": "Tot Duration",
-            "function": "SUM",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 18
-          }, {
-            "field": "duration",
-            "alias": "Avg Duration",
-            "function": "AVG",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 18
-          }, {
-            "field": "membername",
-            "alias": "Agent",
-            "function": null,
-            "groupBy": 1,
-            "orderBy": "ASC",
-            "DefaultReportId": 19
-          }, {
-            "field": "data1",
-            "alias": "PauseType",
-            "function": null,
-            "groupBy": 1,
-            "orderBy": "ASC",
-            "DefaultReportId": 19
-          }, {
-            "field": "SEC_TO_TIME(SUM(UNIX_TIMESTAMP(exitAt)-UNIX_TIMESTAMP(enterAt)))",
-            "alias": "Duration",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultMetricId": 17,
-            "DefaultReportId": 19
-          }, {
-            "field": "membername",
-            "alias": "Agent",
-            "function": null,
-            "groupBy": 1,
-            "orderBy": "ASC",
-            "DefaultReportId": 20,
-          }, {
-            "field": "SEC_TO_TIME(SUM(UNIX_TIMESTAMP(exitAt)-UNIX_TIMESTAMP(enterAt)))",
-            "alias": "Duration",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultMetricId": 17,
-            "DefaultReportId": 20,
-          }, {
-            "field": "uniqueid",
-            "alias": "UniqueId",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 22,
-            "format": null
-          }, {
-            "field": "websitename",
-            "alias": "Website",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 22,
-            "format": null
-          }, {
-            "field": "visitorname",
-            "alias": "VisitorName",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 22,
-          }, {
-            "field": "visitoremail",
-            "alias": "VisitorEmail",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 22,
-            "format": null
-          }, {
-            "field": "membername",
-            "alias": "MemeberName",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 22,
-            "format": null
-          }, {
-            "field": "queuename",
-            "alias": "QueueName",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 22,
-            "format": null
-          }, {
-            "field": "joinAt",
-            "alias": "JoinAt",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 22,
-            "format": null
-          }, {
-            "field": "leaveAt",
-            "alias": "LeaveAt",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 22,
-            "format": null
-          }, {
-            "field": "completeAt",
-            "alias": "CompleteAt",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 22,
-            "format": null
-          }, {
-            "field": "complete",
-            "alias": "Complete",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 22,
-            "format": null
-          }, {
-            "field": "completeReason",
-            "alias": "CompleteReason",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 22,
-            "format": null
-          }, {
-            "field": "abandon",
-            "alias": "Abandon",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 22,
-            "format": null
-          }, {
-            "field": "unmanaged",
-            "alias": "Unmanage",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 22,
-            "format": null
-          }, {
-            "field": "membername",
-            "alias": "Agent",
-            "function": null,
-            "groupBy": 1,
-            "orderBy": null,
-            "DefaultReportId": 23,
-            "format": null
-          }, {
-            "field": "complete",
-            "alias": "Session",
-            "function": "SUM",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 23,
-            "format": null
-          }, {
-            "field": "COUNT(IF(application=\"queue\",1,NULL))",
-            "alias": "FromQueue",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "createdAt": "2016-05-14 18:13:01",
-            "updatedAt": "2016-05-14 18:13:01",
-            "DefaultMetricId": 19,
-            "DefaultReportId": 23,
-            "format": null
-          }, {
-            "field": "COUNT(IF(application=\"agent\",1,NULL))",
-            "alias": "DirectToAgent",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultMetricId": 20,
-            "DefaultReportId": 23,
-            "format": null
-          }, {
-            "field": "UNIX_TIMESTAMP(completeAt)-UNIX_TIMESTAMP(leaveAt)",
-            "alias": "Tot Session Time",
-            "function": "SUM",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultMetricId": 18,
-            "DefaultReportId": 23,
-            "format": "SEC_TO_TIME"
-          }, {
-            "field": "UNIX_TIMESTAMP(completeAt)-UNIX_TIMESTAMP(leaveAt)",
-            "alias": "Avg Session Time",
-            "function": "AVG",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultMetricId": 18,
-            "DefaultReportId": 23,
-            "format": "SEC_TO_TIME"
-          }, {
-            "field": "websitename",
-            "alias": "WebSite",
-            "function": null,
-            "groupBy": 1,
-            "orderBy": null,
-            "DefaultReportId": 21,
-            "format": null
-          }, {
-            "field": "uniqueid",
-            "alias": "Sessions",
-            "function": "COUNT DISTINCT",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 21,
-            "format": null
-          }, {
-            "field": "complete",
-            "alias": "Completed",
-            "function": "SUM",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 21,
-            "format": null
-          }, {
-            "field": "abandon",
-            "alias": "Abandoned",
-            "function": "SUM",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 21,
-            "format": null
-          }, {
-            "field": "UNIX_TIMESTAMP(completeAt)-UNIX_TIMESTAMP(leaveAt)",
-            "alias": "Session Time",
-            "function": "SUM",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultMetricId": 18,
-            "DefaultReportId": 21,
-            "format": "SEC_TO_TIME"
-          }, {
-            "field": "ROUND(AVG(UNIX_TIMESTAMP(completeAt)-UNIX_TIMESTAMP(leaveAt)))",
-            "alias": "Avg Session Time",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultMetricId": 21,
-            "DefaultReportId": 21,
-            "format": "SEC_TO_TIME"
-          }, {
-            "field": "queuename",
-            "alias": "Queue",
-            "function": null,
-            "groupBy": 1,
-            "orderBy": null,
-            "DefaultReportId": 24,
-            "format": null
-          }, {
-            "field": "uniqueid",
-            "alias": "Sessions",
-            "function": "COUNT",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 24,
-            "format": null
-          }, {
-            "field": "complete",
-            "alias": "Completed",
-            "function": "SUM",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 24,
-            "format": null
-          }, {
-            "field": "abandon",
-            "alias": "Abandoned",
-            "function": "SUM",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 24,
-            "format": null
-          }, {
-            "field": "unmanaged",
-            "alias": "Unmanaged",
-            "function": "SUM",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 24,
-            "format": null
-          }, {
-            "field": "UNIX_TIMESTAMP(completeAt)-UNIX_TIMESTAMP(leaveAt)",
-            "alias": "Session Time",
-            "function": "SUM",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultMetricId": 18,
-            "DefaultReportId": 24,
-            "format": "SEC_TO_TIME"
-          }, {
-            "field": "ROUND(AVG(UNIX_TIMESTAMP(completeAt)-UNIX_TIMESTAMP(leaveAt)))",
-            "alias": "Avg Session Time",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultMetricId": 21,
-            "DefaultReportId": 24,
-            "format": "SEC_TO_TIME"
-          }, {
-            "field": "membername",
-            "alias": "Agent",
-            "function": null,
-            "format": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 25,
-          }, {
-            "field": "interface",
-            "alias": "Interface",
-            "function": null,
-            "format": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 25,
-          }, {
-            "field": "type",
-            "alias": "Event",
-            "function": null,
-            "format": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 25,
-          }, {
-            "field": "data1",
-            "alias": "Pause/ACW Queue",
-            "function": null,
-            "format": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 25,
-          }, {
-            "field": "enterAt",
-            "alias": "EnterAt",
-            "function": null,
-            "format": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 25,
-          }, {
-            "field": "exitAt",
-            "alias": "ExitAt",
-            "function": null,
-            "format": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 25,
-          }, {
-            "field": "SEC_TO_TIME(UNIX_TIMESTAMP(exitAt)-UNIX_TIMESTAMP(enterAt))",
-            "alias": "Duration",
-            "function": null,
-            "format": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultMetricId": 22,
-            "DefaultReportId": 25
-          }, {
-            "field": "project_name",
-            "alias": "Project Name",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 26
-          }, {
-            "field": "uniqueid",
-            "alias": "UniqueID",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 26,
-          }, {
-            "field": "callerid",
-            "alias": "CallerID",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 26,
-          }, {
-            "field": "dnid",
-            "alias": "DID",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 26,
-          }, {
-            "field": "joinAt",
-            "alias": "Start Time",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": "ASC",
-            "DefaultReportId": 26,
-          }, {
-            "field": "leaveAt",
-            "alias": "End Time",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 26,
-          }, {
-            "field": "UNIX_TIMESTAMP(leaveAt)-UNIX_TIMESTAMP(joinAt)",
-            "alias": "Duration",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultMetricId": 23,
-            "DefaultReportId": 26,
-            "format": "SEC_TO_TIME"
-          }, {
-            "field": "project_name",
-            "alias": "Project Name",
-            "function": null,
-            "format": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 27,
-          }, {
-            "field": "callerid",
-            "alias": "Caller Id",
-            "function": null,
-            "format": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 27,
-          }, {
-            "field": "uniqueid",
-            "alias": "Unique Id",
-            "function": null,
-            "format": null,
-            "groupBy": 1,
-            "orderBy": null,
-            "DefaultReportId": 27,
-          }, {
-            "field": "node",
-            "alias": "Blocks",
-            "function": "GROUP_CONCAT",
-            "format": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 27,
-          }, {
-            "field": "membername",
-            "alias": "Agent",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 28,
-          }, {
-            "field": "enterAt",
-            "alias": "EnterAt",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 28,
-          }, {
-            "field": "exitAt",
-            "alias": "ExitAt",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 28,
-          }, {
-            "field": "duration",
-            "alias": "Duration",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 28,
-            "format": "SEC_TO_TIME"
-          }, {
-            "field": "channel",
-            "alias": "Channel",
-            "function": null,
-            "groupBy": 1,
-            "orderBy": null,
-            "DefaultReportId": 29,
-          }, {
-            "field": "data1",
-            "alias": "Type",
-            "function": null,
-            "groupBy": 1,
-            "orderBy": null,
-            "DefaultReportId": 29,
-          }, {
-            "field": "duration",
-            "alias": "Duration",
-            "function": "SUM",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 29,
-            "format": "SEC_TO_TIME"
-          }, {
-            "field": "membername",
-            "alias": "Agent",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 30
-          }, {
-            "field": "enterAt",
-            "alias": "EnterAt",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 30
-          }, {
-            "field": "exitAt",
-            "alias": "ExitAt",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 30
-          }, {
-            "field": "data1",
-            "alias": "Pause",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 30
-          }, {
-            "field": "duration",
-            "alias": "Duration",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 30,
-            "format": "SEC_TO_TIME"
-          }, {
-            "field": "connectedlinename",
-            "alias": "Agent",
-            "function": null,
-            "groupBy": 1,
-            "orderBy": null,
-            "DefaultReportId": 31
-          }, {
-            "field": "uniqueid",
-            "alias": "Recorded Calls",
-            "function": "COUNT",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 31
-          }, {
-            "field": "rating",
-            "alias": "Total Rating",
-            "function": "SUM",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 31
-          }, {
-            "field": "rating",
-            "alias": "Avg Rating",
-            "function": "AVG",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 31
-          }, {
-            "field": "queue",
-            "alias": "Queue",
-            "function": null,
-            "groupBy": 1,
-            "orderBy": null,
-            "DefaultReportId": 32
-          }, {
-            "field": "uniqueid",
-            "alias": "Recorded Calls",
-            "function": "COUNT",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 32
-          }, {
-            "field": "rating",
-            "alias": "Total Rating",
-            "function": "SUM",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 32
-          }, {
-            "field": "rating",
-            "alias": "Avg Rating",
-            "function": "AVG",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 32
-          }, {
-            "field": "calleridnum",
-            "alias": "CallerIdNum",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 33
-          }, {
-            "field": "queue",
-            "alias": "Queue",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 33
-          }, {
-            "field": "queuecallerjoinAt",
-            "alias": "StartTime",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 33
-          }, {
-            "field": "CASE WHEN queuecallercomplete=1 THEN queuecallercompleteAt ELSE queuecallerLeaveAt END",
-            "alias": "EndTime",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 33,
-            "DefaultMetricId": 24
-          }, {
-            "field": "CASE WHEN queuecallercomplete=1 THEN \"YES\" ELSE \"NO\" END",
-            "alias": "Answered",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 33,
-            "DefaultMetricId": 25
-          }, {
-            "field": "agentconnectAt",
-            "alias": "Hour",
-            "function": null,
-            "groupBy": 1,
-            "orderBy": null,
-            "DefaultReportId": 34,
-            "format": "HOUR"
-          }, {
-            "field": "agentcomplete",
-            "alias": "Tot Answered",
-            "function": "SUM",
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultReportId": 34,
-          }, {
-            "field": "COUNT(IF(holdtime<10,1,NULL))",
-            "alias": "Answered <10s",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultMetricId": 5,
-            "DefaultReportId": 34
-          }, {
-            "field": "COUNT(IF(holdtime >=10 AND holdtime <20,1,NULL))",
-            "alias": "Answered 10-20s",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultMetricId": 6,
-            "DefaultReportId": 34
-          }, {
-            "field": "COUNT(IF(holdtime >=20 AND holdtime <30,1,NULL))",
-            "alias": "Answered 20-30s",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultMetricId": 7,
-            "DefaultReportId": 34
-          }, {
-            "field": "COUNT(IF(holdtime >=30,1,NULL))",
-            "alias": "Answered >30s",
-            "function": null,
-            "groupBy": 0,
-            "orderBy": null,
-            "DefaultMetricId": 8,
-            "DefaultReportId": 34
-          }, {
-            "field": "accountname",
-            "alias": "Account",
-            "groupBy": 1,
-            "custom": 0,
-            "DefaultReportId": 35
-          }, {
-            "field": "uniqueid",
-            "alias": "Received",
-            "function": "COUNT DISTINCT",
-            "groupBy": 0,
-            "custom": 0,
-            "DefaultReportId": 35
-          }, {
-            "field": "IF(timeout=0,1,null)",
-            "alias": "Accepted",
-            "function": "SUM",
-            "groupBy": 0,
-            "custom": 1,
-            "DefaultReportId": 35
-          }, {
-            "field": "ROUND(SUM(IF(timeout=0,1,null))/COUNT(DISTINCT(uniqueid))*100,1)",
-            "alias": "Accept Rate",
-            "groupBy": 0,
-            "custom": 1,
-            "DefaultReportId": 35
-          }, {
-            "field": "IF(timeout=0 AND application=\"queue\",1,null)",
-            "alias": "Accepted by Queue",
-            "function": "SUM",
-            "groupBy": 0,
-            "custom": 1,
-            "DefaultReportId": 35
-          }, {
-            "field": "IF(timeout=0 AND application=\"fidelity\",1,null)",
-            "alias": "Accept by Fidelity",
-            "function": "SUM",
-            "groupBy": 0,
-            "custom": 1,
-            "DefaultReportId": 35
-          }, {
-            "field": "IF(timeout=0 AND application=\"agent\",1,null)",
-            "alias": "Accepted by Agent",
-            "function": "SUM",
-            "groupBy": 0,
-            "custom": 1,
-            "DefaultReportId": 35
-          }, {
-            "field": "queuename",
-            "alias": "Queue",
-            "groupBy": 1,
-            "custom": 0,
-            "DefaultReportId": 36
-          }, {
-            "field": "uniqueid",
-            "alias": "Received",
-            "function": "COUNT",
-            "groupBy": 0,
-            "custom": 0,
-            "DefaultReportId": 36
-          }, {
-            "field": "IF(timeout=0,1,0)",
-            "alias": "Accepted",
-            "function": "SUM",
-            "groupBy": 0,
-            "custom": 1,
-            "DefaultReportId": 36
-          }, {
-            "field": "timeout",
-            "alias": "Timeout",
-            "function": "SUM",
-            "groupBy": 0,
-            "DefaultReportId": 36
-          }, {
-            "field": "ROUND(SUM(IF(timeout=0,1,null))/COUNT(uniqueid)*100,1)",
-            "alias": "Accept Rate",
-            "groupBy": 0,
-            "custom": 1,
-            "DefaultReportId": 36
-          }, {
-            "field": "ROUND(AVG(IF(timeout=0,UNIX_TIMESTAMP(leaveat)- UNIX_TIMESTAMP(joinat),NULL)))",
-            "alias": "Avg Accept Time",
-            "groupBy": 0,
-            "format": "SEC_TO_TIME",
-            "custom": 1,
-            "DefaultReportId": 36
-          }, {
-            "field": "membername",
-            "alias": "membername",
-            "groupBy": 1,
-            "custom": 0,
-            "DefaultReportId": 36
-          }, {
-            "field": "uniqueid",
-            "alias": "Tot Accepted",
-            "function": "COUNT",
-            "groupBy": 0,
-            "custom": 0,
-            "DefaultReportId": 37
-          }, {
-            "field": "IF(application=\"fidelity\",1,0)",
-            "alias": "Fidelity",
-            "function": "SUM",
-            "groupBy": 0,
-            "custom": 1,
-            "DefaultReportId": 37
-          }, {
-            "field": "IF(application=\"agent\",1,0)",
-            "alias": "Agent",
-            "function": "SUM",
-            "groupBy": 0,
-            "custom": 1,
-            "DefaultReportId": 37
-          }, {
-            "field": "IF(application=\"queue\",1,0)",
-            "alias": "Queue",
-            "function": "SUM",
-            "groupBy": 0,
-            "custom": 1,
-            "DefaultReportId": 37
-          }, {
-            "field": "createdAt",
-            "alias": "Date",
-            "groupBy": 1,
-            "custom": 0,
-            "format": "DATE",
-            "DefaultReportId": 38
-          }, {
-            "field": "IF(status=\"RECEIVED\",1,0)",
-            "alias": "Received",
-            "function": "SUM",
-            "groupBy": 0,
-            "custom": 1,
-            "DefaultReportId": 38
-          }, {
-            "field": "IF(status=\"SENT\",1,0)",
-            "alias": "Sent",
-            "function": "SUM",
-            "groupBy": 0,
-            "custom": 1,
-            "DefaultReportId": 38
-          }, {
-            "field": "id",
-            "alias": "id",
-            "groupBy": 0,
-            "DefaultReportId": 39,
-            "custom": 0
-          }, {
-            "field": "account",
-            "alias": "account",
-            "groupBy": 0,
-            "DefaultReportId": 39,
-            "custom": 0
-          }, {
-            "field": "status",
-            "alias": "status",
-            "groupBy": 0,
-            "DefaultReportId": 39,
-            "custom": 0
-          }, {
-            "field": "lastEvent",
-            "alias": "lastEvent",
-            "groupBy": 0,
-            "DefaultReportId": 39,
-            "custom": 0
-          }, {
-            "field": "createdAt",
-            "alias": "createdAt",
-            "groupBy": 0,
-            "DefaultReportId": 39,
-            "custom": 0
-          }, {
-            "field": "arrivedAt",
-            "alias": "arrivedAt",
-            "groupBy": 0,
-            "DefaultReportId": 39,
-            "custom": 0
-          }, {
-            "field": "openedAt",
-            "alias": "openedAt",
-            "groupBy": 0,
-            "DefaultReportId": 39,
-            "custom": 0
-          }, {
-            "field": "closedAt",
-            "alias": "closedAt",
-            "groupBy": 0,
-            "DefaultReportId": 39,
-            "custom": 0
-          }, {
-            "field": "mailIn",
-            "alias": "mailIn",
-            "groupBy": 0,
-            "DefaultReportId": 39,
-            "custom": 0
-          }, {
-            "field": "mailOut",
-            "alias": "mailOut",
-            "groupBy": 0,
-            "DefaultReportId": 39,
-            "custom": 0
-          }, {
-            "field": "tags",
-            "alias": "tags",
-            "groupBy": 0,
-            "DefaultReportId": 39,
-            "custom": 0
-          }, {
-            "field": "disposition",
-            "alias": "disposition",
-            "groupBy": 0,
-            "DefaultReportId": 39,
-            "custom": 0
-          }, {
-            "field": "ParentId",
-            "alias": "ParentId",
-            "groupBy": 0,
-            "DefaultReportId": 39,
-            "custom": 0
-          }, {
-            "field": "disposition",
-            "alias": "disposition",
-            "groupBy": 1,
-            "DefaultReportId": 40,
-            "custom": 0
-          }, {
-            "field": "count(*)",
-            "alias": "interactions",
-            "groupBy": 0,
-            "DefaultReportId": 40,
-            "custom": 1
-          }, {
-            "field": "closedAt",
-            "alias": "closedAt",
-            "groupBy": 1,
-            "DefaultReportId": 41,
-            "format": "DATE",
-            "custom": 0
-          }, {
-            "field": "id",
-            "alias": "Interactions",
-            "function": "COUNT",
-            "groupBy": 0,
-            "DefaultReportId": 41,
-            "custom": 0
-          }, {
-            "field": "ROUND(AVG(UNIX_TIMESTAMP(closedAt)-UNIX_TIMESTAMP(arrivedAt)))",
-            "alias": "Avg Handle Time",
-            "groupBy": 0,
-            "DefaultReportId": 41,
-            "format": "SEC_TO_TIME",
-            "custom": 1
-          }], {
-            ignoreDuplicates: true,
-            individualHooks: true
-          })
-        }).then(function() {
-          console.log('Populating Analytics');
-        }).catch(function(err) {
-          console.log('Error populating Analytics:', err);
-        });
-
-      models.VoiceExtension.destroy({
-          where: {
-            context: 'outbound-fax'
-          }
-        })
-        .then(function() {
-          models.VoiceExtension.bulkCreate([{
-            context: 'outbound-fax',
-            exten: '_.',
-            priority: 1,
-            app: 'NoOp',
-            appdata: 'Outgoing fax to ${FAXNUMBER}',
-            type: 'system'
-          }, {
-            context: 'outbound-fax',
-            exten: '_.',
-            priority: 2,
-            app: 'NoOp',
-            appdata: 'Account ${FAXNAME}',
-            type: 'system'
-          }, {
-            context: 'outbound-fax',
-            exten: '_.',
-            priority: 3,
-            app: 'Set',
-            appdata: 'CDR(type)=outbound-fax',
-            type: 'system'
-          }, {
-            context: 'outbound-fax',
-            exten: '_.',
-            priority: 4,
-            app: 'Answer',
-            appdata: '',
-            type: 'system'
-          }, {
-            context: 'outbound-fax',
-            exten: '_.',
-            priority: 5,
-            app: 'Wait',
-            appdata: '2',
-            type: 'system'
-          }, {
-            context: 'outbound-fax',
-            exten: '_.',
-            priority: 6,
-            app: 'Set',
-            appdata: 'FAXOPT(ecm)=${FAXECM}',
-            type: 'system'
-          }, {
-            context: 'outbound-fax',
-            exten: '_.',
-            priority: 7,
-            app: 'Set',
-            appdata: 'FAXOPT(headerinfo)=${FAXHEADERINFO}',
-            type: 'system'
-          }, {
-            context: 'outbound-fax',
-            exten: '_.',
-            priority: 8,
-            app: 'Set',
-            appdata: 'FAXOPT(localstationid)=${FAXLOCALSTATIONID}',
-            type: 'system'
-          }, {
-            context: 'outbound-fax',
-            exten: '_.',
-            priority: 9,
-            app: 'Set',
-            appdata: 'FAXOPT(minrate)=${FAXMINRATE}',
-            type: 'system'
-          }, {
-            context: 'outbound-fax',
-            exten: '_.',
-            priority: 10,
-            app: 'Set',
-            appdata: 'FAXOPT(maxrate)=${FAXMAXRATE}',
-            type: 'system'
-          }, {
-            context: 'outbound-fax',
-            exten: '_.',
-            priority: 11,
-            app: 'Set',
-            appdata: 'FAXOPT(modem)=${FAXMODEM}',
-            type: 'system'
-          }, {
-            context: 'outbound-fax',
-            exten: '_.',
-            priority: 12,
-            app: 'Set',
-            appdata: 'FAXOPT(gateway)=${FAXGATEWAY}',
-            type: 'system'
-          }, {
-            context: 'outbound-fax',
-            exten: '_.',
-            priority: 13,
-            app: 'Set',
-            appdata: 'FAXOPT(t38timeout)=${FAXT38TIMEOUT}',
-            type: 'system'
-          }, {
-            context: 'outbound-fax',
-            exten: '_.',
-            priority: 14,
-            app: 'SendFAX',
-            appdata: '${FAXOUTFILE},ds',
-            type: 'system'
-          }, {
-            context: 'outbound-fax',
-            exten: '_.',
-            priority: 15,
-            app: 'Hangup',
-            appdata: '',
-            type: 'system'
-          }], {
-            ignoreDuplicates: true,
-            individualHooks: true
-          })
-        })
-        .then(function() {
-          console.log('Finished populating VoiceExtension for Outgoing Fax');
-        });
-
-      models.User
-        .findAll({
-          include: [{
-            model: models.VoiceExtension,
-            as: 'UserExtensions',
-            where: {
-              app: 'Dial'
-            }
-          }]
-        })
-        .then(function(users) {
-          console.log('Rewriting Users extensions...');
-          var bulkUpdates = [];
-          _.forEach(users, function(user) {
-            _.forEach(user.UserExtensions, function(elem) {
-              elem.appdata = 'SIP/' + user.name + ',,tTxX';
-              bulkUpdates.push(elem.save());
-              // console.log('extension updated');
-            });
-          });
-          return bulkUpdates;
-        })
-        .all()
-        .catch(function(err) {
-          console.log(err);
-        });
-
-      _setting
-        .update({
-          firstSetup: false
-        });
-    }
-  })
-  .catch(function(err) {
-    console.error(err);
-  });
\ No newline at end of file
diff --git a/server/config/sms/index.js b/server/config/sms/index.js
index 81fbf23..5080cb6 100644
--- a/server/config/sms/index.js
+++ b/server/config/sms/index.js
@@ -1,23 +1 @@
-'use strict';
-var SmsAccount = require('../../models').SmsAccount;
-var Sms = require('./sms');
-
-
-module.exports = function() {
-  SmsAccount.afterCreate(function(server) {
-    var sms = new Sms();
-    sms.init(server);
-  });
-
-  return SmsAccount
-    .findAll()
-    .then(function(servers) {
-      servers.forEach(function(server) {
-        var sms = new Sms();
-        sms.init(server);
-      });
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
\ No newline at end of file
diff --git a/server/config/sms/skebby.js b/server/config/sms/skebby.js
index 4f65a2d..27f4beb 100644
--- a/server/config/sms/skebby.js
+++ b/server/config/sms/skebby.js
@@ -1,110 +1 @@
-var qs = require('querystring');
-var https = require('https');
-var rp = require('request-promise');
-var Promise = require('bluebird');
-
-
-var skebbyMessage = function(input, callback) {
-
-  var text = input.text;
-  var sender_number = input.sender_number || "";
-  var sender_string = input.sender_string || "";
-  var method = input.method;
-  var lrecipients = input.recipients || [];
-  var username = input.username;
-  var password = input.password;
-
-  switch (method) {
-    case 'classic':
-      method = 'send_sms_classic';
-      break;
-    case 'classic+':
-      method = 'send_sms_classic_report';
-      break;
-    case 'test':
-      method = 'test_send_sms_basic';
-      break;
-    case 'basic':
-    default:
-      method = 'send_sms_basic';
-
-  }
-
-  var test = input.test || false;
-
-  var params = {
-    method: method,
-    username: username,
-    password: password,
-    "recipients[]": lrecipients,
-    text: text,
-    charset: "UTF-8",
-  };
-
-  if (sender_number) {
-    params.sender_number = sender_number;
-  } else if (sender_string) {
-    params.sender_string = sender_string;
-  }
-
-  if (test) {
-    params.method = "test_" + params.method;
-  }
-
-  var res_done = false;
-  var data = qs.stringify(params);
-
-  var client = https.request({
-    port: 443,
-    path: "/api/send/smseasy/advanced/http.php",
-    host: "gateway.skebby.it",
-    method: "POST",
-    headers: {
-      "Content-Type": "application/x-www-form-urlencoded",
-      "Content-Length": data.length,
-      "Content-Encoding": "utf8",
-    }
-  }, function(res) {
-    var res_data = "";
-    res.on('data', function(data) {
-      res_data += data;
-    });
-    res.on("end", function() {
-      if (!res_done) {
-        var res_parsed = qs.parse(res_data);
-        if (res_parsed.status == "success") {
-          callback(null, {
-            data: res_parsed
-          });
-        } else {
-          callback(res_parsed);
-        }
-        res_done = true;
-      }
-    });
-  });
-
-  client.end(data);
-  client.on('error', function(e) {
-    if (!res_done) {
-      callback(e);
-      res_done = true;
-    }
-  });
-};
-
-var sendMessage = function(message, account) {
-
-  var _message = {
-    method: account.smstype,
-    username: account.username,
-    password: account.password,
-    sender_number: /^[\+][0-9]+$/.test(message.from) ? message.from.replace("+", "") : message.from,
-    recipients: /^[\+][0-9]+$/.test(message.to) ? message.to.replace("+", "") : message.to,
-    text: message.body
-  };
-  var send = Promise.promisify(skebbyMessage);
-  return send(_message);
-};
-
-module.exports.sendMessage = sendMessage;
\ No newline at end of file
diff --git a/server/config/sms/sms.js b/server/config/sms/sms.js
index 8bc5bd9..cbb595f 100644
--- a/server/config/sms/sms.js
+++ b/server/config/sms/sms.js
@@ -1,284 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var Promise = require('bluebird');
-var Util = require('../util');
-var moment = require('moment');
-var path = require('path');
-var util = require('util');
-var fs = require('fs');
-var Agent = require('../../models').User;
-var SmsRoom = require('../../models').SmsRoom;
-var SmsMessage = require('../../models').SmsMessage;
-var SmsAccount = require('../../models').SmsAccount;
-var ReportSms = require('../../models').ReportSms;
-var Action = require('../../models').Action;
-var path = require('path');
-var fs = require('fs');
-var Contact = require('../../models').Contact;
-
-
-var Scheduler = require('../routing/scheduler');
-
-function Sms() {
-  console.log('Sms Initialization...');
-  this.account = null;
-}
-
-Sms.prototype.init = function(doc) {
-  var self = this;
-  console.log("SMS - Account " + doc.name + " SMS CREATE");
-  self.account = doc;
-  SmsAccount.afterUpdate(function(doc) {
-    if (self.account && doc.id === self.account.id) {
-      self.onUpdate(doc);
-    }
-  });
-  ReportSms.afterUpdate(function(doc) {
-    if (self.account && doc.accountid == self.account.id) {
-      if (doc.changed('connectid')) {
-        self.webhook(doc, 'accept');
-      }
-      if (doc.changed('rejectedAt')) {
-        self.webhook(doc, 'reject');
-      }
-    }
-  });
-  SmsRoom.afterUpdate(function(doc) {
-    if (self.account && doc.SmsAccountId == self.account.id) {
-      if (doc.changed('status') && doc.status === 'CLOSED') {
-        self.webhook(doc, 'close');
-      }
-    }
-  })
-  SmsAccount.afterDestroy(function(doc) {
-    if (self.account && doc.id === self.account.id) {
-      self.onRemove(doc);
-    }
-  });
-  SmsMessage.afterCreate(function(doc, opt) {
-
-    if (self.account && self.account.id == doc.dataValues.SmsAccountId) {
-
-      if (doc.status === 'RECEIVED') {
-        var scheduler = new Scheduler({
-          channel: 'sms',
-          uniqueid: util.format('%s.%s', moment().unix(), doc.SmsRoomId),
-          messageid: doc.id,
-          roomid: doc.SmsRoomId,
-          accountid: self.account.id,
-          accountname: self.account.name,
-          accountnumber: self.account.phone,
-          from: doc.from
-        })
-
-        scheduler.init();
-      }
-
-      self.onSend(doc, opt);
-    }
-  });
-};
-
-Sms.prototype.onUpdate = function(doc) {
-  if (!doc.changed('state')) {
-    console.log("SMS - Account " + doc.name + " SMS UPDATE");
-    this.account = null;
-    this.account = doc;
-  }
-}
-
-Sms.prototype.onRemove = function(doc) {
-  console.log("[SMS - Account " + doc.name + " SMS DESTROY");
-  this.account = null;
-}
-
-Sms.prototype.onSend = function(smsMessage, opt) {
-  // var self = this;
-  var _Account = this.account;
-  var _mMessage = smsMessage;
-  var _Room;
-  var _mAgent;
-
-  if (_mMessage.status === 'SENDING') {
-
-    return Promise
-      .all([])
-      .then(getSmsRoom(_mMessage))
-      .then(function(smsRoom) {
-        _Room = smsRoom;
-        return _mMessage
-          .setSmsRoom(smsRoom.id);
-      })
-      .then(function() {
-        return _Room
-          .updateAttributes({
-            voiceSource: _mMessage.auto ? _mMessage.auto : _Room.voiceSource,
-            lastEvent: 'SENDING',
-            lastEventAt: moment().format('YYYY-MM-DD HH:mm:ss'),
-            smsOut: ++_Room.smsOut
-          }, {
-            individualHooks: true,
-            user: opt.user
-          });
-      })
-      .then(function(message) {
-        return Agent.
-        findById(_mMessage.UserId);
-      })
-      .then(function(mAgent) {
-        _mAgent = mAgent;
-        return _Room
-          .addUser(_mAgent);
-      })
-      .then(function() {
-        if (_Account.ListId) {
-          return Contact
-            .findOrCreate({
-              where: {
-                ListId: _Account.ListId,
-                mobile: _mMessage.from
-              },
-              defaults: {
-                ListId: _Account.ListId,
-                mobile: _mMessage.from
-              }
-            });
-        } else {
-          return [];
-        }
-      })
-      .then(function() {
-        console.log("SENDING SMS...");
-        var file = path.join(__dirname, _Account.type + '.js');
-        if (fs.existsSync(file)) {
-          return require(file).sendMessage(_mMessage, _Account)
-        } else {
-          throw new Error("SMS - INTERGRATION " + _Account.type + " NOT FOUND!!");
-        }
-      })
-      .then(function(res) {
-        // console.log('response', response);
-        console.log(" SMS SENT...");
-        return _mMessage
-          .update({
-            status: (_Account.type == 'skebby') ? 'SENT' : res.status,
-            skebby_message_id: (_Account.type == 'skebby') ? res.data.id : null,
-            res_data: JSON.stringify(res)
-          })
-      })
-      .then(function() {
-        return _Room
-          .updateAttributes({
-            lastEvent: 'SENT',
-            lastEventAt: moment().format('YYYY-MM-DD HH:mm:ss')
-          });
-      })
-      .catch(function(err) {
-        console.log('err', err);
-        _mMessage
-          .update({
-            status: 'FAILED',
-            errorcode: err.code,
-            res_data: JSON.stringify(err)
-          })
-          .then(function() {
-            return _Room
-              .updateAttributes({
-                lastEvent: 'FAILED',
-                lastEventAt: moment().format('YYYY-MM-DD HH:mm:ss')
-              });
-          })
-          .catch(function(err) {
-            console.log('Error updating error status');
-          });
-
-      })
-  }
-}
-
-function getSmsRoom(_mMessage) {
-  return function() {
-    if (_mMessage.SmsRoomId) {
-      return SmsRoom
-        .findById(_mMessage.SmsRoomId)
-    } else {
-      return SmsRoom
-        .findAll({
-          limit: 1,
-          where: {
-            contact: _mMessage.to,
-            SmsAccountId: _mMessage.SmsAccountId
-          },
-          order: [
-            ['createdAt', 'DESC']
-          ]
-        })
-        .then(function(smsroom) {
-          var room = smsroom[0];
-          if (!room || room.status === 'CLOSED') {
-            var parentID = room ? room.id : null;
-            return SmsRoom
-              .create({
-                contact: _mMessage.to,
-                SmsAccountId: _mMessage.SmsAccountId,
-                status: _mMessage.auto ? 'CLOSED' : 'PENDING',
-                ParentId: parentID
-              })
-          } else {
-            return room;
-          }
-        })
-    }
-
-  }
-}
-
-
-function execRequest(doc, method, url) {
-  Util.sendRequest(doc, method, url)
-    .then(function(values) {
-      console.log('request successeful!');
-
-    })
-    .catch(function(err) {
-      console.log('request failed!');
-
-    })
-}
-
-Sms.prototype.webhook = function(doc, hook) {
-  var _Account = this.account;
-
-  switch (hook) {
-    case 'accept':
-      if (_Account.acceptMethod && _Account.acceptUrl) {
-        console.log('SMS account <' + _Account.name + '> executing accept webhook');
-        execRequest(doc.dataValues, _Account.acceptMethod, _Account.acceptUrl);
-      }
-      if (_Account.actions.length) {
-        _.forEach(_Account.actions, function(action) {
-          if (action.enabled) {
-            Util.execAction(action, doc);
-          }
-        })
-      }
-      break;
-    case 'reject':
-      if (_Account.rejectMethod && _Account.rejectUrl) {
-        console.log('SMS account <' + _Account.name + '> executing reject webhook');
-        execRequest(doc.dataValues, _Account.rejectMethod, _Account.rejectUrl);
-      }
-      break;
-    case 'close':
-      if (_Account.closeMethod && _Account.closeUrl) {
-        console.log('SMS account <' + _Account.name + '> executing close webhook');
-        execRequest(doc.dataValues, _Account.closeMethod, _Account.closeUrl);
-      }
-      break;
-    default:
-      console.log('Webhook not recognized');
-  }
-}
-
-module.exports = Sms;
\ No newline at end of file
diff --git a/server/config/sms/twilio.js b/server/config/sms/twilio.js
index b4949ef..6f20656 100644
--- a/server/config/sms/twilio.js
+++ b/server/config/sms/twilio.js
@@ -1,22 +1 @@
-'use strict';
-var twilio = require('twilio');
-// https://twilio.github.io/twilio-node/
-var SmsMessage = require('../../models').SmsMessage;
-var Promise = require('bluebird');
-
-
-var sendMessage = function(message, account) {
-  var client = twilio(account.sid, account.token);
-  var url = account.remote + '/api/sms/accounts/' + account.id + '/message/' +
-    message.id + '/update';
-
-  var send = Promise.promisify(client.sendMessage);
-  return send({
-    to: /^[\+][0-9]+$/.test(message.to) ? message.to : '+' + message.to, // Any number Twilio can deliver to
-    from: /^[\+][0-9]+$/.test(message.from) ? message.from : '+' + message.from, // A number you bought from Twilio and can use for outbound communication
-    body: message.body, // body of the SMS message
-    StatusCallback: url
-  });
-}
-
-module.exports.sendMessage = sendMessage;
\ No newline at end of file
diff --git a/server/config/smtp/index.js b/server/config/smtp/index.js
index 0d7b947..d7a0795 100644
--- a/server/config/smtp/index.js
+++ b/server/config/smtp/index.js
@@ -1,130 +1 @@
-'use strict';
-
-const util = require('util');
-const cp = require('child_process');
-const ms = require('../../models').MailServerOut;
-const msg = require('../../models').MailMessage;
-const rm = require('../../models').MailRoom;
-
-function fork(id, username) {
-  return cp
-    .fork(__dirname + '/smtp', [id, username])
-    .on('message', function(data) {
-
-      if (data.type === 'update') {
-        return msg
-          .findById(data.msgId)
-          .then(function(message) {
-            return message
-              .update(data);
-          })
-          .then(function() {
-            return rm
-              .findById(data.roomId);
-          })
-          .then(function(room) {
-            return room
-              .update({
-                lastEvent: data.status
-              });
-          });
-      }
-
-      if (data.type === 'state') {
-        return ms
-          .findById(id)
-          .then(function(server) {
-            return server
-              .update({
-                state: data.state,
-                source: data.source || null
-              });
-          })
-          .then(function() {
-            console.log(data.log);
-          })
-          .catch(function(err) {
-            console.error(err);
-          });
-      }
-    })
-    .on('close', function(code) {
-      console.log(util.format('SMTP SERVER %s EXITED WITH CODE %s', username, code));
-    })
-    .on('error', function(err) {
-      console.error(err);
-    });
-}
-
-module.exports = function() {
-  var childs = {};
-
-  process.on('exit', function(code) {
-    for (var key in childs) {
-      if (childs[key]) {
-        childs[key].kill();
-      }
-    }
-  });
-
-  msg.afterCreate(function(message) {
-    if (childs[message.from]) {
-      message.dataValues.type = 'message';
-      message.dataValues.retrySend = 0;
-      childs[message.from].send(message.dataValues);
-    }
-  });
-
-  msg.afterUpdate(function(message) {
-    if (message.changed('status') && message.status === 'SENDING') {
-      if (childs[message.from]) {
-        message.dataValues.type = 'message';
-        message.dataValues.retrySend = message.dataValues.retry + 1;
-        childs[message.from].send(message.dataValues);
-      }
-    }
-  });
-
-  ms.afterCreate(function(server) {
-    childs[server.username] = fork(server.id, server.username);
-  });
-
-  ms.afterUpdate(function(server) {
-    if (childs[server.username]) {
-      if (!server.changed('state') && !server.changed('source')) {
-        childs[server.username].kill();
-        childs[server.username] = null;
-
-        childs[server.username] = fork(server.id, server.username);
-
-        console.log(util.format('SMTP SERVER %s UPDATED, PROCESS ID: %s ', server.id, childs[server.username].pid));
-      } else {
-        childs[server.username].send({
-          type: 'state',
-          state: server.state,
-          source: server.source,
-          username: server.username
-        });
-      }
-    }
-  });
-
-  ms.afterDestroy(function(server) {
-    if (childs[server.username]) {
-      console.log(util.format('SMTP SERVER %s DESTROYED, PROCESS ID: %s ', server.id, childs[server.username].pid));
-
-      childs[server.username].kill();
-      childs[server.username] = null;
-    }
-  });
-
-  ms.findAll()
-    .then(function(servers) {
-      servers.forEach(function(server) {
-        childs[server.username] = fork(server.id, server.username);
-      });
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
\ No newline at end of file
diff --git a/server/config/smtp/smtp.js b/server/config/smtp/smtp.js
index 7ca6c7f..c197bc7 100644
--- a/server/config/smtp/smtp.js
+++ b/server/config/smtp/smtp.js
@@ -1,384 +1 @@
-'use strict';
-
-var util = require('util');
-var promise = require('bluebird');
-
-var _ = require('lodash');
-var moment = require('moment');
-var Mustache = require('mustache');
-
-var nodemailer = require('nodemailer');
-var smtpTransport = require('nodemailer-smtp-transport');
-var htmlToText = require('html-to-text');
-
-var Agent = require('../../models').User;
-var Room = require('../../models').MailRoom;
-var Template = require('../../models').Template;
-var Account = require('../../models').MailAccount;
-var Message = require('../../models').MailMessage;
-var Server = require('../../models').MailServerOut;
-var Status = require('../../models').MailRoomStatus;
-var Attachment = require('../../models').MailAttachment;
-
-var smtp;
-var timeout;
-
-process
-  .on('message', function(data) {
-    if (data.type === 'message') {
-      onSend(data);
-    }
-
-    if (data.type === 'state') {
-      switch (data.state) {
-        case 'CONNECTING':
-          onVerify(data.username);
-          break;
-
-        default:
-      }
-    }
-  })
-  .on('close', function(code) {
-    console.log(util.format('SMTP SERVER %s EXITED WITH CODE %s', process.argv[3], code));
-  })
-  .on('error', function(err) {
-    console.error(err);
-  });
-
-console.log(util.format('SMTP SERVER %s STARTING, PROCESS ID: %s ', process.argv[3], process.pid));
-
-function onVerify(username) {
-  smtp.verify()
-    .then(function() {
-      process.send({
-        type: 'state',
-        state: 'CONNECTED',
-        source: null,
-        log: util.format('SMTP SERVER %s CONNECTED, PROCESS ID: %s ', username, process.pid)
-      });
-    })
-    .catch(function(err) {
-      process.send({
-        type: 'state',
-        state: 'ERROR',
-        source: JSON.stringify(err),
-        log: util.format('SMTP SERVER %s ERROR, PROCESS ID: %s ', username, process.pid)
-      });
-    });
-}
-
-function onSave(server) {
-
-  smtp = nodemailer
-    .createTransport(smtpTransport({
-      host: server.host,
-      port: server.port,
-      secure: server.ssl,
-      pool: true,
-      auth: {
-        user: server.username,
-        pass: server.password
-      }
-    }));
-
-  smtp.mailAccountId = server.MailAccountId;
-  smtp.mailServerOutId = server.id;
-  smtp.username = server.username;
-
-  onVerify(server.username);
-}
-
-function onSend(message) {
-  console.log(util.format('SMTP SERVER %s SENDING MSG, PROCESS ID: %s ', process.argv[3], process.pid));
-
-  if (message.status === 'SENDING') {
-    var _mRoom;
-    var _mAccount;
-    var _mAgent;
-    var _mMessage = message;
-    var _mFrom, _mTo, _mCc, _mBcc;
-
-    if (_mMessage.inReplyTo) {
-      return Message
-        .findOne({
-          where: {
-            messageId: _mMessage.inReplyTo
-          }
-        })
-        .then(function(mailMessageParent) {
-          return mailMessageParent
-            .getMailRoom({
-              include: {
-                model: Account,
-                include: [{
-                  model: Template
-                }]
-              }
-            });
-        })
-        .then(function(mailRoom) {
-          _mRoom = mailRoom;
-          _mAccount = mailRoom.MailAccount;
-          return _mRoom
-            .addMailMessage(_mMessage.id);
-        })
-        .then(function() {
-          var data = {
-            lastEvent: 'SENDING',
-            attachment: _mMessage.MailAttachments && _mMessage.MailAttachments.length,
-            mailOut: ++_mRoom.mailOut
-          };
-
-          if (!message.auto) {
-            data.status = 'PENDING';
-          }
-
-          return _mRoom
-            .update(data);
-        })
-        .then(function() {
-          return Agent.
-          findById(_mMessage.UserId);
-        })
-        .then(function(mAgent) {
-          _mAgent = mAgent;
-          return _mRoom
-            .addUser(_mAgent);
-        })
-        .then(function() {
-          _mMessage.html = _mMessage.html ? _mMessage.html.toString('utf8') : null;
-          _mMessage.text = _mMessage.text ? _mMessage.text.toString('utf8') : null;
-
-          var _to = _mMessage.to ? _.without(_mMessage.to.split(';'), _mAccount.address) : [];
-          var _cc = _mMessage.cc ? _.without(_mMessage.cc.split(';'), _mAccount.address) : [];
-          var _bcc = _mMessage.bcc ? _.without(_mMessage.bcc.split(';'), _mAccount.address) : [];
-
-          var _html = (_mAccount.Template && !message.auto) ? Mustache.render(_mAccount.Template.html, {
-            interactionId: _mRoom.id,
-            subject: _mMessage.subject,
-            body: _mMessage.html ? _mMessage.html : _mMessage.text,
-            accountName: _mAccount.name,
-            from: _mMessage.from,
-            to: _to.join(';'),
-            cc: _cc.join(';'),
-            bcc: _bcc.join(';'),
-            agentName: _mAgent.fullname,
-            agentEmail: _mAgent.email,
-            createdAt: _mMessage.createdAt
-          }) : _mMessage.html;
-
-          var _text;
-          if (_mMessage.text) {
-            _text = _mMessage.text;
-          } else {
-            _text = _mMessage.html ? htmlToText.fromString(_mMessage.html, {
-              wordwrap: false
-            }) : null;
-          }
-          if (_mAccount.whiteLabel) {
-            _html += '<br>' + _mAccount.whiteLabel;
-            _text += '<br>' + _mAccount.whiteLabel;
-          } else {
-            _html += '<br> Sent with XCALLYÂ®';
-            _text += '<br> Sent with XCALLYÂ®';
-          }
-          var mail = {
-            status: _mMessage.status,
-            from: {
-              name: _mAccount.name,
-              address: _mAccount.address
-            },
-            to: _to.join(';'),
-            cc: _cc.join(';'),
-            bcc: _bcc.join(';'),
-            subject: _mMessage.subject,
-            html: _html,
-            text: _text
-          };
-
-          if (_mMessage.MailAttachments) {
-            mail.attachments = _.map(_mMessage.MailAttachments, function(elm) {
-              return {
-                path: elm.path,
-                filename: elm.name
-              }
-            });
-          }
-
-          return smtp
-            .sendMail(mail);
-        })
-        .then(function(info) {
-          process.send({
-            msgId: _mMessage.id,
-            roomId: _mRoom.id,
-            type: 'update',
-            messageId: info.messageId,
-            status: 'SENT',
-            retry: _mMessage.retrySend
-          });
-        })
-        .catch(function(err) {
-          console.error(err);
-          process.send({
-            msgId: _mMessage.id,
-            roomId: _mRoom.id,
-            type: 'update',
-            status: 'FAILED',
-            retry: _mMessage.retrySend
-          });
-        });
-    } else {
-      // NO REPLY, NEW MESSAGE, NEW ROOM
-      return Account
-        .findById(smtp.mailAccountId, {
-          include: [{
-            model: Template
-          }]
-        })
-        .then(function(mailAccount) {
-          _mAccount = mailAccount;
-
-          return Room
-            .findById(_mMessage.MailRoomId);
-        })
-        .then(function(mailRoom) {
-          if (!mailRoom) {
-            return Agent
-              .findById(message.UserId)
-              .then(function(agent) {
-                return Room
-                  .create({
-                    subject: _mMessage.subject,
-                    from: _mMessage.from,
-                    account: _mAccount ? _mAccount.name : null,
-                    status: 'PENDING',
-                    lastEvent: 'SENDING',
-                    attachment: _mMessage.MailAttachments && _mMessage.MailAttachments.length,
-                    MailAccountId: _mAccount ? _mAccount.id : null,
-                    mailOut: 1,
-                    arrivedAt: moment().format('YYYY-MM-DD HH:mm:ss'),
-                    MailRoomStatuses: [{
-                      status: 'PENDING',
-                      data1: agent ? agent.name : null,
-                      data2: agent ? agent.fullname : null,
-                      UserId: agent ? agent.id : null
-                    }]
-                  }, {
-                    include: [{
-                      model: Message
-                    }, {
-                      model: Status
-                    }]
-                  });
-              });
-          } else {
-            return mailRoom;
-          }
-        })
-        .then(function(mailRoom) {
-          _mRoom = mailRoom
-
-          return Agent
-            .findById(_mMessage.UserId);
-        })
-        .then(function(mAgent) {
-          _mAgent = mAgent;
-          return _mRoom
-            .addUser(_mAgent);
-        })
-        .then(function() {
-          _mMessage.html = _mMessage.html ? _mMessage.html.toString('utf8') : null;
-          _mMessage.text = _mMessage.text ? _mMessage.text.toString('utf8') : null;
-
-          var _to = _mMessage.to ? _.without(_mMessage.to.split(';'), _mAccount.address) : [];
-          var _cc = _mMessage.cc ? _.without(_mMessage.cc.split(';'), _mAccount.address) : [];
-          var _bcc = _mMessage.bcc ? _.without(_mMessage.bcc.split(';'), _mAccount.address) : [];
-
-          var _html = (_mAccount.Template && !message.auto) ? Mustache.render(_mAccount.Template.html, {
-            interactionId: _mRoom.id,
-            subject: _mMessage.subject,
-            body: _mMessage.html ? _mMessage.html : _mMessage.text,
-            accountName: _mAccount.name,
-            from: _mMessage.from,
-            to: _to.join(';'),
-            cc: _cc.join(';'),
-            bcc: _bcc.join(';'),
-            agentName: _mAgent ? _mAgent.fullname : '',
-            agentEmail: _mAgent ? _mAgent.email : '',
-            createdAt: _mMessage.createdAt
-          }) : _mMessage.html;
-
-          var _text;
-          if (_mMessage.text) {
-            _text = _mMessage.text;
-          } else {
-            _text = _mMessage.html ? htmlToText.fromString(_mMessage.html, {
-              wordwrap: false
-            }) : null;
-          }
-          if (_mAccount.whiteLabel) {
-            _html += '<br>' + _mAccount.whiteLabel;
-            _text += '<br>' + _mAccount.whiteLabel;
-          } else {
-            _html += '<br> Sent with XCALLYÂ®';
-            _text += '<br> Sent with XCALLYÂ®';
-          }
-          var mail = {
-            status: _mMessage.status,
-            from: {
-              name: _mAccount.name,
-              address: _mAccount.address
-            },
-            to: _to.join(';'),
-            cc: _cc.join(';'),
-            bcc: _bcc.join(';'),
-            subject: _mMessage.subject,
-            html: _html,
-            text: _text
-          };
-          if (_mMessage.MailAttachments) {
-            mail.attachments = _.map(_mMessage.MailAttachments, function(elm) {
-              return {
-                path: elm.path,
-                filename: elm.name
-              }
-            });
-          }
-
-          return smtp
-            .sendMail(mail);
-        })
-        .then(function(info) {
-          process.send({
-            msgId: _mMessage.id,
-            roomId: _mRoom.id,
-            type: 'update',
-            messageId: info.messageId,
-            status: 'SENT',
-            retry: _mMessage.retrySend
-          });
-        })
-        .catch(function(err) {
-          console.error(err);
-          process.send({
-            msgId: _mMessage.id,
-            roomId: _mRoom.id,
-            type: 'update',
-            status: 'FAILED',
-            retry: _mMessage.retrySend
-          });
-        });
-    }
-  }
-}
-
-Server
-  .findById(process.argv[2])
-  .then(function(server) {
-    onSave(server);
-  })
-  .catch(function(err) {
-    console.error(err);
-  });
\ No newline at end of file
diff --git a/server/config/socketio.js b/server/config/socketio.js
index e8711b5..973ad3b 100644
--- a/server/config/socketio.js
+++ b/server/config/socketio.js
@@ -1,286 +1 @@
-/**
- * Socket.io configuration
- */
-
-'use strict';
-
-var moment = require('moment');
-var util = require('util');
-var config = require('./environment');
-
-var User = require('../models').User;
-var VoiceQueue = require('../models').VoiceQueue;
-
-function onDisconnect(socket) {
-  console.info('[%s] SOCKET DISCONNECTED', socket.handshake.address);
-
-  if (socket.handshake.query.role) {
-    socket.leave(util.format("%ss", socket.handshake.query.role));
-  }
-
-  if (socket.userId) {
-    return User
-      .findById(socket.userId)
-      .then(function(user) {
-        if (!user) {
-          throw new Error('socket: no user found');
-        }
-        return user
-          .update({
-            online: false
-          });
-      })
-      .then(function(user) {
-        console.log('socket: user offline', user.name);
-      })
-      .catch(function(err) {
-        console.error(err);
-      });
-  } else {
-    console.log('socket: no user found');
-  }
-}
-
-function onConnect(socket, dashboardProcess) {
-
-  console.info('[%s] SOCKET CONNECTED', socket.handshake.address);
-
-  socket.setMaxListeners(0);
-  socket.address = socket.handshake.address !== null ? socket.handshake.address.address + ':' + socket.handshake.address.port : process.env.DOMAIN;
-  socket.userId = socket.handshake.query.userId;
-  socket.role = socket.handshake.query.role;
-  socket.name = socket.handshake.query.name;
-  socket.source = socket.handshake.query.source;
-  socket.connectedAt = new Date();
-
-  if (socket.handshake.query.role) {
-    socket.join(util.format("%ss", socket.handshake.query.role));
-  }
-
-  if (socket.userId) {
-    return User
-      .findById(socket.userId, {
-        attributes: ['id', 'name', 'role'],
-        include: [{
-          model: VoiceQueue,
-          as: 'PVoiceQueues',
-          attributes: ['name'],
-        }],
-      })
-      .then(function(user) {
-        if (!user) {
-          throw new Error('socket: no user found');
-        }
-
-        return user
-          .update({
-            online: true,
-            lastLoginAt: moment().format("YYYY-MM-DD HH:mm:ss")
-          })
-      })
-      .then(function(user) {
-
-        if (user.role !== 'agent') {
-          require('./tools/dashboard').register(socket);
-          // require('./tools/queueParameters').register(socket);
-        }
-
-        // ADD USER TO THE QUEUE ROOM
-        socket.join(util.format('%s:%s', user.role, user.id));
-        socket.join(util.format('%s', user.name));
-
-        switch (user.role) {
-          case 'admin':
-            VoiceQueue
-              .findAll({
-                attributes: ['name']
-              })
-              .then(function(PVoiceQueues) {
-                PVoiceQueues.forEach(function(queue) {
-                  socket.join(queue.name);
-                });
-              })
-              .catch(function(err) {
-                console.error(err);
-              });
-            break;
-
-          case 'user':
-            user.PVoiceQueues.forEach(function(queue) {
-              socket.join(queue.name);
-            });
-            break;
-          default:
-        }
-
-        console.log('socket: user online', user.name);
-        // Insert sockets below
-        require('../api/report_openchannel_session/report_openchannel_session.socket').register(socket);
-        require('../api/report_openchannel/report_openchannel.socket').register(socket);
-        require('../api/user_has_openchannel_queue/user_has_openchannel_queue.socket').register(socket);
-        require('../api/openchannel_disposition/openchannel_disposition.socket').register(socket);
-        require('../api/openchannel_application/openchannel_application.socket').register(socket);
-        require('../api/openchannel_queue/openchannel_queue.socket').register(socket);
-        require('../api/openchannel_room/openchannel_room.socket').register(socket);
-        require('../api/openchannel_message/openchannel_message.socket').register(socket);
-        require('../api/openchannel_account/openchannel_account.socket').register(socket);
-        require('../api/fax_disposition/fax_disposition.socket').register(socket);
-        require('../api/sms_disposition/sms_disposition.socket').register(socket);
-        require('../api/mail_disposition/mail_disposition.socket').register(socket);
-        require('../api/chat_disposition/chat_disposition.socket').register(socket);
-        require('../api/voice_disposition/voice_disposition.socket').register(socket);
-        require('../api/fax_attachment/fax_attachment.socket').register(socket);
-        require('../api/report_fax_session/report_fax_session.socket').register(socket);
-        require('../api/report_fax/report_fax.socket').register(socket);
-        require('../api/network_externip/network_externip.socket').register(socket);
-        require('../api/network_localnet/network_localnet.socket').register(socket);
-
-        //Ordered alphabetically
-        require('../api/agent/agent.socket').register(socket);
-        require('../api/ami/ami.socket').register(socket);
-        require('../api/automation/automation.socket').register(socket);
-        require('../api/scheduler/scheduler.socket').register(socket);
-        require('../api/canned_answer/canned_answer.socket').register(socket);
-        require('../api/chanspy/chanspy.socket').register(socket);
-        require('../api/chat_application/chat_application.socket').register(socket);
-        require('../api/chat_enquiry/enquiry.socket').register(socket);
-        require('../api/chat_message/chat_message.socket').register(socket);
-        require('../api/chat_proactive_action/chat_proactive_action.socket').register(socket);
-        require('../api/chat_queue/chat_queue.socket').register(socket);
-        require('../api/chat_room/chat_room.socket').register(socket);
-        require('../api/chat_visitor/chat_visitor.socket').register(socket);
-        require('../api/chat_website/chat_website.socket').register(socket);
-        require('../api/chat_websites_field/chat_websites_field.socket').register(socket);
-        require('../api/company/company.socket').register(socket);
-        require('../api/contact_manager/contact_manager.socket').register(socket);
-        require('../api/custom_report/custom_report.socket').register(socket);
-        require('../api/dashboard/dashboard.socket').register(socket);
-        require('../api/default_report/default_report.socket').register(socket);
-        require('../api/desk_account/desk_account.socket').register(socket);
-        require('../api/desk_configuration/desk_configuration.socket').register(socket);
-        require('../api/desk_field/desk_field.socket').register(socket);
-        require('../api/extracted_report/extracted_report.socket').register(socket);
-        require('../api/fax_account/fax_account.socket').register(socket);
-        require('../api/fax_application/fax_application.socket').register(socket);
-        require('../api/fax_message/fax_message.socket').register(socket);
-        require('../api/fax_queue/fax_queue.socket').register(socket);
-        require('../api/fax_room/fax_room.socket').register(socket);
-        require('../api/freshdesk_account/freshdesk_account.socket').register(socket);
-        require('../api/freshdesk_configuration/freshdesk_configuration.socket').register(socket);
-        require('../api/freshdesk_field/freshdesk_field.socket').register(socket);
-        require('../api/integration/integration.socket').register(socket);
-        require('../api/interval/interval.socket').register(socket);
-        require('../api/jscripty_project/jscripty_project.socket').register(socket);
-        require('../api/list/list.socket').register(socket);
-        require('../api/mail_account/mail_account.socket').register(socket);
-        require('../api/mail_application/mail_application.socket').register(socket);
-        require('../api/mail_attachment/mail_attachment.socket').register(socket);
-        require('../api/mail_message/mail_message.socket').register(socket);
-        require('../api/mail_queue/mail_queue.socket').register(socket);
-        require('../api/mail_room/mail_room.socket').register(socket);
-        require('../api/mail_server_in/mail_server_in.socket').register(socket);
-        require('../api/mail_server_out/mail_server_out.socket').register(socket);
-        require('../api/template/template.socket').register(socket);
-        require('../api/metric/metric.socket').register(socket);
-        require('../api/module/module.socket').register(socket);
-        require('../api/motionbar/motionbar.socket').register(socket);
-        require('../api/report_agent/report_agent.socket').register(socket);
-        require('../api/report_member/report_member.socket').register(socket);
-        require('../api/report_call/report_call.socket').register(socket);
-        require('../api/report_dial/report_dial.socket').register(socket);
-        require('../api/report_chat/report_chat.socket').register(socket);
-        require('../api/report_chat_session/report_chat_session.socket').register(socket);
-        require('../api/report_integration/report_integration.socket').register(socket);
-        require('../api/report_sms/report_sms.socket').register(socket);
-        require('../api/report_mail/report_mail.socket').register(socket);
-        require('../api/report_mail_session/report_mail_session.socket').register(socket);
-        require('../api/report_sms_session/report_sms_session.socket').register(socket);
-        require('../api/report_queue/report_queue.socket').register(socket);
-        require('../api/report_square/report_square.socket').register(socket);
-        require('../api/report_square_detail/report_square_detail.socket').register(socket);
-        require('../api/report_tree/report_tree.socket').register(socket);
-        require('../api/salesforce_account/salesforce_account.socket').register(socket);
-        require('../api/salesforce_configuration/salesforce_configuration.socket').register(socket);
-        require('../api/salesforce_field/salesforce_field.socket').register(socket);
-        require('../api/setting/setting.socket').register(socket);
-        require('../api/sms_account/sms_account.socket').register(socket);
-        require('../api/sms_application/sms_application.socket').register(socket);
-        require('../api/sms_message/sms_message.socket').register(socket);
-        require('../api/sms_queue/sms_queue.socket').register(socket);
-        require('../api/sms_room/sms_room.socket').register(socket);
-        require('../api/square_odbc/square_odbc.socket').register(socket);
-        require('../api/square_project/square_project.socket').register(socket);
-        require('../api/square_recording/square_recording.socket').register(socket);
-        require('../api/sugarcrm_account/sugarcrm_account.socket').register(socket);
-        require('../api/sugarcrm_configuration/sugarcrm_configuration.socket').register(socket);
-        require('../api/sugarcrm_field/sugarcrm_field.socket').register(socket);
-        require('../api/tag/tag.socket').register(socket);
-        require('../api/team/team.socket').register(socket);
-        require('../api/trigger/trigger.socket').register(socket);
-        require('../api/trunk/trunk.socket').register(socket);
-        require('../api/user/user.socket').register(socket);
-        require('../api/sound/sound.socket').register(socket);
-        require('../api/user_has_chat_queue/user_has_chat_queue.socket').register(socket);
-        require('../api/user_has_chat_queue/user_has_chat_queue_permit.socket').register(socket);
-        require('../api/user_has_sms_queue/user_has_sms_queue.socket').register(socket);
-        require('../api/user_has_sms_queue/user_has_sms_queue_permit.socket').register(socket);
-        require('../api/user_has_chat_room/user_has_chat_room.socket').register(socket);
-        require('../api/user_has_fax_queue/user_has_fax_queue.socket').register(socket);
-        require('../api/user_has_fax_queue/user_has_fax_queue_permit.socket').register(socket);
-        require('../api/user_has_mail_queue/user_has_mail_queue.socket').register(socket);
-        require('../api/user_has_mail_queue/user_has_mail_queue_permit.socket').register(socket);
-        require('../api/user_has_team/user_has_team.socket').register(socket);
-        require('../api/user_has_voice_queue/user_has_voice_queue.socket').register(socket);
-        require('../api/user_has_voice_queue/user_has_voice_queue_permit.socket').register(socket);
-        require('../api/user_has_list/user_has_list.socket').register(socket);
-        require('../api/variable/variable.socket').register(socket);
-        require('../api/voice_context/voice_context.socket').register(socket);
-        require('../api/voice_extension/voice_extension.socket').register(socket);
-        require('../api/voice_musiconhold/voice_musiconhold.socket').register(socket);
-        require('../api/voice_queue/voice_queue.socket').register(socket);
-        require('../api/voice_recording/voice_recording.socket').register(socket);
-        require('../api/voice_voicemail/voice_voicemail.socket').register(socket);
-        require('../api/voice_voicemail_messages/voice_voicemail_messages.socket').register(socket);
-        require('../api/zendesk_account/zendesk_account.socket').register(socket);
-        require('../api/zendesk_configuration/zendesk_configuration.socket').register(socket);
-        require('../api/zendesk_field/zendesk_field.socket').register(socket);
-      })
-      .catch(function(err) {
-        console.error(err);
-      });
-  } else {
-    console.log('socket: no user found');
-  }
-
-  socket.on('info', function(data) {
-    console.info('[%s] %s', socket.address, JSON.stringify(data, null, 2));
-  });
-}
-
-module.exports = function(socketio, dashboardProcess) {
-  // socket.io (v1.x.x) is powered by debug.
-  // In order to see all the debug output, set DEBUG (in server/config/local.env.js) to including the desired scope.
-  //
-  // ex: DEBUG: "http*,socket.io:socket"
-
-  // We can authenticate socket.io users and access their token through socket.handshake.decoded_token
-  //
-  // 1. You will need to send the token in `client/components/socket/socket.service.js`
-  //
-  // 2. Require authentication here:
-
-  socketio.use(require('socketio-jwt').authorize({
-    secret: config.session.secret,
-    handshake: true
-  }));
-
-  socketio.on('connection', function(socket) {
-    // Call onDisconnect.
-    socket.on('disconnect', function() {
-      onDisconnect(socket);
-    });
-
-    // Call onConnect.
-    onConnect(socket, dashboardProcess);
-  });
-};
\ No newline at end of file
diff --git a/server/config/tools/channelSpy.js b/server/config/tools/channelSpy.js
index d46a052..ab2065d 100644
--- a/server/config/tools/channelSpy.js
+++ b/server/config/tools/channelSpy.js
@@ -1,109 +1 @@
-'use strict';
-
-var fs = require('fs');
-var util = require('util');
-var path = require('path');
-var config = require('../../config/environment');
-var ChanSpyModel = require('../../models').ChanSpy;
-var User = require('../../models').User;
-var VoiceExtension = require('../../models').VoiceExtension;
-var sequelize = require('../../models').sequelize;
-var Promise = require('bluebird');
-
-function ChanSpy() {
-  ChanSpyModel.afterCreate(function(doc, options) {
-    return Promise
-      .all([])
-      .then(createSpyExtensions(doc, options));
-  })
-  ChanSpyModel.afterUpdate(function(doc, options) {
-    return Promise
-      .all([])
-      .then(deleteSpyExtensions(doc, options))
-      .then(createSpyExtensions(doc, options));
-  })
-  ChanSpyModel.afterDelete(function(doc, options) {
-    return deleteSpyExtensions(doc, options);
-  })
-}
-
-function deleteSpyExtensions(doc, options) {
-  return VoiceExtension
-    .destroy({
-      where: {
-        ChanSpyId: doc.id
-      },
-      transaction: options.transaction
-    });
-}
-
-function createSpyExtensions(doc, options) {
-  return User
-    .scope('agent')
-    .findAll({
-      where: {
-        chanspy: true
-      }
-    })
-    .then(function(agents) {
-      var bulkSpies = [];
-      agents.forEach(function(elem) {
-        var spies = [];
-        var priority = 1;
-        if (doc.auth) {
-          spies.push({
-            context: 'from-sip',
-            exten: util.format('%s%s', doc.prefix, elem.name),
-            priority: priority,
-            app: 'Authenticate',
-            appdata: doc.password,
-            UserId: elem.id,
-            ChanSpyId: doc.id,
-            type: 'system'
-          });
-          priority++;
-        }
-        spies.push({
-          context: 'from-sip',
-          exten: util.format('%s%s', doc.prefix, elem.name),
-          priority: priority,
-          app: 'ChanSpy',
-          appdata: util.format('SIP/%s,%s', elem.name, doc.options),
-          UserId: elem.id,
-          ChanSpyId: doc.id,
-          type: 'system'
-        });
-        priority = 1;
-        if (doc.auth) {
-          spies.push({
-            context: 'from-sip',
-            exten: util.format('%s%s', doc.prefix, elem.internal),
-            priority: priority,
-            app: 'Authenticate',
-            appdata: doc.password,
-            UserId: elem.id,
-            ChanSpyId: doc.id,
-            type: 'system'
-          });
-          priority++;
-        }
-        spies.push({
-          context: 'from-sip',
-          exten: util.format('%s%s', doc.prefix, elem.internal),
-          priority: priority,
-          app: 'ChanSpy',
-          appdata: util.format('SIP/%s,%s', elem.name, doc.options),
-          UserId: elem.id,
-          ChanSpyId: doc.id,
-          type: 'system'
-        });
-        bulkSpies.push(VoiceExtension.bulkCreate(spies, {
-          transaction: options.transaction
-        }));
-      });
-      return bulkSpies;
-    })
-    .all();
-}
-
-module.exports = ChanSpy;
\ No newline at end of file
diff --git a/server/config/tools/chatRoom.js b/server/config/tools/chatRoom.js
index 69714fe..207c726 100644
--- a/server/config/tools/chatRoom.js
+++ b/server/config/tools/chatRoom.js
@@ -1,104 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var moment = require('moment');
-
-var ChatRoomModel = require('../../models').ChatRoom;
-var ChatVisitorModel = require('../../models').ChatVisitor;
-var ReportChatSessionModel = require('../../models').ReportChatSession;
-var ReportChatRoomModel = require('../../models').ReportChatRoom;
-
-function ChatRoom() {
-  ChatRoomModel.afterUpdate(function(doc) {
-    if (doc.changed('status') && doc.status === 'CLOSED') {
-      if (doc.ChatVisitorId) {
-        return ChatVisitorModel
-          .findById(doc.ChatVisitorId)
-          .then(function(chatVisitor) {
-            if (chatVisitor) {
-              var updated = _.merge(chatVisitor, {
-                status: 'served'
-              });
-              return updated.save();
-            }
-          })
-          .then(function() {
-            return ReportChatSessionModel
-              .update({
-                complete: true,
-                completeReason: doc.completeReason,
-                completeAt: moment().format("YYYY-MM-DD HH:mm:ss")
-              }, {
-                where: {
-                  roomid: doc.id,
-                  complete: false,
-                  abandon: false,
-                  timeout: false
-                },
-                individualHooks: true
-              });
-          })
-          .catch(function(err) {
-            console.log('Error:', err);
-          });
-      }
-    }
-
-    if (doc.changed('status') && doc.status === 'UNMANAGED') {
-      if (doc.ChatVisitorId) {
-        return ChatVisitorModel
-          .findById(doc.ChatVisitorId)
-          .then(function(chatVisitor) {
-            if (chatVisitor) {
-              return chatVisitor
-                .update({
-                  status: 'unserved'
-                });
-            }
-          })
-          .catch(function(err) {
-            console.log('Error:', err);
-          });
-      }
-    }
-
-    if (doc.changed('status') && doc.status === 'ABANDON') {
-      if (doc.ChatVisitorId) {
-        return ChatVisitorModel
-          .findById(doc.ChatVisitorId)
-          .then(function(chatVisitor) {
-            if (chatVisitor) {
-              return chatVisitor
-                .update({
-                  status: 'abandon'
-                });
-            }
-          })
-          .catch(function(err) {
-            console.log('Error:', err);
-          });
-      }
-    }
-
-    if (doc.changed('rating')) {
-      if (doc.id) {
-        return ReportChatRoomModel
-          .update({
-            crating: doc.rating,
-            cratingMessage: doc.ratingMessage
-          }, {
-            where: {
-              roomid: doc.id
-            },
-            individualHooks: true
-          })
-          .catch(function(err) {
-            console.log('Error:', err);
-          });
-      }
-    }
-
-  })
-}
-
-module.exports = ChatRoom;
\ No newline at end of file
diff --git a/server/config/tools/dashboard.js b/server/config/tools/dashboard.js
index 849d844..db9bf0c 100644
--- a/server/config/tools/dashboard.js
+++ b/server/config/tools/dashboard.js
@@ -1,1248 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-var sequelize = require('../../models').sequelize;
-var models = require('../../models');
-var Util = require('../../config/util');
-var _ = require('lodash');
-var moment = require('moment');
-var Promise = require('bluebird');
-
-exports.register = function(socket) {
-
-  models.ReportMailSession.afterCreate(function(doc) {
-    updateMail(doc);
-  });
-
-  models.ReportMailSession.afterUpdate(function(doc) {
-    updateMail(doc);
-  });
-
-  models.MailRoom.afterCreate(function(doc) {
-    updateMail(doc);
-  });
-
-  models.MailRoom.afterUpdate(function(doc) {
-    updateMail(doc);
-  });
-
-  function updateMail(doc) {
-    onNewMail(socket, doc);
-    onOpenMail(socket, doc);
-    onClosedMail(socket, doc);
-    onTimeoutMail(socket, doc);
-    onPendingMail(socket, doc);
-    onWaitingMail(socket, doc);
-  }
-
-  models.ReportChatSession.afterCreate(function(doc) {
-    updateChat(doc);
-  });
-
-  models.ReportChatSession.afterUpdate(function(doc) {
-    updateChat(doc);
-  });
-
-  models.ChatRoom.afterCreate(function(doc) {
-    updateChat(doc);
-  });
-
-  models.ChatRoom.afterUpdate(function(doc) {
-    updateChat(doc);
-  });
-
-  function updateChat(doc) {
-    onNewChat(socket, doc);
-    onOpenChat(socket, doc);
-    onClosedChat(socket, doc);
-    onTimeoutChat(socket, doc);
-    onAbandonedChat(socket, doc);
-    onUnmanagedChat(socket, doc);
-  }
-
-  models.ReportFaxSession.afterCreate(function(doc) {
-    updateFax(doc);
-  });
-
-  models.ReportFaxSession.afterUpdate(function(doc) {
-    updateFax(doc);
-  });
-
-  models.FaxRoom.afterCreate(function(doc) {
-    updateFax(doc);
-  });
-
-  models.FaxRoom.afterUpdate(function(doc) {
-    updateFax(doc);
-  });
-
-  function updateFax(doc) {
-    onNewFax(socket, doc);
-    onOpenFax(socket, doc);
-    onClosedFax(socket, doc);
-    onTimeoutFax(socket, doc);
-    onPendingFax(socket, doc);
-    onWaitingFax(socket, doc);
-  }
-
-  models.ReportSmsSession.afterCreate(function(doc) {
-    updateSms(doc);
-  });
-
-  models.ReportSmsSession.afterUpdate(function(doc) {
-    updateSms(doc);
-  });
-
-  models.SmsRoom.afterCreate(function(doc) {
-    updateSms(doc);
-  });
-
-  models.SmsRoom.afterUpdate(function(doc) {
-    updateSms(doc);
-  });
-
-  function updateSms(doc) {
-    onNewSms(socket, doc);
-    onOpenSms(socket, doc);
-    onClosedSms(socket, doc);
-    onTimeoutSms(socket, doc);
-    onPendingSms(socket, doc);
-    onWaitingSms(socket, doc);
-  }
-
-  models.ReportOpenchannelSession.afterCreate(function(doc) {
-    updateOpenchannel(doc);
-  });
-
-  models.ReportOpenchannelSession.afterUpdate(function(doc) {
-    updateOpenchannel(doc);
-  });
-
-  models.OpenchannelRoom.afterCreate(function(doc) {
-    updateOpenchannel(doc);
-  });
-
-  models.OpenchannelRoom.afterUpdate(function(doc) {
-    updateOpenchannel(doc);
-  });
-
-  function updateOpenchannel(doc) {
-    onNewOpenchannel(socket, doc);
-    onOpenOpenchannel(socket, doc);
-    onClosedOpenchannel(socket, doc);
-    onTimeoutOpenchannel(socket, doc);
-    onPendingOpenchannel(socket, doc);
-    onWaitingOpenchannel(socket, doc);
-  }
-}
-
-function getMailQueues(user, room) {
-  return function() {
-    switch (user.role) {
-      case 'user':
-        return models.User
-          .findById(user.id, {
-            attributes: ['id']
-          })
-          .then(Util.getMailQueuesIdByUser({}, {
-            attributes: ['id'],
-            include: [{
-              raw: true,
-              model: models.User,
-              attributes: ['id']
-            }]
-          }))
-          .then(function(userQueues) {
-            if (room) {
-              return {
-                include: {
-                  model: models.MailAccount,
-                  include: {
-                    model: models.MailApplication,
-                    include: {
-                      model: models.MailQueue,
-                      where: {
-                        id: _.map(userQueues, 'id')
-                      }
-                    }
-                  }
-                }
-              };
-            } else {
-              var users = [];
-              userQueues.rows.forEach(function(queue) {
-                users = _.union(users, _.map(queue.Users, 'id'));
-              });
-              return {
-                where: {
-                  $or: {
-                    queue: _.map(userQueues.rows, 'id'),
-                    memberid: users
-                  }
-                }
-              };
-            }
-          });
-      case 'agent':
-        return models.User
-          .findById(user.id, {
-            attributes: ['id']
-          })
-          .then(function(agent) {
-            return agent
-              .getMailQueues({
-                attributes: ['id']
-              });
-          })
-          .then(function(userQueues) {
-            return {
-              where: {
-                $or: {
-                  queue: _.map(userQueues, 'id'),
-                  memberid: user.id
-                }
-              }
-            };
-          });
-      default:
-        return {};
-    }
-  }
-}
-
-function getChatQueues(user, room) {
-  return function() {
-    switch (user.role) {
-      case 'user':
-        return models.User
-          .findById(user.id, {
-            attributes: ['id']
-          })
-          .then(Util.getChatQueuesIdByUser({}, {
-            attributes: ['id'],
-            include: [{
-              raw: true,
-              model: models.User,
-              attributes: ['id']
-            }]
-          }))
-          .then(function(userQueues) {
-            if (room) {
-              return {
-                include: {
-                  model: models.ChatWebsite,
-                  include: {
-                    model: models.ChatApplication,
-                    include: {
-                      model: models.ChatQueue,
-                      where: {
-                        id: _.map(userQueues, 'id')
-                      }
-                    }
-                  }
-                }
-              };
-            } else {
-              var users = [];
-              userQueues.rows.forEach(function(queue) {
-                users = _.union(users, _.map(queue.Users, 'id'));
-              });
-              return {
-                where: {
-                  $or: {
-                    queue: _.map(userQueues.rows, 'id'),
-                    memberid: users
-                  }
-                }
-              };
-            }
-          });
-      case 'agent':
-        return models.User
-          .findById(user.id, {
-            attributes: ['id']
-          })
-          .then(function(agent) {
-            return agent
-              .getChatQueues({
-                attributes: ['id']
-              });
-          })
-          .then(function(userQueues) {
-            return {
-              where: {
-                $or: {
-                  queue: _.map(userQueues, 'id'),
-                  memberid: user.id
-                }
-              }
-            };
-          });
-      default:
-        return {};
-    }
-  }
-}
-
-function getFaxQueues(user, room) {
-  return function() {
-    switch (user.role) {
-      case 'user':
-        return models.User
-          .findById(user.id, {
-            attributes: ['id']
-          })
-          .then(Util.getFaxQueuesIdByUser({}, {
-            attributes: ['id'],
-            include: [{
-              raw: true,
-              model: models.User,
-              attributes: ['id']
-            }]
-          }))
-          .then(function(userQueues) {
-            if (room) {
-              return {
-                include: {
-                  model: models.FaxAccount,
-                  include: {
-                    model: models.FaxApplication,
-                    include: {
-                      model: models.FaxQueue,
-                      where: {
-                        id: _.map(userQueues, 'id')
-                      }
-                    }
-                  }
-                }
-              };
-            } else {
-              var users = [];
-              userQueues.rows.forEach(function(queue) {
-                users = _.union(users, _.map(queue.Users, 'id'));
-              });
-              return {
-                where: {
-                  $or: {
-                    queue: _.map(userQueues.rows, 'id'),
-                    memberid: users
-                  }
-                }
-              };
-            }
-          });
-      case 'agent':
-        return models.User
-          .findById(user.id, {
-            attributes: ['id']
-          })
-          .then(function(agent) {
-            return agent
-              .getFaxQueues({
-                attributes: ['id']
-              });
-          })
-          .then(function(userQueues) {
-            return {
-              where: {
-                $or: {
-                  queue: _.map(userQueues, 'id'),
-                  memberid: user.id
-                }
-              }
-            };
-          });
-      default:
-        return {};
-    }
-  }
-}
-
-function getSmsQueues(user, room) {
-  return function() {
-    switch (user.role) {
-      case 'user':
-        return models.User
-          .findById(user.id, {
-            attributes: ['id']
-          })
-          .then(Util.getSmsQueuesIdByUser({}, {
-            attributes: ['id'],
-            include: [{
-              raw: true,
-              model: models.User,
-              attributes: ['id']
-            }]
-          }))
-          .then(function(userQueues) {
-            if (room) {
-              return {
-                include: {
-                  model: models.SmsAccount,
-                  include: {
-                    model: models.SmsApplication,
-                    include: {
-                      model: models.SmsQueue,
-                      where: {
-                        id: _.map(userQueues, 'id')
-                      }
-                    }
-                  }
-                }
-              };
-            } else {
-              var users = [];
-              userQueues.rows.forEach(function(queue) {
-                users = _.union(users, _.map(queue.Users, 'id'));
-              });
-              return {
-                where: {
-                  $or: {
-                    queue: _.map(userQueues.rows, 'id'),
-                    memberid: users
-                  }
-                }
-              };
-            }
-          });
-      case 'agent':
-        return models.User
-          .findById(user.id, {
-            attributes: ['id']
-          })
-          .then(function(agent) {
-            return agent
-              .getSmsQueues({
-                attributes: ['id']
-              });
-          })
-          .then(function(userQueues) {
-            return {
-              where: {
-                $or: {
-                  queue: _.map(userQueues, 'id'),
-                  memberid: user.id
-                }
-              }
-            };
-          });
-      default:
-        return {};
-    }
-  }
-}
-
-function getOpenchannelQueues(user, room) {
-  return function() {
-    switch (user.role) {
-      case 'user':
-        return models.User
-          .findById(user.id, {
-            attributes: ['id']
-          })
-          .then(Util.getOpenchannelQueuesIdByUser({}, {
-            attributes: ['id'],
-            include: [{
-              raw: true,
-              model: models.User,
-              attributes: ['id']
-            }]
-          }))
-          .then(function(userQueues) {
-            if (room) {
-              return {
-                include: {
-                  model: models.OpenchannelAccount,
-                  include: {
-                    model: models.OpenchannelApplication,
-                    include: {
-                      model: models.OpenchannelQueue,
-                      where: {
-                        id: _.map(userQueues, 'id')
-                      }
-                    }
-                  }
-                }
-              };
-            } else {
-              var users = [];
-              userQueues.rows.forEach(function(queue) {
-                users = _.union(users, _.map(queue.Users, 'id'));
-              });
-              return {
-                where: {
-                  $or: {
-                    queue: _.map(userQueues.rows, 'id'),
-                    memberid: users
-                  }
-                }
-              };
-            }
-          });
-      case 'agent':
-        return models.User
-          .findById(user.id, {
-            attributes: ['id']
-          })
-          .then(function(agent) {
-            return agent
-              .getOpenchannelQueues({
-                attributes: ['id']
-              });
-          })
-          .then(function(userQueues) {
-            return {
-              where: {
-                $or: {
-                  queue: _.map(userQueues, 'id'),
-                  memberid: user.id
-                }
-              }
-            };
-          });
-      default:
-        return {};
-    }
-  }
-}
-
-
-// Get Open mails
-function onOpenMail(socket, doc) {
-  return Promise
-    .all([])
-    .then(getMailQueues(socket, true))
-    .then(function(condition) {
-      return models.MailRoom
-        .count(_.merge({
-          where: {
-            status: 'OPEN',
-            updatedAt: {
-              $gte: moment().startOf('day')
-            }
-          }
-        }, condition));
-    })
-    .then(function(data) {
-      socket.emit('report_mail_dashboard:open', {
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
-
-// Get closed mails
-function onClosedMail(socket, doc) {
-  return Promise
-    .all([])
-    .then(getMailQueues(socket, true))
-    .then(function(condition) {
-      return models.MailRoom
-        .count(_.merge({
-          where: {
-            status: 'CLOSED',
-            updatedAt: {
-              $gte: moment().startOf('day')
-            }
-          }
-        }, condition));
-    })
-    .then(function(data) {
-      socket.emit('report_mail_dashboard:closed', {
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
-
-// Get new mails
-function onNewMail(socket, doc) {
-  return Promise
-    .all([])
-    .then(getMailQueues(socket, true))
-    .then(function(condition) {
-      return models.MailRoom
-        .count(_.merge({
-          where: {
-            status: 'NEW',
-            updatedAt: {
-              $gte: moment().startOf('day')
-            }
-          }
-        }, condition));
-    })
-    .then(function(data) {
-      socket.emit('report_mail_dashboard:new', {
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
-
-// Get new mails
-function onWaitingMail(socket, doc) {
-  return Promise
-    .all([])
-    .then(getMailQueues(socket))
-    .then(function(condition) {
-      return models.ReportMailSession
-        .count(_.merge({
-          where: {
-            leaveAt: null
-          }
-        }, condition));
-    })
-    .then(function(data) {
-      socket.emit('report_mail_dashboard:waiting', {
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
-
-// Get timeout mails
-function onTimeoutMail(socket, doc) {
-  return Promise
-    .all([])
-    .then(getMailQueues(socket))
-    .then(function(condition) {
-      return models.ReportMailSession
-        .count(_.merge({
-          where: {
-            timeout: true
-          }
-        }, condition));
-    })
-    .then(function(data) {
-      socket.emit('report_mail_dashboard:timeout', {
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
-
-function onPendingMail(socket, doc) {
-  return Promise
-    .all([])
-    .then(getMailQueues(socket, true))
-    .then(function(condition) {
-      return models.MailRoom
-        .count(_.merge({
-          where: {
-            status: 'PENDING',
-            updatedAt: {
-              $gte: moment().startOf('day')
-            }
-          }
-        }, condition));
-    })
-    .then(function(data) {
-      socket.emit('report_mail_dashboard:pending', {
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
-
-// Get Open chat
-function onOpenChat(socket, doc) {
-  return Promise
-    .all([])
-    .then(getChatQueues(socket, true))
-    .then(function(condition) {
-      return models.ReportChatSession
-        .count(_.merge({
-          where: {
-            leaveAt: {
-              $ne: null
-            },
-            complete: null,
-            timeout: null
-          }
-        }, condition));
-    })
-    .then(function(data) {
-      socket.emit('report_chat_dashboard:open', {
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
-
-// Get closed chat
-function onClosedChat(socket, doc) {
-  return Promise
-    .all([])
-    .then(getChatQueues(socket))
-    .then(function(condition) {
-      return models.ReportChatSession
-        .count(_.merge({
-          where: {
-            complete: true
-          }
-        }, condition));
-    })
-    .then(function(data) {
-      socket.emit('report_chat_dashboard:closed', {
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
-
-// Get new chat
-function onNewChat(socket, doc) {
-  return Promise
-    .all([])
-    .then(getChatQueues(socket))
-    .then(function(condition) {
-      return models.ReportChatSession
-        .count(_.merge({
-          where: {
-            leaveAt: null
-          }
-        }, condition));
-    })
-    .then(function(data) {
-      socket.emit('report_chat_dashboard:new', {
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
-
-// Get timeout chat
-function onTimeoutChat(socket, doc) {
-  return Promise
-    .all([])
-    .then(getChatQueues(socket))
-    .then(function(condition) {
-      return models.ReportChatSession
-        .count(_.merge({
-          where: {
-            timeout: true
-          }
-        }, condition));
-    })
-    .then(function(data) {
-      socket.emit('report_chat_dashboard:timeout', {
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
-
-// Get abandoned chat
-function onAbandonedChat(socket, doc) {
-  return Promise
-    .all([])
-    .then(getChatQueues(socket))
-    .then(function(condition) {
-      return models.ReportChatSession
-        .count(_.merge({
-          where: {
-            abandon: true
-          }
-        }, condition));
-    })
-    .then(function(data) {
-      socket.emit('report_chat_dashboard:abandoned', {
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
-
-function onUnmanagedChat(socket, doc) {
-  return Promise
-    .all([])
-    .then(getChatQueues(socket, true))
-    .then(function(condition) {
-      return models.ChatRoom
-        .count(_.merge({
-          where: {
-            status: 'UNMANAGED',
-            updatedAt: {
-              $gte: moment().startOf('day')
-            }
-          }
-        }, condition));
-    })
-    .then(function(data) {
-      socket.emit('report_chat_dashboard:unmanaged', {
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
-
-// Get Open fax
-function onOpenFax(socket, doc) {
-  return Promise
-    .all([])
-    .then(getFaxQueues(socket, true))
-    .then(function(condition) {
-      return models.FaxRoom
-        .count(_.merge({
-          where: {
-            status: 'OPEN',
-            updatedAt: {
-              $gte: moment().startOf('day')
-            }
-          }
-        }, condition));
-    })
-    .then(function(data) {
-      socket.emit('report_fax_dashboard:open', {
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
-
-// Get closed fax
-function onClosedFax(socket, doc) {
-  return Promise
-    .all([])
-    .then(getFaxQueues(socket, true))
-    .then(function(condition) {
-      return models.FaxRoom
-        .count(_.merge({
-          where: {
-            status: 'CLOSED',
-            updatedAt: {
-              $gte: moment().startOf('day')
-            }
-          }
-        }, condition));
-    })
-    .then(function(data) {
-      socket.emit('report_fax_dashboard:closed', {
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
-
-// Get new fax
-function onNewFax(socket, doc) {
-  return Promise
-    .all([])
-    .then(getFaxQueues(socket, true))
-    .then(function(condition) {
-      return models.FaxRoom
-        .count(_.merge({
-          where: {
-            status: 'NEW',
-            updatedAt: {
-              $gte: moment().startOf('day')
-            }
-          }
-        }, condition));
-    })
-    .then(function(data) {
-      socket.emit('report_fax_dashboard:new', {
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
-
-// Get timeout fax
-function onTimeoutFax(socket, doc) {
-  return Promise
-    .all([])
-    .then(getFaxQueues(socket))
-    .then(function(condition) {
-      return models.ReportFaxSession
-        .count(_.merge({
-          where: {
-            timeout: true
-          }
-        }, condition));
-    })
-    .then(function(data) {
-      socket.emit('report_fax_dashboard:timeout', {
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
-
-function onPendingFax(socket, doc) {
-  return Promise
-    .all([])
-    .then(getFaxQueues(socket, true))
-    .then(function(condition) {
-      return models.FaxRoom
-        .count(_.merge({
-          where: {
-            status: 'PENDING',
-            updatedAt: {
-              $gte: moment().startOf('day')
-            }
-          }
-        }, condition));
-    })
-    .then(function(data) {
-      socket.emit('report_fax_dashboard:pending', {
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
-
-function onWaitingFax(socket, doc) {
-  return Promise
-    .all([])
-    .then(getFaxQueues(socket, true))
-    .then(function(condition) {
-      return models.ReportFaxSession
-        .count(_.merge({
-          where: {
-            leaveAt: true
-          }
-        }, condition));
-    })
-    .then(function(data) {
-      socket.emit('report_fax_dashboard:waiting', {
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
-
-// Get Open sms
-function onOpenSms(socket, doc) {
-  return Promise
-    .all([])
-    .then(getSmsQueues(socket, true))
-    .then(function(condition) {
-      return models.SmsRoom
-        .count(_.merge({
-          where: {
-            status: 'OPEN',
-            updatedAt: {
-              $gte: moment().startOf('day')
-            }
-          }
-        }, condition));
-    })
-    .then(function(data) {
-      socket.emit('report_sms_dashboard:open', {
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
-
-// Get closed sms
-function onClosedSms(socket, doc) {
-  return Promise
-    .all([])
-    .then(getSmsQueues(socket, true))
-    .then(function(condition) {
-      return models.SmsRoom
-        .count(_.merge({
-          where: {
-            status: 'CLOSED',
-            updatedAt: {
-              $gte: moment().startOf('day')
-            }
-          }
-        }, condition));
-    })
-    .then(function(data) {
-      socket.emit('report_sms_dashboard:closed', {
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
-
-// Get new sms
-function onNewSms(socket, doc) {
-  return Promise
-    .all([])
-    .then(getSmsQueues(socket, true))
-    .then(function(condition) {
-      return models.SmsRoom
-        .count(_.merge({
-          where: {
-            status: 'NEW',
-            updatedAt: {
-              $gte: moment().startOf('day')
-            }
-          }
-        }, condition));
-    })
-    .then(function(data) {
-      socket.emit('report_sms_dashboard:new', {
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
-
-// Get timeout sms
-function onTimeoutSms(socket, doc) {
-  return Promise
-    .all([])
-    .then(getSmsQueues(socket))
-    .then(function(condition) {
-      return models.ReportSmsSession
-        .count(_.merge({
-          where: {
-            timeout: true
-          }
-        }, condition));
-    })
-    .then(function(data) {
-      socket.emit('report_sms_dashboard:timeout', {
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
-
-function onPendingSms(socket, doc) {
-  return Promise
-    .all([])
-    .then(getSmsQueues(socket, true))
-    .then(function(condition) {
-      return models.SmsRoom
-        .count(_.merge({
-          where: {
-            status: 'PENDING',
-            updatedAt: {
-              $gte: moment().startOf('day')
-            }
-          }
-        }, condition));
-    })
-    .then(function(data) {
-      socket.emit('report_sms_dashboard:pending', {
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
-
-function onWaitingSms(socket, doc) {
-  return Promise
-    .all([])
-    .then(getSmsQueues(socket))
-    .then(function(condition) {
-      return models.ReportSmsSession
-        .count(_.merge({
-          where: {
-            leaveAt: null
-          }
-        }, condition));
-    })
-    .then(function(data) {
-      socket.emit('report_sms_dashboard:pending', {
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
-
-// Get Open openchannel
-function onOpenOpenchannel(socket, doc) {
-  return Promise
-    .all([])
-    .then(getOpenchannelQueues(socket, true))
-    .then(function(condition) {
-      return models.OpenchannelRoom
-        .count(_.merge({
-          where: {
-            status: 'OPEN',
-            updatedAt: {
-              $gte: moment().startOf('day')
-            }
-          }
-        }, condition));
-    })
-    .then(function(data) {
-      socket.emit('report_openchannel_dashboard:open', {
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
-
-// Get closed openchannel
-function onClosedOpenchannel(socket, doc) {
-  return Promise
-    .all([])
-    .then(getOpenchannelQueues(socket, true))
-    .then(function(condition) {
-      return models.OpenchannelRoom
-        .count(_.merge({
-          where: {
-            status: 'CLOSED',
-            updatedAt: {
-              $gte: moment().startOf('day')
-            }
-          }
-        }, condition));
-    })
-    .then(function(data) {
-      socket.emit('report_openchannel_dashboard:closed', {
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
-
-// Get new openchannel
-function onNewOpenchannel(socket, doc) {
-  return Promise
-    .all([])
-    .then(getOpenchannelQueues(socket, true))
-    .then(function(condition) {
-      return models.OpenchannelRoom
-        .count(_.merge({
-          where: {
-            status: 'NEW',
-            updatedAt: {
-              $gte: moment().startOf('day')
-            }
-          }
-        }, condition));
-    })
-    .then(function(data) {
-      socket.emit('report_openchannel_dashboard:new', {
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
-
-// Get timeout openchannel
-function onTimeoutOpenchannel(socket, doc) {
-  return Promise
-    .all([])
-    .then(getOpenchannelQueues(socket))
-    .then(function(condition) {
-      return models.ReportOpenchannelSession
-        .count(_.merge({
-          where: {
-            timeout: true
-          }
-        }, condition));
-    })
-    .then(function(data) {
-      socket.emit('report_openchannel_dashboard:timeout', {
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
-
-function onPendingOpenchannel(socket, doc) {
-  return Promise
-    .all([])
-    .then(getOpenchannelQueues(socket, true))
-    .then(function(condition) {
-      return models.OpenchannelRoom
-        .count(_.merge({
-          where: {
-            status: 'PENDING',
-            updatedAt: {
-              $gte: moment().startOf('day')
-            }
-          }
-        }, condition));
-    })
-    .then(function(data) {
-      socket.emit('report_openchannel_dashboard:pending', {
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
-
-function onWaitingOpenchannel(socket, doc) {
-  return Promise
-    .all([])
-    .then(getOpenchannelQueues(socket))
-    .then(function(condition) {
-      return models.ReportOpenchannelSession
-        .count(_.merge({
-          where: {
-            leaveAt: null
-          }
-        }, condition));
-    })
-    .then(function(data) {
-      socket.emit('report_openchannel_dashboard:pending', {
-        value: data
-      });
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
\ No newline at end of file
diff --git a/server/config/tools/faxAccount.js b/server/config/tools/faxAccount.js
index ccc342d..df97d64 100644
--- a/server/config/tools/faxAccount.js
+++ b/server/config/tools/faxAccount.js
@@ -1,257 +1 @@
-'use strict';
-
-var util = require('util');
-
-var VoiceExtension = require('../../models').VoiceExtension;
-var FaxAccountModel = require('../../models').FaxAccount;
-var sequelize = require('../../models').sequelize;
-var veUtil = require('../../utils/voice_extension');
-var Promise = require('bluebird');
-
-function FaxAccount() {
-
-  FaxAccountModel.afterCreate(function(doc, options) {
-    var _exten = util.format('_%s', doc.localstationid);
-    var _accountId = doc.id;
-    var _description = util.format("Generated by Fax Channel - Account: %s", doc.name);
-
-    var body = generateExtensionArray(doc);
-    var _route;
-
-    return VoiceExtension
-      .create(body, {
-        transaction: options.transaction
-      })
-      .then(function(route) {
-        _route = route;
-        return route;
-      })
-      .then(veUtil.createApps(body.Applications, options.transaction));
-  });
-
-  FaxAccountModel.afterUpdate(function(doc, options) {
-    var _exten = util.format('_%s', doc.localstationid);
-    var _accountId = doc.id;
-    var _description = util.format("Generated by Fax Channel - Account: %s", doc.name);
-
-    return VoiceExtension
-      .findOne({
-        where: {
-          FaxAccountId: doc.id
-        }
-      })
-      .then(function(voiceExtension) {
-        if (!voiceExtension) {
-          return;
-        }
-        var req = {
-          params: {
-            id: voiceExtension.id
-          },
-          body: generateExtensionArray(doc)
-        };
-        return veUtil.routeUpdate(req, options.transaction);
-      });
-
-  });
-
-  FaxAccountModel.afterDelete(function(doc, options) {
-    return deleteVoiceExtensions(doc, options);
-  });
-
-}
-
-function generateExtensionArray(doc) {
-  var _exten = util.format('_%s', doc.localstationid);
-  var _accountId = doc.id;
-  var _description = util.format("Generated by Fax Channel - Account: %s", doc.name);
-
-  return {
-    "appdata": "Inbound Call",
-    "context": "from-voip-provider",
-    "exten": _exten,
-    "priority": "1",
-    "tag": "--",
-    "app": "NoOp",
-    "type": "inbound",
-    "description": _description,
-    "interval": null,
-    "IntervalId": null,
-    "isApp": false,
-    "record": false,
-    "FaxAccountId": _accountId,
-    "Applications": [{
-      "appdata": [
-        "Incoming fax from ${CALLERID(num)}"
-      ],
-      "app": "NoOp",
-      "interval": "*,*,*,*",
-      "IntervalId": null,
-      "callerID": null,
-      "type": "inbound",
-      "appType": "custom"
-    }, {
-      "appdata": [
-        util.format('Account %s', doc.name)
-      ],
-      "app": "NoOp",
-      "interval": "*,*,*,*",
-      "IntervalId": null,
-      "callerID": null,
-      "type": "inbound",
-      "appType": "custom"
-    }, {
-      "appdata": [
-        "CDR(type)=inbound-fax"
-      ],
-      "app": "Set",
-      "interval": "*,*,*,*",
-      "IntervalId": null,
-      "callerID": null,
-      "type": "inbound",
-      "appType": null
-    }, {
-      "appdata": [
-        ""
-      ],
-      "app": "Answer",
-      "interval": "*,*,*,*",
-      "IntervalId": null,
-      "callerID": null,
-      "type": "inbound",
-      "appType": "custom"
-    }, {
-      "appdata": [
-        "2"
-      ],
-      "app": "Wait",
-      "interval": "*,*,*,*",
-      "IntervalId": null,
-      "callerID": null,
-      "type": "inbound",
-      "appType": "custom"
-    }, {
-      "appdata": [
-        util.format('FAXOPT(ecm)=%s', doc.ecm)
-      ],
-      "app": "Set",
-      "interval": "*,*,*,*",
-      "IntervalId": null,
-      "callerID": null,
-      "type": "inbound",
-      "appType": null
-    }, {
-      "appdata": [
-        util.format('FAXOPT(headerinfo)=%s', doc.headerinfo)
-      ],
-      "app": "Set",
-      "interval": "*,*,*,*",
-      "IntervalId": null,
-      "callerID": null,
-      "type": "inbound",
-      "appType": null
-    }, {
-      "appdata": [
-        util.format('FAXOPT(localstationid)=%s', doc.localstationid)
-      ],
-      "app": "Set",
-      "interval": "*,*,*,*",
-      "IntervalId": null,
-      "callerID": null,
-      "type": "inbound",
-      "appType": null
-    }, {
-      "appdata": [
-        util.format('FAXOPT(minrate)=%s', doc.minrate)
-      ],
-      "app": "Set",
-      "interval": "*,*,*,*",
-      "IntervalId": null,
-      "callerID": null,
-      "type": "inbound",
-      "appType": null
-    }, {
-      "appdata": [
-        util.format('FAXOPT(maxrate)=%s', doc.maxrate)
-      ],
-      "app": "Set",
-      "interval": "*,*,*,*",
-      "IntervalId": null,
-      "callerID": null,
-      "type": "inbound",
-      "appType": null
-    }, {
-      "appdata": [
-        util.format('FAXOPT(modem)=%s', doc.modem)
-      ],
-      "app": "Set",
-      "interval": "*,*,*,*",
-      "IntervalId": null,
-      "callerID": null,
-      "type": "inbound",
-      "appType": null
-    }, {
-      "appdata": [
-        util.format('FAXOPT(gateway)=%s', doc.gateway)
-      ],
-      "app": "Set",
-      "interval": "*,*,*,*",
-      "IntervalId": null,
-      "callerID": null,
-      "type": "inbound",
-      "appType": null
-    }, {
-      "appdata": [
-        util.format('FAXOPT(t38timeout)=%s', doc.t38timeout)
-      ],
-      "app": "Set",
-      "interval": "*,*,*,*",
-      "IntervalId": null,
-      "callerID": null,
-      "type": "inbound",
-      "appType": null
-    }, {
-      "appdata": [
-        util.format('FAXOPT(faxdetect)=%s', doc.faxdetect)
-      ],
-      "app": "Set",
-      "interval": "*,*,*,*",
-      "IntervalId": null,
-      "callerID": null,
-      "type": "inbound",
-      "appType": null
-    }, {
-      "appdata": [
-        '/var/opt/motion/server/files/fax/inbound/original/fax-${STRFTIME(${EPOCH},,%Y%m%d-%H%M%S)}.tif'
-      ],
-      "app": "ReceiveFAX",
-      "interval": "*,*,*,*",
-      "IntervalId": null,
-      "callerID": null,
-      "type": "inbound",
-      "appType": "custom"
-    }, {
-      "appdata": [
-        ""
-      ],
-      "app": "Hangup",
-      "interval": "*,*,*,*",
-      "IntervalId": null,
-      "callerID": null,
-      "type": "inbound",
-      "appType": null
-    }]
-  };
-}
-
-function deleteVoiceExtensions(doc, options) {
-  return VoiceExtension
-    .destroy({
-      where: {
-        FaxAccountId: doc.id
-      },
-      transaction: options.transaction
-    });
-}
-
-module.exports = FaxAccount;
\ No newline at end of file
diff --git a/server/config/tools/faxRoom.js b/server/config/tools/faxRoom.js
index 3c52a65..bb8ce1f 100644
--- a/server/config/tools/faxRoom.js
+++ b/server/config/tools/faxRoom.js
@@ -1,35 +1 @@
-'use strict';
-
-const _ = require('lodash');
-const moment = require('moment');
-
-const Room = require('../../models').FaxRoom;
-const Status = require('../../models').FaxRoomStatus;
-
-function FaxRoom() {
-  Room.afterCreate(function(doc, opt) {
-    return Status
-      .create({
-        status: doc.status,
-        data1: opt.user ? opt.user.name : null,
-        data2: opt.user ? opt.user.fullname : null,
-        FaxRoomId: doc.id,
-        UserId: opt.user ? opt.user.id : null
-      });
-  });
-
-  Room.afterUpdate(function(doc, opt) {
-    if (doc.changed('status') || doc.changed('openReason')) {
-      return Status
-        .create({
-          status: doc.status,
-          data1: opt.user ? opt.user.name : null,
-          data2: opt.user ? opt.user.fullname : null,
-          FaxRoomId: doc.id,
-          UserId: opt.user ? opt.user.id : null
-        });
-    }
-  });
-}
-
-module.exports = FaxRoom;
\ No newline at end of file
diff --git a/server/config/tools/index.js b/server/config/tools/index.js
index f9c1659..a5ff6cd 100644
--- a/server/config/tools/index.js
+++ b/server/config/tools/index.js
@@ -1,26 +1 @@
-'use strict';
-
-var Interval = require('./interval');
-var User = require('./user');
-var ChanSpy = require('./channelSpy');
-var MailRoom = require('./mailRoom');
-var MailAccount = require('./mailAccount');
-var ChatRoom = require('./chatRoom');
-var FaxRoom = require('./faxRoom');
-var SmsRoom = require('./smsRoom');
-var OpenchannelRoom = require('./openchannelRoom');
-var FaxAccount = require('./faxAccount');
-
-module.exports = function() {
-  // Tools Mangament
-  new Interval();
-  new User();
-  new ChanSpy();
-  new MailRoom();
-  new MailAccount();
-  new ChatRoom();
-  new FaxRoom();
-  new SmsRoom();
-  new FaxAccount();
-  new OpenchannelRoom();
-}
\ No newline at end of file
diff --git a/server/config/tools/interval.js b/server/config/tools/interval.js
index 223b7bf..a334ef0 100644
--- a/server/config/tools/interval.js
+++ b/server/config/tools/interval.js
@@ -1,74 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var util = require('util');
-var IntervalModel = require('../../models').Interval;
-var VoiceExtension = require('../../models').VoiceExtension;
-var veUtil = require('../../utils/voice_extension');
-var sequelize = require('../../models').sequelize;
-var Applications = veUtil.Applications;
-
-function Interval() {
-  console.log('Interval Initialization..');
-  IntervalModel.afterUpdate(function(interval) {
-    updatevoiceExtension(interval);
-  })
-
-  IntervalModel.beforeDestroy(function(interval) {
-    if (interval.IntervalId !== null) {
-      updatevoiceExtension(interval);
-    }
-  })
-
-  IntervalModel.afterCreate(function(interval) {
-    if (interval.IntervalId !== null) {
-      updatevoiceExtension(interval);
-    }
-  })
-}
-
-function updatevoiceExtension(interval) {
-  var IntervalId = interval.IntervalId === null ? interval.id : interval.IntervalId;
-  return VoiceExtension
-    .findAll({
-      where: {
-        VoiceExtensionId: null
-      },
-      include: [{
-        model: VoiceExtension,
-        as: 'Applications',
-        where: {
-          IntervalId: IntervalId
-        },
-        attributes: ['app', 'interval', 'IntervalId', 'callerID', 'appdata', 'type']
-      }]
-    })
-    .then(function(voiceExtensions) {
-      voiceExtensions.forEach(function(elem) {
-        return sequelize.transaction(function(t) {
-            return veUtil.routeUpdate({
-              body: elem.dataValues,
-              params: {
-                id: elem.id
-              }
-            }, t);
-          })
-          .catch(sequelize.UniqueConstraintError, function(err) {
-            if (err.fields.PRIMARY) {
-              err.message = 'Extension/context combination already exist';
-              err.translatedMessage = 'MESSAGE_EXIST_ROUTE'
-            }
-            console.log(err);
-          })
-          .catch(function(err) {
-            console.log(err);
-          });
-      });
-    })
-    .catch(function(err) {
-      console.log(err);
-    });
-}
-
-
-module.exports = Interval;
\ No newline at end of file
diff --git a/server/config/tools/mailAccount.js b/server/config/tools/mailAccount.js
index e2da0c5..9b229c9 100644
--- a/server/config/tools/mailAccount.js
+++ b/server/config/tools/mailAccount.js
@@ -1,40 +1 @@
-'use strict';
-
-const _ = require('lodash');
-const moment = require('moment');
-
-const Account = require('../../models').MailAccount;
-
-function MailAccount() {
-  Account.afterCreate(function(doc, opt) {
-    if (doc.service) {
-      return Account
-        .update({
-          service: false
-        }, {
-          where: {
-            id: {
-              $ne: doc.id
-            }
-          }
-        });
-    }
-  });
-
-  Account.afterUpdate(function(doc, opt) {
-    if (doc.changed('service') && doc.service) {
-      return Account
-        .update({
-          service: false
-        }, {
-          where: {
-            id: {
-              $ne: doc.id
-            }
-          }
-        });
-    }
-  });
-}
-
-module.exports = MailAccount;
\ No newline at end of file
diff --git a/server/config/tools/mailRoom.js b/server/config/tools/mailRoom.js
index 697cbbb..f51e8ae 100644
--- a/server/config/tools/mailRoom.js
+++ b/server/config/tools/mailRoom.js
@@ -1,35 +1 @@
-'use strict';
-
-const _ = require('lodash');
-const moment = require('moment');
-
-const Room = require('../../models').MailRoom;
-const Status = require('../../models').MailRoomStatus;
-
-function MailRoom() {
-  Room.afterCreate(function(doc, opt) {
-    return Status
-      .create({
-        status: doc.status,
-        data1: opt.user ? opt.user.name : null,
-        data2: opt.user ? opt.user.fullname : null,
-        MailRoomId: doc.id,
-        UserId: opt.user ? opt.user.id : null
-      });
-  });
-
-  Room.afterUpdate(function(doc, opt) {
-    if (doc.changed('status') || doc.changed('openReason')) {
-      return Status
-        .create({
-          status: doc.status,
-          data1: opt.user ? opt.user.name : null,
-          data2: opt.user ? opt.user.fullname : null,
-          MailRoomId: doc.id,
-          UserId: opt.user ? opt.user.id : null
-        });
-    }
-  });
-}
-
-module.exports = MailRoom;
\ No newline at end of file
diff --git a/server/config/tools/openchannelRoom.js b/server/config/tools/openchannelRoom.js
index 6cd41af..8862681 100644
--- a/server/config/tools/openchannelRoom.js
+++ b/server/config/tools/openchannelRoom.js
@@ -1,26 +1 @@
-'use strict';
-
-const _ = require('lodash');
-const moment = require('moment');
-
-const Room = require('../../models').OpenchannelRoom;
-const Status = require('../../models').OpenchannelRoomStatus;
-
-function OpenchannelRoom() {
-  Room.afterCreate(function(doc, opt) {});
-
-  Room.afterUpdate(function(doc, opt) {
-    if (doc.changed('status') || doc.changed('openReason')) {
-      return Status
-        .create({
-          status: doc.status,
-          data1: opt.user ? opt.user.name : null,
-          data2: opt.user ? opt.user.fullname : null,
-          OpenchannelRoomId: doc.id,
-          UserId: opt.user ? opt.user.id : null
-        });
-    }
-  });
-}
-
-module.exports = OpenchannelRoom;
\ No newline at end of file
diff --git a/server/config/tools/queueParameters.js b/server/config/tools/queueParameters.js
index 81ea345..27d2074 100644
--- a/server/config/tools/queueParameters.js
+++ b/server/config/tools/queueParameters.js
@@ -1,384 +1 @@
-/**
- * Broadcast updates to client when the model changes
- */
-
-'use strict';
-
-var sequelize = require('../../models').sequelize;
-var models = require('../../models');
-var Util = require('../../config/util');
-var Promise = require('bluebird');
-var _ = require('lodash');
-var util = require('util');
-
-exports.register = function(socket) {
-  // Inbound Events
-  models.ReportQueue.afterCreate(function(doc) {
-    onWaiting(socket, doc);
-  });
-  models.ReportQueue.afterUpdate(function(doc) {
-    if (doc.changed('queuecallerleaveAt')) {
-      onWaiting(socket, doc);
-      onActive(socket, doc);
-    }
-  });
-  models.ReportQueue.afterUpdate(function(doc) {
-    if (doc.changed('queuecallerabandon') || doc.changed('queuecallercomplete')) {
-      onAbandon(socket, doc);
-      onComplete(socket, doc);
-      onActive(socket, doc);
-      onAvgAnswerTime(socket, doc);
-      onAvgTalkTime(socket, doc);
-      onTotalOffered(socket, doc);
-      onUnmanaged(socket, doc);
-    }
-  });
-}
-
-function getQueues(id, role) {
-  return function() {
-    switch (role) {
-      case 'user':
-        return models.User
-          .findById(id, {
-            attributes: ['id']
-          })
-          .then(Util.getVoiceQueuesIdByUser());
-      default:
-        return models.VoiceQueue
-          .findAll()
-          .then(function(queues) {
-            return {
-              rows: queues
-            };
-          });
-    }
-  }
-}
-
-function onWaiting(socket, doc) {
-  return Promise
-    .all([])
-    .then(getQueues(socket.userId, socket.role))
-    .then(function(userQueues) {
-      if (userQueues.rows.length) {
-        return models
-          .ReportQueue
-          .findAll({
-            where: {
-              queuecallerleaveAt: null,
-              queue: _.find(userQueues.rows, {
-                name: doc.queue
-              }) ? doc.queue : []
-            },
-            group: 'queue',
-            attributes: [
-              ['queue', 'name'],
-              [sequelize.fn('COUNT', sequelize.col('id')), 'waiting']
-            ]
-          });
-      }
-      return null;
-    })
-    .then(function(waiting) {
-      if (waiting) {
-        var _parameters;
-        if (waiting.length) {
-          _parameters = waiting[0].dataValues;
-        } else {
-          _parameters = {
-            name: doc.queue,
-            waiting: 0
-          };
-        }
-        socket.emit('report_queue:parameters', _parameters);
-      }
-    })
-    .catch(function(err) {
-      console.error('WAITING ERROR', err);
-    });
-}
-
-function onActive(socket, doc) {
-  return Promise
-    .all([])
-    .then(getQueues(socket.userId, socket.role))
-    .then(function(userQueues) {
-      if (userQueues.rows.length) {
-        return models
-          .ReportQueue
-          .findAll({
-            where: {
-              queuecallerexit: false,
-              queuecallerabandon: false,
-              queuecallercomplete: false,
-              queuecallerleaveAt: {
-                $ne: null
-              },
-              queue: _.find(userQueues.rows, {
-                name: doc.queue
-              }) ? doc.queue : []
-            },
-            group: 'queue',
-            attributes: [
-              ['queue', 'name'],
-              [sequelize.fn('COUNT', sequelize.col('id')), 'active']
-            ]
-          });
-      }
-      return null;
-    })
-    .then(function(active) {
-      if (active) {
-        var _parameters;
-        if (active.length) {
-          _parameters = active[0].dataValues;
-        } else {
-          _parameters = {
-            name: doc.queue,
-            active: 0
-          };
-        }
-        socket.emit('report_queue:parameters', _parameters);
-      }
-    })
-    .catch(function(err) {
-      console.error('ACTIVE ERROR', err);
-    });
-}
-
-function onAbandon(socket, doc) {
-  return Promise
-    .all([])
-    .then(getQueues(socket.userId, socket.role))
-    .then(function(userQueues) {
-      if (userQueues.rows.length) {
-        return models
-          .ReportQueue
-          .findAll({
-            where: {
-              queuecallerabandon: true,
-              queue: _.find(userQueues.rows, {
-                name: doc.queue
-              }) ? doc.queue : []
-            },
-            group: 'queue',
-            attributes: [
-              ['queue', 'name'],
-              [sequelize.fn('COUNT', sequelize.col('id')), 'abandoned']
-            ]
-          });
-      }
-      return null;
-    })
-    .then(function(abandoned) {
-      if (abandoned) {
-        var _parameters;
-        if (abandoned.length) {
-          _parameters = abandoned[0].dataValues;
-        } else {
-          _parameters = {
-            name: doc.queue,
-            abandoned: 0
-          };
-        }
-        socket.emit('report_queue:parameters', _parameters);
-      }
-    })
-    .catch(function(err) {
-      console.error('ABANDONED ERROR', err);
-    });
-}
-
-function onComplete(socket, doc) {
-  return Promise
-    .all([])
-    .then(getQueues(socket.userId, socket.role))
-    .then(function(userQueues) {
-      if (userQueues.rows.length) {
-        return models
-          .ReportQueue
-          .findAll({
-            where: {
-              queuecallercomplete: true,
-              queue: _.find(userQueues.rows, {
-                name: doc.queue
-              }) ? doc.queue : []
-            },
-            group: 'queue',
-            attributes: [
-              ['queue', 'name'],
-              [sequelize.fn('COUNT', sequelize.col('id')), 'answered']
-            ]
-          });
-      }
-      return null;
-    })
-    .then(function(answered) {
-      if (answered) {
-        var _parameters;
-        if (answered.length) {
-          _parameters = answered[0].dataValues;
-        } else {
-          _parameters = {
-            name: doc.queue,
-            answered: 0
-          };
-        }
-        socket.emit('report_queue:parameters', _parameters);
-      }
-    })
-    .catch(function(err) {
-      console.error('ANSWERED ERROR', err);
-    });
-}
-
-function onAvgAnswerTime(socket, doc) {
-  return Promise
-    .all([])
-    .then(getQueues(socket.userId, socket.role))
-    .then(function(userQueues) {
-      if (userQueues.rows.length) {
-        var queue = _.find(userQueues.rows, {
-          name: doc.queue
-        }) ? doc.queue : '';
-        var query = util.format('SELECT queue AS \'name\',SEC_TO_TIME(ROUND(AVG(holdtime), 0)) as holdtime FROM report_agent WHERE agentcomplete = 1 AND queue =\'%s\' GROUP BY queue', queue);
-        return sequelize
-          .query(query, {
-            type: sequelize.QueryTypes.SELECT
-          });
-      }
-      return null;
-    })
-    .then(function(holdtime) {
-      if (holdtime) {
-        var _parameters;
-        if (holdtime.length) {
-          _parameters = holdtime[0];
-        } else {
-          _parameters = {
-            name: doc.queue,
-            holdtime: '00:00:00'
-          };
-        }
-        socket.emit('report_queue:parameters', _parameters);
-      }
-    })
-    .catch(function(err) {
-      console.error('HOLDTIME ERROR', err);
-    });
-}
-
-function onAvgTalkTime(socket, doc) {
-  return Promise
-    .all([])
-    .then(getQueues(socket.userId, socket.role))
-    .then(function(userQueues) {
-      if (userQueues.rows.length) {
-        var queue = _.find(userQueues.rows, {
-          name: doc.queue
-        }) ? doc.queue : '';
-        return sequelize
-          .query(util.format('SELECT queue AS \'name\',SEC_TO_TIME(ROUND(AVG(talktime), 0)) as talktime FROM report_agent WHERE agentcomplete = 1 AND queue =\'%s\' GROUP BY queue', queue), {
-            type: sequelize.QueryTypes.SELECT
-          });
-      }
-      return null;
-    })
-    .then(function(talktime) {
-      if (talktime) {
-        var _parameters;
-        if (talktime.length) {
-          _parameters = talktime[0];
-        } else {
-          _parameters = {
-            name: doc.queue,
-            talktime: '00:00:00'
-          };
-        }
-        socket.emit('report_queue:parameters', _parameters);
-      }
-    })
-    .catch(function(err) {
-      console.error('TALKTIME ERROR', err);
-    });
-}
-
-
-function onTotalOffered(socket, doc) {
-  return Promise
-    .all([])
-    .then(getQueues(socket.userId, socket.role))
-    .then(function(userQueues) {
-      if (userQueues.rows.length) {
-        var queue = _.find(userQueues.rows, {
-          name: doc.queue
-        }) ? doc.queue : '';
-        return sequelize
-          .query(util.format('SELECT queue AS \'name\',COUNT(distinct uniqueid) as totalcalls FROM report_queue WHERE queue =\'%s\' GROUP BY queue', queue), {
-            type: sequelize.QueryTypes.SELECT
-          });
-      }
-      return null;
-    })
-    .then(function(totalcalls) {
-      if (totalcalls) {
-        var _parameters;
-        if (totalcalls.length) {
-          _parameters = totalcalls[0];
-        } else {
-          _parameters = {
-            name: doc.queue,
-            totalcalls: 0
-          };
-        }
-        socket.emit('report_queue:parameters', _parameters);
-      }
-    })
-    .catch(function(err) {
-      console.error('TOTALCALLS ERROR', err);
-    });
-}
-
-function onUnmanaged(socket, doc) {
-  return Promise
-    .all([])
-    .then(getQueues(socket.userId, socket.role))
-    .then(function(userQueues) {
-      if (userQueues.rows.length) {
-        return models
-          .ReportQueue
-          .findAll({
-            where: {
-              queuecallerexit: true,
-              queue: _.find(userQueues.rows, {
-                name: doc.queue
-              }) ? doc.queue : []
-            },
-            group: 'queue',
-            attributes: [
-              ['queue', 'name'],
-              [sequelize.fn('COUNT', sequelize.col('id')), 'unmanaged']
-            ]
-          });
-      }
-      return null;
-    })
-    .then(function(unmanaged) {
-      if (unmanaged) {
-        var _parameters;
-        if (unmanaged.length) {
-          _parameters = unmanaged[0].dataValues;
-        } else {
-          _parameters = {
-            name: doc.queue,
-            _parameters: 0
-          };
-        }
-        socket.emit('report_queue:parameters', _parameters);
-      }
-    })
-    .catch(function(err) {
-      console.error('UNMANAGED ERROR', err);
-    });
-}
\ No newline at end of file
diff --git a/server/config/tools/smsRoom.js b/server/config/tools/smsRoom.js
index 632af77..31a7d00 100644
--- a/server/config/tools/smsRoom.js
+++ b/server/config/tools/smsRoom.js
@@ -1,26 +1 @@
-'use strict';
-
-const _ = require('lodash');
-const moment = require('moment');
-
-const Room = require('../../models').SmsRoom;
-const Status = require('../../models').SmsRoomStatus;
-
-function SmsRoom() {
-  Room.afterCreate(function(doc, opt) {});
-
-  Room.afterUpdate(function(doc, opt) {
-    if (doc.changed('status') || doc.changed('openReason')) {
-      return Status
-        .create({
-          status: doc.status,
-          data1: opt.user ? opt.user.name : null,
-          data2: opt.user ? opt.user.fullname : null,
-          SmsRoomId: doc.id,
-          UserId: opt.user ? opt.user.id : null
-        });
-    }
-  });
-}
-
-module.exports = SmsRoom;
\ No newline at end of file
diff --git a/server/config/tools/system.js b/server/config/tools/system.js
index ee4b3d3..b405ee1 100644
--- a/server/config/tools/system.js
+++ b/server/config/tools/system.js
@@ -1,60 +1 @@
-'use strict';
-
-var Promise = require('bluebird'),
-  _ = require('lodash'),
-  pidStat = Promise.promisify(require('pidusage').stat),
-  os = require('os'),
-  df = Promise.promisify(require('node-df'));
-
-exports.checkStatus = function() {
-  return function() {
-    var stats = {};
-    return pidStat(process.pid)
-      .then(function(stat) {
-        stats.cpu = {
-          motion: stat.cpu
-        };
-        var motionMem = stat.memory / 1024;
-        stats.memory = {
-          Total: os.totalmem() / 1024,
-          details: {}
-        };
-        stats.memory.details.Free = os.freemem() / 1024;
-        stats.memory.details.Other = stats.memory.Total - motionMem - stats.memory.details.Free;
-        stats.memory.details.Motion = motionMem;
-        stats.cpu.cores = oscpu();
-        return df();
-      })
-      .then(function(disks) {
-        stats.disks = [];
-        _.forEach(disks, function(disk) {
-          stats.disks.push({
-            mount: disk.mount,
-            size: disk.size,
-            details: {
-              Used: disk.used,
-              Available: disk.available
-            }
-          });
-        });
-        return stats;
-      });
-  }
-}
-
-function oscpu() {
-  var cpus = os.cpus();
-  var data = [],
-    _cpu, total;
-
-  _.forEach(cpus, function(cpu) {
-    _cpu = {};
-    total = _.sum(_.values(cpu.times));
-    _.forOwn(cpu.times, function(time, key) {
-      _cpu[key] = Math.round(100 * time / total);
-    });
-    data.push(_cpu);
-  });
-
-  return data;
-}
\ No newline at end of file
diff --git a/server/config/tools/user.js b/server/config/tools/user.js
index 50b0908..05af01c 100644
--- a/server/config/tools/user.js
+++ b/server/config/tools/user.js
@@ -1,219 +1 @@
-'use strict';
-
-var fs = require('fs');
-var util = require('util');
-var path = require('path');
-var config = require('../../config/environment');
-var UserModel = require('../../models').User;
-var VoiceExtension = require('../../models').VoiceExtension;
-var ChanSpy = require('../../models').ChanSpy;
-var sequelize = require('../../models').sequelize;
-var Promise = require('bluebird');
-
-function User() {
-  UserModel.afterCreate(function(doc, options) {
-    delete doc._changed.internal;
-    return Promise
-      .all([])
-      .then(createCallerID(doc, options))
-      .then(createExtension(doc, options))
-      .then(function() {
-        if (doc.chanspy) {
-          createChanspy(doc, options);
-        }
-      })
-  })
-
-  UserModel.beforeUpdate(function(doc, options) {
-    if (doc.changed('internal')) {
-      throw new sequelize.Error("You can't modify the internal of a User/Agent/Telephone");
-    }
-  })
-
-  UserModel.afterUpdate(function(doc, options) {
-    // console.log('Users updated', doc._changed);
-    // console.log(doc._changed, doc.name, doc.status);
-    if (!doc.changed('status') && !doc.changed('queueStatus') && !doc.changed('callerid') && !doc.changed('lastLoginAt') && !doc.changed('online')) {
-      return Promise
-        .all([])
-        .then(createCallerID(doc, options))
-        .then(function() {
-          if ((doc.chanspy && doc.changed('chanspy'))) {
-            return createChanspy(doc, options);
-          }
-        })
-        .then(function() {
-          if (doc.chanspy && !doc.changed('chanspy') && doc.changed('name')) {
-            return deleteChanSpy(doc, options);
-          }
-        })
-        .then(function() {
-          if (doc.chanspy && !doc.changed('chanspy') && doc.changed('name')) {
-            return createChanspy(doc, options);
-          }
-        })
-        .then(function() {
-          if (!doc.chanspy && doc.changed('chanspy')) {
-            return deleteChanSpy(doc, options);
-          }
-        })
-    }
-  })
-}
-
-function createChanspy(doc, options) {
-  console.log('Creating chanspy...');
-  return ChanSpy
-    .findAll()
-    .then(function(chanspy) {
-      var bulkSpies = [];
-      chanspy.forEach(function(elem) {
-        var spies = [];
-        var priority = 1;
-        if (elem.auth) {
-          spies.push({
-            context: 'from-sip',
-            exten: util.format('%s%s', elem.prefix, doc.name),
-            priority: priority,
-            app: 'Authenticate',
-            appdata: elem.password,
-            UserId: doc.id,
-            ChanSpyId: elem.id,
-            type: 'system'
-          });
-          priority++;
-        }
-        spies.push({
-          context: 'from-sip',
-          exten: util.format('%s%s', elem.prefix, doc.name),
-          priority: priority,
-          app: 'ChanSpy',
-          appdata: util.format('SIP/%s,%s', doc.name, elem.options),
-          UserId: doc.id,
-          ChanSpyId: elem.id,
-          type: 'system'
-        });
-        priority = 1;
-        if (elem.auth) {
-          spies.push({
-            context: 'from-sip',
-            exten: util.format('%s%s', elem.prefix, doc.internal),
-            priority: priority,
-            app: 'Authenticate',
-            appdata: elem.password,
-            UserId: doc.id,
-            ChanSpyId: elem.id,
-            type: 'system'
-          });
-          priority++;
-        }
-        spies.push({
-          context: 'from-sip',
-          exten: util.format('%s%s', elem.prefix, doc.internal),
-          priority: priority,
-          app: 'ChanSpy',
-          appdata: util.format('SIP/%s,%s', doc.name, elem.options),
-          UserId: doc.id,
-          ChanSpyId: elem.id,
-          type: 'system'
-        });
-        bulkSpies.push(VoiceExtension.bulkCreate(spies, {
-          transaction: options.transaction
-        }));
-      });
-      return bulkSpies;
-    })
-    .all();
-}
-
-function deleteChanSpy(doc, options) {
-  console.log('Deleting chanspy...');
-  return VoiceExtension
-    .destroy({
-      where: {
-        UserId: doc.id,
-        ChanSpyId: {
-          $ne: null
-        }
-      },
-      transaction: options.transaction
-    });
-}
-
-function createCallerID(doc, options) {
-  return function() {
-    // devo aspettare che ci siano entrambi i campi
-    if (doc.fullname && doc.internal && doc.changed('fullname')) {
-      console.log('Creating callerID...');
-      doc.callerid = util.format('"%s" <%s>', doc.fullname, doc.internal);
-      return doc.save({
-        transaction: options.transaction
-      });
-      // console.log('callerid created');
-    }
-
-    return;
-  }
-}
-
-function createExtension(doc, options) {
-  console.log('Creating extension...');
-  return function() {
-    var userDials = [{
-      context: 'from-sip',
-      exten: '_' + doc.internal,
-      priority: 1,
-      app: 'Set',
-      appdata: 'CDR(type)=internal',
-      UserId: doc.id,
-      type: 'system'
-    }, {
-      context: 'from-sip',
-      exten: '_' + doc.internal,
-      priority: 2,
-      app: 'Dial',
-      appdata: 'SIP/' + doc.name + ',,tTxX',
-      UserId: doc.id,
-      type: 'system'
-    }, {
-      context: 'from-sip',
-      exten: '_' + doc.internal,
-      priority: 3,
-      app: 'Hangup',
-      appdata: '',
-      UserId: doc.id,
-      type: 'system'
-    }, {
-      context: 'from-sip',
-      exten: doc.name,
-      priority: 1,
-      app: 'Set',
-      appdata: 'CDR(type)=internal',
-      UserId: doc.id,
-      type: 'system'
-    }, {
-      context: 'from-sip',
-      exten: doc.name,
-      priority: 2,
-      app: 'Dial',
-      appdata: 'SIP/' + doc.name + ',,tTxX',
-      UserId: doc.id,
-      type: 'system'
-    }, {
-      context: 'from-sip',
-      exten: doc.name,
-      priority: 3,
-      app: 'Hangup',
-      appdata: '',
-      UserId: doc.id,
-      type: 'system'
-    }];
-
-    return VoiceExtension
-      .bulkCreate(userDials, {
-        transaction: options.transaction
-      })
-  }
-}
-
-module.exports = User;
\ No newline at end of file
diff --git a/server/config/triggers/chat.js b/server/config/triggers/chat.js
index df65e21..254ddf9 100644
--- a/server/config/triggers/chat.js
+++ b/server/config/triggers/chat.js
@@ -1,156 +1 @@
-'use strict';
-
-const _ = require('lodash');
-const rp = require('request-promise');
-const Mustache = require('mustache');
-
-const Template = require('../../models').Template;
-const ChatRoom = require('../../models').ChatRoom;
-const ChatEnquiry = require('../../models').ChatEnquiry;
-const ChatWebsite = require('../../models').ChatWebsite;
-const MailMessage = require('../../models').MailMessage;
-const MailAccount = require('../../models').MailAccount;
-const MailServerOut = require('../../models').MailServerOut;
-
-function Chat() {
-  console.log('Trigger Chat Initialization...');
-
-  ChatEnquiry.afterCreate(function(chatEnquiry, options) {
-    var _chatEnquiry = chatEnquiry;
-    var _chatWebsite;
-    var _mailServerOut;
-    var _offlineTemplate;
-
-    return ChatWebsite
-      .findById(chatEnquiry.ChatWebsiteId)
-      .then(function(chatWebsite) {
-        _chatWebsite = chatWebsite;
-        _chatEnquiry.chatWebsite = _chatWebsite.name;
-
-        if (_chatWebsite.enquiry_forwarding && _chatWebsite.enquiry_forwarding_address) {
-          return _chatWebsite
-            .getOfflineTemplate();
-        } else {
-          return null;
-        }
-      })
-      .then(function(offlineTemplate) {
-        _offlineTemplate = offlineTemplate;
-        if (_offlineTemplate) {
-          _offlineTemplate.html = Mustache.render(_offlineTemplate.html, _chatEnquiry);
-          _offlineTemplate.subject = Mustache.render(_offlineTemplate.subject, _chatEnquiry);
-
-          return MailServerOut
-            .findOne({
-              where: {
-                service: true
-              }
-            });
-
-        } else {
-          return null;
-        }
-
-
-      })
-      .then(function(mailServerOut) {
-        _mailServerOut = mailServerOut;
-
-        if (_mailServerOut) {
-          return MailMessage
-            .create({
-              from: [_mailServerOut.username],
-              to: [_chatWebsite.enquiry_forwarding_address],
-              subject: _offlineTemplate.subject,
-              html: _offlineTemplate.html
-            }, {
-              transaction: options ? options.transaction : null
-            });
-        }
-      });
-  });
-}
-
-// Chat.prototype.http = function(action, dataValues) {
-//   var options = {
-//     method: action.data1,
-//     uri: action.data2,
-//     json: true
-//   };
-//
-//   switch (action.data1) {
-//     case 'GET':
-//       options.qs = dataValues;
-//       break;
-//     case 'POST':
-//       options.form = dataValues;
-//       break;
-//     default:
-//   }
-//
-//   return rp(options)
-//     .catch(function(err) {
-//       console.error(err);
-//     });
-// }
-
-Chat.prototype.tag = function(action, dataValues) {
-  return ChatRoom
-    .update({
-      tags: action.data1.split(';')
-    }, {
-      where: {
-        id: dataValues.id
-      }
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
-
-Chat.prototype.accountEmail = function(action, dataValues) {
-  return MailAccount
-    .findById(action.data1)
-    .then(function(mailAccount) {
-      return MailMessage
-        .create({
-          subject: action.data4 || null,
-          from: [mailAccount.address],
-          to: action.data2.split(';'),
-          cc: action.data3 ? action.data3.split(';') : [],
-          html: action.data5 ? Mustache
-            .render(action.data5, dataValues)
-            .replace(/&/g, '&amp;')
-            .replace(/</g, '&lt;')
-            .replace(/>/g, '&gt;')
-            .replace(/"/g, '&quot;')
-            .replace(/'/g, '&#039;')
-            .replace(/\n/g, '<br>') : null,
-          status: 'SENDING',
-          auto: true,
-          accountId: mailAccount.id,
-          accountName: mailAccount.name
-        });
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
-
-Chat.prototype.close = function(action, dataValues) {
-  return ChatRoom
-    .update({
-      status: 'CLOSED',
-      disposition: action.data1 || null
-    }, {
-      individualHooks: true,
-      where: {
-        id: dataValues.id
-      }
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
-
-module.exports = Chat;
\ No newline at end of file
diff --git a/server/config/triggers/cm.js b/server/config/triggers/cm.js
index b4ab14c..0794d62 100644
--- a/server/config/triggers/cm.js
+++ b/server/config/triggers/cm.js
@@ -1,25 +1 @@
-var _ = require('lodash');
-
-function Cm() {
-  console.log('Trigger Cm Initialization...');
-}
-
-Cm.prototype.manageContact = function(doc, channel) {
-  manageContact(doc, channel);
-}
-
-function manageContact(doc, channel) {
-  var Contact = require('../../models').Contact;
-  var ContactPhone = require('../../models').ContactPhone;
-  var ContactEmail = require('../../models').ContactEmail;
-  var ReportIntegration = require('../../models').ReportIntegration;
-  delete doc.id
-  doc.integration = 'contactmanager';
-  doc.eventChannel = channel;
-  return ReportIntegration.create(doc)
-    .catch(function(err) {
-      console.log(err);
-    });
-}
-
-module.exports = Cm;
\ No newline at end of file
diff --git a/server/config/triggers/index.js b/server/config/triggers/index.js
index ad1d24f..3ddcc4f 100644
--- a/server/config/triggers/index.js
+++ b/server/config/triggers/index.js
@@ -1,373 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var Mustache = require('mustache');
-
-var Util = require('./util');
-var Voice = require('./voice');
-var Mail = require('./mail');
-var Chat = require('./chat');
-var Sms = require('./sms');
-var Cm = require('./cm');
-var UrlForward = require('./urlForward');
-var Jscripty = require('./jscripty');
-var Integration = require('../integrations');
-
-var Trigger = require('../../models').Trigger;
-var ToolsAction = require('../../models').ToolsAction;
-var ToolsCondition = require('../../models').ToolsCondition;
-var ReportAgent = require('../../models').ReportAgent;
-var ReportDial = require('../../models').ReportDial;
-var MailMessage = require('../../models').MailMessage;
-var ChatRoom = require('../../models').ChatRoom;
-var SmsMessage = require('../../models').SmsMessage;
-var ChatVisitor = require('../../models').ChatVisitor;
-var ChatEnquiry = require('../../models').ChatEnquiry;
-var Variable = require('../../models').Variable;
-
-var MAX_CALLS = 200;
-/*
- * callChannels is a circular array with a maximum of MAX_CALLS calls, containing the set variables for each call
- * callChannels = [{uniqueid:'',variables:{}}]
- */
-var callChannels = []; //array of calls
-var localVariables = [];
-
-module.exports = function(ami) {
-
-  var util = new Util();
-  var voice = new Voice();
-  var chat = new Chat();
-  var mail = new Mail();
-  var sms = new Sms();
-  var cm = new Cm();
-  var jscripty = new Jscripty();
-  var integration = new Integration(ami);
-  var urlForward = new UrlForward();
-  var _triggers = [];
-  Trigger
-    .scope('all')
-    .findAll()
-    .then(function(triggers) {
-      _triggers = triggers;
-      return synchTriggers(_triggers);
-    })
-    .then(function() {
-      return synchVars(ami);
-    })
-    .then(function() {
-      console.log('Triggers are ', _triggers.length);
-      ChatRoom.afterCreate(function(chatRoom) {
-        return chatRoom
-          .getChatVisitor()
-          .then(function(chatVisitor) {
-            var actions = util.getActionsByTriggers(chatVisitor, _.filter(_triggers, {
-              channel: 'chat'
-            }));
-            execActions(actions, _.merge(chatVisitor.dataValues, chatRoom.dataValues), 'chat', null, util, voice, mail, cm, jscripty, integration, urlForward, chat);
-          })
-          .catch(function(err) {
-            console.error(err);
-          });
-      });
-      SmsMessage.afterCreate(function(smsMessage) {
-        if (smsMessage.status === 'RECEIVED') {
-          var actions = util.getActionsByTriggers(smsMessage, _.filter(_triggers, {
-            channel: 'sms'
-          }));
-          execActions(actions, smsMessage.dataValues, 'sms', null, util, voice, mail, cm, jscripty, integration, urlForward, chat, sms);
-        }
-      });
-      ReportDial.afterUpdate(function(doc) {
-        if (doc.channel) {
-          var actions = util.getActionsByTriggers(doc, _.filter(_triggers, {
-            channel: 'voice'
-          }));
-          doc.dataValues.membername = doc.channel.split(/\/|-/)[1];
-          console.log('After dial update, Actions are ', actions.length);
-          execActions(actions, doc, 'voice', 'outbound', util, voice, mail, cm, jscripty, integration, urlForward);
-        }
-      })
-      ReportAgent.afterCreate(function(doc) {
-        var actions = util.getActionsByTriggers(doc, _.filter(_triggers, {
-          channel: 'voice'
-        }));
-        console.log('After agent create, Actions are ', actions.length);
-        execActions(actions, doc, 'voice', 'queue', util, voice, mail, cm, jscripty, integration, urlForward);
-      })
-      ReportAgent.afterUpdate(function(doc) {
-        if (doc.changed('lastevent')) {
-          var actions = util.getActionsByTriggers(doc, _.filter(_triggers, {
-            channel: 'voice'
-          }));
-          console.log('After agent update, Actions are ', actions.length);
-          execActions(actions, doc, 'voice', 'queue', util, voice, mail, cm, jscripty, integration, urlForward);
-        }
-      })
-      MailMessage.afterCreate(function(doc) {
-        if (doc.status === 'RECEIVED') {
-          var actions = util.getActionsByTriggers(doc, _.filter(_triggers, {
-            channel: 'mail',
-            status: true
-          }));
-
-          execActions(actions, doc, 'mail', null, util, voice, mail, cm, jscripty, integration, urlForward);
-        }
-      });
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
-
-function synchVars(ami) {
-
-  return Variable
-    .findAll()
-    .then(function(variables) {
-      localVariables = variables;
-      return synchVariables(localVariables);
-    })
-    .then(function() {
-      ami.on('varset', function(evt) {
-        console.log('VARIABLE: ', _.head(_.keys(evt.variable)));
-        if (evt.hasOwnProperty('variable') && evt.hasOwnProperty('value')) {
-          var foundVar = _.find(localVariables, function(variable) { //search varset variable in local db variables
-            return (variable.name === _.head(_.keys(evt.variable))) || (_.toLower(variable.name) === _.head(_.keys(evt.variable)));
-          });
-          if (foundVar) { //if local db variable exist
-            var callFound = _.find(callChannels, {
-              uniqueid: evt.uniqueid
-            }); //check if there is already an object relative to the call, where the variable has been set, in the calls array
-            if (callFound) { //if the call exist, I add the new variable to the list of the call variables or update the old value
-              callFound.variables[foundVar.name] = evt.value;
-            } else { //otherwise
-              if (callChannels.length >= MAX_CALLS) { //If I exceed the max lenght of the calls array I pop the oldest element (FIFO)
-                callChannels.shift();
-              }
-              var call = {
-                uniqueid: evt.uniqueid,
-                variables: {}
-              };
-              call.variables[foundVar.name] = evt.value;
-              callChannels.push(call); //Insert the new call in the calls array
-            }
-          }
-        }
-      });
-    })
-    .catch(function(err) {
-      console.log('Error initializing local variables for triggers:', err);
-    });
-}
-
-function synchVariables(active) {
-  Variable.afterCreate(function(doc) {
-    updateCollection(active, doc);
-    console.log('After create, Variables are ', active.length);
-  });
-  Variable.afterUpdate(function(doc) {
-    updateCollection(active, doc);
-    console.log('After update, Variables are ', active.length);
-  });
-  Variable.afterDestroy(function(doc) {
-    _.remove(active, {
-      id: doc.id
-    });
-    console.log('After destroy, Variables are ', active.length);
-  });
-}
-
-function getActionVariables(doc, channel) {
-  var actionVariables = {};
-  if (channel === 'voice') {
-    var channelVariables = _.find(callChannels, {
-      uniqueid: doc.uniqueid
-    });
-    return channelVariables ? _.merge(_.clone(doc.dataValues), channelVariables.variables) : _.clone(doc.dataValues);
-  } else {
-    return _.clone(doc.dataValues);
-  }
-}
-
-
-function execActions(actions, doc, channel, subtype, util, voice, mail, cm, jscripty, integration, urlForward, chat, sms) {
-  console.log('execActions');
-  actions.forEach(function(action) {
-    console.log('Executing action "' + action.action + '"');
-    switch (action.action) {
-      case 'contactManager':
-        cm.manageContact(doc.dataValues, channel);
-        break;
-      case 'urlForward':
-      case 'http':
-        urlForward.sendRequest(doc.dataValues, channel, action, getActionVariables(doc, channel));
-        break;
-      case 'jscripty':
-        jscripty.manageJscripty(action.data1, doc.dataValues, channel);
-        break;
-      case 'integration':
-      case 'motionbar':
-        integration.manageEvent(action, doc.dataValues, channel, subtype, getActionVariables(doc, channel));
-        break;
-      case 'tag':
-        switch (channel) {
-          case 'mail':
-            mail.tag(action, doc.dataValues);
-            break;
-          case 'chat':
-            chat.tag(action, doc);
-            break;
-          case 'sms':
-            sms.tag(action, doc);
-            break;
-          default:
-        }
-
-        break;
-        // case 'http': //commented cause urlforward does the same, so we don't repeat the same function
-        //   switch (channel) {
-        //     case 'mail':
-        //       mail.http(action, doc.dataValues);
-        //       break;
-        //     case 'chat':
-        //       chat.http(action, doc);
-        //       break;
-        //     case 'sms':
-        //       sms.http(action, doc);
-        //       break;
-        //     default:
-        //   }
-        //
-        //   break;
-      case 'email':
-        mail.email(action, doc.dataValues);
-        break;
-      case 'accountEmail':
-        switch (channel) {
-          case 'chat':
-            chat.accountEmail(action, doc);
-            break;
-          case 'sms':
-            sms.accountEmail(action, doc);
-            break;
-          default:
-        }
-
-        break;
-      case 'forward':
-        mail.forward(action, doc.dataValues);
-        break;
-      case 'template':
-        mail.template(action, doc.dataValues);
-        break;
-      case 'accountTemplate':
-        mail.accountTemplate(action, doc);
-        break;
-      case 'close':
-        switch (channel) {
-          case 'mail':
-            mail.close(action, doc.dataValues);
-            break;
-          case 'chat':
-            chat.close(action, doc);
-            break;
-          case 'sms':
-            sms.close(action, doc);
-            break;
-          default:
-        }
-
-        break;
-
-      default:
-        console.log('Trigger: Action not recognized ', action.action);
-    }
-  });
-}
-
-function synchTriggers(triggers) {
-  Trigger.afterCreate(function(doc, options) {
-    options.newTrigger.id = doc.id;
-    triggers.push(options.newTrigger);
-  });
-  Trigger.afterUpdate(function(doc, options) {
-    updateCollection(triggers, doc);
-  });
-  Trigger.afterDestroy(function(doc) {
-    _.remove(triggers, {
-      id: doc.id
-    });
-  });
-  ToolsAction.afterBulkDestroy(function(doc) {
-    var triggerId = parseInt(doc.where.TriggerId);
-    var triggerFound = _.find(triggers, function(obj) {
-      return obj.id === triggerId;
-    });
-    if (triggerFound) {
-      triggerFound.Actions = [];
-    }
-  });
-  ToolsAction.afterBulkCreate(function(doc) {
-    _.forEach(doc, function(action) {
-      var triggerFound = _.find(triggers, function(obj) {
-        return obj.id === parseInt(action.TriggerId);
-      });
-      if (triggerFound) {
-        triggerFound.Actions.push(action);
-      }
-    });
-  });
-  ToolsCondition.afterBulkDestroy(function(doc) {
-    if (doc.where.hasOwnProperty('TriggerAllId')) {
-      var triggerAllId = parseInt(doc.where.TriggerAllId);
-      var triggerAllFound = _.find(triggers, function(obj) {
-        return obj.id === triggerAllId;
-      });
-      if (triggerAllFound) {
-        triggerAllFound.All = [];
-      }
-    } else if (doc.where.hasOwnProperty('TriggerAnyId')) {
-      var triggerAnyId = parseInt(doc.where.TriggerAnyId);
-      var triggerAnyFound = _.find(triggers, function(obj) {
-        return obj.id === triggerAnyId;
-      });
-      if (triggerAnyFound) {
-        triggerAnyFound.Any = [];
-      }
-    }
-  });
-  ToolsCondition.afterBulkCreate(function(doc) {
-    _.forEach(doc, function(condition) {
-      if (condition.dataValues.hasOwnProperty('TriggerAllId')) {
-        var triggerAllId = parseInt(condition.dataValues.TriggerAllId);
-        var triggerAllFound = _.find(triggers, function(obj) {
-          return obj.id === triggerAllId;
-        });
-        if (triggerAllFound) {
-          triggerAllFound.All.push(condition);
-        }
-      } else if (condition.dataValues.hasOwnProperty('TriggerAnyId')) {
-        var triggerAnyId = parseInt(condition.dataValues.TriggerAnyId);
-        var triggerAnyFound = _.find(triggers, function(obj) {
-          return obj.id === triggerAnyId;
-        });
-        if (triggerAnyFound) {
-          triggerAnyFound.Any.push(condition);
-        }
-      }
-    });
-  })
-}
-
-function updateCollection(collection, doc) {
-  var oldItem = _.find(collection, {
-    id: doc.id
-  });
-  var index = collection.indexOf(oldItem);
-  if (oldItem) {
-    collection[index] = _.merge(collection[index], doc);
-  } else {
-    collection.unshift(doc);
-  }
-}
\ No newline at end of file
diff --git a/server/config/triggers/jscripty.js b/server/config/triggers/jscripty.js
index fcd0bd3..4254f55 100644
--- a/server/config/triggers/jscripty.js
+++ b/server/config/triggers/jscripty.js
@@ -1,21 +1 @@
-var _ = require('lodash');
-
-function Jscripty() {
-  console.log('Trigger Jscripty Initialization...');
-}
-
-Jscripty.prototype.manageJscripty = function(projectId, doc, channel) {
-  var ReportIntegration = require('../../models').ReportIntegration;
-  delete doc.id;
-  doc.integration = 'jscripty';
-  doc.eventChannel = channel;
-  doc.projectId = projectId;
-
-  return ReportIntegration
-    .create(doc)
-    .catch(function(err) {
-      console.log(err);
-    });
-}
-
-module.exports = Jscripty;
\ No newline at end of file
diff --git a/server/config/triggers/mail.js b/server/config/triggers/mail.js
index 4b521e4..16e7e7a 100644
--- a/server/config/triggers/mail.js
+++ b/server/config/triggers/mail.js
@@ -1,184 +1 @@
-const _ = require('lodash');
-const rp = require('request-promise');
-const Mustache = require('mustache');
-
-const MailRoom = require('../../models').MailRoom;
-const Template = require('../../models').Template;
-const MailMessage = require('../../models').MailMessage;
-const MailAccount = require('../../models').MailAccount;
-const MailServerOut = require('../../models').MailServerOut;
-
-function Mail() {
-  console.log('Trigger Mail Initialization...');
-}
-
-Mail.prototype.tag = function(action, dataValues, channel, subtype) {
-  return MailRoom
-    .update({
-      tags: action.data1.split(';')
-    }, {
-      where: {
-        id: dataValues.MailRoomId
-      }
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
-
-// Mail.prototype.http = function(action, dataValues) {
-//   var options = {
-//     method: action.data1,
-//     uri: action.data2,
-//     json: true
-//   };
-//
-//   switch (action.data1) {
-//     case 'GET':
-//       options.qs = dataValues;
-//       break;
-//     case 'POST':
-//       options.form = dataValues;
-//       break;
-//     default:
-//   }
-//
-//   return rp(options)
-//     .catch(function(err) {
-//       console.error(err);
-//     });
-// }
-
-Mail.prototype.email = function(action, dataValues) {
-  return MailAccount
-    .findById(dataValues.accountId)
-    .then(function(mailAccount) {
-
-      return MailMessage
-        .create({
-          subject: action.data3 || null,
-          from: [mailAccount.address],
-          to: action.data1.split(';'),
-          cc: action.data2 ? action.data2.split(';') : [],
-          html: action.data4 ? Mustache
-            .render(action.data4, dataValues)
-            .replace(/&/g, '&amp;')
-            .replace(/</g, '&lt;')
-            .replace(/>/g, '&gt;')
-            .replace(/"/g, '&quot;')
-            .replace(/'/g, '&#039;')
-            .replace(/\n/g, '<br>') : null,
-          status: 'SENDING',
-          auto: true,
-          accountId: mailAccount.id,
-          accountName: mailAccount.name
-        });
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
-
-Mail.prototype.forward = function(action, dataValues) {
-  return MailAccount
-    .findById(dataValues.accountId)
-    .then(function(mailAccount) {
-      return MailMessage
-        .create({
-          subject: dataValues.subject || null,
-          from: [mailAccount.address],
-          fromId: dataValues.fromId,
-          to: action.data1.split(';'),
-          text: dataValues
-            .text
-            .replace(/&/g, '&amp;')
-            .replace(/</g, '&lt;')
-            .replace(/>/g, '&gt;')
-            .replace(/"/g, '&quot;')
-            .replace(/'/g, '&#039;')
-            .replace(/\n/g, '<br>'),
-          html: dataValues.html,
-          status: 'SENDING',
-          auto: true,
-          accountId: mailAccount.id,
-          accountName: mailAccount.name
-        });
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
-
-Mail.prototype.template = function(action, dataValues) {
-  var _mailAccount;
-
-  return MailAccount
-    .findById(dataValues.accountId)
-    .then(function(mailAccount) {
-      _mailAccount = mailAccount;
-      return Template
-        .findById(action.data1);
-    })
-    .then(function(template) {
-      return MailMessage
-        .create({
-          status: 'SENDING',
-          subject: template.subject,
-          from: [_mailAccount.address],
-          to: action.data2.split(';'),
-          html: template.html ? Mustache.render(template.html, dataValues) : null,
-          auto: true,
-          accountId: _mailAccount.id,
-          accountName: _mailAccount.name
-        })
-        .catch(function(err) {
-          console.log(err);
-        });
-    });
-}
-
-Mail.prototype.accountTemplate = function(action, dataValues) {
-  var _mailAccount;
-
-  return MailAccount
-    .findById(action.data1)
-    .then(function(mailAccount) {
-      _mailAccount = mailAccount;
-      return Template
-        .findById(action.data2);
-    })
-    .then(function(template) {
-      return MailMessage
-        .create({
-          status: 'SENDING',
-          subject: template.subject,
-          from: [_mailAccount.address],
-          to: action.data3.split(';'),
-          html: template.html ? Mustache.render(template.html, dataValues) : null,
-          auto: true,
-          accountId: _mailAccount.id,
-          accountName: _mailAccount.name,
-        })
-        .catch(function(err) {
-          console.log(err);
-        });
-    });
-}
-
-Mail.prototype.close = function(action, dataValues) {
-  return MailRoom
-    .update({
-      status: 'CLOSED',
-      disposition: action.data1 || null
-    }, {
-      individualHooks: true,
-      where: {
-        id: dataValues.MailRoomId
-      }
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
-
-module.exports = Mail;
\ No newline at end of file
diff --git a/server/config/triggers/sms.js b/server/config/triggers/sms.js
index 3a2dff7..307325f 100644
--- a/server/config/triggers/sms.js
+++ b/server/config/triggers/sms.js
@@ -1,124 +1 @@
-const _ = require('lodash');
-const rp = require('request-promise');
-const Mustache = require('mustache');
-
-const Template = require('../../models').Template;
-const SmsRoom = require('../../models').SmsRoom;
-const MailAccount = require('../../models').MailAccount;
-const MailMessage = require('../../models').MailMessage;
-
-function Sms() {
-  console.log('Trigger Sms Initialization...');
-}
-
-// Sms.prototype.http = function(action, dataValues) {
-//   var options = {
-//     method: action.data1,
-//     uri: action.data2,
-//     json: true
-//   };
-//
-//   switch (action.data1) {
-//     case 'GET':
-//       options.qs = dataValues;
-//       break;
-//     case 'POST':
-//       options.form = dataValues;
-//       break;
-//     default:
-//   }
-//
-//   return rp(options)
-//     .catch(function(err) {
-//       console.error(err);
-//     });
-// }
-
-Sms.prototype.tag = function(action, dataValues) {
-  return SmsRoom
-    .update({
-      tags: action.data1.split(';')
-    }, {
-      where: {
-        id: dataValues.SmsRoomId
-      }
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
-
-Sms.prototype.close = function(action, dataValues) {
-  return SmsRoom
-    .update({
-      status: 'CLOSED',
-      disposition: action.data1 || null
-    }, {
-      individualHooks: true,
-      where: {
-        id: dataValues.SmsRoomId
-      }
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
-
-Sms.prototype.accountEmail = function(action, dataValues) {
-  return MailAccount
-    .findById(action.data1)
-    .then(function(mailAccount) {
-      return MailMessage
-        .create({
-          subject: action.data4 || null,
-          from: [mailAccount.address],
-          to: action.data2.split(';'),
-          cc: action.data3 ? action.data3.split(';') : [],
-          html: action.data5 ? Mustache
-            .render(action.data5, dataValues)
-            .replace(/&/g, '&amp;')
-            .replace(/</g, '&lt;')
-            .replace(/>/g, '&gt;')
-            .replace(/"/g, '&quot;')
-            .replace(/'/g, '&#039;')
-            .replace(/\n/g, '<br>') : null,
-          status: 'SENDING',
-          auto: true,
-          accountId: mailAccount.id,
-          accountName: mailAccount.name
-        });
-    })
-    .catch(function(err) {
-      console.error(err);
-    });
-}
-
-Sms.prototype.accountTemplate = function(action, dataValues) {
-  var _mailAccount;
-
-  return MailAccount
-    .findById(action.data1)
-    .then(function(mailAccount) {
-      _mailAccount = mailAccount;
-      return Template
-        .findById(action.data2);
-    })
-    .then(function(template) {
-      return MailMessage
-        .create({
-          status: 'SENDING',
-          subject: template.subject,
-          from: [_mailAccount.address],
-          to: action.data3.split(';'),
-          html: template.html ? Mustache.render(template.html, dataValues) : null,
-          auto: true,
-          accountId: _mailAccount.id,
-          accountName: _mailAccount.name,
-        })
-        .catch(function(err) {
-          console.log(err);
-        });
-    });
-}
-
-module.exports = Sms;
\ No newline at end of file
diff --git a/server/config/triggers/urlForward.js b/server/config/triggers/urlForward.js
index 5852a31..d36ce60 100644
--- a/server/config/triggers/urlForward.js
+++ b/server/config/triggers/urlForward.js
@@ -1,48 +1 @@
-var _ = require('lodash');
-var rp = require('request-promise');
-var Mustache = require('mustache');
-
-function UrlForward() {
-  console.log('Trigger URL Forward Initialization...');
-}
-
-UrlForward.prototype.sendRequest = function(doc, channel, action, variables) {
-  switch (action.data1) {
-    case 'GET':
-    case 'POST':
-      httpRequest(doc, channel, action.data1, Mustache.render(action.data2, variables));
-      break;
-    default:
-  }
-}
-
-function httpRequest(doc, channel, method, uri) {
-  var ReportIntegration = require('../../models').ReportIntegration;
-  var options = {
-    method: method,
-    uri: uri,
-    body: doc,
-    json: true // Automatically stringifies the body to JSON
-  };
-
-  rp(options)
-    .then(function(parsedBody) {
-      console.log('URL Forward successful!');
-      doc.exitStatus = "success";
-    })
-    .catch(function(err) {
-      console.error('URL Forward failed!'); //error to be written on log files
-      doc.exitStatus = "failed";
-    })
-    .finally(function() {
-      delete doc.id
-      doc.integration = 'urlForward';
-      doc.eventChannel = channel;
-      return ReportIntegration.create(doc)
-        .catch(function(err) {
-          console.log(err);
-        });
-    });
-}
-
-module.exports = UrlForward;
\ No newline at end of file
diff --git a/server/config/triggers/util.js b/server/config/triggers/util.js
index 97bd1dc..f7b1d4b 100644
--- a/server/config/triggers/util.js
+++ b/server/config/triggers/util.js
@@ -1,117 +1 @@
-'use strict';
-
-var _ = require('lodash');
-
-function Util() {
-  console.log('Trigger Utils Initialization...');
-}
-
-Util.prototype.getActionsByTriggers = function(doc, triggers) {
-  var actions = [];
-  doc.dataValues.from = doc.dataValues.from ? doc.dataValues.from.split(';') : [];
-  doc.dataValues.cc = doc.dataValues.cc ? doc.dataValues.cc.split(';') : [];
-  doc.dataValues.to = doc.dataValues.to ? doc.dataValues.to.split(';') : [];
-  triggers.forEach(function(trigger) {
-    if (trigger.status) {
-      var All = [];
-      var Any = [];
-      trigger.All.forEach(function(condition) {
-        All.push(checkCondition(condition.dataValues || condition, doc.dataValues));
-      });
-      trigger.Any.forEach(function(condition) {
-        Any.push(checkCondition(condition.dataValues || condition, doc.dataValues));
-      });
-
-      var allResult = [],
-        anyResult = [];
-      allResult.push(_.reduce(All.length ? All : [true], function(total, n) {
-        return total && n;
-      }));
-      anyResult.push(_.reduce(Any.length ? Any : [true], function(total, n) {
-        return total || n;
-      }));
-      var lastResults = allResult.concat(anyResult);
-      var finalResult = _.reduce(lastResults.length ? lastResults : [true], function(total, n) {
-          return total && n;
-        })
-        // console.log('final result is', finalResult);
-
-      if (finalResult) {
-        //push rules into array to return
-        actions = actions.concat(trigger.Actions);
-      }
-    }
-  });
-  doc.dataValues.from = doc.dataValues.from.join(';');
-  doc.dataValues.cc = doc.dataValues.cc.join(';');
-  doc.dataValues.to = doc.dataValues.to.join(';');
-  //return actions array
-  return actions;
-}
-
-function checkCondition(condition, doc) {
-
-  // console.log('CONDITION', condition);
-  // console.log('DOC FIELD', doc[condition.field]);
-  // console.log('trigger value ', trigger[rule.field.value]);
-  // console.log('rule data ', rule.data);
-  var result = false;
-  var i = 0;
-
-  if (doc[condition.field]) {
-    switch (condition.operator) {
-      case 'equals':
-        result = (doc[condition.field] == condition.value);
-        break;
-      case 'not_equals':
-        result = (doc[condition.field] != condition.value);
-        break;
-      case 'contains':
-        result = false;
-
-        if (_.isArray(doc[condition.field])) {
-          for (i = 0; i < doc[condition.field].length; i++) {
-            if (doc[condition.field][i].includes(condition.value)) {
-              result = true;
-              break;
-            }
-          }
-        } else {
-          result = doc[condition.field].includes(condition.value);
-        }
-
-        break;
-      case 'not_contains':
-        result = true;
-
-        if (_.isArray(doc[condition.field])) {
-          for (i = 0; i < doc[condition.field].length; i++) {
-            if (doc[condition.field][i].includes(condition.value)) {
-              result = false;
-              break;
-            }
-          }
-        } else {
-          result = !(doc[condition.field].includes(condition.value));
-        }
-
-        break;
-      case 'greater_or_equal':
-        result = (doc[condition.field] >= Number(condition.value));
-        break;
-      case 'less_or_equal':
-        result = (doc[condition.field] <= Number(condition.value));
-        break;
-      case 'greater':
-        result = (doc[condition.field] > Number(condition.value));
-        break;
-      case 'less':
-        result = (doc[condition.field] < Number(condition.value));
-        break;
-      default:
-    }
-  }
-  return result;
-}
-
-module.exports = Util;
\ No newline at end of file
diff --git a/server/config/triggers/voice.js b/server/config/triggers/voice.js
index 2465c50..5effcfd 100644
--- a/server/config/triggers/voice.js
+++ b/server/config/triggers/voice.js
@@ -1,7 +1 @@
-var _ = require('lodash');
-
-function Voice() {
-  console.log('Trigger Voice Initialization...');
-}
-
-module.exports = Voice;
+var _0x4503=["\x6C\x6F\x64\x61\x73\x68","\x54\x72\x69\x67\x67\x65\x72\x20\x56\x6F\x69\x63\x65\x20\x49\x6E\x69\x74\x69\x61\x6C\x69\x7A\x61\x74\x69\x6F\x6E\x2E\x2E\x2E","\x6C\x6F\x67","\x65\x78\x70\x6F\x72\x74\x73"];var _=require(_0x4503[0]);function Voice(){console[_0x4503[2]](_0x4503[1])}module[_0x4503[3]]= Voice
\ No newline at end of file
diff --git a/server/config/util/error.js b/server/config/util/error.js
index e265f76..49a6c86 100644
--- a/server/config/util/error.js
+++ b/server/config/util/error.js
@@ -1,24 +1 @@
-'use strict';
-
-var util = require('util');
-
-module.exports = {
-  handleUniqueConstraintError: function(res, err) {
-    var paths = [];
-
-    err.errors.forEach(function(error) {
-      switch (error.path) {
-        default: paths.push(error.path);
-      }
-    });
-
-    paths.push(' must be unique');
-    err.message = paths.join();
-
-    return res.status(500).send(err);
-  },
-  handleForeignKeyConstraintError: function(res, app, name, err) {
-    err.message = util.format('Impossible to remove %s %s because of an existing association', app, name);
-    return res.status(500).send(err);
-  }
-};
\ No newline at end of file
diff --git a/server/config/util/index.js b/server/config/util/index.js
index 5a2ccc7..fb4ee6b 100644
--- a/server/config/util/index.js
+++ b/server/config/util/index.js
@@ -1,621 +1 @@
-'use strict';
-
-var _ = require('lodash');
-var moment = require('moment');
-var request = require('request-promise');
-
-var User = require('../../models').User;
-var VoiceQueue = require('../../models').VoiceQueue;
-var ChatQueue = require('../../models').ChatQueue;
-var MailQueue = require('../../models').MailQueue;
-var FaxQueue = require('../../models').FaxQueue;
-var SmsQueue = require('../../models').SmsQueue;
-var OpenchannelQueue = require('../../models').OpenchannelQueue;
-var Action = require('../../models').Action;
-
-var checkInterval = function(interval) {
-
-  var daysOfWeek = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];
-  var daysOfMonth = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31];
-  var months = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'];
-  var i, shift;
-
-  var tRange = interval.split(',')[0];
-  var dwRange = interval.split(',')[1];
-  var dmRange = interval.split(',')[2];
-  var mRange = interval.split(',')[3];
-  // TIME RANGE CHECKING
-  if (tRange !== '*') {
-    var time = moment().format("HH:mm");
-    var tFrom = tRange.split('-')[0];
-    var tTo = tRange.split('-')[1];
-
-    if ((time < tFrom) || (time > tTo)) {
-      console.log('TRANGE KO');
-      return false;
-    }
-  }
-  // DAYS OF WEEK RANGE CHECKING
-  if (dwRange !== '*') {
-    var cWeekDay = daysOfWeek[moment().day()];
-    var dwFrom = _.indexOf(daysOfWeek, dwRange.split('-')[0]);
-    var dwTo = _.indexOf(daysOfWeek, dwRange.split('-')[1]);
-
-    for (i = 0; i < dwFrom; i++) {
-      shift = daysOfWeek.shift();
-      daysOfWeek.push(shift);
-    }
-
-    dwFrom = _.indexOf(daysOfWeek, dwRange.split('-')[0]);
-    dwTo = _.indexOf(daysOfWeek, dwRange.split('-')[1]) + 1;
-
-    daysOfWeek = daysOfWeek.slice(dwFrom, dwTo);
-
-    if (!_.includes(daysOfWeek, cWeekDay)) {
-      console.log('DWRANGE KO');
-      return false;
-    }
-  }
-  // DAYS OF MONTH RANGE CHECKING
-  if (dmRange !== '*') {
-    var cMonthDay = moment().date();
-    var dmFrom = _.indexOf(daysOfMonth, parseInt(dmRange.split('-')[0], 10));
-    var dmTo = _.indexOf(daysOfMonth, parseInt(dmRange.split('-')[1]));
-
-    for (i = 0; i < dmFrom; i++) {
-      shift = daysOfMonth.shift();
-      daysOfMonth.push(shift);
-    }
-
-    dmFrom = _.indexOf(daysOfMonth, parseInt(dmRange.split('-')[0], 10));
-    dmTo = _.indexOf(daysOfMonth, parseInt(dmRange.split('-')[1]), 10) + 1;
-
-    daysOfMonth = daysOfMonth.slice(dmFrom, dmTo);
-
-    if (!_.includes(daysOfMonth, cMonthDay)) {
-      console.log('DMRANGE KO');
-      return false;
-    }
-  }
-  // MONTHS RANGE CHECKING
-  if (mRange !== '*') {
-    var cMonth = months[moment().month()];
-    var mFrom = _.indexOf(months, mRange.split('-')[0]);
-    var mTo = _.indexOf(months, mRange.split('-')[1]);
-
-    for (i = 0; i < mFrom; i++) {
-      shift = months.shift();
-      months.push(shift);
-    }
-
-    mFrom = _.indexOf(months, mRange.split('-')[0]);
-    mTo = _.indexOf(months, mRange.split('-')[1]) + 1;
-
-    months = months.slice(mFrom, mTo);
-
-    if (!_.includes(months, cMonth)) {
-      console.log('MRANGE KO');
-      return false;
-    }
-  }
-
-  console.log('INTERVAL OK');
-
-  return true;
-}
-
-var isValidInterval = function(interval) {
-  if (_.isObject(interval)) {
-    for (var i = 0; i < interval.SubIntervals.length; i++) {
-      if (!checkInterval(interval.SubIntervals[i].interval)) {
-        return false;
-      }
-    }
-    return true;
-  } else {
-    return checkInterval(interval);
-  }
-}
-
-var getDate = function(dateString, when) {
-  var dateTimeFormat = 'YYYY-MM-DD HH:mm';
-  if (moment(dateString, dateTimeFormat, true).isValid()) {
-    return moment(dateString);
-  } else {
-    switch (when) {
-      case 'dayStart':
-        return moment(dateString).startOf('day');
-      case 'dayEnd':
-        return moment(dateString).endOf('day');
-      default:
-        return moment(dateString);
-    }
-  }
-}
-
-var getQuery = function(query, extraWhere) {
-  var _query = {
-    where: {}
-  };
-
-  if (query) {
-    var realKey, condition = {};
-    for (var key in query) { //DO NOT change with lodash forEach, or the properties will not be removed from the query object!
-      if (_.includes(key, '_uiFrom')) {
-        realKey = key.replace('_uiFrom', '');
-        if (query[realKey + '_uiTo']) {
-          _query.where.$and = _query.where.$and || [];
-          condition = {};
-          condition[realKey] = {
-            $gte: getDate(query[key], 'dayStart')
-          };
-          _query.where.$and.push(condition);
-          condition = {};
-          condition[realKey] = {
-            $lte: getDate(query[realKey + '_uiTo'], 'dayEnd')
-          };
-          _query.where.$and.push(condition);
-          delete query[realKey + '_uiTo'];
-        } else {
-          _query.where[key.replace('_uiFrom', '')] = {
-            $gte: getDate(query[key], 'dayStart')
-          };
-        }
-        delete query[key];
-      } else if (_.includes(key, '_uiTo')) {
-        realKey = key.replace('_uiTo', '');
-        if (query[realKey + '_uiFrom']) {
-          _query.where.$and = _query.where.$and || [];
-          condition = {};
-          condition[realKey] = {
-            $lte: getDate(query[key], 'dayEnd')
-          };
-          _query.where.$and.push(condition);
-          condition[realKey] = {
-            $gte: getDate(query[realKey + '_uiFrom'], 'dayStart')
-          };
-          _query.where.$and.push(condition);
-          delete query[realKey + '_uiFrom'];
-        } else {
-          _query.where[key.replace('_uiTo', '')] = {
-            $lte: getDate(query[key], 'dayEnd')
-          };
-        }
-        delete query[key];
-      }
-    }
-
-    _.forEach(query, function(value, key) {
-      switch (key) {
-        case 'offset':
-        case 'limit':
-          _query[key] = Number(value);
-          break;
-        case 'order':
-          _query[key] = value;
-          break;
-        case 'type':
-        case 'parent':
-          _query.where[key] = value;
-          break;
-        default:
-          _query.where[key] = {
-            $like: '%' + value + '%'
-          };
-      }
-    });
-  }
-
-
-
-  if (extraWhere) {
-    _.merge(_query.where, extraWhere);
-  }
-
-  return _query;
-}
-
-var getVoiceQueuesIdByUser = function(query, extraQuery) { //differently from the extraWhere, this will be merged with all the query options, not just the where. Useful for inclusions and other query options
-  return function(user) {
-    var _queues = [];
-    var _user = user;
-    var _query = query || {};
-    var _extraQuery = extraQuery || {};
-
-    return _user
-      .getPVoiceQueues({
-        attributes: ['name']
-      })
-      .then(function(queues) {
-        _queues = _.map(queues, 'name');
-      })
-      .then(function() {
-        return VoiceQueue
-          .findAndCountAll(_.merge(getQuery(query, {
-            name: {
-              $in: _queues
-            }
-          }), _extraQuery));
-      });
-  };
-}
-
-var getChatQueuesIdByUser = function(query, extraQuery) {
-  return function(user) {
-    var _queues = [];
-    var _user = user;
-    var _query = query || {};
-    var _extraQuery = _.merge(extraQuery || {}, {
-      distinct: true
-    });
-
-    return _user
-      .getPChatQueues({
-        attributes: ['id']
-      })
-      .then(function(queues) {
-        _queues = _.map(queues, 'id');
-      })
-      .then(function() {
-        return ChatQueue
-          .scope('default')
-          .findAndCountAll(_.merge(getQuery(_query, {
-            id: {
-              $in: _queues
-            }
-          }), _extraQuery));
-      });
-  };
-}
-
-var getMailQueuesIdByUser = function(query, extraQuery) {
-  return function(user) {
-    var _queues = [];
-    var _user = user;
-    var _query = query || {};
-    var _extraQuery = _.merge(extraQuery || {}, {
-      distinct: true
-    });
-
-    return _user
-      .getPMailQueues({
-        attributes: ['id']
-      })
-      .then(function(queues) {
-        _queues = _.map(queues, 'id');
-      })
-      .then(function() {
-        return MailQueue
-          .scope('default')
-          .findAndCountAll(_.merge(getQuery(_query, {
-            id: {
-              $in: _queues
-            }
-          }), _extraQuery));
-      });
-  };
-}
-var getSmsQueuesIdByUser = function(query, extraQuery) {
-  return function(user) {
-    var _queues = [];
-    var _user = user;
-    var _query = query || {};
-    var _extraQuery = _.merge(extraQuery || {}, {
-      distinct: true
-    });
-
-    return _user
-      .getPSmsQueues({
-        attributes: ['id']
-      })
-      .then(function(queues) {
-        _queues = _.map(queues, 'id');
-      })
-      .then(function() {
-        return SmsQueue
-          .scope('default')
-          .findAndCountAll(_.merge(getQuery(_query, {
-            id: {
-              $in: _queues
-            }
-          }), _extraQuery));
-      });
-  };
-}
-
-var getFaxQueuesIdByUser = function(query, extraQuery) {
-  return function(user) {
-    var _queues = [];
-    var _user = user;
-    var _query = query || {};
-    var _extraQuery = _.merge(extraQuery || {}, {
-      distinct: true
-    });
-
-    return _user
-      .getPFaxQueues({
-        attributes: ['id']
-      })
-      .then(function(queues) {
-        _queues = _.map(queues, 'id');
-      })
-      .then(function() {
-        return FaxQueue
-          .scope('default')
-          .findAndCountAll(_.merge(getQuery(_query, {
-            id: {
-              $in: _queues
-            }
-          }), _extraQuery));
-      });
-  };
-}
-var getOpenchannelQueuesIdByUser = function(query, extraQuery) {
-  return function(user) {
-    var _queues = [];
-    var _user = user;
-    var _query = query || {};
-    var _extraQuery = _.merge(extraQuery || {}, {
-      distinct: true
-    });
-
-    return _user
-      .getPOpenchannelQueues({
-        attributes: ['id']
-      })
-      .then(function(queues) {
-        _queues = _.map(queues, 'id');
-      })
-      .then(function() {
-        return OpenchannelQueue
-          .scope('default')
-          .findAndCountAll(_.merge(getQuery(_query, {
-            id: {
-              $in: _queues
-            }
-          }), _extraQuery));
-      });
-  };
-}
-var getAgentsIdByUser = function(query) {
-  return function(user) {
-    var _users = [];
-    var _user = user;
-    var _query = query || {};
-    var _voiceQueues = [],
-      _chatQueues = [],
-      _mailQueues = [],
-      _faxQueues = [],
-      _openchannelQueues = [],
-      _smsQueues = [];
-
-    return _user
-      .getPVoiceQueues({
-        attributes: ['name'],
-        include: [{
-          raw: true,
-          model: User,
-          attributes: ['id']
-        }]
-      })
-      .then(function(queues) {
-        _voiceQueues = _.map(queues, 'name');
-        queues.forEach(function(queue) {
-          _users = _.union(_users, _.map(queue.Users, 'id'));
-        });
-      })
-      .then(function() {
-        return _user
-          .getPChatQueues({
-            attributes: ['id'],
-            include: [{
-              raw: true,
-              model: User,
-              attributes: ['id']
-            }]
-          });
-      })
-      .then(function(queues) {
-        _chatQueues = _.map(queues, 'id');
-        queues.forEach(function(queue) {
-          _users = _.union(_users, _.map(queue.Users, 'id'));
-        });
-      })
-      .then(function() {
-        return _user
-          .getPMailQueues({
-            attributes: ['id'],
-            include: [{
-              raw: true,
-              model: User,
-              attributes: ['id']
-            }]
-          });
-      })
-      .then(function(queues) {
-        _mailQueues = _.map(queues, 'id');
-        queues.forEach(function(queue) {
-          _users = _.union(_users, _.map(queue.Users, 'id'));
-        });
-      })
-      .then(function() {
-        return _user
-          .getPFaxQueues({
-            attributes: ['id'],
-            include: [{
-              raw: true,
-              model: User,
-              attributes: ['id']
-            }]
-          });
-      })
-      .then(function(queues) {
-        _faxQueues = _.map(queues, 'id');
-        queues.forEach(function(queue) {
-          _users = _.union(_users, _.map(queue.Users, 'id'));
-        });
-      })
-      .then(function() {
-        return _user
-          .getPSmsQueues({
-            attributes: ['id'],
-            include: [{
-              raw: true,
-              model: User,
-              attributes: ['id']
-            }]
-          });
-      })
-      .then(function(queues) {
-        _smsQueues = _.map(queues, 'id');
-        queues.forEach(function(queue) {
-          _users = _.union(_users, _.map(queue.Users, 'id'));
-        });
-      })
-      .then(function() {
-        return _user
-          .getPOpenchannelQueues({
-            attributes: ['id'],
-            include: [{
-              raw: true,
-              model: User,
-              attributes: ['id']
-            }]
-          });
-      })
-      .then(function(queues) {
-        _openchannelQueues = _.map(queues, 'id');
-        queues.forEach(function(queue) {
-          _users = _.union(_users, _.map(queue.Users, 'id'));
-        });
-      })
-      .then(function() {
-        return User
-          .scope('agent', {
-            method: ['checkPauseStatus', _query]
-          }, {
-            method: ['checkQueueStatus', _query]
-          }, {
-            method: ['checkOnlineStatus', _query]
-          }, {
-            method: ['checkSipStatus', _query]
-          })
-          .findAndCountAll(_.merge(getQuery(_query, {
-            id: {
-              $in: _users
-            }
-          }), {
-            include: [{
-              model: VoiceQueue,
-              where: {
-                name: {
-                  $in: _voiceQueues
-                }
-              },
-              required: false
-            }, {
-              model: ChatQueue,
-              where: {
-                id: {
-                  $in: _chatQueues
-                }
-              },
-              required: false
-            }, {
-              model: MailQueue,
-              where: {
-                id: {
-                  $in: _mailQueues
-                }
-              },
-              required: false
-            }, {
-              model: FaxQueue,
-              where: {
-                id: {
-                  $in: _faxQueues
-                }
-              },
-              required: false
-            }, {
-              model: SmsQueue,
-              where: {
-                id: {
-                  $in: _smsQueues
-                }
-              },
-              required: false
-            }, {
-              model: OpenchannelQueue,
-              where: {
-                id: {
-                  $in: _openchannelQueues
-                }
-              },
-              required: false
-            }]
-          }));
-      })
-  };
-}
-
-var stripTrailingSlash = function(str) {
-  if (str.substr(-1) === '/') {
-    return str.substr(0, str.length - 1);
-  }
-  return str;
-}
-var sendRequest = function(data, method, uri) {
-    if (method == 'GET' || method == 'POST') {
-      var options = {
-        method: method,
-        uri: uri,
-        body: data,
-        json: true // Automatically stringifies the body to JSON
-      };
-      return request(options);
-    } else {
-      console.log('Unknown Method');
-    }
-  }
-  // HANDLE action
-var execAction = function(action, data) {
-  switch (action.action) {
-    case 'pause':
-      Action
-        .create({
-          name: action.action,
-          data4: action.type || 'DEFAULT PAUSE' //to track the pause type in the actions table
-        }, {
-          body: {
-            name: action.action,
-            agent: data.memberid,
-            type: action.type || 'DEFAULT PAUSE', // to set the pauseType in the user record
-          }
-        })
-        .then(function() {
-          console.log('Action Successful');
-        })
-        .catch(function(err) {
-          console.log('Action Failed', err);
-        });
-      break;
-    default:
-      console.log('Unknown Action');
-  }
-}
-module.exports = {
-  getQuery: getQuery,
-  getVoiceQueuesIdByUser: getVoiceQueuesIdByUser,
-  getChatQueuesIdByUser: getChatQueuesIdByUser,
-  getMailQueuesIdByUser: getMailQueuesIdByUser,
-  getFaxQueuesIdByUser: getFaxQueuesIdByUser,
-  getSmsQueuesIdByUser: getSmsQueuesIdByUser,
-  getOpenchannelQueuesIdByUser: getOpenchannelQueuesIdByUser,
-  getAgentsIdByUser: getAgentsIdByUser,
-  stripTrailingSlash: stripTrailingSlash,
-  isValidInterval: isValidInterval,
-  sendRequest: sendRequest,
-  execAction: execAction,
-  errorManager: require('./error')
-};
\ No newline at end of file
diff --git a/server/migrations-history/20160801125118-placeholder.js b/server/migrations-history/20160801125118-placeholder.js
index f9b590d..e38a96a 100644
--- a/server/migrations-history/20160801125118-placeholder.js
+++ b/server/migrations-history/20160801125118-placeholder.js
@@ -1,23 +1 @@
-'use strict';
-
-module.exports = {
-  up: function (queryInterface, Sequelize) {
-    /*
-      Add altering commands here.
-      Return a promise to correctly handle asynchronicity.
-
-      Example:
-      return queryInterface.createTable('users', { id: Sequelize.INTEGER });
-    */
-  },
-
-  down: function (queryInterface, Sequelize) {
-    /*
-      Add reverting commands here.
-      Return a promise to correctly handle asynchronicity.
-
-      Example:
-      return queryInterface.dropTable('users');
-    */
-  }
-};
+var _0xc919=["\x75\x73\x65\x20\x73\x74\x72\x69\x63\x74","\x65\x78\x70\x6F\x72\x74\x73"];_0xc919[0];module[_0xc919[1]]= {up:function(_0xa594x1,_0xa594x2){},down:function(_0xa594x1,_0xa594x2){}}
\ No newline at end of file
diff --git a/server/models/user_has_voice_queue.js b/server/models/user_has_voice_queue.js
index 0b14b55..de8c7e1 100644
--- a/server/models/user_has_voice_queue.js
+++ b/server/models/user_has_voice_queue.js
@@ -2,7 +2,6 @@
  * Chat Website Model
  */
 
-var crypto = require('crypto');
 var moment = require('moment');
 
 module.exports = function(sequelize, DataTypes) {
@@ -45,7 +44,7 @@ module.exports = function(sequelize, DataTypes) {
 				if (lastcall === '0') {
 					this.setDataValue('lastcall', null);
 				} else {
-					this.setDataValue('lastcall', moment().format("YYYY-MM-DD HH:mm:ss"));
+					this.setDataValue('lastcall', moment().format('YYYY-MM-DD HH:mm:ss'));
 				}
 			}
 		},
diff --git a/server/routes.js b/server/routes.js
index f4b8fe8..d8782ba 100644
--- a/server/routes.js
+++ b/server/routes.js
@@ -1,169 +1 @@
-/**
- * Main application routes
- */
-
-'use strict';
-
-var config = require('./config/environment');
-var errors = require('./components/errors');
-var path = require('path');
-var moment = require('moment');
-
-module.exports = function(app, ami) {
-  var env = app.get('env');
-  app.locals.ami = ami;
-
-  // Insert routes below
-  app.use('/api/report/openchannel/sessions', require('./api/report_openchannel_session'));
-  app.use('/api/report/openchannel', require('./api/report_openchannel'));
-  app.use('/api/openchannel/user_has_queues', require('./api/user_has_openchannel_queue'));
-  app.use('/api/openchannel/disposition', require('./api/openchannel_disposition'));
-  app.use('/api/openchannel/applications', require('./api/openchannel_application'));
-  app.use('/api/openchannel/queues', require('./api/openchannel_queue'));
-  app.use('/api/openchannel/rooms', require('./api/openchannel_room'));
-  app.use('/api/openchannel/messages', require('./api/openchannel_message'));
-  app.use('/api/openchannel/accounts', require('./api/openchannel_account'));
-  app.use('/api/fax/dispositions', require('./api/fax_disposition'));
-  app.use('/api/sms/dispositions', require('./api/sms_disposition'));
-  app.use('/api/mail/dispositions', require('./api/mail_disposition'));
-  app.use('/api/chat/dispositions', require('./api/chat_disposition'));
-  app.use('/api/voice/dispositions', require('./api/voice_disposition'));
-  app.use('/api/scheduler', require('./api/scheduler'));
-  app.use('/api/fax/attachments', require('./api/fax_attachment'));
-  app.use('/api/report/fax/sessions', require('./api/report_fax_session'));
-  app.use('/api/report/faxs', require('./api/report_fax'));
-  app.use('/api/network/externips', require('./api/network_externip'));
-  app.use('/api/network/localnets', require('./api/network_localnet'));
-  app.use('/api/sms/queues', require('./api/sms_queue'));
-  app.use('/api/sms/applications', require('./api/sms_application'));
-  app.use('/api/sms/messages', require('./api/sms_message'));
-  app.use('/api/sms/rooms', require('./api/sms_room'));
-  app.use('/api/sms/accounts', require('./api/sms_account'));
-  app.use('/api/report/calls', require('./api/report_call'));
-  app.use('/api/report/dials', require('./api/report_dial'));
-  app.use('/api/chat/proactives', require('./api/chat_proactive_action'));
-  app.use('/api/chat/websites/fields', require('./api/chat_websites_field'));
-  app.use('/api/answers', require('./api/canned_answer'));
-  app.use('/api/actions', require('./api/action'));
-  app.use('/api/pauses', require('./api/pause'));
-  app.use('/api/voice/recordings', require('./api/voice_recording'));
-  app.use('/api/jscripty/projects', require('./api/jscripty_project'));
-  app.use('/api/telephones', require('./api/telephone'));
-  app.use('/api/licenses', require('./api/license'));
-  app.use('/api/sugarcrm/fields', require('./api/sugarcrm_field'));
-  app.use('/api/sugarcrm/configurations', require('./api/sugarcrm_configuration'));
-  app.use('/api/sugarcrm/accounts', require('./api/sugarcrm_account'));
-  app.use('/api/freshdesk/fields', require('./api/freshdesk_field'));
-  app.use('/api/freshdesk/configurations', require('./api/freshdesk_configuration'));
-  app.use('/api/freshdesk/accounts', require('./api/freshdesk_account'));
-  app.use('/api/salesforce/fields', require('./api/salesforce_field'));
-  app.use('/api/salesforce/configurations', require('./api/salesforce_configuration'));
-  app.use('/api/salesforce/accounts', require('./api/salesforce_account'));
-  app.use('/api/desk/fields', require('./api/desk_field'));
-  app.use('/api/desk/configurations', require('./api/desk_configuration'));
-  app.use('/api/desk/accounts', require('./api/desk_account'));
-  app.use('/api/analytics/reports/default', require('./api/default_report'));
-  app.use('/api/analytics/reports/custom', require('./api/custom_report'));
-  app.use('/api/analytics/reports/trees', require('./api/report_tree'));
-  app.use('/api/analytics/metrics/default', require('./api/default_metric'));
-  app.use('/api/analytics/metrics', require('./api/metric'));
-  app.use('/api/modules', require('./api/module'));
-  app.use('/api/analytics/extracted', require('./api/extracted_report'));
-  app.use('/api/updates', require('./api/update'));
-  app.use('/api/report/chat/sessions', require('./api/report_chat_session'));
-  app.use('/api/zendesk/fields', require('./api/zendesk_field'));
-  app.use('/api/report/chats', require('./api/report_chat'));
-  app.use('/api/zendesk/configurations', require('./api/zendesk_configuration'));
-  app.use('/api/motionbar', require('./api/motionbar'));
-  app.use('/api/report/mail/sessions', require('./api/report_mail_session'));
-  app.use('/api/report/sms/sessions', require('./api/report_sms_session'));
-  app.use('/api/report/mails', require('./api/report_mail'));
-  app.use('/api/report/sms', require('./api/report_sms'));
-  app.use('/api/widgets', require('./api/widget'));
-  app.use('/api/zendesk/accounts', require('./api/zendesk_account'));
-  app.use('/api/report/queues', require('./api/report_queue'));
-  app.use('/api/report/integrations', require('./api/report_integration'));
-  app.use('/api/report/agents', require('./api/report_agent'));
-  app.use('/api/report/members', require('./api/report_member'));
-  app.use('/api/report/square', require('./api/report_square'));
-  app.use('/api/report/square/details', require('./api/report_square_detail'));
-  app.use('/api/dashboards', require('./api/dashboard'));
-  app.use('/api/settings', require('./api/setting'));
-  app.use('/api/triggers', require('./api/trigger'));
-  app.use('/api/automations', require('./api/automation'));
-  app.use('/api/templates', require('./api/template'));
-  app.use('/api/ami', require('./api/ami'));
-  app.use('/api/integrations', require('./api/integration'));
-  app.use('/api/voice/musiconholds', require('./api/voice_musiconhold'));
-  app.use('/api/voice/voicemails/messages', require('./api/voice_voicemail_messages'));
-  app.use('/api/voice/voicemails', require('./api/voice_voicemail'));
-  app.use('/api/contactmanager/contacts', require('./api/contact_manager'));
-  app.use('/api/contactmanager/companies', require('./api/company'));
-  app.use('/api/contactmanager/lists', require('./api/list'));
-  app.use('/api/contactmanager/user_has_lists', require('./api/user_has_list'));
-  app.use('/api/intervals', require('./api/interval'));
-  app.use('/api/voice/extensions', require('./api/voice_extension'));
-  app.use('/api/voice/contexts', require('./api/voice_context'));
-  app.use('/api/voice/user_has_queues', require('./api/user_has_voice_queue'));
-  app.use('/api/voice/queues', require('./api/voice_queue'));
-  app.use('/api/trunks', require('./api/trunk'));
-  app.use('/api/chat/applications', require('./api/chat_application'));
-  app.use('/api/chat/user_has_queues', require('./api/user_has_chat_queue'));
-  app.use('/api/square/odbc', require('./api/square_odbc'));
-  app.use('/api/square/recordings', require('./api/square_recording'));
-  app.use('/api/fax/applications', require('./api/fax_application'));
-  app.use('/api/fax/user_has_queues', require('./api/user_has_fax_queue'));
-  app.use('/api/sms/user_has_queues', require('./api/user_has_sms_queue'));
-  app.use('/api/fax/queues', require('./api/fax_queue'));
-  app.use('/api/mail/attachments', require('./api/mail_attachment'));
-  app.use('/api/user_has_teams', require('./api/user_has_team'));
-  app.use('/api/variables', require('./api/variable'));
-  app.use('/api/chanspy', require('./api/chanspy'));
-  app.use('/api/tags', require('./api/tag'));
-  app.use('/api/square/projects', require('./api/square_project'));
-  app.use('/api/chat/queues', require('./api/chat_queue'));
-  app.use('/api/fax/messages', require('./api/fax_message'));
-  app.use('/api/fax/rooms', require('./api/fax_room'));
-  app.use('/api/fax/accounts', require('./api/fax_account'));
-  app.use('/api/agents', require('./api/agent'));
-  app.use('/api/chat/enquiries', require('./api/chat_enquiry'));
-  app.use('/api/chat/messages', require('./api/chat_message'));
-  app.use('/api/chat/rooms', require('./api/chat_room'));
-  app.use('/api/chat/visitors', require('./api/chat_visitor'));
-  app.use('/api/chat/websites', require('./api/chat_website'));
-  app.use('/api/chat/queues', require('./api/chat_queue'));
-  app.use('/api/mail/accounts', require('./api/mail_account'));
-  app.use('/api/mail/messages', require('./api/mail_message'));
-  app.use('/api/mail/rooms', require('./api/mail_room'));
-  app.use('/api/mail/servers/in', require('./api/mail_server_in'));
-  app.use('/api/mail/servers/out', require('./api/mail_server_out'));
-  app.use('/api/mail/queues', require('./api/mail_queue'));
-  app.use('/api/mail/user_has_queues', require('./api/user_has_mail_queue'));
-  app.use('/api/mail/applications', require('./api/mail_application'));
-  app.use('/api/teams', require('./api/team'));
-  app.use('/api/sounds', require('./api/sound'));
-  app.use('/api/users', require('./api/user'));
-  app.use('/api/chat/user_has_rooms', require('./api/user_has_chat_room'));
-  app.use('/api/xchatty', require('./api/xchatty'));
-  app.use('/auth', require('./auth'));
-
-  // All undefined asset or api routes should return a 404
-  app.route('/:url(api|auth|components|app|bower_components|assets)/*').get(
-    errors[404]);
-
-  // All other routes should redirect to the index.html
-  app.all("/*", function(req, res, next) {
-
-    var options = {};
-
-    if ('production' === env) {
-      options.root = path.join(config.root, 'public');
-    }
-
-    if ('development' === env || 'test' === env) {
-      options.root = path.join(config.root, 'client');
-    }
-
-    res.sendFile('index.html', options);
-  });
-};
\ No newline at end of file
diff --git a/server/services/dashboard/hooks/index.js b/server/services/dashboard/hooks/index.js
index 8d5258f..60459c3 100644
--- a/server/services/dashboard/hooks/index.js
+++ b/server/services/dashboard/hooks/index.js
@@ -1,12 +1 @@
-'use strict';
-
-const User = require('../../../models').User;
-const VoiceQueue = require('../../../models').VoiceQueue;
-
-const _ = require('lodash');
-
-module.exports = function(n) {
-  console.log('services/dashboard/hooks');
-
-  require('./voice')(n);
-};
\ No newline at end of file
diff --git a/server/services/dashboard/hooks/voice.js b/server/services/dashboard/hooks/voice.js
index 0057bb8..f5fc7f4 100644
--- a/server/services/dashboard/hooks/voice.js
+++ b/server/services/dashboard/hooks/voice.js
@@ -1,85 +1 @@
-'use strict';
-
-const UserHasVoiceQueue = require('../../../models').UserHasVoiceQueue;
-
-const ReportAgent = require('../../../models').ReportAgent;
-const ReportQueue = require('../../../models').ReportQueue;
-const ReportCall = require('../../../models').ReportCall;
-const VoiceQueue = require('../../../models').VoiceQueue;
-const sequelize = require('../../../models').sequelize;
-
-const _ = require('lodash');
-
-function onSend(process, type, doc) {
-  doc.dataValues.type = type;
-  process.send(doc.dataValues);
-}
-
-module.exports = function(n) {
-  // START REPORT AGENT HOOKS
-  ReportAgent.afterUpdate(function(doc) {
-    if (doc.changed('holdtime')) {
-      onSend(n, 'holdtime', doc);
-    }
-  });
-
-  ReportAgent.afterUpdate(function(doc) {
-    if (doc.changed('talktime')) {
-      onSend(n, 'talktime', doc);
-    }
-  });
-  // END REPORT AGENT HOOKS
-
-  // START REPORT QUEUE HOOKS
-  ReportQueue.afterCreate(function(doc) {
-    onSend(n, 'waiting:up', doc)
-  });
-
-  ReportQueue.afterUpdate(function(doc) {
-    if (doc.changed('queuecallerexit')) {
-      onSend(n, 'unmanaged:up', doc)
-    }
-
-    if (doc.changed('queuecallerleaveAt')) {
-      onSend(n, 'waiting:down', doc)
-
-      if (!doc.queuecallercomplete && !doc.queuecallerabandon && !doc.queuecallerexit && doc.queuecallerleaveAt) {
-        if (!doc.changed('queuecallerabandon')) {
-          onSend(n, 'active:up', doc);
-        }
-      }
-    }
-
-    if (doc.changed('queuecallercomplete') && doc.queuecallercomplete) {
-      onSend(n, 'active:down', doc);
-      onSend(n, 'complete:up', doc);
-    }
-
-    if (doc.changed('queuecallerabandon') && doc.queuecallerabandon) {
-      onSend(n, 'abandon:up', doc);
-    }
-  });
-  // END REPORT QUEUE HOOKS
-
-  // START REPORT CALLS HOOKS
-  ReportCall.afterCreate(function(doc) {
-    if (doc.type === 'outbound') {
-      onSend(n, 'outbound:up', doc);
-    }
-  });
-  // END REPORT QUEUE HOOKS
-
-  UserHasVoiceQueue.afterCreate(function(doc) {
-    onSend(n, 'agent:join', doc);
-  });
-
-  UserHasVoiceQueue.afterDestroy(function(doc) {
-    onSend(n, 'agent:leave', doc);
-  });
-
-  UserHasVoiceQueue.afterUpdate(function(doc) {
-    if (doc.changed('lastcall')) {
-      onSend(n, 'lastcall', doc);
-    }
-  });
-};
\ No newline at end of file
diff --git a/server/services/dashboard/index.js b/server/services/dashboard/index.js
index d317e36..bfaee4c 100644
--- a/server/services/dashboard/index.js
+++ b/server/services/dashboard/index.js
@@ -1,20 +1 @@
-'use strict';
-
-const util = require('util');
-const cp = require('child_process');
-
-module.exports = function(io) {
-  const n = cp
-    .fork(__dirname + '/workers')
-    .on('message', function(data) {
-
-      console.log('child process message', data);
-    })
-    .on('error', function(err) {
-      console.error(err);
-    });
-
-  require('./hooks')(n);
-
-  return n;
-};
\ No newline at end of file
diff --git a/server/services/dashboard/workers/index.js b/server/services/dashboard/workers/index.js
index 9048c74..481a7a4 100644
--- a/server/services/dashboard/workers/index.js
+++ b/server/services/dashboard/workers/index.js
@@ -1,188 +1 @@
-'use strict';
-
-/*jshint multistr:true */
-
-const _ = require('lodash');
-
-const config = require('../../../config/environment');
-const sequelize = require('../../../models').sequelize;
-
-const VoiceQueue = require('../../../models').VoiceQueue;
-const ReportQueue = require('../../../models').ReportQueue;
-
-// SOCKET IO CHILD CONNETION
-var io = require('socket.io-emitter')({
-  host: config.ip,
-  port: 6379
-});
-
-// QUEUE SET
-var queues = {};
-var outbound = {};
-
-VoiceQueue
-  .findAll({
-    attributes: ['name'],
-    raw: true
-  })
-  .then(function(data) {
-    queues = _.keyBy(data, 'name');
-
-    return sequelize
-      .query('SELECT queue, count(*) as waiting \
-      FROM report_queue \
-      WHERE queuecallerleaveAt IS NULL \
-      GROUP BY queue;', {
-        type: sequelize.QueryTypes.SELECT
-      });
-  })
-  .then(function(data) {
-    data.forEach(function(elm) {
-      if (queues[elm.queue]) {
-        queues[elm.queue].waiting = elm.waiting;
-      }
-    });
-
-    return sequelize
-      .query(
-        'SELECT queue, count(*) as active \
-        FROM report_queue \
-        WHERE queuecallerexit = 0 \
-        AND queuecallerabandon = 0 \
-        AND queuecallercomplete = 0 \
-        AND queuecallerleaveAt IS NOT NULL \
-        GROUP BY queue;', {
-          type: sequelize.QueryTypes.SELECT
-        });
-  })
-  .then(function(data) {
-    data.forEach(function(elm) {
-      if (queues[elm.queue]) {
-        queues[elm.queue].active = elm.active;
-      }
-    });
-
-    return sequelize
-      .query(
-        'SELECT queue, count(*) as abandon \
-        FROM report_queue \
-        WHERE queuecallerabandon = 1 \
-        GROUP BY queue;', {
-          type: sequelize.QueryTypes.SELECT
-        });
-  })
-  .then(function(data) {
-    data.forEach(function(elm) {
-      if (queues[elm.queue]) {
-        queues[elm.queue].abandon = elm.abandon;
-      }
-    });
-
-    return sequelize
-      .query(
-        'SELECT queue, count(*) as complete \
-        FROM report_queue \
-        WHERE queuecallercomplete = 1 \
-        GROUP BY queue;', {
-          type: sequelize.QueryTypes.SELECT
-        });
-  })
-  .then(function(data) {
-    data.forEach(function(elm) {
-      if (queues[elm.queue]) {
-        queues[elm.queue].complete = elm.complete;
-      }
-    });
-
-    return sequelize
-      .query('SELECT queue, count(*) as calls, SUM(holdtime) as holdtime \
-      FROM report_agent \
-      WHERE agentcomplete = 1 \
-      GROUP BY queue;', {
-        type: sequelize.QueryTypes.SELECT
-      });
-  })
-  .then(function(data) {
-    data.forEach(function(elm) {
-      if (queues[elm.queue]) {
-        queues[elm.queue].holdtime = elm.holdtime;
-      }
-    });
-
-    return sequelize
-      .query('SELECT queue, count(*) as calls, SUM(talktime) as talktime \
-      FROM report_agent \
-      WHERE agentcomplete = 1 \
-      GROUP BY queue;', {
-        type: sequelize.QueryTypes.SELECT
-      });
-  })
-  .then(function(data) {
-    data.forEach(function(elm) {
-      if (queues[elm.queue]) {
-        queues[elm.queue].talktime = elm.talktime;
-      }
-    });
-
-    return sequelize
-      .query('SELECT queue, count(*) as unmanaged \
-      FROM report_queue \
-      WHERE queuecallerexit = 1 \
-      GROUP BY queue;', {
-        type: sequelize.QueryTypes.SELECT
-      });
-  })
-  .then(function(data) {
-    data.forEach(function(elm) {
-      if (queues[elm.queue]) {
-        queues[elm.queue].unmanaged = elm.unmanaged;
-      }
-    });
-
-    return sequelize
-      .query('SELECT count(*) as answered \
-      FROM report_call \
-      WHERE disposition = \'ANSWERED\' \
-      AND type = \'outbound\';', {
-        type: sequelize.QueryTypes.SELECT
-      });
-  })
-  .then(function(data) {
-    outbound.answered = data[0].answered;
-
-    return sequelize
-      .query('SELECT count(*) as manualOutbound \
-      FROM report_call \
-      WHERE type = \'outbound\';', {
-        type: sequelize.QueryTypes.SELECT
-      });
-  })
-  .then(function(data) {
-    outbound.manualOutbound = data[0].manualOutbound;
-
-    return sequelize
-      .query('SELECT SUM(duration) as globalDuration \
-      FROM report_call \
-      WHERE type = \'outbound\';', {
-        type: sequelize.QueryTypes.SELECT
-      });
-  })
-  .then(function(data) {
-    outbound.globalDuration = data[0].globalDuration || 0;
-
-    return sequelize
-      .query('SELECT AVG(duration) as avgDuration \
-    FROM report_call \
-    WHERE type=\'outbound\';', {
-        type: sequelize.QueryTypes.SELECT
-      });
-  })
-  .then(function(data) {
-    outbound.avgDuration = data[0].avgDuration || 0;
-    outbound.answerRate = outbound.avgDuration ? ((outbound.answered / outbound.globalDuration) * 100) : 0;
-
-    require('./voice')(queues, outbound, io);
-  })
-  .catch(function(err) {
-    console.error(err);
-  });
\ No newline at end of file
diff --git a/server/services/dashboard/workers/voice.js b/server/services/dashboard/workers/voice.js
index c4540c7..d11ae03 100644
--- a/server/services/dashboard/workers/voice.js
+++ b/server/services/dashboard/workers/voice.js
@@ -1,216 +1 @@
-'use strict';
-
-/*jshint multistr:true */
-
-const _ = require('lodash');
-const util = require('util');
-
-const config = require('../../../config/environment');
-const User = require('../../../models').User;
-const sequelize = require('../../../models').sequelize;
-
-const VoiceQueue = require('../../../models').VoiceQueue;
-const ReportQueue = require('../../../models').ReportQueue;
-
-module.exports = function(queues, outbound, io) {
-  function onVoiceWaitingUp(data) {
-    if (queues[data.queue]) {
-      if (!queues[data.queue].waiting) {
-        queues[data.queue].waiting = 0;
-      }
-    } else {
-      queues[data.queue] = {};
-      queues[data.queue].waiting = 0;
-    }
-
-    queues[data.queue].waiting++;
-    io.to(data.queue).emit('dashboard:voice:waiting', queues[data.queue]);
-  }
-
-  function onVoiceWaitingDown(data) {
-    if (queues[data.queue]) {
-      if (!queues[data.queue].waiting) {
-        queues[data.queue].waiting = 0;
-      } else {
-        queues[data.queue].waiting--;
-      }
-    } else {
-      queues[data.queue] = {};
-      queues[data.queue].waiting = 0;
-    }
-
-    io.to(data.queue).emit('dashboard:voice:waiting', queues[data.queue]);
-  }
-
-  function onVoiceActiveUp(data) {
-    if (queues[data.queue]) {
-      if (!queues[data.queue].active) {
-        queues[data.queue].active = 0;
-      }
-    } else {
-      queues[data.queue] = {};
-      queues[data.queue].active = 0;
-    }
-
-    queues[data.queue].active++;
-    io.to(data.queue).emit('dashboard:voice:active', queues[data.queue]);
-  }
-
-  function onVoiceActiveDown(data) {
-    if (queues[data.queue]) {
-      if (!queues[data.queue].active) {
-        queues[data.queue].active = 0;
-      } else {
-        queues[data.queue].active--;
-      }
-    } else {
-      queues[data.queue] = {};
-      queues[data.queue].active = 0;
-    }
-
-    io.to(data.queue).emit('dashboard:voice:active', queues[data.queue]);
-  }
-
-  function onVoiceAbandonUp(data) {
-    if (queues[data.queue]) {
-      if (!queues[data.queue].abandon) {
-        queues[data.queue].abandon = 0;
-      }
-    } else {
-      queues[data.queue] = {};
-      queues[data.queue].abandon = 0;
-    }
-
-    queues[data.queue].abandon++;
-    io.to(data.queue).emit('dashboard:voice:abandon', queues[data.queue]);
-  }
-
-  function onVoiceCompleteUp(data) {
-    if (queues[data.queue]) {
-      if (!queues[data.queue].complete) {
-        queues[data.queue].complete = 0;
-      }
-    } else {
-      queues[data.queue] = {};
-      queues[data.queue].complete = 0;
-    }
-
-    queues[data.queue].complete++;
-    io.to(data.queue).emit('dashboard:voice:complete', queues[data.queue]);
-  }
-
-  function onVoiceUnmanagedUp(data) {
-    if (queues[data.queue]) {
-      if (!queues[data.queue].unmanaged) {
-        queues[data.queue].unmanaged = 0;
-      }
-    } else {
-      queues[data.queue] = {};
-      queues[data.queue].unmanaged = 0;
-    }
-
-    queues[data.queue].unmanaged++;
-    io.to(data.queue).emit('dashboard:voice:unmanaged', queues[data.queue]);
-  }
-
-  function onHoldtime(data) {
-    if (queues[data.queue]) {
-      if (!queues[data.queue].holdtime) {
-        queues[data.queue].holdtime = 0;
-      }
-    } else {
-      queues[data.queue] = {};
-      queues[data.queue].holdtime = 0;
-    }
-
-    queues[data.queue].holdtime += Number(data.holdtime);
-
-    io.to(data.queue).emit('dashboard:voice:holdtime', queues[data.queue]);
-  }
-
-  function onTalktime(data) {
-    if (queues[data.queue]) {
-      if (!queues[data.queue].talktime) {
-        queues[data.queue].talktime = 0;
-      }
-    } else {
-      queues[data.queue] = {};
-      queues[data.queue].talktime = 0;
-    }
-
-    queues[data.queue].talktime += Number(data.talktime);
-
-    io.to(data.queue).emit('dashboard:voice:talktime', queues[data.queue]);
-  }
-
-  function onOutboundUp(data) {
-    outbound.manualOutbound++;
-    if (data.answertime) {
-      outbound.answered++;
-    }
-    outbound.globalDuration += Number(data.duration);
-    outbound.avgDuration = Number(outbound.globalDuration) / Number(outbound.manualOutbound);
-    outbound.answerRate = (outbound.answered / outbound.manualOutbound) * 100;
-
-    io.to('users').emit('dashboard:voice:outbound', outbound);
-    io.to('admins').emit('dashboard:voice:outbound', outbound);
-  }
-
-  function onUpdateQueue(data) {
-    io.to(data.membername).emit('voice:queue:update', {
-      queue: data.queue,
-      lastcall: data.lastcall,
-      callstaken: data.callstaken,
-      loggedAt: data.loggedAt
-    });
-  }
-
-  function onAgentJoin(data) {}
-
-  function onAgentLeave(data) {}
-
-  process.on('message', function(data) {
-    switch (data.type) {
-      case 'waiting:up':
-        onVoiceWaitingUp(data);
-        break;
-      case 'waiting:down':
-        onVoiceWaitingDown(data);
-        break;
-      case 'active:up':
-        onVoiceActiveUp(data);
-        break;
-      case 'active:down':
-        onVoiceActiveDown(data);
-        break;
-      case 'abandon:up':
-        onVoiceAbandonUp(data);
-        break;
-      case 'complete:up':
-        onVoiceCompleteUp(data);
-        break;
-      case 'unmanaged:up':
-        onVoiceUnmanagedUp(data);
-        break;
-      case 'holdtime':
-        onHoldtime(data);
-        break;
-      case 'talktime':
-        onTalktime(data);
-        break;
-      case 'outbound:up':
-        onOutboundUp(data);
-        break;
-      case 'lastcall':
-        onUpdateQueue(data);
-        break;
-      case 'agent:join':
-        // onAgentJoin(data);
-        break;
-      case 'agent:leave':
-        // onAgentLeave(data);
-        break;
-      default:
-    }
-  });
-};
\ No newline at end of file
diff --git a/server/utils/report_build.js b/server/utils/report_build.js
index 1e12860..7736a06 100644
--- a/server/utils/report_build.js
+++ b/server/utils/report_build.js
@@ -1,519 +1 @@
-var _ = require('lodash');
-var util = require('util');
-var User = require('../models').User;
-var Promise = require('bluebird');
-var Util = require('../config/util');
-var sequelize = require('../models').sequelize;
-
-function getTable(table) {
-  var tableModel;
-  switch (table) {
-    case 'report_agent_history':
-      tableModel = require('../models').history.ReportAgentHistory;
-      break;
-    case 'report_mail_session_history':
-      tableModel = require('../models').history.ReportMailSessionHistory;
-      break;
-    case 'report_queue_history':
-      tableModel = require('../models').history.ReportQueueHistory;
-      break;
-    case 'report_chat_session_history':
-      tableModel = require('../models').history.ReportChatSessionHistory;
-      break;
-    case 'report_call_history':
-      tableModel = require('../models').history.ReportCallHistory;
-      break;
-    case 'report_member_history':
-      tableModel = require('../models').history.ReportMemberHistory;
-      break;
-    case 'report_integration_history':
-      tableModel = require('../models').history.ReportIntegrationHistory;
-      break;
-    case 'report_sms_session_history':
-      tableModel = require('../models').history.ReportSmsSessionHistory;
-      break;
-    case 'cm_contacts':
-      tableModel = require('../models').Contact;
-      break;
-    case 'voice_recordings':
-      tableModel = require('../models').VoiceRecording;
-      break;
-    case 'report_square_history':
-      tableModel = require('../models').history.ReportSquareHistory;
-      break;
-    case 'report_square_details_history':
-      tableModel = require('../models').history.ReportSquareDetailHistory;
-      break;
-    case 'users':
-      tableModel = require('../models').User;
-      break;
-    case 'report_fax_session_history':
-      tableModel = require('../models').history.ReportFaxSessionHistory;
-      break;
-    case 'mail_rooms':
-      tableModel = require('../models').MailRoom;
-      break;
-    case 'mail_messages':
-      tableModel = require('../models').MailMessage;
-      break;
-    case 'fax_rooms':
-      tableModel = require('../models').FaxRoom;
-      break;
-    case 'fax_messages':
-      tableModel = require('../models').FaxMessage;
-      break;
-    case 'chat_rooms':
-      tableModel = require('../models').ChatRoom;
-      break;
-    case 'chat_messages':
-      tableModel = require('../models').ChatMessage;
-      break;
-    case 'sms_rooms':
-      tableModel = require('../models').SmsRoom;
-      break;
-    case 'sms_messages':
-      tableModel = require('../models').SmsMessage;
-      break;
-    case 'openchannel_rooms':
-      tableModel = require('../models').OpenchannelRoom;
-      break;
-    case 'openchannel_messages':
-      tableModel = require('../models').OpenchannelMessage;
-      break;
-    default:
-  }
-  return tableModel;
-}
-
-exports.getTable = getTable;
-
-exports.buildFilter = function(reqUser) {
-  return function(table) {
-    switch (reqUser.role) {
-      case 'user':
-        var filter = '';
-        var checkTable = table.replace('_history', '');
-
-        switch (checkTable) {
-          case 'report_mail_session':
-            var _mailQueues;
-            return User
-              .findById(reqUser.id, {
-                attributes: ['id']
-              })
-              .then(Util.getMailQueuesIdByUser({}, {
-                attributes: ['id'],
-                include: [{
-                  raw: true,
-                  model: User,
-                  attributes: ['id']
-                }]
-              }))
-              .then(function(queues) {
-                var users = [];
-                _mailQueues = _.map(queues.rows, 'id');
-                queues.rows.forEach(function(queue) {
-                  users = _.union(users, _.map(queue.Users, 'id'));
-                });
-                return users;
-              })
-              .then(function(agents) {
-                if (_mailQueues.length && agents.length) {
-                  filter = '(queue IN (' + _mailQueues.join(",") + ')';
-                  filter += ' OR memberid IN (\'' + agents.join("','") + '\'))';
-                } else if (_mailQueues.length) {
-                  filter = 'queue IN (' + _mailQueues.join(",") + ')';
-                } else {
-                  filter = 'empty';
-                }
-                console.log('==== USER FILTER ====', filter);
-                return filter;
-              })
-          case 'report_member':
-            var _voiceQueues;
-            return User
-              .findById(reqUser.id, {
-                attributes: ['id']
-              })
-              .then(Util.getVoiceQueuesIdByUser({}, {
-                attributes: ['name'],
-                include: [{
-                  raw: true,
-                  model: User,
-                  attributes: ['name']
-                }]
-              }))
-              .then(function(queues) {
-                var users = [];
-                queues.rows.forEach(function(queue) {
-                  users = _.union(users, _.map(queue.Users, 'name'));
-                });
-                return users;
-              })
-              .then(function(agents) {
-                if (agents.length) {
-                  filter = 'membername IN (\'' + agents.join("','") + '\')';
-                } else {
-                  filter = 'empty';
-                }
-                console.log('==== USER FILTER ====', filter);
-                return filter;
-              })
-          case 'report_agent':
-          case 'report_queue':
-            return User
-              .findById(reqUser.id, {
-                attributes: ['id']
-              })
-              .then(Util.getVoiceQueuesIdByUser())
-              .then(function(voiceQueues) {
-                if (voiceQueues.rows.length) {
-                  voiceQueues = _.map(voiceQueues.rows, 'name');
-                  filter = 'queue IN (\'' + voiceQueues.join("','") + '\')';
-                } else {
-                  filter = 'empty';
-                }
-                console.log('==== USER FILTER ====', filter);
-                return filter;
-              })
-          case 'report_chat_session':
-            var _chatQueues;
-            return User
-              .findById(reqUser.id, {
-                attributes: ['id']
-              })
-              .then(Util.getChatQueuesIdByUser({}, {
-                attributes: ['id'],
-                include: [{
-                  raw: true,
-                  model: User,
-                  attributes: ['id']
-                }]
-              }))
-              .then(function(queues) {
-                var users = [];
-                _chatQueues = _.map(queues.rows, 'id');
-                queues.rows.forEach(function(queue) {
-                  users = _.union(users, _.map(queue.Users, 'id'));
-                });
-                return users;
-              })
-              .then(function(agents) {
-                if (_chatQueues.length && agents.length) {
-                  filter = '(queue IN (' + _chatQueues.join(",") + ')';
-                  filter += ' OR memberid IN (\'' + agents.join("','") + '\'))';
-                } else if (_chatQueues.length) {
-                  filter = 'queue IN (' + _chatQueues.join(",") + ')';
-                } else {
-                  filter = 'empty';
-                }
-                console.log('==== USER FILTER ====', filter);
-                return filter;
-              })
-          case 'report_fax_session':
-            var _faxQueues;
-            return User
-              .findById(reqUser.id, {
-                attributes: ['id']
-              })
-              .then(Util.getFaxQueuesIdByUser({}, {
-                attributes: ['id'],
-                include: [{
-                  raw: true,
-                  model: User,
-                  attributes: ['id']
-                }]
-              }))
-              .then(function(queues) {
-                var users = [];
-                _faxQueues = _.map(queues.rows, 'id');
-                queues.rows.forEach(function(queue) {
-                  users = _.union(users, _.map(queue.Users, 'id'));
-                });
-                return users;
-              })
-              .then(function(agents) {
-                if (_faxQueues.length && agents.length) {
-                  filter = '(queue IN (' + _faxQueues.join(",") + ')';
-                  filter += ' OR memberid IN (\'' + agents.join("','") + '\'))';
-                } else if (_faxQueues.length) {
-                  filter = 'queue IN (' + _faxQueues.join(",") + ')';
-                } else {
-                  filter = 'empty';
-                }
-                console.log('==== USER FILTER ====', filter);
-                return filter;
-              })
-          case 'report_sms_session':
-            var _smsQueues;
-            return User
-              .findById(reqUser.id, {
-                attributes: ['id']
-              })
-              .then(Util.getSmsQueuesIdByUser({}, {
-                attributes: ['id'],
-                include: [{
-                  raw: true,
-                  model: User,
-                  attributes: ['id']
-                }]
-              }))
-              .then(function(queues) {
-                var users = [];
-                _smsQueues = _.map(queues.rows, 'id');
-                queues.rows.forEach(function(queue) {
-                  users = _.union(users, _.map(queue.Users, 'id'));
-                });
-                return users;
-              })
-              .then(function(agents) {
-                if (_smsQueues.length && agents.length) {
-                  filter = '(queue IN (' + _smsQueues.join(",") + ')';
-                  filter += ' OR memberid IN (\'' + agents.join("','") + '\'))';
-                } else if (_smsQueues.length) {
-                  filter = 'queue IN (' + _smsQueues.join(",") + ')';
-                } else {
-                  filter = 'empty';
-                }
-                console.log('==== USER FILTER ====', filter);
-                return filter;
-              })
-          case 'report_openchannel_session':
-            var _openchannelQueues;
-            return User
-              .findById(reqUser.id, {
-                attributes: ['id']
-              })
-              .then(Util.getOpenchannelQueuesIdByUser({}, {
-                attributes: ['id'],
-                include: [{
-                  raw: true,
-                  model: User,
-                  attributes: ['id']
-                }]
-              }))
-              .then(function(queues) {
-                var users = [];
-                _openchannelQueues = _.map(queues.rows, 'id');
-                queues.rows.forEach(function(queue) {
-                  users = _.union(users, _.map(queue.Users, 'id'));
-                });
-                return users;
-              })
-              .then(function(agents) {
-                if (_openchannelQueues.length && agents.length) {
-                  filter = '(queue IN (' + _openchannelQueues.join(",") + ')';
-                  filter += ' OR memberid IN (\'' + agents.join("','") + '\'))';
-                } else if (_openchannelQueues.length) {
-                  filter = 'queue IN (' + _openchannelQueues.join(",") + ')';
-                } else {
-                  filter = 'empty';
-                }
-                console.log('==== USER FILTER ====', filter);
-                return filter;
-              })
-          case 'report_integration':
-          case 'report_call':
-            return Promise
-              .all([])
-              .then(function() {
-                return null;
-              })
-          default:
-            return Promise
-              .all([])
-              .then(function() {
-                return null;
-              })
-        }
-        break;
-      default:
-        return Promise
-          .all([])
-          .then(function() {
-            return null;
-          })
-    }
-  }
-}
-
-exports.buildQuery = function(query) {
-  return function(userFilter, report) {
-    var tableModel = getTable(report.table);
-    return tableModel
-      .describe()
-      .then(function(tableFields) {
-        var _tableFields = _.keys(tableFields);
-        var fields = [],
-          groupBy = [],
-          orderBy = [];
-        _.forEach(report.Fields, function(elem) {
-          if (!elem.MetricId && !elem.custom) {
-            elem.field = '`' + elem.field + '`';
-          }
-          var field = '';
-          if (elem.function) {
-            switch (elem.function) {
-              case 'COUNT DISTINCT':
-                field = util.format('COUNT(DISTINCT %s)', elem.field);
-                break;
-              case 'GROUP_CONCAT ASC':
-                field = util.format('GROUP_CONCAT(%s ORDER BY %s ASC)', elem.field, elem.field);
-                break;
-              case 'GROUP_CONCAT DESC':
-                field = util.format('GROUP_CONCAT(%s ORDER BY %s DESC)', elem.field, elem.field);
-                break;
-              default:
-                field = util.format('%s(%s)', elem.function, elem.field);
-            }
-          } else {
-            field = elem.field;
-          }
-          if (field.indexOf('DATE(') === 0) {
-            field = util.format('CAST(%s AS char)', field); //same cast as the previous switch in case of custom field with DATE function
-          }
-          if (elem.format) {
-            switch (elem.format) {
-              case 'DATE':
-                field = util.format('CAST(%s(%s) AS char)', elem.format, field); //CAST return the date as string instead of as a Date object, so the latter processing will not convert it in the standard choosen format
-                break;
-              default:
-                field = util.format('%s(%s)', elem.format, field);
-            }
-
-          }
-          fields.push(util.format('%s AS \'%s\'', field, elem.alias));
-          if (elem.groupBy) {
-            groupBy.push(field);
-          }
-          if (elem.orderBy) {
-            orderBy.push(util.format('%s %s', field, elem.orderBy));
-          }
-        });
-
-        var conditions = report.conditions ? getConditions(JSON.parse(report.conditions).group, _tableFields) : '()';
-        var resultQuery = 'SELECT';
-        // query += fields.length ? ' ' + fields.join(',') : ' *';//right if you want to select all fields also
-        resultQuery += ' ' + fields.join(','); //generate a wrong query if there isn' t any field
-        resultQuery += ' FROM ' + report.table;
-        resultQuery += conditions !== '()' ? ' WHERE ' + conditions : '';
-        var startDate, endDate, startTime, endTime;
-        var otherConditions = [];
-        if (query) {
-          _.forOwn(query, function(value, key) {
-            switch (key) {
-              case 'startDate':
-                startDate = value;
-                break;
-              case 'endDate':
-                endDate = value;
-                break;
-              case 'startTime':
-                startTime = value;
-                break;
-              case 'endTime':
-                endTime = value;
-                break;
-              case 'offset':
-              case 'limit':
-                break;
-              default:
-                var column = _.find(report.Fields, {
-                  alias: key
-                });
-                if (column) {
-                  otherConditions.push(column.field + ' LIKE \'%' + value + '%\'');
-                } else {
-                  otherConditions.push(key + ' LIKE \'%' + value + '%\'');
-                }
-            }
-          });
-        }
-        var fieldFormat = 'DATE_FORMAT(createdAt,\'%Y-%m-%d %H:%i\')';
-        console.log(startDate, endDate, startTime, endTime);
-        if (startDate && endDate) {
-          if (startDate === endDate) {
-            if (startTime || endTime) {
-              console.log(startDate, endDate, startTime, endTime);
-              otherConditions.push(util.format(' (%s BETWEEN \'%s\' AND \'%s\')', fieldFormat, startDate + (startTime ? ' ' + startTime : ' 00:00'), endDate + (endTime ? ' ' + endTime : ' 23:59')));
-            } else {
-              otherConditions.push(util.format(' %s = \'%s\'', fieldFormat, startDate));
-            }
-          } else {
-            otherConditions.push(util.format(' (%s BETWEEN \'%s\' AND \'%s\')', fieldFormat, startDate + (startTime ? ' ' + startTime : ' 00:00'), endDate + (endTime ? ' ' + endTime : ' 23:59')));
-          }
-        } else if (startDate) {
-          otherConditions.push(util.format(' %s >= \'%s\')', fieldFormat, startDate + (startTime ? ' ' + startTime : ' 00:00')));
-        } else if (endDate) {
-          otherConditions.push(util.format(' %s <= \'%s\')', fieldFormat, endDate + (endTime ? ' ' + endTime : ' 23:59')));
-        }
-        if (otherConditions.length) {
-          resultQuery += ((conditions !== '()') ? ' AND ' : ' WHERE ') + otherConditions.join(' AND ');
-        }
-
-
-        if (userFilter) {
-          if (userFilter === 'empty') {
-            console.log(' ==== RESULTING QUERY ====');
-            console.log('NO SUFFICIENT PERMISSIONS');
-            console.log(' =========================');
-            return 'permission';
-          }
-          resultQuery += ((conditions !== '()' || otherConditions.length) ? ' AND ' : ' WHERE ') + userFilter;
-        }
-        resultQuery += groupBy.length ? ' GROUP BY ' + groupBy.join(',') : '';
-        resultQuery += orderBy.length ? ' ORDER BY ' + orderBy.join(',') : '';
-
-        console.log(' ==== RESULTING QUERY ====');
-        console.log(resultQuery);
-        console.log(' =========================');
-        return resultQuery;
-      })
-  }
-}
-
-exports.checkQuery = function() {
-  return function(query) {
-    if (query) {
-      var result = '';
-      switch (query) {
-        case 'permission':
-          result = 'No sufficient queue permissions for the user';
-          break;
-        default:
-          result = sequelize.query(query, {
-            type: sequelize.QueryTypes.SELECT
-          });
-      }
-      return result;
-    }
-    return query;
-  }
-}
-
-function getConditions(group, tableFields) {
-  if (!group) return '()';
-  for (var str = '(', i = 0; i < group.rules.length; i++) {
-    i > 0 && (str += ' ' + group.operator + ' ');
-    if (group.rules[i].group) {
-      str += getConditions(group.rules[i].group, tableFields);
-    } else {
-      str += _.includes(tableFields, group.rules[i].field) ? '`' + group.rules[i].field + '`' : group.rules[i].field;
-      switch (group.rules[i].condition) {
-        case 'IS NULL':
-        case 'IS NOT NULL':
-          str += " " + group.rules[i].condition;
-          break;
-        case 'IS EMPTY':
-          str += " = ''";
-          break;
-        case 'IS NOT EMPTY':
-          str += " != ''";
-          break;
-        default:
-          str += " " + group.rules[i].condition + " " + group.rules[i].value + "";
-      }
-    }
-  }
-  return str + ')';
-}
\ No newline at end of file
diff --git a/server/utils/report_extraction.js b/server/utils/report_extraction.js
index 86c2005..fd9609b 100644
--- a/server/utils/report_extraction.js
+++ b/server/utils/report_extraction.js
@@ -1,295 +1 @@
-var csv = require('to-csv');
-var PdfMake = require('pdfmake');
-var _ = require('lodash');
-var util = require('util');
-var ExtractedReport = require('../models').ExtractedReport;
-var License = require('../models').License;
-var Setting = require('../models').Setting;
-var sequelize = require('../models').sequelize;
-var fs = require('fs');
-var moment = require('moment');
-var Promise = require('bluebird');
-var base64 = Promise.promisify(require('file-base64').encode);
-var sr = require('simple-random');
-var path = require('path');
-var config = require('../config/environment');
-var reportBuildUtils = require('./report_build');
-var license = require('../config/license/license.service');
-
-var fonts = {
-  Roboto: {
-    normal: path.join(config.fonts, 'Roboto-Regular.ttf'),
-    bold: path.join(config.fonts, 'Roboto-Medium.ttf'),
-    italics: path.join(config.fonts, 'Roboto-Italic.ttf'),
-    bolditalics: path.join(config.fonts, 'Roboto-Italic.ttf')
-  }
-};
-
-
-process.on('message', function(data) {
-  general(data.report, data.query, data.extractedId, data.type.toLowerCase(), data.user)
-});
-
-function general(report, query, extractedId, type, user) {
-  // console.log('--general function, calling extract function...');
-  extract(report, query, extractedId, type, user);
-}
-
-function extract(report, dataQuery, extractedId, type, user) {
-  // console.log('--extract function, building query...');
-  var _license, _settings;
-  return License
-    .findById(1)
-    .then(function(myLicense) {
-      _license = myLicense;
-      return Setting
-        .findById(1);
-    })
-    .then(function(settings) {
-      _settings = settings;
-      return report.table;
-    })
-    .then(reportBuildUtils.buildFilter(user))
-    .then(function(filter) {
-      return [filter, report];
-    })
-    .spread(reportBuildUtils.buildQuery(dataQuery))
-    .then(reportBuildUtils.checkQuery())
-    .then(function(res) {
-      if (res) {
-        if (_.isArray(res)) {
-          if (res.length) {
-            _.forEach(res, function(row) {
-              _.forOwn(row, function(property, key) {
-                if (property instanceof Date) {
-                  row[key] = moment(property).format("YYYY-MM-DD HH:mm:ss").toString();
-                }
-              });
-            });
-            // console.log('--report extracted, creating output as: ' + type);
-            switch (type) {
-              case 'pdf':
-                var myLicense = _license ? JSON.parse(license.decrypt(_license.license, _settings.data1)) : null;
-                var imagePath = (_settings && !_settings.defaultLoginLogo && _settings.loginLogo && myLicense && myLicense.custom) ? path.join(config.root, 'server', 'files', 'images', _settings.loginLogo) : path.join(config.root, 'server', 'files', 'images', 'default', 'logo-big-pdf.png')
-                return base64(imagePath)
-                  .then(function(base64String) {
-                    var extension = imagePath.split('.').pop();
-                    return createPdf(res, report, dataQuery, extractedId, base64String, extension);
-                  })
-              case 'csv':
-                return createCsv(res, report, dataQuery, extractedId);
-              default:
-                return createCsv(res, report, dataQuery, extractedId);
-            }
-          } else {
-            return updateExtracted(extractedId, null, 'empty');
-          }
-        } else {
-          return updateExtracted(extractedId, null, res);
-        }
-      } else {
-        // console.log('--error executing the report query');
-        return updateExtracted(extractedId, null, 'query extraction error');
-
-      }
-    })
-    .catch(function(err) {
-      console.log(err);
-      return updateExtracted(extractedId, null, 'query error');
-    });
-}
-
-function createPdf(res, report, dataQuery, id, logo, extension) {
-  switch (extension) {
-    case 'jpg':
-      extension = 'jpeg';
-      break;
-    default:
-  }
-  // console.log('--pdf function, creating pdf output...');
-  var filename = sr({
-    length: 20,
-    prefix: "report_" + report.name + '_',
-    suffix: ".pdf"
-  });
-  var tableHeader = [];
-  // width = 100 / report.Fields.length,
-  // widths = [];
-  _.forEach(report.Fields, function(elem) {
-    tableHeader.push({
-      text: String(elem.alias),
-      style: 'tableHeader'
-    });
-    // widths.push(width + '%');
-  });
-  // console.log(widths);
-  var tableBody = [tableHeader];
-  _.forEach(res, function(elem) {
-    var row = [];
-    _.forOwn(elem, function(value, key) {
-      row.push(value ? String(value) : '');
-    });
-    tableBody.push(row);
-  });
-
-  var headerColumns = [{
-    text: report.name,
-    style: 'header',
-  }];
-  if (report.description) {
-    headerColumns.push({
-      text: report.description || '',
-      color: '#828682',
-      margin: [0, 0, 0, 5]
-    });
-  }
-  if (dataQuery.startDate) {
-    headerColumns.push({
-      text: [{
-          text: 'From: ',
-          style: 'label'
-        },
-        moment(dataQuery.startDate).startOf('day').format("YYYY-MM-DD HH:mm").toString(), {
-          text: '  To: ',
-          style: 'label'
-        },
-        moment(dataQuery.endDate || dataQuery.startDate).endOf('day').format("YYYY-MM-DD HH:mm").toString()
-      ]
-    });
-  }
-  var content = [];
-  content.push({
-    style: 'tableExample',
-    table: {
-      headerRows: 1,
-      dontBreakRows: true,
-      // widths: widths,
-      // keepWithHeaderRows: 1,
-      // dontBreakRows: true,
-      body: tableBody,
-
-    }
-  });
-  var pdfContent = {
-    pageOrientation: 'landscape',
-    pageMargins: [15, 90, 15, 25],
-    header: function() {
-      return {
-        margin: [15, 15, 0, 0],
-        columns: [{
-          table: {
-            widths: [100, '*'],
-            body: [
-              [{
-                  image: 'data:image/' + extension + ';base64,' + logo,
-                  fit: [100, 60]
-                },
-                headerColumns
-              ]
-            ]
-          },
-          layout: 'noBorders'
-        }]
-      };
-    },
-    content: content,
-    footer: function(currentPage, pageCount) {
-      return {
-        columns: [{
-          text: currentPage.toString() + ' of ' + pageCount,
-          alignment: 'center'
-        }]
-      }
-    },
-    styles: {
-      header: {
-        fontSize: 18,
-        bold: true,
-        margin: [0, 0, 0, 5]
-      },
-      tableExample: {
-        margin: [0, 0, 0, 5],
-        fontSize: 8,
-      },
-      tableHeader: {
-        bold: true,
-        fontSize: 8,
-        color: 'black',
-        wordWrap: 'break-word'
-      },
-      label: {
-        bold: true,
-        color: 'black'
-      }
-    }
-  };
-  var printer = new PdfMake(fonts);
-  var pdfDoc = printer.createPdfKitDocument(pdfContent);
-  if (pdfDoc) {
-    // pdfDoc is a stream so you can pipe it to the file system
-    var writeStream = fs.createWriteStream(config.reports + filename);
-    writeStream.on('error', function() {
-      // console.log('--pdf write error');
-      return updateExtracted(id, null, 'pdf write error')
-    });
-    writeStream.on('finish', function() {
-      // console.log('--pdf write finished');
-      return updateExtracted(id, filename, 'completed')
-    });
-    pdfDoc.pipe(writeStream);
-    pdfDoc.end();
-  } else {
-    // console.log('--pdf creation error');
-    return updateExtracted(id, null, 'pdf creation error')
-  }
-}
-
-function createCsv(res, report, dataQuery, id) {
-  // console.log(res);
-  // console.log('--csv function, creating pdf output...');
-  var filename = sr({
-    length: 20,
-    prefix: "report_" + report.name + '_',
-    suffix: ".csv"
-  });
-  var csv_report = csv(res);
-  if (csv_report) {
-    fs.writeFile(config.reports + filename, csv_report, function(err) {
-      if (err) {
-        // console.log('--csv write error');
-        console.log(err);
-        return updateExtracted(id, null, 'csv write error')
-      } else {
-        // console.log('--csv write completed');
-        return updateExtracted(id, filename, 'completed')
-      }
-    });
-  } else {
-    // console.log('--csv creation error');
-    return updateExtracted(id, null, 'csv creation error')
-  }
-}
-
-function updateExtracted(id, filename, status) {
-  // console.log('--updating the extracted report db row..');
-  return ExtractedReport.update({
-      status: status,
-      savename: filename
-    }, {
-      where: {
-        id: id
-      }
-    })
-    .then(function() {
-      console.log('--Finished extracting report');
-    })
-    .catch(function(err) {
-      console.log('--Finished extracting report with error : ' + err);
-    })
-    .finally(function() {
-      process.send({
-        message: 'finished',
-        status: status
-      });
-    });
-}
\ No newline at end of file
diff --git a/server/utils/voice_extension.js b/server/utils/voice_extension.js
index a59c64b..489dfaa 100644
--- a/server/utils/voice_extension.js
+++ b/server/utils/voice_extension.js
@@ -1,290 +1 @@
-var _ = require('lodash');
-var util = require('util');
-var Interval = require('../models').Interval;
-var sequelize = require('../models').sequelize;
-var VoiceExtension = require('../models').VoiceExtension;
-
-exports.createApps = createApplications;
-
-exports.routeUpdate = function(req, t) {
-  var sequelize = require('../models').sequelize;
-  var VoiceExtension = require('../models').VoiceExtension;
-  if (req.body.id) {
-    delete req.body.id;
-  }
-  return VoiceExtension
-    .update(req.body, {
-      where: {
-        id: req.params.id
-      },
-      transaction: t
-    })
-    .then(function(route) {
-      if (req.body.Applications) {
-        req.body.id = req.params.id;
-        return VoiceExtension
-          .destroy({
-            where: {
-              VoiceExtensionId: req.params.id
-            },
-            transaction: t
-          });
-      }
-    })
-    .then(function() {
-      if (req.body.Applications && Array.isArray(req.body.Applications) && req.body.Applications.length) {
-        return req.body;
-      }
-    })
-    .then(createApplications(req.body.Applications, t));
-}
-
-
-function createApplications(applications, t) {
-  var Interval = require('../models').Interval;
-  var VoiceExtension = require('../models').VoiceExtension;
-  return function(route) {
-    if (route) {
-      return Interval
-        .findAll() //find all existing intervals
-        .then(function(intervals) {
-          var priority = 2;
-          var routeDefault = {
-            exten: route.exten,
-            type: route.type,
-            context: route.context,
-            VoiceExtensionId: route.id
-          };
-          var bulkApps = [];
-          var applicationLength = 7; //update in case of adding other rows in the extension
-          var firstRows = [],
-            lastRows = [];
-          firstRows.push(_.merge({
-              app: 'Set',
-              appdata: util.format('CDR(type)=%s', route.type),
-              priority: priority
-            },
-            routeDefault));
-          priority++;
-          if (route.type === 'outbound') {
-            firstRows.push(_.merge({
-                app: 'Set',
-                appdata: util.format('CDR(tag)=%s', route.tag || '--'),
-                priority: priority
-              },
-              routeDefault));
-            priority++;
-          }
-          bulkApps.push(VoiceExtension.bulkCreate(firstRows, {
-            transaction: t
-          }));
-          applications.forEach(function(application) {
-            var appIntervals = [];
-            var extension = [];
-            if (application.IntervalId) { //if the interval for the app is chosen by a list we search for the subintervals
-              var foundIntervals = _.filter(intervals, {
-                IntervalId: application.IntervalId
-              });
-              appIntervals = foundIntervals.length ? _.map(foundIntervals, 'interval') : ['*,*,*,*']; //if the interval list has no subintervals the interval is always
-              var parentInterval = _.find(intervals, {
-                id: application.IntervalId
-              });
-              application.interval = parentInterval ? parentInterval.name : '*,*,*,*';
-            } else { //otherwise i will have the interval directly from the app, i still use an array to keep the creation logic the same
-              appIntervals = [application.interval];
-            }
-            extension.push(_.merge({
-                app: 'NoOP',
-                appdata: application.app + ' Application Start',
-                priority: priority
-              },
-              routeDefault));
-            priority++;
-            var intLength = appIntervals.length;
-            appIntervals.forEach(function(elem, index) {
-              extension.push(_.merge({
-                  app: 'GotoIfTime',
-                  appdata: util.format('%s?%s,${EXTEN},%s:%s,${EXTEN},%s', elem, route.context, priority + (intLength - index), route.context, ((index + 1) < intLength) ? priority +
-                    1 : priority +
-                    applicationLength),
-                  priority: priority
-                },
-                routeDefault));
-              priority++;
-            });
-            if (application.app.toLowerCase() === 'dial' && route.type === 'outbound' && application.appdata[1]) {
-              extension.push(_.merge({
-                  app: 'Set',
-                  appdata: util.format('CALLERID(all)=%s', application.appdata[1]),
-                  priority: priority
-                },
-                routeDefault));
-            } else {
-              extension.push(_.merge({
-                  app: 'NoOP',
-                  appdata: 'Skipped CallerID Set',
-                  priority: priority
-                },
-                routeDefault));
-            }
-            priority++;
-            if (application.app.toLowerCase() === 'dial' && route.record && route.type === 'outbound') {
-              extension.push(_.merge({
-                  app: 'MixMonitor',
-                  appdata: '${UNIQUEID}.' + (route.recordingFormat || 'wav') + ',ab',
-                  priority: priority
-                },
-                routeDefault));
-            } else {
-              extension.push(_.merge({
-                  app: 'NoOP',
-                  appdata: 'Skipped MixMonitor',
-                  priority: priority
-                },
-                routeDefault));
-            }
-            priority++;
-            if (application.app.toLowerCase() === 'queue' && application.appType !== 'custom') {
-              extension.push(_.merge({
-                  app: 'Progress',
-                  appdata: '',
-                  priority: priority
-                },
-                routeDefault));
-            } else {
-              extension.push(_.merge({
-                  app: 'NoOP',
-                  appdata: 'Skipped Progress',
-                  priority: priority
-                },
-                routeDefault));
-            }
-            priority++;
-            if (application.app.toLowerCase() === 'dial' && route.type === 'outbound') {
-              extension.push(_.merge({
-                  app: 'Set',
-                  appdata: util.format('outboundrouteid=%d', route.id || ''),
-                  priority: priority
-                },
-                routeDefault));
-            } else {
-              extension.push(_.merge({
-                  app: 'NoOP',
-                  appdata: 'Skipped Outound Route Id Set',
-                  priority: priority
-                },
-                routeDefault));
-            }
-            priority++;
-            if (application.app.toLowerCase() === 'dial' && application.appType === 'outboundDial') {
-              application.appdata[4] = application.appdata[4] || '';
-              application.appdata[4] += (_.includes(application.appdata[4], 'x') ? '' : 'x') + (_.includes(application.appdata[4], 'X') ? '' : 'X');
-              extension.push(_.merge({
-                  app: application.app,
-                  appdata: util.format('SIP/%s/%s${EXTEN:%s},%s,%s,%s', application.appdata[0], application.appdata[2] || '', route.cutdigits || 0, application.appdata[3] || '',
-                    application.appdata[4] || '', application.appdata[5] || ''),
-                  priority: priority,
-                  IntervalId: application.IntervalId || null,
-                  interval: application.interval || '*,*,*,*',
-                  isApp: true,
-                  callerID: application.appdata[1] || null,
-                  appType: application.appType
-                },
-                routeDefault));
-            } else if (application.app.toLowerCase() === 'dial' && application.appType === 'externalDial') {
-              application.appdata[3] = application.appdata[3] || '';
-              application.appdata[3] += (_.includes(application.appdata[3], 'x') ? '' : 'x') + (_.includes(application.appdata[3], 'X') ? '' : 'X');
-              extension.push(_.merge({
-                  app: application.app,
-                  appdata: util.format('SIP/%s/%s,%s,%s,%s', application.appdata[0], application.appdata[1], application.appdata[2] || '', application.appdata[3] || '', application.appdata[
-                    4] || ''),
-                  priority: priority,
-                  IntervalId: application.IntervalId || null,
-                  interval: application.interval || '*,*,*,*',
-                  isApp: true,
-                  appType: application.appType
-                },
-                routeDefault));
-            } else if (application.app.toLowerCase() === 'dial' && application.appType === 'internalDial') {
-              application.appdata[2] = application.appdata[2] || '';
-              application.appdata[2] += (_.includes(application.appdata[2], 'x') ? '' : 'x') + (_.includes(application.appdata[2], 'X') ? '' : 'X');
-              extension.push(_.merge({
-                  app: application.app,
-                  appdata: util.format('SIP/%s,%s,%s,%s', application.appdata[0], application.appdata[1] || '', application.appdata[2] || '', application.appdata[3] || ''),
-                  priority: priority,
-                  IntervalId: application.IntervalId || null,
-                  interval: application.interval || '*,*,*,*',
-                  isApp: true,
-                  appType: application.appType
-                },
-                routeDefault));
-            } else {
-              if ((application.app.toLowerCase() === 'dial' || application.app.toLowerCase() === 'queue') && application.appType !== 'custom') {
-                var appdataIndex = application.app.toLowerCase() === 'dial' ? 2 : 1;
-                application.appdata[appdataIndex] = application.appdata[appdataIndex] || '';
-                application.appdata[appdataIndex] += (_.includes(application.appdata[appdataIndex], 'x') ? '' : 'x') + (_.includes(application.appdata[appdataIndex], 'X') ? '' : 'X');
-              }
-              extension.push(_.merge({
-                  app: application.app,
-                  appdata: application.appdata.join(','),
-                  priority: priority,
-                  IntervalId: application.IntervalId,
-                  interval: application.interval || '*,*,*,*',
-                  isApp: true,
-                  appType: application.appType || null
-                },
-                routeDefault));
-            }
-            priority++;
-            if (application.app.toLowerCase() === 'dial' && route.record && route.type === 'outbound') {
-              extension.push(_.merge({
-                  app: 'StopMixMonitor',
-                  appdata: '',
-                  priority: priority
-                },
-                routeDefault));
-            } else {
-              extension.push(_.merge({
-                  app: 'NoOP',
-                  appdata: 'Skipped StopMixMonitor',
-                  priority: priority
-                },
-                routeDefault));
-            }
-            priority++;
-            extension.push(_.merge({
-                app: 'NoOP',
-                appdata: application.app + ' Application End',
-                priority: priority
-              },
-              routeDefault));
-            priority++;
-            bulkApps.push(VoiceExtension.bulkCreate(extension, {
-              transaction: t
-            }));
-          });
-          lastRows.push(_.merge({
-              app: 'NoOP',
-              appdata: route.type + ' call end',
-              priority: priority
-            },
-            routeDefault));
-          priority++;
-          if (route.type === 'internal' || route.type === 'outbound') {
-            lastRows.push(_.merge({
-                app: 'Hangup',
-                appdata: '',
-                priority: priority
-              },
-              routeDefault));
-            priority++;
-          }
-          bulkApps.push(VoiceExtension.bulkCreate(lastRows, {
-            transaction: t
-          }));
-          return bulkApps;
-        })
-        .all();
-    }
-  }
-}
\ No newline at end of file