src/admin/resources/dist/main.js
function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
(function () {
"use strict"; // directive.js
zaa.directive("menuDropdown", ['ServiceMenuData', 'ServiceCurrentWebsite', '$filter', function (ServiceMenuData, ServiceCurrentWebsite, $filter) {
return {
restrict: 'E',
scope: {
navId: '='
},
controller: ['$scope', function ($scope) {
$scope.changeModel = function (data) {
$scope.navId = data.id;
};
$scope.currentWebsite = ServiceCurrentWebsite.currentWebsite;
$scope.$on('service:CurrentWebsiteChanged', function (event, data) {
$scope.currentWebsite = ServiceCurrentWebsite.currentWebsite;
});
$scope.menuData = angular.copy(ServiceMenuData.data);
$scope.menuDataOriginal = angular.copy(ServiceMenuData.data);
$scope.$on('service:MenuData', function (event, data) {
$scope.menuData = angular.copy(data);
$scope.menuDataOriginal = angular.copy(data);
});
function init() {
if ($scope.menuData.length == 0) {
ServiceMenuData.load().then(function () {
ServiceCurrentWebsite.load();
});
}
}
for (var container in $scope.menuData.containers) {
$scope.menuData.containers[container].isHidden = false;
}
$scope.$watch('searchQuery', function (n) {
if (n == null || n == '') {
$scope.menuData.items = angular.copy($scope.menuDataOriginal.items);
return;
}
var items = $filter('filter')($scope.menuDataOriginal.items, {
title: n
}); // find all parent elements of the found elements and re add them to the map in order to
// ensure a correct menu tree.
angular.forEach(items, function (value) {
if (value['parent_nav_id'] > 0) {
$scope.bubbleParents(value['parent_nav_id'], value['nav_container_id'], items);
}
});
$scope.menuData.items = items;
});
$scope.bubbleParents = function (parentNavId, containerId, index) {
var item = $filter('menuchildfilter')($scope.menuDataOriginal.items, containerId, parentNavId);
if (item) {
var exists = false;
angular.forEach(index, function (i) {
if (i.id == item.id) {
exists = true;
}
});
if (!exists) {
index.push(item);
}
$scope.bubbleParents(item.parent_nav_id, item.nav_container_id, index);
}
};
$scope.toggler = true;
init();
}],
template: function template() {
return '<div>' + '<div class="input-group mb-2">' + '<div class="input-group-prepend" ng-hide="searchQuery"><div class="input-group-text"><i class="material-icons">search</i></div></div>' + '<div class="input-group-prepend" ng-show="searchQuery" ng-click="searchQuery = \'\'"><div class="input-group-text"><i class="material-icons">clear</i></div></div>' + '<input class="form-control" ng-model="searchQuery" type="text" placeholder="' + i18n['ngrest_crud_search_text'] + '">' + '</div>' + '<div ng-repeat="(key, container) in menuData.containers | menuwebsitefilter:currentWebsite.id" ng-if="(menuData.items | menuparentfilter:container.id:0).length > 0" class="card mb-2" ng-class="{\'card-closed\': !container.isHidden}">' + '<div class="card-header" ng-click="container.isHidden=!container.isHidden">' + '<span class="material-icons card-toggle-indicator">keyboard_arrow_down</span>' + '<span>{{container.name}}</span>' + '</div>' + '<div class="card-body">' + '<div class="treeview treeview-chooser">' + '<ul class="treeview-items treeview-items-lvl1">' + '<li class="treeview-item treeview-item-lvl1" ng-class="{\'treeview-item-has-children\' : (menuData.items | menuparentfilter:container.id:0).length}" ng-repeat="(key, data) in menuData.items | menuparentfilter:container.id:0 track by data.id" ng-include="\'menuDropdownReverse\'"></li>' + '</ul>' + '</div>' + '</div>' + '</div>' + '</div>';
}
};
}]);
zaa.directive("zaaCmsPage", function () {
return {
restrict: "E",
scope: {
"model": "=",
"options": "=",
"label": "@label",
"i18n": "@i18n",
"id": "@fieldid",
"name": "@fieldname",
"clearable": "@clearable"
},
controller: ['$scope', function ($scope) {
$scope.resetValue = function () {
$scope.model = null;
};
}],
template: function template() {
return '<div class="form-group form-side-by-side" ng-class="{\'input--hide-label\': i18n}">' + '<div class="form-side form-side-label">' + '<label>{{label}}</label>' + '</div>' + '<div class="form-side">' + '<menu-dropdown class="menu-dropdown" nav-id="model"></menu-dropdown>' + '<button ng-if="clearable && model" ng-click="resetValue()" type="button" class="btn btn-sm btn-secondary"><i class="material-icons">clear</i></button>' + '</div>' + '</div>';
}
};
});
zaa.directive("showInternalRedirection", function () {
return {
restrict: 'E',
scope: {
navId: '='
},
controller: ['$scope', '$http', '$state', function ($scope, $http, $state) {
$scope.$watch('navId', function (n) {
if (n) {
$http.get('admin/api-cms-navitem/get-nav-item-path', {
params: {
navId: $scope.navId
}
}).then(function (response) {
$scope.path = response.data;
});
$http.get('admin/api-cms-navitem/get-nav-container-name', {
params: {
navId: $scope.navId
}
}).then(function (response) {
$scope.container = response.data;
});
}
});
}],
template: function template() {
return '<a class="btn btn-secondary btn-sm" ui-sref="custom.cmsedit({ navId : navId, templateId: \'cmsadmin/default/index\'})">{{path}}</a> in {{container}}';
}
};
});
zaa.directive("createForm", function () {
return {
restrict: 'EA',
scope: {
data: '='
},
templateUrl: 'createform.html',
controller: ['$scope', '$http', '$filter', 'ServiceMenuData', 'ServiceLanguagesData', 'AdminToastService', 'ServiceCurrentWebsite', function ($scope, $http, $filter, ServiceMenuData, ServiceLanguagesData, AdminToastService, ServiceCurrentWebsite) {
$scope.error = [];
$scope.success = false;
$scope.controller = $scope.$parent;
$scope.menuData = ServiceMenuData.data;
$scope.$on('service:MenuData', function (event, data) {
$scope.menuData = data;
});
$scope.menuDataReload = function () {
return ServiceMenuData.load(true);
};
function initializer() {
$scope.menu = $scope.menuData.items;
$scope.navcontainers = $scope.menuData.containers;
}
initializer();
$scope.data.nav_item_type = 1;
$scope.data.parent_nav_id = 0;
$scope.data.is_draft = 0;
$scope.data.nav_container_id = ServiceCurrentWebsite.currentWebsite.default_container_id;
$scope.currentWebsite = ServiceCurrentWebsite.currentWebsite;
$scope.$on('service:CurrentWebsiteChanged', function (event, data) {
if (ServiceCurrentWebsite.currentWebsite) {
$scope.currentWebsite = ServiceCurrentWebsite.currentWebsite;
$scope.data.nav_container_id = ServiceCurrentWebsite.currentWebsite.default_container_id;
}
});
$scope.languagesData = ServiceLanguagesData.data;
$scope.$on('service:LanguagesData', function (event, data) {
$scope.languagesData = data;
});
$scope.isDefaultItem = $scope.languagesData.find(function (item) {
return item.is_default;
});
$scope.data.lang_id = $scope.isDefaultItem.id;
$scope.$watch(function () {
return $scope.data.nav_container_id;
}, function (n, o) {
if (n !== undefined && n !== o) {
$scope.data.parent_nav_id = 0;
}
});
$scope.aliasSuggestion = function () {
$scope.data.alias = $filter('slugify')($scope.data.title);
};
$scope.$watch('data.alias', function (n, o) {
if (n != o && n != null) {
$scope.data.alias = $filter('slugify')(n);
}
});
$scope.exec = function () {
$scope.controller.save().then(function (response) {
$scope.menuDataReload();
$scope.success = true;
$scope.error = [];
$scope.data.title = null;
$scope.data.alias = null;
if ($scope.data.isInline) {
$scope.$parent.$parent.getItem($scope.data.lang_id, $scope.data.nav_id);
}
AdminToastService.success(i18n['view_index_page_success']);
}, function (reason) {
angular.forEach(reason, function (value, key) {
AdminToastService.error(value[0]);
});
$scope.error = reason;
});
};
}]
};
});
/** PAGE CREATE & UPDATE */
zaa.directive("updateFormPage", ['ServiceLayoutsData', function (ServiceLayoutsData) {
return {
restrict: 'EA',
scope: {
data: '='
},
templateUrl: 'updateformpage.html',
controller: ['$scope', '$http', function ($scope, $http) {
$scope.parent = $scope.$parent.$parent;
$scope.navItemId = $scope.parent.item.id;
$scope.data.layout_id = 0;
$scope.layoutsData = ServiceLayoutsData.data;
$scope.arrayToSelect = function (input, valueField, labelField) {
var output = [];
angular.forEach(input, function (value) {
output.push({
"label": value[labelField],
"value": value[valueField]
});
});
return output;
};
$scope.$on('service:LayoutsData', function (event, data) {
$scope.layoutsData = []; // $scope.arrayToSelect(data); // @TODO REMOVE IF VERIFIED
});
$scope.versionsData = [];
$scope.getVersionList = function () {
$http.get('admin/api-cms-navitempage/versions', {
params: {
navItemId: $scope.navItemId
}
}).then(function (response) {
$scope.versionsData = $scope.arrayToSelect(response.data, 'id', 'version_alias');
});
};
$scope.isEditAvailable = function () {
return $scope.versionsData.length;
};
function init() {
$scope.getVersionList();
}
init();
}]
};
}]);
zaa.directive("createFormPage", function () {
return {
restrict: 'EA',
scope: {
data: '='
},
templateUrl: 'createformpage.html',
controller: ['$scope', 'ServiceLayoutsData', 'ServiceMenuData', function ($scope, ServiceLayoutsData, ServiceMenuData) {
$scope.data.use_draft = 0;
$scope.data.layout_id = 0;
$scope.data.from_draft_id = 0;
/* layoutsData */
$scope.layoutsData = ServiceLayoutsData.data;
$scope.$on('service:BlocksData', function (event, data) {
$scope.layoutsData = data;
});
/* menuData */
$scope.menuData = ServiceMenuData.data;
$scope.$on('service:MenuData', function (event, data) {
$scope.menuData = data;
});
$scope.arrayToSelect = function (input, valueField, labelField) {
var output = [];
angular.forEach(input, function (value) {
output.push({
"label": value[labelField],
"value": value[valueField]
});
});
return output;
};
function init() {
$scope.drafts = $scope.arrayToSelect($scope.menuData.drafts, 'id', 'title');
$scope.layouts = $scope.arrayToSelect($scope.layoutsData, 'id', 'name');
}
init();
$scope.save = function () {
$scope.$parent.exec();
};
}]
};
});
/* Page MODULE */
zaa.directive("formModule", function () {
return {
restrict: 'EA',
scope: {
data: '='
},
templateUrl: 'formmodule.html',
controller: ['$scope', '$http', function ($scope, $http) {
$scope.modules = [];
$scope.controllers = [];
$scope.actions = [];
$scope.params = {};
$http.get('admin/api-admin-common/data-modules').then(function (response) {
$scope.modules = response.data;
});
$scope.addParam = function (key) {
if (!$scope.data.hasOwnProperty('action_params')) {
$scope.data.action_params = {};
}
$scope.data.action_params[key] = '';
};
$scope.$watch(function () {
return $scope.data.module_name;
}, function (n) {
if (n) {
$http.get('admin/api-cms-admin/module-controllers?module=' + n).then(function (response) {
$scope.controllers = response.data;
$scope.actions = [];
});
}
});
$scope.$watch(function () {
return $scope.data.controller_name;
}, function (n) {
if (n) {
$http.get('admin/api-cms-admin/controller-actions?module=' + $scope.data.module_name + '&controller=' + n).then(function (response) {
$scope.actions = response.data;
});
}
});
}]
};
});
/* filters */
zaa.filter("menuwebsitefilter", function () {
return function (input, websiteId) {
var result = [];
angular.forEach(input, function (value, key) {
if (value.website_id == websiteId) {
result.push(value);
}
});
return result;
};
});
zaa.filter("menuparentfilter", function () {
return function (input, containerId, parentNavId) {
var result = [];
angular.forEach(input, function (value, key) {
if (value.parent_nav_id == parentNavId && value.nav_container_id == containerId) {
result.push(value);
}
});
return result;
};
});
zaa.filter('menuchildfilter', function () {
return function (input, containerId, parentNavId) {
var returnValue = false;
angular.forEach(input, function (value, key) {
if (!returnValue) {
if (value.id == parentNavId && value.nav_container_id == containerId) {
returnValue = value;
}
}
});
return returnValue;
};
});
/* factory.js */
zaa.factory('PlaceholderService', function () {
var service = [];
service.status = 1;
/* 1 = showplaceholders; 0 = hide placeholders */
service.delegate = function (status) {
service.status = status;
};
return service;
});
/* layout.js */
zaa.config(['$stateProvider', function ($stateProvider) {
$stateProvider.state("custom.cmsedit", {
url: "/update/:navId",
templateUrl: 'cmsadmin/page/update'
}).state("custom.cmsadd", {
url: "/create",
templateUrl: 'cmsadmin/page/create'
}).state("custom.cmsdraft", {
url: '/drafts',
templateUrl: 'cmsadmin/page/drafts'
});
}]);
/* controllers */
zaa.controller("DraftsController", ['$scope', '$state', 'ServiceMenuData', function ($scope, $state, ServiceMenuData) {
$scope.menuData = ServiceMenuData.data;
$scope.$on('service:MenuData', function (event, data) {
$scope.menuData = data;
});
$scope.go = function (navId) {
$state.go('custom.cmsedit', {
navId: navId
});
};
}]);
zaa.controller("CmsDashboard", ['$scope', '$http', function ($scope, $http) {
$scope.dashboard = [];
$http.get('admin/api-cms-admin/dashboard-log').then(function (response) {
$scope.dashboard = response.data;
});
}]);
zaa.controller("ConfigController", ['$scope', '$http', 'AdminToastService', function ($scope, $http, AdminToastService) {
$scope.data = {};
$http.get('admin/api-cms-admin/config').then(function (response) {
$scope.data = response.data;
});
$scope.save = function () {
$http.post('admin/api-cms-admin/config', $scope.data).then(function (response) {
AdminToastService.success(i18n['js_config_update_success']);
});
};
}]);
zaa.controller("PageVersionsController", ['$scope', '$http', 'ServiceLayoutsData', 'AdminToastService', function ($scope, $http, ServiceLayoutsData, AdminToastService) {
/**
* @var object $typeData From parent scope controller NavItemController
* @var object $item From parent scope controller NavItemController
* @var string $versionName From ng-model
* @var integer $fromVersionPageId From ng-model the version copy from or 0 = new empty/blank version
* @var integer $versionLayoutId From ng-model, only if fromVersionPageId is 0
*/
var headers = {
"headers": {
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"
}
};
/* layoutsData */
$scope.layoutsData = ServiceLayoutsData.data;
$scope.$on('service:LayoutsData', function (event, data) {
$scope.layoutsData = data;
});
/* controller logic */
$scope.createNewVersionSubmit = function (data) {
if (data == undefined) {
AdminToastService.error(i18n['js_version_error_empty_fields']);
return null;
}
if (data.copyExistingVersion) {
data.versionLayoutId = 0;
}
$http.post('admin/api-cms-navitem/create-page-version', $.param({
'layoutId': data.versionLayoutId,
'navItemId': $scope.item.id,
'name': data.versionName,
'fromPageId': data.fromVersionPageId
}), headers).then(function (response) {
if (response.data.error) {
AdminToastService.error(i18n['js_version_error_empty_fields']);
return null;
}
$scope.refreshForce();
AdminToastService.success(i18n['js_version_create_success']);
});
};
}]);
zaa.controller("CopyPageController", ['$scope', '$http', '$filter', 'AdminToastService', function ($scope, $http, $filter, AdminToastService) {
var headers = {
"headers": {
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"
}
};
$scope.$on('deletedNavItem', function () {
$scope.isOpen = false;
$scope.itemSelection = false;
$scope.selection = 0;
});
$scope.NavItemController = $scope.$parent;
$scope.navId = 0;
$scope.items = null;
$scope.isOpen = false;
$scope.itemSelection = false;
$scope.selection = 0;
$scope.select = function (item) {
$scope.selection = item.id;
$scope.itemSelection = angular.copy(item);
};
$scope.$watch('itemSelection.title', function (n, o) {
if (n) {
$scope.aliasSuggestion();
}
});
$scope.aliasSuggestion = function () {
$scope.itemSelection.alias = $filter('slugify')($scope.itemSelection.title);
};
$scope.loadItems = function () {
$scope.navId = $scope.NavItemController.NavController.navData.id;
$http.get('admin/api-cms-nav/find-nav-items', {
params: {
navId: $scope.navId
}
}).then(function (response) {
$scope.items = response.data;
$scope.isOpen = true;
});
};
$scope.save = function () {
$scope.itemSelection['toLangId'] = $scope.NavItemController.lang.id;
$http.post('admin/api-cms-nav/create-from-page', $.param($scope.itemSelection), headers).then(function (response) {
if (response.data) {
AdminToastService.success(i18n['js_added_translation_ok']);
$scope.NavItemController.refresh();
} else {
AdminToastService.error(i18n['js_added_translation_error']);
}
}, function (response) {
AdminToastService.errorArray(response.data);
});
};
}]);
zaa.controller("CmsMenuTreeController", ['$scope', '$rootScope', '$state', '$http', '$filter', 'ServiceMenuData', 'ServiceLiveEditMode', 'ServiceCurrentWebsite', function ($scope, $rootScope, $state, $http, $filter, ServiceMenuData, ServiceLiveEditMode, ServiceCurrentWebsite) {
// live edit service
$scope.liveEditState = 0;
$scope.$watch('liveEditStateToggler', function (n) {
ServiceLiveEditMode.state = n;
});
$scope.loadCmsConfig = function () {
$http.get('admin/api-cms-admin/config').then(function (response) {
$rootScope.cmsConfig = response.data;
});
};
$scope.loadCmsConfig(); // menu Data
$scope.menuData = ServiceMenuData.data;
$scope.currentWebsite = ServiceCurrentWebsite.currentWebsite;
$scope.$on('service:MenuData', function (event, data) {
$scope.menuData = data;
});
$scope.menuDataReload = function () {
return ServiceMenuData.load(true);
}; // Contains the current website id, is initialized with false as value
$scope.currentWebsiteToggler = false;
$scope.$watch('currentWebsiteToggler', function (newValue, oldValue) {
if (newValue && newValue !== oldValue) {
ServiceCurrentWebsite.toggle(newValue);
}
}); // initialize the state of the current menu service
$scope.currentWebsite = ServiceCurrentWebsite.currentWebsite; // if the state has recived a value, after the service event has been triggered, this ensures
// the current website is displayed. Like a lazy load ensurance
if ($scope.currentWebsite) {
$scope.currentWebsiteToggler = $scope.currentWebsite.id;
}
$scope.$on('service:CurrentWebsiteChanged', function (event, data) {
$scope.currentWebsite = data;
$scope.currentWebsiteToggler = data.id;
ServiceMenuData.load();
}); // controller logic
$scope.dropEmptyContainer = function (dragged, dropped, position, catId) {
$http.get('admin/api-cms-navitem/move-to-container', {
params: {
moveItemId: dragged.id,
droppedOnCatId: catId
}
}).then(function (succes) {
ServiceMenuData.load(true);
});
};
$scope.dropItem = function (drag, drop, pos) {
if (pos == 'bottom') {
var api = 'admin/api-cms-navitem/move-after';
var params = {
moveItemId: drag.id,
droppedAfterItemId: drop.id
};
} else if (pos == 'top') {
var api = 'admin/api-cms-navitem/move-before';
var params = {
moveItemId: drag.id,
droppedBeforeItemId: drop.id
};
} else if (pos == 'middle') {
var api = 'admin/api-cms-navitem/move-to-child';
var params = {
moveItemId: drag.id,
droppedOnItemId: drop.id
};
}
$http.get(api, {
params: params
}).then(function (success) {
ServiceMenuData.load(true);
}, function (error) {
ServiceMenuData.load(true);
});
};
$scope.validItem = function (hover, draged) {
if (hover.id == draged.id) {
return false;
}
$scope.rritems = [];
$scope.recursivItemValidity(draged.nav_container_id, draged.id);
if ($scope.rritems.indexOf(hover.id) == -1) {
return true;
}
return false;
};
$scope.rritems = [];
$scope.recursivItemValidity = function (containerId, parentNavId) {
var items = $filter('menuparentfilter')($scope.menuData.items, containerId, parentNavId);
angular.forEach(items, function (item) {
$scope.rritems.push(item.id);
$scope.recursivItemValidity(containerId, item.id);
});
};
$scope.toggleItem = function (data) {
if (data.toggle_open == undefined) {
data['toggle_open'] = 1;
} else {
data['toggle_open'] = !data.toggle_open;
}
$http.post('admin/api-cms-nav/tree-history', {
data: data
}, {
ignoreLoadingBar: true
});
};
$scope.go = function (data) {
ServiceLiveEditMode.changeUrl(data.nav_item_id, 0);
$state.go('custom.cmsedit', {
navId: data.id
});
};
$scope.showDrag = 0;
$scope.isCurrentElement = function (data) {
if (data !== null && $state.params.navId == data.id) {
return true;
}
return false;
};
$scope.hiddenCats = [];
$scope.$watch('menuData', function (n, o) {
$scope.hiddenCats = n.hiddenCats;
});
$scope.toggleCat = function (catId) {
if (catId in $scope.hiddenCats) {
$scope.hiddenCats[catId] = !$scope.hiddenCats[catId];
} else {
$scope.hiddenCats[catId] = 1;
}
$http.post('admin/api-cms-nav/save-cat-toggle', {
catId: catId,
state: $scope.hiddenCats[catId]
}, {
ignoreLoadingBar: true
});
};
$scope.toggleIsHidden = function (catId) {
if ($scope.hiddenCats == undefined) {
return false;
}
if (catId in $scope.hiddenCats) {
if ($scope.hiddenCats[catId] == 1) {
return true;
}
}
return false;
};
}]);
zaa.controller("CmsadminCreateController", ['$scope', '$q', '$http', function ($scope, $q, $http) {
$scope.data = {};
$scope.data.isInline = false;
$scope.save = function () {
var headers = {
"headers": {
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"
}
};
return $q(function (resolve, reject) {
if ($scope.data.nav_item_type == 1) {
$http.post('admin/api-cms-nav/create-page', $.param($scope.data), headers).then(function (response) {
resolve(response.data);
}, function (response) {
reject(response.data);
});
}
if ($scope.data.nav_item_type == 2) {
$http.post('admin/api-cms-nav/create-module', $.param($scope.data), headers).then(function (response) {
resolve(response.data);
}, function (response) {
reject(response.data);
});
}
if ($scope.data.nav_item_type == 3) {
$http.post('admin/api-cms-nav/create-redirect', $.param($scope.data), headers).then(function (response) {
resolve(response.data);
}, function (response) {
reject(response.data);
});
}
});
};
}]);
zaa.controller("CmsadminCreateInlineController", ['$scope', '$q', '$http', function ($scope, $q, $http) {
$scope.data = {
nav_id: $scope.$parent.NavController.id
};
$scope.data.isInline = true;
$scope.save = function () {
$scope.data.lang_id = $scope.lang.id;
var headers = {
"headers": {
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"
}
};
return $q(function (resolve, reject) {
if ($scope.data.nav_item_type == 1) {
$http.post('admin/api-cms-nav/create-page-item', $.param($scope.data), headers).then(function (response) {
resolve(response.data);
}, function (response) {
reject(response.data);
});
}
if ($scope.data.nav_item_type == 2) {
$http.post('admin/api-cms-nav/create-module-item', $.param($scope.data), headers).then(function (response) {
resolve(response.data);
}, function (response) {
reject(response.data);
});
}
if ($scope.data.nav_item_type == 3) {
$http.post('admin/api-cms-nav/create-redirect-item', $.param($scope.data), headers).then(function (response) {
resolve(response.data);
}, function (response) {
reject(response.data);
});
}
});
};
}]);
zaa.controller("NavController", ['$scope', '$rootScope', '$filter', '$state', '$stateParams', '$http', 'PlaceholderService', 'ServicePropertiesData', 'ServiceMenuData', 'ServiceLanguagesData', 'ServiceLiveEditMode', 'AdminToastService', 'AdminClassService', 'AdminLangService', 'HtmlStorage', function ($scope, $rootScope, $filter, $state, $stateParams, $http, PlaceholderService, ServicePropertiesData, ServiceMenuData, ServiceLanguagesData, ServiceLiveEditMode, AdminToastService, AdminClassService, AdminLangService, HtmlStorage) {
$scope.pageSettingsOverlayHidden = true;
$scope.pageSettingsOverlayTab = 1;
$scope.togglePageSettingsOverlay = function (t) {
$scope.pageSettingsOverlayTab = t;
$scope.pageSettingsOverlayHidden = !$scope.pageSettingsOverlayHidden;
};
$scope.navCfg = {
helptags: $rootScope.luyacfg.helptags
};
$scope.$watch(function () {
return ServiceLiveEditMode.state;
}, function (n, o) {
$scope.displayLiveContainer = n;
});
$scope.$watch(function () {
return ServiceLiveEditMode.url;
}, function (n, o) {
$scope.liveUrl = n;
});
$scope.AdminLangService = AdminLangService;
/* service AdminPropertyService inheritance */
$scope.propertiesData = ServicePropertiesData.data;
$scope.$on('service:PropertiesData', function (event, data) {
$scope.propertiesData = data;
});
/* service ServiceMenuData inheritance */
$scope.menuData = ServiceMenuData.data;
$scope.$on('service:MenuData', function (event, data) {
$scope.menuData = data;
});
$scope.menuDataReload = function () {
return ServiceMenuData.load(true);
};
/* service ServiceLangaugesData inheritance */
$scope.languagesData = ServiceLanguagesData.data;
$scope.$on('service:LanguagesData', function (event, data) {
$scope.languagesData = data;
});
/* placeholders toggler service */
$scope.PlaceholderService = PlaceholderService;
$scope.placeholderState = $scope.PlaceholderService.status;
$scope.$watch('placeholderState', function (n, o) {
if (n !== o && n !== undefined) {
$scope.PlaceholderService.delegate(n);
}
});
/* Blockholder size toggler */
$scope.isBlockholderSmall = HtmlStorage.getValue('blockholderToggleState', true);
$scope.toggleBlockholderSize = function () {
$scope.isBlockholderSmall = !$scope.isBlockholderSmall;
HtmlStorage.setValue('blockholderToggleState', $scope.isBlockholderSmall);
};
/* sidebar logic */
$scope.sidebar = false;
$scope.enableSidebar = function () {
$scope.sidebar = true;
};
$scope.toggleSidebar = function () {
$scope.sidebar = !$scope.sidebar;
};
/* app logic */
$scope.showActions = 1;
$scope.id = parseInt($stateParams.navId);
$scope.isDeleted = false;
$scope.AdminClassService = AdminClassService;
$scope.propValues = {};
$scope.hasValues = false;
$scope.pageTags = [];
$scope.bubbleParents = function (parentNavId, containerId) {
var item = $filter('menuchildfilter')($scope.menuData.items, containerId, parentNavId);
if (item) {
item.toggle_open = 1;
$scope.bubbleParents(item.parent_nav_id, item.nav_container_id);
}
};
$scope.createDeepPageCopy = function () {
$http.post('admin/api-cms-nav/deep-page-copy', {
navId: $scope.id
}).then(function (response) {
$scope.menuDataReload();
AdminToastService.success(i18n['js_page_create_copy_success']);
$scope.showActions = 1;
$scope.togglePageSettingsOverlay();
}, function (response) {
AdminToastService.errorArray(response.data);
});
};
$scope.pageTags = [];
$http.get('admin/api-cms-nav/' + $scope.id + '/tags').then(function (response) {
angular.forEach(response.data, function (value) {
$scope.pageTags.push(value.id);
});
});
$scope.savePageTags = function () {
$http.post('admin/api-cms-nav/' + $scope.id + '/tags', $scope.pageTags).then(function (response) {
$scope.togglePageSettingsOverlay();
AdminToastService.success(i18n['js_config_update_success']);
}, function (response) {
AdminToastService.errorArray(response.data);
});
};
$scope.createDeepPageCopyAsTemplate = function () {
$http.post('admin/api-cms-nav/deep-page-copy-as-template', {
navId: $scope.id
}).then(function (response) {
$scope.menuDataReload();
AdminToastService.success(i18n['js_page_create_copy_as_template_success']);
$scope.showActions = 1;
$scope.togglePageSettingsOverlay();
$state.go('custom.cmsdraft');
}, function (response) {
AdminToastService.errorArray(response.data);
});
};
$scope.loadNavProperties = function () {
$http.get('admin/api-cms-nav/get-properties', {
params: {
navId: $scope.id
}
}).then(function (response) {
for (var i in response.data) {
var d = response.data[i];
$scope.propValues[d.admin_prop_id] = d.value;
$scope.hasValues = true;
}
});
};
$scope.togglePropMask = function () {
$scope.showPropForm = !$scope.showPropForm;
};
$scope.showPropForm = false;
$scope.storePropValues = function () {
var headers = {
"headers": {
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"
}
};
$http.post('admin/api-cms-nav/save-properties?navId=' + $scope.id, $.param($scope.propValues), headers).then(function (response) {
AdminToastService.success(i18n['js_page_property_refresh']);
$scope.loadNavProperties();
$scope.showPropForm = false;
$scope.togglePageSettingsOverlay();
});
};
$scope.trash = function () {
AdminToastService.confirm(i18n['js_page_confirm_delete'], i18n['cmsadmin_settings_trashpage_title'], ['$toast', function ($toast) {
$http.get('admin/api-cms-nav/delete', {
params: {
navId: $scope.id
}
}).then(function (response) {
$scope.isDeleted = true;
$scope.menuDataReload().then(function () {
$toast.close();
$scope.togglePageSettingsOverlay();
});
}, function (response) {
if (response.status == 417) {
AdminToastService.error(i18n['js_page_delete_error_cause_redirects']);
} else {
AdminToastService.errorArray(response.data);
}
});
}]);
};
$scope.isDraft = false;
$scope.submitNavForm = function (data) {
$http.post('admin/api-cms-nav/update?id=' + $scope.navData.id, data).then(function (response) {
AdminToastService.success(i18nParam('js_page_update_layout_save_success'));
$scope.togglePageSettingsOverlay();
}, function (response) {
angular.forEach(response.data, function (value) {
AdminToastService.error(value.message);
});
});
};
function initializer() {
$scope.navData = $filter('filter')($scope.menuData.items, {
id: $scope.id
}, true)[0];
if ($scope.navData == undefined) {
$scope.isDraft = true;
} else {
$scope.loadNavProperties();
/* properties --> */
$scope.$watch(function () {
return $scope.navData.is_offline;
}, function (n, o) {
if (n !== o && n !== undefined) {
$http.get('admin/api-cms-nav/toggle-offline', {
params: {
navId: $scope.navData.id,
offlineStatus: n
}
}).then(function (response) {
if ($scope.navData.is_offline == 1) {
AdminToastService.info(i18nParam('js_state_offline', {
title: $scope.navData.title
}));
} else {
AdminToastService.info(i18nParam('js_state_online', {
title: $scope.navData.title
}));
}
});
}
});
$scope.$watch(function () {
return $scope.navData.is_hidden;
}, function (n, o) {
if (n !== o && n !== undefined) {
$http.get('admin/api-cms-nav/toggle-hidden', {
params: {
navId: $scope.navData.id,
hiddenStatus: n
}
}).then(function (response) {
if ($scope.navData.is_hidden == 1) {
AdminToastService.info(i18nParam('js_state_hidden', {
title: $scope.navData.title
}));
} else {
AdminToastService.info(i18nParam('js_state_visible', {
title: $scope.navData.title
}));
}
});
}
});
$scope.$watch(function () {
return $scope.navData.is_home;
}, function (n, o) {
if (n !== o && n !== undefined) {
$http.get('admin/api-cms-nav/toggle-home', {
params: {
navId: $scope.navData.id,
homeState: n
}
}).then(function (response) {
$scope.menuDataReload().then(function () {
if ($scope.navData.is_home == 1) {
AdminToastService.success(i18nParam('js_state_is_home', {
title: $scope.navData.title
}));
} else {
AdminToastService.success(i18nParam('js_state_is_not_home', {
title: $scope.navData.title
}));
}
$scope.togglePageSettingsOverlay();
});
});
}
});
}
}
initializer();
}]);
/**
* @param $scope.lang from ng-repeat
*/
zaa.controller("NavItemController", ['$scope', '$rootScope', '$http', '$filter', '$timeout', 'ServiceMenuData', 'AdminLangService', 'AdminToastService', 'ServiceLiveEditMode', 'ServiceLayoutsData', 'ServiceWorkingPageVersion', function ($scope, $rootScope, $http, $filter, $timeout, ServiceMenuData, AdminLangService, AdminToastService, ServiceLiveEditMode, ServiceLayoutsData, ServiceWorkingPageVersion) {
$scope.loaded = false;
$scope.NavController = $scope.$parent;
$scope.liveEditState = false;
$scope.$watch(function () {
return ServiceLiveEditMode.state;
}, function (n, o) {
$scope.liveEditState = n;
});
$scope.openLiveUrl = function (id, versionId) {
ServiceLiveEditMode.changeUrl(id, versionId);
};
$scope.loadLiveUrl = function () {
ServiceLiveEditMode.changeUrl($scope.item.id, $scope.currentPageVersion);
}; // layoutsData
$scope.layoutsData = ServiceLayoutsData.data;
$scope.$on('service:BlocksData', function (event, data) {
$scope.layoutsData = data;
}); // serviceMenuData inheritance
$scope.menuDataReload = function () {
return ServiceMenuData.load(true);
};
$scope.$on('service:LoadLanguage', function (event, data) {
if (!$scope.loaded) {
$scope.refresh();
}
}); // properties:
$scope.isTranslated = false;
$scope.item = [];
$scope.itemCopy = [];
$scope.settings = false;
$scope.typeDataCopy = [];
$scope.typeData = [];
$scope.container = [];
$scope.errors = [];
$scope.homeUrl = $rootScope.luyacfg.homeUrl;
$scope.currentPageVersion = 0;
$scope.currentPageVersionAlias;
$scope.trashItem = function () {
if ($scope.lang.is_default == 0) {
AdminToastService.confirm(i18n['js_page_confirm_delete'], i18n['cmsadmin_settings_trashpage_title'], ['$toast', function ($toast) {
$http.delete('admin/api-cms-navitem/delete?navItemId=' + $scope.item.id).then(function (response) {
$scope.menuDataReload().then(function () {
$scope.isTranslated = false;
$scope.item = [];
$scope.itemCopy = [];
$scope.settings = false;
$scope.typeDataCopy = [];
$scope.typeData = [];
$scope.container = [];
$scope.errors = [];
$scope.currentPageVersion = 0;
$scope.$broadcast('deletedNavItem');
$toast.close();
});
}, function (response) {
AdminToastService.error(i18n['js_page_delete_error_cause_redirects']);
});
}]);
}
};
$scope.reset = function () {
$scope.itemCopy = angular.copy($scope.item);
if ($scope.item.nav_item_type == 1) {
$scope.typeDataCopy = angular.copy({
'nav_item_type_id': $scope.item.nav_item_type_id
});
} else {
$scope.typeDataCopy = angular.copy($scope.typeData);
}
};
$scope.updateNavItemData = function (itemCopy, typeDataCopy) {
$scope.errors = [];
var headers = {
"headers": {
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"
}
};
var navItemId = itemCopy.id;
typeDataCopy.title = itemCopy.title;
typeDataCopy.alias = itemCopy.alias;
typeDataCopy.title_tag = itemCopy.title_tag;
typeDataCopy.description = itemCopy.description;
typeDataCopy.keywords = itemCopy.keywords;
typeDataCopy.timestamp_create = itemCopy.timestamp_create;
typeDataCopy.image_id = itemCopy.image_id;
typeDataCopy.is_url_strict_parsing_disabled = itemCopy.is_url_strict_parsing_disabled;
typeDataCopy.is_cacheable = itemCopy.is_cacheable;
$http.post('admin/api-cms-navitem/update-page-item?navItemId=' + navItemId + '&navItemType=' + itemCopy.nav_item_type, $.param(typeDataCopy), headers).then(function (response) {
if (itemCopy.nav_item_type !== 1) {
$scope.currentPageVersion = 0;
}
$scope.loaded = false;
if (response.data) {
/* switch version if type is page */
if (itemCopy.nav_item_type == 1 && _typeof(response.data['typeData']) === 'object') {
/* choose given version or choose first available version */
var pageVersionKey = response.data['item'].nav_item_type_id;
if (pageVersionKey == 0) {
pageVersionKey = Object.keys(response.data['typeData'])[0];
}
$scope.container = response.data['typeData'][pageVersionKey]['contentAsArray'];
$scope.currentPageVersionAlias = response.data['typeData'][pageVersionKey]['version_alias'];
$scope.currentPageVersion = pageVersionKey;
}
}
AdminToastService.success(i18nParam('js_page_item_update_ok', {
'title': itemCopy.title
}));
$scope.menuDataReload();
$scope.refresh();
$scope.toggleSettingsOverlay();
$scope.reset();
}, function errorCallback(response) {
angular.forEach(response.data, function (item) {
AdminToastService.error(item.message);
});
});
};
$scope.$watch('itemCopy.alias', function (n, o) {
if (n != o && n != null) {
$scope.itemCopy.alias = $filter('slugify')(n);
}
});
$scope.removeVersion = function (version) {
AdminToastService.confirm(i18nParam('js_version_delete_confirm', {
alias: version.version_alias
}), i18n['cmsadmin_version_remove'], ['$toast', '$http', function ($toast, $http) {
$http.post('admin/api-cms-navitem/remove-page-version', {
pageId: version.id
}).then(function (response) {
$scope.refreshForce();
$toast.close();
AdminToastService.success(i18nParam('js_version_delete_confirm_success', {
alias: version.version_alias
}));
});
}]);
};
$scope.editVersionItem;
$scope.tab = 1;
$scope.editVersion = function (versionItem) {
$scope.changeTab(4);
$scope.editVersionItem = versionItem;
};
$scope.editVersionUpdate = function (editVersionItem) {
$http.post('admin/api-cms-navitem/change-page-version-layout', {
'pageItemId': editVersionItem.id,
'layoutId': editVersionItem.layout_id,
'alias': editVersionItem.version_alias
}).then(function (response) {
$scope.refreshForce();
AdminToastService.success(i18n['js_version_update_success']);
$scope.toggleSettingsOverlay();
});
};
$scope.getItem = function (langId, navId) {
$http({
url: 'admin/api-cms-navitem/nav-lang-item',
method: "GET",
params: {
langId: langId,
navId: navId
}
}).then(function (response) {
$scope.item = response.data['item'];
$scope.typeData = response.data['typeData'];
$scope.isTranslated = true;
$scope.reset();
if (!response.data['nav'].is_draft) {
$scope.NavController.bubbleParents($scope.NavController.navData.parent_nav_id, $scope.NavController.navData.nav_container_id);
if ($scope.item.nav_item_type == 1) {
var lastVersion = ServiceWorkingPageVersion.hasVersion($scope.item.id);
if (lastVersion) {
$scope.switchVersion(lastVersion);
} else {
if ($scope.currentPageVersion == 0) {
$scope.currentPageVersion = response.data.item.nav_item_type_id;
}
if (response.data.item.nav_item_type_id in response.data.typeData) {
$scope.currentPageVersionAlias = $scope.container = response.data.typeData[$scope.currentPageVersion]['version_alias'];
$scope.container = response.data.typeData[$scope.currentPageVersion]['contentAsArray'];
}
}
}
} else {
$scope.currentPageVersion = response.data.item.nav_item_type_id;
$scope.container = response.data.typeData[$scope.currentPageVersion]['contentAsArray'];
}
$scope.loaded = true;
}, function (error) {
// its loaded, but the data does not exists.
$scope.loaded = true;
});
};
$scope.versionDropDownVisbility = false;
$scope.toggleVersionsDropdown = function () {
$scope.versionDropDownVisbility = !$scope.versionDropDownVisbility;
};
$scope.switchVersion = function (pageVersionid, toggle) {
ServiceWorkingPageVersion.store($scope.item.id, pageVersionid);
$scope.container = $scope.typeData[pageVersionid]['contentAsArray'];
$scope.currentPageVersionAlias = $scope.typeData[pageVersionid]['version_alias'];
$scope.currentPageVersion = pageVersionid;
$scope.loadLiveUrl();
if (toggle) {
$scope.toggleVersionsDropdown();
}
};
$scope.refreshForce = function () {
$scope.getItem($scope.lang.id, $scope.NavController.id);
};
$scope.refresh = function () {
if (AdminLangService.isInSelection($scope.lang.short_code)) {
$scope.getItem($scope.lang.id, $scope.NavController.id);
}
};
/* new settings overlay */
$scope.settingsOverlayVisibility = true;
$scope.toggleSettingsOverlay = function (tab) {
$scope.settingsOverlayVisibility = !$scope.settingsOverlayVisibility;
if (tab) {
$scope.tab = tab;
}
};
$scope.changeTab = function (tab) {
$scope.tab = tab;
};
/**
* Refresh the current layout container blocks.
*
* After successfull api response all cms layout are foreach and the values are passed to revPlaceholders() method.
*/
$scope.refreshNested = function (prevId, placeholderVar) {
$http({
url: 'admin/api-cms-navitem/reload-placeholder',
method: 'GET',
params: {
navItemPageId: $scope.currentPageVersion,
prevId: prevId,
placeholderVar: placeholderVar
}
}).then(function (response) {
ServiceLiveEditMode.changeUrl($scope.item.id, $scope.currentPageVersion);
angular.forEach($scope.container.__placeholders, function (placeholder) {
$scope.revPlaceholders(placeholder, prevId, placeholderVar, response.data);
});
});
};
/**
* The revPlaceholders method goes trourgh the new row/col (grid) system container json layout where:
*
* rows[][1] = col left
* rows[][2] = col right
*
* Where a layout have at least on row which can have cols inside. So there revPlaceholders method goes trough the cols
* and check if the col is equal the given col to replace the content with (from refreshNested method).
*/
$scope.revPlaceholders = function (placeholders, prevId, placeholderVar, replaceContent) {
angular.forEach(placeholders, function (placeholderRow, placeholderKey) {
if (parseInt(prevId) == parseInt(placeholderRow.prev_id) && placeholderVar == placeholderRow['var']) {
placeholders[placeholderKey]['__nav_item_page_block_items'] = replaceContent;
} else {
$scope.revFind(placeholderRow, prevId, placeholderVar, replaceContent);
}
});
};
/**
* The revFind method does the recursiv job within a block an passes the value back to revPlaceholders().
*/
$scope.revFind = function (placeholder, prevId, placeholderVar, replaceContent) {
for (var i in placeholder['__nav_item_page_block_items']) {
for (var holderKey in placeholder['__nav_item_page_block_items'][i]['__placeholders']) {
for (var holder in placeholder['__nav_item_page_block_items'][i]['__placeholders'][holderKey]) {
$scope.revPlaceholders(placeholder['__nav_item_page_block_items'][i]['__placeholders'][holderKey], prevId, placeholderVar, replaceContent);
}
}
}
};
/**
* drops items in an empty page placeholder of CMS LAYOUT PLACEHOLDER
*/
$scope.dropItemPlaceholder = function (dragged, dropped, position) {
if (dragged.hasOwnProperty('favorized') || dragged.hasOwnProperty('newblock')) {
// its a new block
$http.post('admin/api-cms-navitempageblockitem/create', {
prev_id: dropped.prev_id,
sort_index: 0,
block_id: dragged.id,
placeholder_var: dropped['var'],
nav_item_page_id: dropped.nav_item_page_id
}).then(function (response) {
$scope.refreshNested(dropped['prev_id'], dropped['var']);
});
} else if (dragged.hasOwnProperty('copystack')) {
// its a block from copy stack
$http.post('admin/api-cms-navitemblock/copy-block-from-stack', {
copyBlockId: dragged.id,
sort_index: 0,
prev_id: dropped.prev_id,
placeholder_var: dropped['var'],
nav_item_page_id: dropped.nav_item_page_id
}).then(function (response) {
$scope.refreshNested(dropped['prev_id'], dropped['var']);
});
} else {
// moving an existing block
$http.put('admin/api-cms-navitempageblockitem/update?id=' + dragged.id, {
sort_index: 0,
prev_id: dropped.prev_id,
placeholder_var: dropped['var']
}).then(function (response) {
$scope.refreshForce();
});
}
};
$scope.refresh();
}]);
/**
* @param $scope.block From ng-repeat scope assignment
*/
zaa.controller("PageBlockEditController", ['$scope', '$sce', '$http', 'AdminClassService', 'AdminToastService', 'ServiceBlockCopyStack', 'ServiceLiveEditMode', function ($scope, $sce, $http, AdminClassService, AdminToastService, ServiceBlockCopyStack, ServiceLiveEditMode) {
$scope.NavItemTypePageController = $scope.$parent;
/**
* drops an item in an empty placeholder of a BLOCK
*/
$scope.dropItemPlaceholder = function (dragged, dropped, position) {
if (dragged.hasOwnProperty('favorized') || dragged.hasOwnProperty('newblock')) {
// its a new block
$http.post('admin/api-cms-navitempageblockitem/create', {
prev_id: dropped.prev_id,
sort_index: 0,
block_id: dragged.id,
placeholder_var: dropped.var,
nav_item_page_id: dropped.nav_item_page_id
}).then(function (response) {
$scope.NavItemTypePageController.refreshNested(dropped.prev_id, dropped.var);
});
} else if (dragged.hasOwnProperty('copystack')) {
// its a block from copy stack
$http.post('admin/api-cms-navitemblock/copy-block-from-stack', {
copyBlockId: dragged.id,
sort_index: 0,
prev_id: dropped.prev_id,
placeholder_var: dropped.var,
nav_item_page_id: dropped.nav_item_page_id
}).then(function (response) {
$scope.NavItemTypePageController.refreshNested($scope.placeholder.prev_id, $scope.placeholder.var);
});
} else {
// moving an existing block
$http.put('admin/api-cms-navitempageblockitem/update?id=' + dragged.id, {
sort_index: 0,
prev_id: dropped.prev_id,
placeholder_var: dropped.var
}).then(function (response) {
$scope.refreshForce();
});
}
};
/**
* Drops a block above/below an EXISTING BLOCK
*/
$scope.dropItem = function (dragged, dropped, position, element) {
var sortIndex = $scope.$index;
if (position == 'bottom') {
sortIndex = sortIndex + 1;
}
if (dragged.hasOwnProperty('favorized') || dragged.hasOwnProperty('newblock')) {
// its a new block
$http.post('admin/api-cms-navitempageblockitem/create', {
prev_id: $scope.placeholder.prev_id,
sort_index: sortIndex,
block_id: dragged.id,
placeholder_var: $scope.placeholder['var'],
nav_item_page_id: $scope.placeholder.nav_item_page_id
}).then(function (response) {
$scope.NavItemTypePageController.refreshNested($scope.placeholder.prev_id, $scope.placeholder.var);
});
} else if (dragged.hasOwnProperty('copystack')) {
// its a block from copy stack
$http.post('admin/api-cms-navitemblock/copy-block-from-stack', {
copyBlockId: dragged.id,
sort_index: sortIndex,
prev_id: $scope.placeholder.prev_id,
placeholder_var: $scope.placeholder['var'],
nav_item_page_id: $scope.placeholder.nav_item_page_id
}).then(function (response) {
$scope.NavItemTypePageController.refreshNested($scope.placeholder.prev_id, $scope.placeholder.var);
});
} else {
// moving an existing block
$http.put('admin/api-cms-navitempageblockitem/update?id=' + dragged.id, {
prev_id: $scope.placeholder.prev_id,
placeholder_var: $scope.placeholder['var'],
sort_index: sortIndex
}).then(function (response) {
/*
* @issue: https://github.com/luyadev/luya/issues/1629
* The moved block, should removed from the previous array. This is only the case when dragging from an OUTER block into an INNER block
* is this will not refresh the OUTER block, but always will in the opposite way.
*/
angular.element(element).remove(); // as the block has been removed from existing, refresh the new placeholder.
$scope.NavItemTypePageController.refreshNested($scope.placeholder.prev_id, $scope.placeholder.var);
});
}
};
$scope.copyBlock = function () {
ServiceBlockCopyStack.push($scope.block);
};
$scope.toggleHidden = function () {
if ($scope.block.is_hidden == 0) {
$scope.block.is_hidden = 1;
} else {
$scope.block.is_hidden = 0;
}
$http({
url: 'admin/api-cms-navitem/toggle-block-hidden',
method: "GET",
params: {
blockId: $scope.block.id,
hiddenState: $scope.block.is_hidden
}
}).then(function (response) {
/* load live url on hidden trigger */
$scope.NavItemTypePageController.$parent.$parent.loadLiveUrl(); // successfull toggle hidden state of block
AdminToastService.info(i18nParam('js_page_block_visbility_change', {
name: $scope.block.name
}));
});
};
$scope.isEditable = function () {
return typeof $scope.block.vars != "undefined" && $scope.block.vars.length > 0;
};
$scope.isConfigurable = function () {
return typeof $scope.block.cfgs != "undefined" && $scope.block.cfgs.length > 0;
};
$scope.$watch(function () {
return $scope.block.values;
}, function (n, o) {
$scope.data = n;
});
$scope.$watch(function () {
return $scope.block.variation;
}, function (n, o) {
$scope.evalVariationVisbility(n);
});
$scope.getInfo = function (varFieldName) {
if ($scope.block.field_help.hasOwnProperty(varFieldName)) {
return $scope.block.field_help[varFieldName];
}
return false;
};
$scope.evalVariationVisbility = function (variatenName) {
if ($scope.block.variations.hasOwnProperty(variatenName)) {
var variation = $scope.block.variations[$scope.block.variation];
angular.forEach(variation, function (value, key) {
if (angular.isObject(value)) {
angular.forEach(value, function (v, k) {
angular.forEach($scope.block[key], function (object) {
if (k == object.var) {
object.invisible = true;
}
});
});
}
});
} else {
angular.forEach($scope.block.cfgs, function (object) {
object.invisible = false;
});
angular.forEach($scope.block.vars, function (object) {
object.invisible = false;
});
}
};
$scope.cfgdata = $scope.block.cfgvalues || {};
$scope.edit = false;
$scope.modalHidden = true;
$scope.modalMode = 1;
$scope.initModalMode = function () {
if ($scope.block.vars.length == 0) {
$scope.modalMode = 2;
}
};
$scope.toggleEdit = function () {
if ($scope.isEditable() || $scope.isConfigurable()) {
$scope.modalHidden = !$scope.modalHidden;
$scope.edit = !$scope.edit;
}
};
$scope.renderTemplate = function (template, dataVars, cfgVars, block, extras) {
if (template == undefined) {
return '';
}
var template = Twig.twig({
data: template
});
var content = template.render({
vars: dataVars,
cfgs: cfgVars,
block: block,
extras: extras
});
return $sce.trustAsHtml(content);
};
$scope.removeBlock = function () {
AdminToastService.confirm(i18nParam('js_page_block_delete_confirm', {
name: $scope.block.name
}), i18n['view_update_block_tooltip_delete'], ['$toast', function ($toast) {
$http.delete('admin/api-cms-navitempageblockitem/delete?id=' + $scope.block.id).then(function (response) {
$scope.NavItemTypePageController.refreshNested($scope.placeholder.prev_id, $scope.placeholder.var);
$scope.NavItemTypePageController.loadLiveUrl();
$toast.close();
AdminToastService.success(i18nParam('js_page_block_remove_ok', {
name: $scope.block.name
}));
});
}]);
};
$scope.isAnyRequiredAttributeEmpty = function () {
var response = false;
angular.forEach($scope.block.vars, function (varItem) {
if (varItem.required && $scope.isEmpty($scope.data, varItem.var)) {
AdminToastService.error(i18nParam('js_block_attribute_empty', {
label: varItem.label
}));
response = true;
}
});
angular.forEach($scope.block.cfgs, function (varItem) {
if (varItem.required && $scope.isEmpty($scope.cfgdata, varItem.var)) {
AdminToastService.error(i18nParam('js_block_attribute_empty', {
label: varItem.label
}));
response = true;
}
});
return response;
};
$scope.isEmpty = function (values, key) {
if (values.hasOwnProperty(key) && values[key]) {
if (values[key].length == 0) {
return true;
}
return false;
}
return true;
};
$scope.save = function (close) {
if ($scope.isAnyRequiredAttributeEmpty()) {
return;
}
$http.put('admin/api-cms-navitempageblockitem/update?id=' + $scope.block.id, {
json_config_values: $scope.data,
json_config_cfg_values: $scope.cfgdata,
variation: $scope.block.variation
}).then(function (response) {
AdminToastService.success(i18nParam('js_page_block_update_ok', {
name: $scope.block.name
}));
if (close) {
$scope.toggleEdit();
}
$scope.block.is_dirty = 1;
$scope.block = angular.copy(response.data.objectdetail);
$scope.NavItemTypePageController.loadLiveUrl();
$scope.evalVariationVisbility($scope.block.variation);
});
};
}]);
zaa.controller("DroppableBlocksController", ['$scope', '$http', 'AdminClassService', 'ServiceBlocksData', 'ServiceBlockCopyStack', function ($scope, $http, AdminClassService, ServiceBlocksData, ServiceBlockCopyStack) {
/* service ServiceBlocksData inheritance */
$scope.blocksData = ServiceBlocksData.data;
$scope.blocksDataRestore = angular.copy($scope.blocksData);
$scope.$on('service:BlocksData', function (event, data) {
$scope.blocksData = data;
});
$scope.blocksDataReload = function () {
return ServiceBlocksData.load(true);
};
$scope.addToFav = function (item) {
$http.post('admin/api-cms-block/to-fav', {
block: item
}).then(function (response) {
$scope.blocksDataReload();
});
};
$scope.removeFromFav = function (item) {
$http.post('admin/api-cms-block/remove-fav', {
block: item
}).then(function (response) {
$scope.blocksDataReload();
});
};
$scope.toggleGroup = function (group) {
if (group.toggle_open == undefined) {
group.toggle_open = 1;
} else {
group.toggle_open = !group.toggle_open;
}
$http.post('admin/api-cms-block/toggle-group', {
group: group
}, {
ignoreLoadingBar: true
});
};
$scope.isPreviewEnabled = function (item) {
return item.preview_enabled;
}; // controller logic
$scope.copyStack = ServiceBlockCopyStack.stack;
$scope.$on('service:CopyStack', function (event, stack) {
$scope.copyStack = stack;
});
$scope.clearStack = function () {
ServiceBlockCopyStack.clear();
};
$scope.searchQuery = '';
$scope.searchIsDirty = false;
$scope.$watch('searchQuery', function (n, o) {
if (n !== '') {
$scope.searchIsDirty = true;
angular.forEach($scope.blocksData, function (value, key) {
if (value.group.is_fav) {
$scope.blocksData.splice(key, 1);
}
value.group.toggle_open = 1;
});
} else if ($scope.searchIsDirty) {
$scope.blocksData = angular.copy($scope.blocksDataRestore);
}
});
}]);
})();/**
* all global admin services
*
* controller resolve: https://github.com/johnpapa/angular-styleguide#style-y080
*
* Service Inheritance:
*
* 1. Service must be prefix with Service
* 2. Service must contain a forceReload state
* 3. Service must broadcast an event 'service:FoldersData'
* 4. Controller integration must look like
*
* ```
* $scope.foldersData = ServiceFoldersData.data;
*
* $scope.$on('service:FoldersData', function(event, data) {
* $scope.foldersData = data;
* });
*
* $scope.foldersDataReload = function() {
* return ServiceFoldersData.load(true);
* }
* ```
*
*/
zaa.config(['resolverProvider', function (resolverProvider) {
resolverProvider.addCallback(['ServiceMenuData', 'ServiceBlocksData', 'ServiceLayoutsData', 'ServiceCurrentWebsite', 'LuyaLoading', function (ServiceMenuData, ServiceBlocksData, ServiceLayoutsData, ServiceCurrentWebsite, LuyaLoading) {
LuyaLoading.start();
ServiceBlocksData.load();
ServiceLayoutsData.load();
ServiceMenuData.load().then(function () {
ServiceCurrentWebsite.load();
LuyaLoading.stop();
});
}]);
}]);
/**
* Copy Block Stack service.
*/
zaa.factory("ServiceBlockCopyStack", ['$rootScope', function ($rootScope) {
var service = [];
service.stack = [];
service.clear = function () {
service.stack = [];
$rootScope.$broadcast('service:CopyStack', service.stack);
};
service.push = function (block) {
if (service.stack.length > 4) {
service.stack.shift();
}
service.stack.push({
blockId: block.block_id,
name: block.name,
icon: block.icon,
id: block.id,
copystack: 1
});
$rootScope.$broadcast('service:CopyStack', service.stack);
};
return service;
}]);
/**
* Menu Service.
*
* $scope.menuData = ServiceMenuData.data;
*
* $scope.$on('service:MenuData', function(event, data) {
* $scope.menuData = data;
* });
*
* $scope.menuDataReload = function() {
* return ServiceMenuData.load(true);
* }
*
*/
zaa.factory("ServiceMenuData", ['$http', '$q', '$rootScope', function ($http, $q, $rootScope) {
var service = [];
service.data = [];
service.load = function (forceReload) {
return $q(function (resolve, reject) {
if (service.data.length > 0 && forceReload !== true) {
resolve(service.data);
} else {
$http.get("admin/api-cms-menu/data-menu").then(function (response) {
service.data = response.data;
$rootScope.$broadcast('service:MenuData', service.data);
resolve(service.data);
});
}
});
};
return service;
}]);
/**
* Blocks Service.
*
*
* $scope.blocksData = ServiceBlocksData.data;
*
* $scope.$on('service:BlocksData', function(event, data) {
* $scope.blocksData = data;
* });
*
* $scope.blocksDataReload = function() {
* return ServiceBlocksData.load(true);
* }
*
*/
zaa.factory("ServiceBlocksData", ['$http', '$q', '$rootScope', function ($http, $q, $rootScope) {
var service = [];
service.data = [];
service.load = function (forceReload) {
return $q(function (resolve, reject) {
if (service.data.length > 0 && forceReload !== true) {
resolve(service.data);
} else {
$http.get("admin/api-cms-admin/data-blocks").then(function (response) {
service.data = response.data;
$rootScope.$broadcast('service:BlocksData', service.data);
resolve(service.data);
});
}
});
};
return service;
}]);
/**
* Layouts Service.
$scope.layoutsData = ServiceLayoutsData.data;
$scope.$on('service:BlocksData', function(event, data) {
$scope.layoutsData = data;
});
$scope.layoutsDataReload = function() {
return ServiceLayoutsData.load(true);
}
*/
zaa.factory("ServiceLayoutsData", ['$http', '$q', '$rootScope', function ($http, $q, $rootScope) {
var service = [];
service.data = [];
service.load = function (forceReload) {
return $q(function (resolve, reject) {
if (service.data.length > 0 && forceReload !== true) {
resolve(service.data);
} else {
$http.get("admin/api-cms-admin/data-layouts").then(function (response) {
service.data = response.data;
$rootScope.$broadcast('service:LayoutsData', service.data);
resolve(service.data);
});
}
});
};
return service;
}]);
/**
* CMS LIVE EDIT SERIVCE
*
* $scope.liveEditMode = ServiceLiveEditMode.state
*/
zaa.factory("ServiceLiveEditMode", ['$rootScope', function ($rootScope) {
var service = [];
service.state = 0;
service.url = $rootScope.luyacfg.homeUrl;
service.toggle = function () {
service.state = !service.state;
};
service.setUrl = function (itemId, versionId) {
var d = new Date();
var n = d.getTime();
service.url = $rootScope.cmsConfig.previewUrl + '?itemId=' + itemId + '&version=' + versionId + '&date=' + n;
};
service.changeUrl = function (itemId, versionId) {
if (versionId == undefined) {
versionId = 0;
}
service.setUrl(itemId, versionId);
$rootScope.$broadcast('service:LiveEditModeUrlChange', service.url);
};
return service;
}]);
/**
* CMS Current Website SERIVCE
*
* $scope.currentWebsite = ServiceCurrentWebsite.currentWebsite
*
* $scope.$on('service:CurrentWebsiteChanged', function(event, data) {
* $scope.currentWebsite = data;
* });
*/
zaa.factory("ServiceCurrentWebsite", ['$rootScope', 'ServiceMenuData', function ($rootScope, ServiceMenuData) {
var service = {
currentWebsite: null,
defaultWebsite: null
};
service.load = function () {
service.defaultWebsite = ServiceMenuData.data.websites.find(function (w) {
return w.is_default;
}) || ServiceMenuData.data.websites[0];
if (service.defaultWebsite) {
service.toggle(service.defaultWebsite.id);
}
};
service.toggle = function (websiteId) {
if (websiteId && ServiceMenuData.data.websites && (!service.currentWebsite || service.currentWebsite.id !== websiteId)) {
service.currentWebsite = ServiceMenuData.data.websites.find(function (w) {
return w.id === websiteId;
});
$rootScope.$broadcast('service:CurrentWebsiteChanged', service.currentWebsite);
}
};
return service;
}]);
zaa.factory("ServiceWorkingPageVersion", [function () {
var service = {
page: {}
};
service.store = function (pageId, versionId) {
service.page[pageId] = versionId;
};
service.hasVersion = function (pageId) {
if (service.page.hasOwnProperty(pageId)) {
return service.page[pageId];
}
return false;
};
return service;
}]);//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2pzL2Ntc2FkbWluLmpzIiwiLi4vanMvc2VydmljZXMuanMiXSwibmFtZXMiOlsiemFhIiwiZGlyZWN0aXZlIiwiU2VydmljZU1lbnVEYXRhIiwiU2VydmljZUN1cnJlbnRXZWJzaXRlIiwiJGZpbHRlciIsInJlc3RyaWN0Iiwic2NvcGUiLCJuYXZJZCIsImNvbnRyb2xsZXIiLCIkc2NvcGUiLCJjaGFuZ2VNb2RlbCIsImRhdGEiLCJpZCIsImN1cnJlbnRXZWJzaXRlIiwiJG9uIiwiZXZlbnQiLCJtZW51RGF0YSIsImFuZ3VsYXIiLCJjb3B5IiwibWVudURhdGFPcmlnaW5hbCIsImluaXQiLCJsZW5ndGgiLCJsb2FkIiwidGhlbiIsImNvbnRhaW5lciIsImNvbnRhaW5lcnMiLCJpc0hpZGRlbiIsIiR3YXRjaCIsIm4iLCJpdGVtcyIsInRpdGxlIiwiZm9yRWFjaCIsInZhbHVlIiwiYnViYmxlUGFyZW50cyIsInBhcmVudE5hdklkIiwiY29udGFpbmVySWQiLCJpbmRleCIsIml0ZW0iLCJleGlzdHMiLCJpIiwicHVzaCIsInBhcmVudF9uYXZfaWQiLCJuYXZfY29udGFpbmVyX2lkIiwidG9nZ2xlciIsInRlbXBsYXRlIiwiaTE4biIsInJlc2V0VmFsdWUiLCJtb2RlbCIsIiRodHRwIiwiJHN0YXRlIiwiZ2V0IiwicGFyYW1zIiwicmVzcG9uc2UiLCJwYXRoIiwidGVtcGxhdGVVcmwiLCJTZXJ2aWNlTGFuZ3VhZ2VzRGF0YSIsIkFkbWluVG9hc3RTZXJ2aWNlIiwiZXJyb3IiLCJzdWNjZXNzIiwiJHBhcmVudCIsIm1lbnVEYXRhUmVsb2FkIiwiaW5pdGlhbGl6ZXIiLCJtZW51IiwibmF2Y29udGFpbmVycyIsIm5hdl9pdGVtX3R5cGUiLCJpc19kcmFmdCIsImRlZmF1bHRfY29udGFpbmVyX2lkIiwibGFuZ3VhZ2VzRGF0YSIsImlzRGVmYXVsdEl0ZW0iLCJmaW5kIiwiaXNfZGVmYXVsdCIsImxhbmdfaWQiLCJvIiwidW5kZWZpbmVkIiwiYWxpYXNTdWdnZXN0aW9uIiwiYWxpYXMiLCJleGVjIiwic2F2ZSIsImlzSW5saW5lIiwiZ2V0SXRlbSIsIm5hdl9pZCIsInJlYXNvbiIsImtleSIsIlNlcnZpY2VMYXlvdXRzRGF0YSIsInBhcmVudCIsIm5hdkl0ZW1JZCIsImxheW91dF9pZCIsImxheW91dHNEYXRhIiwiYXJyYXlUb1NlbGVjdCIsImlucHV0IiwidmFsdWVGaWVsZCIsImxhYmVsRmllbGQiLCJvdXRwdXQiLCJ2ZXJzaW9uc0RhdGEiLCJnZXRWZXJzaW9uTGlzdCIsImlzRWRpdEF2YWlsYWJsZSIsInVzZV9kcmFmdCIsImZyb21fZHJhZnRfaWQiLCJkcmFmdHMiLCJsYXlvdXRzIiwibW9kdWxlcyIsImNvbnRyb2xsZXJzIiwiYWN0aW9ucyIsImFkZFBhcmFtIiwiaGFzT3duUHJvcGVydHkiLCJhY3Rpb25fcGFyYW1zIiwibW9kdWxlX25hbWUiLCJjb250cm9sbGVyX25hbWUiLCJmaWx0ZXIiLCJ3ZWJzaXRlSWQiLCJyZXN1bHQiLCJ3ZWJzaXRlX2lkIiwicmV0dXJuVmFsdWUiLCJmYWN0b3J5Iiwic2VydmljZSIsInN0YXR1cyIsImRlbGVnYXRlIiwiY29uZmlnIiwiJHN0YXRlUHJvdmlkZXIiLCJzdGF0ZSIsInVybCIsImdvIiwiZGFzaGJvYXJkIiwicG9zdCIsImhlYWRlcnMiLCJjcmVhdGVOZXdWZXJzaW9uU3VibWl0IiwiY29weUV4aXN0aW5nVmVyc2lvbiIsInZlcnNpb25MYXlvdXRJZCIsIiQiLCJwYXJhbSIsInZlcnNpb25OYW1lIiwiZnJvbVZlcnNpb25QYWdlSWQiLCJyZWZyZXNoRm9yY2UiLCJpc09wZW4iLCJpdGVtU2VsZWN0aW9uIiwic2VsZWN0aW9uIiwiTmF2SXRlbUNvbnRyb2xsZXIiLCJzZWxlY3QiLCJsb2FkSXRlbXMiLCJOYXZDb250cm9sbGVyIiwibmF2RGF0YSIsImxhbmciLCJyZWZyZXNoIiwiZXJyb3JBcnJheSIsIiRyb290U2NvcGUiLCJTZXJ2aWNlTGl2ZUVkaXRNb2RlIiwibGl2ZUVkaXRTdGF0ZSIsImxvYWRDbXNDb25maWciLCJjbXNDb25maWciLCJjdXJyZW50V2Vic2l0ZVRvZ2dsZXIiLCJuZXdWYWx1ZSIsIm9sZFZhbHVlIiwidG9nZ2xlIiwiZHJvcEVtcHR5Q29udGFpbmVyIiwiZHJhZ2dlZCIsImRyb3BwZWQiLCJwb3NpdGlvbiIsImNhdElkIiwibW92ZUl0ZW1JZCIsImRyb3BwZWRPbkNhdElkIiwic3VjY2VzIiwiZHJvcEl0ZW0iLCJkcmFnIiwiZHJvcCIsInBvcyIsImFwaSIsImRyb3BwZWRBZnRlckl0ZW1JZCIsImRyb3BwZWRCZWZvcmVJdGVtSWQiLCJkcm9wcGVkT25JdGVtSWQiLCJ2YWxpZEl0ZW0iLCJob3ZlciIsImRyYWdlZCIsInJyaXRlbXMiLCJyZWN1cnNpdkl0ZW1WYWxpZGl0eSIsImluZGV4T2YiLCJ0b2dnbGVJdGVtIiwidG9nZ2xlX29wZW4iLCJpZ25vcmVMb2FkaW5nQmFyIiwiY2hhbmdlVXJsIiwibmF2X2l0ZW1faWQiLCJzaG93RHJhZyIsImlzQ3VycmVudEVsZW1lbnQiLCJoaWRkZW5DYXRzIiwidG9nZ2xlQ2F0IiwidG9nZ2xlSXNIaWRkZW4iLCIkcSIsInJlc29sdmUiLCJyZWplY3QiLCIkc3RhdGVQYXJhbXMiLCJQbGFjZWhvbGRlclNlcnZpY2UiLCJTZXJ2aWNlUHJvcGVydGllc0RhdGEiLCJBZG1pbkNsYXNzU2VydmljZSIsIkFkbWluTGFuZ1NlcnZpY2UiLCJIdG1sU3RvcmFnZSIsInBhZ2VTZXR0aW5nc092ZXJsYXlIaWRkZW4iLCJwYWdlU2V0dGluZ3NPdmVybGF5VGFiIiwidG9nZ2xlUGFnZVNldHRpbmdzT3ZlcmxheSIsInQiLCJuYXZDZmciLCJoZWxwdGFncyIsImx1eWFjZmciLCJkaXNwbGF5TGl2ZUNvbnRhaW5lciIsImxpdmVVcmwiLCJwcm9wZXJ0aWVzRGF0YSIsInBsYWNlaG9sZGVyU3RhdGUiLCJpc0Jsb2NraG9sZGVyU21hbGwiLCJnZXRWYWx1ZSIsInRvZ2dsZUJsb2NraG9sZGVyU2l6ZSIsInNldFZhbHVlIiwic2lkZWJhciIsImVuYWJsZVNpZGViYXIiLCJ0b2dnbGVTaWRlYmFyIiwic2hvd0FjdGlvbnMiLCJwYXJzZUludCIsImlzRGVsZXRlZCIsInByb3BWYWx1ZXMiLCJoYXNWYWx1ZXMiLCJwYWdlVGFncyIsImNyZWF0ZURlZXBQYWdlQ29weSIsInNhdmVQYWdlVGFncyIsImNyZWF0ZURlZXBQYWdlQ29weUFzVGVtcGxhdGUiLCJsb2FkTmF2UHJvcGVydGllcyIsImQiLCJhZG1pbl9wcm9wX2lkIiwidG9nZ2xlUHJvcE1hc2siLCJzaG93UHJvcEZvcm0iLCJzdG9yZVByb3BWYWx1ZXMiLCJ0cmFzaCIsImNvbmZpcm0iLCIkdG9hc3QiLCJjbG9zZSIsImlzRHJhZnQiLCJzdWJtaXROYXZGb3JtIiwiaTE4blBhcmFtIiwibWVzc2FnZSIsImlzX29mZmxpbmUiLCJvZmZsaW5lU3RhdHVzIiwiaW5mbyIsImlzX2hpZGRlbiIsImhpZGRlblN0YXR1cyIsImlzX2hvbWUiLCJob21lU3RhdGUiLCIkdGltZW91dCIsIlNlcnZpY2VXb3JraW5nUGFnZVZlcnNpb24iLCJsb2FkZWQiLCJvcGVuTGl2ZVVybCIsInZlcnNpb25JZCIsImxvYWRMaXZlVXJsIiwiY3VycmVudFBhZ2VWZXJzaW9uIiwiaXNUcmFuc2xhdGVkIiwiaXRlbUNvcHkiLCJzZXR0aW5ncyIsInR5cGVEYXRhQ29weSIsInR5cGVEYXRhIiwiZXJyb3JzIiwiaG9tZVVybCIsImN1cnJlbnRQYWdlVmVyc2lvbkFsaWFzIiwidHJhc2hJdGVtIiwiZGVsZXRlIiwiJGJyb2FkY2FzdCIsInJlc2V0IiwibmF2X2l0ZW1fdHlwZV9pZCIsInVwZGF0ZU5hdkl0ZW1EYXRhIiwidGl0bGVfdGFnIiwiZGVzY3JpcHRpb24iLCJrZXl3b3JkcyIsInRpbWVzdGFtcF9jcmVhdGUiLCJpbWFnZV9pZCIsImlzX3VybF9zdHJpY3RfcGFyc2luZ19kaXNhYmxlZCIsImlzX2NhY2hlYWJsZSIsInBhZ2VWZXJzaW9uS2V5IiwiT2JqZWN0Iiwia2V5cyIsInRvZ2dsZVNldHRpbmdzT3ZlcmxheSIsImVycm9yQ2FsbGJhY2siLCJyZW1vdmVWZXJzaW9uIiwidmVyc2lvbiIsInZlcnNpb25fYWxpYXMiLCJwYWdlSWQiLCJlZGl0VmVyc2lvbkl0ZW0iLCJ0YWIiLCJlZGl0VmVyc2lvbiIsInZlcnNpb25JdGVtIiwiY2hhbmdlVGFiIiwiZWRpdFZlcnNpb25VcGRhdGUiLCJsYW5nSWQiLCJtZXRob2QiLCJsYXN0VmVyc2lvbiIsImhhc1ZlcnNpb24iLCJzd2l0Y2hWZXJzaW9uIiwidmVyc2lvbkRyb3BEb3duVmlzYmlsaXR5IiwidG9nZ2xlVmVyc2lvbnNEcm9wZG93biIsInBhZ2VWZXJzaW9uaWQiLCJzdG9yZSIsImlzSW5TZWxlY3Rpb24iLCJzaG9ydF9jb2RlIiwic2V0dGluZ3NPdmVybGF5VmlzaWJpbGl0eSIsInJlZnJlc2hOZXN0ZWQiLCJwcmV2SWQiLCJwbGFjZWhvbGRlclZhciIsIm5hdkl0ZW1QYWdlSWQiLCJfX3BsYWNlaG9sZGVycyIsInBsYWNlaG9sZGVyIiwicmV2UGxhY2Vob2xkZXJzIiwicGxhY2Vob2xkZXJzIiwicmVwbGFjZUNvbnRlbnQiLCJwbGFjZWhvbGRlclJvdyIsInBsYWNlaG9sZGVyS2V5IiwicHJldl9pZCIsInJldkZpbmQiLCJob2xkZXJLZXkiLCJob2xkZXIiLCJkcm9wSXRlbVBsYWNlaG9sZGVyIiwic29ydF9pbmRleCIsImJsb2NrX2lkIiwicGxhY2Vob2xkZXJfdmFyIiwibmF2X2l0ZW1fcGFnZV9pZCIsImNvcHlCbG9ja0lkIiwicHV0IiwiJHNjZSIsIlNlcnZpY2VCbG9ja0NvcHlTdGFjayIsIk5hdkl0ZW1UeXBlUGFnZUNvbnRyb2xsZXIiLCJ2YXIiLCJlbGVtZW50Iiwic29ydEluZGV4IiwiJGluZGV4IiwicmVtb3ZlIiwiY29weUJsb2NrIiwiYmxvY2siLCJ0b2dnbGVIaWRkZW4iLCJibG9ja0lkIiwiaGlkZGVuU3RhdGUiLCJuYW1lIiwiaXNFZGl0YWJsZSIsInZhcnMiLCJpc0NvbmZpZ3VyYWJsZSIsImNmZ3MiLCJ2YWx1ZXMiLCJ2YXJpYXRpb24iLCJldmFsVmFyaWF0aW9uVmlzYmlsaXR5IiwiZ2V0SW5mbyIsInZhckZpZWxkTmFtZSIsImZpZWxkX2hlbHAiLCJ2YXJpYXRlbk5hbWUiLCJ2YXJpYXRpb25zIiwiaXNPYmplY3QiLCJ2IiwiayIsIm9iamVjdCIsImludmlzaWJsZSIsImNmZ2RhdGEiLCJjZmd2YWx1ZXMiLCJlZGl0IiwibW9kYWxIaWRkZW4iLCJtb2RhbE1vZGUiLCJpbml0TW9kYWxNb2RlIiwidG9nZ2xlRWRpdCIsInJlbmRlclRlbXBsYXRlIiwiZGF0YVZhcnMiLCJjZmdWYXJzIiwiZXh0cmFzIiwiVHdpZyIsInR3aWciLCJjb250ZW50IiwicmVuZGVyIiwidHJ1c3RBc0h0bWwiLCJyZW1vdmVCbG9jayIsImlzQW55UmVxdWlyZWRBdHRyaWJ1dGVFbXB0eSIsInZhckl0ZW0iLCJyZXF1aXJlZCIsImlzRW1wdHkiLCJsYWJlbCIsImpzb25fY29uZmlnX3ZhbHVlcyIsImpzb25fY29uZmlnX2NmZ192YWx1ZXMiLCJpc19kaXJ0eSIsIm9iamVjdGRldGFpbCIsIlNlcnZpY2VCbG9ja3NEYXRhIiwiYmxvY2tzRGF0YSIsImJsb2Nrc0RhdGFSZXN0b3JlIiwiYmxvY2tzRGF0YVJlbG9hZCIsImFkZFRvRmF2IiwicmVtb3ZlRnJvbUZhdiIsInRvZ2dsZUdyb3VwIiwiZ3JvdXAiLCJpc1ByZXZpZXdFbmFibGVkIiwicHJldmlld19lbmFibGVkIiwiY29weVN0YWNrIiwic3RhY2siLCJjbGVhclN0YWNrIiwiY2xlYXIiLCJzZWFyY2hRdWVyeSIsInNlYXJjaElzRGlydHkiLCJpc19mYXYiLCJzcGxpY2UiLCJyZXNvbHZlclByb3ZpZGVyIiwiYWRkQ2FsbGJhY2siLCJMdXlhTG9hZGluZyIsInN0YXJ0Iiwic3RvcCIsInNoaWZ0IiwiaWNvbiIsImNvcHlzdGFjayIsImZvcmNlUmVsb2FkIiwic2V0VXJsIiwiaXRlbUlkIiwiRGF0ZSIsImdldFRpbWUiLCJwcmV2aWV3VXJsIiwiZGVmYXVsdFdlYnNpdGUiLCJ3ZWJzaXRlcyIsInciLCJwYWdlIl0sIm1hcHBpbmdzIjoiOztB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QUEsZUFBSUEsQ0FBQyxDQUFDOVksRUFBRixLQUFTaUcsU0FBYjtBQUFBLE9BQXBDLENBQXpCO0FBQ0FtQyxNQUFBQSxVQUFVLENBQUNtSCxVQUFYLENBQXNCLCtCQUF0QixFQUF1RGpKLE9BQU8sQ0FBQ3JHLGNBQS9EO0FBQ0E7QUFDRCxHQUxEOztBQU9BLFNBQU9xRyxPQUFQO0FBQ0EsQ0F0Qm9DLENBQXJDO0FBd0JBbEgsR0FBRyxDQUFDaUgsT0FBSixDQUFZLDJCQUFaLEVBQXlDLENBQUMsWUFBVztBQUNwRCxNQUFJQyxPQUFPLEdBQUc7QUFDYnlTLElBQUFBLElBQUksRUFBRTtBQURPLEdBQWQ7O0FBSUF6UyxFQUFBQSxPQUFPLENBQUNtTCxLQUFSLEdBQWdCLFVBQVNmLE1BQVQsRUFBaUJoQyxTQUFqQixFQUE0QjtBQUMzQ3BJLElBQUFBLE9BQU8sQ0FBQ3lTLElBQVIsQ0FBYXJJLE1BQWIsSUFBdUJoQyxTQUF2QjtBQUNBLEdBRkQ7O0FBSUFwSSxFQUFBQSxPQUFPLENBQUM4SyxVQUFSLEdBQXFCLFVBQVNWLE1BQVQsRUFBaUI7QUFDckMsUUFBSXBLLE9BQU8sQ0FBQ3lTLElBQVIsQ0FBYW5ULGNBQWIsQ0FBNEI4SyxNQUE1QixDQUFKLEVBQXlDO0FBQ3hDLGFBQU9wSyxPQUFPLENBQUN5UyxJQUFSLENBQWFySSxNQUFiLENBQVA7QUFDQTs7QUFFRCxXQUFPLEtBQVA7QUFDQSxHQU5EOztBQVFBLFNBQU9wSyxPQUFQO0FBQ0EsQ0FsQndDLENBQXpDIiwiZmlsZSI6Im1haW4uanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24oKSB7XG5cdFwidXNlIHN0cmljdFwiO1xuXHRcblx0Ly8gZGlyZWN0aXZlLmpzXG5cbiAgICB6YWEuZGlyZWN0aXZlKFwibWVudURyb3Bkb3duXCIsIFsnU2VydmljZU1lbnVEYXRhJywgJ1NlcnZpY2VDdXJyZW50V2Vic2l0ZScsICckZmlsdGVyJywgZnVuY3Rpb24oU2VydmljZU1lbnVEYXRhLCBTZXJ2aWNlQ3VycmVudFdlYnNpdGUsICRmaWx0ZXIpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJlc3RyaWN0IDogJ0UnLFxuICAgICAgICAgICAgc2NvcGUgOiB7XG4gICAgICAgICAgICAgICAgbmF2SWQgOiAnPSdcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250cm9sbGVyIDogWyckc2NvcGUnLCBmdW5jdGlvbigkc2NvcGUpIHtcblxuICAgICAgICAgICAgICAgICRzY29wZS5jaGFuZ2VNb2RlbCA9IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgJHNjb3BlLm5hdklkID0gZGF0YS5pZDtcbiAgICAgICAgICAgICAgICB9XG5cblx0XHRcdFx0JHNjb3BlLmN1cnJlbnRXZWJzaXRlID0gU2VydmljZUN1cnJlbnRXZWJzaXRlLmN1cnJlbnRXZWJzaXRlO1xuXHRcdFx0XHQkc2NvcGUuJG9uKCdzZXJ2aWNlOkN1cnJlbnRXZWJzaXRlQ2hhbmdlZCcsIGZ1bmN0aW9uKGV2ZW50LCBkYXRhKSB7XG5cdFx0XHRcdFx0JHNjb3BlLmN1cnJlbnRXZWJzaXRlID0gU2VydmljZUN1cnJlbnRXZWJzaXRlLmN1cnJlbnRXZWJzaXRlO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHQkc2NvcGUubWVudURhdGEgPSBhbmd1bGFyLmNvcHkoU2VydmljZU1lbnVEYXRhLmRhdGEpO1xuXHRcdFx0XHQkc2NvcGUubWVudURhdGFPcmlnaW5hbCA9IGFuZ3VsYXIuY29weShTZXJ2aWNlTWVudURhdGEuZGF0YSk7XG5cbiAgICAgICAgICAgICAgICAkc2NvcGUuJG9uKCdzZXJ2aWNlOk1lbnVEYXRhJywgZnVuY3Rpb24oZXZlbnQsIGRhdGEpIHtcblx0XHRcdFx0XHQkc2NvcGUubWVudURhdGEgPSBhbmd1bGFyLmNvcHkoZGF0YSk7XG5cdFx0XHRcdFx0JHNjb3BlLm1lbnVEYXRhT3JpZ2luYWwgPSBhbmd1bGFyLmNvcHkoZGF0YSk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBpbml0KCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoJHNjb3BlLm1lbnVEYXRhLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlTWVudURhdGEubG9hZCgpLnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFNlcnZpY2VDdXJyZW50V2Vic2l0ZS5sb2FkKCk7XG5cdFx0XHRcdFx0XHR9KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgY29udGFpbmVyIGluICRzY29wZS5tZW51RGF0YS5jb250YWluZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgICRzY29wZS5tZW51RGF0YS5jb250YWluZXJzW2NvbnRhaW5lcl0uaXNIaWRkZW4gPSBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRcblx0XHRcdFx0JHNjb3BlLiR3YXRjaCgnc2VhcmNoUXVlcnknLCBmdW5jdGlvbihuKSB7XG5cdFx0XHRcdFx0aWYgKG4gPT0gbnVsbCB8fCBuID09ICcnKSB7XG5cdFx0XHRcdFx0XHQkc2NvcGUubWVudURhdGEuaXRlbXMgPSBhbmd1bGFyLmNvcHkoJHNjb3BlLm1lbnVEYXRhT3JpZ2luYWwuaXRlbXMpO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR2YXIgaXRlbXMgPSAkZmlsdGVyKCdmaWx0ZXInKSgkc2NvcGUubWVudURhdGFPcmlnaW5hbC5pdGVtcywge3RpdGxlOiBufSk7XG5cblx0XHRcdFx0XHQvLyBmaW5kIGFsbCBwYXJlbnQgZWxlbWVudHMgb2YgdGhlIGZvdW5kIGVsZW1lbnRzIGFuZCByZSBhZGQgdGhlbSB0byB0aGUgbWFwIGluIG9yZGVyIHRvIFxuXHRcdFx0XHRcdC8vIGVuc3VyZSBhIGNvcnJlY3QgbWVudSB0cmVlLlxuXHRcdFx0XHRcdGFuZ3VsYXIuZm9yRWFjaChpdGVtcywgZnVuY3Rpb24odmFsdWUpIHtcblx0XHRcdFx0XHRcdGlmICh2YWx1ZVsncGFyZW50X25hdl9pZCddID4gMCkge1xuXHRcdFx0XHRcdFx0XHQkc2NvcGUuYnViYmxlUGFyZW50cyh2YWx1ZVsncGFyZW50X25hdl9pZCddLCB2YWx1ZVsnbmF2X2NvbnRhaW5lcl9pZCddLCBpdGVtcyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHQkc2NvcGUubWVudURhdGEuaXRlbXMgPSBpdGVtcztcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0JHNjb3BlLmJ1YmJsZVBhcmVudHMgPSBmdW5jdGlvbihwYXJlbnROYXZJZCwgY29udGFpbmVySWQsIGluZGV4KSB7XG5cdFx0XHRcdFx0dmFyIGl0ZW0gPSAkZmlsdGVyKCdtZW51Y2hpbGRmaWx0ZXInKSgkc2NvcGUubWVudURhdGFPcmlnaW5hbC5pdGVtcywgY29udGFpbmVySWQsIHBhcmVudE5hdklkKTtcblx0XHRcdFx0XHRpZiAoaXRlbSkge1xuXHRcdFx0XHRcdFx0dmFyIGV4aXN0cyA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0YW5ndWxhci5mb3JFYWNoKGluZGV4LCBmdW5jdGlvbihpKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChpLmlkID09IGl0ZW0uaWQpIHtcblx0XHRcdFx0XHRcdFx0XHRleGlzdHMgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0aWYgKCFleGlzdHMpIHtcblx0XHRcdFx0XHRcdFx0aW5kZXgucHVzaChpdGVtKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdCRzY29wZS5idWJibGVQYXJlbnRzKGl0ZW0ucGFyZW50X25hdl9pZCwgaXRlbS5uYXZfY29udGFpbmVyX2lkLCBpbmRleCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXG4gICAgICAgICAgICAgICAgJHNjb3BlLnRvZ2dsZXIgPSB0cnVlO1xuXG5cdFx0XHRcdGluaXQoKTtcbiAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgdGVtcGxhdGUgOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuICc8ZGl2PicrXG5cdFx0XHRcdFx0JzxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCBtYi0yXCI+Jytcblx0XHRcdFx0XHRcdCc8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtcHJlcGVuZFwiIG5nLWhpZGU9XCJzZWFyY2hRdWVyeVwiPjxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC10ZXh0XCI+PGkgY2xhc3M9XCJtYXRlcmlhbC1pY29uc1wiPnNlYXJjaDwvaT48L2Rpdj48L2Rpdj4nK1xuXHRcdFx0XHRcdFx0JzxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC1wcmVwZW5kXCIgbmctc2hvdz1cInNlYXJjaFF1ZXJ5XCIgbmctY2xpY2s9XCJzZWFyY2hRdWVyeSA9IFxcJ1xcJ1wiPjxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC10ZXh0XCI+PGkgY2xhc3M9XCJtYXRlcmlhbC1pY29uc1wiPmNsZWFyPC9pPjwvZGl2PjwvZGl2PicrXG5cdFx0XHRcdFx0XHQnPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgbmctbW9kZWw9XCJzZWFyY2hRdWVyeVwiIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCInK2kxOG5bJ25ncmVzdF9jcnVkX3NlYXJjaF90ZXh0J10rJ1wiPicrXG5cdFx0XHRcdFx0JzwvZGl2PicgKyBcblx0XHRcdFx0XHQnPGRpdiBuZy1yZXBlYXQ9XCIoa2V5LCBjb250YWluZXIpIGluIG1lbnVEYXRhLmNvbnRhaW5lcnMgfCBtZW51d2Vic2l0ZWZpbHRlcjpjdXJyZW50V2Vic2l0ZS5pZFwiIG5nLWlmPVwiKG1lbnVEYXRhLml0ZW1zIHwgbWVudXBhcmVudGZpbHRlcjpjb250YWluZXIuaWQ6MCkubGVuZ3RoID4gMFwiIGNsYXNzPVwiY2FyZCBtYi0yXCIgbmctY2xhc3M9XCJ7XFwnY2FyZC1jbG9zZWRcXCc6ICFjb250YWluZXIuaXNIaWRkZW59XCI+Jytcblx0XHRcdFx0XHRcdCc8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXJcIiBuZy1jbGljaz1cImNvbnRhaW5lci5pc0hpZGRlbj0hY29udGFpbmVyLmlzSGlkZGVuXCI+Jytcblx0XHRcdFx0XHRcdFx0JzxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMgY2FyZC10b2dnbGUtaW5kaWNhdG9yXCI+a2V5Ym9hcmRfYXJyb3dfZG93bjwvc3Bhbj4nK1xuXHRcdFx0XHRcdFx0XHQnPHNwYW4+e3tjb250YWluZXIubmFtZX19PC9zcGFuPicrXG5cdFx0XHRcdFx0XHQnPC9kaXY+Jytcblx0XHRcdFx0XHRcdCc8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5XCI+JysgXG5cdFx0XHRcdFx0XHRcdCc8ZGl2IGNsYXNzPVwidHJlZXZpZXcgdHJlZXZpZXctY2hvb3NlclwiPicgK1xuXHRcdFx0XHRcdFx0XHRcdCc8dWwgY2xhc3M9XCJ0cmVldmlldy1pdGVtcyB0cmVldmlldy1pdGVtcy1sdmwxXCI+JyArXG5cdFx0XHRcdFx0XHRcdFx0XHQnPGxpIGNsYXNzPVwidHJlZXZpZXctaXRlbSB0cmVldmlldy1pdGVtLWx2bDFcIiBuZy1jbGFzcz1cIntcXCd0cmVldmlldy1pdGVtLWhhcy1jaGlsZHJlblxcJyA6IChtZW51RGF0YS5pdGVtcyB8IG1lbnVwYXJlbnRmaWx0ZXI6Y29udGFpbmVyLmlkOjApLmxlbmd0aH1cIiBuZy1yZXBlYXQ9XCIoa2V5LCBkYXRhKSBpbiBtZW51RGF0YS5pdGVtcyB8IG1lbnVwYXJlbnRmaWx0ZXI6Y29udGFpbmVyLmlkOjAgdHJhY2sgYnkgZGF0YS5pZFwiIG5nLWluY2x1ZGU9XCJcXCdtZW51RHJvcGRvd25SZXZlcnNlXFwnXCI+PC9saT4nICtcblx0XHRcdFx0XHRcdFx0XHQnPC91bD4nICtcblx0XHRcdFx0XHRcdFx0JzwvZGl2PicgK1xuXHRcdFx0XHRcdFx0JzwvZGl2PicgK1xuXHRcdFx0XHRcdCc8L2Rpdj4nK1xuXHRcdFx0XHQnPC9kaXY+JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1dKTtcblxuXHR6YWEuZGlyZWN0aXZlKFwiemFhQ21zUGFnZVwiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJlc3RyaWN0OiBcIkVcIixcbiAgICAgICAgICAgIHNjb3BlOiB7XG4gICAgICAgICAgICAgICAgXCJtb2RlbFwiOiBcIj1cIixcbiAgICAgICAgICAgICAgICBcIm9wdGlvbnNcIjogXCI9XCIsXG4gICAgICAgICAgICAgICAgXCJsYWJlbFwiOiBcIkBsYWJlbFwiLFxuICAgICAgICAgICAgICAgIFwiaTE4blwiOiBcIkBpMThuXCIsXG4gICAgICAgICAgICAgICAgXCJpZFwiOiBcIkBmaWVsZGlkXCIsXG4gICAgICAgICAgICAgICAgXCJuYW1lXCI6IFwiQGZpZWxkbmFtZVwiLFxuXHRcdFx0XHRcImNsZWFyYWJsZVwiOiBcIkBjbGVhcmFibGVcIlxuICAgICAgICAgICAgfSxcblx0XHRcdGNvbnRyb2xsZXIgOiBbJyRzY29wZScsIGZ1bmN0aW9uKCRzY29wZSkge1xuXHRcdFx0XHQkc2NvcGUucmVzZXRWYWx1ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdCRzY29wZS5tb2RlbCA9IG51bGxcblx0XHRcdFx0fVxuXHRcdFx0fV0sXG4gICAgICAgICAgICB0ZW1wbGF0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBcdHJldHVybiAgJzxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIGZvcm0tc2lkZS1ieS1zaWRlXCIgbmctY2xhc3M9XCJ7XFwnaW5wdXQtLWhpZGUtbGFiZWxcXCc6IGkxOG59XCI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJmb3JtLXNpZGUgZm9ybS1zaWRlLWxhYmVsXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8bGFiZWw+e3tsYWJlbH19PC9sYWJlbD4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJmb3JtLXNpZGVcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxtZW51LWRyb3Bkb3duIGNsYXNzPVwibWVudS1kcm9wZG93blwiIG5hdi1pZD1cIm1vZGVsXCI+PC9tZW51LWRyb3Bkb3duPicgK1xuXHRcdFx0XHRcdFx0XHRcdCc8YnV0dG9uIG5nLWlmPVwiY2xlYXJhYmxlICYmIG1vZGVsXCIgbmctY2xpY2s9XCJyZXNldFZhbHVlKClcIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1zZWNvbmRhcnlcIj48aSBjbGFzcz1cIm1hdGVyaWFsLWljb25zXCI+Y2xlYXI8L2k+PC9idXR0b24+JyArIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG5cblx0emFhLmRpcmVjdGl2ZShcInNob3dJbnRlcm5hbFJlZGlyZWN0aW9uXCIsIGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRyZXN0cmljdCA6ICdFJyxcblx0XHRcdHNjb3BlIDoge1xuXHRcdFx0XHRuYXZJZCA6ICc9J1xuXHRcdFx0fSxcblx0XHRcdGNvbnRyb2xsZXIgOiBbJyRzY29wZScsICckaHR0cCcsICckc3RhdGUnLCBmdW5jdGlvbigkc2NvcGUsICRodHRwLCAkc3RhdGUpIHtcblxuXHRcdFx0XHQkc2NvcGUuJHdhdGNoKCduYXZJZCcsIGZ1bmN0aW9uKG4pIHtcblx0XHRcdFx0XHRpZiAobikge1xuXHRcdFx0XHRcdFx0JGh0dHAuZ2V0KCdhZG1pbi9hcGktY21zLW5hdml0ZW0vZ2V0LW5hdi1pdGVtLXBhdGgnLCB7IHBhcmFtcyA6IHsgbmF2SWQgOiAkc2NvcGUubmF2SWQgfX0pLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcblx0XHRcdFx0XHRcdFx0JHNjb3BlLnBhdGggPSByZXNwb25zZS5kYXRhO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHQkaHR0cC5nZXQoJ2FkbWluL2FwaS1jbXMtbmF2aXRlbS9nZXQtbmF2LWNvbnRhaW5lci1uYW1lJywgeyBwYXJhbXMgOiB7IG5hdklkIDogJHNjb3BlLm5hdklkIH19KS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG5cdFx0XHRcdFx0XHRcdCRzY29wZS5jb250YWluZXIgPSByZXNwb25zZS5kYXRhO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1dLFxuXHRcdFx0dGVtcGxhdGUgOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuICc8YSBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5IGJ0bi1zbVwiIHVpLXNyZWY9XCJjdXN0b20uY21zZWRpdCh7IG5hdklkIDogbmF2SWQsIHRlbXBsYXRlSWQ6IFxcJ2Ntc2FkbWluL2RlZmF1bHQvaW5kZXhcXCd9KVwiPnt7cGF0aH19PC9hPiBpbiB7e2NvbnRhaW5lcn19Jztcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXHRcblx0emFhLmRpcmVjdGl2ZShcImNyZWF0ZUZvcm1cIiwgZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHJlc3RyaWN0IDogJ0VBJyxcblx0XHRcdHNjb3BlIDoge1xuXHRcdFx0XHRkYXRhIDogJz0nXG5cdFx0XHR9LFxuXHRcdFx0dGVtcGxhdGVVcmwgOiAnY3JlYXRlZm9ybS5odG1sJyxcblx0XHRcdGNvbnRyb2xsZXIgOiBbJyRzY29wZScsICckaHR0cCcsICckZmlsdGVyJywgJ1NlcnZpY2VNZW51RGF0YScsICdTZXJ2aWNlTGFuZ3VhZ2VzRGF0YScsICdBZG1pblRvYXN0U2VydmljZScsICdTZXJ2aWNlQ3VycmVudFdlYnNpdGUnLCBmdW5jdGlvbigkc2NvcGUsICRodHRwLCAkZmlsdGVyLCBTZXJ2aWNlTWVudURhdGEsIFNlcnZpY2VMYW5ndWFnZXNEYXRhLCBBZG1pblRvYXN0U2VydmljZSwgU2VydmljZUN1cnJlbnRXZWJzaXRlKSB7XG5cblx0XHRcdFx0JHNjb3BlLmVycm9yID0gW107XG5cdFx0XHRcdCRzY29wZS5zdWNjZXNzID0gZmFsc2U7XG5cblx0XHRcdFx0JHNjb3BlLmNvbnRyb2xsZXIgPSAkc2NvcGUuJHBhcmVudDtcblxuXHRcdFx0XHQkc2NvcGUubWVudURhdGEgPSBTZXJ2aWNlTWVudURhdGEuZGF0YTtcblxuXHRcdFx0XHQkc2NvcGUuJG9uKCdzZXJ2aWNlOk1lbnVEYXRhJywgZnVuY3Rpb24oZXZlbnQsIGRhdGEpIHtcblx0XHRcdFx0XHQkc2NvcGUubWVudURhdGEgPSBkYXRhO1xuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHQkc2NvcGUubWVudURhdGFSZWxvYWQgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRyZXR1cm4gU2VydmljZU1lbnVEYXRhLmxvYWQodHJ1ZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRmdW5jdGlvbiBpbml0aWFsaXplcigpIHtcblx0XHRcdFx0XHQkc2NvcGUubWVudSA9ICRzY29wZS5tZW51RGF0YS5pdGVtcztcblx0XHRcdFx0XHQkc2NvcGUubmF2Y29udGFpbmVycyA9ICRzY29wZS5tZW51RGF0YS5jb250YWluZXJzO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aW5pdGlhbGl6ZXIoKTtcblxuXG5cdFx0XHRcdCRzY29wZS5kYXRhLm5hdl9pdGVtX3R5cGUgPSAxO1xuXHRcdFx0XHQkc2NvcGUuZGF0YS5wYXJlbnRfbmF2X2lkID0gMDtcblx0XHRcdFx0JHNjb3BlLmRhdGEuaXNfZHJhZnQgPSAwO1xuXG5cdFx0XHRcdCRzY29wZS5kYXRhLm5hdl9jb250YWluZXJfaWQgPSBTZXJ2aWNlQ3VycmVudFdlYnNpdGUuY3VycmVudFdlYnNpdGUuZGVmYXVsdF9jb250YWluZXJfaWQ7XG5cblx0XHRcdFx0JHNjb3BlLmN1cnJlbnRXZWJzaXRlID0gU2VydmljZUN1cnJlbnRXZWJzaXRlLmN1cnJlbnRXZWJzaXRlO1xuXHRcdFx0XHQkc2NvcGUuJG9uKCdzZXJ2aWNlOkN1cnJlbnRXZWJzaXRlQ2hhbmdlZCcsIGZ1bmN0aW9uKGV2ZW50LCBkYXRhKSB7XG5cdFx0XHRcdFx0aWYgKFNlcnZpY2VDdXJyZW50V2Vic2l0ZS5jdXJyZW50V2Vic2l0ZSkge1xuXHRcdFx0XHRcdFx0JHNjb3BlLmN1cnJlbnRXZWJzaXRlID0gU2VydmljZUN1cnJlbnRXZWJzaXRlLmN1cnJlbnRXZWJzaXRlO1xuXHRcdFx0XHRcdFx0JHNjb3BlLmRhdGEubmF2X2NvbnRhaW5lcl9pZCA9IFNlcnZpY2VDdXJyZW50V2Vic2l0ZS5jdXJyZW50V2Vic2l0ZS5kZWZhdWx0X2NvbnRhaW5lcl9pZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdCRzY29wZS5sYW5ndWFnZXNEYXRhID0gU2VydmljZUxhbmd1YWdlc0RhdGEuZGF0YTtcblxuXHRcdFx0XHQkc2NvcGUuJG9uKCdzZXJ2aWNlOkxhbmd1YWdlc0RhdGEnLCBmdW5jdGlvbihldmVudCwgZGF0YSkge1xuXHRcdFx0XHRcdCRzY29wZS5sYW5ndWFnZXNEYXRhID0gZGF0YTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0JHNjb3BlLmlzRGVmYXVsdEl0ZW0gPSAkc2NvcGUubGFuZ3VhZ2VzRGF0YS5maW5kKGl0ZW0gPT4ge1xuXHRcdFx0XHRcdHJldHVybiBpdGVtLmlzX2RlZmF1bHQ7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdCRzY29wZS5kYXRhLmxhbmdfaWQgPSAkc2NvcGUuaXNEZWZhdWx0SXRlbS5pZDtcblxuXHRcdFx0XHQkc2NvcGUuJHdhdGNoKGZ1bmN0aW9uKCkgeyByZXR1cm4gJHNjb3BlLmRhdGEubmF2X2NvbnRhaW5lcl9pZCB9LCBmdW5jdGlvbihuLCBvKSB7XG5cdFx0XHRcdFx0aWYgKG4gIT09IHVuZGVmaW5lZCAmJiBuICE9PSBvKSB7XG5cdFx0XHRcdFx0XHQkc2NvcGUuZGF0YS5wYXJlbnRfbmF2X2lkID0gMDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdCRzY29wZS5hbGlhc1N1Z2dlc3Rpb24gPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHQkc2NvcGUuZGF0YS5hbGlhcyA9ICRmaWx0ZXIoJ3NsdWdpZnknKSgkc2NvcGUuZGF0YS50aXRsZSk7XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0JHNjb3BlLiR3YXRjaCgnZGF0YS5hbGlhcycsIGZ1bmN0aW9uKG4sIG8pIHtcblx0XHRcdFx0XHRpZiAobiE9byAmJiBuIT1udWxsKSB7XG5cdFx0XHRcdFx0XHQkc2NvcGUuZGF0YS5hbGlhcyA9ICRmaWx0ZXIoJ3NsdWdpZnknKShuKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdCRzY29wZS5leGVjID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdCRzY29wZS5jb250cm9sbGVyLnNhdmUoKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG5cdFx0XHRcdFx0XHQkc2NvcGUubWVudURhdGFSZWxvYWQoKTtcblx0XHRcdFx0XHRcdCRzY29wZS5zdWNjZXNzID0gdHJ1ZTtcblx0XHRcdFx0XHRcdCRzY29wZS5lcnJvciA9IFtdO1xuXHRcdFx0XHRcdFx0JHNjb3BlLmRhdGEudGl0bGUgPSBudWxsO1xuXHRcdFx0XHRcdFx0JHNjb3BlLmRhdGEuYWxpYXMgPSBudWxsO1xuXHRcdFx0XHRcdFx0aWYgKCRzY29wZS5kYXRhLmlzSW5saW5lKSB7XG5cdFx0XHRcdFx0XHRcdCRzY29wZS4kcGFyZW50LiRwYXJlbnQuZ2V0SXRlbSgkc2NvcGUuZGF0YS5sYW5nX2lkLCAkc2NvcGUuZGF0YS5uYXZfaWQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0QWRtaW5Ub2FzdFNlcnZpY2Uuc3VjY2VzcyhpMThuWyd2aWV3X2luZGV4X3BhZ2Vfc3VjY2VzcyddKTtcblx0XHRcdFx0XHR9LCBmdW5jdGlvbihyZWFzb24pIHtcblx0XHRcdFx0XHRcdGFuZ3VsYXIuZm9yRWFjaChyZWFzb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcblx0XHRcdFx0XHRcdFx0QWRtaW5Ub2FzdFNlcnZpY2UuZXJyb3IodmFsdWVbMF0pO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHQkc2NvcGUuZXJyb3IgPSByZWFzb247XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0fV1cblx0XHR9XG5cdH0pO1xuXG5cdC8qKiBQQUdFIENSRUFURSAmIFVQREFURSAqL1xuICAgIHphYS5kaXJlY3RpdmUoXCJ1cGRhdGVGb3JtUGFnZVwiLCBbJ1NlcnZpY2VMYXlvdXRzRGF0YScsIGZ1bmN0aW9uKFNlcnZpY2VMYXlvdXRzRGF0YSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmVzdHJpY3QgOiAnRUEnLFxuICAgICAgICAgICAgc2NvcGUgOiB7XG4gICAgICAgICAgICAgICAgZGF0YSA6ICc9J1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsIDogJ3VwZGF0ZWZvcm1wYWdlLmh0bWwnLFxuICAgICAgICAgICAgY29udHJvbGxlciA6IFsnJHNjb3BlJywgJyRodHRwJywgZnVuY3Rpb24oJHNjb3BlLCAkaHR0cCkge1xuXG4gICAgICAgICAgICBcdCRzY29wZS5wYXJlbnQgPSAkc2NvcGUuJHBhcmVudC4kcGFyZW50O1xuXHRcdFx0XHQkc2NvcGUubmF2SXRlbUlkID0gJHNjb3BlLnBhcmVudC5pdGVtLmlkO1xuXG5cblx0XHRcdFx0JHNjb3BlLmRhdGEubGF5b3V0X2lkID0gMDtcblx0XHRcdFx0JHNjb3BlLmxheW91dHNEYXRhID0gU2VydmljZUxheW91dHNEYXRhLmRhdGE7XG5cblx0XHRcdFx0JHNjb3BlLmFycmF5VG9TZWxlY3QgPSBmdW5jdGlvbihpbnB1dCwgdmFsdWVGaWVsZCwgbGFiZWxGaWVsZCkge1xuXHRcdFx0XHRcdHZhciBvdXRwdXQgPSBbXTtcblx0XHRcdFx0XHRhbmd1bGFyLmZvckVhY2goaW5wdXQsIGZ1bmN0aW9uKHZhbHVlKSB7XG5cdFx0XHRcdFx0XHRvdXRwdXQucHVzaCh7XCJsYWJlbFwiOiB2YWx1ZVtsYWJlbEZpZWxkXSwgXCJ2YWx1ZVwiOiB2YWx1ZVt2YWx1ZUZpZWxkXX0pO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdHJldHVybiBvdXRwdXQ7XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0JHNjb3BlLiRvbignc2VydmljZTpMYXlvdXRzRGF0YScsIGZ1bmN0aW9uKGV2ZW50LCBkYXRhKSB7XG5cdFx0XHRcdFx0JHNjb3BlLmxheW91dHNEYXRhID0gW107IC8vICRzY29wZS5hcnJheVRvU2VsZWN0KGRhdGEpOyAvLyBAVE9ETyBSRU1PVkUgSUYgVkVSSUZJRURcblx0XHRcdFx0fSk7XG5cblxuXHRcdFx0XHQkc2NvcGUudmVyc2lvbnNEYXRhID0gW107XG5cblx0XHRcdFx0JHNjb3BlLmdldFZlcnNpb25MaXN0ID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0JGh0dHAuZ2V0KCdhZG1pbi9hcGktY21zLW5hdml0ZW1wYWdlL3ZlcnNpb25zJywgeyBwYXJhbXMgOiB7IG5hdkl0ZW1JZCA6ICRzY29wZS5uYXZJdGVtSWQgfX0pLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcblx0XHRcdFx0XHRcdCRzY29wZS52ZXJzaW9uc0RhdGEgPSAkc2NvcGUuYXJyYXlUb1NlbGVjdChyZXNwb25zZS5kYXRhLCAnaWQnLCAndmVyc2lvbl9hbGlhcycpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9O1xuXG4gICAgICAgICAgICBcdCRzY29wZS5pc0VkaXRBdmFpbGFibGUgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRyZXR1cm4gJHNjb3BlLnZlcnNpb25zRGF0YS5sZW5ndGg7XG4gICAgICAgICAgICBcdH07XG5cblx0XHRcdFx0ZnVuY3Rpb24gaW5pdCgpIHtcblx0XHRcdFx0XHQkc2NvcGUuZ2V0VmVyc2lvbkxpc3QoKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGluaXQoKTtcbiAgICAgICAgICAgIH1dXG4gICAgICAgIH1cblx0fV0pO1xuXHR6YWEuZGlyZWN0aXZlKFwiY3JlYXRlRm9ybVBhZ2VcIiwgZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHJlc3RyaWN0IDogJ0VBJyxcblx0XHRcdHNjb3BlIDoge1xuXHRcdFx0XHRkYXRhIDogJz0nXG5cdFx0XHR9LFxuXHRcdFx0dGVtcGxhdGVVcmwgOiAnY3JlYXRlZm9ybXBhZ2UuaHRtbCcsXG5cdFx0XHRjb250cm9sbGVyIDogWyckc2NvcGUnLCAnU2VydmljZUxheW91dHNEYXRhJywgJ1NlcnZpY2VNZW51RGF0YScsIGZ1bmN0aW9uKCRzY29wZSwgU2VydmljZUxheW91dHNEYXRhLCBTZXJ2aWNlTWVudURhdGEpIHtcblxuXHRcdFx0XHQkc2NvcGUuZGF0YS51c2VfZHJhZnQgPSAwO1xuXHRcdFx0XHQkc2NvcGUuZGF0YS5sYXlvdXRfaWQgPSAwO1xuXHRcdFx0XHQkc2NvcGUuZGF0YS5mcm9tX2RyYWZ0X2lkID0gMDtcblxuXHRcdFx0XHQvKiBsYXlvdXRzRGF0YSAqL1xuXG5cdFx0XHRcdCRzY29wZS5sYXlvdXRzRGF0YSA9IFNlcnZpY2VMYXlvdXRzRGF0YS5kYXRhO1xuXG4gICAgICAgICAgICBcdCRzY29wZS4kb24oJ3NlcnZpY2U6QmxvY2tzRGF0YScsIGZ1bmN0aW9uKGV2ZW50LCBkYXRhKSB7XG4gICAgICAgICAgICBcdFx0JHNjb3BlLmxheW91dHNEYXRhID0gZGF0YTtcbiAgICAgICAgICAgIFx0fSk7XG5cbiAgICAgICAgICAgIFx0LyogbWVudURhdGEgKi9cblxuICAgIFx0XHRcdCRzY29wZS5tZW51RGF0YSA9IFNlcnZpY2VNZW51RGF0YS5kYXRhO1xuXG5cdFx0XHRcdCRzY29wZS4kb24oJ3NlcnZpY2U6TWVudURhdGEnLCBmdW5jdGlvbihldmVudCwgZGF0YSkge1xuXHRcdFx0XHRcdCRzY29wZS5tZW51RGF0YSA9IGRhdGE7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdCRzY29wZS5hcnJheVRvU2VsZWN0ID0gZnVuY3Rpb24oaW5wdXQsIHZhbHVlRmllbGQsIGxhYmVsRmllbGQpIHtcblx0XHRcdFx0XHR2YXIgb3V0cHV0ID0gW107XG5cdFx0XHRcdFx0YW5ndWxhci5mb3JFYWNoKGlucHV0LCBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdFx0XHRcdFx0b3V0cHV0LnB1c2goe1wibGFiZWxcIjogdmFsdWVbbGFiZWxGaWVsZF0sIFwidmFsdWVcIjogdmFsdWVbdmFsdWVGaWVsZF19KTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRyZXR1cm4gb3V0cHV0O1xuXHRcdFx0XHR9O1xuXG4gICAgICAgICAgICBcdGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgICAgICAgICBcdFx0JHNjb3BlLmRyYWZ0cyA9ICRzY29wZS5hcnJheVRvU2VsZWN0KCRzY29wZS5tZW51RGF0YS5kcmFmdHMsICdpZCcsICd0aXRsZScpO1xuXHRcdFx0XHRcdCRzY29wZS5sYXlvdXRzID0gJHNjb3BlLmFycmF5VG9TZWxlY3QoJHNjb3BlLmxheW91dHNEYXRhLCAnaWQnLCAnbmFtZScpO1xuICAgICAgICAgICAgXHR9XG5cbiAgICAgICAgICAgIFx0aW5pdCgpO1xuXG5cdFx0XHRcdCRzY29wZS5zYXZlID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0JHNjb3BlLiRwYXJlbnQuZXhlYygpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XVxuXHRcdH1cblx0fSk7XG5cblx0LyogUGFnZSBNT0RVTEUgKi9cblxuXHR6YWEuZGlyZWN0aXZlKFwiZm9ybU1vZHVsZVwiLCBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0cmVzdHJpY3QgOiAnRUEnLFxuXHRcdFx0c2NvcGUgOiB7XG5cdFx0XHRcdGRhdGEgOiAnPSdcblx0XHRcdH0sXG5cdFx0XHR0ZW1wbGF0ZVVybCA6ICdmb3JtbW9kdWxlLmh0bWwnLFxuXHRcdFx0Y29udHJvbGxlciA6IFsnJHNjb3BlJywgJyRodHRwJywgZnVuY3Rpb24oJHNjb3BlLCAkaHR0cCkge1xuXG5cdFx0XHRcdCRzY29wZS5tb2R1bGVzID0gW107XG5cdFx0XHRcdCRzY29wZS5jb250cm9sbGVycyA9IFtdO1xuXHRcdFx0XHQkc2NvcGUuYWN0aW9ucyA9IFtdO1xuXHRcdFx0XHQkc2NvcGUucGFyYW1zID0ge307XG5cblx0XHRcdFx0JGh0dHAuZ2V0KCdhZG1pbi9hcGktYWRtaW4tY29tbW9uL2RhdGEtbW9kdWxlcycpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcblx0XHRcdFx0XHQkc2NvcGUubW9kdWxlcyA9IHJlc3BvbnNlLmRhdGE7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdCRzY29wZS5hZGRQYXJhbSA9IGZ1bmN0aW9uKGtleSkge1xuXHRcdFx0XHRcdGlmICghJHNjb3BlLmRhdGEuaGFzT3duUHJvcGVydHkoJ2FjdGlvbl9wYXJhbXMnKSkge1xuXHRcdFx0XHRcdFx0JHNjb3BlLmRhdGEuYWN0aW9uX3BhcmFtcyA9IHt9O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHQkc2NvcGUuZGF0YS5hY3Rpb25fcGFyYW1zW2tleV0gPSAnJztcblx0XHRcdFx0fTtcblxuXHRcdFx0XHQkc2NvcGUuJHdhdGNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHJldHVybiAkc2NvcGUuZGF0YS5tb2R1bGVfbmFtZTtcblx0XHRcdFx0fSwgZnVuY3Rpb24obikge1xuXHRcdFx0XHRcdGlmIChuKSB7XG5cdFx0XHRcdFx0XHQkaHR0cC5nZXQoJ2FkbWluL2FwaS1jbXMtYWRtaW4vbW9kdWxlLWNvbnRyb2xsZXJzP21vZHVsZT0nICsgbikudGhlbihmdW5jdGlvbihyZXNwb25zZSkge1xuXHRcdFx0XHRcdFx0XHQkc2NvcGUuY29udHJvbGxlcnMgPSByZXNwb25zZS5kYXRhO1xuXHRcdFx0XHRcdFx0XHQkc2NvcGUuYWN0aW9ucyA9IFtdO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblxuXHRcdFx0XHQkc2NvcGUuJHdhdGNoKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHJldHVybiAkc2NvcGUuZGF0YS5jb250cm9sbGVyX25hbWU7XG5cdFx0XHRcdH0sIGZ1bmN0aW9uKG4pIHtcblx0XHRcdFx0XHRpZiAobikge1xuXHRcdFx0XHRcdFx0JGh0dHAuZ2V0KCdhZG1pbi9hcGktY21zLWFkbWluL2NvbnRyb2xsZXItYWN0aW9ucz9tb2R1bGU9Jyskc2NvcGUuZGF0YS5tb2R1bGVfbmFtZSsnJmNvbnRyb2xsZXI9JyArIG4pLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcblx0XHRcdFx0XHRcdFx0JHNjb3BlLmFjdGlvbnMgPSByZXNwb25zZS5kYXRhO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1dXG5cdFx0fVxuXHR9KTtcblxuXHQvKiBmaWx0ZXJzICovXG5cblx0emFhLmZpbHRlcihcIm1lbnV3ZWJzaXRlZmlsdGVyXCIsIGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBmdW5jdGlvbihpbnB1dCwgd2Vic2l0ZUlkKSB7XG5cdFx0XHR2YXIgcmVzdWx0ID0gW107XG5cdFx0XHRhbmd1bGFyLmZvckVhY2goaW5wdXQsIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcblx0XHRcdFx0aWYgKHZhbHVlLndlYnNpdGVfaWQgPT0gd2Vic2l0ZUlkKSB7XG5cdFx0XHRcdFx0cmVzdWx0LnB1c2godmFsdWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fTtcblx0fSk7XG5cblx0emFhLmZpbHRlcihcIm1lbnVwYXJlbnRmaWx0ZXJcIiwgZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGZ1bmN0aW9uKGlucHV0LCBjb250YWluZXJJZCwgcGFyZW50TmF2SWQpIHtcblx0XHRcdHZhciByZXN1bHQgPSBbXTtcblx0XHRcdGFuZ3VsYXIuZm9yRWFjaChpbnB1dCwgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuXHRcdFx0XHRpZiAodmFsdWUucGFyZW50X25hdl9pZCA9PSBwYXJlbnROYXZJZCAmJiB2YWx1ZS5uYXZfY29udGFpbmVyX2lkID09IGNvbnRhaW5lcklkKSB7XG5cdFx0XHRcdFx0cmVzdWx0LnB1c2godmFsdWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fTtcblx0fSk7XG5cblx0emFhLmZpbHRlcignbWVudWNoaWxkZmlsdGVyJywgZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGZ1bmN0aW9uKGlucHV0LCBjb250YWluZXJJZCwgcGFyZW50TmF2SWQpIHtcblx0XHRcdHZhciByZXR1cm5WYWx1ZSA9IGZhbHNlO1xuXHRcdFx0YW5ndWxhci5mb3JFYWNoKGlucHV0LCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7XG5cdFx0XHRcdGlmICghcmV0dXJuVmFsdWUpIHtcblx0XHRcdFx0XHRpZiAodmFsdWUuaWQgPT0gcGFyZW50TmF2SWQgJiYgdmFsdWUubmF2X2NvbnRhaW5lcl9pZCA9PSBjb250YWluZXJJZCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuVmFsdWUgPSB2YWx1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRyZXR1cm4gcmV0dXJuVmFsdWU7XG5cdFx0fTtcblx0fSk7XG5cblx0LyogZmFjdG9yeS5qcyAqL1xuXG5cdHphYS5mYWN0b3J5KCdQbGFjZWhvbGRlclNlcnZpY2UnLCBmdW5jdGlvbigpIHtcblx0XHR2YXIgc2VydmljZSA9IFtdO1xuXG5cdFx0c2VydmljZS5zdGF0dXMgPSAxOyAvKiAxID0gc2hvd3BsYWNlaG9sZGVyczsgMCA9IGhpZGUgcGxhY2Vob2xkZXJzICovXG5cblx0XHRzZXJ2aWNlLmRlbGVnYXRlID0gZnVuY3Rpb24oc3RhdHVzKSB7XG5cdFx0XHRzZXJ2aWNlLnN0YXR1cyA9IHN0YXR1cztcblx0XHR9O1xuXG5cdFx0cmV0dXJuIHNlcnZpY2U7XG5cdH0pO1xuXG5cdC8qIGxheW91dC5qcyAqL1xuXG5cdHphYS5jb25maWcoWyckc3RhdGVQcm92aWRlcicsIGZ1bmN0aW9uKCRzdGF0ZVByb3ZpZGVyKSB7XG5cdFx0JHN0YXRlUHJvdmlkZXJcblx0XHQuc3RhdGUoXCJjdXN0b20uY21zZWRpdFwiLCB7XG5cdFx0XHR1cmwgOiBcIi91cGRhdGUvOm5hdklkXCIsXG5cdFx0XHR0ZW1wbGF0ZVVybCA6ICdjbXNhZG1pbi9wYWdlL3VwZGF0ZSdcblx0XHR9KVxuXHRcdC5zdGF0ZShcImN1c3RvbS5jbXNhZGRcIiwge1xuXHRcdFx0dXJsIDogXCIvY3JlYXRlXCIsXG5cdFx0XHR0ZW1wbGF0ZVVybCA6ICdjbXNhZG1pbi9wYWdlL2NyZWF0ZSdcblx0XHR9KVxuXHRcdC5zdGF0ZShcImN1c3RvbS5jbXNkcmFmdFwiLCB7XG5cdFx0XHR1cmw6ICcvZHJhZnRzJyxcblx0XHRcdHRlbXBsYXRlVXJsOiAnY21zYWRtaW4vcGFnZS9kcmFmdHMnXG5cdFx0fSk7XG5cdH1dKTtcblxuXHQvKiBjb250cm9sbGVycyAqL1xuXG5cdHphYS5jb250cm9sbGVyKFwiRHJhZnRzQ29udHJvbGxlclwiLCBbJyRzY29wZScsICckc3RhdGUnLCAnU2VydmljZU1lbnVEYXRhJywgZnVuY3Rpb24oJHNjb3BlLCAkc3RhdGUsIFNlcnZpY2VNZW51RGF0YSkge1xuXG5cdFx0JHNjb3BlLm1lbnVEYXRhID0gU2VydmljZU1lbnVEYXRhLmRhdGE7XG5cblx0XHQkc2NvcGUuJG9uKCdzZXJ2aWNlOk1lbnVEYXRhJywgZnVuY3Rpb24oZXZlbnQsIGRhdGEpIHtcblx0XHRcdCRzY29wZS5tZW51RGF0YSA9IGRhdGE7XG5cdFx0fSk7XG5cblx0XHQkc2NvcGUuZ28gPSBmdW5jdGlvbihuYXZJZCkge1xuXHRcdFx0JHN0YXRlLmdvKCdjdXN0b20uY21zZWRpdCcsIHsgbmF2SWQgOiBuYXZJZCB9KTtcblx0XHR9O1xuXHR9XSk7XG5cblx0emFhLmNvbnRyb2xsZXIoXCJDbXNEYXNoYm9hcmRcIiwgWyckc2NvcGUnLCAnJGh0dHAnLCBmdW5jdGlvbigkc2NvcGUsICRodHRwKSB7XG5cdFx0JHNjb3BlLmRhc2hib2FyZCA9IFtdO1xuXHRcdCRodHRwLmdldCgnYWRtaW4vYXBpLWNtcy1hZG1pbi9kYXNoYm9hcmQtbG9nJykudGhlbihmdW5jdGlvbihyZXNwb25zZSkge1xuXHRcdFx0JHNjb3BlLmRhc2hib2FyZCA9IHJlc3BvbnNlLmRhdGE7XG5cdFx0fSk7XG5cdH1dKTtcblx0XG5cdHphYS5jb250cm9sbGVyKFwiQ29uZmlnQ29udHJvbGxlclwiLCBbJyRzY29wZScsICckaHR0cCcsICdBZG1pblRvYXN0U2VydmljZScsIGZ1bmN0aW9uKCRzY29wZSwgJGh0dHAsIEFkbWluVG9hc3RTZXJ2aWNlKSB7XG5cdFx0JHNjb3BlLmRhdGEgPSB7fTtcblxuXHRcdCRodHRwLmdldCgnYWRtaW4vYXBpLWNtcy1hZG1pbi9jb25maWcnKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG5cdFx0XHQkc2NvcGUuZGF0YSA9IHJlc3BvbnNlLmRhdGE7XG5cdFx0fSk7XG5cblx0XHQkc2NvcGUuc2F2ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0JGh0dHAucG9zdCgnYWRtaW4vYXBpLWNtcy1hZG1pbi9jb25maWcnLCAkc2NvcGUuZGF0YSkudGhlbihmdW5jdGlvbihyZXNwb25zZSkge1xuXHRcdFx0XHRBZG1pblRvYXN0U2VydmljZS5zdWNjZXNzKGkxOG5bJ2pzX2NvbmZpZ191cGRhdGVfc3VjY2VzcyddKTtcblx0XHRcdH0pO1xuXHRcdH1cblx0fV0pO1xuXG5cdHphYS5jb250cm9sbGVyKFwiUGFnZVZlcnNpb25zQ29udHJvbGxlclwiLCBbJyRzY29wZScsICckaHR0cCcsICdTZXJ2aWNlTGF5b3V0c0RhdGEnLCAnQWRtaW5Ub2FzdFNlcnZpY2UnLCBmdW5jdGlvbigkc2NvcGUsICRodHRwLCBTZXJ2aWNlTGF5b3V0c0RhdGEsIEFkbWluVG9hc3RTZXJ2aWNlKSB7XG5cdFx0LyoqXG5cdFx0ICogQHZhciBvYmplY3QgJHR5cGVEYXRhIEZyb20gcGFyZW50IHNjb3BlIGNvbnRyb2xsZXIgTmF2SXRlbUNvbnRyb2xsZXJcblx0XHQgKiBAdmFyIG9iamVjdCAkaXRlbSBGcm9tIHBhcmVudCBzY29wZSBjb250cm9sbGVyIE5hdkl0ZW1Db250cm9sbGVyXG5cdFx0ICogQHZhciBzdHJpbmcgJHZlcnNpb25OYW1lIEZyb20gbmctbW9kZWxcblx0XHQgKiBAdmFyIGludGVnZXIgJGZyb21WZXJzaW9uUGFnZUlkIEZyb20gbmctbW9kZWwgdGhlIHZlcnNpb24gY29weSBmcm9tIG9yIDAgPSBuZXcgZW1wdHkvYmxhbmsgdmVyc2lvblxuXHRcdCAqIEB2YXIgaW50ZWdlciAkdmVyc2lvbkxheW91dElkIEZyb20gbmctbW9kZWwsIG9ubHkgaWYgZnJvbVZlcnNpb25QYWdlSWQgaXMgMFxuIFx0XHQgKi9cblx0XHR2YXIgaGVhZGVycyA9IHtcImhlYWRlcnNcIiA6IHsgXCJDb250ZW50LVR5cGVcIiA6IFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04XCIgfX07XG5cblx0XHQvKiBsYXlvdXRzRGF0YSAqL1xuXG5cdFx0JHNjb3BlLmxheW91dHNEYXRhID0gU2VydmljZUxheW91dHNEYXRhLmRhdGE7XG5cbiAgICBcdCRzY29wZS4kb24oJ3NlcnZpY2U6TGF5b3V0c0RhdGEnLCBmdW5jdGlvbihldmVudCwgZGF0YSkge1xuICAgIFx0XHQkc2NvcGUubGF5b3V0c0RhdGEgPSBkYXRhO1xuICAgIFx0fSk7XG5cbiAgICBcdC8qIGNvbnRyb2xsZXIgbG9naWMgKi9cblxuXHRcdCRzY29wZS5jcmVhdGVOZXdWZXJzaW9uU3VibWl0ID0gZnVuY3Rpb24oZGF0YSkge1xuXHRcdFx0aWYgKGRhdGEgPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdEFkbWluVG9hc3RTZXJ2aWNlLmVycm9yKGkxOG5bJ2pzX3ZlcnNpb25fZXJyb3JfZW1wdHlfZmllbGRzJ10pO1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblx0XHRcdGlmIChkYXRhLmNvcHlFeGlzdGluZ1ZlcnNpb24pIHtcblx0XHRcdFx0ZGF0YS52ZXJzaW9uTGF5b3V0SWQgPSAwO1xuXHRcdFx0fVxuXHRcdFx0JGh0dHAucG9zdCgnYWRtaW4vYXBpLWNtcy1uYXZpdGVtL2NyZWF0ZS1wYWdlLXZlcnNpb24nLCAkLnBhcmFtKHsnbGF5b3V0SWQnOiBkYXRhLnZlcnNpb25MYXlvdXRJZCwgJ25hdkl0ZW1JZCc6ICRzY29wZS5pdGVtLmlkLCAnbmFtZSc6IGRhdGEudmVyc2lvbk5hbWUsICdmcm9tUGFnZUlkJzogZGF0YS5mcm9tVmVyc2lvblBhZ2VJZH0pLCBoZWFkZXJzKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG5cdFx0XHRcdGlmIChyZXNwb25zZS5kYXRhLmVycm9yKSB7XG5cdFx0XHRcdFx0QWRtaW5Ub2FzdFNlcnZpY2UuZXJyb3IoaTE4blsnanNfdmVyc2lvbl9lcnJvcl9lbXB0eV9maWVsZHMnXSk7XG5cdFx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQkc2NvcGUucmVmcmVzaEZvcmNlKCk7XG5cblx0XHRcdFx0QWRtaW5Ub2FzdFNlcnZpY2Uuc3VjY2VzcyhpMThuWydqc192ZXJzaW9uX2NyZWF0ZV9zdWNjZXNzJ10pO1xuXHRcdFx0fSk7XG5cdFx0fTtcblx0fV0pO1xuXG5cdHphYS5jb250cm9sbGVyKFwiQ29weVBhZ2VDb250cm9sbGVyXCIsIFsnJHNjb3BlJywgJyRodHRwJywgJyRmaWx0ZXInLCAnQWRtaW5Ub2FzdFNlcnZpY2UnLCBmdW5jdGlvbigkc2NvcGUsICRodHRwLCAkZmlsdGVyLCBBZG1pblRvYXN0U2VydmljZSkge1xuXG5cdFx0dmFyIGhlYWRlcnMgPSB7XCJoZWFkZXJzXCIgOiB7IFwiQ29udGVudC1UeXBlXCIgOiBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOFwiIH19O1xuXG5cdFx0JHNjb3BlLiRvbignZGVsZXRlZE5hdkl0ZW0nLCBmdW5jdGlvbigpIHtcblx0XHRcdCRzY29wZS5pc09wZW4gPSBmYWxzZTtcblx0XHRcdCRzY29wZS5pdGVtU2VsZWN0aW9uID0gZmFsc2U7XG5cdFx0XHQkc2NvcGUuc2VsZWN0aW9uID0gMDtcblx0XHR9KTtcblxuXHRcdCRzY29wZS5OYXZJdGVtQ29udHJvbGxlciA9ICRzY29wZS4kcGFyZW50O1xuXG5cdFx0JHNjb3BlLm5hdklkID0gMDtcblxuXHRcdCRzY29wZS5pdGVtcyA9IG51bGw7XG5cblx0XHQkc2NvcGUuaXNPcGVuID0gZmFsc2U7XG5cblx0XHQkc2NvcGUuaXRlbVNlbGVjdGlvbiA9IGZhbHNlO1xuXG5cdFx0JHNjb3BlLnNlbGVjdGlvbiA9IDA7XG5cblx0XHQkc2NvcGUuc2VsZWN0ID0gZnVuY3Rpb24oaXRlbSkge1xuXHRcdFx0JHNjb3BlLnNlbGVjdGlvbiA9IGl0ZW0uaWQ7XG5cdFx0XHQkc2NvcGUuaXRlbVNlbGVjdGlvbiA9IGFuZ3VsYXIuY29weShpdGVtKTtcblx0XHR9O1xuXG5cdFx0JHNjb3BlLiR3YXRjaCgnaXRlbVNlbGVjdGlvbi50aXRsZScsIGZ1bmN0aW9uKG4sIG8pIHtcblx0XHRcdGlmIChuKSB7XG5cdFx0XHRcdCRzY29wZS5hbGlhc1N1Z2dlc3Rpb24oKTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRcblx0XHQkc2NvcGUuYWxpYXNTdWdnZXN0aW9uID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcblx0XHRcdCRzY29wZS5pdGVtU2VsZWN0aW9uLmFsaWFzID0gJGZpbHRlcignc2x1Z2lmeScpKCRzY29wZS5pdGVtU2VsZWN0aW9uLnRpdGxlKTtcblx0XHR9O1xuXG5cdFx0JHNjb3BlLmxvYWRJdGVtcyA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0JHNjb3BlLm5hdklkID0gJHNjb3BlLk5hdkl0ZW1Db250cm9sbGVyLk5hdkNvbnRyb2xsZXIubmF2RGF0YS5pZDtcblxuXHRcdFx0JGh0dHAuZ2V0KCdhZG1pbi9hcGktY21zLW5hdi9maW5kLW5hdi1pdGVtcycsIHsgcGFyYW1zOiB7IG5hdklkIDogJHNjb3BlLm5hdklkIH19KS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG5cdFx0XHRcdCRzY29wZS5pdGVtcyA9IHJlc3BvbnNlLmRhdGE7XG5cdFx0XHRcdCRzY29wZS5pc09wZW4gPSB0cnVlO1xuXHRcdFx0fSk7XG5cdFx0fTtcblxuXHRcdCRzY29wZS5zYXZlID0gZnVuY3Rpb24oKSB7XG5cdFx0XHQkc2NvcGUuaXRlbVNlbGVjdGlvblsndG9MYW5nSWQnXSA9ICRzY29wZS5OYXZJdGVtQ29udHJvbGxlci5sYW5nLmlkO1xuXHRcdFx0JGh0dHAucG9zdCgnYWRtaW4vYXBpLWNtcy1uYXYvY3JlYXRlLWZyb20tcGFnZScsICQucGFyYW0oJHNjb3BlLml0ZW1TZWxlY3Rpb24pLCBoZWFkZXJzKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG5cdFx0XHRcdGlmIChyZXNwb25zZS5kYXRhKSB7XG5cdFx0XHRcdFx0QWRtaW5Ub2FzdFNlcnZpY2Uuc3VjY2VzcyhpMThuWydqc19hZGRlZF90cmFuc2xhdGlvbl9vayddKTtcblx0XHRcdFx0XHQkc2NvcGUuTmF2SXRlbUNvbnRyb2xsZXIucmVmcmVzaCgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdEFkbWluVG9hc3RTZXJ2aWNlLmVycm9yKGkxOG5bJ2pzX2FkZGVkX3RyYW5zbGF0aW9uX2Vycm9yJ10pO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCBmdW5jdGlvbihyZXNwb25zZSkge1xuXHRcdFx0XHRBZG1pblRvYXN0U2VydmljZS5lcnJvckFycmF5KHJlc3BvbnNlLmRhdGEpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdH1dKTtcblxuXHR6YWEuY29udHJvbGxlcihcIkNtc01lbnVUcmVlQ29udHJvbGxlclwiLCBbJyRzY29wZScsICckcm9vdFNjb3BlJywgJyRzdGF0ZScsICckaHR0cCcsICckZmlsdGVyJywgJ1NlcnZpY2VNZW51RGF0YScsICdTZXJ2aWNlTGl2ZUVkaXRNb2RlJywgJ1NlcnZpY2VDdXJyZW50V2Vic2l0ZScsIGZ1bmN0aW9uKCRzY29wZSwgJHJvb3RTY29wZSwgJHN0YXRlLCAkaHR0cCwgJGZpbHRlciwgU2VydmljZU1lbnVEYXRhLCBTZXJ2aWNlTGl2ZUVkaXRNb2RlLCBTZXJ2aWNlQ3VycmVudFdlYnNpdGUpIHtcblxuXHRcdC8vIGxpdmUgZWRpdCBzZXJ2aWNlXG5cblx0XHQkc2NvcGUubGl2ZUVkaXRTdGF0ZSA9IDA7XG5cblx0XHQkc2NvcGUuJHdhdGNoKCdsaXZlRWRpdFN0YXRlVG9nZ2xlcicsIGZ1bmN0aW9uKG4pIHtcblx0XHRcdFNlcnZpY2VMaXZlRWRpdE1vZGUuc3RhdGUgPSBuO1xuXHRcdH0pO1xuXG5cdFx0JHNjb3BlLmxvYWRDbXNDb25maWcgPSBmdW5jdGlvbigpIHtcblx0XHRcdCRodHRwLmdldCgnYWRtaW4vYXBpLWNtcy1hZG1pbi9jb25maWcnKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG5cdFx0XHRcdCRyb290U2NvcGUuY21zQ29uZmlnID0gcmVzcG9uc2UuZGF0YTtcblx0XHRcdH0pO1xuXHRcdH07XG5cdFx0XG5cdFx0JHNjb3BlLmxvYWRDbXNDb25maWcoKTtcblx0XHRcblx0XHQvLyBtZW51IERhdGFcblxuXHRcdCRzY29wZS5tZW51RGF0YSA9IFNlcnZpY2VNZW51RGF0YS5kYXRhO1xuXHRcdCRzY29wZS5jdXJyZW50V2Vic2l0ZSA9IFNlcnZpY2VDdXJyZW50V2Vic2l0ZS5jdXJyZW50V2Vic2l0ZTtcblxuXHRcdCRzY29wZS4kb24oJ3NlcnZpY2U6TWVudURhdGEnLCBmdW5jdGlvbihldmVudCwgZGF0YSkge1xuXHRcdFx0JHNjb3BlLm1lbnVEYXRhID0gZGF0YTtcblx0XHR9KTtcblxuXHRcdCRzY29wZS5tZW51RGF0YVJlbG9hZCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIFNlcnZpY2VNZW51RGF0YS5sb2FkKHRydWUpO1xuXHRcdH07XG5cblx0XHQvLyBDb250YWlucyB0aGUgY3VycmVudCB3ZWJzaXRlIGlkLCBpcyBpbml0aWFsaXplZCB3aXRoIGZhbHNlIGFzIHZhbHVlXG5cdFx0JHNjb3BlLmN1cnJlbnRXZWJzaXRlVG9nZ2xlciA9IGZhbHNlXG5cblx0XHQkc2NvcGUuJHdhdGNoKCdjdXJyZW50V2Vic2l0ZVRvZ2dsZXInLCBmdW5jdGlvbihuZXdWYWx1ZSwgb2xkVmFsdWUpIHtcblx0XHRcdGlmIChuZXdWYWx1ZSAmJiBuZXdWYWx1ZSAhPT0gb2xkVmFsdWUpIHtcblx0XHRcdFx0U2VydmljZUN1cnJlbnRXZWJzaXRlLnRvZ2dsZShuZXdWYWx1ZSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyBpbml0aWFsaXplIHRoZSBzdGF0ZSBvZiB0aGUgY3VycmVudCBtZW51IHNlcnZpY2Vcblx0XHQkc2NvcGUuY3VycmVudFdlYnNpdGUgPSBTZXJ2aWNlQ3VycmVudFdlYnNpdGUuY3VycmVudFdlYnNpdGVcblxuXHRcdC8vIGlmIHRoZSBzdGF0ZSBoYXMgcmVjaXZlZCBhIHZhbHVlLCBhZnRlciB0aGUgc2VydmljZSBldmVudCBoYXMgYmVlbiB0cmlnZ2VyZWQsIHRoaXMgZW5zdXJlc1xuXHRcdC8vIHRoZSBjdXJyZW50IHdlYnNpdGUgaXMgZGlzcGxheWVkLiBMaWtlIGEgbGF6eSBsb2FkIGVuc3VyYW5jZVxuXHRcdGlmICgkc2NvcGUuY3VycmVudFdlYnNpdGUpIHtcblx0XHRcdCRzY29wZS5jdXJyZW50V2Vic2l0ZVRvZ2dsZXIgPSAkc2NvcGUuY3VycmVudFdlYnNpdGUuaWRcblx0XHR9XG5cblx0XHQkc2NvcGUuJG9uKCdzZXJ2aWNlOkN1cnJlbnRXZWJzaXRlQ2hhbmdlZCcsIGZ1bmN0aW9uKGV2ZW50LCBkYXRhKSB7XG5cdFx0XHQkc2NvcGUuY3VycmVudFdlYnNpdGUgPSBkYXRhO1xuXHRcdFx0JHNjb3BlLmN1cnJlbnRXZWJzaXRlVG9nZ2xlciA9IGRhdGEuaWQ7XG5cdFx0XHRTZXJ2aWNlTWVudURhdGEubG9hZCgpO1xuXHRcdH0pO1xuXG5cdFx0Ly8gY29udHJvbGxlciBsb2dpY1xuXHRcdFxuXHRcdCRzY29wZS5kcm9wRW1wdHlDb250YWluZXIgPSBmdW5jdGlvbihkcmFnZ2VkLGRyb3BwZWQscG9zaXRpb24sY2F0SWQpIHtcblx0XHRcdCRodHRwLmdldCgnYWRtaW4vYXBpLWNtcy1uYXZpdGVtL21vdmUtdG8tY29udGFpbmVyJywgeyBwYXJhbXM6IHttb3ZlSXRlbUlkOiBkcmFnZ2VkLmlkLCBkcm9wcGVkT25DYXRJZDogY2F0SWR9fSkudGhlbihmdW5jdGlvbihzdWNjZXMpIHtcblx0XHRcdFx0U2VydmljZU1lbnVEYXRhLmxvYWQodHJ1ZSk7XG5cdFx0XHR9KTtcblx0XHR9O1xuXHRcdFxuXHRcdCRzY29wZS5kcm9wSXRlbSA9IGZ1bmN0aW9uKGRyYWcsZHJvcCxwb3MpIHtcblx0XHRcdGlmIChwb3MgPT0gJ2JvdHRvbScpIHtcblx0XHRcdFx0dmFyIGFwaSA9ICdhZG1pbi9hcGktY21zLW5hdml0ZW0vbW92ZS1hZnRlcic7XG5cdFx0XHRcdHZhciBwYXJhbXMgPSB7bW92ZUl0ZW1JZDogZHJhZy5pZCwgZHJvcHBlZEFmdGVySXRlbUlkOiBkcm9wLmlkfTtcblx0XHRcdH0gZWxzZSBpZiAocG9zID09ICd0b3AnKSB7XG5cdFx0XHRcdHZhciBhcGkgPSAnYWRtaW4vYXBpLWNtcy1uYXZpdGVtL21vdmUtYmVmb3JlJztcblx0XHRcdFx0dmFyIHBhcmFtcyA9IHttb3ZlSXRlbUlkOiBkcmFnLmlkLCBkcm9wcGVkQmVmb3JlSXRlbUlkOiBkcm9wLmlkfTtcblxuXHRcdFx0fSBlbHNlIGlmIChwb3MgPT0gJ21pZGRsZScpIHtcblx0XHRcdFx0dmFyIGFwaSA9ICdhZG1pbi9hcGktY21zLW5hdml0ZW0vbW92ZS10by1jaGlsZCc7XG5cdFx0XHRcdHZhciBwYXJhbXMgPSB7bW92ZUl0ZW1JZDogZHJhZy5pZCwgZHJvcHBlZE9uSXRlbUlkOiBkcm9wLmlkfTtcblx0XHRcdH1cblx0XHRcdFxuXHRcdFx0JGh0dHAuZ2V0KGFwaSwgeyBwYXJhbXMgOiBwYXJhbXMgfSkudGhlbihmdW5jdGlvbihzdWNjZXNzKSB7XG5cdFx0XHRcdFNlcnZpY2VNZW51RGF0YS5sb2FkKHRydWUpO1xuXHRcdFx0fSwgZnVuY3Rpb24oZXJyb3IpIHtcblx0XHRcdFx0U2VydmljZU1lbnVEYXRhLmxvYWQodHJ1ZSk7XG5cdFx0XHR9KTtcblx0XHR9O1xuXHRcdFxuXHRcdCRzY29wZS52YWxpZEl0ZW0gPSBmdW5jdGlvbihob3ZlciwgZHJhZ2VkKSB7XG5cdFx0XHRcblx0XHRcdGlmIChob3Zlci5pZCA9PSBkcmFnZWQuaWQpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0XG5cdFx0XHQkc2NvcGUucnJpdGVtcyA9IFtdO1xuXHRcdFx0JHNjb3BlLnJlY3Vyc2l2SXRlbVZhbGlkaXR5KGRyYWdlZC5uYXZfY29udGFpbmVyX2lkLCBkcmFnZWQuaWQpO1xuXHRcdFx0XG5cdFx0XHRpZiAoJHNjb3BlLnJyaXRlbXMuaW5kZXhPZihob3Zlci5pZCkgPT0gLTEpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0XHRcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9O1xuXHRcdFxuXHRcdCRzY29wZS5ycml0ZW1zID0gW107XG5cdFx0XG5cdFx0JHNjb3BlLnJlY3Vyc2l2SXRlbVZhbGlkaXR5ID0gZnVuY3Rpb24oY29udGFpbmVySWQsIHBhcmVudE5hdklkKSB7XG5cdFx0XHR2YXIgaXRlbXMgPSAkZmlsdGVyKCdtZW51cGFyZW50ZmlsdGVyJykoJHNjb3BlLm1lbnVEYXRhLml0ZW1zLCBjb250YWluZXJJZCwgcGFyZW50TmF2SWQpO1xuXHRcdFx0XG5cdFx0XHRhbmd1bGFyLmZvckVhY2goaXRlbXMsIGZ1bmN0aW9uKGl0ZW0pIHtcblx0XHRcdFx0JHNjb3BlLnJyaXRlbXMucHVzaChpdGVtLmlkKTtcblx0XHRcdFx0JHNjb3BlLnJlY3Vyc2l2SXRlbVZhbGlkaXR5KGNvbnRhaW5lcklkLCBpdGVtLmlkKTtcblx0XHRcdH0pO1xuXHRcdH07XG5cblx0XHQkc2NvcGUudG9nZ2xlSXRlbSA9IGZ1bmN0aW9uKGRhdGEpIHtcblx0XHRcdGlmIChkYXRhLnRvZ2dsZV9vcGVuID09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRkYXRhWyd0b2dnbGVfb3BlbiddID0gMTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRhdGFbJ3RvZ2dsZV9vcGVuJ10gPSAhZGF0YS50b2dnbGVfb3Blbjtcblx0XHRcdH1cblxuXHRcdFx0JGh0dHAucG9zdCgnYWRtaW4vYXBpLWNtcy1uYXYvdHJlZS1oaXN0b3J5Jywge2RhdGE6IGRhdGF9LCB7aWdub3JlTG9hZGluZ0JhcjogdHJ1ZX0pO1xuXG5cdFx0fTtcblxuXHRcdCRzY29wZS5nbyA9IGZ1bmN0aW9uKGRhdGEpIHtcblx0XHRcdFNlcnZpY2VMaXZlRWRpdE1vZGUuY2hhbmdlVXJsKGRhdGEubmF2X2l0ZW1faWQsIDApO1xuXHRcdFx0JHN0YXRlLmdvKCdjdXN0b20uY21zZWRpdCcsIHsgbmF2SWQgOiBkYXRhLmlkIH0pO1xuXHQgICAgfTtcblxuXHQgICAgJHNjb3BlLnNob3dEcmFnID0gMDtcblxuXHQgICAgJHNjb3BlLmlzQ3VycmVudEVsZW1lbnQgPSBmdW5jdGlvbihkYXRhKSB7XG5cdCAgICBcdGlmIChkYXRhICE9PSBudWxsICYmICRzdGF0ZS5wYXJhbXMubmF2SWQgPT0gZGF0YS5pZCkge1xuXHQgICAgXHRcdHJldHVybiB0cnVlO1xuXHQgICAgXHR9XG5cblx0ICAgIFx0cmV0dXJuIGZhbHNlO1xuXHQgICAgfTtcblxuXHQgICAgJHNjb3BlLmhpZGRlbkNhdHMgPSBbXTtcblxuXHQgICAgJHNjb3BlLiR3YXRjaCgnbWVudURhdGEnLCBmdW5jdGlvbiAobiwgbykge1xuXHQgICAgXHQkc2NvcGUuaGlkZGVuQ2F0cyA9IG4uaGlkZGVuQ2F0cztcblx0ICAgIH0pO1xuXG5cdFx0JHNjb3BlLnRvZ2dsZUNhdCA9IGZ1bmN0aW9uKGNhdElkKSB7XG5cdFx0XHRpZiAoY2F0SWQgaW4gJHNjb3BlLmhpZGRlbkNhdHMpIHtcblx0XHRcdFx0JHNjb3BlLmhpZGRlbkNhdHNbY2F0SWRdID0gISRzY29wZS5oaWRkZW5DYXRzW2NhdElkXTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdCRzY29wZS5oaWRkZW5DYXRzW2NhdElkXSA9IDE7XG5cdFx0XHR9XG5cblx0XHRcdCRodHRwLnBvc3QoJ2FkbWluL2FwaS1jbXMtbmF2L3NhdmUtY2F0LXRvZ2dsZScsIHtjYXRJZDogY2F0SWQsIHN0YXRlOiAkc2NvcGUuaGlkZGVuQ2F0c1tjYXRJZF19LCB7aWdub3JlTG9hZGluZ0JhcjogdHJ1ZX0pO1xuXHRcdH07XG5cblx0XHQkc2NvcGUudG9nZ2xlSXNIaWRkZW4gPSBmdW5jdGlvbihjYXRJZCkge1xuXG5cdFx0XHRpZiAoJHNjb3BlLmhpZGRlbkNhdHMgPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGNhdElkIGluICRzY29wZS5oaWRkZW5DYXRzKSB7XG5cdFx0XHRcdGlmICgkc2NvcGUuaGlkZGVuQ2F0c1tjYXRJZF0gPT0gMSkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9O1xuXG5cdH1dKTtcblxuXHR6YWEuY29udHJvbGxlcihcIkNtc2FkbWluQ3JlYXRlQ29udHJvbGxlclwiLCBbJyRzY29wZScsICckcScsICckaHR0cCcsIGZ1bmN0aW9uKCRzY29wZSwgJHEsICRodHRwKSB7XG5cblx0XHQkc2NvcGUuZGF0YSA9IHt9O1xuXHRcdCRzY29wZS5kYXRhLmlzSW5saW5lID0gZmFsc2U7XG5cblx0XHQkc2NvcGUuc2F2ZSA9IGZ1bmN0aW9uKCkge1xuXG5cdFx0XHR2YXIgaGVhZGVycyA9IHtcImhlYWRlcnNcIiA6IHsgXCJDb250ZW50LVR5cGVcIiA6IFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04XCIgfX07XG5cblx0XHRcdHJldHVybiAkcShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcblxuXHRcdFx0XHRpZiAoJHNjb3BlLmRhdGEubmF2X2l0ZW1fdHlwZSA9PSAxKSB7XG5cdFx0XHRcdFx0JGh0dHAucG9zdCgnYWRtaW4vYXBpLWNtcy1uYXYvY3JlYXRlLXBhZ2UnLCAkLnBhcmFtKCRzY29wZS5kYXRhKSwgaGVhZGVycykudGhlbihmdW5jdGlvbihyZXNwb25zZSkge1xuXHRcdFx0XHRcdFx0cmVzb2x2ZShyZXNwb25zZS5kYXRhKTtcblx0XHRcdFx0XHR9LCBmdW5jdGlvbihyZXNwb25zZSkge1xuXHRcdFx0XHRcdFx0cmVqZWN0KHJlc3BvbnNlLmRhdGEpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCRzY29wZS5kYXRhLm5hdl9pdGVtX3R5cGUgPT0gMikge1xuXHRcdFx0XHRcdCRodHRwLnBvc3QoJ2FkbWluL2FwaS1jbXMtbmF2L2NyZWF0ZS1tb2R1bGUnLCAkLnBhcmFtKCRzY29wZS5kYXRhKSwgaGVhZGVycykudGhlbihmdW5jdGlvbihyZXNwb25zZSkge1xuXHRcdFx0XHRcdFx0cmVzb2x2ZShyZXNwb25zZS5kYXRhKTtcblx0XHRcdFx0XHR9LCBmdW5jdGlvbihyZXNwb25zZSkge1xuXHRcdFx0XHRcdFx0cmVqZWN0KHJlc3BvbnNlLmRhdGEpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCRzY29wZS5kYXRhLm5hdl9pdGVtX3R5cGUgPT0gMykge1xuXHRcdFx0XHRcdCRodHRwLnBvc3QoJ2FkbWluL2FwaS1jbXMtbmF2L2NyZWF0ZS1yZWRpcmVjdCcsICQucGFyYW0oJHNjb3BlLmRhdGEpLCBoZWFkZXJzKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKHJlc3BvbnNlLmRhdGEpO1xuXHRcdFx0XHRcdH0sIGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG5cdFx0XHRcdFx0XHRyZWplY3QocmVzcG9uc2UuZGF0YSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH07XG5cdH1dKTtcblxuXHR6YWEuY29udHJvbGxlcihcIkNtc2FkbWluQ3JlYXRlSW5saW5lQ29udHJvbGxlclwiLCBbJyRzY29wZScsICckcScsICckaHR0cCcsIGZ1bmN0aW9uKCRzY29wZSwgJHEsICRodHRwKSB7XG5cblx0XHQkc2NvcGUuZGF0YSA9IHtcblx0XHRcdG5hdl9pZCA6ICRzY29wZS4kcGFyZW50Lk5hdkNvbnRyb2xsZXIuaWRcblx0XHR9O1xuXG5cdFx0JHNjb3BlLmRhdGEuaXNJbmxpbmUgPSB0cnVlO1xuXG5cdFx0JHNjb3BlLnNhdmUgPSBmdW5jdGlvbigpIHtcblxuXHRcdFx0JHNjb3BlLmRhdGEubGFuZ19pZCA9ICRzY29wZS5sYW5nLmlkO1xuXG5cdFx0XHR2YXIgaGVhZGVycyA9IHtcImhlYWRlcnNcIiA6IHsgXCJDb250ZW50LVR5cGVcIiA6IFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04XCIgfX07XG5cblx0XHRcdHJldHVybiAkcShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcblxuXHRcdFx0XHRpZiAoJHNjb3BlLmRhdGEubmF2X2l0ZW1fdHlwZSA9PSAxKSB7XG5cdFx0XHRcdFx0JGh0dHAucG9zdCgnYWRtaW4vYXBpLWNtcy1uYXYvY3JlYXRlLXBhZ2UtaXRlbScsICQucGFyYW0oJHNjb3BlLmRhdGEpLCBoZWFkZXJzKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKHJlc3BvbnNlLmRhdGEpO1xuXHRcdFx0XHRcdH0sIGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG5cdFx0XHRcdFx0XHRyZWplY3QocmVzcG9uc2UuZGF0YSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoJHNjb3BlLmRhdGEubmF2X2l0ZW1fdHlwZSA9PSAyKSB7XG5cdFx0XHRcdFx0JGh0dHAucG9zdCgnYWRtaW4vYXBpLWNtcy1uYXYvY3JlYXRlLW1vZHVsZS1pdGVtJywgJC5wYXJhbSgkc2NvcGUuZGF0YSksIGhlYWRlcnMpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcblx0XHRcdFx0XHRcdHJlc29sdmUocmVzcG9uc2UuZGF0YSk7XG5cdFx0XHRcdFx0fSwgZnVuY3Rpb24ocmVzcG9uc2UpIHtcblx0XHRcdFx0XHRcdHJlamVjdChyZXNwb25zZS5kYXRhKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICgkc2NvcGUuZGF0YS5uYXZfaXRlbV90eXBlID09IDMpIHtcblx0XHRcdFx0XHQkaHR0cC5wb3N0KCdhZG1pbi9hcGktY21zLW5hdi9jcmVhdGUtcmVkaXJlY3QtaXRlbScsICQucGFyYW0oJHNjb3BlLmRhdGEpLCBoZWFkZXJzKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG5cdFx0XHRcdFx0XHRyZXNvbHZlKHJlc3BvbnNlLmRhdGEpO1xuXHRcdFx0XHRcdH0sIGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG5cdFx0XHRcdFx0XHRyZWplY3QocmVzcG9uc2UuZGF0YSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0fVxuXG5cdH1dKTtcblxuXHR6YWEuY29udHJvbGxlcihcIk5hdkNvbnRyb2xsZXJcIiwgW1xuXHRcdCckc2NvcGUnLCAnJHJvb3RTY29wZScsICckZmlsdGVyJywgJyRzdGF0ZScsICckc3RhdGVQYXJhbXMnLCAnJGh0dHAnLCAnUGxhY2Vob2xkZXJTZXJ2aWNlJywgJ1NlcnZpY2VQcm9wZXJ0aWVzRGF0YScsICdTZXJ2aWNlTWVudURhdGEnLCAnU2VydmljZUxhbmd1YWdlc0RhdGEnLCAnU2VydmljZUxpdmVFZGl0TW9kZScsICdBZG1pblRvYXN0U2VydmljZScsICdBZG1pbkNsYXNzU2VydmljZScsICdBZG1pbkxhbmdTZXJ2aWNlJywgJ0h0bWxTdG9yYWdlJyxcblx0XHRmdW5jdGlvbigkc2NvcGUsICRyb290U2NvcGUsICRmaWx0ZXIsICRzdGF0ZSwgJHN0YXRlUGFyYW1zLCAkaHR0cCwgUGxhY2Vob2xkZXJTZXJ2aWNlLCBTZXJ2aWNlUHJvcGVydGllc0RhdGEsIFNlcnZpY2VNZW51RGF0YSwgU2VydmljZUxhbmd1YWdlc0RhdGEsIFNlcnZpY2VMaXZlRWRpdE1vZGUsIEFkbWluVG9hc3RTZXJ2aWNlLCBBZG1pbkNsYXNzU2VydmljZSwgQWRtaW5MYW5nU2VydmljZSwgSHRtbFN0b3JhZ2UpIHtcblxuXG5cdFx0JHNjb3BlLnBhZ2VTZXR0aW5nc092ZXJsYXlIaWRkZW4gPSB0cnVlO1xuXHRcdFxuXHRcdCRzY29wZS5wYWdlU2V0dGluZ3NPdmVybGF5VGFiID0gMTtcblx0XHRcblx0XHQkc2NvcGUudG9nZ2xlUGFnZVNldHRpbmdzT3ZlcmxheSA9IGZ1bmN0aW9uKHQpIHtcblx0XHRcdCRzY29wZS5wYWdlU2V0dGluZ3NPdmVybGF5VGFiID0gdDtcblx0XHRcdCRzY29wZS5wYWdlU2V0dGluZ3NPdmVybGF5SGlkZGVuID0gISRzY29wZS5wYWdlU2V0dGluZ3NPdmVybGF5SGlkZGVuO1xuXHRcdH07XG5cdFx0XG5cdFx0JHNjb3BlLm5hdkNmZyA9IHtcblx0XHRcdGhlbHB0YWdzOiAkcm9vdFNjb3BlLmx1eWFjZmcuaGVscHRhZ3MsXG5cdFx0fTtcblx0XHRcblx0XHQkc2NvcGUuJHdhdGNoKGZ1bmN0aW9uKCkgeyByZXR1cm4gU2VydmljZUxpdmVFZGl0TW9kZS5zdGF0ZSB9LCBmdW5jdGlvbihuLCBvKSB7XG5cdFx0XHQkc2NvcGUuZGlzcGxheUxpdmVDb250YWluZXIgPSBuO1xuXHRcdH0pO1xuXHRcdFxuXHRcdCRzY29wZS4kd2F0Y2goZnVuY3Rpb24oKSB7IHJldHVybiBTZXJ2aWNlTGl2ZUVkaXRNb2RlLnVybCB9LCBmdW5jdGlvbihuLCBvKSB7XG5cdFx0XHQkc2NvcGUubGl2ZVVybCA9IG47XG5cdFx0fSk7XG5cdFx0XG5cdFx0JHNjb3BlLkFkbWluTGFuZ1NlcnZpY2UgPSBBZG1pbkxhbmdTZXJ2aWNlO1xuXG5cdFx0Lyogc2VydmljZSBBZG1pblByb3BlcnR5U2VydmljZSBpbmhlcml0YW5jZSAqL1xuXG5cdFx0JHNjb3BlLnByb3BlcnRpZXNEYXRhID0gU2VydmljZVByb3BlcnRpZXNEYXRhLmRhdGE7XG5cblx0XHQkc2NvcGUuJG9uKCdzZXJ2aWNlOlByb3BlcnRpZXNEYXRhJywgZnVuY3Rpb24oZXZlbnQsIGRhdGEpIHtcblx0XHRcdCRzY29wZS5wcm9wZXJ0aWVzRGF0YSA9IGRhdGE7XG5cdFx0fSk7XG5cblx0XHQvKiBzZXJ2aWNlIFNlcnZpY2VNZW51RGF0YSBpbmhlcml0YW5jZSAqL1xuXG5cdFx0JHNjb3BlLm1lbnVEYXRhID0gU2VydmljZU1lbnVEYXRhLmRhdGE7XG5cblx0XHQkc2NvcGUuJG9uKCdzZXJ2aWNlOk1lbnVEYXRhJywgZnVuY3Rpb24oZXZlbnQsIGRhdGEpIHtcblx0XHRcdCRzY29wZS5tZW51RGF0YSA9IGRhdGE7XG5cdFx0fSk7XG5cblx0XHQkc2NvcGUubWVudURhdGFSZWxvYWQgPSBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBTZXJ2aWNlTWVudURhdGEubG9hZCh0cnVlKTtcblx0XHR9O1xuXG5cdFx0Lyogc2VydmljZSBTZXJ2aWNlTGFuZ2F1Z2VzRGF0YSBpbmhlcml0YW5jZSAqL1xuXG5cdFx0JHNjb3BlLmxhbmd1YWdlc0RhdGEgPSBTZXJ2aWNlTGFuZ3VhZ2VzRGF0YS5kYXRhO1xuXG5cdFx0JHNjb3BlLiRvbignc2VydmljZTpMYW5ndWFnZXNEYXRhJywgZnVuY3Rpb24oZXZlbnQsIGRhdGEpIHtcblx0XHRcdCRzY29wZS5sYW5ndWFnZXNEYXRhID0gZGF0YTtcblx0XHR9KTtcblxuXHRcdC8qIHBsYWNlaG9sZGVycyB0b2dnbGVyIHNlcnZpY2UgKi9cblxuXHRcdCRzY29wZS5QbGFjZWhvbGRlclNlcnZpY2UgPSBQbGFjZWhvbGRlclNlcnZpY2U7XG5cblx0XHQkc2NvcGUucGxhY2Vob2xkZXJTdGF0ZSA9ICRzY29wZS5QbGFjZWhvbGRlclNlcnZpY2Uuc3RhdHVzO1xuXG5cdFx0JHNjb3BlLiR3YXRjaCgncGxhY2Vob2xkZXJTdGF0ZScsIGZ1bmN0aW9uKG4sIG8pIHtcblx0XHRcdGlmIChuICE9PSBvICYmIG4gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHQkc2NvcGUuUGxhY2Vob2xkZXJTZXJ2aWNlLmRlbGVnYXRlKG4pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0LyogQmxvY2tob2xkZXIgc2l6ZSB0b2dnbGVyICovXG5cbiAgICAgICAgJHNjb3BlLmlzQmxvY2tob2xkZXJTbWFsbCA9IEh0bWxTdG9yYWdlLmdldFZhbHVlKCdibG9ja2hvbGRlclRvZ2dsZVN0YXRlJywgdHJ1ZSk7XG5cbiAgICAgICAgJHNjb3BlLnRvZ2dsZUJsb2NraG9sZGVyU2l6ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgJHNjb3BlLmlzQmxvY2tob2xkZXJTbWFsbCA9ICEkc2NvcGUuaXNCbG9ja2hvbGRlclNtYWxsO1xuICAgICAgICAgICAgSHRtbFN0b3JhZ2Uuc2V0VmFsdWUoJ2Jsb2NraG9sZGVyVG9nZ2xlU3RhdGUnLCAkc2NvcGUuaXNCbG9ja2hvbGRlclNtYWxsKTtcbiAgICAgICAgfTtcblxuICAgICAgICAvKiBzaWRlYmFyIGxvZ2ljICovXG5cblx0XHQkc2NvcGUuc2lkZWJhciA9IGZhbHNlO1xuXG5cdCAgICAkc2NvcGUuZW5hYmxlU2lkZWJhciA9IGZ1bmN0aW9uKCkge1xuXHQgICAgXHQkc2NvcGUuc2lkZWJhciA9IHRydWU7XG5cdCAgICB9O1xuXG5cdCAgICAkc2NvcGUudG9nZ2xlU2lkZWJhciA9IGZ1bmN0aW9uKCkge1xuXHQgICAgICAgICRzY29wZS5zaWRlYmFyID0gISRzY29wZS5zaWRlYmFyO1xuXHQgICAgfTtcblxuXHRcdC8qIGFwcCBsb2dpYyAqL1xuXG5cdCAgICAkc2NvcGUuc2hvd0FjdGlvbnMgPSAxO1xuXG5cdFx0JHNjb3BlLmlkID0gcGFyc2VJbnQoJHN0YXRlUGFyYW1zLm5hdklkKTtcblxuXHRcdCRzY29wZS5pc0RlbGV0ZWQgPSBmYWxzZTtcblxuXHRcdCRzY29wZS5BZG1pbkNsYXNzU2VydmljZSA9IEFkbWluQ2xhc3NTZXJ2aWNlO1xuXG5cdFx0JHNjb3BlLnByb3BWYWx1ZXMgPSB7fTtcblxuXHRcdCRzY29wZS5oYXNWYWx1ZXMgPSBmYWxzZTtcblxuXHRcdCRzY29wZS5wYWdlVGFncyA9IFtdO1xuXG5cdFx0JHNjb3BlLmJ1YmJsZVBhcmVudHMgPSBmdW5jdGlvbihwYXJlbnROYXZJZCwgY29udGFpbmVySWQpIHtcblx0ICAgIFx0dmFyIGl0ZW0gPSAkZmlsdGVyKCdtZW51Y2hpbGRmaWx0ZXInKSgkc2NvcGUubWVudURhdGEuaXRlbXMsIGNvbnRhaW5lcklkLCBwYXJlbnROYXZJZCk7XG5cdCAgICBcdGlmIChpdGVtKSB7XG5cdCAgICBcdFx0aXRlbS50b2dnbGVfb3BlbiA9IDE7XG5cdCAgICBcdFx0JHNjb3BlLmJ1YmJsZVBhcmVudHMoaXRlbS5wYXJlbnRfbmF2X2lkLCBpdGVtLm5hdl9jb250YWluZXJfaWQpO1xuXHQgICAgXHR9XG5cdCAgICB9O1xuXG5cdFx0JHNjb3BlLmNyZWF0ZURlZXBQYWdlQ29weSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0JGh0dHAucG9zdCgnYWRtaW4vYXBpLWNtcy1uYXYvZGVlcC1wYWdlLWNvcHknLCB7bmF2SWQ6ICRzY29wZS5pZH0pLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcblx0XHRcdFx0JHNjb3BlLm1lbnVEYXRhUmVsb2FkKCk7XG5cdFx0XHRcdEFkbWluVG9hc3RTZXJ2aWNlLnN1Y2Nlc3MoaTE4blsnanNfcGFnZV9jcmVhdGVfY29weV9zdWNjZXNzJ10pO1xuXHRcdFx0XHQkc2NvcGUuc2hvd0FjdGlvbnMgPSAxO1xuXHRcdFx0XHQkc2NvcGUudG9nZ2xlUGFnZVNldHRpbmdzT3ZlcmxheSgpO1xuXHRcdFx0fSwgZnVuY3Rpb24ocmVzcG9uc2UpIHtcblx0XHRcdFx0QWRtaW5Ub2FzdFNlcnZpY2UuZXJyb3JBcnJheShyZXNwb25zZS5kYXRhKTtcblx0XHRcdH0pO1xuXHRcdH07XG5cblx0XHQkc2NvcGUucGFnZVRhZ3MgPSBbXTtcblxuXHRcdCRodHRwLmdldCgnYWRtaW4vYXBpLWNtcy1uYXYvJyArICRzY29wZS5pZCArICcvdGFncycpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcblx0XHRcdGFuZ3VsYXIuZm9yRWFjaChyZXNwb25zZS5kYXRhLCBmdW5jdGlvbih2YWx1ZSkge1xuXHRcdFx0XHQkc2NvcGUucGFnZVRhZ3MucHVzaCh2YWx1ZS5pZCk7XG5cdFx0XHR9KTtcblx0XHR9KTtcblxuXHRcdCRzY29wZS5zYXZlUGFnZVRhZ3MgPSBmdW5jdGlvbigpIHtcblx0XHRcdCRodHRwLnBvc3QoJ2FkbWluL2FwaS1jbXMtbmF2LycgKyAkc2NvcGUuaWQgKyAnL3RhZ3MnLCAkc2NvcGUucGFnZVRhZ3MpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcblx0XHRcdFx0JHNjb3BlLnRvZ2dsZVBhZ2VTZXR0aW5nc092ZXJsYXkoKTtcblx0XHRcdFx0QWRtaW5Ub2FzdFNlcnZpY2Uuc3VjY2VzcyhpMThuWydqc19jb25maWdfdXBkYXRlX3N1Y2Nlc3MnXSk7XG5cdFx0XHR9LCBmdW5jdGlvbihyZXNwb25zZSkge1xuXHRcdFx0XHRBZG1pblRvYXN0U2VydmljZS5lcnJvckFycmF5KHJlc3BvbnNlLmRhdGEpO1xuXHRcdFx0fSk7XG5cdFx0fTtcblxuXHRcdCRzY29wZS5jcmVhdGVEZWVwUGFnZUNvcHlBc1RlbXBsYXRlID0gZnVuY3Rpb24oKSB7XG5cdFx0XHQkaHR0cC5wb3N0KCdhZG1pbi9hcGktY21zLW5hdi9kZWVwLXBhZ2UtY29weS1hcy10ZW1wbGF0ZScsIHtuYXZJZDogJHNjb3BlLmlkfSkudGhlbihmdW5jdGlvbihyZXNwb25zZSkge1xuXHRcdFx0XHQkc2NvcGUubWVudURhdGFSZWxvYWQoKTtcblx0XHRcdFx0QWRtaW5Ub2FzdFNlcnZpY2Uuc3VjY2VzcyhpMThuWydqc19wYWdlX2NyZWF0ZV9jb3B5X2FzX3RlbXBsYXRlX3N1Y2Nlc3MnXSk7XG5cdFx0XHRcdCRzY29wZS5zaG93QWN0aW9ucyA9IDE7XG5cdFx0XHRcdCRzY29wZS50b2dnbGVQYWdlU2V0dGluZ3NPdmVybGF5KCk7XG4gICAgICAgICAgICAgICAgJHN0YXRlLmdvKCdjdXN0b20uY21zZHJhZnQnKTtcblx0XHRcdH0sIGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG5cdFx0XHRcdEFkbWluVG9hc3RTZXJ2aWNlLmVycm9yQXJyYXkocmVzcG9uc2UuZGF0YSk7XG5cdFx0XHR9KTtcblx0XHR9O1xuXG5cdFx0JHNjb3BlLmxvYWROYXZQcm9wZXJ0aWVzID0gZnVuY3Rpb24oKSB7XG5cdFx0XHQkaHR0cC5nZXQoJ2FkbWluL2FwaS1jbXMtbmF2L2dldC1wcm9wZXJ0aWVzJywgeyBwYXJhbXM6IHtuYXZJZDogJHNjb3BlLmlkfX0pLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcblx0XHRcdFx0Zm9yKHZhciBpIGluIHJlc3BvbnNlLmRhdGEpIHtcblx0XHRcdFx0XHR2YXIgZCA9IHJlc3BvbnNlLmRhdGFbaV07XG5cdFx0XHRcdFx0JHNjb3BlLnByb3BWYWx1ZXNbZC5hZG1pbl9wcm9wX2lkXSA9IGQudmFsdWU7XG5cdFx0XHRcdFx0JHNjb3BlLmhhc1ZhbHVlcyA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH07XG5cblx0XHQkc2NvcGUudG9nZ2xlUHJvcE1hc2sgPSBmdW5jdGlvbigpIHtcblx0XHRcdCRzY29wZS5zaG93UHJvcEZvcm0gPSAhJHNjb3BlLnNob3dQcm9wRm9ybTtcblx0XHR9O1xuXG5cdFx0JHNjb3BlLnNob3dQcm9wRm9ybSA9IGZhbHNlO1xuXG5cdFx0JHNjb3BlLnN0b3JlUHJvcFZhbHVlcyA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGhlYWRlcnMgPSB7XCJoZWFkZXJzXCIgOiB7IFwiQ29udGVudC1UeXBlXCIgOiBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOFwiIH19O1xuXHRcdFx0JGh0dHAucG9zdCgnYWRtaW4vYXBpLWNtcy1uYXYvc2F2ZS1wcm9wZXJ0aWVzP25hdklkPScrJHNjb3BlLmlkLCAkLnBhcmFtKCRzY29wZS5wcm9wVmFsdWVzKSwgaGVhZGVycykudGhlbihmdW5jdGlvbihyZXNwb25zZSkge1xuXHRcdFx0XHRBZG1pblRvYXN0U2VydmljZS5zdWNjZXNzKGkxOG5bJ2pzX3BhZ2VfcHJvcGVydHlfcmVmcmVzaCddKTtcblx0XHRcdFx0JHNjb3BlLmxvYWROYXZQcm9wZXJ0aWVzKCk7XG5cdFx0XHRcdCRzY29wZS5zaG93UHJvcEZvcm0gPSBmYWxzZTtcblx0XHRcdFx0JHNjb3BlLnRvZ2dsZVBhZ2VTZXR0aW5nc092ZXJsYXkoKTtcblx0XHRcdH0pO1xuXHRcdH07XG5cblx0XHQkc2NvcGUudHJhc2ggPSBmdW5jdGlvbigpIHtcblx0XHRcdEFkbWluVG9hc3RTZXJ2aWNlLmNvbmZpcm0oaTE4blsnanNfcGFnZV9jb25maXJtX2RlbGV0ZSddLCBpMThuWydjbXNhZG1pbl9zZXR0aW5nc190cmFzaHBhZ2VfdGl0bGUnXSwgWyckdG9hc3QnLCBmdW5jdGlvbigkdG9hc3QpIHtcblx0XHRcdFx0JGh0dHAuZ2V0KCdhZG1pbi9hcGktY21zLW5hdi9kZWxldGUnLCB7IHBhcmFtcyA6IHsgbmF2SWQgOiAkc2NvcGUuaWQgfX0pLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcblx0ICAgIFx0XHRcdCRzY29wZS5pc0RlbGV0ZWQgPSB0cnVlO1xuXHQgICAgXHRcdFx0JHNjb3BlLm1lbnVEYXRhUmVsb2FkKCkudGhlbihmdW5jdGlvbigpIHtcblx0ICAgIFx0XHRcdFx0JHRvYXN0LmNsb3NlKCk7XG5cdCAgICBcdFx0XHRcdCRzY29wZS50b2dnbGVQYWdlU2V0dGluZ3NPdmVybGF5KCk7XG5cdCAgICBcdFx0XHR9KTtcblx0ICAgIFx0XHR9LCBmdW5jdGlvbihyZXNwb25zZSkge1xuXHRcdFx0XHRcdGlmIChyZXNwb25zZS5zdGF0dXMgPT0gNDE3KSB7XG5cdFx0XHRcdFx0XHRBZG1pblRvYXN0U2VydmljZS5lcnJvcihpMThuWydqc19wYWdlX2RlbGV0ZV9lcnJvcl9jYXVzZV9yZWRpcmVjdHMnXSk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdEFkbWluVG9hc3RTZXJ2aWNlLmVycm9yQXJyYXkocmVzcG9uc2UuZGF0YSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1dKTtcblx0ICAgIH07XG5cblx0ICAgICRzY29wZS5pc0RyYWZ0ID0gZmFsc2U7XG5cblx0ICAgICRzY29wZS5zdWJtaXROYXZGb3JtID0gZnVuY3Rpb24oZGF0YSkge1xuXHQgICAgXHQkaHR0cC5wb3N0KCdhZG1pbi9hcGktY21zLW5hdi91cGRhdGU/aWQ9JyArICRzY29wZS5uYXZEYXRhLmlkLCBkYXRhKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG5cdCAgICBcdFx0QWRtaW5Ub2FzdFNlcnZpY2Uuc3VjY2VzcyhpMThuUGFyYW0oJ2pzX3BhZ2VfdXBkYXRlX2xheW91dF9zYXZlX3N1Y2Nlc3MnKSk7XG5cdCAgICBcdFx0JHNjb3BlLnRvZ2dsZVBhZ2VTZXR0aW5nc092ZXJsYXkoKTtcblx0ICAgIFx0fSwgZnVuY3Rpb24ocmVzcG9uc2UpIHtcblx0ICAgIFx0XHRhbmd1bGFyLmZvckVhY2gocmVzcG9uc2UuZGF0YSwgZnVuY3Rpb24odmFsdWUpIHtcblx0ICAgIFx0XHRcdEFkbWluVG9hc3RTZXJ2aWNlLmVycm9yKHZhbHVlLm1lc3NhZ2UpO1xuXHQgICAgXHRcdH0pO1xuXHQgICAgXHR9KTtcblx0ICAgIH07XG5cblx0ICAgIGZ1bmN0aW9uIGluaXRpYWxpemVyKCkge1xuXHRcdFx0JHNjb3BlLm5hdkRhdGEgPSAkZmlsdGVyKCdmaWx0ZXInKSgkc2NvcGUubWVudURhdGEuaXRlbXMsIHtpZDogJHNjb3BlLmlkfSwgdHJ1ZSlbMF07XG5cdFx0XHRpZiAoJHNjb3BlLm5hdkRhdGEgPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdCRzY29wZS5pc0RyYWZ0ID0gdHJ1ZTtcblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0JHNjb3BlLmxvYWROYXZQcm9wZXJ0aWVzKCk7XG5cblx0XHRcdFx0LyogcHJvcGVydGllcyAtLT4gKi9cblxuXHRcdFx0ICAgICRzY29wZS4kd2F0Y2goZnVuY3Rpb24oKSB7IHJldHVybiAkc2NvcGUubmF2RGF0YS5pc19vZmZsaW5lIH0sIGZ1bmN0aW9uKG4sIG8pIHtcblx0XHRcdCAgICBcdGlmIChuICE9PSBvICYmIG4gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0ICAgIFx0XHQkaHR0cC5nZXQoJ2FkbWluL2FwaS1jbXMtbmF2L3RvZ2dsZS1vZmZsaW5lJywgeyBwYXJhbXMgOiB7IG5hdklkIDogJHNjb3BlLm5hdkRhdGEuaWQgLCBvZmZsaW5lU3RhdHVzIDogbiB9fSkudGhlbihmdW5jdGlvbihyZXNwb25zZSkge1xuXHRcdFx0XHRcdFx0XHRpZiAoJHNjb3BlLm5hdkRhdGEuaXNfb2ZmbGluZSA9PSAxKSB7XG5cdFx0XHRcdFx0XHRcdFx0QWRtaW5Ub2FzdFNlcnZpY2UuaW5mbyhpMThuUGFyYW0oJ2pzX3N0YXRlX29mZmxpbmUnLCB7dGl0bGU6ICRzY29wZS5uYXZEYXRhLnRpdGxlfSkpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdEFkbWluVG9hc3RTZXJ2aWNlLmluZm8oaTE4blBhcmFtKCdqc19zdGF0ZV9vbmxpbmUnLCB7dGl0bGU6ICRzY29wZS5uYXZEYXRhLnRpdGxlfSkpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHQgICAgXHRcdH0pO1xuXHRcdFx0ICAgIFx0fVxuXHRcdFx0ICAgIH0pO1xuXG5cdFx0XHQgICAgJHNjb3BlLiR3YXRjaChmdW5jdGlvbigpIHsgcmV0dXJuICRzY29wZS5uYXZEYXRhLmlzX2hpZGRlbiB9LCBmdW5jdGlvbihuLCBvKSB7XG5cdFx0XHRcdFx0aWYgKG4gIT09IG8gJiYgbiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHQkaHR0cC5nZXQoJ2FkbWluL2FwaS1jbXMtbmF2L3RvZ2dsZS1oaWRkZW4nLCB7IHBhcmFtcyA6IHsgbmF2SWQgOiAkc2NvcGUubmF2RGF0YS5pZCAsIGhpZGRlblN0YXR1cyA6IG4gfX0pLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcblx0XHRcdFx0XHRcdFx0aWYgKCRzY29wZS5uYXZEYXRhLmlzX2hpZGRlbiA9PSAxKSB7XG5cdFx0XHRcdFx0XHRcdFx0QWRtaW5Ub2FzdFNlcnZpY2UuaW5mbyhpMThuUGFyYW0oJ2pzX3N0YXRlX2hpZGRlbicsIHt0aXRsZTogJHNjb3BlLm5hdkRhdGEudGl0bGV9KSk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0QWRtaW5Ub2FzdFNlcnZpY2UuaW5mbyhpMThuUGFyYW0oJ2pzX3N0YXRlX3Zpc2libGUnLCB7dGl0bGU6ICRzY29wZS5uYXZEYXRhLnRpdGxlfSkpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHQgICAgJHNjb3BlLiR3YXRjaChmdW5jdGlvbigpIHsgcmV0dXJuICRzY29wZS5uYXZEYXRhLmlzX2hvbWUgfSwgZnVuY3Rpb24obiwgbykge1xuXHRcdFx0ICAgIFx0aWYgKG4gIT09IG8gJiYgbiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHQkaHR0cC5nZXQoJ2FkbWluL2FwaS1jbXMtbmF2L3RvZ2dsZS1ob21lJywgeyBwYXJhbXMgOiB7IG5hdklkIDogJHNjb3BlLm5hdkRhdGEuaWQgLCBob21lU3RhdGUgOiBuIH19KS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG5cdFx0XHRcdFx0XHRcdCRzY29wZS5tZW51RGF0YVJlbG9hZCgpLnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCRzY29wZS5uYXZEYXRhLmlzX2hvbWUgPT0gMSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0QWRtaW5Ub2FzdFNlcnZpY2Uuc3VjY2VzcyhpMThuUGFyYW0oJ2pzX3N0YXRlX2lzX2hvbWUnLCB7dGl0bGU6ICRzY29wZS5uYXZEYXRhLnRpdGxlfSkpO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRBZG1pblRvYXN0U2VydmljZS5zdWNjZXNzKGkxOG5QYXJhbSgnanNfc3RhdGVfaXNfbm90X2hvbWUnLCB7dGl0bGU6ICRzY29wZS5uYXZEYXRhLnRpdGxlfSkpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHQkc2NvcGUudG9nZ2xlUGFnZVNldHRpbmdzT3ZlcmxheSgpO1xuXHRcdFx0ICAgIFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRcdGluaXRpYWxpemVyKCk7XG5cdH1dKTtcblxuXHQvKipcblx0ICogQHBhcmFtICRzY29wZS5sYW5nIGZyb20gbmctcmVwZWF0XG5cdCAqL1xuXHR6YWEuY29udHJvbGxlcihcIk5hdkl0ZW1Db250cm9sbGVyXCIsIFtcblx0XHQnJHNjb3BlJywgJyRyb290U2NvcGUnLCAnJGh0dHAnLCAnJGZpbHRlcicsICckdGltZW91dCcsICdTZXJ2aWNlTWVudURhdGEnLCAnQWRtaW5MYW5nU2VydmljZScsICdBZG1pblRvYXN0U2VydmljZScsICdTZXJ2aWNlTGl2ZUVkaXRNb2RlJywgJ1NlcnZpY2VMYXlvdXRzRGF0YScsICdTZXJ2aWNlV29ya2luZ1BhZ2VWZXJzaW9uJyxcblx0XHRmdW5jdGlvbigkc2NvcGUsICRyb290U2NvcGUsICRodHRwLCAkZmlsdGVyLCAkdGltZW91dCwgU2VydmljZU1lbnVEYXRhLCBBZG1pbkxhbmdTZXJ2aWNlLCBBZG1pblRvYXN0U2VydmljZSwgU2VydmljZUxpdmVFZGl0TW9kZSwgU2VydmljZUxheW91dHNEYXRhLCBTZXJ2aWNlV29ya2luZ1BhZ2VWZXJzaW9uKSB7XG5cblx0XHQkc2NvcGUubG9hZGVkID0gZmFsc2U7XG5cblx0XHQkc2NvcGUuTmF2Q29udHJvbGxlciA9ICRzY29wZS4kcGFyZW50O1xuXG5cdFx0JHNjb3BlLmxpdmVFZGl0U3RhdGUgPSBmYWxzZTtcblxuXHRcdCRzY29wZS4kd2F0Y2goZnVuY3Rpb24oKSB7IHJldHVybiBTZXJ2aWNlTGl2ZUVkaXRNb2RlLnN0YXRlIH0sIGZ1bmN0aW9uKG4sIG8pIHtcblx0XHRcdCRzY29wZS5saXZlRWRpdFN0YXRlID0gbjtcblx0XHR9KTtcblxuXHRcdCRzY29wZS5vcGVuTGl2ZVVybCA9IGZ1bmN0aW9uKGlkLCB2ZXJzaW9uSWQpIHtcblx0XHRcdFNlcnZpY2VMaXZlRWRpdE1vZGUuY2hhbmdlVXJsKGlkLCB2ZXJzaW9uSWQpO1xuXHRcdH07XG5cblx0XHQkc2NvcGUubG9hZExpdmVVcmwgPSBmdW5jdGlvbigpIHtcblx0XHRcdFNlcnZpY2VMaXZlRWRpdE1vZGUuY2hhbmdlVXJsKCRzY29wZS5pdGVtLmlkLCAkc2NvcGUuY3VycmVudFBhZ2VWZXJzaW9uKTtcblx0XHR9O1xuXG5cdFx0Ly8gbGF5b3V0c0RhdGFcblxuXHRcdCRzY29wZS5sYXlvdXRzRGF0YSA9IFNlcnZpY2VMYXlvdXRzRGF0YS5kYXRhO1xuXG4gICAgXHQkc2NvcGUuJG9uKCdzZXJ2aWNlOkJsb2Nrc0RhdGEnLCBmdW5jdGlvbihldmVudCwgZGF0YSkge1xuICAgIFx0XHQkc2NvcGUubGF5b3V0c0RhdGEgPSBkYXRhO1xuICAgIFx0fSk7XG5cdFx0XG5cdFx0Ly8gc2VydmljZU1lbnVEYXRhIGluaGVyaXRhbmNlXG5cblx0XHQkc2NvcGUubWVudURhdGFSZWxvYWQgPSBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBTZXJ2aWNlTWVudURhdGEubG9hZCh0cnVlKTtcblx0XHR9O1xuXG5cdFx0JHNjb3BlLiRvbignc2VydmljZTpMb2FkTGFuZ3VhZ2UnLCBmdW5jdGlvbihldmVudCwgZGF0YSkge1xuXHRcdFx0aWYgKCEkc2NvcGUubG9hZGVkKSB7XG5cdFx0XHRcdCRzY29wZS5yZWZyZXNoKCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyBwcm9wZXJ0aWVzOlxuXG5cdFx0JHNjb3BlLmlzVHJhbnNsYXRlZCA9IGZhbHNlO1xuXG5cdFx0JHNjb3BlLml0ZW0gPSBbXTtcblxuXHRcdCRzY29wZS5pdGVtQ29weSA9IFtdO1xuXG5cdFx0JHNjb3BlLnNldHRpbmdzID0gZmFsc2U7XG5cblx0XHQkc2NvcGUudHlwZURhdGFDb3B5ID0gW107XG5cblx0XHQkc2NvcGUudHlwZURhdGEgPSBbXTtcblxuXHRcdCRzY29wZS5jb250YWluZXIgPSBbXTtcblxuXHRcdCRzY29wZS5lcnJvcnMgPSBbXTtcblxuXHRcdCRzY29wZS5ob21lVXJsID0gJHJvb3RTY29wZS5sdXlhY2ZnLmhvbWVVcmw7XG5cblx0XHQkc2NvcGUuY3VycmVudFBhZ2VWZXJzaW9uID0gMDtcblx0XHRcblx0XHQkc2NvcGUuY3VycmVudFBhZ2VWZXJzaW9uQWxpYXM7XG5cblx0XHQkc2NvcGUudHJhc2hJdGVtID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoJHNjb3BlLmxhbmcuaXNfZGVmYXVsdCA9PSAwKSB7XG5cdFx0XHRcdEFkbWluVG9hc3RTZXJ2aWNlLmNvbmZpcm0oaTE4blsnanNfcGFnZV9jb25maXJtX2RlbGV0ZSddLCBpMThuWydjbXNhZG1pbl9zZXR0aW5nc190cmFzaHBhZ2VfdGl0bGUnXSwgWyckdG9hc3QnLCBmdW5jdGlvbigkdG9hc3QpIHtcblx0XHRcdFx0XHQkaHR0cC5kZWxldGUoJ2FkbWluL2FwaS1jbXMtbmF2aXRlbS9kZWxldGU/bmF2SXRlbUlkPScgKyAkc2NvcGUuaXRlbS5pZCkudGhlbihmdW5jdGlvbihyZXNwb25zZSkge1xuXHRcdFx0XHRcdFx0JHNjb3BlLm1lbnVEYXRhUmVsb2FkKCkudGhlbihmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0JHNjb3BlLmlzVHJhbnNsYXRlZCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHQkc2NvcGUuaXRlbSA9IFtdO1xuXHRcdFx0XHRcdFx0XHQkc2NvcGUuaXRlbUNvcHkgPSBbXTtcblx0XHRcdFx0XHRcdFx0JHNjb3BlLnNldHRpbmdzID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdCRzY29wZS50eXBlRGF0YUNvcHkgPSBbXTtcblx0XHRcdFx0XHRcdFx0JHNjb3BlLnR5cGVEYXRhID0gW107XG5cdFx0XHRcdFx0XHRcdCRzY29wZS5jb250YWluZXIgPSBbXTtcblx0XHRcdFx0XHRcdFx0JHNjb3BlLmVycm9ycyA9IFtdO1xuXHRcdFx0XHRcdFx0XHQkc2NvcGUuY3VycmVudFBhZ2VWZXJzaW9uID0gMDtcblx0XHRcdFx0XHRcdFx0JHNjb3BlLiRicm9hZGNhc3QoJ2RlbGV0ZWROYXZJdGVtJyk7XG5cdFx0XHRcdFx0XHRcdCR0b2FzdC5jbG9zZSgpO1xuXHRcdCAgICBcdFx0XHR9KTtcblx0XHQgICAgXHRcdH0sIGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG5cdFx0XHRcdFx0XHRBZG1pblRvYXN0U2VydmljZS5lcnJvcihpMThuWydqc19wYWdlX2RlbGV0ZV9lcnJvcl9jYXVzZV9yZWRpcmVjdHMnXSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1dKTtcblx0XHRcdH1cblx0ICAgIH07XG5cblx0XHQkc2NvcGUucmVzZXQgPSBmdW5jdGlvbigpIHtcblx0XHRcdCRzY29wZS5pdGVtQ29weSA9IGFuZ3VsYXIuY29weSgkc2NvcGUuaXRlbSk7XG5cdFx0XHRpZiAoJHNjb3BlLml0ZW0ubmF2X2l0ZW1fdHlwZSA9PSAxKSB7XG5cdFx0XHRcdCRzY29wZS50eXBlRGF0YUNvcHkgPSBhbmd1bGFyLmNvcHkoeyduYXZfaXRlbV90eXBlX2lkJyA6ICRzY29wZS5pdGVtLm5hdl9pdGVtX3R5cGVfaWQgfSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQkc2NvcGUudHlwZURhdGFDb3B5ID0gYW5ndWxhci5jb3B5KCRzY29wZS50eXBlRGF0YSk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdCRzY29wZS51cGRhdGVOYXZJdGVtRGF0YSA9IGZ1bmN0aW9uKGl0ZW1Db3B5LCB0eXBlRGF0YUNvcHkpIHtcblx0XHRcdCRzY29wZS5lcnJvcnMgPSBbXTtcblx0XHRcdHZhciBoZWFkZXJzID0ge1wiaGVhZGVyc1wiIDogeyBcIkNvbnRlbnQtVHlwZVwiIDogXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLThcIiB9fTtcblx0XHRcdHZhciBuYXZJdGVtSWQgPSBpdGVtQ29weS5pZDtcblxuXHRcdFx0dHlwZURhdGFDb3B5LnRpdGxlID0gaXRlbUNvcHkudGl0bGU7XG5cdFx0XHR0eXBlRGF0YUNvcHkuYWxpYXMgPSBpdGVtQ29weS5hbGlhcztcblx0XHRcdHR5cGVEYXRhQ29weS50aXRsZV90YWcgPSBpdGVtQ29weS50aXRsZV90YWc7XG5cdFx0XHR0eXBlRGF0YUNvcHkuZGVzY3JpcHRpb24gPSBpdGVtQ29weS5kZXNjcmlwdGlvbjtcblx0XHRcdHR5cGVEYXRhQ29weS5rZXl3b3JkcyA9IGl0ZW1Db3B5LmtleXdvcmRzO1xuXHRcdFx0dHlwZURhdGFDb3B5LnRpbWVzdGFtcF9jcmVhdGUgPSBpdGVtQ29weS50aW1lc3RhbXBfY3JlYXRlO1xuXHRcdFx0dHlwZURhdGFDb3B5LmltYWdlX2lkID0gaXRlbUNvcHkuaW1hZ2VfaWQ7XG5cdFx0XHR0eXBlRGF0YUNvcHkuaXNfdXJsX3N0cmljdF9wYXJzaW5nX2Rpc2FibGVkID0gaXRlbUNvcHkuaXNfdXJsX3N0cmljdF9wYXJzaW5nX2Rpc2FibGVkO1xuXHRcdFx0dHlwZURhdGFDb3B5LmlzX2NhY2hlYWJsZSA9IGl0ZW1Db3B5LmlzX2NhY2hlYWJsZTtcblx0XHRcdCRodHRwLnBvc3QoXG5cdFx0XHRcdCdhZG1pbi9hcGktY21zLW5hdml0ZW0vdXBkYXRlLXBhZ2UtaXRlbT9uYXZJdGVtSWQ9JyArIG5hdkl0ZW1JZCArICcmbmF2SXRlbVR5cGU9JyArIGl0ZW1Db3B5Lm5hdl9pdGVtX3R5cGUsXG5cdFx0XHRcdCQucGFyYW0odHlwZURhdGFDb3B5KSxcblx0XHRcdFx0aGVhZGVyc1xuXHRcdFx0KS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG5cdFx0XHRcdGlmIChpdGVtQ29weS5uYXZfaXRlbV90eXBlICE9PSAxKSB7XG5cdFx0XHRcdFx0JHNjb3BlLmN1cnJlbnRQYWdlVmVyc2lvbiA9IDA7XG5cdFx0XHRcdH1cblx0XHRcdFx0JHNjb3BlLmxvYWRlZCA9IGZhbHNlO1xuXHRcdFx0XHRpZiAocmVzcG9uc2UuZGF0YSkge1xuXHRcdFx0XHRcdC8qIHN3aXRjaCB2ZXJzaW9uIGlmIHR5cGUgaXMgcGFnZSAqL1xuXHRcdFx0XHRcdGlmIChpdGVtQ29weS5uYXZfaXRlbV90eXBlID09IDEgJiYgdHlwZW9mIHJlc3BvbnNlLmRhdGFbJ3R5cGVEYXRhJ10gPT09ICdvYmplY3QnKSB7XG5cdFx0XHRcdFx0XHQvKiBjaG9vc2UgZ2l2ZW4gdmVyc2lvbiBvciBjaG9vc2UgZmlyc3QgYXZhaWxhYmxlIHZlcnNpb24gKi9cblx0XHRcdFx0XHRcdHZhciBwYWdlVmVyc2lvbktleSA9IHJlc3BvbnNlLmRhdGFbJ2l0ZW0nXS5uYXZfaXRlbV90eXBlX2lkO1xuXHRcdFx0XHRcdFx0aWYgKHBhZ2VWZXJzaW9uS2V5ID09IDApIHtcblx0XHRcdFx0XHRcdFx0cGFnZVZlcnNpb25LZXkgPSBPYmplY3Qua2V5cyhyZXNwb25zZS5kYXRhWyd0eXBlRGF0YSddKVswXTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdCRzY29wZS5jb250YWluZXIgPSByZXNwb25zZS5kYXRhWyd0eXBlRGF0YSddW3BhZ2VWZXJzaW9uS2V5XVsnY29udGVudEFzQXJyYXknXTtcblx0XHRcdFx0XHRcdCRzY29wZS5jdXJyZW50UGFnZVZlcnNpb25BbGlhcyA9IHJlc3BvbnNlLmRhdGFbJ3R5cGVEYXRhJ11bcGFnZVZlcnNpb25LZXldWyd2ZXJzaW9uX2FsaWFzJ107XG5cdFx0XHRcdFx0XHQkc2NvcGUuY3VycmVudFBhZ2VWZXJzaW9uID0gcGFnZVZlcnNpb25LZXk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdEFkbWluVG9hc3RTZXJ2aWNlLnN1Y2Nlc3MoaTE4blBhcmFtKCdqc19wYWdlX2l0ZW1fdXBkYXRlX29rJywgeyd0aXRsZSc6IGl0ZW1Db3B5LnRpdGxlfSkpO1xuXHRcdFx0XHQkc2NvcGUubWVudURhdGFSZWxvYWQoKTtcblx0XHRcdFx0JHNjb3BlLnJlZnJlc2goKTtcblx0XHRcdFx0JHNjb3BlLnRvZ2dsZVNldHRpbmdzT3ZlcmxheSgpO1xuXHRcdFx0XHQkc2NvcGUucmVzZXQoKTtcblx0XHRcdH0sIGZ1bmN0aW9uIGVycm9yQ2FsbGJhY2socmVzcG9uc2UpIHtcblx0XHRcdFx0YW5ndWxhci5mb3JFYWNoKHJlc3BvbnNlLmRhdGEsIGZ1bmN0aW9uKGl0ZW0pIHtcblx0XHRcdFx0XHRBZG1pblRvYXN0U2VydmljZS5lcnJvcihpdGVtLm1lc3NhZ2UpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdH07XG5cblx0XHQkc2NvcGUuJHdhdGNoKCdpdGVtQ29weS5hbGlhcycsIGZ1bmN0aW9uKG4sIG8pIHtcblx0XHRcdGlmIChuIT1vICYmIG4hPW51bGwpIHtcblx0XHRcdFx0JHNjb3BlLml0ZW1Db3B5LmFsaWFzID0gJGZpbHRlcignc2x1Z2lmeScpKG4pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0JHNjb3BlLnJlbW92ZVZlcnNpb24gPSBmdW5jdGlvbih2ZXJzaW9uKSB7XG5cdFx0XHRBZG1pblRvYXN0U2VydmljZS5jb25maXJtKGkxOG5QYXJhbSgnanNfdmVyc2lvbl9kZWxldGVfY29uZmlybScsIHthbGlhczogdmVyc2lvbi52ZXJzaW9uX2FsaWFzfSksIGkxOG5bJ2Ntc2FkbWluX3ZlcnNpb25fcmVtb3ZlJ10sIFsnJHRvYXN0JywgJyRodHRwJywgZnVuY3Rpb24oJHRvYXN0LCAkaHR0cCkge1xuXHRcdFx0XHQkaHR0cC5wb3N0KCdhZG1pbi9hcGktY21zLW5hdml0ZW0vcmVtb3ZlLXBhZ2UtdmVyc2lvbicsIHtwYWdlSWQgOiB2ZXJzaW9uLmlkfSkudGhlbihmdW5jdGlvbihyZXNwb25zZSkge1xuXHRcdFx0XHRcdCRzY29wZS5yZWZyZXNoRm9yY2UoKTtcblx0XHRcdFx0XHQkdG9hc3QuY2xvc2UoKTtcblx0XHRcdFx0XHRBZG1pblRvYXN0U2VydmljZS5zdWNjZXNzKGkxOG5QYXJhbSgnanNfdmVyc2lvbl9kZWxldGVfY29uZmlybV9zdWNjZXNzJywge2FsaWFzOiB2ZXJzaW9uLnZlcnNpb25fYWxpYXN9KSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fV0pO1xuXHRcdH07XG5cdFx0XG4gICAgXHQkc2NvcGUuZWRpdFZlcnNpb25JdGVtO1xuICAgIFx0XG4gICAgXHQkc2NvcGUudGFiID0gMTtcbiAgICBcdFxuICAgIFx0JHNjb3BlLmVkaXRWZXJzaW9uID0gZnVuY3Rpb24odmVyc2lvbkl0ZW0pIHtcbiAgICBcdFx0JHNjb3BlLmNoYW5nZVRhYig0KTtcbiAgICBcdFx0JHNjb3BlLmVkaXRWZXJzaW9uSXRlbSA9IHZlcnNpb25JdGVtO1xuICAgIFx0fTtcblxuICAgIFx0JHNjb3BlLmVkaXRWZXJzaW9uVXBkYXRlID0gZnVuY3Rpb24oZWRpdFZlcnNpb25JdGVtKSB7XG4gICAgXHRcdCRodHRwLnBvc3QoJ2FkbWluL2FwaS1jbXMtbmF2aXRlbS9jaGFuZ2UtcGFnZS12ZXJzaW9uLWxheW91dCcsIHsncGFnZUl0ZW1JZCc6IGVkaXRWZXJzaW9uSXRlbS5pZCwgJ2xheW91dElkJzogZWRpdFZlcnNpb25JdGVtLmxheW91dF9pZCwgJ2FsaWFzJzogZWRpdFZlcnNpb25JdGVtLnZlcnNpb25fYWxpYXN9KS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG4gICAgXHRcdFx0JHNjb3BlLnJlZnJlc2hGb3JjZSgpO1xuICAgIFx0XHRcdEFkbWluVG9hc3RTZXJ2aWNlLnN1Y2Nlc3MoaTE4blsnanNfdmVyc2lvbl91cGRhdGVfc3VjY2VzcyddKTtcbiAgICBcdFx0XHQkc2NvcGUudG9nZ2xlU2V0dGluZ3NPdmVybGF5KCk7XG5cdFx0XHR9KTtcbiAgICBcdH07XG4gICAgXHRcblx0XHQkc2NvcGUuZ2V0SXRlbSA9IGZ1bmN0aW9uKGxhbmdJZCwgbmF2SWQpIHtcblx0XHRcdCRodHRwKHtcblx0XHRcdCAgICB1cmw6ICdhZG1pbi9hcGktY21zLW5hdml0ZW0vbmF2LWxhbmctaXRlbScsXG5cdFx0XHQgICAgbWV0aG9kOiBcIkdFVFwiLFxuXHRcdFx0ICAgIHBhcmFtczogeyBsYW5nSWQgOiBsYW5nSWQsIG5hdklkIDogbmF2SWQgfVxuXHRcdFx0fSkudGhlbihmdW5jdGlvbihyZXNwb25zZSkge1xuXHRcdFx0XHQkc2NvcGUuaXRlbSA9IHJlc3BvbnNlLmRhdGFbJ2l0ZW0nXTtcblx0XHRcdFx0JHNjb3BlLnR5cGVEYXRhID0gcmVzcG9uc2UuZGF0YVsndHlwZURhdGEnXTtcblx0XHRcdFx0JHNjb3BlLmlzVHJhbnNsYXRlZCA9IHRydWU7XG5cdFx0XHRcdCRzY29wZS5yZXNldCgpO1xuXHRcdFx0XHRcblx0XHRcdFx0aWYgKCFyZXNwb25zZS5kYXRhWyduYXYnXS5pc19kcmFmdCkge1xuXHRcdFx0XHRcdCRzY29wZS5OYXZDb250cm9sbGVyLmJ1YmJsZVBhcmVudHMoJHNjb3BlLk5hdkNvbnRyb2xsZXIubmF2RGF0YS5wYXJlbnRfbmF2X2lkLCAkc2NvcGUuTmF2Q29udHJvbGxlci5uYXZEYXRhLm5hdl9jb250YWluZXJfaWQpO1xuXHRcdFx0XHRcdGlmICgkc2NvcGUuaXRlbS5uYXZfaXRlbV90eXBlID09IDEpIHtcblxuXHRcdFx0XHRcdFx0dmFyIGxhc3RWZXJzaW9uID0gU2VydmljZVdvcmtpbmdQYWdlVmVyc2lvbi5oYXNWZXJzaW9uKCRzY29wZS5pdGVtLmlkKTtcblxuXHRcdFx0XHRcdFx0aWYgKGxhc3RWZXJzaW9uKSB7XG5cdFx0XHRcdFx0XHRcdCRzY29wZS5zd2l0Y2hWZXJzaW9uKGxhc3RWZXJzaW9uKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGlmICgkc2NvcGUuY3VycmVudFBhZ2VWZXJzaW9uID09IDApIHtcblx0XHRcdFx0XHRcdFx0XHQkc2NvcGUuY3VycmVudFBhZ2VWZXJzaW9uID0gcmVzcG9uc2UuZGF0YS5pdGVtLm5hdl9pdGVtX3R5cGVfaWQ7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0aWYgKHJlc3BvbnNlLmRhdGEuaXRlbS5uYXZfaXRlbV90eXBlX2lkIGluIHJlc3BvbnNlLmRhdGEudHlwZURhdGEpIHtcblx0XHRcdFx0XHRcdFx0XHQkc2NvcGUuY3VycmVudFBhZ2VWZXJzaW9uQWxpYXMgPSAkc2NvcGUuY29udGFpbmVyID0gcmVzcG9uc2UuZGF0YS50eXBlRGF0YVskc2NvcGUuY3VycmVudFBhZ2VWZXJzaW9uXVsndmVyc2lvbl9hbGlhcyddO1xuXHRcdFx0XHRcdFx0XHRcdCRzY29wZS5jb250YWluZXIgPSByZXNwb25zZS5kYXRhLnR5cGVEYXRhWyRzY29wZS5jdXJyZW50UGFnZVZlcnNpb25dWydjb250ZW50QXNBcnJheSddO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdCRzY29wZS5jdXJyZW50UGFnZVZlcnNpb24gPSByZXNwb25zZS5kYXRhLml0ZW0ubmF2X2l0ZW1fdHlwZV9pZDtcblx0XHRcdFx0XHQkc2NvcGUuY29udGFpbmVyID0gcmVzcG9uc2UuZGF0YS50eXBlRGF0YVskc2NvcGUuY3VycmVudFBhZ2VWZXJzaW9uXVsnY29udGVudEFzQXJyYXknXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdCRzY29wZS5sb2FkZWQgPSB0cnVlXG5cdFx0XHR9LCBmdW5jdGlvbihlcnJvcikge1xuXHRcdFx0XHQvLyBpdHMgbG9hZGVkLCBidXQgdGhlIGRhdGEgZG9lcyBub3QgZXhpc3RzLlxuXHRcdFx0XHQkc2NvcGUubG9hZGVkID0gdHJ1ZTtcblx0XHRcdH0pO1xuXHRcdH07XG5cdFx0XG5cdFx0JHNjb3BlLnZlcnNpb25Ecm9wRG93blZpc2JpbGl0eSA9IGZhbHNlO1xuXHRcdFxuXHRcdCRzY29wZS50b2dnbGVWZXJzaW9uc0Ryb3Bkb3duID0gZnVuY3Rpb24oKSB7XG5cdFx0XHQkc2NvcGUudmVyc2lvbkRyb3BEb3duVmlzYmlsaXR5ID0gISRzY29wZS52ZXJzaW9uRHJvcERvd25WaXNiaWxpdHk7XG5cdFx0fTtcblx0XHRcblx0XHQkc2NvcGUuc3dpdGNoVmVyc2lvbiA9IGZ1bmN0aW9uKHBhZ2VWZXJzaW9uaWQsIHRvZ2dsZSkge1xuXHRcdFx0U2VydmljZVdvcmtpbmdQYWdlVmVyc2lvbi5zdG9yZSgkc2NvcGUuaXRlbS5pZCwgcGFnZVZlcnNpb25pZCk7XG5cdFx0XHQkc2NvcGUuY29udGFpbmVyID0gJHNjb3BlLnR5cGVEYXRhW3BhZ2VWZXJzaW9uaWRdWydjb250ZW50QXNBcnJheSddO1xuXHRcdFx0JHNjb3BlLmN1cnJlbnRQYWdlVmVyc2lvbkFsaWFzID0gJHNjb3BlLnR5cGVEYXRhW3BhZ2VWZXJzaW9uaWRdWyd2ZXJzaW9uX2FsaWFzJ107XG5cdFx0XHQkc2NvcGUuY3VycmVudFBhZ2VWZXJzaW9uID0gcGFnZVZlcnNpb25pZDtcblx0XHRcdCRzY29wZS5sb2FkTGl2ZVVybCgpO1xuXHRcdFx0aWYgKHRvZ2dsZSnCoHtcblx0XHRcdFx0JHNjb3BlLnRvZ2dsZVZlcnNpb25zRHJvcGRvd24oKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0JHNjb3BlLnJlZnJlc2hGb3JjZSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0JHNjb3BlLmdldEl0ZW0oJHNjb3BlLmxhbmcuaWQsICRzY29wZS5OYXZDb250cm9sbGVyLmlkKTtcblx0XHR9O1xuXG5cdFx0JHNjb3BlLnJlZnJlc2ggPSBmdW5jdGlvbigpIHtcblx0XHRcdGlmIChBZG1pbkxhbmdTZXJ2aWNlLmlzSW5TZWxlY3Rpb24oJHNjb3BlLmxhbmcuc2hvcnRfY29kZSkpIHtcblx0XHRcdFx0JHNjb3BlLmdldEl0ZW0oJHNjb3BlLmxhbmcuaWQsICRzY29wZS5OYXZDb250cm9sbGVyLmlkKTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdFxuXHRcdC8qIG5ldyBzZXR0aW5ncyBvdmVybGF5ICovXG5cdFx0XG5cdFx0JHNjb3BlLnNldHRpbmdzT3ZlcmxheVZpc2liaWxpdHkgPSB0cnVlO1xuXHRcdFxuXHRcdCRzY29wZS50b2dnbGVTZXR0aW5nc092ZXJsYXkgPSBmdW5jdGlvbih0YWIpIHtcblx0XHRcdCRzY29wZS5zZXR0aW5nc092ZXJsYXlWaXNpYmlsaXR5ID0gISRzY29wZS5zZXR0aW5nc092ZXJsYXlWaXNpYmlsaXR5O1xuXHRcdFx0aWYgKHRhYikge1xuXHRcdFx0XHQkc2NvcGUudGFiID0gdGFiO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRcblx0XHQkc2NvcGUuY2hhbmdlVGFiID0gZnVuY3Rpb24odGFiKSB7XG5cdFx0XHQkc2NvcGUudGFiID0gdGFiO1xuXHRcdH1cblx0XHRcblx0XHQvKipcblx0XHQgKiBSZWZyZXNoIHRoZSBjdXJyZW50IGxheW91dCBjb250YWluZXIgYmxvY2tzLlxuXHRcdCAqIFxuXHRcdCAqIEFmdGVyIHN1Y2Nlc3NmdWxsIGFwaSByZXNwb25zZSBhbGwgY21zIGxheW91dCBhcmUgZm9yZWFjaCBhbmQgdGhlIHZhbHVlcyBhcmUgcGFzc2VkIHRvIHJldlBsYWNlaG9sZGVycygpIG1ldGhvZC5cblx0XHQgKi9cblx0XHQkc2NvcGUucmVmcmVzaE5lc3RlZCA9IGZ1bmN0aW9uKHByZXZJZCwgcGxhY2Vob2xkZXJWYXIpIHtcblx0XHRcdCRodHRwKHtcblx0XHRcdFx0dXJsIDogJ2FkbWluL2FwaS1jbXMtbmF2aXRlbS9yZWxvYWQtcGxhY2Vob2xkZXInLFxuXHRcdFx0XHRtZXRob2QgOiAnR0VUJyxcblx0XHRcdFx0cGFyYW1zIDogeyBuYXZJdGVtUGFnZUlkIDogJHNjb3BlLmN1cnJlbnRQYWdlVmVyc2lvbiwgcHJldklkIDogcHJldklkLCBwbGFjZWhvbGRlclZhciA6IHBsYWNlaG9sZGVyVmFyfVxuXHRcdFx0fSkudGhlbihmdW5jdGlvbihyZXNwb25zZSkge1xuXHRcdFx0XHRTZXJ2aWNlTGl2ZUVkaXRNb2RlLmNoYW5nZVVybCgkc2NvcGUuaXRlbS5pZCwgJHNjb3BlLmN1cnJlbnRQYWdlVmVyc2lvbik7XG5cdFx0XHRcdGFuZ3VsYXIuZm9yRWFjaCgkc2NvcGUuY29udGFpbmVyLl9fcGxhY2Vob2xkZXJzLCBmdW5jdGlvbihwbGFjZWhvbGRlcikge1xuXHRcdFx0XHRcdCRzY29wZS5yZXZQbGFjZWhvbGRlcnMocGxhY2Vob2xkZXIsIHByZXZJZCwgcGxhY2Vob2xkZXJWYXIsIHJlc3BvbnNlLmRhdGEpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdH07XG5cdFx0XG5cdFx0LyoqXG5cdFx0ICogVGhlIHJldlBsYWNlaG9sZGVycyBtZXRob2QgZ29lcyB0cm91cmdoIHRoZSBuZXcgcm93L2NvbCAoZ3JpZCkgc3lzdGVtIGNvbnRhaW5lciBqc29uIGxheW91dCB3aGVyZTpcblx0XHQgKiBcblx0XHQgKiByb3dzW11bMV0gPSBjb2wgbGVmdFxuXHRcdCAqIHJvd3NbXVsyXSA9IGNvbCByaWdodFxuXHRcdCAqIFxuXHRcdCAqIFdoZXJlIGEgbGF5b3V0IGhhdmUgYXQgbGVhc3Qgb24gcm93IHdoaWNoIGNhbiBoYXZlIGNvbHMgaW5zaWRlLiBTbyB0aGVyZSByZXZQbGFjZWhvbGRlcnMgbWV0aG9kIGdvZXMgdHJvdWdoIHRoZSBjb2xzXG5cdFx0ICogYW5kIGNoZWNrIGlmIHRoZSBjb2wgaXMgZXF1YWwgdGhlIGdpdmVuIGNvbCB0byByZXBsYWNlIHRoZSBjb250ZW50IHdpdGggIChmcm9tIHJlZnJlc2hOZXN0ZWQgbWV0aG9kKS5cblx0XHQgKi9cblx0XHQkc2NvcGUucmV2UGxhY2Vob2xkZXJzID0gZnVuY3Rpb24ocGxhY2Vob2xkZXJzLCBwcmV2SWQsIHBsYWNlaG9sZGVyVmFyLCByZXBsYWNlQ29udGVudCkge1xuXHRcdFx0YW5ndWxhci5mb3JFYWNoKHBsYWNlaG9sZGVycywgZnVuY3Rpb24ocGxhY2Vob2xkZXJSb3csIHBsYWNlaG9sZGVyS2V5KSB7XG5cdFx0XHRcdGlmIChwYXJzZUludChwcmV2SWQpID09IHBhcnNlSW50KHBsYWNlaG9sZGVyUm93LnByZXZfaWQpICYmIHBsYWNlaG9sZGVyVmFyID09IHBsYWNlaG9sZGVyUm93Wyd2YXInXSkge1xuXHRcdFx0XHRcdHBsYWNlaG9sZGVyc1twbGFjZWhvbGRlcktleV1bJ19fbmF2X2l0ZW1fcGFnZV9ibG9ja19pdGVtcyddID0gcmVwbGFjZUNvbnRlbnQ7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0JHNjb3BlLnJldkZpbmQocGxhY2Vob2xkZXJSb3csIHByZXZJZCwgcGxhY2Vob2xkZXJWYXIsIHJlcGxhY2VDb250ZW50KTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fTtcblx0XHRcblx0XHQvKipcblx0XHQgKiBUaGUgcmV2RmluZCBtZXRob2QgZG9lcyB0aGUgcmVjdXJzaXYgam9iIHdpdGhpbiBhIGJsb2NrIGFuIHBhc3NlcyB0aGUgdmFsdWUgYmFjayB0byByZXZQbGFjZWhvbGRlcnMoKS5cblx0XHQgKi9cblx0XHQkc2NvcGUucmV2RmluZCA9IGZ1bmN0aW9uKHBsYWNlaG9sZGVyLCBwcmV2SWQsIHBsYWNlaG9sZGVyVmFyLCByZXBsYWNlQ29udGVudCkge1xuXHRcdFx0Zm9yICh2YXIgaSBpbiBwbGFjZWhvbGRlclsnX19uYXZfaXRlbV9wYWdlX2Jsb2NrX2l0ZW1zJ10pIHtcblx0XHRcdFx0Zm9yICh2YXIgaG9sZGVyS2V5IGluIHBsYWNlaG9sZGVyWydfX25hdl9pdGVtX3BhZ2VfYmxvY2tfaXRlbXMnXVtpXVsnX19wbGFjZWhvbGRlcnMnXSkge1xuXHRcdFx0XHRcdGZvciAodmFyIGhvbGRlciBpbiBwbGFjZWhvbGRlclsnX19uYXZfaXRlbV9wYWdlX2Jsb2NrX2l0ZW1zJ11baV1bJ19fcGxhY2Vob2xkZXJzJ11baG9sZGVyS2V5XSkge1xuXHRcdFx0XHRcdFx0JHNjb3BlLnJldlBsYWNlaG9sZGVycyhwbGFjZWhvbGRlclsnX19uYXZfaXRlbV9wYWdlX2Jsb2NrX2l0ZW1zJ11baV1bJ19fcGxhY2Vob2xkZXJzJ11baG9sZGVyS2V5XSwgcHJldklkLCBwbGFjZWhvbGRlclZhciwgcmVwbGFjZUNvbnRlbnQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdFx0XG5cdFx0LyoqXG5cdFx0ICogZHJvcHMgaXRlbXMgaW4gYW4gZW1wdHkgcGFnZSBwbGFjZWhvbGRlciBvZiBDTVMgTEFZT1VUIFBMQUNFSE9MREVSXG5cdFx0ICovXG5cdFx0JHNjb3BlLmRyb3BJdGVtUGxhY2Vob2xkZXIgPSBmdW5jdGlvbihkcmFnZ2VkLGRyb3BwZWQscG9zaXRpb24pIHtcblx0XHRcdGlmIChkcmFnZ2VkLmhhc093blByb3BlcnR5KCdmYXZvcml6ZWQnKSB8fCBkcmFnZ2VkLmhhc093blByb3BlcnR5KCduZXdibG9jaycpKSB7XG5cdFx0XHRcdC8vIGl0cyBhIG5ldyBibG9ja1xuXHRcdFx0XHQkaHR0cC5wb3N0KCdhZG1pbi9hcGktY21zLW5hdml0ZW1wYWdlYmxvY2tpdGVtL2NyZWF0ZScsIHtcblx0XHRcdFx0XHRwcmV2X2lkOiBkcm9wcGVkLnByZXZfaWQsIFxuXHRcdFx0XHRcdHNvcnRfaW5kZXg6MCwgXG5cdFx0XHRcdFx0YmxvY2tfaWQ6IGRyYWdnZWQuaWQsIFxuXHRcdFx0XHRcdHBsYWNlaG9sZGVyX3ZhciA6IGRyb3BwZWRbJ3ZhciddLCBcblx0XHRcdFx0XHRuYXZfaXRlbV9wYWdlX2lkOiBkcm9wcGVkLm5hdl9pdGVtX3BhZ2VfaWRcblx0XHRcdFx0fSkudGhlbihmdW5jdGlvbihyZXNwb25zZSkge1xuXHRcdFx0XHRcdCRzY29wZS5yZWZyZXNoTmVzdGVkKGRyb3BwZWRbJ3ByZXZfaWQnXSwgZHJvcHBlZFsndmFyJ10pO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSBpZiAoZHJhZ2dlZC5oYXNPd25Qcm9wZXJ0eSgnY29weXN0YWNrJykpIHtcblx0XHRcdFx0Ly8gaXRzIGEgYmxvY2sgZnJvbSBjb3B5IHN0YWNrXG5cdFx0XHRcdCRodHRwLnBvc3QoJ2FkbWluL2FwaS1jbXMtbmF2aXRlbWJsb2NrL2NvcHktYmxvY2stZnJvbS1zdGFjaycsIHtcblx0XHRcdFx0XHRjb3B5QmxvY2tJZDogZHJhZ2dlZC5pZCxcblx0XHRcdFx0XHRzb3J0X2luZGV4OiAwLFxuXHRcdFx0XHRcdHByZXZfaWQ6ICBkcm9wcGVkLnByZXZfaWQsXG5cdFx0XHRcdFx0cGxhY2Vob2xkZXJfdmFyIDogZHJvcHBlZFsndmFyJ10sIFxuXHRcdFx0XHRcdG5hdl9pdGVtX3BhZ2VfaWQ6IGRyb3BwZWQubmF2X2l0ZW1fcGFnZV9pZFxuXHRcdFx0XHR9KS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG5cdFx0XHRcdFx0JHNjb3BlLnJlZnJlc2hOZXN0ZWQoZHJvcHBlZFsncHJldl9pZCddLCBkcm9wcGVkWyd2YXInXSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gbW92aW5nIGFuIGV4aXN0aW5nIGJsb2NrXG5cdFx0XHRcdCRodHRwLnB1dCgnYWRtaW4vYXBpLWNtcy1uYXZpdGVtcGFnZWJsb2NraXRlbS91cGRhdGU/aWQ9JyArIGRyYWdnZWQuaWQsIHtcblx0XHRcdFx0XHRzb3J0X2luZGV4OiAwLFxuXHRcdFx0XHRcdHByZXZfaWQ6ICBkcm9wcGVkLnByZXZfaWQsXG5cdFx0XHRcdFx0cGxhY2Vob2xkZXJfdmFyIDogZHJvcHBlZFsndmFyJ10sIFxuXHRcdFx0XHR9KS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG5cdFx0XHRcdFx0JHNjb3BlLnJlZnJlc2hGb3JjZSgpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdFxuXHRcdH07XG5cdFx0XG5cdFx0JHNjb3BlLnJlZnJlc2goKTtcblx0fV0pO1xuXG5cdC8qKlxuXHQgKiBAcGFyYW0gJHNjb3BlLmJsb2NrIEZyb20gbmctcmVwZWF0IHNjb3BlIGFzc2lnbm1lbnRcblx0ICovXG5cdHphYS5jb250cm9sbGVyKFwiUGFnZUJsb2NrRWRpdENvbnRyb2xsZXJcIiwgW1xuXHRcdCckc2NvcGUnLCAnJHNjZScsICckaHR0cCcsICdBZG1pbkNsYXNzU2VydmljZScsICdBZG1pblRvYXN0U2VydmljZScsICdTZXJ2aWNlQmxvY2tDb3B5U3RhY2snLCAnU2VydmljZUxpdmVFZGl0TW9kZScsXG5cdFx0ZnVuY3Rpb24oJHNjb3BlLCAkc2NlLCAkaHR0cCwgQWRtaW5DbGFzc1NlcnZpY2UsIEFkbWluVG9hc3RTZXJ2aWNlLCBTZXJ2aWNlQmxvY2tDb3B5U3RhY2ssIFNlcnZpY2VMaXZlRWRpdE1vZGUpIHtcblxuXHRcdCRzY29wZS5OYXZJdGVtVHlwZVBhZ2VDb250cm9sbGVyID0gJHNjb3BlLiRwYXJlbnQ7XG5cblx0XHQvKipcblx0XHQgKiBkcm9wcyBhbiBpdGVtIGluIGFuIGVtcHR5IHBsYWNlaG9sZGVyIG9mIGEgQkxPQ0tcblx0XHQgKi9cblx0XHQkc2NvcGUuZHJvcEl0ZW1QbGFjZWhvbGRlciA9IGZ1bmN0aW9uKGRyYWdnZWQsZHJvcHBlZCxwb3NpdGlvbikge1xuXHRcdFx0aWYgKGRyYWdnZWQuaGFzT3duUHJvcGVydHkoJ2Zhdm9yaXplZCcpIHx8IGRyYWdnZWQuaGFzT3duUHJvcGVydHkoJ25ld2Jsb2NrJykpIHtcblx0XHRcdFx0Ly8gaXRzIGEgbmV3IGJsb2NrXG5cdFx0XHRcdCRodHRwLnBvc3QoJ2FkbWluL2FwaS1jbXMtbmF2aXRlbXBhZ2VibG9ja2l0ZW0vY3JlYXRlJywge1xuXHRcdFx0XHRcdHByZXZfaWQgOiBkcm9wcGVkLnByZXZfaWQsXG5cdFx0XHRcdFx0c29ydF9pbmRleDowLCBcblx0XHRcdFx0XHRibG9ja19pZCA6IGRyYWdnZWQuaWQsXG5cdFx0XHRcdFx0cGxhY2Vob2xkZXJfdmFyIDogZHJvcHBlZC52YXIsXG5cdFx0XHRcdFx0bmF2X2l0ZW1fcGFnZV9pZCA6IGRyb3BwZWQubmF2X2l0ZW1fcGFnZV9pZFxuXHRcdFx0XHR9KS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG5cdFx0XHRcdFx0JHNjb3BlLk5hdkl0ZW1UeXBlUGFnZUNvbnRyb2xsZXIucmVmcmVzaE5lc3RlZChkcm9wcGVkLnByZXZfaWQsIGRyb3BwZWQudmFyKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2UgaWYgKGRyYWdnZWQuaGFzT3duUHJvcGVydHkoJ2NvcHlzdGFjaycpKSB7XG5cdFx0XHRcdC8vIGl0cyBhIGJsb2NrIGZyb20gY29weSBzdGFja1xuXHRcdFx0XHQkaHR0cC5wb3N0KCdhZG1pbi9hcGktY21zLW5hdml0ZW1ibG9jay9jb3B5LWJsb2NrLWZyb20tc3RhY2snLCB7XG5cdFx0XHRcdFx0Y29weUJsb2NrSWQ6IGRyYWdnZWQuaWQsXG5cdFx0XHRcdFx0c29ydF9pbmRleDogMCxcblx0XHRcdFx0XHRwcmV2X2lkOiAgZHJvcHBlZC5wcmV2X2lkLFxuXHRcdFx0XHRcdHBsYWNlaG9sZGVyX3ZhciA6IGRyb3BwZWQudmFyLFxuXHRcdFx0XHRcdG5hdl9pdGVtX3BhZ2VfaWQgOiBkcm9wcGVkLm5hdl9pdGVtX3BhZ2VfaWRcblx0XHRcdFx0fSkudGhlbihmdW5jdGlvbihyZXNwb25zZSkge1xuXHRcdFx0XHRcdCRzY29wZS5OYXZJdGVtVHlwZVBhZ2VDb250cm9sbGVyLnJlZnJlc2hOZXN0ZWQoJHNjb3BlLnBsYWNlaG9sZGVyLnByZXZfaWQsICRzY29wZS5wbGFjZWhvbGRlci52YXIpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vIG1vdmluZyBhbiBleGlzdGluZyBibG9ja1xuXHRcdFx0XHQkaHR0cC5wdXQoJ2FkbWluL2FwaS1jbXMtbmF2aXRlbXBhZ2VibG9ja2l0ZW0vdXBkYXRlP2lkPScgKyBkcmFnZ2VkLmlkLCB7XG5cdFx0XHRcdFx0c29ydF9pbmRleDogMCxcblx0XHRcdFx0XHRwcmV2X2lkOiAgZHJvcHBlZC5wcmV2X2lkLFxuXHRcdFx0XHRcdHBsYWNlaG9sZGVyX3ZhciA6IGRyb3BwZWQudmFyLFxuXHRcdFx0XHR9KS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG5cdFx0XHRcdFx0JHNjb3BlLnJlZnJlc2hGb3JjZSgpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdFxuXHRcdC8qKlxuXHRcdCAqIERyb3BzIGEgYmxvY2sgYWJvdmUvYmVsb3cgYW4gRVhJU1RJTkcgQkxPQ0tcblx0XHQgKi9cblx0XHQkc2NvcGUuZHJvcEl0ZW0gPSBmdW5jdGlvbihkcmFnZ2VkLGRyb3BwZWQscG9zaXRpb24sZWxlbWVudCkge1xuXHRcdFx0dmFyIHNvcnRJbmRleCA9ICRzY29wZS4kaW5kZXg7XG5cdFx0XHRcblx0XHRcdGlmIChwb3NpdGlvbiA9PSAnYm90dG9tJykge1xuXHRcdFx0XHRzb3J0SW5kZXggPSBzb3J0SW5kZXggKyAxO1xuXHRcdFx0fVxuXHRcdFx0XG5cdFx0XHRpZiAoZHJhZ2dlZC5oYXNPd25Qcm9wZXJ0eSgnZmF2b3JpemVkJykgfHwgZHJhZ2dlZC5oYXNPd25Qcm9wZXJ0eSgnbmV3YmxvY2snKSkge1xuXHRcdFx0XHQvLyBpdHMgYSBuZXcgYmxvY2tcblx0XHRcdFx0JGh0dHAucG9zdCgnYWRtaW4vYXBpLWNtcy1uYXZpdGVtcGFnZWJsb2NraXRlbS9jcmVhdGUnLCB7IFxuXHRcdFx0XHRcdHByZXZfaWQ6ICRzY29wZS5wbGFjZWhvbGRlci5wcmV2X2lkLFxuXHRcdFx0XHRcdHNvcnRfaW5kZXg6IHNvcnRJbmRleCwgXG5cdFx0XHRcdFx0YmxvY2tfaWQ6IGRyYWdnZWQuaWQsIFxuXHRcdFx0XHRcdHBsYWNlaG9sZGVyX3ZhcjogJHNjb3BlLnBsYWNlaG9sZGVyWyd2YXInXSwgXG5cdFx0XHRcdFx0bmF2X2l0ZW1fcGFnZV9pZDogJHNjb3BlLnBsYWNlaG9sZGVyLm5hdl9pdGVtX3BhZ2VfaWRcblx0XHRcdFx0fSkudGhlbihmdW5jdGlvbihyZXNwb25zZSkge1xuXHRcdFx0XHRcdCRzY29wZS5OYXZJdGVtVHlwZVBhZ2VDb250cm9sbGVyLnJlZnJlc2hOZXN0ZWQoJHNjb3BlLnBsYWNlaG9sZGVyLnByZXZfaWQsICRzY29wZS5wbGFjZWhvbGRlci52YXIpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSBpZiAoZHJhZ2dlZC5oYXNPd25Qcm9wZXJ0eSgnY29weXN0YWNrJykpIHtcblx0XHRcdFx0Ly8gaXRzIGEgYmxvY2sgZnJvbSBjb3B5IHN0YWNrXG5cdFx0XHRcdCRodHRwLnBvc3QoJ2FkbWluL2FwaS1jbXMtbmF2aXRlbWJsb2NrL2NvcHktYmxvY2stZnJvbS1zdGFjaycsIHtcblx0XHRcdFx0XHRjb3B5QmxvY2tJZDogZHJhZ2dlZC5pZCxcblx0XHRcdFx0XHRzb3J0X2luZGV4OiBzb3J0SW5kZXgsXG5cdFx0XHRcdFx0cHJldl9pZDogJHNjb3BlLnBsYWNlaG9sZGVyLnByZXZfaWQsXG5cdFx0XHRcdFx0cGxhY2Vob2xkZXJfdmFyOiAkc2NvcGUucGxhY2Vob2xkZXJbJ3ZhciddLFxuXHRcdFx0XHRcdG5hdl9pdGVtX3BhZ2VfaWQ6ICRzY29wZS5wbGFjZWhvbGRlci5uYXZfaXRlbV9wYWdlX2lkXG5cdFx0XHRcdH0pLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcblx0XHRcdFx0XHQkc2NvcGUuTmF2SXRlbVR5cGVQYWdlQ29udHJvbGxlci5yZWZyZXNoTmVzdGVkKCRzY29wZS5wbGFjZWhvbGRlci5wcmV2X2lkLCAkc2NvcGUucGxhY2Vob2xkZXIudmFyKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBtb3ZpbmcgYW4gZXhpc3RpbmcgYmxvY2tcblx0XHRcdFx0JGh0dHAucHV0KCdhZG1pbi9hcGktY21zLW5hdml0ZW1wYWdlYmxvY2tpdGVtL3VwZGF0ZT9pZD0nICsgZHJhZ2dlZC5pZCwge1xuXHRcdFx0XHRcdHByZXZfaWQ6ICRzY29wZS5wbGFjZWhvbGRlci5wcmV2X2lkLFxuXHRcdFx0XHRcdHBsYWNlaG9sZGVyX3ZhcjogJHNjb3BlLnBsYWNlaG9sZGVyWyd2YXInXSxcblx0XHRcdFx0XHRzb3J0X2luZGV4OiBzb3J0SW5kZXhcblx0XHRcdFx0fSkudGhlbihmdW5jdGlvbihyZXNwb25zZSkge1xuXHRcdFx0XHRcdC8qXG5cdFx0XHRcdFx0ICogQGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vbHV5YWRldi9sdXlhL2lzc3Vlcy8xNjI5XG5cdFx0XHRcdFx0ICogVGhlIG1vdmVkIGJsb2NrLCBzaG91bGQgcmVtb3ZlZCBmcm9tIHRoZSBwcmV2aW91cyBhcnJheS4gVGhpcyBpcyBvbmx5IHRoZSBjYXNlIHdoZW4gZHJhZ2dpbmcgZnJvbSBhbiBPVVRFUiBibG9jayBpbnRvIGFuIElOTkVSIGJsb2NrXG5cdFx0XHRcdFx0ICogaXMgdGhpcyB3aWxsIG5vdCByZWZyZXNoIHRoZSBPVVRFUiBibG9jaywgYnV0IGFsd2F5cyB3aWxsIGluIHRoZSBvcHBvc2l0ZSB3YXkuXG5cdFx0XHRcdFx0ICovXG5cdFx0XHRcdFx0YW5ndWxhci5lbGVtZW50KGVsZW1lbnQpLnJlbW92ZSgpO1xuXHRcdFx0XHRcdC8vIGFzIHRoZSBibG9jayBoYXMgYmVlbiByZW1vdmVkIGZyb20gZXhpc3RpbmcsIHJlZnJlc2ggdGhlIG5ldyBwbGFjZWhvbGRlci5cblx0XHRcdFx0XHQkc2NvcGUuTmF2SXRlbVR5cGVQYWdlQ29udHJvbGxlci5yZWZyZXNoTmVzdGVkKCRzY29wZS5wbGFjZWhvbGRlci5wcmV2X2lkLCAkc2NvcGUucGxhY2Vob2xkZXIudmFyKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRcblx0XHQkc2NvcGUuY29weUJsb2NrID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRTZXJ2aWNlQmxvY2tDb3B5U3RhY2sucHVzaCgkc2NvcGUuYmxvY2spO1xuXHRcdH07XG5cblx0XHQkc2NvcGUudG9nZ2xlSGlkZGVuID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoJHNjb3BlLmJsb2NrLmlzX2hpZGRlbiA9PSAwKSB7XG5cdFx0XHRcdCRzY29wZS5ibG9jay5pc19oaWRkZW4gPSAxO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0JHNjb3BlLmJsb2NrLmlzX2hpZGRlbiA9IDA7XG5cdFx0XHR9XG5cblx0XHRcdCRodHRwKHtcblx0XHRcdCAgICB1cmw6ICdhZG1pbi9hcGktY21zLW5hdml0ZW0vdG9nZ2xlLWJsb2NrLWhpZGRlbicsXG5cdFx0XHQgICAgbWV0aG9kOiBcIkdFVFwiLFxuXHRcdFx0ICAgIHBhcmFtczogeyBibG9ja0lkIDogJHNjb3BlLmJsb2NrLmlkLCBoaWRkZW5TdGF0ZTogJHNjb3BlLmJsb2NrLmlzX2hpZGRlbiB9XG5cdFx0XHR9KS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG5cdFx0XHRcdC8qIGxvYWQgbGl2ZSB1cmwgb24gaGlkZGVuIHRyaWdnZXIgKi9cblx0XHRcdFx0JHNjb3BlLk5hdkl0ZW1UeXBlUGFnZUNvbnRyb2xsZXIuJHBhcmVudC4kcGFyZW50LmxvYWRMaXZlVXJsKCk7XG5cdFx0XHRcdC8vIHN1Y2Nlc3NmdWxsIHRvZ2dsZSBoaWRkZW4gc3RhdGUgb2YgYmxvY2tcblx0XHRcdFx0QWRtaW5Ub2FzdFNlcnZpY2UuaW5mbyhpMThuUGFyYW0oJ2pzX3BhZ2VfYmxvY2tfdmlzYmlsaXR5X2NoYW5nZScsIHtuYW1lOiAkc2NvcGUuYmxvY2submFtZX0pKTtcblx0XHRcdH0pO1xuXHRcdH07XG5cbiAgICAgICAgJHNjb3BlLmlzRWRpdGFibGUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgJHNjb3BlLmJsb2NrLnZhcnMgIT0gXCJ1bmRlZmluZWRcIiAmJiAkc2NvcGUuYmxvY2sudmFycy5sZW5ndGggPiAwO1xuICAgICAgICB9O1xuXG4gICAgICAgICRzY29wZS5pc0NvbmZpZ3VyYWJsZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiAkc2NvcGUuYmxvY2suY2ZncyAhPSBcInVuZGVmaW5lZFwiICYmICRzY29wZS5ibG9jay5jZmdzLmxlbmd0aCA+IDA7XG4gICAgICAgIH07XG5cdFx0XG5cdFx0XG5cdFx0JHNjb3BlLiR3YXRjaChmdW5jdGlvbigpIHsgcmV0dXJuICRzY29wZS5ibG9jay52YWx1ZXMgfSwgZnVuY3Rpb24obiwgbykge1xuXHRcdFx0JHNjb3BlLmRhdGEgPSBuO1xuXHRcdH0pO1xuXG5cdFx0JHNjb3BlLiR3YXRjaChmdW5jdGlvbigpIHsgcmV0dXJuICRzY29wZS5ibG9jay52YXJpYXRpb24gfSwgZnVuY3Rpb24obiwgbykge1xuXHRcdFx0JHNjb3BlLmV2YWxWYXJpYXRpb25WaXNiaWxpdHkobik7XG5cdFx0fSk7XG5cdFx0XG5cdFx0JHNjb3BlLmdldEluZm8gPSBmdW5jdGlvbih2YXJGaWVsZE5hbWUpIHtcblx0XHRcdGlmICgkc2NvcGUuYmxvY2suZmllbGRfaGVscC5oYXNPd25Qcm9wZXJ0eSh2YXJGaWVsZE5hbWUpKSB7XG5cdFx0XHRcdHJldHVybiAkc2NvcGUuYmxvY2suZmllbGRfaGVscFt2YXJGaWVsZE5hbWVdO1xuXHRcdFx0fVxuXHRcdFx0XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0JHNjb3BlLmV2YWxWYXJpYXRpb25WaXNiaWxpdHkgPSBmdW5jdGlvbih2YXJpYXRlbk5hbWUpIHtcblx0XHRcdGlmICgkc2NvcGUuYmxvY2sudmFyaWF0aW9ucy5oYXNPd25Qcm9wZXJ0eSh2YXJpYXRlbk5hbWUpKSB7XG5cdFx0XHRcdHZhciB2YXJpYXRpb24gPSAkc2NvcGUuYmxvY2sudmFyaWF0aW9uc1skc2NvcGUuYmxvY2sudmFyaWF0aW9uXTtcblx0XHRcdFx0YW5ndWxhci5mb3JFYWNoKHZhcmlhdGlvbiwgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuXHRcdFx0XHRcdGlmIChhbmd1bGFyLmlzT2JqZWN0KHZhbHVlKSkge1xuXHRcdFx0XHRcdFx0YW5ndWxhci5mb3JFYWNoKHZhbHVlLCBmdW5jdGlvbih2LCBrKSB7XG5cdFx0XHRcdFx0XHRcdGFuZ3VsYXIuZm9yRWFjaCgkc2NvcGUuYmxvY2tba2V5XSwgZnVuY3Rpb24ob2JqZWN0KSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGsgPT0gb2JqZWN0LnZhcikge1xuXHRcdFx0XHRcdFx0XHRcdFx0b2JqZWN0LmludmlzaWJsZSA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGFuZ3VsYXIuZm9yRWFjaCgkc2NvcGUuYmxvY2suY2ZncywgZnVuY3Rpb24ob2JqZWN0KSB7XG5cdFx0XHRcdFx0b2JqZWN0LmludmlzaWJsZSA9IGZhbHNlO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0YW5ndWxhci5mb3JFYWNoKCRzY29wZS5ibG9jay52YXJzLCBmdW5jdGlvbihvYmplY3QpIHtcblx0XHRcdFx0XHRvYmplY3QuaW52aXNpYmxlID0gZmFsc2U7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQkc2NvcGUuY2ZnZGF0YSA9ICRzY29wZS5ibG9jay5jZmd2YWx1ZXMgfHwge307XG5cblx0XHQkc2NvcGUuZWRpdCA9IGZhbHNlO1xuXHRcdFxuXHRcdCRzY29wZS5tb2RhbEhpZGRlbiA9IHRydWU7XG5cblx0XHQkc2NvcGUubW9kYWxNb2RlID0gMTtcblxuXHRcdCRzY29wZS5pbml0TW9kYWxNb2RlID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoJHNjb3BlLmJsb2NrLnZhcnMubGVuZ3RoICA9PSAwKSB7XG5cdFx0XHRcdCRzY29wZS5tb2RhbE1vZGUgPSAyO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQkc2NvcGUudG9nZ2xlRWRpdCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCRzY29wZS5pc0VkaXRhYmxlKCkgfHwgJHNjb3BlLmlzQ29uZmlndXJhYmxlKCkpIHtcblx0XHRcdFx0JHNjb3BlLm1vZGFsSGlkZGVuID0gISRzY29wZS5tb2RhbEhpZGRlbjtcblx0XHRcdFx0JHNjb3BlLmVkaXQgPSAhJHNjb3BlLmVkaXQ7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdCRzY29wZS5yZW5kZXJUZW1wbGF0ZSA9IGZ1bmN0aW9uKHRlbXBsYXRlLCBkYXRhVmFycywgY2ZnVmFycywgYmxvY2ssIGV4dHJhcykge1xuXHRcdFx0aWYgKHRlbXBsYXRlID09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyZXR1cm4gJyc7XG5cdFx0XHR9XG5cdFx0XHR2YXIgdGVtcGxhdGUgPSBUd2lnLnR3aWcoe1xuXHRcdFx0ICAgIGRhdGE6IHRlbXBsYXRlXG5cdFx0XHR9KTtcblxuXHRcdFx0dmFyIGNvbnRlbnQgPSB0ZW1wbGF0ZS5yZW5kZXIoe1xuXHRcdFx0XHR2YXJzIDogZGF0YVZhcnMsXG5cdFx0XHRcdGNmZ3MgOiBjZmdWYXJzLFxuXHRcdFx0XHRibG9jayA6IGJsb2NrLFxuXHRcdFx0XHRleHRyYXMgOiBleHRyYXNcblx0XHRcdH0pO1xuXG5cdFx0XHRyZXR1cm4gJHNjZS50cnVzdEFzSHRtbChjb250ZW50KTtcblx0XHR9O1xuXG5cdFx0JHNjb3BlLnJlbW92ZUJsb2NrID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRBZG1pblRvYXN0U2VydmljZS5jb25maXJtKGkxOG5QYXJhbSgnanNfcGFnZV9ibG9ja19kZWxldGVfY29uZmlybScsIHtuYW1lOiAkc2NvcGUuYmxvY2submFtZX0pLCBpMThuWyd2aWV3X3VwZGF0ZV9ibG9ja190b29sdGlwX2RlbGV0ZSddLCBbJyR0b2FzdCcsIGZ1bmN0aW9uKCR0b2FzdCkge1xuXHRcdFx0XHQkaHR0cC5kZWxldGUoJ2FkbWluL2FwaS1jbXMtbmF2aXRlbXBhZ2VibG9ja2l0ZW0vZGVsZXRlP2lkPScgKyAkc2NvcGUuYmxvY2suaWQpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcblx0XHRcdFx0XHQkc2NvcGUuTmF2SXRlbVR5cGVQYWdlQ29udHJvbGxlci5yZWZyZXNoTmVzdGVkKCRzY29wZS5wbGFjZWhvbGRlci5wcmV2X2lkLCAkc2NvcGUucGxhY2Vob2xkZXIudmFyKTtcblx0XHRcdFx0XHQkc2NvcGUuTmF2SXRlbVR5cGVQYWdlQ29udHJvbGxlci5sb2FkTGl2ZVVybCgpO1xuXHRcdFx0XHRcdCR0b2FzdC5jbG9zZSgpO1xuXHRcdFx0XHRcdEFkbWluVG9hc3RTZXJ2aWNlLnN1Y2Nlc3MoaTE4blBhcmFtKCdqc19wYWdlX2Jsb2NrX3JlbW92ZV9vaycsIHtuYW1lOiAkc2NvcGUuYmxvY2submFtZX0pKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XSk7XG5cdFx0fTtcblxuXHRcdCRzY29wZS5pc0FueVJlcXVpcmVkQXR0cmlidXRlRW1wdHkgPSAgZnVuY3Rpb24oKSB7XG5cblx0XHRcdHZhciByZXNwb25zZSA9IGZhbHNlO1xuXHRcdFx0YW5ndWxhci5mb3JFYWNoKCRzY29wZS5ibG9jay52YXJzLCBmdW5jdGlvbih2YXJJdGVtKSB7XG5cdFx0XHRcdGlmICh2YXJJdGVtLnJlcXVpcmVkICYmICRzY29wZS5pc0VtcHR5KCRzY29wZS5kYXRhLCB2YXJJdGVtLnZhcikpIHtcblx0XHRcdFx0XHRBZG1pblRvYXN0U2VydmljZS5lcnJvcihpMThuUGFyYW0oJ2pzX2Jsb2NrX2F0dHJpYnV0ZV9lbXB0eScsIHtsYWJlbDogdmFySXRlbS5sYWJlbH0pKTtcblx0XHRcdFx0XHRyZXNwb25zZSA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRhbmd1bGFyLmZvckVhY2goJHNjb3BlLmJsb2NrLmNmZ3MsIGZ1bmN0aW9uKHZhckl0ZW0pIHtcblxuXHRcdFx0XHRpZiAodmFySXRlbS5yZXF1aXJlZCAmJiAkc2NvcGUuaXNFbXB0eSgkc2NvcGUuY2ZnZGF0YSwgdmFySXRlbS52YXIpKSB7XG5cdFx0XHRcdFx0QWRtaW5Ub2FzdFNlcnZpY2UuZXJyb3IoaTE4blBhcmFtKCdqc19ibG9ja19hdHRyaWJ1dGVfZW1wdHknLCB7bGFiZWw6IHZhckl0ZW0ubGFiZWx9KSk7XG5cdFx0XHRcdFx0cmVzcG9uc2UgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0cmV0dXJuIHJlc3BvbnNlO1xuXHRcdH07XG5cblx0XHQkc2NvcGUuaXNFbXB0eSA9IGZ1bmN0aW9uKHZhbHVlcywga2V5KSB7XG5cdFx0XHRpZiAodmFsdWVzLmhhc093blByb3BlcnR5KGtleSkgJiYgdmFsdWVzW2tleV0pIHtcblx0XHRcdFx0aWYgKHZhbHVlc1trZXldLmxlbmd0aCA9PSAwKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fTtcblxuXHRcdCRzY29wZS5zYXZlID0gZnVuY3Rpb24oY2xvc2UpIHtcblx0XHRcdGlmICgkc2NvcGUuaXNBbnlSZXF1aXJlZEF0dHJpYnV0ZUVtcHR5KCkpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0JGh0dHAucHV0KCdhZG1pbi9hcGktY21zLW5hdml0ZW1wYWdlYmxvY2tpdGVtL3VwZGF0ZT9pZD0nICsgJHNjb3BlLmJsb2NrLmlkLCB7XG5cdFx0XHRcdGpzb25fY29uZmlnX3ZhbHVlczogJHNjb3BlLmRhdGEsXG5cdFx0XHRcdGpzb25fY29uZmlnX2NmZ192YWx1ZXM6ICRzY29wZS5jZmdkYXRhLFxuXHRcdFx0XHR2YXJpYXRpb246ICRzY29wZS5ibG9jay52YXJpYXRpb25cblx0XHRcdH0pLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcblx0XHRcdFx0QWRtaW5Ub2FzdFNlcnZpY2Uuc3VjY2VzcyhpMThuUGFyYW0oJ2pzX3BhZ2VfYmxvY2tfdXBkYXRlX29rJywge25hbWU6ICRzY29wZS5ibG9jay5uYW1lfSkpO1xuXHRcdFx0XHRpZiAoY2xvc2UpIHtcblx0XHRcdFx0XHQkc2NvcGUudG9nZ2xlRWRpdCgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdCRzY29wZS5ibG9jay5pc19kaXJ0eSA9IDE7XG5cdFx0XHRcdCRzY29wZS5ibG9jayA9IGFuZ3VsYXIuY29weShyZXNwb25zZS5kYXRhLm9iamVjdGRldGFpbCk7XG5cdFx0XHRcdCRzY29wZS5OYXZJdGVtVHlwZVBhZ2VDb250cm9sbGVyLmxvYWRMaXZlVXJsKCk7XG5cdFx0XHRcdCRzY29wZS5ldmFsVmFyaWF0aW9uVmlzYmlsaXR5KCRzY29wZS5ibG9jay52YXJpYXRpb24pO1xuXHRcdFx0fSk7XG5cdFx0fTtcblx0fV0pO1xuXG5cdHphYS5jb250cm9sbGVyKFwiRHJvcHBhYmxlQmxvY2tzQ29udHJvbGxlclwiLCBbJyRzY29wZScsICckaHR0cCcsICdBZG1pbkNsYXNzU2VydmljZScsICdTZXJ2aWNlQmxvY2tzRGF0YScsICdTZXJ2aWNlQmxvY2tDb3B5U3RhY2snLCBmdW5jdGlvbigkc2NvcGUsICRodHRwLCBBZG1pbkNsYXNzU2VydmljZSwgU2VydmljZUJsb2Nrc0RhdGEsIFNlcnZpY2VCbG9ja0NvcHlTdGFjaykge1xuXG5cdFx0Lyogc2VydmljZSBTZXJ2aWNlQmxvY2tzRGF0YSBpbmhlcml0YW5jZSAqL1xuXG5cdFx0JHNjb3BlLmJsb2Nrc0RhdGEgPSBTZXJ2aWNlQmxvY2tzRGF0YS5kYXRhO1xuXG5cdFx0JHNjb3BlLmJsb2Nrc0RhdGFSZXN0b3JlID0gYW5ndWxhci5jb3B5KCRzY29wZS5ibG9ja3NEYXRhKTtcblxuXHRcdCRzY29wZS4kb24oJ3NlcnZpY2U6QmxvY2tzRGF0YScsIGZ1bmN0aW9uKGV2ZW50LCBkYXRhKSB7XG5cdFx0XHQkc2NvcGUuYmxvY2tzRGF0YSA9IGRhdGE7XG5cdFx0fSk7XG5cblx0XHQkc2NvcGUuYmxvY2tzRGF0YVJlbG9hZCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIFNlcnZpY2VCbG9ja3NEYXRhLmxvYWQodHJ1ZSk7XG5cdFx0fVxuXG5cdFx0JHNjb3BlLmFkZFRvRmF2ID0gZnVuY3Rpb24oaXRlbSkge1xuXHRcdFx0JGh0dHAucG9zdCgnYWRtaW4vYXBpLWNtcy1ibG9jay90by1mYXYnLCB7YmxvY2s6IGl0ZW0gfSkudGhlbihmdW5jdGlvbihyZXNwb25zZSkge1xuXHRcdFx0XHQkc2NvcGUuYmxvY2tzRGF0YVJlbG9hZCgpO1xuXHRcdFx0fSk7XG5cdFx0fTtcblxuXHRcdCRzY29wZS5yZW1vdmVGcm9tRmF2ID0gZnVuY3Rpb24oaXRlbSkge1xuXHRcdFx0JGh0dHAucG9zdCgnYWRtaW4vYXBpLWNtcy1ibG9jay9yZW1vdmUtZmF2Jywge2Jsb2NrOiBpdGVtIH0pLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcblx0XHRcdFx0JHNjb3BlLmJsb2Nrc0RhdGFSZWxvYWQoKTtcblx0XHRcdH0pO1xuXHRcdH07XG5cblx0XHQkc2NvcGUudG9nZ2xlR3JvdXAgPSBmdW5jdGlvbihncm91cCkge1xuXHRcdFx0aWYgKGdyb3VwLnRvZ2dsZV9vcGVuID09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRncm91cC50b2dnbGVfb3BlbiA9IDE7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRncm91cC50b2dnbGVfb3BlbiA9ICFncm91cC50b2dnbGVfb3Blbjtcblx0XHRcdH1cblxuXHRcdFx0JGh0dHAucG9zdCgnYWRtaW4vYXBpLWNtcy1ibG9jay90b2dnbGUtZ3JvdXAnLCB7Z3JvdXA6IGdyb3VwfSwge2lnbm9yZUxvYWRpbmdCYXI6IHRydWV9KTtcblx0XHR9O1xuXG5cdFx0JHNjb3BlLmlzUHJldmlld0VuYWJsZWQgPSBmdW5jdGlvbihpdGVtKSB7XG5cdFx0XHRyZXR1cm4gaXRlbS5wcmV2aWV3X2VuYWJsZWQ7XG5cdFx0fTtcblxuXHRcdC8vIGNvbnRyb2xsZXIgbG9naWNcblxuXHRcdCRzY29wZS5jb3B5U3RhY2sgPSBTZXJ2aWNlQmxvY2tDb3B5U3RhY2suc3RhY2s7XG5cblx0XHQkc2NvcGUuJG9uKCdzZXJ2aWNlOkNvcHlTdGFjaycsIGZ1bmN0aW9uKGV2ZW50LCBzdGFjaykge1xuXHRcdFx0JHNjb3BlLmNvcHlTdGFjayA9IHN0YWNrO1xuXHRcdH0pO1xuXG5cdFx0JHNjb3BlLmNsZWFyU3RhY2sgPSBmdW5jdGlvbigpIHtcblx0XHRcdFNlcnZpY2VCbG9ja0NvcHlTdGFjay5jbGVhcigpO1xuXHRcdH07XG5cblx0XHQkc2NvcGUuc2VhcmNoUXVlcnkgPSAnJztcblxuXHRcdCRzY29wZS5zZWFyY2hJc0RpcnR5ID0gZmFsc2U7XG5cblx0XHQkc2NvcGUuJHdhdGNoKCdzZWFyY2hRdWVyeScsIGZ1bmN0aW9uKG4sIG8pIHtcblx0XHRcdGlmIChuICE9PSAnJykge1xuXHRcdFx0XHQkc2NvcGUuc2VhcmNoSXNEaXJ0eSA9IHRydWU7XG5cdFx0XHRcdGFuZ3VsYXIuZm9yRWFjaCgkc2NvcGUuYmxvY2tzRGF0YSwgZnVuY3Rpb24odmFsdWUsIGtleSkge1xuXHRcdFx0XHRcdGlmICh2YWx1ZS5ncm91cC5pc19mYXYpIHtcblx0XHRcdFx0XHRcdCRzY29wZS5ibG9ja3NEYXRhLnNwbGljZShrZXksIDEpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR2YWx1ZS5ncm91cC50b2dnbGVfb3BlbiA9IDFcblx0XHRcdFx0fSk7XG5cdFx0XHR9IGVsc2UgaWYoJHNjb3BlLnNlYXJjaElzRGlydHkpIHtcblx0XHRcdFx0JHNjb3BlLmJsb2Nrc0RhdGEgPSBhbmd1bGFyLmNvcHkoJHNjb3BlLmJsb2Nrc0RhdGFSZXN0b3JlKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fV0pO1xufSkoKTsiLCIvKipcbiAqIGFsbCBnbG9iYWwgYWRtaW4gc2VydmljZXNcbiAqIFxuICogY29udHJvbGxlciByZXNvbHZlOiBodHRwczovL2dpdGh1Yi5jb20vam9obnBhcGEvYW5ndWxhci1zdHlsZWd1aWRlI3N0eWxlLXkwODBcbiAqIFxuICogU2VydmljZSBJbmhlcml0YW5jZTpcbiAqIFxuICogMS4gU2VydmljZSBtdXN0IGJlIHByZWZpeCB3aXRoIFNlcnZpY2VcbiAqIDIuIFNlcnZpY2UgbXVzdCBjb250YWluIGEgZm9yY2VSZWxvYWQgc3RhdGVcbiAqIDMuIFNlcnZpY2UgbXVzdCBicm9hZGNhc3QgYW4gZXZlbnQgJ3NlcnZpY2U6Rm9sZGVyc0RhdGEnXG4gKiA0LiBDb250cm9sbGVyIGludGVncmF0aW9uIG11c3QgbG9vayBsaWtlXG4gKiBcbiAqIGBgYFxuICogJHNjb3BlLmZvbGRlcnNEYXRhID0gU2VydmljZUZvbGRlcnNEYXRhLmRhdGE7XG4gKlx0XHRcdFx0XG4gKiAkc2NvcGUuJG9uKCdzZXJ2aWNlOkZvbGRlcnNEYXRhJywgZnVuY3Rpb24oZXZlbnQsIGRhdGEpIHtcbiAqICAgICAgJHNjb3BlLmZvbGRlcnNEYXRhID0gZGF0YTtcbiAqIH0pO1xuICpcdFx0XHRcdFxuICogJHNjb3BlLmZvbGRlcnNEYXRhUmVsb2FkID0gZnVuY3Rpb24oKSB7XG4gKiAgICAgcmV0dXJuIFNlcnZpY2VGb2xkZXJzRGF0YS5sb2FkKHRydWUpO1xuICogfVxuICogYGBgXG4gKiBcbiAqL1xuXHRcbnphYS5jb25maWcoWydyZXNvbHZlclByb3ZpZGVyJywgZnVuY3Rpb24ocmVzb2x2ZXJQcm92aWRlcikge1xuXHRyZXNvbHZlclByb3ZpZGVyLmFkZENhbGxiYWNrKFsnU2VydmljZU1lbnVEYXRhJywgJ1NlcnZpY2VCbG9ja3NEYXRhJywgJ1NlcnZpY2VMYXlvdXRzRGF0YScsICdTZXJ2aWNlQ3VycmVudFdlYnNpdGUnLCAnTHV5YUxvYWRpbmcnLCBmdW5jdGlvbihTZXJ2aWNlTWVudURhdGEsIFNlcnZpY2VCbG9ja3NEYXRhLCBTZXJ2aWNlTGF5b3V0c0RhdGEsIFNlcnZpY2VDdXJyZW50V2Vic2l0ZSwgTHV5YUxvYWRpbmcpIHtcblx0XHRMdXlhTG9hZGluZy5zdGFydCgpO1xuXHRcdFNlcnZpY2VCbG9ja3NEYXRhLmxvYWQoKTtcblx0XHRTZXJ2aWNlTGF5b3V0c0RhdGEubG9hZCgpO1xuXHRcdFNlcnZpY2VNZW51RGF0YS5sb2FkKCkudGhlbihmdW5jdGlvbigpIHtcblx0XHRcdFNlcnZpY2VDdXJyZW50V2Vic2l0ZS5sb2FkKCk7XG5cdFx0XHRMdXlhTG9hZGluZy5zdG9wKCk7XG5cdFx0fSk7XG5cdH1dKTtcbn1dKTtcblxuXG4vKipcbiAqIENvcHkgQmxvY2sgU3RhY2sgc2VydmljZS5cbiAqL1xuemFhLmZhY3RvcnkoXCJTZXJ2aWNlQmxvY2tDb3B5U3RhY2tcIiwgWyckcm9vdFNjb3BlJywgZnVuY3Rpb24oJHJvb3RTY29wZSkge1xuXHR2YXIgc2VydmljZSA9IFtdO1xuXHRcblx0c2VydmljZS5zdGFjayA9IFtdO1xuXHRcblx0c2VydmljZS5jbGVhciA9IGZ1bmN0aW9uKCkge1xuXHRcdHNlcnZpY2Uuc3RhY2sgPSBbXTtcblx0XHQkcm9vdFNjb3BlLiRicm9hZGNhc3QoJ3NlcnZpY2U6Q29weVN0YWNrJywgc2VydmljZS5zdGFjayk7XG5cdH07XG5cdFxuXHRzZXJ2aWNlLnB1c2ggPSBmdW5jdGlvbihibG9jaykge1xuXHRcdGlmIChzZXJ2aWNlLnN0YWNrLmxlbmd0aCA+IDQpIHtcblx0XHRcdHNlcnZpY2Uuc3RhY2suc2hpZnQoKTtcblx0XHR9XG5cdFx0c2VydmljZS5zdGFjay5wdXNoKHtibG9ja0lkOiBibG9jay5ibG9ja19pZCwgbmFtZTogYmxvY2submFtZSwgaWNvbjpibG9jay5pY29uLCBpZDogYmxvY2suaWQsIGNvcHlzdGFjazogMX0pO1xuXHRcdCRyb290U2NvcGUuJGJyb2FkY2FzdCgnc2VydmljZTpDb3B5U3RhY2snLCBzZXJ2aWNlLnN0YWNrKTtcblx0fTtcblx0XG5cdHJldHVybiBzZXJ2aWNlO1xufV0pO1xuXG4vKipcbiAqIE1lbnUgU2VydmljZS5cbiAqIFxuICogJHNjb3BlLm1lbnVEYXRhID0gU2VydmljZU1lbnVEYXRhLmRhdGE7XG4gKiBcdFx0XHRcdFxuICogJHNjb3BlLiRvbignc2VydmljZTpNZW51RGF0YScsIGZ1bmN0aW9uKGV2ZW50LCBkYXRhKSB7XG4gKiBcdCRzY29wZS5tZW51RGF0YSA9IGRhdGE7XG4gKiB9KTtcbiAqIFxuICogJHNjb3BlLm1lbnVEYXRhUmVsb2FkID0gZnVuY3Rpb24oKSB7XG4gKiBcdHJldHVybiBTZXJ2aWNlTWVudURhdGEubG9hZCh0cnVlKTtcbiAqIH1cbiAqIFx0XHRcdFx0XG4gKi9cbnphYS5mYWN0b3J5KFwiU2VydmljZU1lbnVEYXRhXCIsIFsnJGh0dHAnLCAnJHEnLCAnJHJvb3RTY29wZScsIGZ1bmN0aW9uKCRodHRwLCAkcSwgJHJvb3RTY29wZSkge1xuXHR2YXIgc2VydmljZSA9IFtdO1xuXHRcblx0c2VydmljZS5kYXRhID0gW107XG5cdFxuXHRzZXJ2aWNlLmxvYWQgPSBmdW5jdGlvbihmb3JjZVJlbG9hZCkge1xuXHRcdHJldHVybiAkcShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcblx0XHRcdGlmIChzZXJ2aWNlLmRhdGEubGVuZ3RoID4gMCAmJiBmb3JjZVJlbG9hZCAhPT0gdHJ1ZSkge1xuXHRcdFx0XHRyZXNvbHZlKHNlcnZpY2UuZGF0YSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQkaHR0cC5nZXQoXCJhZG1pbi9hcGktY21zLW1lbnUvZGF0YS1tZW51XCIpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcblx0XHRcdFx0XHRzZXJ2aWNlLmRhdGEgPSByZXNwb25zZS5kYXRhO1xuXHRcdFx0XHRcdCRyb290U2NvcGUuJGJyb2FkY2FzdCgnc2VydmljZTpNZW51RGF0YScsIHNlcnZpY2UuZGF0YSk7XG5cdFx0XHRcdFx0cmVzb2x2ZShzZXJ2aWNlLmRhdGEpO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9KTtcblx0fTtcblx0XG5cdHJldHVybiBzZXJ2aWNlO1xufV0pO1xuXG4vKipcbiAqIEJsb2NrcyBTZXJ2aWNlLlxuICogXG4gKiBcbiAqICRzY29wZS5ibG9ja3NEYXRhID0gU2VydmljZUJsb2Nrc0RhdGEuZGF0YTtcbiAqIFx0XHRcdFx0XG4gKiAkc2NvcGUuJG9uKCdzZXJ2aWNlOkJsb2Nrc0RhdGEnLCBmdW5jdGlvbihldmVudCwgZGF0YSkge1xuICogXHQkc2NvcGUuYmxvY2tzRGF0YSA9IGRhdGE7XG4gKiB9KTtcbiAqIFxuICogJHNjb3BlLmJsb2Nrc0RhdGFSZWxvYWQgPSBmdW5jdGlvbigpIHtcbiAqIFx0cmV0dXJuIFNlcnZpY2VCbG9ja3NEYXRhLmxvYWQodHJ1ZSk7XG4gKiB9XG4gKiBcdFx0XHRcdFxuICovXG56YWEuZmFjdG9yeShcIlNlcnZpY2VCbG9ja3NEYXRhXCIsIFsnJGh0dHAnLCAnJHEnLCAnJHJvb3RTY29wZScsIGZ1bmN0aW9uKCRodHRwLCAkcSwgJHJvb3RTY29wZSkge1xuXHR2YXIgc2VydmljZSA9IFtdO1xuXHRcblx0c2VydmljZS5kYXRhID0gW107XG5cdFxuXHRzZXJ2aWNlLmxvYWQgPSBmdW5jdGlvbihmb3JjZVJlbG9hZCkge1xuXHRcdHJldHVybiAkcShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcblx0XHRcdGlmIChzZXJ2aWNlLmRhdGEubGVuZ3RoID4gMCAmJiBmb3JjZVJlbG9hZCAhPT0gdHJ1ZSkge1xuXHRcdFx0XHRyZXNvbHZlKHNlcnZpY2UuZGF0YSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQkaHR0cC5nZXQoXCJhZG1pbi9hcGktY21zLWFkbWluL2RhdGEtYmxvY2tzXCIpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcblx0XHRcdFx0XHRzZXJ2aWNlLmRhdGEgPSByZXNwb25zZS5kYXRhO1xuXHRcdFx0XHRcdCRyb290U2NvcGUuJGJyb2FkY2FzdCgnc2VydmljZTpCbG9ja3NEYXRhJywgc2VydmljZS5kYXRhKTtcblx0XHRcdFx0XHRyZXNvbHZlKHNlcnZpY2UuZGF0YSk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9O1xuXHRcblx0cmV0dXJuIHNlcnZpY2U7XG59XSk7XG5cbi8qKlxuICogTGF5b3V0cyBTZXJ2aWNlLlxuXG4kc2NvcGUubGF5b3V0c0RhdGEgPSBTZXJ2aWNlTGF5b3V0c0RhdGEuZGF0YTtcblx0XHRcdFx0XG4kc2NvcGUuJG9uKCdzZXJ2aWNlOkJsb2Nrc0RhdGEnLCBmdW5jdGlvbihldmVudCwgZGF0YSkge1xuXHQkc2NvcGUubGF5b3V0c0RhdGEgPSBkYXRhO1xufSk7XG5cbiRzY29wZS5sYXlvdXRzRGF0YVJlbG9hZCA9IGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gU2VydmljZUxheW91dHNEYXRhLmxvYWQodHJ1ZSk7XG59XG5cdFx0XHRcdFxuKi9cbnphYS5mYWN0b3J5KFwiU2VydmljZUxheW91dHNEYXRhXCIsIFsnJGh0dHAnLCAnJHEnLCAnJHJvb3RTY29wZScsIGZ1bmN0aW9uKCRodHRwLCAkcSwgJHJvb3RTY29wZSkge1xuXHR2YXIgc2VydmljZSA9IFtdO1xuXHRcblx0c2VydmljZS5kYXRhID0gW107XG5cdFxuXHRzZXJ2aWNlLmxvYWQgPSBmdW5jdGlvbihmb3JjZVJlbG9hZCkge1xuXHRcdHJldHVybiAkcShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcblx0XHRcdGlmIChzZXJ2aWNlLmRhdGEubGVuZ3RoID4gMCAmJiBmb3JjZVJlbG9hZCAhPT0gdHJ1ZSkge1xuXHRcdFx0XHRyZXNvbHZlKHNlcnZpY2UuZGF0YSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQkaHR0cC5nZXQoXCJhZG1pbi9hcGktY21zLWFkbWluL2RhdGEtbGF5b3V0c1wiKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG5cdFx0XHRcdFx0c2VydmljZS5kYXRhID0gcmVzcG9uc2UuZGF0YTtcblx0XHRcdFx0XHQkcm9vdFNjb3BlLiRicm9hZGNhc3QoJ3NlcnZpY2U6TGF5b3V0c0RhdGEnLCBzZXJ2aWNlLmRhdGEpO1xuXHRcdFx0XHRcdHJlc29sdmUoc2VydmljZS5kYXRhKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH07XG5cdFxuXHRyZXR1cm4gc2VydmljZTtcbn1dKTtcblxuLyoqXG4gKiBDTVMgTElWRSBFRElUIFNFUklWQ0VcbiAqIFxuICogJHNjb3BlLmxpdmVFZGl0TW9kZSA9IFNlcnZpY2VMaXZlRWRpdE1vZGUuc3RhdGVcbiAqL1xuemFhLmZhY3RvcnkoXCJTZXJ2aWNlTGl2ZUVkaXRNb2RlXCIsIFsnJHJvb3RTY29wZScsIGZ1bmN0aW9uKCRyb290U2NvcGUpIHtcblx0XG5cdHZhciBzZXJ2aWNlID0gW107XG5cdFxuXHRzZXJ2aWNlLnN0YXRlID0gMDtcblx0XG5cdHNlcnZpY2UudXJsID0gJHJvb3RTY29wZS5sdXlhY2ZnLmhvbWVVcmw7XG5cdFxuXHRzZXJ2aWNlLnRvZ2dsZSA9IGZ1bmN0aW9uKCkge1xuXHRcdHNlcnZpY2Uuc3RhdGUgPSAhc2VydmljZS5zdGF0ZTtcblx0fTtcblx0c2VydmljZS5zZXRVcmwgPSBmdW5jdGlvbihpdGVtSWQsIHZlcnNpb25JZCkge1xuXHRcdHZhciBkID0gbmV3IERhdGUoKTtcblx0XHR2YXIgbiA9IGQuZ2V0VGltZSgpO1xuXHRcdHNlcnZpY2UudXJsID0gJHJvb3RTY29wZS5jbXNDb25maWcucHJldmlld1VybCArICc/aXRlbUlkPScraXRlbUlkKycmdmVyc2lvbj0nICsgdmVyc2lvbklkICsgJyZkYXRlPScgKyBuO1xuXHR9O1xuXHRcblx0c2VydmljZS5jaGFuZ2VVcmwgPSBmdW5jdGlvbihpdGVtSWQsIHZlcnNpb25JZCkge1xuXHRcdGlmICh2ZXJzaW9uSWQgPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR2ZXJzaW9uSWQgPSAwO1xuXHRcdH1cblx0XHRzZXJ2aWNlLnNldFVybChpdGVtSWQsIHZlcnNpb25JZCk7XG5cdFx0JHJvb3RTY29wZS4kYnJvYWRjYXN0KCdzZXJ2aWNlOkxpdmVFZGl0TW9kZVVybENoYW5nZScsIHNlcnZpY2UudXJsKTtcblx0fTtcblx0XG5cdHJldHVybiBzZXJ2aWNlO1xufV0pO1xuXG4vKipcbiAqIENNUyBDdXJyZW50IFdlYnNpdGUgU0VSSVZDRVxuICpcbiAqICRzY29wZS5jdXJyZW50V2Vic2l0ZSA9IFNlcnZpY2VDdXJyZW50V2Vic2l0ZS5jdXJyZW50V2Vic2l0ZSBcbiAqIFxuICogJHNjb3BlLiRvbignc2VydmljZTpDdXJyZW50V2Vic2l0ZUNoYW5nZWQnLCBmdW5jdGlvbihldmVudCwgZGF0YSkge1xuICogIFx0JHNjb3BlLmN1cnJlbnRXZWJzaXRlID0gZGF0YTtcbiAqIH0pO1xuICovXG56YWEuZmFjdG9yeShcIlNlcnZpY2VDdXJyZW50V2Vic2l0ZVwiLCBbJyRyb290U2NvcGUnLCAnU2VydmljZU1lbnVEYXRhJywgZnVuY3Rpb24oJHJvb3RTY29wZSwgU2VydmljZU1lbnVEYXRhKSB7XG5cblx0dmFyIHNlcnZpY2UgPSB7XG5cdFx0Y3VycmVudFdlYnNpdGU6IG51bGwsXG5cdFx0ZGVmYXVsdFdlYnNpdGU6IG51bGxcblx0fTtcblxuXHRzZXJ2aWNlLmxvYWQgPSBmdW5jdGlvbigpIHtcblx0XHRzZXJ2aWNlLmRlZmF1bHRXZWJzaXRlID0gU2VydmljZU1lbnVEYXRhLmRhdGEud2Vic2l0ZXMuZmluZCh3ID0+IHcuaXNfZGVmYXVsdCkgfHwgU2VydmljZU1lbnVEYXRhLmRhdGEud2Vic2l0ZXNbMF07XG5cdFx0aWYgKHNlcnZpY2UuZGVmYXVsdFdlYnNpdGUpIHtcblx0XHRcdHNlcnZpY2UudG9nZ2xlKHNlcnZpY2UuZGVmYXVsdFdlYnNpdGUuaWQpO1xuXHRcdH1cblx0fVxuXG5cdHNlcnZpY2UudG9nZ2xlID0gZnVuY3Rpb24od2Vic2l0ZUlkKSB7XG5cdFx0aWYgKHdlYnNpdGVJZCAmJiBTZXJ2aWNlTWVudURhdGEuZGF0YS53ZWJzaXRlcyAmJiAoIXNlcnZpY2UuY3VycmVudFdlYnNpdGUgfHwgc2VydmljZS5jdXJyZW50V2Vic2l0ZS5pZCAhPT0gd2Vic2l0ZUlkKSkge1xuXHRcdFx0c2VydmljZS5jdXJyZW50V2Vic2l0ZSA9IFNlcnZpY2VNZW51RGF0YS5kYXRhLndlYnNpdGVzLmZpbmQodyA9PiB3LmlkID09PSB3ZWJzaXRlSWQpO1xuXHRcdFx0JHJvb3RTY29wZS4kYnJvYWRjYXN0KCdzZXJ2aWNlOkN1cnJlbnRXZWJzaXRlQ2hhbmdlZCcsIHNlcnZpY2UuY3VycmVudFdlYnNpdGUpO1xuXHRcdH1cblx0fTtcblxuXHRyZXR1cm4gc2VydmljZTtcbn1dKTtcblxuemFhLmZhY3RvcnkoXCJTZXJ2aWNlV29ya2luZ1BhZ2VWZXJzaW9uXCIsIFtmdW5jdGlvbigpIHtcblx0dmFyIHNlcnZpY2UgPSB7XG5cdFx0cGFnZToge31cblx0fTtcblxuXHRzZXJ2aWNlLnN0b3JlID0gZnVuY3Rpb24ocGFnZUlkLCB2ZXJzaW9uSWQpIHtcblx0XHRzZXJ2aWNlLnBhZ2VbcGFnZUlkXSA9IHZlcnNpb25JZDtcblx0fTtcblxuXHRzZXJ2aWNlLmhhc1ZlcnNpb24gPSBmdW5jdGlvbihwYWdlSWQpIHtcblx0XHRpZiAoc2VydmljZS5wYWdlLmhhc093blByb3BlcnR5KHBhZ2VJZCkpIHtcblx0XHRcdHJldHVybiBzZXJ2aWNlLnBhZ2VbcGFnZUlkXTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH07XG5cblx0cmV0dXJuIHNlcnZpY2U7XG59XSk7Il19