diff --git a/server/bundle/programs/server/packages/modules.js b/server/bundle/programs/server/packages/modules.js index e6fdb1615c..f7cac32174 100644 --- a/server/bundle/programs/server/packages/modules.js +++ b/server/bundle/programs/server/packages/modules.js @@ -1019,7 +1019,7 @@ module.useNode(); // module.exports = { "name": "@steedos/core", - "version": "2.1.21", + "version": "2.1.22", "main": "lib/index.js" }; @@ -1046,7 +1046,7 @@ module.useNode(); // module.exports = { "name": "@steedos/objectql", - "version": "2.1.21", + "version": "2.1.22", "main": "lib/index.js" }; @@ -1073,7 +1073,7 @@ module.useNode(); // module.exports = { "name": "@steedos/service-meteor-package-loader", - "version": "2.1.21", + "version": "2.1.22", "main": "index.js" }; @@ -1100,7 +1100,7 @@ module.useNode(); // module.exports = { "name": "@steedos/service-api", - "version": "2.1.21", + "version": "2.1.22", "main": "index.js" }; @@ -1127,7 +1127,7 @@ module.useNode(); // module.exports = { "name": "@steedos/service-metadata-server", - "version": "2.1.21", + "version": "2.1.22", "main": "index.js" }; @@ -1154,7 +1154,7 @@ module.useNode(); // module.exports = { "name": "@steedos/filters", - "version": "2.1.21", + "version": "2.1.22", "main": "lib/index.js" }; @@ -1181,7 +1181,7 @@ module.useNode(); // module.exports = { "name": "@steedos/i18n", - "version": "2.1.21", + "version": "2.1.22", "main": "lib/index.js" }; @@ -1208,7 +1208,7 @@ module.useNode(); // module.exports = { "name": "@steedos/auth", - "version": "2.1.21", + "version": "2.1.22", "main": "lib/index.js" }; diff --git a/server/bundle/programs/server/packages/steedos_base.js b/server/bundle/programs/server/packages/steedos_base.js index ed0a33a527..12fe016108 100644 --- a/server/bundle/programs/server/packages/steedos_base.js +++ b/server/bundle/programs/server/packages/steedos_base.js @@ -308,6 +308,78 @@ Steedos.getHelpUrl = function (locale) { return "http://www.steedos.com/" + country + "/help/"; }; +Steedos.isExpression = function (func) { + var pattern, reg1, reg2; + + if (typeof func !== 'string') { + return false; + } + + pattern = /^{{(.+)}}$/; + reg1 = /^{{(function.+)}}$/; + reg2 = /^{{(.+=>.+)}}$/; + + if (typeof func === 'string' && func.match(pattern) && !func.match(reg1) && !func.match(reg2)) { + return true; + } + + return false; +}; + +Steedos.parseSingleExpression = function (func, formData, dataPath, global) { + var error, funcBody, getParentPath, getValueByPath, globalTag, parent, parentPath, str; + + getParentPath = function (path) { + var pathArr; + + if (typeof path === 'string') { + pathArr = path.split('.'); + + if (pathArr.length === 1) { + return '#'; + } + + pathArr.pop(); + return pathArr.join('.'); + } + + return '#'; + }; + + getValueByPath = function (formData, path) { + if (path === '#' || !path) { + return formData || {}; + } else if (typeof path === 'string') { + return _.get(formData, path); + } else { + console.error('path has to be a string'); + } + }; + + if (formData === void 0) { + formData = {}; + } + + parentPath = getParentPath(dataPath); + parent = getValueByPath(formData, parentPath) || {}; + + if (typeof func === 'string') { + funcBody = func.substring(2, func.length - 2); + globalTag = '__G_L_O_B_A_L__'; + str = '\n return ' + funcBody.replace(/\bformData\b/g, JSON.stringify(formData).replace(/\bglobal\b/g, globalTag)).replace(/\bglobal\b/g, JSON.stringify(global)).replace(new RegExp('\\b' + globalTag + '\\b', 'g'), 'global').replace(/rootValue/g, JSON.stringify(parent)); + + try { + return Function(str)(); + } catch (error1) { + error = error1; + console.log(error, func, dataPath); + return func; + } + } else { + return func; + } +}; + if (Meteor.isClient) { Steedos.spaceUpgradedModal = function () { return swal({ @@ -5118,4 +5190,4 @@ Package._define("steedos:base", { })(); //# sourceURL=meteor://💻app/packages/steedos_base.js -//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvczpiYXNlL2NoZWNrTnBtLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zOmJhc2UvbGliL3N0ZWVkb3NfdXRpbC5qcyIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19iYXNlL2xpYi9jb3JlLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvbGliL2NvcmUuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zOmJhc2UvbGliL3NpbXBsZV9zY2hlbWFfZXh0ZW5kLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX2Jhc2UvbGliL21ldGhvZHMvbGFzdF9sb2dvbi5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL2xpYi9tZXRob2RzL2xhc3RfbG9nb24uY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX2Jhc2UvbGliL21ldGhvZHMvdXNlcl9hZGRfZW1haWwuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9saWIvbWV0aG9kcy91c2VyX2FkZF9lbWFpbC5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3NfYmFzZS9saWIvbWV0aG9kcy91c2VyX2F2YXRhci5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL2xpYi9tZXRob2RzL3VzZXJfYXZhdGFyLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvczpiYXNlL2xpYi9tZXRob2RzL2VtYWlsX3RlbXBsYXRlc19yZXNldC5qcyIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvczpiYXNlL2xpYi9tZXRob2RzL3VwZ3JhZGVfZGF0YS5qcyIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19iYXNlL2xpYi9zdGVlZG9zL3B1c2guY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9saWIvc3RlZWRvcy9wdXNoLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19iYXNlL2xpYi9hZG1pbi5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL2xpYi9hZG1pbi5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3M6YmFzZS9saWIvYXJyYXlfaW5jbHVkZXMuanMiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3NfYmFzZS9saWIvc2V0dGluZ3MuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9saWIvc2V0dGluZ3MuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX2Jhc2UvbGliL3VzZXJfb2JqZWN0X3ZpZXcuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9saWIvdXNlcl9vYmplY3Rfdmlldy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3M6YmFzZS9saWIvc2VydmVyX3Nlc3Npb24uanMiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3NfYmFzZS9yb3V0ZXMvYXBpX2dldF9hcHBzLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcm91dGVzL2FwaV9nZXRfYXBwcy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3NfYmFzZS9yb3V0ZXMvY29sbGVjdGlvbi5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3JvdXRlcy9jb2xsZWN0aW9uLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19iYXNlL3JvdXRlcy9zc28uY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9yb3V0ZXMvc3NvLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19iYXNlL3JvdXRlcy9hdmF0YXIuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9yb3V0ZXMvYXZhdGFyLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19iYXNlL3JvdXRlcy9hY2Nlc3NfdG9rZW4uY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9yb3V0ZXMvYWNjZXNzX3Rva2VuLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19iYXNlL3NlcnZlci9wdWJsaWNhdGlvbnMvYXBwcy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9wdWJsaWNhdGlvbnMvYXBwcy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3NfYmFzZS9zZXJ2ZXIvcHVibGljYXRpb25zL215X3NwYWNlcy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9wdWJsaWNhdGlvbnMvbXlfc3BhY2VzLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19iYXNlL3NlcnZlci9wdWJsaWNhdGlvbnMvc3BhY2VfYXZhdGFyLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvc2VydmVyL3B1YmxpY2F0aW9ucy9zcGFjZV9hdmF0YXIuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX2Jhc2Uvc2VydmVyL3B1YmxpY2F0aW9ucy9tb2R1bGVzLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvc2VydmVyL3B1YmxpY2F0aW9ucy9tb2R1bGVzLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19iYXNlL3NlcnZlci9wdWJsaWNhdGlvbnMvd2VpeGluX3BheV9jb2RlX3VybC5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9wdWJsaWNhdGlvbnMvd2VpeGluX3BheV9jb2RlX3VybC5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3NfYmFzZS9zZXJ2ZXIvcm91dGVzL2FwaV9iaWxsaW5nX3JlY2hhcmdlX25vdGlmeS5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9yb3V0ZXMvYXBpX2JpbGxpbmdfcmVjaGFyZ2Vfbm90aWZ5LmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19iYXNlL3NlcnZlci9tZXRob2RzL215X2NvbnRhY3RzX2xpbWl0LmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvc2VydmVyL21ldGhvZHMvbXlfY29udGFjdHNfbGltaXQuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zOmJhc2Uvc2VydmVyL21ldGhvZHMvc2V0S2V5VmFsdWUuanMiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3NfYmFzZS9zZXJ2ZXIvbWV0aG9kcy9iaWxsaW5nX3NldHRsZXVwLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvc2VydmVyL21ldGhvZHMvYmlsbGluZ19zZXR0bGV1cC5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3NfYmFzZS9zZXJ2ZXIvbWV0aG9kcy9zZXRVc2VybmFtZS5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9tZXRob2RzL3NldFVzZXJuYW1lLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19iYXNlL3NlcnZlci9tZXRob2RzL2JpbGxpbmdfcmVjaGFyZ2UuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvbWV0aG9kcy9iaWxsaW5nX3JlY2hhcmdlLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19iYXNlL3NlcnZlci9tZXRob2RzL2dldF9zcGFjZV91c2VyX2NvdW50LmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19iYXNlL3NlcnZlci9tZXRob2RzL3VzZXJfc2VjcmV0LmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvc2VydmVyL21ldGhvZHMvdXNlcl9zZWNyZXQuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX2Jhc2Uvc2VydmVyL21ldGhvZHMvb2JqZWN0X3dvcmtmbG93cy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9tZXRob2RzL29iamVjdF93b3JrZmxvd3MuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX2Jhc2Uvc2VydmVyL21ldGhvZHMvc2V0X3NwYWNlX3VzZXJfcGFzc3dvcmQuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvbWV0aG9kcy9zZXRfc3BhY2VfdXNlcl9wYXNzd29yZC5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3NfYmFzZS9zZXJ2ZXIvbGliL2JpbGxpbmdfbWFuYWdlci5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9saWIvYmlsbGluZ19tYW5hZ2VyLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvczpiYXNlL3NlcnZlci9zY2hlZHVsZS9zdGF0aXN0aWNzLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX2Jhc2Uvc2VydmVyL3N0ZWVkb3Mvc3RhcnR1cC9taWdyYXRpb25zL3YxLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvc2VydmVyL3N0ZWVkb3Mvc3RhcnR1cC9taWdyYXRpb25zL3YxLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19iYXNlL3NlcnZlci9zdGVlZG9zL3N0YXJ0dXAvbWlncmF0aW9ucy92Mi5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9zdGVlZG9zL3N0YXJ0dXAvbWlncmF0aW9ucy92Mi5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3NfYmFzZS9zZXJ2ZXIvc3RlZWRvcy9zdGFydHVwL21pZ3JhdGlvbnMvdjMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvc3RlZWRvcy9zdGFydHVwL21pZ3JhdGlvbnMvdjMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX2Jhc2Uvc2VydmVyL3N0ZWVkb3Mvc3RhcnR1cC9taWdyYXRpb25zL3Y0LmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvc2VydmVyL3N0ZWVkb3Mvc3RhcnR1cC9taWdyYXRpb25zL3Y0LmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19iYXNlL3NlcnZlci9zdGVlZG9zL3N0YXJ0dXAvbWlncmF0aW9ucy92NS5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9zdGVlZG9zL3N0YXJ0dXAvbWlncmF0aW9ucy92NS5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3NfYmFzZS9zZXJ2ZXIvc3RlZWRvcy9zdGFydHVwL21pZ3JhdGlvbnMvdjYuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvc3RlZWRvcy9zdGFydHVwL21pZ3JhdGlvbnMvdjYuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX2Jhc2Uvc2VydmVyL3N0YXJ0dXAuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvc3RhcnR1cC5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3M6YmFzZS9zZXJ2ZXIvZGV2ZWxvcG1lbnQuanMiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3NfYmFzZS90YWJ1bGFyLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvdGFidWxhci5jb2ZmZWUiXSwibmFtZXMiOlsiY2hlY2tOcG1WZXJzaW9ucyIsIm1vZHVsZSIsImxpbmsiLCJ2IiwiY29va2llcyIsIm1rZGlycCIsIk1ldGVvciIsInNldHRpbmdzIiwiYmlsbGluZyIsIkFycmF5IiwicHJvdG90eXBlIiwic29ydEJ5TmFtZSIsImxvY2FsZSIsIlN0ZWVkb3MiLCJzb3J0IiwicDEiLCJwMiIsInAxX3NvcnRfbm8iLCJzb3J0X25vIiwicDJfc29ydF9ubyIsIm5hbWUiLCJsb2NhbGVDb21wYXJlIiwiZ2V0UHJvcGVydHkiLCJrIiwiZm9yRWFjaCIsInQiLCJtIiwicHVzaCIsInJlbW92ZSIsImZyb20iLCJ0byIsInJlc3QiLCJzbGljZSIsImxlbmd0aCIsImFwcGx5IiwiZmlsdGVyUHJvcGVydHkiLCJoIiwibCIsImciLCJkIiwiaW5jbHVkZXMiLCJPYmplY3QiLCJ1bmRlZmluZWQiLCJmaW5kUHJvcGVydHlCeVBLIiwiciIsIkNvb2tpZXMiLCJjcnlwdG8iLCJtaXhpbiIsInJlZiIsInJlZjEiLCJyZWYyIiwicmVmMyIsInJlZjQiLCJyb290VXJsIiwiZGIiLCJzdWJzIiwiaXNQaG9uZUVuYWJsZWQiLCJwaG9uZSIsIm51bWJlclRvU3RyaW5nIiwibnVtYmVyIiwic2NhbGUiLCJub3RUaG91c2FuZHMiLCJyZWciLCJ0b1N0cmluZyIsIk51bWJlciIsInRvRml4ZWQiLCJtYXRjaCIsInJlcGxhY2UiLCJ2YWxpSnF1ZXJ5U3ltYm9scyIsInN0ciIsIlJlZ0V4cCIsInRlc3QiLCJpc0NvcmRvdmEiLCJpc0NsaWVudCIsImFic29sdXRlVXJsIiwiZGVmYXVsdE9wdGlvbnMiLCJlbmRzV2l0aCIsInN1YnN0ciIsIndpbmRvdyIsInN0b3JlcyIsIkFQSSIsImNsaWVudCIsInNldFVybCIsIlNldHRpbmdzIiwic2V0Um9vdFVybCIsImF1dG9ydW4iLCJyZWY1IiwicmVmNiIsInJlZjciLCJyZWY4Iiwic2V0VXNlcklkIiwidXNlcklkIiwic2V0VGVuYW50SWQiLCJzcGFjZUlkIiwiZ2V0SGVscFVybCIsImNvdW50cnkiLCJzdWJzdHJpbmciLCJzcGFjZVVwZ3JhZGVkTW9kYWwiLCJzd2FsIiwidGl0bGUiLCJUQVBpMThuIiwiX18iLCJ0ZXh0IiwiaHRtbCIsInR5cGUiLCJjb25maXJtQnV0dG9uVGV4dCIsImdldEFjY291bnRCZ0JvZHlWYWx1ZSIsImFjY291bnRCZ0JvZHkiLCJzdGVlZG9zX2tleXZhbHVlcyIsImZpbmRPbmUiLCJ1c2VyIiwia2V5IiwidmFsdWUiLCJhcHBseUFjY291bnRCZ0JvZHlWYWx1ZSIsImFjY291bnRCZ0JvZHlWYWx1ZSIsImlzTmVlZFRvTG9jYWwiLCJhdmF0YXIiLCJ1cmwiLCJsb2dnaW5nSW4iLCJsb2NhbFN0b3JhZ2UiLCJnZXRJdGVtIiwic2V0SXRlbSIsInJlbW92ZUl0ZW0iLCJnZXRBY2NvdW50U2tpblZhbHVlIiwiYWNjb3VudFNraW4iLCJnZXRBY2NvdW50Wm9vbVZhbHVlIiwiYWNjb3VudFpvb20iLCJhcHBseUFjY291bnRab29tVmFsdWUiLCJhY2NvdW50Wm9vbVZhbHVlIiwiem9vbU5hbWUiLCJ6b29tU2l6ZSIsInNpemUiLCIkIiwicmVtb3ZlQ2xhc3MiLCJTZXNzaW9uIiwiZ2V0IiwiYWRkQ2xhc3MiLCJzaG93SGVscCIsImdldExvY2FsZSIsIm9wZW4iLCJnZXRVcmxXaXRoVG9rZW4iLCJhdXRoVG9rZW4iLCJsaW5rZXIiLCJnZXRTcGFjZUlkIiwiQWNjb3VudHMiLCJfc3RvcmVkTG9naW5Ub2tlbiIsImluZGV4T2YiLCJwYXJhbSIsImdldEFwcFVybFdpdGhUb2tlbiIsImFwcF9pZCIsIm9wZW5BcHBXaXRoVG9rZW4iLCJhcHAiLCJhcHBzIiwiaXNfbmV3X3dpbmRvdyIsImlzTW9iaWxlIiwibG9jYXRpb24iLCJvcGVuV2luZG93Iiwib3BlblVybFdpdGhJRSIsImNtZCIsImV4ZWMiLCJvcGVuX3VybCIsImlzTm9kZSIsIm53IiwicmVxdWlyZSIsImVycm9yIiwic3Rkb3V0Iiwic3RkZXJyIiwidG9hc3RyIiwib3BlbkFwcCIsImUiLCJldmFsRnVuU3RyaW5nIiwib25fY2xpY2siLCJwYXRoIiwicmVkaXJlY3RUb1NpZ25JbiIsIkZsb3dSb3V0ZXIiLCJnbyIsImlzX3VzZV9pZSIsIm9yaWdpbiIsImlzSW50ZXJuYWxBcHAiLCJpc191c2VfaWZyYW1lIiwiX2lkIiwiZXZhbCIsImVycm9yMSIsImNvbnNvbGUiLCJtZXNzYWdlIiwic3RhY2siLCJzZXQiLCJjaGVja1NwYWNlQmFsYW5jZSIsImVuZF9kYXRlIiwibWluX21vbnRocyIsInNwYWNlIiwiaXNTcGFjZUFkbWluIiwic3BhY2VzIiwiaGFzRmVhdHVyZSIsIkRhdGUiLCJzZXRNb2RhbE1heEhlaWdodCIsIm9mZnNldCIsImRldGVjdElFIiwiZWFjaCIsImZvb3RlckhlaWdodCIsImhlYWRlckhlaWdodCIsImhlaWdodCIsInRvdGFsSGVpZ2h0Iiwib3V0ZXJIZWlnaHQiLCJpbm5lckhlaWdodCIsImhhc0NsYXNzIiwiY3NzIiwiZ2V0TW9kYWxNYXhIZWlnaHQiLCJyZVZhbHVlIiwic2NyZWVuIiwiaXNpT1MiLCJ1c2VyQWdlbnQiLCJsYW5ndWFnZSIsIkRFVklDRSIsImJyb3dzZXIiLCJjb25FeHAiLCJkZXZpY2UiLCJudW1FeHAiLCJhbmRyb2lkIiwiYmxhY2tiZXJyeSIsImRlc2t0b3AiLCJpcGFkIiwiaXBob25lIiwiaXBvZCIsIm1vYmlsZSIsIm5hdmlnYXRvciIsInRvTG93ZXJDYXNlIiwiYnJvd3Nlckxhbmd1YWdlIiwiZ2V0VXNlck9yZ2FuaXphdGlvbnMiLCJpc0luY2x1ZGVQYXJlbnRzIiwib3JnYW5pemF0aW9ucyIsInBhcmVudHMiLCJzcGFjZV91c2VyIiwic3BhY2VfdXNlcnMiLCJmaWVsZHMiLCJfIiwiZmxhdHRlbiIsImZpbmQiLCIkaW4iLCJmZXRjaCIsInVuaW9uIiwiZm9yYmlkTm9kZUNvbnRleHRtZW51IiwidGFyZ2V0IiwiaWZyIiwiZG9jdW1lbnQiLCJib2R5IiwiYWRkRXZlbnRMaXN0ZW5lciIsImV2IiwicHJldmVudERlZmF1bHQiLCJsb2FkIiwiaWZyQm9keSIsImNvbnRlbnRzIiwiaXNTZXJ2ZXIiLCJhZG1pbnMiLCJpc0xlZ2FsVmVyc2lvbiIsImFwcF92ZXJzaW9uIiwiY2hlY2siLCJtb2R1bGVzIiwiaXNPcmdBZG1pbkJ5T3JnSWRzIiwib3JnSWRzIiwiYWxsb3dBY2Nlc3NPcmdzIiwiaXNPcmdBZG1pbiIsInVzZU9yZ3MiLCJmaWx0ZXIiLCJvcmciLCJ1bmlxIiwiaXNPcmdBZG1pbkJ5QWxsT3JnSWRzIiwiaSIsInJvb3RfdXJsIiwiVVJMIiwicGF0aG5hbWUiLCJnZXRBUElMb2dpblVzZXIiLCJyZXEiLCJyZXMiLCJwYXNzd29yZCIsInJlc3VsdCIsInVzZXJuYW1lIiwicXVlcnkiLCJ1c2VycyIsInN0ZWVkb3NfaWQiLCJfY2hlY2tQYXNzd29yZCIsIkVycm9yIiwiY2hlY2tBdXRoVG9rZW4iLCJoZWFkZXJzIiwiaGFzaGVkVG9rZW4iLCJfaGFzaExvZ2luVG9rZW4iLCJkZWNyeXB0IiwiaXYiLCJjIiwiZGVjaXBoZXIiLCJkZWNpcGhlck1zZyIsImtleTMyIiwibGVuIiwiY3JlYXRlRGVjaXBoZXJpdiIsIkJ1ZmZlciIsImNvbmNhdCIsInVwZGF0ZSIsImZpbmFsIiwiZW5jcnlwdCIsImNpcGhlciIsImNpcGhlcmVkTXNnIiwiY3JlYXRlQ2lwaGVyaXYiLCJnZXRVc2VySWRGcm9tQWNjZXNzVG9rZW4iLCJhY2Nlc3NfdG9rZW4iLCJjb2xsZWN0aW9uIiwib2JqIiwic3BsaXQiLCJvQXV0aDJTZXJ2ZXIiLCJjb2xsZWN0aW9ucyIsImFjY2Vzc1Rva2VuIiwiZXhwaXJlcyIsImdldFVzZXJJZEZyb21BdXRoVG9rZW4iLCJBUElBdXRoZW50aWNhdGlvbkNoZWNrIiwiSnNvblJvdXRlcyIsInNlbmRSZXN1bHQiLCJkYXRhIiwiY29kZSIsImZ1bmN0aW9ucyIsImZ1bmMiLCJhcmdzIiwiX3dyYXBwZWQiLCJhcmd1bWVudHMiLCJjYWxsIiwiaXNIb2xpZGF5IiwiZGF0ZSIsImRheSIsImdldERheSIsImNhY3VsYXRlV29ya2luZ1RpbWUiLCJkYXlzIiwiY2FjdWxhdGVEYXRlIiwicGFyYW1fZGF0ZSIsImdldFRpbWUiLCJjYWN1bGF0ZVBsdXNIYWxmV29ya2luZ0RheSIsIm5leHQiLCJjYWN1bGF0ZWRfZGF0ZSIsImZpcnN0X2RhdGUiLCJqIiwibWF4X2luZGV4Iiwic2Vjb25kX2RhdGUiLCJzdGFydF9kYXRlIiwidGltZV9wb2ludHMiLCJyZW1pbmQiLCJpc0VtcHR5Iiwic2V0SG91cnMiLCJob3VyIiwic2V0TWludXRlcyIsIm1pbnV0ZSIsImV4dGVuZCIsImdldFN0ZWVkb3NUb2tlbiIsImFwcElkIiwibm93Iiwic2VjcmV0Iiwic3RlZWRvc190b2tlbiIsInBhcnNlSW50IiwiaXNJMThuIiwiY2hlY2tVc2VybmFtZUF2YWlsYWJpbGl0eSIsIiRyZWdleCIsIl9lc2NhcGVSZWdFeHAiLCJ0cmltIiwidmFsaWRhdGVQYXNzd29yZCIsInB3ZCIsInBhc3N3b3JQb2xpY3kiLCJwYXNzd29yUG9saWN5RXJyb3IiLCJyZWFzb24iLCJ2YWxpZCIsInBvbGljeSIsInBvbGljeUVycm9yIiwiY29udmVydFNwZWNpYWxDaGFyYWN0ZXIiLCJyZW1vdmVTcGVjaWFsQ2hhcmFjdGVyIiwiQ3JlYXRvciIsImdldERCQXBwcyIsInNwYWNlX2lkIiwiZGJBcHBzIiwiQ29sbGVjdGlvbnMiLCJpc19jcmVhdG9yIiwidmlzaWJsZSIsImNyZWF0ZWQiLCJjcmVhdGVkX2J5IiwibW9kaWZpZWQiLCJtb2RpZmllZF9ieSIsImdldERCRGFzaGJvYXJkcyIsImRiRGFzaGJvYXJkcyIsImRhc2hib2FyZCIsImdldEF1dGhUb2tlbiIsImF1dGhvcml6YXRpb24iLCJzZXNzaW9uU3RvcmFnZSIsImdldEN1cnJlbnRBcHBJZCIsImZvcm1hdEluZGV4IiwiYXJyYXkiLCJpbmRleE5hbWUiLCJpc2RvY3VtZW50REIiLCJvYmplY3QiLCJiYWNrZ3JvdW5kIiwiZGF0YXNvdXJjZXMiLCJkb2N1bWVudERCIiwiam9pbiIsInN0YXJ0dXAiLCJTaW1wbGVTY2hlbWEiLCJleHRlbmRPcHRpb25zIiwiZm9yZWlnbl9rZXkiLCJNYXRjaCIsIk9wdGlvbmFsIiwiQm9vbGVhbiIsInJlZmVyZW5jZXMiLCJtZXRob2RzIiwidXBkYXRlVXNlckxhc3RMb2dvbiIsIiRzZXQiLCJsYXN0X2xvZ29uIiwib25Mb2dpbiIsInVzZXJzX2FkZF9lbWFpbCIsImVtYWlsIiwiY291bnQiLCJlbWFpbHMiLCJkaXJlY3QiLCIkcHVzaCIsImFkZHJlc3MiLCJ2ZXJpZmllZCIsInNlbmRWZXJpZmljYXRpb25FbWFpbCIsInVzZXJzX3JlbW92ZV9lbWFpbCIsInAiLCIkcHVsbCIsInVzZXJzX3ZlcmlmeV9lbWFpbCIsInVzZXJzX3NldF9wcmltYXJ5X2VtYWlsIiwicHJpbWFyeSIsIm11bHRpIiwic2hvd0NhbmNlbEJ1dHRvbiIsImNsb3NlT25Db25maXJtIiwiYW5pbWF0aW9uIiwiaW5wdXRWYWx1ZSIsInVwZGF0ZVVzZXJBdmF0YXIiLCJlbWFpbFRlbXBsYXRlcyIsImRlZmF1bHRGcm9tIiwicmVzZXRQYXNzd29yZCIsInN1YmplY3QiLCJzcGxpdHMiLCJ0b2tlbkNvZGUiLCJncmVldGluZyIsInByb2ZpbGUiLCJ0b2tlbl9jb2RlIiwidmVyaWZ5RW1haWwiLCJlbnJvbGxBY2NvdW50IiwiYWRkIiwib3JncyIsImZ1bGxuYW1lIiwiJG5lIiwiY2FsY3VsYXRlRnVsbG5hbWUiLCJyZXQiLCJtc2ciLCJQdXNoIiwiQ29uZmlndXJlIiwic2VuZGVySUQiLCJBTkRST0lEX1NFTkRFUl9JRCIsInNvdW5kIiwidmlicmF0ZSIsImlvcyIsImJhZGdlIiwiY2xlYXJCYWRnZSIsImFsZXJ0IiwiYXBwTmFtZSIsIlNlbGVjdG9yIiwic2VsZWN0b3JDaGVja1NwYWNlQWRtaW4iLCJzZWxlY3RvciIsImlzX2Nsb3VkYWRtaW4iLCJtYXAiLCJuIiwic2VsZWN0b3JDaGVja1NwYWNlIiwidSIsImJpbGxpbmdfcGF5X3JlY29yZHMiLCJhZG1pbkNvbmZpZyIsImljb24iLCJjb2xvciIsInRhYmxlQ29sdW1ucyIsImV4dHJhRmllbGRzIiwicm91dGVyQWRtaW4iLCJwYWlkIiwic2hvd0VkaXRDb2x1bW4iLCJzaG93RGVsQ29sdW1uIiwiZGlzYWJsZUFkZCIsInBhZ2VMZW5ndGgiLCJvcmRlciIsInNwYWNlX3VzZXJfc2lnbnMiLCJBZG1pbkNvbmZpZyIsImNvbGxlY3Rpb25zX2FkZCIsInNlYXJjaEVsZW1lbnQiLCJPIiwiY3VycmVudEVsZW1lbnQiLCJ3ZWJzZXJ2aWNlcyIsInd3dyIsInN0YXR1cyIsImdldFVzZXJPYmplY3RzTGlzdFZpZXdzIiwib2JqZWN0cyIsIl9nZXRVc2VyT2JqZWN0TGlzdFZpZXdzIiwia2V5cyIsImxpc3RWaWV3cyIsIm9iamVjdHNWaWV3cyIsImdldENvbGxlY3Rpb24iLCJvYmplY3RfbmFtZSIsIm93bmVyIiwic2hhcmVkIiwiX3VzZXJfb2JqZWN0X2xpc3Rfdmlld3MiLCJvbGlzdFZpZXdzIiwib3YiLCJsaXN0dmlldyIsIm8iLCJsaXN0X3ZpZXciLCJnZXRVc2VyT2JqZWN0TGlzdFZpZXdzIiwib2JqZWN0X2xpc3R2aWV3IiwidXNlcl9pZCIsInV1Zmxvd01hbmFnZXIiLCJnZXRTcGFjZSIsIiRvciIsIiRleGlzdHMiLCJlcnJvcnMiLCJlcnJvck1lc3NhZ2UiLCJzdGVlZG9zQXV0aCIsImFsbG93X21vZGVscyIsIm1vZGVsIiwib3B0aW9ucyIsInVzZXJTZXNzaW9uIiwiU3RyaW5nIiwid3JhcEFzeW5jIiwiY2IiLCJnZXRTZXNzaW9uIiwidGhlbiIsInJlc29sdmUiLCJyZWplY3QiLCJleHByZXNzIiwiZGVzX2NpcGhlciIsImRlc19jaXBoZXJlZE1zZyIsImRlc19pdiIsImRlc19zdGVlZG9zX3Rva2VuIiwiam9pbmVyIiwia2V5OCIsInJlZGlyZWN0VXJsIiwicmV0dXJudXJsIiwicGFyYW1zIiwid3JpdGVIZWFkIiwiZW5kIiwiZW5jb2RlVVJJIiwic2V0SGVhZGVyIiwiY29sb3JfaW5kZXgiLCJjb2xvcnMiLCJmb250U2l6ZSIsImluaXRpYWxzIiwicG9zaXRpb24iLCJyZXFNb2RpZmllZEhlYWRlciIsInN2ZyIsInVzZXJuYW1lX2FycmF5Iiwid2lkdGgiLCJ3IiwiZnMiLCJnZXRSZWxhdGl2ZVVybCIsImF2YXRhclVybCIsImZpbGUiLCJ3cml0ZSIsIml0ZW0iLCJjaGFyQ29kZUF0IiwidG9VcHBlckNhc2UiLCJ0b1VUQ1N0cmluZyIsInJlYWRTdHJlYW0iLCJwaXBlIiwicHVibGlzaCIsInJlYWR5IiwiaGFuZGxlIiwiaGFuZGxlMiIsIm9ic2VydmVTcGFjZXMiLCJzZWxmIiwic3VzIiwidXNlclNwYWNlcyIsInVzZXJfYWNjZXB0ZWQiLCJzdSIsIm9ic2VydmUiLCJhZGRlZCIsImRvYyIsInJlbW92ZWQiLCJvbGREb2MiLCJ3aXRob3V0Iiwic3RvcCIsImNoYW5nZWQiLCJuZXdEb2MiLCJvblN0b3AiLCJlbmFibGVfcmVnaXN0ZXIiLCJvbiIsImNodW5rIiwiYmluZEVudmlyb25tZW50IiwicGFyc2VyIiwieG1sMmpzIiwiUGFyc2VyIiwiZXhwbGljaXRBcnJheSIsImV4cGxpY2l0Um9vdCIsInBhcnNlU3RyaW5nIiwiZXJyIiwiV1hQYXkiLCJhdHRhY2giLCJicHIiLCJjb2RlX3VybF9pZCIsInNpZ24iLCJ3eHBheSIsImFwcGlkIiwibWNoX2lkIiwicGFydG5lcl9rZXkiLCJjbG9uZSIsIkpTT04iLCJwYXJzZSIsInRvdGFsX2ZlZSIsImJpbGxpbmdNYW5hZ2VyIiwic3BlY2lhbF9wYXkiLCJ1c2VyX2NvdW50IiwibG9nIiwiZ2V0X2NvbnRhY3RzX2xpbWl0IiwiZnJvbXMiLCJmcm9tc0NoaWxkcmVuIiwiZnJvbXNDaGlsZHJlbklkcyIsImlzTGltaXQiLCJsZW4xIiwibGltaXQiLCJsaW1pdHMiLCJteUxpdG1pdE9yZ0lkcyIsIm15T3JnSWQiLCJteU9yZ0lkcyIsIm15T3JncyIsIm91dHNpZGVfb3JnYW5pemF0aW9ucyIsInNldHRpbmciLCJ0ZW1wSXNMaW1pdCIsInRvT3JncyIsInRvcyIsInNwYWNlX3NldHRpbmdzIiwidmFsdWVzIiwiaW50ZXJzZWN0aW9uIiwic2V0S2V5VmFsdWUiLCJpbnNlcnQiLCJiaWxsaW5nX3NldHRsZXVwIiwiYWNjb3VudGluZ19tb250aCIsIkVtYWlsIiwidGltZSIsImlzX3BhaWQiLCJzIiwiY2FjdWxhdGVfYnlfYWNjb3VudGluZ19tb250aCIsIlBhY2thZ2UiLCJzZW5kIiwic3RyaW5naWZ5IiwidGltZUVuZCIsInNldFVzZXJuYW1lIiwic3BhY2VVc2VyIiwiaW52aXRlX3N0YXRlIiwiYmlsbGluZ19yZWNoYXJnZSIsIm5ld19pZCIsIm1vZHVsZV9uYW1lcyIsImxpc3RwcmljZXMiLCJvbmVfbW9udGhfeXVhbiIsIm9yZGVyX2JvZHkiLCJyZXN1bHRfb2JqIiwic3BhY2VfdXNlcl9jb3VudCIsImxpc3RwcmljZV9ybWIiLCJuYW1lX3poIiwiY3JlYXRlVW5pZmllZE9yZGVyIiwib3V0X3RyYWRlX25vIiwibW9tZW50IiwiZm9ybWF0Iiwic3BiaWxsX2NyZWF0ZV9pcCIsIm5vdGlmeV91cmwiLCJ0cmFkZV90eXBlIiwicHJvZHVjdF9pZCIsImluZm8iLCJnZXRfc3BhY2VfdXNlcl9jb3VudCIsInVzZXJfY291bnRfaW5mbyIsInRvdGFsX3VzZXJfY291bnQiLCJhY2NlcHRlZF91c2VyX2NvdW50IiwiY3JlYXRlX3NlY3JldCIsInJlbW92ZV9zZWNyZXQiLCJ0b2tlbiIsImN1clNwYWNlVXNlciIsIm93cyIsImZsb3dfaWQiLCJmbCIsInBlcm1zIiwiZmxvd19uYW1lIiwiY2FuX2FkZCIsInVzZXJzX2Nhbl9hZGQiLCJvcmdzX2Nhbl9hZGQiLCJzb21lIiwic2V0U3BhY2VVc2VyUGFzc3dvcmQiLCJzcGFjZV91c2VyX2lkIiwiY2hhbmdlZFVzZXJJbmZvIiwiY3VycmVudFVzZXIiLCJsYW5nIiwibG9nb3V0IiwidXNlckNQIiwic2V0UGFzc3dvcmQiLCJzZXJ2aWNlcyIsImJjcnlwdCIsIm1vYmlsZV92ZXJpZmllZCIsIlNNU1F1ZXVlIiwiRm9ybWF0IiwiQWN0aW9uIiwiUGFyYW1TdHJpbmciLCJSZWNOdW0iLCJTaWduTmFtZSIsIlRlbXBsYXRlQ29kZSIsImdldF9hY2NvdW50aW5nX3BlcmlvZCIsImNvdW50X2RheXMiLCJlbmRfZGF0ZV90aW1lIiwic3RhcnRfZGF0ZV90aW1lIiwiYmlsbGluZ3MiLCJ0cmFuc2FjdGlvbiIsImJpbGxpbmdfZGF0ZSIsImdldERhdGUiLCJyZWZyZXNoX2JhbGFuY2UiLCJyZWZyZXNoX2RhdGUiLCJhcHBfYmlsbCIsImJfbSIsImJfbV9kIiwiYmlsbCIsImNyZWRpdHMiLCJkZWJpdHMiLCJsYXN0X2JhbGFuY2UiLCJsYXN0X2JpbGwiLCJwYXltZW50X2JpbGwiLCJzZXRPYmoiLCIkbHQiLCJiaWxsaW5nX21vbnRoIiwiYmFsYW5jZSIsImdldF9iYWxhbmNlIiwibW9kdWxlX25hbWUiLCJsaXN0cHJpY2UiLCJhY2NvdW50aW5nX2RhdGUiLCJhY2NvdW50aW5nX2RhdGVfZm9ybWF0IiwiZGF5c19udW1iZXIiLCJuZXdfYmlsbCIsIiRsdGUiLCJfbWFrZU5ld0lEIiwiZ2V0U3BhY2VVc2VyQ291bnQiLCJyZWNhY3VsYXRlQmFsYW5jZSIsInJlZnJlc2hfZGF0ZXMiLCJyX2QiLCJnZXRfbW9kdWxlcyIsIm1fY2hhbmdlbG9nIiwibW9kdWxlc19jaGFuZ2Vsb2dzIiwiY2hhbmdlX2RhdGUiLCJvcGVyYXRpb24iLCJnZXRfbW9kdWxlc19uYW1lIiwibW9kdWxlc19uYW1lIiwiYV9tIiwibmV3ZXN0X2JpbGwiLCJwZXJpb2RfcmVzdWx0IiwicmVtYWluaW5nX21vbnRocyIsImIiLCJvcGVyYXRvcl9pZCIsIm5ld19tb2R1bGVzIiwic3BhY2VfdXBkYXRlX29iaiIsImRpZmZlcmVuY2UiLCJfZCIsInVzZXJfbGltaXQiLCJtY2wiLCJvcGVyYXRvciIsImNyb24iLCJzdGF0aXN0aWNzIiwic2NoZWR1bGUiLCJydWxlIiwiZ29fbmV4dCIsInNjaGVkdWxlSm9iIiwiZGF0ZUZvcm1hdCIsImRhdGVrZXkiLCJnZXRGdWxsWWVhciIsImdldE1vbnRoIiwieWVzdGVyRGF5IiwiZE5vdyIsImRCZWZvcmUiLCJkYWlseVN0YXRpY3NDb3VudCIsInN0YXRpY3MiLCIkZ3QiLCJzdGF0aWNzQ291bnQiLCJvd25lck5hbWUiLCJsYXN0TG9nb24iLCJzVXNlcnMiLCJzVXNlciIsImxhc3RNb2RpZmllZCIsIm9iakFyciIsIm1vZCIsInBvc3RzQXR0YWNobWVudHMiLCJhdHRTaXplIiwic2l6ZVN1bSIsInBvc3RzIiwicG9zdCIsImF0dHMiLCJjZnMiLCJhdHQiLCJvcmlnaW5hbCIsImRhaWx5UG9zdHNBdHRhY2htZW50cyIsInN0ZWVkb3Nfc3RhdGlzdGljcyIsInNwYWNlX25hbWUiLCJvd25lcl9uYW1lIiwic3RlZWRvcyIsIndvcmtmbG93IiwiZmxvd3MiLCJmb3JtcyIsImZsb3dfcm9sZXMiLCJmbG93X3Bvc2l0aW9ucyIsImluc3RhbmNlcyIsImluc3RhbmNlc19sYXN0X21vZGlmaWVkIiwiZGFpbHlfZmxvd3MiLCJkYWlseV9mb3JtcyIsImRhaWx5X2luc3RhbmNlcyIsImNtcyIsInNpdGVzIiwiY21zX3NpdGVzIiwiY21zX3Bvc3RzIiwicG9zdHNfbGFzdF9tb2RpZmllZCIsInBvc3RzX2F0dGFjaG1lbnRzX3NpemUiLCJjb21tZW50cyIsImNtc19jb21tZW50cyIsImRhaWx5X3NpdGVzIiwiZGFpbHlfcG9zdHMiLCJkYWlseV9jb21tZW50cyIsImRhaWx5X3Bvc3RzX2F0dGFjaG1lbnRzX3NpemUiLCJNaWdyYXRpb25zIiwidmVyc2lvbiIsInVwIiwidXBkYXRlX2Nmc19pbnN0YW5jZSIsInBhcmVudF9pZCIsImluc3RhbmNlX2lkIiwiYXR0YWNoX3ZlcnNpb24iLCJpc0N1cnJlbnQiLCJtZXRhZGF0YSIsInBhcmVudCIsImluc3RhbmNlIiwiYXBwcm92ZSIsImN1cnJlbnQiLCJhdHRhY2htZW50cyIsImlucyIsImF0dGFjaHMiLCJjdXJyZW50X3ZlciIsIl9yZXYiLCJoaXN0b3J5cyIsImhpcyIsImRvd24iLCJvcmdhbml6YXRpb24iLCJjaGVja19jb3VudCIsIm5ld19vcmdfaWRzIiwicmVtb3ZlZF9vcmdfaWRzIiwicm9vdF9vcmciLCJ1cGRhdGVVc2VycyIsIm1vbnRocyIsInNldF9vYmoiLCJwbSIsInNldE1vbnRoIiwicm9vdFVSTCIsImNyZWF0b3IiLCJwcm9jZXNzIiwiZW52IiwiQ1JFQVRPUl9OT0RFX0VOViIsImRlZmluZVByb3BlcnR5IiwiZGVwdGgiLCJyZWR1Y2UiLCJmbGF0IiwidG9GbGF0dGVuIiwiaXNBcnJheSIsIlRhYnVsYXIiLCJUYWJsZSIsImNvbHVtbnMiLCJvcmRlcmFibGUiLCJkb20iLCJsZW5ndGhDaGFuZ2UiLCJvcmRlcmluZyIsInNlYXJjaGluZyIsImF1dG9XaWR0aCIsImNoYW5nZVNlbGVjdG9yIiwiJGFuZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxJQUFJQSxnQkFBSjtBQUFxQkMsTUFBTSxDQUFDQyxJQUFQLENBQVksb0NBQVosRUFBaUQ7QUFBQ0Ysa0JBQWdCLENBQUNHLENBQUQsRUFBRztBQUFDSCxvQkFBZ0IsR0FBQ0csQ0FBakI7QUFBbUI7O0FBQXhDLENBQWpELEVBQTJGLENBQTNGO0FBR3JCSCxnQkFBZ0IsQ0FBQztBQUNoQixtQkFBaUIsUUFERDtBQUVoQkksU0FBTyxFQUFFLFFBRk87QUFHaEIsWUFBVSxTQUhNO0FBSWhCQyxRQUFNLEVBQUUsUUFKUTtBQUtoQixnQ0FBOEI7QUFMZCxDQUFELEVBTWIsY0FOYSxDQUFoQjs7QUFRQSxJQUFJQyxNQUFNLENBQUNDLFFBQVAsSUFBbUJELE1BQU0sQ0FBQ0MsUUFBUCxDQUFnQkMsT0FBdkMsRUFBZ0Q7QUFDL0NSLGtCQUFnQixDQUFDO0FBQ2hCLGtCQUFjO0FBREUsR0FBRCxFQUViLGNBRmEsQ0FBaEI7QUFHQSxDOzs7Ozs7Ozs7OztBQ2ZEUyxLQUFLLENBQUNDLFNBQU4sQ0FBZ0JDLFVBQWhCLEdBQTZCLFVBQVVDLE1BQVYsRUFBa0I7QUFDM0MsTUFBSSxDQUFDLElBQUwsRUFBVztBQUNQO0FBQ0g7O0FBQ0QsTUFBRyxDQUFDQSxNQUFKLEVBQVc7QUFDUEEsVUFBTSxHQUFHQyxPQUFPLENBQUNELE1BQVIsRUFBVDtBQUNIOztBQUNELE9BQUtFLElBQUwsQ0FBVSxVQUFVQyxFQUFWLEVBQWNDLEVBQWQsRUFBa0I7QUFDOUIsUUFBSUMsVUFBVSxHQUFHRixFQUFFLENBQUNHLE9BQUgsSUFBYyxDQUEvQjtBQUNBLFFBQUlDLFVBQVUsR0FBR0gsRUFBRSxDQUFDRSxPQUFILElBQWMsQ0FBL0I7O0FBQ0EsUUFBR0Qs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UDtBQUNDLGFBQUErUSxZQUFBLFFBQUE3WixNQUFBNlosU0FBQXNaLElBQUEsWUFBQW56QixJQUFtQmYsTUFBbkIsR0FBbUIsTUFBbkIsR0FBbUIsTUFBbkIsSUFBNEIsQ0FBNUI7QUFDQzZKLGtCQUFRK1EsU0FBU3NaLElBQVQsQ0FBYzcwQixXQUFkLENBQTBCLE9BQTFCLEVBQW1DLENBQW5DLENBQVI7QUFGRjtBQ1FJOztBRExKLFdBQU93SyxLQUFQO0FBQ0MsZUFBTztBQUFDVixlQUFLLENBQUM7QUFBUCxTQUFQO0FDU0c7O0FEUkosYUFBT3lSLFFBQVA7QUF6QkQ7QUFBQSxHQURELENDQUM7QURERixHIiwiZmlsZSI6Ii9wYWNrYWdlcy9zdGVlZG9zX2Jhc2UuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHRjaGVja05wbVZlcnNpb25zXG59IGZyb20gJ21ldGVvci90bWVhc2RheTpjaGVjay1ucG0tdmVyc2lvbnMnO1xuY2hlY2tOcG1WZXJzaW9ucyh7XG5cdFwibm9kZS1zY2hlZHVsZVwiOiBcIl4xLjMuMVwiLFxuXHRjb29raWVzOiBcIl4wLjYuMlwiLFxuXHRcInhtbDJqc1wiOiBcIl4wLjQuMTlcIixcblx0bWtkaXJwOiBcIl4wLjMuNVwiLFxuXHRcInVybC1zZWFyY2gtcGFyYW1zLXBvbHlmaWxsXCI6IFwiXjcuMC4wXCIsXG59LCAnc3RlZWRvczpiYXNlJyk7XG5cbmlmIChNZXRlb3Iuc2V0dGluZ3MgJiYgTWV0ZW9yLnNldHRpbmdzLmJpbGxpbmcpIHtcblx0Y2hlY2tOcG1WZXJzaW9ucyh7XG5cdFx0XCJ3ZWl4aW4tcGF5XCI6IFwiXjEuMS43XCJcblx0fSwgJ3N0ZWVkb3M6YmFzZScpO1xufSIsIkFycmF5LnByb3RvdHlwZS5zb3J0QnlOYW1lID0gZnVuY3Rpb24gKGxvY2FsZSkge1xuICAgIGlmICghdGhpcykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmKCFsb2NhbGUpe1xuICAgICAgICBsb2NhbGUgPSBTdGVlZG9zLmxvY2FsZSgpXG4gICAgfVxuICAgIHRoaXMuc29ydChmdW5jdGlvbiAocDEsIHAyKSB7XG5cdFx0dmFyIHAxX3NvcnRfbm8gPSBwMS5zb3J0X25vIHx8IDA7XG5cdFx0dmFyIHAyX3NvcnRfbm8gPSBwMi5zb3J0X25vIHx8IDA7XG5cdFx0aWYocDFfc29ydF9ubyAhPSBwMl9zb3J0X25vKXtcbiAgICAgICAgICAgIHJldHVybiBwMV9zb3J0X25vID4gcDJfc29ydF9ubyA/IC0xIDogMVxuICAgICAgICB9ZWxzZXtcblx0XHRcdHJldHVybiBwMS5uYW1lLmxvY2FsZUNvbXBhcmUocDIubmFtZSwgbG9jYWxlKTtcblx0XHR9XG4gICAgfSk7XG59O1xuXG5cbkFycmF5LnByb3RvdHlwZS5nZXRQcm9wZXJ0eSA9IGZ1bmN0aW9uIChrKSB7XG4gICAgdmFyIHYgPSBuZXcgQXJyYXkoKTtcbiAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdmFyIG0gPSB0ID8gdFtrXSA6IG51bGw7XG4gICAgICAgIHYucHVzaChtKTtcbiAgICB9KTtcbiAgICByZXR1cm4gdjtcbn1cblxuLypcbiAqIOa3u+WKoEFycmF555qEcmVtb3Zl5Ye95pWwXG4gKi9cbkFycmF5LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAoZnJvbSwgdG8pIHtcbiAgICBpZiAoZnJvbSA8IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgcmVzdCA9IHRoaXMuc2xpY2UoKHRvIHx8IGZyb20pICsgMSB8fCB0aGlzLmxlbmd0aCk7XG4gICAgdGhpcy5sZW5ndGggPSBmcm9tIDwgMCA/IHRoaXMubGVuZ3RoICsgZnJvbSA6IGZyb207XG4gICAgcmV0dXJuIHRoaXMucHVzaC5hcHBseSh0aGlzLCByZXN0KTtcbn07XG5cbi8qXG4gKiDmt7vliqBBcnJheeeahOi/h+a7pOWZqFxuICogcmV0dXJuIOespuWQiOadoeS7tueahOWvueixoUFycmF5XG4gKi9cbkFycmF5LnByb3RvdHlwZS5maWx0ZXJQcm9wZXJ0eSA9IGZ1bmN0aW9uIChoLCBsKSB7XG4gICAgdmFyIGcgPSBbXTtcbiAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdmFyIG0gPSB0ID8gdFtoXSA6IG51bGw7XG4gICAgICAgIHZhciBkID0gZmFsc2U7XG4gICAgICAgIGlmIChtIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgIGQgPSBtLmluY2x1ZGVzKGwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKG0gaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICAgICAgICAgICAgICBpZiAoXCJpZFwiIGluIG0pIHtcbiAgICAgICAgICAgICAgICAgICAgbSA9IG1bXCJpZFwiXTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFwiX2lkXCIgaW4gbSkge1xuICAgICAgICAgICAgICAgICAgICBtID0gbVtcIl9pZFwiXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChsIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgICAgICBkID0gKGwgPT09IHVuZGVmaW5lZCkgPyBmYWxzZSA6IGwuaW5jbHVkZXMobSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGQgPSAobCA9PT0gdW5kZWZpbmVkKSA/IGZhbHNlIDogbSA9PSBsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGQpIHtcbiAgICAgICAgICAgIGcucHVzaCh0KTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBnO1xufVxuXG4vKlxuICog5re75YqgQXJyYXnnmoTov4fmu6TlmahcbiAqIHJldHVybiDnrKblkIjmnaHku7bnmoTnrKzkuIDkuKrlr7nosaFcbiAqL1xuQXJyYXkucHJvdG90eXBlLmZpbmRQcm9wZXJ0eUJ5UEsgPSBmdW5jdGlvbiAoaCwgbCkge1xuICAgIHZhciByID0gbnVsbDtcbiAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdmFyIG0gPSB0ID8gdFtoXSA6IG51bGw7XG4gICAgICAgIHZhciBkID0gZmFsc2U7XG4gICAgICAgIGlmIChtIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgIGQgPSBtLmluY2x1ZGVzKGwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZCA9IChsID09PSB1bmRlZmluZWQpID8gZmFsc2UgOiBtID09IGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZCkge1xuICAgICAgICAgICAgciA9IHQ7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcjtcbn0iLCJTdGVlZG9zID1cblx0c2V0dGluZ3M6IHt9XG5cdGRiOiBkYlxuXHRzdWJzOiB7fVxuXHRpc1Bob25lRW5hYmxlZDogLT5cblx0XHRyZXR1cm4gISFNZXRlb3Iuc2V0dGluZ3M/LnB1YmxpYz8ucGhvbmVcblx0bnVtYmVyVG9TdHJpbmc6IChudW1iZXIsIHNjYWxlLCBub3RUaG91c2FuZHMpLT5cblx0XHRpZiB0eXBlb2YgbnVtYmVyID09IFwibnVtYmVyXCJcblx0XHRcdG51bWJlciA9IG51bWJlci50b1N0cmluZygpXG5cblx0XHRpZiAhbnVtYmVyXG5cdFx0XHRyZXR1cm4gJyc7XG5cblx0XHRpZiBudW1iZXIgIT0gXCJOYU5cIlxuXHRcdFx0aWYgc2NhbGUgfHwgc2NhbGUgPT0gMFxuXHRcdFx0XHRudW1iZXIgPSBOdW1iZXIobnVtYmVyKS50b0ZpeGVkKHNjYWxlKVxuXHRcdFx0dW5sZXNzIG5vdFRob3VzYW5kc1xuXHRcdFx0XHRpZiAhKHNjYWxlIHx8IHNjYWxlID09IDApXG5cdFx0XHRcdFx0IyDmsqHlrprkuYlzY2FsZeaXtu+8jOagueaNruWwj+aVsOeCueS9jee9rueul+WHunNjYWxl5YC8XG5cdFx0XHRcdFx0c2NhbGUgPSBudW1iZXIubWF0Y2goL1xcLihcXGQrKS8pP1sxXT8ubGVuZ3RoXG5cdFx0XHRcdFx0dW5sZXNzIHNjYWxlXG5cdFx0XHRcdFx0XHRzY2FsZSA9IDBcblx0XHRcdFx0cmVnID0gLyhcXGQpKD89KFxcZHszfSkrXFwuKS9nXG5cdFx0XHRcdGlmIHNjYWxlID09IDBcblx0XHRcdFx0XHRyZWcgPSAvKFxcZCkoPz0oXFxkezN9KStcXGIpL2dcblx0XHRcdFx0bnVtYmVyID0gbnVtYmVyLnJlcGxhY2UocmVnLCAnJDEsJylcblx0XHRcdHJldHVybiBudW1iZXJcblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4gXCJcIlxuXHR2YWxpSnF1ZXJ5U3ltYm9sczogKHN0ciktPlxuXHRcdCMgcmVnID0gL15bXiFcIiMkJSYnKCkqKywuLzo7PD0+P0BbXFxdXmB7fH1+XSskL2dcblx0XHRyZWcgPSBuZXcgUmVnRXhwKFwiXlteIVxcXCIjJCUmJygpKlxcKyxcXC5cXC86Ozw9Pj9AW1xcXFxdXmB7fH1+XSskXCIpXG5cdFx0cmV0dXJuIHJlZy50ZXN0KHN0cilcblxuIyMjXG4jIEtpY2sgb2ZmIHRoZSBnbG9iYWwgbmFtZXNwYWNlIGZvciBTdGVlZG9zLlxuIyBAbmFtZXNwYWNlIFN0ZWVkb3NcbiMjI1xuIyBpZiBNZXRlb3IuaXNDb3Jkb3ZhXG5pZiBNZXRlb3IuaXNDb3Jkb3ZhIHx8IE1ldGVvci5pc0NsaWVudFxuXHRyb290VXJsID0gTWV0ZW9yLmFic29sdXRlVXJsLmRlZmF1bHRPcHRpb25zLnJvb3RVcmxcblx0aWYgcm9vdFVybC5lbmRzV2l0aCgnLycpXG5cdFx0cm9vdFVybCA9IHJvb3RVcmwuc3Vic3RyKDAsIHJvb3RVcmwubGVuZ3RoIC0gMSlcblxuXHR3aW5kb3cuc3RvcmVzPy5BUEk/LmNsaWVudD8uc2V0VXJsID0gcm9vdFVybFxuXHR3aW5kb3cuc3RvcmVzPy5TZXR0aW5ncz8uc2V0Um9vdFVybChyb290VXJsKVxuXHR3aW5kb3dbJ3N0ZWVkb3Muc2V0dGluZyddID0ge1xuXHRcdHJvb3RVcmw6IHJvb3RVcmxcblx0fVxuXG5pZiBNZXRlb3IuaXNDbGllbnRcblx0TWV0ZW9yLmF1dG9ydW4gKCktPlxuXHRcdHdpbmRvdy5zdG9yZXM/LlNldHRpbmdzPy5zZXRVc2VySWQoU3RlZWRvcy51c2VySWQoKSlcblx0XHR3aW5kb3cuc3RvcmVzPy5TZXR0aW5ncz8uc2V0VGVuYW50SWQoU3RlZWRvcy5zcGFjZUlkKCkpXG5cblN0ZWVkb3MuZ2V0SGVscFVybCA9IChsb2NhbGUpLT5cblx0Y291bnRyeSA9IGxvY2FsZS5zdWJzdHJpbmcoMylcblx0cmV0dXJuIFwiaHR0cDovL3d3dy5zdGVlZG9zLmNvbS9cIiArIGNvdW50cnkgKyBcIi9oZWxwL1wiXG5cbmlmIE1ldGVvci5pc0NsaWVudFxuXG5cdFN0ZWVkb3Muc3BhY2VVcGdyYWRlZE1vZGFsID0gKCktPlxuXHRcdHN3YWwoe3RpdGxlOiBUQVBpMThuLl9fKFwic3BhY2VfcGFpZF9pbmZvX3RpdGxlXCIpLCB0ZXh0OiBUQVBpMThuLl9fKFwic3BhY2VfcGFpZF9pbmZvX3RleHRcIiksIGh0bWw6IHRydWUsIHR5cGU6XCJ3YXJuaW5nXCIsIGNvbmZpcm1CdXR0b25UZXh0OiBUQVBpMThuLl9fKFwiT0tcIil9KTtcblxuXHRTdGVlZG9zLmdldEFjY291bnRCZ0JvZHlWYWx1ZSA9ICgpLT5cblx0XHRhY2NvdW50QmdCb2R5ID0gZGIuc3RlZWRvc19rZXl2YWx1ZXMuZmluZE9uZSh7dXNlcjpTdGVlZG9zLnVzZXJJZCgpLGtleTpcImJnX2JvZHlcIn0pXG5cdFx0aWYgYWNjb3VudEJnQm9keVxuXHRcdFx0cmV0dXJuIGFjY291bnRCZ0JvZHkudmFsdWVcblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4ge307XG5cblx0U3RlZWRvcy5hcHBseUFjY291bnRCZ0JvZHlWYWx1ZSA9IChhY2NvdW50QmdCb2R5VmFsdWUsaXNOZWVkVG9Mb2NhbCktPlxuXHRcdGlmIE1ldGVvci5sb2dnaW5nSW4oKSBvciAhU3RlZWRvcy51c2VySWQoKVxuXHRcdFx0IyDlpoLmnpzmmK/mraPlnKjnmbvlvZXkuK3miJblnKjnmbvlvZXnlYzpnaLvvIzliJnlj5Zsb2NhbFN0b3JhZ2XkuK3orr7nva7vvIzogIzkuI3mmK/nm7TmjqXlupTnlKjnqbrorr7nva5cblx0XHRcdGFjY291bnRCZ0JvZHlWYWx1ZSA9IHt9XG5cdFx0XHRhY2NvdW50QmdCb2R5VmFsdWUudXJsID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJhY2NvdW50QmdCb2R5VmFsdWUudXJsXCIpXG5cdFx0XHRhY2NvdW50QmdCb2R5VmFsdWUuYXZhdGFyID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJhY2NvdW50QmdCb2R5VmFsdWUuYXZhdGFyXCIpXG5cblx0XHR1cmwgPSBhY2NvdW50QmdCb2R5VmFsdWUudXJsXG5cdFx0YXZhdGFyID0gYWNjb3VudEJnQm9keVZhbHVlLmF2YXRhclxuXHRcdCMgaWYgYWNjb3VudEJnQm9keVZhbHVlLnVybFxuXHRcdCMgXHRpZiB1cmwgPT0gYXZhdGFyXG5cdFx0IyBcdFx0YXZhdGFyVXJsID0gJ2FwaS9maWxlcy9hdmF0YXJzLycgKyBhdmF0YXJcblx0XHQjIFx0XHQkKFwiYm9keVwiKS5jc3MgXCJiYWNrZ3JvdW5kSW1hZ2VcIixcInVybCgje1N0ZWVkb3MuYWJzb2x1dGVVcmwoYXZhdGFyVXJsKX0pXCJcblx0XHQjIFx0ZWxzZVxuXHRcdCMgXHRcdCQoXCJib2R5XCIpLmNzcyBcImJhY2tncm91bmRJbWFnZVwiLFwidXJsKCN7U3RlZWRvcy5hYnNvbHV0ZVVybCh1cmwpfSlcIlxuXHRcdCMgZWxzZVxuXHRcdCMgXHRiYWNrZ3JvdW5kID0gTWV0ZW9yLnNldHRpbmdzPy5wdWJsaWM/LmFkbWluPy5iYWNrZ3JvdW5kXG5cdFx0IyBcdGlmIGJhY2tncm91bmRcblx0XHQjIFx0XHQkKFwiYm9keVwiKS5jc3MgXCJiYWNrZ3JvdW5kSW1hZ2VcIixcInVybCgje1N0ZWVkb3MuYWJzb2x1dGVVcmwoYmFja2dyb3VuZCl9KVwiXG5cdFx0IyBcdGVsc2Vcblx0XHQjIFx0XHRiYWNrZ3JvdW5kID0gXCIvcGFja2FnZXMvc3RlZWRvc190aGVtZS9jbGllbnQvYmFja2dyb3VuZC9zZWEuanBnXCJcblx0XHQjIFx0XHQkKFwiYm9keVwiKS5jc3MgXCJiYWNrZ3JvdW5kSW1hZ2VcIixcInVybCgje1N0ZWVkb3MuYWJzb2x1dGVVcmwoYmFja2dyb3VuZCl9KVwiXG5cblx0XHRpZiBpc05lZWRUb0xvY2FsXG5cdFx0XHRpZiBNZXRlb3IubG9nZ2luZ0luKClcblx0XHRcdFx0IyDmraPlnKjnmbvlvZXkuK3vvIzliJnkuI3lgZrlpITnkIbvvIzlm6DkuLrmraTml7ZTdGVlZG9zLnVzZXJJZCgp5LiN6Laz5LqO6K+B5piO5bey55m75b2V54q25oCBXG5cdFx0XHRcdHJldHVyblxuXHRcdFx0IyDov5nph4znibnmhI/kuI3lnKhsb2NhbFN0b3JhZ2XkuK3lrZjlgqhTdGVlZG9zLnVzZXJJZCgp77yM5Zug5Li66ZyA6KaB5L+d6K+B55m75b2V55WM6Z2i5Lmf5bqU55SobG9jYWxTdG9yYWdl5Lit55qE6K6+572uXG5cdFx0XHQjIOeZu+W9leeVjOmdouS4jeiuvue9rmxvY2FsU3RvcmFnZe+8jOWboOS4uueZu+W9leeVjOmdomFjY291bnRCZ0JvZHlWYWx1ZeiCr+WumuS4uuepuu+8jOiuvue9rueahOivne+8jOS8mumAoOaIkOaXoOazleS/neaMgeeZu+W9leeVjOmdouS5n+W6lOeUqGxvY2FsU3RvcmFnZeS4reeahOiuvue9rlxuXHRcdFx0aWYgU3RlZWRvcy51c2VySWQoKVxuXHRcdFx0XHRpZiB1cmxcblx0XHRcdFx0XHRsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImFjY291bnRCZ0JvZHlWYWx1ZS51cmxcIix1cmwpXG5cdFx0XHRcdFx0bG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJhY2NvdW50QmdCb2R5VmFsdWUuYXZhdGFyXCIsYXZhdGFyKVxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0bG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oXCJhY2NvdW50QmdCb2R5VmFsdWUudXJsXCIpXG5cdFx0XHRcdFx0bG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oXCJhY2NvdW50QmdCb2R5VmFsdWUuYXZhdGFyXCIpXG5cblx0U3RlZWRvcy5nZXRBY2NvdW50U2tpblZhbHVlID0gKCktPlxuXHRcdGFjY291bnRTa2luID0gZGIuc3RlZWRvc19rZXl2YWx1ZXMuZmluZE9uZSh7dXNlcjpTdGVlZG9zLnVzZXJJZCgpLGtleTpcInNraW5cIn0pXG5cdFx0aWYgYWNjb3VudFNraW5cblx0XHRcdHJldHVybiBhY2NvdW50U2tpbi52YWx1ZVxuXHRcdGVsc2Vcblx0XHRcdHJldHVybiB7fTtcblxuXHRTdGVlZG9zLmdldEFjY291bnRab29tVmFsdWUgPSAoKS0+XG5cdFx0YWNjb3VudFpvb20gPSBkYi5zdGVlZG9zX2tleXZhbHVlcy5maW5kT25lKHt1c2VyOlN0ZWVkb3MudXNlcklkKCksa2V5Olwiem9vbVwifSlcblx0XHRpZiBhY2NvdW50Wm9vbVxuXHRcdFx0cmV0dXJuIGFjY291bnRab29tLnZhbHVlXG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIHt9O1xuXG5cdFN0ZWVkb3MuYXBwbHlBY2NvdW50Wm9vbVZhbHVlID0gKGFjY291bnRab29tVmFsdWUsaXNOZWVkVG9Mb2NhbCktPlxuXHRcdGlmIE1ldGVvci5sb2dnaW5nSW4oKSBvciAhU3RlZWRvcy51c2VySWQoKVxuXHRcdFx0IyDlpoLmnpzmmK/mraPlnKjnmbvlvZXkuK3miJblnKjnmbvlvZXnlYzpnaLvvIzliJnlj5Zsb2NhbFN0b3JhZ2XkuK3orr7nva7vvIzogIzkuI3mmK/nm7TmjqXlupTnlKjnqbrorr7nva5cblx0XHRcdGFjY291bnRab29tVmFsdWUgPSB7fVxuXHRcdFx0YWNjb3VudFpvb21WYWx1ZS5uYW1lID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJhY2NvdW50Wm9vbVZhbHVlLm5hbWVcIilcblx0XHRcdGFjY291bnRab29tVmFsdWUuc2l6ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYWNjb3VudFpvb21WYWx1ZS5zaXplXCIpXG5cdFx0JChcImJvZHlcIikucmVtb3ZlQ2xhc3MoXCJ6b29tLW5vcm1hbFwiKS5yZW1vdmVDbGFzcyhcInpvb20tbGFyZ2VcIikucmVtb3ZlQ2xhc3MoXCJ6b29tLWV4dHJhLWxhcmdlXCIpO1xuXHRcdHpvb21OYW1lID0gYWNjb3VudFpvb21WYWx1ZS5uYW1lXG5cdFx0em9vbVNpemUgPSBhY2NvdW50Wm9vbVZhbHVlLnNpemVcblx0XHR1bmxlc3Mgem9vbU5hbWVcblx0XHRcdHpvb21OYW1lID0gXCJsYXJnZVwiXG5cdFx0XHR6b29tU2l6ZSA9IDEuMlxuXHRcdGlmIHpvb21OYW1lICYmICFTZXNzaW9uLmdldChcImluc3RhbmNlUHJpbnRcIilcblx0XHRcdCQoXCJib2R5XCIpLmFkZENsYXNzKFwiem9vbS0je3pvb21OYW1lfVwiKVxuXHRcdFx0IyBpZiBTdGVlZG9zLmlzTm9kZSgpXG5cdFx0XHQjIFx0aWYgYWNjb3VudFpvb21WYWx1ZS5zaXplID09IFwiMVwiXG5cdFx0XHQjIFx0XHQjIG5vZGUtd2Via2l05Litc2l6ZeS4ujDmiY3ooajnpLoxMDAlXG5cdFx0XHQjIFx0XHR6b29tU2l6ZSA9IDBcblx0XHRcdCMgXHRudy5XaW5kb3cuZ2V0KCkuem9vbUxldmVsID0gTnVtYmVyLnBhcnNlRmxvYXQoem9vbVNpemUpXG5cdFx0XHQjIGVsc2Vcblx0XHRcdCMgXHQkKFwiYm9keVwiKS5hZGRDbGFzcyhcInpvb20tI3t6b29tTmFtZX1cIilcblx0XHRpZiBpc05lZWRUb0xvY2FsXG5cdFx0XHRpZiBNZXRlb3IubG9nZ2luZ0luKClcblx0XHRcdFx0IyDmraPlnKjnmbvlvZXkuK3vvIzliJnkuI3lgZrlpITnkIbvvIzlm6DkuLrmraTml7ZTdGVlZG9zLnVzZXJJZCgp5LiN6Laz5LqO6K+B5piO5bey55m75b2V54q25oCBXG5cdFx0XHRcdHJldHVyblxuXHRcdFx0IyDov5nph4znibnmhI/kuI3lnKhsb2NhbFN0b3JhZ2XkuK3lrZjlgqhTdGVlZG9zLnVzZXJJZCgp77yM5Zug5Li66ZyA6KaB5L+d6K+B55m75b2V55WM6Z2i5Lmf5bqU55SobG9jYWxTdG9yYWdl5Lit55qE6K6+572uXG5cdFx0XHQjIOeZu+W9leeVjOmdouS4jeiuvue9rmxvY2FsU3RvcmFnZe+8jOWboOS4uueZu+W9leeVjOmdomFjY291bnRab29tVmFsdWXogq/lrprkuLrnqbrvvIzorr7nva7nmoTor53vvIzkvJrpgKDmiJDml6Dms5Xkv53mjIHnmbvlvZXnlYzpnaLkuZ/lupTnlKhsb2NhbFN0b3JhZ2XkuK3nmoTorr7nva5cblx0XHRcdGlmIFN0ZWVkb3MudXNlcklkKClcblx0XHRcdFx0aWYgYWNjb3VudFpvb21WYWx1ZS5uYW1lXG5cdFx0XHRcdFx0bG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJhY2NvdW50Wm9vbVZhbHVlLm5hbWVcIixhY2NvdW50Wm9vbVZhbHVlLm5hbWUpXG5cdFx0XHRcdFx0bG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJhY2NvdW50Wm9vbVZhbHVlLnNpemVcIixhY2NvdW50Wm9vbVZhbHVlLnNpemUpXG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShcImFjY291bnRab29tVmFsdWUubmFtZVwiKVxuXHRcdFx0XHRcdGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKFwiYWNjb3VudFpvb21WYWx1ZS5zaXplXCIpXG5cblx0U3RlZWRvcy5zaG93SGVscCA9ICh1cmwpLT5cblx0XHRsb2NhbGUgPSBTdGVlZG9zLmdldExvY2FsZSgpXG5cdFx0Y291bnRyeSA9IGxvY2FsZS5zdWJzdHJpbmcoMylcblxuXHRcdHVybCA9IHVybCB8fCBcImh0dHA6Ly93d3cuc3RlZWRvcy5jb20vXCIgKyBjb3VudHJ5ICsgXCIvaGVscC9cIlxuXG5cdFx0d2luZG93Lm9wZW4odXJsLCAnX2hlbHAnLCAnRW5hYmxlVmlld1BvcnRTY2FsZT15ZXMnKVxuXG5cdFN0ZWVkb3MuZ2V0VXJsV2l0aFRva2VuID0gKHVybCktPlxuXHRcdGF1dGhUb2tlbiA9IHt9O1xuXHRcdGF1dGhUb2tlbltcInNwYWNlSWRcIl0gPSBTdGVlZG9zLmdldFNwYWNlSWQoKVxuXHRcdGF1dGhUb2tlbltcIlgtVXNlci1JZFwiXSA9IE1ldGVvci51c2VySWQoKTtcblx0XHRhdXRoVG9rZW5bXCJYLUF1dGgtVG9rZW5cIl0gPSBBY2NvdW50cy5fc3RvcmVkTG9naW5Ub2tlbigpO1xuXG5cdFx0bGlua2VyID0gXCI/XCJcblxuXHRcdGlmIHVybC5pbmRleE9mKFwiP1wiKSA+IC0xXG5cdFx0XHRsaW5rZXIgPSBcIiZcIlxuXG5cdFx0cmV0dXJuIHVybCArIGxpbmtlciArICQucGFyYW0oYXV0aFRva2VuKVxuXG5cdFN0ZWVkb3MuZ2V0QXBwVXJsV2l0aFRva2VuID0gKGFwcF9pZCktPlxuXHRcdGF1dGhUb2tlbiA9IHt9O1xuXHRcdGF1dGhUb2tlbltcInNwYWNlSWRcIl0gPSBTdGVlZG9zLmdldFNwYWNlSWQoKVxuXHRcdGF1dGhUb2tlbltcIlgtVXNlci1JZFwiXSA9IE1ldGVvci51c2VySWQoKTtcblx0XHRhdXRoVG9rZW5bXCJYLUF1dGgtVG9rZW5cIl0gPSBBY2NvdW50cy5fc3RvcmVkTG9naW5Ub2tlbigpO1xuXHRcdHJldHVybiBcImFwaS9zZXR1cC9zc28vXCIgKyBhcHBfaWQgKyBcIj9cIiArICQucGFyYW0oYXV0aFRva2VuKVxuXG5cdFN0ZWVkb3Mub3BlbkFwcFdpdGhUb2tlbiA9IChhcHBfaWQpLT5cblx0XHR1cmwgPSBTdGVlZG9zLmdldEFwcFVybFdpdGhUb2tlbiBhcHBfaWRcblx0XHR1cmwgPSBTdGVlZG9zLmFic29sdXRlVXJsIHVybFxuXG5cdFx0YXBwID0gZGIuYXBwcy5maW5kT25lKGFwcF9pZClcblxuXHRcdGlmICFhcHAuaXNfbmV3X3dpbmRvdyAmJiAhU3RlZWRvcy5pc01vYmlsZSgpICYmICFTdGVlZG9zLmlzQ29yZG92YSgpXG5cdFx0XHR3aW5kb3cubG9jYXRpb24gPSB1cmxcblx0XHRlbHNlXG5cdFx0XHRTdGVlZG9zLm9wZW5XaW5kb3codXJsKTtcblxuXHRTdGVlZG9zLm9wZW5VcmxXaXRoSUUgPSAodXJsKS0+XG5cdFx0aWYgdXJsXG5cdFx0XHRpZiBTdGVlZG9zLmlzTm9kZSgpXG5cdFx0XHRcdGV4ZWMgPSBudy5yZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY1xuXHRcdFx0XHRvcGVuX3VybCA9IHVybFxuXHRcdFx0XHRjbWQgPSBcInN0YXJ0IGlleHBsb3JlLmV4ZSBcXFwiI3tvcGVuX3VybH1cXFwiXCJcblx0XHRcdFx0ZXhlYyBjbWQsIChlcnJvciwgc3Rkb3V0LCBzdGRlcnIpIC0+XG5cdFx0XHRcdFx0aWYgZXJyb3Jcblx0XHRcdFx0XHRcdHRvYXN0ci5lcnJvciBlcnJvclxuXHRcdFx0XHRcdHJldHVyblxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRTdGVlZG9zLm9wZW5XaW5kb3codXJsKVxuXG5cblx0U3RlZWRvcy5vcGVuQXBwID0gKGFwcF9pZCktPlxuXHRcdGlmICFNZXRlb3IudXNlcklkKClcblx0XHRcdFN0ZWVkb3MucmVkaXJlY3RUb1NpZ25JbigpXG5cdFx0XHRyZXR1cm4gdHJ1ZVxuXG5cdFx0YXBwID0gZGIuYXBwcy5maW5kT25lKGFwcF9pZClcblx0XHRpZiAhYXBwXG5cdFx0XHRGbG93Um91dGVyLmdvKFwiL1wiKVxuXHRcdFx0cmV0dXJuXG5cblx0XHQjIGNyZWF0b3JTZXR0aW5ncyA9IE1ldGVvci5zZXR0aW5ncy5wdWJsaWM/LndlYnNlcnZpY2VzPy5jcmVhdG9yXG5cdFx0IyBpZiBhcHAuX2lkID09IFwiYWRtaW5cIiBhbmQgY3JlYXRvclNldHRpbmdzPy5zdGF0dXMgPT0gXCJhY3RpdmVcIlxuXHRcdCMgXHR1cmwgPSBjcmVhdG9yU2V0dGluZ3MudXJsXG5cdFx0IyBcdHJlZyA9IC9cXC8kL1xuXHRcdCMgXHR1bmxlc3MgcmVnLnRlc3QgdXJsXG5cdFx0IyBcdFx0dXJsICs9IFwiL1wiXG5cdFx0IyBcdHVybCA9IFwiI3t1cmx9YXBwL2FkbWluXCJcblx0XHQjIFx0U3RlZWRvcy5vcGVuV2luZG93KHVybClcblx0XHQjIFx0cmV0dXJuXG5cblx0XHRvbl9jbGljayA9IGFwcC5vbl9jbGlja1xuXHRcdGlmIGFwcC5pc191c2VfaWVcblx0XHRcdGlmIFN0ZWVkb3MuaXNOb2RlKClcblx0XHRcdFx0ZXhlYyA9IG53LnJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjXG5cdFx0XHRcdGlmIG9uX2NsaWNrXG5cdFx0XHRcdFx0cGF0aCA9IFwiYXBpL2FwcC9zc28vI3thcHBfaWR9P2F1dGhUb2tlbj0je0FjY291bnRzLl9zdG9yZWRMb2dpblRva2VuKCl9JnVzZXJJZD0je01ldGVvci51c2VySWQoKX1cIlxuXHRcdFx0XHRcdG9wZW5fdXJsID0gd2luZG93LmxvY2F0aW9uLm9yaWdpbiArIFwiL1wiICsgcGF0aFxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0b3Blbl91cmwgPSBTdGVlZG9zLmdldEFwcFVybFdpdGhUb2tlbiBhcHBfaWRcblx0XHRcdFx0XHRvcGVuX3VybCA9IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4gKyBcIi9cIiArIG9wZW5fdXJsXG5cdFx0XHRcdGNtZCA9IFwic3RhcnQgaWV4cGxvcmUuZXhlIFxcXCIje29wZW5fdXJsfVxcXCJcIlxuXHRcdFx0XHRleGVjIGNtZCwgKGVycm9yLCBzdGRvdXQsIHN0ZGVycikgLT5cblx0XHRcdFx0XHRpZiBlcnJvclxuXHRcdFx0XHRcdFx0dG9hc3RyLmVycm9yIGVycm9yXG5cdFx0XHRcdFx0cmV0dXJuXG5cdFx0XHRlbHNlXG5cdFx0XHRcdFN0ZWVkb3Mub3BlbkFwcFdpdGhUb2tlbihhcHBfaWQpXG5cblx0XHRlbHNlIGlmIGRiLmFwcHMuaXNJbnRlcm5hbEFwcChhcHAudXJsKVxuXHRcdFx0Rmxvd1JvdXRlci5nbyhhcHAudXJsKVxuXG5cdFx0ZWxzZSBpZiBhcHAuaXNfdXNlX2lmcmFtZVxuXHRcdFx0aWYgYXBwLmlzX25ld193aW5kb3cgJiYgIVN0ZWVkb3MuaXNNb2JpbGUoKSAmJiAhU3RlZWRvcy5pc0NvcmRvdmEoKVxuXHRcdFx0XHRTdGVlZG9zLm9wZW5XaW5kb3coU3RlZWRvcy5hYnNvbHV0ZVVybChcImFwcHMvaWZyYW1lL1wiICsgYXBwLl9pZCkpXG5cdFx0XHRlbHNlIGlmIFN0ZWVkb3MuaXNNb2JpbGUoKSB8fCBTdGVlZG9zLmlzQ29yZG92YSgpXG5cdFx0XHRcdFN0ZWVkb3Mub3BlbkFwcFdpdGhUb2tlbihhcHBfaWQpXG5cdFx0XHRlbHNlXG5cdFx0XHRcdEZsb3dSb3V0ZXIuZ28oXCIvYXBwcy9pZnJhbWUvI3thcHAuX2lkfVwiKVxuXG5cdFx0ZWxzZSBpZiBvbl9jbGlja1xuXHRcdFx0IyDov5nph4zmiafooYznmoTmmK/kuIDkuKrkuI3luKblj4LmlbDnmoTpl63ljIXlh73mlbDvvIznlKjmnaXpgb/lhY3lj5jph4/msaHmn5Ncblx0XHRcdGV2YWxGdW5TdHJpbmcgPSBcIihmdW5jdGlvbigpeyN7b25fY2xpY2t9fSkoKVwiXG5cdFx0XHR0cnlcblx0XHRcdFx0ZXZhbChldmFsRnVuU3RyaW5nKVxuXHRcdFx0Y2F0Y2ggZVxuXHRcdFx0XHQjIGp1c3QgY29uc29sZSB0aGUgZXJyb3Igd2hlbiBjYXRjaCBlcnJvclxuXHRcdFx0XHRjb25zb2xlLmVycm9yIFwiY2F0Y2ggc29tZSBlcnJvciB3aGVuIGV2YWwgdGhlIG9uX2NsaWNrIHNjcmlwdCBmb3IgYXBwIGxpbms6XCJcblx0XHRcdFx0Y29uc29sZS5lcnJvciBcIiN7ZS5tZXNzYWdlfVxcclxcbiN7ZS5zdGFja31cIlxuXHRcdGVsc2Vcblx0XHRcdFN0ZWVkb3Mub3BlbkFwcFdpdGhUb2tlbihhcHBfaWQpXG5cblx0XHRpZiAhYXBwLmlzX25ld193aW5kb3cgJiYgIVN0ZWVkb3MuaXNNb2JpbGUoKSAmJiAhU3RlZWRvcy5pc0NvcmRvdmEoKSAmJiAhYXBwLmlzX3VzZV9pZSAmJiAhb25fY2xpY2tcblx0XHRcdCMg6ZyA6KaB6YCJ5Lit5b2T5YmNYXBw5pe277yMb25fY2xpY2vlh73mlbDph4zopoHljZXni6zliqDkuIpTZXNzaW9uLnNldChcImN1cnJlbnRfYXBwX2lkXCIsIGFwcF9pZClcblx0XHRcdFNlc3Npb24uc2V0KFwiY3VycmVudF9hcHBfaWRcIiwgYXBwX2lkKVxuXG5cdFN0ZWVkb3MuY2hlY2tTcGFjZUJhbGFuY2UgPSAoc3BhY2VJZCktPlxuXHRcdHVubGVzcyBzcGFjZUlkXG5cdFx0XHRzcGFjZUlkID0gU3RlZWRvcy5zcGFjZUlkKClcblx0XHRtaW5fbW9udGhzID0gMVxuXHRcdGlmIFN0ZWVkb3MuaXNTcGFjZUFkbWluKClcblx0XHRcdG1pbl9tb250aHMgPSAzXG5cdFx0c3BhY2UgPSBkYi5zcGFjZXMuZmluZE9uZShzcGFjZUlkKVxuXHRcdGVuZF9kYXRlID0gc3BhY2U/LmVuZF9kYXRlXG5cdFx0aWYgc3BhY2UgJiYgU3RlZWRvcy5oYXNGZWF0dXJlKCdwYWlkJywgc3BhY2UuX2lkKSBhbmQgZW5kX2RhdGUgIT0gdW5kZWZpbmVkIGFuZCAoZW5kX2RhdGUgLSBuZXcgRGF0ZSkgPD0gKG1pbl9tb250aHMqMzAqMjQqMzYwMCoxMDAwKVxuXHRcdFx0IyDmj5DnpLrnlKjmiLfkvZnpop3kuI3otrNcblx0XHRcdHRvYXN0ci5lcnJvciB0KFwic3BhY2VfYmFsYW5jZV9pbnN1ZmZpY2llbnRcIilcblxuXHRTdGVlZG9zLnNldE1vZGFsTWF4SGVpZ2h0ID0gKCktPlxuXHRcdGFjY291bnRab29tVmFsdWUgPSBTdGVlZG9zLmdldEFjY291bnRab29tVmFsdWUoKVxuXHRcdHVubGVzcyBhY2NvdW50Wm9vbVZhbHVlLm5hbWVcblx0XHRcdGFjY291bnRab29tVmFsdWUubmFtZSA9ICdsYXJnZSdcblx0XHRzd2l0Y2ggYWNjb3VudFpvb21WYWx1ZS5uYW1lXG5cdFx0XHR3aGVuICdub3JtYWwnXG5cdFx0XHRcdGlmIFN0ZWVkb3MuaXNNb2JpbGUoKVxuXHRcdFx0XHRcdG9mZnNldCA9IC0xMlxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0b2Zmc2V0ID0gNzVcblx0XHRcdHdoZW4gJ2xhcmdlJ1xuXHRcdFx0XHRpZiBTdGVlZG9zLmlzTW9iaWxlKClcblx0XHRcdFx0XHRvZmZzZXQgPSAtNlxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0IyDljLrliIZJRea1j+iniOWZqFxuXHRcdFx0XHRcdGlmIFN0ZWVkb3MuZGV0ZWN0SUUoKVxuXHRcdFx0XHRcdFx0b2Zmc2V0ID0gMTk5XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0b2Zmc2V0ID0gOVxuXHRcdFx0d2hlbiAnZXh0cmEtbGFyZ2UnXG5cdFx0XHRcdGlmIFN0ZWVkb3MuaXNNb2JpbGUoKVxuXHRcdFx0XHRcdG9mZnNldCA9IC0yNlxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0IyDljLrliIZJRea1j+iniOWZqFxuXHRcdFx0XHRcdGlmIFN0ZWVkb3MuZGV0ZWN0SUUoKVxuXHRcdFx0XHRcdFx0b2Zmc2V0ID0gMzAzXG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0b2Zmc2V0ID0gNTNcblxuXHRcdGlmICQoXCIubW9kYWxcIikubGVuZ3RoXG5cdFx0XHQkKFwiLm1vZGFsXCIpLmVhY2ggLT5cblx0XHRcdFx0aGVhZGVySGVpZ2h0ID0gMFxuXHRcdFx0XHRmb290ZXJIZWlnaHQgPSAwXG5cdFx0XHRcdHRvdGFsSGVpZ2h0ID0gMFxuXHRcdFx0XHQkKFwiLm1vZGFsLWhlYWRlclwiLCAkKHRoaXMpKS5lYWNoIC0+XG5cdFx0XHRcdFx0aGVhZGVySGVpZ2h0ICs9ICQodGhpcykub3V0ZXJIZWlnaHQoZmFsc2UpXG5cdFx0XHRcdCQoXCIubW9kYWwtZm9vdGVyXCIsICQodGhpcykpLmVhY2ggLT5cblx0XHRcdFx0XHRmb290ZXJIZWlnaHQgKz0gJCh0aGlzKS5vdXRlckhlaWdodChmYWxzZSlcblxuXHRcdFx0XHR0b3RhbEhlaWdodCA9IGhlYWRlckhlaWdodCArIGZvb3RlckhlaWdodFxuXHRcdFx0XHRoZWlnaHQgPSAkKFwiYm9keVwiKS5pbm5lckhlaWdodCgpIC0gdG90YWxIZWlnaHQgLSBvZmZzZXRcblx0XHRcdFx0aWYgJCh0aGlzKS5oYXNDbGFzcyhcImNmX2NvbnRhY3RfbW9kYWxcIilcblx0XHRcdFx0XHQkKFwiLm1vZGFsLWJvZHlcIiwkKHRoaXMpKS5jc3Moe1wibWF4LWhlaWdodFwiOiBcIiN7aGVpZ2h0fXB4XCIsIFwiaGVpZ2h0XCI6IFwiI3toZWlnaHR9cHhcIn0pXG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHQkKFwiLm1vZGFsLWJvZHlcIiwkKHRoaXMpKS5jc3Moe1wibWF4LWhlaWdodFwiOiBcIiN7aGVpZ2h0fXB4XCIsIFwiaGVpZ2h0XCI6IFwiYXV0b1wifSlcblxuXHRTdGVlZG9zLmdldE1vZGFsTWF4SGVpZ2h0ID0gKG9mZnNldCktPlxuXHRcdGlmIFN0ZWVkb3MuaXNNb2JpbGUoKVxuXHRcdFx0cmVWYWx1ZSA9IHdpbmRvdy5zY3JlZW4uaGVpZ2h0IC0gMTI2IC0gMTgwIC0gMjVcblx0XHRlbHNlXG5cdFx0XHRyZVZhbHVlID0gJCh3aW5kb3cpLmhlaWdodCgpIC0gMTgwIC0gMjVcblx0XHR1bmxlc3MgU3RlZWRvcy5pc2lPUygpIG9yIFN0ZWVkb3MuaXNNb2JpbGUoKVxuXHRcdFx0IyBpb3Plj4rmiYvmnLrkuIrkuI3pnIDopoHkuLp6b29t5pS+5aSn5Yqf6IO96aKd5aSW6K6h566XXG5cdFx0XHRhY2NvdW50Wm9vbVZhbHVlID0gU3RlZWRvcy5nZXRBY2NvdW50Wm9vbVZhbHVlKClcblx0XHRcdHN3aXRjaCBhY2NvdW50Wm9vbVZhbHVlLm5hbWVcblx0XHRcdFx0d2hlbiAnbGFyZ2UnXG5cdFx0XHRcdFx0IyDmtYvkuIvmnaXov5nph4zkuI3pnIDopoHpop3lpJblh4/mlbBcblx0XHRcdFx0XHRyZVZhbHVlIC09IDUwXG5cdFx0XHRcdHdoZW4gJ2V4dHJhLWxhcmdlJ1xuXHRcdFx0XHRcdHJlVmFsdWUgLT0gMTQ1XG5cdFx0aWYgb2Zmc2V0XG5cdFx0XHRyZVZhbHVlIC09IG9mZnNldFxuXHRcdHJldHVybiByZVZhbHVlICsgXCJweFwiO1xuXG5cdFN0ZWVkb3MuaXNpT1MgPSAodXNlckFnZW50LCBsYW5ndWFnZSktPlxuXHRcdERFVklDRSA9XG5cdFx0XHRhbmRyb2lkOiAnYW5kcm9pZCdcblx0XHRcdGJsYWNrYmVycnk6ICdibGFja2JlcnJ5J1xuXHRcdFx0ZGVza3RvcDogJ2Rlc2t0b3AnXG5cdFx0XHRpcGFkOiAnaXBhZCdcblx0XHRcdGlwaG9uZTogJ2lwaG9uZSdcblx0XHRcdGlwb2Q6ICdpcG9kJ1xuXHRcdFx0bW9iaWxlOiAnbW9iaWxlJ1xuXHRcdGJyb3dzZXIgPSB7fVxuXHRcdGNvbkV4cCA9ICcoPzpbXFxcXC86XFxcXDo6XFxcXHM6O10pJ1xuXHRcdG51bUV4cCA9ICcoXFxcXFMrW15cXFxcczo7OlxcXFwpXXwpJ1xuXHRcdHVzZXJBZ2VudCA9ICh1c2VyQWdlbnQgb3IgbmF2aWdhdG9yLnVzZXJBZ2VudCkudG9Mb3dlckNhc2UoKVxuXHRcdGxhbmd1YWdlID0gbGFuZ3VhZ2Ugb3IgbmF2aWdhdG9yLmxhbmd1YWdlIG9yIG5hdmlnYXRvci5icm93c2VyTGFuZ3VhZ2Vcblx0XHRkZXZpY2UgPSB1c2VyQWdlbnQubWF0Y2gobmV3IFJlZ0V4cCgnKGFuZHJvaWR8aXBhZHxpcGhvbmV8aXBvZHxibGFja2JlcnJ5KScpKSBvciB1c2VyQWdlbnQubWF0Y2gobmV3IFJlZ0V4cCgnKG1vYmlsZSknKSkgb3IgW1xuXHRcdFx0Jydcblx0XHRcdERFVklDRS5kZXNrdG9wXG5cdFx0XVxuXHRcdGJyb3dzZXIuZGV2aWNlID0gZGV2aWNlWzFdXG5cdFx0cmV0dXJuIGJyb3dzZXIuZGV2aWNlID09IERFVklDRS5pcGFkIG9yIGJyb3dzZXIuZGV2aWNlID09IERFVklDRS5pcGhvbmUgb3IgYnJvd3Nlci5kZXZpY2UgPT0gREVWSUNFLmlwb2RcblxuXHRTdGVlZG9zLmdldFVzZXJPcmdhbml6YXRpb25zID0gKGlzSW5jbHVkZVBhcmVudHMpLT5cblx0XHR1c2VySWQgPSBNZXRlb3IudXNlcklkKClcblx0XHRzcGFjZUlkID0gU3RlZWRvcy5zcGFjZUlkKClcblx0XHRzcGFjZV91c2VyID0gZGIuc3BhY2VfdXNlcnMuZmluZE9uZSh7dXNlcjp1c2VySWQsc3BhY2U6c3BhY2VJZH0sZmllbGRzOntvcmdhbml6YXRpb25zOjF9KVxuXHRcdG9yZ2FuaXphdGlvbnMgPSBzcGFjZV91c2VyPy5vcmdhbml6YXRpb25zXG5cdFx0dW5sZXNzIG9yZ2FuaXphdGlvbnNcblx0XHRcdHJldHVybiBbXVxuXHRcdGlmIGlzSW5jbHVkZVBhcmVudHNcblx0XHRcdHBhcmVudHMgPSBfLmZsYXR0ZW4gZGIub3JnYW5pemF0aW9ucy5maW5kKF9pZDp7JGluOm9yZ2FuaXphdGlvbnN9KS5mZXRjaCgpLmdldFByb3BlcnR5KFwicGFyZW50c1wiKVxuXHRcdFx0cmV0dXJuIF8udW5pb24gb3JnYW5pemF0aW9ucyxwYXJlbnRzXG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIG9yZ2FuaXphdGlvbnNcblxuXHRTdGVlZG9zLmZvcmJpZE5vZGVDb250ZXh0bWVudSA9ICh0YXJnZXQsIGlmciktPlxuXHRcdHVubGVzcyBTdGVlZG9zLmlzTm9kZSgpXG5cdFx0XHRyZXR1cm5cblx0XHR0YXJnZXQuZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyICdjb250ZXh0bWVudScsIChldikgLT5cblx0XHRcdGV2LnByZXZlbnREZWZhdWx0KClcblx0XHRcdHJldHVybiBmYWxzZVxuXHRcdGlmIGlmclxuXHRcdFx0aWYgdHlwZW9mIGlmciA9PSAnc3RyaW5nJ1xuXHRcdFx0XHRpZnIgPSB0YXJnZXQuJChpZnIpXG5cdFx0XHRpZnIubG9hZCAtPlxuXHRcdFx0XHRpZnJCb2R5ID0gaWZyLmNvbnRlbnRzKCkuZmluZCgnYm9keScpXG5cdFx0XHRcdGlmIGlmckJvZHlcblx0XHRcdFx0XHRpZnJCb2R5WzBdLmFkZEV2ZW50TGlzdGVuZXIgJ2NvbnRleHRtZW51JywgKGV2KSAtPlxuXHRcdFx0XHRcdFx0ZXYucHJldmVudERlZmF1bHQoKVxuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlXG5cbmlmIE1ldGVvci5pc1NlcnZlclxuXHRTdGVlZG9zLmdldFVzZXJPcmdhbml6YXRpb25zID0gKHNwYWNlSWQsdXNlcklkLGlzSW5jbHVkZVBhcmVudHMpLT5cblx0XHRzcGFjZV91c2VyID0gZGIuc3BhY2VfdXNlcnMuZmluZE9uZSh7dXNlcjp1c2VySWQsc3BhY2U6c3BhY2VJZH0sZmllbGRzOntvcmdhbml6YXRpb25zOjF9KVxuXHRcdG9yZ2FuaXphdGlvbnMgPSBzcGFjZV91c2VyPy5vcmdhbml6YXRpb25zXG5cdFx0dW5sZXNzIG9yZ2FuaXphdGlvbnNcblx0XHRcdHJldHVybiBbXVxuXHRcdGlmIGlzSW5jbHVkZVBhcmVudHNcblx0XHRcdHBhcmVudHMgPSBfLmZsYXR0ZW4gZGIub3JnYW5pemF0aW9ucy5maW5kKF9pZDp7JGluOm9yZ2FuaXphdGlvbnN9KS5mZXRjaCgpLmdldFByb3BlcnR5KFwicGFyZW50c1wiKVxuXHRcdFx0cmV0dXJuIF8udW5pb24gb3JnYW5pemF0aW9ucyxwYXJlbnRzXG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIG9yZ2FuaXphdGlvbnNcblxuI1x0U3RlZWRvcy5jaGFyZ2VBUEljaGVjayA9IChzcGFjZUlkKS0+XG5cbmlmIE1ldGVvci5pc1NlcnZlclxuXHRDb29raWVzID0gcmVxdWlyZShcImNvb2tpZXNcIilcblx0I1RPRE8g5re75Yqg5pyN5Yqh56uv5piv5ZCm5omL5py655qE5Yik5patKOS+neaNrnJlcXVlc3QpXG5cdFN0ZWVkb3MuaXNNb2JpbGUgPSAoKS0+XG5cdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFN0ZWVkb3MuaXNTcGFjZUFkbWluID0gKHNwYWNlSWQsIHVzZXJJZCktPlxuXHRcdGlmICFzcGFjZUlkIHx8ICF1c2VySWRcblx0XHRcdHJldHVybiBmYWxzZVxuXHRcdHNwYWNlID0gZGIuc3BhY2VzLmZpbmRPbmUoc3BhY2VJZClcblx0XHRpZiAhc3BhY2UgfHwgIXNwYWNlLmFkbWluc1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdHJldHVybiBzcGFjZS5hZG1pbnMuaW5kZXhPZih1c2VySWQpPj0wXG5cblx0U3RlZWRvcy5pc0xlZ2FsVmVyc2lvbiA9IChzcGFjZUlkLGFwcF92ZXJzaW9uKS0+XG5cdFx0aWYgIXNwYWNlSWRcblx0XHRcdHJldHVybiBmYWxzZVxuXHRcdGNoZWNrID0gZmFsc2Vcblx0XHRtb2R1bGVzID0gZGIuc3BhY2VzLmZpbmRPbmUoc3BhY2VJZCk/Lm1vZHVsZXNcblx0XHRpZiBtb2R1bGVzIGFuZCBtb2R1bGVzLmluY2x1ZGVzKGFwcF92ZXJzaW9uKVxuXHRcdFx0Y2hlY2sgPSB0cnVlXG5cdFx0cmV0dXJuIGNoZWNrXG5cblx0IyDliKTmlq3mlbDnu4RvcmdJZHPkuK3nmoRvcmcgaWTpm4blkIjlr7nkuo7nlKjmiLd1c2VySWTmmK/lkKbmnInnu4Tnu4fnrqHnkIblkZjmnYPpmZDvvIzlj6ropoHmlbDnu4RvcmdJZHPkuK3ku7vkvZXkuIDkuKrnu4Tnu4fmnInmnYPpmZDlsLHov5Tlm550cnVl77yM5Y+N5LmL6L+U5ZueZmFsc2Vcblx0U3RlZWRvcy5pc09yZ0FkbWluQnlPcmdJZHMgPSAob3JnSWRzLCB1c2VySWQpLT5cblx0XHRpc09yZ0FkbWluID0gZmFsc2Vcblx0XHR1c2VPcmdzID0gZGIub3JnYW5pemF0aW9ucy5maW5kKHtfaWQ6IHskaW46b3JnSWRzfX0se2ZpZWxkczp7cGFyZW50czoxLGFkbWluczoxfX0pLmZldGNoKClcblx0XHRwYXJlbnRzID0gW11cblx0XHRhbGxvd0FjY2Vzc09yZ3MgPSB1c2VPcmdzLmZpbHRlciAob3JnKSAtPlxuXHRcdFx0aWYgb3JnLnBhcmVudHNcblx0XHRcdFx0cGFyZW50cyA9IF8udW5pb24gcGFyZW50cyxvcmcucGFyZW50c1xuXHRcdFx0cmV0dXJuIG9yZy5hZG1pbnM/LmluY2x1ZGVzKHVzZXJJZClcblx0XHRpZiBhbGxvd0FjY2Vzc09yZ3MubGVuZ3RoXG5cdFx0XHRpc09yZ0FkbWluID0gdHJ1ZVxuXHRcdGVsc2Vcblx0XHRcdHBhcmVudHMgPSBfLmZsYXR0ZW4gcGFyZW50c1xuXHRcdFx0cGFyZW50cyA9IF8udW5pcSBwYXJlbnRzXG5cdFx0XHRpZiBwYXJlbnRzLmxlbmd0aCBhbmQgZGIub3JnYW5pemF0aW9ucy5maW5kT25lKHtfaWQ6eyRpbjpwYXJlbnRzfSwgYWRtaW5zOnVzZXJJZH0pXG5cdFx0XHRcdGlzT3JnQWRtaW4gPSB0cnVlXG5cdFx0cmV0dXJuIGlzT3JnQWRtaW5cblxuXG5cdCMg5Yik5pat5pWw57uEb3JnSWRz5Lit55qEb3JnIGlk6ZuG5ZCI5a+55LqO55So5oi3dXNlcklk5piv5ZCm5pyJ5YWo6YOo57uE57uH566h55CG5ZGY5p2D6ZmQ77yM5Y+q5pyJ5pWw57uEb3JnSWRz5Lit5q+P5Liq57uE57uH6YO95pyJ5p2D6ZmQ5omN6L+U5ZuedHJ1Ze+8jOWPjeS5i+i/lOWbnmZhbHNlXG5cdFN0ZWVkb3MuaXNPcmdBZG1pbkJ5QWxsT3JnSWRzID0gKG9yZ0lkcywgdXNlcklkKS0+XG5cdFx0dW5sZXNzIG9yZ0lkcy5sZW5ndGhcblx0XHRcdHJldHVybiB0cnVlXG5cdFx0aSA9IDBcblx0XHR3aGlsZSBpIDwgb3JnSWRzLmxlbmd0aFxuXHRcdFx0aXNPcmdBZG1pbiA9IFN0ZWVkb3MuaXNPcmdBZG1pbkJ5T3JnSWRzIFtvcmdJZHNbaV1dLCB1c2VySWRcblx0XHRcdHVubGVzcyBpc09yZ0FkbWluXG5cdFx0XHRcdGJyZWFrXG5cdFx0XHRpKytcblx0XHRyZXR1cm4gaXNPcmdBZG1pblxuXG5cdFN0ZWVkb3MuYWJzb2x1dGVVcmwgPSAodXJsKS0+XG5cdFx0aWYgdXJsXG5cdFx0XHQjIHVybOS7pVwiL1wi5byA5aS055qE6K+d77yM5Y675o6J5byA5aS055qEXCIvXCJcblx0XHRcdHVybCA9IHVybC5yZXBsYWNlKC9eXFwvLyxcIlwiKVxuXHRcdGlmIChNZXRlb3IuaXNDb3Jkb3ZhKVxuXHRcdFx0cmV0dXJuIE1ldGVvci5hYnNvbHV0ZVVybCh1cmwpO1xuXHRcdGVsc2Vcblx0XHRcdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdFx0XHR0cnlcblx0XHRcdFx0XHRyb290X3VybCA9IG5ldyBVUkwoTWV0ZW9yLmFic29sdXRlVXJsKCkpXG5cdFx0XHRcdFx0aWYgdXJsXG5cdFx0XHRcdFx0XHRyZXR1cm4gcm9vdF91cmwucGF0aG5hbWUgKyB1cmxcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRyZXR1cm4gcm9vdF91cmwucGF0aG5hbWVcblx0XHRcdFx0Y2F0Y2ggZVxuXHRcdFx0XHRcdHJldHVybiBNZXRlb3IuYWJzb2x1dGVVcmwodXJsKVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRNZXRlb3IuYWJzb2x1dGVVcmwodXJsKVxuXG5cdCNcdOmAmui/h3JlcXVlc3QuaGVhZGVyc+OAgWNvb2tpZSDojrflvpfmnInmlYjnlKjmiLdcblx0U3RlZWRvcy5nZXRBUElMb2dpblVzZXJcdD0gKHJlcSwgcmVzKSAtPlxuXG5cdFx0dXNlcm5hbWUgPSByZXEucXVlcnk/LnVzZXJuYW1lXG5cblx0XHRwYXNzd29yZCA9IHJlcS5xdWVyeT8ucGFzc3dvcmRcblxuXHRcdGlmIHVzZXJuYW1lICYmIHBhc3N3b3JkXG5cdFx0XHR1c2VyID0gZGIudXNlcnMuZmluZE9uZSh7c3RlZWRvc19pZDogdXNlcm5hbWV9KVxuXG5cdFx0XHRpZiAhdXNlclxuXHRcdFx0XHRyZXR1cm4gZmFsc2VcblxuXHRcdFx0cmVzdWx0ID0gQWNjb3VudHMuX2NoZWNrUGFzc3dvcmQgdXNlciwgcGFzc3dvcmRcblxuXHRcdFx0aWYgcmVzdWx0LmVycm9yXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihyZXN1bHQuZXJyb3IpXG5cdFx0XHRlbHNlXG5cdFx0XHRcdHJldHVybiB1c2VyXG5cblx0XHR1c2VySWQgPSByZXEucXVlcnk/W1wiWC1Vc2VyLUlkXCJdXG5cblx0XHRhdXRoVG9rZW4gPSByZXEucXVlcnk/W1wiWC1BdXRoLVRva2VuXCJdXG5cblx0XHRpZiBTdGVlZG9zLmNoZWNrQXV0aFRva2VuKHVzZXJJZCxhdXRoVG9rZW4pXG5cdFx0XHRyZXR1cm4gZGIudXNlcnMuZmluZE9uZSh7X2lkOiB1c2VySWR9KVxuXG5cdFx0Y29va2llcyA9IG5ldyBDb29raWVzKHJlcSwgcmVzKTtcblxuXHRcdGlmIHJlcS5oZWFkZXJzXG5cdFx0XHR1c2VySWQgPSByZXEuaGVhZGVyc1tcIngtdXNlci1pZFwiXVxuXHRcdFx0YXV0aFRva2VuID0gcmVxLmhlYWRlcnNbXCJ4LWF1dGgtdG9rZW5cIl1cblxuXHRcdCMgdGhlbiBjaGVjayBjb29raWVcblx0XHRpZiAhdXNlcklkIG9yICFhdXRoVG9rZW5cblx0XHRcdHVzZXJJZCA9IGNvb2tpZXMuZ2V0KFwiWC1Vc2VyLUlkXCIpXG5cdFx0XHRhdXRoVG9rZW4gPSBjb29raWVzLmdldChcIlgtQXV0aC1Ub2tlblwiKVxuXG5cdFx0aWYgIXVzZXJJZCBvciAhYXV0aFRva2VuXG5cdFx0XHRyZXR1cm4gZmFsc2VcblxuXHRcdGlmIFN0ZWVkb3MuY2hlY2tBdXRoVG9rZW4odXNlcklkLCBhdXRoVG9rZW4pXG5cdFx0XHRyZXR1cm4gZGIudXNlcnMuZmluZE9uZSh7X2lkOiB1c2VySWR9KVxuXG5cdFx0cmV0dXJuIGZhbHNlXG5cblx0I1x05qOA5p+ldXNlcklk44CBYXV0aFRva2Vu5piv5ZCm5pyJ5pWIXG5cdFN0ZWVkb3MuY2hlY2tBdXRoVG9rZW4gPSAodXNlcklkLCBhdXRoVG9rZW4pIC0+XG5cdFx0aWYgdXNlcklkIGFuZCBhdXRoVG9rZW5cblx0XHRcdGhhc2hlZFRva2VuID0gQWNjb3VudHMuX2hhc2hMb2dpblRva2VuKGF1dGhUb2tlbilcblx0XHRcdHVzZXIgPSBNZXRlb3IudXNlcnMuZmluZE9uZVxuXHRcdFx0XHRfaWQ6IHVzZXJJZCxcblx0XHRcdFx0XCJzZXJ2aWNlcy5yZXN1bWUubG9naW5Ub2tlbnMuaGFzaGVkVG9rZW5cIjogaGFzaGVkVG9rZW5cblx0XHRcdGlmIHVzZXJcblx0XHRcdFx0cmV0dXJuIHRydWVcblx0XHRcdGVsc2Vcblx0XHRcdFx0cmV0dXJuIGZhbHNlXG5cdFx0cmV0dXJuIGZhbHNlXG5cblxuaWYgTWV0ZW9yLmlzU2VydmVyXG5cdGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xuXHRTdGVlZG9zLmRlY3J5cHQgPSAocGFzc3dvcmQsIGtleSwgaXYpLT5cblx0XHR0cnlcblx0XHRcdGtleTMyID0gXCJcIlxuXHRcdFx0bGVuID0ga2V5Lmxlbmd0aFxuXHRcdFx0aWYgbGVuIDwgMzJcblx0XHRcdFx0YyA9IFwiXCJcblx0XHRcdFx0aSA9IDBcblx0XHRcdFx0bSA9IDMyIC0gbGVuXG5cdFx0XHRcdHdoaWxlIGkgPCBtXG5cdFx0XHRcdFx0YyA9IFwiIFwiICsgY1xuXHRcdFx0XHRcdGkrK1xuXHRcdFx0XHRrZXkzMiA9IGtleSArIGNcblx0XHRcdGVsc2UgaWYgbGVuID49IDMyXG5cdFx0XHRcdGtleTMyID0ga2V5LnNsaWNlKDAsIDMyKVxuXG5cdFx0XHRkZWNpcGhlciA9IGNyeXB0by5jcmVhdGVEZWNpcGhlcml2KCdhZXMtMjU2LWNiYycsIG5ldyBCdWZmZXIoa2V5MzIsICd1dGY4JyksIG5ldyBCdWZmZXIoaXYsICd1dGY4JykpXG5cblx0XHRcdGRlY2lwaGVyTXNnID0gQnVmZmVyLmNvbmNhdChbZGVjaXBoZXIudXBkYXRlKHBhc3N3b3JkLCAnYmFzZTY0JyksIGRlY2lwaGVyLmZpbmFsKCldKVxuXG5cdFx0XHRwYXNzd29yZCA9IGRlY2lwaGVyTXNnLnRvU3RyaW5nKCk7XG5cdFx0XHRyZXR1cm4gcGFzc3dvcmQ7XG5cdFx0Y2F0Y2ggZVxuXHRcdFx0cmV0dXJuIHBhc3N3b3JkO1xuXG5cdFN0ZWVkb3MuZW5jcnlwdCA9IChwYXNzd29yZCwga2V5LCBpdiktPlxuXHRcdGtleTMyID0gXCJcIlxuXHRcdGxlbiA9IGtleS5sZW5ndGhcblx0XHRpZiBsZW4gPCAzMlxuXHRcdFx0YyA9IFwiXCJcblx0XHRcdGkgPSAwXG5cdFx0XHRtID0gMzIgLSBsZW5cblx0XHRcdHdoaWxlIGkgPCBtXG5cdFx0XHRcdGMgPSBcIiBcIiArIGNcblx0XHRcdFx0aSsrXG5cdFx0XHRrZXkzMiA9IGtleSArIGNcblx0XHRlbHNlIGlmIGxlbiA+PSAzMlxuXHRcdFx0a2V5MzIgPSBrZXkuc2xpY2UoMCwgMzIpXG5cblx0XHRjaXBoZXIgPSBjcnlwdG8uY3JlYXRlQ2lwaGVyaXYoJ2Flcy0yNTYtY2JjJywgbmV3IEJ1ZmZlcihrZXkzMiwgJ3V0ZjgnKSwgbmV3IEJ1ZmZlcihpdiwgJ3V0ZjgnKSlcblxuXHRcdGNpcGhlcmVkTXNnID0gQnVmZmVyLmNvbmNhdChbY2lwaGVyLnVwZGF0ZShuZXcgQnVmZmVyKHBhc3N3b3JkLCAndXRmOCcpKSwgY2lwaGVyLmZpbmFsKCldKVxuXG5cdFx0cGFzc3dvcmQgPSBjaXBoZXJlZE1zZy50b1N0cmluZygnYmFzZTY0JylcblxuXHRcdHJldHVybiBwYXNzd29yZDtcblxuXHRTdGVlZG9zLmdldFVzZXJJZEZyb21BY2Nlc3NUb2tlbiA9IChhY2Nlc3NfdG9rZW4pLT5cblxuXHRcdGlmICFhY2Nlc3NfdG9rZW5cblx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0dXNlcklkID0gYWNjZXNzX3Rva2VuLnNwbGl0KFwiLVwiKVswXVxuXG5cdFx0aGFzaGVkVG9rZW4gPSBBY2NvdW50cy5faGFzaExvZ2luVG9rZW4oYWNjZXNzX3Rva2VuKVxuXG5cdFx0dXNlciA9IGRiLnVzZXJzLmZpbmRPbmUoe19pZDogdXNlcklkLCBcInNlY3JldHMuaGFzaGVkVG9rZW5cIjogaGFzaGVkVG9rZW59KVxuXG5cdFx0aWYgdXNlclxuXHRcdFx0cmV0dXJuIHVzZXJJZFxuXHRcdGVsc2Vcblx0XHRcdCMg5aaC5p6cdXNlcuihqOacquafpeWIsO+8jOWImeS9v+eUqG9hdXRoMuWNj+iurueUn+aIkOeahHRva2Vu5p+l5om+55So5oi3XG5cdFx0XHRjb2xsZWN0aW9uID0gb0F1dGgyU2VydmVyLmNvbGxlY3Rpb25zLmFjY2Vzc1Rva2VuXG5cblx0XHRcdG9iaiA9IGNvbGxlY3Rpb24uZmluZE9uZSh7J2FjY2Vzc1Rva2VuJzogYWNjZXNzX3Rva2VufSlcblx0XHRcdGlmIG9ialxuXHRcdFx0XHQjIOWIpOaWrXRva2Vu55qE5pyJ5pWI5pyfXG5cdFx0XHRcdGlmIG9iaj8uZXhwaXJlcyA8IG5ldyBEYXRlKClcblx0XHRcdFx0XHRyZXR1cm4gXCJvYXV0aDIgYWNjZXNzIHRva2VuOlwiK2FjY2Vzc190b2tlbitcIiBpcyBleHBpcmVkLlwiXG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRyZXR1cm4gb2JqPy51c2VySWRcblx0XHRcdGVsc2Vcblx0XHRcdFx0cmV0dXJuIFwib2F1dGgyIGFjY2VzcyB0b2tlbjpcIithY2Nlc3NfdG9rZW4rXCIgaXMgbm90IGZvdW5kLlwiXG5cdFx0cmV0dXJuIG51bGxcblxuXHRTdGVlZG9zLmdldFVzZXJJZEZyb21BdXRoVG9rZW4gPSAocmVxLCByZXMpLT5cblxuXHRcdHVzZXJJZCA9IHJlcS5xdWVyeT9bXCJYLVVzZXItSWRcIl1cblxuXHRcdGF1dGhUb2tlbiA9IHJlcS5xdWVyeT9bXCJYLUF1dGgtVG9rZW5cIl1cblxuXHRcdGlmIFN0ZWVkb3MuY2hlY2tBdXRoVG9rZW4odXNlcklkLGF1dGhUb2tlbilcblx0XHRcdHJldHVybiBkYi51c2Vycy5maW5kT25lKHtfaWQ6IHVzZXJJZH0pPy5faWRcblxuXHRcdGNvb2tpZXMgPSBuZXcgQ29va2llcyhyZXEsIHJlcyk7XG5cblx0XHRpZiByZXEuaGVhZGVyc1xuXHRcdFx0dXNlcklkID0gcmVxLmhlYWRlcnNbXCJ4LXVzZXItaWRcIl1cblx0XHRcdGF1dGhUb2tlbiA9IHJlcS5oZWFkZXJzW1wieC1hdXRoLXRva2VuXCJdXG5cblx0XHQjIHRoZW4gY2hlY2sgY29va2llXG5cdFx0aWYgIXVzZXJJZCBvciAhYXV0aFRva2VuXG5cdFx0XHR1c2VySWQgPSBjb29raWVzLmdldChcIlgtVXNlci1JZFwiKVxuXHRcdFx0YXV0aFRva2VuID0gY29va2llcy5nZXQoXCJYLUF1dGgtVG9rZW5cIilcblxuXHRcdGlmICF1c2VySWQgb3IgIWF1dGhUb2tlblxuXHRcdFx0cmV0dXJuIG51bGxcblxuXHRcdGlmIFN0ZWVkb3MuY2hlY2tBdXRoVG9rZW4odXNlcklkLCBhdXRoVG9rZW4pXG5cdFx0XHRyZXR1cm4gZGIudXNlcnMuZmluZE9uZSh7X2lkOiB1c2VySWR9KT8uX2lkXG5cblx0U3RlZWRvcy5BUElBdXRoZW50aWNhdGlvbkNoZWNrID0gKHJlcSwgcmVzKSAtPlxuXHRcdHRyeVxuXHRcdFx0dXNlcklkID0gcmVxLnVzZXJJZFxuXG5cdFx0XHR1c2VyID0gZGIudXNlcnMuZmluZE9uZSh7X2lkOiB1c2VySWR9KVxuXG5cdFx0XHRpZiAhdXNlcklkIHx8ICF1c2VyXG5cdFx0XHRcdEpzb25Sb3V0ZXMuc2VuZFJlc3VsdCByZXMsXG5cdFx0XHRcdFx0ZGF0YTpcblx0XHRcdFx0XHRcdFwiZXJyb3JcIjogXCJWYWxpZGF0ZSBSZXF1ZXN0IC0tIE1pc3NpbmcgWC1BdXRoLVRva2VuLFgtVXNlci1JZCBPciBhY2Nlc3NfdG9rZW5cIixcblx0XHRcdFx0XHRjb2RlOiA0MDEsXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0Y2F0Y2ggZVxuXHRcdFx0aWYgIXVzZXJJZCB8fCAhdXNlclxuXHRcdFx0XHRKc29uUm91dGVzLnNlbmRSZXN1bHQgcmVzLFxuXHRcdFx0XHRcdGNvZGU6IDQwMSxcblx0XHRcdFx0XHRkYXRhOlxuXHRcdFx0XHRcdFx0XCJlcnJvclwiOiBlLm1lc3NhZ2UsXG5cdFx0XHRcdFx0XHRcInN1Y2Nlc3NcIjogZmFsc2Vcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cbiMgVGhpcyB3aWxsIGFkZCB1bmRlcnNjb3JlLnN0cmluZyBtZXRob2RzIHRvIFVuZGVyc2NvcmUuanNcbiMgZXhjZXB0IGZvciBpbmNsdWRlLCBjb250YWlucywgcmV2ZXJzZSBhbmQgam9pbiB0aGF0IGFyZVxuIyBkcm9wcGVkIGJlY2F1c2UgdGhleSBjb2xsaWRlIHdpdGggdGhlIGZ1bmN0aW9ucyBhbHJlYWR5XG4jIGRlZmluZWQgYnkgVW5kZXJzY29yZS5qcy5cblxubWl4aW4gPSAob2JqKSAtPlxuXHRfLmVhY2ggXy5mdW5jdGlvbnMob2JqKSwgKG5hbWUpIC0+XG5cdFx0aWYgbm90IF9bbmFtZV0gYW5kIG5vdCBfLnByb3RvdHlwZVtuYW1lXT9cblx0XHRcdGZ1bmMgPSBfW25hbWVdID0gb2JqW25hbWVdXG5cdFx0XHRfLnByb3RvdHlwZVtuYW1lXSA9IC0+XG5cdFx0XHRcdGFyZ3MgPSBbdGhpcy5fd3JhcHBlZF1cblx0XHRcdFx0cHVzaC5hcHBseShhcmdzLCBhcmd1bWVudHMpXG5cdFx0XHRcdHJldHVybiByZXN1bHQuY2FsbCh0aGlzLCBmdW5jLmFwcGx5KF8sIGFyZ3MpKVxuXG4jbWl4aW4oX3MuZXhwb3J0cygpKVxuXG5pZiBNZXRlb3IuaXNTZXJ2ZXJcbiMg5Yik5pat5piv5ZCm5piv6IqC5YGH5pelXG5cdFN0ZWVkb3MuaXNIb2xpZGF5ID0gKGRhdGUpLT5cblx0XHRpZiAhZGF0ZVxuXHRcdFx0ZGF0ZSA9IG5ldyBEYXRlXG5cdFx0Y2hlY2sgZGF0ZSwgRGF0ZVxuXHRcdGRheSA9IGRhdGUuZ2V0RGF5KClcblx0XHQjIOWRqOWFreWRqOaXpeS4uuWBh+acn1xuXHRcdGlmIGRheSBpcyA2IG9yIGRheSBpcyAwXG5cdFx0XHRyZXR1cm4gdHJ1ZVxuXG5cdFx0cmV0dXJuIGZhbHNlXG5cdCMg5qC55o2u5Lyg5YWl5pe26Ze0KGRhdGUp6K6h566X5Yeg5Liq5bel5L2c5pelKGRheXMp5ZCO55qE5pe26Ze0LGRheXPnm67liY3lj6rog73mmK/mlbTmlbBcblx0U3RlZWRvcy5jYWN1bGF0ZVdvcmtpbmdUaW1lID0gKGRhdGUsIGRheXMpLT5cblx0XHRjaGVjayBkYXRlLCBEYXRlXG5cdFx0Y2hlY2sgZGF5cywgTnVtYmVyXG5cdFx0cGFyYW1fZGF0ZSA9IG5ldyBEYXRlIGRhdGVcblx0XHRjYWN1bGF0ZURhdGUgPSAoaSwgZGF5cyktPlxuXHRcdFx0aWYgaSA8IGRheXNcblx0XHRcdFx0cGFyYW1fZGF0ZSA9IG5ldyBEYXRlKHBhcmFtX2RhdGUuZ2V0VGltZSgpICsgMjQqNjAqNjAqMTAwMClcblx0XHRcdFx0aWYgIVN0ZWVkb3MuaXNIb2xpZGF5KHBhcmFtX2RhdGUpXG5cdFx0XHRcdFx0aSsrXG5cdFx0XHRcdGNhY3VsYXRlRGF0ZShpLCBkYXlzKVxuXHRcdFx0cmV0dXJuXG5cdFx0Y2FjdWxhdGVEYXRlKDAsIGRheXMpXG5cdFx0cmV0dXJuIHBhcmFtX2RhdGVcblxuXHQjIOiuoeeul+WNiuS4quW3peS9nOaXpeWQjueahOaXtumXtFxuXHQjIOWPguaVsCBuZXh05aaC5p6c5Li6dHJ1ZeWImeihqOekuuWPquiuoeeul2RhdGXml7bpl7TlkI7pnaLntKfmjqXnnYDnmoR0aW1lX3BvaW50c1xuXHRTdGVlZG9zLmNhY3VsYXRlUGx1c0hhbGZXb3JraW5nRGF5ID0gKGRhdGUsIG5leHQpIC0+XG5cdFx0Y2hlY2sgZGF0ZSwgRGF0ZVxuXHRcdHRpbWVfcG9pbnRzID0gTWV0ZW9yLnNldHRpbmdzLnJlbWluZD8udGltZV9wb2ludHNcblx0XHRpZiBub3QgdGltZV9wb2ludHMgb3IgXy5pc0VtcHR5KHRpbWVfcG9pbnRzKVxuXHRcdFx0Y29uc29sZS5lcnJvciBcInRpbWVfcG9pbnRzIGlzIG51bGxcIlxuXHRcdFx0dGltZV9wb2ludHMgPSBbe1wiaG91clwiOiA4LCBcIm1pbnV0ZVwiOiAzMCB9LCB7XCJob3VyXCI6IDE0LCBcIm1pbnV0ZVwiOiAzMCB9XVxuXG5cdFx0bGVuID0gdGltZV9wb2ludHMubGVuZ3RoXG5cdFx0c3RhcnRfZGF0ZSA9IG5ldyBEYXRlIGRhdGVcblx0XHRlbmRfZGF0ZSA9IG5ldyBEYXRlIGRhdGVcblx0XHRzdGFydF9kYXRlLnNldEhvdXJzIHRpbWVfcG9pbnRzWzBdLmhvdXJcblx0XHRzdGFydF9kYXRlLnNldE1pbnV0ZXMgdGltZV9wb2ludHNbMF0ubWludXRlXG5cdFx0ZW5kX2RhdGUuc2V0SG91cnMgdGltZV9wb2ludHNbbGVuIC0gMV0uaG91clxuXHRcdGVuZF9kYXRlLnNldE1pbnV0ZXMgdGltZV9wb2ludHNbbGVuIC0gMV0ubWludXRlXG5cblx0XHRjYWN1bGF0ZWRfZGF0ZSA9IG5ldyBEYXRlIGRhdGVcblxuXHRcdGogPSAwXG5cdFx0bWF4X2luZGV4ID0gbGVuIC0gMVxuXHRcdGlmIGRhdGUgPCBzdGFydF9kYXRlXG5cdFx0XHRpZiBuZXh0XG5cdFx0XHRcdGogPSAwXG5cdFx0XHRlbHNlXG5cdFx0XHRcdCMg5Yqg5Y2K5LiqdGltZV9wb2ludHNcblx0XHRcdFx0aiA9IGxlbi8yXG5cdFx0ZWxzZSBpZiBkYXRlID49IHN0YXJ0X2RhdGUgYW5kIGRhdGUgPCBlbmRfZGF0ZVxuXHRcdFx0aSA9IDBcblx0XHRcdHdoaWxlIGkgPCBtYXhfaW5kZXhcblx0XHRcdFx0Zmlyc3RfZGF0ZSA9IG5ldyBEYXRlIGRhdGVcblx0XHRcdFx0c2Vjb25kX2RhdGUgPSBuZXcgRGF0ZSBkYXRlXG5cdFx0XHRcdGZpcnN0X2RhdGUuc2V0SG91cnMgdGltZV9wb2ludHNbaV0uaG91clxuXHRcdFx0XHRmaXJzdF9kYXRlLnNldE1pbnV0ZXMgdGltZV9wb2ludHNbaV0ubWludXRlXG5cdFx0XHRcdHNlY29uZF9kYXRlLnNldEhvdXJzIHRpbWVfcG9pbnRzW2kgKyAxXS5ob3VyXG5cdFx0XHRcdHNlY29uZF9kYXRlLnNldE1pbnV0ZXMgdGltZV9wb2ludHNbaSArIDFdLm1pbnV0ZVxuXG5cdFx0XHRcdGlmIGRhdGUgPj0gZmlyc3RfZGF0ZSBhbmQgZGF0ZSA8IHNlY29uZF9kYXRlXG5cdFx0XHRcdFx0YnJlYWtcblxuXHRcdFx0XHRpKytcblxuXHRcdFx0aWYgbmV4dFxuXHRcdFx0XHRqID0gaSArIDFcblx0XHRcdGVsc2Vcblx0XHRcdFx0aiA9IGkgKyBsZW4vMlxuXG5cdFx0ZWxzZSBpZiBkYXRlID49IGVuZF9kYXRlXG5cdFx0XHRpZiBuZXh0XG5cdFx0XHRcdGogPSBtYXhfaW5kZXggKyAxXG5cdFx0XHRlbHNlXG5cdFx0XHRcdGogPSBtYXhfaW5kZXggKyBsZW4vMlxuXG5cdFx0aWYgaiA+IG1heF9pbmRleFxuXHRcdFx0IyDpmpTlpKnpnIDliKTmlq3oioLlgYfml6Vcblx0XHRcdGNhY3VsYXRlZF9kYXRlID0gU3RlZWRvcy5jYWN1bGF0ZVdvcmtpbmdUaW1lIGRhdGUsIDFcblx0XHRcdGNhY3VsYXRlZF9kYXRlLnNldEhvdXJzIHRpbWVfcG9pbnRzW2ogLSBtYXhfaW5kZXggLSAxXS5ob3VyXG5cdFx0XHRjYWN1bGF0ZWRfZGF0ZS5zZXRNaW51dGVzIHRpbWVfcG9pbnRzW2ogLSBtYXhfaW5kZXggLSAxXS5taW51dGVcblx0XHRlbHNlIGlmIGogPD0gbWF4X2luZGV4XG5cdFx0XHRjYWN1bGF0ZWRfZGF0ZS5zZXRIb3VycyB0aW1lX3BvaW50c1tqXS5ob3VyXG5cdFx0XHRjYWN1bGF0ZWRfZGF0ZS5zZXRNaW51dGVzIHRpbWVfcG9pbnRzW2pdLm1pbnV0ZVxuXG5cdFx0cmV0dXJuIGNhY3VsYXRlZF9kYXRlXG5cbmlmIE1ldGVvci5pc1NlcnZlclxuXHRfLmV4dGVuZCBTdGVlZG9zLFxuXHRcdGdldFN0ZWVkb3NUb2tlbjogKGFwcElkLCB1c2VySWQsIGF1dGhUb2tlbiktPlxuXHRcdFx0Y3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJylcblx0XHRcdGFwcCA9IGRiLmFwcHMuZmluZE9uZShhcHBJZClcblx0XHRcdGlmIGFwcFxuXHRcdFx0XHRzZWNyZXQgPSBhcHAuc2VjcmV0XG5cblx0XHRcdGlmIHVzZXJJZCBhbmQgYXV0aFRva2VuXG5cdFx0XHRcdGhhc2hlZFRva2VuID0gQWNjb3VudHMuX2hhc2hMb2dpblRva2VuKGF1dGhUb2tlbilcblx0XHRcdFx0dXNlciA9IE1ldGVvci51c2Vycy5maW5kT25lXG5cdFx0XHRcdFx0X2lkOiB1c2VySWQsXG5cdFx0XHRcdFx0XCJzZXJ2aWNlcy5yZXN1bWUubG9naW5Ub2tlbnMuaGFzaGVkVG9rZW5cIjogaGFzaGVkVG9rZW5cblx0XHRcdFx0aWYgdXNlclxuXHRcdFx0XHRcdHN0ZWVkb3NfaWQgPSB1c2VyLnN0ZWVkb3NfaWRcblx0XHRcdFx0XHRpZiBhcHAuc2VjcmV0XG5cdFx0XHRcdFx0XHRpdiA9IGFwcC5zZWNyZXRcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRpdiA9IFwiLTg3NjItZmNiMzY5YjJlOFwiXG5cdFx0XHRcdFx0bm93ID0gcGFyc2VJbnQobmV3IERhdGUoKS5nZXRUaW1lKCkvMTAwMCkudG9TdHJpbmcoKVxuXHRcdFx0XHRcdGtleTMyID0gXCJcIlxuXHRcdFx0XHRcdGxlbiA9IHN0ZWVkb3NfaWQubGVuZ3RoXG5cdFx0XHRcdFx0aWYgbGVuIDwgMzJcblx0XHRcdFx0XHRcdGMgPSBcIlwiXG5cdFx0XHRcdFx0XHRpID0gMFxuXHRcdFx0XHRcdFx0bSA9IDMyIC0gbGVuXG5cdFx0XHRcdFx0XHR3aGlsZSBpIDwgbVxuXHRcdFx0XHRcdFx0XHRjID0gXCIgXCIgKyBjXG5cdFx0XHRcdFx0XHRcdGkrK1xuXHRcdFx0XHRcdFx0a2V5MzIgPSBzdGVlZG9zX2lkICsgY1xuXHRcdFx0XHRcdGVsc2UgaWYgbGVuID49IDMyXG5cdFx0XHRcdFx0XHRrZXkzMiA9IHN0ZWVkb3NfaWQuc2xpY2UoMCwzMilcblxuXHRcdFx0XHRcdGNpcGhlciA9IGNyeXB0by5jcmVhdGVDaXBoZXJpdignYWVzLTI1Ni1jYmMnLCBuZXcgQnVmZmVyKGtleTMyLCAndXRmOCcpLCBuZXcgQnVmZmVyKGl2LCAndXRmOCcpKVxuXG5cdFx0XHRcdFx0Y2lwaGVyZWRNc2cgPSBCdWZmZXIuY29uY2F0KFtjaXBoZXIudXBkYXRlKG5ldyBCdWZmZXIobm93LCAndXRmOCcpKSwgY2lwaGVyLmZpbmFsKCldKVxuXG5cdFx0XHRcdFx0c3RlZWRvc190b2tlbiA9IGNpcGhlcmVkTXNnLnRvU3RyaW5nKCdiYXNlNjQnKVxuXG5cdFx0XHRyZXR1cm4gc3RlZWRvc190b2tlblxuXG5cdFx0bG9jYWxlOiAodXNlcklkLCBpc0kxOG4pLT5cblx0XHRcdHVzZXIgPSBkYi51c2Vycy5maW5kT25lKHtfaWQ6dXNlcklkfSx7ZmllbGRzOiB7bG9jYWxlOiAxfX0pXG5cdFx0XHRsb2NhbGUgPSB1c2VyPy5sb2NhbGVcblx0XHRcdGlmIGlzSTE4blxuXHRcdFx0XHRpZiBsb2NhbGUgPT0gXCJlbi11c1wiXG5cdFx0XHRcdFx0bG9jYWxlID0gXCJlblwiXG5cdFx0XHRcdGlmIGxvY2FsZSA9PSBcInpoLWNuXCJcblx0XHRcdFx0XHRsb2NhbGUgPSBcInpoLUNOXCJcblx0XHRcdHJldHVybiBsb2NhbGVcblxuXHRcdGNoZWNrVXNlcm5hbWVBdmFpbGFiaWxpdHk6ICh1c2VybmFtZSkgLT5cblx0XHRcdHJldHVybiBub3QgTWV0ZW9yLnVzZXJzLmZpbmRPbmUoeyB1c2VybmFtZTogeyAkcmVnZXggOiBuZXcgUmVnRXhwKFwiXlwiICsgTWV0ZW9yLl9lc2NhcGVSZWdFeHAodXNlcm5hbWUpLnRyaW0oKSArIFwiJFwiLCBcImlcIikgfSB9KVxuXG5cblx0XHR2YWxpZGF0ZVBhc3N3b3JkOiAocHdkKS0+XG5cdFx0XHRyZWFzb24gPSB0IFwicGFzc3dvcmRfaW52YWxpZFwiXG5cdFx0XHR2YWxpZCA9IHRydWVcblx0XHRcdHVubGVzcyBwd2Rcblx0XHRcdFx0dmFsaWQgPSBmYWxzZVxuXG5cdFx0XHRwYXNzd29yUG9saWN5ID0gTWV0ZW9yLnNldHRpbmdzLnB1YmxpYz8ucGFzc3dvcmQ/LnBvbGljeVxuXHRcdFx0cGFzc3dvclBvbGljeUVycm9yID0gTWV0ZW9yLnNldHRpbmdzLnB1YmxpYz8ucGFzc3dvcmQ/LnBvbGljeUVycm9yXG5cdFx0XHRpZiBwYXNzd29yUG9saWN5XG5cdFx0XHRcdGlmICEobmV3IFJlZ0V4cChwYXNzd29yUG9saWN5KSkudGVzdChwd2QgfHwgJycpXG5cdFx0XHRcdFx0cmVhc29uID0gcGFzc3dvclBvbGljeUVycm9yXG5cdFx0XHRcdFx0dmFsaWQgPSBmYWxzZVxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0dmFsaWQgPSB0cnVlXG4jXHRcdFx0ZWxzZVxuI1x0XHRcdFx0dW5sZXNzIC9cXGQrLy50ZXN0KHB3ZClcbiNcdFx0XHRcdFx0dmFsaWQgPSBmYWxzZVxuI1x0XHRcdFx0dW5sZXNzIC9bYS16QS1aXSsvLnRlc3QocHdkKVxuI1x0XHRcdFx0XHR2YWxpZCA9IGZhbHNlXG4jXHRcdFx0XHRpZiBwd2QubGVuZ3RoIDwgOFxuI1x0XHRcdFx0XHR2YWxpZCA9IGZhbHNlXG5cdFx0XHRpZiB2YWxpZFxuXHRcdFx0XHRyZXR1cm4gdHJ1ZVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRyZXR1cm4gZXJyb3I6XG5cdFx0XHRcdFx0cmVhc29uOiByZWFzb25cblxuU3RlZWRvcy5jb252ZXJ0U3BlY2lhbENoYXJhY3RlciA9IChzdHIpLT5cblx0cmV0dXJuIHN0ci5yZXBsYWNlKC8oW1xcXlxcJFxcKFxcKVxcKlxcK1xcP1xcLlxcXFxcXHxcXFtcXF1cXHtcXH1dKS9nLCBcIlxcXFwkMVwiKVxuXG5TdGVlZG9zLnJlbW92ZVNwZWNpYWxDaGFyYWN0ZXIgPSAoc3RyKS0+XG5cdHJldHVybiBzdHIucmVwbGFjZSgvKFtcXF5cXCRcXChcXClcXCpcXCtcXD9cXC5cXFxcXFx8XFxbXFxdXFx7XFx9XFx+XFxgXFxAXFwjXFwlXFwmXFw9XFwnXFxcIlxcOlxcO1xcPFxcPlxcLFxcL10pL2csIFwiXCIpXG5cbkNyZWF0b3IuZ2V0REJBcHBzID0gKHNwYWNlX2lkKS0+XG5cdGRiQXBwcyA9IHt9XG5cdENyZWF0b3IuQ29sbGVjdGlvbnNbXCJhcHBzXCJdLmZpbmQoe3NwYWNlOiBzcGFjZV9pZCxpc19jcmVhdG9yOnRydWUsdmlzaWJsZTp0cnVlfSwge1xuXHRcdGZpZWxkczoge1xuXHRcdFx0Y3JlYXRlZDogMCxcblx0XHRcdGNyZWF0ZWRfYnk6IDAsXG5cdFx0XHRtb2RpZmllZDogMCxcblx0XHRcdG1vZGlmaWVkX2J5OiAwXG5cdFx0fVxuXHR9KS5mb3JFYWNoIChhcHApLT5cblx0XHRkYkFwcHNbYXBwLl9pZF0gPSBhcHBcblxuXHRyZXR1cm4gZGJBcHBzXG5cbkNyZWF0b3IuZ2V0REJEYXNoYm9hcmRzID0gKHNwYWNlX2lkKS0+XG5cdGRiRGFzaGJvYXJkcyA9IHt9XG5cdENyZWF0b3IuQ29sbGVjdGlvbnNbXCJkYXNoYm9hcmRcIl0uZmluZCh7c3BhY2U6IHNwYWNlX2lkfSwge1xuXHRcdGZpZWxkczoge1xuXHRcdFx0Y3JlYXRlZDogMCxcblx0XHRcdGNyZWF0ZWRfYnk6IDAsXG5cdFx0XHRtb2RpZmllZDogMCxcblx0XHRcdG1vZGlmaWVkX2J5OiAwXG5cdFx0fVxuXHR9KS5mb3JFYWNoIChkYXNoYm9hcmQpLT5cblx0XHRkYkRhc2hib2FyZHNbZGFzaGJvYXJkLl9pZF0gPSBkYXNoYm9hcmRcblxuXHRyZXR1cm4gZGJEYXNoYm9hcmRzXG5cbmlmIE1ldGVvci5pc1NlcnZlclxuXHRDb29raWVzID0gcmVxdWlyZShcImNvb2tpZXNcIilcblx0U3RlZWRvcy5nZXRBdXRoVG9rZW4gPSAocmVxLCByZXMpLT5cblx0XHRjb29raWVzID0gbmV3IENvb2tpZXMocmVxLCByZXMpXG5cdFx0YXV0aFRva2VuID0gcmVxLmhlYWRlcnNbJ3gtYXV0aC10b2tlbiddIHx8IGNvb2tpZXMuZ2V0KFwiWC1BdXRoLVRva2VuXCIpXG5cdFx0aWYgIWF1dGhUb2tlbiAmJiByZXEuaGVhZGVycy5hdXRob3JpemF0aW9uICYmIHJlcS5oZWFkZXJzLmF1dGhvcml6YXRpb24uc3BsaXQoJyAnKVswXSA9PSAnQmVhcmVyJ1xuXHRcdFx0YXV0aFRva2VuID0gcmVxLmhlYWRlcnMuYXV0aG9yaXphdGlvbi5zcGxpdCgnICcpWzFdXG5cdFx0cmV0dXJuIGF1dGhUb2tlblxuXG5pZiBNZXRlb3IuaXNDbGllbnRcblx0TWV0ZW9yLmF1dG9ydW4gKCktPlxuXHRcdGlmIFNlc3Npb24uZ2V0KCdjdXJyZW50X2FwcF9pZCcpXG5cdFx0XHRzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCdjdXJyZW50X2FwcF9pZCcsIFNlc3Npb24uZ2V0KCdjdXJyZW50X2FwcF9pZCcpKVxuI1x0XHRlbHNlXG4jXHRcdFx0Y29uc29sZS5sb2coJ3JlbW92ZSBjdXJyZW50X2FwcF9pZC4uLicpO1xuI1x0XHRcdHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oJ2N1cnJlbnRfYXBwX2lkJylcblx0U3RlZWRvcy5nZXRDdXJyZW50QXBwSWQgPSAoKS0+XG5cdFx0aWYgU2Vzc2lvbi5nZXQoJ2FwcF9pZCcpXG5cdFx0XHRyZXR1cm4gU2Vzc2lvbi5nZXQoJ2FwcF9pZCcpXG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ2N1cnJlbnRfYXBwX2lkJyk7XG5cbmlmIE1ldGVvci5pc1NlcnZlclxuXHRTdGVlZG9zLmZvcm1hdEluZGV4ID0gKGFycmF5KSAtPlxuXHRcdG9iamVjdCA9IHtcbiAgICAgICAgXHRiYWNrZ3JvdW5kOiB0cnVlXG4gICAgXHR9O1xuXHRcdGlzZG9jdW1lbnREQiA9IE1ldGVvci5zZXR0aW5ncz8uZGF0YXNvdXJjZXM/LmRlZmF1bHQ/LmRvY3VtZW50REIgfHwgZmFsc2U7XG5cdFx0aWYgaXNkb2N1bWVudERCXG5cdFx0XHRpZiBhcnJheS5sZW5ndGggPiAwXG5cdFx0XHRcdGluZGV4TmFtZSA9IGFycmF5LmpvaW4oXCIuXCIpO1xuXHRcdFx0XHRvYmplY3QubmFtZSA9IGluZGV4TmFtZTtcblx0XHRcdFx0XG5cdFx0XHRcdGlmIChpbmRleE5hbWUubGVuZ3RoID4gNTIpXG5cdFx0XHRcdFx0b2JqZWN0Lm5hbWUgPSBpbmRleE5hbWUuc3Vic3RyaW5nKDAsNTIpO1xuXG5cdFx0cmV0dXJuIG9iamVjdDsiLCJ2YXIgQ29va2llcywgY3J5cHRvLCBtaXhpbiwgcmVmLCByZWYxLCByZWYyLCByZWYzLCByZWY0LCByb290VXJsOyAgICAgICAgIFxuXG5TdGVlZG9zID0ge1xuICBzZXR0aW5nczoge30sXG4gIGRiOiBkYixcbiAgc3Viczoge30sXG4gIGlzUGhvbmVFbmFibGVkOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgcmVmLCByZWYxO1xuICAgIHJldHVybiAhISgocmVmID0gTWV0ZW9yLnNldHRpbmdzKSAhPSBudWxsID8gKHJlZjEgPSByZWZbXCJwdWJsaWNcIl0pICE9IG51bGwgPyByZWYxLnBob25lIDogdm9pZCAwIDogdm9pZCAwKTtcbiAgfSxcbiAgbnVtYmVyVG9TdHJpbmc6IGZ1bmN0aW9uKG51bWJlciwgc2NhbGUsIG5vdFRob3VzYW5kcykge1xuICAgIHZhciByZWYsIHJlZjEsIHJlZztcbiAgICBpZiAodHlwZW9mIG51bWJlciA9PT0gXCJudW1iZXJcIikge1xuICAgICAgbnVtYmVyID0gbnVtYmVyLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGlmICghbnVtYmVyKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGlmIChudW1iZXIgIT09IFwiTmFOXCIpIHtcbiAgICAgIGlmIChzY2FsZSB8fCBzY2FsZSA9PT0gMCkge1xuICAgICAgICBudW1iZXIgPSBOdW1iZXIobnVtYmVyKS50b0ZpeGVkKHNjYWxlKTtcbiAgICAgIH1cbiAgICAgIGlmICghbm90VGhvdXNhbmRzKSB7XG4gICAgICAgIGlmICghKHNjYWxlIHx8IHNjYWxlID09PSAwKSkge1xuICAgICAgICAgIHNjYWxlID0gKHJlZiA9IG51bWJlci5tYXRjaCgvXFwuKFxcZCspLykpICE9IG51bGwgPyAocmVmMSA9IHJlZlsxXSkgIT0gbnVsbCA/IHJlZjEubGVuZ3RoIDogdm9pZCAwIDogdm9pZCAwO1xuICAgICAgICAgIGlmICghc2NhbGUpIHtcbiAgICAgICAgICAgIHNjYWxlID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVnID0gLyhcXGQpKD89KFxcZHszfSkrXFwuKS9nO1xuICAgICAgICBpZiAoc2NhbGUgPT09IDApIHtcbiAgICAgICAgICByZWcgPSAvKFxcZCkoPz0oXFxkezN9KStcXGIpL2c7XG4gICAgICAgIH1cbiAgICAgICAgbnVtYmVyID0gbnVtYmVyLnJlcGxhY2UocmVnLCAnJDEsJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVtYmVyO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gIH0sXG4gIHZhbGlKcXVlcnlTeW1ib2xzOiBmdW5jdGlvbihzdHIpIHtcbiAgICB2YXIgcmVnO1xuICAgIHJlZyA9IG5ldyBSZWdFeHAoXCJeW14hXFxcIiMkJSYnKCkqXFwrLFxcLlxcLzo7PD0+P0BbXFxcXF1eYHt8fX5dKyRcIik7XG4gICAgcmV0dXJuIHJlZy50ZXN0KHN0cik7XG4gIH1cbn07XG5cblxuLypcbiAqIEtpY2sgb2ZmIHRoZSBnbG9iYWwgbmFtZXNwYWNlIGZvciBTdGVlZG9zLlxuICogQG5hbWVzcGFjZSBTdGVlZG9zXG4gKi9cblxuaWYgKE1ldGVvci5pc0NvcmRvdmEgfHwgTWV0ZW9yLmlzQ2xpZW50KSB7XG4gIHJvb3RVcmwgPSBNZXRlb3IuYWJzb2x1dGVVcmwuZGVmYXVsdE9wdGlvbnMucm9vdFVybDtcbiAgaWYgKHJvb3RVcmwuZW5kc1dpdGgoJy8nKSkge1xuICAgIHJvb3RVcmwgPSByb290VXJsLnN1YnN0cigwLCByb290VXJsLmxlbmd0aCAtIDEpO1xuICB9XG4gIGlmICgocmVmID0gd2luZG93LnN0b3JlcykgIT0gbnVsbCkge1xuICAgIGlmICgocmVmMSA9IHJlZi5BUEkpICE9IG51bGwpIHtcbiAgICAgIGlmICgocmVmMiA9IHJlZjEuY2xpZW50KSAhPSBudWxsKSB7XG4gICAgICAgIHJlZjIuc2V0VXJsID0gcm9vdFVybDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKChyZWYzID0gd2luZG93LnN0b3JlcykgIT0gbnVsbCkge1xuICAgIGlmICgocmVmNCA9IHJlZjMuU2V0dGluZ3MpICE9IG51bGwpIHtcbiAgICAgIHJlZjQuc2V0Um9vdFVybChyb290VXJsKTtcbiAgICB9XG4gIH1cbiAgd2luZG93WydzdGVlZG9zLnNldHRpbmcnXSA9IHtcbiAgICByb290VXJsOiByb290VXJsXG4gIH07XG59XG5cbmlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgTWV0ZW9yLmF1dG9ydW4oZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJlZjUsIHJlZjYsIHJlZjcsIHJlZjg7XG4gICAgaWYgKChyZWY1ID0gd2luZG93LnN0b3JlcykgIT0gbnVsbCkge1xuICAgICAgaWYgKChyZWY2ID0gcmVmNS5TZXR0aW5ncykgIT0gbnVsbCkge1xuICAgICAgICByZWY2LnNldFVzZXJJZChTdGVlZG9zLnVzZXJJZCgpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIChyZWY3ID0gd2luZG93LnN0b3JlcykgIT0gbnVsbCA/IChyZWY4ID0gcmVmNy5TZXR0aW5ncykgIT0gbnVsbCA/IHJlZjguc2V0VGVuYW50SWQoU3RlZWRvcy5zcGFjZUlkKCkpIDogdm9pZCAwIDogdm9pZCAwO1xuICB9KTtcbn1cblxuU3RlZWRvcy5nZXRIZWxwVXJsID0gZnVuY3Rpb24obG9jYWxlKSB7XG4gIHZhciBjb3VudHJ5O1xuICBjb3VudHJ5ID0gbG9jYWxlLnN1YnN0cmluZygzKTtcbiAgcmV0dXJuIFwiaHR0cDovL3d3dy5zdGVlZG9zLmNvbS9cIiArIGNvdW50cnkgKyBcIi9oZWxwL1wiO1xufTtcblxuaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICBTdGVlZG9zLnNwYWNlVXBncmFkZWRNb2RhbCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBzd2FsKHtcbiAgICAgIHRpdGxlOiBUQVBpMThuLl9fKFwic3BhY2VfcGFpZF9pbmZvX3RpdGxlXCIpLFxuICAgICAgdGV4dDogVEFQaTE4bi5fXyhcInNwYWNlX3BhaWRfaW5mb190ZXh0XCIpLFxuICAgICAgaHRtbDogdHJ1ZSxcbiAgICAgIHR5cGU6IFwid2FybmluZ1wiLFxuICAgICAgY29uZmlybUJ1dHRvblRleHQ6IFRBUGkxOG4uX18oXCJPS1wiKVxuICAgIH0pO1xuICB9O1xuICBTdGVlZG9zLmdldEFjY291bnRCZ0JvZHlWYWx1ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBhY2NvdW50QmdCb2R5O1xuICAgIGFjY291bnRCZ0JvZHkgPSBkYi5zdGVlZG9zX2tleXZhbHVlcy5maW5kT25lKHtcbiAgICAgIHVzZXI6IFN0ZWVkb3MudXNlcklkKCksXG4gICAgICBrZXk6IFwiYmdfYm9keVwiXG4gICAgfSk7XG4gICAgaWYgKGFjY291bnRCZ0JvZHkpIHtcbiAgICAgIHJldHVybiBhY2NvdW50QmdCb2R5LnZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICB9O1xuICBTdGVlZG9zLmFwcGx5QWNjb3VudEJnQm9keVZhbHVlID0gZnVuY3Rpb24oYWNjb3VudEJnQm9keVZhbHVlLCBpc05lZWRUb0xvY2FsKSB7XG4gICAgdmFyIGF2YXRhciwgdXJsO1xuICAgIGlmIChNZXRlb3IubG9nZ2luZ0luKCkgfHwgIVN0ZWVkb3MudXNlcklkKCkpIHtcbiAgICAgIGFjY291bnRCZ0JvZHlWYWx1ZSA9IHt9O1xuICAgICAgYWNjb3VudEJnQm9keVZhbHVlLnVybCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYWNjb3VudEJnQm9keVZhbHVlLnVybFwiKTtcbiAgICAgIGFjY291bnRCZ0JvZHlWYWx1ZS5hdmF0YXIgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImFjY291bnRCZ0JvZHlWYWx1ZS5hdmF0YXJcIik7XG4gICAgfVxuICAgIHVybCA9IGFjY291bnRCZ0JvZHlWYWx1ZS51cmw7XG4gICAgYXZhdGFyID0gYWNjb3VudEJnQm9keVZhbHVlLmF2YXRhcjtcbiAgICBpZiAoaXNOZWVkVG9Mb2NhbCkge1xuICAgICAgaWYgKE1ldGVvci5sb2dnaW5nSW4oKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoU3RlZWRvcy51c2VySWQoKSkge1xuICAgICAgICBpZiAodXJsKSB7XG4gICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJhY2NvdW50QmdCb2R5VmFsdWUudXJsXCIsIHVybCk7XG4gICAgICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiYWNjb3VudEJnQm9keVZhbHVlLmF2YXRhclwiLCBhdmF0YXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKFwiYWNjb3VudEJnQm9keVZhbHVlLnVybFwiKTtcbiAgICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oXCJhY2NvdW50QmdCb2R5VmFsdWUuYXZhdGFyXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBTdGVlZG9zLmdldEFjY291bnRTa2luVmFsdWUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgYWNjb3VudFNraW47XG4gICAgYWNjb3VudFNraW4gPSBkYi5zdGVlZG9zX2tleXZhbHVlcy5maW5kT25lKHtcbiAgICAgIHVzZXI6IFN0ZWVkb3MudXNlcklkKCksXG4gICAgICBrZXk6IFwic2tpblwiXG4gICAgfSk7XG4gICAgaWYgKGFjY291bnRTa2luKSB7XG4gICAgICByZXR1cm4gYWNjb3VudFNraW4udmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gIH07XG4gIFN0ZWVkb3MuZ2V0QWNjb3VudFpvb21WYWx1ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBhY2NvdW50Wm9vbTtcbiAgICBhY2NvdW50Wm9vbSA9IGRiLnN0ZWVkb3Nfa2V5dmFsdWVzLmZpbmRPbmUoe1xuICAgICAgdXNlcjogU3RlZWRvcy51c2VySWQoKSxcbiAgICAgIGtleTogXCJ6b29tXCJcbiAgICB9KTtcbiAgICBpZiAoYWNjb3VudFpvb20pIHtcbiAgICAgIHJldHVybiBhY2NvdW50Wm9vbS52YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgfTtcbiAgU3RlZWRvcy5hcHBseUFjY291bnRab29tVmFsdWUgPSBmdW5jdGlvbihhY2NvdW50Wm9vbVZhbHVlLCBpc05lZWRUb0xvY2FsKSB7XG4gICAgdmFyIHpvb21OYW1lLCB6b29tU2l6ZTtcbiAgICBpZiAoTWV0ZW9yLmxvZ2dpbmdJbigpIHx8ICFTdGVlZG9zLnVzZXJJZCgpKSB7XG4gICAgICBhY2NvdW50Wm9vbVZhbHVlID0ge307XG4gICAgICBhY2NvdW50Wm9vbVZhbHVlLm5hbWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImFjY291bnRab29tVmFsdWUubmFtZVwiKTtcbiAgICAgIGFjY291bnRab29tVmFsdWUuc2l6ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYWNjb3VudFpvb21WYWx1ZS5zaXplXCIpO1xuICAgIH1cbiAgICAkKFwiYm9keVwiKS5yZW1vdmVDbGFzcyhcInpvb20tbm9ybWFsXCIpLnJlbW92ZUNsYXNzKFwiem9vbS1sYXJnZVwiKS5yZW1vdmVDbGFzcyhcInpvb20tZXh0cmEtbGFyZ2VcIik7XG4gICAgem9vbU5hbWUgPSBhY2NvdW50Wm9vbVZhbHVlLm5hbWU7XG4gICAgem9vbVNpemUgPSBhY2NvdW50Wm9vbVZhbHVlLnNpemU7XG4gICAgaWYgKCF6b29tTmFtZSkge1xuICAgICAgem9vbU5hbWUgPSBcImxhcmdlXCI7XG4gICAgICB6b29tU2l6ZSA9IDEuMjtcbiAgICB9XG4gICAgaWYgKHpvb21OYW1lICYmICFTZXNzaW9uLmdldChcImluc3RhbmNlUHJpbnRcIikpIHtcbiAgICAgICQoXCJib2R5XCIpLmFkZENsYXNzKFwiem9vbS1cIiArIHpvb21OYW1lKTtcbiAgICB9XG4gICAgaWYgKGlzTmVlZFRvTG9jYWwpIHtcbiAgICAgIGlmIChNZXRlb3IubG9nZ2luZ0luKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKFN0ZWVkb3MudXNlcklkKCkpIHtcbiAgICAgICAgaWYgKGFjY291bnRab29tVmFsdWUubmFtZSkge1xuICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiYWNjb3VudFpvb21WYWx1ZS5uYW1lXCIsIGFjY291bnRab29tVmFsdWUubmFtZSk7XG4gICAgICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiYWNjb3VudFpvb21WYWx1ZS5zaXplXCIsIGFjY291bnRab29tVmFsdWUuc2l6ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oXCJhY2NvdW50Wm9vbVZhbHVlLm5hbWVcIik7XG4gICAgICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKFwiYWNjb3VudFpvb21WYWx1ZS5zaXplXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBTdGVlZG9zLnNob3dIZWxwID0gZnVuY3Rpb24odXJsKSB7XG4gICAgdmFyIGNvdW50cnksIGxvY2FsZTtcbiAgICBsb2NhbGUgPSBTdGVlZG9zLmdldExvY2FsZSgpO1xuICAgIGNvdW50cnkgPSBsb2NhbGUuc3Vic3RyaW5nKDMpO1xuICAgIHVybCA9IHVybCB8fCBcImh0dHA6Ly93d3cuc3RlZWRvcy5jb20vXCIgKyBjb3VudHJ5ICsgXCIvaGVscC9cIjtcbiAgICByZXR1cm4gd2luZG93Lm9wZW4odXJsLCAnX2hlbHAnLCAnRW5hYmxlVmlld1BvcnRTY2FsZT15ZXMnKTtcbiAgfTtcbiAgU3RlZWRvcy5nZXRVcmxXaXRoVG9rZW4gPSBmdW5jdGlvbih1cmwpIHtcbiAgICB2YXIgYXV0aFRva2VuLCBsaW5rZXI7XG4gICAgYXV0aFRva2VuID0ge307XG4gICAgYXV0aFRva2VuW1wic3BhY2VJZFwiXSA9IFN0ZWVkb3MuZ2V0U3BhY2VJZCgpO1xuICAgIGF1dGhUb2tlbltcIlgtVXNlci1JZFwiXSA9IE1ldGVvci51c2VySWQoKTtcbiAgICBhdXRoVG9rZW5bXCJYLUF1dGgtVG9rZW5cIl0gPSBBY2NvdW50cy5fc3RvcmVkTG9naW5Ub2tlbigpO1xuICAgIGxpbmtlciA9IFwiP1wiO1xuICAgIGlmICh1cmwuaW5kZXhPZihcIj9cIikgPiAtMSkge1xuICAgICAgbGlua2VyID0gXCImXCI7XG4gICAgfVxuICAgIHJldHVybiB1cmwgKyBsaW5rZXIgKyAkLnBhcmFtKGF1dGhUb2tlbik7XG4gIH07XG4gIFN0ZWVkb3MuZ2V0QXBwVXJsV2l0aFRva2VuID0gZnVuY3Rpb24oYXBwX2lkKSB7XG4gICAgdmFyIGF1dGhUb2tlbjtcbiAgICBhdXRoVG9rZW4gPSB7fTtcbiAgICBhdXRoVG9rZW5bXCJzcGFjZUlkXCJdID0gU3RlZWRvcy5nZXRTcGFjZUlkKCk7XG4gICAgYXV0aFRva2VuW1wiWC1Vc2VyLUlkXCJdID0gTWV0ZW9yLnVzZXJJZCgpO1xuICAgIGF1dGhUb2tlbltcIlgtQXV0aC1Ub2tlblwiXSA9IEFjY291bnRzLl9zdG9yZWRMb2dpblRva2VuKCk7XG4gICAgcmV0dXJuIFwiYXBpL3NldHVwL3Nzby9cIiArIGFwcF9pZCArIFwiP1wiICsgJC5wYXJhbShhdXRoVG9rZW4pO1xuICB9O1xuICBTdGVlZG9zLm9wZW5BcHBXaXRoVG9rZW4gPSBmdW5jdGlvbihhcHBfaWQpIHtcbiAgICB2YXIgYXBwLCB1cmw7XG4gICAgdXJsID0gU3RlZWRvcy5nZXRBcHBVcmxXaXRoVG9rZW4oYXBwX2lkKTtcbiAgICB1cmwgPSBTdGVlZG9zLmFic29sdXRlVXJsKHVybCk7XG4gICAgYXBwID0gZGIuYXBwcy5maW5kT25lKGFwcF9pZCk7XG4gICAgaWYgKCFhcHAuaXNfbmV3X3dpbmRvdyAmJiAhU3RlZWRvcy5pc01vYmlsZSgpICYmICFTdGVlZG9zLmlzQ29yZG92YSgpKSB7XG4gICAgICByZXR1cm4gd2luZG93LmxvY2F0aW9uID0gdXJsO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gU3RlZWRvcy5vcGVuV2luZG93KHVybCk7XG4gICAgfVxuICB9O1xuICBTdGVlZG9zLm9wZW5VcmxXaXRoSUUgPSBmdW5jdGlvbih1cmwpIHtcbiAgICB2YXIgY21kLCBleGVjLCBvcGVuX3VybDtcbiAgICBpZiAodXJsKSB7XG4gICAgICBpZiAoU3RlZWRvcy5pc05vZGUoKSkge1xuICAgICAgICBleGVjID0gbncucmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWM7XG4gICAgICAgIG9wZW5fdXJsID0gdXJsO1xuICAgICAgICBjbWQgPSBcInN0YXJ0IGlleHBsb3JlLmV4ZSBcXFwiXCIgKyBvcGVuX3VybCArIFwiXFxcIlwiO1xuICAgICAgICByZXR1cm4gZXhlYyhjbWQsIGZ1bmN0aW9uKGVycm9yLCBzdGRvdXQsIHN0ZGVycikge1xuICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgdG9hc3RyLmVycm9yKGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFN0ZWVkb3Mub3BlbldpbmRvdyh1cmwpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgU3RlZWRvcy5vcGVuQXBwID0gZnVuY3Rpb24oYXBwX2lkKSB7XG4gICAgdmFyIGFwcCwgY21kLCBlLCBldmFsRnVuU3RyaW5nLCBleGVjLCBvbl9jbGljaywgb3Blbl91cmwsIHBhdGg7XG4gICAgaWYgKCFNZXRlb3IudXNlcklkKCkpIHtcbiAgICAgIFN0ZWVkb3MucmVkaXJlY3RUb1NpZ25JbigpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGFwcCA9IGRiLmFwcHMuZmluZE9uZShhcHBfaWQpO1xuICAgIGlmICghYXBwKSB7XG4gICAgICBGbG93Um91dGVyLmdvKFwiL1wiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgb25fY2xpY2sgPSBhcHAub25fY2xpY2s7XG4gICAgaWYgKGFwcC5pc191c2VfaWUpIHtcbiAgICAgIGlmIChTdGVlZG9zLmlzTm9kZSgpKSB7XG4gICAgICAgIGV4ZWMgPSBudy5yZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlYztcbiAgICAgICAgaWYgKG9uX2NsaWNrKSB7XG4gICAgICAgICAgcGF0aCA9IFwiYXBpL2FwcC9zc28vXCIgKyBhcHBfaWQgKyBcIj9hdXRoVG9rZW49XCIgKyAoQWNjb3VudHMuX3N0b3JlZExvZ2luVG9rZW4oKSkgKyBcIiZ1c2VySWQ9XCIgKyAoTWV0ZW9yLnVzZXJJZCgpKTtcbiAgICAgICAgICBvcGVuX3VybCA9IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4gKyBcIi9cIiArIHBhdGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3Blbl91cmwgPSBTdGVlZG9zLmdldEFwcFVybFdpdGhUb2tlbihhcHBfaWQpO1xuICAgICAgICAgIG9wZW5fdXJsID0gd2luZG93LmxvY2F0aW9uLm9yaWdpbiArIFwiL1wiICsgb3Blbl91cmw7XG4gICAgICAgIH1cbiAgICAgICAgY21kID0gXCJzdGFydCBpZXhwbG9yZS5leGUgXFxcIlwiICsgb3Blbl91cmwgKyBcIlxcXCJcIjtcbiAgICAgICAgZXhlYyhjbWQsIGZ1bmN0aW9uKGVycm9yLCBzdGRvdXQsIHN0ZGVycikge1xuICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgdG9hc3RyLmVycm9yKGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgU3RlZWRvcy5vcGVuQXBwV2l0aFRva2VuKGFwcF9pZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChkYi5hcHBzLmlzSW50ZXJuYWxBcHAoYXBwLnVybCkpIHtcbiAgICAgIEZsb3dSb3V0ZXIuZ28oYXBwLnVybCk7XG4gICAgfSBlbHNlIGlmIChhcHAuaXNfdXNlX2lmcmFtZSkge1xuICAgICAgaWYgKGFwcC5pc19uZXdfd2luZG93ICYmICFTdGVlZG9zLmlzTW9iaWxlKCkgJiYgIVN0ZWVkb3MuaXNDb3Jkb3ZhKCkpIHtcbiAgICAgICAgU3RlZWRvcy5vcGVuV2luZG93KFN0ZWVkb3MuYWJzb2x1dGVVcmwoXCJhcHBzL2lmcmFtZS9cIiArIGFwcC5faWQpKTtcbiAgICAgIH0gZWxzZSBpZiAoU3RlZWRvcy5pc01vYmlsZSgpIHx8IFN0ZWVkb3MuaXNDb3Jkb3ZhKCkpIHtcbiAgICAgICAgU3RlZWRvcy5vcGVuQXBwV2l0aFRva2VuKGFwcF9pZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBGbG93Um91dGVyLmdvKFwiL2FwcHMvaWZyYW1lL1wiICsgYXBwLl9pZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChvbl9jbGljaykge1xuICAgICAgZXZhbEZ1blN0cmluZyA9IFwiKGZ1bmN0aW9uKCl7XCIgKyBvbl9jbGljayArIFwifSkoKVwiO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZXZhbChldmFsRnVuU3RyaW5nKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yMSkge1xuICAgICAgICBlID0gZXJyb3IxO1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiY2F0Y2ggc29tZSBlcnJvciB3aGVuIGV2YWwgdGhlIG9uX2NsaWNrIHNjcmlwdCBmb3IgYXBwIGxpbms6XCIpO1xuICAgICAgICBjb25zb2xlLmVycm9yKGUubWVzc2FnZSArIFwiXFxyXFxuXCIgKyBlLnN0YWNrKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgU3RlZWRvcy5vcGVuQXBwV2l0aFRva2VuKGFwcF9pZCk7XG4gICAgfVxuICAgIGlmICghYXBwLmlzX25ld193aW5kb3cgJiYgIVN0ZWVkb3MuaXNNb2JpbGUoKSAmJiAhU3RlZWRvcy5pc0NvcmRvdmEoKSAmJiAhYXBwLmlzX3VzZV9pZSAmJiAhb25fY2xpY2spIHtcbiAgICAgIHJldHVybiBTZXNzaW9uLnNldChcImN1cnJlbnRfYXBwX2lkXCIsIGFwcF9pZCk7XG4gICAgfVxuICB9O1xuICBTdGVlZG9zLmNoZWNrU3BhY2VCYWxhbmNlID0gZnVuY3Rpb24oc3BhY2VJZCkge1xuICAgIHZhciBlbmRfZGF0ZSwgbWluX21vbnRocywgc3BhY2U7XG4gICAgaWYgKCFzcGFjZUlkKSB7XG4gICAgICBzcGFjZUlkID0gU3RlZWRvcy5zcGFjZUlkKCk7XG4gICAgfVxuICAgIG1pbl9tb250aHMgPSAxO1xuICAgIGlmIChTdGVlZG9zLmlzU3BhY2VBZG1pbigpKSB7XG4gICAgICBtaW5fbW9udGhzID0gMztcbiAgICB9XG4gICAgc3BhY2UgPSBkYi5zcGFjZXMuZmluZE9uZShzcGFjZUlkKTtcbiAgICBlbmRfZGF0ZSA9IHNwYWNlICE9IG51bGwgPyBzcGFjZS5lbmRfZGF0ZSA6IHZvaWQgMDtcbiAgICBpZiAoc3BhY2UgJiYgU3RlZWRvcy5oYXNGZWF0dXJlKCdwYWlkJywgc3BhY2UuX2lkKSAmJiBlbmRfZGF0ZSAhPT0gdm9pZCAwICYmIChlbmRfZGF0ZSAtIG5ldyBEYXRlKSA8PSAobWluX21vbnRocyAqIDMwICogMjQgKiAzNjAwICogMTAwMCkpIHtcbiAgICAgIHJldHVybiB0b2FzdHIuZXJyb3IodChcInNwYWNlX2JhbGFuY2VfaW5zdWZmaWNpZW50XCIpKTtcbiAgICB9XG4gIH07XG4gIFN0ZWVkb3Muc2V0TW9kYWxNYXhIZWlnaHQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgYWNjb3VudFpvb21WYWx1ZSwgb2Zmc2V0O1xuICAgIGFjY291bnRab29tVmFsdWUgPSBTdGVlZG9zLmdldEFjY291bnRab29tVmFsdWUoKTtcbiAgICBpZiAoIWFjY291bnRab29tVmFsdWUubmFtZSkge1xuICAgICAgYWNjb3VudFpvb21WYWx1ZS5uYW1lID0gJ2xhcmdlJztcbiAgICB9XG4gICAgc3dpdGNoIChhY2NvdW50Wm9vbVZhbHVlLm5hbWUpIHtcbiAgICAgIGNhc2UgJ25vcm1hbCc6XG4gICAgICAgIGlmIChTdGVlZG9zLmlzTW9iaWxlKCkpIHtcbiAgICAgICAgICBvZmZzZXQgPSAtMTI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb2Zmc2V0ID0gNzU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdsYXJnZSc6XG4gICAgICAgIGlmIChTdGVlZG9zLmlzTW9iaWxlKCkpIHtcbiAgICAgICAgICBvZmZzZXQgPSAtNjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoU3RlZWRvcy5kZXRlY3RJRSgpKSB7XG4gICAgICAgICAgICBvZmZzZXQgPSAxOTk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9mZnNldCA9IDk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZXh0cmEtbGFyZ2UnOlxuICAgICAgICBpZiAoU3RlZWRvcy5pc01vYmlsZSgpKSB7XG4gICAgICAgICAgb2Zmc2V0ID0gLTI2O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChTdGVlZG9zLmRldGVjdElFKCkpIHtcbiAgICAgICAgICAgIG9mZnNldCA9IDMwMztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb2Zmc2V0ID0gNTM7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlmICgkKFwiLm1vZGFsXCIpLmxlbmd0aCkge1xuICAgICAgcmV0dXJuICQoXCIubW9kYWxcIikuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGZvb3RlckhlaWdodCwgaGVhZGVySGVpZ2h0LCBoZWlnaHQsIHRvdGFsSGVpZ2h0O1xuICAgICAgICBoZWFkZXJIZWlnaHQgPSAwO1xuICAgICAgICBmb290ZXJIZWlnaHQgPSAwO1xuICAgICAgICB0b3RhbEhlaWdodCA9IDA7XG4gICAgICAgICQoXCIubW9kYWwtaGVhZGVyXCIsICQodGhpcykpLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIGhlYWRlckhlaWdodCArPSAkKHRoaXMpLm91dGVySGVpZ2h0KGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgICAgICQoXCIubW9kYWwtZm9vdGVyXCIsICQodGhpcykpLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIGZvb3RlckhlaWdodCArPSAkKHRoaXMpLm91dGVySGVpZ2h0KGZhbHNlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRvdGFsSGVpZ2h0ID0gaGVhZGVySGVpZ2h0ICsgZm9vdGVySGVpZ2h0O1xuICAgICAgICBoZWlnaHQgPSAkKFwiYm9keVwiKS5pbm5lckhlaWdodCgpIC0gdG90YWxIZWlnaHQgLSBvZmZzZXQ7XG4gICAgICAgIGlmICgkKHRoaXMpLmhhc0NsYXNzKFwiY2ZfY29udGFjdF9tb2RhbFwiKSkge1xuICAgICAgICAgIHJldHVybiAkKFwiLm1vZGFsLWJvZHlcIiwgJCh0aGlzKSkuY3NzKHtcbiAgICAgICAgICAgIFwibWF4LWhlaWdodFwiOiBoZWlnaHQgKyBcInB4XCIsXG4gICAgICAgICAgICBcImhlaWdodFwiOiBoZWlnaHQgKyBcInB4XCJcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gJChcIi5tb2RhbC1ib2R5XCIsICQodGhpcykpLmNzcyh7XG4gICAgICAgICAgICBcIm1heC1oZWlnaHRcIjogaGVpZ2h0ICsgXCJweFwiLFxuICAgICAgICAgICAgXCJoZWlnaHRcIjogXCJhdXRvXCJcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuICBTdGVlZG9zLmdldE1vZGFsTWF4SGVpZ2h0ID0gZnVuY3Rpb24ob2Zmc2V0KSB7XG4gICAgdmFyIGFjY291bnRab29tVmFsdWUsIHJlVmFsdWU7XG4gICAgaWYgKFN0ZWVkb3MuaXNNb2JpbGUoKSkge1xuICAgICAgcmVWYWx1ZSA9IHdpbmRvdy5zY3JlZW4uaGVpZ2h0IC0gMTI2IC0gMTgwIC0gMjU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlVmFsdWUgPSAkKHdpbmRvdykuaGVpZ2h0KCkgLSAxODAgLSAyNTtcbiAgICB9XG4gICAgaWYgKCEoU3RlZWRvcy5pc2lPUygpIHx8IFN0ZWVkb3MuaXNNb2JpbGUoKSkpIHtcbiAgICAgIGFjY291bnRab29tVmFsdWUgPSBTdGVlZG9zLmdldEFjY291bnRab29tVmFsdWUoKTtcbiAgICAgIHN3aXRjaCAoYWNjb3VudFpvb21WYWx1ZS5uYW1lKSB7XG4gICAgICAgIGNhc2UgJ2xhcmdlJzpcbiAgICAgICAgICByZVZhbHVlIC09IDUwO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdleHRyYS1sYXJnZSc6XG4gICAgICAgICAgcmVWYWx1ZSAtPSAxNDU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChvZmZzZXQpIHtcbiAgICAgIHJlVmFsdWUgLT0gb2Zmc2V0O1xuICAgIH1cbiAgICByZXR1cm4gcmVWYWx1ZSArIFwicHhcIjtcbiAgfTtcbiAgU3RlZWRvcy5pc2lPUyA9IGZ1bmN0aW9uKHVzZXJBZ2VudCwgbGFuZ3VhZ2UpIHtcbiAgICB2YXIgREVWSUNFLCBicm93c2VyLCBjb25FeHAsIGRldmljZSwgbnVtRXhwO1xuICAgIERFVklDRSA9IHtcbiAgICAgIGFuZHJvaWQ6ICdhbmRyb2lkJyxcbiAgICAgIGJsYWNrYmVycnk6ICdibGFja2JlcnJ5JyxcbiAgICAgIGRlc2t0b3A6ICdkZXNrdG9wJyxcbiAgICAgIGlwYWQ6ICdpcGFkJyxcbiAgICAgIGlwaG9uZTogJ2lwaG9uZScsXG4gICAgICBpcG9kOiAnaXBvZCcsXG4gICAgICBtb2JpbGU6ICdtb2JpbGUnXG4gICAgfTtcbiAgICBicm93c2VyID0ge307XG4gICAgY29uRXhwID0gJyg/OltcXFxcLzpcXFxcOjpcXFxcczo7XSknO1xuICAgIG51bUV4cCA9ICcoXFxcXFMrW15cXFxcczo7OlxcXFwpXXwpJztcbiAgICB1c2VyQWdlbnQgPSAodXNlckFnZW50IHx8IG5hdmlnYXRvci51c2VyQWdlbnQpLnRvTG93ZXJDYXNlKCk7XG4gICAgbGFuZ3VhZ2UgPSBsYW5ndWFnZSB8fCBuYXZpZ2F0b3IubGFuZ3VhZ2UgfHwgbmF2aWdhdG9yLmJyb3dzZXJMYW5ndWFnZTtcbiAgICBkZXZpY2UgPSB1c2VyQWdlbnQubWF0Y2gobmV3IFJlZ0V4cCgnKGFuZHJvaWR8aXBhZHxpcGhvbmV8aXBvZHxibGFja2JlcnJ5KScpKSB8fCB1c2VyQWdlbnQubWF0Y2gobmV3IFJlZ0V4cCgnKG1vYmlsZSknKSkgfHwgWycnLCBERVZJQ0UuZGVza3RvcF07XG4gICAgYnJvd3Nlci5kZXZpY2UgPSBkZXZpY2VbMV07XG4gICAgcmV0dXJuIGJyb3dzZXIuZGV2aWNlID09PSBERVZJQ0UuaXBhZCB8fCBicm93c2VyLmRldmljZSA9PT0gREVWSUNFLmlwaG9uZSB8fCBicm93c2VyLmRldmljZSA9PT0gREVWSUNFLmlwb2Q7XG4gIH07XG4gIFN0ZWVkb3MuZ2V0VXNlck9yZ2FuaXphdGlvbnMgPSBmdW5jdGlvbihpc0luY2x1ZGVQYXJlbnRzKSB7XG4gICAgdmFyIG9yZ2FuaXphdGlvbnMsIHBhcmVudHMsIHNwYWNlSWQsIHNwYWNlX3VzZXIsIHVzZXJJZDtcbiAgICB1c2VySWQgPSBNZXRlb3IudXNlcklkKCk7XG4gICAgc3BhY2VJZCA9IFN0ZWVkb3Muc3BhY2VJZCgpO1xuICAgIHNwYWNlX3VzZXIgPSBkYi5zcGFjZV91c2Vycy5maW5kT25lKHtcbiAgICAgIHVzZXI6IHVzZXJJZCxcbiAgICAgIHNwYWNlOiBzcGFjZUlkXG4gICAgfSwge1xuICAgICAgZmllbGRzOiB7XG4gICAgICAgIG9yZ2FuaXphdGlvbnM6IDFcbiAgICAgIH1cbiAgICB9KTtcbiAgICBvcmdhbml6YXRpb25zID0gc3BhY2VfdXNlciAhPSBudWxsID8gc3BhY2VfdXNlci5vcmdhbml6YXRpb25zIDogdm9pZCAwO1xuICAgIGlmICghb3JnYW5pemF0aW9ucykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBpZiAoaXNJbmNsdWRlUGFyZW50cykge1xuICAgICAgcGFyZW50cyA9IF8uZmxhdHRlbihkYi5vcmdhbml6YXRpb25zLmZpbmQoe1xuICAgICAgICBfaWQ6IHtcbiAgICAgICAgICAkaW46IG9yZ2FuaXphdGlvbnNcbiAgICAgICAgfVxuICAgICAgfSkuZmV0Y2goKS5nZXRQcm9wZXJ0eShcInBhcmVudHNcIikpO1xuICAgICAgcmV0dXJuIF8udW5pb24ob3JnYW5pemF0aW9ucywgcGFyZW50cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvcmdhbml6YXRpb25zO1xuICAgIH1cbiAgfTtcbiAgU3RlZWRvcy5mb3JiaWROb2RlQ29udGV4dG1lbnUgPSBmdW5jdGlvbih0YXJnZXQsIGlmcikge1xuICAgIGlmICghU3RlZWRvcy5pc05vZGUoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0YXJnZXQuZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIGZ1bmN0aW9uKGV2KSB7XG4gICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuICAgIGlmIChpZnIpIHtcbiAgICAgIGlmICh0eXBlb2YgaWZyID09PSAnc3RyaW5nJykge1xuICAgICAgICBpZnIgPSB0YXJnZXQuJChpZnIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlmci5sb2FkKGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgaWZyQm9keTtcbiAgICAgICAgaWZyQm9keSA9IGlmci5jb250ZW50cygpLmZpbmQoJ2JvZHknKTtcbiAgICAgICAgaWYgKGlmckJvZHkpIHtcbiAgICAgICAgICByZXR1cm4gaWZyQm9keVswXS5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIGZ1bmN0aW9uKGV2KSB7XG4gICAgICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG59XG5cbmlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgU3RlZWRvcy5nZXRVc2VyT3JnYW5pemF0aW9ucyA9IGZ1bmN0aW9uKHNwYWNlSWQsIHVzZXJJZCwgaXNJbmNsdWRlUGFyZW50cykge1xuICAgIHZhciBvcmdhbml6YXRpb25zLCBwYXJlbnRzLCBzcGFjZV91c2VyO1xuICAgIHNwYWNlX3VzZXIgPSBkYi5zcGFjZV91c2Vycy5maW5kT25lKHtcbiAgICAgIHVzZXI6IHVzZXJJZCxcbiAgICAgIHNwYWNlOiBzcGFjZUlkXG4gICAgfSwge1xuICAgICAgZmllbGRzOiB7XG4gICAgICAgIG9yZ2FuaXphdGlvbnM6IDFcbiAgICAgIH1cbiAgICB9KTtcbiAgICBvcmdhbml6YXRpb25zID0gc3BhY2VfdXNlciAhPSBudWxsID8gc3BhY2VfdXNlci5vcmdhbml6YXRpb25zIDogdm9pZCAwO1xuICAgIGlmICghb3JnYW5pemF0aW9ucykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBpZiAoaXNJbmNsdWRlUGFyZW50cykge1xuICAgICAgcGFyZW50cyA9IF8uZmxhdHRlbihkYi5vcmdhbml6YXRpb25zLmZpbmQoe1xuICAgICAgICBfaWQ6IHtcbiAgICAgICAgICAkaW46IG9yZ2FuaXphdGlvbnNcbiAgICAgICAgfVxuICAgICAgfSkuZmV0Y2goKS5nZXRQcm9wZXJ0eShcInBhcmVudHNcIikpO1xuICAgICAgcmV0dXJuIF8udW5pb24ob3JnYW5pemF0aW9ucywgcGFyZW50cyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvcmdhbml6YXRpb25zO1xuICAgIH1cbiAgfTtcbn1cblxuaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICBDb29raWVzID0gcmVxdWlyZShcImNvb2tpZXNcIik7XG4gIFN0ZWVkb3MuaXNNb2JpbGUgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG4gIFN0ZWVkb3MuaXNTcGFjZUFkbWluID0gZnVuY3Rpb24oc3BhY2VJZCwgdXNlcklkKSB7XG4gICAgdmFyIHNwYWNlO1xuICAgIGlmICghc3BhY2VJZCB8fCAhdXNlcklkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHNwYWNlID0gZGIuc3BhY2VzLmZpbmRPbmUoc3BhY2VJZCk7XG4gICAgaWYgKCFzcGFjZSB8fCAhc3BhY2UuYWRtaW5zKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBzcGFjZS5hZG1pbnMuaW5kZXhPZih1c2VySWQpID49IDA7XG4gIH07XG4gIFN0ZWVkb3MuaXNMZWdhbFZlcnNpb24gPSBmdW5jdGlvbihzcGFjZUlkLCBhcHBfdmVyc2lvbikge1xuICAgIHZhciBjaGVjaywgbW9kdWxlcywgcmVmNTtcbiAgICBpZiAoIXNwYWNlSWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY2hlY2sgPSBmYWxzZTtcbiAgICBtb2R1bGVzID0gKHJlZjUgPSBkYi5zcGFjZXMuZmluZE9uZShzcGFjZUlkKSkgIT0gbnVsbCA/IHJlZjUubW9kdWxlcyA6IHZvaWQgMDtcbiAgICBpZiAobW9kdWxlcyAmJiBtb2R1bGVzLmluY2x1ZGVzKGFwcF92ZXJzaW9uKSkge1xuICAgICAgY2hlY2sgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gY2hlY2s7XG4gIH07XG4gIFN0ZWVkb3MuaXNPcmdBZG1pbkJ5T3JnSWRzID0gZnVuY3Rpb24ob3JnSWRzLCB1c2VySWQpIHtcbiAgICB2YXIgYWxsb3dBY2Nlc3NPcmdzLCBpc09yZ0FkbWluLCBwYXJlbnRzLCB1c2VPcmdzO1xuICAgIGlzT3JnQWRtaW4gPSBmYWxzZTtcbiAgICB1c2VPcmdzID0gZGIub3JnYW5pemF0aW9ucy5maW5kKHtcbiAgICAgIF9pZDoge1xuICAgICAgICAkaW46IG9yZ0lkc1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGZpZWxkczoge1xuICAgICAgICBwYXJlbnRzOiAxLFxuICAgICAgICBhZG1pbnM6IDFcbiAgICAgIH1cbiAgICB9KS5mZXRjaCgpO1xuICAgIHBhcmVudHMgPSBbXTtcbiAgICBhbGxvd0FjY2Vzc09yZ3MgPSB1c2VPcmdzLmZpbHRlcihmdW5jdGlvbihvcmcpIHtcbiAgICAgIHZhciByZWY1O1xuICAgICAgaWYgKG9yZy5wYXJlbnRzKSB7XG4gICAgICAgIHBhcmVudHMgPSBfLnVuaW9uKHBhcmVudHMsIG9yZy5wYXJlbnRzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAocmVmNSA9IG9yZy5hZG1pbnMpICE9IG51bGwgPyByZWY1LmluY2x1ZGVzKHVzZXJJZCkgOiB2b2lkIDA7XG4gICAgfSk7XG4gICAgaWYgKGFsbG93QWNjZXNzT3Jncy5sZW5ndGgpIHtcbiAgICAgIGlzT3JnQWRtaW4gPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJlbnRzID0gXy5mbGF0dGVuKHBhcmVudHMpO1xuICAgICAgcGFyZW50cyA9IF8udW5pcShwYXJlbnRzKTtcbiAgICAgIGlmIChwYXJlbnRzLmxlbmd0aCAmJiBkYi5vcmdhbml6YXRpb25zLmZpbmRPbmUoe1xuICAgICAgICBfaWQ6IHtcbiAgICAgICAgICAkaW46IHBhcmVudHNcbiAgICAgICAgfSxcbiAgICAgICAgYWRtaW5zOiB1c2VySWRcbiAgICAgIH0pKSB7XG4gICAgICAgIGlzT3JnQWRtaW4gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaXNPcmdBZG1pbjtcbiAgfTtcbiAgU3RlZWRvcy5pc09yZ0FkbWluQnlBbGxPcmdJZHMgPSBmdW5jdGlvbihvcmdJZHMsIHVzZXJJZCkge1xuICAgIHZhciBpLCBpc09yZ0FkbWluO1xuICAgIGlmICghb3JnSWRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGkgPSAwO1xuICAgIHdoaWxlIChpIDwgb3JnSWRzLmxlbmd0aCkge1xuICAgICAgaXNPcmdBZG1pbiA9IFN0ZWVkb3MuaXNPcmdBZG1pbkJ5T3JnSWRzKFtvcmdJZHNbaV1dLCB1c2VySWQpO1xuICAgICAgaWYgKCFpc09yZ0FkbWluKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaSsrO1xuICAgIH1cbiAgICByZXR1cm4gaXNPcmdBZG1pbjtcbiAgfTtcbiAgU3RlZWRvcy5hYnNvbHV0ZVVybCA9IGZ1bmN0aW9uKHVybCkge1xuICAgIHZhciBlLCByb290X3VybDtcbiAgICBpZiAodXJsKSB7XG4gICAgICB1cmwgPSB1cmwucmVwbGFjZSgvXlxcLy8sIFwiXCIpO1xuICAgIH1cbiAgICBpZiAoTWV0ZW9yLmlzQ29yZG92YSkge1xuICAgICAgcmV0dXJuIE1ldGVvci5hYnNvbHV0ZVVybCh1cmwpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcm9vdF91cmwgPSBuZXcgVVJMKE1ldGVvci5hYnNvbHV0ZVVybCgpKTtcbiAgICAgICAgICBpZiAodXJsKSB7XG4gICAgICAgICAgICByZXR1cm4gcm9vdF91cmwucGF0aG5hbWUgKyB1cmw7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByb290X3VybC5wYXRobmFtZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yMSkge1xuICAgICAgICAgIGUgPSBlcnJvcjE7XG4gICAgICAgICAgcmV0dXJuIE1ldGVvci5hYnNvbHV0ZVVybCh1cmwpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gTWV0ZW9yLmFic29sdXRlVXJsKHVybCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBTdGVlZG9zLmdldEFQSUxvZ2luVXNlciA9IGZ1bmN0aW9uKHJlcSwgcmVzKSB7XG4gICAgdmFyIGF1dGhUb2tlbiwgY29va2llcywgcGFzc3dvcmQsIHJlZjUsIHJlZjYsIHJlZjcsIHJlZjgsIHJlc3VsdCwgdXNlciwgdXNlcklkLCB1c2VybmFtZTtcbiAgICB1c2VybmFtZSA9IChyZWY1ID0gcmVxLnF1ZXJ5KSAhPSBudWxsID8gcmVmNS51c2VybmFtZSA6IHZvaWQgMDtcbiAgICBwYXNzd29yZCA9IChyZWY2ID0gcmVxLnF1ZXJ5KSAhPSBudWxsID8gcmVmNi5wYXNzd29yZCA6IHZvaWQgMDtcbiAgICBpZiAodXNlcm5hbWUgJiYgcGFzc3dvcmQpIHtcbiAgICAgIHVzZXIgPSBkYi51c2Vycy5maW5kT25lKHtcbiAgICAgICAgc3RlZWRvc19pZDogdXNlcm5hbWVcbiAgICAgIH0pO1xuICAgICAgaWYgKCF1c2VyKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdCA9IEFjY291bnRzLl9jaGVja1Bhc3N3b3JkKHVzZXIsIHBhc3N3b3JkKTtcbiAgICAgIGlmIChyZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHJlc3VsdC5lcnJvcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdXNlcjtcbiAgICAgIH1cbiAgICB9XG4gICAgdXNlcklkID0gKHJlZjcgPSByZXEucXVlcnkpICE9IG51bGwgPyByZWY3W1wiWC1Vc2VyLUlkXCJdIDogdm9pZCAwO1xuICAgIGF1dGhUb2tlbiA9IChyZWY4ID0gcmVxLnF1ZXJ5KSAhPSBudWxsID8gcmVmOFtcIlgtQXV0aC1Ub2tlblwiXSA6IHZvaWQgMDtcbiAgICBpZiAoU3RlZWRvcy5jaGVja0F1dGhUb2tlbih1c2VySWQsIGF1dGhUb2tlbikpIHtcbiAgICAgIHJldHVybiBkYi51c2Vycy5maW5kT25lKHtcbiAgICAgICAgX2lkOiB1c2VySWRcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb29raWVzID0gbmV3IENvb2tpZXMocmVxLCByZXMpO1xuICAgIGlmIChyZXEuaGVhZGVycykge1xuICAgICAgdXNlcklkID0gcmVxLmhlYWRlcnNbXCJ4LXVzZXItaWRcIl07XG4gICAgICBhdXRoVG9rZW4gPSByZXEuaGVhZGVyc1tcIngtYXV0aC10b2tlblwiXTtcbiAgICB9XG4gICAgaWYgKCF1c2VySWQgfHwgIWF1dGhUb2tlbikge1xuICAgICAgdXNlcklkID0gY29va2llcy5nZXQoXCJYLVVzZXItSWRcIik7XG4gICAgICBhdXRoVG9rZW4gPSBjb29raWVzLmdldChcIlgtQXV0aC1Ub2tlblwiKTtcbiAgICB9XG4gICAgaWYgKCF1c2VySWQgfHwgIWF1dGhUb2tlbikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoU3RlZWRvcy5jaGVja0F1dGhUb2tlbih1c2VySWQsIGF1dGhUb2tlbikpIHtcbiAgICAgIHJldHVybiBkYi51c2Vycy5maW5kT25lKHtcbiAgICAgICAgX2lkOiB1c2VySWRcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG4gIFN0ZWVkb3MuY2hlY2tBdXRoVG9rZW4gPSBmdW5jdGlvbih1c2VySWQsIGF1dGhUb2tlbikge1xuICAgIHZhciBoYXNoZWRUb2tlbiwgdXNlcjtcbiAgICBpZiAodXNlcklkICYmIGF1dGhUb2tlbikge1xuICAgICAgaGFzaGVkVG9rZW4gPSBBY2NvdW50cy5faGFzaExvZ2luVG9rZW4oYXV0aFRva2VuKTtcbiAgICAgIHVzZXIgPSBNZXRlb3IudXNlcnMuZmluZE9uZSh7XG4gICAgICAgIF9pZDogdXNlcklkLFxuICAgICAgICBcInNlcnZpY2VzLnJlc3VtZS5sb2dpblRva2Vucy5oYXNoZWRUb2tlblwiOiBoYXNoZWRUb2tlblxuICAgICAgfSk7XG4gICAgICBpZiAodXNlcikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xufVxuXG5pZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gIGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xuICBTdGVlZG9zLmRlY3J5cHQgPSBmdW5jdGlvbihwYXNzd29yZCwga2V5LCBpdikge1xuICAgIHZhciBjLCBkZWNpcGhlciwgZGVjaXBoZXJNc2csIGUsIGksIGtleTMyLCBsZW4sIG07XG4gICAgdHJ5IHtcbiAgICAgIGtleTMyID0gXCJcIjtcbiAgICAgIGxlbiA9IGtleS5sZW5ndGg7XG4gICAgICBpZiAobGVuIDwgMzIpIHtcbiAgICAgICAgYyA9IFwiXCI7XG4gICAgICAgIGkgPSAwO1xuICAgICAgICBtID0gMzIgLSBsZW47XG4gICAgICAgIHdoaWxlIChpIDwgbSkge1xuICAgICAgICAgIGMgPSBcIiBcIiArIGM7XG4gICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICAgIGtleTMyID0ga2V5ICsgYztcbiAgICAgIH0gZWxzZSBpZiAobGVuID49IDMyKSB7XG4gICAgICAgIGtleTMyID0ga2V5LnNsaWNlKDAsIDMyKTtcbiAgICAgIH1cbiAgICAgIGRlY2lwaGVyID0gY3J5cHRvLmNyZWF0ZURlY2lwaGVyaXYoJ2Flcy0yNTYtY2JjJywgbmV3IEJ1ZmZlcihrZXkzMiwgJ3V0ZjgnKSwgbmV3IEJ1ZmZlcihpdiwgJ3V0ZjgnKSk7XG4gICAgICBkZWNpcGhlck1zZyA9IEJ1ZmZlci5jb25jYXQoW2RlY2lwaGVyLnVwZGF0ZShwYXNzd29yZCwgJ2Jhc2U2NCcpLCBkZWNpcGhlci5maW5hbCgpXSk7XG4gICAgICBwYXNzd29yZCA9IGRlY2lwaGVyTXNnLnRvU3RyaW5nKCk7XG4gICAgICByZXR1cm4gcGFzc3dvcmQ7XG4gICAgfSBjYXRjaCAoZXJyb3IxKSB7XG4gICAgICBlID0gZXJyb3IxO1xuICAgICAgcmV0dXJuIHBhc3N3b3JkO1xuICAgIH1cbiAgfTtcbiAgU3RlZWRvcy5lbmNyeXB0ID0gZnVuY3Rpb24ocGFzc3dvcmQsIGtleSwgaXYpIHtcbiAgICB2YXIgYywgY2lwaGVyLCBjaXBoZXJlZE1zZywgaSwga2V5MzIsIGxlbiwgbTtcbiAgICBrZXkzMiA9IFwiXCI7XG4gICAgbGVuID0ga2V5Lmxlbmd0aDtcbiAgICBpZiAobGVuIDwgMzIpIHtcbiAgICAgIGMgPSBcIlwiO1xuICAgICAgaSA9IDA7XG4gICAgICBtID0gMzIgLSBsZW47XG4gICAgICB3aGlsZSAoaSA8IG0pIHtcbiAgICAgICAgYyA9IFwiIFwiICsgYztcbiAgICAgICAgaSsrO1xuICAgICAgfVxuICAgICAga2V5MzIgPSBrZXkgKyBjO1xuICAgIH0gZWxzZSBpZiAobGVuID49IDMyKSB7XG4gICAgICBrZXkzMiA9IGtleS5zbGljZSgwLCAzMik7XG4gICAgfVxuICAgIGNpcGhlciA9IGNyeXB0by5jcmVhdGVDaXBoZXJpdignYWVzLTI1Ni1jYmMnLCBuZXcgQnVmZmVyKGtleTMyLCAndXRmOCcpLCBuZXcgQnVmZmVyKGl2LCAndXRmOCcpKTtcbiAgICBjaXBoZXJlZE1zZyA9IEJ1ZmZlci5jb25jYXQoW2NpcGhlci51cGRhdGUobmV3IEJ1ZmZlcihwYXNzd29yZCwgJ3V0ZjgnKSksIGNpcGhlci5maW5hbCgpXSk7XG4gICAgcGFzc3dvcmQgPSBjaXBoZXJlZE1zZy50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgcmV0dXJuIHBhc3N3b3JkO1xuICB9O1xuICBTdGVlZG9zLmdldFVzZXJJZEZyb21BY2Nlc3NUb2tlbiA9IGZ1bmN0aW9uKGFjY2Vzc190b2tlbikge1xuICAgIHZhciBjb2xsZWN0aW9uLCBoYXNoZWRUb2tlbiwgb2JqLCB1c2VyLCB1c2VySWQ7XG4gICAgaWYgKCFhY2Nlc3NfdG9rZW4pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB1c2VySWQgPSBhY2Nlc3NfdG9rZW4uc3BsaXQoXCItXCIpWzBdO1xuICAgIGhhc2hlZFRva2VuID0gQWNjb3VudHMuX2hhc2hMb2dpblRva2VuKGFjY2Vzc190b2tlbik7XG4gICAgdXNlciA9IGRiLnVzZXJzLmZpbmRPbmUoe1xuICAgICAgX2lkOiB1c2VySWQsXG4gICAgICBcInNlY3JldHMuaGFzaGVkVG9rZW5cIjogaGFzaGVkVG9rZW5cbiAgICB9KTtcbiAgICBpZiAodXNlcikge1xuICAgICAgcmV0dXJuIHVzZXJJZDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29sbGVjdGlvbiA9IG9BdXRoMlNlcnZlci5jb2xsZWN0aW9ucy5hY2Nlc3NUb2tlbjtcbiAgICAgIG9iaiA9IGNvbGxlY3Rpb24uZmluZE9uZSh7XG4gICAgICAgICdhY2Nlc3NUb2tlbic6IGFjY2Vzc190b2tlblxuICAgICAgfSk7XG4gICAgICBpZiAob2JqKSB7XG4gICAgICAgIGlmICgob2JqICE9IG51bGwgPyBvYmouZXhwaXJlcyA6IHZvaWQgMCkgPCBuZXcgRGF0ZSgpKSB7XG4gICAgICAgICAgcmV0dXJuIFwib2F1dGgyIGFjY2VzcyB0b2tlbjpcIiArIGFjY2Vzc190b2tlbiArIFwiIGlzIGV4cGlyZWQuXCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG9iaiAhPSBudWxsID8gb2JqLnVzZXJJZCA6IHZvaWQgMDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFwib2F1dGgyIGFjY2VzcyB0b2tlbjpcIiArIGFjY2Vzc190b2tlbiArIFwiIGlzIG5vdCBmb3VuZC5cIjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG4gIFN0ZWVkb3MuZ2V0VXNlcklkRnJvbUF1dGhUb2tlbiA9IGZ1bmN0aW9uKHJlcSwgcmVzKSB7XG4gICAgdmFyIGF1dGhUb2tlbiwgY29va2llcywgcmVmNSwgcmVmNiwgcmVmNywgcmVmOCwgdXNlcklkO1xuICAgIHVzZXJJZCA9IChyZWY1ID0gcmVxLnF1ZXJ5KSAhPSBudWxsID8gcmVmNVtcIlgtVXNlci1JZFwiXSA6IHZvaWQgMDtcbiAgICBhdXRoVG9rZW4gPSAocmVmNiA9IHJlcS5xdWVyeSkgIT0gbnVsbCA/IHJlZjZbXCJYLUF1dGgtVG9rZW5cIl0gOiB2b2lkIDA7XG4gICAgaWYgKFN0ZWVkb3MuY2hlY2tBdXRoVG9rZW4odXNlcklkLCBhdXRoVG9rZW4pKSB7XG4gICAgICByZXR1cm4gKHJlZjcgPSBkYi51c2Vycy5maW5kT25lKHtcbiAgICAgICAgX2lkOiB1c2VySWRcbiAgICAgIH0pKSAhPSBudWxsID8gcmVmNy5faWQgOiB2b2lkIDA7XG4gICAgfVxuICAgIGNvb2tpZXMgPSBuZXcgQ29va2llcyhyZXEsIHJlcyk7XG4gICAgaWYgKHJlcS5oZWFkZXJzKSB7XG4gICAgICB1c2VySWQgPSByZXEuaGVhZGVyc1tcIngtdXNlci1pZFwiXTtcbiAgICAgIGF1dGhUb2tlbiA9IHJlcS5oZWFkZXJzW1wieC1hdXRoLXRva2VuXCJdO1xuICAgIH1cbiAgICBpZiAoIXVzZXJJZCB8fCAhYXV0aFRva2VuKSB7XG4gICAgICB1c2VySWQgPSBjb29raWVzLmdldChcIlgtVXNlci1JZFwiKTtcbiAgICAgIGF1dGhUb2tlbiA9IGNvb2tpZXMuZ2V0KFwiWC1BdXRoLVRva2VuXCIpO1xuICAgIH1cbiAgICBpZiAoIXVzZXJJZCB8fCAhYXV0aFRva2VuKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKFN0ZWVkb3MuY2hlY2tBdXRoVG9rZW4odXNlcklkLCBhdXRoVG9rZW4pKSB7XG4gICAgICByZXR1cm4gKHJlZjggPSBkYi51c2Vycy5maW5kT25lKHtcbiAgICAgICAgX2lkOiB1c2VySWRcbiAgICAgIH0pKSAhPSBudWxsID8gcmVmOC5faWQgOiB2b2lkIDA7XG4gICAgfVxuICB9O1xuICBTdGVlZG9zLkFQSUF1dGhlbnRpY2F0aW9uQ2hlY2sgPSBmdW5jdGlvbihyZXEsIHJlcykge1xuICAgIHZhciBlLCB1c2VyLCB1c2VySWQ7XG4gICAgdHJ5IHtcbiAgICAgIHVzZXJJZCA9IHJlcS51c2VySWQ7XG4gICAgICB1c2VyID0gZGIudXNlcnMuZmluZE9uZSh7XG4gICAgICAgIF9pZDogdXNlcklkXG4gICAgICB9KTtcbiAgICAgIGlmICghdXNlcklkIHx8ICF1c2VyKSB7XG4gICAgICAgIEpzb25Sb3V0ZXMuc2VuZFJlc3VsdChyZXMsIHtcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBcImVycm9yXCI6IFwiVmFsaWRhdGUgUmVxdWVzdCAtLSBNaXNzaW5nIFgtQXV0aC1Ub2tlbixYLVVzZXItSWQgT3IgYWNjZXNzX3Rva2VuXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvZGU6IDQwMVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IxKSB7XG4gICAgICBlID0gZXJyb3IxO1xuICAgICAgaWYgKCF1c2VySWQgfHwgIXVzZXIpIHtcbiAgICAgICAgSnNvblJvdXRlcy5zZW5kUmVzdWx0KHJlcywge1xuICAgICAgICAgIGNvZGU6IDQwMSxcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBcImVycm9yXCI6IGUubWVzc2FnZSxcbiAgICAgICAgICAgIFwic3VjY2Vzc1wiOiBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbm1peGluID0gZnVuY3Rpb24ob2JqKSB7XG4gIHJldHVybiBfLmVhY2goXy5mdW5jdGlvbnMob2JqKSwgZnVuY3Rpb24obmFtZSkge1xuICAgIHZhciBmdW5jO1xuICAgIGlmICghX1tuYW1lXSAmJiAoXy5wcm90b3R5cGVbbmFtZV0gPT0gbnVsbCkpIHtcbiAgICAgIGZ1bmMgPSBfW25hbWVdID0gb2JqW25hbWVdO1xuICAgICAgcmV0dXJuIF8ucHJvdG90eXBlW25hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBhcmdzO1xuICAgICAgICBhcmdzID0gW3RoaXMuX3dyYXBwZWRdO1xuICAgICAgICBwdXNoLmFwcGx5KGFyZ3MsIGFyZ3VtZW50cyk7XG4gICAgICAgIHJldHVybiByZXN1bHQuY2FsbCh0aGlzLCBmdW5jLmFwcGx5KF8sIGFyZ3MpKTtcbiAgICAgIH07XG4gICAgfVxuICB9KTtcbn07XG5cbmlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgU3RlZWRvcy5pc0hvbGlkYXkgPSBmdW5jdGlvbihkYXRlKSB7XG4gICAgdmFyIGRheTtcbiAgICBpZiAoIWRhdGUpIHtcbiAgICAgIGRhdGUgPSBuZXcgRGF0ZTtcbiAgICB9XG4gICAgY2hlY2soZGF0ZSwgRGF0ZSk7XG4gICAgZGF5ID0gZGF0ZS5nZXREYXkoKTtcbiAgICBpZiAoZGF5ID09PSA2IHx8IGRheSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcbiAgU3RlZWRvcy5jYWN1bGF0ZVdvcmtpbmdUaW1lID0gZnVuY3Rpb24oZGF0ZSwgZGF5cykge1xuICAgIHZhciBjYWN1bGF0ZURhdGUsIHBhcmFtX2RhdGU7XG4gICAgY2hlY2soZGF0ZSwgRGF0ZSk7XG4gICAgY2hlY2soZGF5cywgTnVtYmVyKTtcbiAgICBwYXJhbV9kYXRlID0gbmV3IERhdGUoZGF0ZSk7XG4gICAgY2FjdWxhdGVEYXRlID0gZnVuY3Rpb24oaSwgZGF5cykge1xuICAgICAgaWYgKGkgPCBkYXlzKSB7XG4gICAgICAgIHBhcmFtX2RhdGUgPSBuZXcgRGF0ZShwYXJhbV9kYXRlLmdldFRpbWUoKSArIDI0ICogNjAgKiA2MCAqIDEwMDApO1xuICAgICAgICBpZiAoIVN0ZWVkb3MuaXNIb2xpZGF5KHBhcmFtX2RhdGUpKSB7XG4gICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICAgIGNhY3VsYXRlRGF0ZShpLCBkYXlzKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGNhY3VsYXRlRGF0ZSgwLCBkYXlzKTtcbiAgICByZXR1cm4gcGFyYW1fZGF0ZTtcbiAgfTtcbiAgU3RlZWRvcy5jYWN1bGF0ZVBsdXNIYWxmV29ya2luZ0RheSA9IGZ1bmN0aW9uKGRhdGUsIG5leHQpIHtcbiAgICB2YXIgY2FjdWxhdGVkX2RhdGUsIGVuZF9kYXRlLCBmaXJzdF9kYXRlLCBpLCBqLCBsZW4sIG1heF9pbmRleCwgcmVmNSwgc2Vjb25kX2RhdGUsIHN0YXJ0X2RhdGUsIHRpbWVfcG9pbnRzO1xuICAgIGNoZWNrKGRhdGUsIERhdGUpO1xuICAgIHRpbWVfcG9pbnRzID0gKHJlZjUgPSBNZXRlb3Iuc2V0dGluZ3MucmVtaW5kKSAhPSBudWxsID8gcmVmNS50aW1lX3BvaW50cyA6IHZvaWQgMDtcbiAgICBpZiAoIXRpbWVfcG9pbnRzIHx8IF8uaXNFbXB0eSh0aW1lX3BvaW50cykpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJ0aW1lX3BvaW50cyBpcyBudWxsXCIpO1xuICAgICAgdGltZV9wb2ludHMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBcImhvdXJcIjogOCxcbiAgICAgICAgICBcIm1pbnV0ZVwiOiAzMFxuICAgICAgICB9LCB7XG4gICAgICAgICAgXCJob3VyXCI6IDE0LFxuICAgICAgICAgIFwibWludXRlXCI6IDMwXG4gICAgICAgIH1cbiAgICAgIF07XG4gICAgfVxuICAgIGxlbiA9IHRpbWVfcG9pbnRzLmxlbmd0aDtcbiAgICBzdGFydF9kYXRlID0gbmV3IERhdGUoZGF0ZSk7XG4gICAgZW5kX2RhdGUgPSBuZXcgRGF0ZShkYXRlKTtcbiAgICBzdGFydF9kYXRlLnNldEhvdXJzKHRpbWVfcG9pbnRzWzBdLmhvdXIpO1xuICAgIHN0YXJ0X2RhdGUuc2V0TWludXRlcyh0aW1lX3BvaW50c1swXS5taW51dGUpO1xuICAgIGVuZF9kYXRlLnNldEhvdXJzKHRpbWVfcG9pbnRzW2xlbiAtIDFdLmhvdXIpO1xuICAgIGVuZF9kYXRlLnNldE1pbnV0ZXModGltZV9wb2ludHNbbGVuIC0gMV0ubWludXRlKTtcbiAgICBjYWN1bGF0ZWRfZGF0ZSA9IG5ldyBEYXRlKGRhdGUpO1xuICAgIGogPSAwO1xuICAgIG1heF9pbmRleCA9IGxlbiAtIDE7XG4gICAgaWYgKGRhdGUgPCBzdGFydF9kYXRlKSB7XG4gICAgICBpZiAobmV4dCkge1xuICAgICAgICBqID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGogPSBsZW4gLyAyO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZGF0ZSA+PSBzdGFydF9kYXRlICYmIGRhdGUgPCBlbmRfZGF0ZSkge1xuICAgICAgaSA9IDA7XG4gICAgICB3aGlsZSAoaSA8IG1heF9pbmRleCkge1xuICAgICAgICBmaXJzdF9kYXRlID0gbmV3IERhdGUoZGF0ZSk7XG4gICAgICAgIHNlY29uZF9kYXRlID0gbmV3IERhdGUoZGF0ZSk7XG4gICAgICAgIGZpcnN0X2RhdGUuc2V0SG91cnModGltZV9wb2ludHNbaV0uaG91cik7XG4gICAgICAgIGZpcnN0X2RhdGUuc2V0TWludXRlcyh0aW1lX3BvaW50c1tpXS5taW51dGUpO1xuICAgICAgICBzZWNvbmRfZGF0ZS5zZXRIb3Vycyh0aW1lX3BvaW50c1tpICsgMV0uaG91cik7XG4gICAgICAgIHNlY29uZF9kYXRlLnNldE1pbnV0ZXModGltZV9wb2ludHNbaSArIDFdLm1pbnV0ZSk7XG4gICAgICAgIGlmIChkYXRlID49IGZpcnN0X2RhdGUgJiYgZGF0ZSA8IHNlY29uZF9kYXRlKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaSsrO1xuICAgICAgfVxuICAgICAgaWYgKG5leHQpIHtcbiAgICAgICAgaiA9IGkgKyAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaiA9IGkgKyBsZW4gLyAyO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZGF0ZSA+PSBlbmRfZGF0ZSkge1xuICAgICAgaWYgKG5leHQpIHtcbiAgICAgICAgaiA9IG1heF9pbmRleCArIDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBqID0gbWF4X2luZGV4ICsgbGVuIC8gMjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGogPiBtYXhfaW5kZXgpIHtcbiAgICAgIGNhY3VsYXRlZF9kYXRlID0gU3RlZWRvcy5jYWN1bGF0ZVdvcmtpbmdUaW1lKGRhdGUsIDEpO1xuICAgICAgY2FjdWxhdGVkX2RhdGUuc2V0SG91cnModGltZV9wb2ludHNbaiAtIG1heF9pbmRleCAtIDFdLmhvdXIpO1xuICAgICAgY2FjdWxhdGVkX2RhdGUuc2V0TWludXRlcyh0aW1lX3BvaW50c1tqIC0gbWF4X2luZGV4IC0gMV0ubWludXRlKTtcbiAgICB9IGVsc2UgaWYgKGogPD0gbWF4X2luZGV4KSB7XG4gICAgICBjYWN1bGF0ZWRfZGF0ZS5zZXRIb3Vycyh0aW1lX3BvaW50c1tqXS5ob3VyKTtcbiAgICAgIGNhY3VsYXRlZF9kYXRlLnNldE1pbnV0ZXModGltZV9wb2ludHNbal0ubWludXRlKTtcbiAgICB9XG4gICAgcmV0dXJuIGNhY3VsYXRlZF9kYXRlO1xuICB9O1xufVxuXG5pZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gIF8uZXh0ZW5kKFN0ZWVkb3MsIHtcbiAgICBnZXRTdGVlZG9zVG9rZW46IGZ1bmN0aW9uKGFwcElkLCB1c2VySWQsIGF1dGhUb2tlbikge1xuICAgICAgdmFyIGFwcCwgYywgY2lwaGVyLCBjaXBoZXJlZE1zZywgaGFzaGVkVG9rZW4sIGksIGl2LCBrZXkzMiwgbGVuLCBtLCBub3csIHNlY3JldCwgc3RlZWRvc19pZCwgc3RlZWRvc190b2tlbiwgdXNlcjtcbiAgICAgIGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xuICAgICAgYXBwID0gZGIuYXBwcy5maW5kT25lKGFwcElkKTtcbiAgICAgIGlmIChhcHApIHtcbiAgICAgICAgc2VjcmV0ID0gYXBwLnNlY3JldDtcbiAgICAgIH1cbiAgICAgIGlmICh1c2VySWQgJiYgYXV0aFRva2VuKSB7XG4gICAgICAgIGhhc2hlZFRva2VuID0gQWNjb3VudHMuX2hhc2hMb2dpblRva2VuKGF1dGhUb2tlbik7XG4gICAgICAgIHVzZXIgPSBNZXRlb3IudXNlcnMuZmluZE9uZSh7XG4gICAgICAgICAgX2lkOiB1c2VySWQsXG4gICAgICAgICAgXCJzZXJ2aWNlcy5yZXN1bWUubG9naW5Ub2tlbnMuaGFzaGVkVG9rZW5cIjogaGFzaGVkVG9rZW5cbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh1c2VyKSB7XG4gICAgICAgICAgc3RlZWRvc19pZCA9IHVzZXIuc3RlZWRvc19pZDtcbiAgICAgICAgICBpZiAoYXBwLnNlY3JldCkge1xuICAgICAgICAgICAgaXYgPSBhcHAuc2VjcmV0O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpdiA9IFwiLTg3NjItZmNiMzY5YjJlOFwiO1xuICAgICAgICAgIH1cbiAgICAgICAgICBub3cgPSBwYXJzZUludChuZXcgRGF0ZSgpLmdldFRpbWUoKSAvIDEwMDApLnRvU3RyaW5nKCk7XG4gICAgICAgICAga2V5MzIgPSBcIlwiO1xuICAgICAgICAgIGxlbiA9IHN0ZWVkb3NfaWQubGVuZ3RoO1xuICAgICAgICAgIGlmIChsZW4gPCAzMikge1xuICAgICAgICAgICAgYyA9IFwiXCI7XG4gICAgICAgICAgICBpID0gMDtcbiAgICAgICAgICAgIG0gPSAzMiAtIGxlbjtcbiAgICAgICAgICAgIHdoaWxlIChpIDwgbSkge1xuICAgICAgICAgICAgICBjID0gXCIgXCIgKyBjO1xuICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBrZXkzMiA9IHN0ZWVkb3NfaWQgKyBjO1xuICAgICAgICAgIH0gZWxzZSBpZiAobGVuID49IDMyKSB7XG4gICAgICAgICAgICBrZXkzMiA9IHN0ZWVkb3NfaWQuc2xpY2UoMCwgMzIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjaXBoZXIgPSBjcnlwdG8uY3JlYXRlQ2lwaGVyaXYoJ2Flcy0yNTYtY2JjJywgbmV3IEJ1ZmZlcihrZXkzMiwgJ3V0ZjgnKSwgbmV3IEJ1ZmZlcihpdiwgJ3V0ZjgnKSk7XG4gICAgICAgICAgY2lwaGVyZWRNc2cgPSBCdWZmZXIuY29uY2F0KFtjaXBoZXIudXBkYXRlKG5ldyBCdWZmZXIobm93LCAndXRmOCcpKSwgY2lwaGVyLmZpbmFsKCldKTtcbiAgICAgICAgICBzdGVlZG9zX3Rva2VuID0gY2lwaGVyZWRNc2cudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RlZWRvc190b2tlbjtcbiAgICB9LFxuICAgIGxvY2FsZTogZnVuY3Rpb24odXNlcklkLCBpc0kxOG4pIHtcbiAgICAgIHZhciBsb2NhbGUsIHVzZXI7XG4gICAgICB1c2VyID0gZGIudXNlcnMuZmluZE9uZSh7XG4gICAgICAgIF9pZDogdXNlcklkXG4gICAgICB9LCB7XG4gICAgICAgIGZpZWxkczoge1xuICAgICAgICAgIGxvY2FsZTogMVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGxvY2FsZSA9IHVzZXIgIT0gbnVsbCA/IHVzZXIubG9jYWxlIDogdm9pZCAwO1xuICAgICAgaWYgKGlzSTE4bikge1xuICAgICAgICBpZiAobG9jYWxlID09PSBcImVuLXVzXCIpIHtcbiAgICAgICAgICBsb2NhbGUgPSBcImVuXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsZSA9PT0gXCJ6aC1jblwiKSB7XG4gICAgICAgICAgbG9jYWxlID0gXCJ6aC1DTlwiO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbG9jYWxlO1xuICAgIH0sXG4gICAgY2hlY2tVc2VybmFtZUF2YWlsYWJpbGl0eTogZnVuY3Rpb24odXNlcm5hbWUpIHtcbiAgICAgIHJldHVybiAhTWV0ZW9yLnVzZXJzLmZpbmRPbmUoe1xuICAgICAgICB1c2VybmFtZToge1xuICAgICAgICAgICRyZWdleDogbmV3IFJlZ0V4cChcIl5cIiArIE1ldGVvci5fZXNjYXBlUmVnRXhwKHVzZXJuYW1lKS50cmltKCkgKyBcIiRcIiwgXCJpXCIpXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sXG4gICAgdmFsaWRhdGVQYXNzd29yZDogZnVuY3Rpb24ocHdkKSB7XG4gICAgICB2YXIgcGFzc3dvclBvbGljeSwgcGFzc3dvclBvbGljeUVycm9yLCByZWFzb24sIHJlZjUsIHJlZjYsIHJlZjcsIHJlZjgsIHZhbGlkO1xuICAgICAgcmVhc29uID0gdChcInBhc3N3b3JkX2ludmFsaWRcIik7XG4gICAgICB2YWxpZCA9IHRydWU7XG4gICAgICBpZiAoIXB3ZCkge1xuICAgICAgICB2YWxpZCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgcGFzc3dvclBvbGljeSA9IChyZWY1ID0gTWV0ZW9yLnNldHRpbmdzW1wicHVibGljXCJdKSAhPSBudWxsID8gKHJlZjYgPSByZWY1LnBhc3N3b3JkKSAhPSBudWxsID8gcmVmNi5wb2xpY3kgOiB2b2lkIDAgOiB2b2lkIDA7XG4gICAgICBwYXNzd29yUG9saWN5RXJyb3IgPSAocmVmNyA9IE1ldGVvci5zZXR0aW5nc1tcInB1YmxpY1wiXSkgIT0gbnVsbCA/IChyZWY4ID0gcmVmNy5wYXNzd29yZCkgIT0gbnVsbCA/IHJlZjgucG9saWN5RXJyb3IgOiB2b2lkIDAgOiB2b2lkIDA7XG4gICAgICBpZiAocGFzc3dvclBvbGljeSkge1xuICAgICAgICBpZiAoIShuZXcgUmVnRXhwKHBhc3N3b3JQb2xpY3kpKS50ZXN0KHB3ZCB8fCAnJykpIHtcbiAgICAgICAgICByZWFzb24gPSBwYXNzd29yUG9saWN5RXJyb3I7XG4gICAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWxpZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh2YWxpZCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgIHJlYXNvbjogcmVhc29uXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG5cblN0ZWVkb3MuY29udmVydFNwZWNpYWxDaGFyYWN0ZXIgPSBmdW5jdGlvbihzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oW1xcXlxcJFxcKFxcKVxcKlxcK1xcP1xcLlxcXFxcXHxcXFtcXF1cXHtcXH1dKS9nLCBcIlxcXFwkMVwiKTtcbn07XG5cblN0ZWVkb3MucmVtb3ZlU3BlY2lhbENoYXJhY3RlciA9IGZ1bmN0aW9uKHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbXFxeXFwkXFwoXFwpXFwqXFwrXFw/XFwuXFxcXFxcfFxcW1xcXVxce1xcfVxcflxcYFxcQFxcI1xcJVxcJlxcPVxcJ1xcXCJcXDpcXDtcXDxcXD5cXCxcXC9dKS9nLCBcIlwiKTtcbn07XG5cbkNyZWF0b3IuZ2V0REJBcHBzID0gZnVuY3Rpb24oc3BhY2VfaWQpIHtcbiAgdmFyIGRiQXBwcztcbiAgZGJBcHBzID0ge307XG4gIENyZWF0b3IuQ29sbGVjdGlvbnNbXCJhcHBzXCJdLmZpbmQoe1xuICAgIHNwYWNlOiBzcGFjZV9pZCxcbiAgICBpc19jcmVhdG9yOiB0cnVlLFxuICAgIHZpc2libGU6IHRydWVcbiAgfSwge1xuICAgIGZpZWxkczoge1xuICAgICAgY3JlYXRlZDogMCxcbiAgICAgIGNyZWF0ZWRfYnk6IDAsXG4gICAgICBtb2RpZmllZDogMCxcbiAgICAgIG1vZGlmaWVkX2J5OiAwXG4gICAgfVxuICB9KS5mb3JFYWNoKGZ1bmN0aW9uKGFwcCkge1xuICAgIHJldHVybiBkYkFwcHNbYXBwLl9pZF0gPSBhcHA7XG4gIH0pO1xuICByZXR1cm4gZGJBcHBzO1xufTtcblxuQ3JlYXRvci5nZXREQkRhc2hib2FyZHMgPSBmdW5jdGlvbihzcGFjZV9pZCkge1xuICB2YXIgZGJEYXNoYm9hcmRzO1xuICBkYkRhc2hib2FyZHMgPSB7fTtcbiAgQ3JlYXRvci5Db2xsZWN0aW9uc1tcImRhc2hib2FyZFwiXS5maW5kKHtcbiAgICBzcGFjZTogc3BhY2VfaWRcbiAgfSwge1xuICAgIGZpZWxkczoge1xuICAgICAgY3JlYXRlZDogMCxcbiAgICAgIGNyZWF0ZWRfYnk6IDAsXG4gICAgICBtb2RpZmllZDogMCxcbiAgICAgIG1vZGlmaWVkX2J5OiAwXG4gICAgfVxuICB9KS5mb3JFYWNoKGZ1bmN0aW9uKGRhc2hib2FyZCkge1xuICAgIHJldHVybiBkYkRhc2hib2FyZHNbZGFzaGJvYXJkLl9pZF0gPSBkYXNoYm9hcmQ7XG4gIH0pO1xuICByZXR1cm4gZGJEYXNoYm9hcmRzO1xufTtcblxuaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICBDb29raWVzID0gcmVxdWlyZShcImNvb2tpZXNcIik7XG4gIFN0ZWVkb3MuZ2V0QXV0aFRva2VuID0gZnVuY3Rpb24ocmVxLCByZXMpIHtcbiAgICB2YXIgYXV0aFRva2VuLCBjb29raWVzO1xuICAgIGNvb2tpZXMgPSBuZXcgQ29va2llcyhyZXEsIHJlcyk7XG4gICAgYXV0aFRva2VuID0gcmVxLmhlYWRlcnNbJ3gtYXV0aC10b2tlbiddIHx8IGNvb2tpZXMuZ2V0KFwiWC1BdXRoLVRva2VuXCIpO1xuICAgIGlmICghYXV0aFRva2VuICYmIHJlcS5oZWFkZXJzLmF1dGhvcml6YXRpb24gJiYgcmVxLmhlYWRlcnMuYXV0aG9yaXphdGlvbi5zcGxpdCgnICcpWzBdID09PSAnQmVhcmVyJykge1xuICAgICAgYXV0aFRva2VuID0gcmVxLmhlYWRlcnMuYXV0aG9yaXphdGlvbi5zcGxpdCgnICcpWzFdO1xuICAgIH1cbiAgICByZXR1cm4gYXV0aFRva2VuO1xuICB9O1xufVxuXG5pZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gIE1ldGVvci5hdXRvcnVuKGZ1bmN0aW9uKCkge1xuICAgIGlmIChTZXNzaW9uLmdldCgnY3VycmVudF9hcHBfaWQnKSkge1xuICAgICAgcmV0dXJuIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oJ2N1cnJlbnRfYXBwX2lkJywgU2Vzc2lvbi5nZXQoJ2N1cnJlbnRfYXBwX2lkJykpO1xuICAgIH1cbiAgfSk7XG4gIFN0ZWVkb3MuZ2V0Q3VycmVudEFwcElkID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKFNlc3Npb24uZ2V0KCdhcHBfaWQnKSkge1xuICAgICAgcmV0dXJuIFNlc3Npb24uZ2V0KCdhcHBfaWQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ2N1cnJlbnRfYXBwX2lkJyk7XG4gICAgfVxuICB9O1xufVxuXG5pZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gIFN0ZWVkb3MuZm9ybWF0SW5kZXggPSBmdW5jdGlvbihhcnJheSkge1xuICAgIHZhciBpbmRleE5hbWUsIGlzZG9jdW1lbnREQiwgb2JqZWN0LCByZWY1LCByZWY2LCByZWY3O1xuICAgIG9iamVjdCA9IHtcbiAgICAgIGJhY2tncm91bmQ6IHRydWVcbiAgICB9O1xuICAgIGlzZG9jdW1lbnREQiA9ICgocmVmNSA9IE1ldGVvci5zZXR0aW5ncykgIT0gbnVsbCA/IChyZWY2ID0gcmVmNS5kYXRhc291cmNlcykgIT0gbnVsbCA/IChyZWY3ID0gcmVmNltcImRlZmF1bHRcIl0pICE9IG51bGwgPyByZWY3LmRvY3VtZW50REIgOiB2b2lkIDAgOiB2b2lkIDAgOiB2b2lkIDApIHx8IGZhbHNlO1xuICAgIGlmIChpc2RvY3VtZW50REIpIHtcbiAgICAgIGlmIChhcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGluZGV4TmFtZSA9IGFycmF5LmpvaW4oXCIuXCIpO1xuICAgICAgICBvYmplY3QubmFtZSA9IGluZGV4TmFtZTtcbiAgICAgICAgaWYgKGluZGV4TmFtZS5sZW5ndGggPiA1Mikge1xuICAgICAgICAgIG9iamVjdC5uYW1lID0gaW5kZXhOYW1lLnN1YnN0cmluZygwLCA1Mik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfTtcbn1cbiIsIk1ldGVvci5zdGFydHVwKGZ1bmN0aW9uICgpIHtcblx0U2ltcGxlU2NoZW1hLmV4dGVuZE9wdGlvbnMoe2ZvcmVpZ25fa2V5OiBNYXRjaC5PcHRpb25hbChCb29sZWFuKSwgcmVmZXJlbmNlczogTWF0Y2guT3B0aW9uYWwoT2JqZWN0KX0pO1xufSkiLCJpZiBNZXRlb3IuaXNTZXJ2ZXJcbiAgICAgICAgTWV0ZW9yLm1ldGhvZHNcbiAgICAgICAgICAgICAgICB1cGRhdGVVc2VyTGFzdExvZ29uOiAoKSAtPlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IEB1c2VySWQ/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblxuXG4gICAgICAgICAgICAgICAgICAgICAgICBkYi51c2Vycy51cGRhdGUoe19pZDogQHVzZXJJZH0sIHskc2V0OiB7bGFzdF9sb2dvbjogbmV3IERhdGUoKX19KSAgXG5cblxuaWYgTWV0ZW9yLmlzQ2xpZW50XG4gICAgICAgIEFjY291bnRzLm9uTG9naW4gKCktPlxuICAgICAgICAgICAgTWV0ZW9yLmNhbGwgJ3VwZGF0ZVVzZXJMYXN0TG9nb24nIiwiaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICBNZXRlb3IubWV0aG9kcyh7XG4gICAgdXBkYXRlVXNlckxhc3RMb2dvbjogZnVuY3Rpb24oKSB7XG4gICAgICBpZiAodGhpcy51c2VySWQgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXR1cm4gZGIudXNlcnMudXBkYXRlKHtcbiAgICAgICAgX2lkOiB0aGlzLnVzZXJJZFxuICAgICAgfSwge1xuICAgICAgICAkc2V0OiB7XG4gICAgICAgICAgbGFzdF9sb2dvbjogbmV3IERhdGUoKVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xufVxuXG5pZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gIEFjY291bnRzLm9uTG9naW4oZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIE1ldGVvci5jYWxsKCd1cGRhdGVVc2VyTGFzdExvZ29uJyk7XG4gIH0pO1xufVxuIiwiaWYgTWV0ZW9yLmlzU2VydmVyXG4gIE1ldGVvci5tZXRob2RzXG4gICAgdXNlcnNfYWRkX2VtYWlsOiAoZW1haWwpIC0+XG4gICAgICBpZiBub3QgQHVzZXJJZD9cbiAgICAgICAgcmV0dXJuIHtlcnJvcjogdHJ1ZSwgbWVzc2FnZTogXCJlbWFpbF9sb2dpbl9yZXF1aXJlZFwifVxuICAgICAgaWYgbm90IGVtYWlsXG4gICAgICAgIHJldHVybiB7ZXJyb3I6IHRydWUsIG1lc3NhZ2U6IFwiZW1haWxfcmVxdWlyZWRcIn1cbiAgICAgIGlmIG5vdCAvXihbQS1aMC05XFwuXFwtXFxfXFwrXSkqKFtBLVowLTlcXCtcXC1cXF9dKStcXEBbQS1aMC05XSsoW1xcLV1bQS1aMC05XSspKihbXFwuXVtBLVowLTlcXC1dKyl7MSw4fSQvaS50ZXN0KGVtYWlsKVxuICAgICAgICByZXR1cm4ge2Vycm9yOiB0cnVlLCBtZXNzYWdlOiBcImVtYWlsX2Zvcm1hdF9lcnJvclwifVxuICAgICAgaWYgZGIudXNlcnMuZmluZCh7XCJlbWFpbHMuYWRkcmVzc1wiOiBlbWFpbH0pLmNvdW50KCk+MFxuICAgICAgICByZXR1cm4ge2Vycm9yOiB0cnVlLCBtZXNzYWdlOiBcImVtYWlsX2V4aXN0c1wifVxuXG4gICAgICB1c2VyID0gZGIudXNlcnMuZmluZE9uZShfaWQ6IHRoaXMudXNlcklkKVxuICAgICAgaWYgdXNlci5lbWFpbHM/IGFuZCB1c2VyLmVtYWlscy5sZW5ndGggPiAwIFxuICAgICAgICBkYi51c2Vycy5kaXJlY3QudXBkYXRlIHtfaWQ6IHRoaXMudXNlcklkfSwgXG4gICAgICAgICAgJHB1c2g6IFxuICAgICAgICAgICAgZW1haWxzOiBcbiAgICAgICAgICAgICAgYWRkcmVzczogZW1haWxcbiAgICAgICAgICAgICAgdmVyaWZpZWQ6IGZhbHNlXG4gICAgICBlbHNlXG4gICAgICAgIGRiLnVzZXJzLmRpcmVjdC51cGRhdGUge19pZDogdGhpcy51c2VySWR9LCBcbiAgICAgICAgICAkc2V0OiBcbiAgICAgICAgICAgIHN0ZWVkb3NfaWQ6IGVtYWlsXG4gICAgICAgICAgICBlbWFpbHM6IFtcbiAgICAgICAgICAgICAgYWRkcmVzczogZW1haWxcbiAgICAgICAgICAgICAgdmVyaWZpZWQ6IGZhbHNlXG4gICAgICAgICAgICBdXG5cbiAgICAgIEFjY291bnRzLnNlbmRWZXJpZmljYXRpb25FbWFpbCh0aGlzLnVzZXJJZCwgZW1haWwpO1xuXG4gICAgICByZXR1cm4ge31cblxuICAgIHVzZXJzX3JlbW92ZV9lbWFpbDogKGVtYWlsKSAtPlxuICAgICAgaWYgbm90IEB1c2VySWQ/XG4gICAgICAgIHJldHVybiB7ZXJyb3I6IHRydWUsIG1lc3NhZ2U6IFwiZW1haWxfbG9naW5fcmVxdWlyZWRcIn1cbiAgICAgIGlmIG5vdCBlbWFpbFxuICAgICAgICByZXR1cm4ge2Vycm9yOiB0cnVlLCBtZXNzYWdlOiBcImVtYWlsX3JlcXVpcmVkXCJ9XG5cbiAgICAgIHVzZXIgPSBkYi51c2Vycy5maW5kT25lKF9pZDogdGhpcy51c2VySWQpXG4gICAgICBpZiB1c2VyLmVtYWlscz8gYW5kIHVzZXIuZW1haWxzLmxlbmd0aCA+PSAyXG4gICAgICAgIHAgPSBudWxsXG4gICAgICAgIHVzZXIuZW1haWxzLmZvckVhY2ggKGUpLT5cbiAgICAgICAgICBpZiBlLmFkZHJlc3MgPT0gZW1haWxcbiAgICAgICAgICAgIHAgPSBlXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgXG4gICAgICAgIGRiLnVzZXJzLmRpcmVjdC51cGRhdGUge19pZDogdGhpcy51c2VySWR9LCBcbiAgICAgICAgICAkcHVsbDogXG4gICAgICAgICAgICBlbWFpbHM6IFxuICAgICAgICAgICAgICBwXG4gICAgICBlbHNlXG4gICAgICAgIHJldHVybiB7ZXJyb3I6IHRydWUsIG1lc3NhZ2U6IFwiZW1haWxfYXRfbGVhc3Rfb25lXCJ9XG5cbiAgICAgIHJldHVybiB7fVxuXG4gICAgdXNlcnNfdmVyaWZ5X2VtYWlsOiAoZW1haWwpIC0+XG4gICAgICBpZiBub3QgQHVzZXJJZD9cbiAgICAgICAgcmV0dXJuIHtlcnJvcjogdHJ1ZSwgbWVzc2FnZTogXCJlbWFpbF9sb2dpbl9yZXF1aXJlZFwifVxuICAgICAgaWYgbm90IGVtYWlsXG4gICAgICAgIHJldHVybiB7ZXJyb3I6IHRydWUsIG1lc3NhZ2U6IFwiZW1haWxfcmVxdWlyZWRcIn1cbiAgICAgIGlmIG5vdCAvXihbQS1aMC05XFwuXFwtXFxfXFwrXSkqKFtBLVowLTlcXCtcXC1cXF9dKStcXEBbQS1aMC05XSsoW1xcLV1bQS1aMC05XSspKihbXFwuXVtBLVowLTlcXC1dKyl7MSw4fSQvaS50ZXN0KGVtYWlsKVxuICAgICAgICByZXR1cm4ge2Vycm9yOiB0cnVlLCBtZXNzYWdlOiBcImVtYWlsX2Zvcm1hdF9lcnJvclwifVxuICAgICAgXG5cbiAgICAgIEFjY291bnRzLnNlbmRWZXJpZmljYXRpb25FbWFpbCh0aGlzLnVzZXJJZCwgZW1haWwpO1xuXG4gICAgICByZXR1cm4ge31cblxuICAgIHVzZXJzX3NldF9wcmltYXJ5X2VtYWlsOiAoZW1haWwpIC0+XG4gICAgICBpZiBub3QgQHVzZXJJZD9cbiAgICAgICAgcmV0dXJuIHtlcnJvcjogdHJ1ZSwgbWVzc2FnZTogXCJlbWFpbF9sb2dpbl9yZXF1aXJlZFwifVxuICAgICAgaWYgbm90IGVtYWlsXG4gICAgICAgIHJldHVybiB7ZXJyb3I6IHRydWUsIG1lc3NhZ2U6IFwiZW1haWxfcmVxdWlyZWRcIn1cblxuICAgICAgdXNlciA9IGRiLnVzZXJzLmZpbmRPbmUoX2lkOiB0aGlzLnVzZXJJZClcbiAgICAgIGVtYWlscyA9IHVzZXIuZW1haWxzXG4gICAgICBlbWFpbHMuZm9yRWFjaCAoZSktPlxuICAgICAgICBpZiBlLmFkZHJlc3MgPT0gZW1haWxcbiAgICAgICAgICBlLnByaW1hcnkgPSB0cnVlXG4gICAgICAgIGVsc2VcbiAgICAgICAgICBlLnByaW1hcnkgPSBmYWxzZVxuXG4gICAgICBkYi51c2Vycy5kaXJlY3QudXBkYXRlIHtfaWQ6IHRoaXMudXNlcklkfSxcbiAgICAgICAgJHNldDpcbiAgICAgICAgICBlbWFpbHM6IGVtYWlsc1xuICAgICAgICAgIGVtYWlsOiBlbWFpbFxuXG4gICAgICBkYi5zcGFjZV91c2Vycy5kaXJlY3QudXBkYXRlKHt1c2VyOiB0aGlzLnVzZXJJZH0seyRzZXQ6IHtlbWFpbDogZW1haWx9fSwge211bHRpOiB0cnVlfSlcbiAgICAgIHJldHVybiB7fVxuXG5cblxuaWYgTWV0ZW9yLmlzQ2xpZW50XG4gICAgU3RlZWRvcy51c2Vyc19hZGRfZW1haWwgPSAoKS0+XG4gICAgICAgIHN3YWxcbiAgICAgICAgICAgIHRpdGxlOiB0KFwicHJpbWFyeV9lbWFpbF9uZWVkZWRcIiksXG4gICAgICAgICAgICB0ZXh0OiB0KFwicHJpbWFyeV9lbWFpbF9uZWVkZWRfZGVzY3JpcHRpb25cIiksXG4gICAgICAgICAgICB0eXBlOiAnaW5wdXQnLFxuICAgICAgICAgICAgc2hvd0NhbmNlbEJ1dHRvbjogZmFsc2UsXG4gICAgICAgICAgICBjbG9zZU9uQ29uZmlybTogZmFsc2UsXG4gICAgICAgICAgICBhbmltYXRpb246IFwic2xpZGUtZnJvbS10b3BcIlxuICAgICAgICAsIChpbnB1dFZhbHVlKSAtPlxuICAgICAgICAgICAgTWV0ZW9yLmNhbGwgXCJ1c2Vyc19hZGRfZW1haWxcIiwgaW5wdXRWYWx1ZSwgKGVycm9yLCByZXN1bHQpLT5cbiAgICAgICAgICAgICAgICBpZiByZXN1bHQ/LmVycm9yXG4gICAgICAgICAgICAgICAgICAgIHRvYXN0ci5lcnJvciByZXN1bHQubWVzc2FnZVxuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgc3dhbCB0KFwicHJpbWFyeV9lbWFpbF91cGRhdGVkXCIpLCBcIlwiLCBcInN1Y2Nlc3NcIlxuIyMjXG4gICAgVHJhY2tlci5hdXRvcnVuIChjKSAtPlxuXG4gICAgICAgIGlmIE1ldGVvci51c2VyKClcbiAgICAgICAgICBpZiBNZXRlb3IubG9nZ2luZ0luKClcbiAgICAgICAgICAgICMg5q2j5Zyo55m75b2V5Lit77yM5YiZ5LiN5YGa5aSE55CG77yM5Zug5Li65q2k5pe2TWV0ZW9yLnVzZXJJZCgp5LiN6Laz5LqO6K+B5piO5bey55m75b2V54q25oCBXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICBwcmltYXJ5RW1haWwgPSBNZXRlb3IudXNlcigpLmVtYWlscz9bMF0/LmFkZHJlc3NcbiAgICAgICAgICBpZiAhcHJpbWFyeUVtYWlsXG4gICAgICAgICAgICAgIFN0ZWVkb3MudXNlcnNfYWRkX2VtYWlsKCk7XG4jIyMiLCJpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gIE1ldGVvci5tZXRob2RzKHtcbiAgICB1c2Vyc19hZGRfZW1haWw6IGZ1bmN0aW9uKGVtYWlsKSB7XG4gICAgICB2YXIgdXNlcjtcbiAgICAgIGlmICh0aGlzLnVzZXJJZCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZXJyb3I6IHRydWUsXG4gICAgICAgICAgbWVzc2FnZTogXCJlbWFpbF9sb2dpbl9yZXF1aXJlZFwiXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoIWVtYWlsKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZXJyb3I6IHRydWUsXG4gICAgICAgICAgbWVzc2FnZTogXCJlbWFpbF9yZXF1aXJlZFwiXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoIS9eKFtBLVowLTlcXC5cXC1cXF9cXCtdKSooW0EtWjAtOVxcK1xcLVxcX10pK1xcQFtBLVowLTldKyhbXFwtXVtBLVowLTldKykqKFtcXC5dW0EtWjAtOVxcLV0rKXsxLDh9JC9pLnRlc3QoZW1haWwpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZXJyb3I6IHRydWUsXG4gICAgICAgICAgbWVzc2FnZTogXCJlbWFpbF9mb3JtYXRfZXJyb3JcIlxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGRiLnVzZXJzLmZpbmQoe1xuICAgICAgICBcImVtYWlscy5hZGRyZXNzXCI6IGVtYWlsXG4gICAgICB9KS5jb3VudCgpID4gMCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGVycm9yOiB0cnVlLFxuICAgICAgICAgIG1lc3NhZ2U6IFwiZW1haWxfZXhpc3RzXCJcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHVzZXIgPSBkYi51c2Vycy5maW5kT25lKHtcbiAgICAgICAgX2lkOiB0aGlzLnVzZXJJZFxuICAgICAgfSk7XG4gICAgICBpZiAoKHVzZXIuZW1haWxzICE9IG51bGwpICYmIHVzZXIuZW1haWxzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZGIudXNlcnMuZGlyZWN0LnVwZGF0ZSh7XG4gICAgICAgICAgX2lkOiB0aGlzLnVzZXJJZFxuICAgICAgICB9LCB7XG4gICAgICAgICAgJHB1c2g6IHtcbiAgICAgICAgICAgIGVtYWlsczoge1xuICAgICAgICAgICAgICBhZGRyZXNzOiBlbWFpbCxcbiAgICAgICAgICAgICAgdmVyaWZpZWQ6IGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRiLnVzZXJzLmRpcmVjdC51cGRhdGUoe1xuICAgICAgICAgIF9pZDogdGhpcy51c2VySWRcbiAgICAgICAgfSwge1xuICAgICAgICAgICRzZXQ6IHtcbiAgICAgICAgICAgIHN0ZWVkb3NfaWQ6IGVtYWlsLFxuICAgICAgICAgICAgZW1haWxzOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhZGRyZXNzOiBlbWFpbCxcbiAgICAgICAgICAgICAgICB2ZXJpZmllZDogZmFsc2VcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBBY2NvdW50cy5zZW5kVmVyaWZpY2F0aW9uRW1haWwodGhpcy51c2VySWQsIGVtYWlsKTtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9LFxuICAgIHVzZXJzX3JlbW92ZV9lbWFpbDogZnVuY3Rpb24oZW1haWwpIHtcbiAgICAgIHZhciBwLCB1c2VyO1xuICAgICAgaWYgKHRoaXMudXNlcklkID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlcnJvcjogdHJ1ZSxcbiAgICAgICAgICBtZXNzYWdlOiBcImVtYWlsX2xvZ2luX3JlcXVpcmVkXCJcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmICghZW1haWwpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlcnJvcjogdHJ1ZSxcbiAgICAgICAgICBtZXNzYWdlOiBcImVtYWlsX3JlcXVpcmVkXCJcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHVzZXIgPSBkYi51c2Vycy5maW5kT25lKHtcbiAgICAgICAgX2lkOiB0aGlzLnVzZXJJZFxuICAgICAgfSk7XG4gICAgICBpZiAoKHVzZXIuZW1haWxzICE9IG51bGwpICYmIHVzZXIuZW1haWxzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgIHAgPSBudWxsO1xuICAgICAgICB1c2VyLmVtYWlscy5mb3JFYWNoKGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICBpZiAoZS5hZGRyZXNzID09PSBlbWFpbCkge1xuICAgICAgICAgICAgcCA9IGU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgZGIudXNlcnMuZGlyZWN0LnVwZGF0ZSh7XG4gICAgICAgICAgX2lkOiB0aGlzLnVzZXJJZFxuICAgICAgICB9LCB7XG4gICAgICAgICAgJHB1bGw6IHtcbiAgICAgICAgICAgIGVtYWlsczogcFxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGVycm9yOiB0cnVlLFxuICAgICAgICAgIG1lc3NhZ2U6IFwiZW1haWxfYXRfbGVhc3Rfb25lXCJcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7fTtcbiAgICB9LFxuICAgIHVzZXJzX3ZlcmlmeV9lbWFpbDogZnVuY3Rpb24oZW1haWwpIHtcbiAgICAgIGlmICh0aGlzLnVzZXJJZCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZXJyb3I6IHRydWUsXG4gICAgICAgICAgbWVzc2FnZTogXCJlbWFpbF9sb2dpbl9yZXF1aXJlZFwiXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoIWVtYWlsKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZXJyb3I6IHRydWUsXG4gICAgICAgICAgbWVzc2FnZTogXCJlbWFpbF9yZXF1aXJlZFwiXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoIS9eKFtBLVowLTlcXC5cXC1cXF9cXCtdKSooW0EtWjAtOVxcK1xcLVxcX10pK1xcQFtBLVowLTldKyhbXFwtXVtBLVowLTldKykqKFtcXC5dW0EtWjAtOVxcLV0rKXsxLDh9JC9pLnRlc3QoZW1haWwpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZXJyb3I6IHRydWUsXG4gICAgICAgICAgbWVzc2FnZTogXCJlbWFpbF9mb3JtYXRfZXJyb3JcIlxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgQWNjb3VudHMuc2VuZFZlcmlmaWNhdGlvbkVtYWlsKHRoaXMudXNlcklkLCBlbWFpbCk7XG4gICAgICByZXR1cm4ge307XG4gICAgfSxcbiAgICB1c2Vyc19zZXRfcHJpbWFyeV9lbWFpbDogZnVuY3Rpb24oZW1haWwpIHtcbiAgICAgIHZhciBlbWFpbHMsIHVzZXI7XG4gICAgICBpZiAodGhpcy51c2VySWQgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGVycm9yOiB0cnVlLFxuICAgICAgICAgIG1lc3NhZ2U6IFwiZW1haWxfbG9naW5fcmVxdWlyZWRcIlxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKCFlbWFpbCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGVycm9yOiB0cnVlLFxuICAgICAgICAgIG1lc3NhZ2U6IFwiZW1haWxfcmVxdWlyZWRcIlxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgdXNlciA9IGRiLnVzZXJzLmZpbmRPbmUoe1xuICAgICAgICBfaWQ6IHRoaXMudXNlcklkXG4gICAgICB9KTtcbiAgICAgIGVtYWlscyA9IHVzZXIuZW1haWxzO1xuICAgICAgZW1haWxzLmZvckVhY2goZnVuY3Rpb24oZSkge1xuICAgICAgICBpZiAoZS5hZGRyZXNzID09PSBlbWFpbCkge1xuICAgICAgICAgIHJldHVybiBlLnByaW1hcnkgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBlLnByaW1hcnkgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBkYi51c2Vycy5kaXJlY3QudXBkYXRlKHtcbiAgICAgICAgX2lkOiB0aGlzLnVzZXJJZFxuICAgICAgfSwge1xuICAgICAgICAkc2V0OiB7XG4gICAgICAgICAgZW1haWxzOiBlbWFpbHMsXG4gICAgICAgICAgZW1haWw6IGVtYWlsXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgZGIuc3BhY2VfdXNlcnMuZGlyZWN0LnVwZGF0ZSh7XG4gICAgICAgIHVzZXI6IHRoaXMudXNlcklkXG4gICAgICB9LCB7XG4gICAgICAgICRzZXQ6IHtcbiAgICAgICAgICBlbWFpbDogZW1haWxcbiAgICAgICAgfVxuICAgICAgfSwge1xuICAgICAgICBtdWx0aTogdHJ1ZVxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICB9KTtcbn1cblxuaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICBTdGVlZG9zLnVzZXJzX2FkZF9lbWFpbCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBzd2FsKHtcbiAgICAgIHRpdGxlOiB0KFwicHJpbWFyeV9lbWFpbF9uZWVkZWRcIiksXG4gICAgICB0ZXh0OiB0KFwicHJpbWFyeV9lbWFpbF9uZWVkZWRfZGVzY3JpcHRpb25cIiksXG4gICAgICB0eXBlOiAnaW5wdXQnLFxuICAgICAgc2hvd0NhbmNlbEJ1dHRvbjogZmFsc2UsXG4gICAgICBjbG9zZU9uQ29uZmlybTogZmFsc2UsXG4gICAgICBhbmltYXRpb246IFwic2xpZGUtZnJvbS10b3BcIlxuICAgIH0sIGZ1bmN0aW9uKGlucHV0VmFsdWUpIHtcbiAgICAgIHJldHVybiBNZXRlb3IuY2FsbChcInVzZXJzX2FkZF9lbWFpbFwiLCBpbnB1dFZhbHVlLCBmdW5jdGlvbihlcnJvciwgcmVzdWx0KSB7XG4gICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCA/IHJlc3VsdC5lcnJvciA6IHZvaWQgMCkge1xuICAgICAgICAgIHJldHVybiB0b2FzdHIuZXJyb3IocmVzdWx0Lm1lc3NhZ2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBzd2FsKHQoXCJwcmltYXJ5X2VtYWlsX3VwZGF0ZWRcIiksIFwiXCIsIFwic3VjY2Vzc1wiKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG59XG5cblxuLypcbiAgICBUcmFja2VyLmF1dG9ydW4gKGMpIC0+XG5cbiAgICAgICAgaWYgTWV0ZW9yLnVzZXIoKVxuICAgICAgICAgIGlmIE1ldGVvci5sb2dnaW5nSW4oKVxuICAgICAgICAgICAgICog5q2j5Zyo55m75b2V5Lit77yM5YiZ5LiN5YGa5aSE55CG77yM5Zug5Li65q2k5pe2TWV0ZW9yLnVzZXJJZCgp5LiN6Laz5LqO6K+B5piO5bey55m75b2V54q25oCBXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICBwcmltYXJ5RW1haWwgPSBNZXRlb3IudXNlcigpLmVtYWlscz9bMF0/LmFkZHJlc3NcbiAgICAgICAgICBpZiAhcHJpbWFyeUVtYWlsXG4gICAgICAgICAgICAgIFN0ZWVkb3MudXNlcnNfYWRkX2VtYWlsKCk7XG4gKi9cbiIsImlmIE1ldGVvci5pc1NlcnZlclxuICAgIE1ldGVvci5tZXRob2RzXG4gICAgICAgIHVwZGF0ZVVzZXJBdmF0YXI6IChhdmF0YXIpIC0+XG4gICAgICAgICAgICAgICAgaWYgbm90IEB1c2VySWQ/XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5cblxuICAgICAgICAgICAgICAgIGRiLnVzZXJzLnVwZGF0ZSh7X2lkOiBAdXNlcklkfSwgeyRzZXQ6IHthdmF0YXI6IGF2YXRhcn19KSAgIiwiaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICBNZXRlb3IubWV0aG9kcyh7XG4gICAgdXBkYXRlVXNlckF2YXRhcjogZnVuY3Rpb24oYXZhdGFyKSB7XG4gICAgICBpZiAodGhpcy51c2VySWQgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXR1cm4gZGIudXNlcnMudXBkYXRlKHtcbiAgICAgICAgX2lkOiB0aGlzLnVzZXJJZFxuICAgICAgfSwge1xuICAgICAgICAkc2V0OiB7XG4gICAgICAgICAgYXZhdGFyOiBhdmF0YXJcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbn1cbiIsIkFjY291bnRzLmVtYWlsVGVtcGxhdGVzID0ge1xuXHRmcm9tOiAoZnVuY3Rpb24oKXtcblx0XHR2YXIgZGVmYXVsdEZyb20gPSBcIlN0ZWVkb3MgPG5vcmVwbHlAbWVzc2FnZS5zdGVlZG9zLmNvbT5cIjtcblx0XHRpZighTWV0ZW9yLnNldHRpbmdzKVxuXHRcdFx0cmV0dXJuIGRlZmF1bHRGcm9tO1xuXHRcdFxuXHRcdGlmKCFNZXRlb3Iuc2V0dGluZ3MuZW1haWwpXG5cdFx0XHRyZXR1cm4gZGVmYXVsdEZyb207XG5cblx0XHRpZighTWV0ZW9yLnNldHRpbmdzLmVtYWlsLmZyb20pXG5cdFx0XHRyZXR1cm4gZGVmYXVsdEZyb207XG5cdFx0XG5cdFx0cmV0dXJuIE1ldGVvci5zZXR0aW5ncy5lbWFpbC5mcm9tO1xuXHR9KSgpLFxuXHRyZXNldFBhc3N3b3JkOiB7XG5cdFx0c3ViamVjdDogZnVuY3Rpb24gKHVzZXIpIHtcblx0XHRcdHJldHVybiBUQVBpMThuLl9fKFwidXNlcnNfZW1haWxfcmVzZXRfcGFzc3dvcmRcIix7fSx1c2VyLmxvY2FsZSk7XG5cdFx0fSxcblx0XHR0ZXh0OiBmdW5jdGlvbiAodXNlciwgdXJsKSB7XG5cdFx0XHR2YXIgc3BsaXRzID0gdXJsLnNwbGl0KFwiL1wiKTtcblx0XHRcdHZhciB0b2tlbkNvZGUgPSBzcGxpdHNbc3BsaXRzLmxlbmd0aC0xXTtcblx0XHRcdHZhciBncmVldGluZyA9IHVzZXIucHJvZmlsZSAmJiB1c2VyLnByb2ZpbGUubmFtZSA/IFRBUGkxOG4uX18oXCJ1c2Vyc19lbWFpbF9oZWxsb1wiLHt9LHVzZXIubG9jYWxlKSArIHVzZXIucHJvZmlsZS5uYW1lICsgXCIsXCIgOiBUQVBpMThuLl9fKFwidXNlcnNfZW1haWxfaGVsbG9cIix7fSx1c2VyLmxvY2FsZSkgKyBcIixcIjtcblx0XHRcdHJldHVybiBncmVldGluZyArIFwiXFxuXFxuXCIgKyBUQVBpMThuLl9fKFwidXNlcnNfZW1haWxfcmVzZXRfcGFzc3dvcmRfYm9keVwiLHt0b2tlbl9jb2RlOnRva2VuQ29kZX0sdXNlci5sb2NhbGUpICsgXCJcXG5cXG5cIiArIHVybCArIFwiXFxuXFxuXCIgKyBUQVBpMThuLl9fKFwidXNlcnNfZW1haWxfdGhhbmtzXCIse30sdXNlci5sb2NhbGUpICsgXCJcXG5cIjtcblx0XHR9XG5cdH0sXG5cdHZlcmlmeUVtYWlsOiB7XG5cdFx0c3ViamVjdDogZnVuY3Rpb24gKHVzZXIpIHtcblx0XHRcdHJldHVybiBUQVBpMThuLl9fKFwidXNlcnNfZW1haWxfdmVyaWZ5X2VtYWlsXCIse30sdXNlci5sb2NhbGUpO1xuXHRcdH0sXG5cdFx0dGV4dDogZnVuY3Rpb24gKHVzZXIsIHVybCkge1xuXHRcdFx0dmFyIGdyZWV0aW5nID0gdXNlci5wcm9maWxlICYmIHVzZXIucHJvZmlsZS5uYW1lID8gVEFQaTE4bi5fXyhcInVzZXJzX2VtYWlsX2hlbGxvXCIse30sdXNlci5sb2NhbGUpICsgdXNlci5wcm9maWxlLm5hbWUgKyBcIixcIiA6IFRBUGkxOG4uX18oXCJ1c2Vyc19lbWFpbF9oZWxsb1wiLHt9LHVzZXIubG9jYWxlKSArIFwiLFwiO1xuXHRcdFx0cmV0dXJuIGdyZWV0aW5nICsgXCJcXG5cXG5cIiArIFRBUGkxOG4uX18oXCJ1c2Vyc19lbWFpbF92ZXJpZnlfYWNjb3VudFwiLHt9LHVzZXIubG9jYWxlKSArIFwiXFxuXFxuXCIgKyB1cmwgKyBcIlxcblxcblwiICsgVEFQaTE4bi5fXyhcInVzZXJzX2VtYWlsX3RoYW5rc1wiLHt9LHVzZXIubG9jYWxlKSArIFwiXFxuXCI7XG5cdFx0fVxuXHR9LFxuXHRlbnJvbGxBY2NvdW50OiB7XG5cdFx0c3ViamVjdDogZnVuY3Rpb24gKHVzZXIpIHtcblx0XHRcdHJldHVybiBUQVBpMThuLl9fKFwidXNlcnNfZW1haWxfY3JlYXRlX2FjY291bnRcIix7fSx1c2VyLmxvY2FsZSk7XG5cdFx0fSxcblx0XHR0ZXh0OiBmdW5jdGlvbiAodXNlciwgdXJsKSB7XG5cdFx0XHR2YXIgZ3JlZXRpbmcgPSB1c2VyLnByb2ZpbGUgJiYgdXNlci5wcm9maWxlLm5hbWUgPyBUQVBpMThuLl9fKFwidXNlcnNfZW1haWxfaGVsbG9cIix7fSx1c2VyLmxvY2FsZSkgKyB1c2VyLnByb2ZpbGUubmFtZSArIFwiLFwiIDogVEFQaTE4bi5fXyhcInVzZXJzX2VtYWlsX2hlbGxvXCIse30sdXNlci5sb2NhbGUpICsgXCIsXCI7XG5cdFx0XHRyZXR1cm4gZ3JlZXRpbmcgKyBcIlxcblxcblwiICsgVEFQaTE4bi5fXyhcInVzZXJzX2VtYWlsX3N0YXJ0X3NlcnZpY2VcIix7fSx1c2VyLmxvY2FsZSkgKyBcIlxcblxcblwiICsgdXJsICsgXCJcXG5cXG5cIiArIFRBUGkxOG4uX18oXCJ1c2Vyc19lbWFpbF90aGFua3NcIix7fSx1c2VyLmxvY2FsZSkgKyBcIlxcblwiO1xuXHRcdH1cblx0fVxufTsiLCIvLyDkv67mlLlmdWxsbmFtZeWAvOaciemXrumimOeahG9yZ2FuaXphdGlvbnNcbkpzb25Sb3V0ZXMuYWRkKFwiZ2V0XCIsIFwiL2FwaS9vcmdhbml6YXRpb25zL3VwZ3JhZGUvXCIsIGZ1bmN0aW9uIChyZXEsIHJlcywgbmV4dCkge1xuICBcblx0dmFyIG9yZ3MgPSBkYi5vcmdhbml6YXRpb25zLmZpbmQoe2Z1bGxuYW1lOi/mlrDpg6jpl6gvLG5hbWU6eyRuZTpcIuaWsOmDqOmXqFwifX0pO1xuXHRpZiAob3Jncy5jb3VudCgpPjApXG5cdHtcblx0XHRvcmdzLmZvckVhY2ggKGZ1bmN0aW9uIChvcmcpXG5cdFx0e1xuXHRcdFx0Ly8g6Ieq5bex5ZKM5a2Q6YOo6Zeo55qEZnVsbG5hbWXkv67mlLlcblx0XHRcdGRiLm9yZ2FuaXphdGlvbnMuZGlyZWN0LnVwZGF0ZShvcmcuX2lkLCB7JHNldDoge2Z1bGxuYW1lOiBvcmcuY2FsY3VsYXRlRnVsbG5hbWUoKX19KTtcblx0XHRcdFxuXHRcdH0pO1xuXHR9XHRcblxuICBcdEpzb25Sb3V0ZXMuc2VuZFJlc3VsdChyZXMsIHtcbiAgICBcdGRhdGE6IHtcblx0ICAgICAgXHRyZXQ6IDAsXG5cdCAgICAgIFx0bXNnOiBcIlN1Y2Nlc3NmdWxseVwiXG4gICAgXHR9XG4gIFx0fSk7XG59KTtcblxuIiwiaWYgTWV0ZW9yLmlzQ29yZG92YVxuICAgICAgICBNZXRlb3Iuc3RhcnR1cCAtPlxuICAgICAgICAgICAgICAgIFB1c2guQ29uZmlndXJlXG4gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kZXJJRDogd2luZG93LkFORFJPSURfU0VOREVSX0lEXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpYnJhdGU6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIGlvczpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFkZ2U6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJCYWRnZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VuZDogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGVydDogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgYXBwTmFtZTogXCJ3b3JrZmxvd1wiXG4iLCJpZiAoTWV0ZW9yLmlzQ29yZG92YSkge1xuICBNZXRlb3Iuc3RhcnR1cChmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gUHVzaC5Db25maWd1cmUoe1xuICAgICAgYW5kcm9pZDoge1xuICAgICAgICBzZW5kZXJJRDogd2luZG93LkFORFJPSURfU0VOREVSX0lELFxuICAgICAgICBzb3VuZDogdHJ1ZSxcbiAgICAgICAgdmlicmF0ZTogdHJ1ZVxuICAgICAgfSxcbiAgICAgIGlvczoge1xuICAgICAgICBiYWRnZTogdHJ1ZSxcbiAgICAgICAgY2xlYXJCYWRnZTogdHJ1ZSxcbiAgICAgICAgc291bmQ6IHRydWUsXG4gICAgICAgIGFsZXJ0OiB0cnVlXG4gICAgICB9LFxuICAgICAgYXBwTmFtZTogXCJ3b3JrZmxvd1wiXG4gICAgfSk7XG4gIH0pO1xufVxuIiwiU2VsZWN0b3IgPSB7fVxuXG4jIEZpbHRlciBkYXRhIG9uIHNlcnZlciBieSBzcGFjZSBmaWVsZFxuU2VsZWN0b3Iuc2VsZWN0b3JDaGVja1NwYWNlQWRtaW4gPSAodXNlcklkKSAtPlxuXHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHR1c2VySWQgPSBNZXRlb3IudXNlcklkKClcblx0XHR1bmxlc3MgdXNlcklkXG5cdFx0XHRyZXR1cm4ge19pZDogLTF9XG5cdFx0aWYgU3RlZWRvcy5pc1NwYWNlQWRtaW4oKVxuXHRcdFx0cmV0dXJuIHtzcGFjZTogU2Vzc2lvbi5nZXQoXCJzcGFjZUlkXCIpfVxuXHRcdGVsc2Vcblx0XHRcdHJldHVybiB7X2lkOiAtMX1cblxuXHRpZiBNZXRlb3IuaXNTZXJ2ZXJcblx0XHR1bmxlc3MgdXNlcklkXG5cdFx0XHRyZXR1cm4ge19pZDogLTF9XG5cdFx0dXNlciA9IGRiLnVzZXJzLmZpbmRPbmUodXNlcklkLCB7ZmllbGRzOiB7aXNfY2xvdWRhZG1pbjogMX19KVxuXHRcdGlmICF1c2VyXG5cdFx0XHRyZXR1cm4ge19pZDogLTF9XG5cdFx0c2VsZWN0b3IgPSB7fVxuXHRcdGlmICF1c2VyLmlzX2Nsb3VkYWRtaW5cblx0XHRcdHNwYWNlcyA9IGRiLnNwYWNlcy5maW5kKHthZG1pbnM6eyRpbjpbdXNlcklkXX19LCB7ZmllbGRzOiB7X2lkOiAxfX0pLmZldGNoKClcblx0XHRcdHNwYWNlcyA9IHNwYWNlcy5tYXAgKG4pIC0+IHJldHVybiBuLl9pZFxuXHRcdFx0c2VsZWN0b3Iuc3BhY2UgPSB7JGluOiBzcGFjZXN9XG5cdFx0cmV0dXJuIHNlbGVjdG9yXG5cbiMgRmlsdGVyIGRhdGEgb24gc2VydmVyIGJ5IHNwYWNlIGZpZWxkXG5TZWxlY3Rvci5zZWxlY3RvckNoZWNrU3BhY2UgPSAodXNlcklkKSAtPlxuXHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHR1c2VySWQgPSBNZXRlb3IudXNlcklkKClcblx0XHR1bmxlc3MgdXNlcklkXG5cdFx0XHRyZXR1cm4ge19pZDogLTF9XG5cdFx0c3BhY2VJZCA9IFNlc3Npb24uZ2V0KFwic3BhY2VJZFwiKTtcblx0XHRpZiBzcGFjZUlkXG5cdFx0XHRpZiBkYi5zcGFjZV91c2Vycy5maW5kT25lKHt1c2VyOiB1c2VySWQsc3BhY2U6IHNwYWNlSWR9LCB7ZmllbGRzOiB7X2lkOiAxfX0pXG5cdFx0XHRcdHJldHVybiB7c3BhY2U6IHNwYWNlSWR9XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHJldHVybiB7X2lkOiAtMX1cblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4ge19pZDogLTF9XG5cblx0aWYgTWV0ZW9yLmlzU2VydmVyXG5cdFx0dW5sZXNzIHVzZXJJZFxuXHRcdFx0cmV0dXJuIHtfaWQ6IC0xfVxuXHRcdHVzZXIgPSBkYi51c2Vycy5maW5kT25lKHVzZXJJZCwge2ZpZWxkczoge19pZDogMX19KVxuXHRcdGlmICF1c2VyXG5cdFx0XHRyZXR1cm4ge19pZDogLTF9XG5cdFx0c2VsZWN0b3IgPSB7fVxuXHRcdHNwYWNlX3VzZXJzID0gZGIuc3BhY2VfdXNlcnMuZmluZCh7dXNlcjogdXNlcklkfSwge2ZpZWxkczoge3NwYWNlOiAxfX0pLmZldGNoKClcblx0XHRzcGFjZXMgPSBbXVxuXHRcdF8uZWFjaCBzcGFjZV91c2VycywgKHUpLT5cblx0XHRcdHNwYWNlcy5wdXNoKHUuc3BhY2UpXG5cdFx0c2VsZWN0b3Iuc3BhY2UgPSB7JGluOiBzcGFjZXN9XG5cdFx0cmV0dXJuIHNlbGVjdG9yXG5cbmRiLmJpbGxpbmdfcGF5X3JlY29yZHMuYWRtaW5Db25maWcgPVxuXHRpY29uOiBcImdsb2JlXCJcblx0Y29sb3I6IFwiYmx1ZVwiXG5cdHRhYmxlQ29sdW1uczogW1xuXHRcdHtuYW1lOiBcIm9yZGVyX2NyZWF0ZWQoKVwifSxcblx0XHR7bmFtZTogXCJtb2R1bGVzXCJ9LFxuXHRcdHtuYW1lOiBcInVzZXJfY291bnRcIn0sXG5cdFx0e25hbWU6IFwiZW5kX2RhdGVcIn0sXG5cdFx0e25hbWU6IFwib3JkZXJfdG90YWxfZmVlKClcIn0sXG5cdFx0e25hbWU6IFwib3JkZXJfcGFpZCgpXCJ9XG5cdF1cblx0ZXh0cmFGaWVsZHM6IFtcInNwYWNlXCIsIFwiY3JlYXRlZFwiLCBcInBhaWRcIiwgXCJ0b3RhbF9mZWVcIl1cblx0cm91dGVyQWRtaW46IFwiL2FkbWluXCJcblx0c2VsZWN0b3I6ICh1c2VySWQpIC0+XG5cdFx0aWYgTWV0ZW9yLmlzQ2xpZW50XG5cdFx0XHRpZiBTdGVlZG9zLmlzU3BhY2VBZG1pbigpXG5cdFx0XHRcdHJldHVybiB7c3BhY2U6IFNlc3Npb24uZ2V0KFwic3BhY2VJZFwiKSwgcGFpZDogdHJ1ZX1cblx0XHRcdGVsc2Vcblx0XHRcdFx0cmV0dXJuIHtfaWQ6IC0xfVxuXG5cdFx0aWYgTWV0ZW9yLmlzU2VydmVyXG5cdFx0XHRyZXR1cm4ge31cblx0c2hvd0VkaXRDb2x1bW46IGZhbHNlXG5cdHNob3dEZWxDb2x1bW46IGZhbHNlXG5cdGRpc2FibGVBZGQ6IHRydWVcblx0cGFnZUxlbmd0aDogMTAwXG5cdG9yZGVyOiBbWzAsIFwiZGVzY1wiXV1cblxuTWV0ZW9yLnN0YXJ0dXAgLT5cblx0QHNwYWNlX3VzZXJfc2lnbnMgPSBkYi5zcGFjZV91c2VyX3NpZ25zXG5cdEBiaWxsaW5nX3BheV9yZWNvcmRzID0gZGIuYmlsbGluZ19wYXlfcmVjb3Jkc1xuXHRBZG1pbkNvbmZpZz8uY29sbGVjdGlvbnNfYWRkXG5cdFx0c3BhY2VfdXNlcl9zaWduczogZGIuc3BhY2VfdXNlcl9zaWducy5hZG1pbkNvbmZpZ1xuXHRcdGJpbGxpbmdfcGF5X3JlY29yZHM6IGRiLmJpbGxpbmdfcGF5X3JlY29yZHMuYWRtaW5Db25maWciLCIgICAgICAgICAgICAgXG5cblNlbGVjdG9yID0ge307XG5cblNlbGVjdG9yLnNlbGVjdG9yQ2hlY2tTcGFjZUFkbWluID0gZnVuY3Rpb24odXNlcklkKSB7XG4gIHZhciBzZWxlY3Rvciwgc3BhY2VzLCB1c2VyO1xuICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgdXNlcklkID0gTWV0ZW9yLnVzZXJJZCgpO1xuICAgIGlmICghdXNlcklkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBfaWQ6IC0xXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAoU3RlZWRvcy5pc1NwYWNlQWRtaW4oKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3BhY2U6IFNlc3Npb24uZ2V0KFwic3BhY2VJZFwiKVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX2lkOiAtMVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICAgIGlmICghdXNlcklkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBfaWQ6IC0xXG4gICAgICB9O1xuICAgIH1cbiAgICB1c2VyID0gZGIudXNlcnMuZmluZE9uZSh1c2VySWQsIHtcbiAgICAgIGZpZWxkczoge1xuICAgICAgICBpc19jbG91ZGFkbWluOiAxXG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKCF1c2VyKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBfaWQ6IC0xXG4gICAgICB9O1xuICAgIH1cbiAgICBzZWxlY3RvciA9IHt9O1xuICAgIGlmICghdXNlci5pc19jbG91ZGFkbWluKSB7XG4gICAgICBzcGFjZXMgPSBkYi5zcGFjZXMuZmluZCh7XG4gICAgICAgIGFkbWluczoge1xuICAgICAgICAgICRpbjogW3VzZXJJZF1cbiAgICAgICAgfVxuICAgICAgfSwge1xuICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICBfaWQ6IDFcbiAgICAgICAgfVxuICAgICAgfSkuZmV0Y2goKTtcbiAgICAgIHNwYWNlcyA9IHNwYWNlcy5tYXAoZnVuY3Rpb24obikge1xuICAgICAgICByZXR1cm4gbi5faWQ7XG4gICAgICB9KTtcbiAgICAgIHNlbGVjdG9yLnNwYWNlID0ge1xuICAgICAgICAkaW46IHNwYWNlc1xuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGVjdG9yO1xuICB9XG59O1xuXG5TZWxlY3Rvci5zZWxlY3RvckNoZWNrU3BhY2UgPSBmdW5jdGlvbih1c2VySWQpIHtcbiAgdmFyIHNlbGVjdG9yLCBzcGFjZUlkLCBzcGFjZV91c2Vycywgc3BhY2VzLCB1c2VyO1xuICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gICAgdXNlcklkID0gTWV0ZW9yLnVzZXJJZCgpO1xuICAgIGlmICghdXNlcklkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBfaWQ6IC0xXG4gICAgICB9O1xuICAgIH1cbiAgICBzcGFjZUlkID0gU2Vzc2lvbi5nZXQoXCJzcGFjZUlkXCIpO1xuICAgIGlmIChzcGFjZUlkKSB7XG4gICAgICBpZiAoZGIuc3BhY2VfdXNlcnMuZmluZE9uZSh7XG4gICAgICAgIHVzZXI6IHVzZXJJZCxcbiAgICAgICAgc3BhY2U6IHNwYWNlSWRcbiAgICAgIH0sIHtcbiAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgX2lkOiAxXG4gICAgICAgIH1cbiAgICAgIH0pKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3BhY2U6IHNwYWNlSWRcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgX2lkOiAtMVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBfaWQ6IC0xXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gICAgaWYgKCF1c2VySWQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF9pZDogLTFcbiAgICAgIH07XG4gICAgfVxuICAgIHVzZXIgPSBkYi51c2Vycy5maW5kT25lKHVzZXJJZCwge1xuICAgICAgZmllbGRzOiB7XG4gICAgICAgIF9pZDogMVxuICAgICAgfVxuICAgIH0pO1xuICAgIGlmICghdXNlcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX2lkOiAtMVxuICAgICAgfTtcbiAgICB9XG4gICAgc2VsZWN0b3IgPSB7fTtcbiAgICBzcGFjZV91c2VycyA9IGRiLnNwYWNlX3VzZXJzLmZpbmQoe1xuICAgICAgdXNlcjogdXNlcklkXG4gICAgfSwge1xuICAgICAgZmllbGRzOiB7XG4gICAgICAgIHNwYWNlOiAxXG4gICAgICB9XG4gICAgfSkuZmV0Y2goKTtcbiAgICBzcGFjZXMgPSBbXTtcbiAgICBfLmVhY2goc3BhY2VfdXNlcnMsIGZ1bmN0aW9uKHUpIHtcbiAgICAgIHJldHVybiBzcGFjZXMucHVzaCh1LnNwYWNlKTtcbiAgICB9KTtcbiAgICBzZWxlY3Rvci5zcGFjZSA9IHtcbiAgICAgICRpbjogc3BhY2VzXG4gICAgfTtcbiAgICByZXR1cm4gc2VsZWN0b3I7XG4gIH1cbn07XG5cbmRiLmJpbGxpbmdfcGF5X3JlY29yZHMuYWRtaW5Db25maWcgPSB7XG4gIGljb246IFwiZ2xvYmVcIixcbiAgY29sb3I6IFwiYmx1ZVwiLFxuICB0YWJsZUNvbHVtbnM6IFtcbiAgICB7XG4gICAgICBuYW1lOiBcIm9yZGVyX2NyZWF0ZWQoKVwiXG4gICAgfSwge1xuICAgICAgbmFtZTogXCJtb2R1bGVzXCJcbiAgICB9LCB7XG4gICAgICBuYW1lOiBcInVzZXJfY291bnRcIlxuICAgIH0sIHtcbiAgICAgIG5hbWU6IFwiZW5kX2RhdGVcIlxuICAgIH0sIHtcbiAgICAgIG5hbWU6IFwib3JkZXJfdG90YWxfZmVlKClcIlxuICAgIH0sIHtcbiAgICAgIG5hbWU6IFwib3JkZXJfcGFpZCgpXCJcbiAgICB9XG4gIF0sXG4gIGV4dHJhRmllbGRzOiBbXCJzcGFjZVwiLCBcImNyZWF0ZWRcIiwgXCJwYWlkXCIsIFwidG90YWxfZmVlXCJdLFxuICByb3V0ZXJBZG1pbjogXCIvYWRtaW5cIixcbiAgc2VsZWN0b3I6IGZ1bmN0aW9uKHVzZXJJZCkge1xuICAgIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICAgIGlmIChTdGVlZG9zLmlzU3BhY2VBZG1pbigpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3BhY2U6IFNlc3Npb24uZ2V0KFwic3BhY2VJZFwiKSxcbiAgICAgICAgICBwYWlkOiB0cnVlXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIF9pZDogLTFcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgfSxcbiAgc2hvd0VkaXRDb2x1bW46IGZhbHNlLFxuICBzaG93RGVsQ29sdW1uOiBmYWxzZSxcbiAgZGlzYWJsZUFkZDogdHJ1ZSxcbiAgcGFnZUxlbmd0aDogMTAwLFxuICBvcmRlcjogW1swLCBcImRlc2NcIl1dXG59O1xuXG5NZXRlb3Iuc3RhcnR1cChmdW5jdGlvbigpIHtcbiAgdGhpcy5zcGFjZV91c2VyX3NpZ25zID0gZGIuc3BhY2VfdXNlcl9zaWducztcbiAgdGhpcy5iaWxsaW5nX3BheV9yZWNvcmRzID0gZGIuYmlsbGluZ19wYXlfcmVjb3JkcztcbiAgcmV0dXJuIHR5cGVvZiBBZG1pbkNvbmZpZyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBBZG1pbkNvbmZpZyAhPT0gbnVsbCA/IEFkbWluQ29uZmlnLmNvbGxlY3Rpb25zX2FkZCh7XG4gICAgc3BhY2VfdXNlcl9zaWduczogZGIuc3BhY2VfdXNlcl9zaWducy5hZG1pbkNvbmZpZyxcbiAgICBiaWxsaW5nX3BheV9yZWNvcmRzOiBkYi5iaWxsaW5nX3BheV9yZWNvcmRzLmFkbWluQ29uZmlnXG4gIH0pIDogdm9pZCAwO1xufSk7XG4iLCJpZiAoIVtdLmluY2x1ZGVzKSB7XG4gIEFycmF5LnByb3RvdHlwZS5pbmNsdWRlcyA9IGZ1bmN0aW9uKHNlYXJjaEVsZW1lbnQgLyosIGZyb21JbmRleCovICkge1xuICAgICd1c2Ugc3RyaWN0JztcbiAgICB2YXIgTyA9IE9iamVjdCh0aGlzKTtcbiAgICB2YXIgbGVuID0gcGFyc2VJbnQoTy5sZW5ndGgpIHx8IDA7XG4gICAgaWYgKGxlbiA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB2YXIgbiA9IHBhcnNlSW50KGFyZ3VtZW50c1sxXSkgfHwgMDtcbiAgICB2YXIgaztcbiAgICBpZiAobiA+PSAwKSB7XG4gICAgICBrID0gbjtcbiAgICB9IGVsc2Uge1xuICAgICAgayA9IGxlbiArIG47XG4gICAgICBpZiAoayA8IDApIHtrID0gMDt9XG4gICAgfVxuICAgIHZhciBjdXJyZW50RWxlbWVudDtcbiAgICB3aGlsZSAoayA8IGxlbikge1xuICAgICAgY3VycmVudEVsZW1lbnQgPSBPW2tdO1xuICAgICAgaWYgKHNlYXJjaEVsZW1lbnQgPT09IGN1cnJlbnRFbGVtZW50IHx8XG4gICAgICAgICAoc2VhcmNoRWxlbWVudCAhPT0gc2VhcmNoRWxlbWVudCAmJiBjdXJyZW50RWxlbWVudCAhPT0gY3VycmVudEVsZW1lbnQpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaysrO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG59IiwiTWV0ZW9yLnN0YXJ0dXAgLT5cbiAgU3RlZWRvcy5zZXR0aW5ncy53ZWJzZXJ2aWNlcyA9IE1ldGVvci5zZXR0aW5ncy5wdWJsaWMud2Vic2VydmljZXNcblxuICBpZiAhU3RlZWRvcy5zZXR0aW5ncy53ZWJzZXJ2aWNlc1xuICAgIFN0ZWVkb3Muc2V0dGluZ3Mud2Vic2VydmljZXMgPVxuICAgICAgd3d3OiBcbiAgICAgICAgc3RhdHVzOiBcImFjdGl2ZVwiLFxuICAgICAgICB1cmw6IFwiL1wiIiwiTWV0ZW9yLnN0YXJ0dXAoZnVuY3Rpb24oKSB7XG4gIFN0ZWVkb3Muc2V0dGluZ3Mud2Vic2VydmljZXMgPSBNZXRlb3Iuc2V0dGluZ3NbXCJwdWJsaWNcIl0ud2Vic2VydmljZXM7XG4gIGlmICghU3RlZWRvcy5zZXR0aW5ncy53ZWJzZXJ2aWNlcykge1xuICAgIHJldHVybiBTdGVlZG9zLnNldHRpbmdzLndlYnNlcnZpY2VzID0ge1xuICAgICAgd3d3OiB7XG4gICAgICAgIHN0YXR1czogXCJhY3RpdmVcIixcbiAgICAgICAgdXJsOiBcIi9cIlxuICAgICAgfVxuICAgIH07XG4gIH1cbn0pO1xuIiwiQ3JlYXRvci5nZXRVc2VyT2JqZWN0c0xpc3RWaWV3cyA9ICh1c2VySWQsIHNwYWNlSWQsIG9iamVjdHMpLT5cblx0bGlzdFZpZXdzID0ge31cblxuXHRrZXlzID0gXy5rZXlzKG9iamVjdHMpXG5cblx0b2JqZWN0c1ZpZXdzID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKFwib2JqZWN0X2xpc3R2aWV3c1wiKS5maW5kKHtcblx0XHRvYmplY3RfbmFtZTogeyRpbjoga2V5c30sXG5cdFx0c3BhY2U6IHNwYWNlSWQsXG5cdFx0XCIkb3JcIjogW3tvd25lcjogdXNlcklkfSwge3NoYXJlZDogdHJ1ZX1dXG5cdH0sIHtcblx0XHRmaWVsZHM6IHtcblx0XHRcdGNyZWF0ZWQ6IDAsXG5cdFx0XHRtb2RpZmllZDogMCxcblx0XHRcdGNyZWF0ZWRfYnk6IDAsXG5cdFx0XHRtb2RpZmllZF9ieTogMFxuXHRcdH1cblx0fSkuZmV0Y2goKVxuXG5cdF9nZXRVc2VyT2JqZWN0TGlzdFZpZXdzID0gKG9iamVjdF9uYW1lKS0+XG5cdFx0X3VzZXJfb2JqZWN0X2xpc3Rfdmlld3MgPSB7fVxuXHRcdG9saXN0Vmlld3MgPSBfLmZpbHRlciBvYmplY3RzVmlld3MsIChvdiktPlxuXHRcdFx0cmV0dXJuIG92Lm9iamVjdF9uYW1lID09IG9iamVjdF9uYW1lXG5cblx0XHRfLmVhY2ggb2xpc3RWaWV3cywgKGxpc3R2aWV3KS0+XG5cdFx0XHRfdXNlcl9vYmplY3RfbGlzdF92aWV3c1tsaXN0dmlldy5faWRdID0gbGlzdHZpZXdcblxuXHRcdHJldHVybiBfdXNlcl9vYmplY3RfbGlzdF92aWV3c1xuXG5cdF8uZm9yRWFjaCBvYmplY3RzLCAobywga2V5KS0+XG5cdFx0bGlzdF92aWV3ID0gX2dldFVzZXJPYmplY3RMaXN0Vmlld3Moa2V5KVxuXHRcdGlmICFfLmlzRW1wdHkobGlzdF92aWV3KVxuXHRcdFx0bGlzdFZpZXdzW2tleV0gPSBsaXN0X3ZpZXdcblx0cmV0dXJuIGxpc3RWaWV3c1xuXG5cbkNyZWF0b3IuZ2V0VXNlck9iamVjdExpc3RWaWV3cyA9ICh1c2VySWQsIHNwYWNlSWQsIG9iamVjdF9uYW1lKS0+XG5cdF91c2VyX29iamVjdF9saXN0X3ZpZXdzID0ge31cblxuXHRvYmplY3RfbGlzdHZpZXcgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJvYmplY3RfbGlzdHZpZXdzXCIpLmZpbmQoe1xuXHRcdG9iamVjdF9uYW1lOiBvYmplY3RfbmFtZSxcblx0XHRzcGFjZTogc3BhY2VJZCxcblx0XHRcIiRvclwiOiBbe293bmVyOiB1c2VySWR9LCB7c2hhcmVkOiB0cnVlfV1cblx0fSwge1xuXHRcdGZpZWxkczoge1xuXHRcdFx0Y3JlYXRlZDogMCxcblx0XHRcdG1vZGlmaWVkOiAwLFxuXHRcdFx0Y3JlYXRlZF9ieTogMCxcblx0XHRcdG1vZGlmaWVkX2J5OiAwXG5cdFx0fVxuXHR9KVxuXG5cdG9iamVjdF9saXN0dmlldy5mb3JFYWNoIChsaXN0dmlldyktPlxuXHRcdF91c2VyX29iamVjdF9saXN0X3ZpZXdzW2xpc3R2aWV3Ll9pZF0gPSBsaXN0dmlld1xuXG5cdHJldHVybiBfdXNlcl9vYmplY3RfbGlzdF92aWV3c1xuXG5cblxuXG4iLCJDcmVhdG9yLmdldFVzZXJPYmplY3RzTGlzdFZpZXdzID0gZnVuY3Rpb24odXNlcklkLCBzcGFjZUlkLCBvYmplY3RzKSB7XG4gIHZhciBfZ2V0VXNlck9iamVjdExpc3RWaWV3cywga2V5cywgbGlzdFZpZXdzLCBvYmplY3RzVmlld3M7XG4gIGxpc3RWaWV3cyA9IHt9O1xuICBrZXlzID0gXy5rZXlzKG9iamVjdHMpO1xuICBvYmplY3RzVmlld3MgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJvYmplY3RfbGlzdHZpZXdzXCIpLmZpbmQoe1xuICAgIG9iamVjdF9uYW1lOiB7XG4gICAgICAkaW46IGtleXNcbiAgICB9LFxuICAgIHNwYWNlOiBzcGFjZUlkLFxuICAgIFwiJG9yXCI6IFtcbiAgICAgIHtcbiAgICAgICAgb3duZXI6IHVzZXJJZFxuICAgICAgfSwge1xuICAgICAgICBzaGFyZWQ6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sIHtcbiAgICBmaWVsZHM6IHtcbiAgICAgIGNyZWF0ZWQ6IDAsXG4gICAgICBtb2RpZmllZDogMCxcbiAgICAgIGNyZWF0ZWRfYnk6IDAsXG4gICAgICBtb2RpZmllZF9ieTogMFxuICAgIH1cbiAgfSkuZmV0Y2goKTtcbiAgX2dldFVzZXJPYmplY3RMaXN0Vmlld3MgPSBmdW5jdGlvbihvYmplY3RfbmFtZSkge1xuICAgIHZhciBfdXNlcl9vYmplY3RfbGlzdF92aWV3cywgb2xpc3RWaWV3cztcbiAgICBfdXNlcl9vYmplY3RfbGlzdF92aWV3cyA9IHt9O1xuICAgIG9saXN0Vmlld3MgPSBfLmZpbHRlcihvYmplY3RzVmlld3MsIGZ1bmN0aW9uKG92KSB7XG4gICAgICByZXR1cm4gb3Yub2JqZWN0X25hbWUgPT09IG9iamVjdF9uYW1lO1xuICAgIH0pO1xuICAgIF8uZWFjaChvbGlzdFZpZXdzLCBmdW5jdGlvbihsaXN0dmlldykge1xuICAgICAgcmV0dXJuIF91c2VyX29iamVjdF9saXN0X3ZpZXdzW2xpc3R2aWV3Ll9pZF0gPSBsaXN0dmlldztcbiAgICB9KTtcbiAgICByZXR1cm4gX3VzZXJfb2JqZWN0X2xpc3Rfdmlld3M7XG4gIH07XG4gIF8uZm9yRWFjaChvYmplY3RzLCBmdW5jdGlvbihvLCBrZXkpIHtcbiAgICB2YXIgbGlzdF92aWV3O1xuICAgIGxpc3RfdmlldyA9IF9nZXRVc2VyT2JqZWN0TGlzdFZpZXdzKGtleSk7XG4gICAgaWYgKCFfLmlzRW1wdHkobGlzdF92aWV3KSkge1xuICAgICAgcmV0dXJuIGxpc3RWaWV3c1trZXldID0gbGlzdF92aWV3O1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBsaXN0Vmlld3M7XG59O1xuXG5DcmVhdG9yLmdldFVzZXJPYmplY3RMaXN0Vmlld3MgPSBmdW5jdGlvbih1c2VySWQsIHNwYWNlSWQsIG9iamVjdF9uYW1lKSB7XG4gIHZhciBfdXNlcl9vYmplY3RfbGlzdF92aWV3cywgb2JqZWN0X2xpc3R2aWV3O1xuICBfdXNlcl9vYmplY3RfbGlzdF92aWV3cyA9IHt9O1xuICBvYmplY3RfbGlzdHZpZXcgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJvYmplY3RfbGlzdHZpZXdzXCIpLmZpbmQoe1xuICAgIG9iamVjdF9uYW1lOiBvYmplY3RfbmFtZSxcbiAgICBzcGFjZTogc3BhY2VJZCxcbiAgICBcIiRvclwiOiBbXG4gICAgICB7XG4gICAgICAgIG93bmVyOiB1c2VySWRcbiAgICAgIH0sIHtcbiAgICAgICAgc2hhcmVkOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LCB7XG4gICAgZmllbGRzOiB7XG4gICAgICBjcmVhdGVkOiAwLFxuICAgICAgbW9kaWZpZWQ6IDAsXG4gICAgICBjcmVhdGVkX2J5OiAwLFxuICAgICAgbW9kaWZpZWRfYnk6IDBcbiAgICB9XG4gIH0pO1xuICBvYmplY3RfbGlzdHZpZXcuZm9yRWFjaChmdW5jdGlvbihsaXN0dmlldykge1xuICAgIHJldHVybiBfdXNlcl9vYmplY3RfbGlzdF92aWV3c1tsaXN0dmlldy5faWRdID0gbGlzdHZpZXc7XG4gIH0pO1xuICByZXR1cm4gX3VzZXJfb2JqZWN0X2xpc3Rfdmlld3M7XG59O1xuIiwiLy8gU2VydmVyU2Vzc2lvbiA9IChmdW5jdGlvbiAoKSB7XG4vLyAgICd1c2Ugc3RyaWN0JztcblxuLy8gICB2YXIgQ29sbGVjdGlvbiA9IG5ldyBNb25nby5Db2xsZWN0aW9uKCdzZXJ2ZXJfc2Vzc2lvbnMnKTtcblxuLy8gICB2YXIgY2hlY2tGb3JLZXkgPSBmdW5jdGlvbiAoa2V5KSB7XG4vLyAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICd1bmRlZmluZWQnKSB7XG4vLyAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsZWFzZSBwcm92aWRlIGEga2V5IScpO1xuLy8gICAgIH1cbi8vICAgfTtcbi8vICAgdmFyIGdldFNlc3Npb25WYWx1ZSA9IGZ1bmN0aW9uIChvYmosIGtleSkge1xuLy8gICAgIHJldHVybiBvYmogJiYgb2JqLnZhbHVlcyAmJiBvYmoudmFsdWVzW2tleV07XG4vLyAgIH07XG4vLyAgIHZhciBjb25kaXRpb24gPSBmdW5jdGlvbiAoKSB7XG4vLyAgICAgcmV0dXJuIHRydWU7XG4vLyAgIH07XG5cbi8vICAgQ29sbGVjdGlvbi5kZW55KHtcbi8vICAgICAnaW5zZXJ0JzogZnVuY3Rpb24gKCkge1xuLy8gICAgICAgcmV0dXJuIHRydWU7XG4vLyAgICAgfSxcbi8vICAgICAndXBkYXRlJyA6IGZ1bmN0aW9uICgpIHtcbi8vICAgICAgIHJldHVybiB0cnVlO1xuLy8gICAgIH0sXG4vLyAgICAgJ3JlbW92ZSc6IGZ1bmN0aW9uICgpIHtcbi8vICAgICAgIHJldHVybiB0cnVlO1xuLy8gICAgIH1cbi8vICAgfSk7XG5cbi8vICAgLy8gcHVibGljIGNsaWVudCBhbmQgc2VydmVyIGFwaVxuLy8gICB2YXIgYXBpID0ge1xuLy8gICAgICdnZXQnOiBmdW5jdGlvbiAoa2V5KSB7XG4vLyAgICAgICBjb25zb2xlLmxvZyhDb2xsZWN0aW9uLmZpbmRPbmUoKSk7XG4vLyAgICAgICB2YXIgc2Vzc2lvbk9iaiA9IENvbGxlY3Rpb24uZmluZE9uZSgpO1xuLy8gICAgICAgaWYoTWV0ZW9yLmlzU2VydmVyKXtcbi8vICAgICAgICAgTWV0ZW9yLmNhbGwoJ3NlcnZlci1zZXNzaW9uL2dldCcpO1xuLy8gICAgICAgfVxuLy8gICAgICAgLy8gdmFyIHNlc3Npb25PYmogPSBNZXRlb3IuaXNTZXJ2ZXIgPyBcbi8vICAgICAgIC8vICAgTWV0ZW9yLmNhbGwoJ3NlcnZlci1zZXNzaW9uL2dldCcpIDogQ29sbGVjdGlvbi5maW5kT25lKCk7XG4vLyAgICAgICByZXR1cm4gZ2V0U2Vzc2lvblZhbHVlKHNlc3Npb25PYmosIGtleSk7XG4vLyAgICAgfSxcbi8vICAgICAnZXF1YWxzJzogZnVuY3Rpb24gKGtleSwgZXhwZWN0ZWQsIGlkZW50aWNhbCkge1xuLy8gICAgICAgdmFyIHNlc3Npb25PYmogPSBNZXRlb3IuaXNTZXJ2ZXIgPyBcbi8vICAgICAgICAgTWV0ZW9yLmNhbGwoJ3NlcnZlci1zZXNzaW9uL2dldCcpIDogQ29sbGVjdGlvbi5maW5kT25lKCk7XG5cbi8vICAgICAgIHZhciB2YWx1ZSA9IGdldFNlc3Npb25WYWx1ZShzZXNzaW9uT2JqLCBrZXkpO1xuXG4vLyAgICAgICBpZiAoXy5pc09iamVjdCh2YWx1ZSkgJiYgXy5pc09iamVjdChleHBlY3RlZCkpIHtcbi8vICAgICAgICAgcmV0dXJuIF8odmFsdWUpLmlzRXF1YWwoZXhwZWN0ZWQpO1xuLy8gICAgICAgfVxuXG4vLyAgICAgICBpZiAoaWRlbnRpY2FsID09IGZhbHNlKSB7XG4vLyAgICAgICAgIHJldHVybiBleHBlY3RlZCA9PSB2YWx1ZTtcbi8vICAgICAgIH1cblxuLy8gICAgICAgcmV0dXJuIGV4cGVjdGVkID09PSB2YWx1ZTtcbi8vICAgICB9XG4vLyAgIH07XG5cbi8vICAgTWV0ZW9yLnN0YXJ0dXAoZnVuY3Rpb24oKXtcbi8vICAgICBpZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4vLyAgICAgICBUcmFja2VyLmF1dG9ydW4oZnVuY3Rpb24oKXtcbi8vICAgICAgICAgaWYoTWV0ZW9yLnVzZXJJZCgpKXtcbi8vICAgICAgICAgICBNZXRlb3Iuc3Vic2NyaWJlKCdzZXJ2ZXItc2Vzc2lvbicpO1xuLy8gICAgICAgICB9XG4vLyAgICAgICB9KVxuLy8gICAgIH1cbi8vICAgfSlcblxuLy8gICBpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4vLyAgICAgLy8gTWV0ZW9yLnN0YXJ0dXAoZnVuY3Rpb24gKCkge1xuLy8gICAgIC8vICAgaWYgKENvbGxlY3Rpb24uZmluZE9uZSgpKSB7XG4vLyAgICAgLy8gICAgIENvbGxlY3Rpb24ucmVtb3ZlKHt9KTsgLy8gY2xlYXIgb3V0IGFsbCBzdGFsZSBzZXNzaW9uc1xuLy8gICAgIC8vICAgfVxuLy8gICAgIC8vIH0pO1xuXG4vLyAgICAgTWV0ZW9yLm9uQ29ubmVjdGlvbihmdW5jdGlvbiAoY29ubmVjdGlvbikge1xuLy8gICAgICAgdmFyIGNsaWVudElEID0gY29ubmVjdGlvbi5pZDtcblxuLy8gICAgICAgaWYgKCFDb2xsZWN0aW9uLmZpbmRPbmUoeyAnY2xpZW50SUQnOiBjbGllbnRJRCB9KSkge1xuLy8gICAgICAgICBDb2xsZWN0aW9uLmluc2VydCh7ICdjbGllbnRJRCc6IGNsaWVudElELCAndmFsdWVzJzoge30sIFwiY3JlYXRlZFwiOiBuZXcgRGF0ZSgpIH0pO1xuLy8gICAgICAgfVxuXG4vLyAgICAgICBjb25uZWN0aW9uLm9uQ2xvc2UoZnVuY3Rpb24gKCkge1xuLy8gICAgICAgICBDb2xsZWN0aW9uLnJlbW92ZSh7ICdjbGllbnRJRCc6IGNsaWVudElEIH0pO1xuLy8gICAgICAgfSk7XG4vLyAgICAgfSk7XG5cbi8vICAgICBNZXRlb3IucHVibGlzaCgnc2VydmVyLXNlc3Npb24nLCBmdW5jdGlvbiAoKSB7XG4vLyAgICAgICByZXR1cm4gQ29sbGVjdGlvbi5maW5kKHsgJ2NsaWVudElEJzogdGhpcy5jb25uZWN0aW9uLmlkIH0pO1xuLy8gICAgIH0pO1xuXG4vLyAgICAgTWV0ZW9yLm1ldGhvZHMoe1xuLy8gICAgICAgJ3NlcnZlci1zZXNzaW9uL2dldCc6IGZ1bmN0aW9uICgpIHtcbi8vICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb24uZmluZE9uZSh7ICdjbGllbnRJRCc6IHRoaXMuY29ubmVjdGlvbi5pZCB9KTtcbi8vICAgICAgIH0sXG4vLyAgICAgICAnc2VydmVyLXNlc3Npb24vc2V0JzogZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbi8vICAgICAgICAgaWYgKCF0aGlzLnJhbmRvbVNlZWQpIHJldHVybjtcblxuLy8gICAgICAgICBjaGVja0ZvcktleShrZXkpO1xuXG4vLyAgICAgICAgIGlmICghY29uZGl0aW9uKGtleSwgdmFsdWUpKVxuLy8gICAgICAgICAgIHRocm93IG5ldyBNZXRlb3IuRXJyb3IoJ0ZhaWxlZCBjb25kaXRpb24gdmFsaWRhdGlvbi4nKTtcblxuLy8gICAgICAgICB2YXIgdXBkYXRlT2JqID0ge307XG4vLyAgICAgICAgIHVwZGF0ZU9ialsndmFsdWVzLicgKyBrZXldID0gdmFsdWU7XG5cbi8vICAgICAgICAgQ29sbGVjdGlvbi51cGRhdGUoeyAnY2xpZW50SUQnOiB0aGlzLmNvbm5lY3Rpb24uaWQgfSwgeyAkc2V0OiB1cGRhdGVPYmogfSk7XG4vLyAgICAgICB9XG4vLyAgICAgfSk7ICBcblxuLy8gICAgIC8vIHNlcnZlci1vbmx5IGFwaVxuLy8gICAgIF8uZXh0ZW5kKGFwaSwge1xuLy8gICAgICAgJ3NldCc6IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4vLyAgICAgICAgIE1ldGVvci5jYWxsKCdzZXJ2ZXItc2Vzc2lvbi9zZXQnLCBrZXksIHZhbHVlKTsgICAgICAgICAgXG4vLyAgICAgICB9LFxuLy8gICAgICAgJ3NldENvbmRpdGlvbic6IGZ1bmN0aW9uIChuZXdDb25kaXRpb24pIHtcbi8vICAgICAgICAgY29uZGl0aW9uID0gbmV3Q29uZGl0aW9uO1xuLy8gICAgICAgfVxuLy8gICAgIH0pO1xuLy8gICB9XG5cbi8vICAgcmV0dXJuIGFwaTtcbi8vIH0pKCk7IiwiSnNvblJvdXRlcy5hZGQgJ2dldCcsICcvYXBpL2dldC9hcHBzJywgKHJlcSwgcmVzLCBuZXh0KSAtPlxuXHR0cnlcblx0XHR1c2VyX2lkID0gcmVxLmhlYWRlcnNbJ3gtdXNlci1pZCddIHx8IHJlcS5xdWVyeT8udXNlcklkXG5cblx0XHRzcGFjZV9pZCA9IHJlcS5oZWFkZXJzWyd4LXNwYWNlLWlkJ10gfHwgcmVxLnF1ZXJ5Py5zcGFjZUlkXG5cblx0XHR1c2VyID0gU3RlZWRvcy5nZXRBUElMb2dpblVzZXIocmVxLCByZXMpXG5cdFx0XG5cdFx0aWYgIXVzZXJcblx0XHRcdEpzb25Sb3V0ZXMuc2VuZFJlc3VsdCByZXMsXG5cdFx0XHRcdGNvZGU6IDQwMSxcblx0XHRcdFx0ZGF0YTpcblx0XHRcdFx0XHRcImVycm9yXCI6IFwiVmFsaWRhdGUgUmVxdWVzdCAtLSBNaXNzaW5nIFgtQXV0aC1Ub2tlbixYLVVzZXItSWRcIixcblx0XHRcdFx0XHRcInN1Y2Nlc3NcIjogZmFsc2Vcblx0XHRcdHJldHVybjtcblxuXHRcdHVzZXJfaWQgPSB1c2VyLl9pZFxuXG5cdFx0IyDmoKHpqoxzcGFjZeaYr+WQpuWtmOWcqFxuXHRcdHV1Zmxvd01hbmFnZXIuZ2V0U3BhY2Uoc3BhY2VfaWQpXG5cblx0XHRsb2NhbGUgPSBkYi51c2Vycy5maW5kT25lKHtfaWQ6dXNlcl9pZH0pLmxvY2FsZVxuXHRcdGlmIGxvY2FsZSA9PSBcImVuLXVzXCJcblx0XHRcdGxvY2FsZSA9IFwiZW5cIlxuXHRcdGlmIGxvY2FsZSA9PSBcInpoLWNuXCJcblx0XHRcdGxvY2FsZSA9IFwiemgtQ05cIlxuXG5cdFx0c3BhY2VzID0gZGIuc3BhY2VfdXNlcnMuZmluZCh7dXNlcjogdXNlcl9pZH0pLmZldGNoKCkuZ2V0UHJvcGVydHkoXCJzcGFjZVwiKVxuXHRcdGFwcHMgPSBkYi5hcHBzLmZpbmQoeyRvcjogW3tzcGFjZTogeyRleGlzdHM6IGZhbHNlfX0sIHtzcGFjZTogeyRpbjpzcGFjZXN9fV19LHtzb3J0Ontzb3J0OjF9fSkuZmV0Y2goKVxuXG5cdFx0YXBwcy5mb3JFYWNoIChhcHApIC0+XG5cdFx0XHRhcHAubmFtZSA9IFRBUGkxOG4uX18oYXBwLm5hbWUse30sbG9jYWxlKVxuXG5cdFx0SnNvblJvdXRlcy5zZW5kUmVzdWx0IHJlcyxcblx0XHRcdGNvZGU6IDIwMFxuXHRcdFx0ZGF0YTogeyBzdGF0dXM6IFwic3VjY2Vzc1wiLCBkYXRhOiBhcHBzfVxuXHRjYXRjaCBlXG5cdFx0Y29uc29sZS5lcnJvciBlLnN0YWNrXG5cdFx0SnNvblJvdXRlcy5zZW5kUmVzdWx0IHJlcyxcblx0XHRcdGNvZGU6IDIwMFxuXHRcdFx0ZGF0YTogeyBlcnJvcnM6IFt7ZXJyb3JNZXNzYWdlOiBlLm1lc3NhZ2V9XX1cblx0XG5cdFx0IiwiSnNvblJvdXRlcy5hZGQoJ2dldCcsICcvYXBpL2dldC9hcHBzJywgZnVuY3Rpb24ocmVxLCByZXMsIG5leHQpIHtcbiAgdmFyIGFwcHMsIGUsIGxvY2FsZSwgcmVmLCByZWYxLCBzcGFjZV9pZCwgc3BhY2VzLCB1c2VyLCB1c2VyX2lkO1xuICB0cnkge1xuICAgIHVzZXJfaWQgPSByZXEuaGVhZGVyc1sneC11c2VyLWlkJ10gfHwgKChyZWYgPSByZXEucXVlcnkpICE9IG51bGwgPyByZWYudXNlcklkIDogdm9pZCAwKTtcbiAgICBzcGFjZV9pZCA9IHJlcS5oZWFkZXJzWyd4LXNwYWNlLWlkJ10gfHwgKChyZWYxID0gcmVxLnF1ZXJ5KSAhPSBudWxsID8gcmVmMS5zcGFjZUlkIDogdm9pZCAwKTtcbiAgICB1c2VyID0gU3RlZWRvcy5nZXRBUElMb2dpblVzZXIocmVxLCByZXMpO1xuICAgIGlmICghdXNlcikge1xuICAgICAgSnNvblJvdXRlcy5zZW5kUmVzdWx0KHJlcywge1xuICAgICAgICBjb2RlOiA0MDEsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBcImVycm9yXCI6IFwiVmFsaWRhdGUgUmVxdWVzdCAtLSBNaXNzaW5nIFgtQXV0aC1Ub2tlbixYLVVzZXItSWRcIixcbiAgICAgICAgICBcInN1Y2Nlc3NcIjogZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHVzZXJfaWQgPSB1c2VyLl9pZDtcbiAgICB1dWZsb3dNYW5hZ2VyLmdldFNwYWNlKHNwYWNlX2lkKTtcbiAgICBsb2NhbGUgPSBkYi51c2Vycy5maW5kT25lKHtcbiAgICAgIF9pZDogdXNlcl9pZFxuICAgIH0pLmxvY2FsZTtcbiAgICBpZiAobG9jYWxlID09PSBcImVuLXVzXCIpIHtcbiAgICAgIGxvY2FsZSA9IFwiZW5cIjtcbiAgICB9XG4gICAgaWYgKGxvY2FsZSA9PT0gXCJ6aC1jblwiKSB7XG4gICAgICBsb2NhbGUgPSBcInpoLUNOXCI7XG4gICAgfVxuICAgIHNwYWNlcyA9IGRiLnNwYWNlX3VzZXJzLmZpbmQoe1xuICAgICAgdXNlcjogdXNlcl9pZFxuICAgIH0pLmZldGNoKCkuZ2V0UHJvcGVydHkoXCJzcGFjZVwiKTtcbiAgICBhcHBzID0gZGIuYXBwcy5maW5kKHtcbiAgICAgICRvcjogW1xuICAgICAgICB7XG4gICAgICAgICAgc3BhY2U6IHtcbiAgICAgICAgICAgICRleGlzdHM6IGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICB9LCB7XG4gICAgICAgICAgc3BhY2U6IHtcbiAgICAgICAgICAgICRpbjogc3BhY2VzXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSwge1xuICAgICAgc29ydDoge1xuICAgICAgICBzb3J0OiAxXG4gICAgICB9XG4gICAgfSkuZmV0Y2goKTtcbiAgICBhcHBzLmZvckVhY2goZnVuY3Rpb24oYXBwKSB7XG4gICAgICByZXR1cm4gYXBwLm5hbWUgPSBUQVBpMThuLl9fKGFwcC5uYW1lLCB7fSwgbG9jYWxlKTtcbiAgICB9KTtcbiAgICByZXR1cm4gSnNvblJvdXRlcy5zZW5kUmVzdWx0KHJlcywge1xuICAgICAgY29kZTogMjAwLFxuICAgICAgZGF0YToge1xuICAgICAgICBzdGF0dXM6IFwic3VjY2Vzc1wiLFxuICAgICAgICBkYXRhOiBhcHBzXG4gICAgICB9XG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgZSA9IGVycm9yO1xuICAgIGNvbnNvbGUuZXJyb3IoZS5zdGFjayk7XG4gICAgcmV0dXJuIEpzb25Sb3V0ZXMuc2VuZFJlc3VsdChyZXMsIHtcbiAgICAgIGNvZGU6IDIwMCxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgZXJyb3JzOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBlLm1lc3NhZ2VcbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufSk7XG4iLCJDb29raWVzID0gcmVxdWlyZShcImNvb2tpZXNcIilcbnN0ZWVkb3NBdXRoID0gcmVxdWlyZShcIkBzdGVlZG9zL2F1dGhcIilcblxuSnNvblJvdXRlcy5hZGQgXCJwb3N0XCIsIFwiL2FwaS9jb2xsZWN0aW9uL2ZpbmRcIiwgKHJlcSwgcmVzLCBuZXh0KSAtPlxuICAgIHRyeVxuICAgICAgICBjb29raWVzID0gbmV3IENvb2tpZXMoIHJlcSwgcmVzIClcbiAgICAgICAgYXV0aFRva2VuID0gcmVxLmJvZHlbXCJYLUF1dGgtVG9rZW5cIl0gfHwgY29va2llcy5nZXQoXCJYLUF1dGgtVG9rZW5cIilcblxuICAgICAgICBpZiAhYXV0aFRva2VuXG4gICAgICAgICAgICBKc29uUm91dGVzLnNlbmRSZXN1bHQgcmVzLFxuICAgICAgICAgICAgY29kZTogNDAxLFxuICAgICAgICAgICAgZGF0YTpcbiAgICAgICAgICAgICAgICBcImVycm9yXCI6IFwiVmFsaWRhdGUgUmVxdWVzdCAtLSBNaXNzaW5nIFgtQXV0aC1Ub2tlblwiLFxuICAgICAgICAgICAgICAgIFwiaW5zdGFuY2VcIjogXCIxMzI5NTk4ODYxXCIsXG4gICAgICAgICAgICAgICAgXCJzdWNjZXNzXCI6IGZhbHNlXG4gICAgICAgICAgICByZXR1cm5cblxuICAgICAgICBtb2RlbCA9IHJlcS5ib2R5Lm1vZGVsXG4gICAgICAgIHNlbGVjdG9yID0gcmVxLmJvZHkuc2VsZWN0b3JcbiAgICAgICAgb3B0aW9ucyA9IHJlcS5ib2R5Lm9wdGlvbnNcbiAgICAgICAgc3BhY2UgPSByZXEuYm9keS5zcGFjZVxuICAgICAgICBkYXRhID0gW11cbiAgICAgICAgYWxsb3dfbW9kZWxzID0gWydzcGFjZV91c2VycycsICdvcmdhbml6YXRpb25zJywgJ2Zsb3dfcm9sZXMnLCAncm9sZXMnXVxuXG4gICAgICAgIGlmICFzcGFjZVxuICAgICAgICAgICAgSnNvblJvdXRlcy5zZW5kUmVzdWx0IHJlcyxcbiAgICAgICAgICAgIGNvZGU6IDQwMyxcbiAgICAgICAgICAgIGRhdGE6XG4gICAgICAgICAgICAgICAgXCJlcnJvclwiOiBcImludmFsaWQgc3BhY2UgXCIgKyBzcGFjZSxcbiAgICAgICAgICAgICAgICBcInN1Y2Nlc3NcIjogZmFsc2VcbiAgICAgICAgICAgIHJldHVyblxuXG4gICAgICAgICMg55So5oi355m75b2V6aqM6K+BXG4gICAgICAgIGNoZWNrKHNwYWNlLCBTdHJpbmcpXG4gICAgICAgIGNoZWNrKGF1dGhUb2tlbiwgU3RyaW5nKVxuICAgICAgICB1c2VyU2Vzc2lvbiA9IE1ldGVvci53cmFwQXN5bmMoKGF1dGhUb2tlbiwgc3BhY2VJZCwgY2IpIC0+XG4gICAgICAgICAgICBzdGVlZG9zQXV0aC5nZXRTZXNzaW9uKGF1dGhUb2tlbiwgc3BhY2VJZCkudGhlbiAocmVzb2x2ZSwgcmVqZWN0KSAtPlxuICAgICAgICAgICAgICAgIGNiKHJlamVjdCwgcmVzb2x2ZSlcbiAgICAgICAgICAgICkoYXV0aFRva2VuLCBzcGFjZSlcbiAgICAgICAgdW5sZXNzIHVzZXJTZXNzaW9uXG4gICAgICAgICAgICBKc29uUm91dGVzLnNlbmRSZXN1bHQgcmVzLFxuICAgICAgICAgICAgICAgIGNvZGU6IDUwMCxcbiAgICAgICAgICAgICAgICBkYXRhOlxuICAgICAgICAgICAgICAgICAgICBcImVycm9yXCI6IFwiYXV0aCBmYWlsZWRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzdWNjZXNzXCI6IGZhbHNlXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgdXNlcklkID0gdXNlclNlc3Npb24udXNlcklkXG5cbiAgICAgICAgaWYgIWFsbG93X21vZGVscy5pbmNsdWRlcyhtb2RlbClcbiAgICAgICAgICAgIEpzb25Sb3V0ZXMuc2VuZFJlc3VsdCByZXMsXG4gICAgICAgICAgICBjb2RlOiA0MDMsXG4gICAgICAgICAgICBkYXRhOlxuICAgICAgICAgICAgICAgIFwiZXJyb3JcIjogXCJpbnZhbGlkIG1vZGVsIFwiICsgbW9kZWwsXG4gICAgICAgICAgICAgICAgXCJzdWNjZXNzXCI6IGZhbHNlXG4gICAgICAgICAgICByZXR1cm5cblxuICAgICAgICBpZiAhZGJbbW9kZWxdXG4gICAgICAgICAgICBKc29uUm91dGVzLnNlbmRSZXN1bHQgcmVzLFxuICAgICAgICAgICAgY29kZTogNDAzLFxuICAgICAgICAgICAgZGF0YTpcbiAgICAgICAgICAgICAgICBcImVycm9yXCI6IFwiaW52YWxpZCBtb2RlbCBcIiArIG1vZGVsLFxuICAgICAgICAgICAgICAgIFwic3VjY2Vzc1wiOiBmYWxzZVxuICAgICAgICAgICAgcmV0dXJuXG5cbiAgICAgICAgaWYgIXNlbGVjdG9yXG4gICAgICAgICAgICBzZWxlY3RvciA9IHt9XG5cbiAgICAgICAgaWYgIW9wdGlvbnNcbiAgICAgICAgICAgIG9wdGlvbnMgPSB7fVxuXG4gICAgICAgIHNlbGVjdG9yLnNwYWNlID0gc3BhY2VcblxuICAgICAgICBkYXRhID0gZGJbbW9kZWxdLmZpbmQoc2VsZWN0b3IsIG9wdGlvbnMpLmZldGNoKClcblxuICAgICAgICBKc29uUm91dGVzLnNlbmRSZXN1bHQgcmVzLFxuICAgICAgICAgICAgY29kZTogMjAwLFxuICAgICAgICAgICAgZGF0YTogZGF0YVxuICAgIGNhdGNoIGVcbiAgICAgICAgY29uc29sZS5lcnJvciBlLnN0YWNrXG4gICAgICAgIEpzb25Sb3V0ZXMuc2VuZFJlc3VsdCByZXMsXG4gICAgICAgICAgICBjb2RlOiAyMDAsXG4gICAgICAgICAgICBkYXRhOiBbXVxuXG5cbkpzb25Sb3V0ZXMuYWRkIFwicG9zdFwiLCBcIi9hcGkvY29sbGVjdGlvbi9maW5kb25lXCIsIChyZXEsIHJlcywgbmV4dCkgLT5cbiAgICB0cnlcbiAgICAgICAgY29va2llcyA9IG5ldyBDb29raWVzKCByZXEsIHJlcyApXG4gICAgICAgIGF1dGhUb2tlbiA9IHJlcS5ib2R5W1wiWC1BdXRoLVRva2VuXCJdIHx8IGNvb2tpZXMuZ2V0KFwiWC1BdXRoLVRva2VuXCIpXG5cbiAgICAgICAgaWYgIWF1dGhUb2tlblxuICAgICAgICAgICAgSnNvblJvdXRlcy5zZW5kUmVzdWx0IHJlcyxcbiAgICAgICAgICAgIGNvZGU6IDQwMSxcbiAgICAgICAgICAgIGRhdGE6XG4gICAgICAgICAgICAgICAgXCJlcnJvclwiOiBcIlZhbGlkYXRlIFJlcXVlc3QgLS0gTWlzc2luZyBYLUF1dGgtVG9rZW5cIixcbiAgICAgICAgICAgICAgICBcImluc3RhbmNlXCI6IFwiMTMyOTU5ODg2MVwiLFxuICAgICAgICAgICAgICAgIFwic3VjY2Vzc1wiOiBmYWxzZVxuICAgICAgICAgICAgcmV0dXJuXG5cbiAgICAgICAgbW9kZWwgPSByZXEuYm9keS5tb2RlbFxuICAgICAgICBzZWxlY3RvciA9IHJlcS5ib2R5LnNlbGVjdG9yXG4gICAgICAgIG9wdGlvbnMgPSByZXEuYm9keS5vcHRpb25zXG4gICAgICAgIHNwYWNlID0gcmVxLmJvZHkuc3BhY2VcbiAgICAgICAgZGF0YSA9IFtdXG4gICAgICAgIGFsbG93X21vZGVscyA9IFsnc3BhY2VfdXNlcnMnLCAnb3JnYW5pemF0aW9ucycsICdmbG93X3JvbGVzJywgJ21haWxfYWNjb3VudHMnLCAncm9sZXMnXVxuXG4gICAgICAgIGlmICFzcGFjZVxuICAgICAgICAgICAgSnNvblJvdXRlcy5zZW5kUmVzdWx0IHJlcyxcbiAgICAgICAgICAgIGNvZGU6IDQwMyxcbiAgICAgICAgICAgIGRhdGE6XG4gICAgICAgICAgICAgICAgXCJlcnJvclwiOiBcImludmFsaWQgc3BhY2UgXCIgKyBzcGFjZSxcbiAgICAgICAgICAgICAgICBcInN1Y2Nlc3NcIjogZmFsc2VcbiAgICAgICAgICAgIHJldHVyblxuXG4gICAgICAgICMg55So5oi355m75b2V6aqM6K+BXG4gICAgICAgIGNoZWNrKHNwYWNlLCBTdHJpbmcpXG4gICAgICAgIGNoZWNrKGF1dGhUb2tlbiwgU3RyaW5nKVxuICAgICAgICB1c2VyU2Vzc2lvbiA9IE1ldGVvci53cmFwQXN5bmMoKGF1dGhUb2tlbiwgc3BhY2VJZCwgY2IpIC0+XG4gICAgICAgICAgICBzdGVlZG9zQXV0aC5nZXRTZXNzaW9uKGF1dGhUb2tlbiwgc3BhY2VJZCkudGhlbiAocmVzb2x2ZSwgcmVqZWN0KSAtPlxuICAgICAgICAgICAgICAgIGNiKHJlamVjdCwgcmVzb2x2ZSlcbiAgICAgICAgICAgICkoYXV0aFRva2VuLCBzcGFjZSlcbiAgICAgICAgdW5sZXNzIHVzZXJTZXNzaW9uXG4gICAgICAgICAgICBKc29uUm91dGVzLnNlbmRSZXN1bHQgcmVzLFxuICAgICAgICAgICAgICAgIGNvZGU6IDUwMCxcbiAgICAgICAgICAgICAgICBkYXRhOlxuICAgICAgICAgICAgICAgICAgICBcImVycm9yXCI6IFwiYXV0aCBmYWlsZWRcIixcbiAgICAgICAgICAgICAgICAgICAgXCJzdWNjZXNzXCI6IGZhbHNlXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgdXNlcklkID0gdXNlclNlc3Npb24udXNlcklkXG5cbiAgICAgICAgaWYgIWFsbG93X21vZGVscy5pbmNsdWRlcyhtb2RlbClcbiAgICAgICAgICAgIEpzb25Sb3V0ZXMuc2VuZFJlc3VsdCByZXMsXG4gICAgICAgICAgICBjb2RlOiA0MDMsXG4gICAgICAgICAgICBkYXRhOlxuICAgICAgICAgICAgICAgIFwiZXJyb3JcIjogXCJpbnZhbGlkIG1vZGVsIFwiICsgbW9kZWwsXG4gICAgICAgICAgICAgICAgXCJzdWNjZXNzXCI6IGZhbHNlXG4gICAgICAgICAgICByZXR1cm5cblxuICAgICAgICBpZiAhZGJbbW9kZWxdXG4gICAgICAgICAgICBKc29uUm91dGVzLnNlbmRSZXN1bHQgcmVzLFxuICAgICAgICAgICAgY29kZTogNDAzLFxuICAgICAgICAgICAgZGF0YTpcbiAgICAgICAgICAgICAgICBcImVycm9yXCI6IFwiaW52YWxpZCBtb2RlbCBcIiArIG1vZGVsLFxuICAgICAgICAgICAgICAgIFwic3VjY2Vzc1wiOiBmYWxzZVxuICAgICAgICAgICAgcmV0dXJuXG5cbiAgICAgICAgaWYgIXNlbGVjdG9yXG4gICAgICAgICAgICBzZWxlY3RvciA9IHt9XG5cbiAgICAgICAgaWYgIW9wdGlvbnNcbiAgICAgICAgICAgIG9wdGlvbnMgPSB7fVxuXG4gICAgICAgIGlmIG1vZGVsID09ICdtYWlsX2FjY291bnRzJ1xuICAgICAgICAgICAgc2VsZWN0b3IgPSB7fVxuICAgICAgICAgICAgc2VsZWN0b3Iub3duZXIgPSB1c2VySWRcbiAgICAgICAgICAgIGRhdGEgPSBkYlttb2RlbF0uZmluZE9uZShzZWxlY3RvcilcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgc2VsZWN0b3Iuc3BhY2UgPSBzcGFjZVxuXG4gICAgICAgICAgICBkYXRhID0gZGJbbW9kZWxdLmZpbmRPbmUoc2VsZWN0b3IsIG9wdGlvbnMpXG5cbiAgICAgICAgSnNvblJvdXRlcy5zZW5kUmVzdWx0IHJlcyxcbiAgICAgICAgICAgIGNvZGU6IDIwMCxcbiAgICAgICAgICAgIGRhdGE6IGRhdGFcbiAgICBjYXRjaCBlXG4gICAgICAgIGNvbnNvbGUuZXJyb3IgZS5zdGFja1xuICAgICAgICBKc29uUm91dGVzLnNlbmRSZXN1bHQgcmVzLFxuICAgICAgICAgICAgY29kZTogMjAwLFxuICAgICAgICAgICAgZGF0YToge31cbiIsInZhciBDb29raWVzLCBzdGVlZG9zQXV0aDtcblxuQ29va2llcyA9IHJlcXVpcmUoXCJjb29raWVzXCIpO1xuXG5zdGVlZG9zQXV0aCA9IHJlcXVpcmUoXCJAc3RlZWRvcy9hdXRoXCIpO1xuXG5Kc29uUm91dGVzLmFkZChcInBvc3RcIiwgXCIvYXBpL2NvbGxlY3Rpb24vZmluZFwiLCBmdW5jdGlvbihyZXEsIHJlcywgbmV4dCkge1xuICB2YXIgYWxsb3dfbW9kZWxzLCBhdXRoVG9rZW4sIGNvb2tpZXMsIGRhdGEsIGUsIG1vZGVsLCBvcHRpb25zLCBzZWxlY3Rvciwgc3BhY2UsIHVzZXJJZCwgdXNlclNlc3Npb247XG4gIHRyeSB7XG4gICAgY29va2llcyA9IG5ldyBDb29raWVzKHJlcSwgcmVzKTtcbiAgICBhdXRoVG9rZW4gPSByZXEuYm9keVtcIlgtQXV0aC1Ub2tlblwiXSB8fCBjb29raWVzLmdldChcIlgtQXV0aC1Ub2tlblwiKTtcbiAgICBpZiAoIWF1dGhUb2tlbikge1xuICAgICAgSnNvblJvdXRlcy5zZW5kUmVzdWx0KHJlcywge1xuICAgICAgICBjb2RlOiA0MDEsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBcImVycm9yXCI6IFwiVmFsaWRhdGUgUmVxdWVzdCAtLSBNaXNzaW5nIFgtQXV0aC1Ub2tlblwiLFxuICAgICAgICAgIFwiaW5zdGFuY2VcIjogXCIxMzI5NTk4ODYxXCIsXG4gICAgICAgICAgXCJzdWNjZXNzXCI6IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBtb2RlbCA9IHJlcS5ib2R5Lm1vZGVsO1xuICAgIHNlbGVjdG9yID0gcmVxLmJvZHkuc2VsZWN0b3I7XG4gICAgb3B0aW9ucyA9IHJlcS5ib2R5Lm9wdGlvbnM7XG4gICAgc3BhY2UgPSByZXEuYm9keS5zcGFjZTtcbiAgICBkYXRhID0gW107XG4gICAgYWxsb3dfbW9kZWxzID0gWydzcGFjZV91c2VycycsICdvcmdhbml6YXRpb25zJywgJ2Zsb3dfcm9sZXMnLCAncm9sZXMnXTtcbiAgICBpZiAoIXNwYWNlKSB7XG4gICAgICBKc29uUm91dGVzLnNlbmRSZXN1bHQocmVzLCB7XG4gICAgICAgIGNvZGU6IDQwMyxcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIFwiZXJyb3JcIjogXCJpbnZhbGlkIHNwYWNlIFwiICsgc3BhY2UsXG4gICAgICAgICAgXCJzdWNjZXNzXCI6IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjaGVjayhzcGFjZSwgU3RyaW5nKTtcbiAgICBjaGVjayhhdXRoVG9rZW4sIFN0cmluZyk7XG4gICAgdXNlclNlc3Npb24gPSBNZXRlb3Iud3JhcEFzeW5jKGZ1bmN0aW9uKGF1dGhUb2tlbiwgc3BhY2VJZCwgY2IpIHtcbiAgICAgIHJldHVybiBzdGVlZG9zQXV0aC5nZXRTZXNzaW9uKGF1dGhUb2tlbiwgc3BhY2VJZCkudGhlbihmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgcmV0dXJuIGNiKHJlamVjdCwgcmVzb2x2ZSk7XG4gICAgICB9KTtcbiAgICB9KShhdXRoVG9rZW4sIHNwYWNlKTtcbiAgICBpZiAoIXVzZXJTZXNzaW9uKSB7XG4gICAgICBKc29uUm91dGVzLnNlbmRSZXN1bHQocmVzLCB7XG4gICAgICAgIGNvZGU6IDUwMCxcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIFwiZXJyb3JcIjogXCJhdXRoIGZhaWxlZFwiLFxuICAgICAgICAgIFwic3VjY2Vzc1wiOiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdXNlcklkID0gdXNlclNlc3Npb24udXNlcklkO1xuICAgIGlmICghYWxsb3dfbW9kZWxzLmluY2x1ZGVzKG1vZGVsKSkge1xuICAgICAgSnNvblJvdXRlcy5zZW5kUmVzdWx0KHJlcywge1xuICAgICAgICBjb2RlOiA0MDMsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBcImVycm9yXCI6IFwiaW52YWxpZCBtb2RlbCBcIiArIG1vZGVsLFxuICAgICAgICAgIFwic3VjY2Vzc1wiOiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFkYlttb2RlbF0pIHtcbiAgICAgIEpzb25Sb3V0ZXMuc2VuZFJlc3VsdChyZXMsIHtcbiAgICAgICAgY29kZTogNDAzLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgXCJlcnJvclwiOiBcImludmFsaWQgbW9kZWwgXCIgKyBtb2RlbCxcbiAgICAgICAgICBcInN1Y2Nlc3NcIjogZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghc2VsZWN0b3IpIHtcbiAgICAgIHNlbGVjdG9yID0ge307XG4gICAgfVxuICAgIGlmICghb3B0aW9ucykge1xuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cbiAgICBzZWxlY3Rvci5zcGFjZSA9IHNwYWNlO1xuICAgIGRhdGEgPSBkYlttb2RlbF0uZmluZChzZWxlY3Rvciwgb3B0aW9ucykuZmV0Y2goKTtcbiAgICByZXR1cm4gSnNvblJvdXRlcy5zZW5kUmVzdWx0KHJlcywge1xuICAgICAgY29kZTogMjAwLFxuICAgICAgZGF0YTogZGF0YVxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGUgPSBlcnJvcjtcbiAgICBjb25zb2xlLmVycm9yKGUuc3RhY2spO1xuICAgIHJldHVybiBKc29uUm91dGVzLnNlbmRSZXN1bHQocmVzLCB7XG4gICAgICBjb2RlOiAyMDAsXG4gICAgICBkYXRhOiBbXVxuICAgIH0pO1xuICB9XG59KTtcblxuSnNvblJvdXRlcy5hZGQoXCJwb3N0XCIsIFwiL2FwaS9jb2xsZWN0aW9uL2ZpbmRvbmVcIiwgZnVuY3Rpb24ocmVxLCByZXMsIG5leHQpIHtcbiAgdmFyIGFsbG93X21vZGVscywgYXV0aFRva2VuLCBjb29raWVzLCBkYXRhLCBlLCBtb2RlbCwgb3B0aW9ucywgc2VsZWN0b3IsIHNwYWNlLCB1c2VySWQsIHVzZXJTZXNzaW9uO1xuICB0cnkge1xuICAgIGNvb2tpZXMgPSBuZXcgQ29va2llcyhyZXEsIHJlcyk7XG4gICAgYXV0aFRva2VuID0gcmVxLmJvZHlbXCJYLUF1dGgtVG9rZW5cIl0gfHwgY29va2llcy5nZXQoXCJYLUF1dGgtVG9rZW5cIik7XG4gICAgaWYgKCFhdXRoVG9rZW4pIHtcbiAgICAgIEpzb25Sb3V0ZXMuc2VuZFJlc3VsdChyZXMsIHtcbiAgICAgICAgY29kZTogNDAxLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgXCJlcnJvclwiOiBcIlZhbGlkYXRlIFJlcXVlc3QgLS0gTWlzc2luZyBYLUF1dGgtVG9rZW5cIixcbiAgICAgICAgICBcImluc3RhbmNlXCI6IFwiMTMyOTU5ODg2MVwiLFxuICAgICAgICAgIFwic3VjY2Vzc1wiOiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbW9kZWwgPSByZXEuYm9keS5tb2RlbDtcbiAgICBzZWxlY3RvciA9IHJlcS5ib2R5LnNlbGVjdG9yO1xuICAgIG9wdGlvbnMgPSByZXEuYm9keS5vcHRpb25zO1xuICAgIHNwYWNlID0gcmVxLmJvZHkuc3BhY2U7XG4gICAgZGF0YSA9IFtdO1xuICAgIGFsbG93X21vZGVscyA9IFsnc3BhY2VfdXNlcnMnLCAnb3JnYW5pemF0aW9ucycsICdmbG93X3JvbGVzJywgJ21haWxfYWNjb3VudHMnLCAncm9sZXMnXTtcbiAgICBpZiAoIXNwYWNlKSB7XG4gICAgICBKc29uUm91dGVzLnNlbmRSZXN1bHQocmVzLCB7XG4gICAgICAgIGNvZGU6IDQwMyxcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIFwiZXJyb3JcIjogXCJpbnZhbGlkIHNwYWNlIFwiICsgc3BhY2UsXG4gICAgICAgICAgXCJzdWNjZXNzXCI6IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjaGVjayhzcGFjZSwgU3RyaW5nKTtcbiAgICBjaGVjayhhdXRoVG9rZW4sIFN0cmluZyk7XG4gICAgdXNlclNlc3Npb24gPSBNZXRlb3Iud3JhcEFzeW5jKGZ1bmN0aW9uKGF1dGhUb2tlbiwgc3BhY2VJZCwgY2IpIHtcbiAgICAgIHJldHVybiBzdGVlZG9zQXV0aC5nZXRTZXNzaW9uKGF1dGhUb2tlbiwgc3BhY2VJZCkudGhlbihmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgcmV0dXJuIGNiKHJlamVjdCwgcmVzb2x2ZSk7XG4gICAgICB9KTtcbiAgICB9KShhdXRoVG9rZW4sIHNwYWNlKTtcbiAgICBpZiAoIXVzZXJTZXNzaW9uKSB7XG4gICAgICBKc29uUm91dGVzLnNlbmRSZXN1bHQocmVzLCB7XG4gICAgICAgIGNvZGU6IDUwMCxcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIFwiZXJyb3JcIjogXCJhdXRoIGZhaWxlZFwiLFxuICAgICAgICAgIFwic3VjY2Vzc1wiOiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdXNlcklkID0gdXNlclNlc3Npb24udXNlcklkO1xuICAgIGlmICghYWxsb3dfbW9kZWxzLmluY2x1ZGVzKG1vZGVsKSkge1xuICAgICAgSnNvblJvdXRlcy5zZW5kUmVzdWx0KHJlcywge1xuICAgICAgICBjb2RlOiA0MDMsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBcImVycm9yXCI6IFwiaW52YWxpZCBtb2RlbCBcIiArIG1vZGVsLFxuICAgICAgICAgIFwic3VjY2Vzc1wiOiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFkYlttb2RlbF0pIHtcbiAgICAgIEpzb25Sb3V0ZXMuc2VuZFJlc3VsdChyZXMsIHtcbiAgICAgICAgY29kZTogNDAzLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgXCJlcnJvclwiOiBcImludmFsaWQgbW9kZWwgXCIgKyBtb2RlbCxcbiAgICAgICAgICBcInN1Y2Nlc3NcIjogZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghc2VsZWN0b3IpIHtcbiAgICAgIHNlbGVjdG9yID0ge307XG4gICAgfVxuICAgIGlmICghb3B0aW9ucykge1xuICAgICAgb3B0aW9ucyA9IHt9O1xuICAgIH1cbiAgICBpZiAobW9kZWwgPT09ICdtYWlsX2FjY291bnRzJykge1xuICAgICAgc2VsZWN0b3IgPSB7fTtcbiAgICAgIHNlbGVjdG9yLm93bmVyID0gdXNlcklkO1xuICAgICAgZGF0YSA9IGRiW21vZGVsXS5maW5kT25lKHNlbGVjdG9yKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZWN0b3Iuc3BhY2UgPSBzcGFjZTtcbiAgICAgIGRhdGEgPSBkYlttb2RlbF0uZmluZE9uZShzZWxlY3Rvciwgb3B0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiBKc29uUm91dGVzLnNlbmRSZXN1bHQocmVzLCB7XG4gICAgICBjb2RlOiAyMDAsXG4gICAgICBkYXRhOiBkYXRhXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgZSA9IGVycm9yO1xuICAgIGNvbnNvbGUuZXJyb3IoZS5zdGFjayk7XG4gICAgcmV0dXJuIEpzb25Sb3V0ZXMuc2VuZFJlc3VsdChyZXMsIHtcbiAgICAgIGNvZGU6IDIwMCxcbiAgICAgIGRhdGE6IHt9XG4gICAgfSk7XG4gIH1cbn0pO1xuIiwiY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJylcbkNvb2tpZXMgPSByZXF1aXJlKFwiY29va2llc1wiKVxuZXhwcmVzcyA9IHJlcXVpcmUoXCJleHByZXNzXCIpXG5cbkpzb25Sb3V0ZXMuYWRkIFwiZ2V0XCIsIFwiL2FwaS9zZXR1cC9zc28vOmFwcF9pZFwiLCAocmVxLCByZXMsIG5leHQpIC0+XG5cblx0YXBwID0gZGIuYXBwcy5maW5kT25lKHJlcS5wYXJhbXMuYXBwX2lkKVxuXHRpZiBhcHBcblx0XHRzZWNyZXQgPSBhcHAuc2VjcmV0XG5cdFx0cmVkaXJlY3RVcmwgPSBhcHAudXJsXG5cdGVsc2Vcblx0XHRzZWNyZXQgPSBcIi04NzYyLWZjYjM2OWIyZThcIlxuXHRcdHJlZGlyZWN0VXJsID0gcmVxLnBhcmFtcy5yZWRpcmVjdFVybFxuXG5cdGlmICFyZWRpcmVjdFVybFxuXHRcdHJlcy53cml0ZUhlYWQgNDAxXG5cdFx0cmVzLmVuZCgpXG5cdFx0cmV0dXJuXG5cblx0Y29va2llcyA9IG5ldyBDb29raWVzKCByZXEsIHJlcyApO1xuXG5cdCMgZmlyc3QgY2hlY2sgcmVxdWVzdCBib2R5XG5cdCMgaWYgcmVxLmJvZHlcblx0IyBcdHVzZXJJZCA9IHJlcS5ib2R5W1wiWC1Vc2VyLUlkXCJdXG5cdCMgXHRhdXRoVG9rZW4gPSByZXEuYm9keVtcIlgtQXV0aC1Ub2tlblwiXVxuXG5cdCMgIyB0aGVuIGNoZWNrIGNvb2tpZVxuXHQjIGlmICF1c2VySWQgb3IgIWF1dGhUb2tlblxuXHQjIFx0dXNlcklkID0gY29va2llcy5nZXQoXCJYLVVzZXItSWRcIilcblx0IyBcdGF1dGhUb2tlbiA9IGNvb2tpZXMuZ2V0KFwiWC1BdXRoLVRva2VuXCIpXG5cblx0aWYgIXVzZXJJZCBhbmQgIWF1dGhUb2tlblxuXHRcdHVzZXJJZCA9IHJlcS5xdWVyeVtcIlgtVXNlci1JZFwiXVxuXHRcdGF1dGhUb2tlbiA9IHJlcS5xdWVyeVtcIlgtQXV0aC1Ub2tlblwiXVxuXG5cdGlmIHVzZXJJZCBhbmQgYXV0aFRva2VuXG5cdFx0aGFzaGVkVG9rZW4gPSBBY2NvdW50cy5faGFzaExvZ2luVG9rZW4oYXV0aFRva2VuKVxuXHRcdHVzZXIgPSBNZXRlb3IudXNlcnMuZmluZE9uZVxuXHRcdFx0X2lkOiB1c2VySWQsXG5cdFx0XHRcInNlcnZpY2VzLnJlc3VtZS5sb2dpblRva2Vucy5oYXNoZWRUb2tlblwiOiBoYXNoZWRUb2tlblxuXHRcdGlmIHVzZXJcblx0XHRcdHN0ZWVkb3NfaWQgPSB1c2VyLnN0ZWVkb3NfaWRcblx0XHRcdGlmIGFwcC5zZWNyZXRcblx0XHRcdFx0aXYgPSBhcHAuc2VjcmV0XG5cdFx0XHRlbHNlXG5cdFx0XHRcdGl2ID0gXCItODc2Mi1mY2IzNjliMmU4XCJcblx0XHRcdG5vdyA9IHBhcnNlSW50KG5ldyBEYXRlKCkuZ2V0VGltZSgpLzEwMDApLnRvU3RyaW5nKClcblx0XHRcdGtleTMyID0gXCJcIlxuXHRcdFx0bGVuID0gc3RlZWRvc19pZC5sZW5ndGhcblx0XHRcdGlmIGxlbiA8IDMyXG5cdFx0XHRcdGMgPSBcIlwiXG5cdFx0XHRcdGkgPSAwXG5cdFx0XHRcdG0gPSAzMiAtIGxlblxuXHRcdFx0XHR3aGlsZSBpIDwgbVxuXHRcdFx0XHRcdGMgPSBcIiBcIiArIGNcblx0XHRcdFx0XHRpKytcblx0XHRcdFx0a2V5MzIgPSBzdGVlZG9zX2lkICsgY1xuXHRcdFx0ZWxzZSBpZiBsZW4gPj0gMzJcblx0XHRcdFx0a2V5MzIgPSBzdGVlZG9zX2lkLnNsaWNlKDAsMzIpXG5cblx0XHRcdGNpcGhlciA9IGNyeXB0by5jcmVhdGVDaXBoZXJpdignYWVzLTI1Ni1jYmMnLCBuZXcgQnVmZmVyKGtleTMyLCAndXRmOCcpLCBuZXcgQnVmZmVyKGl2LCAndXRmOCcpKVxuXG5cdFx0XHRjaXBoZXJlZE1zZyA9IEJ1ZmZlci5jb25jYXQoW2NpcGhlci51cGRhdGUobmV3IEJ1ZmZlcihub3csICd1dGY4JykpLCBjaXBoZXIuZmluYWwoKV0pXG5cblx0XHRcdHN0ZWVkb3NfdG9rZW4gPSBjaXBoZXJlZE1zZy50b1N0cmluZygnYmFzZTY0JylcblxuXHRcdFx0IyBkZXMtY2JjXG5cdFx0XHRkZXNfaXYgPSBcIi04NzYyLWZjXCJcblx0XHRcdGtleTggPSBcIlwiXG5cdFx0XHRsZW4gPSBzdGVlZG9zX2lkLmxlbmd0aFxuXHRcdFx0aWYgbGVuIDwgOFxuXHRcdFx0XHRjID0gXCJcIlxuXHRcdFx0XHRpID0gMFxuXHRcdFx0XHRtID0gOCAtIGxlblxuXHRcdFx0XHR3aGlsZSBpIDwgbVxuXHRcdFx0XHRcdGMgPSBcIiBcIiArIGNcblx0XHRcdFx0XHRpKytcblx0XHRcdFx0a2V5OCA9IHN0ZWVkb3NfaWQgKyBjXG5cdFx0XHRlbHNlIGlmIGxlbiA+PSA4XG5cdFx0XHRcdGtleTggPSBzdGVlZG9zX2lkLnNsaWNlKDAsOClcblx0XHRcdGRlc19jaXBoZXIgPSBjcnlwdG8uY3JlYXRlQ2lwaGVyaXYoJ2Rlcy1jYmMnLCBuZXcgQnVmZmVyKGtleTgsICd1dGY4JyksIG5ldyBCdWZmZXIoZGVzX2l2LCAndXRmOCcpKVxuXHRcdFx0ZGVzX2NpcGhlcmVkTXNnID0gQnVmZmVyLmNvbmNhdChbZGVzX2NpcGhlci51cGRhdGUobmV3IEJ1ZmZlcihub3csICd1dGY4JykpLCBkZXNfY2lwaGVyLmZpbmFsKCldKVxuXHRcdFx0ZGVzX3N0ZWVkb3NfdG9rZW4gPSBkZXNfY2lwaGVyZWRNc2cudG9TdHJpbmcoJ2Jhc2U2NCcpXG5cblx0XHRcdGpvaW5lciA9IFwiP1wiXG5cblx0XHRcdGlmIHJlZGlyZWN0VXJsLmluZGV4T2YoXCI/XCIpID4gLTFcblx0XHRcdFx0am9pbmVyID0gXCImXCJcblxuXHRcdFx0cmV0dXJudXJsID0gcmVkaXJlY3RVcmwgKyBqb2luZXIgKyBcIlgtVXNlci1JZD1cIiArIHVzZXJJZCArIFwiJlgtQXV0aC1Ub2tlbj1cIiArIGF1dGhUb2tlbiArIFwiJlgtU1RFRURPUy1XRUItSUQ9XCIgKyBzdGVlZG9zX2lkICsgXCImWC1TVEVFRE9TLUFVVEhUT0tFTj1cIiArIHN0ZWVkb3NfdG9rZW4gKyBcIiZTVEVFRE9TLUFVVEhUT0tFTj1cIiArIGRlc19zdGVlZG9zX3Rva2VuXG5cblx0XHRcdGlmIHVzZXIudXNlcm5hbWVcblx0XHRcdFx0cmV0dXJudXJsICs9IFwiJlgtU1RFRURPUy1VU0VSTkFNRT0je2VuY29kZVVSSSh1c2VyLnVzZXJuYW1lKX1cIlxuXHRcdFx0cmVzLnNldEhlYWRlciBcIkxvY2F0aW9uXCIsIHJldHVybnVybFxuXHRcdFx0cmVzLndyaXRlSGVhZCAzMDJcblx0XHRcdHJlcy5lbmQoKVxuXHRcdFx0cmV0dXJuXG5cblx0cmVzLndyaXRlSGVhZCA0MDFcblx0cmVzLmVuZCgpXG5cdHJldHVyblxuIiwidmFyIENvb2tpZXMsIGNyeXB0bywgZXhwcmVzcztcblxuY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyk7XG5cbkNvb2tpZXMgPSByZXF1aXJlKFwiY29va2llc1wiKTtcblxuZXhwcmVzcyA9IHJlcXVpcmUoXCJleHByZXNzXCIpO1xuXG5Kc29uUm91dGVzLmFkZChcImdldFwiLCBcIi9hcGkvc2V0dXAvc3NvLzphcHBfaWRcIiwgZnVuY3Rpb24ocmVxLCByZXMsIG5leHQpIHtcbiAgdmFyIGFwcCwgYXV0aFRva2VuLCBjLCBjaXBoZXIsIGNpcGhlcmVkTXNnLCBjb29raWVzLCBkZXNfY2lwaGVyLCBkZXNfY2lwaGVyZWRNc2csIGRlc19pdiwgZGVzX3N0ZWVkb3NfdG9rZW4sIGhhc2hlZFRva2VuLCBpLCBpdiwgam9pbmVyLCBrZXkzMiwga2V5OCwgbGVuLCBtLCBub3csIHJlZGlyZWN0VXJsLCByZXR1cm51cmwsIHNlY3JldCwgc3RlZWRvc19pZCwgc3RlZWRvc190b2tlbiwgdXNlciwgdXNlcklkO1xuICBhcHAgPSBkYi5hcHBzLmZpbmRPbmUocmVxLnBhcmFtcy5hcHBfaWQpO1xuICBpZiAoYXBwKSB7XG4gICAgc2VjcmV0ID0gYXBwLnNlY3JldDtcbiAgICByZWRpcmVjdFVybCA9IGFwcC51cmw7XG4gIH0gZWxzZSB7XG4gICAgc2VjcmV0ID0gXCItODc2Mi1mY2IzNjliMmU4XCI7XG4gICAgcmVkaXJlY3RVcmwgPSByZXEucGFyYW1zLnJlZGlyZWN0VXJsO1xuICB9XG4gIGlmICghcmVkaXJlY3RVcmwpIHtcbiAgICByZXMud3JpdGVIZWFkKDQwMSk7XG4gICAgcmVzLmVuZCgpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb29raWVzID0gbmV3IENvb2tpZXMocmVxLCByZXMpO1xuICBpZiAoIXVzZXJJZCAmJiAhYXV0aFRva2VuKSB7XG4gICAgdXNlcklkID0gcmVxLnF1ZXJ5W1wiWC1Vc2VyLUlkXCJdO1xuICAgIGF1dGhUb2tlbiA9IHJlcS5xdWVyeVtcIlgtQXV0aC1Ub2tlblwiXTtcbiAgfVxuICBpZiAodXNlcklkICYmIGF1dGhUb2tlbikge1xuICAgIGhhc2hlZFRva2VuID0gQWNjb3VudHMuX2hhc2hMb2dpblRva2VuKGF1dGhUb2tlbik7XG4gICAgdXNlciA9IE1ldGVvci51c2Vycy5maW5kT25lKHtcbiAgICAgIF9pZDogdXNlcklkLFxuICAgICAgXCJzZXJ2aWNlcy5yZXN1bWUubG9naW5Ub2tlbnMuaGFzaGVkVG9rZW5cIjogaGFzaGVkVG9rZW5cbiAgICB9KTtcbiAgICBpZiAodXNlcikge1xuICAgICAgc3RlZWRvc19pZCA9IHVzZXIuc3RlZWRvc19pZDtcbiAgICAgIGlmIChhcHAuc2VjcmV0KSB7XG4gICAgICAgIGl2ID0gYXBwLnNlY3JldDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGl2ID0gXCItODc2Mi1mY2IzNjliMmU4XCI7XG4gICAgICB9XG4gICAgICBub3cgPSBwYXJzZUludChuZXcgRGF0ZSgpLmdldFRpbWUoKSAvIDEwMDApLnRvU3RyaW5nKCk7XG4gICAgICBrZXkzMiA9IFwiXCI7XG4gICAgICBsZW4gPSBzdGVlZG9zX2lkLmxlbmd0aDtcbiAgICAgIGlmIChsZW4gPCAzMikge1xuICAgICAgICBjID0gXCJcIjtcbiAgICAgICAgaSA9IDA7XG4gICAgICAgIG0gPSAzMiAtIGxlbjtcbiAgICAgICAgd2hpbGUgKGkgPCBtKSB7XG4gICAgICAgICAgYyA9IFwiIFwiICsgYztcbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgICAga2V5MzIgPSBzdGVlZG9zX2lkICsgYztcbiAgICAgIH0gZWxzZSBpZiAobGVuID49IDMyKSB7XG4gICAgICAgIGtleTMyID0gc3RlZWRvc19pZC5zbGljZSgwLCAzMik7XG4gICAgICB9XG4gICAgICBjaXBoZXIgPSBjcnlwdG8uY3JlYXRlQ2lwaGVyaXYoJ2Flcy0yNTYtY2JjJywgbmV3IEJ1ZmZlcihrZXkzMiwgJ3V0ZjgnKSwgbmV3IEJ1ZmZlcihpdiwgJ3V0ZjgnKSk7XG4gICAgICBjaXBoZXJlZE1zZyA9IEJ1ZmZlci5jb25jYXQoW2NpcGhlci51cGRhdGUobmV3IEJ1ZmZlcihub3csICd1dGY4JykpLCBjaXBoZXIuZmluYWwoKV0pO1xuICAgICAgc3RlZWRvc190b2tlbiA9IGNpcGhlcmVkTXNnLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICAgIGRlc19pdiA9IFwiLTg3NjItZmNcIjtcbiAgICAgIGtleTggPSBcIlwiO1xuICAgICAgbGVuID0gc3RlZWRvc19pZC5sZW5ndGg7XG4gICAgICBpZiAobGVuIDwgOCkge1xuICAgICAgICBjID0gXCJcIjtcbiAgICAgICAgaSA9IDA7XG4gICAgICAgIG0gPSA4IC0gbGVuO1xuICAgICAgICB3aGlsZSAoaSA8IG0pIHtcbiAgICAgICAgICBjID0gXCIgXCIgKyBjO1xuICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICBrZXk4ID0gc3RlZWRvc19pZCArIGM7XG4gICAgICB9IGVsc2UgaWYgKGxlbiA+PSA4KSB7XG4gICAgICAgIGtleTggPSBzdGVlZG9zX2lkLnNsaWNlKDAsIDgpO1xuICAgICAgfVxuICAgICAgZGVzX2NpcGhlciA9IGNyeXB0by5jcmVhdGVDaXBoZXJpdignZGVzLWNiYycsIG5ldyBCdWZmZXIoa2V5OCwgJ3V0ZjgnKSwgbmV3IEJ1ZmZlcihkZXNfaXYsICd1dGY4JykpO1xuICAgICAgZGVzX2NpcGhlcmVkTXNnID0gQnVmZmVyLmNvbmNhdChbZGVzX2NpcGhlci51cGRhdGUobmV3IEJ1ZmZlcihub3csICd1dGY4JykpLCBkZXNfY2lwaGVyLmZpbmFsKCldKTtcbiAgICAgIGRlc19zdGVlZG9zX3Rva2VuID0gZGVzX2NpcGhlcmVkTXNnLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICAgIGpvaW5lciA9IFwiP1wiO1xuICAgICAgaWYgKHJlZGlyZWN0VXJsLmluZGV4T2YoXCI/XCIpID4gLTEpIHtcbiAgICAgICAgam9pbmVyID0gXCImXCI7XG4gICAgICB9XG4gICAgICByZXR1cm51cmwgPSByZWRpcmVjdFVybCArIGpvaW5lciArIFwiWC1Vc2VyLUlkPVwiICsgdXNlcklkICsgXCImWC1BdXRoLVRva2VuPVwiICsgYXV0aFRva2VuICsgXCImWC1TVEVFRE9TLVdFQi1JRD1cIiArIHN0ZWVkb3NfaWQgKyBcIiZYLVNURUVET1MtQVVUSFRPS0VOPVwiICsgc3RlZWRvc190b2tlbiArIFwiJlNURUVET1MtQVVUSFRPS0VOPVwiICsgZGVzX3N0ZWVkb3NfdG9rZW47XG4gICAgICBpZiAodXNlci51c2VybmFtZSkge1xuICAgICAgICByZXR1cm51cmwgKz0gXCImWC1TVEVFRE9TLVVTRVJOQU1FPVwiICsgKGVuY29kZVVSSSh1c2VyLnVzZXJuYW1lKSk7XG4gICAgICB9XG4gICAgICByZXMuc2V0SGVhZGVyKFwiTG9jYXRpb25cIiwgcmV0dXJudXJsKTtcbiAgICAgIHJlcy53cml0ZUhlYWQoMzAyKTtcbiAgICAgIHJlcy5lbmQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbiAgcmVzLndyaXRlSGVhZCg0MDEpO1xuICByZXMuZW5kKCk7XG59KTtcbiIsIk1ldGVvci5zdGFydHVwIC0+XG5cdFxuXHRKc29uUm91dGVzLmFkZCAnZ2V0JywgJy9hdmF0YXIvOnVzZXJJZCcsIChyZXEsIHJlcywgbmV4dCkgLT5cblx0XHQjIHRoaXMucGFyYW1zID1cblx0XHQjIFx0dXNlcklkOiBkZWNvZGVVUkkocmVxLnVybCkucmVwbGFjZSgvXlxcLy8sICcnKS5yZXBsYWNlKC9cXD8uKiQvLCAnJylcblx0XHR3aWR0aCA9IDUwIDtcblx0XHRoZWlnaHQgPSA1MCA7XG5cdFx0Zm9udFNpemUgPSAyOCA7XG5cdFx0aWYgcmVxLnF1ZXJ5Lndcblx0XHQgICAgd2lkdGggPSByZXEucXVlcnkudyA7XG5cdFx0aWYgcmVxLnF1ZXJ5Lmhcblx0XHQgICAgaGVpZ2h0ID0gcmVxLnF1ZXJ5LmggO1xuXHRcdGlmIHJlcS5xdWVyeS5mc1xuICAgICAgICAgICAgZm9udFNpemUgPSByZXEucXVlcnkuZnMgO1xuXG5cdFx0dXNlciA9IGRiLnVzZXJzLmZpbmRPbmUocmVxLnBhcmFtcy51c2VySWQpO1xuXHRcdGlmICF1c2VyXG5cdFx0XHRyZXMud3JpdGVIZWFkIDQwMVxuXHRcdFx0cmVzLmVuZCgpXG5cdFx0XHRyZXR1cm5cblxuXHRcdGlmIHVzZXIuYXZhdGFyXG5cdFx0XHRyZXMuc2V0SGVhZGVyIFwiTG9jYXRpb25cIiwgQ3JlYXRvci5nZXRSZWxhdGl2ZVVybChcImFwaS9maWxlcy9hdmF0YXJzL1wiICsgdXNlci5hdmF0YXIpXG5cdFx0XHRyZXMud3JpdGVIZWFkIDMwMlxuXHRcdFx0cmVzLmVuZCgpXG5cdFx0XHRyZXR1cm5cblxuXHRcdGlmIHVzZXIucHJvZmlsZT8uYXZhdGFyXG5cdFx0XHRyZXMuc2V0SGVhZGVyIFwiTG9jYXRpb25cIiwgdXNlci5wcm9maWxlLmF2YXRhclxuXHRcdFx0cmVzLndyaXRlSGVhZCAzMDJcblx0XHRcdHJlcy5lbmQoKVxuXHRcdFx0cmV0dXJuXG5cblx0XHRpZiB1c2VyLmF2YXRhclVybFxuXHRcdFx0cmVzLnNldEhlYWRlciBcIkxvY2F0aW9uXCIsIHVzZXIuYXZhdGFyVXJsXG5cdFx0XHRyZXMud3JpdGVIZWFkIDMwMlxuXHRcdFx0cmVzLmVuZCgpXG5cdFx0XHRyZXR1cm5cblxuXHRcdGlmIG5vdCBmaWxlP1xuXHRcdFx0cmVzLnNldEhlYWRlciAnQ29udGVudC1EaXNwb3NpdGlvbicsICdpbmxpbmUnXG5cdFx0XHRyZXMuc2V0SGVhZGVyICdjb250ZW50LXR5cGUnLCAnaW1hZ2Uvc3ZnK3htbCdcblx0XHRcdHJlcy5zZXRIZWFkZXIgJ2NhY2hlLWNvbnRyb2wnLCAncHVibGljLCBtYXgtYWdlPTMxNTM2MDAwJ1xuXHRcdFx0c3ZnID0gXCJcIlwiXG5cdFx0XHRcdDxzdmcgdmVyc2lvbj1cIjEuMVwiIGlkPVwiTGF5ZXJfMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiXG5cdFx0XHRcdFx0IHZpZXdCb3g9XCIwIDAgNzIgNzJcIiBzdHlsZT1cImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNzIgNzI7XCIgeG1sOnNwYWNlPVwicHJlc2VydmVcIj5cblx0XHRcdFx0PHN0eWxlIHR5cGU9XCJ0ZXh0L2Nzc1wiPlxuXHRcdFx0XHRcdC5zdDB7ZmlsbDojRkZGRkZGO31cblx0XHRcdFx0XHQuc3Qxe2ZpbGw6I0QwRDBEMDt9XG5cdFx0XHRcdDwvc3R5bGU+XG5cdFx0XHRcdDxnPlxuXHRcdFx0XHRcdDxwYXRoIGNsYXNzPVwic3QwXCIgZD1cIk0zNiw3MS4xYy0xOS4zLDAtMzUtMTUuNy0zNS0zNXMxNS43LTM1LDM1LTM1czM1LDE1LjcsMzUsMzVTNTUuMyw3MS4xLDM2LDcxLjF6XCIvPlxuXHRcdFx0XHRcdDxwYXRoIGNsYXNzPVwic3QxXCIgZD1cIk0zNiwyLjFjMTguNywwLDM0LDE1LjMsMzQsMzRzLTE1LjMsMzQtMzQsMzRTMiw1NC44LDIsMzYuMVMxNy4zLDIuMSwzNiwyLjEgTTM2LDAuMWMtMTkuOSwwLTM2LDE2LjEtMzYsMzZcblx0XHRcdFx0XHRcdHMxNi4xLDM2LDM2LDM2czM2LTE2LjEsMzYtMzZTNTUuOSwwLjEsMzYsMC4xTDM2LDAuMXpcIi8+XG5cdFx0XHRcdDwvZz5cblx0XHRcdFx0PGc+XG5cdFx0XHRcdFx0PGc+XG5cdFx0XHRcdFx0XHQ8cGF0aCBjbGFzcz1cInN0MVwiIGQ9XCJNMzUuOCw0Mi42YzguMywwLDE1LjEtNi44LDE1LjEtMTUuMWMwLTguMy02LjgtMTUuMS0xNS4xLTE1LjFjLTguMywwLTE1LjEsNi44LTE1LjEsMTUuMVxuXHRcdFx0XHRcdFx0XHRDMjAuNywzNS44LDI3LjUsNDIuNiwzNS44LDQyLjZ6XCIvPlxuXHRcdFx0XHRcdFx0PHBhdGggY2xhc3M9XCJzdDFcIiBkPVwiTTM2LjIsNzAuN2M4LjcsMCwxNi43LTMuMSwyMi45LTguMmMtMy42LTkuNi0xMi43LTE1LjUtMjMuMy0xNS41Yy0xMC40LDAtMTkuNCw1LjctMjMuMSwxNVxuXHRcdFx0XHRcdFx0XHRDMTksNjcuNCwyNy4yLDcwLjcsMzYuMiw3MC43elwiLz5cblx0XHRcdFx0XHQ8L2c+XG5cdFx0XHRcdDwvZz5cblx0XHRcdFx0PC9zdmc+XG5cdFx0XHRcIlwiXCJcblx0XHRcdHJlcy53cml0ZSBzdmdcbiNcdFx0XHRyZXMuc2V0SGVhZGVyIFwiTG9jYXRpb25cIiwgU3RlZWRvcy5hYnNvbHV0ZVVybChcIi9wYWNrYWdlcy9zdGVlZG9zX2Jhc2UvY2xpZW50L2ltYWdlcy9kZWZhdWx0LWF2YXRhci5wbmdcIilcbiNcdFx0XHRyZXMud3JpdGVIZWFkIDMwMlxuXHRcdFx0cmVzLmVuZCgpXG5cdFx0XHRyZXR1cm5cblxuXHRcdHVzZXJuYW1lID0gdXNlci5uYW1lO1xuXHRcdGlmICF1c2VybmFtZVxuXHRcdFx0dXNlcm5hbWUgPSBcIlwiXG5cblx0XHRyZXMuc2V0SGVhZGVyICdDb250ZW50LURpc3Bvc2l0aW9uJywgJ2lubGluZSdcblxuXHRcdGlmIG5vdCBmaWxlP1xuXHRcdFx0cmVzLnNldEhlYWRlciAnY29udGVudC10eXBlJywgJ2ltYWdlL3N2Zyt4bWwnXG5cdFx0XHRyZXMuc2V0SGVhZGVyICdjYWNoZS1jb250cm9sJywgJ3B1YmxpYywgbWF4LWFnZT0zMTUzNjAwMCdcblxuXHRcdFx0Y29sb3JzID0gWycjRjQ0MzM2JywnI0U5MUU2MycsJyM5QzI3QjAnLCcjNjczQUI3JywnIzNGNTFCNScsJyMyMTk2RjMnLCcjMDNBOUY0JywnIzAwQkNENCcsJyMwMDk2ODgnLCcjNENBRjUwJywnIzhCQzM0QScsJyNDRERDMzknLCcjRkZDMTA3JywnI0ZGOTgwMCcsJyNGRjU3MjInLCcjNzk1NTQ4JywnIzlFOUU5RScsJyM2MDdEOEInXVxuXG5cdFx0XHR1c2VybmFtZV9hcnJheSA9IEFycmF5LmZyb20odXNlcm5hbWUpXG5cdFx0XHRjb2xvcl9pbmRleCA9IDBcblx0XHRcdF8uZWFjaCB1c2VybmFtZV9hcnJheSwgKGl0ZW0pIC0+XG5cdFx0XHRcdGNvbG9yX2luZGV4ICs9IGl0ZW0uY2hhckNvZGVBdCgwKTtcblxuXHRcdFx0cG9zaXRpb24gPSBjb2xvcl9pbmRleCAlIGNvbG9ycy5sZW5ndGhcblx0XHRcdGNvbG9yID0gY29sb3JzW3Bvc2l0aW9uXVxuXHRcdFx0I2NvbG9yID0gXCIjRDZEQURDXCJcblxuXHRcdFx0aW5pdGlhbHMgPSAnJ1xuXHRcdFx0aWYgdXNlcm5hbWUuY2hhckNvZGVBdCgwKT4yNTVcblx0XHRcdFx0aW5pdGlhbHMgPSB1c2VybmFtZS5zdWJzdHIoMCwgMSlcblx0XHRcdGVsc2Vcblx0XHRcdFx0aW5pdGlhbHMgPSB1c2VybmFtZS5zdWJzdHIoMCwgMilcblxuXHRcdFx0aW5pdGlhbHMgPSBpbml0aWFscy50b1VwcGVyQ2FzZSgpXG5cblx0XHRcdHN2ZyA9IFwiXCJcIlxuXHRcdFx0PD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIiBzdGFuZGFsb25lPVwibm9cIj8+XG5cdFx0XHQ8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBwb2ludGVyLWV2ZW50cz1cIm5vbmVcIiB3aWR0aD1cIiN7d2lkdGh9XCIgaGVpZ2h0PVwiI3toZWlnaHR9XCIgc3R5bGU9XCJ3aWR0aDogI3t3aWR0aH1weDsgaGVpZ2h0OiAje2hlaWdodH1weDsgYmFja2dyb3VuZC1jb2xvcjogI3tjb2xvcn07XCI+XG5cdFx0XHRcdDx0ZXh0IHRleHQtYW5jaG9yPVwibWlkZGxlXCIgeT1cIjUwJVwiIHg9XCI1MCVcIiBkeT1cIjAuMzZlbVwiIHBvaW50ZXItZXZlbnRzPVwiYXV0b1wiIGZpbGw9XCIjRkZGRkZGXCIgZm9udC1mYW1pbHk9XCItYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIEhlbHZldGljYSwgQXJpYWwsIE1pY3Jvc29mdCBZYWhlaSwgU2ltSGVpXCIgc3R5bGU9XCJmb250LXdlaWdodDogNDAwOyBmb250LXNpemU6ICN7Zm9udFNpemV9cHg7XCI+XG5cdFx0XHRcdFx0I3tpbml0aWFsc31cblx0XHRcdFx0PC90ZXh0PlxuXHRcdFx0PC9zdmc+XG5cdFx0XHRcIlwiXCJcblxuXHRcdFx0cmVzLndyaXRlIHN2Z1xuXHRcdFx0cmVzLmVuZCgpXG5cdFx0XHRyZXR1cm5cblxuXHRcdHJlcU1vZGlmaWVkSGVhZGVyID0gcmVxLmhlYWRlcnNbXCJpZi1tb2RpZmllZC1zaW5jZVwiXTtcblx0XHRpZiByZXFNb2RpZmllZEhlYWRlcj9cblx0XHRcdGlmIHJlcU1vZGlmaWVkSGVhZGVyID09IHVzZXIubW9kaWZpZWQ/LnRvVVRDU3RyaW5nKClcblx0XHRcdFx0cmVzLnNldEhlYWRlciAnTGFzdC1Nb2RpZmllZCcsIHJlcU1vZGlmaWVkSGVhZGVyXG5cdFx0XHRcdHJlcy53cml0ZUhlYWQgMzA0XG5cdFx0XHRcdHJlcy5lbmQoKVxuXHRcdFx0XHRyZXR1cm5cblxuXHRcdHJlcy5zZXRIZWFkZXIgJ0xhc3QtTW9kaWZpZWQnLCB1c2VyLm1vZGlmaWVkPy50b1VUQ1N0cmluZygpIG9yIG5ldyBEYXRlKCkudG9VVENTdHJpbmcoKVxuXHRcdHJlcy5zZXRIZWFkZXIgJ2NvbnRlbnQtdHlwZScsICdpbWFnZS9qcGVnJ1xuXHRcdHJlcy5zZXRIZWFkZXIgJ0NvbnRlbnQtTGVuZ3RoJywgZmlsZS5sZW5ndGhcblxuXHRcdGZpbGUucmVhZFN0cmVhbS5waXBlIHJlc1xuXHRcdHJldHVybiIsIk1ldGVvci5zdGFydHVwKGZ1bmN0aW9uKCkge1xuICByZXR1cm4gSnNvblJvdXRlcy5hZGQoJ2dldCcsICcvYXZhdGFyLzp1c2VySWQnLCBmdW5jdGlvbihyZXEsIHJlcywgbmV4dCkge1xuICAgIHZhciBjb2xvciwgY29sb3JfaW5kZXgsIGNvbG9ycywgZm9udFNpemUsIGhlaWdodCwgaW5pdGlhbHMsIHBvc2l0aW9uLCByZWYsIHJlZjEsIHJlZjIsIHJlcU1vZGlmaWVkSGVhZGVyLCBzdmcsIHVzZXIsIHVzZXJuYW1lLCB1c2VybmFtZV9hcnJheSwgd2lkdGg7XG4gICAgd2lkdGggPSA1MDtcbiAgICBoZWlnaHQgPSA1MDtcbiAgICBmb250U2l6ZSA9IDI4O1xuICAgIGlmIChyZXEucXVlcnkudykge1xuICAgICAgd2lkdGggPSByZXEucXVlcnkudztcbiAgICB9XG4gICAgaWYgKHJlcS5xdWVyeS5oKSB7XG4gICAgICBoZWlnaHQgPSByZXEucXVlcnkuaDtcbiAgICB9XG4gICAgaWYgKHJlcS5xdWVyeS5mcykge1xuICAgICAgZm9udFNpemUgPSByZXEucXVlcnkuZnM7XG4gICAgfVxuICAgIHVzZXIgPSBkYi51c2Vycy5maW5kT25lKHJlcS5wYXJhbXMudXNlcklkKTtcbiAgICBpZiAoIXVzZXIpIHtcbiAgICAgIHJlcy53cml0ZUhlYWQoNDAxKTtcbiAgICAgIHJlcy5lbmQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHVzZXIuYXZhdGFyKSB7XG4gICAgICByZXMuc2V0SGVhZGVyKFwiTG9jYXRpb25cIiwgQ3JlYXRvci5nZXRSZWxhdGl2ZVVybChcImFwaS9maWxlcy9hdmF0YXJzL1wiICsgdXNlci5hdmF0YXIpKTtcbiAgICAgIHJlcy53cml0ZUhlYWQoMzAyKTtcbiAgICAgIHJlcy5lbmQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKChyZWYgPSB1c2VyLnByb2ZpbGUpICE9IG51bGwgPyByZWYuYXZhdGFyIDogdm9pZCAwKSB7XG4gICAgICByZXMuc2V0SGVhZGVyKFwiTG9jYXRpb25cIiwgdXNlci5wcm9maWxlLmF2YXRhcik7XG4gICAgICByZXMud3JpdGVIZWFkKDMwMik7XG4gICAgICByZXMuZW5kKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh1c2VyLmF2YXRhclVybCkge1xuICAgICAgcmVzLnNldEhlYWRlcihcIkxvY2F0aW9uXCIsIHVzZXIuYXZhdGFyVXJsKTtcbiAgICAgIHJlcy53cml0ZUhlYWQoMzAyKTtcbiAgICAgIHJlcy5lbmQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBmaWxlID09PSBcInVuZGVmaW5lZFwiIHx8IGZpbGUgPT09IG51bGwpIHtcbiAgICAgIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb24nLCAnaW5saW5lJyk7XG4gICAgICByZXMuc2V0SGVhZGVyKCdjb250ZW50LXR5cGUnLCAnaW1hZ2Uvc3ZnK3htbCcpO1xuICAgICAgcmVzLnNldEhlYWRlcignY2FjaGUtY29udHJvbCcsICdwdWJsaWMsIG1heC1hZ2U9MzE1MzYwMDAnKTtcbiAgICAgIHN2ZyA9IFwiPHN2ZyB2ZXJzaW9uPVxcXCIxLjFcXFwiIGlkPVxcXCJMYXllcl8xXFxcIiB4bWxucz1cXFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcXFwiIHhtbG5zOnhsaW5rPVxcXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXFxcIiB4PVxcXCIwcHhcXFwiIHk9XFxcIjBweFxcXCJcXG5cdCB2aWV3Qm94PVxcXCIwIDAgNzIgNzJcXFwiIHN0eWxlPVxcXCJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDcyIDcyO1xcXCIgeG1sOnNwYWNlPVxcXCJwcmVzZXJ2ZVxcXCI+XFxuPHN0eWxlIHR5cGU9XFxcInRleHQvY3NzXFxcIj5cXG5cdC5zdDB7ZmlsbDojRkZGRkZGO31cXG5cdC5zdDF7ZmlsbDojRDBEMEQwO31cXG48L3N0eWxlPlxcbjxnPlxcblx0PHBhdGggY2xhc3M9XFxcInN0MFxcXCIgZD1cXFwiTTM2LDcxLjFjLTE5LjMsMC0zNS0xNS43LTM1LTM1czE1LjctMzUsMzUtMzVzMzUsMTUuNywzNSwzNVM1NS4zLDcxLjEsMzYsNzEuMXpcXFwiLz5cXG5cdDxwYXRoIGNsYXNzPVxcXCJzdDFcXFwiIGQ9XFxcIk0zNiwyLjFjMTguNywwLDM0LDE1LjMsMzQsMzRzLTE1LjMsMzQtMzQsMzRTMiw1NC44LDIsMzYuMVMxNy4zLDIuMSwzNiwyLjEgTTM2LDAuMWMtMTkuOSwwLTM2LDE2LjEtMzYsMzZcXG5cdFx0czE2LjEsMzYsMzYsMzZzMzYtMTYuMSwzNi0zNlM1NS45LDAuMSwzNiwwLjFMMzYsMC4xelxcXCIvPlxcbjwvZz5cXG48Zz5cXG5cdDxnPlxcblx0XHQ8cGF0aCBjbGFzcz1cXFwic3QxXFxcIiBkPVxcXCJNMzUuOCw0Mi42YzguMywwLDE1LjEtNi44LDE1LjEtMTUuMWMwLTguMy02LjgtMTUuMS0xNS4xLTE1LjFjLTguMywwLTE1LjEsNi44LTE1LjEsMTUuMVxcblx0XHRcdEMyMC43LDM1LjgsMjcuNSw0Mi42LDM1LjgsNDIuNnpcXFwiLz5cXG5cdFx0PHBhdGggY2xhc3M9XFxcInN0MVxcXCIgZD1cXFwiTTM2LjIsNzAuN2M4LjcsMCwxNi43LTMuMSwyMi45LTguMmMtMy42LTkuNi0xMi43LTE1LjUtMjMuMy0xNS41Yy0xMC40LDAtMTkuNCw1LjctMjMuMSwxNVxcblx0XHRcdEMxOSw2Ny40LDI3LjIsNzAuNywzNi4yLDcwLjd6XFxcIi8+XFxuXHQ8L2c+XFxuPC9nPlxcbjwvc3ZnPlwiO1xuICAgICAgcmVzLndyaXRlKHN2Zyk7XG4gICAgICByZXMuZW5kKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHVzZXJuYW1lID0gdXNlci5uYW1lO1xuICAgIGlmICghdXNlcm5hbWUpIHtcbiAgICAgIHVzZXJuYW1lID0gXCJcIjtcbiAgICB9XG4gICAgcmVzLnNldEhlYWRlcignQ29udGVudC1EaXNwb3NpdGlvbicsICdpbmxpbmUnKTtcbiAgICBpZiAodHlwZW9mIGZpbGUgPT09IFwidW5kZWZpbmVkXCIgfHwgZmlsZSA9PT0gbnVsbCkge1xuICAgICAgcmVzLnNldEhlYWRlcignY29udGVudC10eXBlJywgJ2ltYWdlL3N2Zyt4bWwnKTtcbiAgICAgIHJlcy5zZXRIZWFkZXIoJ2NhY2hlLWNvbnRyb2wnLCAncHVibGljLCBtYXgtYWdlPTMxNTM2MDAwJyk7XG4gICAgICBjb2xvcnMgPSBbJyNGNDQzMzYnLCAnI0U5MUU2MycsICcjOUMyN0IwJywgJyM2NzNBQjcnLCAnIzNGNTFCNScsICcjMjE5NkYzJywgJyMwM0E5RjQnLCAnIzAwQkNENCcsICcjMDA5Njg4JywgJyM0Q0FGNTAnLCAnIzhCQzM0QScsICcjQ0REQzM5JywgJyNGRkMxMDcnLCAnI0ZGOTgwMCcsICcjRkY1NzIyJywgJyM3OTU1NDgnLCAnIzlFOUU5RScsICcjNjA3RDhCJ107XG4gICAgICB1c2VybmFtZV9hcnJheSA9IEFycmF5LmZyb20odXNlcm5hbWUpO1xuICAgICAgY29sb3JfaW5kZXggPSAwO1xuICAgICAgXy5lYWNoKHVzZXJuYW1lX2FycmF5LCBmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgIHJldHVybiBjb2xvcl9pbmRleCArPSBpdGVtLmNoYXJDb2RlQXQoMCk7XG4gICAgICB9KTtcbiAgICAgIHBvc2l0aW9uID0gY29sb3JfaW5kZXggJSBjb2xvcnMubGVuZ3RoO1xuICAgICAgY29sb3IgPSBjb2xvcnNbcG9zaXRpb25dO1xuICAgICAgaW5pdGlhbHMgPSAnJztcbiAgICAgIGlmICh1c2VybmFtZS5jaGFyQ29kZUF0KDApID4gMjU1KSB7XG4gICAgICAgIGluaXRpYWxzID0gdXNlcm5hbWUuc3Vic3RyKDAsIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5pdGlhbHMgPSB1c2VybmFtZS5zdWJzdHIoMCwgMik7XG4gICAgICB9XG4gICAgICBpbml0aWFscyA9IGluaXRpYWxzLnRvVXBwZXJDYXNlKCk7XG4gICAgICBzdmcgPSBcIjw/eG1sIHZlcnNpb249XFxcIjEuMFxcXCIgZW5jb2Rpbmc9XFxcIlVURi04XFxcIiBzdGFuZGFsb25lPVxcXCJub1xcXCI/PlxcbjxzdmcgeG1sbnM9XFxcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXFxcIiBwb2ludGVyLWV2ZW50cz1cXFwibm9uZVxcXCIgd2lkdGg9XFxcIlwiICsgd2lkdGggKyBcIlxcXCIgaGVpZ2h0PVxcXCJcIiArIGhlaWdodCArIFwiXFxcIiBzdHlsZT1cXFwid2lkdGg6IFwiICsgd2lkdGggKyBcInB4OyBoZWlnaHQ6IFwiICsgaGVpZ2h0ICsgXCJweDsgYmFja2dyb3VuZC1jb2xvcjogXCIgKyBjb2xvciArIFwiO1xcXCI+XFxuXHQ8dGV4dCB0ZXh0LWFuY2hvcj1cXFwibWlkZGxlXFxcIiB5PVxcXCI1MCVcXFwiIHg9XFxcIjUwJVxcXCIgZHk9XFxcIjAuMzZlbVxcXCIgcG9pbnRlci1ldmVudHM9XFxcImF1dG9cXFwiIGZpbGw9XFxcIiNGRkZGRkZcXFwiIGZvbnQtZmFtaWx5PVxcXCItYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsIEhlbHZldGljYSwgQXJpYWwsIE1pY3Jvc29mdCBZYWhlaSwgU2ltSGVpXFxcIiBzdHlsZT1cXFwiZm9udC13ZWlnaHQ6IDQwMDsgZm9udC1zaXplOiBcIiArIGZvbnRTaXplICsgXCJweDtcXFwiPlxcblx0XHRcIiArIGluaXRpYWxzICsgXCJcXG5cdDwvdGV4dD5cXG48L3N2Zz5cIjtcbiAgICAgIHJlcy53cml0ZShzdmcpO1xuICAgICAgcmVzLmVuZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXFNb2RpZmllZEhlYWRlciA9IHJlcS5oZWFkZXJzW1wiaWYtbW9kaWZpZWQtc2luY2VcIl07XG4gICAgaWYgKHJlcU1vZGlmaWVkSGVhZGVyICE9IG51bGwpIHtcbiAgICAgIGlmIChyZXFNb2RpZmllZEhlYWRlciA9PT0gKChyZWYxID0gdXNlci5tb2RpZmllZCkgIT0gbnVsbCA/IHJlZjEudG9VVENTdHJpbmcoKSA6IHZvaWQgMCkpIHtcbiAgICAgICAgcmVzLnNldEhlYWRlcignTGFzdC1Nb2RpZmllZCcsIHJlcU1vZGlmaWVkSGVhZGVyKTtcbiAgICAgICAgcmVzLndyaXRlSGVhZCgzMDQpO1xuICAgICAgICByZXMuZW5kKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmVzLnNldEhlYWRlcignTGFzdC1Nb2RpZmllZCcsICgocmVmMiA9IHVzZXIubW9kaWZpZWQpICE9IG51bGwgPyByZWYyLnRvVVRDU3RyaW5nKCkgOiB2b2lkIDApIHx8IG5ldyBEYXRlKCkudG9VVENTdHJpbmcoKSk7XG4gICAgcmVzLnNldEhlYWRlcignY29udGVudC10eXBlJywgJ2ltYWdlL2pwZWcnKTtcbiAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LUxlbmd0aCcsIGZpbGUubGVuZ3RoKTtcbiAgICBmaWxlLnJlYWRTdHJlYW0ucGlwZShyZXMpO1xuICB9KTtcbn0pO1xuIiwiTWV0ZW9yLnN0YXJ0dXAgLT5cblx0SnNvblJvdXRlcy5hZGQgJ2dldCcsICcvYXBpL2FjY2Vzcy9jaGVjaycsIChyZXEsIHJlcywgbmV4dCkgLT5cblxuXHRcdGFjY2Vzc190b2tlbiA9IHJlcS5xdWVyeT8uYWNjZXNzX3Rva2VuXG5cblx0XHRpZiBTdGVlZG9zLmdldFVzZXJJZEZyb21BY2Nlc3NUb2tlbihhY2Nlc3NfdG9rZW4pXG5cdFx0XHRyZXMud3JpdGVIZWFkIDIwMFxuXHRcdFx0cmVzLmVuZCgpXG5cdFx0XHRyZXR1cm5cblx0XHRlbHNlXG5cdFx0XHRyZXMud3JpdGVIZWFkIDQwMVxuXHRcdFx0cmVzLmVuZCgpXG5cdFx0XHRyZXR1cm5cblxuXG5cblxuIiwiTWV0ZW9yLnN0YXJ0dXAoZnVuY3Rpb24oKSB7XG4gIHJldHVybiBKc29uUm91dGVzLmFkZCgnZ2V0JywgJy9hcGkvYWNjZXNzL2NoZWNrJywgZnVuY3Rpb24ocmVxLCByZXMsIG5leHQpIHtcbiAgICB2YXIgYWNjZXNzX3Rva2VuLCByZWY7XG4gICAgYWNjZXNzX3Rva2VuID0gKHJlZiA9IHJlcS5xdWVyeSkgIT0gbnVsbCA/IHJlZi5hY2Nlc3NfdG9rZW4gOiB2b2lkIDA7XG4gICAgaWYgKFN0ZWVkb3MuZ2V0VXNlcklkRnJvbUFjY2Vzc1Rva2VuKGFjY2Vzc190b2tlbikpIHtcbiAgICAgIHJlcy53cml0ZUhlYWQoMjAwKTtcbiAgICAgIHJlcy5lbmQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzLndyaXRlSGVhZCg0MDEpO1xuICAgICAgcmVzLmVuZCgpO1xuICAgIH1cbiAgfSk7XG59KTtcbiIsImlmIE1ldGVvci5pc1NlcnZlclxuICAgIE1ldGVvci5wdWJsaXNoICdhcHBzJywgKHNwYWNlSWQpLT5cbiAgICAgICAgdW5sZXNzIHRoaXMudXNlcklkXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZWFkeSgpXG4gICAgICAgIFxuXG4gICAgICAgIHNlbGVjdG9yID0ge3NwYWNlOiB7JGV4aXN0czogZmFsc2V9fVxuICAgICAgICBpZiBzcGFjZUlkXG4gICAgICAgICAgICBzZWxlY3RvciA9IHskb3I6IFt7c3BhY2U6IHskZXhpc3RzOiBmYWxzZX19LCB7c3BhY2U6IHNwYWNlSWR9XX1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBkYi5hcHBzLmZpbmQoc2VsZWN0b3IsIHtzb3J0OiB7c29ydDogMX19KTtcbiIsImlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgTWV0ZW9yLnB1Ymxpc2goJ2FwcHMnLCBmdW5jdGlvbihzcGFjZUlkKSB7XG4gICAgdmFyIHNlbGVjdG9yO1xuICAgIGlmICghdGhpcy51c2VySWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gICAgfVxuICAgIHNlbGVjdG9yID0ge1xuICAgICAgc3BhY2U6IHtcbiAgICAgICAgJGV4aXN0czogZmFsc2VcbiAgICAgIH1cbiAgICB9O1xuICAgIGlmIChzcGFjZUlkKSB7XG4gICAgICBzZWxlY3RvciA9IHtcbiAgICAgICAgJG9yOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgc3BhY2U6IHtcbiAgICAgICAgICAgICAgJGV4aXN0czogZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICBzcGFjZTogc3BhY2VJZFxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIGRiLmFwcHMuZmluZChzZWxlY3Rvciwge1xuICAgICAgc29ydDoge1xuICAgICAgICBzb3J0OiAxXG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuIiwiXG5cblx0IyBwdWJsaXNoIHVzZXJzIHNwYWNlc1xuXHQjIHdlIG9ubHkgcHVibGlzaCBzcGFjZXMgY3VycmVudCB1c2VyIGpvaW5lZC5cblx0TWV0ZW9yLnB1Ymxpc2ggJ215X3NwYWNlcycsIC0+XG5cdFx0dW5sZXNzIHRoaXMudXNlcklkXG5cdFx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblxuXHRcdHNlbGYgPSB0aGlzO1xuXHRcdHVzZXJTcGFjZXMgPSBbXVxuXHRcdHN1cyA9IGRiLnNwYWNlX3VzZXJzLmZpbmQoe3VzZXI6IHRoaXMudXNlcklkLCB1c2VyX2FjY2VwdGVkOiB0cnVlfSwge2ZpZWxkczoge3NwYWNlOjF9fSlcblx0XHRzdXMuZm9yRWFjaCAoc3UpIC0+XG5cdFx0XHR1c2VyU3BhY2VzLnB1c2goc3Uuc3BhY2UpXG5cblx0XHRoYW5kbGUyID0gbnVsbFxuXG5cdFx0IyBvbmx5IHJldHVybiB1c2VyIGpvaW5lZCBzcGFjZXMsIGFuZCBvYnNlcnZlcyB3aGVuIHVzZXIgam9pbiBvciBsZWF2ZSBhIHNwYWNlXG5cdFx0aGFuZGxlID0gZGIuc3BhY2VfdXNlcnMuZmluZCh7dXNlcjogdGhpcy51c2VySWQsIHVzZXJfYWNjZXB0ZWQ6IHRydWV9KS5vYnNlcnZlXG5cdFx0XHRhZGRlZDogKGRvYykgLT5cblx0XHRcdFx0aWYgZG9jLnNwYWNlXG5cdFx0XHRcdFx0aWYgdXNlclNwYWNlcy5pbmRleE9mKGRvYy5zcGFjZSkgPCAwXG5cdFx0XHRcdFx0XHR1c2VyU3BhY2VzLnB1c2goZG9jLnNwYWNlKVxuXHRcdFx0XHRcdFx0b2JzZXJ2ZVNwYWNlcygpXG5cdFx0XHRyZW1vdmVkOiAob2xkRG9jKSAtPlxuXHRcdFx0XHRpZiBvbGREb2Muc3BhY2Vcblx0XHRcdFx0XHRzZWxmLnJlbW92ZWQgXCJzcGFjZXNcIiwgb2xkRG9jLnNwYWNlXG5cdFx0XHRcdFx0dXNlclNwYWNlcyA9IF8ud2l0aG91dCh1c2VyU3BhY2VzLCBvbGREb2Muc3BhY2UpXG5cblx0XHRvYnNlcnZlU3BhY2VzID0gLT5cblx0XHRcdGlmIGhhbmRsZTJcblx0XHRcdFx0aGFuZGxlMi5zdG9wKCk7XG5cdFx0XHRoYW5kbGUyID0gZGIuc3BhY2VzLmZpbmQoe19pZDogeyRpbjogdXNlclNwYWNlc319KS5vYnNlcnZlXG5cdFx0XHRcdGFkZGVkOiAoZG9jKSAtPlxuXHRcdFx0XHRcdHNlbGYuYWRkZWQgXCJzcGFjZXNcIiwgZG9jLl9pZCwgZG9jO1xuXHRcdFx0XHRcdHVzZXJTcGFjZXMucHVzaChkb2MuX2lkKVxuXHRcdFx0XHRjaGFuZ2VkOiAobmV3RG9jLCBvbGREb2MpIC0+XG5cdFx0XHRcdFx0c2VsZi5jaGFuZ2VkIFwic3BhY2VzXCIsIG5ld0RvYy5faWQsIG5ld0RvYztcblx0XHRcdFx0cmVtb3ZlZDogKG9sZERvYykgLT5cblx0XHRcdFx0XHRzZWxmLnJlbW92ZWQgXCJzcGFjZXNcIiwgb2xkRG9jLl9pZFxuXHRcdFx0XHRcdHVzZXJTcGFjZXMgPSBfLndpdGhvdXQodXNlclNwYWNlcywgb2xkRG9jLl9pZClcblxuXHRcdG9ic2VydmVTcGFjZXMoKTtcblxuXHRcdHNlbGYucmVhZHkoKTtcblxuXHRcdHNlbGYub25TdG9wIC0+XG5cdFx0XHRoYW5kbGUuc3RvcCgpO1xuXHRcdFx0aWYgaGFuZGxlMlxuXHRcdFx0XHRoYW5kbGUyLnN0b3AoKTtcbiIsIk1ldGVvci5wdWJsaXNoKCdteV9zcGFjZXMnLCBmdW5jdGlvbigpIHtcbiAgdmFyIGhhbmRsZSwgaGFuZGxlMiwgb2JzZXJ2ZVNwYWNlcywgc2VsZiwgc3VzLCB1c2VyU3BhY2VzO1xuICBpZiAoIXRoaXMudXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBzZWxmID0gdGhpcztcbiAgdXNlclNwYWNlcyA9IFtdO1xuICBzdXMgPSBkYi5zcGFjZV91c2Vycy5maW5kKHtcbiAgICB1c2VyOiB0aGlzLnVzZXJJZCxcbiAgICB1c2VyX2FjY2VwdGVkOiB0cnVlXG4gIH0sIHtcbiAgICBmaWVsZHM6IHtcbiAgICAgIHNwYWNlOiAxXG4gICAgfVxuICB9KTtcbiAgc3VzLmZvckVhY2goZnVuY3Rpb24oc3UpIHtcbiAgICByZXR1cm4gdXNlclNwYWNlcy5wdXNoKHN1LnNwYWNlKTtcbiAgfSk7XG4gIGhhbmRsZTIgPSBudWxsO1xuICBoYW5kbGUgPSBkYi5zcGFjZV91c2Vycy5maW5kKHtcbiAgICB1c2VyOiB0aGlzLnVzZXJJZCxcbiAgICB1c2VyX2FjY2VwdGVkOiB0cnVlXG4gIH0pLm9ic2VydmUoe1xuICAgIGFkZGVkOiBmdW5jdGlvbihkb2MpIHtcbiAgICAgIGlmIChkb2Muc3BhY2UpIHtcbiAgICAgICAgaWYgKHVzZXJTcGFjZXMuaW5kZXhPZihkb2Muc3BhY2UpIDwgMCkge1xuICAgICAgICAgIHVzZXJTcGFjZXMucHVzaChkb2Muc3BhY2UpO1xuICAgICAgICAgIHJldHVybiBvYnNlcnZlU3BhY2VzKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIHJlbW92ZWQ6IGZ1bmN0aW9uKG9sZERvYykge1xuICAgICAgaWYgKG9sZERvYy5zcGFjZSkge1xuICAgICAgICBzZWxmLnJlbW92ZWQoXCJzcGFjZXNcIiwgb2xkRG9jLnNwYWNlKTtcbiAgICAgICAgcmV0dXJuIHVzZXJTcGFjZXMgPSBfLndpdGhvdXQodXNlclNwYWNlcywgb2xkRG9jLnNwYWNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICBvYnNlcnZlU3BhY2VzID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKGhhbmRsZTIpIHtcbiAgICAgIGhhbmRsZTIuc3RvcCgpO1xuICAgIH1cbiAgICByZXR1cm4gaGFuZGxlMiA9IGRiLnNwYWNlcy5maW5kKHtcbiAgICAgIF9pZDoge1xuICAgICAgICAkaW46IHVzZXJTcGFjZXNcbiAgICAgIH1cbiAgICB9KS5vYnNlcnZlKHtcbiAgICAgIGFkZGVkOiBmdW5jdGlvbihkb2MpIHtcbiAgICAgICAgc2VsZi5hZGRlZChcInNwYWNlc1wiLCBkb2MuX2lkLCBkb2MpO1xuICAgICAgICByZXR1cm4gdXNlclNwYWNlcy5wdXNoKGRvYy5faWQpO1xuICAgICAgfSxcbiAgICAgIGNoYW5nZWQ6IGZ1bmN0aW9uKG5ld0RvYywgb2xkRG9jKSB7XG4gICAgICAgIHJldHVybiBzZWxmLmNoYW5nZWQoXCJzcGFjZXNcIiwgbmV3RG9jLl9pZCwgbmV3RG9jKTtcbiAgICAgIH0sXG4gICAgICByZW1vdmVkOiBmdW5jdGlvbihvbGREb2MpIHtcbiAgICAgICAgc2VsZi5yZW1vdmVkKFwic3BhY2VzXCIsIG9sZERvYy5faWQpO1xuICAgICAgICByZXR1cm4gdXNlclNwYWNlcyA9IF8ud2l0aG91dCh1c2VyU3BhY2VzLCBvbGREb2MuX2lkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbiAgb2JzZXJ2ZVNwYWNlcygpO1xuICBzZWxmLnJlYWR5KCk7XG4gIHJldHVybiBzZWxmLm9uU3RvcChmdW5jdGlvbigpIHtcbiAgICBoYW5kbGUuc3RvcCgpO1xuICAgIGlmIChoYW5kbGUyKSB7XG4gICAgICByZXR1cm4gaGFuZGxlMi5zdG9wKCk7XG4gICAgfVxuICB9KTtcbn0pO1xuIiwiIyBwdWJsaXNoIHNvbWUgb25lIHNwYWNlJ3MgYXZhdGFyXG5NZXRlb3IucHVibGlzaCAnc3BhY2VfYXZhdGFyJywgKHNwYWNlSWQpLT5cblx0dW5sZXNzIHNwYWNlSWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0cmV0dXJuIGRiLnNwYWNlcy5maW5kKHtfaWQ6IHNwYWNlSWR9LCB7ZmllbGRzOiB7YXZhdGFyOiAxLG5hbWU6IDEsZW5hYmxlX3JlZ2lzdGVyOjF9fSk7XG4iLCJNZXRlb3IucHVibGlzaCgnc3BhY2VfYXZhdGFyJywgZnVuY3Rpb24oc3BhY2VJZCkge1xuICBpZiAoIXNwYWNlSWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIHJldHVybiBkYi5zcGFjZXMuZmluZCh7XG4gICAgX2lkOiBzcGFjZUlkXG4gIH0sIHtcbiAgICBmaWVsZHM6IHtcbiAgICAgIGF2YXRhcjogMSxcbiAgICAgIG5hbWU6IDEsXG4gICAgICBlbmFibGVfcmVnaXN0ZXI6IDFcbiAgICB9XG4gIH0pO1xufSk7XG4iLCJNZXRlb3IucHVibGlzaCAnbW9kdWxlcycsICgpLT5cblx0dW5sZXNzIHRoaXMudXNlcklkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHJldHVybiBkYi5tb2R1bGVzLmZpbmQoKTsiLCJNZXRlb3IucHVibGlzaCgnbW9kdWxlcycsIGZ1bmN0aW9uKCkge1xuICBpZiAoIXRoaXMudXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICByZXR1cm4gZGIubW9kdWxlcy5maW5kKCk7XG59KTtcbiIsIk1ldGVvci5wdWJsaXNoICdiaWxsaW5nX3dlaXhpbl9wYXlfY29kZV91cmwnLCAoX2lkKS0+XG5cdHVubGVzcyB0aGlzLnVzZXJJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHR1bmxlc3MgX2lkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHJldHVybiBkYi5iaWxsaW5nX3BheV9yZWNvcmRzLmZpbmQoe19pZDogX2lkfSk7IiwiTWV0ZW9yLnB1Ymxpc2goJ2JpbGxpbmdfd2VpeGluX3BheV9jb2RlX3VybCcsIGZ1bmN0aW9uKF9pZCkge1xuICBpZiAoIXRoaXMudXNlcklkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICBpZiAoIV9pZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgcmV0dXJuIGRiLmJpbGxpbmdfcGF5X3JlY29yZHMuZmluZCh7XG4gICAgX2lkOiBfaWRcbiAgfSk7XG59KTtcbiIsIkpzb25Sb3V0ZXMuYWRkICdwb3N0JywgJy9hcGkvYmlsbGluZy9yZWNoYXJnZS9ub3RpZnknLCAocmVxLCByZXMsIG5leHQpIC0+XG5cdHRyeVxuXHRcdGJvZHkgPSBcIlwiXG5cdFx0cmVxLm9uKCdkYXRhJywgKGNodW5rKS0+XG5cdFx0XHRib2R5ICs9IGNodW5rXG5cdFx0KVxuXHRcdHJlcS5vbignZW5kJywgTWV0ZW9yLmJpbmRFbnZpcm9ubWVudCgoKCktPlxuXHRcdFx0XHR4bWwyanMgPSByZXF1aXJlKCd4bWwyanMnKVxuXHRcdFx0XHRwYXJzZXIgPSBuZXcgeG1sMmpzLlBhcnNlcih7IHRyaW06dHJ1ZSwgZXhwbGljaXRBcnJheTpmYWxzZSwgZXhwbGljaXRSb290OmZhbHNlIH0pXG5cdFx0XHRcdHBhcnNlci5wYXJzZVN0cmluZyhib2R5LCAoZXJyLCByZXN1bHQpLT5cblx0XHRcdFx0XHRcdCMg54m55Yir5o+Q6YaS77ya5ZWG5oi357O757uf5a+55LqO5pSv5LuY57uT5p6c6YCa55+l55qE5YaF5a655LiA5a6a6KaB5YGa562+5ZCN6aqM6K+BLOW5tuagoemqjOi/lOWbnueahOiuouWNlemHkemineaYr+WQpuS4juWVhuaIt+S+p+eahOiuouWNlemHkemineS4gOiHtO+8jOmYsuatouaVsOaNruazhOa8j+WvvOiHtOWHuueOsOKAnOWBh+mAmuefpeKAne+8jOmAoOaIkOi1hOmHkeaNn+WksVxuXHRcdFx0XHRcdFx0V1hQYXkgPSByZXF1aXJlKCd3ZWl4aW4tcGF5Jylcblx0XHRcdFx0XHRcdHd4cGF5ID0gV1hQYXkoe1xuXHRcdFx0XHRcdFx0XHRhcHBpZDogTWV0ZW9yLnNldHRpbmdzLmJpbGxpbmcuYXBwaWQsXG5cdFx0XHRcdFx0XHRcdG1jaF9pZDogTWV0ZW9yLnNldHRpbmdzLmJpbGxpbmcubWNoX2lkLFxuXHRcdFx0XHRcdFx0XHRwYXJ0bmVyX2tleTogTWV0ZW9yLnNldHRpbmdzLmJpbGxpbmcucGFydG5lcl9rZXkgI+W+ruS/oeWVhuaIt+W5s+WPsEFQSeWvhumSpVxuXHRcdFx0XHRcdFx0fSlcblx0XHRcdFx0XHRcdHNpZ24gPSB3eHBheS5zaWduKF8uY2xvbmUocmVzdWx0KSlcblx0XHRcdFx0XHRcdGF0dGFjaCA9IEpTT04ucGFyc2UocmVzdWx0LmF0dGFjaClcblx0XHRcdFx0XHRcdGNvZGVfdXJsX2lkID0gYXR0YWNoLmNvZGVfdXJsX2lkXG5cdFx0XHRcdFx0XHRicHIgPSBkYi5iaWxsaW5nX3BheV9yZWNvcmRzLmZpbmRPbmUoY29kZV91cmxfaWQpXG5cdFx0XHRcdFx0XHRpZiBicHIgYW5kIGJwci50b3RhbF9mZWUgaXMgTnVtYmVyKHJlc3VsdC50b3RhbF9mZWUpIGFuZCBzaWduIGlzIHJlc3VsdC5zaWduXG5cdFx0XHRcdFx0XHRcdGRiLmJpbGxpbmdfcGF5X3JlY29yZHMudXBkYXRlKHtfaWQ6IGNvZGVfdXJsX2lkfSwgeyRzZXQ6IHtwYWlkOiB0cnVlfX0pXG5cdFx0XHRcdFx0XHRcdGJpbGxpbmdNYW5hZ2VyLnNwZWNpYWxfcGF5KGJwci5zcGFjZSwgYnByLm1vZHVsZXMsIE51bWJlcihyZXN1bHQudG90YWxfZmVlKSwgYnByLmNyZWF0ZWRfYnksIGJwci5lbmRfZGF0ZSwgYnByLnVzZXJfY291bnQpXG5cdFx0XHRcdFx0XG5cdFx0XHRcdClcblx0XHRcdCksIChlcnIpLT5cblx0XHRcdFx0Y29uc29sZS5lcnJvciBlcnIuc3RhY2tcblx0XHRcdFx0Y29uc29sZS5sb2cgJ0ZhaWxlZCB0byBiaW5kIGVudmlyb25tZW50OiBhcGlfYmlsbGluZ19yZWNoYXJnZV9ub3RpZnkuY29mZmVlJ1xuXHRcdFx0KVxuXHRcdClcblx0XHRcblx0Y2F0Y2ggZVxuXHRcdGNvbnNvbGUuZXJyb3IgZS5zdGFja1xuXG5cdHJlcy53cml0ZUhlYWQoMjAwLCB7J0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi94bWwnfSlcblx0cmVzLmVuZCgnPHhtbD48cmV0dXJuX2NvZGU+PCFbQ0RBVEFbU1VDQ0VTU11dPjwvcmV0dXJuX2NvZGU+PC94bWw+JylcblxuXHRcdCIsIkpzb25Sb3V0ZXMuYWRkKCdwb3N0JywgJy9hcGkvYmlsbGluZy9yZWNoYXJnZS9ub3RpZnknLCBmdW5jdGlvbihyZXEsIHJlcywgbmV4dCkge1xuICB2YXIgYm9keSwgZTtcbiAgdHJ5IHtcbiAgICBib2R5ID0gXCJcIjtcbiAgICByZXEub24oJ2RhdGEnLCBmdW5jdGlvbihjaHVuaykge1xuICAgICAgcmV0dXJuIGJvZHkgKz0gY2h1bms7XG4gICAgfSk7XG4gICAgcmVxLm9uKCdlbmQnLCBNZXRlb3IuYmluZEVudmlyb25tZW50KChmdW5jdGlvbigpIHtcbiAgICAgIHZhciBwYXJzZXIsIHhtbDJqcztcbiAgICAgIHhtbDJqcyA9IHJlcXVpcmUoJ3htbDJqcycpO1xuICAgICAgcGFyc2VyID0gbmV3IHhtbDJqcy5QYXJzZXIoe1xuICAgICAgICB0cmltOiB0cnVlLFxuICAgICAgICBleHBsaWNpdEFycmF5OiBmYWxzZSxcbiAgICAgICAgZXhwbGljaXRSb290OiBmYWxzZVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcGFyc2VyLnBhcnNlU3RyaW5nKGJvZHksIGZ1bmN0aW9uKGVyciwgcmVzdWx0KSB7XG4gICAgICAgIHZhciBXWFBheSwgYXR0YWNoLCBicHIsIGNvZGVfdXJsX2lkLCBzaWduLCB3eHBheTtcbiAgICAgICAgV1hQYXkgPSByZXF1aXJlKCd3ZWl4aW4tcGF5Jyk7XG4gICAgICAgIHd4cGF5ID0gV1hQYXkoe1xuICAgICAgICAgIGFwcGlkOiBNZXRlb3Iuc2V0dGluZ3MuYmlsbGluZy5hcHBpZCxcbiAgICAgICAgICBtY2hfaWQ6IE1ldGVvci5zZXR0aW5ncy5iaWxsaW5nLm1jaF9pZCxcbiAgICAgICAgICBwYXJ0bmVyX2tleTogTWV0ZW9yLnNldHRpbmdzLmJpbGxpbmcucGFydG5lcl9rZXlcbiAgICAgICAgfSk7XG4gICAgICAgIHNpZ24gPSB3eHBheS5zaWduKF8uY2xvbmUocmVzdWx0KSk7XG4gICAgICAgIGF0dGFjaCA9IEpTT04ucGFyc2UocmVzdWx0LmF0dGFjaCk7XG4gICAgICAgIGNvZGVfdXJsX2lkID0gYXR0YWNoLmNvZGVfdXJsX2lkO1xuICAgICAgICBicHIgPSBkYi5iaWxsaW5nX3BheV9yZWNvcmRzLmZpbmRPbmUoY29kZV91cmxfaWQpO1xuICAgICAgICBpZiAoYnByICYmIGJwci50b3RhbF9mZWUgPT09IE51bWJlcihyZXN1bHQudG90YWxfZmVlKSAmJiBzaWduID09PSByZXN1bHQuc2lnbikge1xuICAgICAgICAgIGRiLmJpbGxpbmdfcGF5X3JlY29yZHMudXBkYXRlKHtcbiAgICAgICAgICAgIF9pZDogY29kZV91cmxfaWRcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAkc2V0OiB7XG4gICAgICAgICAgICAgIHBhaWQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gYmlsbGluZ01hbmFnZXIuc3BlY2lhbF9wYXkoYnByLnNwYWNlLCBicHIubW9kdWxlcywgTnVtYmVyKHJlc3VsdC50b3RhbF9mZWUpLCBicHIuY3JlYXRlZF9ieSwgYnByLmVuZF9kYXRlLCBicHIudXNlcl9jb3VudCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pLCBmdW5jdGlvbihlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyLnN0YWNrKTtcbiAgICAgIHJldHVybiBjb25zb2xlLmxvZygnRmFpbGVkIHRvIGJpbmQgZW52aXJvbm1lbnQ6IGFwaV9iaWxsaW5nX3JlY2hhcmdlX25vdGlmeS5jb2ZmZWUnKTtcbiAgICB9KSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgZSA9IGVycm9yO1xuICAgIGNvbnNvbGUuZXJyb3IoZS5zdGFjayk7XG4gIH1cbiAgcmVzLndyaXRlSGVhZCgyMDAsIHtcbiAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3htbCdcbiAgfSk7XG4gIHJldHVybiByZXMuZW5kKCc8eG1sPjxyZXR1cm5fY29kZT48IVtDREFUQVtTVUNDRVNTXV0+PC9yZXR1cm5fY29kZT48L3htbD4nKTtcbn0pO1xuIiwiTWV0ZW9yLm1ldGhvZHNcblx0Z2V0X2NvbnRhY3RzX2xpbWl0OiAoc3BhY2UpLT5cblx0XHQjIOagueaNruW9k+WJjeeUqOaIt+aJgOWxnue7hOe7h++8jOafpeivouWHuuW9k+WJjeeUqOaIt+mZkOWumueahOe7hOe7h+afpeeci+iMg+WbtFxuXHRcdCMg6L+U5Zue55qEaXNMaW1pdOS4unRydWXooajnpLrpmZDlrprlnKjlvZPliY3nlKjmiLfmiYDlnKjnu4Tnu4fojIPlm7TvvIxvcmdhbml6YXRpb25z5YC86K6w5b2V6aKd5aSW55qE57uE57uH6IyD5Zu0XG5cdFx0IyDov5Tlm57nmoRpc0xpbWl05Li6ZmFsc2XooajnpLrkuI3pmZDlrprnu4Tnu4fojIPlm7TvvIzljbPooajnpLrog73nnIvmlbTkuKrlt6XkvZzljLrnmoTnu4Tnu4dcblx0XHQjIOm7mOiupOi/lOWbnumZkOWumuWcqOW9k+WJjeeUqOaIt+aJgOWxnue7hOe7h1xuXHRcdGNoZWNrIHNwYWNlLCBTdHJpbmdcblx0XHRyZVZhbHVlID1cblx0XHRcdGlzTGltaXQ6IHRydWVcblx0XHRcdG91dHNpZGVfb3JnYW5pemF0aW9uczogW11cblx0XHR1bmxlc3MgdGhpcy51c2VySWRcblx0XHRcdHJldHVybiByZVZhbHVlXG5cdFx0aXNMaW1pdCA9IGZhbHNlXG5cdFx0b3V0c2lkZV9vcmdhbml6YXRpb25zID0gW11cblx0XHRzZXR0aW5nID0gZGIuc3BhY2Vfc2V0dGluZ3MuZmluZE9uZSh7c3BhY2U6IHNwYWNlLCBrZXk6IFwiY29udGFjdHNfdmlld19saW1pdHNcIn0pXG5cdFx0bGltaXRzID0gc2V0dGluZz8udmFsdWVzIHx8IFtdO1xuXG5cdFx0aWYgbGltaXRzLmxlbmd0aFxuXHRcdFx0bXlPcmdzID0gZGIub3JnYW5pemF0aW9ucy5maW5kKHtzcGFjZTogc3BhY2UsIHVzZXJzOiB0aGlzLnVzZXJJZH0sIHtmaWVsZHM6e19pZDogMX19KVxuXHRcdFx0bXlPcmdJZHMgPSBteU9yZ3MubWFwIChuKSAtPlxuXHRcdFx0XHRyZXR1cm4gbi5faWRcblx0XHRcdHVubGVzcyBteU9yZ0lkcy5sZW5ndGhcblx0XHRcdFx0cmV0dXJuIHJlVmFsdWVcblx0XHRcdFxuXHRcdFx0bXlMaXRtaXRPcmdJZHMgPSBbXVxuXHRcdFx0Zm9yIGxpbWl0IGluIGxpbWl0c1xuXHRcdFx0XHRmcm9tcyA9IGxpbWl0LmZyb21zXG5cdFx0XHRcdHRvcyA9IGxpbWl0LnRvc1xuXHRcdFx0XHRmcm9tc0NoaWxkcmVuID0gZGIub3JnYW5pemF0aW9ucy5maW5kKHtzcGFjZTogc3BhY2UsIHBhcmVudHM6IHskaW46IGZyb21zfX0sIHtmaWVsZHM6e19pZDogMX19KVxuXHRcdFx0XHRmcm9tc0NoaWxkcmVuSWRzID0gZnJvbXNDaGlsZHJlbj8ubWFwIChuKSAtPlxuXHRcdFx0XHRcdHJldHVybiBuLl9pZFxuXHRcdFx0XHRmb3IgbXlPcmdJZCBpbiBteU9yZ0lkc1xuXHRcdFx0XHRcdHRlbXBJc0xpbWl0ID0gZmFsc2Vcblx0XHRcdFx0XHRpZiBmcm9tcy5pbmRleE9mKG15T3JnSWQpID4gLTFcblx0XHRcdFx0XHRcdHRlbXBJc0xpbWl0ID0gdHJ1ZVxuXHRcdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRcdGlmIGZyb21zQ2hpbGRyZW5JZHMuaW5kZXhPZihteU9yZ0lkKSA+IC0xXG5cdFx0XHRcdFx0XHRcdHRlbXBJc0xpbWl0ID0gdHJ1ZVxuXHRcdFx0XHRcdGlmIHRlbXBJc0xpbWl0XG5cdFx0XHRcdFx0XHRpc0xpbWl0ID0gdHJ1ZVxuXHRcdFx0XHRcdFx0b3V0c2lkZV9vcmdhbml6YXRpb25zLnB1c2ggdG9zXG5cdFx0XHRcdFx0XHRteUxpdG1pdE9yZ0lkcy5wdXNoIG15T3JnSWRcblxuXHRcdFx0bXlMaXRtaXRPcmdJZHMgPSBfLnVuaXEgbXlMaXRtaXRPcmdJZHNcblx0XHRcdGlmIG15TGl0bWl0T3JnSWRzLmxlbmd0aCA8IG15T3JnSWRzLmxlbmd0aFxuXHRcdFx0XHQjIOWmguaenOWPl+mZkOeahOe7hOe7h+S4quaVsOWwj+S6jueUqOaIt+aJgOWxnue7hOe7h+eahOS4quaVsO+8jOWImeivtOaYjuW9k+WJjeeUqOaIt+iHs+WwkeacieS4gOS4que7hOe7h+aYr+S4jeWPl+mZkOeahFxuXHRcdFx0XHRpc0xpbWl0ID0gZmFsc2Vcblx0XHRcdFx0b3V0c2lkZV9vcmdhbml6YXRpb25zID0gW11cblx0XHRcdGVsc2Vcblx0XHRcdFx0b3V0c2lkZV9vcmdhbml6YXRpb25zID0gXy51bmlxIF8uZmxhdHRlbiBvdXRzaWRlX29yZ2FuaXphdGlvbnNcblxuXHRcdGlmIGlzTGltaXRcblx0XHRcdHRvT3JncyA9IGRiLm9yZ2FuaXphdGlvbnMuZmluZCh7c3BhY2U6IHNwYWNlLCBfaWQ6IHskaW46IG91dHNpZGVfb3JnYW5pemF0aW9uc319LCB7ZmllbGRzOntfaWQ6IDEsIHBhcmVudHM6IDF9fSkuZmV0Y2goKVxuXHRcdFx0IyDmiopvdXRzaWRlX29yZ2FuaXphdGlvbnPkuK3mnInniLblrZDoioLngrnlhbPns7vnmoToioLngrnnrZvpgInlh7rmnaXlubblj5blh7rmnIDlpJblsYLoioLngrlcblx0XHRcdCMg5oqKb3V0c2lkZV9vcmdhbml6YXRpb25z5Lit5pyJ5bGe5LqO55So5oi35omA5bGe57uE57uH55qE5a2Q5a2Z6IqC54K555qE6IqC54K55Yig6ZmkXG5cdFx0XHRvcmdzID0gXy5maWx0ZXIgdG9PcmdzLCAob3JnKSAtPlxuXHRcdFx0XHRwYXJlbnRzID0gb3JnLnBhcmVudHMgb3IgW11cblx0XHRcdFx0cmV0dXJuIF8uaW50ZXJzZWN0aW9uKHBhcmVudHMsIG91dHNpZGVfb3JnYW5pemF0aW9ucykubGVuZ3RoIDwgMSBhbmQgXy5pbnRlcnNlY3Rpb24ocGFyZW50cywgbXlPcmdJZHMpLmxlbmd0aCA8IDFcblx0XHRcdG91dHNpZGVfb3JnYW5pemF0aW9ucyA9IG9yZ3MubWFwIChuKSAtPlxuXHRcdFx0XHRyZXR1cm4gbi5faWRcblxuXHRcdHJlVmFsdWUuaXNMaW1pdCA9IGlzTGltaXRcblx0XHRyZVZhbHVlLm91dHNpZGVfb3JnYW5pemF0aW9ucyA9IG91dHNpZGVfb3JnYW5pemF0aW9uc1xuXHRcdHJldHVybiByZVZhbHVlXG4iLCJNZXRlb3IubWV0aG9kcyh7XG4gIGdldF9jb250YWN0c19saW1pdDogZnVuY3Rpb24oc3BhY2UpIHtcbiAgICB2YXIgZnJvbXMsIGZyb21zQ2hpbGRyZW4sIGZyb21zQ2hpbGRyZW5JZHMsIGksIGlzTGltaXQsIGosIGxlbiwgbGVuMSwgbGltaXQsIGxpbWl0cywgbXlMaXRtaXRPcmdJZHMsIG15T3JnSWQsIG15T3JnSWRzLCBteU9yZ3MsIG9yZ3MsIG91dHNpZGVfb3JnYW5pemF0aW9ucywgcmVWYWx1ZSwgc2V0dGluZywgdGVtcElzTGltaXQsIHRvT3JncywgdG9zO1xuICAgIGNoZWNrKHNwYWNlLCBTdHJpbmcpO1xuICAgIHJlVmFsdWUgPSB7XG4gICAgICBpc0xpbWl0OiB0cnVlLFxuICAgICAgb3V0c2lkZV9vcmdhbml6YXRpb25zOiBbXVxuICAgIH07XG4gICAgaWYgKCF0aGlzLnVzZXJJZCkge1xuICAgICAgcmV0dXJuIHJlVmFsdWU7XG4gICAgfVxuICAgIGlzTGltaXQgPSBmYWxzZTtcbiAgICBvdXRzaWRlX29yZ2FuaXphdGlvbnMgPSBbXTtcbiAgICBzZXR0aW5nID0gZGIuc3BhY2Vfc2V0dGluZ3MuZmluZE9uZSh7XG4gICAgICBzcGFjZTogc3BhY2UsXG4gICAgICBrZXk6IFwiY29udGFjdHNfdmlld19saW1pdHNcIlxuICAgIH0pO1xuICAgIGxpbWl0cyA9IChzZXR0aW5nICE9IG51bGwgPyBzZXR0aW5nLnZhbHVlcyA6IHZvaWQgMCkgfHwgW107XG4gICAgaWYgKGxpbWl0cy5sZW5ndGgpIHtcbiAgICAgIG15T3JncyA9IGRiLm9yZ2FuaXphdGlvbnMuZmluZCh7XG4gICAgICAgIHNwYWNlOiBzcGFjZSxcbiAgICAgICAgdXNlcnM6IHRoaXMudXNlcklkXG4gICAgICB9LCB7XG4gICAgICAgIGZpZWxkczoge1xuICAgICAgICAgIF9pZDogMVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIG15T3JnSWRzID0gbXlPcmdzLm1hcChmdW5jdGlvbihuKSB7XG4gICAgICAgIHJldHVybiBuLl9pZDtcbiAgICAgIH0pO1xuICAgICAgaWYgKCFteU9yZ0lkcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHJlVmFsdWU7XG4gICAgICB9XG4gICAgICBteUxpdG1pdE9yZ0lkcyA9IFtdO1xuICAgICAgZm9yIChpID0gMCwgbGVuID0gbGltaXRzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGxpbWl0ID0gbGltaXRzW2ldO1xuICAgICAgICBmcm9tcyA9IGxpbWl0LmZyb21zO1xuICAgICAgICB0b3MgPSBsaW1pdC50b3M7XG4gICAgICAgIGZyb21zQ2hpbGRyZW4gPSBkYi5vcmdhbml6YXRpb25zLmZpbmQoe1xuICAgICAgICAgIHNwYWNlOiBzcGFjZSxcbiAgICAgICAgICBwYXJlbnRzOiB7XG4gICAgICAgICAgICAkaW46IGZyb21zXG4gICAgICAgICAgfVxuICAgICAgICB9LCB7XG4gICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICBfaWQ6IDFcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBmcm9tc0NoaWxkcmVuSWRzID0gZnJvbXNDaGlsZHJlbiAhPSBudWxsID8gZnJvbXNDaGlsZHJlbi5tYXAoZnVuY3Rpb24obikge1xuICAgICAgICAgIHJldHVybiBuLl9pZDtcbiAgICAgICAgfSkgOiB2b2lkIDA7XG4gICAgICAgIGZvciAoaiA9IDAsIGxlbjEgPSBteU9yZ0lkcy5sZW5ndGg7IGogPCBsZW4xOyBqKyspIHtcbiAgICAgICAgICBteU9yZ0lkID0gbXlPcmdJZHNbal07XG4gICAgICAgICAgdGVtcElzTGltaXQgPSBmYWxzZTtcbiAgICAgICAgICBpZiAoZnJvbXMuaW5kZXhPZihteU9yZ0lkKSA+IC0xKSB7XG4gICAgICAgICAgICB0ZW1wSXNMaW1pdCA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChmcm9tc0NoaWxkcmVuSWRzLmluZGV4T2YobXlPcmdJZCkgPiAtMSkge1xuICAgICAgICAgICAgICB0ZW1wSXNMaW1pdCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0ZW1wSXNMaW1pdCkge1xuICAgICAgICAgICAgaXNMaW1pdCA9IHRydWU7XG4gICAgICAgICAgICBvdXRzaWRlX29yZ2FuaXphdGlvbnMucHVzaCh0b3MpO1xuICAgICAgICAgICAgbXlMaXRtaXRPcmdJZHMucHVzaChteU9yZ0lkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG15TGl0bWl0T3JnSWRzID0gXy51bmlxKG15TGl0bWl0T3JnSWRzKTtcbiAgICAgIGlmIChteUxpdG1pdE9yZ0lkcy5sZW5ndGggPCBteU9yZ0lkcy5sZW5ndGgpIHtcbiAgICAgICAgaXNMaW1pdCA9IGZhbHNlO1xuICAgICAgICBvdXRzaWRlX29yZ2FuaXphdGlvbnMgPSBbXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dHNpZGVfb3JnYW5pemF0aW9ucyA9IF8udW5pcShfLmZsYXR0ZW4ob3V0c2lkZV9vcmdhbml6YXRpb25zKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc0xpbWl0KSB7XG4gICAgICB0b09yZ3MgPSBkYi5vcmdhbml6YXRpb25zLmZpbmQoe1xuICAgICAgICBzcGFjZTogc3BhY2UsXG4gICAgICAgIF9pZDoge1xuICAgICAgICAgICRpbjogb3V0c2lkZV9vcmdhbml6YXRpb25zXG4gICAgICAgIH1cbiAgICAgIH0sIHtcbiAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgX2lkOiAxLFxuICAgICAgICAgIHBhcmVudHM6IDFcbiAgICAgICAgfVxuICAgICAgfSkuZmV0Y2goKTtcbiAgICAgIG9yZ3MgPSBfLmZpbHRlcih0b09yZ3MsIGZ1bmN0aW9uKG9yZykge1xuICAgICAgICB2YXIgcGFyZW50cztcbiAgICAgICAgcGFyZW50cyA9IG9yZy5wYXJlbnRzIHx8IFtdO1xuICAgICAgICByZXR1cm4gXy5pbnRlcnNlY3Rpb24ocGFyZW50cywgb3V0c2lkZV9vcmdhbml6YXRpb25zKS5sZW5ndGggPCAxICYmIF8uaW50ZXJzZWN0aW9uKHBhcmVudHMsIG15T3JnSWRzKS5sZW5ndGggPCAxO1xuICAgICAgfSk7XG4gICAgICBvdXRzaWRlX29yZ2FuaXphdGlvbnMgPSBvcmdzLm1hcChmdW5jdGlvbihuKSB7XG4gICAgICAgIHJldHVybiBuLl9pZDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZVZhbHVlLmlzTGltaXQgPSBpc0xpbWl0O1xuICAgIHJlVmFsdWUub3V0c2lkZV9vcmdhbml6YXRpb25zID0gb3V0c2lkZV9vcmdhbml6YXRpb25zO1xuICAgIHJldHVybiByZVZhbHVlO1xuICB9XG59KTtcbiIsIk1ldGVvci5tZXRob2RzKHtcbiAgICBzZXRLZXlWYWx1ZTogZnVuY3Rpb24oa2V5LCB2YWx1ZSkge1xuICAgICAgICBjaGVjayhrZXksIFN0cmluZyk7XG4gICAgICAgIGNoZWNrKHZhbHVlLCBPYmplY3QpO1xuXG4gICAgICAgIG9iaiA9IHt9O1xuICAgICAgICBvYmoudXNlciA9IHRoaXMudXNlcklkO1xuICAgICAgICBvYmoua2V5ID0ga2V5O1xuICAgICAgICBvYmoudmFsdWUgPSB2YWx1ZTtcblxuICAgICAgICB2YXIgYyA9IGRiLnN0ZWVkb3Nfa2V5dmFsdWVzLmZpbmQoe1xuICAgICAgICAgICAgdXNlcjogdGhpcy51c2VySWQsXG4gICAgICAgICAgICBrZXk6IGtleVxuICAgICAgICB9KS5jb3VudCgpO1xuICAgICAgICBpZiAoYyA+IDApIHtcbiAgICAgICAgICAgIGRiLnN0ZWVkb3Nfa2V5dmFsdWVzLnVwZGF0ZSh7XG4gICAgICAgICAgICAgICAgdXNlcjogdGhpcy51c2VySWQsXG4gICAgICAgICAgICAgICAga2V5OiBrZXlcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAkc2V0OiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGIuc3RlZWRvc19rZXl2YWx1ZXMuaW5zZXJ0KG9iaik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59KSIsIk1ldGVvci5tZXRob2RzXG5cdGJpbGxpbmdfc2V0dGxldXA6IChhY2NvdW50aW5nX21vbnRoLCBzcGFjZV9pZD1cIlwiKS0+XG5cdFx0Y2hlY2soYWNjb3VudGluZ19tb250aCwgU3RyaW5nKVxuXHRcdGNoZWNrKHNwYWNlX2lkLCBTdHJpbmcpXG5cblx0XHR1c2VyID0gZGIudXNlcnMuZmluZE9uZSh7X2lkOiB0aGlzLnVzZXJJZH0sIHtmaWVsZHM6IHtpc19jbG91ZGFkbWluOiAxfX0pXG5cblx0XHRpZiBub3QgdXNlci5pc19jbG91ZGFkbWluXG5cdFx0XHRyZXR1cm5cblxuXHRcdGNvbnNvbGUudGltZSAnYmlsbGluZydcblx0XHRzcGFjZXMgPSBbXVxuXHRcdGlmIHNwYWNlX2lkXG5cdFx0XHRzcGFjZXMgPSBkYi5zcGFjZXMuZmluZCh7X2lkOiBzcGFjZV9pZCwgaXNfcGFpZDogdHJ1ZX0sIHtmaWVsZHM6IHtfaWQ6IDF9fSlcblx0XHRlbHNlXG5cdFx0XHRzcGFjZXMgPSBkYi5zcGFjZXMuZmluZCh7aXNfcGFpZDogdHJ1ZX0sIHtmaWVsZHM6IHtfaWQ6IDF9fSlcblx0XHRyZXN1bHQgPSBbXVxuXHRcdHNwYWNlcy5mb3JFYWNoIChzKSAtPlxuXHRcdFx0dHJ5XG5cdFx0XHRcdGJpbGxpbmdNYW5hZ2VyLmNhY3VsYXRlX2J5X2FjY291bnRpbmdfbW9udGgoYWNjb3VudGluZ19tb250aCwgcy5faWQpXG5cdFx0XHRjYXRjaCBlcnJcblx0XHRcdFx0ZSA9IHt9XG5cdFx0XHRcdGUuX2lkID0gcy5faWRcblx0XHRcdFx0ZS5uYW1lID0gcy5uYW1lXG5cdFx0XHRcdGUuZXJyID0gZXJyXG5cdFx0XHRcdHJlc3VsdC5wdXNoIGVcblx0XHRpZiByZXN1bHQubGVuZ3RoID4gMFxuXHRcdFx0Y29uc29sZS5lcnJvciByZXN1bHRcblx0XHRcdHRyeVxuXHRcdFx0XHRFbWFpbCA9IFBhY2thZ2UuZW1haWwuRW1haWxcblx0XHRcdFx0RW1haWwuc2VuZFxuXHRcdFx0XHRcdHRvOiAnc3VwcG9ydEBzdGVlZG9zLmNvbSdcblx0XHRcdFx0XHRmcm9tOiBBY2NvdW50cy5lbWFpbFRlbXBsYXRlcy5mcm9tXG5cdFx0XHRcdFx0c3ViamVjdDogJ2JpbGxpbmcgc2V0dGxldXAgcmVzdWx0J1xuXHRcdFx0XHRcdHRleHQ6IEpTT04uc3RyaW5naWZ5KCdyZXN1bHQnOiByZXN1bHQpXG5cdFx0XHRjYXRjaCBlcnJcblx0XHRcdFx0Y29uc29sZS5lcnJvciBlcnJcblx0XHRjb25zb2xlLnRpbWVFbmQgJ2JpbGxpbmcnIiwiTWV0ZW9yLm1ldGhvZHMoe1xuICBiaWxsaW5nX3NldHRsZXVwOiBmdW5jdGlvbihhY2NvdW50aW5nX21vbnRoLCBzcGFjZV9pZCkge1xuICAgIHZhciBFbWFpbCwgZXJyLCByZXN1bHQsIHNwYWNlcywgdXNlcjtcbiAgICBpZiAoc3BhY2VfaWQgPT0gbnVsbCkge1xuICAgICAgc3BhY2VfaWQgPSBcIlwiO1xuICAgIH1cbiAgICBjaGVjayhhY2NvdW50aW5nX21vbnRoLCBTdHJpbmcpO1xuICAgIGNoZWNrKHNwYWNlX2lkLCBTdHJpbmcpO1xuICAgIHVzZXIgPSBkYi51c2Vycy5maW5kT25lKHtcbiAgICAgIF9pZDogdGhpcy51c2VySWRcbiAgICB9LCB7XG4gICAgICBmaWVsZHM6IHtcbiAgICAgICAgaXNfY2xvdWRhZG1pbjogMVxuICAgICAgfVxuICAgIH0pO1xuICAgIGlmICghdXNlci5pc19jbG91ZGFkbWluKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnNvbGUudGltZSgnYmlsbGluZycpO1xuICAgIHNwYWNlcyA9IFtdO1xuICAgIGlmIChzcGFjZV9pZCkge1xuICAgICAgc3BhY2VzID0gZGIuc3BhY2VzLmZpbmQoe1xuICAgICAgICBfaWQ6IHNwYWNlX2lkLFxuICAgICAgICBpc19wYWlkOiB0cnVlXG4gICAgICB9LCB7XG4gICAgICAgIGZpZWxkczoge1xuICAgICAgICAgIF9pZDogMVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3BhY2VzID0gZGIuc3BhY2VzLmZpbmQoe1xuICAgICAgICBpc19wYWlkOiB0cnVlXG4gICAgICB9LCB7XG4gICAgICAgIGZpZWxkczoge1xuICAgICAgICAgIF9pZDogMVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmVzdWx0ID0gW107XG4gICAgc3BhY2VzLmZvckVhY2goZnVuY3Rpb24ocykge1xuICAgICAgdmFyIGUsIGVycjtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBiaWxsaW5nTWFuYWdlci5jYWN1bGF0ZV9ieV9hY2NvdW50aW5nX21vbnRoKGFjY291bnRpbmdfbW9udGgsIHMuX2lkKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGVyciA9IGVycm9yO1xuICAgICAgICBlID0ge307XG4gICAgICAgIGUuX2lkID0gcy5faWQ7XG4gICAgICAgIGUubmFtZSA9IHMubmFtZTtcbiAgICAgICAgZS5lcnIgPSBlcnI7XG4gICAgICAgIHJldHVybiByZXN1bHQucHVzaChlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IocmVzdWx0KTtcbiAgICAgIHRyeSB7XG4gICAgICAgIEVtYWlsID0gUGFja2FnZS5lbWFpbC5FbWFpbDtcbiAgICAgICAgRW1haWwuc2VuZCh7XG4gICAgICAgICAgdG86ICdzdXBwb3J0QHN0ZWVkb3MuY29tJyxcbiAgICAgICAgICBmcm9tOiBBY2NvdW50cy5lbWFpbFRlbXBsYXRlcy5mcm9tLFxuICAgICAgICAgIHN1YmplY3Q6ICdiaWxsaW5nIHNldHRsZXVwIHJlc3VsdCcsXG4gICAgICAgICAgdGV4dDogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgJ3Jlc3VsdCc6IHJlc3VsdFxuICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgZXJyID0gZXJyb3I7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvbnNvbGUudGltZUVuZCgnYmlsbGluZycpO1xuICB9XG59KTtcbiIsIk1ldGVvci5tZXRob2RzXG5cdHNldFVzZXJuYW1lOiAoc3BhY2VfaWQsIHVzZXJuYW1lLCB1c2VyX2lkKSAtPlxuXHRcdGNoZWNrKHNwYWNlX2lkLCBTdHJpbmcpO1xuXHRcdGNoZWNrKHVzZXJuYW1lLCBTdHJpbmcpO1xuXG5cdFx0aWYgIVN0ZWVkb3MuaXNTcGFjZUFkbWluKHNwYWNlX2lkLCBNZXRlb3IudXNlcklkKCkpIGFuZCB1c2VyX2lkXG5cdFx0XHR0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKDQwMCwgJ2NvbnRhY3Rfc3BhY2VfdXNlcl9uZWVkZWQnKVxuXG5cdFx0aWYgbm90IE1ldGVvci51c2VySWQoKVxuXHRcdFx0dGhyb3cgbmV3IE1ldGVvci5FcnJvcig0MDAsJ2Vycm9yLWludmFsaWQtdXNlcicpXG5cblx0XHR1bmxlc3MgdXNlcl9pZFxuXHRcdFx0dXNlcl9pZCA9IE1ldGVvci51c2VyKCkuX2lkXG5cblx0XHRzcGFjZVVzZXIgPSBkYi5zcGFjZV91c2Vycy5maW5kT25lKHt1c2VyOiB1c2VyX2lkLCBzcGFjZTogc3BhY2VfaWR9KVxuXG5cdFx0aWYgc3BhY2VVc2VyLmludml0ZV9zdGF0ZSA9PSBcInBlbmRpbmdcIiBvciBzcGFjZVVzZXIuaW52aXRlX3N0YXRlID09IFwicmVmdXNlZFwiXG5cdFx0XHR0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKDQwMCwgXCLor6XnlKjmiLflsJrmnKrlkIzmhI/liqDlhaXor6Xlt6XkvZzljLrvvIzml6Dms5Xkv67mlLnnlKjmiLflkI1cIilcblxuXHRcdGRiLnVzZXJzLnVwZGF0ZSh7X2lkOiB1c2VyX2lkfSwgeyRzZXQ6IHt1c2VybmFtZTogdXNlcm5hbWV9fSlcblxuXHRcdHJldHVybiB1c2VybmFtZVxuIiwiTWV0ZW9yLm1ldGhvZHMoe1xuICBzZXRVc2VybmFtZTogZnVuY3Rpb24oc3BhY2VfaWQsIHVzZXJuYW1lLCB1c2VyX2lkKSB7XG4gICAgdmFyIHNwYWNlVXNlcjtcbiAgICBjaGVjayhzcGFjZV9pZCwgU3RyaW5nKTtcbiAgICBjaGVjayh1c2VybmFtZSwgU3RyaW5nKTtcbiAgICBpZiAoIVN0ZWVkb3MuaXNTcGFjZUFkbWluKHNwYWNlX2lkLCBNZXRlb3IudXNlcklkKCkpICYmIHVzZXJfaWQpIHtcbiAgICAgIHRocm93IG5ldyBNZXRlb3IuRXJyb3IoNDAwLCAnY29udGFjdF9zcGFjZV91c2VyX25lZWRlZCcpO1xuICAgIH1cbiAgICBpZiAoIU1ldGVvci51c2VySWQoKSkge1xuICAgICAgdGhyb3cgbmV3IE1ldGVvci5FcnJvcig0MDAsICdlcnJvci1pbnZhbGlkLXVzZXInKTtcbiAgICB9XG4gICAgaWYgKCF1c2VyX2lkKSB7XG4gICAgICB1c2VyX2lkID0gTWV0ZW9yLnVzZXIoKS5faWQ7XG4gICAgfVxuICAgIHNwYWNlVXNlciA9IGRiLnNwYWNlX3VzZXJzLmZpbmRPbmUoe1xuICAgICAgdXNlcjogdXNlcl9pZCxcbiAgICAgIHNwYWNlOiBzcGFjZV9pZFxuICAgIH0pO1xuICAgIGlmIChzcGFjZVVzZXIuaW52aXRlX3N0YXRlID09PSBcInBlbmRpbmdcIiB8fCBzcGFjZVVzZXIuaW52aXRlX3N0YXRlID09PSBcInJlZnVzZWRcIikge1xuICAgICAgdGhyb3cgbmV3IE1ldGVvci5FcnJvcig0MDAsIFwi6K+l55So5oi35bCa5pyq5ZCM5oSP5Yqg5YWl6K+l5bel5L2c5Yy677yM5peg5rOV5L+u5pS555So5oi35ZCNXCIpO1xuICAgIH1cbiAgICBkYi51c2Vycy51cGRhdGUoe1xuICAgICAgX2lkOiB1c2VyX2lkXG4gICAgfSwge1xuICAgICAgJHNldDoge1xuICAgICAgICB1c2VybmFtZTogdXNlcm5hbWVcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdXNlcm5hbWU7XG4gIH1cbn0pO1xuIiwiTWV0ZW9yLm1ldGhvZHNcblx0YmlsbGluZ19yZWNoYXJnZTogKHRvdGFsX2ZlZSwgc3BhY2VfaWQsIG5ld19pZCwgbW9kdWxlX25hbWVzLCBlbmRfZGF0ZSwgdXNlcl9jb3VudCktPlxuXHRcdGNoZWNrIHRvdGFsX2ZlZSwgTnVtYmVyXG5cdFx0Y2hlY2sgc3BhY2VfaWQsIFN0cmluZyBcblx0XHRjaGVjayBuZXdfaWQsIFN0cmluZyBcblx0XHRjaGVjayBtb2R1bGVfbmFtZXMsIEFycmF5IFxuXHRcdGNoZWNrIGVuZF9kYXRlLCBTdHJpbmcgXG5cdFx0Y2hlY2sgdXNlcl9jb3VudCwgTnVtYmVyIFxuXG5cdFx0dXNlcl9pZCA9IHRoaXMudXNlcklkXG5cblx0XHRsaXN0cHJpY2VzID0gMFxuXHRcdG9yZGVyX2JvZHkgPSBbXVxuXHRcdGRiLm1vZHVsZXMuZmluZCh7bmFtZTogeyRpbjogbW9kdWxlX25hbWVzfX0pLmZvckVhY2ggKG0pLT5cblx0XHRcdGxpc3RwcmljZXMgKz0gbS5saXN0cHJpY2Vfcm1iXG5cdFx0XHRvcmRlcl9ib2R5LnB1c2ggbS5uYW1lX3poXG5cblx0XHRzcGFjZSA9IGRiLnNwYWNlcy5maW5kT25lKHNwYWNlX2lkKVxuXHRcdGlmIG5vdCBzcGFjZS5pc19wYWlkXG5cdFx0XHRzcGFjZV91c2VyX2NvdW50ID0gZGIuc3BhY2VfdXNlcnMuZmluZCh7c3BhY2U6c3BhY2VfaWR9KS5jb3VudCgpXG5cdFx0XHRvbmVfbW9udGhfeXVhbiA9IHNwYWNlX3VzZXJfY291bnQgKiBsaXN0cHJpY2VzXG5cdFx0XHRpZiB0b3RhbF9mZWUgPCBvbmVfbW9udGhfeXVhbioxMDBcblx0XHRcdFx0dGhyb3cgbmV3IE1ldGVvci5FcnJvciAnZXJyb3IhJywgXCLlhYXlgLzph5Hpop3lupTkuI3lsJHkuo7kuIDkuKrmnIjmiYDpnIDotLnnlKjvvJrvv6Uje29uZV9tb250aF95dWFufVwiXG5cblx0XHRyZXN1bHRfb2JqID0ge31cblxuXHRcdGF0dGFjaCA9IHt9XG5cdFx0YXR0YWNoLmNvZGVfdXJsX2lkID0gbmV3X2lkXG5cdFx0V1hQYXkgPSByZXF1aXJlKCd3ZWl4aW4tcGF5JylcblxuXHRcdHd4cGF5ID0gV1hQYXkoe1xuXHRcdFx0YXBwaWQ6IE1ldGVvci5zZXR0aW5ncy5iaWxsaW5nLmFwcGlkLFxuXHRcdFx0bWNoX2lkOiBNZXRlb3Iuc2V0dGluZ3MuYmlsbGluZy5tY2hfaWQsXG5cdFx0XHRwYXJ0bmVyX2tleTogTWV0ZW9yLnNldHRpbmdzLmJpbGxpbmcucGFydG5lcl9rZXkgI+W+ruS/oeWVhuaIt+W5s+WPsEFQSeWvhumSpVxuXHRcdH0pXG5cblx0XHR3eHBheS5jcmVhdGVVbmlmaWVkT3JkZXIoe1xuXHRcdFx0Ym9keTogb3JkZXJfYm9keS5qb2luKFwiLFwiKSxcblx0XHRcdG91dF90cmFkZV9ubzogbW9tZW50KCkuZm9ybWF0KCdZWVlZTU1EREhIbW1zc1NTUycpLFxuXHRcdFx0dG90YWxfZmVlOiB0b3RhbF9mZWUsXG5cdFx0XHRzcGJpbGxfY3JlYXRlX2lwOiAnMTI3LjAuMC4xJyxcblx0XHRcdG5vdGlmeV91cmw6IE1ldGVvci5hYnNvbHV0ZVVybCgpICsgJ2FwaS9iaWxsaW5nL3JlY2hhcmdlL25vdGlmeScsXG5cdFx0XHR0cmFkZV90eXBlOiAnTkFUSVZFJyxcblx0XHRcdHByb2R1Y3RfaWQ6IG1vbWVudCgpLmZvcm1hdCgnWVlZWU1NRERISG1tc3NTU1MnKSxcblx0XHRcdGF0dGFjaDogSlNPTi5zdHJpbmdpZnkoYXR0YWNoKVxuXHRcdH0sIE1ldGVvci5iaW5kRW52aXJvbm1lbnQoKChlcnIsIHJlc3VsdCkgLT4gXG5cdFx0XHRcdGlmIGVyciBcblx0XHRcdFx0XHRjb25zb2xlLmVycm9yIGVyci5zdGFja1xuXHRcdFx0XHRpZiByZXN1bHRcblx0XHRcdFx0XHRvYmogPSB7fVxuXHRcdFx0XHRcdG9iai5faWQgPSBuZXdfaWRcblx0XHRcdFx0XHRvYmouY3JlYXRlZCA9IG5ldyBEYXRlXG5cdFx0XHRcdFx0b2JqLmluZm8gPSByZXN1bHRcblx0XHRcdFx0XHRvYmoudG90YWxfZmVlID0gdG90YWxfZmVlXG5cdFx0XHRcdFx0b2JqLmNyZWF0ZWRfYnkgPSB1c2VyX2lkXG5cdFx0XHRcdFx0b2JqLnNwYWNlID0gc3BhY2VfaWRcblx0XHRcdFx0XHRvYmoucGFpZCA9IGZhbHNlXG5cdFx0XHRcdFx0b2JqLm1vZHVsZXMgPSBtb2R1bGVfbmFtZXNcblx0XHRcdFx0XHRvYmouZW5kX2RhdGUgPSBlbmRfZGF0ZVxuXHRcdFx0XHRcdG9iai51c2VyX2NvdW50ID0gdXNlcl9jb3VudFxuXHRcdFx0XHRcdGRiLmJpbGxpbmdfcGF5X3JlY29yZHMuaW5zZXJ0KG9iailcblx0XHRcdCksIChlKS0+XG5cdFx0XHRcdGNvbnNvbGUubG9nICdGYWlsZWQgdG8gYmluZCBlbnZpcm9ubWVudDogYmlsbGluZ19yZWNoYXJnZS5jb2ZmZWUnXG5cdFx0XHRcdGNvbnNvbGUubG9nIGUuc3RhY2tcblx0XHRcdClcblx0XHQpXG5cblx0XHRcblx0XHRyZXR1cm4gXCJzdWNjZXNzXCIiLCJNZXRlb3IubWV0aG9kcyh7XG4gIGJpbGxpbmdfcmVjaGFyZ2U6IGZ1bmN0aW9uKHRvdGFsX2ZlZSwgc3BhY2VfaWQsIG5ld19pZCwgbW9kdWxlX25hbWVzLCBlbmRfZGF0ZSwgdXNlcl9jb3VudCkge1xuICAgIHZhciBXWFBheSwgYXR0YWNoLCBsaXN0cHJpY2VzLCBvbmVfbW9udGhfeXVhbiwgb3JkZXJfYm9keSwgcmVzdWx0X29iaiwgc3BhY2UsIHNwYWNlX3VzZXJfY291bnQsIHVzZXJfaWQsIHd4cGF5O1xuICAgIGNoZWNrKHRvdGFsX2ZlZSwgTnVtYmVyKTtcbiAgICBjaGVjayhzcGFjZV9pZCwgU3RyaW5nKTtcbiAgICBjaGVjayhuZXdfaWQsIFN0cmluZyk7XG4gICAgY2hlY2sobW9kdWxlX25hbWVzLCBBcnJheSk7XG4gICAgY2hlY2soZW5kX2RhdGUsIFN0cmluZyk7XG4gICAgY2hlY2sodXNlcl9jb3VudCwgTnVtYmVyKTtcbiAgICB1c2VyX2lkID0gdGhpcy51c2VySWQ7XG4gICAgbGlzdHByaWNlcyA9IDA7XG4gICAgb3JkZXJfYm9keSA9IFtdO1xuICAgIGRiLm1vZHVsZXMuZmluZCh7XG4gICAgICBuYW1lOiB7XG4gICAgICAgICRpbjogbW9kdWxlX25hbWVzXG4gICAgICB9XG4gICAgfSkuZm9yRWFjaChmdW5jdGlvbihtKSB7XG4gICAgICBsaXN0cHJpY2VzICs9IG0ubGlzdHByaWNlX3JtYjtcbiAgICAgIHJldHVybiBvcmRlcl9ib2R5LnB1c2gobS5uYW1lX3poKTtcbiAgICB9KTtcbiAgICBzcGFjZSA9IGRiLnNwYWNlcy5maW5kT25lKHNwYWNlX2lkKTtcbiAgICBpZiAoIXNwYWNlLmlzX3BhaWQpIHtcbiAgICAgIHNwYWNlX3VzZXJfY291bnQgPSBkYi5zcGFjZV91c2Vycy5maW5kKHtcbiAgICAgICAgc3BhY2U6IHNwYWNlX2lkXG4gICAgICB9KS5jb3VudCgpO1xuICAgICAgb25lX21vbnRoX3l1YW4gPSBzcGFjZV91c2VyX2NvdW50ICogbGlzdHByaWNlcztcbiAgICAgIGlmICh0b3RhbF9mZWUgPCBvbmVfbW9udGhfeXVhbiAqIDEwMCkge1xuICAgICAgICB0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKCdlcnJvciEnLCBcIuWFheWAvOmHkemineW6lOS4jeWwkeS6juS4gOS4quaciOaJgOmcgOi0ueeUqO+8mu+/pVwiICsgb25lX21vbnRoX3l1YW4pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXN1bHRfb2JqID0ge307XG4gICAgYXR0YWNoID0ge307XG4gICAgYXR0YWNoLmNvZGVfdXJsX2lkID0gbmV3X2lkO1xuICAgIFdYUGF5ID0gcmVxdWlyZSgnd2VpeGluLXBheScpO1xuICAgIHd4cGF5ID0gV1hQYXkoe1xuICAgICAgYXBwaWQ6IE1ldGVvci5zZXR0aW5ncy5iaWxsaW5nLmFwcGlkLFxuICAgICAgbWNoX2lkOiBNZXRlb3Iuc2V0dGluZ3MuYmlsbGluZy5tY2hfaWQsXG4gICAgICBwYXJ0bmVyX2tleTogTWV0ZW9yLnNldHRpbmdzLmJpbGxpbmcucGFydG5lcl9rZXlcbiAgICB9KTtcbiAgICB3eHBheS5jcmVhdGVVbmlmaWVkT3JkZXIoe1xuICAgICAgYm9keTogb3JkZXJfYm9keS5qb2luKFwiLFwiKSxcbiAgICAgIG91dF90cmFkZV9ubzogbW9tZW50KCkuZm9ybWF0KCdZWVlZTU1EREhIbW1zc1NTUycpLFxuICAgICAgdG90YWxfZmVlOiB0b3RhbF9mZWUsXG4gICAgICBzcGJpbGxfY3JlYXRlX2lwOiAnMTI3LjAuMC4xJyxcbiAgICAgIG5vdGlmeV91cmw6IE1ldGVvci5hYnNvbHV0ZVVybCgpICsgJ2FwaS9iaWxsaW5nL3JlY2hhcmdlL25vdGlmeScsXG4gICAgICB0cmFkZV90eXBlOiAnTkFUSVZFJyxcbiAgICAgIHByb2R1Y3RfaWQ6IG1vbWVudCgpLmZvcm1hdCgnWVlZWU1NRERISG1tc3NTU1MnKSxcbiAgICAgIGF0dGFjaDogSlNPTi5zdHJpbmdpZnkoYXR0YWNoKVxuICAgIH0sIE1ldGVvci5iaW5kRW52aXJvbm1lbnQoKGZ1bmN0aW9uKGVyciwgcmVzdWx0KSB7XG4gICAgICB2YXIgb2JqO1xuICAgICAgaWYgKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVyci5zdGFjayk7XG4gICAgICB9XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIG9iaiA9IHt9O1xuICAgICAgICBvYmouX2lkID0gbmV3X2lkO1xuICAgICAgICBvYmouY3JlYXRlZCA9IG5ldyBEYXRlO1xuICAgICAgICBvYmouaW5mbyA9IHJlc3VsdDtcbiAgICAgICAgb2JqLnRvdGFsX2ZlZSA9IHRvdGFsX2ZlZTtcbiAgICAgICAgb2JqLmNyZWF0ZWRfYnkgPSB1c2VyX2lkO1xuICAgICAgICBvYmouc3BhY2UgPSBzcGFjZV9pZDtcbiAgICAgICAgb2JqLnBhaWQgPSBmYWxzZTtcbiAgICAgICAgb2JqLm1vZHVsZXMgPSBtb2R1bGVfbmFtZXM7XG4gICAgICAgIG9iai5lbmRfZGF0ZSA9IGVuZF9kYXRlO1xuICAgICAgICBvYmoudXNlcl9jb3VudCA9IHVzZXJfY291bnQ7XG4gICAgICAgIHJldHVybiBkYi5iaWxsaW5nX3BheV9yZWNvcmRzLmluc2VydChvYmopO1xuICAgICAgfVxuICAgIH0pLCBmdW5jdGlvbihlKSB7XG4gICAgICBjb25zb2xlLmxvZygnRmFpbGVkIHRvIGJpbmQgZW52aXJvbm1lbnQ6IGJpbGxpbmdfcmVjaGFyZ2UuY29mZmVlJyk7XG4gICAgICByZXR1cm4gY29uc29sZS5sb2coZS5zdGFjayk7XG4gICAgfSkpO1xuICAgIHJldHVybiBcInN1Y2Nlc3NcIjtcbiAgfVxufSk7XG4iLCJNZXRlb3IubWV0aG9kc1xuXHRnZXRfc3BhY2VfdXNlcl9jb3VudDogKHNwYWNlX2lkKS0+XG5cdFx0Y2hlY2sgc3BhY2VfaWQsIFN0cmluZ1xuXHRcdHVzZXJfY291bnRfaW5mbyA9IG5ldyBPYmplY3Rcblx0XHR1c2VyX2NvdW50X2luZm8udG90YWxfdXNlcl9jb3VudCA9IGRiLnNwYWNlX3VzZXJzLmZpbmQoe3NwYWNlOiBzcGFjZV9pZH0pLmNvdW50KClcblx0XHR1c2VyX2NvdW50X2luZm8uYWNjZXB0ZWRfdXNlcl9jb3VudCA9IGRiLnNwYWNlX3VzZXJzLmZpbmQoe3NwYWNlOiBzcGFjZV9pZCwgdXNlcl9hY2NlcHRlZDogdHJ1ZX0pLmNvdW50KClcblx0XHRyZXR1cm4gdXNlcl9jb3VudF9pbmZvIiwiTWV0ZW9yLm1ldGhvZHNcblx0Y3JlYXRlX3NlY3JldDogKG5hbWUpLT5cblx0XHRpZiAhdGhpcy51c2VySWRcblx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdGRiLnVzZXJzLmNyZWF0ZV9zZWNyZXQgdGhpcy51c2VySWQsIG5hbWVcblxuXHRyZW1vdmVfc2VjcmV0OiAodG9rZW4pLT5cblx0XHRpZiAhdGhpcy51c2VySWQgfHwgIXRva2VuXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHRoYXNoZWRUb2tlbiA9IEFjY291bnRzLl9oYXNoTG9naW5Ub2tlbih0b2tlbilcblxuXHRcdGNvbnNvbGUubG9nKFwidG9rZW5cIiwgdG9rZW4pXG5cblx0XHRkYi51c2Vycy51cGRhdGUoe19pZDogdGhpcy51c2VySWR9LCB7JHB1bGw6IHtcInNlY3JldHNcIjoge2hhc2hlZFRva2VuOiBoYXNoZWRUb2tlbn19fSlcbiIsIk1ldGVvci5tZXRob2RzKHtcbiAgY3JlYXRlX3NlY3JldDogZnVuY3Rpb24obmFtZSkge1xuICAgIGlmICghdGhpcy51c2VySWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGRiLnVzZXJzLmNyZWF0ZV9zZWNyZXQodGhpcy51c2VySWQsIG5hbWUpO1xuICB9LFxuICByZW1vdmVfc2VjcmV0OiBmdW5jdGlvbih0b2tlbikge1xuICAgIHZhciBoYXNoZWRUb2tlbjtcbiAgICBpZiAoIXRoaXMudXNlcklkIHx8ICF0b2tlbikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBoYXNoZWRUb2tlbiA9IEFjY291bnRzLl9oYXNoTG9naW5Ub2tlbih0b2tlbik7XG4gICAgY29uc29sZS5sb2coXCJ0b2tlblwiLCB0b2tlbik7XG4gICAgcmV0dXJuIGRiLnVzZXJzLnVwZGF0ZSh7XG4gICAgICBfaWQ6IHRoaXMudXNlcklkXG4gICAgfSwge1xuICAgICAgJHB1bGw6IHtcbiAgICAgICAgXCJzZWNyZXRzXCI6IHtcbiAgICAgICAgICBoYXNoZWRUb2tlbjogaGFzaGVkVG9rZW5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG59KTtcbiIsIk1ldGVvci5tZXRob2RzXG4gICAgJ29iamVjdF93b3JrZmxvd3MuZ2V0JzogKHNwYWNlSWQsIHVzZXJJZCkgLT5cbiAgICAgICAgY2hlY2sgc3BhY2VJZCwgU3RyaW5nXG4gICAgICAgIGNoZWNrIHVzZXJJZCwgU3RyaW5nXG5cbiAgICAgICAgY3VyU3BhY2VVc2VyID0gQ3JlYXRvci5Db2xsZWN0aW9uc1tcInNwYWNlX3VzZXJzXCJdLmZpbmRPbmUoe3NwYWNlOiBzcGFjZUlkLCB1c2VyOiB1c2VySWR9LCB7ZmllbGRzOiB7b3JnYW5pemF0aW9uczogMX19KVxuICAgICAgICBpZiAhY3VyU3BhY2VVc2VyXG4gICAgICAgICAgICB0aHJvdyBuZXcgTWV0ZW9yLkVycm9yICdub3QtYXV0aG9yaXplZCdcblxuICAgICAgICBvcmdhbml6YXRpb25zID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKCdvcmdhbml6YXRpb25zJykuZmluZCh7XG4gICAgICAgICAgICBfaWQ6IHtcbiAgICAgICAgICAgICAgICAkaW46IGN1clNwYWNlVXNlci5vcmdhbml6YXRpb25zXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHtmaWVsZHM6IHtwYXJlbnRzOiAxfX0pLmZldGNoKClcblxuICAgICAgICBvd3MgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oJ29iamVjdF93b3JrZmxvd3MnKS5maW5kKHsgc3BhY2U6IHNwYWNlSWQgfSwgeyBmaWVsZHM6IHsgb2JqZWN0X25hbWU6IDEsIGZsb3dfaWQ6IDEsIHNwYWNlOiAxIH0gfSkuZmV0Y2goKVxuICAgICAgICBfLmVhY2ggb3dzLChvKSAtPlxuICAgICAgICAgICAgZmwgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oJ2Zsb3dzJykuZmluZE9uZShvLmZsb3dfaWQsIHsgZmllbGRzOiB7IG5hbWU6IDEsIHBlcm1zOiAxIH0gfSlcbiAgICAgICAgICAgIGlmIGZsXG4gICAgICAgICAgICAgICAgby5mbG93X25hbWUgPSBmbC5uYW1lXG4gICAgICAgICAgICAgICAgby5jYW5fYWRkID0gZmFsc2VcblxuICAgICAgICAgICAgICAgIHBlcm1zID0gZmwucGVybXNcbiAgICAgICAgICAgICAgICBpZiBwZXJtc1xuICAgICAgICAgICAgICAgICAgICBpZiBwZXJtcy51c2Vyc19jYW5fYWRkICYmIHBlcm1zLnVzZXJzX2Nhbl9hZGQuaW5jbHVkZXModXNlcklkKVxuICAgICAgICAgICAgICAgICAgICAgICAgby5jYW5fYWRkID0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIHBlcm1zLm9yZ3NfY2FuX2FkZCAmJiBwZXJtcy5vcmdzX2Nhbl9hZGQubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgY3VyU3BhY2VVc2VyICYmIGN1clNwYWNlVXNlci5vcmdhbml6YXRpb25zICYmIF8uaW50ZXJzZWN0aW9uKGN1clNwYWNlVXNlci5vcmdhbml6YXRpb25zLCBwZXJtcy5vcmdzX2Nhbl9hZGQpLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmNhbl9hZGQgPSB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgb3JnYW5pemF0aW9uc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmNhbl9hZGQgPSBfLnNvbWUgb3JnYW5pemF0aW9ucywgKG9yZyktPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yZy5wYXJlbnRzICYmIF8uaW50ZXJzZWN0aW9uKG9yZy5wYXJlbnRzLCBwZXJtcy5vcmdzX2Nhbl9hZGQpLmxlbmd0aCA+IDBcblxuICAgICAgICBvd3MgPSBvd3MuZmlsdGVyIChuKS0+XG4gICAgICAgICAgICByZXR1cm4gbi5mbG93X25hbWVcblxuICAgICAgICByZXR1cm4gb3dzIiwiTWV0ZW9yLm1ldGhvZHMoe1xuICAnb2JqZWN0X3dvcmtmbG93cy5nZXQnOiBmdW5jdGlvbihzcGFjZUlkLCB1c2VySWQpIHtcbiAgICB2YXIgY3VyU3BhY2VVc2VyLCBvcmdhbml6YXRpb25zLCBvd3M7XG4gICAgY2hlY2soc3BhY2VJZCwgU3RyaW5nKTtcbiAgICBjaGVjayh1c2VySWQsIFN0cmluZyk7XG4gICAgY3VyU3BhY2VVc2VyID0gQ3JlYXRvci5Db2xsZWN0aW9uc1tcInNwYWNlX3VzZXJzXCJdLmZpbmRPbmUoe1xuICAgICAgc3BhY2U6IHNwYWNlSWQsXG4gICAgICB1c2VyOiB1c2VySWRcbiAgICB9LCB7XG4gICAgICBmaWVsZHM6IHtcbiAgICAgICAgb3JnYW5pemF0aW9uczogMVxuICAgICAgfVxuICAgIH0pO1xuICAgIGlmICghY3VyU3BhY2VVc2VyKSB7XG4gICAgICB0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKCdub3QtYXV0aG9yaXplZCcpO1xuICAgIH1cbiAgICBvcmdhbml6YXRpb25zID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKCdvcmdhbml6YXRpb25zJykuZmluZCh7XG4gICAgICBfaWQ6IHtcbiAgICAgICAgJGluOiBjdXJTcGFjZVVzZXIub3JnYW5pemF0aW9uc1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGZpZWxkczoge1xuICAgICAgICBwYXJlbnRzOiAxXG4gICAgICB9XG4gICAgfSkuZmV0Y2goKTtcbiAgICBvd3MgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oJ29iamVjdF93b3JrZmxvd3MnKS5maW5kKHtcbiAgICAgIHNwYWNlOiBzcGFjZUlkXG4gICAgfSwge1xuICAgICAgZmllbGRzOiB7XG4gICAgICAgIG9iamVjdF9uYW1lOiAxLFxuICAgICAgICBmbG93X2lkOiAxLFxuICAgICAgICBzcGFjZTogMVxuICAgICAgfVxuICAgIH0pLmZldGNoKCk7XG4gICAgXy5lYWNoKG93cywgZnVuY3Rpb24obykge1xuICAgICAgdmFyIGZsLCBwZXJtcztcbiAgICAgIGZsID0gQ3JlYXRvci5nZXRDb2xsZWN0aW9uKCdmbG93cycpLmZpbmRPbmUoby5mbG93X2lkLCB7XG4gICAgICAgIGZpZWxkczoge1xuICAgICAgICAgIG5hbWU6IDEsXG4gICAgICAgICAgcGVybXM6IDFcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAoZmwpIHtcbiAgICAgICAgby5mbG93X25hbWUgPSBmbC5uYW1lO1xuICAgICAgICBvLmNhbl9hZGQgPSBmYWxzZTtcbiAgICAgICAgcGVybXMgPSBmbC5wZXJtcztcbiAgICAgICAgaWYgKHBlcm1zKSB7XG4gICAgICAgICAgaWYgKHBlcm1zLnVzZXJzX2Nhbl9hZGQgJiYgcGVybXMudXNlcnNfY2FuX2FkZC5pbmNsdWRlcyh1c2VySWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gby5jYW5fYWRkID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHBlcm1zLm9yZ3NfY2FuX2FkZCAmJiBwZXJtcy5vcmdzX2Nhbl9hZGQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKGN1clNwYWNlVXNlciAmJiBjdXJTcGFjZVVzZXIub3JnYW5pemF0aW9ucyAmJiBfLmludGVyc2VjdGlvbihjdXJTcGFjZVVzZXIub3JnYW5pemF0aW9ucywgcGVybXMub3Jnc19jYW5fYWRkKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIHJldHVybiBvLmNhbl9hZGQgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKG9yZ2FuaXphdGlvbnMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gby5jYW5fYWRkID0gXy5zb21lKG9yZ2FuaXphdGlvbnMsIGZ1bmN0aW9uKG9yZykge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yZy5wYXJlbnRzICYmIF8uaW50ZXJzZWN0aW9uKG9yZy5wYXJlbnRzLCBwZXJtcy5vcmdzX2Nhbl9hZGQpLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBvd3MgPSBvd3MuZmlsdGVyKGZ1bmN0aW9uKG4pIHtcbiAgICAgIHJldHVybiBuLmZsb3dfbmFtZTtcbiAgICB9KTtcbiAgICByZXR1cm4gb3dzO1xuICB9XG59KTtcbiIsIk1ldGVvci5tZXRob2RzXG5cdHNldFNwYWNlVXNlclBhc3N3b3JkOiAoc3BhY2VfdXNlcl9pZCwgc3BhY2VfaWQsIHBhc3N3b3JkKSAtPlxuXHRcdGlmICF0aGlzLnVzZXJJZFxuXHRcdFx0dGhyb3cgbmV3IE1ldGVvci5FcnJvcig0MDAsIFwi6K+35YWI55m75b2VXCIpXG5cdFx0XG5cdFx0c3BhY2UgPSBkYi5zcGFjZXMuZmluZE9uZSh7X2lkOiBzcGFjZV9pZH0pXG5cdFx0aXNTcGFjZUFkbWluID0gc3BhY2U/LmFkbWlucz8uaW5jbHVkZXModGhpcy51c2VySWQpXG5cblx0XHR1bmxlc3MgaXNTcGFjZUFkbWluXG5cdFx0XHR0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKDQwMCwgXCLmgqjmsqHmnInmnYPpmZDkv67mlLnor6XnlKjmiLflr4bnoIFcIilcblxuXHRcdHNwYWNlVXNlciA9IGRiLnNwYWNlX3VzZXJzLmZpbmRPbmUoe19pZDogc3BhY2VfdXNlcl9pZCwgc3BhY2U6IHNwYWNlX2lkfSlcblx0XHR1c2VyX2lkID0gc3BhY2VVc2VyLnVzZXI7XG5cdFx0dXNlckNQID0gZGIudXNlcnMuZmluZE9uZSh7X2lkOiB1c2VyX2lkfSlcblx0XHRjdXJyZW50VXNlciA9IGRiLnVzZXJzLmZpbmRPbmUoe19pZDogdGhpcy51c2VySWR9KVxuXG5cdFx0aWYgc3BhY2VVc2VyLmludml0ZV9zdGF0ZSA9PSBcInBlbmRpbmdcIiBvciBzcGFjZVVzZXIuaW52aXRlX3N0YXRlID09IFwicmVmdXNlZFwiXG5cdFx0XHR0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKDQwMCwgXCLor6XnlKjmiLflsJrmnKrlkIzmhI/liqDlhaXor6Xlt6XkvZzljLrvvIzml6Dms5Xkv67mlLnlr4bnoIFcIilcblxuXHRcdFN0ZWVkb3MudmFsaWRhdGVQYXNzd29yZChwYXNzd29yZClcblx0XHRsb2dvdXQgPSB0cnVlO1xuXHRcdGlmIHRoaXMudXNlcklkID09IHVzZXJfaWRcblx0XHRcdGxvZ291dCA9IGZhbHNlXG5cdFx0QWNjb3VudHMuc2V0UGFzc3dvcmQodXNlcl9pZCwgcGFzc3dvcmQsIHtsb2dvdXQ6IGxvZ291dH0pXG5cdFx0Y2hhbmdlZFVzZXJJbmZvID0gZGIudXNlcnMuZmluZE9uZSh7X2lkOiB1c2VyX2lkfSlcblx0XHRpZiBjaGFuZ2VkVXNlckluZm9cblx0XHRcdGRiLnVzZXJzLnVwZGF0ZSh7X2lkOiB1c2VyX2lkfSwgeyRwdXNoOiB7J3NlcnZpY2VzLnBhc3N3b3JkX2hpc3RvcnknOiBjaGFuZ2VkVXNlckluZm8uc2VydmljZXM/LnBhc3N3b3JkPy5iY3J5cHR9fSlcblxuXHRcdCMg5aaC5p6c55So5oi35omL5py65Y+36YCa6L+H6aqM6K+B77yM5bCx5Y+R55+t5L+h5o+Q6YaSXG5cdFx0aWYgdXNlckNQLm1vYmlsZSAmJiB1c2VyQ1AubW9iaWxlX3ZlcmlmaWVkXG5cdFx0XHRsYW5nID0gJ2VuJ1xuXHRcdFx0aWYgdXNlckNQLmxvY2FsZSBpcyAnemgtY24nXG5cdFx0XHRcdGxhbmcgPSAnemgtQ04nXG5cdFx0XHRTTVNRdWV1ZS5zZW5kXG5cdFx0XHRcdEZvcm1hdDogJ0pTT04nLFxuXHRcdFx0XHRBY3Rpb246ICdTaW5nbGVTZW5kU21zJyxcblx0XHRcdFx0UGFyYW1TdHJpbmc6ICcnLFxuXHRcdFx0XHRSZWNOdW06IHVzZXJDUC5tb2JpbGUsXG5cdFx0XHRcdFNpZ25OYW1lOiAn5Y2O54KO5Yqe5YWsJyxcblx0XHRcdFx0VGVtcGxhdGVDb2RlOiAnU01TXzY3MjAwOTY3Jyxcblx0XHRcdFx0bXNnOiBUQVBpMThuLl9fKCdzbXMuY2hhbmdlX3Bhc3N3b3JkLnRlbXBsYXRlJywge30sIGxhbmcpXG5cbiIsIk1ldGVvci5tZXRob2RzKHtcbiAgc2V0U3BhY2VVc2VyUGFzc3dvcmQ6IGZ1bmN0aW9uKHNwYWNlX3VzZXJfaWQsIHNwYWNlX2lkLCBwYXNzd29yZCkge1xuICAgIHZhciBjaGFuZ2VkVXNlckluZm8sIGN1cnJlbnRVc2VyLCBpc1NwYWNlQWRtaW4sIGxhbmcsIGxvZ291dCwgcmVmLCByZWYxLCByZWYyLCBzcGFjZSwgc3BhY2VVc2VyLCB1c2VyQ1AsIHVzZXJfaWQ7XG4gICAgaWYgKCF0aGlzLnVzZXJJZCkge1xuICAgICAgdGhyb3cgbmV3IE1ldGVvci5FcnJvcig0MDAsIFwi6K+35YWI55m75b2VXCIpO1xuICAgIH1cbiAgICBzcGFjZSA9IGRiLnNwYWNlcy5maW5kT25lKHtcbiAgICAgIF9pZDogc3BhY2VfaWRcbiAgICB9KTtcbiAgICBpc1NwYWNlQWRtaW4gPSBzcGFjZSAhPSBudWxsID8gKHJlZiA9IHNwYWNlLmFkbWlucykgIT0gbnVsbCA/IHJlZi5pbmNsdWRlcyh0aGlzLnVzZXJJZCkgOiB2b2lkIDAgOiB2b2lkIDA7XG4gICAgaWYgKCFpc1NwYWNlQWRtaW4pIHtcbiAgICAgIHRocm93IG5ldyBNZXRlb3IuRXJyb3IoNDAwLCBcIuaCqOayoeacieadg+mZkOS/ruaUueivpeeUqOaIt+WvhueggVwiKTtcbiAgICB9XG4gICAgc3BhY2VVc2VyID0gZGIuc3BhY2VfdXNlcnMuZmluZE9uZSh7XG4gICAgICBfaWQ6IHNwYWNlX3VzZXJfaWQsXG4gICAgICBzcGFjZTogc3BhY2VfaWRcbiAgICB9KTtcbiAgICB1c2VyX2lkID0gc3BhY2VVc2VyLnVzZXI7XG4gICAgdXNlckNQID0gZGIudXNlcnMuZmluZE9uZSh7XG4gICAgICBfaWQ6IHVzZXJfaWRcbiAgICB9KTtcbiAgICBjdXJyZW50VXNlciA9IGRiLnVzZXJzLmZpbmRPbmUoe1xuICAgICAgX2lkOiB0aGlzLnVzZXJJZFxuICAgIH0pO1xuICAgIGlmIChzcGFjZVVzZXIuaW52aXRlX3N0YXRlID09PSBcInBlbmRpbmdcIiB8fCBzcGFjZVVzZXIuaW52aXRlX3N0YXRlID09PSBcInJlZnVzZWRcIikge1xuICAgICAgdGhyb3cgbmV3IE1ldGVvci5FcnJvcig0MDAsIFwi6K+l55So5oi35bCa5pyq5ZCM5oSP5Yqg5YWl6K+l5bel5L2c5Yy677yM5peg5rOV5L+u5pS55a+G56CBXCIpO1xuICAgIH1cbiAgICBTdGVlZG9zLnZhbGlkYXRlUGFzc3dvcmQocGFzc3dvcmQpO1xuICAgIGxvZ291dCA9IHRydWU7XG4gICAgaWYgKHRoaXMudXNlcklkID09PSB1c2VyX2lkKSB7XG4gICAgICBsb2dvdXQgPSBmYWxzZTtcbiAgICB9XG4gICAgQWNjb3VudHMuc2V0UGFzc3dvcmQodXNlcl9pZCwgcGFzc3dvcmQsIHtcbiAgICAgIGxvZ291dDogbG9nb3V0XG4gICAgfSk7XG4gICAgY2hhbmdlZFVzZXJJbmZvID0gZGIudXNlcnMuZmluZE9uZSh7XG4gICAgICBfaWQ6IHVzZXJfaWRcbiAgICB9KTtcbiAgICBpZiAoY2hhbmdlZFVzZXJJbmZvKSB7XG4gICAgICBkYi51c2Vycy51cGRhdGUoe1xuICAgICAgICBfaWQ6IHVzZXJfaWRcbiAgICAgIH0sIHtcbiAgICAgICAgJHB1c2g6IHtcbiAgICAgICAgICAnc2VydmljZXMucGFzc3dvcmRfaGlzdG9yeSc6IChyZWYxID0gY2hhbmdlZFVzZXJJbmZvLnNlcnZpY2VzKSAhPSBudWxsID8gKHJlZjIgPSByZWYxLnBhc3N3b3JkKSAhPSBudWxsID8gcmVmMi5iY3J5cHQgOiB2b2lkIDAgOiB2b2lkIDBcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICh1c2VyQ1AubW9iaWxlICYmIHVzZXJDUC5tb2JpbGVfdmVyaWZpZWQpIHtcbiAgICAgIGxhbmcgPSAnZW4nO1xuICAgICAgaWYgKHVzZXJDUC5sb2NhbGUgPT09ICd6aC1jbicpIHtcbiAgICAgICAgbGFuZyA9ICd6aC1DTic7XG4gICAgICB9XG4gICAgICByZXR1cm4gU01TUXVldWUuc2VuZCh7XG4gICAgICAgIEZvcm1hdDogJ0pTT04nLFxuICAgICAgICBBY3Rpb246ICdTaW5nbGVTZW5kU21zJyxcbiAgICAgICAgUGFyYW1TdHJpbmc6ICcnLFxuICAgICAgICBSZWNOdW06IHVzZXJDUC5tb2JpbGUsXG4gICAgICAgIFNpZ25OYW1lOiAn5Y2O54KO5Yqe5YWsJyxcbiAgICAgICAgVGVtcGxhdGVDb2RlOiAnU01TXzY3MjAwOTY3JyxcbiAgICAgICAgbXNnOiBUQVBpMThuLl9fKCdzbXMuY2hhbmdlX3Bhc3N3b3JkLnRlbXBsYXRlJywge30sIGxhbmcpXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn0pO1xuIiwiYmlsbGluZ01hbmFnZXIgPSB7fVxuXG4jIOiOt+W+l+e7k+eul+WRqOacn+WGheeahOWPr+e7k+eul+aXpeaVsFxuIyBzcGFjZV9pZCDnu5Pnrpflr7nosaHlt6XkvZzljLpcbiMgYWNjb3VudGluZ19tb250aCDnu5PnrpfmnIjvvIzmoLzlvI/vvJpZWVlZTU1cbmJpbGxpbmdNYW5hZ2VyLmdldF9hY2NvdW50aW5nX3BlcmlvZCA9IChzcGFjZV9pZCwgYWNjb3VudGluZ19tb250aCktPlxuXHRjb3VudF9kYXlzID0gMFxuXG5cdGVuZF9kYXRlX3RpbWUgPSBuZXcgRGF0ZShwYXJzZUludChhY2NvdW50aW5nX21vbnRoLnNsaWNlKDAsNCkpLCBwYXJzZUludChhY2NvdW50aW5nX21vbnRoLnNsaWNlKDQsNikpLCAwKVxuXHRlbmRfZGF0ZSA9IG1vbWVudChlbmRfZGF0ZV90aW1lLmdldFRpbWUoKSkuZm9ybWF0KCdZWVlZTU1ERCcpXG5cblx0YmlsbGluZyA9IGRiLmJpbGxpbmdzLmZpbmRPbmUoe3NwYWNlOiBzcGFjZV9pZCwgdHJhbnNhY3Rpb246IFwiU3RhcnRpbmcgYmFsYW5jZVwifSlcblx0Zmlyc3RfZGF0ZSA9IGJpbGxpbmcuYmlsbGluZ19kYXRlXG5cblx0c3RhcnRfZGF0ZSA9IGFjY291bnRpbmdfbW9udGggKyBcIjAxXCJcblx0c3RhcnRfZGF0ZV90aW1lID0gbmV3IERhdGUocGFyc2VJbnQoYWNjb3VudGluZ19tb250aC5zbGljZSgwLDQpKSwgcGFyc2VJbnQoYWNjb3VudGluZ19tb250aC5zbGljZSg0LDYpKSwgMS1lbmRfZGF0ZV90aW1lLmdldERhdGUoKSlcblxuXHRpZiBmaXJzdF9kYXRlID49IGVuZF9kYXRlICMg6L+Z5Liq5pyI5LiN5Zyo5pys5qyh57uT566X6IyD5Zu05LmL5YaF77yMY291bnRfZGF5cz0wXG5cdFx0IyBkbyBub3RoaW5nXG5cdGVsc2UgaWYgc3RhcnRfZGF0ZSA8PSBmaXJzdF9kYXRlIGFuZCBmaXJzdF9kYXRlIDwgZW5kX2RhdGVcblx0XHRjb3VudF9kYXlzID0gKGVuZF9kYXRlX3RpbWUgLSBzdGFydF9kYXRlX3RpbWUpLygyNCo2MCo2MCoxMDAwKSArIDFcblx0ZWxzZSBpZiBmaXJzdF9kYXRlIDwgc3RhcnRfZGF0ZVxuXHRcdGNvdW50X2RheXMgPSAoZW5kX2RhdGVfdGltZSAtIHN0YXJ0X2RhdGVfdGltZSkvKDI0KjYwKjYwKjEwMDApICsgMVxuXG5cdHJldHVybiB7XCJjb3VudF9kYXlzXCI6IGNvdW50X2RheXN9XG5cbiMg6YeN566X6L+Z5LiA5pel55qE5L2Z6aKdXG5iaWxsaW5nTWFuYWdlci5yZWZyZXNoX2JhbGFuY2UgPSAoc3BhY2VfaWQsIHJlZnJlc2hfZGF0ZSktPlxuXHRsYXN0X2JpbGwgPSBudWxsXG5cdGJpbGwgPSBkYi5iaWxsaW5ncy5maW5kT25lKHtzcGFjZTogc3BhY2VfaWQsIGNyZWF0ZWQ6IHJlZnJlc2hfZGF0ZX0pXG5cblx0IyDojrflj5bmraPluLjku5jmrL7nmoTlsI/kuo5yZWZyZXNoX2RhdGXnmoTmnIDov5HnmoTkuIDmnaHorrDlvZVcblx0cGF5bWVudF9iaWxsID0gZGIuYmlsbGluZ3MuZmluZE9uZShcblx0XHR7XG5cdFx0XHRzcGFjZTogc3BhY2VfaWQsXG5cdFx0XHRjcmVhdGVkOiB7XG5cdFx0XHRcdCRsdDogcmVmcmVzaF9kYXRlXG5cdFx0XHR9LFxuXHRcdFx0YmlsbGluZ19tb250aDogYmlsbC5iaWxsaW5nX21vbnRoXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRzb3J0OiB7XG5cdFx0XHRcdG1vZGlmaWVkOiAtMVxuXHRcdFx0fVxuXHRcdH1cblx0KVxuXHRpZiBwYXltZW50X2JpbGxcblx0XHRsYXN0X2JpbGwgPSBwYXltZW50X2JpbGxcblx0ZWxzZVxuXHRcdCMg6I635Y+W5pyA5paw55qE57uT566X55qE5LiA5p2h6K6w5b2VXG5cdFx0Yl9tX2QgPSBuZXcgRGF0ZShwYXJzZUludChiaWxsLmJpbGxpbmdfbW9udGguc2xpY2UoMCw0KSksIHBhcnNlSW50KGJpbGwuYmlsbGluZ19tb250aC5zbGljZSg0LDYpKSwgMClcblx0XHRiX20gPSBtb21lbnQoYl9tX2QuZ2V0VGltZSgpLShiX21fZC5nZXREYXRlKCkqMjQqNjAqNjAqMTAwMCkpLmZvcm1hdChcIllZWVlNTVwiKVxuXG5cdFx0YXBwX2JpbGwgPSBkYi5iaWxsaW5ncy5maW5kT25lKFxuXHRcdFx0e1xuXHRcdFx0XHRzcGFjZTogc3BhY2VfaWQsXG5cdFx0XHRcdGJpbGxpbmdfbW9udGg6IGJfbVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0c29ydDoge1xuXHRcdFx0XHRcdG1vZGlmaWVkOiAtMVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0KVxuXHRcdGlmIGFwcF9iaWxsXG5cdFx0XHRsYXN0X2JpbGwgPSBhcHBfYmlsbFxuXG5cdGxhc3RfYmFsYW5jZSA9IGlmIGxhc3RfYmlsbCBhbmQgbGFzdF9iaWxsLmJhbGFuY2UgdGhlbiBsYXN0X2JpbGwuYmFsYW5jZSBlbHNlIDAuMFxuXG5cdGRlYml0cyA9IGlmIGJpbGwuZGViaXRzIHRoZW4gYmlsbC5kZWJpdHMgZWxzZSAwLjBcblx0Y3JlZGl0cyA9IGlmIGJpbGwuY3JlZGl0cyB0aGVuIGJpbGwuY3JlZGl0cyBlbHNlIDAuMFxuXHRzZXRPYmogPSBuZXcgT2JqZWN0XG5cdHNldE9iai5iYWxhbmNlID0gTnVtYmVyKChsYXN0X2JhbGFuY2UgKyBjcmVkaXRzIC0gZGViaXRzKS50b0ZpeGVkKDIpKVxuXHRzZXRPYmoubW9kaWZpZWQgPSBuZXcgRGF0ZVxuXHRkYi5iaWxsaW5ncy5kaXJlY3QudXBkYXRlKHtfaWQ6IGJpbGwuX2lkfSwgeyRzZXQ6IHNldE9ian0pXG5cbiMg57uT566X5b2T5pyI55qE5pSv5Ye65LiO5L2Z6aKdXG5iaWxsaW5nTWFuYWdlci5nZXRfYmFsYW5jZSA9IChzcGFjZV9pZCwgYWNjb3VudGluZ19tb250aCwgdXNlcl9jb3VudCwgY291bnRfZGF5cywgbW9kdWxlX25hbWUsIGxpc3RwcmljZSktPlxuXHRhY2NvdW50aW5nX2RhdGUgPSBuZXcgRGF0ZShwYXJzZUludChhY2NvdW50aW5nX21vbnRoLnNsaWNlKDAsNCkpLCBwYXJzZUludChhY2NvdW50aW5nX21vbnRoLnNsaWNlKDQsNikpLCAwKVxuXHRkYXlzX251bWJlciA9IGFjY291bnRpbmdfZGF0ZS5nZXREYXRlKClcblx0YWNjb3VudGluZ19kYXRlX2Zvcm1hdCA9IG1vbWVudChhY2NvdW50aW5nX2RhdGUpLmZvcm1hdChcIllZWVlNTUREXCIpXG5cblx0ZGViaXRzID0gTnVtYmVyKCgoY291bnRfZGF5cy9kYXlzX251bWJlcikgKiB1c2VyX2NvdW50ICogbGlzdHByaWNlKS50b0ZpeGVkKDIpKVxuXHRsYXN0X2JpbGwgPSBkYi5iaWxsaW5ncy5maW5kT25lKFxuXHRcdHtcblx0XHRcdHNwYWNlOiBzcGFjZV9pZCxcblx0XHRcdGJpbGxpbmdfZGF0ZToge1xuXHRcdFx0XHQkbHRlOiBhY2NvdW50aW5nX2RhdGVfZm9ybWF0XG5cdFx0XHR9XG5cdFx0fSxcblx0XHR7XG5cdFx0XHRzb3J0OiB7XG5cdFx0XHRcdG1vZGlmaWVkOiAtMVxuXHRcdFx0fVxuXHRcdH1cblx0KVxuXHRsYXN0X2JhbGFuY2UgPSBpZiBsYXN0X2JpbGwgYW5kIGxhc3RfYmlsbC5iYWxhbmNlIHRoZW4gbGFzdF9iaWxsLmJhbGFuY2UgZWxzZSAwLjBcblxuXHRub3cgPSBuZXcgRGF0ZVxuXHRuZXdfYmlsbCA9IG5ldyBPYmplY3Rcblx0bmV3X2JpbGwuX2lkID0gZGIuYmlsbGluZ3MuX21ha2VOZXdJRCgpXG5cdG5ld19iaWxsLmJpbGxpbmdfbW9udGggPSBhY2NvdW50aW5nX21vbnRoXG5cdG5ld19iaWxsLmJpbGxpbmdfZGF0ZSA9IGFjY291bnRpbmdfZGF0ZV9mb3JtYXRcblx0bmV3X2JpbGwuc3BhY2UgPSBzcGFjZV9pZFxuXHRuZXdfYmlsbC50cmFuc2FjdGlvbiA9IG1vZHVsZV9uYW1lXG5cdG5ld19iaWxsLmxpc3RwcmljZSA9IGxpc3RwcmljZVxuXHRuZXdfYmlsbC51c2VyX2NvdW50ID0gdXNlcl9jb3VudFxuXHRuZXdfYmlsbC5kZWJpdHMgPSBkZWJpdHNcblx0bmV3X2JpbGwuYmFsYW5jZSA9IE51bWJlcigobGFzdF9iYWxhbmNlIC0gZGViaXRzKS50b0ZpeGVkKDIpKVxuXHRuZXdfYmlsbC5jcmVhdGVkID0gbm93XG5cdG5ld19iaWxsLm1vZGlmaWVkID0gbm93XG5cdGRiLmJpbGxpbmdzLmRpcmVjdC5pbnNlcnQobmV3X2JpbGwpXG5cbmJpbGxpbmdNYW5hZ2VyLmdldFNwYWNlVXNlckNvdW50ID0gKHNwYWNlX2lkKS0+XG5cdGRiLnNwYWNlX3VzZXJzLmZpbmQoe3NwYWNlOiBzcGFjZV9pZCwgdXNlcl9hY2NlcHRlZDogdHJ1ZX0pLmNvdW50KClcblxuYmlsbGluZ01hbmFnZXIucmVjYWN1bGF0ZUJhbGFuY2UgPSAoYWNjb3VudGluZ19tb250aCwgc3BhY2VfaWQpLT5cblx0cmVmcmVzaF9kYXRlcyA9IG5ldyBBcnJheVxuXHRkYi5iaWxsaW5ncy5maW5kKFxuXHRcdHtcblx0XHRcdGJpbGxpbmdfbW9udGg6IGFjY291bnRpbmdfbW9udGgsXG5cdFx0XHRzcGFjZTogc3BhY2VfaWQsXG5cdFx0XHR0cmFuc2FjdGlvbjogeyRpbjogW1wiUGF5bWVudFwiLCBcIlNlcnZpY2UgYWRqdXN0bWVudFwiXX1cblx0XHR9LFxuXHRcdHtcblx0XHRcdHNvcnQ6IHtjcmVhdGVkOiAxfVxuXHRcdH1cblx0KS5mb3JFYWNoIChiaWxsKS0+XG5cdFx0cmVmcmVzaF9kYXRlcy5wdXNoKGJpbGwuY3JlYXRlZClcblxuXHRpZiByZWZyZXNoX2RhdGVzLmxlbmd0aCA+IDBcblx0XHRfLmVhY2ggcmVmcmVzaF9kYXRlcywgKHJfZCktPlxuXHRcdFx0YmlsbGluZ01hbmFnZXIucmVmcmVzaF9iYWxhbmNlKHNwYWNlX2lkLCByX2QpXG5cbmJpbGxpbmdNYW5hZ2VyLmdldF9tb2R1bGVzID0gKHNwYWNlX2lkLCBhY2NvdW50aW5nX21vbnRoKS0+XG5cdG1vZHVsZXMgPSBuZXcgQXJyYXlcblx0c3RhcnRfZGF0ZSA9IGFjY291bnRpbmdfbW9udGggKyBcIjAxXCJcblx0ZW5kX2RhdGVfdGltZSA9IG5ldyBEYXRlKHBhcnNlSW50KGFjY291bnRpbmdfbW9udGguc2xpY2UoMCw0KSksIHBhcnNlSW50KGFjY291bnRpbmdfbW9udGguc2xpY2UoNCw2KSksIDApXG5cdGVuZF9kYXRlID0gbW9tZW50KGVuZF9kYXRlX3RpbWUuZ2V0VGltZSgpKS5mb3JtYXQoJ1lZWVlNTUREJylcblxuXHRkYi5tb2R1bGVzLmZpbmQoKS5mb3JFYWNoIChtKS0+XG5cdFx0bV9jaGFuZ2Vsb2cgPSBkYi5tb2R1bGVzX2NoYW5nZWxvZ3MuZmluZE9uZShcblx0XHRcdHtcblx0XHRcdFx0c3BhY2U6IHNwYWNlX2lkLFxuXHRcdFx0XHRtb2R1bGU6IG0ubmFtZSxcblx0XHRcdFx0Y2hhbmdlX2RhdGU6IHtcblx0XHRcdFx0XHQkbHRlOiBlbmRfZGF0ZVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRjcmVhdGVkOiAtMVxuXHRcdFx0fVxuXHRcdClcblx0XHQjIOiLpeacquiOt+W+l+WPr+WMuemFjeeahOiusOW9le+8jOivtOaYjuivpW1vZHVsZeacquWuieijhe+8jOW9k+aciOS4jeiuoeeul+i0ueeUqFxuXHRcdGlmIG5vdCBtX2NoYW5nZWxvZ1xuXHRcdFx0IyAgZG8gbm90aGluZ1xuXG5cdFx0IyDoi6Xor6XorrDlvZXnmoRjaGFuZ2VfZGF0ZTxzdGFydGRhdGUgJiBvcGVyYXRpb2494oCcaW5zdGFsbOKAne+8jOivtOaYjuW9k+aciOWJjeW3suWuieijhe+8jOWboOatpOmcgOiuoeeul+i0ueeUqO+8jOWwhm1vZHVsZV9uYW1l5LiObW9kdWxlcy5saXN0cHJpY2XliqDlhaVtb2R1bGVz5pWw57uE5LitXG5cdFx0ZWxzZSBpZiBtX2NoYW5nZWxvZy5jaGFuZ2VfZGF0ZSA8IHN0YXJ0X2RhdGUgYW5kIG1fY2hhbmdlbG9nLm9wZXJhdGlvbiA9PSBcImluc3RhbGxcIlxuXHRcdFx0bW9kdWxlcy5wdXNoKG0pXG5cdFx0IyDoi6Xor6XorrDlvZXnmoRjaGFuZ2VfZGF0ZTxzdGFydGRhdGUgJiBvcGVyYXRpb2494oCcdW5pbnN0YWxs4oCd77yM6K+05piO5b2T5pyI5YmN5bey5Y246L2977yM5Zug5q2k5LiN6K6h566X6LS555SoXG5cdFx0ZWxzZSBpZiBtX2NoYW5nZWxvZy5jaGFuZ2VfZGF0ZSA8IHN0YXJ0X2RhdGUgYW5kIG1fY2hhbmdlbG9nLm9wZXJhdGlvbiA9PSBcInVuaW5zdGFsbFwiXG5cdFx0XHQjICBkbyBub3RoaW5nXG5cdFx0IyDoi6Xor6XorrDlvZXnmoRjaGFuZ2VfZGF0ZeKJpXN0YXJ0ZGF0Ze+8jOivtOaYjuW9k+aciOWGheWPkeeUn+i/h+WuieijheaIluWNuOi9veeahOaTjeS9nO+8jOmcgOiuoeeul+i0ueeUqO+8jOWwhm1vZHVsZV9uYW1l5LiObW9kdWxlcy5saXN0cHJpY2XliqDlhaVtb2R1bGVz5pWw57uE5LitXG5cdFx0ZWxzZSBpZiBtX2NoYW5nZWxvZy5jaGFuZ2VfZGF0ZSA+PSBzdGFydF9kYXRlXG5cdFx0XHRtb2R1bGVzLnB1c2gobSlcblxuXHRyZXR1cm4gbW9kdWxlc1xuXG5iaWxsaW5nTWFuYWdlci5nZXRfbW9kdWxlc19uYW1lID0gKCktPlxuXHRtb2R1bGVzX25hbWUgPSBuZXcgQXJyYXlcblx0ZGIubW9kdWxlcy5maW5kKCkuZm9yRWFjaCgobSktPlxuXHRcdG1vZHVsZXNfbmFtZS5wdXNoKG0ubmFtZSlcblx0KVxuXHRyZXR1cm4gbW9kdWxlc19uYW1lXG5cblxuYmlsbGluZ01hbmFnZXIuY2FjdWxhdGVfYnlfYWNjb3VudGluZ19tb250aCA9IChhY2NvdW50aW5nX21vbnRoLCBzcGFjZV9pZCktPlxuXHRpZiBhY2NvdW50aW5nX21vbnRoID4gKG1vbWVudCgpLmZvcm1hdCgnWVlZWU1NJykpXG5cdFx0cmV0dXJuXG5cdGlmIGFjY291bnRpbmdfbW9udGggPT0gKG1vbWVudCgpLmZvcm1hdCgnWVlZWU1NJykpXG5cdFx0IyDph43nrpflvZPmnIjnmoTlhYXlgLzlkI7kvZnpop1cblx0XHRiaWxsaW5nTWFuYWdlci5yZWNhY3VsYXRlQmFsYW5jZShhY2NvdW50aW5nX21vbnRoLCBzcGFjZV9pZClcblxuXHRcdGRlYml0cyA9IDBcblx0XHRtb2R1bGVzX25hbWUgPSBiaWxsaW5nTWFuYWdlci5nZXRfbW9kdWxlc19uYW1lKClcblx0XHRiX21fZCA9IG5ldyBEYXRlKHBhcnNlSW50KGFjY291bnRpbmdfbW9udGguc2xpY2UoMCw0KSksIHBhcnNlSW50KGFjY291bnRpbmdfbW9udGguc2xpY2UoNCw2KSksIDApXG5cdFx0Yl9tID0gbW9tZW50KGJfbV9kLmdldFRpbWUoKS0oYl9tX2QuZ2V0RGF0ZSgpKjI0KjYwKjYwKjEwMDApKS5mb3JtYXQoXCJZWVlZTU1ERFwiKVxuXHRcdGRiLmJpbGxpbmdzLmZpbmQoXG5cdFx0XHR7XG5cdFx0XHRcdGJpbGxpbmdfZGF0ZTogYl9tLFxuXHRcdFx0XHRzcGFjZTogc3BhY2VfaWQsXG5cdFx0XHRcdHRyYW5zYWN0aW9uOiB7XG5cdFx0XHRcdFx0JGluOiBtb2R1bGVzX25hbWVcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdCkuZm9yRWFjaCgoYiktPlxuXHRcdFx0ZGViaXRzICs9IGIuZGViaXRzXG5cdFx0KVxuXHRcdG5ld2VzdF9iaWxsID0gZGIuYmlsbGluZ3MuZmluZE9uZSh7c3BhY2U6IHNwYWNlX2lkfSwge3NvcnQ6IHttb2RpZmllZDogLTF9fSlcblx0XHRiYWxhbmNlID0gbmV3ZXN0X2JpbGwuYmFsYW5jZVxuXHRcdHJlbWFpbmluZ19tb250aHMgPSAwXG5cdFx0aWYgYmFsYW5jZSA+IDBcblx0XHRcdGlmIGRlYml0cyA+IDBcblx0XHRcdFx0cmVtYWluaW5nX21vbnRocyA9IHBhcnNlSW50KGJhbGFuY2UvZGViaXRzKSArIDFcblx0XHRcdGVsc2Vcblx0XHRcdFx0IyDlvZPmnIjliJrljYfnuqfvvIzlubbmsqHmnInmiaPmrL5cblx0XHRcdFx0cmVtYWluaW5nX21vbnRocyA9IDFcblxuXHRcdGRiLnNwYWNlcy5kaXJlY3QudXBkYXRlKFxuXHRcdFx0e1xuXHRcdFx0XHRfaWQ6IHNwYWNlX2lkXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHQkc2V0OiB7XG5cdFx0XHRcdFx0YmFsYW5jZTogYmFsYW5jZSxcblx0XHRcdFx0XHRcImJpbGxpbmcucmVtYWluaW5nX21vbnRoc1wiOiByZW1haW5pbmdfbW9udGhzXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHQpXG5cdGVsc2Vcblx0XHQjIOiOt+W+l+WFtue7k+eul+WvueixoeaXpeacn3BheW1lbnRkYXRlc+aVsOe7hOWSjGNvdW50X2RheXPlj6/nu5Pnrpfml6XmlbBcblx0XHRwZXJpb2RfcmVzdWx0ID0gYmlsbGluZ01hbmFnZXIuZ2V0X2FjY291bnRpbmdfcGVyaW9kKHNwYWNlX2lkLCBhY2NvdW50aW5nX21vbnRoKVxuXHRcdGlmIHBlcmlvZF9yZXN1bHRbXCJjb3VudF9kYXlzXCJdID09IDBcblx0XHRcdCMg5Lmf6ZyA5a+55b2T5pyI55qE5YWF5YC86K6w5b2V5omn6KGM5pu05pawXG5cdFx0XHRiaWxsaW5nTWFuYWdlci5yZWNhY3VsYXRlQmFsYW5jZShhY2NvdW50aW5nX21vbnRoLCBzcGFjZV9pZClcblxuXHRcdGVsc2Vcblx0XHRcdHVzZXJfY291bnQgPSBiaWxsaW5nTWFuYWdlci5nZXRTcGFjZVVzZXJDb3VudChzcGFjZV9pZClcblxuXHRcdFx0IyDmuIXpmaTlvZPmnIjnmoTlt7Lnu5PnrpforrDlvZVcblx0XHRcdG1vZHVsZXNfbmFtZSA9IGJpbGxpbmdNYW5hZ2VyLmdldF9tb2R1bGVzX25hbWUoKVxuXHRcdFx0YWNjb3VudGluZ19kYXRlID0gbmV3IERhdGUocGFyc2VJbnQoYWNjb3VudGluZ19tb250aC5zbGljZSgwLDQpKSwgcGFyc2VJbnQoYWNjb3VudGluZ19tb250aC5zbGljZSg0LDYpKSwgMClcblx0XHRcdGFjY291bnRpbmdfZGF0ZV9mb3JtYXQgPSBtb21lbnQoYWNjb3VudGluZ19kYXRlKS5mb3JtYXQoXCJZWVlZTU1ERFwiKVxuXHRcdFx0ZGIuYmlsbGluZ3MucmVtb3ZlKFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0YmlsbGluZ19kYXRlOiBhY2NvdW50aW5nX2RhdGVfZm9ybWF0LFxuXHRcdFx0XHRcdHNwYWNlOiBzcGFjZV9pZCxcblx0XHRcdFx0XHR0cmFuc2FjdGlvbjoge1xuXHRcdFx0XHRcdFx0JGluOiBtb2R1bGVzX25hbWVcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdClcblx0XHRcdCMg6YeN566X5b2T5pyI55qE5YWF5YC85ZCO5L2Z6aKdXG5cdFx0XHRiaWxsaW5nTWFuYWdlci5yZWNhY3VsYXRlQmFsYW5jZShhY2NvdW50aW5nX21vbnRoLCBzcGFjZV9pZClcblxuXHRcdFx0IyDnu5PnrpflvZPmnIjnmoRBUFDkvb/nlKjlkI7kvZnpop1cblx0XHRcdG1vZHVsZXMgPSBiaWxsaW5nTWFuYWdlci5nZXRfbW9kdWxlcyhzcGFjZV9pZCwgYWNjb3VudGluZ19tb250aClcblx0XHRcdGlmIG1vZHVsZXMgYW5kICBtb2R1bGVzLmxlbmd0aD4wXG5cdFx0XHRcdF8uZWFjaCBtb2R1bGVzLCAobSktPlxuXHRcdFx0XHRcdGJpbGxpbmdNYW5hZ2VyLmdldF9iYWxhbmNlKHNwYWNlX2lkLCBhY2NvdW50aW5nX21vbnRoLCB1c2VyX2NvdW50LCBwZXJpb2RfcmVzdWx0W1wiY291bnRfZGF5c1wiXSwgbS5uYW1lLCBtLmxpc3RwcmljZSlcblxuXHRcdGFfbSA9IG1vbWVudChuZXcgRGF0ZShwYXJzZUludChhY2NvdW50aW5nX21vbnRoLnNsaWNlKDAsNCkpLCBwYXJzZUludChhY2NvdW50aW5nX21vbnRoLnNsaWNlKDQsNikpLCAxKS5nZXRUaW1lKCkpLmZvcm1hdChcIllZWVlNTVwiKVxuXHRcdGJpbGxpbmdNYW5hZ2VyLmNhY3VsYXRlX2J5X2FjY291bnRpbmdfbW9udGgoYV9tLCBzcGFjZV9pZClcblxuYmlsbGluZ01hbmFnZXIuc3BlY2lhbF9wYXkgPSAoc3BhY2VfaWQsIG1vZHVsZV9uYW1lcywgdG90YWxfZmVlLCBvcGVyYXRvcl9pZCwgZW5kX2RhdGUsIHVzZXJfY291bnQpLT5cblx0c3BhY2UgPSBkYi5zcGFjZXMuZmluZE9uZShzcGFjZV9pZClcblxuXHRtb2R1bGVzID0gc3BhY2UubW9kdWxlcyB8fCBuZXcgQXJyYXlcblxuXHRuZXdfbW9kdWxlcyA9IF8uZGlmZmVyZW5jZShtb2R1bGVfbmFtZXMsIG1vZHVsZXMpXG5cblx0bSA9IG1vbWVudCgpXG5cdG5vdyA9IG0uX2RcblxuXHRzcGFjZV91cGRhdGVfb2JqID0gbmV3IE9iamVjdFxuXG5cdCMg5pu05pawc3BhY2XmmK/lkKbkuJPkuJrniYjnmoTmoIforrBcblx0aWYgc3BhY2UuaXNfcGFpZCBpc250IHRydWVcblx0XHRzcGFjZV91cGRhdGVfb2JqLmlzX3BhaWQgPSB0cnVlXG5cdFx0c3BhY2VfdXBkYXRlX29iai5zdGFydF9kYXRlID0gbmV3IERhdGVcblxuXHQjIOabtOaWsG1vZHVsZXNcblx0c3BhY2VfdXBkYXRlX29iai5tb2R1bGVzID0gbW9kdWxlX25hbWVzXG5cdHNwYWNlX3VwZGF0ZV9vYmoubW9kaWZpZWQgPSBub3dcblx0c3BhY2VfdXBkYXRlX29iai5tb2RpZmllZF9ieSA9IG9wZXJhdG9yX2lkXG5cdHNwYWNlX3VwZGF0ZV9vYmouZW5kX2RhdGUgPSBuZXcgRGF0ZShlbmRfZGF0ZSlcblx0c3BhY2VfdXBkYXRlX29iai51c2VyX2xpbWl0ID0gdXNlcl9jb3VudFxuXG5cdHIgPSBkYi5zcGFjZXMuZGlyZWN0LnVwZGF0ZSh7X2lkOiBzcGFjZV9pZH0sIHskc2V0OiBzcGFjZV91cGRhdGVfb2JqfSlcblx0aWYgclxuXHRcdF8uZWFjaCBuZXdfbW9kdWxlcywgKG1vZHVsZSktPlxuXHRcdFx0bWNsID0gbmV3IE9iamVjdFxuXHRcdFx0bWNsLl9pZCA9IGRiLm1vZHVsZXNfY2hhbmdlbG9ncy5fbWFrZU5ld0lEKClcblx0XHRcdG1jbC5jaGFuZ2VfZGF0ZSA9IG0uZm9ybWF0KFwiWVlZWU1NRERcIilcblx0XHRcdG1jbC5vcGVyYXRvciA9IG9wZXJhdG9yX2lkXG5cdFx0XHRtY2wuc3BhY2UgPSBzcGFjZV9pZFxuXHRcdFx0bWNsLm9wZXJhdGlvbiA9IFwiaW5zdGFsbFwiXG5cdFx0XHRtY2wubW9kdWxlID0gbW9kdWxlXG5cdFx0XHRtY2wuY3JlYXRlZCA9IG5vd1xuXHRcdFx0ZGIubW9kdWxlc19jaGFuZ2Vsb2dzLmluc2VydChtY2wpXG5cblx0cmV0dXJuIiwiICAgICAgICAgICAgICAgICAgIFxuXG5iaWxsaW5nTWFuYWdlciA9IHt9O1xuXG5iaWxsaW5nTWFuYWdlci5nZXRfYWNjb3VudGluZ19wZXJpb2QgPSBmdW5jdGlvbihzcGFjZV9pZCwgYWNjb3VudGluZ19tb250aCkge1xuICB2YXIgYmlsbGluZywgY291bnRfZGF5cywgZW5kX2RhdGUsIGVuZF9kYXRlX3RpbWUsIGZpcnN0X2RhdGUsIHN0YXJ0X2RhdGUsIHN0YXJ0X2RhdGVfdGltZTtcbiAgY291bnRfZGF5cyA9IDA7XG4gIGVuZF9kYXRlX3RpbWUgPSBuZXcgRGF0ZShwYXJzZUludChhY2NvdW50aW5nX21vbnRoLnNsaWNlKDAsIDQpKSwgcGFyc2VJbnQoYWNjb3VudGluZ19tb250aC5zbGljZSg0LCA2KSksIDApO1xuICBlbmRfZGF0ZSA9IG1vbWVudChlbmRfZGF0ZV90aW1lLmdldFRpbWUoKSkuZm9ybWF0KCdZWVlZTU1ERCcpO1xuICBiaWxsaW5nID0gZGIuYmlsbGluZ3MuZmluZE9uZSh7XG4gICAgc3BhY2U6IHNwYWNlX2lkLFxuICAgIHRyYW5zYWN0aW9uOiBcIlN0YXJ0aW5nIGJhbGFuY2VcIlxuICB9KTtcbiAgZmlyc3RfZGF0ZSA9IGJpbGxpbmcuYmlsbGluZ19kYXRlO1xuICBzdGFydF9kYXRlID0gYWNjb3VudGluZ19tb250aCArIFwiMDFcIjtcbiAgc3RhcnRfZGF0ZV90aW1lID0gbmV3IERhdGUocGFyc2VJbnQoYWNjb3VudGluZ19tb250aC5zbGljZSgwLCA0KSksIHBhcnNlSW50KGFjY291bnRpbmdfbW9udGguc2xpY2UoNCwgNikpLCAxIC0gZW5kX2RhdGVfdGltZS5nZXREYXRlKCkpO1xuICBpZiAoZmlyc3RfZGF0ZSA+PSBlbmRfZGF0ZSkge1xuXG4gIH0gZWxzZSBpZiAoc3RhcnRfZGF0ZSA8PSBmaXJzdF9kYXRlICYmIGZpcnN0X2RhdGUgPCBlbmRfZGF0ZSkge1xuICAgIGNvdW50X2RheXMgPSAoZW5kX2RhdGVfdGltZSAtIHN0YXJ0X2RhdGVfdGltZSkgLyAoMjQgKiA2MCAqIDYwICogMTAwMCkgKyAxO1xuICB9IGVsc2UgaWYgKGZpcnN0X2RhdGUgPCBzdGFydF9kYXRlKSB7XG4gICAgY291bnRfZGF5cyA9IChlbmRfZGF0ZV90aW1lIC0gc3RhcnRfZGF0ZV90aW1lKSAvICgyNCAqIDYwICogNjAgKiAxMDAwKSArIDE7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBcImNvdW50X2RheXNcIjogY291bnRfZGF5c1xuICB9O1xufTtcblxuYmlsbGluZ01hbmFnZXIucmVmcmVzaF9iYWxhbmNlID0gZnVuY3Rpb24oc3BhY2VfaWQsIHJlZnJlc2hfZGF0ZSkge1xuICB2YXIgYXBwX2JpbGwsIGJfbSwgYl9tX2QsIGJpbGwsIGNyZWRpdHMsIGRlYml0cywgbGFzdF9iYWxhbmNlLCBsYXN0X2JpbGwsIHBheW1lbnRfYmlsbCwgc2V0T2JqO1xuICBsYXN0X2JpbGwgPSBudWxsO1xuICBiaWxsID0gZGIuYmlsbGluZ3MuZmluZE9uZSh7XG4gICAgc3BhY2U6IHNwYWNlX2lkLFxuICAgIGNyZWF0ZWQ6IHJlZnJlc2hfZGF0ZVxuICB9KTtcbiAgcGF5bWVudF9iaWxsID0gZGIuYmlsbGluZ3MuZmluZE9uZSh7XG4gICAgc3BhY2U6IHNwYWNlX2lkLFxuICAgIGNyZWF0ZWQ6IHtcbiAgICAgICRsdDogcmVmcmVzaF9kYXRlXG4gICAgfSxcbiAgICBiaWxsaW5nX21vbnRoOiBiaWxsLmJpbGxpbmdfbW9udGhcbiAgfSwge1xuICAgIHNvcnQ6IHtcbiAgICAgIG1vZGlmaWVkOiAtMVxuICAgIH1cbiAgfSk7XG4gIGlmIChwYXltZW50X2JpbGwpIHtcbiAgICBsYXN0X2JpbGwgPSBwYXltZW50X2JpbGw7XG4gIH0gZWxzZSB7XG4gICAgYl9tX2QgPSBuZXcgRGF0ZShwYXJzZUludChiaWxsLmJpbGxpbmdfbW9udGguc2xpY2UoMCwgNCkpLCBwYXJzZUludChiaWxsLmJpbGxpbmdfbW9udGguc2xpY2UoNCwgNikpLCAwKTtcbiAgICBiX20gPSBtb21lbnQoYl9tX2QuZ2V0VGltZSgpIC0gKGJfbV9kLmdldERhdGUoKSAqIDI0ICogNjAgKiA2MCAqIDEwMDApKS5mb3JtYXQoXCJZWVlZTU1cIik7XG4gICAgYXBwX2JpbGwgPSBkYi5iaWxsaW5ncy5maW5kT25lKHtcbiAgICAgIHNwYWNlOiBzcGFjZV9pZCxcbiAgICAgIGJpbGxpbmdfbW9udGg6IGJfbVxuICAgIH0sIHtcbiAgICAgIHNvcnQ6IHtcbiAgICAgICAgbW9kaWZpZWQ6IC0xXG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGFwcF9iaWxsKSB7XG4gICAgICBsYXN0X2JpbGwgPSBhcHBfYmlsbDtcbiAgICB9XG4gIH1cbiAgbGFzdF9iYWxhbmNlID0gbGFzdF9iaWxsICYmIGxhc3RfYmlsbC5iYWxhbmNlID8gbGFzdF9iaWxsLmJhbGFuY2UgOiAwLjA7XG4gIGRlYml0cyA9IGJpbGwuZGViaXRzID8gYmlsbC5kZWJpdHMgOiAwLjA7XG4gIGNyZWRpdHMgPSBiaWxsLmNyZWRpdHMgPyBiaWxsLmNyZWRpdHMgOiAwLjA7XG4gIHNldE9iaiA9IG5ldyBPYmplY3Q7XG4gIHNldE9iai5iYWxhbmNlID0gTnVtYmVyKChsYXN0X2JhbGFuY2UgKyBjcmVkaXRzIC0gZGViaXRzKS50b0ZpeGVkKDIpKTtcbiAgc2V0T2JqLm1vZGlmaWVkID0gbmV3IERhdGU7XG4gIHJldHVybiBkYi5iaWxsaW5ncy5kaXJlY3QudXBkYXRlKHtcbiAgICBfaWQ6IGJpbGwuX2lkXG4gIH0sIHtcbiAgICAkc2V0OiBzZXRPYmpcbiAgfSk7XG59O1xuXG5iaWxsaW5nTWFuYWdlci5nZXRfYmFsYW5jZSA9IGZ1bmN0aW9uKHNwYWNlX2lkLCBhY2NvdW50aW5nX21vbnRoLCB1c2VyX2NvdW50LCBjb3VudF9kYXlzLCBtb2R1bGVfbmFtZSwgbGlzdHByaWNlKSB7XG4gIHZhciBhY2NvdW50aW5nX2RhdGUsIGFjY291bnRpbmdfZGF0ZV9mb3JtYXQsIGRheXNfbnVtYmVyLCBkZWJpdHMsIGxhc3RfYmFsYW5jZSwgbGFzdF9iaWxsLCBuZXdfYmlsbCwgbm93O1xuICBhY2NvdW50aW5nX2RhdGUgPSBuZXcgRGF0ZShwYXJzZUludChhY2NvdW50aW5nX21vbnRoLnNsaWNlKDAsIDQpKSwgcGFyc2VJbnQoYWNjb3VudGluZ19tb250aC5zbGljZSg0LCA2KSksIDApO1xuICBkYXlzX251bWJlciA9IGFjY291bnRpbmdfZGF0ZS5nZXREYXRlKCk7XG4gIGFjY291bnRpbmdfZGF0ZV9mb3JtYXQgPSBtb21lbnQoYWNjb3VudGluZ19kYXRlKS5mb3JtYXQoXCJZWVlZTU1ERFwiKTtcbiAgZGViaXRzID0gTnVtYmVyKCgoY291bnRfZGF5cyAvIGRheXNfbnVtYmVyKSAqIHVzZXJfY291bnQgKiBsaXN0cHJpY2UpLnRvRml4ZWQoMikpO1xuICBsYXN0X2JpbGwgPSBkYi5iaWxsaW5ncy5maW5kT25lKHtcbiAgICBzcGFjZTogc3BhY2VfaWQsXG4gICAgYmlsbGluZ19kYXRlOiB7XG4gICAgICAkbHRlOiBhY2NvdW50aW5nX2RhdGVfZm9ybWF0XG4gICAgfVxuICB9LCB7XG4gICAgc29ydDoge1xuICAgICAgbW9kaWZpZWQ6IC0xXG4gICAgfVxuICB9KTtcbiAgbGFzdF9iYWxhbmNlID0gbGFzdF9iaWxsICYmIGxhc3RfYmlsbC5iYWxhbmNlID8gbGFzdF9iaWxsLmJhbGFuY2UgOiAwLjA7XG4gIG5vdyA9IG5ldyBEYXRlO1xuICBuZXdfYmlsbCA9IG5ldyBPYmplY3Q7XG4gIG5ld19iaWxsLl9pZCA9IGRiLmJpbGxpbmdzLl9tYWtlTmV3SUQoKTtcbiAgbmV3X2JpbGwuYmlsbGluZ19tb250aCA9IGFjY291bnRpbmdfbW9udGg7XG4gIG5ld19iaWxsLmJpbGxpbmdfZGF0ZSA9IGFjY291bnRpbmdfZGF0ZV9mb3JtYXQ7XG4gIG5ld19iaWxsLnNwYWNlID0gc3BhY2VfaWQ7XG4gIG5ld19iaWxsLnRyYW5zYWN0aW9uID0gbW9kdWxlX25hbWU7XG4gIG5ld19iaWxsLmxpc3RwcmljZSA9IGxpc3RwcmljZTtcbiAgbmV3X2JpbGwudXNlcl9jb3VudCA9IHVzZXJfY291bnQ7XG4gIG5ld19iaWxsLmRlYml0cyA9IGRlYml0cztcbiAgbmV3X2JpbGwuYmFsYW5jZSA9IE51bWJlcigobGFzdF9iYWxhbmNlIC0gZGViaXRzKS50b0ZpeGVkKDIpKTtcbiAgbmV3X2JpbGwuY3JlYXRlZCA9IG5vdztcbiAgbmV3X2JpbGwubW9kaWZpZWQgPSBub3c7XG4gIHJldHVybiBkYi5iaWxsaW5ncy5kaXJlY3QuaW5zZXJ0KG5ld19iaWxsKTtcbn07XG5cbmJpbGxpbmdNYW5hZ2VyLmdldFNwYWNlVXNlckNvdW50ID0gZnVuY3Rpb24oc3BhY2VfaWQpIHtcbiAgcmV0dXJuIGRiLnNwYWNlX3VzZXJzLmZpbmQoe1xuICAgIHNwYWNlOiBzcGFjZV9pZCxcbiAgICB1c2VyX2FjY2VwdGVkOiB0cnVlXG4gIH0pLmNvdW50KCk7XG59O1xuXG5iaWxsaW5nTWFuYWdlci5yZWNhY3VsYXRlQmFsYW5jZSA9IGZ1bmN0aW9uKGFjY291bnRpbmdfbW9udGgsIHNwYWNlX2lkKSB7XG4gIHZhciByZWZyZXNoX2RhdGVzO1xuICByZWZyZXNoX2RhdGVzID0gbmV3IEFycmF5O1xuICBkYi5iaWxsaW5ncy5maW5kKHtcbiAgICBiaWxsaW5nX21vbnRoOiBhY2NvdW50aW5nX21vbnRoLFxuICAgIHNwYWNlOiBzcGFjZV9pZCxcbiAgICB0cmFuc2FjdGlvbjoge1xuICAgICAgJGluOiBbXCJQYXltZW50XCIsIFwiU2VydmljZSBhZGp1c3RtZW50XCJdXG4gICAgfVxuICB9LCB7XG4gICAgc29ydDoge1xuICAgICAgY3JlYXRlZDogMVxuICAgIH1cbiAgfSkuZm9yRWFjaChmdW5jdGlvbihiaWxsKSB7XG4gICAgcmV0dXJuIHJlZnJlc2hfZGF0ZXMucHVzaChiaWxsLmNyZWF0ZWQpO1xuICB9KTtcbiAgaWYgKHJlZnJlc2hfZGF0ZXMubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBfLmVhY2gocmVmcmVzaF9kYXRlcywgZnVuY3Rpb24ocl9kKSB7XG4gICAgICByZXR1cm4gYmlsbGluZ01hbmFnZXIucmVmcmVzaF9iYWxhbmNlKHNwYWNlX2lkLCByX2QpO1xuICAgIH0pO1xuICB9XG59O1xuXG5iaWxsaW5nTWFuYWdlci5nZXRfbW9kdWxlcyA9IGZ1bmN0aW9uKHNwYWNlX2lkLCBhY2NvdW50aW5nX21vbnRoKSB7XG4gIHZhciBlbmRfZGF0ZSwgZW5kX2RhdGVfdGltZSwgbW9kdWxlcywgc3RhcnRfZGF0ZTtcbiAgbW9kdWxlcyA9IG5ldyBBcnJheTtcbiAgc3RhcnRfZGF0ZSA9IGFjY291bnRpbmdfbW9udGggKyBcIjAxXCI7XG4gIGVuZF9kYXRlX3RpbWUgPSBuZXcgRGF0ZShwYXJzZUludChhY2NvdW50aW5nX21vbnRoLnNsaWNlKDAsIDQpKSwgcGFyc2VJbnQoYWNjb3VudGluZ19tb250aC5zbGljZSg0LCA2KSksIDApO1xuICBlbmRfZGF0ZSA9IG1vbWVudChlbmRfZGF0ZV90aW1lLmdldFRpbWUoKSkuZm9ybWF0KCdZWVlZTU1ERCcpO1xuICBkYi5tb2R1bGVzLmZpbmQoKS5mb3JFYWNoKGZ1bmN0aW9uKG0pIHtcbiAgICB2YXIgbV9jaGFuZ2Vsb2c7XG4gICAgbV9jaGFuZ2Vsb2cgPSBkYi5tb2R1bGVzX2NoYW5nZWxvZ3MuZmluZE9uZSh7XG4gICAgICBzcGFjZTogc3BhY2VfaWQsXG4gICAgICBtb2R1bGU6IG0ubmFtZSxcbiAgICAgIGNoYW5nZV9kYXRlOiB7XG4gICAgICAgICRsdGU6IGVuZF9kYXRlXG4gICAgICB9XG4gICAgfSwge1xuICAgICAgY3JlYXRlZDogLTFcbiAgICB9KTtcbiAgICBpZiAoIW1fY2hhbmdlbG9nKSB7XG5cbiAgICB9IGVsc2UgaWYgKG1fY2hhbmdlbG9nLmNoYW5nZV9kYXRlIDwgc3RhcnRfZGF0ZSAmJiBtX2NoYW5nZWxvZy5vcGVyYXRpb24gPT09IFwiaW5zdGFsbFwiKSB7XG4gICAgICByZXR1cm4gbW9kdWxlcy5wdXNoKG0pO1xuICAgIH0gZWxzZSBpZiAobV9jaGFuZ2Vsb2cuY2hhbmdlX2RhdGUgPCBzdGFydF9kYXRlICYmIG1fY2hhbmdlbG9nLm9wZXJhdGlvbiA9PT0gXCJ1bmluc3RhbGxcIikge1xuXG4gICAgfSBlbHNlIGlmIChtX2NoYW5nZWxvZy5jaGFuZ2VfZGF0ZSA+PSBzdGFydF9kYXRlKSB7XG4gICAgICByZXR1cm4gbW9kdWxlcy5wdXNoKG0pO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBtb2R1bGVzO1xufTtcblxuYmlsbGluZ01hbmFnZXIuZ2V0X21vZHVsZXNfbmFtZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgbW9kdWxlc19uYW1lO1xuICBtb2R1bGVzX25hbWUgPSBuZXcgQXJyYXk7XG4gIGRiLm1vZHVsZXMuZmluZCgpLmZvckVhY2goZnVuY3Rpb24obSkge1xuICAgIHJldHVybiBtb2R1bGVzX25hbWUucHVzaChtLm5hbWUpO1xuICB9KTtcbiAgcmV0dXJuIG1vZHVsZXNfbmFtZTtcbn07XG5cbmJpbGxpbmdNYW5hZ2VyLmNhY3VsYXRlX2J5X2FjY291bnRpbmdfbW9udGggPSBmdW5jdGlvbihhY2NvdW50aW5nX21vbnRoLCBzcGFjZV9pZCkge1xuICB2YXIgYV9tLCBhY2NvdW50aW5nX2RhdGUsIGFjY291bnRpbmdfZGF0ZV9mb3JtYXQsIGJfbSwgYl9tX2QsIGJhbGFuY2UsIGRlYml0cywgbW9kdWxlcywgbW9kdWxlc19uYW1lLCBuZXdlc3RfYmlsbCwgcGVyaW9kX3Jlc3VsdCwgcmVtYWluaW5nX21vbnRocywgdXNlcl9jb3VudDtcbiAgaWYgKGFjY291bnRpbmdfbW9udGggPiAobW9tZW50KCkuZm9ybWF0KCdZWVlZTU0nKSkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGFjY291bnRpbmdfbW9udGggPT09IChtb21lbnQoKS5mb3JtYXQoJ1lZWVlNTScpKSkge1xuICAgIGJpbGxpbmdNYW5hZ2VyLnJlY2FjdWxhdGVCYWxhbmNlKGFjY291bnRpbmdfbW9udGgsIHNwYWNlX2lkKTtcbiAgICBkZWJpdHMgPSAwO1xuICAgIG1vZHVsZXNfbmFtZSA9IGJpbGxpbmdNYW5hZ2VyLmdldF9tb2R1bGVzX25hbWUoKTtcbiAgICBiX21fZCA9IG5ldyBEYXRlKHBhcnNlSW50KGFjY291bnRpbmdfbW9udGguc2xpY2UoMCwgNCkpLCBwYXJzZUludChhY2NvdW50aW5nX21vbnRoLnNsaWNlKDQsIDYpKSwgMCk7XG4gICAgYl9tID0gbW9tZW50KGJfbV9kLmdldFRpbWUoKSAtIChiX21fZC5nZXREYXRlKCkgKiAyNCAqIDYwICogNjAgKiAxMDAwKSkuZm9ybWF0KFwiWVlZWU1NRERcIik7XG4gICAgZGIuYmlsbGluZ3MuZmluZCh7XG4gICAgICBiaWxsaW5nX2RhdGU6IGJfbSxcbiAgICAgIHNwYWNlOiBzcGFjZV9pZCxcbiAgICAgIHRyYW5zYWN0aW9uOiB7XG4gICAgICAgICRpbjogbW9kdWxlc19uYW1lXG4gICAgICB9XG4gICAgfSkuZm9yRWFjaChmdW5jdGlvbihiKSB7XG4gICAgICByZXR1cm4gZGViaXRzICs9IGIuZGViaXRzO1xuICAgIH0pO1xuICAgIG5ld2VzdF9iaWxsID0gZGIuYmlsbGluZ3MuZmluZE9uZSh7XG4gICAgICBzcGFjZTogc3BhY2VfaWRcbiAgICB9LCB7XG4gICAgICBzb3J0OiB7XG4gICAgICAgIG1vZGlmaWVkOiAtMVxuICAgICAgfVxuICAgIH0pO1xuICAgIGJhbGFuY2UgPSBuZXdlc3RfYmlsbC5iYWxhbmNlO1xuICAgIHJlbWFpbmluZ19tb250aHMgPSAwO1xuICAgIGlmIChiYWxhbmNlID4gMCkge1xuICAgICAgaWYgKGRlYml0cyA+IDApIHtcbiAgICAgICAgcmVtYWluaW5nX21vbnRocyA9IHBhcnNlSW50KGJhbGFuY2UgLyBkZWJpdHMpICsgMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlbWFpbmluZ19tb250aHMgPSAxO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGIuc3BhY2VzLmRpcmVjdC51cGRhdGUoe1xuICAgICAgX2lkOiBzcGFjZV9pZFxuICAgIH0sIHtcbiAgICAgICRzZXQ6IHtcbiAgICAgICAgYmFsYW5jZTogYmFsYW5jZSxcbiAgICAgICAgXCJiaWxsaW5nLnJlbWFpbmluZ19tb250aHNcIjogcmVtYWluaW5nX21vbnRoc1xuICAgICAgfVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHBlcmlvZF9yZXN1bHQgPSBiaWxsaW5nTWFuYWdlci5nZXRfYWNjb3VudGluZ19wZXJpb2Qoc3BhY2VfaWQsIGFjY291bnRpbmdfbW9udGgpO1xuICAgIGlmIChwZXJpb2RfcmVzdWx0W1wiY291bnRfZGF5c1wiXSA9PT0gMCkge1xuICAgICAgYmlsbGluZ01hbmFnZXIucmVjYWN1bGF0ZUJhbGFuY2UoYWNjb3VudGluZ19tb250aCwgc3BhY2VfaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB1c2VyX2NvdW50ID0gYmlsbGluZ01hbmFnZXIuZ2V0U3BhY2VVc2VyQ291bnQoc3BhY2VfaWQpO1xuICAgICAgbW9kdWxlc19uYW1lID0gYmlsbGluZ01hbmFnZXIuZ2V0X21vZHVsZXNfbmFtZSgpO1xuICAgICAgYWNjb3VudGluZ19kYXRlID0gbmV3IERhdGUocGFyc2VJbnQoYWNjb3VudGluZ19tb250aC5zbGljZSgwLCA0KSksIHBhcnNlSW50KGFjY291bnRpbmdfbW9udGguc2xpY2UoNCwgNikpLCAwKTtcbiAgICAgIGFjY291bnRpbmdfZGF0ZV9mb3JtYXQgPSBtb21lbnQoYWNjb3VudGluZ19kYXRlKS5mb3JtYXQoXCJZWVlZTU1ERFwiKTtcbiAgICAgIGRiLmJpbGxpbmdzLnJlbW92ZSh7XG4gICAgICAgIGJpbGxpbmdfZGF0ZTogYWNjb3VudGluZ19kYXRlX2Zvcm1hdCxcbiAgICAgICAgc3BhY2U6IHNwYWNlX2lkLFxuICAgICAgICB0cmFuc2FjdGlvbjoge1xuICAgICAgICAgICRpbjogbW9kdWxlc19uYW1lXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgYmlsbGluZ01hbmFnZXIucmVjYWN1bGF0ZUJhbGFuY2UoYWNjb3VudGluZ19tb250aCwgc3BhY2VfaWQpO1xuICAgICAgbW9kdWxlcyA9IGJpbGxpbmdNYW5hZ2VyLmdldF9tb2R1bGVzKHNwYWNlX2lkLCBhY2NvdW50aW5nX21vbnRoKTtcbiAgICAgIGlmIChtb2R1bGVzICYmIG1vZHVsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBfLmVhY2gobW9kdWxlcywgZnVuY3Rpb24obSkge1xuICAgICAgICAgIHJldHVybiBiaWxsaW5nTWFuYWdlci5nZXRfYmFsYW5jZShzcGFjZV9pZCwgYWNjb3VudGluZ19tb250aCwgdXNlcl9jb3VudCwgcGVyaW9kX3Jlc3VsdFtcImNvdW50X2RheXNcIl0sIG0ubmFtZSwgbS5saXN0cHJpY2UpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgYV9tID0gbW9tZW50KG5ldyBEYXRlKHBhcnNlSW50KGFjY291bnRpbmdfbW9udGguc2xpY2UoMCwgNCkpLCBwYXJzZUludChhY2NvdW50aW5nX21vbnRoLnNsaWNlKDQsIDYpKSwgMSkuZ2V0VGltZSgpKS5mb3JtYXQoXCJZWVlZTU1cIik7XG4gICAgcmV0dXJuIGJpbGxpbmdNYW5hZ2VyLmNhY3VsYXRlX2J5X2FjY291bnRpbmdfbW9udGgoYV9tLCBzcGFjZV9pZCk7XG4gIH1cbn07XG5cbmJpbGxpbmdNYW5hZ2VyLnNwZWNpYWxfcGF5ID0gZnVuY3Rpb24oc3BhY2VfaWQsIG1vZHVsZV9uYW1lcywgdG90YWxfZmVlLCBvcGVyYXRvcl9pZCwgZW5kX2RhdGUsIHVzZXJfY291bnQpIHtcbiAgdmFyIG0sIG1vZHVsZXMsIG5ld19tb2R1bGVzLCBub3csIHIsIHNwYWNlLCBzcGFjZV91cGRhdGVfb2JqO1xuICBzcGFjZSA9IGRiLnNwYWNlcy5maW5kT25lKHNwYWNlX2lkKTtcbiAgbW9kdWxlcyA9IHNwYWNlLm1vZHVsZXMgfHwgbmV3IEFycmF5O1xuICBuZXdfbW9kdWxlcyA9IF8uZGlmZmVyZW5jZShtb2R1bGVfbmFtZXMsIG1vZHVsZXMpO1xuICBtID0gbW9tZW50KCk7XG4gIG5vdyA9IG0uX2Q7XG4gIHNwYWNlX3VwZGF0ZV9vYmogPSBuZXcgT2JqZWN0O1xuICBpZiAoc3BhY2UuaXNfcGFpZCAhPT0gdHJ1ZSkge1xuICAgIHNwYWNlX3VwZGF0ZV9vYmouaXNfcGFpZCA9IHRydWU7XG4gICAgc3BhY2VfdXBkYXRlX29iai5zdGFydF9kYXRlID0gbmV3IERhdGU7XG4gIH1cbiAgc3BhY2VfdXBkYXRlX29iai5tb2R1bGVzID0gbW9kdWxlX25hbWVzO1xuICBzcGFjZV91cGRhdGVfb2JqLm1vZGlmaWVkID0gbm93O1xuICBzcGFjZV91cGRhdGVfb2JqLm1vZGlmaWVkX2J5ID0gb3BlcmF0b3JfaWQ7XG4gIHNwYWNlX3VwZGF0ZV9vYmouZW5kX2RhdGUgPSBuZXcgRGF0ZShlbmRfZGF0ZSk7XG4gIHNwYWNlX3VwZGF0ZV9vYmoudXNlcl9saW1pdCA9IHVzZXJfY291bnQ7XG4gIHIgPSBkYi5zcGFjZXMuZGlyZWN0LnVwZGF0ZSh7XG4gICAgX2lkOiBzcGFjZV9pZFxuICB9LCB7XG4gICAgJHNldDogc3BhY2VfdXBkYXRlX29ialxuICB9KTtcbiAgaWYgKHIpIHtcbiAgICBfLmVhY2gobmV3X21vZHVsZXMsIGZ1bmN0aW9uKG1vZHVsZSkge1xuICAgICAgdmFyIG1jbDtcbiAgICAgIG1jbCA9IG5ldyBPYmplY3Q7XG4gICAgICBtY2wuX2lkID0gZGIubW9kdWxlc19jaGFuZ2Vsb2dzLl9tYWtlTmV3SUQoKTtcbiAgICAgIG1jbC5jaGFuZ2VfZGF0ZSA9IG0uZm9ybWF0KFwiWVlZWU1NRERcIik7XG4gICAgICBtY2wub3BlcmF0b3IgPSBvcGVyYXRvcl9pZDtcbiAgICAgIG1jbC5zcGFjZSA9IHNwYWNlX2lkO1xuICAgICAgbWNsLm9wZXJhdGlvbiA9IFwiaW5zdGFsbFwiO1xuICAgICAgbWNsLm1vZHVsZSA9IG1vZHVsZTtcbiAgICAgIG1jbC5jcmVhdGVkID0gbm93O1xuICAgICAgcmV0dXJuIGRiLm1vZHVsZXNfY2hhbmdlbG9ncy5pbnNlcnQobWNsKTtcbiAgICB9KTtcbiAgfVxufTtcbiIsIk1ldGVvci5zdGFydHVwKGZ1bmN0aW9uICgpIHtcblxuICBpZiAoTWV0ZW9yLnNldHRpbmdzLmNyb24gJiYgTWV0ZW9yLnNldHRpbmdzLmNyb24uc3RhdGlzdGljcykge1xuXG4gICAgdmFyIHNjaGVkdWxlID0gcmVxdWlyZSgnbm9kZS1zY2hlZHVsZScpO1xuICAgIC8vIOWumuaXtuaJp+ihjOe7n+iuoVxuICAgIHZhciBydWxlID0gTWV0ZW9yLnNldHRpbmdzLmNyb24uc3RhdGlzdGljcztcblxuICAgIHZhciBnb19uZXh0ID0gdHJ1ZTtcblxuICAgIHNjaGVkdWxlLnNjaGVkdWxlSm9iKHJ1bGUsIE1ldGVvci5iaW5kRW52aXJvbm1lbnQoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFnb19uZXh0KVxuICAgICAgICByZXR1cm47XG4gICAgICBnb19uZXh0ID0gZmFsc2U7XG5cbiAgICAgIGNvbnNvbGUudGltZSgnc3RhdGlzdGljcycpO1xuICAgICAgLy8g5pel5pyf5qC85byP5YyWIFxuICAgICAgdmFyIGRhdGVGb3JtYXQgPSBmdW5jdGlvbiAoZGF0ZSkge1xuICAgICAgICB2YXIgZGF0ZWtleSA9IFwiXCIrZGF0ZS5nZXRGdWxsWWVhcigpK1wiLVwiKyhkYXRlLmdldE1vbnRoKCkrMSkrXCItXCIrKGRhdGUuZ2V0RGF0ZSgpKTtcbiAgICAgICAgcmV0dXJuIGRhdGVrZXk7XG4gICAgICB9O1xuICAgICAgLy8g6K6h566X5YmN5LiA5aSp5pe26Ze0XG4gICAgICB2YXIgeWVzdGVyRGF5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZE5vdyA9IG5ldyBEYXRlKCk7ICAgLy/lvZPliY3ml7bpl7RcbiAgICAgICAgdmFyIGRCZWZvcmUgPSBuZXcgRGF0ZShkTm93LmdldFRpbWUoKSAtIDI0KjM2MDAqMTAwMCk7ICAgLy/lvpfliLDliY3kuIDlpKnnmoTml7bpl7RcbiAgICAgICAgcmV0dXJuIGRCZWZvcmU7XG4gICAgICB9O1xuICAgICAgLy8g57uf6K6h5b2T5pel5pWw5o2uXG4gICAgICB2YXIgZGFpbHlTdGF0aWNzQ291bnQgPSBmdW5jdGlvbiAoY29sbGVjdGlvbiwgc3BhY2UpIHtcbiAgICAgICAgdmFyIHN0YXRpY3MgPSBjb2xsZWN0aW9uLmZpbmQoe1wic3BhY2VcIjpzcGFjZVtcIl9pZFwiXSxcImNyZWF0ZWRcIjp7JGd0OiB5ZXN0ZXJEYXkoKX19KTtcbiAgICAgICAgcmV0dXJuIHN0YXRpY3MuY291bnQoKTtcbiAgICAgIH07XG4gICAgICAvLyDmn6Xor6LmgLvmlbBcbiAgICAgIHZhciBzdGF0aWNzQ291bnQgPSBmdW5jdGlvbiAoY29sbGVjdGlvbiwgc3BhY2UpIHtcbiAgICAgICAgdmFyIHN0YXRpY3MgPSBjb2xsZWN0aW9uLmZpbmQoe1wic3BhY2VcIjogc3BhY2VbXCJfaWRcIl19KTtcbiAgICAgICAgcmV0dXJuIHN0YXRpY3MuY291bnQoKTtcbiAgICAgIH07XG4gICAgICAvLyDmn6Xor6Lmi6XmnInogIXlkI3lrZdcbiAgICAgIHZhciBvd25lck5hbWUgPSBmdW5jdGlvbiAoY29sbGVjdGlvbiwgc3BhY2UpIHtcbiAgICAgICAgdmFyIG93bmVyID0gY29sbGVjdGlvbi5maW5kT25lKHtcIl9pZFwiOiBzcGFjZVtcIm93bmVyXCJdfSk7XG4gICAgICAgIHZhciBuYW1lID0gb3duZXIubmFtZTtcbiAgICAgICAgcmV0dXJuIG5hbWU7XG4gICAgICB9O1xuICAgICAgLy8g5pyA6L+R55m75b2V5pel5pyfXG4gICAgICB2YXIgbGFzdExvZ29uID0gZnVuY3Rpb24gKGNvbGxlY3Rpb24sIHNwYWNlKSB7XG4gICAgICAgIHZhciBsYXN0TG9nb24gPSAwO1xuICAgICAgICB2YXIgc1VzZXJzID0gZGIuc3BhY2VfdXNlcnMuZmluZCh7XCJzcGFjZVwiOiBzcGFjZVtcIl9pZFwiXX0sIHtmaWVsZHM6IHt1c2VyOiAxfX0pOyBcbiAgICAgICAgc1VzZXJzLmZvckVhY2goZnVuY3Rpb24gKHNVc2VyKSB7XG4gICAgICAgICAgdmFyIHVzZXIgPSBjb2xsZWN0aW9uLmZpbmRPbmUoe1wiX2lkXCI6c1VzZXJbXCJ1c2VyXCJdfSk7XG4gICAgICAgICAgaWYodXNlciAmJiAobGFzdExvZ29uIDwgdXNlci5sYXN0X2xvZ29uKSl7XG4gICAgICAgICAgICBsYXN0TG9nb24gPSB1c2VyLmxhc3RfbG9nb247XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gbGFzdExvZ29uO1xuICAgICAgfTtcbiAgICAgIC8vIOacgOi/keS/ruaUueaXpeacn1xuICAgICAgdmFyIGxhc3RNb2RpZmllZCA9IGZ1bmN0aW9uIChjb2xsZWN0aW9uLCBzcGFjZSkge1xuICAgICAgICB2YXIgb2JqID0gY29sbGVjdGlvbi5maW5kKHtcInNwYWNlXCI6IHNwYWNlW1wiX2lkXCJdfSwge3NvcnQ6IHttb2RpZmllZDogLTF9LCBsaW1pdDogMX0pO1xuICAgICAgICB2YXIgb2JqQXJyID0gb2JqLmZldGNoKCk7XG4gICAgICAgIGlmKG9iakFyci5sZW5ndGggPiAwKVxuICAgICAgICAgIHZhciBtb2QgPSBvYmpBcnJbMF0ubW9kaWZpZWQ7XG4gICAgICAgICAgcmV0dXJuIG1vZDtcbiAgICAgIH07XG4gICAgICAvLyDmlofnq6DpmYTku7blpKflsI9cbiAgICAgIHZhciBwb3N0c0F0dGFjaG1lbnRzID0gZnVuY3Rpb24gKGNvbGxlY3Rpb24sIHNwYWNlKSB7XG4gICAgICAgIHZhciBhdHRTaXplID0gMDtcbiAgICAgICAgdmFyIHNpemVTdW0gPSAwO1xuICAgICAgICB2YXIgcG9zdHMgPSBjb2xsZWN0aW9uLmZpbmQoe1wic3BhY2VcIjogc3BhY2VbXCJfaWRcIl19KTtcbiAgICAgICAgcG9zdHMuZm9yRWFjaChmdW5jdGlvbiAocG9zdCkge1xuICAgICAgICAgIHZhciBhdHRzID0gY2ZzLnBvc3RzLmZpbmQoe1wicG9zdFwiOnBvc3RbXCJfaWRcIl19KTtcbiAgICAgICAgICBhdHRzLmZvckVhY2goZnVuY3Rpb24gKGF0dCkge1xuICAgICAgICAgICAgYXR0U2l6ZSA9IGF0dC5vcmlnaW5hbC5zaXplO1xuICAgICAgICAgICAgc2l6ZVN1bSArPSBhdHRTaXplO1xuICAgICAgICAgIH0pICBcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIHNpemVTdW07XG4gICAgICB9O1xuICAgICAgLy8g5b2T5pel5paw5aKe6ZmE5Lu25aSn5bCPXG4gICAgICB2YXIgZGFpbHlQb3N0c0F0dGFjaG1lbnRzID0gZnVuY3Rpb24gKGNvbGxlY3Rpb24sIHNwYWNlKSB7XG4gICAgICAgIHZhciBhdHRTaXplID0gMDtcbiAgICAgICAgdmFyIHNpemVTdW0gPSAwO1xuICAgICAgICB2YXIgcG9zdHMgPSBjb2xsZWN0aW9uLmZpbmQoe1wic3BhY2VcIjogc3BhY2VbXCJfaWRcIl19KTtcbiAgICAgICAgcG9zdHMuZm9yRWFjaChmdW5jdGlvbiAocG9zdCkge1xuICAgICAgICAgIHZhciBhdHRzID0gY2ZzLnBvc3RzLmZpbmQoe1wicG9zdFwiOiBwb3N0W1wiX2lkXCJdLCBcInVwbG9hZGVkQXRcIjogeyRndDogeWVzdGVyRGF5KCl9fSk7XG4gICAgICAgICAgYXR0cy5mb3JFYWNoKGZ1bmN0aW9uIChhdHQpIHtcbiAgICAgICAgICAgIGF0dFNpemUgPSBhdHQub3JpZ2luYWwuc2l6ZTtcbiAgICAgICAgICAgIHNpemVTdW0gKz0gYXR0U2l6ZTtcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gc2l6ZVN1bTtcbiAgICAgIH07XG4gICAgICAvLyDmj5LlhaXmlbDmja5cbiAgICAgIGRiLnNwYWNlcy5maW5kKHtcImlzX3BhaWRcIjp0cnVlfSkuZm9yRWFjaChmdW5jdGlvbiAoc3BhY2UpIHtcbiAgICAgICAgZGIuc3RlZWRvc19zdGF0aXN0aWNzLmluc2VydCh7XG4gICAgICAgICAgc3BhY2U6IHNwYWNlW1wiX2lkXCJdLFxuICAgICAgICAgIHNwYWNlX25hbWU6IHNwYWNlW1wibmFtZVwiXSxcbiAgICAgICAgICBiYWxhbmNlOiBzcGFjZVtcImJhbGFuY2VcIl0sXG4gICAgICAgICAgb3duZXJfbmFtZTogb3duZXJOYW1lKGRiLnVzZXJzLCBzcGFjZSksXG4gICAgICAgICAgY3JlYXRlZDogbmV3IERhdGUoKSxcbiAgICAgICAgICBzdGVlZG9zOntcbiAgICAgICAgICAgIHVzZXJzOiBzdGF0aWNzQ291bnQoZGIuc3BhY2VfdXNlcnMsIHNwYWNlKSxcbiAgICAgICAgICAgIG9yZ2FuaXphdGlvbnM6IHN0YXRpY3NDb3VudChkYi5vcmdhbml6YXRpb25zLCBzcGFjZSksXG4gICAgICAgICAgICBsYXN0X2xvZ29uOiBsYXN0TG9nb24oZGIudXNlcnMsIHNwYWNlKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgd29ya2Zsb3c6e1xuICAgICAgICAgICAgZmxvd3M6IHN0YXRpY3NDb3VudChkYi5mbG93cywgc3BhY2UpLFxuICAgICAgICAgICAgZm9ybXM6IHN0YXRpY3NDb3VudChkYi5mb3Jtcywgc3BhY2UpLFxuICAgICAgICAgICAgZmxvd19yb2xlczogc3RhdGljc0NvdW50KGRiLmZsb3dfcm9sZXMsIHNwYWNlKSxcbiAgICAgICAgICAgIGZsb3dfcG9zaXRpb25zOiBzdGF0aWNzQ291bnQoZGIuZmxvd19wb3NpdGlvbnMsIHNwYWNlKSxcbiAgICAgICAgICAgIGluc3RhbmNlczogc3RhdGljc0NvdW50KGRiLmluc3RhbmNlcywgc3BhY2UpLFxuICAgICAgICAgICAgaW5zdGFuY2VzX2xhc3RfbW9kaWZpZWQ6IGxhc3RNb2RpZmllZChkYi5pbnN0YW5jZXMsIHNwYWNlKSxcbiAgICAgICAgICAgIGRhaWx5X2Zsb3dzOiBkYWlseVN0YXRpY3NDb3VudChkYi5mbG93cywgc3BhY2UpLFxuICAgICAgICAgICAgZGFpbHlfZm9ybXM6IGRhaWx5U3RhdGljc0NvdW50KGRiLmZvcm1zLCBzcGFjZSksXG4gICAgICAgICAgICBkYWlseV9pbnN0YW5jZXM6IGRhaWx5U3RhdGljc0NvdW50KGRiLmluc3RhbmNlcywgc3BhY2UpXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjbXM6IHtcbiAgICAgICAgICAgIHNpdGVzOiBzdGF0aWNzQ291bnQoZGIuY21zX3NpdGVzLCBzcGFjZSksXG4gICAgICAgICAgICBwb3N0czogc3RhdGljc0NvdW50KGRiLmNtc19wb3N0cywgc3BhY2UpLFxuICAgICAgICAgICAgcG9zdHNfbGFzdF9tb2RpZmllZDogbGFzdE1vZGlmaWVkKGRiLmNtc19wb3N0cywgc3BhY2UpLFxuICAgICAgICAgICAgcG9zdHNfYXR0YWNobWVudHNfc2l6ZTogcG9zdHNBdHRhY2htZW50cyhkYi5jbXNfcG9zdHMsIHNwYWNlKSxcbiAgICAgICAgICAgIGNvbW1lbnRzOiBzdGF0aWNzQ291bnQoZGIuY21zX2NvbW1lbnRzLCBzcGFjZSksXG4gICAgICAgICAgICBkYWlseV9zaXRlczogZGFpbHlTdGF0aWNzQ291bnQoZGIuY21zX3NpdGVzLCBzcGFjZSksXG4gICAgICAgICAgICBkYWlseV9wb3N0czogZGFpbHlTdGF0aWNzQ291bnQoZGIuY21zX3Bvc3RzLCBzcGFjZSksXG4gICAgICAgICAgICBkYWlseV9jb21tZW50czogZGFpbHlTdGF0aWNzQ291bnQoZGIuY21zX2NvbW1lbnRzLCBzcGFjZSksXG4gICAgICAgICAgICBkYWlseV9wb3N0c19hdHRhY2htZW50c19zaXplOiBkYWlseVBvc3RzQXR0YWNobWVudHMoZGIuY21zX3Bvc3RzLCBzcGFjZSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICBcbiAgICAgIGNvbnNvbGUudGltZUVuZCgnc3RhdGlzdGljcycpO1xuXG4gICAgICBnb19uZXh0ID0gdHJ1ZTtcblxuICAgIH0sIGZ1bmN0aW9uIChlKSB7XG4gICAgICBjb25zb2xlLmxvZygnRmFpbGVkIHRvIGJpbmQgZW52aXJvbm1lbnQ6IHN0YXRpc3RpY3MuanMnKTtcbiAgICAgIGNvbnNvbGUubG9nKGUuc3RhY2spO1xuICAgIH0pKTtcblxuICB9XG5cbn0pXG5cblxuXG5cbiIsIk1ldGVvci5zdGFydHVwIC0+XG4gICAgTWlncmF0aW9ucy5hZGRcbiAgICAgICAgdmVyc2lvbjogMVxuICAgICAgICBuYW1lOiAn5Zyo57q/57yW6L6R5pe277yM6ZyA57uZ5paH5Lu25aKe5YqgbG9jayDlsZ7mgKfvvIzpmLLmraLlpJrkurrlkIzml7bnvJbovpEgIzQyOSwg6ZmE5Lu26aG16Z2i5L2/55SoY2Zz5pi+56S6J1xuICAgICAgICB1cDogLT5cbiAgICAgICAgICAgIGNvbnNvbGUudGltZSgndXBncmFkZV9jZnNfaW5zdGFuY2UnKVxuICAgICAgICAgICAgdHJ5XG4gICAgICAgICAgICAgICAgdXBkYXRlX2Nmc19pbnN0YW5jZSA9IChwYXJlbnRfaWQsIHNwYWNlX2lkLCBpbnN0YW5jZV9pZCwgYXR0YWNoX3ZlcnNpb24sIGlzQ3VycmVudCktPlxuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IHtwYXJlbnQ6IHBhcmVudF9pZCwgb3duZXI6IGF0dGFjaF92ZXJzaW9uWydjcmVhdGVkX2J5J10sIG93bmVyX25hbWU6IGF0dGFjaF92ZXJzaW9uWydjcmVhdGVkX2J5X25hbWUnXSwgc3BhY2U6IHNwYWNlX2lkLCBpbnN0YW5jZTogaW5zdGFuY2VfaWQsIGFwcHJvdmU6IGF0dGFjaF92ZXJzaW9uWydhcHByb3ZlJ119XG4gICAgICAgICAgICAgICAgICAgIGlmIGlzQ3VycmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEuY3VycmVudCA9IHRydWVcblxuICAgICAgICAgICAgICAgICAgICBjZnMuaW5zdGFuY2VzLnVwZGF0ZSh7X2lkOiBhdHRhY2hfdmVyc2lvblsnX3JldiddfSwgeyRzZXQ6IHttZXRhZGF0YTogbWV0YWRhdGF9fSlcbiAgICAgICAgICAgICAgICBpID0gMFxuICAgICAgICAgICAgICAgIGRiLmluc3RhbmNlcy5maW5kKHtcImF0dGFjaG1lbnRzLmN1cnJlbnRcIjogeyRleGlzdHM6IHRydWV9fSwge3NvcnQ6IHttb2RpZmllZDogLTF9LCBmaWVsZHM6IHtzcGFjZTogMSwgYXR0YWNobWVudHM6IDF9fSkuZm9yRWFjaCAoaW5zKSAtPlxuICAgICAgICAgICAgICAgICAgICBhdHRhY2hzID0gaW5zLmF0dGFjaG1lbnRzXG4gICAgICAgICAgICAgICAgICAgIHNwYWNlX2lkID0gaW5zLnNwYWNlXG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlX2lkID0gaW5zLl9pZFxuICAgICAgICAgICAgICAgICAgICBhdHRhY2hzLmZvckVhY2ggKGF0dCktPlxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF92ZXIgPSBhdHQuY3VycmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50X2lkID0gY3VycmVudF92ZXIuX3JldlxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlX2Nmc19pbnN0YW5jZShwYXJlbnRfaWQsIHNwYWNlX2lkLCBpbnN0YW5jZV9pZCwgY3VycmVudF92ZXIsIHRydWUpXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGF0dC5oaXN0b3J5c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dC5oaXN0b3J5cy5mb3JFYWNoIChoaXMpIC0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZV9jZnNfaW5zdGFuY2UocGFyZW50X2lkLCBzcGFjZV9pZCwgaW5zdGFuY2VfaWQsIGhpcywgZmFsc2UpXG5cbiAgICAgICAgICAgICAgICAgICAgaSsrXG5cbiAgICAgICAgICAgIGNhdGNoIGVcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpXG5cbiAgICAgICAgICAgIGNvbnNvbGUudGltZUVuZCgndXBncmFkZV9jZnNfaW5zdGFuY2UnKVxuICAgICAgICBkb3duOiAtPlxuICAgICAgICAgICAgY29uc29sZS5sb2coJ3ZlcnNpb24gMSBkb3duJykiLCJNZXRlb3Iuc3RhcnR1cChmdW5jdGlvbigpIHtcbiAgcmV0dXJuIE1pZ3JhdGlvbnMuYWRkKHtcbiAgICB2ZXJzaW9uOiAxLFxuICAgIG5hbWU6ICflnKjnur/nvJbovpHml7bvvIzpnIDnu5nmlofku7blop7liqBsb2NrIOWxnuaAp++8jOmYsuatouWkmuS6uuWQjOaXtue8lui+kSAjNDI5LCDpmYTku7bpobXpnaLkvb/nlKhjZnPmmL7npLonLFxuICAgIHVwOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBlLCBpLCB1cGRhdGVfY2ZzX2luc3RhbmNlO1xuICAgICAgY29uc29sZS50aW1lKCd1cGdyYWRlX2Nmc19pbnN0YW5jZScpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdXBkYXRlX2Nmc19pbnN0YW5jZSA9IGZ1bmN0aW9uKHBhcmVudF9pZCwgc3BhY2VfaWQsIGluc3RhbmNlX2lkLCBhdHRhY2hfdmVyc2lvbiwgaXNDdXJyZW50KSB7XG4gICAgICAgICAgdmFyIG1ldGFkYXRhO1xuICAgICAgICAgIG1ldGFkYXRhID0ge1xuICAgICAgICAgICAgcGFyZW50OiBwYXJlbnRfaWQsXG4gICAgICAgICAgICBvd25lcjogYXR0YWNoX3ZlcnNpb25bJ2NyZWF0ZWRfYnknXSxcbiAgICAgICAgICAgIG93bmVyX25hbWU6IGF0dGFjaF92ZXJzaW9uWydjcmVhdGVkX2J5X25hbWUnXSxcbiAgICAgICAgICAgIHNwYWNlOiBzcGFjZV9pZCxcbiAgICAgICAgICAgIGluc3RhbmNlOiBpbnN0YW5jZV9pZCxcbiAgICAgICAgICAgIGFwcHJvdmU6IGF0dGFjaF92ZXJzaW9uWydhcHByb3ZlJ11cbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChpc0N1cnJlbnQpIHtcbiAgICAgICAgICAgIG1ldGFkYXRhLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gY2ZzLmluc3RhbmNlcy51cGRhdGUoe1xuICAgICAgICAgICAgX2lkOiBhdHRhY2hfdmVyc2lvblsnX3JldiddXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgJHNldDoge1xuICAgICAgICAgICAgICBtZXRhZGF0YTogbWV0YWRhdGFcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgaSA9IDA7XG4gICAgICAgIGRiLmluc3RhbmNlcy5maW5kKHtcbiAgICAgICAgICBcImF0dGFjaG1lbnRzLmN1cnJlbnRcIjoge1xuICAgICAgICAgICAgJGV4aXN0czogdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfSwge1xuICAgICAgICAgIHNvcnQ6IHtcbiAgICAgICAgICAgIG1vZGlmaWVkOiAtMVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICBzcGFjZTogMSxcbiAgICAgICAgICAgIGF0dGFjaG1lbnRzOiAxXG4gICAgICAgICAgfVxuICAgICAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uKGlucykge1xuICAgICAgICAgIHZhciBhdHRhY2hzLCBpbnN0YW5jZV9pZCwgc3BhY2VfaWQ7XG4gICAgICAgICAgYXR0YWNocyA9IGlucy5hdHRhY2htZW50cztcbiAgICAgICAgICBzcGFjZV9pZCA9IGlucy5zcGFjZTtcbiAgICAgICAgICBpbnN0YW5jZV9pZCA9IGlucy5faWQ7XG4gICAgICAgICAgYXR0YWNocy5mb3JFYWNoKGZ1bmN0aW9uKGF0dCkge1xuICAgICAgICAgICAgdmFyIGN1cnJlbnRfdmVyLCBwYXJlbnRfaWQ7XG4gICAgICAgICAgICBjdXJyZW50X3ZlciA9IGF0dC5jdXJyZW50O1xuICAgICAgICAgICAgcGFyZW50X2lkID0gY3VycmVudF92ZXIuX3JldjtcbiAgICAgICAgICAgIHVwZGF0ZV9jZnNfaW5zdGFuY2UocGFyZW50X2lkLCBzcGFjZV9pZCwgaW5zdGFuY2VfaWQsIGN1cnJlbnRfdmVyLCB0cnVlKTtcbiAgICAgICAgICAgIGlmIChhdHQuaGlzdG9yeXMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGF0dC5oaXN0b3J5cy5mb3JFYWNoKGZ1bmN0aW9uKGhpcykge1xuICAgICAgICAgICAgICAgIHJldHVybiB1cGRhdGVfY2ZzX2luc3RhbmNlKHBhcmVudF9pZCwgc3BhY2VfaWQsIGluc3RhbmNlX2lkLCBoaXMsIGZhbHNlKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIGkrKztcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBlID0gZXJyb3I7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29uc29sZS50aW1lRW5kKCd1cGdyYWRlX2Nmc19pbnN0YW5jZScpO1xuICAgIH0sXG4gICAgZG93bjogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gY29uc29sZS5sb2coJ3ZlcnNpb24gMSBkb3duJyk7XG4gICAgfVxuICB9KTtcbn0pO1xuIiwiTWV0ZW9yLnN0YXJ0dXAgLT5cbiAgICBNaWdyYXRpb25zLmFkZFxuICAgICAgICB2ZXJzaW9uOiAyXG4gICAgICAgIG5hbWU6ICfnu4Tnu4fnu5PmnoTlhYHorrjkuIDkuKrkurrlsZ7kuo7lpJrkuKrpg6jpl6ggIzM3OSdcbiAgICAgICAgdXA6IC0+XG4gICAgICAgICAgICBjb25zb2xlLmxvZyAndmVyc2lvbiAyIHVwJ1xuICAgICAgICAgICAgY29uc29sZS50aW1lICd1cGdyYWRlX3NwYWNlX3VzZXInXG4gICAgICAgICAgICB0cnlcbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uID0gZGIuc3BhY2VfdXNlcnNcbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLmZpbmQoe29yZ2FuaXphdGlvbnM6IHskZXhpc3RzOiBmYWxzZX19LCB7ZmllbGRzOiB7b3JnYW5pemF0aW9uOiAxfX0pLmZvckVhY2ggKHN1KS0+XG4gICAgICAgICAgICAgICAgICAgIGlmIHN1Lm9yZ2FuaXphdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbi5kaXJlY3QudXBkYXRlKHN1Ll9pZCwgeyRzZXQ6IHtvcmdhbml6YXRpb25zOiBbc3Uub3JnYW5pemF0aW9uXX19KVxuXG4gICAgICAgICAgICBjYXRjaCBlXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvciBlXG5cbiAgICAgICAgICAgIGNvbnNvbGUudGltZUVuZCAndXBncmFkZV9zcGFjZV91c2VyJ1xuICAgICAgICBkb3duOiAtPlxuICAgICAgICAgICAgY29uc29sZS5sb2cgJ3ZlcnNpb24gMiBkb3duJ1xuIiwiTWV0ZW9yLnN0YXJ0dXAoZnVuY3Rpb24oKSB7XG4gIHJldHVybiBNaWdyYXRpb25zLmFkZCh7XG4gICAgdmVyc2lvbjogMixcbiAgICBuYW1lOiAn57uE57uH57uT5p6E5YWB6K645LiA5Liq5Lq65bGe5LqO5aSa5Liq6YOo6ZeoICMzNzknLFxuICAgIHVwOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBjb2xsZWN0aW9uLCBlO1xuICAgICAgY29uc29sZS5sb2coJ3ZlcnNpb24gMiB1cCcpO1xuICAgICAgY29uc29sZS50aW1lKCd1cGdyYWRlX3NwYWNlX3VzZXInKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbGxlY3Rpb24gPSBkYi5zcGFjZV91c2VycztcbiAgICAgICAgY29sbGVjdGlvbi5maW5kKHtcbiAgICAgICAgICBvcmdhbml6YXRpb25zOiB7XG4gICAgICAgICAgICAkZXhpc3RzOiBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfSwge1xuICAgICAgICAgIGZpZWxkczoge1xuICAgICAgICAgICAgb3JnYW5pemF0aW9uOiAxXG4gICAgICAgICAgfVxuICAgICAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uKHN1KSB7XG4gICAgICAgICAgaWYgKHN1Lm9yZ2FuaXphdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb24uZGlyZWN0LnVwZGF0ZShzdS5faWQsIHtcbiAgICAgICAgICAgICAgJHNldDoge1xuICAgICAgICAgICAgICAgIG9yZ2FuaXphdGlvbnM6IFtzdS5vcmdhbml6YXRpb25dXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBlID0gZXJyb3I7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29uc29sZS50aW1lRW5kKCd1cGdyYWRlX3NwYWNlX3VzZXInKTtcbiAgICB9LFxuICAgIGRvd246IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGNvbnNvbGUubG9nKCd2ZXJzaW9uIDIgZG93bicpO1xuICAgIH1cbiAgfSk7XG59KTtcbiIsIk1ldGVvci5zdGFydHVwIC0+XG4gICAgTWlncmF0aW9ucy5hZGRcbiAgICAgICAgdmVyc2lvbjogM1xuICAgICAgICBuYW1lOiAn57uZc3BhY2VfdXNlcnPooahlbWFpbOWtl+autei1i+WAvCdcbiAgICAgICAgdXA6IC0+XG4gICAgICAgICAgICBjb25zb2xlLmxvZyAndmVyc2lvbiAzIHVwJ1xuICAgICAgICAgICAgY29uc29sZS50aW1lICd1cGdyYWRlX3NwYWNlX3VzZXJfZW1haWwnXG4gICAgICAgICAgICB0cnlcbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uID0gZGIuc3BhY2VfdXNlcnNcbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLmZpbmQoe2VtYWlsOiB7JGV4aXN0czogZmFsc2V9fSwge2ZpZWxkczoge3VzZXI6IDF9fSkuZm9yRWFjaCAoc3UpLT5cbiAgICAgICAgICAgICAgICAgICAgaWYgc3UudXNlclxuICAgICAgICAgICAgICAgICAgICAgICAgdSA9IGRiLnVzZXJzLmZpbmRPbmUoe19pZDogc3UudXNlcn0sIHtmaWVsZHM6IHtlbWFpbHM6IDF9fSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHUgJiYgdS5lbWFpbHMgJiYgdS5lbWFpbHMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIC9eKFtBLVowLTlcXC5cXC1cXF9cXCtdKSooW0EtWjAtOVxcK1xcLVxcX10pK1xcQFtBLVowLTldKyhbXFwtXVtBLVowLTldKykqKFtcXC5dW0EtWjAtOVxcLV0rKXsxLDh9JC9pLnRlc3QodS5lbWFpbHNbMF0uYWRkcmVzcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyA9IHUuZW1haWxzWzBdLmFkZHJlc3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbi5kaXJlY3QudXBkYXRlKHN1Ll9pZCwgeyRzZXQ6IHtlbWFpbDogYWRkcmVzc319KVxuICAgICAgICAgICAgICAgICAgICAgICAgXG5cbiAgICAgICAgICAgIGNhdGNoIGVcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yIGVcblxuICAgICAgICAgICAgY29uc29sZS50aW1lRW5kICd1cGdyYWRlX3NwYWNlX3VzZXJfZW1haWwnXG4gICAgICAgIGRvd246IC0+XG4gICAgICAgICAgICBjb25zb2xlLmxvZyAndmVyc2lvbiAzIGRvd24nXG4iLCJNZXRlb3Iuc3RhcnR1cChmdW5jdGlvbigpIHtcbiAgcmV0dXJuIE1pZ3JhdGlvbnMuYWRkKHtcbiAgICB2ZXJzaW9uOiAzLFxuICAgIG5hbWU6ICfnu5lzcGFjZV91c2Vyc+ihqGVtYWls5a2X5q616LWL5YC8JyxcbiAgICB1cDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgY29sbGVjdGlvbiwgZTtcbiAgICAgIGNvbnNvbGUubG9nKCd2ZXJzaW9uIDMgdXAnKTtcbiAgICAgIGNvbnNvbGUudGltZSgndXBncmFkZV9zcGFjZV91c2VyX2VtYWlsJyk7XG4gICAgICB0cnkge1xuICAgICAgICBjb2xsZWN0aW9uID0gZGIuc3BhY2VfdXNlcnM7XG4gICAgICAgIGNvbGxlY3Rpb24uZmluZCh7XG4gICAgICAgICAgZW1haWw6IHtcbiAgICAgICAgICAgICRleGlzdHM6IGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICB9LCB7XG4gICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICB1c2VyOiAxXG4gICAgICAgICAgfVxuICAgICAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uKHN1KSB7XG4gICAgICAgICAgdmFyIGFkZHJlc3MsIHU7XG4gICAgICAgICAgaWYgKHN1LnVzZXIpIHtcbiAgICAgICAgICAgIHUgPSBkYi51c2Vycy5maW5kT25lKHtcbiAgICAgICAgICAgICAgX2lkOiBzdS51c2VyXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgIGZpZWxkczoge1xuICAgICAgICAgICAgICAgIGVtYWlsczogMVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICh1ICYmIHUuZW1haWxzICYmIHUuZW1haWxzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgaWYgKC9eKFtBLVowLTlcXC5cXC1cXF9cXCtdKSooW0EtWjAtOVxcK1xcLVxcX10pK1xcQFtBLVowLTldKyhbXFwtXVtBLVowLTldKykqKFtcXC5dW0EtWjAtOVxcLV0rKXsxLDh9JC9pLnRlc3QodS5lbWFpbHNbMF0uYWRkcmVzcykpIHtcbiAgICAgICAgICAgICAgICBhZGRyZXNzID0gdS5lbWFpbHNbMF0uYWRkcmVzcztcbiAgICAgICAgICAgICAgICByZXR1cm4gY29sbGVjdGlvbi5kaXJlY3QudXBkYXRlKHN1Ll9pZCwge1xuICAgICAgICAgICAgICAgICAgJHNldDoge1xuICAgICAgICAgICAgICAgICAgICBlbWFpbDogYWRkcmVzc1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGUgPSBlcnJvcjtcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb25zb2xlLnRpbWVFbmQoJ3VwZ3JhZGVfc3BhY2VfdXNlcl9lbWFpbCcpO1xuICAgIH0sXG4gICAgZG93bjogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gY29uc29sZS5sb2coJ3ZlcnNpb24gMyBkb3duJyk7XG4gICAgfVxuICB9KTtcbn0pO1xuIiwiTWV0ZW9yLnN0YXJ0dXAgLT5cbiAgICBNaWdyYXRpb25zLmFkZFxuICAgICAgICB2ZXJzaW9uOiA0XG4gICAgICAgIG5hbWU6ICfnu5lvcmdhbml6YXRpb25z6KGo6K6+572uc29ydF9ubydcbiAgICAgICAgdXA6IC0+XG4gICAgICAgICAgICBjb25zb2xlLmxvZyAndmVyc2lvbiA0IHVwJ1xuICAgICAgICAgICAgY29uc29sZS50aW1lICd1cGdyYWRlX29yZ2FuaXphdGlvbnNfc29ydF9ubydcbiAgICAgICAgICAgIHRyeVxuICAgICAgICAgICAgICAgIGRiLm9yZ2FuaXphdGlvbnMuZGlyZWN0LnVwZGF0ZSh7c29ydF9ubzogeyRleGlzdHM6IGZhbHNlfX0sIHskc2V0OiB7c29ydF9ubzogMTAwfX0sIHttdWx0aTogdHJ1ZX0pXG4gICAgICAgICAgICBjYXRjaCBlXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvciBlXG5cbiAgICAgICAgICAgIGNvbnNvbGUudGltZUVuZCAndXBncmFkZV9vcmdhbml6YXRpb25zX3NvcnRfbm8nXG4gICAgICAgIGRvd246IC0+XG4gICAgICAgICAgICBjb25zb2xlLmxvZyAndmVyc2lvbiA0IGRvd24nXG4iLCJNZXRlb3Iuc3RhcnR1cChmdW5jdGlvbigpIHtcbiAgcmV0dXJuIE1pZ3JhdGlvbnMuYWRkKHtcbiAgICB2ZXJzaW9uOiA0LFxuICAgIG5hbWU6ICfnu5lvcmdhbml6YXRpb25z6KGo6K6+572uc29ydF9ubycsXG4gICAgdXA6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGU7XG4gICAgICBjb25zb2xlLmxvZygndmVyc2lvbiA0IHVwJyk7XG4gICAgICBjb25zb2xlLnRpbWUoJ3VwZ3JhZGVfb3JnYW5pemF0aW9uc19zb3J0X25vJyk7XG4gICAgICB0cnkge1xuICAgICAgICBkYi5vcmdhbml6YXRpb25zLmRpcmVjdC51cGRhdGUoe1xuICAgICAgICAgIHNvcnRfbm86IHtcbiAgICAgICAgICAgICRleGlzdHM6IGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICB9LCB7XG4gICAgICAgICAgJHNldDoge1xuICAgICAgICAgICAgc29ydF9ubzogMTAwXG4gICAgICAgICAgfVxuICAgICAgICB9LCB7XG4gICAgICAgICAgbXVsdGk6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBlID0gZXJyb3I7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29uc29sZS50aW1lRW5kKCd1cGdyYWRlX29yZ2FuaXphdGlvbnNfc29ydF9ubycpO1xuICAgIH0sXG4gICAgZG93bjogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gY29uc29sZS5sb2coJ3ZlcnNpb24gNCBkb3duJyk7XG4gICAgfVxuICB9KTtcbn0pO1xuIiwiTWV0ZW9yLnN0YXJ0dXAgLT5cblx0TWlncmF0aW9ucy5hZGRcblx0XHR2ZXJzaW9uOiA1XG5cdFx0bmFtZTogJ+ino+WGs+WIoOmZpG9yZ2FuaXphdGlvbuWvvOiHtHNwYWNlX3VzZXLmlbDmja7plJnor6/nmoTpl67popgnXG5cdFx0dXA6IC0+XG5cdFx0XHRjb25zb2xlLmxvZyAndmVyc2lvbiA1IHVwJ1xuXHRcdFx0Y29uc29sZS50aW1lICdmaXhfc3BhY2VfdXNlcl9vcmdhbml6YXRpb25zJ1xuXHRcdFx0dHJ5XG5cblx0XHRcdFx0ZGIuc3BhY2VfdXNlcnMuZmluZCgpLmZvckVhY2ggKHN1KS0+XG5cdFx0XHRcdFx0aWYgbm90IHN1Lm9yZ2FuaXphdGlvbnNcblx0XHRcdFx0XHRcdHJldHVyblxuXHRcdFx0XHRcdGlmIHN1Lm9yZ2FuaXphdGlvbnMubGVuZ3RoIGlzIDFcblx0XHRcdFx0XHRcdGNoZWNrX2NvdW50ID0gZGIub3JnYW5pemF0aW9ucy5maW5kKHN1Lm9yZ2FuaXphdGlvbnNbMF0pLmNvdW50KClcblx0XHRcdFx0XHRcdGlmIGNoZWNrX2NvdW50IGlzIDBcblx0XHRcdFx0XHRcdFx0cm9vdF9vcmcgPSBkYi5vcmdhbml6YXRpb25zLmZpbmRPbmUoe3NwYWNlOiBzdS5zcGFjZSwgcGFyZW50OiBudWxsfSlcblx0XHRcdFx0XHRcdFx0aWYgcm9vdF9vcmdcblx0XHRcdFx0XHRcdFx0XHRyID0gZGIuc3BhY2VfdXNlcnMuZGlyZWN0LnVwZGF0ZSh7X2lkOiBzdS5faWR9LCB7JHNldDoge29yZ2FuaXphdGlvbnM6IFtyb290X29yZy5faWRdLCBvcmdhbml6YXRpb246IHJvb3Rfb3JnLl9pZH19KVxuXHRcdFx0XHRcdFx0XHRcdGlmIHJcblx0XHRcdFx0XHRcdFx0XHRcdHJvb3Rfb3JnLnVwZGF0ZVVzZXJzKClcblx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IgXCJmaXhfc3BhY2VfdXNlcl9vcmdhbml6YXRpb25zXCJcblx0XHRcdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yIHN1Ll9pZFxuXHRcdFx0XHRcdGVsc2UgaWYgc3Uub3JnYW5pemF0aW9ucy5sZW5ndGggPiAxXG5cdFx0XHRcdFx0XHRyZW1vdmVkX29yZ19pZHMgPSBbXVxuXHRcdFx0XHRcdFx0c3Uub3JnYW5pemF0aW9ucy5mb3JFYWNoIChvKS0+XG5cdFx0XHRcdFx0XHRcdGNoZWNrX2NvdW50ID0gZGIub3JnYW5pemF0aW9ucy5maW5kKG8pLmNvdW50KClcblx0XHRcdFx0XHRcdFx0aWYgY2hlY2tfY291bnQgaXMgMFxuXHRcdFx0XHRcdFx0XHRcdHJlbW92ZWRfb3JnX2lkcy5wdXNoKG8pXG5cdFx0XHRcdFx0XHRpZiByZW1vdmVkX29yZ19pZHMubGVuZ3RoID4gMFxuXHRcdFx0XHRcdFx0XHRuZXdfb3JnX2lkcyA9IF8uZGlmZmVyZW5jZShzdS5vcmdhbml6YXRpb25zLCByZW1vdmVkX29yZ19pZHMpXG5cdFx0XHRcdFx0XHRcdGlmIG5ld19vcmdfaWRzLmluY2x1ZGVzKHN1Lm9yZ2FuaXphdGlvbilcblx0XHRcdFx0XHRcdFx0XHRkYi5zcGFjZV91c2Vycy5kaXJlY3QudXBkYXRlKHtfaWQ6IHN1Ll9pZH0sIHskc2V0OiB7b3JnYW5pemF0aW9uczogbmV3X29yZ19pZHN9fSlcblx0XHRcdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0XHRcdGRiLnNwYWNlX3VzZXJzLmRpcmVjdC51cGRhdGUoe19pZDogc3UuX2lkfSwgeyRzZXQ6IHtvcmdhbml6YXRpb25zOiBuZXdfb3JnX2lkcywgb3JnYW5pemF0aW9uOiBuZXdfb3JnX2lkc1swXX19KVxuXG5cdFx0XHRjYXRjaCBlXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IgXCJmaXhfc3BhY2VfdXNlcl9vcmdhbml6YXRpb25zXCJcblx0XHRcdFx0Y29uc29sZS5lcnJvciBlLnN0YWNrXG5cblx0XHRcdGNvbnNvbGUudGltZUVuZCAnZml4X3NwYWNlX3VzZXJfb3JnYW5pemF0aW9ucydcblx0XHRkb3duOiAtPlxuXHRcdFx0Y29uc29sZS5sb2cgJ3ZlcnNpb24gNSBkb3duJ1xuIiwiTWV0ZW9yLnN0YXJ0dXAoZnVuY3Rpb24oKSB7XG4gIHJldHVybiBNaWdyYXRpb25zLmFkZCh7XG4gICAgdmVyc2lvbjogNSxcbiAgICBuYW1lOiAn6Kej5Yaz5Yig6Zmkb3JnYW5pemF0aW9u5a+86Ie0c3BhY2VfdXNlcuaVsOaNrumUmeivr+eahOmXrumimCcsXG4gICAgdXA6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGU7XG4gICAgICBjb25zb2xlLmxvZygndmVyc2lvbiA1IHVwJyk7XG4gICAgICBjb25zb2xlLnRpbWUoJ2ZpeF9zcGFjZV91c2VyX29yZ2FuaXphdGlvbnMnKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGRiLnNwYWNlX3VzZXJzLmZpbmQoKS5mb3JFYWNoKGZ1bmN0aW9uKHN1KSB7XG4gICAgICAgICAgdmFyIGNoZWNrX2NvdW50LCBuZXdfb3JnX2lkcywgciwgcmVtb3ZlZF9vcmdfaWRzLCByb290X29yZztcbiAgICAgICAgICBpZiAoIXN1Lm9yZ2FuaXphdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN1Lm9yZ2FuaXphdGlvbnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBjaGVja19jb3VudCA9IGRiLm9yZ2FuaXphdGlvbnMuZmluZChzdS5vcmdhbml6YXRpb25zWzBdKS5jb3VudCgpO1xuICAgICAgICAgICAgaWYgKGNoZWNrX2NvdW50ID09PSAwKSB7XG4gICAgICAgICAgICAgIHJvb3Rfb3JnID0gZGIub3JnYW5pemF0aW9ucy5maW5kT25lKHtcbiAgICAgICAgICAgICAgICBzcGFjZTogc3Uuc3BhY2UsXG4gICAgICAgICAgICAgICAgcGFyZW50OiBudWxsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBpZiAocm9vdF9vcmcpIHtcbiAgICAgICAgICAgICAgICByID0gZGIuc3BhY2VfdXNlcnMuZGlyZWN0LnVwZGF0ZSh7XG4gICAgICAgICAgICAgICAgICBfaWQ6IHN1Ll9pZFxuICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICRzZXQ6IHtcbiAgICAgICAgICAgICAgICAgICAgb3JnYW5pemF0aW9uczogW3Jvb3Rfb3JnLl9pZF0sXG4gICAgICAgICAgICAgICAgICAgIG9yZ2FuaXphdGlvbjogcm9vdF9vcmcuX2lkXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHIpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiByb290X29yZy51cGRhdGVVc2VycygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiZml4X3NwYWNlX3VzZXJfb3JnYW5pemF0aW9uc1wiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29uc29sZS5lcnJvcihzdS5faWQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChzdS5vcmdhbml6YXRpb25zLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHJlbW92ZWRfb3JnX2lkcyA9IFtdO1xuICAgICAgICAgICAgc3Uub3JnYW5pemF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKG8pIHtcbiAgICAgICAgICAgICAgY2hlY2tfY291bnQgPSBkYi5vcmdhbml6YXRpb25zLmZpbmQobykuY291bnQoKTtcbiAgICAgICAgICAgICAgaWYgKGNoZWNrX2NvdW50ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlbW92ZWRfb3JnX2lkcy5wdXNoKG8pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZW1vdmVkX29yZ19pZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBuZXdfb3JnX2lkcyA9IF8uZGlmZmVyZW5jZShzdS5vcmdhbml6YXRpb25zLCByZW1vdmVkX29yZ19pZHMpO1xuICAgICAgICAgICAgICBpZiAobmV3X29yZ19pZHMuaW5jbHVkZXMoc3Uub3JnYW5pemF0aW9uKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkYi5zcGFjZV91c2Vycy5kaXJlY3QudXBkYXRlKHtcbiAgICAgICAgICAgICAgICAgIF9pZDogc3UuX2lkXG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgJHNldDoge1xuICAgICAgICAgICAgICAgICAgICBvcmdhbml6YXRpb25zOiBuZXdfb3JnX2lkc1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBkYi5zcGFjZV91c2Vycy5kaXJlY3QudXBkYXRlKHtcbiAgICAgICAgICAgICAgICAgIF9pZDogc3UuX2lkXG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgJHNldDoge1xuICAgICAgICAgICAgICAgICAgICBvcmdhbml6YXRpb25zOiBuZXdfb3JnX2lkcyxcbiAgICAgICAgICAgICAgICAgICAgb3JnYW5pemF0aW9uOiBuZXdfb3JnX2lkc1swXVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGUgPSBlcnJvcjtcbiAgICAgICAgY29uc29sZS5lcnJvcihcImZpeF9zcGFjZV91c2VyX29yZ2FuaXphdGlvbnNcIik7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZS5zdGFjayk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29uc29sZS50aW1lRW5kKCdmaXhfc3BhY2VfdXNlcl9vcmdhbml6YXRpb25zJyk7XG4gICAgfSxcbiAgICBkb3duOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBjb25zb2xlLmxvZygndmVyc2lvbiA1IGRvd24nKTtcbiAgICB9XG4gIH0pO1xufSk7XG4iLCJNZXRlb3Iuc3RhcnR1cCAtPlxuXHRNaWdyYXRpb25zLmFkZFxuXHRcdHZlcnNpb246IDZcblx0XHRuYW1lOiAn6LSi5Yqh57O757uf5Y2H57qnJ1xuXHRcdHVwOiAtPlxuXHRcdFx0Y29uc29sZS5sb2cgJ3ZlcnNpb24gNiB1cCdcblx0XHRcdGNvbnNvbGUudGltZSAnYmlsbGluZyB1cGdyYWRlJ1xuXHRcdFx0dHJ5XG5cdFx0XHRcdCMg5riF56m6bW9kdWxlc+ihqFxuXHRcdFx0XHRkYi5tb2R1bGVzLnJlbW92ZSh7fSlcblxuXHRcdFx0XHRkYi5tb2R1bGVzLmluc2VydCh7XG5cdFx0XHRcdFx0XCJfaWRcIjogXCJ3b3JrZmxvdy5zdGFuZGFyZFwiLFxuXHRcdFx0XHRcdFwibmFtZV9lblwiOiBcIldvcmtmbG93IFN0YW5kYXJkXCIsXG5cdFx0XHRcdFx0XCJuYW1lXCI6IFwid29ya2Zsb3cuc3RhbmRhcmRcIixcblx0XHRcdFx0XHRcIm5hbWVfemhcIjogXCLlrqHmibnnjovln7rnoYDniYhcIixcblx0XHRcdFx0XHRcImxpc3RwcmljZVwiOiAxLjAsXG5cdFx0XHRcdFx0XCJsaXN0cHJpY2Vfcm1iXCI6IDJcblx0XHRcdFx0fSlcblxuXHRcdFx0XHRkYi5tb2R1bGVzLmluc2VydCh7XG5cdFx0XHRcdFx0XCJfaWRcIjogXCJ3b3JrZmxvdy5wcm9mZXNzaW9uYWxcIixcblx0XHRcdFx0XHRcIm5hbWVfZW5cIjogXCJXb3JrZmxvdyBQcm9mZXNzaW9uYWxcIixcblx0XHRcdFx0XHRcIm5hbWVcIjogXCJ3b3JrZmxvdy5wcm9mZXNzaW9uYWxcIixcblx0XHRcdFx0XHRcIm5hbWVfemhcIjogXCLlrqHmibnnjovkuJPkuJrniYjmianlsZXljIVcIixcblx0XHRcdFx0XHRcImxpc3RwcmljZVwiOiAzLjAsXG5cdFx0XHRcdFx0XCJsaXN0cHJpY2Vfcm1iXCI6IDE4XG5cdFx0XHRcdH0pXG5cblx0XHRcdFx0ZGIubW9kdWxlcy5pbnNlcnQoe1xuXHRcdFx0XHRcdFwiX2lkXCI6IFwid29ya2Zsb3cuZW50ZXJwcmlzZVwiLFxuXHRcdFx0XHRcdFwibmFtZV9lblwiOiBcIldvcmtmbG93IEVudGVycHJpc2VcIixcblx0XHRcdFx0XHRcIm5hbWVcIjogXCJ3b3JrZmxvdy5lbnRlcnByaXNlXCIsXG5cdFx0XHRcdFx0XCJuYW1lX3poXCI6IFwi5a6h5om5546L5LyB5Lia54mI5omp5bGV5YyFXCIsXG5cdFx0XHRcdFx0XCJsaXN0cHJpY2VcIjogNi4wLFxuXHRcdFx0XHRcdFwibGlzdHByaWNlX3JtYlwiOiA0MFxuXHRcdFx0XHR9KVxuXG5cblx0XHRcdFx0c3RhcnRfZGF0ZSA9IG5ldyBEYXRlKG1vbWVudChuZXcgRGF0ZSkuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKSlcblx0XHRcdFx0ZGIuc3BhY2VzLmZpbmQoe2lzX3BhaWQ6IHRydWUsIHVzZXJfbGltaXQ6IHskZXhpc3RzOiBmYWxzZX0sIG1vZHVsZXM6IHskZXhpc3RzOiB0cnVlfX0pLmZvckVhY2ggKHMpLT5cblx0XHRcdFx0XHR0cnlcblx0XHRcdFx0XHRcdHNldF9vYmogPSB7fVxuXHRcdFx0XHRcdFx0dXNlcl9jb3VudCA9IGRiLnNwYWNlX3VzZXJzLmZpbmQoe3NwYWNlOiBzLl9pZCwgdXNlcl9hY2NlcHRlZDogdHJ1ZX0pLmNvdW50KClcblx0XHRcdFx0XHRcdHNldF9vYmoudXNlcl9saW1pdCA9IHVzZXJfY291bnRcblx0XHRcdFx0XHRcdGJhbGFuY2UgPSBzLmJhbGFuY2Vcblx0XHRcdFx0XHRcdGlmIGJhbGFuY2UgPiAwXG5cdFx0XHRcdFx0XHRcdG1vbnRocyA9IDBcblx0XHRcdFx0XHRcdFx0bGlzdHByaWNlcyA9IDBcblx0XHRcdFx0XHRcdFx0Xy5lYWNoIHMubW9kdWxlcywgKHBtKS0+XG5cdFx0XHRcdFx0XHRcdFx0bW9kdWxlID0gZGIubW9kdWxlcy5maW5kT25lKHtuYW1lOiBwbX0pXG5cdFx0XHRcdFx0XHRcdFx0aWYgbW9kdWxlIGFuZCBtb2R1bGUubGlzdHByaWNlXG5cdFx0XHRcdFx0XHRcdFx0XHRsaXN0cHJpY2VzICs9IG1vZHVsZS5saXN0cHJpY2Vcblx0XHRcdFx0XHRcdFx0bW9udGhzID0gcGFyc2VJbnQoKGJhbGFuY2UvKGxpc3RwcmljZXMqdXNlcl9jb3VudCkpLnRvRml4ZWQoKSkgKyAxXG5cdFx0XHRcdFx0XHRcdGVuZF9kYXRlID0gbmV3IERhdGVcblx0XHRcdFx0XHRcdFx0ZW5kX2RhdGUuc2V0TW9udGgoZW5kX2RhdGUuZ2V0TW9udGgoKSttb250aHMpXG5cdFx0XHRcdFx0XHRcdGVuZF9kYXRlID0gbmV3IERhdGUobW9tZW50KGVuZF9kYXRlKS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpKVxuXHRcdFx0XHRcdFx0XHRzZXRfb2JqLnN0YXJ0X2RhdGUgPSBzdGFydF9kYXRlXG5cdFx0XHRcdFx0XHRcdHNldF9vYmouZW5kX2RhdGUgPSBlbmRfZGF0ZVxuXG5cdFx0XHRcdFx0XHRlbHNlIGlmIGJhbGFuY2UgPD0gMFxuXHRcdFx0XHRcdFx0XHRzZXRfb2JqLnN0YXJ0X2RhdGUgPSBzdGFydF9kYXRlXG5cdFx0XHRcdFx0XHRcdHNldF9vYmouZW5kX2RhdGUgPSBuZXcgRGF0ZVxuXG5cdFx0XHRcdFx0XHRzLm1vZHVsZXMucHVzaChcIndvcmtmbG93LnN0YW5kYXJkXCIpXG5cdFx0XHRcdFx0XHRzZXRfb2JqLm1vZHVsZXMgPSBfLnVuaXEocy5tb2R1bGVzKVxuXHRcdFx0XHRcdFx0ZGIuc3BhY2VzLmRpcmVjdC51cGRhdGUoe19pZDogcy5faWR9LCB7JHNldDogc2V0X29ian0pXG5cdFx0XHRcdFx0Y2F0Y2ggZVxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciBcImJpbGxpbmcgc3BhY2UgdXBncmFkZVwiXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKHMuX2lkKVxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvcihzZXRfb2JqKVxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciBlLnN0YWNrXG5cblx0XHRcdGNhdGNoIGVcblx0XHRcdFx0Y29uc29sZS5lcnJvciBcImJpbGxpbmcgdXBncmFkZVwiXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IgZS5zdGFja1xuXG5cdFx0XHRjb25zb2xlLnRpbWVFbmQgJ2JpbGxpbmcgdXBncmFkZSdcblx0XHRkb3duOiAtPlxuXHRcdFx0Y29uc29sZS5sb2cgJ3ZlcnNpb24gNiBkb3duJ1xuIiwiTWV0ZW9yLnN0YXJ0dXAoZnVuY3Rpb24oKSB7XG4gIHJldHVybiBNaWdyYXRpb25zLmFkZCh7XG4gICAgdmVyc2lvbjogNixcbiAgICBuYW1lOiAn6LSi5Yqh57O757uf5Y2H57qnJyxcbiAgICB1cDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZSwgc3RhcnRfZGF0ZTtcbiAgICAgIGNvbnNvbGUubG9nKCd2ZXJzaW9uIDYgdXAnKTtcbiAgICAgIGNvbnNvbGUudGltZSgnYmlsbGluZyB1cGdyYWRlJyk7XG4gICAgICB0cnkge1xuICAgICAgICBkYi5tb2R1bGVzLnJlbW92ZSh7fSk7XG4gICAgICAgIGRiLm1vZHVsZXMuaW5zZXJ0KHtcbiAgICAgICAgICBcIl9pZFwiOiBcIndvcmtmbG93LnN0YW5kYXJkXCIsXG4gICAgICAgICAgXCJuYW1lX2VuXCI6IFwiV29ya2Zsb3cgU3RhbmRhcmRcIixcbiAgICAgICAgICBcIm5hbWVcIjogXCJ3b3JrZmxvdy5zdGFuZGFyZFwiLFxuICAgICAgICAgIFwibmFtZV96aFwiOiBcIuWuoeaJueeOi+WfuuehgOeJiFwiLFxuICAgICAgICAgIFwibGlzdHByaWNlXCI6IDEuMCxcbiAgICAgICAgICBcImxpc3RwcmljZV9ybWJcIjogMlxuICAgICAgICB9KTtcbiAgICAgICAgZGIubW9kdWxlcy5pbnNlcnQoe1xuICAgICAgICAgIFwiX2lkXCI6IFwid29ya2Zsb3cucHJvZmVzc2lvbmFsXCIsXG4gICAgICAgICAgXCJuYW1lX2VuXCI6IFwiV29ya2Zsb3cgUHJvZmVzc2lvbmFsXCIsXG4gICAgICAgICAgXCJuYW1lXCI6IFwid29ya2Zsb3cucHJvZmVzc2lvbmFsXCIsXG4gICAgICAgICAgXCJuYW1lX3poXCI6IFwi5a6h5om5546L5LiT5Lia54mI5omp5bGV5YyFXCIsXG4gICAgICAgICAgXCJsaXN0cHJpY2VcIjogMy4wLFxuICAgICAgICAgIFwibGlzdHByaWNlX3JtYlwiOiAxOFxuICAgICAgICB9KTtcbiAgICAgICAgZGIubW9kdWxlcy5pbnNlcnQoe1xuICAgICAgICAgIFwiX2lkXCI6IFwid29ya2Zsb3cuZW50ZXJwcmlzZVwiLFxuICAgICAgICAgIFwibmFtZV9lblwiOiBcIldvcmtmbG93IEVudGVycHJpc2VcIixcbiAgICAgICAgICBcIm5hbWVcIjogXCJ3b3JrZmxvdy5lbnRlcnByaXNlXCIsXG4gICAgICAgICAgXCJuYW1lX3poXCI6IFwi5a6h5om5546L5LyB5Lia54mI5omp5bGV5YyFXCIsXG4gICAgICAgICAgXCJsaXN0cHJpY2VcIjogNi4wLFxuICAgICAgICAgIFwibGlzdHByaWNlX3JtYlwiOiA0MFxuICAgICAgICB9KTtcbiAgICAgICAgc3RhcnRfZGF0ZSA9IG5ldyBEYXRlKG1vbWVudChuZXcgRGF0ZSkuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKSk7XG4gICAgICAgIGRiLnNwYWNlcy5maW5kKHtcbiAgICAgICAgICBpc19wYWlkOiB0cnVlLFxuICAgICAgICAgIHVzZXJfbGltaXQ6IHtcbiAgICAgICAgICAgICRleGlzdHM6IGZhbHNlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtb2R1bGVzOiB7XG4gICAgICAgICAgICAkZXhpc3RzOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uKHMpIHtcbiAgICAgICAgICB2YXIgYmFsYW5jZSwgZSwgZW5kX2RhdGUsIGxpc3RwcmljZXMsIG1vbnRocywgc2V0X29iaiwgdXNlcl9jb3VudDtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgc2V0X29iaiA9IHt9O1xuICAgICAgICAgICAgdXNlcl9jb3VudCA9IGRiLnNwYWNlX3VzZXJzLmZpbmQoe1xuICAgICAgICAgICAgICBzcGFjZTogcy5faWQsXG4gICAgICAgICAgICAgIHVzZXJfYWNjZXB0ZWQ6IHRydWVcbiAgICAgICAgICAgIH0pLmNvdW50KCk7XG4gICAgICAgICAgICBzZXRfb2JqLnVzZXJfbGltaXQgPSB1c2VyX2NvdW50O1xuICAgICAgICAgICAgYmFsYW5jZSA9IHMuYmFsYW5jZTtcbiAgICAgICAgICAgIGlmIChiYWxhbmNlID4gMCkge1xuICAgICAgICAgICAgICBtb250aHMgPSAwO1xuICAgICAgICAgICAgICBsaXN0cHJpY2VzID0gMDtcbiAgICAgICAgICAgICAgXy5lYWNoKHMubW9kdWxlcywgZnVuY3Rpb24ocG0pIHtcbiAgICAgICAgICAgICAgICB2YXIgbW9kdWxlO1xuICAgICAgICAgICAgICAgIG1vZHVsZSA9IGRiLm1vZHVsZXMuZmluZE9uZSh7XG4gICAgICAgICAgICAgICAgICBuYW1lOiBwbVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChtb2R1bGUgJiYgbW9kdWxlLmxpc3RwcmljZSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGxpc3RwcmljZXMgKz0gbW9kdWxlLmxpc3RwcmljZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBtb250aHMgPSBwYXJzZUludCgoYmFsYW5jZSAvIChsaXN0cHJpY2VzICogdXNlcl9jb3VudCkpLnRvRml4ZWQoKSkgKyAxO1xuICAgICAgICAgICAgICBlbmRfZGF0ZSA9IG5ldyBEYXRlO1xuICAgICAgICAgICAgICBlbmRfZGF0ZS5zZXRNb250aChlbmRfZGF0ZS5nZXRNb250aCgpICsgbW9udGhzKTtcbiAgICAgICAgICAgICAgZW5kX2RhdGUgPSBuZXcgRGF0ZShtb21lbnQoZW5kX2RhdGUpLmZvcm1hdChcIllZWVktTU0tRERcIikpO1xuICAgICAgICAgICAgICBzZXRfb2JqLnN0YXJ0X2RhdGUgPSBzdGFydF9kYXRlO1xuICAgICAgICAgICAgICBzZXRfb2JqLmVuZF9kYXRlID0gZW5kX2RhdGU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGJhbGFuY2UgPD0gMCkge1xuICAgICAgICAgICAgICBzZXRfb2JqLnN0YXJ0X2RhdGUgPSBzdGFydF9kYXRlO1xuICAgICAgICAgICAgICBzZXRfb2JqLmVuZF9kYXRlID0gbmV3IERhdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzLm1vZHVsZXMucHVzaChcIndvcmtmbG93LnN0YW5kYXJkXCIpO1xuICAgICAgICAgICAgc2V0X29iai5tb2R1bGVzID0gXy51bmlxKHMubW9kdWxlcyk7XG4gICAgICAgICAgICByZXR1cm4gZGIuc3BhY2VzLmRpcmVjdC51cGRhdGUoe1xuICAgICAgICAgICAgICBfaWQ6IHMuX2lkXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICRzZXQ6IHNldF9vYmpcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBlID0gZXJyb3I7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiYmlsbGluZyBzcGFjZSB1cGdyYWRlXCIpO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihzLl9pZCk7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKHNldF9vYmopO1xuICAgICAgICAgICAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoZS5zdGFjayk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGUgPSBlcnJvcjtcbiAgICAgICAgY29uc29sZS5lcnJvcihcImJpbGxpbmcgdXBncmFkZVwiKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihlLnN0YWNrKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb25zb2xlLnRpbWVFbmQoJ2JpbGxpbmcgdXBncmFkZScpO1xuICAgIH0sXG4gICAgZG93bjogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gY29uc29sZS5sb2coJ3ZlcnNpb24gNiBkb3duJyk7XG4gICAgfVxuICB9KTtcbn0pO1xuIiwiTWV0ZW9yLnN0YXJ0dXAgKCktPlxuICAgIHJvb3RVUkwgPSBNZXRlb3IuYWJzb2x1dGVVcmwoKVxuICAgIGlmICFNZXRlb3Iuc2V0dGluZ3MucHVibGljLndlYnNlcnZpY2VzXG4gICAgICAgIE1ldGVvci5zZXR0aW5ncy5wdWJsaWMud2Vic2VydmljZXMgPSB7XG4gICAgICAgICAgICBcImNyZWF0b3JcIjoge1xuICAgICAgICAgICAgICAgIFwidXJsXCI6IHJvb3RVUkxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgaWYgIU1ldGVvci5zZXR0aW5ncy5wdWJsaWMud2Vic2VydmljZXMuY3JlYXRvclxuICAgICAgICBNZXRlb3Iuc2V0dGluZ3MucHVibGljLndlYnNlcnZpY2VzLmNyZWF0b3IgPSB7XG4gICAgICAgICAgICBcInVybFwiOiByb290VVJMXG4gICAgICAgIH1cblxuICAgIGlmICFNZXRlb3Iuc2V0dGluZ3MucHVibGljLndlYnNlcnZpY2VzLmNyZWF0b3IudXJsXG4gICAgICAgIE1ldGVvci5zZXR0aW5ncy5wdWJsaWMud2Vic2VydmljZXMuY3JlYXRvci51cmwgPSByb290VVJMIiwiTWV0ZW9yLnN0YXJ0dXAoZnVuY3Rpb24oKSB7XG4gIHZhciByb290VVJMO1xuICByb290VVJMID0gTWV0ZW9yLmFic29sdXRlVXJsKCk7XG4gIGlmICghTWV0ZW9yLnNldHRpbmdzW1wicHVibGljXCJdLndlYnNlcnZpY2VzKSB7XG4gICAgTWV0ZW9yLnNldHRpbmdzW1wicHVibGljXCJdLndlYnNlcnZpY2VzID0ge1xuICAgICAgXCJjcmVhdG9yXCI6IHtcbiAgICAgICAgXCJ1cmxcIjogcm9vdFVSTFxuICAgICAgfVxuICAgIH07XG4gIH1cbiAgaWYgKCFNZXRlb3Iuc2V0dGluZ3NbXCJwdWJsaWNcIl0ud2Vic2VydmljZXMuY3JlYXRvcikge1xuICAgIE1ldGVvci5zZXR0aW5nc1tcInB1YmxpY1wiXS53ZWJzZXJ2aWNlcy5jcmVhdG9yID0ge1xuICAgICAgXCJ1cmxcIjogcm9vdFVSTFxuICAgIH07XG4gIH1cbiAgaWYgKCFNZXRlb3Iuc2V0dGluZ3NbXCJwdWJsaWNcIl0ud2Vic2VydmljZXMuY3JlYXRvci51cmwpIHtcbiAgICByZXR1cm4gTWV0ZW9yLnNldHRpbmdzW1wicHVibGljXCJdLndlYnNlcnZpY2VzLmNyZWF0b3IudXJsID0gcm9vdFVSTDtcbiAgfVxufSk7XG4iLCJpZihwcm9jZXNzLmVudi5DUkVBVE9SX05PREVfRU5WID09ICdkZXZlbG9wbWVudCcpe1xuXHQvL01ldGVvciDniYjmnKzljYfnuqfliLAxLjkg5Y+K5Lul5LiK5pe2KG5vZGUg54mI5pysIDExKynvvIzlj6/ku6XliKDpmaTmraTku6PnoIFcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KEFycmF5LnByb3RvdHlwZSwgJ2ZsYXQnLCB7XG5cdFx0dmFsdWU6IGZ1bmN0aW9uKGRlcHRoID0gMSkge1xuXHRcdFx0cmV0dXJuIHRoaXMucmVkdWNlKGZ1bmN0aW9uIChmbGF0LCB0b0ZsYXR0ZW4pIHtcblx0XHRcdFx0cmV0dXJuIGZsYXQuY29uY2F0KChBcnJheS5pc0FycmF5KHRvRmxhdHRlbikgJiYgKGRlcHRoPjEpKSA/IHRvRmxhdHRlbi5mbGF0KGRlcHRoLTEpIDogdG9GbGF0dGVuKTtcblx0XHRcdH0sIFtdKTtcblx0XHR9XG5cdH0pO1xufSIsIk1ldGVvci5zdGFydHVwICgpLT5cblx0bmV3IFRhYnVsYXIuVGFibGVcblx0XHRuYW1lOiBcImN1c3RvbWl6ZV9hcHBzXCIsXG5cdFx0Y29sbGVjdGlvbjogZGIuYXBwcyxcblx0XHRjb2x1bW5zOiBbXG5cdFx0XHR7XG5cdFx0XHRcdGRhdGE6IFwibmFtZVwiXG5cdFx0XHRcdG9yZGVyYWJsZTogZmFsc2Vcblx0XHRcdH1cblx0XHRdXG5cdFx0ZG9tOiBcInRwXCJcblx0XHRleHRyYUZpZWxkczogW1wiX2lkXCIsIFwic3BhY2VcIl1cblx0XHRsZW5ndGhDaGFuZ2U6IGZhbHNlXG5cdFx0b3JkZXJpbmc6IGZhbHNlXG5cdFx0cGFnZUxlbmd0aDogMTBcblx0XHRpbmZvOiBmYWxzZVxuXHRcdHNlYXJjaGluZzogdHJ1ZVxuXHRcdGF1dG9XaWR0aDogdHJ1ZVxuXHRcdGNoYW5nZVNlbGVjdG9yOiAoc2VsZWN0b3IsIHVzZXJJZCkgLT5cblx0XHRcdHVubGVzcyB1c2VySWRcblx0XHRcdFx0cmV0dXJuIHtfaWQ6IC0xfVxuXHRcdFx0c3BhY2UgPSBzZWxlY3Rvci5zcGFjZVxuXHRcdFx0dW5sZXNzIHNwYWNlXG5cdFx0XHRcdGlmIHNlbGVjdG9yPy4kYW5kPy5sZW5ndGggPiAwXG5cdFx0XHRcdFx0c3BhY2UgPSBzZWxlY3Rvci4kYW5kLmdldFByb3BlcnR5KCdzcGFjZScpWzBdXG5cdFx0XHR1bmxlc3Mgc3BhY2Vcblx0XHRcdFx0cmV0dXJuIHtfaWQ6IC0xfVxuXHRcdFx0cmV0dXJuIHNlbGVjdG9yIiwiTWV0ZW9yLnN0YXJ0dXAoZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgVGFidWxhci5UYWJsZSh7XG4gICAgbmFtZTogXCJjdXN0b21pemVfYXBwc1wiLFxuICAgIGNvbGxlY3Rpb246IGRiLmFwcHMsXG4gICAgY29sdW1uczogW1xuICAgICAge1xuICAgICAgICBkYXRhOiBcIm5hbWVcIixcbiAgICAgICAgb3JkZXJhYmxlOiBmYWxzZVxuICAgICAgfVxuICAgIF0sXG4gICAgZG9tOiBcInRwXCIsXG4gICAgZXh0cmFGaWVsZHM6IFtcIl9pZFwiLCBcInNwYWNlXCJdLFxuICAgIGxlbmd0aENoYW5nZTogZmFsc2UsXG4gICAgb3JkZXJpbmc6IGZhbHNlLFxuICAgIHBhZ2VMZW5ndGg6IDEwLFxuICAgIGluZm86IGZhbHNlLFxuICAgIHNlYXJjaGluZzogdHJ1ZSxcbiAgICBhdXRvV2lkdGg6IHRydWUsXG4gICAgY2hhbmdlU2VsZWN0b3I6IGZ1bmN0aW9uKHNlbGVjdG9yLCB1c2VySWQpIHtcbiAgICAgIHZhciByZWYsIHNwYWNlO1xuICAgICAgaWYgKCF1c2VySWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBfaWQ6IC0xXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBzcGFjZSA9IHNlbGVjdG9yLnNwYWNlO1xuICAgICAgaWYgKCFzcGFjZSkge1xuICAgICAgICBpZiAoKHNlbGVjdG9yICE9IG51bGwgPyAocmVmID0gc2VsZWN0b3IuJGFuZCkgIT0gbnVsbCA/IHJlZi5sZW5ndGggOiB2b2lkIDAgOiB2b2lkIDApID4gMCkge1xuICAgICAgICAgIHNwYWNlID0gc2VsZWN0b3IuJGFuZC5nZXRQcm9wZXJ0eSgnc3BhY2UnKVswXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFzcGFjZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIF9pZDogLTFcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZWxlY3RvcjtcbiAgICB9XG4gIH0pO1xufSk7XG4iXX0= +//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvczpiYXNlL2NoZWNrTnBtLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zOmJhc2UvbGliL3N0ZWVkb3NfdXRpbC5qcyIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19iYXNlL2xpYi9jb3JlLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvbGliL2NvcmUuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zOmJhc2UvbGliL3NpbXBsZV9zY2hlbWFfZXh0ZW5kLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX2Jhc2UvbGliL21ldGhvZHMvbGFzdF9sb2dvbi5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL2xpYi9tZXRob2RzL2xhc3RfbG9nb24uY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX2Jhc2UvbGliL21ldGhvZHMvdXNlcl9hZGRfZW1haWwuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9saWIvbWV0aG9kcy91c2VyX2FkZF9lbWFpbC5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3NfYmFzZS9saWIvbWV0aG9kcy91c2VyX2F2YXRhci5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL2xpYi9tZXRob2RzL3VzZXJfYXZhdGFyLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvczpiYXNlL2xpYi9tZXRob2RzL2VtYWlsX3RlbXBsYXRlc19yZXNldC5qcyIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvczpiYXNlL2xpYi9tZXRob2RzL3VwZ3JhZGVfZGF0YS5qcyIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19iYXNlL2xpYi9zdGVlZG9zL3B1c2guY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9saWIvc3RlZWRvcy9wdXNoLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19iYXNlL2xpYi9hZG1pbi5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL2xpYi9hZG1pbi5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3M6YmFzZS9saWIvYXJyYXlfaW5jbHVkZXMuanMiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3NfYmFzZS9saWIvc2V0dGluZ3MuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9saWIvc2V0dGluZ3MuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX2Jhc2UvbGliL3VzZXJfb2JqZWN0X3ZpZXcuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9saWIvdXNlcl9vYmplY3Rfdmlldy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3M6YmFzZS9saWIvc2VydmVyX3Nlc3Npb24uanMiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3NfYmFzZS9yb3V0ZXMvYXBpX2dldF9hcHBzLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcm91dGVzL2FwaV9nZXRfYXBwcy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3NfYmFzZS9yb3V0ZXMvY29sbGVjdGlvbi5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3JvdXRlcy9jb2xsZWN0aW9uLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19iYXNlL3JvdXRlcy9zc28uY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9yb3V0ZXMvc3NvLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19iYXNlL3JvdXRlcy9hdmF0YXIuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9yb3V0ZXMvYXZhdGFyLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19iYXNlL3JvdXRlcy9hY2Nlc3NfdG9rZW4uY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9yb3V0ZXMvYWNjZXNzX3Rva2VuLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19iYXNlL3NlcnZlci9wdWJsaWNhdGlvbnMvYXBwcy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9wdWJsaWNhdGlvbnMvYXBwcy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3NfYmFzZS9zZXJ2ZXIvcHVibGljYXRpb25zL215X3NwYWNlcy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9wdWJsaWNhdGlvbnMvbXlfc3BhY2VzLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19iYXNlL3NlcnZlci9wdWJsaWNhdGlvbnMvc3BhY2VfYXZhdGFyLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvc2VydmVyL3B1YmxpY2F0aW9ucy9zcGFjZV9hdmF0YXIuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX2Jhc2Uvc2VydmVyL3B1YmxpY2F0aW9ucy9tb2R1bGVzLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvc2VydmVyL3B1YmxpY2F0aW9ucy9tb2R1bGVzLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19iYXNlL3NlcnZlci9wdWJsaWNhdGlvbnMvd2VpeGluX3BheV9jb2RlX3VybC5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9wdWJsaWNhdGlvbnMvd2VpeGluX3BheV9jb2RlX3VybC5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3NfYmFzZS9zZXJ2ZXIvcm91dGVzL2FwaV9iaWxsaW5nX3JlY2hhcmdlX25vdGlmeS5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9yb3V0ZXMvYXBpX2JpbGxpbmdfcmVjaGFyZ2Vfbm90aWZ5LmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19iYXNlL3NlcnZlci9tZXRob2RzL215X2NvbnRhY3RzX2xpbWl0LmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvc2VydmVyL21ldGhvZHMvbXlfY29udGFjdHNfbGltaXQuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zOmJhc2Uvc2VydmVyL21ldGhvZHMvc2V0S2V5VmFsdWUuanMiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3NfYmFzZS9zZXJ2ZXIvbWV0aG9kcy9iaWxsaW5nX3NldHRsZXVwLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvc2VydmVyL21ldGhvZHMvYmlsbGluZ19zZXR0bGV1cC5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3NfYmFzZS9zZXJ2ZXIvbWV0aG9kcy9zZXRVc2VybmFtZS5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9tZXRob2RzL3NldFVzZXJuYW1lLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19iYXNlL3NlcnZlci9tZXRob2RzL2JpbGxpbmdfcmVjaGFyZ2UuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvbWV0aG9kcy9iaWxsaW5nX3JlY2hhcmdlLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19iYXNlL3NlcnZlci9tZXRob2RzL2dldF9zcGFjZV91c2VyX2NvdW50LmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19iYXNlL3NlcnZlci9tZXRob2RzL3VzZXJfc2VjcmV0LmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvc2VydmVyL21ldGhvZHMvdXNlcl9zZWNyZXQuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX2Jhc2Uvc2VydmVyL21ldGhvZHMvb2JqZWN0X3dvcmtmbG93cy5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9tZXRob2RzL29iamVjdF93b3JrZmxvd3MuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX2Jhc2Uvc2VydmVyL21ldGhvZHMvc2V0X3NwYWNlX3VzZXJfcGFzc3dvcmQuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvbWV0aG9kcy9zZXRfc3BhY2VfdXNlcl9wYXNzd29yZC5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3NfYmFzZS9zZXJ2ZXIvbGliL2JpbGxpbmdfbWFuYWdlci5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9saWIvYmlsbGluZ19tYW5hZ2VyLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvczpiYXNlL3NlcnZlci9zY2hlZHVsZS9zdGF0aXN0aWNzLmpzIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX2Jhc2Uvc2VydmVyL3N0ZWVkb3Mvc3RhcnR1cC9taWdyYXRpb25zL3YxLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvc2VydmVyL3N0ZWVkb3Mvc3RhcnR1cC9taWdyYXRpb25zL3YxLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19iYXNlL3NlcnZlci9zdGVlZG9zL3N0YXJ0dXAvbWlncmF0aW9ucy92Mi5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9zdGVlZG9zL3N0YXJ0dXAvbWlncmF0aW9ucy92Mi5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3NfYmFzZS9zZXJ2ZXIvc3RlZWRvcy9zdGFydHVwL21pZ3JhdGlvbnMvdjMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvc3RlZWRvcy9zdGFydHVwL21pZ3JhdGlvbnMvdjMuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX2Jhc2Uvc2VydmVyL3N0ZWVkb3Mvc3RhcnR1cC9taWdyYXRpb25zL3Y0LmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvc2VydmVyL3N0ZWVkb3Mvc3RhcnR1cC9taWdyYXRpb25zL3Y0LmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvcGFja2FnZXMvc3RlZWRvc19iYXNlL3NlcnZlci9zdGVlZG9zL3N0YXJ0dXAvbWlncmF0aW9ucy92NS5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3NlcnZlci9zdGVlZG9zL3N0YXJ0dXAvbWlncmF0aW9ucy92NS5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3NfYmFzZS9zZXJ2ZXIvc3RlZWRvcy9zdGFydHVwL21pZ3JhdGlvbnMvdjYuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvc3RlZWRvcy9zdGFydHVwL21pZ3JhdGlvbnMvdjYuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9wYWNrYWdlcy9zdGVlZG9zX2Jhc2Uvc2VydmVyL3N0YXJ0dXAuY29mZmVlIiwibWV0ZW9yOi8v8J+Su2FwcC9zZXJ2ZXIvc3RhcnR1cC5jb2ZmZWUiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3M6YmFzZS9zZXJ2ZXIvZGV2ZWxvcG1lbnQuanMiLCJtZXRlb3I6Ly/wn5K7YXBwL3BhY2thZ2VzL3N0ZWVkb3NfYmFzZS90YWJ1bGFyLmNvZmZlZSIsIm1ldGVvcjovL/CfkrthcHAvdGFidWxhci5jb2ZmZWUiXSwibmFtZXMiOlsiY2hlY2tOcG1WZXJzaW9ucyIsIm1vZHVsZSIsImxpbmsiLCJ2IiwiY29va2llcyIsIm1rZGlycCIsIk1ldGVvciIsInNldHRpbmdzIiwiYmlsbGluZyIsIkFycmF5IiwicHJvdG90eXBlIiwic29ydEJ5TmFtZSIsImxvY2FsZSIsIlN0ZWVkb3MiLCJzb3J0IiwicDEiLCJwMiIsInAxX3NvcnRfbm8iLCJzb3J0X25vIiwicDJfc29ydF9ubyIsIm5hbWUiLCJsb2NhbGVDb21wYXJlIiwiZ2V0UHJvcGVydHkiLCJrIiwiZm9yRWFjaCIsInQiLCJtIiwicHVzaCIsInJlbW92ZSIsImZyb20iLCJ0byIsInJlc3QiLCJzbGljZSIsImxlbmd0aCIsImFwcGx5IiwiZmlsdGVyUHJvcGVydHkiLCJoIiwibCIsImciLCJkIiwiaW5jbHVkZXMiLCJPYmplY3QiLCJ1bmRlZmluZWQiLCJmaW5kUHJvcGVydHlCeVBLIiwiciIsIkNvb2tpZXMiLCJjcnlwdG8iLCJtaXhpbiIsInJlZiIsInJlZjEiLCJyZWYyIiwicmVmMyIsInJlZjQiLCJyb290VXJsIiwiZGIiLCJzdWJzIiwiaXNQaG9uZUVuYWJsZWQiLCJwaG9uZSIsIm51bWJlclRvU3RyaW5nIiwibnVtYmVyIiwic2NhbGUiLCJub3RUaG91c2FuZHMiLCJyZWciLCJ0b1N0cmluZyIsIk51bWJlciIsInRvRml4ZWQiLCJtYXRjaCIsInJlcGxhY2UiLCJ2YWxpSnF1ZXJ5U3ltYm9scyIsInN0ciIsIlJlZ0V4cCIsInRlc3QiLCJpc0NvcmRvdmEiLCJpc0NsaWVudCIsImFic29sdXRlVXJsIiwiZGVmYXVsdE9wdGlvbnMiLCJlbmRzV2l0aCIsInN1YnN0ciIsIndpbmRvdyIsInN0b3JlcyIsIkFQSSIsImNsaWVudCIsInNldFVybCIsIlNldHRpbmdzIiwic2V0Um9vdFVybCIsImF1dG9ydW4iLCJyZWY1IiwicmVmNiIsInJlZjciLCJyZWY4Iiwic2V0VXNlcklkIiwidXNlcklkIiwic2V0VGVuYW50SWQiLCJzcGFjZUlkIiwiZ2V0SGVscFVybCIsImNvdW50cnkiLCJzdWJzdHJpbmciLCJpc0V4cHJlc3Npb24iLCJmdW5jIiwicGF0dGVybiIsInJlZzEiLCJyZWcyIiwicGFyc2VTaW5nbGVFeHByZXNzaW9uIiwiZm9ybURhdGEiLCJkYXRhUGF0aCIsImdsb2JhbCIsImVycm9yIiwiZnVuY0JvZHkiLCJnZXRQYXJlbnRQYXRoIiwiZ2V0VmFsdWVCeVBhdGgiLCJnbG9iYWxUYWciLCJwYXJlbnQiLCJwYXJlbnRQYXRoIiwicGF0aCIsInBhdGhBcnIiLCJzcGxpdCIsInBvcCIsImpvaW4iLCJfIiwiZ2V0IiwiY29uc29sZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJGdW5jdGlvbiIsImVycm9yMSIsImxvZyIsInNwYWNlVXBncmFkZWRNb2RhbCIsInN3YWwiLCJ0aXRsZSIsIlRBUGkxOG4iLCJfXyIsInRleHQiLCJodG1sIiwidHlwZSIsImNvbmZpcm1CdXR0b25UZXh0IiwiZ2V0QWNjb3VudEJnQm9keVZhbHVlIiwiYWNjb3VudEJnQm9keSIsInN0ZWVkb3Nfa2V5dmFsdWVzIiwiZmluZE9uZSIsInVzZXIiLCJrZXkiLCJ2YWx1ZSIsImFwcGx5QWNjb3VudEJnQm9keVZhbHVlIiwiYWNjb3VudEJnQm9keVZhbHVlIiwiaXNOZWVkVG9Mb2NhbCIsImF2YXRhciIsInVybCIsImxvZ2dpbmdJbiIsImxvY2FsU3RvcmFnZSIsImdldEl0ZW0iLCJzZXRJdGVtIiwicmVtb3ZlSXRlbSIsImdldEFjY291bnRTa2luVmFsdWUiLCJhY2NvdW50U2tpbiIsImdldEFjY291bnRab29tVmFsdWUiLCJhY2NvdW50Wm9vbSIsImFwcGx5QWNjb3VudFpvb21WYWx1ZSIsImFjY291bnRab29tVmFsdWUiLCJ6b29tTmFtZSIsInpvb21TaXplIiwic2l6ZSIsIiQiLCJyZW1vdmVDbGFzcyIsIlNlc3Npb24iLCJhZGRDbGFzcyIsInNob3dIZWxwIiwiZ2V0TG9jYWxlIiwib3BlbiIsImdldFVybFdpdGhUb2tlbiIsImF1dGhUb2tlbiIsImxpbmtlciIsImdldFNwYWNlSWQiLCJBY2NvdW50cyIsIl9zdG9yZWRMb2dpblRva2VuIiwiaW5kZXhPZiIsInBhcmFtIiwiZ2V0QXBwVXJsV2l0aFRva2VuIiwiYXBwX2lkIiwib3BlbkFwcFdpdGhUb2tlbiIsImFwcCIsImFwcHMiLCJpc19uZXdfd2luZG93IiwiaXNNb2JpbGUiLCJsb2NhdGlvbiIsIm9wZW5XaW5kb3ciLCJvcGVuVXJsV2l0aElFIiwiY21kIiwiZXhlYyIsIm9wZW5fdXJsIiwiaXNOb2RlIiwibnciLCJyZXF1aXJlIiwic3Rkb3V0Iiwic3RkZXJyIiwidG9hc3RyIiwib3BlbkFwcCIsImUiLCJldmFsRnVuU3RyaW5nIiwib25fY2xpY2siLCJyZWRpcmVjdFRvU2lnbkluIiwiRmxvd1JvdXRlciIsImdvIiwiaXNfdXNlX2llIiwib3JpZ2luIiwiaXNJbnRlcm5hbEFwcCIsImlzX3VzZV9pZnJhbWUiLCJfaWQiLCJldmFsIiwibWVzc2FnZSIsInN0YWNrIiwic2V0IiwiY2hlY2tTcGFjZUJhbGFuY2UiLCJlbmRfZGF0ZSIsIm1pbl9tb250aHMiLCJzcGFjZSIsImlzU3BhY2VBZG1pbiIsInNwYWNlcyIsImhhc0ZlYXR1cmUiLCJEYXRlIiwic2V0TW9kYWxNYXhIZWlnaHQiLCJvZmZzZXQiLCJkZXRlY3RJRSIsImVhY2giLCJmb290ZXJIZWlnaHQiLCJoZWFkZXJIZWlnaHQiLCJoZWlnaHQiLCJ0b3RhbEhlaWdodCIsIm91dGVySGVpZ2h0IiwiaW5uZXJIZWlnaHQiLCJoYXNDbGFzcyIsImNzcyIsImdldE1vZGFsTWF4SGVpZ2h0IiwicmVWYWx1ZSIsInNjcmVlbiIsImlzaU9TIiwidXNlckFnZW50IiwibGFuZ3VhZ2UiLCJERVZJQ0UiLCJicm93c2VyIiwiY29uRXhwIiwiZGV2aWNlIiwibnVtRXhwIiwiYW5kcm9pZCIsImJsYWNrYmVycnkiLCJkZXNrdG9wIiwiaXBhZCIsImlwaG9uZSIsImlwb2QiLCJtb2JpbGUiLCJuYXZpZ2F0b3IiLCJ0b0xvd2VyQ2FzZSIsImJyb3dzZXJMYW5ndWFnZSIsImdldFVzZXJPcmdhbml6YXRpb25zIiwiaXNJbmNsdWRlUGFyZW50cyIsIm9yZ2FuaXphdGlvbnMiLCJwYXJlbnRzIiwic3BhY2VfdXNlciIsInNwYWNlX3VzZXJzIiwiZmllbGRzIiwiZmxhdHRlbiIsImZpbmQiLCIkaW4iLCJmZXRjaCIsInVuaW9uIiwiZm9yYmlkTm9kZUNvbnRleHRtZW51IiwidGFyZ2V0IiwiaWZyIiwiZG9jdW1lbnQiLCJib2R5IiwiYWRkRXZlbnRMaXN0ZW5lciIsImV2IiwicHJldmVudERlZmF1bHQiLCJsb2FkIiwiaWZyQm9keSIsImNvbnRlbnRzIiwiaXNTZXJ2ZXIiLCJhZG1pbnMiLCJpc0xlZ2FsVmVyc2lvbiIsImFwcF92ZXJzaW9uIiwiY2hlY2siLCJtb2R1bGVzIiwiaXNPcmdBZG1pbkJ5T3JnSWRzIiwib3JnSWRzIiwiYWxsb3dBY2Nlc3NPcmdzIiwiaXNPcmdBZG1pbiIsInVzZU9yZ3MiLCJmaWx0ZXIiLCJvcmciLCJ1bmlxIiwiaXNPcmdBZG1pbkJ5QWxsT3JnSWRzIiwiaSIsInJvb3RfdXJsIiwiVVJMIiwicGF0aG5hbWUiLCJnZXRBUElMb2dpblVzZXIiLCJyZXEiLCJyZXMiLCJwYXNzd29yZCIsInJlc3VsdCIsInVzZXJuYW1lIiwicXVlcnkiLCJ1c2VycyIsInN0ZWVkb3NfaWQiLCJfY2hlY2tQYXNzd29yZCIsIkVycm9yIiwiY2hlY2tBdXRoVG9rZW4iLCJoZWFkZXJzIiwiaGFzaGVkVG9rZW4iLCJfaGFzaExvZ2luVG9rZW4iLCJkZWNyeXB0IiwiaXYiLCJjIiwiZGVjaXBoZXIiLCJkZWNpcGhlck1zZyIsImtleTMyIiwibGVuIiwiY3JlYXRlRGVjaXBoZXJpdiIsIkJ1ZmZlciIsImNvbmNhdCIsInVwZGF0ZSIsImZpbmFsIiwiZW5jcnlwdCIsImNpcGhlciIsImNpcGhlcmVkTXNnIiwiY3JlYXRlQ2lwaGVyaXYiLCJnZXRVc2VySWRGcm9tQWNjZXNzVG9rZW4iLCJhY2Nlc3NfdG9rZW4iLCJjb2xsZWN0aW9uIiwib2JqIiwib0F1dGgyU2VydmVyIiwiY29sbGVjdGlvbnMiLCJhY2Nlc3NUb2tlbiIsImV4cGlyZXMiLCJnZXRVc2VySWRGcm9tQXV0aFRva2VuIiwiQVBJQXV0aGVudGljYXRpb25DaGVjayIsIkpzb25Sb3V0ZXMiLCJzZW5kUmVzdWx0IiwiZGF0YSIsImNvZGUiLCJmdW5jdGlvbnMiLCJhcmdzIiwiX3dyYXBwZWQiLCJhcmd1bWVudHMiLCJjYWxsIiwiaXNIb2xpZGF5IiwiZGF0ZSIsImRheSIsImdldERheSIsImNhY3VsYXRlV29ya2luZ1RpbWUiLCJkYXlzIiwiY2FjdWxhdGVEYXRlIiwicGFyYW1fZGF0ZSIsImdldFRpbWUiLCJjYWN1bGF0ZVBsdXNIYWxmV29ya2luZ0RheSIsIm5leHQiLCJjYWN1bGF0ZWRfZGF0ZSIsImZpcnN0X2RhdGUiLCJqIiwibWF4X2luZGV4Iiwic2Vjb25kX2RhdGUiLCJzdGFydF9kYXRlIiwidGltZV9wb2ludHMiLCJyZW1pbmQiLCJpc0VtcHR5Iiwic2V0SG91cnMiLCJob3VyIiwic2V0TWludXRlcyIsIm1pbnV0ZSIsImV4dGVuZCIsImdldFN0ZWVkb3NUb2tlbiIsImFwcElkIiwibm93Iiwic2VjcmV0Iiwic3RlZWRvc190b2tlbiIsInBhcnNlSW50IiwiaXNJMThuIiwiY2hlY2tVc2VybmFtZUF2YWlsYWJpbGl0eSIsIiRyZWdleCIsIl9lc2NhcGVSZWdFeHAiLCJ0cmltIiwidmFsaWRhdGVQYXNzd29yZCIsInB3ZCIsInBhc3N3b3JQb2xpY3kiLCJwYXNzd29yUG9saWN5RXJyb3IiLCJyZWFzb24iLCJ2YWxpZCIsInBvbGljeSIsInBvbGljeUVycm9yIiwiY29udmVydFNwZWNpYWxDaGFyYWN0ZXIiLCJyZW1vdmVTcGVjaWFsQ2hhcmFjdGVyIiwiQ3JlYXRvciIsImdldERCQXBwcyIsInNwYWNlX2lkIiwiZGJBcHBzIiwiQ29sbGVjdGlvbnMiLCJpc19jcmVhdG9yIiwidmlzaWJsZSIsImNyZWF0ZWQiLCJjcmVhdGVkX2J5IiwibW9kaWZpZWQiLCJtb2RpZmllZF9ieSIsImdldERCRGFzaGJvYXJkcyIsImRiRGFzaGJvYXJkcyIsImRhc2hib2FyZCIsImdldEF1dGhUb2tlbiIsImF1dGhvcml6YXRpb24iLCJzZXNzaW9uU3RvcmFnZSIsImdldEN1cnJlbnRBcHBJZCIsImZvcm1hdEluZGV4IiwiYXJyYXkiLCJpbmRleE5hbWUiLCJpc2RvY3VtZW50REIiLCJvYmplY3QiLCJiYWNrZ3JvdW5kIiwiZGF0YXNvdXJjZXMiLCJkb2N1bWVudERCIiwic3RhcnR1cCIsIlNpbXBsZVNjaGVtYSIsImV4dGVuZE9wdGlvbnMiLCJmb3JlaWduX2tleSIsIk1hdGNoIiwiT3B0aW9uYWwiLCJCb29sZWFuIiwicmVmZXJlbmNlcyIsIm1ldGhvZHMiLCJ1cGRhdGVVc2VyTGFzdExvZ29uIiwiJHNldCIsImxhc3RfbG9nb24iLCJvbkxvZ2luIiwidXNlcnNfYWRkX2VtYWlsIiwiZW1haWwiLCJjb3VudCIsImVtYWlscyIsImRpcmVjdCIsIiRwdXNoIiwiYWRkcmVzcyIsInZlcmlmaWVkIiwic2VuZFZlcmlmaWNhdGlvbkVtYWlsIiwidXNlcnNfcmVtb3ZlX2VtYWlsIiwicCIsIiRwdWxsIiwidXNlcnNfdmVyaWZ5X2VtYWlsIiwidXNlcnNfc2V0X3ByaW1hcnlfZW1haWwiLCJwcmltYXJ5IiwibXVsdGkiLCJzaG93Q2FuY2VsQnV0dG9uIiwiY2xvc2VPbkNvbmZpcm0iLCJhbmltYXRpb24iLCJpbnB1dFZhbHVlIiwidXBkYXRlVXNlckF2YXRhciIsImVtYWlsVGVtcGxhdGVzIiwiZGVmYXVsdEZyb20iLCJyZXNldFBhc3N3b3JkIiwic3ViamVjdCIsInNwbGl0cyIsInRva2VuQ29kZSIsImdyZWV0aW5nIiwicHJvZmlsZSIsInRva2VuX2NvZGUiLCJ2ZXJpZnlFbWFpbCIsImVucm9sbEFjY291bnQiLCJhZGQiLCJvcmdzIiwiZnVsbG5hbWUiLCIkbmUiLCJjYWxjdWxhdGVGdWxsbmFtZSIsInJldCIsIm1zZyIsIlB1c2giLCJDb25maWd1cmUiLCJzZW5kZXJJRCIsIkFORFJPSURfU0VOREVSX0lEIiwic291bmQiLCJ2aWJyYXRlIiwiaW9zIiwiYmFkZ2UiLCJjbGVhckJhZGdlIiwiYWxlcnQiLCJhcHBOYW1lIiwiU2VsZWN0b3IiLCJzZWxlY3RvckNoZWNrU3BhY2VBZG1pbiIsInNlbGVjdG9yIiwiaXNfY2xvdWRhZG1pbiIsIm1hcCIsIm4iLCJzZWxlY3RvckNoZWNrU3BhY2UiLCJ1IiwiYmlsbGluZ19wYXlfcmVjb3JkcyIsImFkbWluQ29uZmlnIiwiaWNvbiIsImNvbG9yIiwidGFibGVDb2x1bW5zIiwiZXh0cmFGaWVsZHMiLCJyb3V0ZXJBZG1pbiIsInBhaWQiLCJzaG93RWRpdENvbHVtbiIsInNob3dEZWxDb2x1bW4iLCJkaXNhYmxlQWRkIiwicGFnZUxlbmd0aCIsIm9yZGVyIiwic3BhY2VfdXNlcl9zaWducyIsIkFkbWluQ29uZmlnIiwiY29sbGVjdGlvbnNfYWRkIiwic2VhcmNoRWxlbWVudCIsIk8iLCJjdXJyZW50RWxlbWVudCIsIndlYnNlcnZpY2VzIiwid3d3Iiwic3RhdHVzIiwiZ2V0VXNlck9iamVjdHNMaXN0Vmlld3MiLCJvYmplY3RzIiwiX2dldFVzZXJPYmplY3RMaXN0Vmlld3MiLCJrZXlzIiwibGlzdFZpZXdzIiwib2JqZWN0c1ZpZXdzIiwiZ2V0Q29sbGVjdGlvbiIsIm9iamVjdF9uYW1lIiwib3duZXIiLCJzaGFyZWQiLCJfdXNlcl9vYmplY3RfbGlzdF92aWV3cyIsIm9saXN0Vmlld3MiLCJvdiIsImxpc3R2aWV3IiwibyIsImxpc3RfdmlldyIsImdldFVzZXJPYmplY3RMaXN0Vmlld3MiLCJvYmplY3RfbGlzdHZpZXciLCJ1c2VyX2lkIiwidXVmbG93TWFuYWdlciIsImdldFNwYWNlIiwiJG9yIiwiJGV4aXN0cyIsImVycm9ycyIsImVycm9yTWVzc2FnZSIsInN0ZWVkb3NBdXRoIiwiYWxsb3dfbW9kZWxzIiwibW9kZWwiLCJvcHRpb25zIiwidXNlclNlc3Npb24iLCJTdHJpbmciLCJ3cmFwQXN5bmMiLCJjYiIsImdldFNlc3Npb24iLCJ0aGVuIiwicmVzb2x2ZSIsInJlamVjdCIsImV4cHJlc3MiLCJkZXNfY2lwaGVyIiwiZGVzX2NpcGhlcmVkTXNnIiwiZGVzX2l2IiwiZGVzX3N0ZWVkb3NfdG9rZW4iLCJqb2luZXIiLCJrZXk4IiwicmVkaXJlY3RVcmwiLCJyZXR1cm51cmwiLCJwYXJhbXMiLCJ3cml0ZUhlYWQiLCJlbmQiLCJlbmNvZGVVUkkiLCJzZXRIZWFkZXIiLCJjb2xvcl9pbmRleCIsImNvbG9ycyIsImZvbnRTaXplIiwiaW5pdGlhbHMiLCJwb3NpdGlvbiIsInJlcU1vZGlmaWVkSGVhZGVyIiwic3ZnIiwidXNlcm5hbWVfYXJyYXkiLCJ3aWR0aCIsInciLCJmcyIsImdldFJlbGF0aXZlVXJsIiwiYXZhdGFyVXJsIiwiZmlsZSIsIndyaXRlIiwiaXRlbSIsImNoYXJDb2RlQXQiLCJ0b1VwcGVyQ2FzZSIsInRvVVRDU3RyaW5nIiwicmVhZFN0cmVhbSIsInBpcGUiLCJwdWJsaXNoIiwicmVhZHkiLCJoYW5kbGUiLCJoYW5kbGUyIiwib2JzZXJ2ZVNwYWNlcyIsInNlbGYiLCJzdXMiLCJ1c2VyU3BhY2VzIiwidXNlcl9hY2NlcHRlZCIsInN1Iiwib2JzZXJ2ZSIsImFkZGVkIiwiZG9jIiwicmVtb3ZlZCIsIm9sZERvYyIsIndpdGhvdXQiLCJzdG9wIiwiY2hhbmdlZCIsIm5ld0RvYyIsIm9uU3RvcCIsImVuYWJsZV9yZWdpc3RlciIsIm9uIiwiY2h1bmsiLCJiaW5kRW52aXJvbm1lbnQiLCJwYXJzZXIiLCJ4bWwyanMiLCJQYXJzZXIiLCJleHBsaWNpdEFycmF5IiwiZXhwbGljaXRSb290IiwicGFyc2VTdHJpbmciLCJlcnIiLCJXWFBheSIsImF0dGFjaCIsImJwciIsImNvZGVfdXJsX2lkIiwic2lnbiIsInd4cGF5IiwiYXBwaWQiLCJtY2hfaWQiLCJwYXJ0bmVyX2tleSIsImNsb25lIiwicGFyc2UiLCJ0b3RhbF9mZWUiLCJiaWxsaW5nTWFuYWdlciIsInNwZWNpYWxfcGF5IiwidXNlcl9jb3VudCIsImdldF9jb250YWN0c19saW1pdCIsImZyb21zIiwiZnJvbXNDaGlsZHJlbiIsImZyb21zQ2hpbGRyZW5JZHMiLCJpc0xpbWl0IiwibGVuMSIsImxpbWl0IiwibGltaXRzIiwibXlMaXRtaXRPcmdJZHMiLCJteU9yZ0lkIiwibXlPcmdJZHMiLCJteU9yZ3MiLCJvdXRzaWRlX29yZ2FuaXphdGlvbnMiLCJzZXR0aW5nIiwidGVtcElzTGltaXQiLCJ0b09yZ3MiLCJ0b3MiLCJzcGFjZV9zZXR0aW5ncyIsInZhbHVlcyIsImludGVyc2VjdGlvbiIsInNldEtleVZhbHVlIiwiaW5zZXJ0IiwiYmlsbGluZ19zZXR0bGV1cCIsImFjY291bnRpbmdfbW9udGgiLCJFbWFpbCIsInRpbWUiLCJpc19wYWlkIiwicyIsImNhY3VsYXRlX2J5X2FjY291bnRpbmdfbW9udGgiLCJQYWNrYWdlIiwic2VuZCIsInRpbWVFbmQiLCJzZXRVc2VybmFtZSIsInNwYWNlVXNlciIsImludml0ZV9zdGF0ZSIsImJpbGxpbmdfcmVjaGFyZ2UiLCJuZXdfaWQiLCJtb2R1bGVfbmFtZXMiLCJsaXN0cHJpY2VzIiwib25lX21vbnRoX3l1YW4iLCJvcmRlcl9ib2R5IiwicmVzdWx0X29iaiIsInNwYWNlX3VzZXJfY291bnQiLCJsaXN0cHJpY2Vfcm1iIiwibmFtZV96aCIsImNyZWF0ZVVuaWZpZWRPcmRlciIsIm91dF90cmFkZV9ubyIsIm1vbWVudCIsImZvcm1hdCIsInNwYmlsbF9jcmVhdGVfaXAiLCJub3RpZnlfdXJsIiwidHJhZGVfdHlwZSIsInByb2R1Y3RfaWQiLCJpbmZvIiwiZ2V0X3NwYWNlX3VzZXJfY291bnQiLCJ1c2VyX2NvdW50X2luZm8iLCJ0b3RhbF91c2VyX2NvdW50IiwiYWNjZXB0ZWRfdXNlcl9jb3VudCIsImNyZWF0ZV9zZWNyZXQiLCJyZW1vdmVfc2VjcmV0IiwidG9rZW4iLCJjdXJTcGFjZVVzZXIiLCJvd3MiLCJmbG93X2lkIiwiZmwiLCJwZXJtcyIsImZsb3dfbmFtZSIsImNhbl9hZGQiLCJ1c2Vyc19jYW5fYWRkIiwib3Jnc19jYW5fYWRkIiwic29tZSIsInNldFNwYWNlVXNlclBhc3N3b3JkIiwic3BhY2VfdXNlcl9pZCIsImNoYW5nZWRVc2VySW5mbyIsImN1cnJlbnRVc2VyIiwibGFuZyIsImxvZ291dCIsInVzZXJDUCIsInNldFBhc3N3b3JkIiwic2VydmljZXMiLCJiY3J5cHQiLCJtb2JpbGVfdmVyaWZpZWQiLCJTTVNRdWV1ZSIsIkZvcm1hdCIsIkFjdGlvbiIsIlBhcmFtU3RyaW5nIiwiUmVjTnVtIiwiU2lnbk5hbWUiLCJUZW1wbGF0ZUNvZGUiLCJnZXRfYWNjb3VudGluZ19wZXJpb2QiLCJjb3VudF9kYXlzIiwiZW5kX2RhdGVfdGltZSIsInN0YXJ0X2RhdGVfdGltZSIsImJpbGxpbmdzIiwidHJhbnNhY3Rpb24iLCJiaWxsaW5nX2RhdGUiLCJnZXREYXRlIiwicmVmcmVzaF9iYWxhbmNlIiwicmVmcmVzaF9kYXRlIiwiYXBwX2JpbGwiLCJiX20iLCJiX21fZCIsImJpbGwiLCJjcmVkaXRzIiwiZGViaXRzIiwibGFzdF9iYWxhbmNlIiwibGFzdF9iaWxsIiwicGF5bWVudF9iaWxsIiwic2V0T2JqIiwiJGx0IiwiYmlsbGluZ19tb250aCIsImJhbGFuY2UiLCJnZXRfYmFsYW5jZSIsIm1vZHVsZV9uYW1lIiwibGlzdHByaWNlIiwiYWNjb3VudGluZ19kYXRlIiwiYWNjb3VudGluZ19kYXRlX2Zvcm1hdCIsImRheXNfbnVtYmVyIiwibmV3X2JpbGwiLCIkbHRlIiwiX21ha2VOZXdJRCIsImdldFNwYWNlVXNlckNvdW50IiwicmVjYWN1bGF0ZUJhbGFuY2UiLCJyZWZyZXNoX2RhdGVzIiwicl9kIiwiZ2V0X21vZHVsZXMiLCJtX2NoYW5nZWxvZyIsIm1vZHVsZXNfY2hhbmdlbG9ncyIsImNoYW5nZV9kYXRlIiwib3BlcmF0aW9uIiwiZ2V0X21vZHVsZXNfbmFtZSIsIm1vZHVsZXNfbmFtZSIsImFfbSIsIm5ld2VzdF9iaWxsIiwicGVyaW9kX3Jlc3VsdCIsInJlbWFpbmluZ19tb250aHMiLCJiIiwib3BlcmF0b3JfaWQiLCJuZXdfbW9kdWxlcyIsInNwYWNlX3VwZGF0ZV9vYmoiLCJkaWZmZXJlbmNlIiwiX2QiLCJ1c2VyX2xpbWl0IiwibWNsIiwib3BlcmF0b3IiLCJjcm9uIiwic3RhdGlzdGljcyIsInNjaGVkdWxlIiwicnVsZSIsImdvX25leHQiLCJzY2hlZHVsZUpvYiIsImRhdGVGb3JtYXQiLCJkYXRla2V5IiwiZ2V0RnVsbFllYXIiLCJnZXRNb250aCIsInllc3RlckRheSIsImROb3ciLCJkQmVmb3JlIiwiZGFpbHlTdGF0aWNzQ291bnQiLCJzdGF0aWNzIiwiJGd0Iiwic3RhdGljc0NvdW50Iiwib3duZXJOYW1lIiwibGFzdExvZ29uIiwic1VzZXJzIiwic1VzZXIiLCJsYXN0TW9kaWZpZWQiLCJvYmpBcnIiLCJtb2QiLCJwb3N0c0F0dGFjaG1lbnRzIiwiYXR0U2l6ZSIsInNpemVTdW0iLCJwb3N0cyIsInBvc3QiLCJhdHRzIiwiY2ZzIiwiYXR0Iiwib3JpZ2luYWwiLCJkYWlseVBvc3RzQXR0YWNobWVudHMiLCJzdGVlZG9zX3N0YXRpc3RpY3MiLCJzcGFjZV9uYW1lIiwib3duZXJfbmFtZSIsInN0ZWVkb3MiLCJ3b3JrZmxvdyIsImZsb3dzIiwiZm9ybXMiLCJmbG93X3JvbGVzIiwiZmxvd19wb3NpdGlvbnMiLCJpbnN0YW5jZXMiLCJpbnN0YW5jZXNfbGFzdF9tb2RpZmllZCIsImRhaWx5X2Zsb3dzIiwiZGFpbHlfZm9ybXMiLCJkYWlseV9pbnN0YW5jZXMiLCJjbXMiLCJzaXRlcyIsImNtc19zaXRlcyIsImNtc19wb3N0cyIsInBvc3RzX2xhc3RfbW9kaWZpZWQiLCJwb3N0c19hdHRhY2htZW50c19zaXplIiwiY29tbWVudHMiLCJjbXNfY29tbWVudHMiLCJkYWlseV9zaXRlcyIsImRhaWx5X3Bvc3RzIiwiZGFpbHlfY29tbWVudHMiLCJkYWlseV9wb3N0c19hdHRhY2htZW50c19zaXplIiwiTWlncmF0aW9ucyIsInZlcnNpb24iLCJ1cCIsInVwZGF0ZV9jZnNfaW5zdGFuY2UiLCJwYXJlbnRfaWQiLCJpbnN0YW5jZV9pZCIsImF0dGFjaF92ZXJzaW9uIiwiaXNDdXJyZW50IiwibWV0YWRhdGEiLCJpbnN0YW5jZSIsImFwcHJvdmUiLCJjdXJyZW50IiwiYXR0YWNobWVudHMiLCJpbnMiLCJhdHRhY2hzIiwiY3VycmVudF92ZXIiLCJfcmV2IiwiaGlzdG9yeXMiLCJoaXMiLCJkb3duIiwib3JnYW5pemF0aW9uIiwiY2hlY2tfY291bnQiLCJuZXdfb3JnX2lkcyIsInJlbW92ZWRfb3JnX2lkcyIsInJvb3Rfb3JnIiwidXBkYXRlVXNlcnMiLCJtb250aHMiLCJzZXRfb2JqIiwicG0iLCJzZXRNb250aCIsInJvb3RVUkwiLCJjcmVhdG9yIiwicHJvY2VzcyIsImVudiIsIkNSRUFUT1JfTk9ERV9FTlYiLCJkZWZpbmVQcm9wZXJ0eSIsImRlcHRoIiwicmVkdWNlIiwiZmxhdCIsInRvRmxhdHRlbiIsImlzQXJyYXkiLCJUYWJ1bGFyIiwiVGFibGUiLCJjb2x1bW5zIiwib3JkZXJhYmxlIiwiZG9tIiwibGVuZ3RoQ2hhbmdlIiwib3JkZXJpbmciLCJzZWFyY2hpbmciLCJhdXRvV2lkdGgiLCJjaGFuZ2VTZWxlY3RvciIsIiRhbmQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsSUFBSUEsZ0JBQUo7QUFBcUJDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZLG9DQUFaLEVBQWlEO0FBQUNGLGtCQUFnQixDQUFDRyxDQUFELEVBQUc7QUFBQ0gsb0JBQWdCLEdBQUNHLENBQWpCO0FBQW1COztBQUF4QyxDQUFqRCxFQUEyRixDQUEzRjtBQUdyQkgsZ0JBQWdCLENBQUM7QUFDaEIsbUJBQWlCLFFBREQ7QUFFaEJJLFNBQU8sRUFBRSxRQUZPO0FBR2hCLFlBQVUsU0FITTtBQUloQkMsUUFBTSxFQUFFLFFBSlE7QUFLaEIsZ0NBQThCO0FBTGQsQ0FBRCxFQU1iLGNBTmEsQ0FBaEI7O0FBUUEsSUFBSUMsTUFBTSxDQUFDQyxRQUFQLElBQW1CRCxNQUFNLENBQUNDLFFBQVAsQ0FBZ0JDLE9BQXZDLEVBQWdEO0FBQy9DUixrQkFBZ0IsQ0FBQztBQUNoQixrQkFBYztBQURFLEdBQUQsRUFFYixjQUZhLENBQWhCO0FBR0EsQzs7Ozs7Ozs7Ozs7QUNmRFMsS0FBSyxDQUFDQyxTQUFOLENBQWdCQyxVQUFoQixHQUE2QixVQUFVQyxNQUFWLEVBQWtCO0FBQzNDLE1BQUksQ0FBQyxJQUFMLEVBQVc7QUFDUDtBQUNIOztBQUNELE1BQUcsQ0FBQ0EsTUFBSixFQUFXO0FBQ1BBLFVBQU0sR0FB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T0FBUixDQVRiO0FBVUFrWSxrQkFBYyxLQVZkO0FBV0FDLGNBQVUsS0FYVjtBQVlBN1gsZ0JBQVksRUFaWjtBQWFBc0wsVUFBTSxLQWJOO0FBY0F3TSxlQUFXLElBZFg7QUFlQUMsZUFBVyxJQWZYO0FBZ0JBQyxvQkFBZ0IsVUFBQ2paLFFBQUQsRUFBV3RZLE1BQVg7QUFDZixVQUFBM0MsR0FBQSxFQUFBc0ssS0FBQTs7QUFBQSxXQUFPM0gsTUFBUDtBQUNDLGVBQU87QUFBQ21ILGVBQUssQ0FBQztBQUFQLFNBQVA7QUNJRzs7QURISlEsY0FBUTJRLFNBQVMzUSxLQUFqQjs7QUFDQSxXQUFPQSxLQUFQO0FBQ0MsYUFBQTJRLFlBQUEsUUFBQWpiLE1BQUFpYixTQUFBa1osSUFBQSxZQUFBbjBCLElBQW1CZixNQUFuQixHQUFtQixNQUFuQixHQUFtQixNQUFuQixJQUE0QixDQUE1QjtBQUNDcUwsa0JBQVEyUSxTQUFTa1osSUFBVCxDQUFjNzFCLFdBQWQsQ0FBMEIsT0FBMUIsRUFBbUMsQ0FBbkMsQ0FBUjtBQUZGO0FDUUk7O0FETEosV0FBT2dNLEtBQVA7QUFDQyxlQUFPO0FBQUNSLGVBQUssQ0FBQztBQUFQLFNBQVA7QUNTRzs7QURSSixhQUFPbVIsUUFBUDtBQXpCRDtBQUFBLEdBREQsQ0NBQztBRERGLEciLCJmaWxlIjoiL3BhY2thZ2VzL3N0ZWVkb3NfYmFzZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG5cdGNoZWNrTnBtVmVyc2lvbnNcbn0gZnJvbSAnbWV0ZW9yL3RtZWFzZGF5OmNoZWNrLW5wbS12ZXJzaW9ucyc7XG5jaGVja05wbVZlcnNpb25zKHtcblx0XCJub2RlLXNjaGVkdWxlXCI6IFwiXjEuMy4xXCIsXG5cdGNvb2tpZXM6IFwiXjAuNi4yXCIsXG5cdFwieG1sMmpzXCI6IFwiXjAuNC4xOVwiLFxuXHRta2RpcnA6IFwiXjAuMy41XCIsXG5cdFwidXJsLXNlYXJjaC1wYXJhbXMtcG9seWZpbGxcIjogXCJeNy4wLjBcIixcbn0sICdzdGVlZG9zOmJhc2UnKTtcblxuaWYgKE1ldGVvci5zZXR0aW5ncyAmJiBNZXRlb3Iuc2V0dGluZ3MuYmlsbGluZykge1xuXHRjaGVja05wbVZlcnNpb25zKHtcblx0XHRcIndlaXhpbi1wYXlcIjogXCJeMS4xLjdcIlxuXHR9LCAnc3RlZWRvczpiYXNlJyk7XG59IiwiQXJyYXkucHJvdG90eXBlLnNvcnRCeU5hbWUgPSBmdW5jdGlvbiAobG9jYWxlKSB7XG4gICAgaWYgKCF0aGlzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYoIWxvY2FsZSl7XG4gICAgICAgIGxvY2FsZSA9IFN0ZWVkb3MubG9jYWxlKClcbiAgICB9XG4gICAgdGhpcy5zb3J0KGZ1bmN0aW9uIChwMSwgcDIpIHtcblx0XHR2YXIgcDFfc29ydF9ubyA9IHAxLnNvcnRfbm8gfHwgMDtcblx0XHR2YXIgcDJfc29ydF9ubyA9IHAyLnNvcnRfbm8gfHwgMDtcblx0XHRpZihwMV9zb3J0X25vICE9IHAyX3NvcnRfbm8pe1xuICAgICAgICAgICAgcmV0dXJuIHAxX3NvcnRfbm8gPiBwMl9zb3J0X25vID8gLTEgOiAxXG4gICAgICAgIH1lbHNle1xuXHRcdFx0cmV0dXJuIHAxLm5hbWUubG9jYWxlQ29tcGFyZShwMi5uYW1lLCBsb2NhbGUpO1xuXHRcdH1cbiAgICB9KTtcbn07XG5cblxuQXJyYXkucHJvdG90eXBlLmdldFByb3BlcnR5ID0gZnVuY3Rpb24gKGspIHtcbiAgICB2YXIgdiA9IG5ldyBBcnJheSgpO1xuICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgICB2YXIgbSA9IHQgPyB0W2tdIDogbnVsbDtcbiAgICAgICAgdi5wdXNoKG0pO1xuICAgIH0pO1xuICAgIHJldHVybiB2O1xufVxuXG4vKlxuICog5re75YqgQXJyYXnnmoRyZW1vdmXlh73mlbBcbiAqL1xuQXJyYXkucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChmcm9tLCB0bykge1xuICAgIGlmIChmcm9tIDwgMCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciByZXN0ID0gdGhpcy5zbGljZSgodG8gfHwgZnJvbSkgKyAxIHx8IHRoaXMubGVuZ3RoKTtcbiAgICB0aGlzLmxlbmd0aCA9IGZyb20gPCAwID8gdGhpcy5sZW5ndGggKyBmcm9tIDogZnJvbTtcbiAgICByZXR1cm4gdGhpcy5wdXNoLmFwcGx5KHRoaXMsIHJlc3QpO1xufTtcblxuLypcbiAqIOa3u+WKoEFycmF555qE6L+H5ruk5ZmoXG4gKiByZXR1cm4g56ym5ZCI5p2h5Lu255qE5a+56LGhQXJyYXlcbiAqL1xuQXJyYXkucHJvdG90eXBlLmZpbHRlclByb3BlcnR5ID0gZnVuY3Rpb24gKGgsIGwpIHtcbiAgICB2YXIgZyA9IFtdO1xuICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgICB2YXIgbSA9IHQgPyB0W2hdIDogbnVsbDtcbiAgICAgICAgdmFyIGQgPSBmYWxzZTtcbiAgICAgICAgaWYgKG0gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgZCA9IG0uaW5jbHVkZXMobCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAobSBpbnN0YW5jZW9mIE9iamVjdCkge1xuICAgICAgICAgICAgICAgIGlmIChcImlkXCIgaW4gbSkge1xuICAgICAgICAgICAgICAgICAgICBtID0gbVtcImlkXCJdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXCJfaWRcIiBpbiBtKSB7XG4gICAgICAgICAgICAgICAgICAgIG0gPSBtW1wiX2lkXCJdO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGwgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgICAgIGQgPSAobCA9PT0gdW5kZWZpbmVkKSA/IGZhbHNlIDogbC5pbmNsdWRlcyhtKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZCA9IChsID09PSB1bmRlZmluZWQpID8gZmFsc2UgOiBtID09IGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZCkge1xuICAgICAgICAgICAgZy5wdXNoKHQpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGc7XG59XG5cbi8qXG4gKiDmt7vliqBBcnJheeeahOi/h+a7pOWZqFxuICogcmV0dXJuIOespuWQiOadoeS7tueahOesrOS4gOS4quWvueixoVxuICovXG5BcnJheS5wcm90b3R5cGUuZmluZFByb3BlcnR5QnlQSyA9IGZ1bmN0aW9uIChoLCBsKSB7XG4gICAgdmFyIHIgPSBudWxsO1xuICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbiAodCkge1xuICAgICAgICB2YXIgbSA9IHQgPyB0W2hdIDogbnVsbDtcbiAgICAgICAgdmFyIGQgPSBmYWxzZTtcbiAgICAgICAgaWYgKG0gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgZCA9IG0uaW5jbHVkZXMobCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkID0gKGwgPT09IHVuZGVmaW5lZCkgPyBmYWxzZSA6IG0gPT0gbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkKSB7XG4gICAgICAgICAgICByID0gdDtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByO1xufSIsIlN0ZWVkb3MgPVxuXHRzZXR0aW5nczoge31cblx0ZGI6IGRiXG5cdHN1YnM6IHt9XG5cdGlzUGhvbmVFbmFibGVkOiAtPlxuXHRcdHJldHVybiAhIU1ldGVvci5zZXR0aW5ncz8ucHVibGljPy5waG9uZVxuXHRudW1iZXJUb1N0cmluZzogKG51bWJlciwgc2NhbGUsIG5vdFRob3VzYW5kcyktPlxuXHRcdGlmIHR5cGVvZiBudW1iZXIgPT0gXCJudW1iZXJcIlxuXHRcdFx0bnVtYmVyID0gbnVtYmVyLnRvU3RyaW5nKClcblxuXHRcdGlmICFudW1iZXJcblx0XHRcdHJldHVybiAnJztcblxuXHRcdGlmIG51bWJlciAhPSBcIk5hTlwiXG5cdFx0XHRpZiBzY2FsZSB8fCBzY2FsZSA9PSAwXG5cdFx0XHRcdG51bWJlciA9IE51bWJlcihudW1iZXIpLnRvRml4ZWQoc2NhbGUpXG5cdFx0XHR1bmxlc3Mgbm90VGhvdXNhbmRzXG5cdFx0XHRcdGlmICEoc2NhbGUgfHwgc2NhbGUgPT0gMClcblx0XHRcdFx0XHQjIOayoeWumuS5iXNjYWxl5pe277yM5qC55o2u5bCP5pWw54K55L2N572u566X5Ye6c2NhbGXlgLxcblx0XHRcdFx0XHRzY2FsZSA9IG51bWJlci5tYXRjaCgvXFwuKFxcZCspLyk/WzFdPy5sZW5ndGhcblx0XHRcdFx0XHR1bmxlc3Mgc2NhbGVcblx0XHRcdFx0XHRcdHNjYWxlID0gMFxuXHRcdFx0XHRyZWcgPSAvKFxcZCkoPz0oXFxkezN9KStcXC4pL2dcblx0XHRcdFx0aWYgc2NhbGUgPT0gMFxuXHRcdFx0XHRcdHJlZyA9IC8oXFxkKSg/PShcXGR7M30pK1xcYikvZ1xuXHRcdFx0XHRudW1iZXIgPSBudW1iZXIucmVwbGFjZShyZWcsICckMSwnKVxuXHRcdFx0cmV0dXJuIG51bWJlclxuXHRcdGVsc2Vcblx0XHRcdHJldHVybiBcIlwiXG5cdHZhbGlKcXVlcnlTeW1ib2xzOiAoc3RyKS0+XG5cdFx0IyByZWcgPSAvXlteIVwiIyQlJicoKSorLC4vOjs8PT4/QFtcXF1eYHt8fX5dKyQvZ1xuXHRcdHJlZyA9IG5ldyBSZWdFeHAoXCJeW14hXFxcIiMkJSYnKCkqXFwrLFxcLlxcLzo7PD0+P0BbXFxcXF1eYHt8fX5dKyRcIilcblx0XHRyZXR1cm4gcmVnLnRlc3Qoc3RyKVxuXG4jIyNcbiMgS2ljayBvZmYgdGhlIGdsb2JhbCBuYW1lc3BhY2UgZm9yIFN0ZWVkb3MuXG4jIEBuYW1lc3BhY2UgU3RlZWRvc1xuIyMjXG4jIGlmIE1ldGVvci5pc0NvcmRvdmFcbmlmIE1ldGVvci5pc0NvcmRvdmEgfHwgTWV0ZW9yLmlzQ2xpZW50XG5cdHJvb3RVcmwgPSBNZXRlb3IuYWJzb2x1dGVVcmwuZGVmYXVsdE9wdGlvbnMucm9vdFVybFxuXHRpZiByb290VXJsLmVuZHNXaXRoKCcvJylcblx0XHRyb290VXJsID0gcm9vdFVybC5zdWJzdHIoMCwgcm9vdFVybC5sZW5ndGggLSAxKVxuXG5cdHdpbmRvdy5zdG9yZXM/LkFQST8uY2xpZW50Py5zZXRVcmwgPSByb290VXJsXG5cdHdpbmRvdy5zdG9yZXM/LlNldHRpbmdzPy5zZXRSb290VXJsKHJvb3RVcmwpXG5cdHdpbmRvd1snc3RlZWRvcy5zZXR0aW5nJ10gPSB7XG5cdFx0cm9vdFVybDogcm9vdFVybFxuXHR9XG5cbmlmIE1ldGVvci5pc0NsaWVudFxuXHRNZXRlb3IuYXV0b3J1biAoKS0+XG5cdFx0d2luZG93LnN0b3Jlcz8uU2V0dGluZ3M/LnNldFVzZXJJZChTdGVlZG9zLnVzZXJJZCgpKVxuXHRcdHdpbmRvdy5zdG9yZXM/LlNldHRpbmdzPy5zZXRUZW5hbnRJZChTdGVlZG9zLnNwYWNlSWQoKSlcblxuU3RlZWRvcy5nZXRIZWxwVXJsID0gKGxvY2FsZSktPlxuXHRjb3VudHJ5ID0gbG9jYWxlLnN1YnN0cmluZygzKVxuXHRyZXR1cm4gXCJodHRwOi8vd3d3LnN0ZWVkb3MuY29tL1wiICsgY291bnRyeSArIFwiL2hlbHAvXCJcblxuU3RlZWRvcy5pc0V4cHJlc3Npb24gPSAoZnVuYykgLT5cblx0aWYgdHlwZW9mIGZ1bmMgIT0gJ3N0cmluZydcblx0XHRyZXR1cm4gZmFsc2Vcblx0cGF0dGVybiA9IC9ee3soLispfX0kL1xuXHRyZWcxID0gL157eyhmdW5jdGlvbi4rKX19JC9cblx0cmVnMiA9IC9ee3soLis9Pi4rKX19JC9cblx0aWYgdHlwZW9mIGZ1bmMgPT0gJ3N0cmluZycgYW5kIGZ1bmMubWF0Y2gocGF0dGVybikgYW5kICFmdW5jLm1hdGNoKHJlZzEpIGFuZCAhZnVuYy5tYXRjaChyZWcyKVxuXHRcdHJldHVybiB0cnVlXG5cdGZhbHNlXG5cblN0ZWVkb3MucGFyc2VTaW5nbGVFeHByZXNzaW9uID0gKGZ1bmMsIGZvcm1EYXRhLCBkYXRhUGF0aCwgZ2xvYmFsKSAtPlxuXHRnZXRQYXJlbnRQYXRoID0gKHBhdGgpIC0+XG5cdFx0aWYgdHlwZW9mIHBhdGggPT0gJ3N0cmluZydcblx0XHRcdHBhdGhBcnIgPSBwYXRoLnNwbGl0KCcuJylcblx0XHRcdGlmIHBhdGhBcnIubGVuZ3RoID09IDFcblx0XHRcdFx0cmV0dXJuICcjJ1xuXHRcdFx0cGF0aEFyci5wb3AoKVxuXHRcdFx0cmV0dXJuIHBhdGhBcnIuam9pbignLicpXG5cdFx0cmV0dXJuICcjJ1xuXHRnZXRWYWx1ZUJ5UGF0aCA9IChmb3JtRGF0YSwgcGF0aCkgLT5cblx0XHRpZiBwYXRoID09ICcjJyBvciAhcGF0aFxuXHRcdFx0cmV0dXJuIGZvcm1EYXRhIG9yIHt9XG5cdFx0ZWxzZSBpZiB0eXBlb2YgcGF0aCA9PSAnc3RyaW5nJ1xuXHRcdFx0cmV0dXJuIF8uZ2V0KGZvcm1EYXRhLCBwYXRoKVxuXHRcdGVsc2Vcblx0XHRcdGNvbnNvbGUuZXJyb3IgJ3BhdGggaGFzIHRvIGJlIGEgc3RyaW5nJ1xuXHRcdHJldHVyblxuXHRpZiBmb3JtRGF0YSA9PSB1bmRlZmluZWRcblx0XHRmb3JtRGF0YSA9IHt9XG5cdHBhcmVudFBhdGggPSBnZXRQYXJlbnRQYXRoKGRhdGFQYXRoKVxuXHRwYXJlbnQgPSBnZXRWYWx1ZUJ5UGF0aChmb3JtRGF0YSwgcGFyZW50UGF0aCkgb3Ige31cblx0aWYgdHlwZW9mIGZ1bmMgPT0gJ3N0cmluZydcblx0XHRmdW5jQm9keSA9IGZ1bmMuc3Vic3RyaW5nKDIsIGZ1bmMubGVuZ3RoIC0gMilcblx0XHRnbG9iYWxUYWcgPSAnX19HX0xfT19CX0FfTF9fJ1xuXHRcdHN0ciA9ICdcXG4gICAgcmV0dXJuICcgKyBmdW5jQm9keS5yZXBsYWNlKC9cXGJmb3JtRGF0YVxcYi9nLCBKU09OLnN0cmluZ2lmeShmb3JtRGF0YSkucmVwbGFjZSgvXFxiZ2xvYmFsXFxiL2csIGdsb2JhbFRhZykpLnJlcGxhY2UoL1xcYmdsb2JhbFxcYi9nLCBKU09OLnN0cmluZ2lmeShnbG9iYWwpKS5yZXBsYWNlKG5ldyBSZWdFeHAoJ1xcXFxiJyArIGdsb2JhbFRhZyArICdcXFxcYicsICdnJyksICdnbG9iYWwnKS5yZXBsYWNlKC9yb290VmFsdWUvZywgSlNPTi5zdHJpbmdpZnkocGFyZW50KSlcblx0XHR0cnlcblx0XHRcdHJldHVybiBGdW5jdGlvbihzdHIpKClcblx0XHRjYXRjaCBlcnJvclxuXHRcdFx0Y29uc29sZS5sb2cgZXJyb3IsIGZ1bmMsIGRhdGFQYXRoXG5cdFx0XHRyZXR1cm4gZnVuY1xuXHRlbHNlXG5cdFx0cmV0dXJuIGZ1bmNcblx0cmV0dXJuXG5cbmlmIE1ldGVvci5pc0NsaWVudFxuXG5cdFN0ZWVkb3Muc3BhY2VVcGdyYWRlZE1vZGFsID0gKCktPlxuXHRcdHN3YWwoe3RpdGxlOiBUQVBpMThuLl9fKFwic3BhY2VfcGFpZF9pbmZvX3RpdGxlXCIpLCB0ZXh0OiBUQVBpMThuLl9fKFwic3BhY2VfcGFpZF9pbmZvX3RleHRcIiksIGh0bWw6IHRydWUsIHR5cGU6XCJ3YXJuaW5nXCIsIGNvbmZpcm1CdXR0b25UZXh0OiBUQVBpMThuLl9fKFwiT0tcIil9KTtcblxuXHRTdGVlZG9zLmdldEFjY291bnRCZ0JvZHlWYWx1ZSA9ICgpLT5cblx0XHRhY2NvdW50QmdCb2R5ID0gZGIuc3RlZWRvc19rZXl2YWx1ZXMuZmluZE9uZSh7dXNlcjpTdGVlZG9zLnVzZXJJZCgpLGtleTpcImJnX2JvZHlcIn0pXG5cdFx0aWYgYWNjb3VudEJnQm9keVxuXHRcdFx0cmV0dXJuIGFjY291bnRCZ0JvZHkudmFsdWVcblx0XHRlbHNlXG5cdFx0XHRyZXR1cm4ge307XG5cblx0U3RlZWRvcy5hcHBseUFjY291bnRCZ0JvZHlWYWx1ZSA9IChhY2NvdW50QmdCb2R5VmFsdWUsaXNOZWVkVG9Mb2NhbCktPlxuXHRcdGlmIE1ldGVvci5sb2dnaW5nSW4oKSBvciAhU3RlZWRvcy51c2VySWQoKVxuXHRcdFx0IyDlpoLmnpzmmK/mraPlnKjnmbvlvZXkuK3miJblnKjnmbvlvZXnlYzpnaLvvIzliJnlj5Zsb2NhbFN0b3JhZ2XkuK3orr7nva7vvIzogIzkuI3mmK/nm7TmjqXlupTnlKjnqbrorr7nva5cblx0XHRcdGFjY291bnRCZ0JvZHlWYWx1ZSA9IHt9XG5cdFx0XHRhY2NvdW50QmdCb2R5VmFsdWUudXJsID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJhY2NvdW50QmdCb2R5VmFsdWUudXJsXCIpXG5cdFx0XHRhY2NvdW50QmdCb2R5VmFsdWUuYXZhdGFyID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJhY2NvdW50QmdCb2R5VmFsdWUuYXZhdGFyXCIpXG5cblx0XHR1cmwgPSBhY2NvdW50QmdCb2R5VmFsdWUudXJsXG5cdFx0YXZhdGFyID0gYWNjb3VudEJnQm9keVZhbHVlLmF2YXRhclxuXHRcdCMgaWYgYWNjb3VudEJnQm9keVZhbHVlLnVybFxuXHRcdCMgXHRpZiB1cmwgPT0gYXZhdGFyXG5cdFx0IyBcdFx0YXZhdGFyVXJsID0gJ2FwaS9maWxlcy9hdmF0YXJzLycgKyBhdmF0YXJcblx0XHQjIFx0XHQkKFwiYm9keVwiKS5jc3MgXCJiYWNrZ3JvdW5kSW1hZ2VcIixcInVybCgje1N0ZWVkb3MuYWJzb2x1dGVVcmwoYXZhdGFyVXJsKX0pXCJcblx0XHQjIFx0ZWxzZVxuXHRcdCMgXHRcdCQoXCJib2R5XCIpLmNzcyBcImJhY2tncm91bmRJbWFnZVwiLFwidXJsKCN7U3RlZWRvcy5hYnNvbHV0ZVVybCh1cmwpfSlcIlxuXHRcdCMgZWxzZVxuXHRcdCMgXHRiYWNrZ3JvdW5kID0gTWV0ZW9yLnNldHRpbmdzPy5wdWJsaWM/LmFkbWluPy5iYWNrZ3JvdW5kXG5cdFx0IyBcdGlmIGJhY2tncm91bmRcblx0XHQjIFx0XHQkKFwiYm9keVwiKS5jc3MgXCJiYWNrZ3JvdW5kSW1hZ2VcIixcInVybCgje1N0ZWVkb3MuYWJzb2x1dGVVcmwoYmFja2dyb3VuZCl9KVwiXG5cdFx0IyBcdGVsc2Vcblx0XHQjIFx0XHRiYWNrZ3JvdW5kID0gXCIvcGFja2FnZXMvc3RlZWRvc190aGVtZS9jbGllbnQvYmFja2dyb3VuZC9zZWEuanBnXCJcblx0XHQjIFx0XHQkKFwiYm9keVwiKS5jc3MgXCJiYWNrZ3JvdW5kSW1hZ2VcIixcInVybCgje1N0ZWVkb3MuYWJzb2x1dGVVcmwoYmFja2dyb3VuZCl9KVwiXG5cblx0XHRpZiBpc05lZWRUb0xvY2FsXG5cdFx0XHRpZiBNZXRlb3IubG9nZ2luZ0luKClcblx0XHRcdFx0IyDmraPlnKjnmbvlvZXkuK3vvIzliJnkuI3lgZrlpITnkIbvvIzlm6DkuLrmraTml7ZTdGVlZG9zLnVzZXJJZCgp5LiN6Laz5LqO6K+B5piO5bey55m75b2V54q25oCBXG5cdFx0XHRcdHJldHVyblxuXHRcdFx0IyDov5nph4znibnmhI/kuI3lnKhsb2NhbFN0b3JhZ2XkuK3lrZjlgqhTdGVlZG9zLnVzZXJJZCgp77yM5Zug5Li66ZyA6KaB5L+d6K+B55m75b2V55WM6Z2i5Lmf5bqU55SobG9jYWxTdG9yYWdl5Lit55qE6K6+572uXG5cdFx0XHQjIOeZu+W9leeVjOmdouS4jeiuvue9rmxvY2FsU3RvcmFnZe+8jOWboOS4uueZu+W9leeVjOmdomFjY291bnRCZ0JvZHlWYWx1ZeiCr+WumuS4uuepuu+8jOiuvue9rueahOivne+8jOS8mumAoOaIkOaXoOazleS/neaMgeeZu+W9leeVjOmdouS5n+W6lOeUqGxvY2FsU3RvcmFnZeS4reeahOiuvue9rlxuXHRcdFx0aWYgU3RlZWRvcy51c2VySWQoKVxuXHRcdFx0XHRpZiB1cmxcblx0XHRcdFx0XHRsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImFjY291bnRCZ0JvZHlWYWx1ZS51cmxcIix1cmwpXG5cdFx0XHRcdFx0bG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJhY2NvdW50QmdCb2R5VmFsdWUuYXZhdGFyXCIsYXZhdGFyKVxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0bG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oXCJhY2NvdW50QmdCb2R5VmFsdWUudXJsXCIpXG5cdFx0XHRcdFx0bG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oXCJhY2NvdW50QmdCb2R5VmFsdWUuYXZhdGFyXCIpXG5cblx0U3RlZWRvcy5nZXRBY2NvdW50U2tpblZhbHVlID0gKCktPlxuXHRcdGFjY291bnRTa2luID0gZGIuc3RlZWRvc19rZXl2YWx1ZXMuZmluZE9uZSh7dXNlcjpTdGVlZG9zLnVzZXJJZCgpLGtleTpcInNraW5cIn0pXG5cdFx0aWYgYWNjb3VudFNraW5cblx0XHRcdHJldHVybiBhY2NvdW50U2tpbi52YWx1ZVxuXHRcdGVsc2Vcblx0XHRcdHJldHVybiB7fTtcblxuXHRTdGVlZG9zLmdldEFjY291bnRab29tVmFsdWUgPSAoKS0+XG5cdFx0YWNjb3VudFpvb20gPSBkYi5zdGVlZG9zX2tleXZhbHVlcy5maW5kT25lKHt1c2VyOlN0ZWVkb3MudXNlcklkKCksa2V5Olwiem9vbVwifSlcblx0XHRpZiBhY2NvdW50Wm9vbVxuXHRcdFx0cmV0dXJuIGFjY291bnRab29tLnZhbHVlXG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIHt9O1xuXG5cdFN0ZWVkb3MuYXBwbHlBY2NvdW50Wm9vbVZhbHVlID0gKGFjY291bnRab29tVmFsdWUsaXNOZWVkVG9Mb2NhbCktPlxuXHRcdGlmIE1ldGVvci5sb2dnaW5nSW4oKSBvciAhU3RlZWRvcy51c2VySWQoKVxuXHRcdFx0IyDlpoLmnpzmmK/mraPlnKjnmbvlvZXkuK3miJblnKjnmbvlvZXnlYzpnaLvvIzliJnlj5Zsb2NhbFN0b3JhZ2XkuK3orr7nva7vvIzogIzkuI3mmK/nm7TmjqXlupTnlKjnqbrorr7nva5cblx0XHRcdGFjY291bnRab29tVmFsdWUgPSB7fVxuXHRcdFx0YWNjb3VudFpvb21WYWx1ZS5uYW1lID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJhY2NvdW50Wm9vbVZhbHVlLm5hbWVcIilcblx0XHRcdGFjY291bnRab29tVmFsdWUuc2l6ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYWNjb3VudFpvb21WYWx1ZS5zaXplXCIpXG5cdFx0JChcImJvZHlcIikucmVtb3ZlQ2xhc3MoXCJ6b29tLW5vcm1hbFwiKS5yZW1vdmVDbGFzcyhcInpvb20tbGFyZ2VcIikucmVtb3ZlQ2xhc3MoXCJ6b29tLWV4dHJhLWxhcmdlXCIpO1xuXHRcdHpvb21OYW1lID0gYWNjb3VudFpvb21WYWx1ZS5uYW1lXG5cdFx0em9vbVNpemUgPSBhY2NvdW50Wm9vbVZhbHVlLnNpemVcblx0XHR1bmxlc3Mgem9vbU5hbWVcblx0XHRcdHpvb21OYW1lID0gXCJsYXJnZVwiXG5cdFx0XHR6b29tU2l6ZSA9IDEuMlxuXHRcdGlmIHpvb21OYW1lICYmICFTZXNzaW9uLmdldChcImluc3RhbmNlUHJpbnRcIilcblx0XHRcdCQoXCJib2R5XCIpLmFkZENsYXNzKFwiem9vbS0je3pvb21OYW1lfVwiKVxuXHRcdFx0IyBpZiBTdGVlZG9zLmlzTm9kZSgpXG5cdFx0XHQjIFx0aWYgYWNjb3VudFpvb21WYWx1ZS5zaXplID09IFwiMVwiXG5cdFx0XHQjIFx0XHQjIG5vZGUtd2Via2l05Litc2l6ZeS4ujDmiY3ooajnpLoxMDAlXG5cdFx0XHQjIFx0XHR6b29tU2l6ZSA9IDBcblx0XHRcdCMgXHRudy5XaW5kb3cuZ2V0KCkuem9vbUxldmVsID0gTnVtYmVyLnBhcnNlRmxvYXQoem9vbVNpemUpXG5cdFx0XHQjIGVsc2Vcblx0XHRcdCMgXHQkKFwiYm9keVwiKS5hZGRDbGFzcyhcInpvb20tI3t6b29tTmFtZX1cIilcblx0XHRpZiBpc05lZWRUb0xvY2FsXG5cdFx0XHRpZiBNZXRlb3IubG9nZ2luZ0luKClcblx0XHRcdFx0IyDmraPlnKjnmbvlvZXkuK3vvIzliJnkuI3lgZrlpITnkIbvvIzlm6DkuLrmraTml7ZTdGVlZG9zLnVzZXJJZCgp5LiN6Laz5LqO6K+B5piO5bey55m75b2V54q25oCBXG5cdFx0XHRcdHJldHVyblxuXHRcdFx0IyDov5nph4znibnmhI/kuI3lnKhsb2NhbFN0b3JhZ2XkuK3lrZjlgqhTdGVlZG9zLnVzZXJJZCgp77yM5Zug5Li66ZyA6KaB5L+d6K+B55m75b2V55WM6Z2i5Lmf5bqU55SobG9jYWxTdG9yYWdl5Lit55qE6K6+572uXG5cdFx0XHQjIOeZu+W9leeVjOmdouS4jeiuvue9rmxvY2FsU3RvcmFnZe+8jOWboOS4uueZu+W9leeVjOmdomFjY291bnRab29tVmFsdWXogq/lrprkuLrnqbrvvIzorr7nva7nmoTor53vvIzkvJrpgKDmiJDml6Dms5Xkv53mjIHnmbvlvZXnlYzpnaLkuZ/lupTnlKhsb2NhbFN0b3JhZ2XkuK3nmoTorr7nva5cblx0XHRcdGlmIFN0ZWVkb3MudXNlcklkKClcblx0XHRcdFx0aWYgYWNjb3VudFpvb21WYWx1ZS5uYW1lXG5cdFx0XHRcdFx0bG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJhY2NvdW50Wm9vbVZhbHVlLm5hbWVcIixhY2NvdW50Wm9vbVZhbHVlLm5hbWUpXG5cdFx0XHRcdFx0bG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJhY2NvdW50Wm9vbVZhbHVlLnNpemVcIixhY2NvdW50Wm9vbVZhbHVlLnNpemUpXG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShcImFjY291bnRab29tVmFsdWUubmFtZVwiKVxuXHRcdFx0XHRcdGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKFwiYWNjb3VudFpvb21WYWx1ZS5zaXplXCIpXG5cblx0U3RlZWRvcy5zaG93SGVscCA9ICh1cmwpLT5cblx0XHRsb2NhbGUgPSBTdGVlZG9zLmdldExvY2FsZSgpXG5cdFx0Y291bnRyeSA9IGxvY2FsZS5zdWJzdHJpbmcoMylcblxuXHRcdHVybCA9IHVybCB8fCBcImh0dHA6Ly93d3cuc3RlZWRvcy5jb20vXCIgKyBjb3VudHJ5ICsgXCIvaGVscC9cIlxuXG5cdFx0d2luZG93Lm9wZW4odXJsLCAnX2hlbHAnLCAnRW5hYmxlVmlld1BvcnRTY2FsZT15ZXMnKVxuXG5cdFN0ZWVkb3MuZ2V0VXJsV2l0aFRva2VuID0gKHVybCktPlxuXHRcdGF1dGhUb2tlbiA9IHt9O1xuXHRcdGF1dGhUb2tlbltcInNwYWNlSWRcIl0gPSBTdGVlZG9zLmdldFNwYWNlSWQoKVxuXHRcdGF1dGhUb2tlbltcIlgtVXNlci1JZFwiXSA9IE1ldGVvci51c2VySWQoKTtcblx0XHRhdXRoVG9rZW5bXCJYLUF1dGgtVG9rZW5cIl0gPSBBY2NvdW50cy5fc3RvcmVkTG9naW5Ub2tlbigpO1xuXG5cdFx0bGlua2VyID0gXCI/XCJcblxuXHRcdGlmIHVybC5pbmRleE9mKFwiP1wiKSA+IC0xXG5cdFx0XHRsaW5rZXIgPSBcIiZcIlxuXG5cdFx0cmV0dXJuIHVybCArIGxpbmtlciArICQucGFyYW0oYXV0aFRva2VuKVxuXG5cdFN0ZWVkb3MuZ2V0QXBwVXJsV2l0aFRva2VuID0gKGFwcF9pZCktPlxuXHRcdGF1dGhUb2tlbiA9IHt9O1xuXHRcdGF1dGhUb2tlbltcInNwYWNlSWRcIl0gPSBTdGVlZG9zLmdldFNwYWNlSWQoKVxuXHRcdGF1dGhUb2tlbltcIlgtVXNlci1JZFwiXSA9IE1ldGVvci51c2VySWQoKTtcblx0XHRhdXRoVG9rZW5bXCJYLUF1dGgtVG9rZW5cIl0gPSBBY2NvdW50cy5fc3RvcmVkTG9naW5Ub2tlbigpO1xuXHRcdHJldHVybiBcImFwaS9zZXR1cC9zc28vXCIgKyBhcHBfaWQgKyBcIj9cIiArICQucGFyYW0oYXV0aFRva2VuKVxuXG5cdFN0ZWVkb3Mub3BlbkFwcFdpdGhUb2tlbiA9IChhcHBfaWQpLT5cblx0XHR1cmwgPSBTdGVlZG9zLmdldEFwcFVybFdpdGhUb2tlbiBhcHBfaWRcblx0XHR1cmwgPSBTdGVlZG9zLmFic29sdXRlVXJsIHVybFxuXG5cdFx0YXBwID0gZGIuYXBwcy5maW5kT25lKGFwcF9pZClcblxuXHRcdGlmICFhcHAuaXNfbmV3X3dpbmRvdyAmJiAhU3RlZWRvcy5pc01vYmlsZSgpICYmICFTdGVlZG9zLmlzQ29yZG92YSgpXG5cdFx0XHR3aW5kb3cubG9jYXRpb24gPSB1cmxcblx0XHRlbHNlXG5cdFx0XHRTdGVlZG9zLm9wZW5XaW5kb3codXJsKTtcblxuXHRTdGVlZG9zLm9wZW5VcmxXaXRoSUUgPSAodXJsKS0+XG5cdFx0aWYgdXJsXG5cdFx0XHRpZiBTdGVlZG9zLmlzTm9kZSgpXG5cdFx0XHRcdGV4ZWMgPSBudy5yZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY1xuXHRcdFx0XHRvcGVuX3VybCA9IHVybFxuXHRcdFx0XHRjbWQgPSBcInN0YXJ0IGlleHBsb3JlLmV4ZSBcXFwiI3tvcGVuX3VybH1cXFwiXCJcblx0XHRcdFx0ZXhlYyBjbWQsIChlcnJvciwgc3Rkb3V0LCBzdGRlcnIpIC0+XG5cdFx0XHRcdFx0aWYgZXJyb3Jcblx0XHRcdFx0XHRcdHRvYXN0ci5lcnJvciBlcnJvclxuXHRcdFx0XHRcdHJldHVyblxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRTdGVlZG9zLm9wZW5XaW5kb3codXJsKVxuXG5cblx0U3RlZWRvcy5vcGVuQXBwID0gKGFwcF9pZCktPlxuXHRcdGlmICFNZXRlb3IudXNlcklkKClcblx0XHRcdFN0ZWVkb3MucmVkaXJlY3RUb1NpZ25JbigpXG5cdFx0XHRyZXR1cm4gdHJ1ZVxuXG5cdFx0YXBwID0gZGIuYXBwcy5maW5kT25lKGFwcF9pZClcblx0XHRpZiAhYXBwXG5cdFx0XHRGbG93Um91dGVyLmdvKFwiL1wiKVxuXHRcdFx0cmV0dXJuXG5cblx0XHQjIGNyZWF0b3JTZXR0aW5ncyA9IE1ldGVvci5zZXR0aW5ncy5wdWJsaWM/LndlYnNlcnZpY2VzPy5jcmVhdG9yXG5cdFx0IyBpZiBhcHAuX2lkID09IFwiYWRtaW5cIiBhbmQgY3JlYXRvclNldHRpbmdzPy5zdGF0dXMgPT0gXCJhY3RpdmVcIlxuXHRcdCMgXHR1cmwgPSBjcmVhdG9yU2V0dGluZ3MudXJsXG5cdFx0IyBcdHJlZyA9IC9cXC8kL1xuXHRcdCMgXHR1bmxlc3MgcmVnLnRlc3QgdXJsXG5cdFx0IyBcdFx0dXJsICs9IFwiL1wiXG5cdFx0IyBcdHVybCA9IFwiI3t1cmx9YXBwL2FkbWluXCJcblx0XHQjIFx0U3RlZWRvcy5vcGVuV2luZG93KHVybClcblx0XHQjIFx0cmV0dXJuXG5cblx0XHRvbl9jbGljayA9IGFwcC5vbl9jbGlja1xuXHRcdGlmIGFwcC5pc191c2VfaWVcblx0XHRcdGlmIFN0ZWVkb3MuaXNOb2RlKClcblx0XHRcdFx0ZXhlYyA9IG53LnJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjXG5cdFx0XHRcdGlmIG9uX2NsaWNrXG5cdFx0XHRcdFx0cGF0aCA9IFwiYXBpL2FwcC9zc28vI3thcHBfaWR9P2F1dGhUb2tlbj0je0FjY291bnRzLl9zdG9yZWRMb2dpblRva2VuKCl9JnVzZXJJZD0je01ldGVvci51c2VySWQoKX1cIlxuXHRcdFx0XHRcdG9wZW5fdXJsID0gd2luZG93LmxvY2F0aW9uLm9yaWdpbiArIFwiL1wiICsgcGF0aFxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0b3Blbl91cmwgPSBTdGVlZG9zLmdldEFwcFVybFdpdGhUb2tlbiBhcHBfaWRcblx0XHRcdFx0XHRvcGVuX3VybCA9IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4gKyBcIi9cIiArIG9wZW5fdXJsXG5cdFx0XHRcdGNtZCA9IFwic3RhcnQgaWV4cGxvcmUuZXhlIFxcXCIje29wZW5fdXJsfVxcXCJcIlxuXHRcdFx0XHRleGVjIGNtZCwgKGVycm9yLCBzdGRvdXQsIHN0ZGVycikgLT5cblx0XHRcdFx0XHRpZiBlcnJvclxuXHRcdFx0XHRcdFx0dG9hc3RyLmVycm9yIGVycm9yXG5cdFx0XHRcdFx0cmV0dXJuXG5cdFx0XHRlbHNlXG5cdFx0XHRcdFN0ZWVkb3Mub3BlbkFwcFdpdGhUb2tlbihhcHBfaWQpXG5cblx0XHRlbHNlIGlmIGRiLmFwcHMuaXNJbnRlcm5hbEFwcChhcHAudXJsKVxuXHRcdFx0Rmxvd1JvdXRlci5nbyhhcHAudXJsKVxuXG5cdFx0ZWxzZSBpZiBhcHAuaXNfdXNlX2lmcmFtZVxuXHRcdFx0aWYgYXBwLmlzX25ld193aW5kb3cgJiYgIVN0ZWVkb3MuaXNNb2JpbGUoKSAmJiAhU3RlZWRvcy5pc0NvcmRvdmEoKVxuXHRcdFx0XHRTdGVlZG9zLm9wZW5XaW5kb3coU3RlZWRvcy5hYnNvbHV0ZVVybChcImFwcHMvaWZyYW1lL1wiICsgYXBwLl9pZCkpXG5cdFx0XHRlbHNlIGlmIFN0ZWVkb3MuaXNNb2JpbGUoKSB8fCBTdGVlZG9zLmlzQ29yZG92YSgpXG5cdFx0XHRcdFN0ZWVkb3Mub3BlbkFwcFdpdGhUb2tlbihhcHBfaWQpXG5cdFx0XHRlbHNlXG5cdFx0XHRcdEZsb3dSb3V0ZXIuZ28oXCIvYXBwcy9pZnJhbWUvI3thcHAuX2lkfVwiKVxuXG5cdFx0ZWxzZSBpZiBvbl9jbGlja1xuXHRcdFx0IyDov5nph4zmiafooYznmoTmmK/kuIDkuKrkuI3luKblj4LmlbDnmoTpl63ljIXlh73mlbDvvIznlKjmnaXpgb/lhY3lj5jph4/msaHmn5Ncblx0XHRcdGV2YWxGdW5TdHJpbmcgPSBcIihmdW5jdGlvbigpeyN7b25fY2xpY2t9fSkoKVwiXG5cdFx0XHR0cnlcblx0XHRcdFx0ZXZhbChldmFsRnVuU3RyaW5nKVxuXHRcdFx0Y2F0Y2ggZVxuXHRcdFx0XHQjIGp1c3QgY29uc29sZSB0aGUgZXJyb3Igd2hlbiBjYXRjaCBlcnJvclxuXHRcdFx0XHRjb25zb2xlLmVycm9yIFwiY2F0Y2ggc29tZSBlcnJvciB3aGVuIGV2YWwgdGhlIG9uX2NsaWNrIHNjcmlwdCBmb3IgYXBwIGxpbms6XCJcblx0XHRcdFx0Y29uc29sZS5lcnJvciBcIiN7ZS5tZXNzYWdlfVxcclxcbiN7ZS5zdGFja31cIlxuXHRcdGVsc2Vcblx0XHRcdFN0ZWVkb3Mub3BlbkFwcFdpdGhUb2tlbihhcHBfaWQpXG5cblx0XHRpZiAhYXBwLmlzX25ld193aW5kb3cgJiYgIVN0ZWVkb3MuaXNNb2JpbGUoKSAmJiAhU3RlZWRvcy5pc0NvcmRvdmEoKSAmJiAhYXBwLmlzX3VzZV9pZSAmJiAhb25fY2xpY2tcblx0XHRcdCMg6ZyA6KaB6YCJ5Lit5b2T5YmNYXBw5pe277yMb25fY2xpY2vlh73mlbDph4zopoHljZXni6zliqDkuIpTZXNzaW9uLnNldChcImN1cnJlbnRfYXBwX2lkXCIsIGFwcF9pZClcblx0XHRcdFNlc3Npb24uc2V0KFwiY3VycmVudF9hcHBfaWRcIiwgYXBwX2lkKVxuXG5cdFN0ZWVkb3MuY2hlY2tTcGFjZUJhbGFuY2UgPSAoc3BhY2VJZCktPlxuXHRcdHVubGVzcyBzcGFjZUlkXG5cdFx0XHRzcGFjZUlkID0gU3RlZWRvcy5zcGFjZUlkKClcblx0XHRtaW5fbW9udGhzID0gMVxuXHRcdGlmIFN0ZWVkb3MuaXNTcGFjZUFkbWluKClcblx0XHRcdG1pbl9tb250aHMgPSAzXG5cdFx0c3BhY2UgPSBkYi5zcGFjZXMuZmluZE9uZShzcGFjZUlkKVxuXHRcdGVuZF9kYXRlID0gc3BhY2U/LmVuZF9kYXRlXG5cdFx0aWYgc3BhY2UgJiYgU3RlZWRvcy5oYXNGZWF0dXJlKCdwYWlkJywgc3BhY2UuX2lkKSBhbmQgZW5kX2RhdGUgIT0gdW5kZWZpbmVkIGFuZCAoZW5kX2RhdGUgLSBuZXcgRGF0ZSkgPD0gKG1pbl9tb250aHMqMzAqMjQqMzYwMCoxMDAwKVxuXHRcdFx0IyDmj5DnpLrnlKjmiLfkvZnpop3kuI3otrNcblx0XHRcdHRvYXN0ci5lcnJvciB0KFwic3BhY2VfYmFsYW5jZV9pbnN1ZmZpY2llbnRcIilcblxuXHRTdGVlZG9zLnNldE1vZGFsTWF4SGVpZ2h0ID0gKCktPlxuXHRcdGFjY291bnRab29tVmFsdWUgPSBTdGVlZG9zLmdldEFjY291bnRab29tVmFsdWUoKVxuXHRcdHVubGVzcyBhY2NvdW50Wm9vbVZhbHVlLm5hbWVcblx0XHRcdGFjY291bnRab29tVmFsdWUubmFtZSA9ICdsYXJnZSdcblx0XHRzd2l0Y2ggYWNjb3VudFpvb21WYWx1ZS5uYW1lXG5cdFx0XHR3aGVuICdub3JtYWwnXG5cdFx0XHRcdGlmIFN0ZWVkb3MuaXNNb2JpbGUoKVxuXHRcdFx0XHRcdG9mZnNldCA9IC0xMlxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0b2Zmc2V0ID0gNzVcblx0XHRcdHdoZW4gJ2xhcmdlJ1xuXHRcdFx0XHRpZiBTdGVlZG9zLmlzTW9iaWxlKClcblx0XHRcdFx0XHRvZmZzZXQgPSAtNlxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0IyDljLrliIZJRea1j+iniOWZqFxuXHRcdFx0XHRcdGlmIFN0ZWVkb3MuZGV0ZWN0SUUoKVxuXHRcdFx0XHRcdFx0b2Zmc2V0ID0gMTk5XG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0b2Zmc2V0ID0gOVxuXHRcdFx0d2hlbiAnZXh0cmEtbGFyZ2UnXG5cdFx0XHRcdGlmIFN0ZWVkb3MuaXNNb2JpbGUoKVxuXHRcdFx0XHRcdG9mZnNldCA9IC0yNlxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0IyDljLrliIZJRea1j+iniOWZqFxuXHRcdFx0XHRcdGlmIFN0ZWVkb3MuZGV0ZWN0SUUoKVxuXHRcdFx0XHRcdFx0b2Zmc2V0ID0gMzAzXG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0b2Zmc2V0ID0gNTNcblxuXHRcdGlmICQoXCIubW9kYWxcIikubGVuZ3RoXG5cdFx0XHQkKFwiLm1vZGFsXCIpLmVhY2ggLT5cblx0XHRcdFx0aGVhZGVySGVpZ2h0ID0gMFxuXHRcdFx0XHRmb290ZXJIZWlnaHQgPSAwXG5cdFx0XHRcdHRvdGFsSGVpZ2h0ID0gMFxuXHRcdFx0XHQkKFwiLm1vZGFsLWhlYWRlclwiLCAkKHRoaXMpKS5lYWNoIC0+XG5cdFx0XHRcdFx0aGVhZGVySGVpZ2h0ICs9ICQodGhpcykub3V0ZXJIZWlnaHQoZmFsc2UpXG5cdFx0XHRcdCQoXCIubW9kYWwtZm9vdGVyXCIsICQodGhpcykpLmVhY2ggLT5cblx0XHRcdFx0XHRmb290ZXJIZWlnaHQgKz0gJCh0aGlzKS5vdXRlckhlaWdodChmYWxzZSlcblxuXHRcdFx0XHR0b3RhbEhlaWdodCA9IGhlYWRlckhlaWdodCArIGZvb3RlckhlaWdodFxuXHRcdFx0XHRoZWlnaHQgPSAkKFwiYm9keVwiKS5pbm5lckhlaWdodCgpIC0gdG90YWxIZWlnaHQgLSBvZmZzZXRcblx0XHRcdFx0aWYgJCh0aGlzKS5oYXNDbGFzcyhcImNmX2NvbnRhY3RfbW9kYWxcIilcblx0XHRcdFx0XHQkKFwiLm1vZGFsLWJvZHlcIiwkKHRoaXMpKS5jc3Moe1wibWF4LWhlaWdodFwiOiBcIiN7aGVpZ2h0fXB4XCIsIFwiaGVpZ2h0XCI6IFwiI3toZWlnaHR9cHhcIn0pXG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHQkKFwiLm1vZGFsLWJvZHlcIiwkKHRoaXMpKS5jc3Moe1wibWF4LWhlaWdodFwiOiBcIiN7aGVpZ2h0fXB4XCIsIFwiaGVpZ2h0XCI6IFwiYXV0b1wifSlcblxuXHRTdGVlZG9zLmdldE1vZGFsTWF4SGVpZ2h0ID0gKG9mZnNldCktPlxuXHRcdGlmIFN0ZWVkb3MuaXNNb2JpbGUoKVxuXHRcdFx0cmVWYWx1ZSA9IHdpbmRvdy5zY3JlZW4uaGVpZ2h0IC0gMTI2IC0gMTgwIC0gMjVcblx0XHRlbHNlXG5cdFx0XHRyZVZhbHVlID0gJCh3aW5kb3cpLmhlaWdodCgpIC0gMTgwIC0gMjVcblx0XHR1bmxlc3MgU3RlZWRvcy5pc2lPUygpIG9yIFN0ZWVkb3MuaXNNb2JpbGUoKVxuXHRcdFx0IyBpb3Plj4rmiYvmnLrkuIrkuI3pnIDopoHkuLp6b29t5pS+5aSn5Yqf6IO96aKd5aSW6K6h566XXG5cdFx0XHRhY2NvdW50Wm9vbVZhbHVlID0gU3RlZWRvcy5nZXRBY2NvdW50Wm9vbVZhbHVlKClcblx0XHRcdHN3aXRjaCBhY2NvdW50Wm9vbVZhbHVlLm5hbWVcblx0XHRcdFx0d2hlbiAnbGFyZ2UnXG5cdFx0XHRcdFx0IyDmtYvkuIvmnaXov5nph4zkuI3pnIDopoHpop3lpJblh4/mlbBcblx0XHRcdFx0XHRyZVZhbHVlIC09IDUwXG5cdFx0XHRcdHdoZW4gJ2V4dHJhLWxhcmdlJ1xuXHRcdFx0XHRcdHJlVmFsdWUgLT0gMTQ1XG5cdFx0aWYgb2Zmc2V0XG5cdFx0XHRyZVZhbHVlIC09IG9mZnNldFxuXHRcdHJldHVybiByZVZhbHVlICsgXCJweFwiO1xuXG5cdFN0ZWVkb3MuaXNpT1MgPSAodXNlckFnZW50LCBsYW5ndWFnZSktPlxuXHRcdERFVklDRSA9XG5cdFx0XHRhbmRyb2lkOiAnYW5kcm9pZCdcblx0XHRcdGJsYWNrYmVycnk6ICdibGFja2JlcnJ5J1xuXHRcdFx0ZGVza3RvcDogJ2Rlc2t0b3AnXG5cdFx0XHRpcGFkOiAnaXBhZCdcblx0XHRcdGlwaG9uZTogJ2lwaG9uZSdcblx0XHRcdGlwb2Q6ICdpcG9kJ1xuXHRcdFx0bW9iaWxlOiAnbW9iaWxlJ1xuXHRcdGJyb3dzZXIgPSB7fVxuXHRcdGNvbkV4cCA9ICcoPzpbXFxcXC86XFxcXDo6XFxcXHM6O10pJ1xuXHRcdG51bUV4cCA9ICcoXFxcXFMrW15cXFxcczo7OlxcXFwpXXwpJ1xuXHRcdHVzZXJBZ2VudCA9ICh1c2VyQWdlbnQgb3IgbmF2aWdhdG9yLnVzZXJBZ2VudCkudG9Mb3dlckNhc2UoKVxuXHRcdGxhbmd1YWdlID0gbGFuZ3VhZ2Ugb3IgbmF2aWdhdG9yLmxhbmd1YWdlIG9yIG5hdmlnYXRvci5icm93c2VyTGFuZ3VhZ2Vcblx0XHRkZXZpY2UgPSB1c2VyQWdlbnQubWF0Y2gobmV3IFJlZ0V4cCgnKGFuZHJvaWR8aXBhZHxpcGhvbmV8aXBvZHxibGFja2JlcnJ5KScpKSBvciB1c2VyQWdlbnQubWF0Y2gobmV3IFJlZ0V4cCgnKG1vYmlsZSknKSkgb3IgW1xuXHRcdFx0Jydcblx0XHRcdERFVklDRS5kZXNrdG9wXG5cdFx0XVxuXHRcdGJyb3dzZXIuZGV2aWNlID0gZGV2aWNlWzFdXG5cdFx0cmV0dXJuIGJyb3dzZXIuZGV2aWNlID09IERFVklDRS5pcGFkIG9yIGJyb3dzZXIuZGV2aWNlID09IERFVklDRS5pcGhvbmUgb3IgYnJvd3Nlci5kZXZpY2UgPT0gREVWSUNFLmlwb2RcblxuXHRTdGVlZG9zLmdldFVzZXJPcmdhbml6YXRpb25zID0gKGlzSW5jbHVkZVBhcmVudHMpLT5cblx0XHR1c2VySWQgPSBNZXRlb3IudXNlcklkKClcblx0XHRzcGFjZUlkID0gU3RlZWRvcy5zcGFjZUlkKClcblx0XHRzcGFjZV91c2VyID0gZGIuc3BhY2VfdXNlcnMuZmluZE9uZSh7dXNlcjp1c2VySWQsc3BhY2U6c3BhY2VJZH0sZmllbGRzOntvcmdhbml6YXRpb25zOjF9KVxuXHRcdG9yZ2FuaXphdGlvbnMgPSBzcGFjZV91c2VyPy5vcmdhbml6YXRpb25zXG5cdFx0dW5sZXNzIG9yZ2FuaXphdGlvbnNcblx0XHRcdHJldHVybiBbXVxuXHRcdGlmIGlzSW5jbHVkZVBhcmVudHNcblx0XHRcdHBhcmVudHMgPSBfLmZsYXR0ZW4gZGIub3JnYW5pemF0aW9ucy5maW5kKF9pZDp7JGluOm9yZ2FuaXphdGlvbnN9KS5mZXRjaCgpLmdldFByb3BlcnR5KFwicGFyZW50c1wiKVxuXHRcdFx0cmV0dXJuIF8udW5pb24gb3JnYW5pemF0aW9ucyxwYXJlbnRzXG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIG9yZ2FuaXphdGlvbnNcblxuXHRTdGVlZG9zLmZvcmJpZE5vZGVDb250ZXh0bWVudSA9ICh0YXJnZXQsIGlmciktPlxuXHRcdHVubGVzcyBTdGVlZG9zLmlzTm9kZSgpXG5cdFx0XHRyZXR1cm5cblx0XHR0YXJnZXQuZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyICdjb250ZXh0bWVudScsIChldikgLT5cblx0XHRcdGV2LnByZXZlbnREZWZhdWx0KClcblx0XHRcdHJldHVybiBmYWxzZVxuXHRcdGlmIGlmclxuXHRcdFx0aWYgdHlwZW9mIGlmciA9PSAnc3RyaW5nJ1xuXHRcdFx0XHRpZnIgPSB0YXJnZXQuJChpZnIpXG5cdFx0XHRpZnIubG9hZCAtPlxuXHRcdFx0XHRpZnJCb2R5ID0gaWZyLmNvbnRlbnRzKCkuZmluZCgnYm9keScpXG5cdFx0XHRcdGlmIGlmckJvZHlcblx0XHRcdFx0XHRpZnJCb2R5WzBdLmFkZEV2ZW50TGlzdGVuZXIgJ2NvbnRleHRtZW51JywgKGV2KSAtPlxuXHRcdFx0XHRcdFx0ZXYucHJldmVudERlZmF1bHQoKVxuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlXG5cbmlmIE1ldGVvci5pc1NlcnZlclxuXHRTdGVlZG9zLmdldFVzZXJPcmdhbml6YXRpb25zID0gKHNwYWNlSWQsdXNlcklkLGlzSW5jbHVkZVBhcmVudHMpLT5cblx0XHRzcGFjZV91c2VyID0gZGIuc3BhY2VfdXNlcnMuZmluZE9uZSh7dXNlcjp1c2VySWQsc3BhY2U6c3BhY2VJZH0sZmllbGRzOntvcmdhbml6YXRpb25zOjF9KVxuXHRcdG9yZ2FuaXphdGlvbnMgPSBzcGFjZV91c2VyPy5vcmdhbml6YXRpb25zXG5cdFx0dW5sZXNzIG9yZ2FuaXphdGlvbnNcblx0XHRcdHJldHVybiBbXVxuXHRcdGlmIGlzSW5jbHVkZVBhcmVudHNcblx0XHRcdHBhcmVudHMgPSBfLmZsYXR0ZW4gZGIub3JnYW5pemF0aW9ucy5maW5kKF9pZDp7JGluOm9yZ2FuaXphdGlvbnN9KS5mZXRjaCgpLmdldFByb3BlcnR5KFwicGFyZW50c1wiKVxuXHRcdFx0cmV0dXJuIF8udW5pb24gb3JnYW5pemF0aW9ucyxwYXJlbnRzXG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIG9yZ2FuaXphdGlvbnNcblxuI1x0U3RlZWRvcy5jaGFyZ2VBUEljaGVjayA9IChzcGFjZUlkKS0+XG5cbmlmIE1ldGVvci5pc1NlcnZlclxuXHRDb29raWVzID0gcmVxdWlyZShcImNvb2tpZXNcIilcblx0I1RPRE8g5re75Yqg5pyN5Yqh56uv5piv5ZCm5omL5py655qE5Yik5patKOS+neaNrnJlcXVlc3QpXG5cdFN0ZWVkb3MuaXNNb2JpbGUgPSAoKS0+XG5cdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFN0ZWVkb3MuaXNTcGFjZUFkbWluID0gKHNwYWNlSWQsIHVzZXJJZCktPlxuXHRcdGlmICFzcGFjZUlkIHx8ICF1c2VySWRcblx0XHRcdHJldHVybiBmYWxzZVxuXHRcdHNwYWNlID0gZGIuc3BhY2VzLmZpbmRPbmUoc3BhY2VJZClcblx0XHRpZiAhc3BhY2UgfHwgIXNwYWNlLmFkbWluc1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdHJldHVybiBzcGFjZS5hZG1pbnMuaW5kZXhPZih1c2VySWQpPj0wXG5cblx0U3RlZWRvcy5pc0xlZ2FsVmVyc2lvbiA9IChzcGFjZUlkLGFwcF92ZXJzaW9uKS0+XG5cdFx0aWYgIXNwYWNlSWRcblx0XHRcdHJldHVybiBmYWxzZVxuXHRcdGNoZWNrID0gZmFsc2Vcblx0XHRtb2R1bGVzID0gZGIuc3BhY2VzLmZpbmRPbmUoc3BhY2VJZCk/Lm1vZHVsZXNcblx0XHRpZiBtb2R1bGVzIGFuZCBtb2R1bGVzLmluY2x1ZGVzKGFwcF92ZXJzaW9uKVxuXHRcdFx0Y2hlY2sgPSB0cnVlXG5cdFx0cmV0dXJuIGNoZWNrXG5cblx0IyDliKTmlq3mlbDnu4RvcmdJZHPkuK3nmoRvcmcgaWTpm4blkIjlr7nkuo7nlKjmiLd1c2VySWTmmK/lkKbmnInnu4Tnu4fnrqHnkIblkZjmnYPpmZDvvIzlj6ropoHmlbDnu4RvcmdJZHPkuK3ku7vkvZXkuIDkuKrnu4Tnu4fmnInmnYPpmZDlsLHov5Tlm550cnVl77yM5Y+N5LmL6L+U5ZueZmFsc2Vcblx0U3RlZWRvcy5pc09yZ0FkbWluQnlPcmdJZHMgPSAob3JnSWRzLCB1c2VySWQpLT5cblx0XHRpc09yZ0FkbWluID0gZmFsc2Vcblx0XHR1c2VPcmdzID0gZGIub3JnYW5pemF0aW9ucy5maW5kKHtfaWQ6IHskaW46b3JnSWRzfX0se2ZpZWxkczp7cGFyZW50czoxLGFkbWluczoxfX0pLmZldGNoKClcblx0XHRwYXJlbnRzID0gW11cblx0XHRhbGxvd0FjY2Vzc09yZ3MgPSB1c2VPcmdzLmZpbHRlciAob3JnKSAtPlxuXHRcdFx0aWYgb3JnLnBhcmVudHNcblx0XHRcdFx0cGFyZW50cyA9IF8udW5pb24gcGFyZW50cyxvcmcucGFyZW50c1xuXHRcdFx0cmV0dXJuIG9yZy5hZG1pbnM/LmluY2x1ZGVzKHVzZXJJZClcblx0XHRpZiBhbGxvd0FjY2Vzc09yZ3MubGVuZ3RoXG5cdFx0XHRpc09yZ0FkbWluID0gdHJ1ZVxuXHRcdGVsc2Vcblx0XHRcdHBhcmVudHMgPSBfLmZsYXR0ZW4gcGFyZW50c1xuXHRcdFx0cGFyZW50cyA9IF8udW5pcSBwYXJlbnRzXG5cdFx0XHRpZiBwYXJlbnRzLmxlbmd0aCBhbmQgZGIub3JnYW5pemF0aW9ucy5maW5kT25lKHtfaWQ6eyRpbjpwYXJlbnRzfSwgYWRtaW5zOnVzZXJJZH0pXG5cdFx0XHRcdGlzT3JnQWRtaW4gPSB0cnVlXG5cdFx0cmV0dXJuIGlzT3JnQWRtaW5cblxuXG5cdCMg5Yik5pat5pWw57uEb3JnSWRz5Lit55qEb3JnIGlk6ZuG5ZCI5a+55LqO55So5oi3dXNlcklk5piv5ZCm5pyJ5YWo6YOo57uE57uH566h55CG5ZGY5p2D6ZmQ77yM5Y+q5pyJ5pWw57uEb3JnSWRz5Lit5q+P5Liq57uE57uH6YO95pyJ5p2D6ZmQ5omN6L+U5ZuedHJ1Ze+8jOWPjeS5i+i/lOWbnmZhbHNlXG5cdFN0ZWVkb3MuaXNPcmdBZG1pbkJ5QWxsT3JnSWRzID0gKG9yZ0lkcywgdXNlcklkKS0+XG5cdFx0dW5sZXNzIG9yZ0lkcy5sZW5ndGhcblx0XHRcdHJldHVybiB0cnVlXG5cdFx0aSA9IDBcblx0XHR3aGlsZSBpIDwgb3JnSWRzLmxlbmd0aFxuXHRcdFx0aXNPcmdBZG1pbiA9IFN0ZWVkb3MuaXNPcmdBZG1pbkJ5T3JnSWRzIFtvcmdJZHNbaV1dLCB1c2VySWRcblx0XHRcdHVubGVzcyBpc09yZ0FkbWluXG5cdFx0XHRcdGJyZWFrXG5cdFx0XHRpKytcblx0XHRyZXR1cm4gaXNPcmdBZG1pblxuXG5cdFN0ZWVkb3MuYWJzb2x1dGVVcmwgPSAodXJsKS0+XG5cdFx0aWYgdXJsXG5cdFx0XHQjIHVybOS7pVwiL1wi5byA5aS055qE6K+d77yM5Y675o6J5byA5aS055qEXCIvXCJcblx0XHRcdHVybCA9IHVybC5yZXBsYWNlKC9eXFwvLyxcIlwiKVxuXHRcdGlmIChNZXRlb3IuaXNDb3Jkb3ZhKVxuXHRcdFx0cmV0dXJuIE1ldGVvci5hYnNvbHV0ZVVybCh1cmwpO1xuXHRcdGVsc2Vcblx0XHRcdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdFx0XHR0cnlcblx0XHRcdFx0XHRyb290X3VybCA9IG5ldyBVUkwoTWV0ZW9yLmFic29sdXRlVXJsKCkpXG5cdFx0XHRcdFx0aWYgdXJsXG5cdFx0XHRcdFx0XHRyZXR1cm4gcm9vdF91cmwucGF0aG5hbWUgKyB1cmxcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRyZXR1cm4gcm9vdF91cmwucGF0aG5hbWVcblx0XHRcdFx0Y2F0Y2ggZVxuXHRcdFx0XHRcdHJldHVybiBNZXRlb3IuYWJzb2x1dGVVcmwodXJsKVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRNZXRlb3IuYWJzb2x1dGVVcmwodXJsKVxuXG5cdCNcdOmAmui/h3JlcXVlc3QuaGVhZGVyc+OAgWNvb2tpZSDojrflvpfmnInmlYjnlKjmiLdcblx0U3RlZWRvcy5nZXRBUElMb2dpblVzZXJcdD0gKHJlcSwgcmVzKSAtPlxuXG5cdFx0dXNlcm5hbWUgPSByZXEucXVlcnk/LnVzZXJuYW1lXG5cblx0XHRwYXNzd29yZCA9IHJlcS5xdWVyeT8ucGFzc3dvcmRcblxuXHRcdGlmIHVzZXJuYW1lICYmIHBhc3N3b3JkXG5cdFx0XHR1c2VyID0gZGIudXNlcnMuZmluZE9uZSh7c3RlZWRvc19pZDogdXNlcm5hbWV9KVxuXG5cdFx0XHRpZiAhdXNlclxuXHRcdFx0XHRyZXR1cm4gZmFsc2VcblxuXHRcdFx0cmVzdWx0ID0gQWNjb3VudHMuX2NoZWNrUGFzc3dvcmQgdXNlciwgcGFzc3dvcmRcblxuXHRcdFx0aWYgcmVzdWx0LmVycm9yXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihyZXN1bHQuZXJyb3IpXG5cdFx0XHRlbHNlXG5cdFx0XHRcdHJldHVybiB1c2VyXG5cblx0XHR1c2VySWQgPSByZXEucXVlcnk/W1wiWC1Vc2VyLUlkXCJdXG5cblx0XHRhdXRoVG9rZW4gPSByZXEucXVlcnk/W1wiWC1BdXRoLVRva2VuXCJdXG5cblx0XHRpZiBTdGVlZG9zLmNoZWNrQXV0aFRva2VuKHVzZXJJZCxhdXRoVG9rZW4pXG5cdFx0XHRyZXR1cm4gZGIudXNlcnMuZmluZE9uZSh7X2lkOiB1c2VySWR9KVxuXG5cdFx0Y29va2llcyA9IG5ldyBDb29raWVzKHJlcSwgcmVzKTtcblxuXHRcdGlmIHJlcS5oZWFkZXJzXG5cdFx0XHR1c2VySWQgPSByZXEuaGVhZGVyc1tcIngtdXNlci1pZFwiXVxuXHRcdFx0YXV0aFRva2VuID0gcmVxLmhlYWRlcnNbXCJ4LWF1dGgtdG9rZW5cIl1cblxuXHRcdCMgdGhlbiBjaGVjayBjb29raWVcblx0XHRpZiAhdXNlcklkIG9yICFhdXRoVG9rZW5cblx0XHRcdHVzZXJJZCA9IGNvb2tpZXMuZ2V0KFwiWC1Vc2VyLUlkXCIpXG5cdFx0XHRhdXRoVG9rZW4gPSBjb29raWVzLmdldChcIlgtQXV0aC1Ub2tlblwiKVxuXG5cdFx0aWYgIXVzZXJJZCBvciAhYXV0aFRva2VuXG5cdFx0XHRyZXR1cm4gZmFsc2VcblxuXHRcdGlmIFN0ZWVkb3MuY2hlY2tBdXRoVG9rZW4odXNlcklkLCBhdXRoVG9rZW4pXG5cdFx0XHRyZXR1cm4gZGIudXNlcnMuZmluZE9uZSh7X2lkOiB1c2VySWR9KVxuXG5cdFx0cmV0dXJuIGZhbHNlXG5cblx0I1x05qOA5p+ldXNlcklk44CBYXV0aFRva2Vu5piv5ZCm5pyJ5pWIXG5cdFN0ZWVkb3MuY2hlY2tBdXRoVG9rZW4gPSAodXNlcklkLCBhdXRoVG9rZW4pIC0+XG5cdFx0aWYgdXNlcklkIGFuZCBhdXRoVG9rZW5cblx0XHRcdGhhc2hlZFRva2VuID0gQWNjb3VudHMuX2hhc2hMb2dpblRva2VuKGF1dGhUb2tlbilcblx0XHRcdHVzZXIgPSBNZXRlb3IudXNlcnMuZmluZE9uZVxuXHRcdFx0XHRfaWQ6IHVzZXJJZCxcblx0XHRcdFx0XCJzZXJ2aWNlcy5yZXN1bWUubG9naW5Ub2tlbnMuaGFzaGVkVG9rZW5cIjogaGFzaGVkVG9rZW5cblx0XHRcdGlmIHVzZXJcblx0XHRcdFx0cmV0dXJuIHRydWVcblx0XHRcdGVsc2Vcblx0XHRcdFx0cmV0dXJuIGZhbHNlXG5cdFx0cmV0dXJuIGZhbHNlXG5cblxuaWYgTWV0ZW9yLmlzU2VydmVyXG5cdGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xuXHRTdGVlZG9zLmRlY3J5cHQgPSAocGFzc3dvcmQsIGtleSwgaXYpLT5cblx0XHR0cnlcblx0XHRcdGtleTMyID0gXCJcIlxuXHRcdFx0bGVuID0ga2V5Lmxlbmd0aFxuXHRcdFx0aWYgbGVuIDwgMzJcblx0XHRcdFx0YyA9IFwiXCJcblx0XHRcdFx0aSA9IDBcblx0XHRcdFx0bSA9IDMyIC0gbGVuXG5cdFx0XHRcdHdoaWxlIGkgPCBtXG5cdFx0XHRcdFx0YyA9IFwiIFwiICsgY1xuXHRcdFx0XHRcdGkrK1xuXHRcdFx0XHRrZXkzMiA9IGtleSArIGNcblx0XHRcdGVsc2UgaWYgbGVuID49IDMyXG5cdFx0XHRcdGtleTMyID0ga2V5LnNsaWNlKDAsIDMyKVxuXG5cdFx0XHRkZWNpcGhlciA9IGNyeXB0by5jcmVhdGVEZWNpcGhlcml2KCdhZXMtMjU2LWNiYycsIG5ldyBCdWZmZXIoa2V5MzIsICd1dGY4JyksIG5ldyBCdWZmZXIoaXYsICd1dGY4JykpXG5cblx0XHRcdGRlY2lwaGVyTXNnID0gQnVmZmVyLmNvbmNhdChbZGVjaXBoZXIudXBkYXRlKHBhc3N3b3JkLCAnYmFzZTY0JyksIGRlY2lwaGVyLmZpbmFsKCldKVxuXG5cdFx0XHRwYXNzd29yZCA9IGRlY2lwaGVyTXNnLnRvU3RyaW5nKCk7XG5cdFx0XHRyZXR1cm4gcGFzc3dvcmQ7XG5cdFx0Y2F0Y2ggZVxuXHRcdFx0cmV0dXJuIHBhc3N3b3JkO1xuXG5cdFN0ZWVkb3MuZW5jcnlwdCA9IChwYXNzd29yZCwga2V5LCBpdiktPlxuXHRcdGtleTMyID0gXCJcIlxuXHRcdGxlbiA9IGtleS5sZW5ndGhcblx0XHRpZiBsZW4gPCAzMlxuXHRcdFx0YyA9IFwiXCJcblx0XHRcdGkgPSAwXG5cdFx0XHRtID0gMzIgLSBsZW5cblx0XHRcdHdoaWxlIGkgPCBtXG5cdFx0XHRcdGMgPSBcIiBcIiArIGNcblx0XHRcdFx0aSsrXG5cdFx0XHRrZXkzMiA9IGtleSArIGNcblx0XHRlbHNlIGlmIGxlbiA+PSAzMlxuXHRcdFx0a2V5MzIgPSBrZXkuc2xpY2UoMCwgMzIpXG5cblx0XHRjaXBoZXIgPSBjcnlwdG8uY3JlYXRlQ2lwaGVyaXYoJ2Flcy0yNTYtY2JjJywgbmV3IEJ1ZmZlcihrZXkzMiwgJ3V0ZjgnKSwgbmV3IEJ1ZmZlcihpdiwgJ3V0ZjgnKSlcblxuXHRcdGNpcGhlcmVkTXNnID0gQnVmZmVyLmNvbmNhdChbY2lwaGVyLnVwZGF0ZShuZXcgQnVmZmVyKHBhc3N3b3JkLCAndXRmOCcpKSwgY2lwaGVyLmZpbmFsKCldKVxuXG5cdFx0cGFzc3dvcmQgPSBjaXBoZXJlZE1zZy50b1N0cmluZygnYmFzZTY0JylcblxuXHRcdHJldHVybiBwYXNzd29yZDtcblxuXHRTdGVlZG9zLmdldFVzZXJJZEZyb21BY2Nlc3NUb2tlbiA9IChhY2Nlc3NfdG9rZW4pLT5cblxuXHRcdGlmICFhY2Nlc3NfdG9rZW5cblx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0dXNlcklkID0gYWNjZXNzX3Rva2VuLnNwbGl0KFwiLVwiKVswXVxuXG5cdFx0aGFzaGVkVG9rZW4gPSBBY2NvdW50cy5faGFzaExvZ2luVG9rZW4oYWNjZXNzX3Rva2VuKVxuXG5cdFx0dXNlciA9IGRiLnVzZXJzLmZpbmRPbmUoe19pZDogdXNlcklkLCBcInNlY3JldHMuaGFzaGVkVG9rZW5cIjogaGFzaGVkVG9rZW59KVxuXG5cdFx0aWYgdXNlclxuXHRcdFx0cmV0dXJuIHVzZXJJZFxuXHRcdGVsc2Vcblx0XHRcdCMg5aaC5p6cdXNlcuihqOacquafpeWIsO+8jOWImeS9v+eUqG9hdXRoMuWNj+iurueUn+aIkOeahHRva2Vu5p+l5om+55So5oi3XG5cdFx0XHRjb2xsZWN0aW9uID0gb0F1dGgyU2VydmVyLmNvbGxlY3Rpb25zLmFjY2Vzc1Rva2VuXG5cblx0XHRcdG9iaiA9IGNvbGxlY3Rpb24uZmluZE9uZSh7J2FjY2Vzc1Rva2VuJzogYWNjZXNzX3Rva2VufSlcblx0XHRcdGlmIG9ialxuXHRcdFx0XHQjIOWIpOaWrXRva2Vu55qE5pyJ5pWI5pyfXG5cdFx0XHRcdGlmIG9iaj8uZXhwaXJlcyA8IG5ldyBEYXRlKClcblx0XHRcdFx0XHRyZXR1cm4gXCJvYXV0aDIgYWNjZXNzIHRva2VuOlwiK2FjY2Vzc190b2tlbitcIiBpcyBleHBpcmVkLlwiXG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHRyZXR1cm4gb2JqPy51c2VySWRcblx0XHRcdGVsc2Vcblx0XHRcdFx0cmV0dXJuIFwib2F1dGgyIGFjY2VzcyB0b2tlbjpcIithY2Nlc3NfdG9rZW4rXCIgaXMgbm90IGZvdW5kLlwiXG5cdFx0cmV0dXJuIG51bGxcblxuXHRTdGVlZG9zLmdldFVzZXJJZEZyb21BdXRoVG9rZW4gPSAocmVxLCByZXMpLT5cblxuXHRcdHVzZXJJZCA9IHJlcS5xdWVyeT9bXCJYLVVzZXItSWRcIl1cblxuXHRcdGF1dGhUb2tlbiA9IHJlcS5xdWVyeT9bXCJYLUF1dGgtVG9rZW5cIl1cblxuXHRcdGlmIFN0ZWVkb3MuY2hlY2tBdXRoVG9rZW4odXNlcklkLGF1dGhUb2tlbilcblx0XHRcdHJldHVybiBkYi51c2Vycy5maW5kT25lKHtfaWQ6IHVzZXJJZH0pPy5faWRcblxuXHRcdGNvb2tpZXMgPSBuZXcgQ29va2llcyhyZXEsIHJlcyk7XG5cblx0XHRpZiByZXEuaGVhZGVyc1xuXHRcdFx0dXNlcklkID0gcmVxLmhlYWRlcnNbXCJ4LXVzZXItaWRcIl1cblx0XHRcdGF1dGhUb2tlbiA9IHJlcS5oZWFkZXJzW1wieC1hdXRoLXRva2VuXCJdXG5cblx0XHQjIHRoZW4gY2hlY2sgY29va2llXG5cdFx0aWYgIXVzZXJJZCBvciAhYXV0aFRva2VuXG5cdFx0XHR1c2VySWQgPSBjb29raWVzLmdldChcIlgtVXNlci1JZFwiKVxuXHRcdFx0YXV0aFRva2VuID0gY29va2llcy5nZXQoXCJYLUF1dGgtVG9rZW5cIilcblxuXHRcdGlmICF1c2VySWQgb3IgIWF1dGhUb2tlblxuXHRcdFx0cmV0dXJuIG51bGxcblxuXHRcdGlmIFN0ZWVkb3MuY2hlY2tBdXRoVG9rZW4odXNlcklkLCBhdXRoVG9rZW4pXG5cdFx0XHRyZXR1cm4gZGIudXNlcnMuZmluZE9uZSh7X2lkOiB1c2VySWR9KT8uX2lkXG5cblx0U3RlZWRvcy5BUElBdXRoZW50aWNhdGlvbkNoZWNrID0gKHJlcSwgcmVzKSAtPlxuXHRcdHRyeVxuXHRcdFx0dXNlcklkID0gcmVxLnVzZXJJZFxuXG5cdFx0XHR1c2VyID0gZGIudXNlcnMuZmluZE9uZSh7X2lkOiB1c2VySWR9KVxuXG5cdFx0XHRpZiAhdXNlcklkIHx8ICF1c2VyXG5cdFx0XHRcdEpzb25Sb3V0ZXMuc2VuZFJlc3VsdCByZXMsXG5cdFx0XHRcdFx0ZGF0YTpcblx0XHRcdFx0XHRcdFwiZXJyb3JcIjogXCJWYWxpZGF0ZSBSZXF1ZXN0IC0tIE1pc3NpbmcgWC1BdXRoLVRva2VuLFgtVXNlci1JZCBPciBhY2Nlc3NfdG9rZW5cIixcblx0XHRcdFx0XHRjb2RlOiA0MDEsXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0Y2F0Y2ggZVxuXHRcdFx0aWYgIXVzZXJJZCB8fCAhdXNlclxuXHRcdFx0XHRKc29uUm91dGVzLnNlbmRSZXN1bHQgcmVzLFxuXHRcdFx0XHRcdGNvZGU6IDQwMSxcblx0XHRcdFx0XHRkYXRhOlxuXHRcdFx0XHRcdFx0XCJlcnJvclwiOiBlLm1lc3NhZ2UsXG5cdFx0XHRcdFx0XHRcInN1Y2Nlc3NcIjogZmFsc2Vcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cbiMgVGhpcyB3aWxsIGFkZCB1bmRlcnNjb3JlLnN0cmluZyBtZXRob2RzIHRvIFVuZGVyc2NvcmUuanNcbiMgZXhjZXB0IGZvciBpbmNsdWRlLCBjb250YWlucywgcmV2ZXJzZSBhbmQgam9pbiB0aGF0IGFyZVxuIyBkcm9wcGVkIGJlY2F1c2UgdGhleSBjb2xsaWRlIHdpdGggdGhlIGZ1bmN0aW9ucyBhbHJlYWR5XG4jIGRlZmluZWQgYnkgVW5kZXJzY29yZS5qcy5cblxubWl4aW4gPSAob2JqKSAtPlxuXHRfLmVhY2ggXy5mdW5jdGlvbnMob2JqKSwgKG5hbWUpIC0+XG5cdFx0aWYgbm90IF9bbmFtZV0gYW5kIG5vdCBfLnByb3RvdHlwZVtuYW1lXT9cblx0XHRcdGZ1bmMgPSBfW25hbWVdID0gb2JqW25hbWVdXG5cdFx0XHRfLnByb3RvdHlwZVtuYW1lXSA9IC0+XG5cdFx0XHRcdGFyZ3MgPSBbdGhpcy5fd3JhcHBlZF1cblx0XHRcdFx0cHVzaC5hcHBseShhcmdzLCBhcmd1bWVudHMpXG5cdFx0XHRcdHJldHVybiByZXN1bHQuY2FsbCh0aGlzLCBmdW5jLmFwcGx5KF8sIGFyZ3MpKVxuXG4jbWl4aW4oX3MuZXhwb3J0cygpKVxuXG5pZiBNZXRlb3IuaXNTZXJ2ZXJcbiMg5Yik5pat5piv5ZCm5piv6IqC5YGH5pelXG5cdFN0ZWVkb3MuaXNIb2xpZGF5ID0gKGRhdGUpLT5cblx0XHRpZiAhZGF0ZVxuXHRcdFx0ZGF0ZSA9IG5ldyBEYXRlXG5cdFx0Y2hlY2sgZGF0ZSwgRGF0ZVxuXHRcdGRheSA9IGRhdGUuZ2V0RGF5KClcblx0XHQjIOWRqOWFreWRqOaXpeS4uuWBh+acn1xuXHRcdGlmIGRheSBpcyA2IG9yIGRheSBpcyAwXG5cdFx0XHRyZXR1cm4gdHJ1ZVxuXG5cdFx0cmV0dXJuIGZhbHNlXG5cdCMg5qC55o2u5Lyg5YWl5pe26Ze0KGRhdGUp6K6h566X5Yeg5Liq5bel5L2c5pelKGRheXMp5ZCO55qE5pe26Ze0LGRheXPnm67liY3lj6rog73mmK/mlbTmlbBcblx0U3RlZWRvcy5jYWN1bGF0ZVdvcmtpbmdUaW1lID0gKGRhdGUsIGRheXMpLT5cblx0XHRjaGVjayBkYXRlLCBEYXRlXG5cdFx0Y2hlY2sgZGF5cywgTnVtYmVyXG5cdFx0cGFyYW1fZGF0ZSA9IG5ldyBEYXRlIGRhdGVcblx0XHRjYWN1bGF0ZURhdGUgPSAoaSwgZGF5cyktPlxuXHRcdFx0aWYgaSA8IGRheXNcblx0XHRcdFx0cGFyYW1fZGF0ZSA9IG5ldyBEYXRlKHBhcmFtX2RhdGUuZ2V0VGltZSgpICsgMjQqNjAqNjAqMTAwMClcblx0XHRcdFx0aWYgIVN0ZWVkb3MuaXNIb2xpZGF5KHBhcmFtX2RhdGUpXG5cdFx0XHRcdFx0aSsrXG5cdFx0XHRcdGNhY3VsYXRlRGF0ZShpLCBkYXlzKVxuXHRcdFx0cmV0dXJuXG5cdFx0Y2FjdWxhdGVEYXRlKDAsIGRheXMpXG5cdFx0cmV0dXJuIHBhcmFtX2RhdGVcblxuXHQjIOiuoeeul+WNiuS4quW3peS9nOaXpeWQjueahOaXtumXtFxuXHQjIOWPguaVsCBuZXh05aaC5p6c5Li6dHJ1ZeWImeihqOekuuWPquiuoeeul2RhdGXml7bpl7TlkI7pnaLntKfmjqXnnYDnmoR0aW1lX3BvaW50c1xuXHRTdGVlZG9zLmNhY3VsYXRlUGx1c0hhbGZXb3JraW5nRGF5ID0gKGRhdGUsIG5leHQpIC0+XG5cdFx0Y2hlY2sgZGF0ZSwgRGF0ZVxuXHRcdHRpbWVfcG9pbnRzID0gTWV0ZW9yLnNldHRpbmdzLnJlbWluZD8udGltZV9wb2ludHNcblx0XHRpZiBub3QgdGltZV9wb2ludHMgb3IgXy5pc0VtcHR5KHRpbWVfcG9pbnRzKVxuXHRcdFx0Y29uc29sZS5lcnJvciBcInRpbWVfcG9pbnRzIGlzIG51bGxcIlxuXHRcdFx0dGltZV9wb2ludHMgPSBbe1wiaG91clwiOiA4LCBcIm1pbnV0ZVwiOiAzMCB9LCB7XCJob3VyXCI6IDE0LCBcIm1pbnV0ZVwiOiAzMCB9XVxuXG5cdFx0bGVuID0gdGltZV9wb2ludHMubGVuZ3RoXG5cdFx0c3RhcnRfZGF0ZSA9IG5ldyBEYXRlIGRhdGVcblx0XHRlbmRfZGF0ZSA9IG5ldyBEYXRlIGRhdGVcblx0XHRzdGFydF9kYXRlLnNldEhvdXJzIHRpbWVfcG9pbnRzWzBdLmhvdXJcblx0XHRzdGFydF9kYXRlLnNldE1pbnV0ZXMgdGltZV9wb2ludHNbMF0ubWludXRlXG5cdFx0ZW5kX2RhdGUuc2V0SG91cnMgdGltZV9wb2ludHNbbGVuIC0gMV0uaG91clxuXHRcdGVuZF9kYXRlLnNldE1pbnV0ZXMgdGltZV9wb2ludHNbbGVuIC0gMV0ubWludXRlXG5cblx0XHRjYWN1bGF0ZWRfZGF0ZSA9IG5ldyBEYXRlIGRhdGVcblxuXHRcdGogPSAwXG5cdFx0bWF4X2luZGV4ID0gbGVuIC0gMVxuXHRcdGlmIGRhdGUgPCBzdGFydF9kYXRlXG5cdFx0XHRpZiBuZXh0XG5cdFx0XHRcdGogPSAwXG5cdFx0XHRlbHNlXG5cdFx0XHRcdCMg5Yqg5Y2K5LiqdGltZV9wb2ludHNcblx0XHRcdFx0aiA9IGxlbi8yXG5cdFx0ZWxzZSBpZiBkYXRlID49IHN0YXJ0X2RhdGUgYW5kIGRhdGUgPCBlbmRfZGF0ZVxuXHRcdFx0aSA9IDBcblx0XHRcdHdoaWxlIGkgPCBtYXhfaW5kZXhcblx0XHRcdFx0Zmlyc3RfZGF0ZSA9IG5ldyBEYXRlIGRhdGVcblx0XHRcdFx0c2Vjb25kX2RhdGUgPSBuZXcgRGF0ZSBkYXRlXG5cdFx0XHRcdGZpcnN0X2RhdGUuc2V0SG91cnMgdGltZV9wb2ludHNbaV0uaG91clxuXHRcdFx0XHRmaXJzdF9kYXRlLnNldE1pbnV0ZXMgdGltZV9wb2ludHNbaV0ubWludXRlXG5cdFx0XHRcdHNlY29uZF9kYXRlLnNldEhvdXJzIHRpbWVfcG9pbnRzW2kgKyAxXS5ob3VyXG5cdFx0XHRcdHNlY29uZF9kYXRlLnNldE1pbnV0ZXMgdGltZV9wb2ludHNbaSArIDFdLm1pbnV0ZVxuXG5cdFx0XHRcdGlmIGRhdGUgPj0gZmlyc3RfZGF0ZSBhbmQgZGF0ZSA8IHNlY29uZF9kYXRlXG5cdFx0XHRcdFx0YnJlYWtcblxuXHRcdFx0XHRpKytcblxuXHRcdFx0aWYgbmV4dFxuXHRcdFx0XHRqID0gaSArIDFcblx0XHRcdGVsc2Vcblx0XHRcdFx0aiA9IGkgKyBsZW4vMlxuXG5cdFx0ZWxzZSBpZiBkYXRlID49IGVuZF9kYXRlXG5cdFx0XHRpZiBuZXh0XG5cdFx0XHRcdGogPSBtYXhfaW5kZXggKyAxXG5cdFx0XHRlbHNlXG5cdFx0XHRcdGogPSBtYXhfaW5kZXggKyBsZW4vMlxuXG5cdFx0aWYgaiA+IG1heF9pbmRleFxuXHRcdFx0IyDpmpTlpKnpnIDliKTmlq3oioLlgYfml6Vcblx0XHRcdGNhY3VsYXRlZF9kYXRlID0gU3RlZWRvcy5jYWN1bGF0ZVdvcmtpbmdUaW1lIGRhdGUsIDFcblx0XHRcdGNhY3VsYXRlZF9kYXRlLnNldEhvdXJzIHRpbWVfcG9pbnRzW2ogLSBtYXhfaW5kZXggLSAxXS5ob3VyXG5cdFx0XHRjYWN1bGF0ZWRfZGF0ZS5zZXRNaW51dGVzIHRpbWVfcG9pbnRzW2ogLSBtYXhfaW5kZXggLSAxXS5taW51dGVcblx0XHRlbHNlIGlmIGogPD0gbWF4X2luZGV4XG5cdFx0XHRjYWN1bGF0ZWRfZGF0ZS5zZXRIb3VycyB0aW1lX3BvaW50c1tqXS5ob3VyXG5cdFx0XHRjYWN1bGF0ZWRfZGF0ZS5zZXRNaW51dGVzIHRpbWVfcG9pbnRzW2pdLm1pbnV0ZVxuXG5cdFx0cmV0dXJuIGNhY3VsYXRlZF9kYXRlXG5cbmlmIE1ldGVvci5pc1NlcnZlclxuXHRfLmV4dGVuZCBTdGVlZG9zLFxuXHRcdGdldFN0ZWVkb3NUb2tlbjogKGFwcElkLCB1c2VySWQsIGF1dGhUb2tlbiktPlxuXHRcdFx0Y3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJylcblx0XHRcdGFwcCA9IGRiLmFwcHMuZmluZE9uZShhcHBJZClcblx0XHRcdGlmIGFwcFxuXHRcdFx0XHRzZWNyZXQgPSBhcHAuc2VjcmV0XG5cblx0XHRcdGlmIHVzZXJJZCBhbmQgYXV0aFRva2VuXG5cdFx0XHRcdGhhc2hlZFRva2VuID0gQWNjb3VudHMuX2hhc2hMb2dpblRva2VuKGF1dGhUb2tlbilcblx0XHRcdFx0dXNlciA9IE1ldGVvci51c2Vycy5maW5kT25lXG5cdFx0XHRcdFx0X2lkOiB1c2VySWQsXG5cdFx0XHRcdFx0XCJzZXJ2aWNlcy5yZXN1bWUubG9naW5Ub2tlbnMuaGFzaGVkVG9rZW5cIjogaGFzaGVkVG9rZW5cblx0XHRcdFx0aWYgdXNlclxuXHRcdFx0XHRcdHN0ZWVkb3NfaWQgPSB1c2VyLnN0ZWVkb3NfaWRcblx0XHRcdFx0XHRpZiBhcHAuc2VjcmV0XG5cdFx0XHRcdFx0XHRpdiA9IGFwcC5zZWNyZXRcblx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRpdiA9IFwiLTg3NjItZmNiMzY5YjJlOFwiXG5cdFx0XHRcdFx0bm93ID0gcGFyc2VJbnQobmV3IERhdGUoKS5nZXRUaW1lKCkvMTAwMCkudG9TdHJpbmcoKVxuXHRcdFx0XHRcdGtleTMyID0gXCJcIlxuXHRcdFx0XHRcdGxlbiA9IHN0ZWVkb3NfaWQubGVuZ3RoXG5cdFx0XHRcdFx0aWYgbGVuIDwgMzJcblx0XHRcdFx0XHRcdGMgPSBcIlwiXG5cdFx0XHRcdFx0XHRpID0gMFxuXHRcdFx0XHRcdFx0bSA9IDMyIC0gbGVuXG5cdFx0XHRcdFx0XHR3aGlsZSBpIDwgbVxuXHRcdFx0XHRcdFx0XHRjID0gXCIgXCIgKyBjXG5cdFx0XHRcdFx0XHRcdGkrK1xuXHRcdFx0XHRcdFx0a2V5MzIgPSBzdGVlZG9zX2lkICsgY1xuXHRcdFx0XHRcdGVsc2UgaWYgbGVuID49IDMyXG5cdFx0XHRcdFx0XHRrZXkzMiA9IHN0ZWVkb3NfaWQuc2xpY2UoMCwzMilcblxuXHRcdFx0XHRcdGNpcGhlciA9IGNyeXB0by5jcmVhdGVDaXBoZXJpdignYWVzLTI1Ni1jYmMnLCBuZXcgQnVmZmVyKGtleTMyLCAndXRmOCcpLCBuZXcgQnVmZmVyKGl2LCAndXRmOCcpKVxuXG5cdFx0XHRcdFx0Y2lwaGVyZWRNc2cgPSBCdWZmZXIuY29uY2F0KFtjaXBoZXIudXBkYXRlKG5ldyBCdWZmZXIobm93LCAndXRmOCcpKSwgY2lwaGVyLmZpbmFsKCldKVxuXG5cdFx0XHRcdFx0c3RlZWRvc190b2tlbiA9IGNpcGhlcmVkTXNnLnRvU3RyaW5nKCdiYXNlNjQnKVxuXG5cdFx0XHRyZXR1cm4gc3RlZWRvc190b2tlblxuXG5cdFx0bG9jYWxlOiAodXNlcklkLCBpc0kxOG4pLT5cblx0XHRcdHVzZXIgPSBkYi51c2Vycy5maW5kT25lKHtfaWQ6dXNlcklkfSx7ZmllbGRzOiB7bG9jYWxlOiAxfX0pXG5cdFx0XHRsb2NhbGUgPSB1c2VyPy5sb2NhbGVcblx0XHRcdGlmIGlzSTE4blxuXHRcdFx0XHRpZiBsb2NhbGUgPT0gXCJlbi11c1wiXG5cdFx0XHRcdFx0bG9jYWxlID0gXCJlblwiXG5cdFx0XHRcdGlmIGxvY2FsZSA9PSBcInpoLWNuXCJcblx0XHRcdFx0XHRsb2NhbGUgPSBcInpoLUNOXCJcblx0XHRcdHJldHVybiBsb2NhbGVcblxuXHRcdGNoZWNrVXNlcm5hbWVBdmFpbGFiaWxpdHk6ICh1c2VybmFtZSkgLT5cblx0XHRcdHJldHVybiBub3QgTWV0ZW9yLnVzZXJzLmZpbmRPbmUoeyB1c2VybmFtZTogeyAkcmVnZXggOiBuZXcgUmVnRXhwKFwiXlwiICsgTWV0ZW9yLl9lc2NhcGVSZWdFeHAodXNlcm5hbWUpLnRyaW0oKSArIFwiJFwiLCBcImlcIikgfSB9KVxuXG5cblx0XHR2YWxpZGF0ZVBhc3N3b3JkOiAocHdkKS0+XG5cdFx0XHRyZWFzb24gPSB0IFwicGFzc3dvcmRfaW52YWxpZFwiXG5cdFx0XHR2YWxpZCA9IHRydWVcblx0XHRcdHVubGVzcyBwd2Rcblx0XHRcdFx0dmFsaWQgPSBmYWxzZVxuXG5cdFx0XHRwYXNzd29yUG9saWN5ID0gTWV0ZW9yLnNldHRpbmdzLnB1YmxpYz8ucGFzc3dvcmQ/LnBvbGljeVxuXHRcdFx0cGFzc3dvclBvbGljeUVycm9yID0gTWV0ZW9yLnNldHRpbmdzLnB1YmxpYz8ucGFzc3dvcmQ/LnBvbGljeUVycm9yXG5cdFx0XHRpZiBwYXNzd29yUG9saWN5XG5cdFx0XHRcdGlmICEobmV3IFJlZ0V4cChwYXNzd29yUG9saWN5KSkudGVzdChwd2QgfHwgJycpXG5cdFx0XHRcdFx0cmVhc29uID0gcGFzc3dvclBvbGljeUVycm9yXG5cdFx0XHRcdFx0dmFsaWQgPSBmYWxzZVxuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0dmFsaWQgPSB0cnVlXG4jXHRcdFx0ZWxzZVxuI1x0XHRcdFx0dW5sZXNzIC9cXGQrLy50ZXN0KHB3ZClcbiNcdFx0XHRcdFx0dmFsaWQgPSBmYWxzZVxuI1x0XHRcdFx0dW5sZXNzIC9bYS16QS1aXSsvLnRlc3QocHdkKVxuI1x0XHRcdFx0XHR2YWxpZCA9IGZhbHNlXG4jXHRcdFx0XHRpZiBwd2QubGVuZ3RoIDwgOFxuI1x0XHRcdFx0XHR2YWxpZCA9IGZhbHNlXG5cdFx0XHRpZiB2YWxpZFxuXHRcdFx0XHRyZXR1cm4gdHJ1ZVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRyZXR1cm4gZXJyb3I6XG5cdFx0XHRcdFx0cmVhc29uOiByZWFzb25cblxuU3RlZWRvcy5jb252ZXJ0U3BlY2lhbENoYXJhY3RlciA9IChzdHIpLT5cblx0cmV0dXJuIHN0ci5yZXBsYWNlKC8oW1xcXlxcJFxcKFxcKVxcKlxcK1xcP1xcLlxcXFxcXHxcXFtcXF1cXHtcXH1dKS9nLCBcIlxcXFwkMVwiKVxuXG5TdGVlZG9zLnJlbW92ZVNwZWNpYWxDaGFyYWN0ZXIgPSAoc3RyKS0+XG5cdHJldHVybiBzdHIucmVwbGFjZSgvKFtcXF5cXCRcXChcXClcXCpcXCtcXD9cXC5cXFxcXFx8XFxbXFxdXFx7XFx9XFx+XFxgXFxAXFwjXFwlXFwmXFw9XFwnXFxcIlxcOlxcO1xcPFxcPlxcLFxcL10pL2csIFwiXCIpXG5cbkNyZWF0b3IuZ2V0REJBcHBzID0gKHNwYWNlX2lkKS0+XG5cdGRiQXBwcyA9IHt9XG5cdENyZWF0b3IuQ29sbGVjdGlvbnNbXCJhcHBzXCJdLmZpbmQoe3NwYWNlOiBzcGFjZV9pZCxpc19jcmVhdG9yOnRydWUsdmlzaWJsZTp0cnVlfSwge1xuXHRcdGZpZWxkczoge1xuXHRcdFx0Y3JlYXRlZDogMCxcblx0XHRcdGNyZWF0ZWRfYnk6IDAsXG5cdFx0XHRtb2RpZmllZDogMCxcblx0XHRcdG1vZGlmaWVkX2J5OiAwXG5cdFx0fVxuXHR9KS5mb3JFYWNoIChhcHApLT5cblx0XHRkYkFwcHNbYXBwLl9pZF0gPSBhcHBcblxuXHRyZXR1cm4gZGJBcHBzXG5cbkNyZWF0b3IuZ2V0REJEYXNoYm9hcmRzID0gKHNwYWNlX2lkKS0+XG5cdGRiRGFzaGJvYXJkcyA9IHt9XG5cdENyZWF0b3IuQ29sbGVjdGlvbnNbXCJkYXNoYm9hcmRcIl0uZmluZCh7c3BhY2U6IHNwYWNlX2lkfSwge1xuXHRcdGZpZWxkczoge1xuXHRcdFx0Y3JlYXRlZDogMCxcblx0XHRcdGNyZWF0ZWRfYnk6IDAsXG5cdFx0XHRtb2RpZmllZDogMCxcblx0XHRcdG1vZGlmaWVkX2J5OiAwXG5cdFx0fVxuXHR9KS5mb3JFYWNoIChkYXNoYm9hcmQpLT5cblx0XHRkYkRhc2hib2FyZHNbZGFzaGJvYXJkLl9pZF0gPSBkYXNoYm9hcmRcblxuXHRyZXR1cm4gZGJEYXNoYm9hcmRzXG5cbmlmIE1ldGVvci5pc1NlcnZlclxuXHRDb29raWVzID0gcmVxdWlyZShcImNvb2tpZXNcIilcblx0U3RlZWRvcy5nZXRBdXRoVG9rZW4gPSAocmVxLCByZXMpLT5cblx0XHRjb29raWVzID0gbmV3IENvb2tpZXMocmVxLCByZXMpXG5cdFx0YXV0aFRva2VuID0gcmVxLmhlYWRlcnNbJ3gtYXV0aC10b2tlbiddIHx8IGNvb2tpZXMuZ2V0KFwiWC1BdXRoLVRva2VuXCIpXG5cdFx0aWYgIWF1dGhUb2tlbiAmJiByZXEuaGVhZGVycy5hdXRob3JpemF0aW9uICYmIHJlcS5oZWFkZXJzLmF1dGhvcml6YXRpb24uc3BsaXQoJyAnKVswXSA9PSAnQmVhcmVyJ1xuXHRcdFx0YXV0aFRva2VuID0gcmVxLmhlYWRlcnMuYXV0aG9yaXphdGlvbi5zcGxpdCgnICcpWzFdXG5cdFx0cmV0dXJuIGF1dGhUb2tlblxuXG5pZiBNZXRlb3IuaXNDbGllbnRcblx0TWV0ZW9yLmF1dG9ydW4gKCktPlxuXHRcdGlmIFNlc3Npb24uZ2V0KCdjdXJyZW50X2FwcF9pZCcpXG5cdFx0XHRzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCdjdXJyZW50X2FwcF9pZCcsIFNlc3Npb24uZ2V0KCdjdXJyZW50X2FwcF9pZCcpKVxuI1x0XHRlbHNlXG4jXHRcdFx0Y29uc29sZS5sb2coJ3JlbW92ZSBjdXJyZW50X2FwcF9pZC4uLicpO1xuI1x0XHRcdHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oJ2N1cnJlbnRfYXBwX2lkJylcblx0U3RlZWRvcy5nZXRDdXJyZW50QXBwSWQgPSAoKS0+XG5cdFx0aWYgU2Vzc2lvbi5nZXQoJ2FwcF9pZCcpXG5cdFx0XHRyZXR1cm4gU2Vzc2lvbi5nZXQoJ2FwcF9pZCcpXG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ2N1cnJlbnRfYXBwX2lkJyk7XG5cbmlmIE1ldGVvci5pc1NlcnZlclxuXHRTdGVlZG9zLmZvcm1hdEluZGV4ID0gKGFycmF5KSAtPlxuXHRcdG9iamVjdCA9IHtcbiAgICAgICAgXHRiYWNrZ3JvdW5kOiB0cnVlXG4gICAgXHR9O1xuXHRcdGlzZG9jdW1lbnREQiA9IE1ldGVvci5zZXR0aW5ncz8uZGF0YXNvdXJjZXM/LmRlZmF1bHQ/LmRvY3VtZW50REIgfHwgZmFsc2U7XG5cdFx0aWYgaXNkb2N1bWVudERCXG5cdFx0XHRpZiBhcnJheS5sZW5ndGggPiAwXG5cdFx0XHRcdGluZGV4TmFtZSA9IGFycmF5LmpvaW4oXCIuXCIpO1xuXHRcdFx0XHRvYmplY3QubmFtZSA9IGluZGV4TmFtZTtcblx0XHRcdFx0XG5cdFx0XHRcdGlmIChpbmRleE5hbWUubGVuZ3RoID4gNTIpXG5cdFx0XHRcdFx0b2JqZWN0Lm5hbWUgPSBpbmRleE5hbWUuc3Vic3RyaW5nKDAsNTIpO1xuXG5cdFx0cmV0dXJuIG9iamVjdDsiLCJ2YXIgQ29va2llcywgY3J5cHRvLCBtaXhpbiwgcmVmLCByZWYxLCByZWYyLCByZWYzLCByZWY0LCByb290VXJsOyAgICAgICAgIFxuXG5TdGVlZG9zID0ge1xuICBzZXR0aW5nczoge30sXG4gIGRiOiBkYixcbiAgc3Viczoge30sXG4gIGlzUGhvbmVFbmFibGVkOiBmdW5jdGlvbigpIHtcbiAgICB2YXIgcmVmLCByZWYxO1xuICAgIHJldHVybiAhISgocmVmID0gTWV0ZW9yLnNldHRpbmdzKSAhPSBudWxsID8gKHJlZjEgPSByZWZbXCJwdWJsaWNcIl0pICE9IG51bGwgPyByZWYxLnBob25lIDogdm9pZCAwIDogdm9pZCAwKTtcbiAgfSxcbiAgbnVtYmVyVG9TdHJpbmc6IGZ1bmN0aW9uKG51bWJlciwgc2NhbGUsIG5vdFRob3VzYW5kcykge1xuICAgIHZhciByZWYsIHJlZjEsIHJlZztcbiAgICBpZiAodHlwZW9mIG51bWJlciA9PT0gXCJudW1iZXJcIikge1xuICAgICAgbnVtYmVyID0gbnVtYmVyLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGlmICghbnVtYmVyKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGlmIChudW1iZXIgIT09IFwiTmFOXCIpIHtcbiAgICAgIGlmIChzY2FsZSB8fCBzY2FsZSA9PT0gMCkge1xuICAgICAgICBudW1iZXIgPSBOdW1iZXIobnVtYmVyKS50b0ZpeGVkKHNjYWxlKTtcbiAgICAgIH1cbiAgICAgIGlmICghbm90VGhvdXNhbmRzKSB7XG4gICAgICAgIGlmICghKHNjYWxlIHx8IHNjYWxlID09PSAwKSkge1xuICAgICAgICAgIHNjYWxlID0gKHJlZiA9IG51bWJlci5tYXRjaCgvXFwuKFxcZCspLykpICE9IG51bGwgPyAocmVmMSA9IHJlZlsxXSkgIT0gbnVsbCA/IHJlZjEubGVuZ3RoIDogdm9pZCAwIDogdm9pZCAwO1xuICAgICAgICAgIGlmICghc2NhbGUpIHtcbiAgICAgICAgICAgIHNjYWxlID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVnID0gLyhcXGQpKD89KFxcZHszfSkrXFwuKS9nO1xuICAgICAgICBpZiAoc2NhbGUgPT09IDApIHtcbiAgICAgICAgICByZWcgPSAvKFxcZCkoPz0oXFxkezN9KStcXGIpL2c7XG4gICAgICAgIH1cbiAgICAgICAgbnVtYmVyID0gbnVtYmVyLnJlcGxhY2UocmVnLCAnJDEsJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVtYmVyO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gIH0sXG4gIHZhbGlKcXVlcnlTeW1ib2xzOiBmdW5jdGlvbihzdHIpIHtcbiAgICB2YXIgcmVnO1xuICAgIHJlZyA9IG5ldyBSZWdFeHAoXCJeW14hXFxcIiMkJSYnKCkqXFwrLFxcLlxcLzo7PD0+P0BbXFxcXF1eYHt8fX5dKyRcIik7XG4gICAgcmV0dXJuIHJlZy50ZXN0KHN0cik7XG4gIH1cbn07XG5cblxuLypcbiAqIEtpY2sgb2ZmIHRoZSBnbG9iYWwgbmFtZXNwYWNlIGZvciBTdGVlZG9zLlxuICogQG5hbWVzcGFjZSBTdGVlZG9zXG4gKi9cblxuaWYgKE1ldGVvci5pc0NvcmRvdmEgfHwgTWV0ZW9yLmlzQ2xpZW50KSB7XG4gIHJvb3RVcmwgPSBNZXRlb3IuYWJzb2x1dGVVcmwuZGVmYXVsdE9wdGlvbnMucm9vdFVybDtcbiAgaWYgKHJvb3RVcmwuZW5kc1dpdGgoJy8nKSkge1xuICAgIHJvb3RVcmwgPSByb290VXJsLnN1YnN0cigwLCByb290VXJsLmxlbmd0aCAtIDEpO1xuICB9XG4gIGlmICgocmVmID0gd2luZG93LnN0b3JlcykgIT0gbnVsbCkge1xuICAgIGlmICgocmVmMSA9IHJlZi5BUEkpICE9IG51bGwpIHtcbiAgICAgIGlmICgocmVmMiA9IHJlZjEuY2xpZW50KSAhPSBudWxsKSB7XG4gICAgICAgIHJlZjIuc2V0VXJsID0gcm9vdFVybDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKChyZWYzID0gd2luZG93LnN0b3JlcykgIT0gbnVsbCkge1xuICAgIGlmICgocmVmNCA9IHJlZjMuU2V0dGluZ3MpICE9IG51bGwpIHtcbiAgICAgIHJlZjQuc2V0Um9vdFVybChyb290VXJsKTtcbiAgICB9XG4gIH1cbiAgd2luZG93WydzdGVlZG9zLnNldHRpbmcnXSA9IHtcbiAgICByb290VXJsOiByb290VXJsXG4gIH07XG59XG5cbmlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgTWV0ZW9yLmF1dG9ydW4oZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJlZjUsIHJlZjYsIHJlZjcsIHJlZjg7XG4gICAgaWYgKChyZWY1ID0gd2luZG93LnN0b3JlcykgIT0gbnVsbCkge1xuICAgICAgaWYgKChyZWY2ID0gcmVmNS5TZXR0aW5ncykgIT0gbnVsbCkge1xuICAgICAgICByZWY2LnNldFVzZXJJZChTdGVlZG9zLnVzZXJJZCgpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIChyZWY3ID0gd2luZG93LnN0b3JlcykgIT0gbnVsbCA/IChyZWY4ID0gcmVmNy5TZXR0aW5ncykgIT0gbnVsbCA/IHJlZjguc2V0VGVuYW50SWQoU3RlZWRvcy5zcGFjZUlkKCkpIDogdm9pZCAwIDogdm9pZCAwO1xuICB9KTtcbn1cblxuU3RlZWRvcy5nZXRIZWxwVXJsID0gZnVuY3Rpb24obG9jYWxlKSB7XG4gIHZhciBjb3VudHJ5O1xuICBjb3VudHJ5ID0gbG9jYWxlLnN1YnN0cmluZygzKTtcbiAgcmV0dXJuIFwiaHR0cDovL3d3dy5zdGVlZG9zLmNvbS9cIiArIGNvdW50cnkgKyBcIi9oZWxwL1wiO1xufTtcblxuU3RlZWRvcy5pc0V4cHJlc3Npb24gPSBmdW5jdGlvbihmdW5jKSB7XG4gIHZhciBwYXR0ZXJuLCByZWcxLCByZWcyO1xuICBpZiAodHlwZW9mIGZ1bmMgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHBhdHRlcm4gPSAvXnt7KC4rKX19JC87XG4gIHJlZzEgPSAvXnt7KGZ1bmN0aW9uLispfX0kLztcbiAgcmVnMiA9IC9ee3soLis9Pi4rKX19JC87XG4gIGlmICh0eXBlb2YgZnVuYyA9PT0gJ3N0cmluZycgJiYgZnVuYy5tYXRjaChwYXR0ZXJuKSAmJiAhZnVuYy5tYXRjaChyZWcxKSAmJiAhZnVuYy5tYXRjaChyZWcyKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cblN0ZWVkb3MucGFyc2VTaW5nbGVFeHByZXNzaW9uID0gZnVuY3Rpb24oZnVuYywgZm9ybURhdGEsIGRhdGFQYXRoLCBnbG9iYWwpIHtcbiAgdmFyIGVycm9yLCBmdW5jQm9keSwgZ2V0UGFyZW50UGF0aCwgZ2V0VmFsdWVCeVBhdGgsIGdsb2JhbFRhZywgcGFyZW50LCBwYXJlbnRQYXRoLCBzdHI7XG4gIGdldFBhcmVudFBhdGggPSBmdW5jdGlvbihwYXRoKSB7XG4gICAgdmFyIHBhdGhBcnI7XG4gICAgaWYgKHR5cGVvZiBwYXRoID09PSAnc3RyaW5nJykge1xuICAgICAgcGF0aEFyciA9IHBhdGguc3BsaXQoJy4nKTtcbiAgICAgIGlmIChwYXRoQXJyLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gJyMnO1xuICAgICAgfVxuICAgICAgcGF0aEFyci5wb3AoKTtcbiAgICAgIHJldHVybiBwYXRoQXJyLmpvaW4oJy4nKTtcbiAgICB9XG4gICAgcmV0dXJuICcjJztcbiAgfTtcbiAgZ2V0VmFsdWVCeVBhdGggPSBmdW5jdGlvbihmb3JtRGF0YSwgcGF0aCkge1xuICAgIGlmIChwYXRoID09PSAnIycgfHwgIXBhdGgpIHtcbiAgICAgIHJldHVybiBmb3JtRGF0YSB8fCB7fTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBwYXRoID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIF8uZ2V0KGZvcm1EYXRhLCBwYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcigncGF0aCBoYXMgdG8gYmUgYSBzdHJpbmcnKTtcbiAgICB9XG4gIH07XG4gIGlmIChmb3JtRGF0YSA9PT0gdm9pZCAwKSB7XG4gICAgZm9ybURhdGEgPSB7fTtcbiAgfVxuICBwYXJlbnRQYXRoID0gZ2V0UGFyZW50UGF0aChkYXRhUGF0aCk7XG4gIHBhcmVudCA9IGdldFZhbHVlQnlQYXRoKGZvcm1EYXRhLCBwYXJlbnRQYXRoKSB8fCB7fTtcbiAgaWYgKHR5cGVvZiBmdW5jID09PSAnc3RyaW5nJykge1xuICAgIGZ1bmNCb2R5ID0gZnVuYy5zdWJzdHJpbmcoMiwgZnVuYy5sZW5ndGggLSAyKTtcbiAgICBnbG9iYWxUYWcgPSAnX19HX0xfT19CX0FfTF9fJztcbiAgICBzdHIgPSAnXFxuICAgIHJldHVybiAnICsgZnVuY0JvZHkucmVwbGFjZSgvXFxiZm9ybURhdGFcXGIvZywgSlNPTi5zdHJpbmdpZnkoZm9ybURhdGEpLnJlcGxhY2UoL1xcYmdsb2JhbFxcYi9nLCBnbG9iYWxUYWcpKS5yZXBsYWNlKC9cXGJnbG9iYWxcXGIvZywgSlNPTi5zdHJpbmdpZnkoZ2xvYmFsKSkucmVwbGFjZShuZXcgUmVnRXhwKCdcXFxcYicgKyBnbG9iYWxUYWcgKyAnXFxcXGInLCAnZycpLCAnZ2xvYmFsJykucmVwbGFjZSgvcm9vdFZhbHVlL2csIEpTT04uc3RyaW5naWZ5KHBhcmVudCkpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gRnVuY3Rpb24oc3RyKSgpO1xuICAgIH0gY2F0Y2ggKGVycm9yMSkge1xuICAgICAgZXJyb3IgPSBlcnJvcjE7XG4gICAgICBjb25zb2xlLmxvZyhlcnJvciwgZnVuYywgZGF0YVBhdGgpO1xuICAgICAgcmV0dXJuIGZ1bmM7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBmdW5jO1xuICB9XG59O1xuXG5pZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gIFN0ZWVkb3Muc3BhY2VVcGdyYWRlZE1vZGFsID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHN3YWwoe1xuICAgICAgdGl0bGU6IFRBUGkxOG4uX18oXCJzcGFjZV9wYWlkX2luZm9fdGl0bGVcIiksXG4gICAgICB0ZXh0OiBUQVBpMThuLl9fKFwic3BhY2VfcGFpZF9pbmZvX3RleHRcIiksXG4gICAgICBodG1sOiB0cnVlLFxuICAgICAgdHlwZTogXCJ3YXJuaW5nXCIsXG4gICAgICBjb25maXJtQnV0dG9uVGV4dDogVEFQaTE4bi5fXyhcIk9LXCIpXG4gICAgfSk7XG4gIH07XG4gIFN0ZWVkb3MuZ2V0QWNjb3VudEJnQm9keVZhbHVlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGFjY291bnRCZ0JvZHk7XG4gICAgYWNjb3VudEJnQm9keSA9IGRiLnN0ZWVkb3Nfa2V5dmFsdWVzLmZpbmRPbmUoe1xuICAgICAgdXNlcjogU3RlZWRvcy51c2VySWQoKSxcbiAgICAgIGtleTogXCJiZ19ib2R5XCJcbiAgICB9KTtcbiAgICBpZiAoYWNjb3VudEJnQm9keSkge1xuICAgICAgcmV0dXJuIGFjY291bnRCZ0JvZHkudmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gIH07XG4gIFN0ZWVkb3MuYXBwbHlBY2NvdW50QmdCb2R5VmFsdWUgPSBmdW5jdGlvbihhY2NvdW50QmdCb2R5VmFsdWUsIGlzTmVlZFRvTG9jYWwpIHtcbiAgICB2YXIgYXZhdGFyLCB1cmw7XG4gICAgaWYgKE1ldGVvci5sb2dnaW5nSW4oKSB8fCAhU3RlZWRvcy51c2VySWQoKSkge1xuICAgICAgYWNjb3VudEJnQm9keVZhbHVlID0ge307XG4gICAgICBhY2NvdW50QmdCb2R5VmFsdWUudXJsID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJhY2NvdW50QmdCb2R5VmFsdWUudXJsXCIpO1xuICAgICAgYWNjb3VudEJnQm9keVZhbHVlLmF2YXRhciA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYWNjb3VudEJnQm9keVZhbHVlLmF2YXRhclwiKTtcbiAgICB9XG4gICAgdXJsID0gYWNjb3VudEJnQm9keVZhbHVlLnVybDtcbiAgICBhdmF0YXIgPSBhY2NvdW50QmdCb2R5VmFsdWUuYXZhdGFyO1xuICAgIGlmIChpc05lZWRUb0xvY2FsKSB7XG4gICAgICBpZiAoTWV0ZW9yLmxvZ2dpbmdJbigpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChTdGVlZG9zLnVzZXJJZCgpKSB7XG4gICAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImFjY291bnRCZ0JvZHlWYWx1ZS51cmxcIiwgdXJsKTtcbiAgICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJhY2NvdW50QmdCb2R5VmFsdWUuYXZhdGFyXCIsIGF2YXRhcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oXCJhY2NvdW50QmdCb2R5VmFsdWUudXJsXCIpO1xuICAgICAgICAgIHJldHVybiBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShcImFjY291bnRCZ0JvZHlWYWx1ZS5hdmF0YXJcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIFN0ZWVkb3MuZ2V0QWNjb3VudFNraW5WYWx1ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBhY2NvdW50U2tpbjtcbiAgICBhY2NvdW50U2tpbiA9IGRiLnN0ZWVkb3Nfa2V5dmFsdWVzLmZpbmRPbmUoe1xuICAgICAgdXNlcjogU3RlZWRvcy51c2VySWQoKSxcbiAgICAgIGtleTogXCJza2luXCJcbiAgICB9KTtcbiAgICBpZiAoYWNjb3VudFNraW4pIHtcbiAgICAgIHJldHVybiBhY2NvdW50U2tpbi52YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgfTtcbiAgU3RlZWRvcy5nZXRBY2NvdW50Wm9vbVZhbHVlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGFjY291bnRab29tO1xuICAgIGFjY291bnRab29tID0gZGIuc3RlZWRvc19rZXl2YWx1ZXMuZmluZE9uZSh7XG4gICAgICB1c2VyOiBTdGVlZG9zLnVzZXJJZCgpLFxuICAgICAga2V5OiBcInpvb21cIlxuICAgIH0pO1xuICAgIGlmIChhY2NvdW50Wm9vbSkge1xuICAgICAgcmV0dXJuIGFjY291bnRab29tLnZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICB9O1xuICBTdGVlZG9zLmFwcGx5QWNjb3VudFpvb21WYWx1ZSA9IGZ1bmN0aW9uKGFjY291bnRab29tVmFsdWUsIGlzTmVlZFRvTG9jYWwpIHtcbiAgICB2YXIgem9vbU5hbWUsIHpvb21TaXplO1xuICAgIGlmIChNZXRlb3IubG9nZ2luZ0luKCkgfHwgIVN0ZWVkb3MudXNlcklkKCkpIHtcbiAgICAgIGFjY291bnRab29tVmFsdWUgPSB7fTtcbiAgICAgIGFjY291bnRab29tVmFsdWUubmFtZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiYWNjb3VudFpvb21WYWx1ZS5uYW1lXCIpO1xuICAgICAgYWNjb3VudFpvb21WYWx1ZS5zaXplID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJhY2NvdW50Wm9vbVZhbHVlLnNpemVcIik7XG4gICAgfVxuICAgICQoXCJib2R5XCIpLnJlbW92ZUNsYXNzKFwiem9vbS1ub3JtYWxcIikucmVtb3ZlQ2xhc3MoXCJ6b29tLWxhcmdlXCIpLnJlbW92ZUNsYXNzKFwiem9vbS1leHRyYS1sYXJnZVwiKTtcbiAgICB6b29tTmFtZSA9IGFjY291bnRab29tVmFsdWUubmFtZTtcbiAgICB6b29tU2l6ZSA9IGFjY291bnRab29tVmFsdWUuc2l6ZTtcbiAgICBpZiAoIXpvb21OYW1lKSB7XG4gICAgICB6b29tTmFtZSA9IFwibGFyZ2VcIjtcbiAgICAgIHpvb21TaXplID0gMS4yO1xuICAgIH1cbiAgICBpZiAoem9vbU5hbWUgJiYgIVNlc3Npb24uZ2V0KFwiaW5zdGFuY2VQcmludFwiKSkge1xuICAgICAgJChcImJvZHlcIikuYWRkQ2xhc3MoXCJ6b29tLVwiICsgem9vbU5hbWUpO1xuICAgIH1cbiAgICBpZiAoaXNOZWVkVG9Mb2NhbCkge1xuICAgICAgaWYgKE1ldGVvci5sb2dnaW5nSW4oKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoU3RlZWRvcy51c2VySWQoKSkge1xuICAgICAgICBpZiAoYWNjb3VudFpvb21WYWx1ZS5uYW1lKSB7XG4gICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJhY2NvdW50Wm9vbVZhbHVlLm5hbWVcIiwgYWNjb3VudFpvb21WYWx1ZS5uYW1lKTtcbiAgICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJhY2NvdW50Wm9vbVZhbHVlLnNpemVcIiwgYWNjb3VudFpvb21WYWx1ZS5zaXplKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShcImFjY291bnRab29tVmFsdWUubmFtZVwiKTtcbiAgICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oXCJhY2NvdW50Wm9vbVZhbHVlLnNpemVcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIFN0ZWVkb3Muc2hvd0hlbHAgPSBmdW5jdGlvbih1cmwpIHtcbiAgICB2YXIgY291bnRyeSwgbG9jYWxlO1xuICAgIGxvY2FsZSA9IFN0ZWVkb3MuZ2V0TG9jYWxlKCk7XG4gICAgY291bnRyeSA9IGxvY2FsZS5zdWJzdHJpbmcoMyk7XG4gICAgdXJsID0gdXJsIHx8IFwiaHR0cDovL3d3dy5zdGVlZG9zLmNvbS9cIiArIGNvdW50cnkgKyBcIi9oZWxwL1wiO1xuICAgIHJldHVybiB3aW5kb3cub3Blbih1cmwsICdfaGVscCcsICdFbmFibGVWaWV3UG9ydFNjYWxlPXllcycpO1xuICB9O1xuICBTdGVlZG9zLmdldFVybFdpdGhUb2tlbiA9IGZ1bmN0aW9uKHVybCkge1xuICAgIHZhciBhdXRoVG9rZW4sIGxpbmtlcjtcbiAgICBhdXRoVG9rZW4gPSB7fTtcbiAgICBhdXRoVG9rZW5bXCJzcGFjZUlkXCJdID0gU3RlZWRvcy5nZXRTcGFjZUlkKCk7XG4gICAgYXV0aFRva2VuW1wiWC1Vc2VyLUlkXCJdID0gTWV0ZW9yLnVzZXJJZCgpO1xuICAgIGF1dGhUb2tlbltcIlgtQXV0aC1Ub2tlblwiXSA9IEFjY291bnRzLl9zdG9yZWRMb2dpblRva2VuKCk7XG4gICAgbGlua2VyID0gXCI/XCI7XG4gICAgaWYgKHVybC5pbmRleE9mKFwiP1wiKSA+IC0xKSB7XG4gICAgICBsaW5rZXIgPSBcIiZcIjtcbiAgICB9XG4gICAgcmV0dXJuIHVybCArIGxpbmtlciArICQucGFyYW0oYXV0aFRva2VuKTtcbiAgfTtcbiAgU3RlZWRvcy5nZXRBcHBVcmxXaXRoVG9rZW4gPSBmdW5jdGlvbihhcHBfaWQpIHtcbiAgICB2YXIgYXV0aFRva2VuO1xuICAgIGF1dGhUb2tlbiA9IHt9O1xuICAgIGF1dGhUb2tlbltcInNwYWNlSWRcIl0gPSBTdGVlZG9zLmdldFNwYWNlSWQoKTtcbiAgICBhdXRoVG9rZW5bXCJYLVVzZXItSWRcIl0gPSBNZXRlb3IudXNlcklkKCk7XG4gICAgYXV0aFRva2VuW1wiWC1BdXRoLVRva2VuXCJdID0gQWNjb3VudHMuX3N0b3JlZExvZ2luVG9rZW4oKTtcbiAgICByZXR1cm4gXCJhcGkvc2V0dXAvc3NvL1wiICsgYXBwX2lkICsgXCI/XCIgKyAkLnBhcmFtKGF1dGhUb2tlbik7XG4gIH07XG4gIFN0ZWVkb3Mub3BlbkFwcFdpdGhUb2tlbiA9IGZ1bmN0aW9uKGFwcF9pZCkge1xuICAgIHZhciBhcHAsIHVybDtcbiAgICB1cmwgPSBTdGVlZG9zLmdldEFwcFVybFdpdGhUb2tlbihhcHBfaWQpO1xuICAgIHVybCA9IFN0ZWVkb3MuYWJzb2x1dGVVcmwodXJsKTtcbiAgICBhcHAgPSBkYi5hcHBzLmZpbmRPbmUoYXBwX2lkKTtcbiAgICBpZiAoIWFwcC5pc19uZXdfd2luZG93ICYmICFTdGVlZG9zLmlzTW9iaWxlKCkgJiYgIVN0ZWVkb3MuaXNDb3Jkb3ZhKCkpIHtcbiAgICAgIHJldHVybiB3aW5kb3cubG9jYXRpb24gPSB1cmw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBTdGVlZG9zLm9wZW5XaW5kb3codXJsKTtcbiAgICB9XG4gIH07XG4gIFN0ZWVkb3Mub3BlblVybFdpdGhJRSA9IGZ1bmN0aW9uKHVybCkge1xuICAgIHZhciBjbWQsIGV4ZWMsIG9wZW5fdXJsO1xuICAgIGlmICh1cmwpIHtcbiAgICAgIGlmIChTdGVlZG9zLmlzTm9kZSgpKSB7XG4gICAgICAgIGV4ZWMgPSBudy5yZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlYztcbiAgICAgICAgb3Blbl91cmwgPSB1cmw7XG4gICAgICAgIGNtZCA9IFwic3RhcnQgaWV4cGxvcmUuZXhlIFxcXCJcIiArIG9wZW5fdXJsICsgXCJcXFwiXCI7XG4gICAgICAgIHJldHVybiBleGVjKGNtZCwgZnVuY3Rpb24oZXJyb3IsIHN0ZG91dCwgc3RkZXJyKSB7XG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICB0b2FzdHIuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gU3RlZWRvcy5vcGVuV2luZG93KHVybCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBTdGVlZG9zLm9wZW5BcHAgPSBmdW5jdGlvbihhcHBfaWQpIHtcbiAgICB2YXIgYXBwLCBjbWQsIGUsIGV2YWxGdW5TdHJpbmcsIGV4ZWMsIG9uX2NsaWNrLCBvcGVuX3VybCwgcGF0aDtcbiAgICBpZiAoIU1ldGVvci51c2VySWQoKSkge1xuICAgICAgU3RlZWRvcy5yZWRpcmVjdFRvU2lnbkluKCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgYXBwID0gZGIuYXBwcy5maW5kT25lKGFwcF9pZCk7XG4gICAgaWYgKCFhcHApIHtcbiAgICAgIEZsb3dSb3V0ZXIuZ28oXCIvXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBvbl9jbGljayA9IGFwcC5vbl9jbGljaztcbiAgICBpZiAoYXBwLmlzX3VzZV9pZSkge1xuICAgICAgaWYgKFN0ZWVkb3MuaXNOb2RlKCkpIHtcbiAgICAgICAgZXhlYyA9IG53LnJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjO1xuICAgICAgICBpZiAob25fY2xpY2spIHtcbiAgICAgICAgICBwYXRoID0gXCJhcGkvYXBwL3Nzby9cIiArIGFwcF9pZCArIFwiP2F1dGhUb2tlbj1cIiArIChBY2NvdW50cy5fc3RvcmVkTG9naW5Ub2tlbigpKSArIFwiJnVzZXJJZD1cIiArIChNZXRlb3IudXNlcklkKCkpO1xuICAgICAgICAgIG9wZW5fdXJsID0gd2luZG93LmxvY2F0aW9uLm9yaWdpbiArIFwiL1wiICsgcGF0aDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvcGVuX3VybCA9IFN0ZWVkb3MuZ2V0QXBwVXJsV2l0aFRva2VuKGFwcF9pZCk7XG4gICAgICAgICAgb3Blbl91cmwgPSB3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgXCIvXCIgKyBvcGVuX3VybDtcbiAgICAgICAgfVxuICAgICAgICBjbWQgPSBcInN0YXJ0IGlleHBsb3JlLmV4ZSBcXFwiXCIgKyBvcGVuX3VybCArIFwiXFxcIlwiO1xuICAgICAgICBleGVjKGNtZCwgZnVuY3Rpb24oZXJyb3IsIHN0ZG91dCwgc3RkZXJyKSB7XG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICB0b2FzdHIuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBTdGVlZG9zLm9wZW5BcHBXaXRoVG9rZW4oYXBwX2lkKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGRiLmFwcHMuaXNJbnRlcm5hbEFwcChhcHAudXJsKSkge1xuICAgICAgRmxvd1JvdXRlci5nbyhhcHAudXJsKTtcbiAgICB9IGVsc2UgaWYgKGFwcC5pc191c2VfaWZyYW1lKSB7XG4gICAgICBpZiAoYXBwLmlzX25ld193aW5kb3cgJiYgIVN0ZWVkb3MuaXNNb2JpbGUoKSAmJiAhU3RlZWRvcy5pc0NvcmRvdmEoKSkge1xuICAgICAgICBTdGVlZG9zLm9wZW5XaW5kb3coU3RlZWRvcy5hYnNvbHV0ZVVybChcImFwcHMvaWZyYW1lL1wiICsgYXBwLl9pZCkpO1xuICAgICAgfSBlbHNlIGlmIChTdGVlZG9zLmlzTW9iaWxlKCkgfHwgU3RlZWRvcy5pc0NvcmRvdmEoKSkge1xuICAgICAgICBTdGVlZG9zLm9wZW5BcHBXaXRoVG9rZW4oYXBwX2lkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIEZsb3dSb3V0ZXIuZ28oXCIvYXBwcy9pZnJhbWUvXCIgKyBhcHAuX2lkKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG9uX2NsaWNrKSB7XG4gICAgICBldmFsRnVuU3RyaW5nID0gXCIoZnVuY3Rpb24oKXtcIiArIG9uX2NsaWNrICsgXCJ9KSgpXCI7XG4gICAgICB0cnkge1xuICAgICAgICBldmFsKGV2YWxGdW5TdHJpbmcpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IxKSB7XG4gICAgICAgIGUgPSBlcnJvcjE7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJjYXRjaCBzb21lIGVycm9yIHdoZW4gZXZhbCB0aGUgb25fY2xpY2sgc2NyaXB0IGZvciBhcHAgbGluazpcIik7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZS5tZXNzYWdlICsgXCJcXHJcXG5cIiArIGUuc3RhY2spO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBTdGVlZG9zLm9wZW5BcHBXaXRoVG9rZW4oYXBwX2lkKTtcbiAgICB9XG4gICAgaWYgKCFhcHAuaXNfbmV3X3dpbmRvdyAmJiAhU3RlZWRvcy5pc01vYmlsZSgpICYmICFTdGVlZG9zLmlzQ29yZG92YSgpICYmICFhcHAuaXNfdXNlX2llICYmICFvbl9jbGljaykge1xuICAgICAgcmV0dXJuIFNlc3Npb24uc2V0KFwiY3VycmVudF9hcHBfaWRcIiwgYXBwX2lkKTtcbiAgICB9XG4gIH07XG4gIFN0ZWVkb3MuY2hlY2tTcGFjZUJhbGFuY2UgPSBmdW5jdGlvbihzcGFjZUlkKSB7XG4gICAgdmFyIGVuZF9kYXRlLCBtaW5fbW9udGhzLCBzcGFjZTtcbiAgICBpZiAoIXNwYWNlSWQpIHtcbiAgICAgIHNwYWNlSWQgPSBTdGVlZG9zLnNwYWNlSWQoKTtcbiAgICB9XG4gICAgbWluX21vbnRocyA9IDE7XG4gICAgaWYgKFN0ZWVkb3MuaXNTcGFjZUFkbWluKCkpIHtcbiAgICAgIG1pbl9tb250aHMgPSAzO1xuICAgIH1cbiAgICBzcGFjZSA9IGRiLnNwYWNlcy5maW5kT25lKHNwYWNlSWQpO1xuICAgIGVuZF9kYXRlID0gc3BhY2UgIT0gbnVsbCA/IHNwYWNlLmVuZF9kYXRlIDogdm9pZCAwO1xuICAgIGlmIChzcGFjZSAmJiBTdGVlZG9zLmhhc0ZlYXR1cmUoJ3BhaWQnLCBzcGFjZS5faWQpICYmIGVuZF9kYXRlICE9PSB2b2lkIDAgJiYgKGVuZF9kYXRlIC0gbmV3IERhdGUpIDw9IChtaW5fbW9udGhzICogMzAgKiAyNCAqIDM2MDAgKiAxMDAwKSkge1xuICAgICAgcmV0dXJuIHRvYXN0ci5lcnJvcih0KFwic3BhY2VfYmFsYW5jZV9pbnN1ZmZpY2llbnRcIikpO1xuICAgIH1cbiAgfTtcbiAgU3RlZWRvcy5zZXRNb2RhbE1heEhlaWdodCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBhY2NvdW50Wm9vbVZhbHVlLCBvZmZzZXQ7XG4gICAgYWNjb3VudFpvb21WYWx1ZSA9IFN0ZWVkb3MuZ2V0QWNjb3VudFpvb21WYWx1ZSgpO1xuICAgIGlmICghYWNjb3VudFpvb21WYWx1ZS5uYW1lKSB7XG4gICAgICBhY2NvdW50Wm9vbVZhbHVlLm5hbWUgPSAnbGFyZ2UnO1xuICAgIH1cbiAgICBzd2l0Y2ggKGFjY291bnRab29tVmFsdWUubmFtZSkge1xuICAgICAgY2FzZSAnbm9ybWFsJzpcbiAgICAgICAgaWYgKFN0ZWVkb3MuaXNNb2JpbGUoKSkge1xuICAgICAgICAgIG9mZnNldCA9IC0xMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvZmZzZXQgPSA3NTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2xhcmdlJzpcbiAgICAgICAgaWYgKFN0ZWVkb3MuaXNNb2JpbGUoKSkge1xuICAgICAgICAgIG9mZnNldCA9IC02O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChTdGVlZG9zLmRldGVjdElFKCkpIHtcbiAgICAgICAgICAgIG9mZnNldCA9IDE5OTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb2Zmc2V0ID0gOTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdleHRyYS1sYXJnZSc6XG4gICAgICAgIGlmIChTdGVlZG9zLmlzTW9iaWxlKCkpIHtcbiAgICAgICAgICBvZmZzZXQgPSAtMjY7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKFN0ZWVkb3MuZGV0ZWN0SUUoKSkge1xuICAgICAgICAgICAgb2Zmc2V0ID0gMzAzO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvZmZzZXQgPSA1MztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKCQoXCIubW9kYWxcIikubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gJChcIi5tb2RhbFwiKS5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZm9vdGVySGVpZ2h0LCBoZWFkZXJIZWlnaHQsIGhlaWdodCwgdG90YWxIZWlnaHQ7XG4gICAgICAgIGhlYWRlckhlaWdodCA9IDA7XG4gICAgICAgIGZvb3RlckhlaWdodCA9IDA7XG4gICAgICAgIHRvdGFsSGVpZ2h0ID0gMDtcbiAgICAgICAgJChcIi5tb2RhbC1oZWFkZXJcIiwgJCh0aGlzKSkuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gaGVhZGVySGVpZ2h0ICs9ICQodGhpcykub3V0ZXJIZWlnaHQoZmFsc2UpO1xuICAgICAgICB9KTtcbiAgICAgICAgJChcIi5tb2RhbC1mb290ZXJcIiwgJCh0aGlzKSkuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gZm9vdGVySGVpZ2h0ICs9ICQodGhpcykub3V0ZXJIZWlnaHQoZmFsc2UpO1xuICAgICAgICB9KTtcbiAgICAgICAgdG90YWxIZWlnaHQgPSBoZWFkZXJIZWlnaHQgKyBmb290ZXJIZWlnaHQ7XG4gICAgICAgIGhlaWdodCA9ICQoXCJib2R5XCIpLmlubmVySGVpZ2h0KCkgLSB0b3RhbEhlaWdodCAtIG9mZnNldDtcbiAgICAgICAgaWYgKCQodGhpcykuaGFzQ2xhc3MoXCJjZl9jb250YWN0X21vZGFsXCIpKSB7XG4gICAgICAgICAgcmV0dXJuICQoXCIubW9kYWwtYm9keVwiLCAkKHRoaXMpKS5jc3Moe1xuICAgICAgICAgICAgXCJtYXgtaGVpZ2h0XCI6IGhlaWdodCArIFwicHhcIixcbiAgICAgICAgICAgIFwiaGVpZ2h0XCI6IGhlaWdodCArIFwicHhcIlxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiAkKFwiLm1vZGFsLWJvZHlcIiwgJCh0aGlzKSkuY3NzKHtcbiAgICAgICAgICAgIFwibWF4LWhlaWdodFwiOiBoZWlnaHQgKyBcInB4XCIsXG4gICAgICAgICAgICBcImhlaWdodFwiOiBcImF1dG9cIlxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG4gIFN0ZWVkb3MuZ2V0TW9kYWxNYXhIZWlnaHQgPSBmdW5jdGlvbihvZmZzZXQpIHtcbiAgICB2YXIgYWNjb3VudFpvb21WYWx1ZSwgcmVWYWx1ZTtcbiAgICBpZiAoU3RlZWRvcy5pc01vYmlsZSgpKSB7XG4gICAgICByZVZhbHVlID0gd2luZG93LnNjcmVlbi5oZWlnaHQgLSAxMjYgLSAxODAgLSAyNTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVWYWx1ZSA9ICQod2luZG93KS5oZWlnaHQoKSAtIDE4MCAtIDI1O1xuICAgIH1cbiAgICBpZiAoIShTdGVlZG9zLmlzaU9TKCkgfHwgU3RlZWRvcy5pc01vYmlsZSgpKSkge1xuICAgICAgYWNjb3VudFpvb21WYWx1ZSA9IFN0ZWVkb3MuZ2V0QWNjb3VudFpvb21WYWx1ZSgpO1xuICAgICAgc3dpdGNoIChhY2NvdW50Wm9vbVZhbHVlLm5hbWUpIHtcbiAgICAgICAgY2FzZSAnbGFyZ2UnOlxuICAgICAgICAgIHJlVmFsdWUgLT0gNTA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2V4dHJhLWxhcmdlJzpcbiAgICAgICAgICByZVZhbHVlIC09IDE0NTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG9mZnNldCkge1xuICAgICAgcmVWYWx1ZSAtPSBvZmZzZXQ7XG4gICAgfVxuICAgIHJldHVybiByZVZhbHVlICsgXCJweFwiO1xuICB9O1xuICBTdGVlZG9zLmlzaU9TID0gZnVuY3Rpb24odXNlckFnZW50LCBsYW5ndWFnZSkge1xuICAgIHZhciBERVZJQ0UsIGJyb3dzZXIsIGNvbkV4cCwgZGV2aWNlLCBudW1FeHA7XG4gICAgREVWSUNFID0ge1xuICAgICAgYW5kcm9pZDogJ2FuZHJvaWQnLFxuICAgICAgYmxhY2tiZXJyeTogJ2JsYWNrYmVycnknLFxuICAgICAgZGVza3RvcDogJ2Rlc2t0b3AnLFxuICAgICAgaXBhZDogJ2lwYWQnLFxuICAgICAgaXBob25lOiAnaXBob25lJyxcbiAgICAgIGlwb2Q6ICdpcG9kJyxcbiAgICAgIG1vYmlsZTogJ21vYmlsZSdcbiAgICB9O1xuICAgIGJyb3dzZXIgPSB7fTtcbiAgICBjb25FeHAgPSAnKD86W1xcXFwvOlxcXFw6OlxcXFxzOjtdKSc7XG4gICAgbnVtRXhwID0gJyhcXFxcUytbXlxcXFxzOjs6XFxcXCldfCknO1xuICAgIHVzZXJBZ2VudCA9ICh1c2VyQWdlbnQgfHwgbmF2aWdhdG9yLnVzZXJBZ2VudCkudG9Mb3dlckNhc2UoKTtcbiAgICBsYW5ndWFnZSA9IGxhbmd1YWdlIHx8IG5hdmlnYXRvci5sYW5ndWFnZSB8fCBuYXZpZ2F0b3IuYnJvd3Nlckxhbmd1YWdlO1xuICAgIGRldmljZSA9IHVzZXJBZ2VudC5tYXRjaChuZXcgUmVnRXhwKCcoYW5kcm9pZHxpcGFkfGlwaG9uZXxpcG9kfGJsYWNrYmVycnkpJykpIHx8IHVzZXJBZ2VudC5tYXRjaChuZXcgUmVnRXhwKCcobW9iaWxlKScpKSB8fCBbJycsIERFVklDRS5kZXNrdG9wXTtcbiAgICBicm93c2VyLmRldmljZSA9IGRldmljZVsxXTtcbiAgICByZXR1cm4gYnJvd3Nlci5kZXZpY2UgPT09IERFVklDRS5pcGFkIHx8IGJyb3dzZXIuZGV2aWNlID09PSBERVZJQ0UuaXBob25lIHx8IGJyb3dzZXIuZGV2aWNlID09PSBERVZJQ0UuaXBvZDtcbiAgfTtcbiAgU3RlZWRvcy5nZXRVc2VyT3JnYW5pemF0aW9ucyA9IGZ1bmN0aW9uKGlzSW5jbHVkZVBhcmVudHMpIHtcbiAgICB2YXIgb3JnYW5pemF0aW9ucywgcGFyZW50cywgc3BhY2VJZCwgc3BhY2VfdXNlciwgdXNlcklkO1xuICAgIHVzZXJJZCA9IE1ldGVvci51c2VySWQoKTtcbiAgICBzcGFjZUlkID0gU3RlZWRvcy5zcGFjZUlkKCk7XG4gICAgc3BhY2VfdXNlciA9IGRiLnNwYWNlX3VzZXJzLmZpbmRPbmUoe1xuICAgICAgdXNlcjogdXNlcklkLFxuICAgICAgc3BhY2U6IHNwYWNlSWRcbiAgICB9LCB7XG4gICAgICBmaWVsZHM6IHtcbiAgICAgICAgb3JnYW5pemF0aW9uczogMVxuICAgICAgfVxuICAgIH0pO1xuICAgIG9yZ2FuaXphdGlvbnMgPSBzcGFjZV91c2VyICE9IG51bGwgPyBzcGFjZV91c2VyLm9yZ2FuaXphdGlvbnMgOiB2b2lkIDA7XG4gICAgaWYgKCFvcmdhbml6YXRpb25zKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGlmIChpc0luY2x1ZGVQYXJlbnRzKSB7XG4gICAgICBwYXJlbnRzID0gXy5mbGF0dGVuKGRiLm9yZ2FuaXphdGlvbnMuZmluZCh7XG4gICAgICAgIF9pZDoge1xuICAgICAgICAgICRpbjogb3JnYW5pemF0aW9uc1xuICAgICAgICB9XG4gICAgICB9KS5mZXRjaCgpLmdldFByb3BlcnR5KFwicGFyZW50c1wiKSk7XG4gICAgICByZXR1cm4gXy51bmlvbihvcmdhbml6YXRpb25zLCBwYXJlbnRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG9yZ2FuaXphdGlvbnM7XG4gICAgfVxuICB9O1xuICBTdGVlZG9zLmZvcmJpZE5vZGVDb250ZXh0bWVudSA9IGZ1bmN0aW9uKHRhcmdldCwgaWZyKSB7XG4gICAgaWYgKCFTdGVlZG9zLmlzTm9kZSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRhcmdldC5kb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgZnVuY3Rpb24oZXYpIHtcbiAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG4gICAgaWYgKGlmcikge1xuICAgICAgaWYgKHR5cGVvZiBpZnIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmciA9IHRhcmdldC4kKGlmcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gaWZyLmxvYWQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBpZnJCb2R5O1xuICAgICAgICBpZnJCb2R5ID0gaWZyLmNvbnRlbnRzKCkuZmluZCgnYm9keScpO1xuICAgICAgICBpZiAoaWZyQm9keSkge1xuICAgICAgICAgIHJldHVybiBpZnJCb2R5WzBdLmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgZnVuY3Rpb24oZXYpIHtcbiAgICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbn1cblxuaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICBTdGVlZG9zLmdldFVzZXJPcmdhbml6YXRpb25zID0gZnVuY3Rpb24oc3BhY2VJZCwgdXNlcklkLCBpc0luY2x1ZGVQYXJlbnRzKSB7XG4gICAgdmFyIG9yZ2FuaXphdGlvbnMsIHBhcmVudHMsIHNwYWNlX3VzZXI7XG4gICAgc3BhY2VfdXNlciA9IGRiLnNwYWNlX3VzZXJzLmZpbmRPbmUoe1xuICAgICAgdXNlcjogdXNlcklkLFxuICAgICAgc3BhY2U6IHNwYWNlSWRcbiAgICB9LCB7XG4gICAgICBmaWVsZHM6IHtcbiAgICAgICAgb3JnYW5pemF0aW9uczogMVxuICAgICAgfVxuICAgIH0pO1xuICAgIG9yZ2FuaXphdGlvbnMgPSBzcGFjZV91c2VyICE9IG51bGwgPyBzcGFjZV91c2VyLm9yZ2FuaXphdGlvbnMgOiB2b2lkIDA7XG4gICAgaWYgKCFvcmdhbml6YXRpb25zKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGlmIChpc0luY2x1ZGVQYXJlbnRzKSB7XG4gICAgICBwYXJlbnRzID0gXy5mbGF0dGVuKGRiLm9yZ2FuaXphdGlvbnMuZmluZCh7XG4gICAgICAgIF9pZDoge1xuICAgICAgICAgICRpbjogb3JnYW5pemF0aW9uc1xuICAgICAgICB9XG4gICAgICB9KS5mZXRjaCgpLmdldFByb3BlcnR5KFwicGFyZW50c1wiKSk7XG4gICAgICByZXR1cm4gXy51bmlvbihvcmdhbml6YXRpb25zLCBwYXJlbnRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG9yZ2FuaXphdGlvbnM7XG4gICAgfVxuICB9O1xufVxuXG5pZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gIENvb2tpZXMgPSByZXF1aXJlKFwiY29va2llc1wiKTtcbiAgU3RlZWRvcy5pc01vYmlsZSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcbiAgU3RlZWRvcy5pc1NwYWNlQWRtaW4gPSBmdW5jdGlvbihzcGFjZUlkLCB1c2VySWQpIHtcbiAgICB2YXIgc3BhY2U7XG4gICAgaWYgKCFzcGFjZUlkIHx8ICF1c2VySWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgc3BhY2UgPSBkYi5zcGFjZXMuZmluZE9uZShzcGFjZUlkKTtcbiAgICBpZiAoIXNwYWNlIHx8ICFzcGFjZS5hZG1pbnMpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHNwYWNlLmFkbWlucy5pbmRleE9mKHVzZXJJZCkgPj0gMDtcbiAgfTtcbiAgU3RlZWRvcy5pc0xlZ2FsVmVyc2lvbiA9IGZ1bmN0aW9uKHNwYWNlSWQsIGFwcF92ZXJzaW9uKSB7XG4gICAgdmFyIGNoZWNrLCBtb2R1bGVzLCByZWY1O1xuICAgIGlmICghc3BhY2VJZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjaGVjayA9IGZhbHNlO1xuICAgIG1vZHVsZXMgPSAocmVmNSA9IGRiLnNwYWNlcy5maW5kT25lKHNwYWNlSWQpKSAhPSBudWxsID8gcmVmNS5tb2R1bGVzIDogdm9pZCAwO1xuICAgIGlmIChtb2R1bGVzICYmIG1vZHVsZXMuaW5jbHVkZXMoYXBwX3ZlcnNpb24pKSB7XG4gICAgICBjaGVjayA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBjaGVjaztcbiAgfTtcbiAgU3RlZWRvcy5pc09yZ0FkbWluQnlPcmdJZHMgPSBmdW5jdGlvbihvcmdJZHMsIHVzZXJJZCkge1xuICAgIHZhciBhbGxvd0FjY2Vzc09yZ3MsIGlzT3JnQWRtaW4sIHBhcmVudHMsIHVzZU9yZ3M7XG4gICAgaXNPcmdBZG1pbiA9IGZhbHNlO1xuICAgIHVzZU9yZ3MgPSBkYi5vcmdhbml6YXRpb25zLmZpbmQoe1xuICAgICAgX2lkOiB7XG4gICAgICAgICRpbjogb3JnSWRzXG4gICAgICB9XG4gICAgfSwge1xuICAgICAgZmllbGRzOiB7XG4gICAgICAgIHBhcmVudHM6IDEsXG4gICAgICAgIGFkbWluczogMVxuICAgICAgfVxuICAgIH0pLmZldGNoKCk7XG4gICAgcGFyZW50cyA9IFtdO1xuICAgIGFsbG93QWNjZXNzT3JncyA9IHVzZU9yZ3MuZmlsdGVyKGZ1bmN0aW9uKG9yZykge1xuICAgICAgdmFyIHJlZjU7XG4gICAgICBpZiAob3JnLnBhcmVudHMpIHtcbiAgICAgICAgcGFyZW50cyA9IF8udW5pb24ocGFyZW50cywgb3JnLnBhcmVudHMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChyZWY1ID0gb3JnLmFkbWlucykgIT0gbnVsbCA/IHJlZjUuaW5jbHVkZXModXNlcklkKSA6IHZvaWQgMDtcbiAgICB9KTtcbiAgICBpZiAoYWxsb3dBY2Nlc3NPcmdzLmxlbmd0aCkge1xuICAgICAgaXNPcmdBZG1pbiA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcmVudHMgPSBfLmZsYXR0ZW4ocGFyZW50cyk7XG4gICAgICBwYXJlbnRzID0gXy51bmlxKHBhcmVudHMpO1xuICAgICAgaWYgKHBhcmVudHMubGVuZ3RoICYmIGRiLm9yZ2FuaXphdGlvbnMuZmluZE9uZSh7XG4gICAgICAgIF9pZDoge1xuICAgICAgICAgICRpbjogcGFyZW50c1xuICAgICAgICB9LFxuICAgICAgICBhZG1pbnM6IHVzZXJJZFxuICAgICAgfSkpIHtcbiAgICAgICAgaXNPcmdBZG1pbiA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpc09yZ0FkbWluO1xuICB9O1xuICBTdGVlZG9zLmlzT3JnQWRtaW5CeUFsbE9yZ0lkcyA9IGZ1bmN0aW9uKG9yZ0lkcywgdXNlcklkKSB7XG4gICAgdmFyIGksIGlzT3JnQWRtaW47XG4gICAgaWYgKCFvcmdJZHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaSA9IDA7XG4gICAgd2hpbGUgKGkgPCBvcmdJZHMubGVuZ3RoKSB7XG4gICAgICBpc09yZ0FkbWluID0gU3RlZWRvcy5pc09yZ0FkbWluQnlPcmdJZHMoW29yZ0lkc1tpXV0sIHVzZXJJZCk7XG4gICAgICBpZiAoIWlzT3JnQWRtaW4pIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpKys7XG4gICAgfVxuICAgIHJldHVybiBpc09yZ0FkbWluO1xuICB9O1xuICBTdGVlZG9zLmFic29sdXRlVXJsID0gZnVuY3Rpb24odXJsKSB7XG4gICAgdmFyIGUsIHJvb3RfdXJsO1xuICAgIGlmICh1cmwpIHtcbiAgICAgIHVybCA9IHVybC5yZXBsYWNlKC9eXFwvLywgXCJcIik7XG4gICAgfVxuICAgIGlmIChNZXRlb3IuaXNDb3Jkb3ZhKSB7XG4gICAgICByZXR1cm4gTWV0ZW9yLmFic29sdXRlVXJsKHVybCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByb290X3VybCA9IG5ldyBVUkwoTWV0ZW9yLmFic29sdXRlVXJsKCkpO1xuICAgICAgICAgIGlmICh1cmwpIHtcbiAgICAgICAgICAgIHJldHVybiByb290X3VybC5wYXRobmFtZSArIHVybDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHJvb3RfdXJsLnBhdGhuYW1lO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IxKSB7XG4gICAgICAgICAgZSA9IGVycm9yMTtcbiAgICAgICAgICByZXR1cm4gTWV0ZW9yLmFic29sdXRlVXJsKHVybCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBNZXRlb3IuYWJzb2x1dGVVcmwodXJsKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIFN0ZWVkb3MuZ2V0QVBJTG9naW5Vc2VyID0gZnVuY3Rpb24ocmVxLCByZXMpIHtcbiAgICB2YXIgYXV0aFRva2VuLCBjb29raWVzLCBwYXNzd29yZCwgcmVmNSwgcmVmNiwgcmVmNywgcmVmOCwgcmVzdWx0LCB1c2VyLCB1c2VySWQsIHVzZXJuYW1lO1xuICAgIHVzZXJuYW1lID0gKHJlZjUgPSByZXEucXVlcnkpICE9IG51bGwgPyByZWY1LnVzZXJuYW1lIDogdm9pZCAwO1xuICAgIHBhc3N3b3JkID0gKHJlZjYgPSByZXEucXVlcnkpICE9IG51bGwgPyByZWY2LnBhc3N3b3JkIDogdm9pZCAwO1xuICAgIGlmICh1c2VybmFtZSAmJiBwYXNzd29yZCkge1xuICAgICAgdXNlciA9IGRiLnVzZXJzLmZpbmRPbmUoe1xuICAgICAgICBzdGVlZG9zX2lkOiB1c2VybmFtZVxuICAgICAgfSk7XG4gICAgICBpZiAoIXVzZXIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmVzdWx0ID0gQWNjb3VudHMuX2NoZWNrUGFzc3dvcmQodXNlciwgcGFzc3dvcmQpO1xuICAgICAgaWYgKHJlc3VsdC5lcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocmVzdWx0LmVycm9yKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB1c2VyO1xuICAgICAgfVxuICAgIH1cbiAgICB1c2VySWQgPSAocmVmNyA9IHJlcS5xdWVyeSkgIT0gbnVsbCA/IHJlZjdbXCJYLVVzZXItSWRcIl0gOiB2b2lkIDA7XG4gICAgYXV0aFRva2VuID0gKHJlZjggPSByZXEucXVlcnkpICE9IG51bGwgPyByZWY4W1wiWC1BdXRoLVRva2VuXCJdIDogdm9pZCAwO1xuICAgIGlmIChTdGVlZG9zLmNoZWNrQXV0aFRva2VuKHVzZXJJZCwgYXV0aFRva2VuKSkge1xuICAgICAgcmV0dXJuIGRiLnVzZXJzLmZpbmRPbmUoe1xuICAgICAgICBfaWQ6IHVzZXJJZFxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvb2tpZXMgPSBuZXcgQ29va2llcyhyZXEsIHJlcyk7XG4gICAgaWYgKHJlcS5oZWFkZXJzKSB7XG4gICAgICB1c2VySWQgPSByZXEuaGVhZGVyc1tcIngtdXNlci1pZFwiXTtcbiAgICAgIGF1dGhUb2tlbiA9IHJlcS5oZWFkZXJzW1wieC1hdXRoLXRva2VuXCJdO1xuICAgIH1cbiAgICBpZiAoIXVzZXJJZCB8fCAhYXV0aFRva2VuKSB7XG4gICAgICB1c2VySWQgPSBjb29raWVzLmdldChcIlgtVXNlci1JZFwiKTtcbiAgICAgIGF1dGhUb2tlbiA9IGNvb2tpZXMuZ2V0KFwiWC1BdXRoLVRva2VuXCIpO1xuICAgIH1cbiAgICBpZiAoIXVzZXJJZCB8fCAhYXV0aFRva2VuKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChTdGVlZG9zLmNoZWNrQXV0aFRva2VuKHVzZXJJZCwgYXV0aFRva2VuKSkge1xuICAgICAgcmV0dXJuIGRiLnVzZXJzLmZpbmRPbmUoe1xuICAgICAgICBfaWQ6IHVzZXJJZFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcbiAgU3RlZWRvcy5jaGVja0F1dGhUb2tlbiA9IGZ1bmN0aW9uKHVzZXJJZCwgYXV0aFRva2VuKSB7XG4gICAgdmFyIGhhc2hlZFRva2VuLCB1c2VyO1xuICAgIGlmICh1c2VySWQgJiYgYXV0aFRva2VuKSB7XG4gICAgICBoYXNoZWRUb2tlbiA9IEFjY291bnRzLl9oYXNoTG9naW5Ub2tlbihhdXRoVG9rZW4pO1xuICAgICAgdXNlciA9IE1ldGVvci51c2Vycy5maW5kT25lKHtcbiAgICAgICAgX2lkOiB1c2VySWQsXG4gICAgICAgIFwic2VydmljZXMucmVzdW1lLmxvZ2luVG9rZW5zLmhhc2hlZFRva2VuXCI6IGhhc2hlZFRva2VuXG4gICAgICB9KTtcbiAgICAgIGlmICh1c2VyKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG59XG5cbmlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyk7XG4gIFN0ZWVkb3MuZGVjcnlwdCA9IGZ1bmN0aW9uKHBhc3N3b3JkLCBrZXksIGl2KSB7XG4gICAgdmFyIGMsIGRlY2lwaGVyLCBkZWNpcGhlck1zZywgZSwgaSwga2V5MzIsIGxlbiwgbTtcbiAgICB0cnkge1xuICAgICAga2V5MzIgPSBcIlwiO1xuICAgICAgbGVuID0ga2V5Lmxlbmd0aDtcbiAgICAgIGlmIChsZW4gPCAzMikge1xuICAgICAgICBjID0gXCJcIjtcbiAgICAgICAgaSA9IDA7XG4gICAgICAgIG0gPSAzMiAtIGxlbjtcbiAgICAgICAgd2hpbGUgKGkgPCBtKSB7XG4gICAgICAgICAgYyA9IFwiIFwiICsgYztcbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgICAga2V5MzIgPSBrZXkgKyBjO1xuICAgICAgfSBlbHNlIGlmIChsZW4gPj0gMzIpIHtcbiAgICAgICAga2V5MzIgPSBrZXkuc2xpY2UoMCwgMzIpO1xuICAgICAgfVxuICAgICAgZGVjaXBoZXIgPSBjcnlwdG8uY3JlYXRlRGVjaXBoZXJpdignYWVzLTI1Ni1jYmMnLCBuZXcgQnVmZmVyKGtleTMyLCAndXRmOCcpLCBuZXcgQnVmZmVyKGl2LCAndXRmOCcpKTtcbiAgICAgIGRlY2lwaGVyTXNnID0gQnVmZmVyLmNvbmNhdChbZGVjaXBoZXIudXBkYXRlKHBhc3N3b3JkLCAnYmFzZTY0JyksIGRlY2lwaGVyLmZpbmFsKCldKTtcbiAgICAgIHBhc3N3b3JkID0gZGVjaXBoZXJNc2cudG9TdHJpbmcoKTtcbiAgICAgIHJldHVybiBwYXNzd29yZDtcbiAgICB9IGNhdGNoIChlcnJvcjEpIHtcbiAgICAgIGUgPSBlcnJvcjE7XG4gICAgICByZXR1cm4gcGFzc3dvcmQ7XG4gICAgfVxuICB9O1xuICBTdGVlZG9zLmVuY3J5cHQgPSBmdW5jdGlvbihwYXNzd29yZCwga2V5LCBpdikge1xuICAgIHZhciBjLCBjaXBoZXIsIGNpcGhlcmVkTXNnLCBpLCBrZXkzMiwgbGVuLCBtO1xuICAgIGtleTMyID0gXCJcIjtcbiAgICBsZW4gPSBrZXkubGVuZ3RoO1xuICAgIGlmIChsZW4gPCAzMikge1xuICAgICAgYyA9IFwiXCI7XG4gICAgICBpID0gMDtcbiAgICAgIG0gPSAzMiAtIGxlbjtcbiAgICAgIHdoaWxlIChpIDwgbSkge1xuICAgICAgICBjID0gXCIgXCIgKyBjO1xuICAgICAgICBpKys7XG4gICAgICB9XG4gICAgICBrZXkzMiA9IGtleSArIGM7XG4gICAgfSBlbHNlIGlmIChsZW4gPj0gMzIpIHtcbiAgICAgIGtleTMyID0ga2V5LnNsaWNlKDAsIDMyKTtcbiAgICB9XG4gICAgY2lwaGVyID0gY3J5cHRvLmNyZWF0ZUNpcGhlcml2KCdhZXMtMjU2LWNiYycsIG5ldyBCdWZmZXIoa2V5MzIsICd1dGY4JyksIG5ldyBCdWZmZXIoaXYsICd1dGY4JykpO1xuICAgIGNpcGhlcmVkTXNnID0gQnVmZmVyLmNvbmNhdChbY2lwaGVyLnVwZGF0ZShuZXcgQnVmZmVyKHBhc3N3b3JkLCAndXRmOCcpKSwgY2lwaGVyLmZpbmFsKCldKTtcbiAgICBwYXNzd29yZCA9IGNpcGhlcmVkTXNnLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICByZXR1cm4gcGFzc3dvcmQ7XG4gIH07XG4gIFN0ZWVkb3MuZ2V0VXNlcklkRnJvbUFjY2Vzc1Rva2VuID0gZnVuY3Rpb24oYWNjZXNzX3Rva2VuKSB7XG4gICAgdmFyIGNvbGxlY3Rpb24sIGhhc2hlZFRva2VuLCBvYmosIHVzZXIsIHVzZXJJZDtcbiAgICBpZiAoIWFjY2Vzc190b2tlbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHVzZXJJZCA9IGFjY2Vzc190b2tlbi5zcGxpdChcIi1cIilbMF07XG4gICAgaGFzaGVkVG9rZW4gPSBBY2NvdW50cy5faGFzaExvZ2luVG9rZW4oYWNjZXNzX3Rva2VuKTtcbiAgICB1c2VyID0gZGIudXNlcnMuZmluZE9uZSh7XG4gICAgICBfaWQ6IHVzZXJJZCxcbiAgICAgIFwic2VjcmV0cy5oYXNoZWRUb2tlblwiOiBoYXNoZWRUb2tlblxuICAgIH0pO1xuICAgIGlmICh1c2VyKSB7XG4gICAgICByZXR1cm4gdXNlcklkO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb2xsZWN0aW9uID0gb0F1dGgyU2VydmVyLmNvbGxlY3Rpb25zLmFjY2Vzc1Rva2VuO1xuICAgICAgb2JqID0gY29sbGVjdGlvbi5maW5kT25lKHtcbiAgICAgICAgJ2FjY2Vzc1Rva2VuJzogYWNjZXNzX3Rva2VuXG4gICAgICB9KTtcbiAgICAgIGlmIChvYmopIHtcbiAgICAgICAgaWYgKChvYmogIT0gbnVsbCA/IG9iai5leHBpcmVzIDogdm9pZCAwKSA8IG5ldyBEYXRlKCkpIHtcbiAgICAgICAgICByZXR1cm4gXCJvYXV0aDIgYWNjZXNzIHRva2VuOlwiICsgYWNjZXNzX3Rva2VuICsgXCIgaXMgZXhwaXJlZC5cIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gb2JqICE9IG51bGwgPyBvYmoudXNlcklkIDogdm9pZCAwO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gXCJvYXV0aDIgYWNjZXNzIHRva2VuOlwiICsgYWNjZXNzX3Rva2VuICsgXCIgaXMgbm90IGZvdW5kLlwiO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcbiAgU3RlZWRvcy5nZXRVc2VySWRGcm9tQXV0aFRva2VuID0gZnVuY3Rpb24ocmVxLCByZXMpIHtcbiAgICB2YXIgYXV0aFRva2VuLCBjb29raWVzLCByZWY1LCByZWY2LCByZWY3LCByZWY4LCB1c2VySWQ7XG4gICAgdXNlcklkID0gKHJlZjUgPSByZXEucXVlcnkpICE9IG51bGwgPyByZWY1W1wiWC1Vc2VyLUlkXCJdIDogdm9pZCAwO1xuICAgIGF1dGhUb2tlbiA9IChyZWY2ID0gcmVxLnF1ZXJ5KSAhPSBudWxsID8gcmVmNltcIlgtQXV0aC1Ub2tlblwiXSA6IHZvaWQgMDtcbiAgICBpZiAoU3RlZWRvcy5jaGVja0F1dGhUb2tlbih1c2VySWQsIGF1dGhUb2tlbikpIHtcbiAgICAgIHJldHVybiAocmVmNyA9IGRiLnVzZXJzLmZpbmRPbmUoe1xuICAgICAgICBfaWQ6IHVzZXJJZFxuICAgICAgfSkpICE9IG51bGwgPyByZWY3Ll9pZCA6IHZvaWQgMDtcbiAgICB9XG4gICAgY29va2llcyA9IG5ldyBDb29raWVzKHJlcSwgcmVzKTtcbiAgICBpZiAocmVxLmhlYWRlcnMpIHtcbiAgICAgIHVzZXJJZCA9IHJlcS5oZWFkZXJzW1wieC11c2VyLWlkXCJdO1xuICAgICAgYXV0aFRva2VuID0gcmVxLmhlYWRlcnNbXCJ4LWF1dGgtdG9rZW5cIl07XG4gICAgfVxuICAgIGlmICghdXNlcklkIHx8ICFhdXRoVG9rZW4pIHtcbiAgICAgIHVzZXJJZCA9IGNvb2tpZXMuZ2V0KFwiWC1Vc2VyLUlkXCIpO1xuICAgICAgYXV0aFRva2VuID0gY29va2llcy5nZXQoXCJYLUF1dGgtVG9rZW5cIik7XG4gICAgfVxuICAgIGlmICghdXNlcklkIHx8ICFhdXRoVG9rZW4pIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoU3RlZWRvcy5jaGVja0F1dGhUb2tlbih1c2VySWQsIGF1dGhUb2tlbikpIHtcbiAgICAgIHJldHVybiAocmVmOCA9IGRiLnVzZXJzLmZpbmRPbmUoe1xuICAgICAgICBfaWQ6IHVzZXJJZFxuICAgICAgfSkpICE9IG51bGwgPyByZWY4Ll9pZCA6IHZvaWQgMDtcbiAgICB9XG4gIH07XG4gIFN0ZWVkb3MuQVBJQXV0aGVudGljYXRpb25DaGVjayA9IGZ1bmN0aW9uKHJlcSwgcmVzKSB7XG4gICAgdmFyIGUsIHVzZXIsIHVzZXJJZDtcbiAgICB0cnkge1xuICAgICAgdXNlcklkID0gcmVxLnVzZXJJZDtcbiAgICAgIHVzZXIgPSBkYi51c2Vycy5maW5kT25lKHtcbiAgICAgICAgX2lkOiB1c2VySWRcbiAgICAgIH0pO1xuICAgICAgaWYgKCF1c2VySWQgfHwgIXVzZXIpIHtcbiAgICAgICAgSnNvblJvdXRlcy5zZW5kUmVzdWx0KHJlcywge1xuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIFwiZXJyb3JcIjogXCJWYWxpZGF0ZSBSZXF1ZXN0IC0tIE1pc3NpbmcgWC1BdXRoLVRva2VuLFgtVXNlci1JZCBPciBhY2Nlc3NfdG9rZW5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgY29kZTogNDAxXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjEpIHtcbiAgICAgIGUgPSBlcnJvcjE7XG4gICAgICBpZiAoIXVzZXJJZCB8fCAhdXNlcikge1xuICAgICAgICBKc29uUm91dGVzLnNlbmRSZXN1bHQocmVzLCB7XG4gICAgICAgICAgY29kZTogNDAxLFxuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIFwiZXJyb3JcIjogZS5tZXNzYWdlLFxuICAgICAgICAgICAgXCJzdWNjZXNzXCI6IGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cblxubWl4aW4gPSBmdW5jdGlvbihvYmopIHtcbiAgcmV0dXJuIF8uZWFjaChfLmZ1bmN0aW9ucyhvYmopLCBmdW5jdGlvbihuYW1lKSB7XG4gICAgdmFyIGZ1bmM7XG4gICAgaWYgKCFfW25hbWVdICYmIChfLnByb3RvdHlwZVtuYW1lXSA9PSBudWxsKSkge1xuICAgICAgZnVuYyA9IF9bbmFtZV0gPSBvYmpbbmFtZV07XG4gICAgICByZXR1cm4gXy5wcm90b3R5cGVbbmFtZV0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGFyZ3M7XG4gICAgICAgIGFyZ3MgPSBbdGhpcy5fd3JhcHBlZF07XG4gICAgICAgIHB1c2guYXBwbHkoYXJncywgYXJndW1lbnRzKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdC5jYWxsKHRoaXMsIGZ1bmMuYXBwbHkoXywgYXJncykpO1xuICAgICAgfTtcbiAgICB9XG4gIH0pO1xufTtcblxuaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICBTdGVlZG9zLmlzSG9saWRheSA9IGZ1bmN0aW9uKGRhdGUpIHtcbiAgICB2YXIgZGF5O1xuICAgIGlmICghZGF0ZSkge1xuICAgICAgZGF0ZSA9IG5ldyBEYXRlO1xuICAgIH1cbiAgICBjaGVjayhkYXRlLCBEYXRlKTtcbiAgICBkYXkgPSBkYXRlLmdldERheSgpO1xuICAgIGlmIChkYXkgPT09IDYgfHwgZGF5ID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuICBTdGVlZG9zLmNhY3VsYXRlV29ya2luZ1RpbWUgPSBmdW5jdGlvbihkYXRlLCBkYXlzKSB7XG4gICAgdmFyIGNhY3VsYXRlRGF0ZSwgcGFyYW1fZGF0ZTtcbiAgICBjaGVjayhkYXRlLCBEYXRlKTtcbiAgICBjaGVjayhkYXlzLCBOdW1iZXIpO1xuICAgIHBhcmFtX2RhdGUgPSBuZXcgRGF0ZShkYXRlKTtcbiAgICBjYWN1bGF0ZURhdGUgPSBmdW5jdGlvbihpLCBkYXlzKSB7XG4gICAgICBpZiAoaSA8IGRheXMpIHtcbiAgICAgICAgcGFyYW1fZGF0ZSA9IG5ldyBEYXRlKHBhcmFtX2RhdGUuZ2V0VGltZSgpICsgMjQgKiA2MCAqIDYwICogMTAwMCk7XG4gICAgICAgIGlmICghU3RlZWRvcy5pc0hvbGlkYXkocGFyYW1fZGF0ZSkpIHtcbiAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgICAgY2FjdWxhdGVEYXRlKGksIGRheXMpO1xuICAgICAgfVxuICAgIH07XG4gICAgY2FjdWxhdGVEYXRlKDAsIGRheXMpO1xuICAgIHJldHVybiBwYXJhbV9kYXRlO1xuICB9O1xuICBTdGVlZG9zLmNhY3VsYXRlUGx1c0hhbGZXb3JraW5nRGF5ID0gZnVuY3Rpb24oZGF0ZSwgbmV4dCkge1xuICAgIHZhciBjYWN1bGF0ZWRfZGF0ZSwgZW5kX2RhdGUsIGZpcnN0X2RhdGUsIGksIGosIGxlbiwgbWF4X2luZGV4LCByZWY1LCBzZWNvbmRfZGF0ZSwgc3RhcnRfZGF0ZSwgdGltZV9wb2ludHM7XG4gICAgY2hlY2soZGF0ZSwgRGF0ZSk7XG4gICAgdGltZV9wb2ludHMgPSAocmVmNSA9IE1ldGVvci5zZXR0aW5ncy5yZW1pbmQpICE9IG51bGwgPyByZWY1LnRpbWVfcG9pbnRzIDogdm9pZCAwO1xuICAgIGlmICghdGltZV9wb2ludHMgfHwgXy5pc0VtcHR5KHRpbWVfcG9pbnRzKSkge1xuICAgICAgY29uc29sZS5lcnJvcihcInRpbWVfcG9pbnRzIGlzIG51bGxcIik7XG4gICAgICB0aW1lX3BvaW50cyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIFwiaG91clwiOiA4LFxuICAgICAgICAgIFwibWludXRlXCI6IDMwXG4gICAgICAgIH0sIHtcbiAgICAgICAgICBcImhvdXJcIjogMTQsXG4gICAgICAgICAgXCJtaW51dGVcIjogMzBcbiAgICAgICAgfVxuICAgICAgXTtcbiAgICB9XG4gICAgbGVuID0gdGltZV9wb2ludHMubGVuZ3RoO1xuICAgIHN0YXJ0X2RhdGUgPSBuZXcgRGF0ZShkYXRlKTtcbiAgICBlbmRfZGF0ZSA9IG5ldyBEYXRlKGRhdGUpO1xuICAgIHN0YXJ0X2RhdGUuc2V0SG91cnModGltZV9wb2ludHNbMF0uaG91cik7XG4gICAgc3RhcnRfZGF0ZS5zZXRNaW51dGVzKHRpbWVfcG9pbnRzWzBdLm1pbnV0ZSk7XG4gICAgZW5kX2RhdGUuc2V0SG91cnModGltZV9wb2ludHNbbGVuIC0gMV0uaG91cik7XG4gICAgZW5kX2RhdGUuc2V0TWludXRlcyh0aW1lX3BvaW50c1tsZW4gLSAxXS5taW51dGUpO1xuICAgIGNhY3VsYXRlZF9kYXRlID0gbmV3IERhdGUoZGF0ZSk7XG4gICAgaiA9IDA7XG4gICAgbWF4X2luZGV4ID0gbGVuIC0gMTtcbiAgICBpZiAoZGF0ZSA8IHN0YXJ0X2RhdGUpIHtcbiAgICAgIGlmIChuZXh0KSB7XG4gICAgICAgIGogPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaiA9IGxlbiAvIDI7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChkYXRlID49IHN0YXJ0X2RhdGUgJiYgZGF0ZSA8IGVuZF9kYXRlKSB7XG4gICAgICBpID0gMDtcbiAgICAgIHdoaWxlIChpIDwgbWF4X2luZGV4KSB7XG4gICAgICAgIGZpcnN0X2RhdGUgPSBuZXcgRGF0ZShkYXRlKTtcbiAgICAgICAgc2Vjb25kX2RhdGUgPSBuZXcgRGF0ZShkYXRlKTtcbiAgICAgICAgZmlyc3RfZGF0ZS5zZXRIb3Vycyh0aW1lX3BvaW50c1tpXS5ob3VyKTtcbiAgICAgICAgZmlyc3RfZGF0ZS5zZXRNaW51dGVzKHRpbWVfcG9pbnRzW2ldLm1pbnV0ZSk7XG4gICAgICAgIHNlY29uZF9kYXRlLnNldEhvdXJzKHRpbWVfcG9pbnRzW2kgKyAxXS5ob3VyKTtcbiAgICAgICAgc2Vjb25kX2RhdGUuc2V0TWludXRlcyh0aW1lX3BvaW50c1tpICsgMV0ubWludXRlKTtcbiAgICAgICAgaWYgKGRhdGUgPj0gZmlyc3RfZGF0ZSAmJiBkYXRlIDwgc2Vjb25kX2RhdGUpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpKys7XG4gICAgICB9XG4gICAgICBpZiAobmV4dCkge1xuICAgICAgICBqID0gaSArIDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBqID0gaSArIGxlbiAvIDI7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChkYXRlID49IGVuZF9kYXRlKSB7XG4gICAgICBpZiAobmV4dCkge1xuICAgICAgICBqID0gbWF4X2luZGV4ICsgMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGogPSBtYXhfaW5kZXggKyBsZW4gLyAyO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaiA+IG1heF9pbmRleCkge1xuICAgICAgY2FjdWxhdGVkX2RhdGUgPSBTdGVlZG9zLmNhY3VsYXRlV29ya2luZ1RpbWUoZGF0ZSwgMSk7XG4gICAgICBjYWN1bGF0ZWRfZGF0ZS5zZXRIb3Vycyh0aW1lX3BvaW50c1tqIC0gbWF4X2luZGV4IC0gMV0uaG91cik7XG4gICAgICBjYWN1bGF0ZWRfZGF0ZS5zZXRNaW51dGVzKHRpbWVfcG9pbnRzW2ogLSBtYXhfaW5kZXggLSAxXS5taW51dGUpO1xuICAgIH0gZWxzZSBpZiAoaiA8PSBtYXhfaW5kZXgpIHtcbiAgICAgIGNhY3VsYXRlZF9kYXRlLnNldEhvdXJzKHRpbWVfcG9pbnRzW2pdLmhvdXIpO1xuICAgICAgY2FjdWxhdGVkX2RhdGUuc2V0TWludXRlcyh0aW1lX3BvaW50c1tqXS5taW51dGUpO1xuICAgIH1cbiAgICByZXR1cm4gY2FjdWxhdGVkX2RhdGU7XG4gIH07XG59XG5cbmlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgXy5leHRlbmQoU3RlZWRvcywge1xuICAgIGdldFN0ZWVkb3NUb2tlbjogZnVuY3Rpb24oYXBwSWQsIHVzZXJJZCwgYXV0aFRva2VuKSB7XG4gICAgICB2YXIgYXBwLCBjLCBjaXBoZXIsIGNpcGhlcmVkTXNnLCBoYXNoZWRUb2tlbiwgaSwgaXYsIGtleTMyLCBsZW4sIG0sIG5vdywgc2VjcmV0LCBzdGVlZG9zX2lkLCBzdGVlZG9zX3Rva2VuLCB1c2VyO1xuICAgICAgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyk7XG4gICAgICBhcHAgPSBkYi5hcHBzLmZpbmRPbmUoYXBwSWQpO1xuICAgICAgaWYgKGFwcCkge1xuICAgICAgICBzZWNyZXQgPSBhcHAuc2VjcmV0O1xuICAgICAgfVxuICAgICAgaWYgKHVzZXJJZCAmJiBhdXRoVG9rZW4pIHtcbiAgICAgICAgaGFzaGVkVG9rZW4gPSBBY2NvdW50cy5faGFzaExvZ2luVG9rZW4oYXV0aFRva2VuKTtcbiAgICAgICAgdXNlciA9IE1ldGVvci51c2Vycy5maW5kT25lKHtcbiAgICAgICAgICBfaWQ6IHVzZXJJZCxcbiAgICAgICAgICBcInNlcnZpY2VzLnJlc3VtZS5sb2dpblRva2Vucy5oYXNoZWRUb2tlblwiOiBoYXNoZWRUb2tlblxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHVzZXIpIHtcbiAgICAgICAgICBzdGVlZG9zX2lkID0gdXNlci5zdGVlZG9zX2lkO1xuICAgICAgICAgIGlmIChhcHAuc2VjcmV0KSB7XG4gICAgICAgICAgICBpdiA9IGFwcC5zZWNyZXQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGl2ID0gXCItODc2Mi1mY2IzNjliMmU4XCI7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5vdyA9IHBhcnNlSW50KG5ldyBEYXRlKCkuZ2V0VGltZSgpIC8gMTAwMCkudG9TdHJpbmcoKTtcbiAgICAgICAgICBrZXkzMiA9IFwiXCI7XG4gICAgICAgICAgbGVuID0gc3RlZWRvc19pZC5sZW5ndGg7XG4gICAgICAgICAgaWYgKGxlbiA8IDMyKSB7XG4gICAgICAgICAgICBjID0gXCJcIjtcbiAgICAgICAgICAgIGkgPSAwO1xuICAgICAgICAgICAgbSA9IDMyIC0gbGVuO1xuICAgICAgICAgICAgd2hpbGUgKGkgPCBtKSB7XG4gICAgICAgICAgICAgIGMgPSBcIiBcIiArIGM7XG4gICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGtleTMyID0gc3RlZWRvc19pZCArIGM7XG4gICAgICAgICAgfSBlbHNlIGlmIChsZW4gPj0gMzIpIHtcbiAgICAgICAgICAgIGtleTMyID0gc3RlZWRvc19pZC5zbGljZSgwLCAzMik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNpcGhlciA9IGNyeXB0by5jcmVhdGVDaXBoZXJpdignYWVzLTI1Ni1jYmMnLCBuZXcgQnVmZmVyKGtleTMyLCAndXRmOCcpLCBuZXcgQnVmZmVyKGl2LCAndXRmOCcpKTtcbiAgICAgICAgICBjaXBoZXJlZE1zZyA9IEJ1ZmZlci5jb25jYXQoW2NpcGhlci51cGRhdGUobmV3IEJ1ZmZlcihub3csICd1dGY4JykpLCBjaXBoZXIuZmluYWwoKV0pO1xuICAgICAgICAgIHN0ZWVkb3NfdG9rZW4gPSBjaXBoZXJlZE1zZy50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzdGVlZG9zX3Rva2VuO1xuICAgIH0sXG4gICAgbG9jYWxlOiBmdW5jdGlvbih1c2VySWQsIGlzSTE4bikge1xuICAgICAgdmFyIGxvY2FsZSwgdXNlcjtcbiAgICAgIHVzZXIgPSBkYi51c2Vycy5maW5kT25lKHtcbiAgICAgICAgX2lkOiB1c2VySWRcbiAgICAgIH0sIHtcbiAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgbG9jYWxlOiAxXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgbG9jYWxlID0gdXNlciAhPSBudWxsID8gdXNlci5sb2NhbGUgOiB2b2lkIDA7XG4gICAgICBpZiAoaXNJMThuKSB7XG4gICAgICAgIGlmIChsb2NhbGUgPT09IFwiZW4tdXNcIikge1xuICAgICAgICAgIGxvY2FsZSA9IFwiZW5cIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxlID09PSBcInpoLWNuXCIpIHtcbiAgICAgICAgICBsb2NhbGUgPSBcInpoLUNOXCI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBsb2NhbGU7XG4gICAgfSxcbiAgICBjaGVja1VzZXJuYW1lQXZhaWxhYmlsaXR5OiBmdW5jdGlvbih1c2VybmFtZSkge1xuICAgICAgcmV0dXJuICFNZXRlb3IudXNlcnMuZmluZE9uZSh7XG4gICAgICAgIHVzZXJuYW1lOiB7XG4gICAgICAgICAgJHJlZ2V4OiBuZXcgUmVnRXhwKFwiXlwiICsgTWV0ZW9yLl9lc2NhcGVSZWdFeHAodXNlcm5hbWUpLnRyaW0oKSArIFwiJFwiLCBcImlcIilcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgICB2YWxpZGF0ZVBhc3N3b3JkOiBmdW5jdGlvbihwd2QpIHtcbiAgICAgIHZhciBwYXNzd29yUG9saWN5LCBwYXNzd29yUG9saWN5RXJyb3IsIHJlYXNvbiwgcmVmNSwgcmVmNiwgcmVmNywgcmVmOCwgdmFsaWQ7XG4gICAgICByZWFzb24gPSB0KFwicGFzc3dvcmRfaW52YWxpZFwiKTtcbiAgICAgIHZhbGlkID0gdHJ1ZTtcbiAgICAgIGlmICghcHdkKSB7XG4gICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBwYXNzd29yUG9saWN5ID0gKHJlZjUgPSBNZXRlb3Iuc2V0dGluZ3NbXCJwdWJsaWNcIl0pICE9IG51bGwgPyAocmVmNiA9IHJlZjUucGFzc3dvcmQpICE9IG51bGwgPyByZWY2LnBvbGljeSA6IHZvaWQgMCA6IHZvaWQgMDtcbiAgICAgIHBhc3N3b3JQb2xpY3lFcnJvciA9IChyZWY3ID0gTWV0ZW9yLnNldHRpbmdzW1wicHVibGljXCJdKSAhPSBudWxsID8gKHJlZjggPSByZWY3LnBhc3N3b3JkKSAhPSBudWxsID8gcmVmOC5wb2xpY3lFcnJvciA6IHZvaWQgMCA6IHZvaWQgMDtcbiAgICAgIGlmIChwYXNzd29yUG9saWN5KSB7XG4gICAgICAgIGlmICghKG5ldyBSZWdFeHAocGFzc3dvclBvbGljeSkpLnRlc3QocHdkIHx8ICcnKSkge1xuICAgICAgICAgIHJlYXNvbiA9IHBhc3N3b3JQb2xpY3lFcnJvcjtcbiAgICAgICAgICB2YWxpZCA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbGlkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHZhbGlkKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgcmVhc29uOiByZWFzb25cbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxuU3RlZWRvcy5jb252ZXJ0U3BlY2lhbENoYXJhY3RlciA9IGZ1bmN0aW9uKHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbXFxeXFwkXFwoXFwpXFwqXFwrXFw/XFwuXFxcXFxcfFxcW1xcXVxce1xcfV0pL2csIFwiXFxcXCQxXCIpO1xufTtcblxuU3RlZWRvcy5yZW1vdmVTcGVjaWFsQ2hhcmFjdGVyID0gZnVuY3Rpb24oc3RyKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZSgvKFtcXF5cXCRcXChcXClcXCpcXCtcXD9cXC5cXFxcXFx8XFxbXFxdXFx7XFx9XFx+XFxgXFxAXFwjXFwlXFwmXFw9XFwnXFxcIlxcOlxcO1xcPFxcPlxcLFxcL10pL2csIFwiXCIpO1xufTtcblxuQ3JlYXRvci5nZXREQkFwcHMgPSBmdW5jdGlvbihzcGFjZV9pZCkge1xuICB2YXIgZGJBcHBzO1xuICBkYkFwcHMgPSB7fTtcbiAgQ3JlYXRvci5Db2xsZWN0aW9uc1tcImFwcHNcIl0uZmluZCh7XG4gICAgc3BhY2U6IHNwYWNlX2lkLFxuICAgIGlzX2NyZWF0b3I6IHRydWUsXG4gICAgdmlzaWJsZTogdHJ1ZVxuICB9LCB7XG4gICAgZmllbGRzOiB7XG4gICAgICBjcmVhdGVkOiAwLFxuICAgICAgY3JlYXRlZF9ieTogMCxcbiAgICAgIG1vZGlmaWVkOiAwLFxuICAgICAgbW9kaWZpZWRfYnk6IDBcbiAgICB9XG4gIH0pLmZvckVhY2goZnVuY3Rpb24oYXBwKSB7XG4gICAgcmV0dXJuIGRiQXBwc1thcHAuX2lkXSA9IGFwcDtcbiAgfSk7XG4gIHJldHVybiBkYkFwcHM7XG59O1xuXG5DcmVhdG9yLmdldERCRGFzaGJvYXJkcyA9IGZ1bmN0aW9uKHNwYWNlX2lkKSB7XG4gIHZhciBkYkRhc2hib2FyZHM7XG4gIGRiRGFzaGJvYXJkcyA9IHt9O1xuICBDcmVhdG9yLkNvbGxlY3Rpb25zW1wiZGFzaGJvYXJkXCJdLmZpbmQoe1xuICAgIHNwYWNlOiBzcGFjZV9pZFxuICB9LCB7XG4gICAgZmllbGRzOiB7XG4gICAgICBjcmVhdGVkOiAwLFxuICAgICAgY3JlYXRlZF9ieTogMCxcbiAgICAgIG1vZGlmaWVkOiAwLFxuICAgICAgbW9kaWZpZWRfYnk6IDBcbiAgICB9XG4gIH0pLmZvckVhY2goZnVuY3Rpb24oZGFzaGJvYXJkKSB7XG4gICAgcmV0dXJuIGRiRGFzaGJvYXJkc1tkYXNoYm9hcmQuX2lkXSA9IGRhc2hib2FyZDtcbiAgfSk7XG4gIHJldHVybiBkYkRhc2hib2FyZHM7XG59O1xuXG5pZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gIENvb2tpZXMgPSByZXF1aXJlKFwiY29va2llc1wiKTtcbiAgU3RlZWRvcy5nZXRBdXRoVG9rZW4gPSBmdW5jdGlvbihyZXEsIHJlcykge1xuICAgIHZhciBhdXRoVG9rZW4sIGNvb2tpZXM7XG4gICAgY29va2llcyA9IG5ldyBDb29raWVzKHJlcSwgcmVzKTtcbiAgICBhdXRoVG9rZW4gPSByZXEuaGVhZGVyc1sneC1hdXRoLXRva2VuJ10gfHwgY29va2llcy5nZXQoXCJYLUF1dGgtVG9rZW5cIik7XG4gICAgaWYgKCFhdXRoVG9rZW4gJiYgcmVxLmhlYWRlcnMuYXV0aG9yaXphdGlvbiAmJiByZXEuaGVhZGVycy5hdXRob3JpemF0aW9uLnNwbGl0KCcgJylbMF0gPT09ICdCZWFyZXInKSB7XG4gICAgICBhdXRoVG9rZW4gPSByZXEuaGVhZGVycy5hdXRob3JpemF0aW9uLnNwbGl0KCcgJylbMV07XG4gICAgfVxuICAgIHJldHVybiBhdXRoVG9rZW47XG4gIH07XG59XG5cbmlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgTWV0ZW9yLmF1dG9ydW4oZnVuY3Rpb24oKSB7XG4gICAgaWYgKFNlc3Npb24uZ2V0KCdjdXJyZW50X2FwcF9pZCcpKSB7XG4gICAgICByZXR1cm4gc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgnY3VycmVudF9hcHBfaWQnLCBTZXNzaW9uLmdldCgnY3VycmVudF9hcHBfaWQnKSk7XG4gICAgfVxuICB9KTtcbiAgU3RlZWRvcy5nZXRDdXJyZW50QXBwSWQgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAoU2Vzc2lvbi5nZXQoJ2FwcF9pZCcpKSB7XG4gICAgICByZXR1cm4gU2Vzc2lvbi5nZXQoJ2FwcF9pZCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnY3VycmVudF9hcHBfaWQnKTtcbiAgICB9XG4gIH07XG59XG5cbmlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgU3RlZWRvcy5mb3JtYXRJbmRleCA9IGZ1bmN0aW9uKGFycmF5KSB7XG4gICAgdmFyIGluZGV4TmFtZSwgaXNkb2N1bWVudERCLCBvYmplY3QsIHJlZjUsIHJlZjYsIHJlZjc7XG4gICAgb2JqZWN0ID0ge1xuICAgICAgYmFja2dyb3VuZDogdHJ1ZVxuICAgIH07XG4gICAgaXNkb2N1bWVudERCID0gKChyZWY1ID0gTWV0ZW9yLnNldHRpbmdzKSAhPSBudWxsID8gKHJlZjYgPSByZWY1LmRhdGFzb3VyY2VzKSAhPSBudWxsID8gKHJlZjcgPSByZWY2W1wiZGVmYXVsdFwiXSkgIT0gbnVsbCA/IHJlZjcuZG9jdW1lbnREQiA6IHZvaWQgMCA6IHZvaWQgMCA6IHZvaWQgMCkgfHwgZmFsc2U7XG4gICAgaWYgKGlzZG9jdW1lbnREQikge1xuICAgICAgaWYgKGFycmF5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgaW5kZXhOYW1lID0gYXJyYXkuam9pbihcIi5cIik7XG4gICAgICAgIG9iamVjdC5uYW1lID0gaW5kZXhOYW1lO1xuICAgICAgICBpZiAoaW5kZXhOYW1lLmxlbmd0aCA+IDUyKSB7XG4gICAgICAgICAgb2JqZWN0Lm5hbWUgPSBpbmRleE5hbWUuc3Vic3RyaW5nKDAsIDUyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0O1xuICB9O1xufVxuIiwiTWV0ZW9yLnN0YXJ0dXAoZnVuY3Rpb24gKCkge1xuXHRTaW1wbGVTY2hlbWEuZXh0ZW5kT3B0aW9ucyh7Zm9yZWlnbl9rZXk6IE1hdGNoLk9wdGlvbmFsKEJvb2xlYW4pLCByZWZlcmVuY2VzOiBNYXRjaC5PcHRpb25hbChPYmplY3QpfSk7XG59KSIsImlmIE1ldGVvci5pc1NlcnZlclxuICAgICAgICBNZXRlb3IubWV0aG9kc1xuICAgICAgICAgICAgICAgIHVwZGF0ZVVzZXJMYXN0TG9nb246ICgpIC0+XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgQHVzZXJJZD9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGRiLnVzZXJzLnVwZGF0ZSh7X2lkOiBAdXNlcklkfSwgeyRzZXQ6IHtsYXN0X2xvZ29uOiBuZXcgRGF0ZSgpfX0pICBcblxuXG5pZiBNZXRlb3IuaXNDbGllbnRcbiAgICAgICAgQWNjb3VudHMub25Mb2dpbiAoKS0+XG4gICAgICAgICAgICBNZXRlb3IuY2FsbCAndXBkYXRlVXNlckxhc3RMb2dvbiciLCJpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gIE1ldGVvci5tZXRob2RzKHtcbiAgICB1cGRhdGVVc2VyTGFzdExvZ29uOiBmdW5jdGlvbigpIHtcbiAgICAgIGlmICh0aGlzLnVzZXJJZCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkYi51c2Vycy51cGRhdGUoe1xuICAgICAgICBfaWQ6IHRoaXMudXNlcklkXG4gICAgICB9LCB7XG4gICAgICAgICRzZXQ6IHtcbiAgICAgICAgICBsYXN0X2xvZ29uOiBuZXcgRGF0ZSgpXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59XG5cbmlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgQWNjb3VudHMub25Mb2dpbihmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gTWV0ZW9yLmNhbGwoJ3VwZGF0ZVVzZXJMYXN0TG9nb24nKTtcbiAgfSk7XG59XG4iLCJpZiBNZXRlb3IuaXNTZXJ2ZXJcbiAgTWV0ZW9yLm1ldGhvZHNcbiAgICB1c2Vyc19hZGRfZW1haWw6IChlbWFpbCkgLT5cbiAgICAgIGlmIG5vdCBAdXNlcklkP1xuICAgICAgICByZXR1cm4ge2Vycm9yOiB0cnVlLCBtZXNzYWdlOiBcImVtYWlsX2xvZ2luX3JlcXVpcmVkXCJ9XG4gICAgICBpZiBub3QgZW1haWxcbiAgICAgICAgcmV0dXJuIHtlcnJvcjogdHJ1ZSwgbWVzc2FnZTogXCJlbWFpbF9yZXF1aXJlZFwifVxuICAgICAgaWYgbm90IC9eKFtBLVowLTlcXC5cXC1cXF9cXCtdKSooW0EtWjAtOVxcK1xcLVxcX10pK1xcQFtBLVowLTldKyhbXFwtXVtBLVowLTldKykqKFtcXC5dW0EtWjAtOVxcLV0rKXsxLDh9JC9pLnRlc3QoZW1haWwpXG4gICAgICAgIHJldHVybiB7ZXJyb3I6IHRydWUsIG1lc3NhZ2U6IFwiZW1haWxfZm9ybWF0X2Vycm9yXCJ9XG4gICAgICBpZiBkYi51c2Vycy5maW5kKHtcImVtYWlscy5hZGRyZXNzXCI6IGVtYWlsfSkuY291bnQoKT4wXG4gICAgICAgIHJldHVybiB7ZXJyb3I6IHRydWUsIG1lc3NhZ2U6IFwiZW1haWxfZXhpc3RzXCJ9XG5cbiAgICAgIHVzZXIgPSBkYi51c2Vycy5maW5kT25lKF9pZDogdGhpcy51c2VySWQpXG4gICAgICBpZiB1c2VyLmVtYWlscz8gYW5kIHVzZXIuZW1haWxzLmxlbmd0aCA+IDAgXG4gICAgICAgIGRiLnVzZXJzLmRpcmVjdC51cGRhdGUge19pZDogdGhpcy51c2VySWR9LCBcbiAgICAgICAgICAkcHVzaDogXG4gICAgICAgICAgICBlbWFpbHM6IFxuICAgICAgICAgICAgICBhZGRyZXNzOiBlbWFpbFxuICAgICAgICAgICAgICB2ZXJpZmllZDogZmFsc2VcbiAgICAgIGVsc2VcbiAgICAgICAgZGIudXNlcnMuZGlyZWN0LnVwZGF0ZSB7X2lkOiB0aGlzLnVzZXJJZH0sIFxuICAgICAgICAgICRzZXQ6IFxuICAgICAgICAgICAgc3RlZWRvc19pZDogZW1haWxcbiAgICAgICAgICAgIGVtYWlsczogW1xuICAgICAgICAgICAgICBhZGRyZXNzOiBlbWFpbFxuICAgICAgICAgICAgICB2ZXJpZmllZDogZmFsc2VcbiAgICAgICAgICAgIF1cblxuICAgICAgQWNjb3VudHMuc2VuZFZlcmlmaWNhdGlvbkVtYWlsKHRoaXMudXNlcklkLCBlbWFpbCk7XG5cbiAgICAgIHJldHVybiB7fVxuXG4gICAgdXNlcnNfcmVtb3ZlX2VtYWlsOiAoZW1haWwpIC0+XG4gICAgICBpZiBub3QgQHVzZXJJZD9cbiAgICAgICAgcmV0dXJuIHtlcnJvcjogdHJ1ZSwgbWVzc2FnZTogXCJlbWFpbF9sb2dpbl9yZXF1aXJlZFwifVxuICAgICAgaWYgbm90IGVtYWlsXG4gICAgICAgIHJldHVybiB7ZXJyb3I6IHRydWUsIG1lc3NhZ2U6IFwiZW1haWxfcmVxdWlyZWRcIn1cblxuICAgICAgdXNlciA9IGRiLnVzZXJzLmZpbmRPbmUoX2lkOiB0aGlzLnVzZXJJZClcbiAgICAgIGlmIHVzZXIuZW1haWxzPyBhbmQgdXNlci5lbWFpbHMubGVuZ3RoID49IDJcbiAgICAgICAgcCA9IG51bGxcbiAgICAgICAgdXNlci5lbWFpbHMuZm9yRWFjaCAoZSktPlxuICAgICAgICAgIGlmIGUuYWRkcmVzcyA9PSBlbWFpbFxuICAgICAgICAgICAgcCA9IGVcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICBcbiAgICAgICAgZGIudXNlcnMuZGlyZWN0LnVwZGF0ZSB7X2lkOiB0aGlzLnVzZXJJZH0sIFxuICAgICAgICAgICRwdWxsOiBcbiAgICAgICAgICAgIGVtYWlsczogXG4gICAgICAgICAgICAgIHBcbiAgICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIHtlcnJvcjogdHJ1ZSwgbWVzc2FnZTogXCJlbWFpbF9hdF9sZWFzdF9vbmVcIn1cblxuICAgICAgcmV0dXJuIHt9XG5cbiAgICB1c2Vyc192ZXJpZnlfZW1haWw6IChlbWFpbCkgLT5cbiAgICAgIGlmIG5vdCBAdXNlcklkP1xuICAgICAgICByZXR1cm4ge2Vycm9yOiB0cnVlLCBtZXNzYWdlOiBcImVtYWlsX2xvZ2luX3JlcXVpcmVkXCJ9XG4gICAgICBpZiBub3QgZW1haWxcbiAgICAgICAgcmV0dXJuIHtlcnJvcjogdHJ1ZSwgbWVzc2FnZTogXCJlbWFpbF9yZXF1aXJlZFwifVxuICAgICAgaWYgbm90IC9eKFtBLVowLTlcXC5cXC1cXF9cXCtdKSooW0EtWjAtOVxcK1xcLVxcX10pK1xcQFtBLVowLTldKyhbXFwtXVtBLVowLTldKykqKFtcXC5dW0EtWjAtOVxcLV0rKXsxLDh9JC9pLnRlc3QoZW1haWwpXG4gICAgICAgIHJldHVybiB7ZXJyb3I6IHRydWUsIG1lc3NhZ2U6IFwiZW1haWxfZm9ybWF0X2Vycm9yXCJ9XG4gICAgICBcblxuICAgICAgQWNjb3VudHMuc2VuZFZlcmlmaWNhdGlvbkVtYWlsKHRoaXMudXNlcklkLCBlbWFpbCk7XG5cbiAgICAgIHJldHVybiB7fVxuXG4gICAgdXNlcnNfc2V0X3ByaW1hcnlfZW1haWw6IChlbWFpbCkgLT5cbiAgICAgIGlmIG5vdCBAdXNlcklkP1xuICAgICAgICByZXR1cm4ge2Vycm9yOiB0cnVlLCBtZXNzYWdlOiBcImVtYWlsX2xvZ2luX3JlcXVpcmVkXCJ9XG4gICAgICBpZiBub3QgZW1haWxcbiAgICAgICAgcmV0dXJuIHtlcnJvcjogdHJ1ZSwgbWVzc2FnZTogXCJlbWFpbF9yZXF1aXJlZFwifVxuXG4gICAgICB1c2VyID0gZGIudXNlcnMuZmluZE9uZShfaWQ6IHRoaXMudXNlcklkKVxuICAgICAgZW1haWxzID0gdXNlci5lbWFpbHNcbiAgICAgIGVtYWlscy5mb3JFYWNoIChlKS0+XG4gICAgICAgIGlmIGUuYWRkcmVzcyA9PSBlbWFpbFxuICAgICAgICAgIGUucHJpbWFyeSA9IHRydWVcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGUucHJpbWFyeSA9IGZhbHNlXG5cbiAgICAgIGRiLnVzZXJzLmRpcmVjdC51cGRhdGUge19pZDogdGhpcy51c2VySWR9LFxuICAgICAgICAkc2V0OlxuICAgICAgICAgIGVtYWlsczogZW1haWxzXG4gICAgICAgICAgZW1haWw6IGVtYWlsXG5cbiAgICAgIGRiLnNwYWNlX3VzZXJzLmRpcmVjdC51cGRhdGUoe3VzZXI6IHRoaXMudXNlcklkfSx7JHNldDoge2VtYWlsOiBlbWFpbH19LCB7bXVsdGk6IHRydWV9KVxuICAgICAgcmV0dXJuIHt9XG5cblxuXG5pZiBNZXRlb3IuaXNDbGllbnRcbiAgICBTdGVlZG9zLnVzZXJzX2FkZF9lbWFpbCA9ICgpLT5cbiAgICAgICAgc3dhbFxuICAgICAgICAgICAgdGl0bGU6IHQoXCJwcmltYXJ5X2VtYWlsX25lZWRlZFwiKSxcbiAgICAgICAgICAgIHRleHQ6IHQoXCJwcmltYXJ5X2VtYWlsX25lZWRlZF9kZXNjcmlwdGlvblwiKSxcbiAgICAgICAgICAgIHR5cGU6ICdpbnB1dCcsXG4gICAgICAgICAgICBzaG93Q2FuY2VsQnV0dG9uOiBmYWxzZSxcbiAgICAgICAgICAgIGNsb3NlT25Db25maXJtOiBmYWxzZSxcbiAgICAgICAgICAgIGFuaW1hdGlvbjogXCJzbGlkZS1mcm9tLXRvcFwiXG4gICAgICAgICwgKGlucHV0VmFsdWUpIC0+XG4gICAgICAgICAgICBNZXRlb3IuY2FsbCBcInVzZXJzX2FkZF9lbWFpbFwiLCBpbnB1dFZhbHVlLCAoZXJyb3IsIHJlc3VsdCktPlxuICAgICAgICAgICAgICAgIGlmIHJlc3VsdD8uZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgdG9hc3RyLmVycm9yIHJlc3VsdC5tZXNzYWdlXG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICBzd2FsIHQoXCJwcmltYXJ5X2VtYWlsX3VwZGF0ZWRcIiksIFwiXCIsIFwic3VjY2Vzc1wiXG4jIyNcbiAgICBUcmFja2VyLmF1dG9ydW4gKGMpIC0+XG5cbiAgICAgICAgaWYgTWV0ZW9yLnVzZXIoKVxuICAgICAgICAgIGlmIE1ldGVvci5sb2dnaW5nSW4oKVxuICAgICAgICAgICAgIyDmraPlnKjnmbvlvZXkuK3vvIzliJnkuI3lgZrlpITnkIbvvIzlm6DkuLrmraTml7ZNZXRlb3IudXNlcklkKCnkuI3otrPkuo7or4HmmI7lt7LnmbvlvZXnirbmgIFcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIHByaW1hcnlFbWFpbCA9IE1ldGVvci51c2VyKCkuZW1haWxzP1swXT8uYWRkcmVzc1xuICAgICAgICAgIGlmICFwcmltYXJ5RW1haWxcbiAgICAgICAgICAgICAgU3RlZWRvcy51c2Vyc19hZGRfZW1haWwoKTtcbiMjIyIsImlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgTWV0ZW9yLm1ldGhvZHMoe1xuICAgIHVzZXJzX2FkZF9lbWFpbDogZnVuY3Rpb24oZW1haWwpIHtcbiAgICAgIHZhciB1c2VyO1xuICAgICAgaWYgKHRoaXMudXNlcklkID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlcnJvcjogdHJ1ZSxcbiAgICAgICAgICBtZXNzYWdlOiBcImVtYWlsX2xvZ2luX3JlcXVpcmVkXCJcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmICghZW1haWwpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlcnJvcjogdHJ1ZSxcbiAgICAgICAgICBtZXNzYWdlOiBcImVtYWlsX3JlcXVpcmVkXCJcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmICghL14oW0EtWjAtOVxcLlxcLVxcX1xcK10pKihbQS1aMC05XFwrXFwtXFxfXSkrXFxAW0EtWjAtOV0rKFtcXC1dW0EtWjAtOV0rKSooW1xcLl1bQS1aMC05XFwtXSspezEsOH0kL2kudGVzdChlbWFpbCkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlcnJvcjogdHJ1ZSxcbiAgICAgICAgICBtZXNzYWdlOiBcImVtYWlsX2Zvcm1hdF9lcnJvclwiXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoZGIudXNlcnMuZmluZCh7XG4gICAgICAgIFwiZW1haWxzLmFkZHJlc3NcIjogZW1haWxcbiAgICAgIH0pLmNvdW50KCkgPiAwKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZXJyb3I6IHRydWUsXG4gICAgICAgICAgbWVzc2FnZTogXCJlbWFpbF9leGlzdHNcIlxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgdXNlciA9IGRiLnVzZXJzLmZpbmRPbmUoe1xuICAgICAgICBfaWQ6IHRoaXMudXNlcklkXG4gICAgICB9KTtcbiAgICAgIGlmICgodXNlci5lbWFpbHMgIT0gbnVsbCkgJiYgdXNlci5lbWFpbHMubGVuZ3RoID4gMCkge1xuICAgICAgICBkYi51c2Vycy5kaXJlY3QudXBkYXRlKHtcbiAgICAgICAgICBfaWQ6IHRoaXMudXNlcklkXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAkcHVzaDoge1xuICAgICAgICAgICAgZW1haWxzOiB7XG4gICAgICAgICAgICAgIGFkZHJlc3M6IGVtYWlsLFxuICAgICAgICAgICAgICB2ZXJpZmllZDogZmFsc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGIudXNlcnMuZGlyZWN0LnVwZGF0ZSh7XG4gICAgICAgICAgX2lkOiB0aGlzLnVzZXJJZFxuICAgICAgICB9LCB7XG4gICAgICAgICAgJHNldDoge1xuICAgICAgICAgICAgc3RlZWRvc19pZDogZW1haWwsXG4gICAgICAgICAgICBlbWFpbHM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGFkZHJlc3M6IGVtYWlsLFxuICAgICAgICAgICAgICAgIHZlcmlmaWVkOiBmYWxzZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIEFjY291bnRzLnNlbmRWZXJpZmljYXRpb25FbWFpbCh0aGlzLnVzZXJJZCwgZW1haWwpO1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH0sXG4gICAgdXNlcnNfcmVtb3ZlX2VtYWlsOiBmdW5jdGlvbihlbWFpbCkge1xuICAgICAgdmFyIHAsIHVzZXI7XG4gICAgICBpZiAodGhpcy51c2VySWQgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGVycm9yOiB0cnVlLFxuICAgICAgICAgIG1lc3NhZ2U6IFwiZW1haWxfbG9naW5fcmVxdWlyZWRcIlxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKCFlbWFpbCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGVycm9yOiB0cnVlLFxuICAgICAgICAgIG1lc3NhZ2U6IFwiZW1haWxfcmVxdWlyZWRcIlxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgdXNlciA9IGRiLnVzZXJzLmZpbmRPbmUoe1xuICAgICAgICBfaWQ6IHRoaXMudXNlcklkXG4gICAgICB9KTtcbiAgICAgIGlmICgodXNlci5lbWFpbHMgIT0gbnVsbCkgJiYgdXNlci5lbWFpbHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgcCA9IG51bGw7XG4gICAgICAgIHVzZXIuZW1haWxzLmZvckVhY2goZnVuY3Rpb24oZSkge1xuICAgICAgICAgIGlmIChlLmFkZHJlc3MgPT09IGVtYWlsKSB7XG4gICAgICAgICAgICBwID0gZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBkYi51c2Vycy5kaXJlY3QudXBkYXRlKHtcbiAgICAgICAgICBfaWQ6IHRoaXMudXNlcklkXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAkcHVsbDoge1xuICAgICAgICAgICAgZW1haWxzOiBwXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZXJyb3I6IHRydWUsXG4gICAgICAgICAgbWVzc2FnZTogXCJlbWFpbF9hdF9sZWFzdF9vbmVcIlxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHt9O1xuICAgIH0sXG4gICAgdXNlcnNfdmVyaWZ5X2VtYWlsOiBmdW5jdGlvbihlbWFpbCkge1xuICAgICAgaWYgKHRoaXMudXNlcklkID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlcnJvcjogdHJ1ZSxcbiAgICAgICAgICBtZXNzYWdlOiBcImVtYWlsX2xvZ2luX3JlcXVpcmVkXCJcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmICghZW1haWwpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlcnJvcjogdHJ1ZSxcbiAgICAgICAgICBtZXNzYWdlOiBcImVtYWlsX3JlcXVpcmVkXCJcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmICghL14oW0EtWjAtOVxcLlxcLVxcX1xcK10pKihbQS1aMC05XFwrXFwtXFxfXSkrXFxAW0EtWjAtOV0rKFtcXC1dW0EtWjAtOV0rKSooW1xcLl1bQS1aMC05XFwtXSspezEsOH0kL2kudGVzdChlbWFpbCkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlcnJvcjogdHJ1ZSxcbiAgICAgICAgICBtZXNzYWdlOiBcImVtYWlsX2Zvcm1hdF9lcnJvclwiXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBBY2NvdW50cy5zZW5kVmVyaWZpY2F0aW9uRW1haWwodGhpcy51c2VySWQsIGVtYWlsKTtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9LFxuICAgIHVzZXJzX3NldF9wcmltYXJ5X2VtYWlsOiBmdW5jdGlvbihlbWFpbCkge1xuICAgICAgdmFyIGVtYWlscywgdXNlcjtcbiAgICAgIGlmICh0aGlzLnVzZXJJZCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZXJyb3I6IHRydWUsXG4gICAgICAgICAgbWVzc2FnZTogXCJlbWFpbF9sb2dpbl9yZXF1aXJlZFwiXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoIWVtYWlsKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZXJyb3I6IHRydWUsXG4gICAgICAgICAgbWVzc2FnZTogXCJlbWFpbF9yZXF1aXJlZFwiXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB1c2VyID0gZGIudXNlcnMuZmluZE9uZSh7XG4gICAgICAgIF9pZDogdGhpcy51c2VySWRcbiAgICAgIH0pO1xuICAgICAgZW1haWxzID0gdXNlci5lbWFpbHM7XG4gICAgICBlbWFpbHMuZm9yRWFjaChmdW5jdGlvbihlKSB7XG4gICAgICAgIGlmIChlLmFkZHJlc3MgPT09IGVtYWlsKSB7XG4gICAgICAgICAgcmV0dXJuIGUucHJpbWFyeSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGUucHJpbWFyeSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGRiLnVzZXJzLmRpcmVjdC51cGRhdGUoe1xuICAgICAgICBfaWQ6IHRoaXMudXNlcklkXG4gICAgICB9LCB7XG4gICAgICAgICRzZXQ6IHtcbiAgICAgICAgICBlbWFpbHM6IGVtYWlscyxcbiAgICAgICAgICBlbWFpbDogZW1haWxcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBkYi5zcGFjZV91c2Vycy5kaXJlY3QudXBkYXRlKHtcbiAgICAgICAgdXNlcjogdGhpcy51c2VySWRcbiAgICAgIH0sIHtcbiAgICAgICAgJHNldDoge1xuICAgICAgICAgIGVtYWlsOiBlbWFpbFxuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIG11bHRpOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gIH0pO1xufVxuXG5pZiAoTWV0ZW9yLmlzQ2xpZW50KSB7XG4gIFN0ZWVkb3MudXNlcnNfYWRkX2VtYWlsID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHN3YWwoe1xuICAgICAgdGl0bGU6IHQoXCJwcmltYXJ5X2VtYWlsX25lZWRlZFwiKSxcbiAgICAgIHRleHQ6IHQoXCJwcmltYXJ5X2VtYWlsX25lZWRlZF9kZXNjcmlwdGlvblwiKSxcbiAgICAgIHR5cGU6ICdpbnB1dCcsXG4gICAgICBzaG93Q2FuY2VsQnV0dG9uOiBmYWxzZSxcbiAgICAgIGNsb3NlT25Db25maXJtOiBmYWxzZSxcbiAgICAgIGFuaW1hdGlvbjogXCJzbGlkZS1mcm9tLXRvcFwiXG4gICAgfSwgZnVuY3Rpb24oaW5wdXRWYWx1ZSkge1xuICAgICAgcmV0dXJuIE1ldGVvci5jYWxsKFwidXNlcnNfYWRkX2VtYWlsXCIsIGlucHV0VmFsdWUsIGZ1bmN0aW9uKGVycm9yLCByZXN1bHQpIHtcbiAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsID8gcmVzdWx0LmVycm9yIDogdm9pZCAwKSB7XG4gICAgICAgICAgcmV0dXJuIHRvYXN0ci5lcnJvcihyZXN1bHQubWVzc2FnZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHN3YWwodChcInByaW1hcnlfZW1haWxfdXBkYXRlZFwiKSwgXCJcIiwgXCJzdWNjZXNzXCIpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcbn1cblxuXG4vKlxuICAgIFRyYWNrZXIuYXV0b3J1biAoYykgLT5cblxuICAgICAgICBpZiBNZXRlb3IudXNlcigpXG4gICAgICAgICAgaWYgTWV0ZW9yLmxvZ2dpbmdJbigpXG4gICAgICAgICAgICAgKiDmraPlnKjnmbvlvZXkuK3vvIzliJnkuI3lgZrlpITnkIbvvIzlm6DkuLrmraTml7ZNZXRlb3IudXNlcklkKCnkuI3otrPkuo7or4HmmI7lt7LnmbvlvZXnirbmgIFcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIHByaW1hcnlFbWFpbCA9IE1ldGVvci51c2VyKCkuZW1haWxzP1swXT8uYWRkcmVzc1xuICAgICAgICAgIGlmICFwcmltYXJ5RW1haWxcbiAgICAgICAgICAgICAgU3RlZWRvcy51c2Vyc19hZGRfZW1haWwoKTtcbiAqL1xuIiwiaWYgTWV0ZW9yLmlzU2VydmVyXG4gICAgTWV0ZW9yLm1ldGhvZHNcbiAgICAgICAgdXBkYXRlVXNlckF2YXRhcjogKGF2YXRhcikgLT5cbiAgICAgICAgICAgICAgICBpZiBub3QgQHVzZXJJZD9cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblxuXG4gICAgICAgICAgICAgICAgZGIudXNlcnMudXBkYXRlKHtfaWQ6IEB1c2VySWR9LCB7JHNldDoge2F2YXRhcjogYXZhdGFyfX0pICAiLCJpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gIE1ldGVvci5tZXRob2RzKHtcbiAgICB1cGRhdGVVc2VyQXZhdGFyOiBmdW5jdGlvbihhdmF0YXIpIHtcbiAgICAgIGlmICh0aGlzLnVzZXJJZCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkYi51c2Vycy51cGRhdGUoe1xuICAgICAgICBfaWQ6IHRoaXMudXNlcklkXG4gICAgICB9LCB7XG4gICAgICAgICRzZXQ6IHtcbiAgICAgICAgICBhdmF0YXI6IGF2YXRhclxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xufVxuIiwiQWNjb3VudHMuZW1haWxUZW1wbGF0ZXMgPSB7XG5cdGZyb206IChmdW5jdGlvbigpe1xuXHRcdHZhciBkZWZhdWx0RnJvbSA9IFwiU3RlZWRvcyA8bm9yZXBseUBtZXNzYWdlLnN0ZWVkb3MuY29tPlwiO1xuXHRcdGlmKCFNZXRlb3Iuc2V0dGluZ3MpXG5cdFx0XHRyZXR1cm4gZGVmYXVsdEZyb207XG5cdFx0XG5cdFx0aWYoIU1ldGVvci5zZXR0aW5ncy5lbWFpbClcblx0XHRcdHJldHVybiBkZWZhdWx0RnJvbTtcblxuXHRcdGlmKCFNZXRlb3Iuc2V0dGluZ3MuZW1haWwuZnJvbSlcblx0XHRcdHJldHVybiBkZWZhdWx0RnJvbTtcblx0XHRcblx0XHRyZXR1cm4gTWV0ZW9yLnNldHRpbmdzLmVtYWlsLmZyb207XG5cdH0pKCksXG5cdHJlc2V0UGFzc3dvcmQ6IHtcblx0XHRzdWJqZWN0OiBmdW5jdGlvbiAodXNlcikge1xuXHRcdFx0cmV0dXJuIFRBUGkxOG4uX18oXCJ1c2Vyc19lbWFpbF9yZXNldF9wYXNzd29yZFwiLHt9LHVzZXIubG9jYWxlKTtcblx0XHR9LFxuXHRcdHRleHQ6IGZ1bmN0aW9uICh1c2VyLCB1cmwpIHtcblx0XHRcdHZhciBzcGxpdHMgPSB1cmwuc3BsaXQoXCIvXCIpO1xuXHRcdFx0dmFyIHRva2VuQ29kZSA9IHNwbGl0c1tzcGxpdHMubGVuZ3RoLTFdO1xuXHRcdFx0dmFyIGdyZWV0aW5nID0gdXNlci5wcm9maWxlICYmIHVzZXIucHJvZmlsZS5uYW1lID8gVEFQaTE4bi5fXyhcInVzZXJzX2VtYWlsX2hlbGxvXCIse30sdXNlci5sb2NhbGUpICsgdXNlci5wcm9maWxlLm5hbWUgKyBcIixcIiA6IFRBUGkxOG4uX18oXCJ1c2Vyc19lbWFpbF9oZWxsb1wiLHt9LHVzZXIubG9jYWxlKSArIFwiLFwiO1xuXHRcdFx0cmV0dXJuIGdyZWV0aW5nICsgXCJcXG5cXG5cIiArIFRBUGkxOG4uX18oXCJ1c2Vyc19lbWFpbF9yZXNldF9wYXNzd29yZF9ib2R5XCIse3Rva2VuX2NvZGU6dG9rZW5Db2RlfSx1c2VyLmxvY2FsZSkgKyBcIlxcblxcblwiICsgdXJsICsgXCJcXG5cXG5cIiArIFRBUGkxOG4uX18oXCJ1c2Vyc19lbWFpbF90aGFua3NcIix7fSx1c2VyLmxvY2FsZSkgKyBcIlxcblwiO1xuXHRcdH1cblx0fSxcblx0dmVyaWZ5RW1haWw6IHtcblx0XHRzdWJqZWN0OiBmdW5jdGlvbiAodXNlcikge1xuXHRcdFx0cmV0dXJuIFRBUGkxOG4uX18oXCJ1c2Vyc19lbWFpbF92ZXJpZnlfZW1haWxcIix7fSx1c2VyLmxvY2FsZSk7XG5cdFx0fSxcblx0XHR0ZXh0OiBmdW5jdGlvbiAodXNlciwgdXJsKSB7XG5cdFx0XHR2YXIgZ3JlZXRpbmcgPSB1c2VyLnByb2ZpbGUgJiYgdXNlci5wcm9maWxlLm5hbWUgPyBUQVBpMThuLl9fKFwidXNlcnNfZW1haWxfaGVsbG9cIix7fSx1c2VyLmxvY2FsZSkgKyB1c2VyLnByb2ZpbGUubmFtZSArIFwiLFwiIDogVEFQaTE4bi5fXyhcInVzZXJzX2VtYWlsX2hlbGxvXCIse30sdXNlci5sb2NhbGUpICsgXCIsXCI7XG5cdFx0XHRyZXR1cm4gZ3JlZXRpbmcgKyBcIlxcblxcblwiICsgVEFQaTE4bi5fXyhcInVzZXJzX2VtYWlsX3ZlcmlmeV9hY2NvdW50XCIse30sdXNlci5sb2NhbGUpICsgXCJcXG5cXG5cIiArIHVybCArIFwiXFxuXFxuXCIgKyBUQVBpMThuLl9fKFwidXNlcnNfZW1haWxfdGhhbmtzXCIse30sdXNlci5sb2NhbGUpICsgXCJcXG5cIjtcblx0XHR9XG5cdH0sXG5cdGVucm9sbEFjY291bnQ6IHtcblx0XHRzdWJqZWN0OiBmdW5jdGlvbiAodXNlcikge1xuXHRcdFx0cmV0dXJuIFRBUGkxOG4uX18oXCJ1c2Vyc19lbWFpbF9jcmVhdGVfYWNjb3VudFwiLHt9LHVzZXIubG9jYWxlKTtcblx0XHR9LFxuXHRcdHRleHQ6IGZ1bmN0aW9uICh1c2VyLCB1cmwpIHtcblx0XHRcdHZhciBncmVldGluZyA9IHVzZXIucHJvZmlsZSAmJiB1c2VyLnByb2ZpbGUubmFtZSA/IFRBUGkxOG4uX18oXCJ1c2Vyc19lbWFpbF9oZWxsb1wiLHt9LHVzZXIubG9jYWxlKSArIHVzZXIucHJvZmlsZS5uYW1lICsgXCIsXCIgOiBUQVBpMThuLl9fKFwidXNlcnNfZW1haWxfaGVsbG9cIix7fSx1c2VyLmxvY2FsZSkgKyBcIixcIjtcblx0XHRcdHJldHVybiBncmVldGluZyArIFwiXFxuXFxuXCIgKyBUQVBpMThuLl9fKFwidXNlcnNfZW1haWxfc3RhcnRfc2VydmljZVwiLHt9LHVzZXIubG9jYWxlKSArIFwiXFxuXFxuXCIgKyB1cmwgKyBcIlxcblxcblwiICsgVEFQaTE4bi5fXyhcInVzZXJzX2VtYWlsX3RoYW5rc1wiLHt9LHVzZXIubG9jYWxlKSArIFwiXFxuXCI7XG5cdFx0fVxuXHR9XG59OyIsIi8vIOS/ruaUuWZ1bGxuYW1l5YC85pyJ6Zeu6aKY55qEb3JnYW5pemF0aW9uc1xuSnNvblJvdXRlcy5hZGQoXCJnZXRcIiwgXCIvYXBpL29yZ2FuaXphdGlvbnMvdXBncmFkZS9cIiwgZnVuY3Rpb24gKHJlcSwgcmVzLCBuZXh0KSB7XG4gIFxuXHR2YXIgb3JncyA9IGRiLm9yZ2FuaXphdGlvbnMuZmluZCh7ZnVsbG5hbWU6L+aWsOmDqOmXqC8sbmFtZTp7JG5lOlwi5paw6YOo6ZeoXCJ9fSk7XG5cdGlmIChvcmdzLmNvdW50KCk+MClcblx0e1xuXHRcdG9yZ3MuZm9yRWFjaCAoZnVuY3Rpb24gKG9yZylcblx0XHR7XG5cdFx0XHQvLyDoh6rlt7HlkozlrZDpg6jpl6jnmoRmdWxsbmFtZeS/ruaUuVxuXHRcdFx0ZGIub3JnYW5pemF0aW9ucy5kaXJlY3QudXBkYXRlKG9yZy5faWQsIHskc2V0OiB7ZnVsbG5hbWU6IG9yZy5jYWxjdWxhdGVGdWxsbmFtZSgpfX0pO1xuXHRcdFx0XG5cdFx0fSk7XG5cdH1cdFxuXG4gIFx0SnNvblJvdXRlcy5zZW5kUmVzdWx0KHJlcywge1xuICAgIFx0ZGF0YToge1xuXHQgICAgICBcdHJldDogMCxcblx0ICAgICAgXHRtc2c6IFwiU3VjY2Vzc2Z1bGx5XCJcbiAgICBcdH1cbiAgXHR9KTtcbn0pO1xuXG4iLCJpZiBNZXRlb3IuaXNDb3Jkb3ZhXG4gICAgICAgIE1ldGVvci5zdGFydHVwIC0+XG4gICAgICAgICAgICAgICAgUHVzaC5Db25maWd1cmVcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRlcklEOiB3aW5kb3cuQU5EUk9JRF9TRU5ERVJfSURcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291bmQ6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlicmF0ZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgaW9zOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWRnZTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckJhZGdlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZXJ0OiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBOYW1lOiBcIndvcmtmbG93XCJcbiIsImlmIChNZXRlb3IuaXNDb3Jkb3ZhKSB7XG4gIE1ldGVvci5zdGFydHVwKGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBQdXNoLkNvbmZpZ3VyZSh7XG4gICAgICBhbmRyb2lkOiB7XG4gICAgICAgIHNlbmRlcklEOiB3aW5kb3cuQU5EUk9JRF9TRU5ERVJfSUQsXG4gICAgICAgIHNvdW5kOiB0cnVlLFxuICAgICAgICB2aWJyYXRlOiB0cnVlXG4gICAgICB9LFxuICAgICAgaW9zOiB7XG4gICAgICAgIGJhZGdlOiB0cnVlLFxuICAgICAgICBjbGVhckJhZGdlOiB0cnVlLFxuICAgICAgICBzb3VuZDogdHJ1ZSxcbiAgICAgICAgYWxlcnQ6IHRydWVcbiAgICAgIH0sXG4gICAgICBhcHBOYW1lOiBcIndvcmtmbG93XCJcbiAgICB9KTtcbiAgfSk7XG59XG4iLCJTZWxlY3RvciA9IHt9XG5cbiMgRmlsdGVyIGRhdGEgb24gc2VydmVyIGJ5IHNwYWNlIGZpZWxkXG5TZWxlY3Rvci5zZWxlY3RvckNoZWNrU3BhY2VBZG1pbiA9ICh1c2VySWQpIC0+XG5cdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdHVzZXJJZCA9IE1ldGVvci51c2VySWQoKVxuXHRcdHVubGVzcyB1c2VySWRcblx0XHRcdHJldHVybiB7X2lkOiAtMX1cblx0XHRpZiBTdGVlZG9zLmlzU3BhY2VBZG1pbigpXG5cdFx0XHRyZXR1cm4ge3NwYWNlOiBTZXNzaW9uLmdldChcInNwYWNlSWRcIil9XG5cdFx0ZWxzZVxuXHRcdFx0cmV0dXJuIHtfaWQ6IC0xfVxuXG5cdGlmIE1ldGVvci5pc1NlcnZlclxuXHRcdHVubGVzcyB1c2VySWRcblx0XHRcdHJldHVybiB7X2lkOiAtMX1cblx0XHR1c2VyID0gZGIudXNlcnMuZmluZE9uZSh1c2VySWQsIHtmaWVsZHM6IHtpc19jbG91ZGFkbWluOiAxfX0pXG5cdFx0aWYgIXVzZXJcblx0XHRcdHJldHVybiB7X2lkOiAtMX1cblx0XHRzZWxlY3RvciA9IHt9XG5cdFx0aWYgIXVzZXIuaXNfY2xvdWRhZG1pblxuXHRcdFx0c3BhY2VzID0gZGIuc3BhY2VzLmZpbmQoe2FkbWluczp7JGluOlt1c2VySWRdfX0sIHtmaWVsZHM6IHtfaWQ6IDF9fSkuZmV0Y2goKVxuXHRcdFx0c3BhY2VzID0gc3BhY2VzLm1hcCAobikgLT4gcmV0dXJuIG4uX2lkXG5cdFx0XHRzZWxlY3Rvci5zcGFjZSA9IHskaW46IHNwYWNlc31cblx0XHRyZXR1cm4gc2VsZWN0b3JcblxuIyBGaWx0ZXIgZGF0YSBvbiBzZXJ2ZXIgYnkgc3BhY2UgZmllbGRcblNlbGVjdG9yLnNlbGVjdG9yQ2hlY2tTcGFjZSA9ICh1c2VySWQpIC0+XG5cdGlmIE1ldGVvci5pc0NsaWVudFxuXHRcdHVzZXJJZCA9IE1ldGVvci51c2VySWQoKVxuXHRcdHVubGVzcyB1c2VySWRcblx0XHRcdHJldHVybiB7X2lkOiAtMX1cblx0XHRzcGFjZUlkID0gU2Vzc2lvbi5nZXQoXCJzcGFjZUlkXCIpO1xuXHRcdGlmIHNwYWNlSWRcblx0XHRcdGlmIGRiLnNwYWNlX3VzZXJzLmZpbmRPbmUoe3VzZXI6IHVzZXJJZCxzcGFjZTogc3BhY2VJZH0sIHtmaWVsZHM6IHtfaWQ6IDF9fSlcblx0XHRcdFx0cmV0dXJuIHtzcGFjZTogc3BhY2VJZH1cblx0XHRcdGVsc2Vcblx0XHRcdFx0cmV0dXJuIHtfaWQ6IC0xfVxuXHRcdGVsc2Vcblx0XHRcdHJldHVybiB7X2lkOiAtMX1cblxuXHRpZiBNZXRlb3IuaXNTZXJ2ZXJcblx0XHR1bmxlc3MgdXNlcklkXG5cdFx0XHRyZXR1cm4ge19pZDogLTF9XG5cdFx0dXNlciA9IGRiLnVzZXJzLmZpbmRPbmUodXNlcklkLCB7ZmllbGRzOiB7X2lkOiAxfX0pXG5cdFx0aWYgIXVzZXJcblx0XHRcdHJldHVybiB7X2lkOiAtMX1cblx0XHRzZWxlY3RvciA9IHt9XG5cdFx0c3BhY2VfdXNlcnMgPSBkYi5zcGFjZV91c2Vycy5maW5kKHt1c2VyOiB1c2VySWR9LCB7ZmllbGRzOiB7c3BhY2U6IDF9fSkuZmV0Y2goKVxuXHRcdHNwYWNlcyA9IFtdXG5cdFx0Xy5lYWNoIHNwYWNlX3VzZXJzLCAodSktPlxuXHRcdFx0c3BhY2VzLnB1c2godS5zcGFjZSlcblx0XHRzZWxlY3Rvci5zcGFjZSA9IHskaW46IHNwYWNlc31cblx0XHRyZXR1cm4gc2VsZWN0b3JcblxuZGIuYmlsbGluZ19wYXlfcmVjb3Jkcy5hZG1pbkNvbmZpZyA9XG5cdGljb246IFwiZ2xvYmVcIlxuXHRjb2xvcjogXCJibHVlXCJcblx0dGFibGVDb2x1bW5zOiBbXG5cdFx0e25hbWU6IFwib3JkZXJfY3JlYXRlZCgpXCJ9LFxuXHRcdHtuYW1lOiBcIm1vZHVsZXNcIn0sXG5cdFx0e25hbWU6IFwidXNlcl9jb3VudFwifSxcblx0XHR7bmFtZTogXCJlbmRfZGF0ZVwifSxcblx0XHR7bmFtZTogXCJvcmRlcl90b3RhbF9mZWUoKVwifSxcblx0XHR7bmFtZTogXCJvcmRlcl9wYWlkKClcIn1cblx0XVxuXHRleHRyYUZpZWxkczogW1wic3BhY2VcIiwgXCJjcmVhdGVkXCIsIFwicGFpZFwiLCBcInRvdGFsX2ZlZVwiXVxuXHRyb3V0ZXJBZG1pbjogXCIvYWRtaW5cIlxuXHRzZWxlY3RvcjogKHVzZXJJZCkgLT5cblx0XHRpZiBNZXRlb3IuaXNDbGllbnRcblx0XHRcdGlmIFN0ZWVkb3MuaXNTcGFjZUFkbWluKClcblx0XHRcdFx0cmV0dXJuIHtzcGFjZTogU2Vzc2lvbi5nZXQoXCJzcGFjZUlkXCIpLCBwYWlkOiB0cnVlfVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRyZXR1cm4ge19pZDogLTF9XG5cblx0XHRpZiBNZXRlb3IuaXNTZXJ2ZXJcblx0XHRcdHJldHVybiB7fVxuXHRzaG93RWRpdENvbHVtbjogZmFsc2Vcblx0c2hvd0RlbENvbHVtbjogZmFsc2Vcblx0ZGlzYWJsZUFkZDogdHJ1ZVxuXHRwYWdlTGVuZ3RoOiAxMDBcblx0b3JkZXI6IFtbMCwgXCJkZXNjXCJdXVxuXG5NZXRlb3Iuc3RhcnR1cCAtPlxuXHRAc3BhY2VfdXNlcl9zaWducyA9IGRiLnNwYWNlX3VzZXJfc2lnbnNcblx0QGJpbGxpbmdfcGF5X3JlY29yZHMgPSBkYi5iaWxsaW5nX3BheV9yZWNvcmRzXG5cdEFkbWluQ29uZmlnPy5jb2xsZWN0aW9uc19hZGRcblx0XHRzcGFjZV91c2VyX3NpZ25zOiBkYi5zcGFjZV91c2VyX3NpZ25zLmFkbWluQ29uZmlnXG5cdFx0YmlsbGluZ19wYXlfcmVjb3JkczogZGIuYmlsbGluZ19wYXlfcmVjb3Jkcy5hZG1pbkNvbmZpZyIsIiAgICAgICAgICAgICBcblxuU2VsZWN0b3IgPSB7fTtcblxuU2VsZWN0b3Iuc2VsZWN0b3JDaGVja1NwYWNlQWRtaW4gPSBmdW5jdGlvbih1c2VySWQpIHtcbiAgdmFyIHNlbGVjdG9yLCBzcGFjZXMsIHVzZXI7XG4gIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICB1c2VySWQgPSBNZXRlb3IudXNlcklkKCk7XG4gICAgaWYgKCF1c2VySWQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF9pZDogLTFcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChTdGVlZG9zLmlzU3BhY2VBZG1pbigpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzcGFjZTogU2Vzc2lvbi5nZXQoXCJzcGFjZUlkXCIpXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBfaWQ6IC0xXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gICAgaWYgKCF1c2VySWQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF9pZDogLTFcbiAgICAgIH07XG4gICAgfVxuICAgIHVzZXIgPSBkYi51c2Vycy5maW5kT25lKHVzZXJJZCwge1xuICAgICAgZmllbGRzOiB7XG4gICAgICAgIGlzX2Nsb3VkYWRtaW46IDFcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoIXVzZXIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF9pZDogLTFcbiAgICAgIH07XG4gICAgfVxuICAgIHNlbGVjdG9yID0ge307XG4gICAgaWYgKCF1c2VyLmlzX2Nsb3VkYWRtaW4pIHtcbiAgICAgIHNwYWNlcyA9IGRiLnNwYWNlcy5maW5kKHtcbiAgICAgICAgYWRtaW5zOiB7XG4gICAgICAgICAgJGluOiBbdXNlcklkXVxuICAgICAgICB9XG4gICAgICB9LCB7XG4gICAgICAgIGZpZWxkczoge1xuICAgICAgICAgIF9pZDogMVxuICAgICAgICB9XG4gICAgICB9KS5mZXRjaCgpO1xuICAgICAgc3BhY2VzID0gc3BhY2VzLm1hcChmdW5jdGlvbihuKSB7XG4gICAgICAgIHJldHVybiBuLl9pZDtcbiAgICAgIH0pO1xuICAgICAgc2VsZWN0b3Iuc3BhY2UgPSB7XG4gICAgICAgICRpbjogc3BhY2VzXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gc2VsZWN0b3I7XG4gIH1cbn07XG5cblNlbGVjdG9yLnNlbGVjdG9yQ2hlY2tTcGFjZSA9IGZ1bmN0aW9uKHVzZXJJZCkge1xuICB2YXIgc2VsZWN0b3IsIHNwYWNlSWQsIHNwYWNlX3VzZXJzLCBzcGFjZXMsIHVzZXI7XG4gIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbiAgICB1c2VySWQgPSBNZXRlb3IudXNlcklkKCk7XG4gICAgaWYgKCF1c2VySWQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF9pZDogLTFcbiAgICAgIH07XG4gICAgfVxuICAgIHNwYWNlSWQgPSBTZXNzaW9uLmdldChcInNwYWNlSWRcIik7XG4gICAgaWYgKHNwYWNlSWQpIHtcbiAgICAgIGlmIChkYi5zcGFjZV91c2Vycy5maW5kT25lKHtcbiAgICAgICAgdXNlcjogdXNlcklkLFxuICAgICAgICBzcGFjZTogc3BhY2VJZFxuICAgICAgfSwge1xuICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICBfaWQ6IDFcbiAgICAgICAgfVxuICAgICAgfSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzcGFjZTogc3BhY2VJZFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBfaWQ6IC0xXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIF9pZDogLTFcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIGlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbiAgICBpZiAoIXVzZXJJZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgX2lkOiAtMVxuICAgICAgfTtcbiAgICB9XG4gICAgdXNlciA9IGRiLnVzZXJzLmZpbmRPbmUodXNlcklkLCB7XG4gICAgICBmaWVsZHM6IHtcbiAgICAgICAgX2lkOiAxXG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKCF1c2VyKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBfaWQ6IC0xXG4gICAgICB9O1xuICAgIH1cbiAgICBzZWxlY3RvciA9IHt9O1xuICAgIHNwYWNlX3VzZXJzID0gZGIuc3BhY2VfdXNlcnMuZmluZCh7XG4gICAgICB1c2VyOiB1c2VySWRcbiAgICB9LCB7XG4gICAgICBmaWVsZHM6IHtcbiAgICAgICAgc3BhY2U6IDFcbiAgICAgIH1cbiAgICB9KS5mZXRjaCgpO1xuICAgIHNwYWNlcyA9IFtdO1xuICAgIF8uZWFjaChzcGFjZV91c2VycywgZnVuY3Rpb24odSkge1xuICAgICAgcmV0dXJuIHNwYWNlcy5wdXNoKHUuc3BhY2UpO1xuICAgIH0pO1xuICAgIHNlbGVjdG9yLnNwYWNlID0ge1xuICAgICAgJGluOiBzcGFjZXNcbiAgICB9O1xuICAgIHJldHVybiBzZWxlY3RvcjtcbiAgfVxufTtcblxuZGIuYmlsbGluZ19wYXlfcmVjb3Jkcy5hZG1pbkNvbmZpZyA9IHtcbiAgaWNvbjogXCJnbG9iZVwiLFxuICBjb2xvcjogXCJibHVlXCIsXG4gIHRhYmxlQ29sdW1uczogW1xuICAgIHtcbiAgICAgIG5hbWU6IFwib3JkZXJfY3JlYXRlZCgpXCJcbiAgICB9LCB7XG4gICAgICBuYW1lOiBcIm1vZHVsZXNcIlxuICAgIH0sIHtcbiAgICAgIG5hbWU6IFwidXNlcl9jb3VudFwiXG4gICAgfSwge1xuICAgICAgbmFtZTogXCJlbmRfZGF0ZVwiXG4gICAgfSwge1xuICAgICAgbmFtZTogXCJvcmRlcl90b3RhbF9mZWUoKVwiXG4gICAgfSwge1xuICAgICAgbmFtZTogXCJvcmRlcl9wYWlkKClcIlxuICAgIH1cbiAgXSxcbiAgZXh0cmFGaWVsZHM6IFtcInNwYWNlXCIsIFwiY3JlYXRlZFwiLCBcInBhaWRcIiwgXCJ0b3RhbF9mZWVcIl0sXG4gIHJvdXRlckFkbWluOiBcIi9hZG1pblwiLFxuICBzZWxlY3RvcjogZnVuY3Rpb24odXNlcklkKSB7XG4gICAgaWYgKE1ldGVvci5pc0NsaWVudCkge1xuICAgICAgaWYgKFN0ZWVkb3MuaXNTcGFjZUFkbWluKCkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzcGFjZTogU2Vzc2lvbi5nZXQoXCJzcGFjZUlkXCIpLFxuICAgICAgICAgIHBhaWQ6IHRydWVcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgX2lkOiAtMVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoTWV0ZW9yLmlzU2VydmVyKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICB9LFxuICBzaG93RWRpdENvbHVtbjogZmFsc2UsXG4gIHNob3dEZWxDb2x1bW46IGZhbHNlLFxuICBkaXNhYmxlQWRkOiB0cnVlLFxuICBwYWdlTGVuZ3RoOiAxMDAsXG4gIG9yZGVyOiBbWzAsIFwiZGVzY1wiXV1cbn07XG5cbk1ldGVvci5zdGFydHVwKGZ1bmN0aW9uKCkge1xuICB0aGlzLnNwYWNlX3VzZXJfc2lnbnMgPSBkYi5zcGFjZV91c2VyX3NpZ25zO1xuICB0aGlzLmJpbGxpbmdfcGF5X3JlY29yZHMgPSBkYi5iaWxsaW5nX3BheV9yZWNvcmRzO1xuICByZXR1cm4gdHlwZW9mIEFkbWluQ29uZmlnICE9PSBcInVuZGVmaW5lZFwiICYmIEFkbWluQ29uZmlnICE9PSBudWxsID8gQWRtaW5Db25maWcuY29sbGVjdGlvbnNfYWRkKHtcbiAgICBzcGFjZV91c2VyX3NpZ25zOiBkYi5zcGFjZV91c2VyX3NpZ25zLmFkbWluQ29uZmlnLFxuICAgIGJpbGxpbmdfcGF5X3JlY29yZHM6IGRiLmJpbGxpbmdfcGF5X3JlY29yZHMuYWRtaW5Db25maWdcbiAgfSkgOiB2b2lkIDA7XG59KTtcbiIsImlmICghW10uaW5jbHVkZXMpIHtcbiAgQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzID0gZnVuY3Rpb24oc2VhcmNoRWxlbWVudCAvKiwgZnJvbUluZGV4Ki8gKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuICAgIHZhciBPID0gT2JqZWN0KHRoaXMpO1xuICAgIHZhciBsZW4gPSBwYXJzZUludChPLmxlbmd0aCkgfHwgMDtcbiAgICBpZiAobGVuID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciBuID0gcGFyc2VJbnQoYXJndW1lbnRzWzFdKSB8fCAwO1xuICAgIHZhciBrO1xuICAgIGlmIChuID49IDApIHtcbiAgICAgIGsgPSBuO1xuICAgIH0gZWxzZSB7XG4gICAgICBrID0gbGVuICsgbjtcbiAgICAgIGlmIChrIDwgMCkge2sgPSAwO31cbiAgICB9XG4gICAgdmFyIGN1cnJlbnRFbGVtZW50O1xuICAgIHdoaWxlIChrIDwgbGVuKSB7XG4gICAgICBjdXJyZW50RWxlbWVudCA9IE9ba107XG4gICAgICBpZiAoc2VhcmNoRWxlbWVudCA9PT0gY3VycmVudEVsZW1lbnQgfHxcbiAgICAgICAgIChzZWFyY2hFbGVtZW50ICE9PSBzZWFyY2hFbGVtZW50ICYmIGN1cnJlbnRFbGVtZW50ICE9PSBjdXJyZW50RWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBrKys7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcbn0iLCJNZXRlb3Iuc3RhcnR1cCAtPlxuICBTdGVlZG9zLnNldHRpbmdzLndlYnNlcnZpY2VzID0gTWV0ZW9yLnNldHRpbmdzLnB1YmxpYy53ZWJzZXJ2aWNlc1xuXG4gIGlmICFTdGVlZG9zLnNldHRpbmdzLndlYnNlcnZpY2VzXG4gICAgU3RlZWRvcy5zZXR0aW5ncy53ZWJzZXJ2aWNlcyA9XG4gICAgICB3d3c6IFxuICAgICAgICBzdGF0dXM6IFwiYWN0aXZlXCIsXG4gICAgICAgIHVybDogXCIvXCIiLCJNZXRlb3Iuc3RhcnR1cChmdW5jdGlvbigpIHtcbiAgU3RlZWRvcy5zZXR0aW5ncy53ZWJzZXJ2aWNlcyA9IE1ldGVvci5zZXR0aW5nc1tcInB1YmxpY1wiXS53ZWJzZXJ2aWNlcztcbiAgaWYgKCFTdGVlZG9zLnNldHRpbmdzLndlYnNlcnZpY2VzKSB7XG4gICAgcmV0dXJuIFN0ZWVkb3Muc2V0dGluZ3Mud2Vic2VydmljZXMgPSB7XG4gICAgICB3d3c6IHtcbiAgICAgICAgc3RhdHVzOiBcImFjdGl2ZVwiLFxuICAgICAgICB1cmw6IFwiL1wiXG4gICAgICB9XG4gICAgfTtcbiAgfVxufSk7XG4iLCJDcmVhdG9yLmdldFVzZXJPYmplY3RzTGlzdFZpZXdzID0gKHVzZXJJZCwgc3BhY2VJZCwgb2JqZWN0cyktPlxuXHRsaXN0Vmlld3MgPSB7fVxuXG5cdGtleXMgPSBfLmtleXMob2JqZWN0cylcblxuXHRvYmplY3RzVmlld3MgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oXCJvYmplY3RfbGlzdHZpZXdzXCIpLmZpbmQoe1xuXHRcdG9iamVjdF9uYW1lOiB7JGluOiBrZXlzfSxcblx0XHRzcGFjZTogc3BhY2VJZCxcblx0XHRcIiRvclwiOiBbe293bmVyOiB1c2VySWR9LCB7c2hhcmVkOiB0cnVlfV1cblx0fSwge1xuXHRcdGZpZWxkczoge1xuXHRcdFx0Y3JlYXRlZDogMCxcblx0XHRcdG1vZGlmaWVkOiAwLFxuXHRcdFx0Y3JlYXRlZF9ieTogMCxcblx0XHRcdG1vZGlmaWVkX2J5OiAwXG5cdFx0fVxuXHR9KS5mZXRjaCgpXG5cblx0X2dldFVzZXJPYmplY3RMaXN0Vmlld3MgPSAob2JqZWN0X25hbWUpLT5cblx0XHRfdXNlcl9vYmplY3RfbGlzdF92aWV3cyA9IHt9XG5cdFx0b2xpc3RWaWV3cyA9IF8uZmlsdGVyIG9iamVjdHNWaWV3cywgKG92KS0+XG5cdFx0XHRyZXR1cm4gb3Yub2JqZWN0X25hbWUgPT0gb2JqZWN0X25hbWVcblxuXHRcdF8uZWFjaCBvbGlzdFZpZXdzLCAobGlzdHZpZXcpLT5cblx0XHRcdF91c2VyX29iamVjdF9saXN0X3ZpZXdzW2xpc3R2aWV3Ll9pZF0gPSBsaXN0dmlld1xuXG5cdFx0cmV0dXJuIF91c2VyX29iamVjdF9saXN0X3ZpZXdzXG5cblx0Xy5mb3JFYWNoIG9iamVjdHMsIChvLCBrZXkpLT5cblx0XHRsaXN0X3ZpZXcgPSBfZ2V0VXNlck9iamVjdExpc3RWaWV3cyhrZXkpXG5cdFx0aWYgIV8uaXNFbXB0eShsaXN0X3ZpZXcpXG5cdFx0XHRsaXN0Vmlld3Nba2V5XSA9IGxpc3Rfdmlld1xuXHRyZXR1cm4gbGlzdFZpZXdzXG5cblxuQ3JlYXRvci5nZXRVc2VyT2JqZWN0TGlzdFZpZXdzID0gKHVzZXJJZCwgc3BhY2VJZCwgb2JqZWN0X25hbWUpLT5cblx0X3VzZXJfb2JqZWN0X2xpc3Rfdmlld3MgPSB7fVxuXG5cdG9iamVjdF9saXN0dmlldyA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcIm9iamVjdF9saXN0dmlld3NcIikuZmluZCh7XG5cdFx0b2JqZWN0X25hbWU6IG9iamVjdF9uYW1lLFxuXHRcdHNwYWNlOiBzcGFjZUlkLFxuXHRcdFwiJG9yXCI6IFt7b3duZXI6IHVzZXJJZH0sIHtzaGFyZWQ6IHRydWV9XVxuXHR9LCB7XG5cdFx0ZmllbGRzOiB7XG5cdFx0XHRjcmVhdGVkOiAwLFxuXHRcdFx0bW9kaWZpZWQ6IDAsXG5cdFx0XHRjcmVhdGVkX2J5OiAwLFxuXHRcdFx0bW9kaWZpZWRfYnk6IDBcblx0XHR9XG5cdH0pXG5cblx0b2JqZWN0X2xpc3R2aWV3LmZvckVhY2ggKGxpc3R2aWV3KS0+XG5cdFx0X3VzZXJfb2JqZWN0X2xpc3Rfdmlld3NbbGlzdHZpZXcuX2lkXSA9IGxpc3R2aWV3XG5cblx0cmV0dXJuIF91c2VyX29iamVjdF9saXN0X3ZpZXdzXG5cblxuXG5cbiIsIkNyZWF0b3IuZ2V0VXNlck9iamVjdHNMaXN0Vmlld3MgPSBmdW5jdGlvbih1c2VySWQsIHNwYWNlSWQsIG9iamVjdHMpIHtcbiAgdmFyIF9nZXRVc2VyT2JqZWN0TGlzdFZpZXdzLCBrZXlzLCBsaXN0Vmlld3MsIG9iamVjdHNWaWV3cztcbiAgbGlzdFZpZXdzID0ge307XG4gIGtleXMgPSBfLmtleXMob2JqZWN0cyk7XG4gIG9iamVjdHNWaWV3cyA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcIm9iamVjdF9saXN0dmlld3NcIikuZmluZCh7XG4gICAgb2JqZWN0X25hbWU6IHtcbiAgICAgICRpbjoga2V5c1xuICAgIH0sXG4gICAgc3BhY2U6IHNwYWNlSWQsXG4gICAgXCIkb3JcIjogW1xuICAgICAge1xuICAgICAgICBvd25lcjogdXNlcklkXG4gICAgICB9LCB7XG4gICAgICAgIHNoYXJlZDogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSwge1xuICAgIGZpZWxkczoge1xuICAgICAgY3JlYXRlZDogMCxcbiAgICAgIG1vZGlmaWVkOiAwLFxuICAgICAgY3JlYXRlZF9ieTogMCxcbiAgICAgIG1vZGlmaWVkX2J5OiAwXG4gICAgfVxuICB9KS5mZXRjaCgpO1xuICBfZ2V0VXNlck9iamVjdExpc3RWaWV3cyA9IGZ1bmN0aW9uKG9iamVjdF9uYW1lKSB7XG4gICAgdmFyIF91c2VyX29iamVjdF9saXN0X3ZpZXdzLCBvbGlzdFZpZXdzO1xuICAgIF91c2VyX29iamVjdF9saXN0X3ZpZXdzID0ge307XG4gICAgb2xpc3RWaWV3cyA9IF8uZmlsdGVyKG9iamVjdHNWaWV3cywgZnVuY3Rpb24ob3YpIHtcbiAgICAgIHJldHVybiBvdi5vYmplY3RfbmFtZSA9PT0gb2JqZWN0X25hbWU7XG4gICAgfSk7XG4gICAgXy5lYWNoKG9saXN0Vmlld3MsIGZ1bmN0aW9uKGxpc3R2aWV3KSB7XG4gICAgICByZXR1cm4gX3VzZXJfb2JqZWN0X2xpc3Rfdmlld3NbbGlzdHZpZXcuX2lkXSA9IGxpc3R2aWV3O1xuICAgIH0pO1xuICAgIHJldHVybiBfdXNlcl9vYmplY3RfbGlzdF92aWV3cztcbiAgfTtcbiAgXy5mb3JFYWNoKG9iamVjdHMsIGZ1bmN0aW9uKG8sIGtleSkge1xuICAgIHZhciBsaXN0X3ZpZXc7XG4gICAgbGlzdF92aWV3ID0gX2dldFVzZXJPYmplY3RMaXN0Vmlld3Moa2V5KTtcbiAgICBpZiAoIV8uaXNFbXB0eShsaXN0X3ZpZXcpKSB7XG4gICAgICByZXR1cm4gbGlzdFZpZXdzW2tleV0gPSBsaXN0X3ZpZXc7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGxpc3RWaWV3cztcbn07XG5cbkNyZWF0b3IuZ2V0VXNlck9iamVjdExpc3RWaWV3cyA9IGZ1bmN0aW9uKHVzZXJJZCwgc3BhY2VJZCwgb2JqZWN0X25hbWUpIHtcbiAgdmFyIF91c2VyX29iamVjdF9saXN0X3ZpZXdzLCBvYmplY3RfbGlzdHZpZXc7XG4gIF91c2VyX29iamVjdF9saXN0X3ZpZXdzID0ge307XG4gIG9iamVjdF9saXN0dmlldyA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbihcIm9iamVjdF9saXN0dmlld3NcIikuZmluZCh7XG4gICAgb2JqZWN0X25hbWU6IG9iamVjdF9uYW1lLFxuICAgIHNwYWNlOiBzcGFjZUlkLFxuICAgIFwiJG9yXCI6IFtcbiAgICAgIHtcbiAgICAgICAgb3duZXI6IHVzZXJJZFxuICAgICAgfSwge1xuICAgICAgICBzaGFyZWQ6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sIHtcbiAgICBmaWVsZHM6IHtcbiAgICAgIGNyZWF0ZWQ6IDAsXG4gICAgICBtb2RpZmllZDogMCxcbiAgICAgIGNyZWF0ZWRfYnk6IDAsXG4gICAgICBtb2RpZmllZF9ieTogMFxuICAgIH1cbiAgfSk7XG4gIG9iamVjdF9saXN0dmlldy5mb3JFYWNoKGZ1bmN0aW9uKGxpc3R2aWV3KSB7XG4gICAgcmV0dXJuIF91c2VyX29iamVjdF9saXN0X3ZpZXdzW2xpc3R2aWV3Ll9pZF0gPSBsaXN0dmlldztcbiAgfSk7XG4gIHJldHVybiBfdXNlcl9vYmplY3RfbGlzdF92aWV3cztcbn07XG4iLCIvLyBTZXJ2ZXJTZXNzaW9uID0gKGZ1bmN0aW9uICgpIHtcbi8vICAgJ3VzZSBzdHJpY3QnO1xuXG4vLyAgIHZhciBDb2xsZWN0aW9uID0gbmV3IE1vbmdvLkNvbGxlY3Rpb24oJ3NlcnZlcl9zZXNzaW9ucycpO1xuXG4vLyAgIHZhciBjaGVja0ZvcktleSA9IGZ1bmN0aW9uIChrZXkpIHtcbi8vICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ3VuZGVmaW5lZCcpIHtcbi8vICAgICAgIHRocm93IG5ldyBFcnJvcignUGxlYXNlIHByb3ZpZGUgYSBrZXkhJyk7XG4vLyAgICAgfVxuLy8gICB9O1xuLy8gICB2YXIgZ2V0U2Vzc2lvblZhbHVlID0gZnVuY3Rpb24gKG9iaiwga2V5KSB7XG4vLyAgICAgcmV0dXJuIG9iaiAmJiBvYmoudmFsdWVzICYmIG9iai52YWx1ZXNba2V5XTtcbi8vICAgfTtcbi8vICAgdmFyIGNvbmRpdGlvbiA9IGZ1bmN0aW9uICgpIHtcbi8vICAgICByZXR1cm4gdHJ1ZTtcbi8vICAgfTtcblxuLy8gICBDb2xsZWN0aW9uLmRlbnkoe1xuLy8gICAgICdpbnNlcnQnOiBmdW5jdGlvbiAoKSB7XG4vLyAgICAgICByZXR1cm4gdHJ1ZTtcbi8vICAgICB9LFxuLy8gICAgICd1cGRhdGUnIDogZnVuY3Rpb24gKCkge1xuLy8gICAgICAgcmV0dXJuIHRydWU7XG4vLyAgICAgfSxcbi8vICAgICAncmVtb3ZlJzogZnVuY3Rpb24gKCkge1xuLy8gICAgICAgcmV0dXJuIHRydWU7XG4vLyAgICAgfVxuLy8gICB9KTtcblxuLy8gICAvLyBwdWJsaWMgY2xpZW50IGFuZCBzZXJ2ZXIgYXBpXG4vLyAgIHZhciBhcGkgPSB7XG4vLyAgICAgJ2dldCc6IGZ1bmN0aW9uIChrZXkpIHtcbi8vICAgICAgIGNvbnNvbGUubG9nKENvbGxlY3Rpb24uZmluZE9uZSgpKTtcbi8vICAgICAgIHZhciBzZXNzaW9uT2JqID0gQ29sbGVjdGlvbi5maW5kT25lKCk7XG4vLyAgICAgICBpZihNZXRlb3IuaXNTZXJ2ZXIpe1xuLy8gICAgICAgICBNZXRlb3IuY2FsbCgnc2VydmVyLXNlc3Npb24vZ2V0Jyk7XG4vLyAgICAgICB9XG4vLyAgICAgICAvLyB2YXIgc2Vzc2lvbk9iaiA9IE1ldGVvci5pc1NlcnZlciA/IFxuLy8gICAgICAgLy8gICBNZXRlb3IuY2FsbCgnc2VydmVyLXNlc3Npb24vZ2V0JykgOiBDb2xsZWN0aW9uLmZpbmRPbmUoKTtcbi8vICAgICAgIHJldHVybiBnZXRTZXNzaW9uVmFsdWUoc2Vzc2lvbk9iaiwga2V5KTtcbi8vICAgICB9LFxuLy8gICAgICdlcXVhbHMnOiBmdW5jdGlvbiAoa2V5LCBleHBlY3RlZCwgaWRlbnRpY2FsKSB7XG4vLyAgICAgICB2YXIgc2Vzc2lvbk9iaiA9IE1ldGVvci5pc1NlcnZlciA/IFxuLy8gICAgICAgICBNZXRlb3IuY2FsbCgnc2VydmVyLXNlc3Npb24vZ2V0JykgOiBDb2xsZWN0aW9uLmZpbmRPbmUoKTtcblxuLy8gICAgICAgdmFyIHZhbHVlID0gZ2V0U2Vzc2lvblZhbHVlKHNlc3Npb25PYmosIGtleSk7XG5cbi8vICAgICAgIGlmIChfLmlzT2JqZWN0KHZhbHVlKSAmJiBfLmlzT2JqZWN0KGV4cGVjdGVkKSkge1xuLy8gICAgICAgICByZXR1cm4gXyh2YWx1ZSkuaXNFcXVhbChleHBlY3RlZCk7XG4vLyAgICAgICB9XG5cbi8vICAgICAgIGlmIChpZGVudGljYWwgPT0gZmFsc2UpIHtcbi8vICAgICAgICAgcmV0dXJuIGV4cGVjdGVkID09IHZhbHVlO1xuLy8gICAgICAgfVxuXG4vLyAgICAgICByZXR1cm4gZXhwZWN0ZWQgPT09IHZhbHVlO1xuLy8gICAgIH1cbi8vICAgfTtcblxuLy8gICBNZXRlb3Iuc3RhcnR1cChmdW5jdGlvbigpe1xuLy8gICAgIGlmIChNZXRlb3IuaXNDbGllbnQpIHtcbi8vICAgICAgIFRyYWNrZXIuYXV0b3J1bihmdW5jdGlvbigpe1xuLy8gICAgICAgICBpZihNZXRlb3IudXNlcklkKCkpe1xuLy8gICAgICAgICAgIE1ldGVvci5zdWJzY3JpYmUoJ3NlcnZlci1zZXNzaW9uJyk7XG4vLyAgICAgICAgIH1cbi8vICAgICAgIH0pXG4vLyAgICAgfVxuLy8gICB9KVxuXG4vLyAgIGlmIChNZXRlb3IuaXNTZXJ2ZXIpIHtcbi8vICAgICAvLyBNZXRlb3Iuc3RhcnR1cChmdW5jdGlvbiAoKSB7XG4vLyAgICAgLy8gICBpZiAoQ29sbGVjdGlvbi5maW5kT25lKCkpIHtcbi8vICAgICAvLyAgICAgQ29sbGVjdGlvbi5yZW1vdmUoe30pOyAvLyBjbGVhciBvdXQgYWxsIHN0YWxlIHNlc3Npb25zXG4vLyAgICAgLy8gICB9XG4vLyAgICAgLy8gfSk7XG5cbi8vICAgICBNZXRlb3Iub25Db25uZWN0aW9uKGZ1bmN0aW9uIChjb25uZWN0aW9uKSB7XG4vLyAgICAgICB2YXIgY2xpZW50SUQgPSBjb25uZWN0aW9uLmlkO1xuXG4vLyAgICAgICBpZiAoIUNvbGxlY3Rpb24uZmluZE9uZSh7ICdjbGllbnRJRCc6IGNsaWVudElEIH0pKSB7XG4vLyAgICAgICAgIENvbGxlY3Rpb24uaW5zZXJ0KHsgJ2NsaWVudElEJzogY2xpZW50SUQsICd2YWx1ZXMnOiB7fSwgXCJjcmVhdGVkXCI6IG5ldyBEYXRlKCkgfSk7XG4vLyAgICAgICB9XG5cbi8vICAgICAgIGNvbm5lY3Rpb24ub25DbG9zZShmdW5jdGlvbiAoKSB7XG4vLyAgICAgICAgIENvbGxlY3Rpb24ucmVtb3ZlKHsgJ2NsaWVudElEJzogY2xpZW50SUQgfSk7XG4vLyAgICAgICB9KTtcbi8vICAgICB9KTtcblxuLy8gICAgIE1ldGVvci5wdWJsaXNoKCdzZXJ2ZXItc2Vzc2lvbicsIGZ1bmN0aW9uICgpIHtcbi8vICAgICAgIHJldHVybiBDb2xsZWN0aW9uLmZpbmQoeyAnY2xpZW50SUQnOiB0aGlzLmNvbm5lY3Rpb24uaWQgfSk7XG4vLyAgICAgfSk7XG5cbi8vICAgICBNZXRlb3IubWV0aG9kcyh7XG4vLyAgICAgICAnc2VydmVyLXNlc3Npb24vZ2V0JzogZnVuY3Rpb24gKCkge1xuLy8gICAgICAgICByZXR1cm4gQ29sbGVjdGlvbi5maW5kT25lKHsgJ2NsaWVudElEJzogdGhpcy5jb25uZWN0aW9uLmlkIH0pO1xuLy8gICAgICAgfSxcbi8vICAgICAgICdzZXJ2ZXItc2Vzc2lvbi9zZXQnOiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuLy8gICAgICAgICBpZiAoIXRoaXMucmFuZG9tU2VlZCkgcmV0dXJuO1xuXG4vLyAgICAgICAgIGNoZWNrRm9yS2V5KGtleSk7XG5cbi8vICAgICAgICAgaWYgKCFjb25kaXRpb24oa2V5LCB2YWx1ZSkpXG4vLyAgICAgICAgICAgdGhyb3cgbmV3IE1ldGVvci5FcnJvcignRmFpbGVkIGNvbmRpdGlvbiB2YWxpZGF0aW9uLicpO1xuXG4vLyAgICAgICAgIHZhciB1cGRhdGVPYmogPSB7fTtcbi8vICAgICAgICAgdXBkYXRlT2JqWyd2YWx1ZXMuJyArIGtleV0gPSB2YWx1ZTtcblxuLy8gICAgICAgICBDb2xsZWN0aW9uLnVwZGF0ZSh7ICdjbGllbnRJRCc6IHRoaXMuY29ubmVjdGlvbi5pZCB9LCB7ICRzZXQ6IHVwZGF0ZU9iaiB9KTtcbi8vICAgICAgIH1cbi8vICAgICB9KTsgIFxuXG4vLyAgICAgLy8gc2VydmVyLW9ubHkgYXBpXG4vLyAgICAgXy5leHRlbmQoYXBpLCB7XG4vLyAgICAgICAnc2V0JzogZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbi8vICAgICAgICAgTWV0ZW9yLmNhbGwoJ3NlcnZlci1zZXNzaW9uL3NldCcsIGtleSwgdmFsdWUpOyAgICAgICAgICBcbi8vICAgICAgIH0sXG4vLyAgICAgICAnc2V0Q29uZGl0aW9uJzogZnVuY3Rpb24gKG5ld0NvbmRpdGlvbikge1xuLy8gICAgICAgICBjb25kaXRpb24gPSBuZXdDb25kaXRpb247XG4vLyAgICAgICB9XG4vLyAgICAgfSk7XG4vLyAgIH1cblxuLy8gICByZXR1cm4gYXBpO1xuLy8gfSkoKTsiLCJKc29uUm91dGVzLmFkZCAnZ2V0JywgJy9hcGkvZ2V0L2FwcHMnLCAocmVxLCByZXMsIG5leHQpIC0+XG5cdHRyeVxuXHRcdHVzZXJfaWQgPSByZXEuaGVhZGVyc1sneC11c2VyLWlkJ10gfHwgcmVxLnF1ZXJ5Py51c2VySWRcblxuXHRcdHNwYWNlX2lkID0gcmVxLmhlYWRlcnNbJ3gtc3BhY2UtaWQnXSB8fCByZXEucXVlcnk/LnNwYWNlSWRcblxuXHRcdHVzZXIgPSBTdGVlZG9zLmdldEFQSUxvZ2luVXNlcihyZXEsIHJlcylcblx0XHRcblx0XHRpZiAhdXNlclxuXHRcdFx0SnNvblJvdXRlcy5zZW5kUmVzdWx0IHJlcyxcblx0XHRcdFx0Y29kZTogNDAxLFxuXHRcdFx0XHRkYXRhOlxuXHRcdFx0XHRcdFwiZXJyb3JcIjogXCJWYWxpZGF0ZSBSZXF1ZXN0IC0tIE1pc3NpbmcgWC1BdXRoLVRva2VuLFgtVXNlci1JZFwiLFxuXHRcdFx0XHRcdFwic3VjY2Vzc1wiOiBmYWxzZVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dXNlcl9pZCA9IHVzZXIuX2lkXG5cblx0XHQjIOagoemqjHNwYWNl5piv5ZCm5a2Y5ZyoXG5cdFx0dXVmbG93TWFuYWdlci5nZXRTcGFjZShzcGFjZV9pZClcblxuXHRcdGxvY2FsZSA9IGRiLnVzZXJzLmZpbmRPbmUoe19pZDp1c2VyX2lkfSkubG9jYWxlXG5cdFx0aWYgbG9jYWxlID09IFwiZW4tdXNcIlxuXHRcdFx0bG9jYWxlID0gXCJlblwiXG5cdFx0aWYgbG9jYWxlID09IFwiemgtY25cIlxuXHRcdFx0bG9jYWxlID0gXCJ6aC1DTlwiXG5cblx0XHRzcGFjZXMgPSBkYi5zcGFjZV91c2Vycy5maW5kKHt1c2VyOiB1c2VyX2lkfSkuZmV0Y2goKS5nZXRQcm9wZXJ0eShcInNwYWNlXCIpXG5cdFx0YXBwcyA9IGRiLmFwcHMuZmluZCh7JG9yOiBbe3NwYWNlOiB7JGV4aXN0czogZmFsc2V9fSwge3NwYWNlOiB7JGluOnNwYWNlc319XX0se3NvcnQ6e3NvcnQ6MX19KS5mZXRjaCgpXG5cblx0XHRhcHBzLmZvckVhY2ggKGFwcCkgLT5cblx0XHRcdGFwcC5uYW1lID0gVEFQaTE4bi5fXyhhcHAubmFtZSx7fSxsb2NhbGUpXG5cblx0XHRKc29uUm91dGVzLnNlbmRSZXN1bHQgcmVzLFxuXHRcdFx0Y29kZTogMjAwXG5cdFx0XHRkYXRhOiB7IHN0YXR1czogXCJzdWNjZXNzXCIsIGRhdGE6IGFwcHN9XG5cdGNhdGNoIGVcblx0XHRjb25zb2xlLmVycm9yIGUuc3RhY2tcblx0XHRKc29uUm91dGVzLnNlbmRSZXN1bHQgcmVzLFxuXHRcdFx0Y29kZTogMjAwXG5cdFx0XHRkYXRhOiB7IGVycm9yczogW3tlcnJvck1lc3NhZ2U6IGUubWVzc2FnZX1dfVxuXHRcblx0XHQiLCJKc29uUm91dGVzLmFkZCgnZ2V0JywgJy9hcGkvZ2V0L2FwcHMnLCBmdW5jdGlvbihyZXEsIHJlcywgbmV4dCkge1xuICB2YXIgYXBwcywgZSwgbG9jYWxlLCByZWYsIHJlZjEsIHNwYWNlX2lkLCBzcGFjZXMsIHVzZXIsIHVzZXJfaWQ7XG4gIHRyeSB7XG4gICAgdXNlcl9pZCA9IHJlcS5oZWFkZXJzWyd4LXVzZXItaWQnXSB8fCAoKHJlZiA9IHJlcS5xdWVyeSkgIT0gbnVsbCA/IHJlZi51c2VySWQgOiB2b2lkIDApO1xuICAgIHNwYWNlX2lkID0gcmVxLmhlYWRlcnNbJ3gtc3BhY2UtaWQnXSB8fCAoKHJlZjEgPSByZXEucXVlcnkpICE9IG51bGwgPyByZWYxLnNwYWNlSWQgOiB2b2lkIDApO1xuICAgIHVzZXIgPSBTdGVlZG9zLmdldEFQSUxvZ2luVXNlcihyZXEsIHJlcyk7XG4gICAgaWYgKCF1c2VyKSB7XG4gICAgICBKc29uUm91dGVzLnNlbmRSZXN1bHQocmVzLCB7XG4gICAgICAgIGNvZGU6IDQwMSxcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIFwiZXJyb3JcIjogXCJWYWxpZGF0ZSBSZXF1ZXN0IC0tIE1pc3NpbmcgWC1BdXRoLVRva2VuLFgtVXNlci1JZFwiLFxuICAgICAgICAgIFwic3VjY2Vzc1wiOiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdXNlcl9pZCA9IHVzZXIuX2lkO1xuICAgIHV1Zmxvd01hbmFnZXIuZ2V0U3BhY2Uoc3BhY2VfaWQpO1xuICAgIGxvY2FsZSA9IGRiLnVzZXJzLmZpbmRPbmUoe1xuICAgICAgX2lkOiB1c2VyX2lkXG4gICAgfSkubG9jYWxlO1xuICAgIGlmIChsb2NhbGUgPT09IFwiZW4tdXNcIikge1xuICAgICAgbG9jYWxlID0gXCJlblwiO1xuICAgIH1cbiAgICBpZiAobG9jYWxlID09PSBcInpoLWNuXCIpIHtcbiAgICAgIGxvY2FsZSA9IFwiemgtQ05cIjtcbiAgICB9XG4gICAgc3BhY2VzID0gZGIuc3BhY2VfdXNlcnMuZmluZCh7XG4gICAgICB1c2VyOiB1c2VyX2lkXG4gICAgfSkuZmV0Y2goKS5nZXRQcm9wZXJ0eShcInNwYWNlXCIpO1xuICAgIGFwcHMgPSBkYi5hcHBzLmZpbmQoe1xuICAgICAgJG9yOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBzcGFjZToge1xuICAgICAgICAgICAgJGV4aXN0czogZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH0sIHtcbiAgICAgICAgICBzcGFjZToge1xuICAgICAgICAgICAgJGluOiBzcGFjZXNcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9LCB7XG4gICAgICBzb3J0OiB7XG4gICAgICAgIHNvcnQ6IDFcbiAgICAgIH1cbiAgICB9KS5mZXRjaCgpO1xuICAgIGFwcHMuZm9yRWFjaChmdW5jdGlvbihhcHApIHtcbiAgICAgIHJldHVybiBhcHAubmFtZSA9IFRBUGkxOG4uX18oYXBwLm5hbWUsIHt9LCBsb2NhbGUpO1xuICAgIH0pO1xuICAgIHJldHVybiBKc29uUm91dGVzLnNlbmRSZXN1bHQocmVzLCB7XG4gICAgICBjb2RlOiAyMDAsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHN0YXR1czogXCJzdWNjZXNzXCIsXG4gICAgICAgIGRhdGE6IGFwcHNcbiAgICAgIH1cbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBlID0gZXJyb3I7XG4gICAgY29uc29sZS5lcnJvcihlLnN0YWNrKTtcbiAgICByZXR1cm4gSnNvblJvdXRlcy5zZW5kUmVzdWx0KHJlcywge1xuICAgICAgY29kZTogMjAwLFxuICAgICAgZGF0YToge1xuICAgICAgICBlcnJvcnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBlcnJvck1lc3NhZ2U6IGUubWVzc2FnZVxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfVxuICAgIH0pO1xuICB9XG59KTtcbiIsIkNvb2tpZXMgPSByZXF1aXJlKFwiY29va2llc1wiKVxuc3RlZWRvc0F1dGggPSByZXF1aXJlKFwiQHN0ZWVkb3MvYXV0aFwiKVxuXG5Kc29uUm91dGVzLmFkZCBcInBvc3RcIiwgXCIvYXBpL2NvbGxlY3Rpb24vZmluZFwiLCAocmVxLCByZXMsIG5leHQpIC0+XG4gICAgdHJ5XG4gICAgICAgIGNvb2tpZXMgPSBuZXcgQ29va2llcyggcmVxLCByZXMgKVxuICAgICAgICBhdXRoVG9rZW4gPSByZXEuYm9keVtcIlgtQXV0aC1Ub2tlblwiXSB8fCBjb29raWVzLmdldChcIlgtQXV0aC1Ub2tlblwiKVxuXG4gICAgICAgIGlmICFhdXRoVG9rZW5cbiAgICAgICAgICAgIEpzb25Sb3V0ZXMuc2VuZFJlc3VsdCByZXMsXG4gICAgICAgICAgICBjb2RlOiA0MDEsXG4gICAgICAgICAgICBkYXRhOlxuICAgICAgICAgICAgICAgIFwiZXJyb3JcIjogXCJWYWxpZGF0ZSBSZXF1ZXN0IC0tIE1pc3NpbmcgWC1BdXRoLVRva2VuXCIsXG4gICAgICAgICAgICAgICAgXCJpbnN0YW5jZVwiOiBcIjEzMjk1OTg4NjFcIixcbiAgICAgICAgICAgICAgICBcInN1Y2Nlc3NcIjogZmFsc2VcbiAgICAgICAgICAgIHJldHVyblxuXG4gICAgICAgIG1vZGVsID0gcmVxLmJvZHkubW9kZWxcbiAgICAgICAgc2VsZWN0b3IgPSByZXEuYm9keS5zZWxlY3RvclxuICAgICAgICBvcHRpb25zID0gcmVxLmJvZHkub3B0aW9uc1xuICAgICAgICBzcGFjZSA9IHJlcS5ib2R5LnNwYWNlXG4gICAgICAgIGRhdGEgPSBbXVxuICAgICAgICBhbGxvd19tb2RlbHMgPSBbJ3NwYWNlX3VzZXJzJywgJ29yZ2FuaXphdGlvbnMnLCAnZmxvd19yb2xlcycsICdyb2xlcyddXG5cbiAgICAgICAgaWYgIXNwYWNlXG4gICAgICAgICAgICBKc29uUm91dGVzLnNlbmRSZXN1bHQgcmVzLFxuICAgICAgICAgICAgY29kZTogNDAzLFxuICAgICAgICAgICAgZGF0YTpcbiAgICAgICAgICAgICAgICBcImVycm9yXCI6IFwiaW52YWxpZCBzcGFjZSBcIiArIHNwYWNlLFxuICAgICAgICAgICAgICAgIFwic3VjY2Vzc1wiOiBmYWxzZVxuICAgICAgICAgICAgcmV0dXJuXG5cbiAgICAgICAgIyDnlKjmiLfnmbvlvZXpqozor4FcbiAgICAgICAgY2hlY2soc3BhY2UsIFN0cmluZylcbiAgICAgICAgY2hlY2soYXV0aFRva2VuLCBTdHJpbmcpXG4gICAgICAgIHVzZXJTZXNzaW9uID0gTWV0ZW9yLndyYXBBc3luYygoYXV0aFRva2VuLCBzcGFjZUlkLCBjYikgLT5cbiAgICAgICAgICAgIHN0ZWVkb3NBdXRoLmdldFNlc3Npb24oYXV0aFRva2VuLCBzcGFjZUlkKS50aGVuIChyZXNvbHZlLCByZWplY3QpIC0+XG4gICAgICAgICAgICAgICAgY2IocmVqZWN0LCByZXNvbHZlKVxuICAgICAgICAgICAgKShhdXRoVG9rZW4sIHNwYWNlKVxuICAgICAgICB1bmxlc3MgdXNlclNlc3Npb25cbiAgICAgICAgICAgIEpzb25Sb3V0ZXMuc2VuZFJlc3VsdCByZXMsXG4gICAgICAgICAgICAgICAgY29kZTogNTAwLFxuICAgICAgICAgICAgICAgIGRhdGE6XG4gICAgICAgICAgICAgICAgICAgIFwiZXJyb3JcIjogXCJhdXRoIGZhaWxlZFwiLFxuICAgICAgICAgICAgICAgICAgICBcInN1Y2Nlc3NcIjogZmFsc2VcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB1c2VySWQgPSB1c2VyU2Vzc2lvbi51c2VySWRcblxuICAgICAgICBpZiAhYWxsb3dfbW9kZWxzLmluY2x1ZGVzKG1vZGVsKVxuICAgICAgICAgICAgSnNvblJvdXRlcy5zZW5kUmVzdWx0IHJlcyxcbiAgICAgICAgICAgIGNvZGU6IDQwMyxcbiAgICAgICAgICAgIGRhdGE6XG4gICAgICAgICAgICAgICAgXCJlcnJvclwiOiBcImludmFsaWQgbW9kZWwgXCIgKyBtb2RlbCxcbiAgICAgICAgICAgICAgICBcInN1Y2Nlc3NcIjogZmFsc2VcbiAgICAgICAgICAgIHJldHVyblxuXG4gICAgICAgIGlmICFkYlttb2RlbF1cbiAgICAgICAgICAgIEpzb25Sb3V0ZXMuc2VuZFJlc3VsdCByZXMsXG4gICAgICAgICAgICBjb2RlOiA0MDMsXG4gICAgICAgICAgICBkYXRhOlxuICAgICAgICAgICAgICAgIFwiZXJyb3JcIjogXCJpbnZhbGlkIG1vZGVsIFwiICsgbW9kZWwsXG4gICAgICAgICAgICAgICAgXCJzdWNjZXNzXCI6IGZhbHNlXG4gICAgICAgICAgICByZXR1cm5cblxuICAgICAgICBpZiAhc2VsZWN0b3JcbiAgICAgICAgICAgIHNlbGVjdG9yID0ge31cblxuICAgICAgICBpZiAhb3B0aW9uc1xuICAgICAgICAgICAgb3B0aW9ucyA9IHt9XG5cbiAgICAgICAgc2VsZWN0b3Iuc3BhY2UgPSBzcGFjZVxuXG4gICAgICAgIGRhdGEgPSBkYlttb2RlbF0uZmluZChzZWxlY3Rvciwgb3B0aW9ucykuZmV0Y2goKVxuXG4gICAgICAgIEpzb25Sb3V0ZXMuc2VuZFJlc3VsdCByZXMsXG4gICAgICAgICAgICBjb2RlOiAyMDAsXG4gICAgICAgICAgICBkYXRhOiBkYXRhXG4gICAgY2F0Y2ggZVxuICAgICAgICBjb25zb2xlLmVycm9yIGUuc3RhY2tcbiAgICAgICAgSnNvblJvdXRlcy5zZW5kUmVzdWx0IHJlcyxcbiAgICAgICAgICAgIGNvZGU6IDIwMCxcbiAgICAgICAgICAgIGRhdGE6IFtdXG5cblxuSnNvblJvdXRlcy5hZGQgXCJwb3N0XCIsIFwiL2FwaS9jb2xsZWN0aW9uL2ZpbmRvbmVcIiwgKHJlcSwgcmVzLCBuZXh0KSAtPlxuICAgIHRyeVxuICAgICAgICBjb29raWVzID0gbmV3IENvb2tpZXMoIHJlcSwgcmVzIClcbiAgICAgICAgYXV0aFRva2VuID0gcmVxLmJvZHlbXCJYLUF1dGgtVG9rZW5cIl0gfHwgY29va2llcy5nZXQoXCJYLUF1dGgtVG9rZW5cIilcblxuICAgICAgICBpZiAhYXV0aFRva2VuXG4gICAgICAgICAgICBKc29uUm91dGVzLnNlbmRSZXN1bHQgcmVzLFxuICAgICAgICAgICAgY29kZTogNDAxLFxuICAgICAgICAgICAgZGF0YTpcbiAgICAgICAgICAgICAgICBcImVycm9yXCI6IFwiVmFsaWRhdGUgUmVxdWVzdCAtLSBNaXNzaW5nIFgtQXV0aC1Ub2tlblwiLFxuICAgICAgICAgICAgICAgIFwiaW5zdGFuY2VcIjogXCIxMzI5NTk4ODYxXCIsXG4gICAgICAgICAgICAgICAgXCJzdWNjZXNzXCI6IGZhbHNlXG4gICAgICAgICAgICByZXR1cm5cblxuICAgICAgICBtb2RlbCA9IHJlcS5ib2R5Lm1vZGVsXG4gICAgICAgIHNlbGVjdG9yID0gcmVxLmJvZHkuc2VsZWN0b3JcbiAgICAgICAgb3B0aW9ucyA9IHJlcS5ib2R5Lm9wdGlvbnNcbiAgICAgICAgc3BhY2UgPSByZXEuYm9keS5zcGFjZVxuICAgICAgICBkYXRhID0gW11cbiAgICAgICAgYWxsb3dfbW9kZWxzID0gWydzcGFjZV91c2VycycsICdvcmdhbml6YXRpb25zJywgJ2Zsb3dfcm9sZXMnLCAnbWFpbF9hY2NvdW50cycsICdyb2xlcyddXG5cbiAgICAgICAgaWYgIXNwYWNlXG4gICAgICAgICAgICBKc29uUm91dGVzLnNlbmRSZXN1bHQgcmVzLFxuICAgICAgICAgICAgY29kZTogNDAzLFxuICAgICAgICAgICAgZGF0YTpcbiAgICAgICAgICAgICAgICBcImVycm9yXCI6IFwiaW52YWxpZCBzcGFjZSBcIiArIHNwYWNlLFxuICAgICAgICAgICAgICAgIFwic3VjY2Vzc1wiOiBmYWxzZVxuICAgICAgICAgICAgcmV0dXJuXG5cbiAgICAgICAgIyDnlKjmiLfnmbvlvZXpqozor4FcbiAgICAgICAgY2hlY2soc3BhY2UsIFN0cmluZylcbiAgICAgICAgY2hlY2soYXV0aFRva2VuLCBTdHJpbmcpXG4gICAgICAgIHVzZXJTZXNzaW9uID0gTWV0ZW9yLndyYXBBc3luYygoYXV0aFRva2VuLCBzcGFjZUlkLCBjYikgLT5cbiAgICAgICAgICAgIHN0ZWVkb3NBdXRoLmdldFNlc3Npb24oYXV0aFRva2VuLCBzcGFjZUlkKS50aGVuIChyZXNvbHZlLCByZWplY3QpIC0+XG4gICAgICAgICAgICAgICAgY2IocmVqZWN0LCByZXNvbHZlKVxuICAgICAgICAgICAgKShhdXRoVG9rZW4sIHNwYWNlKVxuICAgICAgICB1bmxlc3MgdXNlclNlc3Npb25cbiAgICAgICAgICAgIEpzb25Sb3V0ZXMuc2VuZFJlc3VsdCByZXMsXG4gICAgICAgICAgICAgICAgY29kZTogNTAwLFxuICAgICAgICAgICAgICAgIGRhdGE6XG4gICAgICAgICAgICAgICAgICAgIFwiZXJyb3JcIjogXCJhdXRoIGZhaWxlZFwiLFxuICAgICAgICAgICAgICAgICAgICBcInN1Y2Nlc3NcIjogZmFsc2VcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB1c2VySWQgPSB1c2VyU2Vzc2lvbi51c2VySWRcblxuICAgICAgICBpZiAhYWxsb3dfbW9kZWxzLmluY2x1ZGVzKG1vZGVsKVxuICAgICAgICAgICAgSnNvblJvdXRlcy5zZW5kUmVzdWx0IHJlcyxcbiAgICAgICAgICAgIGNvZGU6IDQwMyxcbiAgICAgICAgICAgIGRhdGE6XG4gICAgICAgICAgICAgICAgXCJlcnJvclwiOiBcImludmFsaWQgbW9kZWwgXCIgKyBtb2RlbCxcbiAgICAgICAgICAgICAgICBcInN1Y2Nlc3NcIjogZmFsc2VcbiAgICAgICAgICAgIHJldHVyblxuXG4gICAgICAgIGlmICFkYlttb2RlbF1cbiAgICAgICAgICAgIEpzb25Sb3V0ZXMuc2VuZFJlc3VsdCByZXMsXG4gICAgICAgICAgICBjb2RlOiA0MDMsXG4gICAgICAgICAgICBkYXRhOlxuICAgICAgICAgICAgICAgIFwiZXJyb3JcIjogXCJpbnZhbGlkIG1vZGVsIFwiICsgbW9kZWwsXG4gICAgICAgICAgICAgICAgXCJzdWNjZXNzXCI6IGZhbHNlXG4gICAgICAgICAgICByZXR1cm5cblxuICAgICAgICBpZiAhc2VsZWN0b3JcbiAgICAgICAgICAgIHNlbGVjdG9yID0ge31cblxuICAgICAgICBpZiAhb3B0aW9uc1xuICAgICAgICAgICAgb3B0aW9ucyA9IHt9XG5cbiAgICAgICAgaWYgbW9kZWwgPT0gJ21haWxfYWNjb3VudHMnXG4gICAgICAgICAgICBzZWxlY3RvciA9IHt9XG4gICAgICAgICAgICBzZWxlY3Rvci5vd25lciA9IHVzZXJJZFxuICAgICAgICAgICAgZGF0YSA9IGRiW21vZGVsXS5maW5kT25lKHNlbGVjdG9yKVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBzZWxlY3Rvci5zcGFjZSA9IHNwYWNlXG5cbiAgICAgICAgICAgIGRhdGEgPSBkYlttb2RlbF0uZmluZE9uZShzZWxlY3Rvciwgb3B0aW9ucylcblxuICAgICAgICBKc29uUm91dGVzLnNlbmRSZXN1bHQgcmVzLFxuICAgICAgICAgICAgY29kZTogMjAwLFxuICAgICAgICAgICAgZGF0YTogZGF0YVxuICAgIGNhdGNoIGVcbiAgICAgICAgY29uc29sZS5lcnJvciBlLnN0YWNrXG4gICAgICAgIEpzb25Sb3V0ZXMuc2VuZFJlc3VsdCByZXMsXG4gICAgICAgICAgICBjb2RlOiAyMDAsXG4gICAgICAgICAgICBkYXRhOiB7fVxuIiwidmFyIENvb2tpZXMsIHN0ZWVkb3NBdXRoO1xuXG5Db29raWVzID0gcmVxdWlyZShcImNvb2tpZXNcIik7XG5cbnN0ZWVkb3NBdXRoID0gcmVxdWlyZShcIkBzdGVlZG9zL2F1dGhcIik7XG5cbkpzb25Sb3V0ZXMuYWRkKFwicG9zdFwiLCBcIi9hcGkvY29sbGVjdGlvbi9maW5kXCIsIGZ1bmN0aW9uKHJlcSwgcmVzLCBuZXh0KSB7XG4gIHZhciBhbGxvd19tb2RlbHMsIGF1dGhUb2tlbiwgY29va2llcywgZGF0YSwgZSwgbW9kZWwsIG9wdGlvbnMsIHNlbGVjdG9yLCBzcGFjZSwgdXNlcklkLCB1c2VyU2Vzc2lvbjtcbiAgdHJ5IHtcbiAgICBjb29raWVzID0gbmV3IENvb2tpZXMocmVxLCByZXMpO1xuICAgIGF1dGhUb2tlbiA9IHJlcS5ib2R5W1wiWC1BdXRoLVRva2VuXCJdIHx8IGNvb2tpZXMuZ2V0KFwiWC1BdXRoLVRva2VuXCIpO1xuICAgIGlmICghYXV0aFRva2VuKSB7XG4gICAgICBKc29uUm91dGVzLnNlbmRSZXN1bHQocmVzLCB7XG4gICAgICAgIGNvZGU6IDQwMSxcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIFwiZXJyb3JcIjogXCJWYWxpZGF0ZSBSZXF1ZXN0IC0tIE1pc3NpbmcgWC1BdXRoLVRva2VuXCIsXG4gICAgICAgICAgXCJpbnN0YW5jZVwiOiBcIjEzMjk1OTg4NjFcIixcbiAgICAgICAgICBcInN1Y2Nlc3NcIjogZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIG1vZGVsID0gcmVxLmJvZHkubW9kZWw7XG4gICAgc2VsZWN0b3IgPSByZXEuYm9keS5zZWxlY3RvcjtcbiAgICBvcHRpb25zID0gcmVxLmJvZHkub3B0aW9ucztcbiAgICBzcGFjZSA9IHJlcS5ib2R5LnNwYWNlO1xuICAgIGRhdGEgPSBbXTtcbiAgICBhbGxvd19tb2RlbHMgPSBbJ3NwYWNlX3VzZXJzJywgJ29yZ2FuaXphdGlvbnMnLCAnZmxvd19yb2xlcycsICdyb2xlcyddO1xuICAgIGlmICghc3BhY2UpIHtcbiAgICAgIEpzb25Sb3V0ZXMuc2VuZFJlc3VsdChyZXMsIHtcbiAgICAgICAgY29kZTogNDAzLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgXCJlcnJvclwiOiBcImludmFsaWQgc3BhY2UgXCIgKyBzcGFjZSxcbiAgICAgICAgICBcInN1Y2Nlc3NcIjogZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNoZWNrKHNwYWNlLCBTdHJpbmcpO1xuICAgIGNoZWNrKGF1dGhUb2tlbiwgU3RyaW5nKTtcbiAgICB1c2VyU2Vzc2lvbiA9IE1ldGVvci53cmFwQXN5bmMoZnVuY3Rpb24oYXV0aFRva2VuLCBzcGFjZUlkLCBjYikge1xuICAgICAgcmV0dXJuIHN0ZWVkb3NBdXRoLmdldFNlc3Npb24oYXV0aFRva2VuLCBzcGFjZUlkKS50aGVuKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICByZXR1cm4gY2IocmVqZWN0LCByZXNvbHZlKTtcbiAgICAgIH0pO1xuICAgIH0pKGF1dGhUb2tlbiwgc3BhY2UpO1xuICAgIGlmICghdXNlclNlc3Npb24pIHtcbiAgICAgIEpzb25Sb3V0ZXMuc2VuZFJlc3VsdChyZXMsIHtcbiAgICAgICAgY29kZTogNTAwLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgXCJlcnJvclwiOiBcImF1dGggZmFpbGVkXCIsXG4gICAgICAgICAgXCJzdWNjZXNzXCI6IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB1c2VySWQgPSB1c2VyU2Vzc2lvbi51c2VySWQ7XG4gICAgaWYgKCFhbGxvd19tb2RlbHMuaW5jbHVkZXMobW9kZWwpKSB7XG4gICAgICBKc29uUm91dGVzLnNlbmRSZXN1bHQocmVzLCB7XG4gICAgICAgIGNvZGU6IDQwMyxcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIFwiZXJyb3JcIjogXCJpbnZhbGlkIG1vZGVsIFwiICsgbW9kZWwsXG4gICAgICAgICAgXCJzdWNjZXNzXCI6IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWRiW21vZGVsXSkge1xuICAgICAgSnNvblJvdXRlcy5zZW5kUmVzdWx0KHJlcywge1xuICAgICAgICBjb2RlOiA0MDMsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBcImVycm9yXCI6IFwiaW52YWxpZCBtb2RlbCBcIiArIG1vZGVsLFxuICAgICAgICAgIFwic3VjY2Vzc1wiOiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFzZWxlY3Rvcikge1xuICAgICAgc2VsZWN0b3IgPSB7fTtcbiAgICB9XG4gICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfVxuICAgIHNlbGVjdG9yLnNwYWNlID0gc3BhY2U7XG4gICAgZGF0YSA9IGRiW21vZGVsXS5maW5kKHNlbGVjdG9yLCBvcHRpb25zKS5mZXRjaCgpO1xuICAgIHJldHVybiBKc29uUm91dGVzLnNlbmRSZXN1bHQocmVzLCB7XG4gICAgICBjb2RlOiAyMDAsXG4gICAgICBkYXRhOiBkYXRhXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgZSA9IGVycm9yO1xuICAgIGNvbnNvbGUuZXJyb3IoZS5zdGFjayk7XG4gICAgcmV0dXJuIEpzb25Sb3V0ZXMuc2VuZFJlc3VsdChyZXMsIHtcbiAgICAgIGNvZGU6IDIwMCxcbiAgICAgIGRhdGE6IFtdXG4gICAgfSk7XG4gIH1cbn0pO1xuXG5Kc29uUm91dGVzLmFkZChcInBvc3RcIiwgXCIvYXBpL2NvbGxlY3Rpb24vZmluZG9uZVwiLCBmdW5jdGlvbihyZXEsIHJlcywgbmV4dCkge1xuICB2YXIgYWxsb3dfbW9kZWxzLCBhdXRoVG9rZW4sIGNvb2tpZXMsIGRhdGEsIGUsIG1vZGVsLCBvcHRpb25zLCBzZWxlY3Rvciwgc3BhY2UsIHVzZXJJZCwgdXNlclNlc3Npb247XG4gIHRyeSB7XG4gICAgY29va2llcyA9IG5ldyBDb29raWVzKHJlcSwgcmVzKTtcbiAgICBhdXRoVG9rZW4gPSByZXEuYm9keVtcIlgtQXV0aC1Ub2tlblwiXSB8fCBjb29raWVzLmdldChcIlgtQXV0aC1Ub2tlblwiKTtcbiAgICBpZiAoIWF1dGhUb2tlbikge1xuICAgICAgSnNvblJvdXRlcy5zZW5kUmVzdWx0KHJlcywge1xuICAgICAgICBjb2RlOiA0MDEsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBcImVycm9yXCI6IFwiVmFsaWRhdGUgUmVxdWVzdCAtLSBNaXNzaW5nIFgtQXV0aC1Ub2tlblwiLFxuICAgICAgICAgIFwiaW5zdGFuY2VcIjogXCIxMzI5NTk4ODYxXCIsXG4gICAgICAgICAgXCJzdWNjZXNzXCI6IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBtb2RlbCA9IHJlcS5ib2R5Lm1vZGVsO1xuICAgIHNlbGVjdG9yID0gcmVxLmJvZHkuc2VsZWN0b3I7XG4gICAgb3B0aW9ucyA9IHJlcS5ib2R5Lm9wdGlvbnM7XG4gICAgc3BhY2UgPSByZXEuYm9keS5zcGFjZTtcbiAgICBkYXRhID0gW107XG4gICAgYWxsb3dfbW9kZWxzID0gWydzcGFjZV91c2VycycsICdvcmdhbml6YXRpb25zJywgJ2Zsb3dfcm9sZXMnLCAnbWFpbF9hY2NvdW50cycsICdyb2xlcyddO1xuICAgIGlmICghc3BhY2UpIHtcbiAgICAgIEpzb25Sb3V0ZXMuc2VuZFJlc3VsdChyZXMsIHtcbiAgICAgICAgY29kZTogNDAzLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgXCJlcnJvclwiOiBcImludmFsaWQgc3BhY2UgXCIgKyBzcGFjZSxcbiAgICAgICAgICBcInN1Y2Nlc3NcIjogZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNoZWNrKHNwYWNlLCBTdHJpbmcpO1xuICAgIGNoZWNrKGF1dGhUb2tlbiwgU3RyaW5nKTtcbiAgICB1c2VyU2Vzc2lvbiA9IE1ldGVvci53cmFwQXN5bmMoZnVuY3Rpb24oYXV0aFRva2VuLCBzcGFjZUlkLCBjYikge1xuICAgICAgcmV0dXJuIHN0ZWVkb3NBdXRoLmdldFNlc3Npb24oYXV0aFRva2VuLCBzcGFjZUlkKS50aGVuKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICByZXR1cm4gY2IocmVqZWN0LCByZXNvbHZlKTtcbiAgICAgIH0pO1xuICAgIH0pKGF1dGhUb2tlbiwgc3BhY2UpO1xuICAgIGlmICghdXNlclNlc3Npb24pIHtcbiAgICAgIEpzb25Sb3V0ZXMuc2VuZFJlc3VsdChyZXMsIHtcbiAgICAgICAgY29kZTogNTAwLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgXCJlcnJvclwiOiBcImF1dGggZmFpbGVkXCIsXG4gICAgICAgICAgXCJzdWNjZXNzXCI6IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB1c2VySWQgPSB1c2VyU2Vzc2lvbi51c2VySWQ7XG4gICAgaWYgKCFhbGxvd19tb2RlbHMuaW5jbHVkZXMobW9kZWwpKSB7XG4gICAgICBKc29uUm91dGVzLnNlbmRSZXN1bHQocmVzLCB7XG4gICAgICAgIGNvZGU6IDQwMyxcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIFwiZXJyb3JcIjogXCJpbnZhbGlkIG1vZGVsIFwiICsgbW9kZWwsXG4gICAgICAgICAgXCJzdWNjZXNzXCI6IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWRiW21vZGVsXSkge1xuICAgICAgSnNvblJvdXRlcy5zZW5kUmVzdWx0KHJlcywge1xuICAgICAgICBjb2RlOiA0MDMsXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBcImVycm9yXCI6IFwiaW52YWxpZCBtb2RlbCBcIiArIG1vZGVsLFxuICAgICAgICAgIFwic3VjY2Vzc1wiOiBmYWxzZVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFzZWxlY3Rvcikge1xuICAgICAgc2VsZWN0b3IgPSB7fTtcbiAgICB9XG4gICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfVxuICAgIGlmIChtb2RlbCA9PT0gJ21haWxfYWNjb3VudHMnKSB7XG4gICAgICBzZWxlY3RvciA9IHt9O1xuICAgICAgc2VsZWN0b3Iub3duZXIgPSB1c2VySWQ7XG4gICAgICBkYXRhID0gZGJbbW9kZWxdLmZpbmRPbmUoc2VsZWN0b3IpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWxlY3Rvci5zcGFjZSA9IHNwYWNlO1xuICAgICAgZGF0YSA9IGRiW21vZGVsXS5maW5kT25lKHNlbGVjdG9yLCBvcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIEpzb25Sb3V0ZXMuc2VuZFJlc3VsdChyZXMsIHtcbiAgICAgIGNvZGU6IDIwMCxcbiAgICAgIGRhdGE6IGRhdGFcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBlID0gZXJyb3I7XG4gICAgY29uc29sZS5lcnJvcihlLnN0YWNrKTtcbiAgICByZXR1cm4gSnNvblJvdXRlcy5zZW5kUmVzdWx0KHJlcywge1xuICAgICAgY29kZTogMjAwLFxuICAgICAgZGF0YToge31cbiAgICB9KTtcbiAgfVxufSk7XG4iLCJjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKVxuQ29va2llcyA9IHJlcXVpcmUoXCJjb29raWVzXCIpXG5leHByZXNzID0gcmVxdWlyZShcImV4cHJlc3NcIilcblxuSnNvblJvdXRlcy5hZGQgXCJnZXRcIiwgXCIvYXBpL3NldHVwL3Nzby86YXBwX2lkXCIsIChyZXEsIHJlcywgbmV4dCkgLT5cblxuXHRhcHAgPSBkYi5hcHBzLmZpbmRPbmUocmVxLnBhcmFtcy5hcHBfaWQpXG5cdGlmIGFwcFxuXHRcdHNlY3JldCA9IGFwcC5zZWNyZXRcblx0XHRyZWRpcmVjdFVybCA9IGFwcC51cmxcblx0ZWxzZVxuXHRcdHNlY3JldCA9IFwiLTg3NjItZmNiMzY5YjJlOFwiXG5cdFx0cmVkaXJlY3RVcmwgPSByZXEucGFyYW1zLnJlZGlyZWN0VXJsXG5cblx0aWYgIXJlZGlyZWN0VXJsXG5cdFx0cmVzLndyaXRlSGVhZCA0MDFcblx0XHRyZXMuZW5kKClcblx0XHRyZXR1cm5cblxuXHRjb29raWVzID0gbmV3IENvb2tpZXMoIHJlcSwgcmVzICk7XG5cblx0IyBmaXJzdCBjaGVjayByZXF1ZXN0IGJvZHlcblx0IyBpZiByZXEuYm9keVxuXHQjIFx0dXNlcklkID0gcmVxLmJvZHlbXCJYLVVzZXItSWRcIl1cblx0IyBcdGF1dGhUb2tlbiA9IHJlcS5ib2R5W1wiWC1BdXRoLVRva2VuXCJdXG5cblx0IyAjIHRoZW4gY2hlY2sgY29va2llXG5cdCMgaWYgIXVzZXJJZCBvciAhYXV0aFRva2VuXG5cdCMgXHR1c2VySWQgPSBjb29raWVzLmdldChcIlgtVXNlci1JZFwiKVxuXHQjIFx0YXV0aFRva2VuID0gY29va2llcy5nZXQoXCJYLUF1dGgtVG9rZW5cIilcblxuXHRpZiAhdXNlcklkIGFuZCAhYXV0aFRva2VuXG5cdFx0dXNlcklkID0gcmVxLnF1ZXJ5W1wiWC1Vc2VyLUlkXCJdXG5cdFx0YXV0aFRva2VuID0gcmVxLnF1ZXJ5W1wiWC1BdXRoLVRva2VuXCJdXG5cblx0aWYgdXNlcklkIGFuZCBhdXRoVG9rZW5cblx0XHRoYXNoZWRUb2tlbiA9IEFjY291bnRzLl9oYXNoTG9naW5Ub2tlbihhdXRoVG9rZW4pXG5cdFx0dXNlciA9IE1ldGVvci51c2Vycy5maW5kT25lXG5cdFx0XHRfaWQ6IHVzZXJJZCxcblx0XHRcdFwic2VydmljZXMucmVzdW1lLmxvZ2luVG9rZW5zLmhhc2hlZFRva2VuXCI6IGhhc2hlZFRva2VuXG5cdFx0aWYgdXNlclxuXHRcdFx0c3RlZWRvc19pZCA9IHVzZXIuc3RlZWRvc19pZFxuXHRcdFx0aWYgYXBwLnNlY3JldFxuXHRcdFx0XHRpdiA9IGFwcC5zZWNyZXRcblx0XHRcdGVsc2Vcblx0XHRcdFx0aXYgPSBcIi04NzYyLWZjYjM2OWIyZThcIlxuXHRcdFx0bm93ID0gcGFyc2VJbnQobmV3IERhdGUoKS5nZXRUaW1lKCkvMTAwMCkudG9TdHJpbmcoKVxuXHRcdFx0a2V5MzIgPSBcIlwiXG5cdFx0XHRsZW4gPSBzdGVlZG9zX2lkLmxlbmd0aFxuXHRcdFx0aWYgbGVuIDwgMzJcblx0XHRcdFx0YyA9IFwiXCJcblx0XHRcdFx0aSA9IDBcblx0XHRcdFx0bSA9IDMyIC0gbGVuXG5cdFx0XHRcdHdoaWxlIGkgPCBtXG5cdFx0XHRcdFx0YyA9IFwiIFwiICsgY1xuXHRcdFx0XHRcdGkrK1xuXHRcdFx0XHRrZXkzMiA9IHN0ZWVkb3NfaWQgKyBjXG5cdFx0XHRlbHNlIGlmIGxlbiA+PSAzMlxuXHRcdFx0XHRrZXkzMiA9IHN0ZWVkb3NfaWQuc2xpY2UoMCwzMilcblxuXHRcdFx0Y2lwaGVyID0gY3J5cHRvLmNyZWF0ZUNpcGhlcml2KCdhZXMtMjU2LWNiYycsIG5ldyBCdWZmZXIoa2V5MzIsICd1dGY4JyksIG5ldyBCdWZmZXIoaXYsICd1dGY4JykpXG5cblx0XHRcdGNpcGhlcmVkTXNnID0gQnVmZmVyLmNvbmNhdChbY2lwaGVyLnVwZGF0ZShuZXcgQnVmZmVyKG5vdywgJ3V0ZjgnKSksIGNpcGhlci5maW5hbCgpXSlcblxuXHRcdFx0c3RlZWRvc190b2tlbiA9IGNpcGhlcmVkTXNnLnRvU3RyaW5nKCdiYXNlNjQnKVxuXG5cdFx0XHQjIGRlcy1jYmNcblx0XHRcdGRlc19pdiA9IFwiLTg3NjItZmNcIlxuXHRcdFx0a2V5OCA9IFwiXCJcblx0XHRcdGxlbiA9IHN0ZWVkb3NfaWQubGVuZ3RoXG5cdFx0XHRpZiBsZW4gPCA4XG5cdFx0XHRcdGMgPSBcIlwiXG5cdFx0XHRcdGkgPSAwXG5cdFx0XHRcdG0gPSA4IC0gbGVuXG5cdFx0XHRcdHdoaWxlIGkgPCBtXG5cdFx0XHRcdFx0YyA9IFwiIFwiICsgY1xuXHRcdFx0XHRcdGkrK1xuXHRcdFx0XHRrZXk4ID0gc3RlZWRvc19pZCArIGNcblx0XHRcdGVsc2UgaWYgbGVuID49IDhcblx0XHRcdFx0a2V5OCA9IHN0ZWVkb3NfaWQuc2xpY2UoMCw4KVxuXHRcdFx0ZGVzX2NpcGhlciA9IGNyeXB0by5jcmVhdGVDaXBoZXJpdignZGVzLWNiYycsIG5ldyBCdWZmZXIoa2V5OCwgJ3V0ZjgnKSwgbmV3IEJ1ZmZlcihkZXNfaXYsICd1dGY4JykpXG5cdFx0XHRkZXNfY2lwaGVyZWRNc2cgPSBCdWZmZXIuY29uY2F0KFtkZXNfY2lwaGVyLnVwZGF0ZShuZXcgQnVmZmVyKG5vdywgJ3V0ZjgnKSksIGRlc19jaXBoZXIuZmluYWwoKV0pXG5cdFx0XHRkZXNfc3RlZWRvc190b2tlbiA9IGRlc19jaXBoZXJlZE1zZy50b1N0cmluZygnYmFzZTY0JylcblxuXHRcdFx0am9pbmVyID0gXCI/XCJcblxuXHRcdFx0aWYgcmVkaXJlY3RVcmwuaW5kZXhPZihcIj9cIikgPiAtMVxuXHRcdFx0XHRqb2luZXIgPSBcIiZcIlxuXG5cdFx0XHRyZXR1cm51cmwgPSByZWRpcmVjdFVybCArIGpvaW5lciArIFwiWC1Vc2VyLUlkPVwiICsgdXNlcklkICsgXCImWC1BdXRoLVRva2VuPVwiICsgYXV0aFRva2VuICsgXCImWC1TVEVFRE9TLVdFQi1JRD1cIiArIHN0ZWVkb3NfaWQgKyBcIiZYLVNURUVET1MtQVVUSFRPS0VOPVwiICsgc3RlZWRvc190b2tlbiArIFwiJlNURUVET1MtQVVUSFRPS0VOPVwiICsgZGVzX3N0ZWVkb3NfdG9rZW5cblxuXHRcdFx0aWYgdXNlci51c2VybmFtZVxuXHRcdFx0XHRyZXR1cm51cmwgKz0gXCImWC1TVEVFRE9TLVVTRVJOQU1FPSN7ZW5jb2RlVVJJKHVzZXIudXNlcm5hbWUpfVwiXG5cdFx0XHRyZXMuc2V0SGVhZGVyIFwiTG9jYXRpb25cIiwgcmV0dXJudXJsXG5cdFx0XHRyZXMud3JpdGVIZWFkIDMwMlxuXHRcdFx0cmVzLmVuZCgpXG5cdFx0XHRyZXR1cm5cblxuXHRyZXMud3JpdGVIZWFkIDQwMVxuXHRyZXMuZW5kKClcblx0cmV0dXJuXG4iLCJ2YXIgQ29va2llcywgY3J5cHRvLCBleHByZXNzO1xuXG5jcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcblxuQ29va2llcyA9IHJlcXVpcmUoXCJjb29raWVzXCIpO1xuXG5leHByZXNzID0gcmVxdWlyZShcImV4cHJlc3NcIik7XG5cbkpzb25Sb3V0ZXMuYWRkKFwiZ2V0XCIsIFwiL2FwaS9zZXR1cC9zc28vOmFwcF9pZFwiLCBmdW5jdGlvbihyZXEsIHJlcywgbmV4dCkge1xuICB2YXIgYXBwLCBhdXRoVG9rZW4sIGMsIGNpcGhlciwgY2lwaGVyZWRNc2csIGNvb2tpZXMsIGRlc19jaXBoZXIsIGRlc19jaXBoZXJlZE1zZywgZGVzX2l2LCBkZXNfc3RlZWRvc190b2tlbiwgaGFzaGVkVG9rZW4sIGksIGl2LCBqb2luZXIsIGtleTMyLCBrZXk4LCBsZW4sIG0sIG5vdywgcmVkaXJlY3RVcmwsIHJldHVybnVybCwgc2VjcmV0LCBzdGVlZG9zX2lkLCBzdGVlZG9zX3Rva2VuLCB1c2VyLCB1c2VySWQ7XG4gIGFwcCA9IGRiLmFwcHMuZmluZE9uZShyZXEucGFyYW1zLmFwcF9pZCk7XG4gIGlmIChhcHApIHtcbiAgICBzZWNyZXQgPSBhcHAuc2VjcmV0O1xuICAgIHJlZGlyZWN0VXJsID0gYXBwLnVybDtcbiAgfSBlbHNlIHtcbiAgICBzZWNyZXQgPSBcIi04NzYyLWZjYjM2OWIyZThcIjtcbiAgICByZWRpcmVjdFVybCA9IHJlcS5wYXJhbXMucmVkaXJlY3RVcmw7XG4gIH1cbiAgaWYgKCFyZWRpcmVjdFVybCkge1xuICAgIHJlcy53cml0ZUhlYWQoNDAxKTtcbiAgICByZXMuZW5kKCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvb2tpZXMgPSBuZXcgQ29va2llcyhyZXEsIHJlcyk7XG4gIGlmICghdXNlcklkICYmICFhdXRoVG9rZW4pIHtcbiAgICB1c2VySWQgPSByZXEucXVlcnlbXCJYLVVzZXItSWRcIl07XG4gICAgYXV0aFRva2VuID0gcmVxLnF1ZXJ5W1wiWC1BdXRoLVRva2VuXCJdO1xuICB9XG4gIGlmICh1c2VySWQgJiYgYXV0aFRva2VuKSB7XG4gICAgaGFzaGVkVG9rZW4gPSBBY2NvdW50cy5faGFzaExvZ2luVG9rZW4oYXV0aFRva2VuKTtcbiAgICB1c2VyID0gTWV0ZW9yLnVzZXJzLmZpbmRPbmUoe1xuICAgICAgX2lkOiB1c2VySWQsXG4gICAgICBcInNlcnZpY2VzLnJlc3VtZS5sb2dpblRva2Vucy5oYXNoZWRUb2tlblwiOiBoYXNoZWRUb2tlblxuICAgIH0pO1xuICAgIGlmICh1c2VyKSB7XG4gICAgICBzdGVlZG9zX2lkID0gdXNlci5zdGVlZG9zX2lkO1xuICAgICAgaWYgKGFwcC5zZWNyZXQpIHtcbiAgICAgICAgaXYgPSBhcHAuc2VjcmV0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXYgPSBcIi04NzYyLWZjYjM2OWIyZThcIjtcbiAgICAgIH1cbiAgICAgIG5vdyA9IHBhcnNlSW50KG5ldyBEYXRlKCkuZ2V0VGltZSgpIC8gMTAwMCkudG9TdHJpbmcoKTtcbiAgICAgIGtleTMyID0gXCJcIjtcbiAgICAgIGxlbiA9IHN0ZWVkb3NfaWQubGVuZ3RoO1xuICAgICAgaWYgKGxlbiA8IDMyKSB7XG4gICAgICAgIGMgPSBcIlwiO1xuICAgICAgICBpID0gMDtcbiAgICAgICAgbSA9IDMyIC0gbGVuO1xuICAgICAgICB3aGlsZSAoaSA8IG0pIHtcbiAgICAgICAgICBjID0gXCIgXCIgKyBjO1xuICAgICAgICAgIGkrKztcbiAgICAgICAgfVxuICAgICAgICBrZXkzMiA9IHN0ZWVkb3NfaWQgKyBjO1xuICAgICAgfSBlbHNlIGlmIChsZW4gPj0gMzIpIHtcbiAgICAgICAga2V5MzIgPSBzdGVlZG9zX2lkLnNsaWNlKDAsIDMyKTtcbiAgICAgIH1cbiAgICAgIGNpcGhlciA9IGNyeXB0by5jcmVhdGVDaXBoZXJpdignYWVzLTI1Ni1jYmMnLCBuZXcgQnVmZmVyKGtleTMyLCAndXRmOCcpLCBuZXcgQnVmZmVyKGl2LCAndXRmOCcpKTtcbiAgICAgIGNpcGhlcmVkTXNnID0gQnVmZmVyLmNvbmNhdChbY2lwaGVyLnVwZGF0ZShuZXcgQnVmZmVyKG5vdywgJ3V0ZjgnKSksIGNpcGhlci5maW5hbCgpXSk7XG4gICAgICBzdGVlZG9zX3Rva2VuID0gY2lwaGVyZWRNc2cudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgICAgZGVzX2l2ID0gXCItODc2Mi1mY1wiO1xuICAgICAga2V5OCA9IFwiXCI7XG4gICAgICBsZW4gPSBzdGVlZG9zX2lkLmxlbmd0aDtcbiAgICAgIGlmIChsZW4gPCA4KSB7XG4gICAgICAgIGMgPSBcIlwiO1xuICAgICAgICBpID0gMDtcbiAgICAgICAgbSA9IDggLSBsZW47XG4gICAgICAgIHdoaWxlIChpIDwgbSkge1xuICAgICAgICAgIGMgPSBcIiBcIiArIGM7XG4gICAgICAgICAgaSsrO1xuICAgICAgICB9XG4gICAgICAgIGtleTggPSBzdGVlZG9zX2lkICsgYztcbiAgICAgIH0gZWxzZSBpZiAobGVuID49IDgpIHtcbiAgICAgICAga2V5OCA9IHN0ZWVkb3NfaWQuc2xpY2UoMCwgOCk7XG4gICAgICB9XG4gICAgICBkZXNfY2lwaGVyID0gY3J5cHRvLmNyZWF0ZUNpcGhlcml2KCdkZXMtY2JjJywgbmV3IEJ1ZmZlcihrZXk4LCAndXRmOCcpLCBuZXcgQnVmZmVyKGRlc19pdiwgJ3V0ZjgnKSk7XG4gICAgICBkZXNfY2lwaGVyZWRNc2cgPSBCdWZmZXIuY29uY2F0KFtkZXNfY2lwaGVyLnVwZGF0ZShuZXcgQnVmZmVyKG5vdywgJ3V0ZjgnKSksIGRlc19jaXBoZXIuZmluYWwoKV0pO1xuICAgICAgZGVzX3N0ZWVkb3NfdG9rZW4gPSBkZXNfY2lwaGVyZWRNc2cudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgICAgam9pbmVyID0gXCI/XCI7XG4gICAgICBpZiAocmVkaXJlY3RVcmwuaW5kZXhPZihcIj9cIikgPiAtMSkge1xuICAgICAgICBqb2luZXIgPSBcIiZcIjtcbiAgICAgIH1cbiAgICAgIHJldHVybnVybCA9IHJlZGlyZWN0VXJsICsgam9pbmVyICsgXCJYLVVzZXItSWQ9XCIgKyB1c2VySWQgKyBcIiZYLUF1dGgtVG9rZW49XCIgKyBhdXRoVG9rZW4gKyBcIiZYLVNURUVET1MtV0VCLUlEPVwiICsgc3RlZWRvc19pZCArIFwiJlgtU1RFRURPUy1BVVRIVE9LRU49XCIgKyBzdGVlZG9zX3Rva2VuICsgXCImU1RFRURPUy1BVVRIVE9LRU49XCIgKyBkZXNfc3RlZWRvc190b2tlbjtcbiAgICAgIGlmICh1c2VyLnVzZXJuYW1lKSB7XG4gICAgICAgIHJldHVybnVybCArPSBcIiZYLVNURUVET1MtVVNFUk5BTUU9XCIgKyAoZW5jb2RlVVJJKHVzZXIudXNlcm5hbWUpKTtcbiAgICAgIH1cbiAgICAgIHJlcy5zZXRIZWFkZXIoXCJMb2NhdGlvblwiLCByZXR1cm51cmwpO1xuICAgICAgcmVzLndyaXRlSGVhZCgzMDIpO1xuICAgICAgcmVzLmVuZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuICByZXMud3JpdGVIZWFkKDQwMSk7XG4gIHJlcy5lbmQoKTtcbn0pO1xuIiwiTWV0ZW9yLnN0YXJ0dXAgLT5cblx0XG5cdEpzb25Sb3V0ZXMuYWRkICdnZXQnLCAnL2F2YXRhci86dXNlcklkJywgKHJlcSwgcmVzLCBuZXh0KSAtPlxuXHRcdCMgdGhpcy5wYXJhbXMgPVxuXHRcdCMgXHR1c2VySWQ6IGRlY29kZVVSSShyZXEudXJsKS5yZXBsYWNlKC9eXFwvLywgJycpLnJlcGxhY2UoL1xcPy4qJC8sICcnKVxuXHRcdHdpZHRoID0gNTAgO1xuXHRcdGhlaWdodCA9IDUwIDtcblx0XHRmb250U2l6ZSA9IDI4IDtcblx0XHRpZiByZXEucXVlcnkud1xuXHRcdCAgICB3aWR0aCA9IHJlcS5xdWVyeS53IDtcblx0XHRpZiByZXEucXVlcnkuaFxuXHRcdCAgICBoZWlnaHQgPSByZXEucXVlcnkuaCA7XG5cdFx0aWYgcmVxLnF1ZXJ5LmZzXG4gICAgICAgICAgICBmb250U2l6ZSA9IHJlcS5xdWVyeS5mcyA7XG5cblx0XHR1c2VyID0gZGIudXNlcnMuZmluZE9uZShyZXEucGFyYW1zLnVzZXJJZCk7XG5cdFx0aWYgIXVzZXJcblx0XHRcdHJlcy53cml0ZUhlYWQgNDAxXG5cdFx0XHRyZXMuZW5kKClcblx0XHRcdHJldHVyblxuXG5cdFx0aWYgdXNlci5hdmF0YXJcblx0XHRcdHJlcy5zZXRIZWFkZXIgXCJMb2NhdGlvblwiLCBDcmVhdG9yLmdldFJlbGF0aXZlVXJsKFwiYXBpL2ZpbGVzL2F2YXRhcnMvXCIgKyB1c2VyLmF2YXRhcilcblx0XHRcdHJlcy53cml0ZUhlYWQgMzAyXG5cdFx0XHRyZXMuZW5kKClcblx0XHRcdHJldHVyblxuXG5cdFx0aWYgdXNlci5wcm9maWxlPy5hdmF0YXJcblx0XHRcdHJlcy5zZXRIZWFkZXIgXCJMb2NhdGlvblwiLCB1c2VyLnByb2ZpbGUuYXZhdGFyXG5cdFx0XHRyZXMud3JpdGVIZWFkIDMwMlxuXHRcdFx0cmVzLmVuZCgpXG5cdFx0XHRyZXR1cm5cblxuXHRcdGlmIHVzZXIuYXZhdGFyVXJsXG5cdFx0XHRyZXMuc2V0SGVhZGVyIFwiTG9jYXRpb25cIiwgdXNlci5hdmF0YXJVcmxcblx0XHRcdHJlcy53cml0ZUhlYWQgMzAyXG5cdFx0XHRyZXMuZW5kKClcblx0XHRcdHJldHVyblxuXG5cdFx0aWYgbm90IGZpbGU/XG5cdFx0XHRyZXMuc2V0SGVhZGVyICdDb250ZW50LURpc3Bvc2l0aW9uJywgJ2lubGluZSdcblx0XHRcdHJlcy5zZXRIZWFkZXIgJ2NvbnRlbnQtdHlwZScsICdpbWFnZS9zdmcreG1sJ1xuXHRcdFx0cmVzLnNldEhlYWRlciAnY2FjaGUtY29udHJvbCcsICdwdWJsaWMsIG1heC1hZ2U9MzE1MzYwMDAnXG5cdFx0XHRzdmcgPSBcIlwiXCJcblx0XHRcdFx0PHN2ZyB2ZXJzaW9uPVwiMS4xXCIgaWQ9XCJMYXllcl8xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCJcblx0XHRcdFx0XHQgdmlld0JveD1cIjAgMCA3MiA3MlwiIHN0eWxlPVwiZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA3MiA3MjtcIiB4bWw6c3BhY2U9XCJwcmVzZXJ2ZVwiPlxuXHRcdFx0XHQ8c3R5bGUgdHlwZT1cInRleHQvY3NzXCI+XG5cdFx0XHRcdFx0LnN0MHtmaWxsOiNGRkZGRkY7fVxuXHRcdFx0XHRcdC5zdDF7ZmlsbDojRDBEMEQwO31cblx0XHRcdFx0PC9zdHlsZT5cblx0XHRcdFx0PGc+XG5cdFx0XHRcdFx0PHBhdGggY2xhc3M9XCJzdDBcIiBkPVwiTTM2LDcxLjFjLTE5LjMsMC0zNS0xNS43LTM1LTM1czE1LjctMzUsMzUtMzVzMzUsMTUuNywzNSwzNVM1NS4zLDcxLjEsMzYsNzEuMXpcIi8+XG5cdFx0XHRcdFx0PHBhdGggY2xhc3M9XCJzdDFcIiBkPVwiTTM2LDIuMWMxOC43LDAsMzQsMTUuMywzNCwzNHMtMTUuMywzNC0zNCwzNFMyLDU0LjgsMiwzNi4xUzE3LjMsMi4xLDM2LDIuMSBNMzYsMC4xYy0xOS45LDAtMzYsMTYuMS0zNiwzNlxuXHRcdFx0XHRcdFx0czE2LjEsMzYsMzYsMzZzMzYtMTYuMSwzNi0zNlM1NS45LDAuMSwzNiwwLjFMMzYsMC4xelwiLz5cblx0XHRcdFx0PC9nPlxuXHRcdFx0XHQ8Zz5cblx0XHRcdFx0XHQ8Zz5cblx0XHRcdFx0XHRcdDxwYXRoIGNsYXNzPVwic3QxXCIgZD1cIk0zNS44LDQyLjZjOC4zLDAsMTUuMS02LjgsMTUuMS0xNS4xYzAtOC4zLTYuOC0xNS4xLTE1LjEtMTUuMWMtOC4zLDAtMTUuMSw2LjgtMTUuMSwxNS4xXG5cdFx0XHRcdFx0XHRcdEMyMC43LDM1LjgsMjcuNSw0Mi42LDM1LjgsNDIuNnpcIi8+XG5cdFx0XHRcdFx0XHQ8cGF0aCBjbGFzcz1cInN0MVwiIGQ9XCJNMzYuMiw3MC43YzguNywwLDE2LjctMy4xLDIyLjktOC4yYy0zLjYtOS42LTEyLjctMTUuNS0yMy4zLTE1LjVjLTEwLjQsMC0xOS40LDUuNy0yMy4xLDE1XG5cdFx0XHRcdFx0XHRcdEMxOSw2Ny40LDI3LjIsNzAuNywzNi4yLDcwLjd6XCIvPlxuXHRcdFx0XHRcdDwvZz5cblx0XHRcdFx0PC9nPlxuXHRcdFx0XHQ8L3N2Zz5cblx0XHRcdFwiXCJcIlxuXHRcdFx0cmVzLndyaXRlIHN2Z1xuI1x0XHRcdHJlcy5zZXRIZWFkZXIgXCJMb2NhdGlvblwiLCBTdGVlZG9zLmFic29sdXRlVXJsKFwiL3BhY2thZ2VzL3N0ZWVkb3NfYmFzZS9jbGllbnQvaW1hZ2VzL2RlZmF1bHQtYXZhdGFyLnBuZ1wiKVxuI1x0XHRcdHJlcy53cml0ZUhlYWQgMzAyXG5cdFx0XHRyZXMuZW5kKClcblx0XHRcdHJldHVyblxuXG5cdFx0dXNlcm5hbWUgPSB1c2VyLm5hbWU7XG5cdFx0aWYgIXVzZXJuYW1lXG5cdFx0XHR1c2VybmFtZSA9IFwiXCJcblxuXHRcdHJlcy5zZXRIZWFkZXIgJ0NvbnRlbnQtRGlzcG9zaXRpb24nLCAnaW5saW5lJ1xuXG5cdFx0aWYgbm90IGZpbGU/XG5cdFx0XHRyZXMuc2V0SGVhZGVyICdjb250ZW50LXR5cGUnLCAnaW1hZ2Uvc3ZnK3htbCdcblx0XHRcdHJlcy5zZXRIZWFkZXIgJ2NhY2hlLWNvbnRyb2wnLCAncHVibGljLCBtYXgtYWdlPTMxNTM2MDAwJ1xuXG5cdFx0XHRjb2xvcnMgPSBbJyNGNDQzMzYnLCcjRTkxRTYzJywnIzlDMjdCMCcsJyM2NzNBQjcnLCcjM0Y1MUI1JywnIzIxOTZGMycsJyMwM0E5RjQnLCcjMDBCQ0Q0JywnIzAwOTY4OCcsJyM0Q0FGNTAnLCcjOEJDMzRBJywnI0NEREMzOScsJyNGRkMxMDcnLCcjRkY5ODAwJywnI0ZGNTcyMicsJyM3OTU1NDgnLCcjOUU5RTlFJywnIzYwN0Q4QiddXG5cblx0XHRcdHVzZXJuYW1lX2FycmF5ID0gQXJyYXkuZnJvbSh1c2VybmFtZSlcblx0XHRcdGNvbG9yX2luZGV4ID0gMFxuXHRcdFx0Xy5lYWNoIHVzZXJuYW1lX2FycmF5LCAoaXRlbSkgLT5cblx0XHRcdFx0Y29sb3JfaW5kZXggKz0gaXRlbS5jaGFyQ29kZUF0KDApO1xuXG5cdFx0XHRwb3NpdGlvbiA9IGNvbG9yX2luZGV4ICUgY29sb3JzLmxlbmd0aFxuXHRcdFx0Y29sb3IgPSBjb2xvcnNbcG9zaXRpb25dXG5cdFx0XHQjY29sb3IgPSBcIiNENkRBRENcIlxuXG5cdFx0XHRpbml0aWFscyA9ICcnXG5cdFx0XHRpZiB1c2VybmFtZS5jaGFyQ29kZUF0KDApPjI1NVxuXHRcdFx0XHRpbml0aWFscyA9IHVzZXJuYW1lLnN1YnN0cigwLCAxKVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRpbml0aWFscyA9IHVzZXJuYW1lLnN1YnN0cigwLCAyKVxuXG5cdFx0XHRpbml0aWFscyA9IGluaXRpYWxzLnRvVXBwZXJDYXNlKClcblxuXHRcdFx0c3ZnID0gXCJcIlwiXG5cdFx0XHQ8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiIHN0YW5kYWxvbmU9XCJub1wiPz5cblx0XHRcdDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHBvaW50ZXItZXZlbnRzPVwibm9uZVwiIHdpZHRoPVwiI3t3aWR0aH1cIiBoZWlnaHQ9XCIje2hlaWdodH1cIiBzdHlsZT1cIndpZHRoOiAje3dpZHRofXB4OyBoZWlnaHQ6ICN7aGVpZ2h0fXB4OyBiYWNrZ3JvdW5kLWNvbG9yOiAje2NvbG9yfTtcIj5cblx0XHRcdFx0PHRleHQgdGV4dC1hbmNob3I9XCJtaWRkbGVcIiB5PVwiNTAlXCIgeD1cIjUwJVwiIGR5PVwiMC4zNmVtXCIgcG9pbnRlci1ldmVudHM9XCJhdXRvXCIgZmlsbD1cIiNGRkZGRkZcIiBmb250LWZhbWlseT1cIi1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgSGVsdmV0aWNhLCBBcmlhbCwgTWljcm9zb2Z0IFlhaGVpLCBTaW1IZWlcIiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA0MDA7IGZvbnQtc2l6ZTogI3tmb250U2l6ZX1weDtcIj5cblx0XHRcdFx0XHQje2luaXRpYWxzfVxuXHRcdFx0XHQ8L3RleHQ+XG5cdFx0XHQ8L3N2Zz5cblx0XHRcdFwiXCJcIlxuXG5cdFx0XHRyZXMud3JpdGUgc3ZnXG5cdFx0XHRyZXMuZW5kKClcblx0XHRcdHJldHVyblxuXG5cdFx0cmVxTW9kaWZpZWRIZWFkZXIgPSByZXEuaGVhZGVyc1tcImlmLW1vZGlmaWVkLXNpbmNlXCJdO1xuXHRcdGlmIHJlcU1vZGlmaWVkSGVhZGVyP1xuXHRcdFx0aWYgcmVxTW9kaWZpZWRIZWFkZXIgPT0gdXNlci5tb2RpZmllZD8udG9VVENTdHJpbmcoKVxuXHRcdFx0XHRyZXMuc2V0SGVhZGVyICdMYXN0LU1vZGlmaWVkJywgcmVxTW9kaWZpZWRIZWFkZXJcblx0XHRcdFx0cmVzLndyaXRlSGVhZCAzMDRcblx0XHRcdFx0cmVzLmVuZCgpXG5cdFx0XHRcdHJldHVyblxuXG5cdFx0cmVzLnNldEhlYWRlciAnTGFzdC1Nb2RpZmllZCcsIHVzZXIubW9kaWZpZWQ/LnRvVVRDU3RyaW5nKCkgb3IgbmV3IERhdGUoKS50b1VUQ1N0cmluZygpXG5cdFx0cmVzLnNldEhlYWRlciAnY29udGVudC10eXBlJywgJ2ltYWdlL2pwZWcnXG5cdFx0cmVzLnNldEhlYWRlciAnQ29udGVudC1MZW5ndGgnLCBmaWxlLmxlbmd0aFxuXG5cdFx0ZmlsZS5yZWFkU3RyZWFtLnBpcGUgcmVzXG5cdFx0cmV0dXJuIiwiTWV0ZW9yLnN0YXJ0dXAoZnVuY3Rpb24oKSB7XG4gIHJldHVybiBKc29uUm91dGVzLmFkZCgnZ2V0JywgJy9hdmF0YXIvOnVzZXJJZCcsIGZ1bmN0aW9uKHJlcSwgcmVzLCBuZXh0KSB7XG4gICAgdmFyIGNvbG9yLCBjb2xvcl9pbmRleCwgY29sb3JzLCBmb250U2l6ZSwgaGVpZ2h0LCBpbml0aWFscywgcG9zaXRpb24sIHJlZiwgcmVmMSwgcmVmMiwgcmVxTW9kaWZpZWRIZWFkZXIsIHN2ZywgdXNlciwgdXNlcm5hbWUsIHVzZXJuYW1lX2FycmF5LCB3aWR0aDtcbiAgICB3aWR0aCA9IDUwO1xuICAgIGhlaWdodCA9IDUwO1xuICAgIGZvbnRTaXplID0gMjg7XG4gICAgaWYgKHJlcS5xdWVyeS53KSB7XG4gICAgICB3aWR0aCA9IHJlcS5xdWVyeS53O1xuICAgIH1cbiAgICBpZiAocmVxLnF1ZXJ5LmgpIHtcbiAgICAgIGhlaWdodCA9IHJlcS5xdWVyeS5oO1xuICAgIH1cbiAgICBpZiAocmVxLnF1ZXJ5LmZzKSB7XG4gICAgICBmb250U2l6ZSA9IHJlcS5xdWVyeS5mcztcbiAgICB9XG4gICAgdXNlciA9IGRiLnVzZXJzLmZpbmRPbmUocmVxLnBhcmFtcy51c2VySWQpO1xuICAgIGlmICghdXNlcikge1xuICAgICAgcmVzLndyaXRlSGVhZCg0MDEpO1xuICAgICAgcmVzLmVuZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodXNlci5hdmF0YXIpIHtcbiAgICAgIHJlcy5zZXRIZWFkZXIoXCJMb2NhdGlvblwiLCBDcmVhdG9yLmdldFJlbGF0aXZlVXJsKFwiYXBpL2ZpbGVzL2F2YXRhcnMvXCIgKyB1c2VyLmF2YXRhcikpO1xuICAgICAgcmVzLndyaXRlSGVhZCgzMDIpO1xuICAgICAgcmVzLmVuZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoKHJlZiA9IHVzZXIucHJvZmlsZSkgIT0gbnVsbCA/IHJlZi5hdmF0YXIgOiB2b2lkIDApIHtcbiAgICAgIHJlcy5zZXRIZWFkZXIoXCJMb2NhdGlvblwiLCB1c2VyLnByb2ZpbGUuYXZhdGFyKTtcbiAgICAgIHJlcy53cml0ZUhlYWQoMzAyKTtcbiAgICAgIHJlcy5lbmQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHVzZXIuYXZhdGFyVXJsKSB7XG4gICAgICByZXMuc2V0SGVhZGVyKFwiTG9jYXRpb25cIiwgdXNlci5hdmF0YXJVcmwpO1xuICAgICAgcmVzLndyaXRlSGVhZCgzMDIpO1xuICAgICAgcmVzLmVuZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGZpbGUgPT09IFwidW5kZWZpbmVkXCIgfHwgZmlsZSA9PT0gbnVsbCkge1xuICAgICAgcmVzLnNldEhlYWRlcignQ29udGVudC1EaXNwb3NpdGlvbicsICdpbmxpbmUnKTtcbiAgICAgIHJlcy5zZXRIZWFkZXIoJ2NvbnRlbnQtdHlwZScsICdpbWFnZS9zdmcreG1sJyk7XG4gICAgICByZXMuc2V0SGVhZGVyKCdjYWNoZS1jb250cm9sJywgJ3B1YmxpYywgbWF4LWFnZT0zMTUzNjAwMCcpO1xuICAgICAgc3ZnID0gXCI8c3ZnIHZlcnNpb249XFxcIjEuMVxcXCIgaWQ9XFxcIkxheWVyXzFcXFwiIHhtbG5zPVxcXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1xcXCIgeG1sbnM6eGxpbms9XFxcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcXFwiIHg9XFxcIjBweFxcXCIgeT1cXFwiMHB4XFxcIlxcblx0IHZpZXdCb3g9XFxcIjAgMCA3MiA3MlxcXCIgc3R5bGU9XFxcImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNzIgNzI7XFxcIiB4bWw6c3BhY2U9XFxcInByZXNlcnZlXFxcIj5cXG48c3R5bGUgdHlwZT1cXFwidGV4dC9jc3NcXFwiPlxcblx0LnN0MHtmaWxsOiNGRkZGRkY7fVxcblx0LnN0MXtmaWxsOiNEMEQwRDA7fVxcbjwvc3R5bGU+XFxuPGc+XFxuXHQ8cGF0aCBjbGFzcz1cXFwic3QwXFxcIiBkPVxcXCJNMzYsNzEuMWMtMTkuMywwLTM1LTE1LjctMzUtMzVzMTUuNy0zNSwzNS0zNXMzNSwxNS43LDM1LDM1UzU1LjMsNzEuMSwzNiw3MS4xelxcXCIvPlxcblx0PHBhdGggY2xhc3M9XFxcInN0MVxcXCIgZD1cXFwiTTM2LDIuMWMxOC43LDAsMzQsMTUuMywzNCwzNHMtMTUuMywzNC0zNCwzNFMyLDU0LjgsMiwzNi4xUzE3LjMsMi4xLDM2LDIuMSBNMzYsMC4xYy0xOS45LDAtMzYsMTYuMS0zNiwzNlxcblx0XHRzMTYuMSwzNiwzNiwzNnMzNi0xNi4xLDM2LTM2UzU1LjksMC4xLDM2LDAuMUwzNiwwLjF6XFxcIi8+XFxuPC9nPlxcbjxnPlxcblx0PGc+XFxuXHRcdDxwYXRoIGNsYXNzPVxcXCJzdDFcXFwiIGQ9XFxcIk0zNS44LDQyLjZjOC4zLDAsMTUuMS02LjgsMTUuMS0xNS4xYzAtOC4zLTYuOC0xNS4xLTE1LjEtMTUuMWMtOC4zLDAtMTUuMSw2LjgtMTUuMSwxNS4xXFxuXHRcdFx0QzIwLjcsMzUuOCwyNy41LDQyLjYsMzUuOCw0Mi42elxcXCIvPlxcblx0XHQ8cGF0aCBjbGFzcz1cXFwic3QxXFxcIiBkPVxcXCJNMzYuMiw3MC43YzguNywwLDE2LjctMy4xLDIyLjktOC4yYy0zLjYtOS42LTEyLjctMTUuNS0yMy4zLTE1LjVjLTEwLjQsMC0xOS40LDUuNy0yMy4xLDE1XFxuXHRcdFx0QzE5LDY3LjQsMjcuMiw3MC43LDM2LjIsNzAuN3pcXFwiLz5cXG5cdDwvZz5cXG48L2c+XFxuPC9zdmc+XCI7XG4gICAgICByZXMud3JpdGUoc3ZnKTtcbiAgICAgIHJlcy5lbmQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdXNlcm5hbWUgPSB1c2VyLm5hbWU7XG4gICAgaWYgKCF1c2VybmFtZSkge1xuICAgICAgdXNlcm5hbWUgPSBcIlwiO1xuICAgIH1cbiAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uJywgJ2lubGluZScpO1xuICAgIGlmICh0eXBlb2YgZmlsZSA9PT0gXCJ1bmRlZmluZWRcIiB8fCBmaWxlID09PSBudWxsKSB7XG4gICAgICByZXMuc2V0SGVhZGVyKCdjb250ZW50LXR5cGUnLCAnaW1hZ2Uvc3ZnK3htbCcpO1xuICAgICAgcmVzLnNldEhlYWRlcignY2FjaGUtY29udHJvbCcsICdwdWJsaWMsIG1heC1hZ2U9MzE1MzYwMDAnKTtcbiAgICAgIGNvbG9ycyA9IFsnI0Y0NDMzNicsICcjRTkxRTYzJywgJyM5QzI3QjAnLCAnIzY3M0FCNycsICcjM0Y1MUI1JywgJyMyMTk2RjMnLCAnIzAzQTlGNCcsICcjMDBCQ0Q0JywgJyMwMDk2ODgnLCAnIzRDQUY1MCcsICcjOEJDMzRBJywgJyNDRERDMzknLCAnI0ZGQzEwNycsICcjRkY5ODAwJywgJyNGRjU3MjInLCAnIzc5NTU0OCcsICcjOUU5RTlFJywgJyM2MDdEOEInXTtcbiAgICAgIHVzZXJuYW1lX2FycmF5ID0gQXJyYXkuZnJvbSh1c2VybmFtZSk7XG4gICAgICBjb2xvcl9pbmRleCA9IDA7XG4gICAgICBfLmVhY2godXNlcm5hbWVfYXJyYXksIGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgcmV0dXJuIGNvbG9yX2luZGV4ICs9IGl0ZW0uY2hhckNvZGVBdCgwKTtcbiAgICAgIH0pO1xuICAgICAgcG9zaXRpb24gPSBjb2xvcl9pbmRleCAlIGNvbG9ycy5sZW5ndGg7XG4gICAgICBjb2xvciA9IGNvbG9yc1twb3NpdGlvbl07XG4gICAgICBpbml0aWFscyA9ICcnO1xuICAgICAgaWYgKHVzZXJuYW1lLmNoYXJDb2RlQXQoMCkgPiAyNTUpIHtcbiAgICAgICAgaW5pdGlhbHMgPSB1c2VybmFtZS5zdWJzdHIoMCwgMSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbml0aWFscyA9IHVzZXJuYW1lLnN1YnN0cigwLCAyKTtcbiAgICAgIH1cbiAgICAgIGluaXRpYWxzID0gaW5pdGlhbHMudG9VcHBlckNhc2UoKTtcbiAgICAgIHN2ZyA9IFwiPD94bWwgdmVyc2lvbj1cXFwiMS4wXFxcIiBlbmNvZGluZz1cXFwiVVRGLThcXFwiIHN0YW5kYWxvbmU9XFxcIm5vXFxcIj8+XFxuPHN2ZyB4bWxucz1cXFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcXFwiIHBvaW50ZXItZXZlbnRzPVxcXCJub25lXFxcIiB3aWR0aD1cXFwiXCIgKyB3aWR0aCArIFwiXFxcIiBoZWlnaHQ9XFxcIlwiICsgaGVpZ2h0ICsgXCJcXFwiIHN0eWxlPVxcXCJ3aWR0aDogXCIgKyB3aWR0aCArIFwicHg7IGhlaWdodDogXCIgKyBoZWlnaHQgKyBcInB4OyBiYWNrZ3JvdW5kLWNvbG9yOiBcIiArIGNvbG9yICsgXCI7XFxcIj5cXG5cdDx0ZXh0IHRleHQtYW5jaG9yPVxcXCJtaWRkbGVcXFwiIHk9XFxcIjUwJVxcXCIgeD1cXFwiNTAlXFxcIiBkeT1cXFwiMC4zNmVtXFxcIiBwb2ludGVyLWV2ZW50cz1cXFwiYXV0b1xcXCIgZmlsbD1cXFwiI0ZGRkZGRlxcXCIgZm9udC1mYW1pbHk9XFxcIi1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgSGVsdmV0aWNhLCBBcmlhbCwgTWljcm9zb2Z0IFlhaGVpLCBTaW1IZWlcXFwiIHN0eWxlPVxcXCJmb250LXdlaWdodDogNDAwOyBmb250LXNpemU6IFwiICsgZm9udFNpemUgKyBcInB4O1xcXCI+XFxuXHRcdFwiICsgaW5pdGlhbHMgKyBcIlxcblx0PC90ZXh0Plxcbjwvc3ZnPlwiO1xuICAgICAgcmVzLndyaXRlKHN2Zyk7XG4gICAgICByZXMuZW5kKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJlcU1vZGlmaWVkSGVhZGVyID0gcmVxLmhlYWRlcnNbXCJpZi1tb2RpZmllZC1zaW5jZVwiXTtcbiAgICBpZiAocmVxTW9kaWZpZWRIZWFkZXIgIT0gbnVsbCkge1xuICAgICAgaWYgKHJlcU1vZGlmaWVkSGVhZGVyID09PSAoKHJlZjEgPSB1c2VyLm1vZGlmaWVkKSAhPSBudWxsID8gcmVmMS50b1VUQ1N0cmluZygpIDogdm9pZCAwKSkge1xuICAgICAgICByZXMuc2V0SGVhZGVyKCdMYXN0LU1vZGlmaWVkJywgcmVxTW9kaWZpZWRIZWFkZXIpO1xuICAgICAgICByZXMud3JpdGVIZWFkKDMwNCk7XG4gICAgICAgIHJlcy5lbmQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICByZXMuc2V0SGVhZGVyKCdMYXN0LU1vZGlmaWVkJywgKChyZWYyID0gdXNlci5tb2RpZmllZCkgIT0gbnVsbCA/IHJlZjIudG9VVENTdHJpbmcoKSA6IHZvaWQgMCkgfHwgbmV3IERhdGUoKS50b1VUQ1N0cmluZygpKTtcbiAgICByZXMuc2V0SGVhZGVyKCdjb250ZW50LXR5cGUnLCAnaW1hZ2UvanBlZycpO1xuICAgIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtTGVuZ3RoJywgZmlsZS5sZW5ndGgpO1xuICAgIGZpbGUucmVhZFN0cmVhbS5waXBlKHJlcyk7XG4gIH0pO1xufSk7XG4iLCJNZXRlb3Iuc3RhcnR1cCAtPlxuXHRKc29uUm91dGVzLmFkZCAnZ2V0JywgJy9hcGkvYWNjZXNzL2NoZWNrJywgKHJlcSwgcmVzLCBuZXh0KSAtPlxuXG5cdFx0YWNjZXNzX3Rva2VuID0gcmVxLnF1ZXJ5Py5hY2Nlc3NfdG9rZW5cblxuXHRcdGlmIFN0ZWVkb3MuZ2V0VXNlcklkRnJvbUFjY2Vzc1Rva2VuKGFjY2Vzc190b2tlbilcblx0XHRcdHJlcy53cml0ZUhlYWQgMjAwXG5cdFx0XHRyZXMuZW5kKClcblx0XHRcdHJldHVyblxuXHRcdGVsc2Vcblx0XHRcdHJlcy53cml0ZUhlYWQgNDAxXG5cdFx0XHRyZXMuZW5kKClcblx0XHRcdHJldHVyblxuXG5cblxuXG4iLCJNZXRlb3Iuc3RhcnR1cChmdW5jdGlvbigpIHtcbiAgcmV0dXJuIEpzb25Sb3V0ZXMuYWRkKCdnZXQnLCAnL2FwaS9hY2Nlc3MvY2hlY2snLCBmdW5jdGlvbihyZXEsIHJlcywgbmV4dCkge1xuICAgIHZhciBhY2Nlc3NfdG9rZW4sIHJlZjtcbiAgICBhY2Nlc3NfdG9rZW4gPSAocmVmID0gcmVxLnF1ZXJ5KSAhPSBudWxsID8gcmVmLmFjY2Vzc190b2tlbiA6IHZvaWQgMDtcbiAgICBpZiAoU3RlZWRvcy5nZXRVc2VySWRGcm9tQWNjZXNzVG9rZW4oYWNjZXNzX3Rva2VuKSkge1xuICAgICAgcmVzLndyaXRlSGVhZCgyMDApO1xuICAgICAgcmVzLmVuZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXMud3JpdGVIZWFkKDQwMSk7XG4gICAgICByZXMuZW5kKCk7XG4gICAgfVxuICB9KTtcbn0pO1xuIiwiaWYgTWV0ZW9yLmlzU2VydmVyXG4gICAgTWV0ZW9yLnB1Ymxpc2ggJ2FwcHMnLCAoc3BhY2VJZCktPlxuICAgICAgICB1bmxlc3MgdGhpcy51c2VySWRcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlYWR5KClcbiAgICAgICAgXG5cbiAgICAgICAgc2VsZWN0b3IgPSB7c3BhY2U6IHskZXhpc3RzOiBmYWxzZX19XG4gICAgICAgIGlmIHNwYWNlSWRcbiAgICAgICAgICAgIHNlbGVjdG9yID0geyRvcjogW3tzcGFjZTogeyRleGlzdHM6IGZhbHNlfX0sIHtzcGFjZTogc3BhY2VJZH1dfVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIGRiLmFwcHMuZmluZChzZWxlY3Rvciwge3NvcnQ6IHtzb3J0OiAxfX0pO1xuIiwiaWYgKE1ldGVvci5pc1NlcnZlcikge1xuICBNZXRlb3IucHVibGlzaCgnYXBwcycsIGZ1bmN0aW9uKHNwYWNlSWQpIHtcbiAgICB2YXIgc2VsZWN0b3I7XG4gICAgaWYgKCF0aGlzLnVzZXJJZCkge1xuICAgICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgICB9XG4gICAgc2VsZWN0b3IgPSB7XG4gICAgICBzcGFjZToge1xuICAgICAgICAkZXhpc3RzOiBmYWxzZVxuICAgICAgfVxuICAgIH07XG4gICAgaWYgKHNwYWNlSWQpIHtcbiAgICAgIHNlbGVjdG9yID0ge1xuICAgICAgICAkb3I6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzcGFjZToge1xuICAgICAgICAgICAgICAkZXhpc3RzOiBmYWxzZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgIHNwYWNlOiBzcGFjZUlkXG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gZGIuYXBwcy5maW5kKHNlbGVjdG9yLCB7XG4gICAgICBzb3J0OiB7XG4gICAgICAgIHNvcnQ6IDFcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG4iLCJcblxuXHQjIHB1Ymxpc2ggdXNlcnMgc3BhY2VzXG5cdCMgd2Ugb25seSBwdWJsaXNoIHNwYWNlcyBjdXJyZW50IHVzZXIgam9pbmVkLlxuXHRNZXRlb3IucHVibGlzaCAnbXlfc3BhY2VzJywgLT5cblx0XHR1bmxlc3MgdGhpcy51c2VySWRcblx0XHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXG5cdFx0c2VsZiA9IHRoaXM7XG5cdFx0dXNlclNwYWNlcyA9IFtdXG5cdFx0c3VzID0gZGIuc3BhY2VfdXNlcnMuZmluZCh7dXNlcjogdGhpcy51c2VySWQsIHVzZXJfYWNjZXB0ZWQ6IHRydWV9LCB7ZmllbGRzOiB7c3BhY2U6MX19KVxuXHRcdHN1cy5mb3JFYWNoIChzdSkgLT5cblx0XHRcdHVzZXJTcGFjZXMucHVzaChzdS5zcGFjZSlcblxuXHRcdGhhbmRsZTIgPSBudWxsXG5cblx0XHQjIG9ubHkgcmV0dXJuIHVzZXIgam9pbmVkIHNwYWNlcywgYW5kIG9ic2VydmVzIHdoZW4gdXNlciBqb2luIG9yIGxlYXZlIGEgc3BhY2Vcblx0XHRoYW5kbGUgPSBkYi5zcGFjZV91c2Vycy5maW5kKHt1c2VyOiB0aGlzLnVzZXJJZCwgdXNlcl9hY2NlcHRlZDogdHJ1ZX0pLm9ic2VydmVcblx0XHRcdGFkZGVkOiAoZG9jKSAtPlxuXHRcdFx0XHRpZiBkb2Muc3BhY2Vcblx0XHRcdFx0XHRpZiB1c2VyU3BhY2VzLmluZGV4T2YoZG9jLnNwYWNlKSA8IDBcblx0XHRcdFx0XHRcdHVzZXJTcGFjZXMucHVzaChkb2Muc3BhY2UpXG5cdFx0XHRcdFx0XHRvYnNlcnZlU3BhY2VzKClcblx0XHRcdHJlbW92ZWQ6IChvbGREb2MpIC0+XG5cdFx0XHRcdGlmIG9sZERvYy5zcGFjZVxuXHRcdFx0XHRcdHNlbGYucmVtb3ZlZCBcInNwYWNlc1wiLCBvbGREb2Muc3BhY2Vcblx0XHRcdFx0XHR1c2VyU3BhY2VzID0gXy53aXRob3V0KHVzZXJTcGFjZXMsIG9sZERvYy5zcGFjZSlcblxuXHRcdG9ic2VydmVTcGFjZXMgPSAtPlxuXHRcdFx0aWYgaGFuZGxlMlxuXHRcdFx0XHRoYW5kbGUyLnN0b3AoKTtcblx0XHRcdGhhbmRsZTIgPSBkYi5zcGFjZXMuZmluZCh7X2lkOiB7JGluOiB1c2VyU3BhY2VzfX0pLm9ic2VydmVcblx0XHRcdFx0YWRkZWQ6IChkb2MpIC0+XG5cdFx0XHRcdFx0c2VsZi5hZGRlZCBcInNwYWNlc1wiLCBkb2MuX2lkLCBkb2M7XG5cdFx0XHRcdFx0dXNlclNwYWNlcy5wdXNoKGRvYy5faWQpXG5cdFx0XHRcdGNoYW5nZWQ6IChuZXdEb2MsIG9sZERvYykgLT5cblx0XHRcdFx0XHRzZWxmLmNoYW5nZWQgXCJzcGFjZXNcIiwgbmV3RG9jLl9pZCwgbmV3RG9jO1xuXHRcdFx0XHRyZW1vdmVkOiAob2xkRG9jKSAtPlxuXHRcdFx0XHRcdHNlbGYucmVtb3ZlZCBcInNwYWNlc1wiLCBvbGREb2MuX2lkXG5cdFx0XHRcdFx0dXNlclNwYWNlcyA9IF8ud2l0aG91dCh1c2VyU3BhY2VzLCBvbGREb2MuX2lkKVxuXG5cdFx0b2JzZXJ2ZVNwYWNlcygpO1xuXG5cdFx0c2VsZi5yZWFkeSgpO1xuXG5cdFx0c2VsZi5vblN0b3AgLT5cblx0XHRcdGhhbmRsZS5zdG9wKCk7XG5cdFx0XHRpZiBoYW5kbGUyXG5cdFx0XHRcdGhhbmRsZTIuc3RvcCgpO1xuIiwiTWV0ZW9yLnB1Ymxpc2goJ215X3NwYWNlcycsIGZ1bmN0aW9uKCkge1xuICB2YXIgaGFuZGxlLCBoYW5kbGUyLCBvYnNlcnZlU3BhY2VzLCBzZWxmLCBzdXMsIHVzZXJTcGFjZXM7XG4gIGlmICghdGhpcy51c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIHNlbGYgPSB0aGlzO1xuICB1c2VyU3BhY2VzID0gW107XG4gIHN1cyA9IGRiLnNwYWNlX3VzZXJzLmZpbmQoe1xuICAgIHVzZXI6IHRoaXMudXNlcklkLFxuICAgIHVzZXJfYWNjZXB0ZWQ6IHRydWVcbiAgfSwge1xuICAgIGZpZWxkczoge1xuICAgICAgc3BhY2U6IDFcbiAgICB9XG4gIH0pO1xuICBzdXMuZm9yRWFjaChmdW5jdGlvbihzdSkge1xuICAgIHJldHVybiB1c2VyU3BhY2VzLnB1c2goc3Uuc3BhY2UpO1xuICB9KTtcbiAgaGFuZGxlMiA9IG51bGw7XG4gIGhhbmRsZSA9IGRiLnNwYWNlX3VzZXJzLmZpbmQoe1xuICAgIHVzZXI6IHRoaXMudXNlcklkLFxuICAgIHVzZXJfYWNjZXB0ZWQ6IHRydWVcbiAgfSkub2JzZXJ2ZSh7XG4gICAgYWRkZWQ6IGZ1bmN0aW9uKGRvYykge1xuICAgICAgaWYgKGRvYy5zcGFjZSkge1xuICAgICAgICBpZiAodXNlclNwYWNlcy5pbmRleE9mKGRvYy5zcGFjZSkgPCAwKSB7XG4gICAgICAgICAgdXNlclNwYWNlcy5wdXNoKGRvYy5zcGFjZSk7XG4gICAgICAgICAgcmV0dXJuIG9ic2VydmVTcGFjZXMoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgcmVtb3ZlZDogZnVuY3Rpb24ob2xkRG9jKSB7XG4gICAgICBpZiAob2xkRG9jLnNwYWNlKSB7XG4gICAgICAgIHNlbGYucmVtb3ZlZChcInNwYWNlc1wiLCBvbGREb2Muc3BhY2UpO1xuICAgICAgICByZXR1cm4gdXNlclNwYWNlcyA9IF8ud2l0aG91dCh1c2VyU3BhY2VzLCBvbGREb2Muc3BhY2UpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIG9ic2VydmVTcGFjZXMgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAoaGFuZGxlMikge1xuICAgICAgaGFuZGxlMi5zdG9wKCk7XG4gICAgfVxuICAgIHJldHVybiBoYW5kbGUyID0gZGIuc3BhY2VzLmZpbmQoe1xuICAgICAgX2lkOiB7XG4gICAgICAgICRpbjogdXNlclNwYWNlc1xuICAgICAgfVxuICAgIH0pLm9ic2VydmUoe1xuICAgICAgYWRkZWQ6IGZ1bmN0aW9uKGRvYykge1xuICAgICAgICBzZWxmLmFkZGVkKFwic3BhY2VzXCIsIGRvYy5faWQsIGRvYyk7XG4gICAgICAgIHJldHVybiB1c2VyU3BhY2VzLnB1c2goZG9jLl9pZCk7XG4gICAgICB9LFxuICAgICAgY2hhbmdlZDogZnVuY3Rpb24obmV3RG9jLCBvbGREb2MpIHtcbiAgICAgICAgcmV0dXJuIHNlbGYuY2hhbmdlZChcInNwYWNlc1wiLCBuZXdEb2MuX2lkLCBuZXdEb2MpO1xuICAgICAgfSxcbiAgICAgIHJlbW92ZWQ6IGZ1bmN0aW9uKG9sZERvYykge1xuICAgICAgICBzZWxmLnJlbW92ZWQoXCJzcGFjZXNcIiwgb2xkRG9jLl9pZCk7XG4gICAgICAgIHJldHVybiB1c2VyU3BhY2VzID0gXy53aXRob3V0KHVzZXJTcGFjZXMsIG9sZERvYy5faWQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuICBvYnNlcnZlU3BhY2VzKCk7XG4gIHNlbGYucmVhZHkoKTtcbiAgcmV0dXJuIHNlbGYub25TdG9wKGZ1bmN0aW9uKCkge1xuICAgIGhhbmRsZS5zdG9wKCk7XG4gICAgaWYgKGhhbmRsZTIpIHtcbiAgICAgIHJldHVybiBoYW5kbGUyLnN0b3AoKTtcbiAgICB9XG4gIH0pO1xufSk7XG4iLCIjIHB1Ymxpc2ggc29tZSBvbmUgc3BhY2UncyBhdmF0YXJcbk1ldGVvci5wdWJsaXNoICdzcGFjZV9hdmF0YXInLCAoc3BhY2VJZCktPlxuXHR1bmxlc3Mgc3BhY2VJZFxuXHRcdHJldHVybiB0aGlzLnJlYWR5KClcblxuXHRyZXR1cm4gZGIuc3BhY2VzLmZpbmQoe19pZDogc3BhY2VJZH0sIHtmaWVsZHM6IHthdmF0YXI6IDEsbmFtZTogMSxlbmFibGVfcmVnaXN0ZXI6MX19KTtcbiIsIk1ldGVvci5wdWJsaXNoKCdzcGFjZV9hdmF0YXInLCBmdW5jdGlvbihzcGFjZUlkKSB7XG4gIGlmICghc3BhY2VJZCkge1xuICAgIHJldHVybiB0aGlzLnJlYWR5KCk7XG4gIH1cbiAgcmV0dXJuIGRiLnNwYWNlcy5maW5kKHtcbiAgICBfaWQ6IHNwYWNlSWRcbiAgfSwge1xuICAgIGZpZWxkczoge1xuICAgICAgYXZhdGFyOiAxLFxuICAgICAgbmFtZTogMSxcbiAgICAgIGVuYWJsZV9yZWdpc3RlcjogMVxuICAgIH1cbiAgfSk7XG59KTtcbiIsIk1ldGVvci5wdWJsaXNoICdtb2R1bGVzJywgKCktPlxuXHR1bmxlc3MgdGhpcy51c2VySWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0cmV0dXJuIGRiLm1vZHVsZXMuZmluZCgpOyIsIk1ldGVvci5wdWJsaXNoKCdtb2R1bGVzJywgZnVuY3Rpb24oKSB7XG4gIGlmICghdGhpcy51c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIHJldHVybiBkYi5tb2R1bGVzLmZpbmQoKTtcbn0pO1xuIiwiTWV0ZW9yLnB1Ymxpc2ggJ2JpbGxpbmdfd2VpeGluX3BheV9jb2RlX3VybCcsIChfaWQpLT5cblx0dW5sZXNzIHRoaXMudXNlcklkXG5cdFx0cmV0dXJuIHRoaXMucmVhZHkoKVxuXG5cdHVubGVzcyBfaWRcblx0XHRyZXR1cm4gdGhpcy5yZWFkeSgpXG5cblx0cmV0dXJuIGRiLmJpbGxpbmdfcGF5X3JlY29yZHMuZmluZCh7X2lkOiBfaWR9KTsiLCJNZXRlb3IucHVibGlzaCgnYmlsbGluZ193ZWl4aW5fcGF5X2NvZGVfdXJsJywgZnVuY3Rpb24oX2lkKSB7XG4gIGlmICghdGhpcy51c2VySWQpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkeSgpO1xuICB9XG4gIGlmICghX2lkKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZHkoKTtcbiAgfVxuICByZXR1cm4gZGIuYmlsbGluZ19wYXlfcmVjb3Jkcy5maW5kKHtcbiAgICBfaWQ6IF9pZFxuICB9KTtcbn0pO1xuIiwiSnNvblJvdXRlcy5hZGQgJ3Bvc3QnLCAnL2FwaS9iaWxsaW5nL3JlY2hhcmdlL25vdGlmeScsIChyZXEsIHJlcywgbmV4dCkgLT5cblx0dHJ5XG5cdFx0Ym9keSA9IFwiXCJcblx0XHRyZXEub24oJ2RhdGEnLCAoY2h1bmspLT5cblx0XHRcdGJvZHkgKz0gY2h1bmtcblx0XHQpXG5cdFx0cmVxLm9uKCdlbmQnLCBNZXRlb3IuYmluZEVudmlyb25tZW50KCgoKS0+XG5cdFx0XHRcdHhtbDJqcyA9IHJlcXVpcmUoJ3htbDJqcycpXG5cdFx0XHRcdHBhcnNlciA9IG5ldyB4bWwyanMuUGFyc2VyKHsgdHJpbTp0cnVlLCBleHBsaWNpdEFycmF5OmZhbHNlLCBleHBsaWNpdFJvb3Q6ZmFsc2UgfSlcblx0XHRcdFx0cGFyc2VyLnBhcnNlU3RyaW5nKGJvZHksIChlcnIsIHJlc3VsdCktPlxuXHRcdFx0XHRcdFx0IyDnibnliKvmj5DphpLvvJrllYbmiLfns7vnu5/lr7nkuo7mlK/ku5jnu5PmnpzpgJrnn6XnmoTlhoXlrrnkuIDlrpropoHlgZrnrb7lkI3pqozor4Es5bm25qCh6aqM6L+U5Zue55qE6K6i5Y2V6YeR6aKd5piv5ZCm5LiO5ZWG5oi35L6n55qE6K6i5Y2V6YeR6aKd5LiA6Ie077yM6Ziy5q2i5pWw5o2u5rOE5ryP5a+86Ie05Ye6546w4oCc5YGH6YCa55+l4oCd77yM6YCg5oiQ6LWE6YeR5o2f5aSxXG5cdFx0XHRcdFx0XHRXWFBheSA9IHJlcXVpcmUoJ3dlaXhpbi1wYXknKVxuXHRcdFx0XHRcdFx0d3hwYXkgPSBXWFBheSh7XG5cdFx0XHRcdFx0XHRcdGFwcGlkOiBNZXRlb3Iuc2V0dGluZ3MuYmlsbGluZy5hcHBpZCxcblx0XHRcdFx0XHRcdFx0bWNoX2lkOiBNZXRlb3Iuc2V0dGluZ3MuYmlsbGluZy5tY2hfaWQsXG5cdFx0XHRcdFx0XHRcdHBhcnRuZXJfa2V5OiBNZXRlb3Iuc2V0dGluZ3MuYmlsbGluZy5wYXJ0bmVyX2tleSAj5b6u5L+h5ZWG5oi35bmz5Y+wQVBJ5a+G6ZKlXG5cdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0c2lnbiA9IHd4cGF5LnNpZ24oXy5jbG9uZShyZXN1bHQpKVxuXHRcdFx0XHRcdFx0YXR0YWNoID0gSlNPTi5wYXJzZShyZXN1bHQuYXR0YWNoKVxuXHRcdFx0XHRcdFx0Y29kZV91cmxfaWQgPSBhdHRhY2guY29kZV91cmxfaWRcblx0XHRcdFx0XHRcdGJwciA9IGRiLmJpbGxpbmdfcGF5X3JlY29yZHMuZmluZE9uZShjb2RlX3VybF9pZClcblx0XHRcdFx0XHRcdGlmIGJwciBhbmQgYnByLnRvdGFsX2ZlZSBpcyBOdW1iZXIocmVzdWx0LnRvdGFsX2ZlZSkgYW5kIHNpZ24gaXMgcmVzdWx0LnNpZ25cblx0XHRcdFx0XHRcdFx0ZGIuYmlsbGluZ19wYXlfcmVjb3Jkcy51cGRhdGUoe19pZDogY29kZV91cmxfaWR9LCB7JHNldDoge3BhaWQ6IHRydWV9fSlcblx0XHRcdFx0XHRcdFx0YmlsbGluZ01hbmFnZXIuc3BlY2lhbF9wYXkoYnByLnNwYWNlLCBicHIubW9kdWxlcywgTnVtYmVyKHJlc3VsdC50b3RhbF9mZWUpLCBicHIuY3JlYXRlZF9ieSwgYnByLmVuZF9kYXRlLCBicHIudXNlcl9jb3VudClcblx0XHRcdFx0XHRcblx0XHRcdFx0KVxuXHRcdFx0KSwgKGVyciktPlxuXHRcdFx0XHRjb25zb2xlLmVycm9yIGVyci5zdGFja1xuXHRcdFx0XHRjb25zb2xlLmxvZyAnRmFpbGVkIHRvIGJpbmQgZW52aXJvbm1lbnQ6IGFwaV9iaWxsaW5nX3JlY2hhcmdlX25vdGlmeS5jb2ZmZWUnXG5cdFx0XHQpXG5cdFx0KVxuXHRcdFxuXHRjYXRjaCBlXG5cdFx0Y29uc29sZS5lcnJvciBlLnN0YWNrXG5cblx0cmVzLndyaXRlSGVhZCgyMDAsIHsnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3htbCd9KVxuXHRyZXMuZW5kKCc8eG1sPjxyZXR1cm5fY29kZT48IVtDREFUQVtTVUNDRVNTXV0+PC9yZXR1cm5fY29kZT48L3htbD4nKVxuXG5cdFx0IiwiSnNvblJvdXRlcy5hZGQoJ3Bvc3QnLCAnL2FwaS9iaWxsaW5nL3JlY2hhcmdlL25vdGlmeScsIGZ1bmN0aW9uKHJlcSwgcmVzLCBuZXh0KSB7XG4gIHZhciBib2R5LCBlO1xuICB0cnkge1xuICAgIGJvZHkgPSBcIlwiO1xuICAgIHJlcS5vbignZGF0YScsIGZ1bmN0aW9uKGNodW5rKSB7XG4gICAgICByZXR1cm4gYm9keSArPSBjaHVuaztcbiAgICB9KTtcbiAgICByZXEub24oJ2VuZCcsIE1ldGVvci5iaW5kRW52aXJvbm1lbnQoKGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHBhcnNlciwgeG1sMmpzO1xuICAgICAgeG1sMmpzID0gcmVxdWlyZSgneG1sMmpzJyk7XG4gICAgICBwYXJzZXIgPSBuZXcgeG1sMmpzLlBhcnNlcih7XG4gICAgICAgIHRyaW06IHRydWUsXG4gICAgICAgIGV4cGxpY2l0QXJyYXk6IGZhbHNlLFxuICAgICAgICBleHBsaWNpdFJvb3Q6IGZhbHNlXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBwYXJzZXIucGFyc2VTdHJpbmcoYm9keSwgZnVuY3Rpb24oZXJyLCByZXN1bHQpIHtcbiAgICAgICAgdmFyIFdYUGF5LCBhdHRhY2gsIGJwciwgY29kZV91cmxfaWQsIHNpZ24sIHd4cGF5O1xuICAgICAgICBXWFBheSA9IHJlcXVpcmUoJ3dlaXhpbi1wYXknKTtcbiAgICAgICAgd3hwYXkgPSBXWFBheSh7XG4gICAgICAgICAgYXBwaWQ6IE1ldGVvci5zZXR0aW5ncy5iaWxsaW5nLmFwcGlkLFxuICAgICAgICAgIG1jaF9pZDogTWV0ZW9yLnNldHRpbmdzLmJpbGxpbmcubWNoX2lkLFxuICAgICAgICAgIHBhcnRuZXJfa2V5OiBNZXRlb3Iuc2V0dGluZ3MuYmlsbGluZy5wYXJ0bmVyX2tleVxuICAgICAgICB9KTtcbiAgICAgICAgc2lnbiA9IHd4cGF5LnNpZ24oXy5jbG9uZShyZXN1bHQpKTtcbiAgICAgICAgYXR0YWNoID0gSlNPTi5wYXJzZShyZXN1bHQuYXR0YWNoKTtcbiAgICAgICAgY29kZV91cmxfaWQgPSBhdHRhY2guY29kZV91cmxfaWQ7XG4gICAgICAgIGJwciA9IGRiLmJpbGxpbmdfcGF5X3JlY29yZHMuZmluZE9uZShjb2RlX3VybF9pZCk7XG4gICAgICAgIGlmIChicHIgJiYgYnByLnRvdGFsX2ZlZSA9PT0gTnVtYmVyKHJlc3VsdC50b3RhbF9mZWUpICYmIHNpZ24gPT09IHJlc3VsdC5zaWduKSB7XG4gICAgICAgICAgZGIuYmlsbGluZ19wYXlfcmVjb3Jkcy51cGRhdGUoe1xuICAgICAgICAgICAgX2lkOiBjb2RlX3VybF9pZFxuICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICRzZXQ6IHtcbiAgICAgICAgICAgICAgcGFpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBiaWxsaW5nTWFuYWdlci5zcGVjaWFsX3BheShicHIuc3BhY2UsIGJwci5tb2R1bGVzLCBOdW1iZXIocmVzdWx0LnRvdGFsX2ZlZSksIGJwci5jcmVhdGVkX2J5LCBicHIuZW5kX2RhdGUsIGJwci51c2VyX2NvdW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSksIGZ1bmN0aW9uKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnIuc3RhY2spO1xuICAgICAgcmV0dXJuIGNvbnNvbGUubG9nKCdGYWlsZWQgdG8gYmluZCBlbnZpcm9ubWVudDogYXBpX2JpbGxpbmdfcmVjaGFyZ2Vfbm90aWZ5LmNvZmZlZScpO1xuICAgIH0pKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBlID0gZXJyb3I7XG4gICAgY29uc29sZS5lcnJvcihlLnN0YWNrKTtcbiAgfVxuICByZXMud3JpdGVIZWFkKDIwMCwge1xuICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24veG1sJ1xuICB9KTtcbiAgcmV0dXJuIHJlcy5lbmQoJzx4bWw+PHJldHVybl9jb2RlPjwhW0NEQVRBW1NVQ0NFU1NdXT48L3JldHVybl9jb2RlPjwveG1sPicpO1xufSk7XG4iLCJNZXRlb3IubWV0aG9kc1xuXHRnZXRfY29udGFjdHNfbGltaXQ6IChzcGFjZSktPlxuXHRcdCMg5qC55o2u5b2T5YmN55So5oi35omA5bGe57uE57uH77yM5p+l6K+i5Ye65b2T5YmN55So5oi36ZmQ5a6a55qE57uE57uH5p+l55yL6IyD5Zu0XG5cdFx0IyDov5Tlm57nmoRpc0xpbWl05Li6dHJ1ZeihqOekuumZkOWumuWcqOW9k+WJjeeUqOaIt+aJgOWcqOe7hOe7h+iMg+WbtO+8jG9yZ2FuaXphdGlvbnPlgLzorrDlvZXpop3lpJbnmoTnu4Tnu4fojIPlm7Rcblx0XHQjIOi/lOWbnueahGlzTGltaXTkuLpmYWxzZeihqOekuuS4jemZkOWumue7hOe7h+iMg+WbtO+8jOWNs+ihqOekuuiDveeci+aVtOS4quW3peS9nOWMuueahOe7hOe7h1xuXHRcdCMg6buY6K6k6L+U5Zue6ZmQ5a6a5Zyo5b2T5YmN55So5oi35omA5bGe57uE57uHXG5cdFx0Y2hlY2sgc3BhY2UsIFN0cmluZ1xuXHRcdHJlVmFsdWUgPVxuXHRcdFx0aXNMaW1pdDogdHJ1ZVxuXHRcdFx0b3V0c2lkZV9vcmdhbml6YXRpb25zOiBbXVxuXHRcdHVubGVzcyB0aGlzLnVzZXJJZFxuXHRcdFx0cmV0dXJuIHJlVmFsdWVcblx0XHRpc0xpbWl0ID0gZmFsc2Vcblx0XHRvdXRzaWRlX29yZ2FuaXphdGlvbnMgPSBbXVxuXHRcdHNldHRpbmcgPSBkYi5zcGFjZV9zZXR0aW5ncy5maW5kT25lKHtzcGFjZTogc3BhY2UsIGtleTogXCJjb250YWN0c192aWV3X2xpbWl0c1wifSlcblx0XHRsaW1pdHMgPSBzZXR0aW5nPy52YWx1ZXMgfHwgW107XG5cblx0XHRpZiBsaW1pdHMubGVuZ3RoXG5cdFx0XHRteU9yZ3MgPSBkYi5vcmdhbml6YXRpb25zLmZpbmQoe3NwYWNlOiBzcGFjZSwgdXNlcnM6IHRoaXMudXNlcklkfSwge2ZpZWxkczp7X2lkOiAxfX0pXG5cdFx0XHRteU9yZ0lkcyA9IG15T3Jncy5tYXAgKG4pIC0+XG5cdFx0XHRcdHJldHVybiBuLl9pZFxuXHRcdFx0dW5sZXNzIG15T3JnSWRzLmxlbmd0aFxuXHRcdFx0XHRyZXR1cm4gcmVWYWx1ZVxuXHRcdFx0XG5cdFx0XHRteUxpdG1pdE9yZ0lkcyA9IFtdXG5cdFx0XHRmb3IgbGltaXQgaW4gbGltaXRzXG5cdFx0XHRcdGZyb21zID0gbGltaXQuZnJvbXNcblx0XHRcdFx0dG9zID0gbGltaXQudG9zXG5cdFx0XHRcdGZyb21zQ2hpbGRyZW4gPSBkYi5vcmdhbml6YXRpb25zLmZpbmQoe3NwYWNlOiBzcGFjZSwgcGFyZW50czogeyRpbjogZnJvbXN9fSwge2ZpZWxkczp7X2lkOiAxfX0pXG5cdFx0XHRcdGZyb21zQ2hpbGRyZW5JZHMgPSBmcm9tc0NoaWxkcmVuPy5tYXAgKG4pIC0+XG5cdFx0XHRcdFx0cmV0dXJuIG4uX2lkXG5cdFx0XHRcdGZvciBteU9yZ0lkIGluIG15T3JnSWRzXG5cdFx0XHRcdFx0dGVtcElzTGltaXQgPSBmYWxzZVxuXHRcdFx0XHRcdGlmIGZyb21zLmluZGV4T2YobXlPcmdJZCkgPiAtMVxuXHRcdFx0XHRcdFx0dGVtcElzTGltaXQgPSB0cnVlXG5cdFx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdFx0aWYgZnJvbXNDaGlsZHJlbklkcy5pbmRleE9mKG15T3JnSWQpID4gLTFcblx0XHRcdFx0XHRcdFx0dGVtcElzTGltaXQgPSB0cnVlXG5cdFx0XHRcdFx0aWYgdGVtcElzTGltaXRcblx0XHRcdFx0XHRcdGlzTGltaXQgPSB0cnVlXG5cdFx0XHRcdFx0XHRvdXRzaWRlX29yZ2FuaXphdGlvbnMucHVzaCB0b3Ncblx0XHRcdFx0XHRcdG15TGl0bWl0T3JnSWRzLnB1c2ggbXlPcmdJZFxuXG5cdFx0XHRteUxpdG1pdE9yZ0lkcyA9IF8udW5pcSBteUxpdG1pdE9yZ0lkc1xuXHRcdFx0aWYgbXlMaXRtaXRPcmdJZHMubGVuZ3RoIDwgbXlPcmdJZHMubGVuZ3RoXG5cdFx0XHRcdCMg5aaC5p6c5Y+X6ZmQ55qE57uE57uH5Liq5pWw5bCP5LqO55So5oi35omA5bGe57uE57uH55qE5Liq5pWw77yM5YiZ6K+05piO5b2T5YmN55So5oi36Iez5bCR5pyJ5LiA5Liq57uE57uH5piv5LiN5Y+X6ZmQ55qEXG5cdFx0XHRcdGlzTGltaXQgPSBmYWxzZVxuXHRcdFx0XHRvdXRzaWRlX29yZ2FuaXphdGlvbnMgPSBbXVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHRvdXRzaWRlX29yZ2FuaXphdGlvbnMgPSBfLnVuaXEgXy5mbGF0dGVuIG91dHNpZGVfb3JnYW5pemF0aW9uc1xuXG5cdFx0aWYgaXNMaW1pdFxuXHRcdFx0dG9PcmdzID0gZGIub3JnYW5pemF0aW9ucy5maW5kKHtzcGFjZTogc3BhY2UsIF9pZDogeyRpbjogb3V0c2lkZV9vcmdhbml6YXRpb25zfX0sIHtmaWVsZHM6e19pZDogMSwgcGFyZW50czogMX19KS5mZXRjaCgpXG5cdFx0XHQjIOaKim91dHNpZGVfb3JnYW5pemF0aW9uc+S4reacieeItuWtkOiKgueCueWFs+ezu+eahOiKgueCueetm+mAieWHuuadpeW5tuWPluWHuuacgOWkluWxguiKgueCuVxuXHRcdFx0IyDmiopvdXRzaWRlX29yZ2FuaXphdGlvbnPkuK3mnInlsZ7kuo7nlKjmiLfmiYDlsZ7nu4Tnu4fnmoTlrZDlrZnoioLngrnnmoToioLngrnliKDpmaRcblx0XHRcdG9yZ3MgPSBfLmZpbHRlciB0b09yZ3MsIChvcmcpIC0+XG5cdFx0XHRcdHBhcmVudHMgPSBvcmcucGFyZW50cyBvciBbXVxuXHRcdFx0XHRyZXR1cm4gXy5pbnRlcnNlY3Rpb24ocGFyZW50cywgb3V0c2lkZV9vcmdhbml6YXRpb25zKS5sZW5ndGggPCAxIGFuZCBfLmludGVyc2VjdGlvbihwYXJlbnRzLCBteU9yZ0lkcykubGVuZ3RoIDwgMVxuXHRcdFx0b3V0c2lkZV9vcmdhbml6YXRpb25zID0gb3Jncy5tYXAgKG4pIC0+XG5cdFx0XHRcdHJldHVybiBuLl9pZFxuXG5cdFx0cmVWYWx1ZS5pc0xpbWl0ID0gaXNMaW1pdFxuXHRcdHJlVmFsdWUub3V0c2lkZV9vcmdhbml6YXRpb25zID0gb3V0c2lkZV9vcmdhbml6YXRpb25zXG5cdFx0cmV0dXJuIHJlVmFsdWVcbiIsIk1ldGVvci5tZXRob2RzKHtcbiAgZ2V0X2NvbnRhY3RzX2xpbWl0OiBmdW5jdGlvbihzcGFjZSkge1xuICAgIHZhciBmcm9tcywgZnJvbXNDaGlsZHJlbiwgZnJvbXNDaGlsZHJlbklkcywgaSwgaXNMaW1pdCwgaiwgbGVuLCBsZW4xLCBsaW1pdCwgbGltaXRzLCBteUxpdG1pdE9yZ0lkcywgbXlPcmdJZCwgbXlPcmdJZHMsIG15T3Jncywgb3Jncywgb3V0c2lkZV9vcmdhbml6YXRpb25zLCByZVZhbHVlLCBzZXR0aW5nLCB0ZW1wSXNMaW1pdCwgdG9PcmdzLCB0b3M7XG4gICAgY2hlY2soc3BhY2UsIFN0cmluZyk7XG4gICAgcmVWYWx1ZSA9IHtcbiAgICAgIGlzTGltaXQ6IHRydWUsXG4gICAgICBvdXRzaWRlX29yZ2FuaXphdGlvbnM6IFtdXG4gICAgfTtcbiAgICBpZiAoIXRoaXMudXNlcklkKSB7XG4gICAgICByZXR1cm4gcmVWYWx1ZTtcbiAgICB9XG4gICAgaXNMaW1pdCA9IGZhbHNlO1xuICAgIG91dHNpZGVfb3JnYW5pemF0aW9ucyA9IFtdO1xuICAgIHNldHRpbmcgPSBkYi5zcGFjZV9zZXR0aW5ncy5maW5kT25lKHtcbiAgICAgIHNwYWNlOiBzcGFjZSxcbiAgICAgIGtleTogXCJjb250YWN0c192aWV3X2xpbWl0c1wiXG4gICAgfSk7XG4gICAgbGltaXRzID0gKHNldHRpbmcgIT0gbnVsbCA/IHNldHRpbmcudmFsdWVzIDogdm9pZCAwKSB8fCBbXTtcbiAgICBpZiAobGltaXRzLmxlbmd0aCkge1xuICAgICAgbXlPcmdzID0gZGIub3JnYW5pemF0aW9ucy5maW5kKHtcbiAgICAgICAgc3BhY2U6IHNwYWNlLFxuICAgICAgICB1c2VyczogdGhpcy51c2VySWRcbiAgICAgIH0sIHtcbiAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgX2lkOiAxXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgbXlPcmdJZHMgPSBteU9yZ3MubWFwKGZ1bmN0aW9uKG4pIHtcbiAgICAgICAgcmV0dXJuIG4uX2lkO1xuICAgICAgfSk7XG4gICAgICBpZiAoIW15T3JnSWRzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gcmVWYWx1ZTtcbiAgICAgIH1cbiAgICAgIG15TGl0bWl0T3JnSWRzID0gW107XG4gICAgICBmb3IgKGkgPSAwLCBsZW4gPSBsaW1pdHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgbGltaXQgPSBsaW1pdHNbaV07XG4gICAgICAgIGZyb21zID0gbGltaXQuZnJvbXM7XG4gICAgICAgIHRvcyA9IGxpbWl0LnRvcztcbiAgICAgICAgZnJvbXNDaGlsZHJlbiA9IGRiLm9yZ2FuaXphdGlvbnMuZmluZCh7XG4gICAgICAgICAgc3BhY2U6IHNwYWNlLFxuICAgICAgICAgIHBhcmVudHM6IHtcbiAgICAgICAgICAgICRpbjogZnJvbXNcbiAgICAgICAgICB9XG4gICAgICAgIH0sIHtcbiAgICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICAgIF9pZDogMVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGZyb21zQ2hpbGRyZW5JZHMgPSBmcm9tc0NoaWxkcmVuICE9IG51bGwgPyBmcm9tc0NoaWxkcmVuLm1hcChmdW5jdGlvbihuKSB7XG4gICAgICAgICAgcmV0dXJuIG4uX2lkO1xuICAgICAgICB9KSA6IHZvaWQgMDtcbiAgICAgICAgZm9yIChqID0gMCwgbGVuMSA9IG15T3JnSWRzLmxlbmd0aDsgaiA8IGxlbjE7IGorKykge1xuICAgICAgICAgIG15T3JnSWQgPSBteU9yZ0lkc1tqXTtcbiAgICAgICAgICB0ZW1wSXNMaW1pdCA9IGZhbHNlO1xuICAgICAgICAgIGlmIChmcm9tcy5pbmRleE9mKG15T3JnSWQpID4gLTEpIHtcbiAgICAgICAgICAgIHRlbXBJc0xpbWl0ID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGZyb21zQ2hpbGRyZW5JZHMuaW5kZXhPZihteU9yZ0lkKSA+IC0xKSB7XG4gICAgICAgICAgICAgIHRlbXBJc0xpbWl0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRlbXBJc0xpbWl0KSB7XG4gICAgICAgICAgICBpc0xpbWl0ID0gdHJ1ZTtcbiAgICAgICAgICAgIG91dHNpZGVfb3JnYW5pemF0aW9ucy5wdXNoKHRvcyk7XG4gICAgICAgICAgICBteUxpdG1pdE9yZ0lkcy5wdXNoKG15T3JnSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbXlMaXRtaXRPcmdJZHMgPSBfLnVuaXEobXlMaXRtaXRPcmdJZHMpO1xuICAgICAgaWYgKG15TGl0bWl0T3JnSWRzLmxlbmd0aCA8IG15T3JnSWRzLmxlbmd0aCkge1xuICAgICAgICBpc0xpbWl0ID0gZmFsc2U7XG4gICAgICAgIG91dHNpZGVfb3JnYW5pemF0aW9ucyA9IFtdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0c2lkZV9vcmdhbml6YXRpb25zID0gXy51bmlxKF8uZmxhdHRlbihvdXRzaWRlX29yZ2FuaXphdGlvbnMpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzTGltaXQpIHtcbiAgICAgIHRvT3JncyA9IGRiLm9yZ2FuaXphdGlvbnMuZmluZCh7XG4gICAgICAgIHNwYWNlOiBzcGFjZSxcbiAgICAgICAgX2lkOiB7XG4gICAgICAgICAgJGluOiBvdXRzaWRlX29yZ2FuaXphdGlvbnNcbiAgICAgICAgfVxuICAgICAgfSwge1xuICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICBfaWQ6IDEsXG4gICAgICAgICAgcGFyZW50czogMVxuICAgICAgICB9XG4gICAgICB9KS5mZXRjaCgpO1xuICAgICAgb3JncyA9IF8uZmlsdGVyKHRvT3JncywgZnVuY3Rpb24ob3JnKSB7XG4gICAgICAgIHZhciBwYXJlbnRzO1xuICAgICAgICBwYXJlbnRzID0gb3JnLnBhcmVudHMgfHwgW107XG4gICAgICAgIHJldHVybiBfLmludGVyc2VjdGlvbihwYXJlbnRzLCBvdXRzaWRlX29yZ2FuaXphdGlvbnMpLmxlbmd0aCA8IDEgJiYgXy5pbnRlcnNlY3Rpb24ocGFyZW50cywgbXlPcmdJZHMpLmxlbmd0aCA8IDE7XG4gICAgICB9KTtcbiAgICAgIG91dHNpZGVfb3JnYW5pemF0aW9ucyA9IG9yZ3MubWFwKGZ1bmN0aW9uKG4pIHtcbiAgICAgICAgcmV0dXJuIG4uX2lkO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJlVmFsdWUuaXNMaW1pdCA9IGlzTGltaXQ7XG4gICAgcmVWYWx1ZS5vdXRzaWRlX29yZ2FuaXphdGlvbnMgPSBvdXRzaWRlX29yZ2FuaXphdGlvbnM7XG4gICAgcmV0dXJuIHJlVmFsdWU7XG4gIH1cbn0pO1xuIiwiTWV0ZW9yLm1ldGhvZHMoe1xuICAgIHNldEtleVZhbHVlOiBmdW5jdGlvbihrZXksIHZhbHVlKSB7XG4gICAgICAgIGNoZWNrKGtleSwgU3RyaW5nKTtcbiAgICAgICAgY2hlY2sodmFsdWUsIE9iamVjdCk7XG5cbiAgICAgICAgb2JqID0ge307XG4gICAgICAgIG9iai51c2VyID0gdGhpcy51c2VySWQ7XG4gICAgICAgIG9iai5rZXkgPSBrZXk7XG4gICAgICAgIG9iai52YWx1ZSA9IHZhbHVlO1xuXG4gICAgICAgIHZhciBjID0gZGIuc3RlZWRvc19rZXl2YWx1ZXMuZmluZCh7XG4gICAgICAgICAgICB1c2VyOiB0aGlzLnVzZXJJZCxcbiAgICAgICAgICAgIGtleToga2V5XG4gICAgICAgIH0pLmNvdW50KCk7XG4gICAgICAgIGlmIChjID4gMCkge1xuICAgICAgICAgICAgZGIuc3RlZWRvc19rZXl2YWx1ZXMudXBkYXRlKHtcbiAgICAgICAgICAgICAgICB1c2VyOiB0aGlzLnVzZXJJZCxcbiAgICAgICAgICAgICAgICBrZXk6IGtleVxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICRzZXQ6IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkYi5zdGVlZG9zX2tleXZhbHVlcy5pbnNlcnQob2JqKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn0pIiwiTWV0ZW9yLm1ldGhvZHNcblx0YmlsbGluZ19zZXR0bGV1cDogKGFjY291bnRpbmdfbW9udGgsIHNwYWNlX2lkPVwiXCIpLT5cblx0XHRjaGVjayhhY2NvdW50aW5nX21vbnRoLCBTdHJpbmcpXG5cdFx0Y2hlY2soc3BhY2VfaWQsIFN0cmluZylcblxuXHRcdHVzZXIgPSBkYi51c2Vycy5maW5kT25lKHtfaWQ6IHRoaXMudXNlcklkfSwge2ZpZWxkczoge2lzX2Nsb3VkYWRtaW46IDF9fSlcblxuXHRcdGlmIG5vdCB1c2VyLmlzX2Nsb3VkYWRtaW5cblx0XHRcdHJldHVyblxuXG5cdFx0Y29uc29sZS50aW1lICdiaWxsaW5nJ1xuXHRcdHNwYWNlcyA9IFtdXG5cdFx0aWYgc3BhY2VfaWRcblx0XHRcdHNwYWNlcyA9IGRiLnNwYWNlcy5maW5kKHtfaWQ6IHNwYWNlX2lkLCBpc19wYWlkOiB0cnVlfSwge2ZpZWxkczoge19pZDogMX19KVxuXHRcdGVsc2Vcblx0XHRcdHNwYWNlcyA9IGRiLnNwYWNlcy5maW5kKHtpc19wYWlkOiB0cnVlfSwge2ZpZWxkczoge19pZDogMX19KVxuXHRcdHJlc3VsdCA9IFtdXG5cdFx0c3BhY2VzLmZvckVhY2ggKHMpIC0+XG5cdFx0XHR0cnlcblx0XHRcdFx0YmlsbGluZ01hbmFnZXIuY2FjdWxhdGVfYnlfYWNjb3VudGluZ19tb250aChhY2NvdW50aW5nX21vbnRoLCBzLl9pZClcblx0XHRcdGNhdGNoIGVyclxuXHRcdFx0XHRlID0ge31cblx0XHRcdFx0ZS5faWQgPSBzLl9pZFxuXHRcdFx0XHRlLm5hbWUgPSBzLm5hbWVcblx0XHRcdFx0ZS5lcnIgPSBlcnJcblx0XHRcdFx0cmVzdWx0LnB1c2ggZVxuXHRcdGlmIHJlc3VsdC5sZW5ndGggPiAwXG5cdFx0XHRjb25zb2xlLmVycm9yIHJlc3VsdFxuXHRcdFx0dHJ5XG5cdFx0XHRcdEVtYWlsID0gUGFja2FnZS5lbWFpbC5FbWFpbFxuXHRcdFx0XHRFbWFpbC5zZW5kXG5cdFx0XHRcdFx0dG86ICdzdXBwb3J0QHN0ZWVkb3MuY29tJ1xuXHRcdFx0XHRcdGZyb206IEFjY291bnRzLmVtYWlsVGVtcGxhdGVzLmZyb21cblx0XHRcdFx0XHRzdWJqZWN0OiAnYmlsbGluZyBzZXR0bGV1cCByZXN1bHQnXG5cdFx0XHRcdFx0dGV4dDogSlNPTi5zdHJpbmdpZnkoJ3Jlc3VsdCc6IHJlc3VsdClcblx0XHRcdGNhdGNoIGVyclxuXHRcdFx0XHRjb25zb2xlLmVycm9yIGVyclxuXHRcdGNvbnNvbGUudGltZUVuZCAnYmlsbGluZyciLCJNZXRlb3IubWV0aG9kcyh7XG4gIGJpbGxpbmdfc2V0dGxldXA6IGZ1bmN0aW9uKGFjY291bnRpbmdfbW9udGgsIHNwYWNlX2lkKSB7XG4gICAgdmFyIEVtYWlsLCBlcnIsIHJlc3VsdCwgc3BhY2VzLCB1c2VyO1xuICAgIGlmIChzcGFjZV9pZCA9PSBudWxsKSB7XG4gICAgICBzcGFjZV9pZCA9IFwiXCI7XG4gICAgfVxuICAgIGNoZWNrKGFjY291bnRpbmdfbW9udGgsIFN0cmluZyk7XG4gICAgY2hlY2soc3BhY2VfaWQsIFN0cmluZyk7XG4gICAgdXNlciA9IGRiLnVzZXJzLmZpbmRPbmUoe1xuICAgICAgX2lkOiB0aGlzLnVzZXJJZFxuICAgIH0sIHtcbiAgICAgIGZpZWxkczoge1xuICAgICAgICBpc19jbG91ZGFkbWluOiAxXG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKCF1c2VyLmlzX2Nsb3VkYWRtaW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc29sZS50aW1lKCdiaWxsaW5nJyk7XG4gICAgc3BhY2VzID0gW107XG4gICAgaWYgKHNwYWNlX2lkKSB7XG4gICAgICBzcGFjZXMgPSBkYi5zcGFjZXMuZmluZCh7XG4gICAgICAgIF9pZDogc3BhY2VfaWQsXG4gICAgICAgIGlzX3BhaWQ6IHRydWVcbiAgICAgIH0sIHtcbiAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgX2lkOiAxXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzcGFjZXMgPSBkYi5zcGFjZXMuZmluZCh7XG4gICAgICAgIGlzX3BhaWQ6IHRydWVcbiAgICAgIH0sIHtcbiAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgX2lkOiAxXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXN1bHQgPSBbXTtcbiAgICBzcGFjZXMuZm9yRWFjaChmdW5jdGlvbihzKSB7XG4gICAgICB2YXIgZSwgZXJyO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGJpbGxpbmdNYW5hZ2VyLmNhY3VsYXRlX2J5X2FjY291bnRpbmdfbW9udGgoYWNjb3VudGluZ19tb250aCwgcy5faWQpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgZXJyID0gZXJyb3I7XG4gICAgICAgIGUgPSB7fTtcbiAgICAgICAgZS5faWQgPSBzLl9pZDtcbiAgICAgICAgZS5uYW1lID0gcy5uYW1lO1xuICAgICAgICBlLmVyciA9IGVycjtcbiAgICAgICAgcmV0dXJuIHJlc3VsdC5wdXNoKGUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChyZXN1bHQubGVuZ3RoID4gMCkge1xuICAgICAgY29uc29sZS5lcnJvcihyZXN1bHQpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgRW1haWwgPSBQYWNrYWdlLmVtYWlsLkVtYWlsO1xuICAgICAgICBFbWFpbC5zZW5kKHtcbiAgICAgICAgICB0bzogJ3N1cHBvcnRAc3RlZWRvcy5jb20nLFxuICAgICAgICAgIGZyb206IEFjY291bnRzLmVtYWlsVGVtcGxhdGVzLmZyb20sXG4gICAgICAgICAgc3ViamVjdDogJ2JpbGxpbmcgc2V0dGxldXAgcmVzdWx0JyxcbiAgICAgICAgICB0ZXh0OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAncmVzdWx0JzogcmVzdWx0XG4gICAgICAgICAgfSlcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBlcnIgPSBlcnJvcjtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29uc29sZS50aW1lRW5kKCdiaWxsaW5nJyk7XG4gIH1cbn0pO1xuIiwiTWV0ZW9yLm1ldGhvZHNcblx0c2V0VXNlcm5hbWU6IChzcGFjZV9pZCwgdXNlcm5hbWUsIHVzZXJfaWQpIC0+XG5cdFx0Y2hlY2soc3BhY2VfaWQsIFN0cmluZyk7XG5cdFx0Y2hlY2sodXNlcm5hbWUsIFN0cmluZyk7XG5cblx0XHRpZiAhU3RlZWRvcy5pc1NwYWNlQWRtaW4oc3BhY2VfaWQsIE1ldGVvci51c2VySWQoKSkgYW5kIHVzZXJfaWRcblx0XHRcdHRocm93IG5ldyBNZXRlb3IuRXJyb3IoNDAwLCAnY29udGFjdF9zcGFjZV91c2VyX25lZWRlZCcpXG5cblx0XHRpZiBub3QgTWV0ZW9yLnVzZXJJZCgpXG5cdFx0XHR0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKDQwMCwnZXJyb3ItaW52YWxpZC11c2VyJylcblxuXHRcdHVubGVzcyB1c2VyX2lkXG5cdFx0XHR1c2VyX2lkID0gTWV0ZW9yLnVzZXIoKS5faWRcblxuXHRcdHNwYWNlVXNlciA9IGRiLnNwYWNlX3VzZXJzLmZpbmRPbmUoe3VzZXI6IHVzZXJfaWQsIHNwYWNlOiBzcGFjZV9pZH0pXG5cblx0XHRpZiBzcGFjZVVzZXIuaW52aXRlX3N0YXRlID09IFwicGVuZGluZ1wiIG9yIHNwYWNlVXNlci5pbnZpdGVfc3RhdGUgPT0gXCJyZWZ1c2VkXCJcblx0XHRcdHRocm93IG5ldyBNZXRlb3IuRXJyb3IoNDAwLCBcIuivpeeUqOaIt+WwmuacquWQjOaEj+WKoOWFpeivpeW3peS9nOWMuu+8jOaXoOazleS/ruaUueeUqOaIt+WQjVwiKVxuXG5cdFx0ZGIudXNlcnMudXBkYXRlKHtfaWQ6IHVzZXJfaWR9LCB7JHNldDoge3VzZXJuYW1lOiB1c2VybmFtZX19KVxuXG5cdFx0cmV0dXJuIHVzZXJuYW1lXG4iLCJNZXRlb3IubWV0aG9kcyh7XG4gIHNldFVzZXJuYW1lOiBmdW5jdGlvbihzcGFjZV9pZCwgdXNlcm5hbWUsIHVzZXJfaWQpIHtcbiAgICB2YXIgc3BhY2VVc2VyO1xuICAgIGNoZWNrKHNwYWNlX2lkLCBTdHJpbmcpO1xuICAgIGNoZWNrKHVzZXJuYW1lLCBTdHJpbmcpO1xuICAgIGlmICghU3RlZWRvcy5pc1NwYWNlQWRtaW4oc3BhY2VfaWQsIE1ldGVvci51c2VySWQoKSkgJiYgdXNlcl9pZCkge1xuICAgICAgdGhyb3cgbmV3IE1ldGVvci5FcnJvcig0MDAsICdjb250YWN0X3NwYWNlX3VzZXJfbmVlZGVkJyk7XG4gICAgfVxuICAgIGlmICghTWV0ZW9yLnVzZXJJZCgpKSB7XG4gICAgICB0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKDQwMCwgJ2Vycm9yLWludmFsaWQtdXNlcicpO1xuICAgIH1cbiAgICBpZiAoIXVzZXJfaWQpIHtcbiAgICAgIHVzZXJfaWQgPSBNZXRlb3IudXNlcigpLl9pZDtcbiAgICB9XG4gICAgc3BhY2VVc2VyID0gZGIuc3BhY2VfdXNlcnMuZmluZE9uZSh7XG4gICAgICB1c2VyOiB1c2VyX2lkLFxuICAgICAgc3BhY2U6IHNwYWNlX2lkXG4gICAgfSk7XG4gICAgaWYgKHNwYWNlVXNlci5pbnZpdGVfc3RhdGUgPT09IFwicGVuZGluZ1wiIHx8IHNwYWNlVXNlci5pbnZpdGVfc3RhdGUgPT09IFwicmVmdXNlZFwiKSB7XG4gICAgICB0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKDQwMCwgXCLor6XnlKjmiLflsJrmnKrlkIzmhI/liqDlhaXor6Xlt6XkvZzljLrvvIzml6Dms5Xkv67mlLnnlKjmiLflkI1cIik7XG4gICAgfVxuICAgIGRiLnVzZXJzLnVwZGF0ZSh7XG4gICAgICBfaWQ6IHVzZXJfaWRcbiAgICB9LCB7XG4gICAgICAkc2V0OiB7XG4gICAgICAgIHVzZXJuYW1lOiB1c2VybmFtZVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB1c2VybmFtZTtcbiAgfVxufSk7XG4iLCJNZXRlb3IubWV0aG9kc1xuXHRiaWxsaW5nX3JlY2hhcmdlOiAodG90YWxfZmVlLCBzcGFjZV9pZCwgbmV3X2lkLCBtb2R1bGVfbmFtZXMsIGVuZF9kYXRlLCB1c2VyX2NvdW50KS0+XG5cdFx0Y2hlY2sgdG90YWxfZmVlLCBOdW1iZXJcblx0XHRjaGVjayBzcGFjZV9pZCwgU3RyaW5nIFxuXHRcdGNoZWNrIG5ld19pZCwgU3RyaW5nIFxuXHRcdGNoZWNrIG1vZHVsZV9uYW1lcywgQXJyYXkgXG5cdFx0Y2hlY2sgZW5kX2RhdGUsIFN0cmluZyBcblx0XHRjaGVjayB1c2VyX2NvdW50LCBOdW1iZXIgXG5cblx0XHR1c2VyX2lkID0gdGhpcy51c2VySWRcblxuXHRcdGxpc3RwcmljZXMgPSAwXG5cdFx0b3JkZXJfYm9keSA9IFtdXG5cdFx0ZGIubW9kdWxlcy5maW5kKHtuYW1lOiB7JGluOiBtb2R1bGVfbmFtZXN9fSkuZm9yRWFjaCAobSktPlxuXHRcdFx0bGlzdHByaWNlcyArPSBtLmxpc3RwcmljZV9ybWJcblx0XHRcdG9yZGVyX2JvZHkucHVzaCBtLm5hbWVfemhcblxuXHRcdHNwYWNlID0gZGIuc3BhY2VzLmZpbmRPbmUoc3BhY2VfaWQpXG5cdFx0aWYgbm90IHNwYWNlLmlzX3BhaWRcblx0XHRcdHNwYWNlX3VzZXJfY291bnQgPSBkYi5zcGFjZV91c2Vycy5maW5kKHtzcGFjZTpzcGFjZV9pZH0pLmNvdW50KClcblx0XHRcdG9uZV9tb250aF95dWFuID0gc3BhY2VfdXNlcl9jb3VudCAqIGxpc3RwcmljZXNcblx0XHRcdGlmIHRvdGFsX2ZlZSA8IG9uZV9tb250aF95dWFuKjEwMFxuXHRcdFx0XHR0aHJvdyBuZXcgTWV0ZW9yLkVycm9yICdlcnJvciEnLCBcIuWFheWAvOmHkemineW6lOS4jeWwkeS6juS4gOS4quaciOaJgOmcgOi0ueeUqO+8mu+/pSN7b25lX21vbnRoX3l1YW59XCJcblxuXHRcdHJlc3VsdF9vYmogPSB7fVxuXG5cdFx0YXR0YWNoID0ge31cblx0XHRhdHRhY2guY29kZV91cmxfaWQgPSBuZXdfaWRcblx0XHRXWFBheSA9IHJlcXVpcmUoJ3dlaXhpbi1wYXknKVxuXG5cdFx0d3hwYXkgPSBXWFBheSh7XG5cdFx0XHRhcHBpZDogTWV0ZW9yLnNldHRpbmdzLmJpbGxpbmcuYXBwaWQsXG5cdFx0XHRtY2hfaWQ6IE1ldGVvci5zZXR0aW5ncy5iaWxsaW5nLm1jaF9pZCxcblx0XHRcdHBhcnRuZXJfa2V5OiBNZXRlb3Iuc2V0dGluZ3MuYmlsbGluZy5wYXJ0bmVyX2tleSAj5b6u5L+h5ZWG5oi35bmz5Y+wQVBJ5a+G6ZKlXG5cdFx0fSlcblxuXHRcdHd4cGF5LmNyZWF0ZVVuaWZpZWRPcmRlcih7XG5cdFx0XHRib2R5OiBvcmRlcl9ib2R5LmpvaW4oXCIsXCIpLFxuXHRcdFx0b3V0X3RyYWRlX25vOiBtb21lbnQoKS5mb3JtYXQoJ1lZWVlNTURESEhtbXNzU1NTJyksXG5cdFx0XHR0b3RhbF9mZWU6IHRvdGFsX2ZlZSxcblx0XHRcdHNwYmlsbF9jcmVhdGVfaXA6ICcxMjcuMC4wLjEnLFxuXHRcdFx0bm90aWZ5X3VybDogTWV0ZW9yLmFic29sdXRlVXJsKCkgKyAnYXBpL2JpbGxpbmcvcmVjaGFyZ2Uvbm90aWZ5Jyxcblx0XHRcdHRyYWRlX3R5cGU6ICdOQVRJVkUnLFxuXHRcdFx0cHJvZHVjdF9pZDogbW9tZW50KCkuZm9ybWF0KCdZWVlZTU1EREhIbW1zc1NTUycpLFxuXHRcdFx0YXR0YWNoOiBKU09OLnN0cmluZ2lmeShhdHRhY2gpXG5cdFx0fSwgTWV0ZW9yLmJpbmRFbnZpcm9ubWVudCgoKGVyciwgcmVzdWx0KSAtPiBcblx0XHRcdFx0aWYgZXJyIFxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IgZXJyLnN0YWNrXG5cdFx0XHRcdGlmIHJlc3VsdFxuXHRcdFx0XHRcdG9iaiA9IHt9XG5cdFx0XHRcdFx0b2JqLl9pZCA9IG5ld19pZFxuXHRcdFx0XHRcdG9iai5jcmVhdGVkID0gbmV3IERhdGVcblx0XHRcdFx0XHRvYmouaW5mbyA9IHJlc3VsdFxuXHRcdFx0XHRcdG9iai50b3RhbF9mZWUgPSB0b3RhbF9mZWVcblx0XHRcdFx0XHRvYmouY3JlYXRlZF9ieSA9IHVzZXJfaWRcblx0XHRcdFx0XHRvYmouc3BhY2UgPSBzcGFjZV9pZFxuXHRcdFx0XHRcdG9iai5wYWlkID0gZmFsc2Vcblx0XHRcdFx0XHRvYmoubW9kdWxlcyA9IG1vZHVsZV9uYW1lc1xuXHRcdFx0XHRcdG9iai5lbmRfZGF0ZSA9IGVuZF9kYXRlXG5cdFx0XHRcdFx0b2JqLnVzZXJfY291bnQgPSB1c2VyX2NvdW50XG5cdFx0XHRcdFx0ZGIuYmlsbGluZ19wYXlfcmVjb3Jkcy5pbnNlcnQob2JqKVxuXHRcdFx0KSwgKGUpLT5cblx0XHRcdFx0Y29uc29sZS5sb2cgJ0ZhaWxlZCB0byBiaW5kIGVudmlyb25tZW50OiBiaWxsaW5nX3JlY2hhcmdlLmNvZmZlZSdcblx0XHRcdFx0Y29uc29sZS5sb2cgZS5zdGFja1xuXHRcdFx0KVxuXHRcdClcblxuXHRcdFxuXHRcdHJldHVybiBcInN1Y2Nlc3NcIiIsIk1ldGVvci5tZXRob2RzKHtcbiAgYmlsbGluZ19yZWNoYXJnZTogZnVuY3Rpb24odG90YWxfZmVlLCBzcGFjZV9pZCwgbmV3X2lkLCBtb2R1bGVfbmFtZXMsIGVuZF9kYXRlLCB1c2VyX2NvdW50KSB7XG4gICAgdmFyIFdYUGF5LCBhdHRhY2gsIGxpc3RwcmljZXMsIG9uZV9tb250aF95dWFuLCBvcmRlcl9ib2R5LCByZXN1bHRfb2JqLCBzcGFjZSwgc3BhY2VfdXNlcl9jb3VudCwgdXNlcl9pZCwgd3hwYXk7XG4gICAgY2hlY2sodG90YWxfZmVlLCBOdW1iZXIpO1xuICAgIGNoZWNrKHNwYWNlX2lkLCBTdHJpbmcpO1xuICAgIGNoZWNrKG5ld19pZCwgU3RyaW5nKTtcbiAgICBjaGVjayhtb2R1bGVfbmFtZXMsIEFycmF5KTtcbiAgICBjaGVjayhlbmRfZGF0ZSwgU3RyaW5nKTtcbiAgICBjaGVjayh1c2VyX2NvdW50LCBOdW1iZXIpO1xuICAgIHVzZXJfaWQgPSB0aGlzLnVzZXJJZDtcbiAgICBsaXN0cHJpY2VzID0gMDtcbiAgICBvcmRlcl9ib2R5ID0gW107XG4gICAgZGIubW9kdWxlcy5maW5kKHtcbiAgICAgIG5hbWU6IHtcbiAgICAgICAgJGluOiBtb2R1bGVfbmFtZXNcbiAgICAgIH1cbiAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uKG0pIHtcbiAgICAgIGxpc3RwcmljZXMgKz0gbS5saXN0cHJpY2Vfcm1iO1xuICAgICAgcmV0dXJuIG9yZGVyX2JvZHkucHVzaChtLm5hbWVfemgpO1xuICAgIH0pO1xuICAgIHNwYWNlID0gZGIuc3BhY2VzLmZpbmRPbmUoc3BhY2VfaWQpO1xuICAgIGlmICghc3BhY2UuaXNfcGFpZCkge1xuICAgICAgc3BhY2VfdXNlcl9jb3VudCA9IGRiLnNwYWNlX3VzZXJzLmZpbmQoe1xuICAgICAgICBzcGFjZTogc3BhY2VfaWRcbiAgICAgIH0pLmNvdW50KCk7XG4gICAgICBvbmVfbW9udGhfeXVhbiA9IHNwYWNlX3VzZXJfY291bnQgKiBsaXN0cHJpY2VzO1xuICAgICAgaWYgKHRvdGFsX2ZlZSA8IG9uZV9tb250aF95dWFuICogMTAwKSB7XG4gICAgICAgIHRocm93IG5ldyBNZXRlb3IuRXJyb3IoJ2Vycm9yIScsIFwi5YWF5YC86YeR6aKd5bqU5LiN5bCR5LqO5LiA5Liq5pyI5omA6ZyA6LS555So77ya77+lXCIgKyBvbmVfbW9udGhfeXVhbik7XG4gICAgICB9XG4gICAgfVxuICAgIHJlc3VsdF9vYmogPSB7fTtcbiAgICBhdHRhY2ggPSB7fTtcbiAgICBhdHRhY2guY29kZV91cmxfaWQgPSBuZXdfaWQ7XG4gICAgV1hQYXkgPSByZXF1aXJlKCd3ZWl4aW4tcGF5Jyk7XG4gICAgd3hwYXkgPSBXWFBheSh7XG4gICAgICBhcHBpZDogTWV0ZW9yLnNldHRpbmdzLmJpbGxpbmcuYXBwaWQsXG4gICAgICBtY2hfaWQ6IE1ldGVvci5zZXR0aW5ncy5iaWxsaW5nLm1jaF9pZCxcbiAgICAgIHBhcnRuZXJfa2V5OiBNZXRlb3Iuc2V0dGluZ3MuYmlsbGluZy5wYXJ0bmVyX2tleVxuICAgIH0pO1xuICAgIHd4cGF5LmNyZWF0ZVVuaWZpZWRPcmRlcih7XG4gICAgICBib2R5OiBvcmRlcl9ib2R5LmpvaW4oXCIsXCIpLFxuICAgICAgb3V0X3RyYWRlX25vOiBtb21lbnQoKS5mb3JtYXQoJ1lZWVlNTURESEhtbXNzU1NTJyksXG4gICAgICB0b3RhbF9mZWU6IHRvdGFsX2ZlZSxcbiAgICAgIHNwYmlsbF9jcmVhdGVfaXA6ICcxMjcuMC4wLjEnLFxuICAgICAgbm90aWZ5X3VybDogTWV0ZW9yLmFic29sdXRlVXJsKCkgKyAnYXBpL2JpbGxpbmcvcmVjaGFyZ2Uvbm90aWZ5JyxcbiAgICAgIHRyYWRlX3R5cGU6ICdOQVRJVkUnLFxuICAgICAgcHJvZHVjdF9pZDogbW9tZW50KCkuZm9ybWF0KCdZWVlZTU1EREhIbW1zc1NTUycpLFxuICAgICAgYXR0YWNoOiBKU09OLnN0cmluZ2lmeShhdHRhY2gpXG4gICAgfSwgTWV0ZW9yLmJpbmRFbnZpcm9ubWVudCgoZnVuY3Rpb24oZXJyLCByZXN1bHQpIHtcbiAgICAgIHZhciBvYmo7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyLnN0YWNrKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgb2JqID0ge307XG4gICAgICAgIG9iai5faWQgPSBuZXdfaWQ7XG4gICAgICAgIG9iai5jcmVhdGVkID0gbmV3IERhdGU7XG4gICAgICAgIG9iai5pbmZvID0gcmVzdWx0O1xuICAgICAgICBvYmoudG90YWxfZmVlID0gdG90YWxfZmVlO1xuICAgICAgICBvYmouY3JlYXRlZF9ieSA9IHVzZXJfaWQ7XG4gICAgICAgIG9iai5zcGFjZSA9IHNwYWNlX2lkO1xuICAgICAgICBvYmoucGFpZCA9IGZhbHNlO1xuICAgICAgICBvYmoubW9kdWxlcyA9IG1vZHVsZV9uYW1lcztcbiAgICAgICAgb2JqLmVuZF9kYXRlID0gZW5kX2RhdGU7XG4gICAgICAgIG9iai51c2VyX2NvdW50ID0gdXNlcl9jb3VudDtcbiAgICAgICAgcmV0dXJuIGRiLmJpbGxpbmdfcGF5X3JlY29yZHMuaW5zZXJ0KG9iaik7XG4gICAgICB9XG4gICAgfSksIGZ1bmN0aW9uKGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdGYWlsZWQgdG8gYmluZCBlbnZpcm9ubWVudDogYmlsbGluZ19yZWNoYXJnZS5jb2ZmZWUnKTtcbiAgICAgIHJldHVybiBjb25zb2xlLmxvZyhlLnN0YWNrKTtcbiAgICB9KSk7XG4gICAgcmV0dXJuIFwic3VjY2Vzc1wiO1xuICB9XG59KTtcbiIsIk1ldGVvci5tZXRob2RzXG5cdGdldF9zcGFjZV91c2VyX2NvdW50OiAoc3BhY2VfaWQpLT5cblx0XHRjaGVjayBzcGFjZV9pZCwgU3RyaW5nXG5cdFx0dXNlcl9jb3VudF9pbmZvID0gbmV3IE9iamVjdFxuXHRcdHVzZXJfY291bnRfaW5mby50b3RhbF91c2VyX2NvdW50ID0gZGIuc3BhY2VfdXNlcnMuZmluZCh7c3BhY2U6IHNwYWNlX2lkfSkuY291bnQoKVxuXHRcdHVzZXJfY291bnRfaW5mby5hY2NlcHRlZF91c2VyX2NvdW50ID0gZGIuc3BhY2VfdXNlcnMuZmluZCh7c3BhY2U6IHNwYWNlX2lkLCB1c2VyX2FjY2VwdGVkOiB0cnVlfSkuY291bnQoKVxuXHRcdHJldHVybiB1c2VyX2NvdW50X2luZm8iLCJNZXRlb3IubWV0aG9kc1xuXHRjcmVhdGVfc2VjcmV0OiAobmFtZSktPlxuXHRcdGlmICF0aGlzLnVzZXJJZFxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0ZGIudXNlcnMuY3JlYXRlX3NlY3JldCB0aGlzLnVzZXJJZCwgbmFtZVxuXG5cdHJlbW92ZV9zZWNyZXQ6ICh0b2tlbiktPlxuXHRcdGlmICF0aGlzLnVzZXJJZCB8fCAhdG9rZW5cblx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdGhhc2hlZFRva2VuID0gQWNjb3VudHMuX2hhc2hMb2dpblRva2VuKHRva2VuKVxuXG5cdFx0Y29uc29sZS5sb2coXCJ0b2tlblwiLCB0b2tlbilcblxuXHRcdGRiLnVzZXJzLnVwZGF0ZSh7X2lkOiB0aGlzLnVzZXJJZH0sIHskcHVsbDoge1wic2VjcmV0c1wiOiB7aGFzaGVkVG9rZW46IGhhc2hlZFRva2VufX19KVxuIiwiTWV0ZW9yLm1ldGhvZHMoe1xuICBjcmVhdGVfc2VjcmV0OiBmdW5jdGlvbihuYW1lKSB7XG4gICAgaWYgKCF0aGlzLnVzZXJJZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gZGIudXNlcnMuY3JlYXRlX3NlY3JldCh0aGlzLnVzZXJJZCwgbmFtZSk7XG4gIH0sXG4gIHJlbW92ZV9zZWNyZXQ6IGZ1bmN0aW9uKHRva2VuKSB7XG4gICAgdmFyIGhhc2hlZFRva2VuO1xuICAgIGlmICghdGhpcy51c2VySWQgfHwgIXRva2VuKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGhhc2hlZFRva2VuID0gQWNjb3VudHMuX2hhc2hMb2dpblRva2VuKHRva2VuKTtcbiAgICBjb25zb2xlLmxvZyhcInRva2VuXCIsIHRva2VuKTtcbiAgICByZXR1cm4gZGIudXNlcnMudXBkYXRlKHtcbiAgICAgIF9pZDogdGhpcy51c2VySWRcbiAgICB9LCB7XG4gICAgICAkcHVsbDoge1xuICAgICAgICBcInNlY3JldHNcIjoge1xuICAgICAgICAgIGhhc2hlZFRva2VuOiBoYXNoZWRUb2tlblxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn0pO1xuIiwiTWV0ZW9yLm1ldGhvZHNcbiAgICAnb2JqZWN0X3dvcmtmbG93cy5nZXQnOiAoc3BhY2VJZCwgdXNlcklkKSAtPlxuICAgICAgICBjaGVjayBzcGFjZUlkLCBTdHJpbmdcbiAgICAgICAgY2hlY2sgdXNlcklkLCBTdHJpbmdcblxuICAgICAgICBjdXJTcGFjZVVzZXIgPSBDcmVhdG9yLkNvbGxlY3Rpb25zW1wic3BhY2VfdXNlcnNcIl0uZmluZE9uZSh7c3BhY2U6IHNwYWNlSWQsIHVzZXI6IHVzZXJJZH0sIHtmaWVsZHM6IHtvcmdhbml6YXRpb25zOiAxfX0pXG4gICAgICAgIGlmICFjdXJTcGFjZVVzZXJcbiAgICAgICAgICAgIHRocm93IG5ldyBNZXRlb3IuRXJyb3IgJ25vdC1hdXRob3JpemVkJ1xuXG4gICAgICAgIG9yZ2FuaXphdGlvbnMgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oJ29yZ2FuaXphdGlvbnMnKS5maW5kKHtcbiAgICAgICAgICAgIF9pZDoge1xuICAgICAgICAgICAgICAgICRpbjogY3VyU3BhY2VVc2VyLm9yZ2FuaXphdGlvbnNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwge2ZpZWxkczoge3BhcmVudHM6IDF9fSkuZmV0Y2goKVxuXG4gICAgICAgIG93cyA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbignb2JqZWN0X3dvcmtmbG93cycpLmZpbmQoeyBzcGFjZTogc3BhY2VJZCB9LCB7IGZpZWxkczogeyBvYmplY3RfbmFtZTogMSwgZmxvd19pZDogMSwgc3BhY2U6IDEgfSB9KS5mZXRjaCgpXG4gICAgICAgIF8uZWFjaCBvd3MsKG8pIC0+XG4gICAgICAgICAgICBmbCA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbignZmxvd3MnKS5maW5kT25lKG8uZmxvd19pZCwgeyBmaWVsZHM6IHsgbmFtZTogMSwgcGVybXM6IDEgfSB9KVxuICAgICAgICAgICAgaWYgZmxcbiAgICAgICAgICAgICAgICBvLmZsb3dfbmFtZSA9IGZsLm5hbWVcbiAgICAgICAgICAgICAgICBvLmNhbl9hZGQgPSBmYWxzZVxuXG4gICAgICAgICAgICAgICAgcGVybXMgPSBmbC5wZXJtc1xuICAgICAgICAgICAgICAgIGlmIHBlcm1zXG4gICAgICAgICAgICAgICAgICAgIGlmIHBlcm1zLnVzZXJzX2Nhbl9hZGQgJiYgcGVybXMudXNlcnNfY2FuX2FkZC5pbmNsdWRlcyh1c2VySWQpXG4gICAgICAgICAgICAgICAgICAgICAgICBvLmNhbl9hZGQgPSB0cnVlXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgcGVybXMub3Jnc19jYW5fYWRkICYmIHBlcm1zLm9yZ3NfY2FuX2FkZC5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiBjdXJTcGFjZVVzZXIgJiYgY3VyU3BhY2VVc2VyLm9yZ2FuaXphdGlvbnMgJiYgXy5pbnRlcnNlY3Rpb24oY3VyU3BhY2VVc2VyLm9yZ2FuaXphdGlvbnMsIHBlcm1zLm9yZ3NfY2FuX2FkZCkubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uY2FuX2FkZCA9IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBvcmdhbml6YXRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uY2FuX2FkZCA9IF8uc29tZSBvcmdhbml6YXRpb25zLCAob3JnKS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3JnLnBhcmVudHMgJiYgXy5pbnRlcnNlY3Rpb24ob3JnLnBhcmVudHMsIHBlcm1zLm9yZ3NfY2FuX2FkZCkubGVuZ3RoID4gMFxuXG4gICAgICAgIG93cyA9IG93cy5maWx0ZXIgKG4pLT5cbiAgICAgICAgICAgIHJldHVybiBuLmZsb3dfbmFtZVxuXG4gICAgICAgIHJldHVybiBvd3MiLCJNZXRlb3IubWV0aG9kcyh7XG4gICdvYmplY3Rfd29ya2Zsb3dzLmdldCc6IGZ1bmN0aW9uKHNwYWNlSWQsIHVzZXJJZCkge1xuICAgIHZhciBjdXJTcGFjZVVzZXIsIG9yZ2FuaXphdGlvbnMsIG93cztcbiAgICBjaGVjayhzcGFjZUlkLCBTdHJpbmcpO1xuICAgIGNoZWNrKHVzZXJJZCwgU3RyaW5nKTtcbiAgICBjdXJTcGFjZVVzZXIgPSBDcmVhdG9yLkNvbGxlY3Rpb25zW1wic3BhY2VfdXNlcnNcIl0uZmluZE9uZSh7XG4gICAgICBzcGFjZTogc3BhY2VJZCxcbiAgICAgIHVzZXI6IHVzZXJJZFxuICAgIH0sIHtcbiAgICAgIGZpZWxkczoge1xuICAgICAgICBvcmdhbml6YXRpb25zOiAxXG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKCFjdXJTcGFjZVVzZXIpIHtcbiAgICAgIHRocm93IG5ldyBNZXRlb3IuRXJyb3IoJ25vdC1hdXRob3JpemVkJyk7XG4gICAgfVxuICAgIG9yZ2FuaXphdGlvbnMgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oJ29yZ2FuaXphdGlvbnMnKS5maW5kKHtcbiAgICAgIF9pZDoge1xuICAgICAgICAkaW46IGN1clNwYWNlVXNlci5vcmdhbml6YXRpb25zXG4gICAgICB9XG4gICAgfSwge1xuICAgICAgZmllbGRzOiB7XG4gICAgICAgIHBhcmVudHM6IDFcbiAgICAgIH1cbiAgICB9KS5mZXRjaCgpO1xuICAgIG93cyA9IENyZWF0b3IuZ2V0Q29sbGVjdGlvbignb2JqZWN0X3dvcmtmbG93cycpLmZpbmQoe1xuICAgICAgc3BhY2U6IHNwYWNlSWRcbiAgICB9LCB7XG4gICAgICBmaWVsZHM6IHtcbiAgICAgICAgb2JqZWN0X25hbWU6IDEsXG4gICAgICAgIGZsb3dfaWQ6IDEsXG4gICAgICAgIHNwYWNlOiAxXG4gICAgICB9XG4gICAgfSkuZmV0Y2goKTtcbiAgICBfLmVhY2gob3dzLCBmdW5jdGlvbihvKSB7XG4gICAgICB2YXIgZmwsIHBlcm1zO1xuICAgICAgZmwgPSBDcmVhdG9yLmdldENvbGxlY3Rpb24oJ2Zsb3dzJykuZmluZE9uZShvLmZsb3dfaWQsIHtcbiAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgbmFtZTogMSxcbiAgICAgICAgICBwZXJtczogMVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmIChmbCkge1xuICAgICAgICBvLmZsb3dfbmFtZSA9IGZsLm5hbWU7XG4gICAgICAgIG8uY2FuX2FkZCA9IGZhbHNlO1xuICAgICAgICBwZXJtcyA9IGZsLnBlcm1zO1xuICAgICAgICBpZiAocGVybXMpIHtcbiAgICAgICAgICBpZiAocGVybXMudXNlcnNfY2FuX2FkZCAmJiBwZXJtcy51c2Vyc19jYW5fYWRkLmluY2x1ZGVzKHVzZXJJZCkpIHtcbiAgICAgICAgICAgIHJldHVybiBvLmNhbl9hZGQgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAocGVybXMub3Jnc19jYW5fYWRkICYmIHBlcm1zLm9yZ3NfY2FuX2FkZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBpZiAoY3VyU3BhY2VVc2VyICYmIGN1clNwYWNlVXNlci5vcmdhbml6YXRpb25zICYmIF8uaW50ZXJzZWN0aW9uKGN1clNwYWNlVXNlci5vcmdhbml6YXRpb25zLCBwZXJtcy5vcmdzX2Nhbl9hZGQpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG8uY2FuX2FkZCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAob3JnYW5pemF0aW9ucykge1xuICAgICAgICAgICAgICAgIHJldHVybiBvLmNhbl9hZGQgPSBfLnNvbWUob3JnYW5pemF0aW9ucywgZnVuY3Rpb24ob3JnKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gb3JnLnBhcmVudHMgJiYgXy5pbnRlcnNlY3Rpb24ob3JnLnBhcmVudHMsIHBlcm1zLm9yZ3NfY2FuX2FkZCkubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIG93cyA9IG93cy5maWx0ZXIoZnVuY3Rpb24obikge1xuICAgICAgcmV0dXJuIG4uZmxvd19uYW1lO1xuICAgIH0pO1xuICAgIHJldHVybiBvd3M7XG4gIH1cbn0pO1xuIiwiTWV0ZW9yLm1ldGhvZHNcblx0c2V0U3BhY2VVc2VyUGFzc3dvcmQ6IChzcGFjZV91c2VyX2lkLCBzcGFjZV9pZCwgcGFzc3dvcmQpIC0+XG5cdFx0aWYgIXRoaXMudXNlcklkXG5cdFx0XHR0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKDQwMCwgXCLor7flhYjnmbvlvZVcIilcblx0XHRcblx0XHRzcGFjZSA9IGRiLnNwYWNlcy5maW5kT25lKHtfaWQ6IHNwYWNlX2lkfSlcblx0XHRpc1NwYWNlQWRtaW4gPSBzcGFjZT8uYWRtaW5zPy5pbmNsdWRlcyh0aGlzLnVzZXJJZClcblxuXHRcdHVubGVzcyBpc1NwYWNlQWRtaW5cblx0XHRcdHRocm93IG5ldyBNZXRlb3IuRXJyb3IoNDAwLCBcIuaCqOayoeacieadg+mZkOS/ruaUueivpeeUqOaIt+WvhueggVwiKVxuXG5cdFx0c3BhY2VVc2VyID0gZGIuc3BhY2VfdXNlcnMuZmluZE9uZSh7X2lkOiBzcGFjZV91c2VyX2lkLCBzcGFjZTogc3BhY2VfaWR9KVxuXHRcdHVzZXJfaWQgPSBzcGFjZVVzZXIudXNlcjtcblx0XHR1c2VyQ1AgPSBkYi51c2Vycy5maW5kT25lKHtfaWQ6IHVzZXJfaWR9KVxuXHRcdGN1cnJlbnRVc2VyID0gZGIudXNlcnMuZmluZE9uZSh7X2lkOiB0aGlzLnVzZXJJZH0pXG5cblx0XHRpZiBzcGFjZVVzZXIuaW52aXRlX3N0YXRlID09IFwicGVuZGluZ1wiIG9yIHNwYWNlVXNlci5pbnZpdGVfc3RhdGUgPT0gXCJyZWZ1c2VkXCJcblx0XHRcdHRocm93IG5ldyBNZXRlb3IuRXJyb3IoNDAwLCBcIuivpeeUqOaIt+WwmuacquWQjOaEj+WKoOWFpeivpeW3peS9nOWMuu+8jOaXoOazleS/ruaUueWvhueggVwiKVxuXG5cdFx0U3RlZWRvcy52YWxpZGF0ZVBhc3N3b3JkKHBhc3N3b3JkKVxuXHRcdGxvZ291dCA9IHRydWU7XG5cdFx0aWYgdGhpcy51c2VySWQgPT0gdXNlcl9pZFxuXHRcdFx0bG9nb3V0ID0gZmFsc2Vcblx0XHRBY2NvdW50cy5zZXRQYXNzd29yZCh1c2VyX2lkLCBwYXNzd29yZCwge2xvZ291dDogbG9nb3V0fSlcblx0XHRjaGFuZ2VkVXNlckluZm8gPSBkYi51c2Vycy5maW5kT25lKHtfaWQ6IHVzZXJfaWR9KVxuXHRcdGlmIGNoYW5nZWRVc2VySW5mb1xuXHRcdFx0ZGIudXNlcnMudXBkYXRlKHtfaWQ6IHVzZXJfaWR9LCB7JHB1c2g6IHsnc2VydmljZXMucGFzc3dvcmRfaGlzdG9yeSc6IGNoYW5nZWRVc2VySW5mby5zZXJ2aWNlcz8ucGFzc3dvcmQ/LmJjcnlwdH19KVxuXG5cdFx0IyDlpoLmnpznlKjmiLfmiYvmnLrlj7fpgJrov4fpqozor4HvvIzlsLHlj5Hnn63kv6Hmj5DphpJcblx0XHRpZiB1c2VyQ1AubW9iaWxlICYmIHVzZXJDUC5tb2JpbGVfdmVyaWZpZWRcblx0XHRcdGxhbmcgPSAnZW4nXG5cdFx0XHRpZiB1c2VyQ1AubG9jYWxlIGlzICd6aC1jbidcblx0XHRcdFx0bGFuZyA9ICd6aC1DTidcblx0XHRcdFNNU1F1ZXVlLnNlbmRcblx0XHRcdFx0Rm9ybWF0OiAnSlNPTicsXG5cdFx0XHRcdEFjdGlvbjogJ1NpbmdsZVNlbmRTbXMnLFxuXHRcdFx0XHRQYXJhbVN0cmluZzogJycsXG5cdFx0XHRcdFJlY051bTogdXNlckNQLm1vYmlsZSxcblx0XHRcdFx0U2lnbk5hbWU6ICfljY7ngo7lip7lhawnLFxuXHRcdFx0XHRUZW1wbGF0ZUNvZGU6ICdTTVNfNjcyMDA5NjcnLFxuXHRcdFx0XHRtc2c6IFRBUGkxOG4uX18oJ3Ntcy5jaGFuZ2VfcGFzc3dvcmQudGVtcGxhdGUnLCB7fSwgbGFuZylcblxuIiwiTWV0ZW9yLm1ldGhvZHMoe1xuICBzZXRTcGFjZVVzZXJQYXNzd29yZDogZnVuY3Rpb24oc3BhY2VfdXNlcl9pZCwgc3BhY2VfaWQsIHBhc3N3b3JkKSB7XG4gICAgdmFyIGNoYW5nZWRVc2VySW5mbywgY3VycmVudFVzZXIsIGlzU3BhY2VBZG1pbiwgbGFuZywgbG9nb3V0LCByZWYsIHJlZjEsIHJlZjIsIHNwYWNlLCBzcGFjZVVzZXIsIHVzZXJDUCwgdXNlcl9pZDtcbiAgICBpZiAoIXRoaXMudXNlcklkKSB7XG4gICAgICB0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKDQwMCwgXCLor7flhYjnmbvlvZVcIik7XG4gICAgfVxuICAgIHNwYWNlID0gZGIuc3BhY2VzLmZpbmRPbmUoe1xuICAgICAgX2lkOiBzcGFjZV9pZFxuICAgIH0pO1xuICAgIGlzU3BhY2VBZG1pbiA9IHNwYWNlICE9IG51bGwgPyAocmVmID0gc3BhY2UuYWRtaW5zKSAhPSBudWxsID8gcmVmLmluY2x1ZGVzKHRoaXMudXNlcklkKSA6IHZvaWQgMCA6IHZvaWQgMDtcbiAgICBpZiAoIWlzU3BhY2VBZG1pbikge1xuICAgICAgdGhyb3cgbmV3IE1ldGVvci5FcnJvcig0MDAsIFwi5oKo5rKh5pyJ5p2D6ZmQ5L+u5pS56K+l55So5oi35a+G56CBXCIpO1xuICAgIH1cbiAgICBzcGFjZVVzZXIgPSBkYi5zcGFjZV91c2Vycy5maW5kT25lKHtcbiAgICAgIF9pZDogc3BhY2VfdXNlcl9pZCxcbiAgICAgIHNwYWNlOiBzcGFjZV9pZFxuICAgIH0pO1xuICAgIHVzZXJfaWQgPSBzcGFjZVVzZXIudXNlcjtcbiAgICB1c2VyQ1AgPSBkYi51c2Vycy5maW5kT25lKHtcbiAgICAgIF9pZDogdXNlcl9pZFxuICAgIH0pO1xuICAgIGN1cnJlbnRVc2VyID0gZGIudXNlcnMuZmluZE9uZSh7XG4gICAgICBfaWQ6IHRoaXMudXNlcklkXG4gICAgfSk7XG4gICAgaWYgKHNwYWNlVXNlci5pbnZpdGVfc3RhdGUgPT09IFwicGVuZGluZ1wiIHx8IHNwYWNlVXNlci5pbnZpdGVfc3RhdGUgPT09IFwicmVmdXNlZFwiKSB7XG4gICAgICB0aHJvdyBuZXcgTWV0ZW9yLkVycm9yKDQwMCwgXCLor6XnlKjmiLflsJrmnKrlkIzmhI/liqDlhaXor6Xlt6XkvZzljLrvvIzml6Dms5Xkv67mlLnlr4bnoIFcIik7XG4gICAgfVxuICAgIFN0ZWVkb3MudmFsaWRhdGVQYXNzd29yZChwYXNzd29yZCk7XG4gICAgbG9nb3V0ID0gdHJ1ZTtcbiAgICBpZiAodGhpcy51c2VySWQgPT09IHVzZXJfaWQpIHtcbiAgICAgIGxvZ291dCA9IGZhbHNlO1xuICAgIH1cbiAgICBBY2NvdW50cy5zZXRQYXNzd29yZCh1c2VyX2lkLCBwYXNzd29yZCwge1xuICAgICAgbG9nb3V0OiBsb2dvdXRcbiAgICB9KTtcbiAgICBjaGFuZ2VkVXNlckluZm8gPSBkYi51c2Vycy5maW5kT25lKHtcbiAgICAgIF9pZDogdXNlcl9pZFxuICAgIH0pO1xuICAgIGlmIChjaGFuZ2VkVXNlckluZm8pIHtcbiAgICAgIGRiLnVzZXJzLnVwZGF0ZSh7XG4gICAgICAgIF9pZDogdXNlcl9pZFxuICAgICAgfSwge1xuICAgICAgICAkcHVzaDoge1xuICAgICAgICAgICdzZXJ2aWNlcy5wYXNzd29yZF9oaXN0b3J5JzogKHJlZjEgPSBjaGFuZ2VkVXNlckluZm8uc2VydmljZXMpICE9IG51bGwgPyAocmVmMiA9IHJlZjEucGFzc3dvcmQpICE9IG51bGwgPyByZWYyLmJjcnlwdCA6IHZvaWQgMCA6IHZvaWQgMFxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKHVzZXJDUC5tb2JpbGUgJiYgdXNlckNQLm1vYmlsZV92ZXJpZmllZCkge1xuICAgICAgbGFuZyA9ICdlbic7XG4gICAgICBpZiAodXNlckNQLmxvY2FsZSA9PT0gJ3poLWNuJykge1xuICAgICAgICBsYW5nID0gJ3poLUNOJztcbiAgICAgIH1cbiAgICAgIHJldHVybiBTTVNRdWV1ZS5zZW5kKHtcbiAgICAgICAgRm9ybWF0OiAnSlNPTicsXG4gICAgICAgIEFjdGlvbjogJ1NpbmdsZVNlbmRTbXMnLFxuICAgICAgICBQYXJhbVN0cmluZzogJycsXG4gICAgICAgIFJlY051bTogdXNlckNQLm1vYmlsZSxcbiAgICAgICAgU2lnbk5hbWU6ICfljY7ngo7lip7lhawnLFxuICAgICAgICBUZW1wbGF0ZUNvZGU6ICdTTVNfNjcyMDA5NjcnLFxuICAgICAgICBtc2c6IFRBUGkxOG4uX18oJ3Ntcy5jaGFuZ2VfcGFzc3dvcmQudGVtcGxhdGUnLCB7fSwgbGFuZylcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufSk7XG4iLCJiaWxsaW5nTWFuYWdlciA9IHt9XG5cbiMg6I635b6X57uT566X5ZGo5pyf5YaF55qE5Y+v57uT566X5pel5pWwXG4jIHNwYWNlX2lkIOe7k+eul+WvueixoeW3peS9nOWMulxuIyBhY2NvdW50aW5nX21vbnRoIOe7k+eul+aciO+8jOagvOW8j++8mllZWVlNTVxuYmlsbGluZ01hbmFnZXIuZ2V0X2FjY291bnRpbmdfcGVyaW9kID0gKHNwYWNlX2lkLCBhY2NvdW50aW5nX21vbnRoKS0+XG5cdGNvdW50X2RheXMgPSAwXG5cblx0ZW5kX2RhdGVfdGltZSA9IG5ldyBEYXRlKHBhcnNlSW50KGFjY291bnRpbmdfbW9udGguc2xpY2UoMCw0KSksIHBhcnNlSW50KGFjY291bnRpbmdfbW9udGguc2xpY2UoNCw2KSksIDApXG5cdGVuZF9kYXRlID0gbW9tZW50KGVuZF9kYXRlX3RpbWUuZ2V0VGltZSgpKS5mb3JtYXQoJ1lZWVlNTUREJylcblxuXHRiaWxsaW5nID0gZGIuYmlsbGluZ3MuZmluZE9uZSh7c3BhY2U6IHNwYWNlX2lkLCB0cmFuc2FjdGlvbjogXCJTdGFydGluZyBiYWxhbmNlXCJ9KVxuXHRmaXJzdF9kYXRlID0gYmlsbGluZy5iaWxsaW5nX2RhdGVcblxuXHRzdGFydF9kYXRlID0gYWNjb3VudGluZ19tb250aCArIFwiMDFcIlxuXHRzdGFydF9kYXRlX3RpbWUgPSBuZXcgRGF0ZShwYXJzZUludChhY2NvdW50aW5nX21vbnRoLnNsaWNlKDAsNCkpLCBwYXJzZUludChhY2NvdW50aW5nX21vbnRoLnNsaWNlKDQsNikpLCAxLWVuZF9kYXRlX3RpbWUuZ2V0RGF0ZSgpKVxuXG5cdGlmIGZpcnN0X2RhdGUgPj0gZW5kX2RhdGUgIyDov5nkuKrmnIjkuI3lnKjmnKzmrKHnu5PnrpfojIPlm7TkuYvlhoXvvIxjb3VudF9kYXlzPTBcblx0XHQjIGRvIG5vdGhpbmdcblx0ZWxzZSBpZiBzdGFydF9kYXRlIDw9IGZpcnN0X2RhdGUgYW5kIGZpcnN0X2RhdGUgPCBlbmRfZGF0ZVxuXHRcdGNvdW50X2RheXMgPSAoZW5kX2RhdGVfdGltZSAtIHN0YXJ0X2RhdGVfdGltZSkvKDI0KjYwKjYwKjEwMDApICsgMVxuXHRlbHNlIGlmIGZpcnN0X2RhdGUgPCBzdGFydF9kYXRlXG5cdFx0Y291bnRfZGF5cyA9IChlbmRfZGF0ZV90aW1lIC0gc3RhcnRfZGF0ZV90aW1lKS8oMjQqNjAqNjAqMTAwMCkgKyAxXG5cblx0cmV0dXJuIHtcImNvdW50X2RheXNcIjogY291bnRfZGF5c31cblxuIyDph43nrpfov5nkuIDml6XnmoTkvZnpop1cbmJpbGxpbmdNYW5hZ2VyLnJlZnJlc2hfYmFsYW5jZSA9IChzcGFjZV9pZCwgcmVmcmVzaF9kYXRlKS0+XG5cdGxhc3RfYmlsbCA9IG51bGxcblx0YmlsbCA9IGRiLmJpbGxpbmdzLmZpbmRPbmUoe3NwYWNlOiBzcGFjZV9pZCwgY3JlYXRlZDogcmVmcmVzaF9kYXRlfSlcblxuXHQjIOiOt+WPluato+W4uOS7mOasvueahOWwj+S6jnJlZnJlc2hfZGF0ZeeahOacgOi/keeahOS4gOadoeiusOW9lVxuXHRwYXltZW50X2JpbGwgPSBkYi5iaWxsaW5ncy5maW5kT25lKFxuXHRcdHtcblx0XHRcdHNwYWNlOiBzcGFjZV9pZCxcblx0XHRcdGNyZWF0ZWQ6IHtcblx0XHRcdFx0JGx0OiByZWZyZXNoX2RhdGVcblx0XHRcdH0sXG5cdFx0XHRiaWxsaW5nX21vbnRoOiBiaWxsLmJpbGxpbmdfbW9udGhcblx0XHR9LFxuXHRcdHtcblx0XHRcdHNvcnQ6IHtcblx0XHRcdFx0bW9kaWZpZWQ6IC0xXG5cdFx0XHR9XG5cdFx0fVxuXHQpXG5cdGlmIHBheW1lbnRfYmlsbFxuXHRcdGxhc3RfYmlsbCA9IHBheW1lbnRfYmlsbFxuXHRlbHNlXG5cdFx0IyDojrflj5bmnIDmlrDnmoTnu5PnrpfnmoTkuIDmnaHorrDlvZVcblx0XHRiX21fZCA9IG5ldyBEYXRlKHBhcnNlSW50KGJpbGwuYmlsbGluZ19tb250aC5zbGljZSgwLDQpKSwgcGFyc2VJbnQoYmlsbC5iaWxsaW5nX21vbnRoLnNsaWNlKDQsNikpLCAwKVxuXHRcdGJfbSA9IG1vbWVudChiX21fZC5nZXRUaW1lKCktKGJfbV9kLmdldERhdGUoKSoyNCo2MCo2MCoxMDAwKSkuZm9ybWF0KFwiWVlZWU1NXCIpXG5cblx0XHRhcHBfYmlsbCA9IGRiLmJpbGxpbmdzLmZpbmRPbmUoXG5cdFx0XHR7XG5cdFx0XHRcdHNwYWNlOiBzcGFjZV9pZCxcblx0XHRcdFx0YmlsbGluZ19tb250aDogYl9tXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRzb3J0OiB7XG5cdFx0XHRcdFx0bW9kaWZpZWQ6IC0xXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHQpXG5cdFx0aWYgYXBwX2JpbGxcblx0XHRcdGxhc3RfYmlsbCA9IGFwcF9iaWxsXG5cblx0bGFzdF9iYWxhbmNlID0gaWYgbGFzdF9iaWxsIGFuZCBsYXN0X2JpbGwuYmFsYW5jZSB0aGVuIGxhc3RfYmlsbC5iYWxhbmNlIGVsc2UgMC4wXG5cblx0ZGViaXRzID0gaWYgYmlsbC5kZWJpdHMgdGhlbiBiaWxsLmRlYml0cyBlbHNlIDAuMFxuXHRjcmVkaXRzID0gaWYgYmlsbC5jcmVkaXRzIHRoZW4gYmlsbC5jcmVkaXRzIGVsc2UgMC4wXG5cdHNldE9iaiA9IG5ldyBPYmplY3Rcblx0c2V0T2JqLmJhbGFuY2UgPSBOdW1iZXIoKGxhc3RfYmFsYW5jZSArIGNyZWRpdHMgLSBkZWJpdHMpLnRvRml4ZWQoMikpXG5cdHNldE9iai5tb2RpZmllZCA9IG5ldyBEYXRlXG5cdGRiLmJpbGxpbmdzLmRpcmVjdC51cGRhdGUoe19pZDogYmlsbC5faWR9LCB7JHNldDogc2V0T2JqfSlcblxuIyDnu5PnrpflvZPmnIjnmoTmlK/lh7rkuI7kvZnpop1cbmJpbGxpbmdNYW5hZ2VyLmdldF9iYWxhbmNlID0gKHNwYWNlX2lkLCBhY2NvdW50aW5nX21vbnRoLCB1c2VyX2NvdW50LCBjb3VudF9kYXlzLCBtb2R1bGVfbmFtZSwgbGlzdHByaWNlKS0+XG5cdGFjY291bnRpbmdfZGF0ZSA9IG5ldyBEYXRlKHBhcnNlSW50KGFjY291bnRpbmdfbW9udGguc2xpY2UoMCw0KSksIHBhcnNlSW50KGFjY291bnRpbmdfbW9udGguc2xpY2UoNCw2KSksIDApXG5cdGRheXNfbnVtYmVyID0gYWNjb3VudGluZ19kYXRlLmdldERhdGUoKVxuXHRhY2NvdW50aW5nX2RhdGVfZm9ybWF0ID0gbW9tZW50KGFjY291bnRpbmdfZGF0ZSkuZm9ybWF0KFwiWVlZWU1NRERcIilcblxuXHRkZWJpdHMgPSBOdW1iZXIoKChjb3VudF9kYXlzL2RheXNfbnVtYmVyKSAqIHVzZXJfY291bnQgKiBsaXN0cHJpY2UpLnRvRml4ZWQoMikpXG5cdGxhc3RfYmlsbCA9IGRiLmJpbGxpbmdzLmZpbmRPbmUoXG5cdFx0e1xuXHRcdFx0c3BhY2U6IHNwYWNlX2lkLFxuXHRcdFx0YmlsbGluZ19kYXRlOiB7XG5cdFx0XHRcdCRsdGU6IGFjY291bnRpbmdfZGF0ZV9mb3JtYXRcblx0XHRcdH1cblx0XHR9LFxuXHRcdHtcblx0XHRcdHNvcnQ6IHtcblx0XHRcdFx0bW9kaWZpZWQ6IC0xXG5cdFx0XHR9XG5cdFx0fVxuXHQpXG5cdGxhc3RfYmFsYW5jZSA9IGlmIGxhc3RfYmlsbCBhbmQgbGFzdF9iaWxsLmJhbGFuY2UgdGhlbiBsYXN0X2JpbGwuYmFsYW5jZSBlbHNlIDAuMFxuXG5cdG5vdyA9IG5ldyBEYXRlXG5cdG5ld19iaWxsID0gbmV3IE9iamVjdFxuXHRuZXdfYmlsbC5faWQgPSBkYi5iaWxsaW5ncy5fbWFrZU5ld0lEKClcblx0bmV3X2JpbGwuYmlsbGluZ19tb250aCA9IGFjY291bnRpbmdfbW9udGhcblx0bmV3X2JpbGwuYmlsbGluZ19kYXRlID0gYWNjb3VudGluZ19kYXRlX2Zvcm1hdFxuXHRuZXdfYmlsbC5zcGFjZSA9IHNwYWNlX2lkXG5cdG5ld19iaWxsLnRyYW5zYWN0aW9uID0gbW9kdWxlX25hbWVcblx0bmV3X2JpbGwubGlzdHByaWNlID0gbGlzdHByaWNlXG5cdG5ld19iaWxsLnVzZXJfY291bnQgPSB1c2VyX2NvdW50XG5cdG5ld19iaWxsLmRlYml0cyA9IGRlYml0c1xuXHRuZXdfYmlsbC5iYWxhbmNlID0gTnVtYmVyKChsYXN0X2JhbGFuY2UgLSBkZWJpdHMpLnRvRml4ZWQoMikpXG5cdG5ld19iaWxsLmNyZWF0ZWQgPSBub3dcblx0bmV3X2JpbGwubW9kaWZpZWQgPSBub3dcblx0ZGIuYmlsbGluZ3MuZGlyZWN0Lmluc2VydChuZXdfYmlsbClcblxuYmlsbGluZ01hbmFnZXIuZ2V0U3BhY2VVc2VyQ291bnQgPSAoc3BhY2VfaWQpLT5cblx0ZGIuc3BhY2VfdXNlcnMuZmluZCh7c3BhY2U6IHNwYWNlX2lkLCB1c2VyX2FjY2VwdGVkOiB0cnVlfSkuY291bnQoKVxuXG5iaWxsaW5nTWFuYWdlci5yZWNhY3VsYXRlQmFsYW5jZSA9IChhY2NvdW50aW5nX21vbnRoLCBzcGFjZV9pZCktPlxuXHRyZWZyZXNoX2RhdGVzID0gbmV3IEFycmF5XG5cdGRiLmJpbGxpbmdzLmZpbmQoXG5cdFx0e1xuXHRcdFx0YmlsbGluZ19tb250aDogYWNjb3VudGluZ19tb250aCxcblx0XHRcdHNwYWNlOiBzcGFjZV9pZCxcblx0XHRcdHRyYW5zYWN0aW9uOiB7JGluOiBbXCJQYXltZW50XCIsIFwiU2VydmljZSBhZGp1c3RtZW50XCJdfVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0c29ydDoge2NyZWF0ZWQ6IDF9XG5cdFx0fVxuXHQpLmZvckVhY2ggKGJpbGwpLT5cblx0XHRyZWZyZXNoX2RhdGVzLnB1c2goYmlsbC5jcmVhdGVkKVxuXG5cdGlmIHJlZnJlc2hfZGF0ZXMubGVuZ3RoID4gMFxuXHRcdF8uZWFjaCByZWZyZXNoX2RhdGVzLCAocl9kKS0+XG5cdFx0XHRiaWxsaW5nTWFuYWdlci5yZWZyZXNoX2JhbGFuY2Uoc3BhY2VfaWQsIHJfZClcblxuYmlsbGluZ01hbmFnZXIuZ2V0X21vZHVsZXMgPSAoc3BhY2VfaWQsIGFjY291bnRpbmdfbW9udGgpLT5cblx0bW9kdWxlcyA9IG5ldyBBcnJheVxuXHRzdGFydF9kYXRlID0gYWNjb3VudGluZ19tb250aCArIFwiMDFcIlxuXHRlbmRfZGF0ZV90aW1lID0gbmV3IERhdGUocGFyc2VJbnQoYWNjb3VudGluZ19tb250aC5zbGljZSgwLDQpKSwgcGFyc2VJbnQoYWNjb3VudGluZ19tb250aC5zbGljZSg0LDYpKSwgMClcblx0ZW5kX2RhdGUgPSBtb21lbnQoZW5kX2RhdGVfdGltZS5nZXRUaW1lKCkpLmZvcm1hdCgnWVlZWU1NREQnKVxuXG5cdGRiLm1vZHVsZXMuZmluZCgpLmZvckVhY2ggKG0pLT5cblx0XHRtX2NoYW5nZWxvZyA9IGRiLm1vZHVsZXNfY2hhbmdlbG9ncy5maW5kT25lKFxuXHRcdFx0e1xuXHRcdFx0XHRzcGFjZTogc3BhY2VfaWQsXG5cdFx0XHRcdG1vZHVsZTogbS5uYW1lLFxuXHRcdFx0XHRjaGFuZ2VfZGF0ZToge1xuXHRcdFx0XHRcdCRsdGU6IGVuZF9kYXRlXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGNyZWF0ZWQ6IC0xXG5cdFx0XHR9XG5cdFx0KVxuXHRcdCMg6Iul5pyq6I635b6X5Y+v5Yy56YWN55qE6K6w5b2V77yM6K+05piO6K+lbW9kdWxl5pyq5a6J6KOF77yM5b2T5pyI5LiN6K6h566X6LS555SoXG5cdFx0aWYgbm90IG1fY2hhbmdlbG9nXG5cdFx0XHQjICBkbyBub3RoaW5nXG5cblx0XHQjIOiLpeivpeiusOW9leeahGNoYW5nZV9kYXRlPHN0YXJ0ZGF0ZSAmIG9wZXJhdGlvbj3igJxpbnN0YWxs4oCd77yM6K+05piO5b2T5pyI5YmN5bey5a6J6KOF77yM5Zug5q2k6ZyA6K6h566X6LS555So77yM5bCGbW9kdWxlX25hbWXkuI5tb2R1bGVzLmxpc3RwcmljZeWKoOWFpW1vZHVsZXPmlbDnu4TkuK1cblx0XHRlbHNlIGlmIG1fY2hhbmdlbG9nLmNoYW5nZV9kYXRlIDwgc3RhcnRfZGF0ZSBhbmQgbV9jaGFuZ2Vsb2cub3BlcmF0aW9uID09IFwiaW5zdGFsbFwiXG5cdFx0XHRtb2R1bGVzLnB1c2gobSlcblx0XHQjIOiLpeivpeiusOW9leeahGNoYW5nZV9kYXRlPHN0YXJ0ZGF0ZSAmIG9wZXJhdGlvbj3igJx1bmluc3RhbGzigJ3vvIzor7TmmI7lvZPmnIjliY3lt7Lljbjovb3vvIzlm6DmraTkuI3orqHnrpfotLnnlKhcblx0XHRlbHNlIGlmIG1fY2hhbmdlbG9nLmNoYW5nZV9kYXRlIDwgc3RhcnRfZGF0ZSBhbmQgbV9jaGFuZ2Vsb2cub3BlcmF0aW9uID09IFwidW5pbnN0YWxsXCJcblx0XHRcdCMgIGRvIG5vdGhpbmdcblx0XHQjIOiLpeivpeiusOW9leeahGNoYW5nZV9kYXRl4omlc3RhcnRkYXRl77yM6K+05piO5b2T5pyI5YaF5Y+R55Sf6L+H5a6J6KOF5oiW5Y246L2955qE5pON5L2c77yM6ZyA6K6h566X6LS555So77yM5bCGbW9kdWxlX25hbWXkuI5tb2R1bGVzLmxpc3RwcmljZeWKoOWFpW1vZHVsZXPmlbDnu4TkuK1cblx0XHRlbHNlIGlmIG1fY2hhbmdlbG9nLmNoYW5nZV9kYXRlID49IHN0YXJ0X2RhdGVcblx0XHRcdG1vZHVsZXMucHVzaChtKVxuXG5cdHJldHVybiBtb2R1bGVzXG5cbmJpbGxpbmdNYW5hZ2VyLmdldF9tb2R1bGVzX25hbWUgPSAoKS0+XG5cdG1vZHVsZXNfbmFtZSA9IG5ldyBBcnJheVxuXHRkYi5tb2R1bGVzLmZpbmQoKS5mb3JFYWNoKChtKS0+XG5cdFx0bW9kdWxlc19uYW1lLnB1c2gobS5uYW1lKVxuXHQpXG5cdHJldHVybiBtb2R1bGVzX25hbWVcblxuXG5iaWxsaW5nTWFuYWdlci5jYWN1bGF0ZV9ieV9hY2NvdW50aW5nX21vbnRoID0gKGFjY291bnRpbmdfbW9udGgsIHNwYWNlX2lkKS0+XG5cdGlmIGFjY291bnRpbmdfbW9udGggPiAobW9tZW50KCkuZm9ybWF0KCdZWVlZTU0nKSlcblx0XHRyZXR1cm5cblx0aWYgYWNjb3VudGluZ19tb250aCA9PSAobW9tZW50KCkuZm9ybWF0KCdZWVlZTU0nKSlcblx0XHQjIOmHjeeul+W9k+aciOeahOWFheWAvOWQjuS9meminVxuXHRcdGJpbGxpbmdNYW5hZ2VyLnJlY2FjdWxhdGVCYWxhbmNlKGFjY291bnRpbmdfbW9udGgsIHNwYWNlX2lkKVxuXG5cdFx0ZGViaXRzID0gMFxuXHRcdG1vZHVsZXNfbmFtZSA9IGJpbGxpbmdNYW5hZ2VyLmdldF9tb2R1bGVzX25hbWUoKVxuXHRcdGJfbV9kID0gbmV3IERhdGUocGFyc2VJbnQoYWNjb3VudGluZ19tb250aC5zbGljZSgwLDQpKSwgcGFyc2VJbnQoYWNjb3VudGluZ19tb250aC5zbGljZSg0LDYpKSwgMClcblx0XHRiX20gPSBtb21lbnQoYl9tX2QuZ2V0VGltZSgpLShiX21fZC5nZXREYXRlKCkqMjQqNjAqNjAqMTAwMCkpLmZvcm1hdChcIllZWVlNTUREXCIpXG5cdFx0ZGIuYmlsbGluZ3MuZmluZChcblx0XHRcdHtcblx0XHRcdFx0YmlsbGluZ19kYXRlOiBiX20sXG5cdFx0XHRcdHNwYWNlOiBzcGFjZV9pZCxcblx0XHRcdFx0dHJhbnNhY3Rpb246IHtcblx0XHRcdFx0XHQkaW46IG1vZHVsZXNfbmFtZVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0KS5mb3JFYWNoKChiKS0+XG5cdFx0XHRkZWJpdHMgKz0gYi5kZWJpdHNcblx0XHQpXG5cdFx0bmV3ZXN0X2JpbGwgPSBkYi5iaWxsaW5ncy5maW5kT25lKHtzcGFjZTogc3BhY2VfaWR9LCB7c29ydDoge21vZGlmaWVkOiAtMX19KVxuXHRcdGJhbGFuY2UgPSBuZXdlc3RfYmlsbC5iYWxhbmNlXG5cdFx0cmVtYWluaW5nX21vbnRocyA9IDBcblx0XHRpZiBiYWxhbmNlID4gMFxuXHRcdFx0aWYgZGViaXRzID4gMFxuXHRcdFx0XHRyZW1haW5pbmdfbW9udGhzID0gcGFyc2VJbnQoYmFsYW5jZS9kZWJpdHMpICsgMVxuXHRcdFx0ZWxzZVxuXHRcdFx0XHQjIOW9k+aciOWImuWNh+e6p++8jOW5tuayoeacieaJo+asvlxuXHRcdFx0XHRyZW1haW5pbmdfbW9udGhzID0gMVxuXG5cdFx0ZGIuc3BhY2VzLmRpcmVjdC51cGRhdGUoXG5cdFx0XHR7XG5cdFx0XHRcdF9pZDogc3BhY2VfaWRcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdCRzZXQ6IHtcblx0XHRcdFx0XHRiYWxhbmNlOiBiYWxhbmNlLFxuXHRcdFx0XHRcdFwiYmlsbGluZy5yZW1haW5pbmdfbW9udGhzXCI6IHJlbWFpbmluZ19tb250aHNcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdClcblx0ZWxzZVxuXHRcdCMg6I635b6X5YW257uT566X5a+56LGh5pel5pyfcGF5bWVudGRhdGVz5pWw57uE5ZKMY291bnRfZGF5c+WPr+e7k+eul+aXpeaVsFxuXHRcdHBlcmlvZF9yZXN1bHQgPSBiaWxsaW5nTWFuYWdlci5nZXRfYWNjb3VudGluZ19wZXJpb2Qoc3BhY2VfaWQsIGFjY291bnRpbmdfbW9udGgpXG5cdFx0aWYgcGVyaW9kX3Jlc3VsdFtcImNvdW50X2RheXNcIl0gPT0gMFxuXHRcdFx0IyDkuZ/pnIDlr7nlvZPmnIjnmoTlhYXlgLzorrDlvZXmiafooYzmm7TmlrBcblx0XHRcdGJpbGxpbmdNYW5hZ2VyLnJlY2FjdWxhdGVCYWxhbmNlKGFjY291bnRpbmdfbW9udGgsIHNwYWNlX2lkKVxuXG5cdFx0ZWxzZVxuXHRcdFx0dXNlcl9jb3VudCA9IGJpbGxpbmdNYW5hZ2VyLmdldFNwYWNlVXNlckNvdW50KHNwYWNlX2lkKVxuXG5cdFx0XHQjIOa4hemZpOW9k+aciOeahOW3sue7k+eul+iusOW9lVxuXHRcdFx0bW9kdWxlc19uYW1lID0gYmlsbGluZ01hbmFnZXIuZ2V0X21vZHVsZXNfbmFtZSgpXG5cdFx0XHRhY2NvdW50aW5nX2RhdGUgPSBuZXcgRGF0ZShwYXJzZUludChhY2NvdW50aW5nX21vbnRoLnNsaWNlKDAsNCkpLCBwYXJzZUludChhY2NvdW50aW5nX21vbnRoLnNsaWNlKDQsNikpLCAwKVxuXHRcdFx0YWNjb3VudGluZ19kYXRlX2Zvcm1hdCA9IG1vbWVudChhY2NvdW50aW5nX2RhdGUpLmZvcm1hdChcIllZWVlNTUREXCIpXG5cdFx0XHRkYi5iaWxsaW5ncy5yZW1vdmUoXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRiaWxsaW5nX2RhdGU6IGFjY291bnRpbmdfZGF0ZV9mb3JtYXQsXG5cdFx0XHRcdFx0c3BhY2U6IHNwYWNlX2lkLFxuXHRcdFx0XHRcdHRyYW5zYWN0aW9uOiB7XG5cdFx0XHRcdFx0XHQkaW46IG1vZHVsZXNfbmFtZVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0KVxuXHRcdFx0IyDph43nrpflvZPmnIjnmoTlhYXlgLzlkI7kvZnpop1cblx0XHRcdGJpbGxpbmdNYW5hZ2VyLnJlY2FjdWxhdGVCYWxhbmNlKGFjY291bnRpbmdfbW9udGgsIHNwYWNlX2lkKVxuXG5cdFx0XHQjIOe7k+eul+W9k+aciOeahEFQUOS9v+eUqOWQjuS9meminVxuXHRcdFx0bW9kdWxlcyA9IGJpbGxpbmdNYW5hZ2VyLmdldF9tb2R1bGVzKHNwYWNlX2lkLCBhY2NvdW50aW5nX21vbnRoKVxuXHRcdFx0aWYgbW9kdWxlcyBhbmQgIG1vZHVsZXMubGVuZ3RoPjBcblx0XHRcdFx0Xy5lYWNoIG1vZHVsZXMsIChtKS0+XG5cdFx0XHRcdFx0YmlsbGluZ01hbmFnZXIuZ2V0X2JhbGFuY2Uoc3BhY2VfaWQsIGFjY291bnRpbmdfbW9udGgsIHVzZXJfY291bnQsIHBlcmlvZF9yZXN1bHRbXCJjb3VudF9kYXlzXCJdLCBtLm5hbWUsIG0ubGlzdHByaWNlKVxuXG5cdFx0YV9tID0gbW9tZW50KG5ldyBEYXRlKHBhcnNlSW50KGFjY291bnRpbmdfbW9udGguc2xpY2UoMCw0KSksIHBhcnNlSW50KGFjY291bnRpbmdfbW9udGguc2xpY2UoNCw2KSksIDEpLmdldFRpbWUoKSkuZm9ybWF0KFwiWVlZWU1NXCIpXG5cdFx0YmlsbGluZ01hbmFnZXIuY2FjdWxhdGVfYnlfYWNjb3VudGluZ19tb250aChhX20sIHNwYWNlX2lkKVxuXG5iaWxsaW5nTWFuYWdlci5zcGVjaWFsX3BheSA9IChzcGFjZV9pZCwgbW9kdWxlX25hbWVzLCB0b3RhbF9mZWUsIG9wZXJhdG9yX2lkLCBlbmRfZGF0ZSwgdXNlcl9jb3VudCktPlxuXHRzcGFjZSA9IGRiLnNwYWNlcy5maW5kT25lKHNwYWNlX2lkKVxuXG5cdG1vZHVsZXMgPSBzcGFjZS5tb2R1bGVzIHx8IG5ldyBBcnJheVxuXG5cdG5ld19tb2R1bGVzID0gXy5kaWZmZXJlbmNlKG1vZHVsZV9uYW1lcywgbW9kdWxlcylcblxuXHRtID0gbW9tZW50KClcblx0bm93ID0gbS5fZFxuXG5cdHNwYWNlX3VwZGF0ZV9vYmogPSBuZXcgT2JqZWN0XG5cblx0IyDmm7TmlrBzcGFjZeaYr+WQpuS4k+S4mueJiOeahOagh+iusFxuXHRpZiBzcGFjZS5pc19wYWlkIGlzbnQgdHJ1ZVxuXHRcdHNwYWNlX3VwZGF0ZV9vYmouaXNfcGFpZCA9IHRydWVcblx0XHRzcGFjZV91cGRhdGVfb2JqLnN0YXJ0X2RhdGUgPSBuZXcgRGF0ZVxuXG5cdCMg5pu05pawbW9kdWxlc1xuXHRzcGFjZV91cGRhdGVfb2JqLm1vZHVsZXMgPSBtb2R1bGVfbmFtZXNcblx0c3BhY2VfdXBkYXRlX29iai5tb2RpZmllZCA9IG5vd1xuXHRzcGFjZV91cGRhdGVfb2JqLm1vZGlmaWVkX2J5ID0gb3BlcmF0b3JfaWRcblx0c3BhY2VfdXBkYXRlX29iai5lbmRfZGF0ZSA9IG5ldyBEYXRlKGVuZF9kYXRlKVxuXHRzcGFjZV91cGRhdGVfb2JqLnVzZXJfbGltaXQgPSB1c2VyX2NvdW50XG5cblx0ciA9IGRiLnNwYWNlcy5kaXJlY3QudXBkYXRlKHtfaWQ6IHNwYWNlX2lkfSwgeyRzZXQ6IHNwYWNlX3VwZGF0ZV9vYmp9KVxuXHRpZiByXG5cdFx0Xy5lYWNoIG5ld19tb2R1bGVzLCAobW9kdWxlKS0+XG5cdFx0XHRtY2wgPSBuZXcgT2JqZWN0XG5cdFx0XHRtY2wuX2lkID0gZGIubW9kdWxlc19jaGFuZ2Vsb2dzLl9tYWtlTmV3SUQoKVxuXHRcdFx0bWNsLmNoYW5nZV9kYXRlID0gbS5mb3JtYXQoXCJZWVlZTU1ERFwiKVxuXHRcdFx0bWNsLm9wZXJhdG9yID0gb3BlcmF0b3JfaWRcblx0XHRcdG1jbC5zcGFjZSA9IHNwYWNlX2lkXG5cdFx0XHRtY2wub3BlcmF0aW9uID0gXCJpbnN0YWxsXCJcblx0XHRcdG1jbC5tb2R1bGUgPSBtb2R1bGVcblx0XHRcdG1jbC5jcmVhdGVkID0gbm93XG5cdFx0XHRkYi5tb2R1bGVzX2NoYW5nZWxvZ3MuaW5zZXJ0KG1jbClcblxuXHRyZXR1cm4iLCIgICAgICAgICAgICAgICAgICAgXG5cbmJpbGxpbmdNYW5hZ2VyID0ge307XG5cbmJpbGxpbmdNYW5hZ2VyLmdldF9hY2NvdW50aW5nX3BlcmlvZCA9IGZ1bmN0aW9uKHNwYWNlX2lkLCBhY2NvdW50aW5nX21vbnRoKSB7XG4gIHZhciBiaWxsaW5nLCBjb3VudF9kYXlzLCBlbmRfZGF0ZSwgZW5kX2RhdGVfdGltZSwgZmlyc3RfZGF0ZSwgc3RhcnRfZGF0ZSwgc3RhcnRfZGF0ZV90aW1lO1xuICBjb3VudF9kYXlzID0gMDtcbiAgZW5kX2RhdGVfdGltZSA9IG5ldyBEYXRlKHBhcnNlSW50KGFjY291bnRpbmdfbW9udGguc2xpY2UoMCwgNCkpLCBwYXJzZUludChhY2NvdW50aW5nX21vbnRoLnNsaWNlKDQsIDYpKSwgMCk7XG4gIGVuZF9kYXRlID0gbW9tZW50KGVuZF9kYXRlX3RpbWUuZ2V0VGltZSgpKS5mb3JtYXQoJ1lZWVlNTUREJyk7XG4gIGJpbGxpbmcgPSBkYi5iaWxsaW5ncy5maW5kT25lKHtcbiAgICBzcGFjZTogc3BhY2VfaWQsXG4gICAgdHJhbnNhY3Rpb246IFwiU3RhcnRpbmcgYmFsYW5jZVwiXG4gIH0pO1xuICBmaXJzdF9kYXRlID0gYmlsbGluZy5iaWxsaW5nX2RhdGU7XG4gIHN0YXJ0X2RhdGUgPSBhY2NvdW50aW5nX21vbnRoICsgXCIwMVwiO1xuICBzdGFydF9kYXRlX3RpbWUgPSBuZXcgRGF0ZShwYXJzZUludChhY2NvdW50aW5nX21vbnRoLnNsaWNlKDAsIDQpKSwgcGFyc2VJbnQoYWNjb3VudGluZ19tb250aC5zbGljZSg0LCA2KSksIDEgLSBlbmRfZGF0ZV90aW1lLmdldERhdGUoKSk7XG4gIGlmIChmaXJzdF9kYXRlID49IGVuZF9kYXRlKSB7XG5cbiAgfSBlbHNlIGlmIChzdGFydF9kYXRlIDw9IGZpcnN0X2RhdGUgJiYgZmlyc3RfZGF0ZSA8IGVuZF9kYXRlKSB7XG4gICAgY291bnRfZGF5cyA9IChlbmRfZGF0ZV90aW1lIC0gc3RhcnRfZGF0ZV90aW1lKSAvICgyNCAqIDYwICogNjAgKiAxMDAwKSArIDE7XG4gIH0gZWxzZSBpZiAoZmlyc3RfZGF0ZSA8IHN0YXJ0X2RhdGUpIHtcbiAgICBjb3VudF9kYXlzID0gKGVuZF9kYXRlX3RpbWUgLSBzdGFydF9kYXRlX3RpbWUpIC8gKDI0ICogNjAgKiA2MCAqIDEwMDApICsgMTtcbiAgfVxuICByZXR1cm4ge1xuICAgIFwiY291bnRfZGF5c1wiOiBjb3VudF9kYXlzXG4gIH07XG59O1xuXG5iaWxsaW5nTWFuYWdlci5yZWZyZXNoX2JhbGFuY2UgPSBmdW5jdGlvbihzcGFjZV9pZCwgcmVmcmVzaF9kYXRlKSB7XG4gIHZhciBhcHBfYmlsbCwgYl9tLCBiX21fZCwgYmlsbCwgY3JlZGl0cywgZGViaXRzLCBsYXN0X2JhbGFuY2UsIGxhc3RfYmlsbCwgcGF5bWVudF9iaWxsLCBzZXRPYmo7XG4gIGxhc3RfYmlsbCA9IG51bGw7XG4gIGJpbGwgPSBkYi5iaWxsaW5ncy5maW5kT25lKHtcbiAgICBzcGFjZTogc3BhY2VfaWQsXG4gICAgY3JlYXRlZDogcmVmcmVzaF9kYXRlXG4gIH0pO1xuICBwYXltZW50X2JpbGwgPSBkYi5iaWxsaW5ncy5maW5kT25lKHtcbiAgICBzcGFjZTogc3BhY2VfaWQsXG4gICAgY3JlYXRlZDoge1xuICAgICAgJGx0OiByZWZyZXNoX2RhdGVcbiAgICB9LFxuICAgIGJpbGxpbmdfbW9udGg6IGJpbGwuYmlsbGluZ19tb250aFxuICB9LCB7XG4gICAgc29ydDoge1xuICAgICAgbW9kaWZpZWQ6IC0xXG4gICAgfVxuICB9KTtcbiAgaWYgKHBheW1lbnRfYmlsbCkge1xuICAgIGxhc3RfYmlsbCA9IHBheW1lbnRfYmlsbDtcbiAgfSBlbHNlIHtcbiAgICBiX21fZCA9IG5ldyBEYXRlKHBhcnNlSW50KGJpbGwuYmlsbGluZ19tb250aC5zbGljZSgwLCA0KSksIHBhcnNlSW50KGJpbGwuYmlsbGluZ19tb250aC5zbGljZSg0LCA2KSksIDApO1xuICAgIGJfbSA9IG1vbWVudChiX21fZC5nZXRUaW1lKCkgLSAoYl9tX2QuZ2V0RGF0ZSgpICogMjQgKiA2MCAqIDYwICogMTAwMCkpLmZvcm1hdChcIllZWVlNTVwiKTtcbiAgICBhcHBfYmlsbCA9IGRiLmJpbGxpbmdzLmZpbmRPbmUoe1xuICAgICAgc3BhY2U6IHNwYWNlX2lkLFxuICAgICAgYmlsbGluZ19tb250aDogYl9tXG4gICAgfSwge1xuICAgICAgc29ydDoge1xuICAgICAgICBtb2RpZmllZDogLTFcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoYXBwX2JpbGwpIHtcbiAgICAgIGxhc3RfYmlsbCA9IGFwcF9iaWxsO1xuICAgIH1cbiAgfVxuICBsYXN0X2JhbGFuY2UgPSBsYXN0X2JpbGwgJiYgbGFzdF9iaWxsLmJhbGFuY2UgPyBsYXN0X2JpbGwuYmFsYW5jZSA6IDAuMDtcbiAgZGViaXRzID0gYmlsbC5kZWJpdHMgPyBiaWxsLmRlYml0cyA6IDAuMDtcbiAgY3JlZGl0cyA9IGJpbGwuY3JlZGl0cyA/IGJpbGwuY3JlZGl0cyA6IDAuMDtcbiAgc2V0T2JqID0gbmV3IE9iamVjdDtcbiAgc2V0T2JqLmJhbGFuY2UgPSBOdW1iZXIoKGxhc3RfYmFsYW5jZSArIGNyZWRpdHMgLSBkZWJpdHMpLnRvRml4ZWQoMikpO1xuICBzZXRPYmoubW9kaWZpZWQgPSBuZXcgRGF0ZTtcbiAgcmV0dXJuIGRiLmJpbGxpbmdzLmRpcmVjdC51cGRhdGUoe1xuICAgIF9pZDogYmlsbC5faWRcbiAgfSwge1xuICAgICRzZXQ6IHNldE9ialxuICB9KTtcbn07XG5cbmJpbGxpbmdNYW5hZ2VyLmdldF9iYWxhbmNlID0gZnVuY3Rpb24oc3BhY2VfaWQsIGFjY291bnRpbmdfbW9udGgsIHVzZXJfY291bnQsIGNvdW50X2RheXMsIG1vZHVsZV9uYW1lLCBsaXN0cHJpY2UpIHtcbiAgdmFyIGFjY291bnRpbmdfZGF0ZSwgYWNjb3VudGluZ19kYXRlX2Zvcm1hdCwgZGF5c19udW1iZXIsIGRlYml0cywgbGFzdF9iYWxhbmNlLCBsYXN0X2JpbGwsIG5ld19iaWxsLCBub3c7XG4gIGFjY291bnRpbmdfZGF0ZSA9IG5ldyBEYXRlKHBhcnNlSW50KGFjY291bnRpbmdfbW9udGguc2xpY2UoMCwgNCkpLCBwYXJzZUludChhY2NvdW50aW5nX21vbnRoLnNsaWNlKDQsIDYpKSwgMCk7XG4gIGRheXNfbnVtYmVyID0gYWNjb3VudGluZ19kYXRlLmdldERhdGUoKTtcbiAgYWNjb3VudGluZ19kYXRlX2Zvcm1hdCA9IG1vbWVudChhY2NvdW50aW5nX2RhdGUpLmZvcm1hdChcIllZWVlNTUREXCIpO1xuICBkZWJpdHMgPSBOdW1iZXIoKChjb3VudF9kYXlzIC8gZGF5c19udW1iZXIpICogdXNlcl9jb3VudCAqIGxpc3RwcmljZSkudG9GaXhlZCgyKSk7XG4gIGxhc3RfYmlsbCA9IGRiLmJpbGxpbmdzLmZpbmRPbmUoe1xuICAgIHNwYWNlOiBzcGFjZV9pZCxcbiAgICBiaWxsaW5nX2RhdGU6IHtcbiAgICAgICRsdGU6IGFjY291bnRpbmdfZGF0ZV9mb3JtYXRcbiAgICB9XG4gIH0sIHtcbiAgICBzb3J0OiB7XG4gICAgICBtb2RpZmllZDogLTFcbiAgICB9XG4gIH0pO1xuICBsYXN0X2JhbGFuY2UgPSBsYXN0X2JpbGwgJiYgbGFzdF9iaWxsLmJhbGFuY2UgPyBsYXN0X2JpbGwuYmFsYW5jZSA6IDAuMDtcbiAgbm93ID0gbmV3IERhdGU7XG4gIG5ld19iaWxsID0gbmV3IE9iamVjdDtcbiAgbmV3X2JpbGwuX2lkID0gZGIuYmlsbGluZ3MuX21ha2VOZXdJRCgpO1xuICBuZXdfYmlsbC5iaWxsaW5nX21vbnRoID0gYWNjb3VudGluZ19tb250aDtcbiAgbmV3X2JpbGwuYmlsbGluZ19kYXRlID0gYWNjb3VudGluZ19kYXRlX2Zvcm1hdDtcbiAgbmV3X2JpbGwuc3BhY2UgPSBzcGFjZV9pZDtcbiAgbmV3X2JpbGwudHJhbnNhY3Rpb24gPSBtb2R1bGVfbmFtZTtcbiAgbmV3X2JpbGwubGlzdHByaWNlID0gbGlzdHByaWNlO1xuICBuZXdfYmlsbC51c2VyX2NvdW50ID0gdXNlcl9jb3VudDtcbiAgbmV3X2JpbGwuZGViaXRzID0gZGViaXRzO1xuICBuZXdfYmlsbC5iYWxhbmNlID0gTnVtYmVyKChsYXN0X2JhbGFuY2UgLSBkZWJpdHMpLnRvRml4ZWQoMikpO1xuICBuZXdfYmlsbC5jcmVhdGVkID0gbm93O1xuICBuZXdfYmlsbC5tb2RpZmllZCA9IG5vdztcbiAgcmV0dXJuIGRiLmJpbGxpbmdzLmRpcmVjdC5pbnNlcnQobmV3X2JpbGwpO1xufTtcblxuYmlsbGluZ01hbmFnZXIuZ2V0U3BhY2VVc2VyQ291bnQgPSBmdW5jdGlvbihzcGFjZV9pZCkge1xuICByZXR1cm4gZGIuc3BhY2VfdXNlcnMuZmluZCh7XG4gICAgc3BhY2U6IHNwYWNlX2lkLFxuICAgIHVzZXJfYWNjZXB0ZWQ6IHRydWVcbiAgfSkuY291bnQoKTtcbn07XG5cbmJpbGxpbmdNYW5hZ2VyLnJlY2FjdWxhdGVCYWxhbmNlID0gZnVuY3Rpb24oYWNjb3VudGluZ19tb250aCwgc3BhY2VfaWQpIHtcbiAgdmFyIHJlZnJlc2hfZGF0ZXM7XG4gIHJlZnJlc2hfZGF0ZXMgPSBuZXcgQXJyYXk7XG4gIGRiLmJpbGxpbmdzLmZpbmQoe1xuICAgIGJpbGxpbmdfbW9udGg6IGFjY291bnRpbmdfbW9udGgsXG4gICAgc3BhY2U6IHNwYWNlX2lkLFxuICAgIHRyYW5zYWN0aW9uOiB7XG4gICAgICAkaW46IFtcIlBheW1lbnRcIiwgXCJTZXJ2aWNlIGFkanVzdG1lbnRcIl1cbiAgICB9XG4gIH0sIHtcbiAgICBzb3J0OiB7XG4gICAgICBjcmVhdGVkOiAxXG4gICAgfVxuICB9KS5mb3JFYWNoKGZ1bmN0aW9uKGJpbGwpIHtcbiAgICByZXR1cm4gcmVmcmVzaF9kYXRlcy5wdXNoKGJpbGwuY3JlYXRlZCk7XG4gIH0pO1xuICBpZiAocmVmcmVzaF9kYXRlcy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIF8uZWFjaChyZWZyZXNoX2RhdGVzLCBmdW5jdGlvbihyX2QpIHtcbiAgICAgIHJldHVybiBiaWxsaW5nTWFuYWdlci5yZWZyZXNoX2JhbGFuY2Uoc3BhY2VfaWQsIHJfZCk7XG4gICAgfSk7XG4gIH1cbn07XG5cbmJpbGxpbmdNYW5hZ2VyLmdldF9tb2R1bGVzID0gZnVuY3Rpb24oc3BhY2VfaWQsIGFjY291bnRpbmdfbW9udGgpIHtcbiAgdmFyIGVuZF9kYXRlLCBlbmRfZGF0ZV90aW1lLCBtb2R1bGVzLCBzdGFydF9kYXRlO1xuICBtb2R1bGVzID0gbmV3IEFycmF5O1xuICBzdGFydF9kYXRlID0gYWNjb3VudGluZ19tb250aCArIFwiMDFcIjtcbiAgZW5kX2RhdGVfdGltZSA9IG5ldyBEYXRlKHBhcnNlSW50KGFjY291bnRpbmdfbW9udGguc2xpY2UoMCwgNCkpLCBwYXJzZUludChhY2NvdW50aW5nX21vbnRoLnNsaWNlKDQsIDYpKSwgMCk7XG4gIGVuZF9kYXRlID0gbW9tZW50KGVuZF9kYXRlX3RpbWUuZ2V0VGltZSgpKS5mb3JtYXQoJ1lZWVlNTUREJyk7XG4gIGRiLm1vZHVsZXMuZmluZCgpLmZvckVhY2goZnVuY3Rpb24obSkge1xuICAgIHZhciBtX2NoYW5nZWxvZztcbiAgICBtX2NoYW5nZWxvZyA9IGRiLm1vZHVsZXNfY2hhbmdlbG9ncy5maW5kT25lKHtcbiAgICAgIHNwYWNlOiBzcGFjZV9pZCxcbiAgICAgIG1vZHVsZTogbS5uYW1lLFxuICAgICAgY2hhbmdlX2RhdGU6IHtcbiAgICAgICAgJGx0ZTogZW5kX2RhdGVcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBjcmVhdGVkOiAtMVxuICAgIH0pO1xuICAgIGlmICghbV9jaGFuZ2Vsb2cpIHtcblxuICAgIH0gZWxzZSBpZiAobV9jaGFuZ2Vsb2cuY2hhbmdlX2RhdGUgPCBzdGFydF9kYXRlICYmIG1fY2hhbmdlbG9nLm9wZXJhdGlvbiA9PT0gXCJpbnN0YWxsXCIpIHtcbiAgICAgIHJldHVybiBtb2R1bGVzLnB1c2gobSk7XG4gICAgfSBlbHNlIGlmIChtX2NoYW5nZWxvZy5jaGFuZ2VfZGF0ZSA8IHN0YXJ0X2RhdGUgJiYgbV9jaGFuZ2Vsb2cub3BlcmF0aW9uID09PSBcInVuaW5zdGFsbFwiKSB7XG5cbiAgICB9IGVsc2UgaWYgKG1fY2hhbmdlbG9nLmNoYW5nZV9kYXRlID49IHN0YXJ0X2RhdGUpIHtcbiAgICAgIHJldHVybiBtb2R1bGVzLnB1c2gobSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIG1vZHVsZXM7XG59O1xuXG5iaWxsaW5nTWFuYWdlci5nZXRfbW9kdWxlc19uYW1lID0gZnVuY3Rpb24oKSB7XG4gIHZhciBtb2R1bGVzX25hbWU7XG4gIG1vZHVsZXNfbmFtZSA9IG5ldyBBcnJheTtcbiAgZGIubW9kdWxlcy5maW5kKCkuZm9yRWFjaChmdW5jdGlvbihtKSB7XG4gICAgcmV0dXJuIG1vZHVsZXNfbmFtZS5wdXNoKG0ubmFtZSk7XG4gIH0pO1xuICByZXR1cm4gbW9kdWxlc19uYW1lO1xufTtcblxuYmlsbGluZ01hbmFnZXIuY2FjdWxhdGVfYnlfYWNjb3VudGluZ19tb250aCA9IGZ1bmN0aW9uKGFjY291bnRpbmdfbW9udGgsIHNwYWNlX2lkKSB7XG4gIHZhciBhX20sIGFjY291bnRpbmdfZGF0ZSwgYWNjb3VudGluZ19kYXRlX2Zvcm1hdCwgYl9tLCBiX21fZCwgYmFsYW5jZSwgZGViaXRzLCBtb2R1bGVzLCBtb2R1bGVzX25hbWUsIG5ld2VzdF9iaWxsLCBwZXJpb2RfcmVzdWx0LCByZW1haW5pbmdfbW9udGhzLCB1c2VyX2NvdW50O1xuICBpZiAoYWNjb3VudGluZ19tb250aCA+IChtb21lbnQoKS5mb3JtYXQoJ1lZWVlNTScpKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoYWNjb3VudGluZ19tb250aCA9PT0gKG1vbWVudCgpLmZvcm1hdCgnWVlZWU1NJykpKSB7XG4gICAgYmlsbGluZ01hbmFnZXIucmVjYWN1bGF0ZUJhbGFuY2UoYWNjb3VudGluZ19tb250aCwgc3BhY2VfaWQpO1xuICAgIGRlYml0cyA9IDA7XG4gICAgbW9kdWxlc19uYW1lID0gYmlsbGluZ01hbmFnZXIuZ2V0X21vZHVsZXNfbmFtZSgpO1xuICAgIGJfbV9kID0gbmV3IERhdGUocGFyc2VJbnQoYWNjb3VudGluZ19tb250aC5zbGljZSgwLCA0KSksIHBhcnNlSW50KGFjY291bnRpbmdfbW9udGguc2xpY2UoNCwgNikpLCAwKTtcbiAgICBiX20gPSBtb21lbnQoYl9tX2QuZ2V0VGltZSgpIC0gKGJfbV9kLmdldERhdGUoKSAqIDI0ICogNjAgKiA2MCAqIDEwMDApKS5mb3JtYXQoXCJZWVlZTU1ERFwiKTtcbiAgICBkYi5iaWxsaW5ncy5maW5kKHtcbiAgICAgIGJpbGxpbmdfZGF0ZTogYl9tLFxuICAgICAgc3BhY2U6IHNwYWNlX2lkLFxuICAgICAgdHJhbnNhY3Rpb246IHtcbiAgICAgICAgJGluOiBtb2R1bGVzX25hbWVcbiAgICAgIH1cbiAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uKGIpIHtcbiAgICAgIHJldHVybiBkZWJpdHMgKz0gYi5kZWJpdHM7XG4gICAgfSk7XG4gICAgbmV3ZXN0X2JpbGwgPSBkYi5iaWxsaW5ncy5maW5kT25lKHtcbiAgICAgIHNwYWNlOiBzcGFjZV9pZFxuICAgIH0sIHtcbiAgICAgIHNvcnQ6IHtcbiAgICAgICAgbW9kaWZpZWQ6IC0xXG4gICAgICB9XG4gICAgfSk7XG4gICAgYmFsYW5jZSA9IG5ld2VzdF9iaWxsLmJhbGFuY2U7XG4gICAgcmVtYWluaW5nX21vbnRocyA9IDA7XG4gICAgaWYgKGJhbGFuY2UgPiAwKSB7XG4gICAgICBpZiAoZGViaXRzID4gMCkge1xuICAgICAgICByZW1haW5pbmdfbW9udGhzID0gcGFyc2VJbnQoYmFsYW5jZSAvIGRlYml0cykgKyAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVtYWluaW5nX21vbnRocyA9IDE7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYi5zcGFjZXMuZGlyZWN0LnVwZGF0ZSh7XG4gICAgICBfaWQ6IHNwYWNlX2lkXG4gICAgfSwge1xuICAgICAgJHNldDoge1xuICAgICAgICBiYWxhbmNlOiBiYWxhbmNlLFxuICAgICAgICBcImJpbGxpbmcucmVtYWluaW5nX21vbnRoc1wiOiByZW1haW5pbmdfbW9udGhzXG4gICAgICB9XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgcGVyaW9kX3Jlc3VsdCA9IGJpbGxpbmdNYW5hZ2VyLmdldF9hY2NvdW50aW5nX3BlcmlvZChzcGFjZV9pZCwgYWNjb3VudGluZ19tb250aCk7XG4gICAgaWYgKHBlcmlvZF9yZXN1bHRbXCJjb3VudF9kYXlzXCJdID09PSAwKSB7XG4gICAgICBiaWxsaW5nTWFuYWdlci5yZWNhY3VsYXRlQmFsYW5jZShhY2NvdW50aW5nX21vbnRoLCBzcGFjZV9pZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVzZXJfY291bnQgPSBiaWxsaW5nTWFuYWdlci5nZXRTcGFjZVVzZXJDb3VudChzcGFjZV9pZCk7XG4gICAgICBtb2R1bGVzX25hbWUgPSBiaWxsaW5nTWFuYWdlci5nZXRfbW9kdWxlc19uYW1lKCk7XG4gICAgICBhY2NvdW50aW5nX2RhdGUgPSBuZXcgRGF0ZShwYXJzZUludChhY2NvdW50aW5nX21vbnRoLnNsaWNlKDAsIDQpKSwgcGFyc2VJbnQoYWNjb3VudGluZ19tb250aC5zbGljZSg0LCA2KSksIDApO1xuICAgICAgYWNjb3VudGluZ19kYXRlX2Zvcm1hdCA9IG1vbWVudChhY2NvdW50aW5nX2RhdGUpLmZvcm1hdChcIllZWVlNTUREXCIpO1xuICAgICAgZGIuYmlsbGluZ3MucmVtb3ZlKHtcbiAgICAgICAgYmlsbGluZ19kYXRlOiBhY2NvdW50aW5nX2RhdGVfZm9ybWF0LFxuICAgICAgICBzcGFjZTogc3BhY2VfaWQsXG4gICAgICAgIHRyYW5zYWN0aW9uOiB7XG4gICAgICAgICAgJGluOiBtb2R1bGVzX25hbWVcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBiaWxsaW5nTWFuYWdlci5yZWNhY3VsYXRlQmFsYW5jZShhY2NvdW50aW5nX21vbnRoLCBzcGFjZV9pZCk7XG4gICAgICBtb2R1bGVzID0gYmlsbGluZ01hbmFnZXIuZ2V0X21vZHVsZXMoc3BhY2VfaWQsIGFjY291bnRpbmdfbW9udGgpO1xuICAgICAgaWYgKG1vZHVsZXMgJiYgbW9kdWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIF8uZWFjaChtb2R1bGVzLCBmdW5jdGlvbihtKSB7XG4gICAgICAgICAgcmV0dXJuIGJpbGxpbmdNYW5hZ2VyLmdldF9iYWxhbmNlKHNwYWNlX2lkLCBhY2NvdW50aW5nX21vbnRoLCB1c2VyX2NvdW50LCBwZXJpb2RfcmVzdWx0W1wiY291bnRfZGF5c1wiXSwgbS5uYW1lLCBtLmxpc3RwcmljZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBhX20gPSBtb21lbnQobmV3IERhdGUocGFyc2VJbnQoYWNjb3VudGluZ19tb250aC5zbGljZSgwLCA0KSksIHBhcnNlSW50KGFjY291bnRpbmdfbW9udGguc2xpY2UoNCwgNikpLCAxKS5nZXRUaW1lKCkpLmZvcm1hdChcIllZWVlNTVwiKTtcbiAgICByZXR1cm4gYmlsbGluZ01hbmFnZXIuY2FjdWxhdGVfYnlfYWNjb3VudGluZ19tb250aChhX20sIHNwYWNlX2lkKTtcbiAgfVxufTtcblxuYmlsbGluZ01hbmFnZXIuc3BlY2lhbF9wYXkgPSBmdW5jdGlvbihzcGFjZV9pZCwgbW9kdWxlX25hbWVzLCB0b3RhbF9mZWUsIG9wZXJhdG9yX2lkLCBlbmRfZGF0ZSwgdXNlcl9jb3VudCkge1xuICB2YXIgbSwgbW9kdWxlcywgbmV3X21vZHVsZXMsIG5vdywgciwgc3BhY2UsIHNwYWNlX3VwZGF0ZV9vYmo7XG4gIHNwYWNlID0gZGIuc3BhY2VzLmZpbmRPbmUoc3BhY2VfaWQpO1xuICBtb2R1bGVzID0gc3BhY2UubW9kdWxlcyB8fCBuZXcgQXJyYXk7XG4gIG5ld19tb2R1bGVzID0gXy5kaWZmZXJlbmNlKG1vZHVsZV9uYW1lcywgbW9kdWxlcyk7XG4gIG0gPSBtb21lbnQoKTtcbiAgbm93ID0gbS5fZDtcbiAgc3BhY2VfdXBkYXRlX29iaiA9IG5ldyBPYmplY3Q7XG4gIGlmIChzcGFjZS5pc19wYWlkICE9PSB0cnVlKSB7XG4gICAgc3BhY2VfdXBkYXRlX29iai5pc19wYWlkID0gdHJ1ZTtcbiAgICBzcGFjZV91cGRhdGVfb2JqLnN0YXJ0X2RhdGUgPSBuZXcgRGF0ZTtcbiAgfVxuICBzcGFjZV91cGRhdGVfb2JqLm1vZHVsZXMgPSBtb2R1bGVfbmFtZXM7XG4gIHNwYWNlX3VwZGF0ZV9vYmoubW9kaWZpZWQgPSBub3c7XG4gIHNwYWNlX3VwZGF0ZV9vYmoubW9kaWZpZWRfYnkgPSBvcGVyYXRvcl9pZDtcbiAgc3BhY2VfdXBkYXRlX29iai5lbmRfZGF0ZSA9IG5ldyBEYXRlKGVuZF9kYXRlKTtcbiAgc3BhY2VfdXBkYXRlX29iai51c2VyX2xpbWl0ID0gdXNlcl9jb3VudDtcbiAgciA9IGRiLnNwYWNlcy5kaXJlY3QudXBkYXRlKHtcbiAgICBfaWQ6IHNwYWNlX2lkXG4gIH0sIHtcbiAgICAkc2V0OiBzcGFjZV91cGRhdGVfb2JqXG4gIH0pO1xuICBpZiAocikge1xuICAgIF8uZWFjaChuZXdfbW9kdWxlcywgZnVuY3Rpb24obW9kdWxlKSB7XG4gICAgICB2YXIgbWNsO1xuICAgICAgbWNsID0gbmV3IE9iamVjdDtcbiAgICAgIG1jbC5faWQgPSBkYi5tb2R1bGVzX2NoYW5nZWxvZ3MuX21ha2VOZXdJRCgpO1xuICAgICAgbWNsLmNoYW5nZV9kYXRlID0gbS5mb3JtYXQoXCJZWVlZTU1ERFwiKTtcbiAgICAgIG1jbC5vcGVyYXRvciA9IG9wZXJhdG9yX2lkO1xuICAgICAgbWNsLnNwYWNlID0gc3BhY2VfaWQ7XG4gICAgICBtY2wub3BlcmF0aW9uID0gXCJpbnN0YWxsXCI7XG4gICAgICBtY2wubW9kdWxlID0gbW9kdWxlO1xuICAgICAgbWNsLmNyZWF0ZWQgPSBub3c7XG4gICAgICByZXR1cm4gZGIubW9kdWxlc19jaGFuZ2Vsb2dzLmluc2VydChtY2wpO1xuICAgIH0pO1xuICB9XG59O1xuIiwiTWV0ZW9yLnN0YXJ0dXAoZnVuY3Rpb24gKCkge1xuXG4gIGlmIChNZXRlb3Iuc2V0dGluZ3MuY3JvbiAmJiBNZXRlb3Iuc2V0dGluZ3MuY3Jvbi5zdGF0aXN0aWNzKSB7XG5cbiAgICB2YXIgc2NoZWR1bGUgPSByZXF1aXJlKCdub2RlLXNjaGVkdWxlJyk7XG4gICAgLy8g5a6a5pe25omn6KGM57uf6K6hXG4gICAgdmFyIHJ1bGUgPSBNZXRlb3Iuc2V0dGluZ3MuY3Jvbi5zdGF0aXN0aWNzO1xuXG4gICAgdmFyIGdvX25leHQgPSB0cnVlO1xuXG4gICAgc2NoZWR1bGUuc2NoZWR1bGVKb2IocnVsZSwgTWV0ZW9yLmJpbmRFbnZpcm9ubWVudChmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIWdvX25leHQpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGdvX25leHQgPSBmYWxzZTtcblxuICAgICAgY29uc29sZS50aW1lKCdzdGF0aXN0aWNzJyk7XG4gICAgICAvLyDml6XmnJ/moLzlvI/ljJYgXG4gICAgICB2YXIgZGF0ZUZvcm1hdCA9IGZ1bmN0aW9uIChkYXRlKSB7XG4gICAgICAgIHZhciBkYXRla2V5ID0gXCJcIitkYXRlLmdldEZ1bGxZZWFyKCkrXCItXCIrKGRhdGUuZ2V0TW9udGgoKSsxKStcIi1cIisoZGF0ZS5nZXREYXRlKCkpO1xuICAgICAgICByZXR1cm4gZGF0ZWtleTtcbiAgICAgIH07XG4gICAgICAvLyDorqHnrpfliY3kuIDlpKnml7bpl7RcbiAgICAgIHZhciB5ZXN0ZXJEYXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkTm93ID0gbmV3IERhdGUoKTsgICAvL+W9k+WJjeaXtumXtFxuICAgICAgICB2YXIgZEJlZm9yZSA9IG5ldyBEYXRlKGROb3cuZ2V0VGltZSgpIC0gMjQqMzYwMCoxMDAwKTsgICAvL+W+l+WIsOWJjeS4gOWkqeeahOaXtumXtFxuICAgICAgICByZXR1cm4gZEJlZm9yZTtcbiAgICAgIH07XG4gICAgICAvLyDnu5/orqHlvZPml6XmlbDmja5cbiAgICAgIHZhciBkYWlseVN0YXRpY3NDb3VudCA9IGZ1bmN0aW9uIChjb2xsZWN0aW9uLCBzcGFjZSkge1xuICAgICAgICB2YXIgc3RhdGljcyA9IGNvbGxlY3Rpb24uZmluZCh7XCJzcGFjZVwiOnNwYWNlW1wiX2lkXCJdLFwiY3JlYXRlZFwiOnskZ3Q6IHllc3RlckRheSgpfX0pO1xuICAgICAgICByZXR1cm4gc3RhdGljcy5jb3VudCgpO1xuICAgICAgfTtcbiAgICAgIC8vIOafpeivouaAu+aVsFxuICAgICAgdmFyIHN0YXRpY3NDb3VudCA9IGZ1bmN0aW9uIChjb2xsZWN0aW9uLCBzcGFjZSkge1xuICAgICAgICB2YXIgc3RhdGljcyA9IGNvbGxlY3Rpb24uZmluZCh7XCJzcGFjZVwiOiBzcGFjZVtcIl9pZFwiXX0pO1xuICAgICAgICByZXR1cm4gc3RhdGljcy5jb3VudCgpO1xuICAgICAgfTtcbiAgICAgIC8vIOafpeivouaLpeacieiAheWQjeWtl1xuICAgICAgdmFyIG93bmVyTmFtZSA9IGZ1bmN0aW9uIChjb2xsZWN0aW9uLCBzcGFjZSkge1xuICAgICAgICB2YXIgb3duZXIgPSBjb2xsZWN0aW9uLmZpbmRPbmUoe1wiX2lkXCI6IHNwYWNlW1wib3duZXJcIl19KTtcbiAgICAgICAgdmFyIG5hbWUgPSBvd25lci5uYW1lO1xuICAgICAgICByZXR1cm4gbmFtZTtcbiAgICAgIH07XG4gICAgICAvLyDmnIDov5HnmbvlvZXml6XmnJ9cbiAgICAgIHZhciBsYXN0TG9nb24gPSBmdW5jdGlvbiAoY29sbGVjdGlvbiwgc3BhY2UpIHtcbiAgICAgICAgdmFyIGxhc3RMb2dvbiA9IDA7XG4gICAgICAgIHZhciBzVXNlcnMgPSBkYi5zcGFjZV91c2Vycy5maW5kKHtcInNwYWNlXCI6IHNwYWNlW1wiX2lkXCJdfSwge2ZpZWxkczoge3VzZXI6IDF9fSk7IFxuICAgICAgICBzVXNlcnMuZm9yRWFjaChmdW5jdGlvbiAoc1VzZXIpIHtcbiAgICAgICAgICB2YXIgdXNlciA9IGNvbGxlY3Rpb24uZmluZE9uZSh7XCJfaWRcIjpzVXNlcltcInVzZXJcIl19KTtcbiAgICAgICAgICBpZih1c2VyICYmIChsYXN0TG9nb24gPCB1c2VyLmxhc3RfbG9nb24pKXtcbiAgICAgICAgICAgIGxhc3RMb2dvbiA9IHVzZXIubGFzdF9sb2dvbjtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBsYXN0TG9nb247XG4gICAgICB9O1xuICAgICAgLy8g5pyA6L+R5L+u5pS55pel5pyfXG4gICAgICB2YXIgbGFzdE1vZGlmaWVkID0gZnVuY3Rpb24gKGNvbGxlY3Rpb24sIHNwYWNlKSB7XG4gICAgICAgIHZhciBvYmogPSBjb2xsZWN0aW9uLmZpbmQoe1wic3BhY2VcIjogc3BhY2VbXCJfaWRcIl19LCB7c29ydDoge21vZGlmaWVkOiAtMX0sIGxpbWl0OiAxfSk7XG4gICAgICAgIHZhciBvYmpBcnIgPSBvYmouZmV0Y2goKTtcbiAgICAgICAgaWYob2JqQXJyLmxlbmd0aCA+IDApXG4gICAgICAgICAgdmFyIG1vZCA9IG9iakFyclswXS5tb2RpZmllZDtcbiAgICAgICAgICByZXR1cm4gbW9kO1xuICAgICAgfTtcbiAgICAgIC8vIOaWh+eroOmZhOS7tuWkp+Wwj1xuICAgICAgdmFyIHBvc3RzQXR0YWNobWVudHMgPSBmdW5jdGlvbiAoY29sbGVjdGlvbiwgc3BhY2UpIHtcbiAgICAgICAgdmFyIGF0dFNpemUgPSAwO1xuICAgICAgICB2YXIgc2l6ZVN1bSA9IDA7XG4gICAgICAgIHZhciBwb3N0cyA9IGNvbGxlY3Rpb24uZmluZCh7XCJzcGFjZVwiOiBzcGFjZVtcIl9pZFwiXX0pO1xuICAgICAgICBwb3N0cy5mb3JFYWNoKGZ1bmN0aW9uIChwb3N0KSB7XG4gICAgICAgICAgdmFyIGF0dHMgPSBjZnMucG9zdHMuZmluZCh7XCJwb3N0XCI6cG9zdFtcIl9pZFwiXX0pO1xuICAgICAgICAgIGF0dHMuZm9yRWFjaChmdW5jdGlvbiAoYXR0KSB7XG4gICAgICAgICAgICBhdHRTaXplID0gYXR0Lm9yaWdpbmFsLnNpemU7XG4gICAgICAgICAgICBzaXplU3VtICs9IGF0dFNpemU7XG4gICAgICAgICAgfSkgIFxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gc2l6ZVN1bTtcbiAgICAgIH07XG4gICAgICAvLyDlvZPml6XmlrDlop7pmYTku7blpKflsI9cbiAgICAgIHZhciBkYWlseVBvc3RzQXR0YWNobWVudHMgPSBmdW5jdGlvbiAoY29sbGVjdGlvbiwgc3BhY2UpIHtcbiAgICAgICAgdmFyIGF0dFNpemUgPSAwO1xuICAgICAgICB2YXIgc2l6ZVN1bSA9IDA7XG4gICAgICAgIHZhciBwb3N0cyA9IGNvbGxlY3Rpb24uZmluZCh7XCJzcGFjZVwiOiBzcGFjZVtcIl9pZFwiXX0pO1xuICAgICAgICBwb3N0cy5mb3JFYWNoKGZ1bmN0aW9uIChwb3N0KSB7XG4gICAgICAgICAgdmFyIGF0dHMgPSBjZnMucG9zdHMuZmluZCh7XCJwb3N0XCI6IHBvc3RbXCJfaWRcIl0sIFwidXBsb2FkZWRBdFwiOiB7JGd0OiB5ZXN0ZXJEYXkoKX19KTtcbiAgICAgICAgICBhdHRzLmZvckVhY2goZnVuY3Rpb24gKGF0dCkge1xuICAgICAgICAgICAgYXR0U2l6ZSA9IGF0dC5vcmlnaW5hbC5zaXplO1xuICAgICAgICAgICAgc2l6ZVN1bSArPSBhdHRTaXplO1xuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBzaXplU3VtO1xuICAgICAgfTtcbiAgICAgIC8vIOaPkuWFpeaVsOaNrlxuICAgICAgZGIuc3BhY2VzLmZpbmQoe1wiaXNfcGFpZFwiOnRydWV9KS5mb3JFYWNoKGZ1bmN0aW9uIChzcGFjZSkge1xuICAgICAgICBkYi5zdGVlZG9zX3N0YXRpc3RpY3MuaW5zZXJ0KHtcbiAgICAgICAgICBzcGFjZTogc3BhY2VbXCJfaWRcIl0sXG4gICAgICAgICAgc3BhY2VfbmFtZTogc3BhY2VbXCJuYW1lXCJdLFxuICAgICAgICAgIGJhbGFuY2U6IHNwYWNlW1wiYmFsYW5jZVwiXSxcbiAgICAgICAgICBvd25lcl9uYW1lOiBvd25lck5hbWUoZGIudXNlcnMsIHNwYWNlKSxcbiAgICAgICAgICBjcmVhdGVkOiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIHN0ZWVkb3M6e1xuICAgICAgICAgICAgdXNlcnM6IHN0YXRpY3NDb3VudChkYi5zcGFjZV91c2Vycywgc3BhY2UpLFxuICAgICAgICAgICAgb3JnYW5pemF0aW9uczogc3RhdGljc0NvdW50KGRiLm9yZ2FuaXphdGlvbnMsIHNwYWNlKSxcbiAgICAgICAgICAgIGxhc3RfbG9nb246IGxhc3RMb2dvbihkYi51c2Vycywgc3BhY2UpXG4gICAgICAgICAgfSxcbiAgICAgICAgICB3b3JrZmxvdzp7XG4gICAgICAgICAgICBmbG93czogc3RhdGljc0NvdW50KGRiLmZsb3dzLCBzcGFjZSksXG4gICAgICAgICAgICBmb3Jtczogc3RhdGljc0NvdW50KGRiLmZvcm1zLCBzcGFjZSksXG4gICAgICAgICAgICBmbG93X3JvbGVzOiBzdGF0aWNzQ291bnQoZGIuZmxvd19yb2xlcywgc3BhY2UpLFxuICAgICAgICAgICAgZmxvd19wb3NpdGlvbnM6IHN0YXRpY3NDb3VudChkYi5mbG93X3Bvc2l0aW9ucywgc3BhY2UpLFxuICAgICAgICAgICAgaW5zdGFuY2VzOiBzdGF0aWNzQ291bnQoZGIuaW5zdGFuY2VzLCBzcGFjZSksXG4gICAgICAgICAgICBpbnN0YW5jZXNfbGFzdF9tb2RpZmllZDogbGFzdE1vZGlmaWVkKGRiLmluc3RhbmNlcywgc3BhY2UpLFxuICAgICAgICAgICAgZGFpbHlfZmxvd3M6IGRhaWx5U3RhdGljc0NvdW50KGRiLmZsb3dzLCBzcGFjZSksXG4gICAgICAgICAgICBkYWlseV9mb3JtczogZGFpbHlTdGF0aWNzQ291bnQoZGIuZm9ybXMsIHNwYWNlKSxcbiAgICAgICAgICAgIGRhaWx5X2luc3RhbmNlczogZGFpbHlTdGF0aWNzQ291bnQoZGIuaW5zdGFuY2VzLCBzcGFjZSlcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNtczoge1xuICAgICAgICAgICAgc2l0ZXM6IHN0YXRpY3NDb3VudChkYi5jbXNfc2l0ZXMsIHNwYWNlKSxcbiAgICAgICAgICAgIHBvc3RzOiBzdGF0aWNzQ291bnQoZGIuY21zX3Bvc3RzLCBzcGFjZSksXG4gICAgICAgICAgICBwb3N0c19sYXN0X21vZGlmaWVkOiBsYXN0TW9kaWZpZWQoZGIuY21zX3Bvc3RzLCBzcGFjZSksXG4gICAgICAgICAgICBwb3N0c19hdHRhY2htZW50c19zaXplOiBwb3N0c0F0dGFjaG1lbnRzKGRiLmNtc19wb3N0cywgc3BhY2UpLFxuICAgICAgICAgICAgY29tbWVudHM6IHN0YXRpY3NDb3VudChkYi5jbXNfY29tbWVudHMsIHNwYWNlKSxcbiAgICAgICAgICAgIGRhaWx5X3NpdGVzOiBkYWlseVN0YXRpY3NDb3VudChkYi5jbXNfc2l0ZXMsIHNwYWNlKSxcbiAgICAgICAgICAgIGRhaWx5X3Bvc3RzOiBkYWlseVN0YXRpY3NDb3VudChkYi5jbXNfcG9zdHMsIHNwYWNlKSxcbiAgICAgICAgICAgIGRhaWx5X2NvbW1lbnRzOiBkYWlseVN0YXRpY3NDb3VudChkYi5jbXNfY29tbWVudHMsIHNwYWNlKSxcbiAgICAgICAgICAgIGRhaWx5X3Bvc3RzX2F0dGFjaG1lbnRzX3NpemU6IGRhaWx5UG9zdHNBdHRhY2htZW50cyhkYi5jbXNfcG9zdHMsIHNwYWNlKVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgY29uc29sZS50aW1lRW5kKCdzdGF0aXN0aWNzJyk7XG5cbiAgICAgIGdvX25leHQgPSB0cnVlO1xuXG4gICAgfSwgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdGYWlsZWQgdG8gYmluZCBlbnZpcm9ubWVudDogc3RhdGlzdGljcy5qcycpO1xuICAgICAgY29uc29sZS5sb2coZS5zdGFjayk7XG4gICAgfSkpO1xuXG4gIH1cblxufSlcblxuXG5cblxuIiwiTWV0ZW9yLnN0YXJ0dXAgLT5cbiAgICBNaWdyYXRpb25zLmFkZFxuICAgICAgICB2ZXJzaW9uOiAxXG4gICAgICAgIG5hbWU6ICflnKjnur/nvJbovpHml7bvvIzpnIDnu5nmlofku7blop7liqBsb2NrIOWxnuaAp++8jOmYsuatouWkmuS6uuWQjOaXtue8lui+kSAjNDI5LCDpmYTku7bpobXpnaLkvb/nlKhjZnPmmL7npLonXG4gICAgICAgIHVwOiAtPlxuICAgICAgICAgICAgY29uc29sZS50aW1lKCd1cGdyYWRlX2Nmc19pbnN0YW5jZScpXG4gICAgICAgICAgICB0cnlcbiAgICAgICAgICAgICAgICB1cGRhdGVfY2ZzX2luc3RhbmNlID0gKHBhcmVudF9pZCwgc3BhY2VfaWQsIGluc3RhbmNlX2lkLCBhdHRhY2hfdmVyc2lvbiwgaXNDdXJyZW50KS0+XG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhID0ge3BhcmVudDogcGFyZW50X2lkLCBvd25lcjogYXR0YWNoX3ZlcnNpb25bJ2NyZWF0ZWRfYnknXSwgb3duZXJfbmFtZTogYXR0YWNoX3ZlcnNpb25bJ2NyZWF0ZWRfYnlfbmFtZSddLCBzcGFjZTogc3BhY2VfaWQsIGluc3RhbmNlOiBpbnN0YW5jZV9pZCwgYXBwcm92ZTogYXR0YWNoX3ZlcnNpb25bJ2FwcHJvdmUnXX1cbiAgICAgICAgICAgICAgICAgICAgaWYgaXNDdXJyZW50XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5jdXJyZW50ID0gdHJ1ZVxuXG4gICAgICAgICAgICAgICAgICAgIGNmcy5pbnN0YW5jZXMudXBkYXRlKHtfaWQ6IGF0dGFjaF92ZXJzaW9uWydfcmV2J119LCB7JHNldDoge21ldGFkYXRhOiBtZXRhZGF0YX19KVxuICAgICAgICAgICAgICAgIGkgPSAwXG4gICAgICAgICAgICAgICAgZGIuaW5zdGFuY2VzLmZpbmQoe1wiYXR0YWNobWVudHMuY3VycmVudFwiOiB7JGV4aXN0czogdHJ1ZX19LCB7c29ydDoge21vZGlmaWVkOiAtMX0sIGZpZWxkczoge3NwYWNlOiAxLCBhdHRhY2htZW50czogMX19KS5mb3JFYWNoIChpbnMpIC0+XG4gICAgICAgICAgICAgICAgICAgIGF0dGFjaHMgPSBpbnMuYXR0YWNobWVudHNcbiAgICAgICAgICAgICAgICAgICAgc3BhY2VfaWQgPSBpbnMuc3BhY2VcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VfaWQgPSBpbnMuX2lkXG4gICAgICAgICAgICAgICAgICAgIGF0dGFjaHMuZm9yRWFjaCAoYXR0KS0+XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X3ZlciA9IGF0dC5jdXJyZW50XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRfaWQgPSBjdXJyZW50X3Zlci5fcmV2XG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVfY2ZzX2luc3RhbmNlKHBhcmVudF9pZCwgc3BhY2VfaWQsIGluc3RhbmNlX2lkLCBjdXJyZW50X3ZlciwgdHJ1ZSlcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgYXR0Lmhpc3RvcnlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0Lmhpc3RvcnlzLmZvckVhY2ggKGhpcykgLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlX2Nmc19pbnN0YW5jZShwYXJlbnRfaWQsIHNwYWNlX2lkLCBpbnN0YW5jZV9pZCwgaGlzLCBmYWxzZSlcblxuICAgICAgICAgICAgICAgICAgICBpKytcblxuICAgICAgICAgICAgY2F0Y2ggZVxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSlcblxuICAgICAgICAgICAgY29uc29sZS50aW1lRW5kKCd1cGdyYWRlX2Nmc19pbnN0YW5jZScpXG4gICAgICAgIGRvd246IC0+XG4gICAgICAgICAgICBjb25zb2xlLmxvZygndmVyc2lvbiAxIGRvd24nKSIsIk1ldGVvci5zdGFydHVwKGZ1bmN0aW9uKCkge1xuICByZXR1cm4gTWlncmF0aW9ucy5hZGQoe1xuICAgIHZlcnNpb246IDEsXG4gICAgbmFtZTogJ+WcqOe6v+e8lui+keaXtu+8jOmcgOe7meaWh+S7tuWinuWKoGxvY2sg5bGe5oCn77yM6Ziy5q2i5aSa5Lq65ZCM5pe257yW6L6RICM0MjksIOmZhOS7tumhtemdouS9v+eUqGNmc+aYvuekuicsXG4gICAgdXA6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGUsIGksIHVwZGF0ZV9jZnNfaW5zdGFuY2U7XG4gICAgICBjb25zb2xlLnRpbWUoJ3VwZ3JhZGVfY2ZzX2luc3RhbmNlJyk7XG4gICAgICB0cnkge1xuICAgICAgICB1cGRhdGVfY2ZzX2luc3RhbmNlID0gZnVuY3Rpb24ocGFyZW50X2lkLCBzcGFjZV9pZCwgaW5zdGFuY2VfaWQsIGF0dGFjaF92ZXJzaW9uLCBpc0N1cnJlbnQpIHtcbiAgICAgICAgICB2YXIgbWV0YWRhdGE7XG4gICAgICAgICAgbWV0YWRhdGEgPSB7XG4gICAgICAgICAgICBwYXJlbnQ6IHBhcmVudF9pZCxcbiAgICAgICAgICAgIG93bmVyOiBhdHRhY2hfdmVyc2lvblsnY3JlYXRlZF9ieSddLFxuICAgICAgICAgICAgb3duZXJfbmFtZTogYXR0YWNoX3ZlcnNpb25bJ2NyZWF0ZWRfYnlfbmFtZSddLFxuICAgICAgICAgICAgc3BhY2U6IHNwYWNlX2lkLFxuICAgICAgICAgICAgaW5zdGFuY2U6IGluc3RhbmNlX2lkLFxuICAgICAgICAgICAgYXBwcm92ZTogYXR0YWNoX3ZlcnNpb25bJ2FwcHJvdmUnXVxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKGlzQ3VycmVudCkge1xuICAgICAgICAgICAgbWV0YWRhdGEuY3VycmVudCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBjZnMuaW5zdGFuY2VzLnVwZGF0ZSh7XG4gICAgICAgICAgICBfaWQ6IGF0dGFjaF92ZXJzaW9uWydfcmV2J11cbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAkc2V0OiB7XG4gICAgICAgICAgICAgIG1ldGFkYXRhOiBtZXRhZGF0YVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICBpID0gMDtcbiAgICAgICAgZGIuaW5zdGFuY2VzLmZpbmQoe1xuICAgICAgICAgIFwiYXR0YWNobWVudHMuY3VycmVudFwiOiB7XG4gICAgICAgICAgICAkZXhpc3RzOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9LCB7XG4gICAgICAgICAgc29ydDoge1xuICAgICAgICAgICAgbW9kaWZpZWQ6IC0xXG4gICAgICAgICAgfSxcbiAgICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICAgIHNwYWNlOiAxLFxuICAgICAgICAgICAgYXR0YWNobWVudHM6IDFcbiAgICAgICAgICB9XG4gICAgICAgIH0pLmZvckVhY2goZnVuY3Rpb24oaW5zKSB7XG4gICAgICAgICAgdmFyIGF0dGFjaHMsIGluc3RhbmNlX2lkLCBzcGFjZV9pZDtcbiAgICAgICAgICBhdHRhY2hzID0gaW5zLmF0dGFjaG1lbnRzO1xuICAgICAgICAgIHNwYWNlX2lkID0gaW5zLnNwYWNlO1xuICAgICAgICAgIGluc3RhbmNlX2lkID0gaW5zLl9pZDtcbiAgICAgICAgICBhdHRhY2hzLmZvckVhY2goZnVuY3Rpb24oYXR0KSB7XG4gICAgICAgICAgICB2YXIgY3VycmVudF92ZXIsIHBhcmVudF9pZDtcbiAgICAgICAgICAgIGN1cnJlbnRfdmVyID0gYXR0LmN1cnJlbnQ7XG4gICAgICAgICAgICBwYXJlbnRfaWQgPSBjdXJyZW50X3Zlci5fcmV2O1xuICAgICAgICAgICAgdXBkYXRlX2Nmc19pbnN0YW5jZShwYXJlbnRfaWQsIHNwYWNlX2lkLCBpbnN0YW5jZV9pZCwgY3VycmVudF92ZXIsIHRydWUpO1xuICAgICAgICAgICAgaWYgKGF0dC5oaXN0b3J5cykge1xuICAgICAgICAgICAgICByZXR1cm4gYXR0Lmhpc3RvcnlzLmZvckVhY2goZnVuY3Rpb24oaGlzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZV9jZnNfaW5zdGFuY2UocGFyZW50X2lkLCBzcGFjZV9pZCwgaW5zdGFuY2VfaWQsIGhpcywgZmFsc2UpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gaSsrO1xuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGUgPSBlcnJvcjtcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb25zb2xlLnRpbWVFbmQoJ3VwZ3JhZGVfY2ZzX2luc3RhbmNlJyk7XG4gICAgfSxcbiAgICBkb3duOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBjb25zb2xlLmxvZygndmVyc2lvbiAxIGRvd24nKTtcbiAgICB9XG4gIH0pO1xufSk7XG4iLCJNZXRlb3Iuc3RhcnR1cCAtPlxuICAgIE1pZ3JhdGlvbnMuYWRkXG4gICAgICAgIHZlcnNpb246IDJcbiAgICAgICAgbmFtZTogJ+e7hOe7h+e7k+aehOWFgeiuuOS4gOS4quS6uuWxnuS6juWkmuS4qumDqOmXqCAjMzc5J1xuICAgICAgICB1cDogLT5cbiAgICAgICAgICAgIGNvbnNvbGUubG9nICd2ZXJzaW9uIDIgdXAnXG4gICAgICAgICAgICBjb25zb2xlLnRpbWUgJ3VwZ3JhZGVfc3BhY2VfdXNlcidcbiAgICAgICAgICAgIHRyeVxuICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24gPSBkYi5zcGFjZV91c2Vyc1xuICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24uZmluZCh7b3JnYW5pemF0aW9uczogeyRleGlzdHM6IGZhbHNlfX0sIHtmaWVsZHM6IHtvcmdhbml6YXRpb246IDF9fSkuZm9yRWFjaCAoc3UpLT5cbiAgICAgICAgICAgICAgICAgICAgaWYgc3Uub3JnYW5pemF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLmRpcmVjdC51cGRhdGUoc3UuX2lkLCB7JHNldDoge29yZ2FuaXphdGlvbnM6IFtzdS5vcmdhbml6YXRpb25dfX0pXG5cbiAgICAgICAgICAgIGNhdGNoIGVcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yIGVcblxuICAgICAgICAgICAgY29uc29sZS50aW1lRW5kICd1cGdyYWRlX3NwYWNlX3VzZXInXG4gICAgICAgIGRvd246IC0+XG4gICAgICAgICAgICBjb25zb2xlLmxvZyAndmVyc2lvbiAyIGRvd24nXG4iLCJNZXRlb3Iuc3RhcnR1cChmdW5jdGlvbigpIHtcbiAgcmV0dXJuIE1pZ3JhdGlvbnMuYWRkKHtcbiAgICB2ZXJzaW9uOiAyLFxuICAgIG5hbWU6ICfnu4Tnu4fnu5PmnoTlhYHorrjkuIDkuKrkurrlsZ7kuo7lpJrkuKrpg6jpl6ggIzM3OScsXG4gICAgdXA6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGNvbGxlY3Rpb24sIGU7XG4gICAgICBjb25zb2xlLmxvZygndmVyc2lvbiAyIHVwJyk7XG4gICAgICBjb25zb2xlLnRpbWUoJ3VwZ3JhZGVfc3BhY2VfdXNlcicpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29sbGVjdGlvbiA9IGRiLnNwYWNlX3VzZXJzO1xuICAgICAgICBjb2xsZWN0aW9uLmZpbmQoe1xuICAgICAgICAgIG9yZ2FuaXphdGlvbnM6IHtcbiAgICAgICAgICAgICRleGlzdHM6IGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICB9LCB7XG4gICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICBvcmdhbml6YXRpb246IDFcbiAgICAgICAgICB9XG4gICAgICAgIH0pLmZvckVhY2goZnVuY3Rpb24oc3UpIHtcbiAgICAgICAgICBpZiAoc3Uub3JnYW5pemF0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gY29sbGVjdGlvbi5kaXJlY3QudXBkYXRlKHN1Ll9pZCwge1xuICAgICAgICAgICAgICAkc2V0OiB7XG4gICAgICAgICAgICAgICAgb3JnYW5pemF0aW9uczogW3N1Lm9yZ2FuaXphdGlvbl1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGUgPSBlcnJvcjtcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb25zb2xlLnRpbWVFbmQoJ3VwZ3JhZGVfc3BhY2VfdXNlcicpO1xuICAgIH0sXG4gICAgZG93bjogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gY29uc29sZS5sb2coJ3ZlcnNpb24gMiBkb3duJyk7XG4gICAgfVxuICB9KTtcbn0pO1xuIiwiTWV0ZW9yLnN0YXJ0dXAgLT5cbiAgICBNaWdyYXRpb25zLmFkZFxuICAgICAgICB2ZXJzaW9uOiAzXG4gICAgICAgIG5hbWU6ICfnu5lzcGFjZV91c2Vyc+ihqGVtYWls5a2X5q616LWL5YC8J1xuICAgICAgICB1cDogLT5cbiAgICAgICAgICAgIGNvbnNvbGUubG9nICd2ZXJzaW9uIDMgdXAnXG4gICAgICAgICAgICBjb25zb2xlLnRpbWUgJ3VwZ3JhZGVfc3BhY2VfdXNlcl9lbWFpbCdcbiAgICAgICAgICAgIHRyeVxuICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24gPSBkYi5zcGFjZV91c2Vyc1xuICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24uZmluZCh7ZW1haWw6IHskZXhpc3RzOiBmYWxzZX19LCB7ZmllbGRzOiB7dXNlcjogMX19KS5mb3JFYWNoIChzdSktPlxuICAgICAgICAgICAgICAgICAgICBpZiBzdS51c2VyXG4gICAgICAgICAgICAgICAgICAgICAgICB1ID0gZGIudXNlcnMuZmluZE9uZSh7X2lkOiBzdS51c2VyfSwge2ZpZWxkczoge2VtYWlsczogMX19KVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgdSAmJiB1LmVtYWlscyAmJiB1LmVtYWlscy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgL14oW0EtWjAtOVxcLlxcLVxcX1xcK10pKihbQS1aMC05XFwrXFwtXFxfXSkrXFxAW0EtWjAtOV0rKFtcXC1dW0EtWjAtOV0rKSooW1xcLl1bQS1aMC05XFwtXSspezEsOH0kL2kudGVzdCh1LmVtYWlsc1swXS5hZGRyZXNzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzID0gdS5lbWFpbHNbMF0uYWRkcmVzc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLmRpcmVjdC51cGRhdGUoc3UuX2lkLCB7JHNldDoge2VtYWlsOiBhZGRyZXNzfX0pXG4gICAgICAgICAgICAgICAgICAgICAgICBcblxuICAgICAgICAgICAgY2F0Y2ggZVxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IgZVxuXG4gICAgICAgICAgICBjb25zb2xlLnRpbWVFbmQgJ3VwZ3JhZGVfc3BhY2VfdXNlcl9lbWFpbCdcbiAgICAgICAgZG93bjogLT5cbiAgICAgICAgICAgIGNvbnNvbGUubG9nICd2ZXJzaW9uIDMgZG93bidcbiIsIk1ldGVvci5zdGFydHVwKGZ1bmN0aW9uKCkge1xuICByZXR1cm4gTWlncmF0aW9ucy5hZGQoe1xuICAgIHZlcnNpb246IDMsXG4gICAgbmFtZTogJ+e7mXNwYWNlX3VzZXJz6KGoZW1haWzlrZfmrrXotYvlgLwnLFxuICAgIHVwOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBjb2xsZWN0aW9uLCBlO1xuICAgICAgY29uc29sZS5sb2coJ3ZlcnNpb24gMyB1cCcpO1xuICAgICAgY29uc29sZS50aW1lKCd1cGdyYWRlX3NwYWNlX3VzZXJfZW1haWwnKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbGxlY3Rpb24gPSBkYi5zcGFjZV91c2VycztcbiAgICAgICAgY29sbGVjdGlvbi5maW5kKHtcbiAgICAgICAgICBlbWFpbDoge1xuICAgICAgICAgICAgJGV4aXN0czogZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH0sIHtcbiAgICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICAgIHVzZXI6IDFcbiAgICAgICAgICB9XG4gICAgICAgIH0pLmZvckVhY2goZnVuY3Rpb24oc3UpIHtcbiAgICAgICAgICB2YXIgYWRkcmVzcywgdTtcbiAgICAgICAgICBpZiAoc3UudXNlcikge1xuICAgICAgICAgICAgdSA9IGRiLnVzZXJzLmZpbmRPbmUoe1xuICAgICAgICAgICAgICBfaWQ6IHN1LnVzZXJcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICAgICAgZW1haWxzOiAxXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHUgJiYgdS5lbWFpbHMgJiYgdS5lbWFpbHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBpZiAoL14oW0EtWjAtOVxcLlxcLVxcX1xcK10pKihbQS1aMC05XFwrXFwtXFxfXSkrXFxAW0EtWjAtOV0rKFtcXC1dW0EtWjAtOV0rKSooW1xcLl1bQS1aMC05XFwtXSspezEsOH0kL2kudGVzdCh1LmVtYWlsc1swXS5hZGRyZXNzKSkge1xuICAgICAgICAgICAgICAgIGFkZHJlc3MgPSB1LmVtYWlsc1swXS5hZGRyZXNzO1xuICAgICAgICAgICAgICAgIHJldHVybiBjb2xsZWN0aW9uLmRpcmVjdC51cGRhdGUoc3UuX2lkLCB7XG4gICAgICAgICAgICAgICAgICAkc2V0OiB7XG4gICAgICAgICAgICAgICAgICAgIGVtYWlsOiBhZGRyZXNzXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgZSA9IGVycm9yO1xuICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbnNvbGUudGltZUVuZCgndXBncmFkZV9zcGFjZV91c2VyX2VtYWlsJyk7XG4gICAgfSxcbiAgICBkb3duOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBjb25zb2xlLmxvZygndmVyc2lvbiAzIGRvd24nKTtcbiAgICB9XG4gIH0pO1xufSk7XG4iLCJNZXRlb3Iuc3RhcnR1cCAtPlxuICAgIE1pZ3JhdGlvbnMuYWRkXG4gICAgICAgIHZlcnNpb246IDRcbiAgICAgICAgbmFtZTogJ+e7mW9yZ2FuaXphdGlvbnPooajorr7nva5zb3J0X25vJ1xuICAgICAgICB1cDogLT5cbiAgICAgICAgICAgIGNvbnNvbGUubG9nICd2ZXJzaW9uIDQgdXAnXG4gICAgICAgICAgICBjb25zb2xlLnRpbWUgJ3VwZ3JhZGVfb3JnYW5pemF0aW9uc19zb3J0X25vJ1xuICAgICAgICAgICAgdHJ5XG4gICAgICAgICAgICAgICAgZGIub3JnYW5pemF0aW9ucy5kaXJlY3QudXBkYXRlKHtzb3J0X25vOiB7JGV4aXN0czogZmFsc2V9fSwgeyRzZXQ6IHtzb3J0X25vOiAxMDB9fSwge211bHRpOiB0cnVlfSlcbiAgICAgICAgICAgIGNhdGNoIGVcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yIGVcblxuICAgICAgICAgICAgY29uc29sZS50aW1lRW5kICd1cGdyYWRlX29yZ2FuaXphdGlvbnNfc29ydF9ubydcbiAgICAgICAgZG93bjogLT5cbiAgICAgICAgICAgIGNvbnNvbGUubG9nICd2ZXJzaW9uIDQgZG93bidcbiIsIk1ldGVvci5zdGFydHVwKGZ1bmN0aW9uKCkge1xuICByZXR1cm4gTWlncmF0aW9ucy5hZGQoe1xuICAgIHZlcnNpb246IDQsXG4gICAgbmFtZTogJ+e7mW9yZ2FuaXphdGlvbnPooajorr7nva5zb3J0X25vJyxcbiAgICB1cDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZTtcbiAgICAgIGNvbnNvbGUubG9nKCd2ZXJzaW9uIDQgdXAnKTtcbiAgICAgIGNvbnNvbGUudGltZSgndXBncmFkZV9vcmdhbml6YXRpb25zX3NvcnRfbm8nKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGRiLm9yZ2FuaXphdGlvbnMuZGlyZWN0LnVwZGF0ZSh7XG4gICAgICAgICAgc29ydF9ubzoge1xuICAgICAgICAgICAgJGV4aXN0czogZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAkc2V0OiB7XG4gICAgICAgICAgICBzb3J0X25vOiAxMDBcbiAgICAgICAgICB9XG4gICAgICAgIH0sIHtcbiAgICAgICAgICBtdWx0aTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGUgPSBlcnJvcjtcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb25zb2xlLnRpbWVFbmQoJ3VwZ3JhZGVfb3JnYW5pemF0aW9uc19zb3J0X25vJyk7XG4gICAgfSxcbiAgICBkb3duOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBjb25zb2xlLmxvZygndmVyc2lvbiA0IGRvd24nKTtcbiAgICB9XG4gIH0pO1xufSk7XG4iLCJNZXRlb3Iuc3RhcnR1cCAtPlxuXHRNaWdyYXRpb25zLmFkZFxuXHRcdHZlcnNpb246IDVcblx0XHRuYW1lOiAn6Kej5Yaz5Yig6Zmkb3JnYW5pemF0aW9u5a+86Ie0c3BhY2VfdXNlcuaVsOaNrumUmeivr+eahOmXrumimCdcblx0XHR1cDogLT5cblx0XHRcdGNvbnNvbGUubG9nICd2ZXJzaW9uIDUgdXAnXG5cdFx0XHRjb25zb2xlLnRpbWUgJ2ZpeF9zcGFjZV91c2VyX29yZ2FuaXphdGlvbnMnXG5cdFx0XHR0cnlcblxuXHRcdFx0XHRkYi5zcGFjZV91c2Vycy5maW5kKCkuZm9yRWFjaCAoc3UpLT5cblx0XHRcdFx0XHRpZiBub3Qgc3Uub3JnYW5pemF0aW9uc1xuXHRcdFx0XHRcdFx0cmV0dXJuXG5cdFx0XHRcdFx0aWYgc3Uub3JnYW5pemF0aW9ucy5sZW5ndGggaXMgMVxuXHRcdFx0XHRcdFx0Y2hlY2tfY291bnQgPSBkYi5vcmdhbml6YXRpb25zLmZpbmQoc3Uub3JnYW5pemF0aW9uc1swXSkuY291bnQoKVxuXHRcdFx0XHRcdFx0aWYgY2hlY2tfY291bnQgaXMgMFxuXHRcdFx0XHRcdFx0XHRyb290X29yZyA9IGRiLm9yZ2FuaXphdGlvbnMuZmluZE9uZSh7c3BhY2U6IHN1LnNwYWNlLCBwYXJlbnQ6IG51bGx9KVxuXHRcdFx0XHRcdFx0XHRpZiByb290X29yZ1xuXHRcdFx0XHRcdFx0XHRcdHIgPSBkYi5zcGFjZV91c2Vycy5kaXJlY3QudXBkYXRlKHtfaWQ6IHN1Ll9pZH0sIHskc2V0OiB7b3JnYW5pemF0aW9uczogW3Jvb3Rfb3JnLl9pZF0sIG9yZ2FuaXphdGlvbjogcm9vdF9vcmcuX2lkfX0pXG5cdFx0XHRcdFx0XHRcdFx0aWYgclxuXHRcdFx0XHRcdFx0XHRcdFx0cm9vdF9vcmcudXBkYXRlVXNlcnMoKVxuXHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciBcImZpeF9zcGFjZV91c2VyX29yZ2FuaXphdGlvbnNcIlxuXHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3Igc3UuX2lkXG5cdFx0XHRcdFx0ZWxzZSBpZiBzdS5vcmdhbml6YXRpb25zLmxlbmd0aCA+IDFcblx0XHRcdFx0XHRcdHJlbW92ZWRfb3JnX2lkcyA9IFtdXG5cdFx0XHRcdFx0XHRzdS5vcmdhbml6YXRpb25zLmZvckVhY2ggKG8pLT5cblx0XHRcdFx0XHRcdFx0Y2hlY2tfY291bnQgPSBkYi5vcmdhbml6YXRpb25zLmZpbmQobykuY291bnQoKVxuXHRcdFx0XHRcdFx0XHRpZiBjaGVja19jb3VudCBpcyAwXG5cdFx0XHRcdFx0XHRcdFx0cmVtb3ZlZF9vcmdfaWRzLnB1c2gobylcblx0XHRcdFx0XHRcdGlmIHJlbW92ZWRfb3JnX2lkcy5sZW5ndGggPiAwXG5cdFx0XHRcdFx0XHRcdG5ld19vcmdfaWRzID0gXy5kaWZmZXJlbmNlKHN1Lm9yZ2FuaXphdGlvbnMsIHJlbW92ZWRfb3JnX2lkcylcblx0XHRcdFx0XHRcdFx0aWYgbmV3X29yZ19pZHMuaW5jbHVkZXMoc3Uub3JnYW5pemF0aW9uKVxuXHRcdFx0XHRcdFx0XHRcdGRiLnNwYWNlX3VzZXJzLmRpcmVjdC51cGRhdGUoe19pZDogc3UuX2lkfSwgeyRzZXQ6IHtvcmdhbml6YXRpb25zOiBuZXdfb3JnX2lkc319KVxuXHRcdFx0XHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0XHRcdFx0ZGIuc3BhY2VfdXNlcnMuZGlyZWN0LnVwZGF0ZSh7X2lkOiBzdS5faWR9LCB7JHNldDoge29yZ2FuaXphdGlvbnM6IG5ld19vcmdfaWRzLCBvcmdhbml6YXRpb246IG5ld19vcmdfaWRzWzBdfX0pXG5cblx0XHRcdGNhdGNoIGVcblx0XHRcdFx0Y29uc29sZS5lcnJvciBcImZpeF9zcGFjZV91c2VyX29yZ2FuaXphdGlvbnNcIlxuXHRcdFx0XHRjb25zb2xlLmVycm9yIGUuc3RhY2tcblxuXHRcdFx0Y29uc29sZS50aW1lRW5kICdmaXhfc3BhY2VfdXNlcl9vcmdhbml6YXRpb25zJ1xuXHRcdGRvd246IC0+XG5cdFx0XHRjb25zb2xlLmxvZyAndmVyc2lvbiA1IGRvd24nXG4iLCJNZXRlb3Iuc3RhcnR1cChmdW5jdGlvbigpIHtcbiAgcmV0dXJuIE1pZ3JhdGlvbnMuYWRkKHtcbiAgICB2ZXJzaW9uOiA1LFxuICAgIG5hbWU6ICfop6PlhrPliKDpmaRvcmdhbml6YXRpb27lr7zoh7RzcGFjZV91c2Vy5pWw5o2u6ZSZ6K+v55qE6Zeu6aKYJyxcbiAgICB1cDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZTtcbiAgICAgIGNvbnNvbGUubG9nKCd2ZXJzaW9uIDUgdXAnKTtcbiAgICAgIGNvbnNvbGUudGltZSgnZml4X3NwYWNlX3VzZXJfb3JnYW5pemF0aW9ucycpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZGIuc3BhY2VfdXNlcnMuZmluZCgpLmZvckVhY2goZnVuY3Rpb24oc3UpIHtcbiAgICAgICAgICB2YXIgY2hlY2tfY291bnQsIG5ld19vcmdfaWRzLCByLCByZW1vdmVkX29yZ19pZHMsIHJvb3Rfb3JnO1xuICAgICAgICAgIGlmICghc3Uub3JnYW5pemF0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3Uub3JnYW5pemF0aW9ucy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGNoZWNrX2NvdW50ID0gZGIub3JnYW5pemF0aW9ucy5maW5kKHN1Lm9yZ2FuaXphdGlvbnNbMF0pLmNvdW50KCk7XG4gICAgICAgICAgICBpZiAoY2hlY2tfY291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgcm9vdF9vcmcgPSBkYi5vcmdhbml6YXRpb25zLmZpbmRPbmUoe1xuICAgICAgICAgICAgICAgIHNwYWNlOiBzdS5zcGFjZSxcbiAgICAgICAgICAgICAgICBwYXJlbnQ6IG51bGxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGlmIChyb290X29yZykge1xuICAgICAgICAgICAgICAgIHIgPSBkYi5zcGFjZV91c2Vycy5kaXJlY3QudXBkYXRlKHtcbiAgICAgICAgICAgICAgICAgIF9pZDogc3UuX2lkXG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgJHNldDoge1xuICAgICAgICAgICAgICAgICAgICBvcmdhbml6YXRpb25zOiBbcm9vdF9vcmcuX2lkXSxcbiAgICAgICAgICAgICAgICAgICAgb3JnYW5pemF0aW9uOiByb290X29yZy5faWRcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAocikge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvb3Rfb3JnLnVwZGF0ZVVzZXJzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJmaXhfc3BhY2VfdXNlcl9vcmdhbml6YXRpb25zXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBjb25zb2xlLmVycm9yKHN1Ll9pZCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHN1Lm9yZ2FuaXphdGlvbnMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgcmVtb3ZlZF9vcmdfaWRzID0gW107XG4gICAgICAgICAgICBzdS5vcmdhbml6YXRpb25zLmZvckVhY2goZnVuY3Rpb24obykge1xuICAgICAgICAgICAgICBjaGVja19jb3VudCA9IGRiLm9yZ2FuaXphdGlvbnMuZmluZChvKS5jb3VudCgpO1xuICAgICAgICAgICAgICBpZiAoY2hlY2tfY291bnQgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVtb3ZlZF9vcmdfaWRzLnB1c2gobyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHJlbW92ZWRfb3JnX2lkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIG5ld19vcmdfaWRzID0gXy5kaWZmZXJlbmNlKHN1Lm9yZ2FuaXphdGlvbnMsIHJlbW92ZWRfb3JnX2lkcyk7XG4gICAgICAgICAgICAgIGlmIChuZXdfb3JnX2lkcy5pbmNsdWRlcyhzdS5vcmdhbml6YXRpb24pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRiLnNwYWNlX3VzZXJzLmRpcmVjdC51cGRhdGUoe1xuICAgICAgICAgICAgICAgICAgX2lkOiBzdS5faWRcbiAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAkc2V0OiB7XG4gICAgICAgICAgICAgICAgICAgIG9yZ2FuaXphdGlvbnM6IG5ld19vcmdfaWRzXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRiLnNwYWNlX3VzZXJzLmRpcmVjdC51cGRhdGUoe1xuICAgICAgICAgICAgICAgICAgX2lkOiBzdS5faWRcbiAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAkc2V0OiB7XG4gICAgICAgICAgICAgICAgICAgIG9yZ2FuaXphdGlvbnM6IG5ld19vcmdfaWRzLFxuICAgICAgICAgICAgICAgICAgICBvcmdhbml6YXRpb246IG5ld19vcmdfaWRzWzBdXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgZSA9IGVycm9yO1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiZml4X3NwYWNlX3VzZXJfb3JnYW5pemF0aW9uc1wiKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihlLnN0YWNrKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb25zb2xlLnRpbWVFbmQoJ2ZpeF9zcGFjZV91c2VyX29yZ2FuaXphdGlvbnMnKTtcbiAgICB9LFxuICAgIGRvd246IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGNvbnNvbGUubG9nKCd2ZXJzaW9uIDUgZG93bicpO1xuICAgIH1cbiAgfSk7XG59KTtcbiIsIk1ldGVvci5zdGFydHVwIC0+XG5cdE1pZ3JhdGlvbnMuYWRkXG5cdFx0dmVyc2lvbjogNlxuXHRcdG5hbWU6ICfotKLliqHns7vnu5/ljYfnuqcnXG5cdFx0dXA6IC0+XG5cdFx0XHRjb25zb2xlLmxvZyAndmVyc2lvbiA2IHVwJ1xuXHRcdFx0Y29uc29sZS50aW1lICdiaWxsaW5nIHVwZ3JhZGUnXG5cdFx0XHR0cnlcblx0XHRcdFx0IyDmuIXnqbptb2R1bGVz6KGoXG5cdFx0XHRcdGRiLm1vZHVsZXMucmVtb3ZlKHt9KVxuXG5cdFx0XHRcdGRiLm1vZHVsZXMuaW5zZXJ0KHtcblx0XHRcdFx0XHRcIl9pZFwiOiBcIndvcmtmbG93LnN0YW5kYXJkXCIsXG5cdFx0XHRcdFx0XCJuYW1lX2VuXCI6IFwiV29ya2Zsb3cgU3RhbmRhcmRcIixcblx0XHRcdFx0XHRcIm5hbWVcIjogXCJ3b3JrZmxvdy5zdGFuZGFyZFwiLFxuXHRcdFx0XHRcdFwibmFtZV96aFwiOiBcIuWuoeaJueeOi+WfuuehgOeJiFwiLFxuXHRcdFx0XHRcdFwibGlzdHByaWNlXCI6IDEuMCxcblx0XHRcdFx0XHRcImxpc3RwcmljZV9ybWJcIjogMlxuXHRcdFx0XHR9KVxuXG5cdFx0XHRcdGRiLm1vZHVsZXMuaW5zZXJ0KHtcblx0XHRcdFx0XHRcIl9pZFwiOiBcIndvcmtmbG93LnByb2Zlc3Npb25hbFwiLFxuXHRcdFx0XHRcdFwibmFtZV9lblwiOiBcIldvcmtmbG93IFByb2Zlc3Npb25hbFwiLFxuXHRcdFx0XHRcdFwibmFtZVwiOiBcIndvcmtmbG93LnByb2Zlc3Npb25hbFwiLFxuXHRcdFx0XHRcdFwibmFtZV96aFwiOiBcIuWuoeaJueeOi+S4k+S4mueJiOaJqeWxleWMhVwiLFxuXHRcdFx0XHRcdFwibGlzdHByaWNlXCI6IDMuMCxcblx0XHRcdFx0XHRcImxpc3RwcmljZV9ybWJcIjogMThcblx0XHRcdFx0fSlcblxuXHRcdFx0XHRkYi5tb2R1bGVzLmluc2VydCh7XG5cdFx0XHRcdFx0XCJfaWRcIjogXCJ3b3JrZmxvdy5lbnRlcnByaXNlXCIsXG5cdFx0XHRcdFx0XCJuYW1lX2VuXCI6IFwiV29ya2Zsb3cgRW50ZXJwcmlzZVwiLFxuXHRcdFx0XHRcdFwibmFtZVwiOiBcIndvcmtmbG93LmVudGVycHJpc2VcIixcblx0XHRcdFx0XHRcIm5hbWVfemhcIjogXCLlrqHmibnnjovkvIHkuJrniYjmianlsZXljIVcIixcblx0XHRcdFx0XHRcImxpc3RwcmljZVwiOiA2LjAsXG5cdFx0XHRcdFx0XCJsaXN0cHJpY2Vfcm1iXCI6IDQwXG5cdFx0XHRcdH0pXG5cblxuXHRcdFx0XHRzdGFydF9kYXRlID0gbmV3IERhdGUobW9tZW50KG5ldyBEYXRlKS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpKVxuXHRcdFx0XHRkYi5zcGFjZXMuZmluZCh7aXNfcGFpZDogdHJ1ZSwgdXNlcl9saW1pdDogeyRleGlzdHM6IGZhbHNlfSwgbW9kdWxlczogeyRleGlzdHM6IHRydWV9fSkuZm9yRWFjaCAocyktPlxuXHRcdFx0XHRcdHRyeVxuXHRcdFx0XHRcdFx0c2V0X29iaiA9IHt9XG5cdFx0XHRcdFx0XHR1c2VyX2NvdW50ID0gZGIuc3BhY2VfdXNlcnMuZmluZCh7c3BhY2U6IHMuX2lkLCB1c2VyX2FjY2VwdGVkOiB0cnVlfSkuY291bnQoKVxuXHRcdFx0XHRcdFx0c2V0X29iai51c2VyX2xpbWl0ID0gdXNlcl9jb3VudFxuXHRcdFx0XHRcdFx0YmFsYW5jZSA9IHMuYmFsYW5jZVxuXHRcdFx0XHRcdFx0aWYgYmFsYW5jZSA+IDBcblx0XHRcdFx0XHRcdFx0bW9udGhzID0gMFxuXHRcdFx0XHRcdFx0XHRsaXN0cHJpY2VzID0gMFxuXHRcdFx0XHRcdFx0XHRfLmVhY2ggcy5tb2R1bGVzLCAocG0pLT5cblx0XHRcdFx0XHRcdFx0XHRtb2R1bGUgPSBkYi5tb2R1bGVzLmZpbmRPbmUoe25hbWU6IHBtfSlcblx0XHRcdFx0XHRcdFx0XHRpZiBtb2R1bGUgYW5kIG1vZHVsZS5saXN0cHJpY2Vcblx0XHRcdFx0XHRcdFx0XHRcdGxpc3RwcmljZXMgKz0gbW9kdWxlLmxpc3RwcmljZVxuXHRcdFx0XHRcdFx0XHRtb250aHMgPSBwYXJzZUludCgoYmFsYW5jZS8obGlzdHByaWNlcyp1c2VyX2NvdW50KSkudG9GaXhlZCgpKSArIDFcblx0XHRcdFx0XHRcdFx0ZW5kX2RhdGUgPSBuZXcgRGF0ZVxuXHRcdFx0XHRcdFx0XHRlbmRfZGF0ZS5zZXRNb250aChlbmRfZGF0ZS5nZXRNb250aCgpK21vbnRocylcblx0XHRcdFx0XHRcdFx0ZW5kX2RhdGUgPSBuZXcgRGF0ZShtb21lbnQoZW5kX2RhdGUpLmZvcm1hdChcIllZWVktTU0tRERcIikpXG5cdFx0XHRcdFx0XHRcdHNldF9vYmouc3RhcnRfZGF0ZSA9IHN0YXJ0X2RhdGVcblx0XHRcdFx0XHRcdFx0c2V0X29iai5lbmRfZGF0ZSA9IGVuZF9kYXRlXG5cblx0XHRcdFx0XHRcdGVsc2UgaWYgYmFsYW5jZSA8PSAwXG5cdFx0XHRcdFx0XHRcdHNldF9vYmouc3RhcnRfZGF0ZSA9IHN0YXJ0X2RhdGVcblx0XHRcdFx0XHRcdFx0c2V0X29iai5lbmRfZGF0ZSA9IG5ldyBEYXRlXG5cblx0XHRcdFx0XHRcdHMubW9kdWxlcy5wdXNoKFwid29ya2Zsb3cuc3RhbmRhcmRcIilcblx0XHRcdFx0XHRcdHNldF9vYmoubW9kdWxlcyA9IF8udW5pcShzLm1vZHVsZXMpXG5cdFx0XHRcdFx0XHRkYi5zcGFjZXMuZGlyZWN0LnVwZGF0ZSh7X2lkOiBzLl9pZH0sIHskc2V0OiBzZXRfb2JqfSlcblx0XHRcdFx0XHRjYXRjaCBlXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yIFwiYmlsbGluZyBzcGFjZSB1cGdyYWRlXCJcblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3Iocy5faWQpXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKHNldF9vYmopXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yIGUuc3RhY2tcblxuXHRcdFx0Y2F0Y2ggZVxuXHRcdFx0XHRjb25zb2xlLmVycm9yIFwiYmlsbGluZyB1cGdyYWRlXCJcblx0XHRcdFx0Y29uc29sZS5lcnJvciBlLnN0YWNrXG5cblx0XHRcdGNvbnNvbGUudGltZUVuZCAnYmlsbGluZyB1cGdyYWRlJ1xuXHRcdGRvd246IC0+XG5cdFx0XHRjb25zb2xlLmxvZyAndmVyc2lvbiA2IGRvd24nXG4iLCJNZXRlb3Iuc3RhcnR1cChmdW5jdGlvbigpIHtcbiAgcmV0dXJuIE1pZ3JhdGlvbnMuYWRkKHtcbiAgICB2ZXJzaW9uOiA2LFxuICAgIG5hbWU6ICfotKLliqHns7vnu5/ljYfnuqcnLFxuICAgIHVwOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBlLCBzdGFydF9kYXRlO1xuICAgICAgY29uc29sZS5sb2coJ3ZlcnNpb24gNiB1cCcpO1xuICAgICAgY29uc29sZS50aW1lKCdiaWxsaW5nIHVwZ3JhZGUnKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGRiLm1vZHVsZXMucmVtb3ZlKHt9KTtcbiAgICAgICAgZGIubW9kdWxlcy5pbnNlcnQoe1xuICAgICAgICAgIFwiX2lkXCI6IFwid29ya2Zsb3cuc3RhbmRhcmRcIixcbiAgICAgICAgICBcIm5hbWVfZW5cIjogXCJXb3JrZmxvdyBTdGFuZGFyZFwiLFxuICAgICAgICAgIFwibmFtZVwiOiBcIndvcmtmbG93LnN0YW5kYXJkXCIsXG4gICAgICAgICAgXCJuYW1lX3poXCI6IFwi5a6h5om5546L5Z+656GA54mIXCIsXG4gICAgICAgICAgXCJsaXN0cHJpY2VcIjogMS4wLFxuICAgICAgICAgIFwibGlzdHByaWNlX3JtYlwiOiAyXG4gICAgICAgIH0pO1xuICAgICAgICBkYi5tb2R1bGVzLmluc2VydCh7XG4gICAgICAgICAgXCJfaWRcIjogXCJ3b3JrZmxvdy5wcm9mZXNzaW9uYWxcIixcbiAgICAgICAgICBcIm5hbWVfZW5cIjogXCJXb3JrZmxvdyBQcm9mZXNzaW9uYWxcIixcbiAgICAgICAgICBcIm5hbWVcIjogXCJ3b3JrZmxvdy5wcm9mZXNzaW9uYWxcIixcbiAgICAgICAgICBcIm5hbWVfemhcIjogXCLlrqHmibnnjovkuJPkuJrniYjmianlsZXljIVcIixcbiAgICAgICAgICBcImxpc3RwcmljZVwiOiAzLjAsXG4gICAgICAgICAgXCJsaXN0cHJpY2Vfcm1iXCI6IDE4XG4gICAgICAgIH0pO1xuICAgICAgICBkYi5tb2R1bGVzLmluc2VydCh7XG4gICAgICAgICAgXCJfaWRcIjogXCJ3b3JrZmxvdy5lbnRlcnByaXNlXCIsXG4gICAgICAgICAgXCJuYW1lX2VuXCI6IFwiV29ya2Zsb3cgRW50ZXJwcmlzZVwiLFxuICAgICAgICAgIFwibmFtZVwiOiBcIndvcmtmbG93LmVudGVycHJpc2VcIixcbiAgICAgICAgICBcIm5hbWVfemhcIjogXCLlrqHmibnnjovkvIHkuJrniYjmianlsZXljIVcIixcbiAgICAgICAgICBcImxpc3RwcmljZVwiOiA2LjAsXG4gICAgICAgICAgXCJsaXN0cHJpY2Vfcm1iXCI6IDQwXG4gICAgICAgIH0pO1xuICAgICAgICBzdGFydF9kYXRlID0gbmV3IERhdGUobW9tZW50KG5ldyBEYXRlKS5mb3JtYXQoXCJZWVlZLU1NLUREXCIpKTtcbiAgICAgICAgZGIuc3BhY2VzLmZpbmQoe1xuICAgICAgICAgIGlzX3BhaWQ6IHRydWUsXG4gICAgICAgICAgdXNlcl9saW1pdDoge1xuICAgICAgICAgICAgJGV4aXN0czogZmFsc2VcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1vZHVsZXM6IHtcbiAgICAgICAgICAgICRleGlzdHM6IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH0pLmZvckVhY2goZnVuY3Rpb24ocykge1xuICAgICAgICAgIHZhciBiYWxhbmNlLCBlLCBlbmRfZGF0ZSwgbGlzdHByaWNlcywgbW9udGhzLCBzZXRfb2JqLCB1c2VyX2NvdW50O1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzZXRfb2JqID0ge307XG4gICAgICAgICAgICB1c2VyX2NvdW50ID0gZGIuc3BhY2VfdXNlcnMuZmluZCh7XG4gICAgICAgICAgICAgIHNwYWNlOiBzLl9pZCxcbiAgICAgICAgICAgICAgdXNlcl9hY2NlcHRlZDogdHJ1ZVxuICAgICAgICAgICAgfSkuY291bnQoKTtcbiAgICAgICAgICAgIHNldF9vYmoudXNlcl9saW1pdCA9IHVzZXJfY291bnQ7XG4gICAgICAgICAgICBiYWxhbmNlID0gcy5iYWxhbmNlO1xuICAgICAgICAgICAgaWYgKGJhbGFuY2UgPiAwKSB7XG4gICAgICAgICAgICAgIG1vbnRocyA9IDA7XG4gICAgICAgICAgICAgIGxpc3RwcmljZXMgPSAwO1xuICAgICAgICAgICAgICBfLmVhY2gocy5tb2R1bGVzLCBmdW5jdGlvbihwbSkge1xuICAgICAgICAgICAgICAgIHZhciBtb2R1bGU7XG4gICAgICAgICAgICAgICAgbW9kdWxlID0gZGIubW9kdWxlcy5maW5kT25lKHtcbiAgICAgICAgICAgICAgICAgIG5hbWU6IHBtXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKG1vZHVsZSAmJiBtb2R1bGUubGlzdHByaWNlKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gbGlzdHByaWNlcyArPSBtb2R1bGUubGlzdHByaWNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIG1vbnRocyA9IHBhcnNlSW50KChiYWxhbmNlIC8gKGxpc3RwcmljZXMgKiB1c2VyX2NvdW50KSkudG9GaXhlZCgpKSArIDE7XG4gICAgICAgICAgICAgIGVuZF9kYXRlID0gbmV3IERhdGU7XG4gICAgICAgICAgICAgIGVuZF9kYXRlLnNldE1vbnRoKGVuZF9kYXRlLmdldE1vbnRoKCkgKyBtb250aHMpO1xuICAgICAgICAgICAgICBlbmRfZGF0ZSA9IG5ldyBEYXRlKG1vbWVudChlbmRfZGF0ZSkuZm9ybWF0KFwiWVlZWS1NTS1ERFwiKSk7XG4gICAgICAgICAgICAgIHNldF9vYmouc3RhcnRfZGF0ZSA9IHN0YXJ0X2RhdGU7XG4gICAgICAgICAgICAgIHNldF9vYmouZW5kX2RhdGUgPSBlbmRfZGF0ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYmFsYW5jZSA8PSAwKSB7XG4gICAgICAgICAgICAgIHNldF9vYmouc3RhcnRfZGF0ZSA9IHN0YXJ0X2RhdGU7XG4gICAgICAgICAgICAgIHNldF9vYmouZW5kX2RhdGUgPSBuZXcgRGF0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHMubW9kdWxlcy5wdXNoKFwid29ya2Zsb3cuc3RhbmRhcmRcIik7XG4gICAgICAgICAgICBzZXRfb2JqLm1vZHVsZXMgPSBfLnVuaXEocy5tb2R1bGVzKTtcbiAgICAgICAgICAgIHJldHVybiBkYi5zcGFjZXMuZGlyZWN0LnVwZGF0ZSh7XG4gICAgICAgICAgICAgIF9pZDogcy5faWRcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgJHNldDogc2V0X29ialxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGUgPSBlcnJvcjtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJiaWxsaW5nIHNwYWNlIHVwZ3JhZGVcIik7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKHMuX2lkKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3Ioc2V0X29iaik7XG4gICAgICAgICAgICByZXR1cm4gY29uc29sZS5lcnJvcihlLnN0YWNrKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgZSA9IGVycm9yO1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiYmlsbGluZyB1cGdyYWRlXCIpO1xuICAgICAgICBjb25zb2xlLmVycm9yKGUuc3RhY2spO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbnNvbGUudGltZUVuZCgnYmlsbGluZyB1cGdyYWRlJyk7XG4gICAgfSxcbiAgICBkb3duOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBjb25zb2xlLmxvZygndmVyc2lvbiA2IGRvd24nKTtcbiAgICB9XG4gIH0pO1xufSk7XG4iLCJNZXRlb3Iuc3RhcnR1cCAoKS0+XG4gICAgcm9vdFVSTCA9IE1ldGVvci5hYnNvbHV0ZVVybCgpXG4gICAgaWYgIU1ldGVvci5zZXR0aW5ncy5wdWJsaWMud2Vic2VydmljZXNcbiAgICAgICAgTWV0ZW9yLnNldHRpbmdzLnB1YmxpYy53ZWJzZXJ2aWNlcyA9IHtcbiAgICAgICAgICAgIFwiY3JlYXRvclwiOiB7XG4gICAgICAgICAgICAgICAgXCJ1cmxcIjogcm9vdFVSTFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICBpZiAhTWV0ZW9yLnNldHRpbmdzLnB1YmxpYy53ZWJzZXJ2aWNlcy5jcmVhdG9yXG4gICAgICAgIE1ldGVvci5zZXR0aW5ncy5wdWJsaWMud2Vic2VydmljZXMuY3JlYXRvciA9IHtcbiAgICAgICAgICAgIFwidXJsXCI6IHJvb3RVUkxcbiAgICAgICAgfVxuXG4gICAgaWYgIU1ldGVvci5zZXR0aW5ncy5wdWJsaWMud2Vic2VydmljZXMuY3JlYXRvci51cmxcbiAgICAgICAgTWV0ZW9yLnNldHRpbmdzLnB1YmxpYy53ZWJzZXJ2aWNlcy5jcmVhdG9yLnVybCA9IHJvb3RVUkwiLCJNZXRlb3Iuc3RhcnR1cChmdW5jdGlvbigpIHtcbiAgdmFyIHJvb3RVUkw7XG4gIHJvb3RVUkwgPSBNZXRlb3IuYWJzb2x1dGVVcmwoKTtcbiAgaWYgKCFNZXRlb3Iuc2V0dGluZ3NbXCJwdWJsaWNcIl0ud2Vic2VydmljZXMpIHtcbiAgICBNZXRlb3Iuc2V0dGluZ3NbXCJwdWJsaWNcIl0ud2Vic2VydmljZXMgPSB7XG4gICAgICBcImNyZWF0b3JcIjoge1xuICAgICAgICBcInVybFwiOiByb290VVJMXG4gICAgICB9XG4gICAgfTtcbiAgfVxuICBpZiAoIU1ldGVvci5zZXR0aW5nc1tcInB1YmxpY1wiXS53ZWJzZXJ2aWNlcy5jcmVhdG9yKSB7XG4gICAgTWV0ZW9yLnNldHRpbmdzW1wicHVibGljXCJdLndlYnNlcnZpY2VzLmNyZWF0b3IgPSB7XG4gICAgICBcInVybFwiOiByb290VVJMXG4gICAgfTtcbiAgfVxuICBpZiAoIU1ldGVvci5zZXR0aW5nc1tcInB1YmxpY1wiXS53ZWJzZXJ2aWNlcy5jcmVhdG9yLnVybCkge1xuICAgIHJldHVybiBNZXRlb3Iuc2V0dGluZ3NbXCJwdWJsaWNcIl0ud2Vic2VydmljZXMuY3JlYXRvci51cmwgPSByb290VVJMO1xuICB9XG59KTtcbiIsImlmKHByb2Nlc3MuZW52LkNSRUFUT1JfTk9ERV9FTlYgPT0gJ2RldmVsb3BtZW50Jyl7XG5cdC8vTWV0ZW9yIOeJiOacrOWNh+e6p+WIsDEuOSDlj4rku6XkuIrml7Yobm9kZSDniYjmnKwgMTErKe+8jOWPr+S7peWIoOmZpOatpOS7o+eggVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoQXJyYXkucHJvdG90eXBlLCAnZmxhdCcsIHtcblx0XHR2YWx1ZTogZnVuY3Rpb24oZGVwdGggPSAxKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5yZWR1Y2UoZnVuY3Rpb24gKGZsYXQsIHRvRmxhdHRlbikge1xuXHRcdFx0XHRyZXR1cm4gZmxhdC5jb25jYXQoKEFycmF5LmlzQXJyYXkodG9GbGF0dGVuKSAmJiAoZGVwdGg+MSkpID8gdG9GbGF0dGVuLmZsYXQoZGVwdGgtMSkgOiB0b0ZsYXR0ZW4pO1xuXHRcdFx0fSwgW10pO1xuXHRcdH1cblx0fSk7XG59IiwiTWV0ZW9yLnN0YXJ0dXAgKCktPlxuXHRuZXcgVGFidWxhci5UYWJsZVxuXHRcdG5hbWU6IFwiY3VzdG9taXplX2FwcHNcIixcblx0XHRjb2xsZWN0aW9uOiBkYi5hcHBzLFxuXHRcdGNvbHVtbnM6IFtcblx0XHRcdHtcblx0XHRcdFx0ZGF0YTogXCJuYW1lXCJcblx0XHRcdFx0b3JkZXJhYmxlOiBmYWxzZVxuXHRcdFx0fVxuXHRcdF1cblx0XHRkb206IFwidHBcIlxuXHRcdGV4dHJhRmllbGRzOiBbXCJfaWRcIiwgXCJzcGFjZVwiXVxuXHRcdGxlbmd0aENoYW5nZTogZmFsc2Vcblx0XHRvcmRlcmluZzogZmFsc2Vcblx0XHRwYWdlTGVuZ3RoOiAxMFxuXHRcdGluZm86IGZhbHNlXG5cdFx0c2VhcmNoaW5nOiB0cnVlXG5cdFx0YXV0b1dpZHRoOiB0cnVlXG5cdFx0Y2hhbmdlU2VsZWN0b3I6IChzZWxlY3RvciwgdXNlcklkKSAtPlxuXHRcdFx0dW5sZXNzIHVzZXJJZFxuXHRcdFx0XHRyZXR1cm4ge19pZDogLTF9XG5cdFx0XHRzcGFjZSA9IHNlbGVjdG9yLnNwYWNlXG5cdFx0XHR1bmxlc3Mgc3BhY2Vcblx0XHRcdFx0aWYgc2VsZWN0b3I/LiRhbmQ/Lmxlbmd0aCA+IDBcblx0XHRcdFx0XHRzcGFjZSA9IHNlbGVjdG9yLiRhbmQuZ2V0UHJvcGVydHkoJ3NwYWNlJylbMF1cblx0XHRcdHVubGVzcyBzcGFjZVxuXHRcdFx0XHRyZXR1cm4ge19pZDogLTF9XG5cdFx0XHRyZXR1cm4gc2VsZWN0b3IiLCJNZXRlb3Iuc3RhcnR1cChmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBUYWJ1bGFyLlRhYmxlKHtcbiAgICBuYW1lOiBcImN1c3RvbWl6ZV9hcHBzXCIsXG4gICAgY29sbGVjdGlvbjogZGIuYXBwcyxcbiAgICBjb2x1bW5zOiBbXG4gICAgICB7XG4gICAgICAgIGRhdGE6IFwibmFtZVwiLFxuICAgICAgICBvcmRlcmFibGU6IGZhbHNlXG4gICAgICB9XG4gICAgXSxcbiAgICBkb206IFwidHBcIixcbiAgICBleHRyYUZpZWxkczogW1wiX2lkXCIsIFwic3BhY2VcIl0sXG4gICAgbGVuZ3RoQ2hhbmdlOiBmYWxzZSxcbiAgICBvcmRlcmluZzogZmFsc2UsXG4gICAgcGFnZUxlbmd0aDogMTAsXG4gICAgaW5mbzogZmFsc2UsXG4gICAgc2VhcmNoaW5nOiB0cnVlLFxuICAgIGF1dG9XaWR0aDogdHJ1ZSxcbiAgICBjaGFuZ2VTZWxlY3RvcjogZnVuY3Rpb24oc2VsZWN0b3IsIHVzZXJJZCkge1xuICAgICAgdmFyIHJlZiwgc3BhY2U7XG4gICAgICBpZiAoIXVzZXJJZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIF9pZDogLTFcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHNwYWNlID0gc2VsZWN0b3Iuc3BhY2U7XG4gICAgICBpZiAoIXNwYWNlKSB7XG4gICAgICAgIGlmICgoc2VsZWN0b3IgIT0gbnVsbCA/IChyZWYgPSBzZWxlY3Rvci4kYW5kKSAhPSBudWxsID8gcmVmLmxlbmd0aCA6IHZvaWQgMCA6IHZvaWQgMCkgPiAwKSB7XG4gICAgICAgICAgc3BhY2UgPSBzZWxlY3Rvci4kYW5kLmdldFByb3BlcnR5KCdzcGFjZScpWzBdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIXNwYWNlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgX2lkOiAtMVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNlbGVjdG9yO1xuICAgIH1cbiAgfSk7XG59KTtcbiJdfQ== diff --git a/server/bundle/programs/server/packages/steedos_base.js.map b/server/bundle/programs/server/packages/steedos_base.js.map index dd3e79499c..3919e4e855 100644 --- a/server/bundle/programs/server/packages/steedos_base.js.map +++ b/server/bundle/programs/server/packages/steedos_base.js.map @@ -1 +1 @@ -{"version":3,"sources":["meteor://💻app/packages/steedos:base/checkNpm.js","meteor://💻app/packages/steedos:base/lib/steedos_util.js","meteor://💻app/packages/steedos_base/lib/core.coffee","meteor://💻app/lib/core.coffee","meteor://💻app/packages/steedos:base/lib/simple_schema_extend.js","meteor://💻app/packages/steedos_base/lib/methods/last_logon.coffee","meteor://💻app/lib/methods/last_logon.coffee","meteor://💻app/packages/steedos_base/lib/methods/user_add_email.coffee","meteor://💻app/lib/methods/user_add_email.coffee","meteor://💻app/packages/steedos_base/lib/methods/user_avatar.coffee","meteor://💻app/lib/methods/user_avatar.coffee","meteor://💻app/packages/steedos:base/lib/methods/email_templates_reset.js","meteor://💻app/packages/steedos:base/lib/methods/upgrade_data.js","meteor://💻app/packages/steedos_base/lib/steedos/push.coffee","meteor://💻app/lib/steedos/push.coffee","meteor://💻app/packages/steedos_base/lib/admin.coffee","meteor://💻app/lib/admin.coffee","meteor://💻app/packages/steedos:base/lib/array_includes.js","meteor://💻app/packages/steedos_base/lib/settings.coffee","meteor://💻app/lib/settings.coffee","meteor://💻app/packages/steedos_base/lib/user_object_view.coffee","meteor://💻app/lib/user_object_view.coffee","meteor://💻app/packages/steedos:base/lib/server_session.js","meteor://💻app/packages/steedos_base/routes/api_get_apps.coffee","meteor://💻app/routes/api_get_apps.coffee","meteor://💻app/packages/steedos_base/routes/collection.coffee","meteor://💻app/routes/collection.coffee","meteor://💻app/packages/steedos_base/routes/sso.coffee","meteor://💻app/routes/sso.coffee","meteor://💻app/packages/steedos_base/routes/avatar.coffee","meteor://💻app/routes/avatar.coffee","meteor://💻app/packages/steedos_base/routes/access_token.coffee","meteor://💻app/routes/access_token.coffee","meteor://💻app/packages/steedos_base/server/publications/apps.coffee","meteor://💻app/server/publications/apps.coffee","meteor://💻app/packages/steedos_base/server/publications/my_spaces.coffee","meteor://💻app/server/publications/my_spaces.coffee","meteor://💻app/packages/steedos_base/server/publications/space_avatar.coffee","meteor://💻app/server/publications/space_avatar.coffee","meteor://💻app/packages/steedos_base/server/publications/modules.coffee","meteor://💻app/server/publications/modules.coffee","meteor://💻app/packages/steedos_base/server/publications/weixin_pay_code_url.coffee","meteor://💻app/server/publications/weixin_pay_code_url.coffee","meteor://💻app/packages/steedos_base/server/routes/api_billing_recharge_notify.coffee","meteor://💻app/server/routes/api_billing_recharge_notify.coffee","meteor://💻app/packages/steedos_base/server/methods/my_contacts_limit.coffee","meteor://💻app/server/methods/my_contacts_limit.coffee","meteor://💻app/packages/steedos:base/server/methods/setKeyValue.js","meteor://💻app/packages/steedos_base/server/methods/billing_settleup.coffee","meteor://💻app/server/methods/billing_settleup.coffee","meteor://💻app/packages/steedos_base/server/methods/setUsername.coffee","meteor://💻app/server/methods/setUsername.coffee","meteor://💻app/packages/steedos_base/server/methods/billing_recharge.coffee","meteor://💻app/server/methods/billing_recharge.coffee","meteor://💻app/packages/steedos_base/server/methods/get_space_user_count.coffee","meteor://💻app/packages/steedos_base/server/methods/user_secret.coffee","meteor://💻app/server/methods/user_secret.coffee","meteor://💻app/packages/steedos_base/server/methods/object_workflows.coffee","meteor://💻app/server/methods/object_workflows.coffee","meteor://💻app/packages/steedos_base/server/methods/set_space_user_password.coffee","meteor://💻app/server/methods/set_space_user_password.coffee","meteor://💻app/packages/steedos_base/server/lib/billing_manager.coffee","meteor://💻app/server/lib/billing_manager.coffee","meteor://💻app/packages/steedos:base/server/schedule/statistics.js","meteor://💻app/packages/steedos_base/server/steedos/startup/migrations/v1.coffee","meteor://💻app/server/steedos/startup/migrations/v1.coffee","meteor://💻app/packages/steedos_base/server/steedos/startup/migrations/v2.coffee","meteor://💻app/server/steedos/startup/migrations/v2.coffee","meteor://💻app/packages/steedos_base/server/steedos/startup/migrations/v3.coffee","meteor://💻app/server/steedos/startup/migrations/v3.coffee","meteor://💻app/packages/steedos_base/server/steedos/startup/migrations/v4.coffee","meteor://💻app/server/steedos/startup/migrations/v4.coffee","meteor://💻app/packages/steedos_base/server/steedos/startup/migrations/v5.coffee","meteor://💻app/server/steedos/startup/migrations/v5.coffee","meteor://💻app/packages/steedos_base/server/steedos/startup/migrations/v6.coffee","meteor://💻app/server/steedos/startup/migrations/v6.coffee","meteor://💻app/packages/steedos_base/server/startup.coffee","meteor://💻app/server/startup.coffee","meteor://💻app/packages/steedos:base/server/development.js","meteor://💻app/packages/steedos_base/tabular.coffee","meteor://💻app/tabular.coffee"],"names":["checkNpmVersions","module","link","v","cookies","mkdirp","Meteor","settings","billing","Array","prototype","sortByName","locale","Steedos","sort","p1","p2","p1_sort_no","sort_no","p2_sort_no","name","localeCompare","getProperty","k","forEach","t","m","push","remove","from","to","rest","slice","length","apply","filterProperty","h","l","g","d","includes","Object","undefined","findPropertyByPK","r","Cookies","crypto","mixin","ref","ref1","ref2","ref3","ref4","rootUrl","db","subs","isPhoneEnabled","phone","numberToString","number","scale","notThousands","reg","toString","Number","toFixed","match","replace","valiJquerySymbols","str","RegExp","test","isCordova","isClient","absoluteUrl","defaultOptions","endsWith","substr","window","stores","API","client","setUrl","Settings","setRootUrl","autorun","ref5","ref6","ref7","ref8","setUserId","userId","setTenantId","spaceId","getHelpUrl","country","substring","spaceUpgradedModal","swal","title","TAPi18n","__","text","html","type","confirmButtonText","getAccountBgBodyValue","accountBgBody","steedos_keyvalues","findOne","user","key","value","applyAccountBgBodyValue","accountBgBodyValue","isNeedToLocal","avatar","url","loggingIn","localStorage","getItem","setItem","removeItem","getAccountSkinValue","accountSkin","getAccountZoomValue","accountZoom","applyAccountZoomValue","accountZoomValue","zoomName","zoomSize","size","$","removeClass","Session","get","addClass","showHelp","getLocale","open","getUrlWithToken","authToken","linker","getSpaceId","Accounts","_storedLoginToken","indexOf","param","getAppUrlWithToken","app_id","openAppWithToken","app","apps","is_new_window","isMobile","location","openWindow","openUrlWithIE","cmd","exec","open_url","isNode","nw","require","error","stdout","stderr","toastr","openApp","e","evalFunString","on_click","path","redirectToSignIn","FlowRouter","go","is_use_ie","origin","isInternalApp","is_use_iframe","_id","eval","error1","console","message","stack","set","checkSpaceBalance","end_date","min_months","space","isSpaceAdmin","spaces","hasFeature","Date","setModalMaxHeight","offset","detectIE","each","footerHeight","headerHeight","height","totalHeight","outerHeight","innerHeight","hasClass","css","getModalMaxHeight","reValue","screen","isiOS","userAgent","language","DEVICE","browser","conExp","device","numExp","android","blackberry","desktop","ipad","iphone","ipod","mobile","navigator","toLowerCase","browserLanguage","getUserOrganizations","isIncludeParents","organizations","parents","space_user","space_users","fields","_","flatten","find","$in","fetch","union","forbidNodeContextmenu","target","ifr","document","body","addEventListener","ev","preventDefault","load","ifrBody","contents","isServer","admins","isLegalVersion","app_version","check","modules","isOrgAdminByOrgIds","orgIds","allowAccessOrgs","isOrgAdmin","useOrgs","filter","org","uniq","isOrgAdminByAllOrgIds","i","root_url","URL","pathname","getAPILoginUser","req","res","password","result","username","query","users","steedos_id","_checkPassword","Error","checkAuthToken","headers","hashedToken","_hashLoginToken","decrypt","iv","c","decipher","decipherMsg","key32","len","createDecipheriv","Buffer","concat","update","final","encrypt","cipher","cipheredMsg","createCipheriv","getUserIdFromAccessToken","access_token","collection","obj","split","oAuth2Server","collections","accessToken","expires","getUserIdFromAuthToken","APIAuthenticationCheck","JsonRoutes","sendResult","data","code","functions","func","args","_wrapped","arguments","call","isHoliday","date","day","getDay","caculateWorkingTime","days","caculateDate","param_date","getTime","caculatePlusHalfWorkingDay","next","caculated_date","first_date","j","max_index","second_date","start_date","time_points","remind","isEmpty","setHours","hour","setMinutes","minute","extend","getSteedosToken","appId","now","secret","steedos_token","parseInt","isI18n","checkUsernameAvailability","$regex","_escapeRegExp","trim","validatePassword","pwd","passworPolicy","passworPolicyError","reason","valid","policy","policyError","convertSpecialCharacter","removeSpecialCharacter","Creator","getDBApps","space_id","dbApps","Collections","is_creator","visible","created","created_by","modified","modified_by","getDBDashboards","dbDashboards","dashboard","getAuthToken","authorization","sessionStorage","getCurrentAppId","formatIndex","array","indexName","isdocumentDB","object","background","datasources","documentDB","join","startup","SimpleSchema","extendOptions","foreign_key","Match","Optional","Boolean","references","methods","updateUserLastLogon","$set","last_logon","onLogin","users_add_email","email","count","emails","direct","$push","address","verified","sendVerificationEmail","users_remove_email","p","$pull","users_verify_email","users_set_primary_email","primary","multi","showCancelButton","closeOnConfirm","animation","inputValue","updateUserAvatar","emailTemplates","defaultFrom","resetPassword","subject","splits","tokenCode","greeting","profile","token_code","verifyEmail","enrollAccount","add","orgs","fullname","$ne","calculateFullname","ret","msg","Push","Configure","senderID","ANDROID_SENDER_ID","sound","vibrate","ios","badge","clearBadge","alert","appName","Selector","selectorCheckSpaceAdmin","selector","is_cloudadmin","map","n","selectorCheckSpace","u","billing_pay_records","adminConfig","icon","color","tableColumns","extraFields","routerAdmin","paid","showEditColumn","showDelColumn","disableAdd","pageLength","order","space_user_signs","AdminConfig","collections_add","searchElement","O","currentElement","webservices","www","status","getUserObjectsListViews","objects","_getUserObjectListViews","keys","listViews","objectsViews","getCollection","object_name","owner","shared","_user_object_list_views","olistViews","ov","listview","o","list_view","getUserObjectListViews","object_listview","user_id","uuflowManager","getSpace","$or","$exists","errors","errorMessage","steedosAuth","allow_models","model","options","userSession","String","wrapAsync","cb","getSession","then","resolve","reject","express","des_cipher","des_cipheredMsg","des_iv","des_steedos_token","joiner","key8","redirectUrl","returnurl","params","writeHead","end","encodeURI","setHeader","color_index","colors","fontSize","initials","position","reqModifiedHeader","svg","username_array","width","w","fs","getRelativeUrl","avatarUrl","file","write","item","charCodeAt","toUpperCase","toUTCString","readStream","pipe","publish","ready","handle","handle2","observeSpaces","self","sus","userSpaces","user_accepted","su","observe","added","doc","removed","oldDoc","without","stop","changed","newDoc","onStop","enable_register","on","chunk","bindEnvironment","parser","xml2js","Parser","explicitArray","explicitRoot","parseString","err","WXPay","attach","bpr","code_url_id","sign","wxpay","appid","mch_id","partner_key","clone","JSON","parse","total_fee","billingManager","special_pay","user_count","log","get_contacts_limit","froms","fromsChildren","fromsChildrenIds","isLimit","len1","limit","limits","myLitmitOrgIds","myOrgId","myOrgIds","myOrgs","outside_organizations","setting","tempIsLimit","toOrgs","tos","space_settings","values","intersection","setKeyValue","insert","billing_settleup","accounting_month","Email","time","is_paid","s","caculate_by_accounting_month","Package","send","stringify","timeEnd","setUsername","spaceUser","invite_state","billing_recharge","new_id","module_names","listprices","one_month_yuan","order_body","result_obj","space_user_count","listprice_rmb","name_zh","createUnifiedOrder","out_trade_no","moment","format","spbill_create_ip","notify_url","trade_type","product_id","info","get_space_user_count","user_count_info","total_user_count","accepted_user_count","create_secret","remove_secret","token","curSpaceUser","ows","flow_id","fl","perms","flow_name","can_add","users_can_add","orgs_can_add","some","setSpaceUserPassword","space_user_id","changedUserInfo","currentUser","lang","logout","userCP","setPassword","services","bcrypt","mobile_verified","SMSQueue","Format","Action","ParamString","RecNum","SignName","TemplateCode","get_accounting_period","count_days","end_date_time","start_date_time","billings","transaction","billing_date","getDate","refresh_balance","refresh_date","app_bill","b_m","b_m_d","bill","credits","debits","last_balance","last_bill","payment_bill","setObj","$lt","billing_month","balance","get_balance","module_name","listprice","accounting_date","accounting_date_format","days_number","new_bill","$lte","_makeNewID","getSpaceUserCount","recaculateBalance","refresh_dates","r_d","get_modules","m_changelog","modules_changelogs","change_date","operation","get_modules_name","modules_name","a_m","newest_bill","period_result","remaining_months","b","operator_id","new_modules","space_update_obj","difference","_d","user_limit","mcl","operator","cron","statistics","schedule","rule","go_next","scheduleJob","dateFormat","datekey","getFullYear","getMonth","yesterDay","dNow","dBefore","dailyStaticsCount","statics","$gt","staticsCount","ownerName","lastLogon","sUsers","sUser","lastModified","objArr","mod","postsAttachments","attSize","sizeSum","posts","post","atts","cfs","att","original","dailyPostsAttachments","steedos_statistics","space_name","owner_name","steedos","workflow","flows","forms","flow_roles","flow_positions","instances","instances_last_modified","daily_flows","daily_forms","daily_instances","cms","sites","cms_sites","cms_posts","posts_last_modified","posts_attachments_size","comments","cms_comments","daily_sites","daily_posts","daily_comments","daily_posts_attachments_size","Migrations","version","up","update_cfs_instance","parent_id","instance_id","attach_version","isCurrent","metadata","parent","instance","approve","current","attachments","ins","attachs","current_ver","_rev","historys","his","down","organization","check_count","new_org_ids","removed_org_ids","root_org","updateUsers","months","set_obj","pm","setMonth","rootURL","creator","process","env","CREATOR_NODE_ENV","defineProperty","depth","reduce","flat","toFlatten","isArray","Tabular","Table","columns","orderable","dom","lengthChange","ordering","searching","autoWidth","changeSelector","$and"],"mappings":"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","file":"/packages/steedos_base.js","sourcesContent":["import {\n\tcheckNpmVersions\n} from 'meteor/tmeasday:check-npm-versions';\ncheckNpmVersions({\n\t\"node-schedule\": \"^1.3.1\",\n\tcookies: \"^0.6.2\",\n\t\"xml2js\": \"^0.4.19\",\n\tmkdirp: \"^0.3.5\",\n\t\"url-search-params-polyfill\": \"^7.0.0\",\n}, 'steedos:base');\n\nif (Meteor.settings && Meteor.settings.billing) {\n\tcheckNpmVersions({\n\t\t\"weixin-pay\": \"^1.1.7\"\n\t}, 'steedos:base');\n}","Array.prototype.sortByName = function (locale) {\n if (!this) {\n return;\n }\n if(!locale){\n locale = Steedos.locale()\n }\n this.sort(function (p1, p2) {\n\t\tvar p1_sort_no = p1.sort_no || 0;\n\t\tvar p2_sort_no = p2.sort_no || 0;\n\t\tif(p1_sort_no != p2_sort_no){\n return p1_sort_no > p2_sort_no ? -1 : 1\n }else{\n\t\t\treturn p1.name.localeCompare(p2.name, locale);\n\t\t}\n });\n};\n\n\nArray.prototype.getProperty = function (k) {\n var v = new Array();\n this.forEach(function (t) {\n var m = t ? t[k] : null;\n v.push(m);\n });\n return v;\n}\n\n/*\n * 添加Array的remove函数\n */\nArray.prototype.remove = function (from, to) {\n if (from < 0) {\n return;\n }\n var rest = this.slice((to || from) + 1 || this.length);\n this.length = from < 0 ? this.length + from : from;\n return this.push.apply(this, rest);\n};\n\n/*\n * 添加Array的过滤器\n * return 符合条件的对象Array\n */\nArray.prototype.filterProperty = function (h, l) {\n var g = [];\n this.forEach(function (t) {\n var m = t ? t[h] : null;\n var d = false;\n if (m instanceof Array) {\n d = m.includes(l);\n } else {\n if (m instanceof Object) {\n if (\"id\" in m) {\n m = m[\"id\"];\n } else if (\"_id\" in m) {\n m = m[\"_id\"];\n }\n\n }\n if (l instanceof Array) {\n d = (l === undefined) ? false : l.includes(m);\n } else {\n d = (l === undefined) ? false : m == l;\n }\n }\n\n if (d) {\n g.push(t);\n }\n });\n return g;\n}\n\n/*\n * 添加Array的过滤器\n * return 符合条件的第一个对象\n */\nArray.prototype.findPropertyByPK = function (h, l) {\n var r = null;\n this.forEach(function (t) {\n var m = t ? t[h] : null;\n var d = false;\n if (m instanceof Array) {\n d = m.includes(l);\n } else {\n d = (l === undefined) ? false : m == l;\n }\n\n if (d) {\n r = t;\n }\n });\n return r;\n}","Steedos =\n\tsettings: {}\n\tdb: db\n\tsubs: {}\n\tisPhoneEnabled: ->\n\t\treturn !!Meteor.settings?.public?.phone\n\tnumberToString: (number, scale, notThousands)->\n\t\tif typeof number == \"number\"\n\t\t\tnumber = number.toString()\n\n\t\tif !number\n\t\t\treturn '';\n\n\t\tif number != \"NaN\"\n\t\t\tif scale || scale == 0\n\t\t\t\tnumber = Number(number).toFixed(scale)\n\t\t\tunless notThousands\n\t\t\t\tif !(scale || scale == 0)\n\t\t\t\t\t# 没定义scale时,根据小数点位置算出scale值\n\t\t\t\t\tscale = number.match(/\\.(\\d+)/)?[1]?.length\n\t\t\t\t\tunless scale\n\t\t\t\t\t\tscale = 0\n\t\t\t\treg = /(\\d)(?=(\\d{3})+\\.)/g\n\t\t\t\tif scale == 0\n\t\t\t\t\treg = /(\\d)(?=(\\d{3})+\\b)/g\n\t\t\t\tnumber = number.replace(reg, '$1,')\n\t\t\treturn number\n\t\telse\n\t\t\treturn \"\"\n\tvaliJquerySymbols: (str)->\n\t\t# reg = /^[^!\"#$%&'()*+,./:;<=>?@[\\]^`{|}~]+$/g\n\t\treg = new RegExp(\"^[^!\\\"#$%&'()*\\+,\\.\\/:;<=>?@[\\\\]^`{|}~]+$\")\n\t\treturn reg.test(str)\n\n###\n# Kick off the global namespace for Steedos.\n# @namespace Steedos\n###\n# if Meteor.isCordova\nif Meteor.isCordova || Meteor.isClient\n\trootUrl = Meteor.absoluteUrl.defaultOptions.rootUrl\n\tif rootUrl.endsWith('/')\n\t\trootUrl = rootUrl.substr(0, rootUrl.length - 1)\n\n\twindow.stores?.API?.client?.setUrl = rootUrl\n\twindow.stores?.Settings?.setRootUrl(rootUrl)\n\twindow['steedos.setting'] = {\n\t\trootUrl: rootUrl\n\t}\n\nif Meteor.isClient\n\tMeteor.autorun ()->\n\t\twindow.stores?.Settings?.setUserId(Steedos.userId())\n\t\twindow.stores?.Settings?.setTenantId(Steedos.spaceId())\n\nSteedos.getHelpUrl = (locale)->\n\tcountry = locale.substring(3)\n\treturn \"http://www.steedos.com/\" + country + \"/help/\"\n\nif Meteor.isClient\n\n\tSteedos.spaceUpgradedModal = ()->\n\t\tswal({title: TAPi18n.__(\"space_paid_info_title\"), text: TAPi18n.__(\"space_paid_info_text\"), html: true, type:\"warning\", confirmButtonText: TAPi18n.__(\"OK\")});\n\n\tSteedos.getAccountBgBodyValue = ()->\n\t\taccountBgBody = db.steedos_keyvalues.findOne({user:Steedos.userId(),key:\"bg_body\"})\n\t\tif accountBgBody\n\t\t\treturn accountBgBody.value\n\t\telse\n\t\t\treturn {};\n\n\tSteedos.applyAccountBgBodyValue = (accountBgBodyValue,isNeedToLocal)->\n\t\tif Meteor.loggingIn() or !Steedos.userId()\n\t\t\t# 如果是正在登录中或在登录界面,则取localStorage中设置,而不是直接应用空设置\n\t\t\taccountBgBodyValue = {}\n\t\t\taccountBgBodyValue.url = localStorage.getItem(\"accountBgBodyValue.url\")\n\t\t\taccountBgBodyValue.avatar = localStorage.getItem(\"accountBgBodyValue.avatar\")\n\n\t\turl = accountBgBodyValue.url\n\t\tavatar = accountBgBodyValue.avatar\n\t\t# if accountBgBodyValue.url\n\t\t# \tif url == avatar\n\t\t# \t\tavatarUrl = 'api/files/avatars/' + avatar\n\t\t# \t\t$(\"body\").css \"backgroundImage\",\"url(#{Steedos.absoluteUrl(avatarUrl)})\"\n\t\t# \telse\n\t\t# \t\t$(\"body\").css \"backgroundImage\",\"url(#{Steedos.absoluteUrl(url)})\"\n\t\t# else\n\t\t# \tbackground = Meteor.settings?.public?.admin?.background\n\t\t# \tif background\n\t\t# \t\t$(\"body\").css \"backgroundImage\",\"url(#{Steedos.absoluteUrl(background)})\"\n\t\t# \telse\n\t\t# \t\tbackground = \"/packages/steedos_theme/client/background/sea.jpg\"\n\t\t# \t\t$(\"body\").css \"backgroundImage\",\"url(#{Steedos.absoluteUrl(background)})\"\n\n\t\tif isNeedToLocal\n\t\t\tif Meteor.loggingIn()\n\t\t\t\t# 正在登录中,则不做处理,因为此时Steedos.userId()不足于证明已登录状态\n\t\t\t\treturn\n\t\t\t# 这里特意不在localStorage中存储Steedos.userId(),因为需要保证登录界面也应用localStorage中的设置\n\t\t\t# 登录界面不设置localStorage,因为登录界面accountBgBodyValue肯定为空,设置的话,会造成无法保持登录界面也应用localStorage中的设置\n\t\t\tif Steedos.userId()\n\t\t\t\tif url\n\t\t\t\t\tlocalStorage.setItem(\"accountBgBodyValue.url\",url)\n\t\t\t\t\tlocalStorage.setItem(\"accountBgBodyValue.avatar\",avatar)\n\t\t\t\telse\n\t\t\t\t\tlocalStorage.removeItem(\"accountBgBodyValue.url\")\n\t\t\t\t\tlocalStorage.removeItem(\"accountBgBodyValue.avatar\")\n\n\tSteedos.getAccountSkinValue = ()->\n\t\taccountSkin = db.steedos_keyvalues.findOne({user:Steedos.userId(),key:\"skin\"})\n\t\tif accountSkin\n\t\t\treturn accountSkin.value\n\t\telse\n\t\t\treturn {};\n\n\tSteedos.getAccountZoomValue = ()->\n\t\taccountZoom = db.steedos_keyvalues.findOne({user:Steedos.userId(),key:\"zoom\"})\n\t\tif accountZoom\n\t\t\treturn accountZoom.value\n\t\telse\n\t\t\treturn {};\n\n\tSteedos.applyAccountZoomValue = (accountZoomValue,isNeedToLocal)->\n\t\tif Meteor.loggingIn() or !Steedos.userId()\n\t\t\t# 如果是正在登录中或在登录界面,则取localStorage中设置,而不是直接应用空设置\n\t\t\taccountZoomValue = {}\n\t\t\taccountZoomValue.name = localStorage.getItem(\"accountZoomValue.name\")\n\t\t\taccountZoomValue.size = localStorage.getItem(\"accountZoomValue.size\")\n\t\t$(\"body\").removeClass(\"zoom-normal\").removeClass(\"zoom-large\").removeClass(\"zoom-extra-large\");\n\t\tzoomName = accountZoomValue.name\n\t\tzoomSize = accountZoomValue.size\n\t\tunless zoomName\n\t\t\tzoomName = \"large\"\n\t\t\tzoomSize = 1.2\n\t\tif zoomName && !Session.get(\"instancePrint\")\n\t\t\t$(\"body\").addClass(\"zoom-#{zoomName}\")\n\t\t\t# if Steedos.isNode()\n\t\t\t# \tif accountZoomValue.size == \"1\"\n\t\t\t# \t\t# node-webkit中size为0才表示100%\n\t\t\t# \t\tzoomSize = 0\n\t\t\t# \tnw.Window.get().zoomLevel = Number.parseFloat(zoomSize)\n\t\t\t# else\n\t\t\t# \t$(\"body\").addClass(\"zoom-#{zoomName}\")\n\t\tif isNeedToLocal\n\t\t\tif Meteor.loggingIn()\n\t\t\t\t# 正在登录中,则不做处理,因为此时Steedos.userId()不足于证明已登录状态\n\t\t\t\treturn\n\t\t\t# 这里特意不在localStorage中存储Steedos.userId(),因为需要保证登录界面也应用localStorage中的设置\n\t\t\t# 登录界面不设置localStorage,因为登录界面accountZoomValue肯定为空,设置的话,会造成无法保持登录界面也应用localStorage中的设置\n\t\t\tif Steedos.userId()\n\t\t\t\tif accountZoomValue.name\n\t\t\t\t\tlocalStorage.setItem(\"accountZoomValue.name\",accountZoomValue.name)\n\t\t\t\t\tlocalStorage.setItem(\"accountZoomValue.size\",accountZoomValue.size)\n\t\t\t\telse\n\t\t\t\t\tlocalStorage.removeItem(\"accountZoomValue.name\")\n\t\t\t\t\tlocalStorage.removeItem(\"accountZoomValue.size\")\n\n\tSteedos.showHelp = (url)->\n\t\tlocale = Steedos.getLocale()\n\t\tcountry = locale.substring(3)\n\n\t\turl = url || \"http://www.steedos.com/\" + country + \"/help/\"\n\n\t\twindow.open(url, '_help', 'EnableViewPortScale=yes')\n\n\tSteedos.getUrlWithToken = (url)->\n\t\tauthToken = {};\n\t\tauthToken[\"spaceId\"] = Steedos.getSpaceId()\n\t\tauthToken[\"X-User-Id\"] = Meteor.userId();\n\t\tauthToken[\"X-Auth-Token\"] = Accounts._storedLoginToken();\n\n\t\tlinker = \"?\"\n\n\t\tif url.indexOf(\"?\") > -1\n\t\t\tlinker = \"&\"\n\n\t\treturn url + linker + $.param(authToken)\n\n\tSteedos.getAppUrlWithToken = (app_id)->\n\t\tauthToken = {};\n\t\tauthToken[\"spaceId\"] = Steedos.getSpaceId()\n\t\tauthToken[\"X-User-Id\"] = Meteor.userId();\n\t\tauthToken[\"X-Auth-Token\"] = Accounts._storedLoginToken();\n\t\treturn \"api/setup/sso/\" + app_id + \"?\" + $.param(authToken)\n\n\tSteedos.openAppWithToken = (app_id)->\n\t\turl = Steedos.getAppUrlWithToken app_id\n\t\turl = Steedos.absoluteUrl url\n\n\t\tapp = db.apps.findOne(app_id)\n\n\t\tif !app.is_new_window && !Steedos.isMobile() && !Steedos.isCordova()\n\t\t\twindow.location = url\n\t\telse\n\t\t\tSteedos.openWindow(url);\n\n\tSteedos.openUrlWithIE = (url)->\n\t\tif url\n\t\t\tif Steedos.isNode()\n\t\t\t\texec = nw.require('child_process').exec\n\t\t\t\topen_url = url\n\t\t\t\tcmd = \"start iexplore.exe \\\"#{open_url}\\\"\"\n\t\t\t\texec cmd, (error, stdout, stderr) ->\n\t\t\t\t\tif error\n\t\t\t\t\t\ttoastr.error error\n\t\t\t\t\treturn\n\t\t\telse\n\t\t\t\tSteedos.openWindow(url)\n\n\n\tSteedos.openApp = (app_id)->\n\t\tif !Meteor.userId()\n\t\t\tSteedos.redirectToSignIn()\n\t\t\treturn true\n\n\t\tapp = db.apps.findOne(app_id)\n\t\tif !app\n\t\t\tFlowRouter.go(\"/\")\n\t\t\treturn\n\n\t\t# creatorSettings = Meteor.settings.public?.webservices?.creator\n\t\t# if app._id == \"admin\" and creatorSettings?.status == \"active\"\n\t\t# \turl = creatorSettings.url\n\t\t# \treg = /\\/$/\n\t\t# \tunless reg.test url\n\t\t# \t\turl += \"/\"\n\t\t# \turl = \"#{url}app/admin\"\n\t\t# \tSteedos.openWindow(url)\n\t\t# \treturn\n\n\t\ton_click = app.on_click\n\t\tif app.is_use_ie\n\t\t\tif Steedos.isNode()\n\t\t\t\texec = nw.require('child_process').exec\n\t\t\t\tif on_click\n\t\t\t\t\tpath = \"api/app/sso/#{app_id}?authToken=#{Accounts._storedLoginToken()}&userId=#{Meteor.userId()}\"\n\t\t\t\t\topen_url = window.location.origin + \"/\" + path\n\t\t\t\telse\n\t\t\t\t\topen_url = Steedos.getAppUrlWithToken app_id\n\t\t\t\t\topen_url = window.location.origin + \"/\" + open_url\n\t\t\t\tcmd = \"start iexplore.exe \\\"#{open_url}\\\"\"\n\t\t\t\texec cmd, (error, stdout, stderr) ->\n\t\t\t\t\tif error\n\t\t\t\t\t\ttoastr.error error\n\t\t\t\t\treturn\n\t\t\telse\n\t\t\t\tSteedos.openAppWithToken(app_id)\n\n\t\telse if db.apps.isInternalApp(app.url)\n\t\t\tFlowRouter.go(app.url)\n\n\t\telse if app.is_use_iframe\n\t\t\tif app.is_new_window && !Steedos.isMobile() && !Steedos.isCordova()\n\t\t\t\tSteedos.openWindow(Steedos.absoluteUrl(\"apps/iframe/\" + app._id))\n\t\t\telse if Steedos.isMobile() || Steedos.isCordova()\n\t\t\t\tSteedos.openAppWithToken(app_id)\n\t\t\telse\n\t\t\t\tFlowRouter.go(\"/apps/iframe/#{app._id}\")\n\n\t\telse if on_click\n\t\t\t# 这里执行的是一个不带参数的闭包函数,用来避免变量污染\n\t\t\tevalFunString = \"(function(){#{on_click}})()\"\n\t\t\ttry\n\t\t\t\teval(evalFunString)\n\t\t\tcatch e\n\t\t\t\t# just console the error when catch error\n\t\t\t\tconsole.error \"catch some error when eval the on_click script for app link:\"\n\t\t\t\tconsole.error \"#{e.message}\\r\\n#{e.stack}\"\n\t\telse\n\t\t\tSteedos.openAppWithToken(app_id)\n\n\t\tif !app.is_new_window && !Steedos.isMobile() && !Steedos.isCordova() && !app.is_use_ie && !on_click\n\t\t\t# 需要选中当前app时,on_click函数里要单独加上Session.set(\"current_app_id\", app_id)\n\t\t\tSession.set(\"current_app_id\", app_id)\n\n\tSteedos.checkSpaceBalance = (spaceId)->\n\t\tunless spaceId\n\t\t\tspaceId = Steedos.spaceId()\n\t\tmin_months = 1\n\t\tif Steedos.isSpaceAdmin()\n\t\t\tmin_months = 3\n\t\tspace = db.spaces.findOne(spaceId)\n\t\tend_date = space?.end_date\n\t\tif space && Steedos.hasFeature('paid', space._id) and end_date != undefined and (end_date - new Date) <= (min_months*30*24*3600*1000)\n\t\t\t# 提示用户余额不足\n\t\t\ttoastr.error t(\"space_balance_insufficient\")\n\n\tSteedos.setModalMaxHeight = ()->\n\t\taccountZoomValue = Steedos.getAccountZoomValue()\n\t\tunless accountZoomValue.name\n\t\t\taccountZoomValue.name = 'large'\n\t\tswitch accountZoomValue.name\n\t\t\twhen 'normal'\n\t\t\t\tif Steedos.isMobile()\n\t\t\t\t\toffset = -12\n\t\t\t\telse\n\t\t\t\t\toffset = 75\n\t\t\twhen 'large'\n\t\t\t\tif Steedos.isMobile()\n\t\t\t\t\toffset = -6\n\t\t\t\telse\n\t\t\t\t\t# 区分IE浏览器\n\t\t\t\t\tif Steedos.detectIE()\n\t\t\t\t\t\toffset = 199\n\t\t\t\t\telse\n\t\t\t\t\t\toffset = 9\n\t\t\twhen 'extra-large'\n\t\t\t\tif Steedos.isMobile()\n\t\t\t\t\toffset = -26\n\t\t\t\telse\n\t\t\t\t\t# 区分IE浏览器\n\t\t\t\t\tif Steedos.detectIE()\n\t\t\t\t\t\toffset = 303\n\t\t\t\t\telse\n\t\t\t\t\t\toffset = 53\n\n\t\tif $(\".modal\").length\n\t\t\t$(\".modal\").each ->\n\t\t\t\theaderHeight = 0\n\t\t\t\tfooterHeight = 0\n\t\t\t\ttotalHeight = 0\n\t\t\t\t$(\".modal-header\", $(this)).each ->\n\t\t\t\t\theaderHeight += $(this).outerHeight(false)\n\t\t\t\t$(\".modal-footer\", $(this)).each ->\n\t\t\t\t\tfooterHeight += $(this).outerHeight(false)\n\n\t\t\t\ttotalHeight = headerHeight + footerHeight\n\t\t\t\theight = $(\"body\").innerHeight() - totalHeight - offset\n\t\t\t\tif $(this).hasClass(\"cf_contact_modal\")\n\t\t\t\t\t$(\".modal-body\",$(this)).css({\"max-height\": \"#{height}px\", \"height\": \"#{height}px\"})\n\t\t\t\telse\n\t\t\t\t\t$(\".modal-body\",$(this)).css({\"max-height\": \"#{height}px\", \"height\": \"auto\"})\n\n\tSteedos.getModalMaxHeight = (offset)->\n\t\tif Steedos.isMobile()\n\t\t\treValue = window.screen.height - 126 - 180 - 25\n\t\telse\n\t\t\treValue = $(window).height() - 180 - 25\n\t\tunless Steedos.isiOS() or Steedos.isMobile()\n\t\t\t# ios及手机上不需要为zoom放大功能额外计算\n\t\t\taccountZoomValue = Steedos.getAccountZoomValue()\n\t\t\tswitch accountZoomValue.name\n\t\t\t\twhen 'large'\n\t\t\t\t\t# 测下来这里不需要额外减数\n\t\t\t\t\treValue -= 50\n\t\t\t\twhen 'extra-large'\n\t\t\t\t\treValue -= 145\n\t\tif offset\n\t\t\treValue -= offset\n\t\treturn reValue + \"px\";\n\n\tSteedos.isiOS = (userAgent, language)->\n\t\tDEVICE =\n\t\t\tandroid: 'android'\n\t\t\tblackberry: 'blackberry'\n\t\t\tdesktop: 'desktop'\n\t\t\tipad: 'ipad'\n\t\t\tiphone: 'iphone'\n\t\t\tipod: 'ipod'\n\t\t\tmobile: 'mobile'\n\t\tbrowser = {}\n\t\tconExp = '(?:[\\\\/:\\\\::\\\\s:;])'\n\t\tnumExp = '(\\\\S+[^\\\\s:;:\\\\)]|)'\n\t\tuserAgent = (userAgent or navigator.userAgent).toLowerCase()\n\t\tlanguage = language or navigator.language or navigator.browserLanguage\n\t\tdevice = userAgent.match(new RegExp('(android|ipad|iphone|ipod|blackberry)')) or userAgent.match(new RegExp('(mobile)')) or [\n\t\t\t''\n\t\t\tDEVICE.desktop\n\t\t]\n\t\tbrowser.device = device[1]\n\t\treturn browser.device == DEVICE.ipad or browser.device == DEVICE.iphone or browser.device == DEVICE.ipod\n\n\tSteedos.getUserOrganizations = (isIncludeParents)->\n\t\tuserId = Meteor.userId()\n\t\tspaceId = Steedos.spaceId()\n\t\tspace_user = db.space_users.findOne({user:userId,space:spaceId},fields:{organizations:1})\n\t\torganizations = space_user?.organizations\n\t\tunless organizations\n\t\t\treturn []\n\t\tif isIncludeParents\n\t\t\tparents = _.flatten db.organizations.find(_id:{$in:organizations}).fetch().getProperty(\"parents\")\n\t\t\treturn _.union organizations,parents\n\t\telse\n\t\t\treturn organizations\n\n\tSteedos.forbidNodeContextmenu = (target, ifr)->\n\t\tunless Steedos.isNode()\n\t\t\treturn\n\t\ttarget.document.body.addEventListener 'contextmenu', (ev) ->\n\t\t\tev.preventDefault()\n\t\t\treturn false\n\t\tif ifr\n\t\t\tif typeof ifr == 'string'\n\t\t\t\tifr = target.$(ifr)\n\t\t\tifr.load ->\n\t\t\t\tifrBody = ifr.contents().find('body')\n\t\t\t\tif ifrBody\n\t\t\t\t\tifrBody[0].addEventListener 'contextmenu', (ev) ->\n\t\t\t\t\t\tev.preventDefault()\n\t\t\t\t\t\treturn false\n\nif Meteor.isServer\n\tSteedos.getUserOrganizations = (spaceId,userId,isIncludeParents)->\n\t\tspace_user = db.space_users.findOne({user:userId,space:spaceId},fields:{organizations:1})\n\t\torganizations = space_user?.organizations\n\t\tunless organizations\n\t\t\treturn []\n\t\tif isIncludeParents\n\t\t\tparents = _.flatten db.organizations.find(_id:{$in:organizations}).fetch().getProperty(\"parents\")\n\t\t\treturn _.union organizations,parents\n\t\telse\n\t\t\treturn organizations\n\n#\tSteedos.chargeAPIcheck = (spaceId)->\n\nif Meteor.isServer\n\tCookies = require(\"cookies\")\n\t#TODO 添加服务端是否手机的判断(依据request)\n\tSteedos.isMobile = ()->\n\t\treturn false;\n\n\tSteedos.isSpaceAdmin = (spaceId, userId)->\n\t\tif !spaceId || !userId\n\t\t\treturn false\n\t\tspace = db.spaces.findOne(spaceId)\n\t\tif !space || !space.admins\n\t\t\treturn false;\n\t\treturn space.admins.indexOf(userId)>=0\n\n\tSteedos.isLegalVersion = (spaceId,app_version)->\n\t\tif !spaceId\n\t\t\treturn false\n\t\tcheck = false\n\t\tmodules = db.spaces.findOne(spaceId)?.modules\n\t\tif modules and modules.includes(app_version)\n\t\t\tcheck = true\n\t\treturn check\n\n\t# 判断数组orgIds中的org id集合对于用户userId是否有组织管理员权限,只要数组orgIds中任何一个组织有权限就返回true,反之返回false\n\tSteedos.isOrgAdminByOrgIds = (orgIds, userId)->\n\t\tisOrgAdmin = false\n\t\tuseOrgs = db.organizations.find({_id: {$in:orgIds}},{fields:{parents:1,admins:1}}).fetch()\n\t\tparents = []\n\t\tallowAccessOrgs = useOrgs.filter (org) ->\n\t\t\tif org.parents\n\t\t\t\tparents = _.union parents,org.parents\n\t\t\treturn org.admins?.includes(userId)\n\t\tif allowAccessOrgs.length\n\t\t\tisOrgAdmin = true\n\t\telse\n\t\t\tparents = _.flatten parents\n\t\t\tparents = _.uniq parents\n\t\t\tif parents.length and db.organizations.findOne({_id:{$in:parents}, admins:userId})\n\t\t\t\tisOrgAdmin = true\n\t\treturn isOrgAdmin\n\n\n\t# 判断数组orgIds中的org id集合对于用户userId是否有全部组织管理员权限,只有数组orgIds中每个组织都有权限才返回true,反之返回false\n\tSteedos.isOrgAdminByAllOrgIds = (orgIds, userId)->\n\t\tunless orgIds.length\n\t\t\treturn true\n\t\ti = 0\n\t\twhile i < orgIds.length\n\t\t\tisOrgAdmin = Steedos.isOrgAdminByOrgIds [orgIds[i]], userId\n\t\t\tunless isOrgAdmin\n\t\t\t\tbreak\n\t\t\ti++\n\t\treturn isOrgAdmin\n\n\tSteedos.absoluteUrl = (url)->\n\t\tif url\n\t\t\t# url以\"/\"开头的话,去掉开头的\"/\"\n\t\t\turl = url.replace(/^\\//,\"\")\n\t\tif (Meteor.isCordova)\n\t\t\treturn Meteor.absoluteUrl(url);\n\t\telse\n\t\t\tif Meteor.isClient\n\t\t\t\ttry\n\t\t\t\t\troot_url = new URL(Meteor.absoluteUrl())\n\t\t\t\t\tif url\n\t\t\t\t\t\treturn root_url.pathname + url\n\t\t\t\t\telse\n\t\t\t\t\t\treturn root_url.pathname\n\t\t\t\tcatch e\n\t\t\t\t\treturn Meteor.absoluteUrl(url)\n\t\t\telse\n\t\t\t\tMeteor.absoluteUrl(url)\n\n\t#\t通过request.headers、cookie 获得有效用户\n\tSteedos.getAPILoginUser\t= (req, res) ->\n\n\t\tusername = req.query?.username\n\n\t\tpassword = req.query?.password\n\n\t\tif username && password\n\t\t\tuser = db.users.findOne({steedos_id: username})\n\n\t\t\tif !user\n\t\t\t\treturn false\n\n\t\t\tresult = Accounts._checkPassword user, password\n\n\t\t\tif result.error\n\t\t\t\tthrow new Error(result.error)\n\t\t\telse\n\t\t\t\treturn user\n\n\t\tuserId = req.query?[\"X-User-Id\"]\n\n\t\tauthToken = req.query?[\"X-Auth-Token\"]\n\n\t\tif Steedos.checkAuthToken(userId,authToken)\n\t\t\treturn db.users.findOne({_id: userId})\n\n\t\tcookies = new Cookies(req, res);\n\n\t\tif req.headers\n\t\t\tuserId = req.headers[\"x-user-id\"]\n\t\t\tauthToken = req.headers[\"x-auth-token\"]\n\n\t\t# then check cookie\n\t\tif !userId or !authToken\n\t\t\tuserId = cookies.get(\"X-User-Id\")\n\t\t\tauthToken = cookies.get(\"X-Auth-Token\")\n\n\t\tif !userId or !authToken\n\t\t\treturn false\n\n\t\tif Steedos.checkAuthToken(userId, authToken)\n\t\t\treturn db.users.findOne({_id: userId})\n\n\t\treturn false\n\n\t#\t检查userId、authToken是否有效\n\tSteedos.checkAuthToken = (userId, authToken) ->\n\t\tif userId and authToken\n\t\t\thashedToken = Accounts._hashLoginToken(authToken)\n\t\t\tuser = Meteor.users.findOne\n\t\t\t\t_id: userId,\n\t\t\t\t\"services.resume.loginTokens.hashedToken\": hashedToken\n\t\t\tif user\n\t\t\t\treturn true\n\t\t\telse\n\t\t\t\treturn false\n\t\treturn false\n\n\nif Meteor.isServer\n\tcrypto = require('crypto');\n\tSteedos.decrypt = (password, key, iv)->\n\t\ttry\n\t\t\tkey32 = \"\"\n\t\t\tlen = key.length\n\t\t\tif len < 32\n\t\t\t\tc = \"\"\n\t\t\t\ti = 0\n\t\t\t\tm = 32 - len\n\t\t\t\twhile i < m\n\t\t\t\t\tc = \" \" + c\n\t\t\t\t\ti++\n\t\t\t\tkey32 = key + c\n\t\t\telse if len >= 32\n\t\t\t\tkey32 = key.slice(0, 32)\n\n\t\t\tdecipher = crypto.createDecipheriv('aes-256-cbc', new Buffer(key32, 'utf8'), new Buffer(iv, 'utf8'))\n\n\t\t\tdecipherMsg = Buffer.concat([decipher.update(password, 'base64'), decipher.final()])\n\n\t\t\tpassword = decipherMsg.toString();\n\t\t\treturn password;\n\t\tcatch e\n\t\t\treturn password;\n\n\tSteedos.encrypt = (password, key, iv)->\n\t\tkey32 = \"\"\n\t\tlen = key.length\n\t\tif len < 32\n\t\t\tc = \"\"\n\t\t\ti = 0\n\t\t\tm = 32 - len\n\t\t\twhile i < m\n\t\t\t\tc = \" \" + c\n\t\t\t\ti++\n\t\t\tkey32 = key + c\n\t\telse if len >= 32\n\t\t\tkey32 = key.slice(0, 32)\n\n\t\tcipher = crypto.createCipheriv('aes-256-cbc', new Buffer(key32, 'utf8'), new Buffer(iv, 'utf8'))\n\n\t\tcipheredMsg = Buffer.concat([cipher.update(new Buffer(password, 'utf8')), cipher.final()])\n\n\t\tpassword = cipheredMsg.toString('base64')\n\n\t\treturn password;\n\n\tSteedos.getUserIdFromAccessToken = (access_token)->\n\n\t\tif !access_token\n\t\t\treturn null;\n\n\t\tuserId = access_token.split(\"-\")[0]\n\n\t\thashedToken = Accounts._hashLoginToken(access_token)\n\n\t\tuser = db.users.findOne({_id: userId, \"secrets.hashedToken\": hashedToken})\n\n\t\tif user\n\t\t\treturn userId\n\t\telse\n\t\t\t# 如果user表未查到,则使用oauth2协议生成的token查找用户\n\t\t\tcollection = oAuth2Server.collections.accessToken\n\n\t\t\tobj = collection.findOne({'accessToken': access_token})\n\t\t\tif obj\n\t\t\t\t# 判断token的有效期\n\t\t\t\tif obj?.expires < new Date()\n\t\t\t\t\treturn \"oauth2 access token:\"+access_token+\" is expired.\"\n\t\t\t\telse\n\t\t\t\t\treturn obj?.userId\n\t\t\telse\n\t\t\t\treturn \"oauth2 access token:\"+access_token+\" is not found.\"\n\t\treturn null\n\n\tSteedos.getUserIdFromAuthToken = (req, res)->\n\n\t\tuserId = req.query?[\"X-User-Id\"]\n\n\t\tauthToken = req.query?[\"X-Auth-Token\"]\n\n\t\tif Steedos.checkAuthToken(userId,authToken)\n\t\t\treturn db.users.findOne({_id: userId})?._id\n\n\t\tcookies = new Cookies(req, res);\n\n\t\tif req.headers\n\t\t\tuserId = req.headers[\"x-user-id\"]\n\t\t\tauthToken = req.headers[\"x-auth-token\"]\n\n\t\t# then check cookie\n\t\tif !userId or !authToken\n\t\t\tuserId = cookies.get(\"X-User-Id\")\n\t\t\tauthToken = cookies.get(\"X-Auth-Token\")\n\n\t\tif !userId or !authToken\n\t\t\treturn null\n\n\t\tif Steedos.checkAuthToken(userId, authToken)\n\t\t\treturn db.users.findOne({_id: userId})?._id\n\n\tSteedos.APIAuthenticationCheck = (req, res) ->\n\t\ttry\n\t\t\tuserId = req.userId\n\n\t\t\tuser = db.users.findOne({_id: userId})\n\n\t\t\tif !userId || !user\n\t\t\t\tJsonRoutes.sendResult res,\n\t\t\t\t\tdata:\n\t\t\t\t\t\t\"error\": \"Validate Request -- Missing X-Auth-Token,X-User-Id Or access_token\",\n\t\t\t\t\tcode: 401,\n\t\t\t\treturn false;\n\t\t\telse\n\t\t\t\treturn true;\n\t\tcatch e\n\t\t\tif !userId || !user\n\t\t\t\tJsonRoutes.sendResult res,\n\t\t\t\t\tcode: 401,\n\t\t\t\t\tdata:\n\t\t\t\t\t\t\"error\": e.message,\n\t\t\t\t\t\t\"success\": false\n\t\t\t\treturn false;\n\n\n# This will add underscore.string methods to Underscore.js\n# except for include, contains, reverse and join that are\n# dropped because they collide with the functions already\n# defined by Underscore.js.\n\nmixin = (obj) ->\n\t_.each _.functions(obj), (name) ->\n\t\tif not _[name] and not _.prototype[name]?\n\t\t\tfunc = _[name] = obj[name]\n\t\t\t_.prototype[name] = ->\n\t\t\t\targs = [this._wrapped]\n\t\t\t\tpush.apply(args, arguments)\n\t\t\t\treturn result.call(this, func.apply(_, args))\n\n#mixin(_s.exports())\n\nif Meteor.isServer\n# 判断是否是节假日\n\tSteedos.isHoliday = (date)->\n\t\tif !date\n\t\t\tdate = new Date\n\t\tcheck date, Date\n\t\tday = date.getDay()\n\t\t# 周六周日为假期\n\t\tif day is 6 or day is 0\n\t\t\treturn true\n\n\t\treturn false\n\t# 根据传入时间(date)计算几个工作日(days)后的时间,days目前只能是整数\n\tSteedos.caculateWorkingTime = (date, days)->\n\t\tcheck date, Date\n\t\tcheck days, Number\n\t\tparam_date = new Date date\n\t\tcaculateDate = (i, days)->\n\t\t\tif i < days\n\t\t\t\tparam_date = new Date(param_date.getTime() + 24*60*60*1000)\n\t\t\t\tif !Steedos.isHoliday(param_date)\n\t\t\t\t\ti++\n\t\t\t\tcaculateDate(i, days)\n\t\t\treturn\n\t\tcaculateDate(0, days)\n\t\treturn param_date\n\n\t# 计算半个工作日后的时间\n\t# 参数 next如果为true则表示只计算date时间后面紧接着的time_points\n\tSteedos.caculatePlusHalfWorkingDay = (date, next) ->\n\t\tcheck date, Date\n\t\ttime_points = Meteor.settings.remind?.time_points\n\t\tif not time_points or _.isEmpty(time_points)\n\t\t\tconsole.error \"time_points is null\"\n\t\t\ttime_points = [{\"hour\": 8, \"minute\": 30 }, {\"hour\": 14, \"minute\": 30 }]\n\n\t\tlen = time_points.length\n\t\tstart_date = new Date date\n\t\tend_date = new Date date\n\t\tstart_date.setHours time_points[0].hour\n\t\tstart_date.setMinutes time_points[0].minute\n\t\tend_date.setHours time_points[len - 1].hour\n\t\tend_date.setMinutes time_points[len - 1].minute\n\n\t\tcaculated_date = new Date date\n\n\t\tj = 0\n\t\tmax_index = len - 1\n\t\tif date < start_date\n\t\t\tif next\n\t\t\t\tj = 0\n\t\t\telse\n\t\t\t\t# 加半个time_points\n\t\t\t\tj = len/2\n\t\telse if date >= start_date and date < end_date\n\t\t\ti = 0\n\t\t\twhile i < max_index\n\t\t\t\tfirst_date = new Date date\n\t\t\t\tsecond_date = new Date date\n\t\t\t\tfirst_date.setHours time_points[i].hour\n\t\t\t\tfirst_date.setMinutes time_points[i].minute\n\t\t\t\tsecond_date.setHours time_points[i + 1].hour\n\t\t\t\tsecond_date.setMinutes time_points[i + 1].minute\n\n\t\t\t\tif date >= first_date and date < second_date\n\t\t\t\t\tbreak\n\n\t\t\t\ti++\n\n\t\t\tif next\n\t\t\t\tj = i + 1\n\t\t\telse\n\t\t\t\tj = i + len/2\n\n\t\telse if date >= end_date\n\t\t\tif next\n\t\t\t\tj = max_index + 1\n\t\t\telse\n\t\t\t\tj = max_index + len/2\n\n\t\tif j > max_index\n\t\t\t# 隔天需判断节假日\n\t\t\tcaculated_date = Steedos.caculateWorkingTime date, 1\n\t\t\tcaculated_date.setHours time_points[j - max_index - 1].hour\n\t\t\tcaculated_date.setMinutes time_points[j - max_index - 1].minute\n\t\telse if j <= max_index\n\t\t\tcaculated_date.setHours time_points[j].hour\n\t\t\tcaculated_date.setMinutes time_points[j].minute\n\n\t\treturn caculated_date\n\nif Meteor.isServer\n\t_.extend Steedos,\n\t\tgetSteedosToken: (appId, userId, authToken)->\n\t\t\tcrypto = require('crypto')\n\t\t\tapp = db.apps.findOne(appId)\n\t\t\tif app\n\t\t\t\tsecret = app.secret\n\n\t\t\tif userId and authToken\n\t\t\t\thashedToken = Accounts._hashLoginToken(authToken)\n\t\t\t\tuser = Meteor.users.findOne\n\t\t\t\t\t_id: userId,\n\t\t\t\t\t\"services.resume.loginTokens.hashedToken\": hashedToken\n\t\t\t\tif user\n\t\t\t\t\tsteedos_id = user.steedos_id\n\t\t\t\t\tif app.secret\n\t\t\t\t\t\tiv = app.secret\n\t\t\t\t\telse\n\t\t\t\t\t\tiv = \"-8762-fcb369b2e8\"\n\t\t\t\t\tnow = parseInt(new Date().getTime()/1000).toString()\n\t\t\t\t\tkey32 = \"\"\n\t\t\t\t\tlen = steedos_id.length\n\t\t\t\t\tif len < 32\n\t\t\t\t\t\tc = \"\"\n\t\t\t\t\t\ti = 0\n\t\t\t\t\t\tm = 32 - len\n\t\t\t\t\t\twhile i < m\n\t\t\t\t\t\t\tc = \" \" + c\n\t\t\t\t\t\t\ti++\n\t\t\t\t\t\tkey32 = steedos_id + c\n\t\t\t\t\telse if len >= 32\n\t\t\t\t\t\tkey32 = steedos_id.slice(0,32)\n\n\t\t\t\t\tcipher = crypto.createCipheriv('aes-256-cbc', new Buffer(key32, 'utf8'), new Buffer(iv, 'utf8'))\n\n\t\t\t\t\tcipheredMsg = Buffer.concat([cipher.update(new Buffer(now, 'utf8')), cipher.final()])\n\n\t\t\t\t\tsteedos_token = cipheredMsg.toString('base64')\n\n\t\t\treturn steedos_token\n\n\t\tlocale: (userId, isI18n)->\n\t\t\tuser = db.users.findOne({_id:userId},{fields: {locale: 1}})\n\t\t\tlocale = user?.locale\n\t\t\tif isI18n\n\t\t\t\tif locale == \"en-us\"\n\t\t\t\t\tlocale = \"en\"\n\t\t\t\tif locale == \"zh-cn\"\n\t\t\t\t\tlocale = \"zh-CN\"\n\t\t\treturn locale\n\n\t\tcheckUsernameAvailability: (username) ->\n\t\t\treturn not Meteor.users.findOne({ username: { $regex : new RegExp(\"^\" + Meteor._escapeRegExp(username).trim() + \"$\", \"i\") } })\n\n\n\t\tvalidatePassword: (pwd)->\n\t\t\treason = t \"password_invalid\"\n\t\t\tvalid = true\n\t\t\tunless pwd\n\t\t\t\tvalid = false\n\n\t\t\tpassworPolicy = Meteor.settings.public?.password?.policy\n\t\t\tpassworPolicyError = Meteor.settings.public?.password?.policyError\n\t\t\tif passworPolicy\n\t\t\t\tif !(new RegExp(passworPolicy)).test(pwd || '')\n\t\t\t\t\treason = passworPolicyError\n\t\t\t\t\tvalid = false\n\t\t\t\telse\n\t\t\t\t\tvalid = true\n#\t\t\telse\n#\t\t\t\tunless /\\d+/.test(pwd)\n#\t\t\t\t\tvalid = false\n#\t\t\t\tunless /[a-zA-Z]+/.test(pwd)\n#\t\t\t\t\tvalid = false\n#\t\t\t\tif pwd.length < 8\n#\t\t\t\t\tvalid = false\n\t\t\tif valid\n\t\t\t\treturn true\n\t\t\telse\n\t\t\t\treturn error:\n\t\t\t\t\treason: reason\n\nSteedos.convertSpecialCharacter = (str)->\n\treturn str.replace(/([\\^\\$\\(\\)\\*\\+\\?\\.\\\\\\|\\[\\]\\{\\}])/g, \"\\\\$1\")\n\nSteedos.removeSpecialCharacter = (str)->\n\treturn str.replace(/([\\^\\$\\(\\)\\*\\+\\?\\.\\\\\\|\\[\\]\\{\\}\\~\\`\\@\\#\\%\\&\\=\\'\\\"\\:\\;\\<\\>\\,\\/])/g, \"\")\n\nCreator.getDBApps = (space_id)->\n\tdbApps = {}\n\tCreator.Collections[\"apps\"].find({space: space_id,is_creator:true,visible:true}, {\n\t\tfields: {\n\t\t\tcreated: 0,\n\t\t\tcreated_by: 0,\n\t\t\tmodified: 0,\n\t\t\tmodified_by: 0\n\t\t}\n\t}).forEach (app)->\n\t\tdbApps[app._id] = app\n\n\treturn dbApps\n\nCreator.getDBDashboards = (space_id)->\n\tdbDashboards = {}\n\tCreator.Collections[\"dashboard\"].find({space: space_id}, {\n\t\tfields: {\n\t\t\tcreated: 0,\n\t\t\tcreated_by: 0,\n\t\t\tmodified: 0,\n\t\t\tmodified_by: 0\n\t\t}\n\t}).forEach (dashboard)->\n\t\tdbDashboards[dashboard._id] = dashboard\n\n\treturn dbDashboards\n\nif Meteor.isServer\n\tCookies = require(\"cookies\")\n\tSteedos.getAuthToken = (req, res)->\n\t\tcookies = new Cookies(req, res)\n\t\tauthToken = req.headers['x-auth-token'] || cookies.get(\"X-Auth-Token\")\n\t\tif !authToken && req.headers.authorization && req.headers.authorization.split(' ')[0] == 'Bearer'\n\t\t\tauthToken = req.headers.authorization.split(' ')[1]\n\t\treturn authToken\n\nif Meteor.isClient\n\tMeteor.autorun ()->\n\t\tif Session.get('current_app_id')\n\t\t\tsessionStorage.setItem('current_app_id', Session.get('current_app_id'))\n#\t\telse\n#\t\t\tconsole.log('remove current_app_id...');\n#\t\t\tsessionStorage.removeItem('current_app_id')\n\tSteedos.getCurrentAppId = ()->\n\t\tif Session.get('app_id')\n\t\t\treturn Session.get('app_id')\n\t\telse\n\t\t\treturn sessionStorage.getItem('current_app_id');\n\nif Meteor.isServer\n\tSteedos.formatIndex = (array) ->\n\t\tobject = {\n \tbackground: true\n \t};\n\t\tisdocumentDB = Meteor.settings?.datasources?.default?.documentDB || false;\n\t\tif isdocumentDB\n\t\t\tif array.length > 0\n\t\t\t\tindexName = array.join(\".\");\n\t\t\t\tobject.name = indexName;\n\t\t\t\t\n\t\t\t\tif (indexName.length > 52)\n\t\t\t\t\tobject.name = indexName.substring(0,52);\n\n\t\treturn object;","var Cookies, crypto, mixin, ref, ref1, ref2, ref3, ref4, rootUrl; \n\nSteedos = {\n settings: {},\n db: db,\n subs: {},\n isPhoneEnabled: function() {\n var ref, ref1;\n return !!((ref = Meteor.settings) != null ? (ref1 = ref[\"public\"]) != null ? ref1.phone : void 0 : void 0);\n },\n numberToString: function(number, scale, notThousands) {\n var ref, ref1, reg;\n if (typeof number === \"number\") {\n number = number.toString();\n }\n if (!number) {\n return '';\n }\n if (number !== \"NaN\") {\n if (scale || scale === 0) {\n number = Number(number).toFixed(scale);\n }\n if (!notThousands) {\n if (!(scale || scale === 0)) {\n scale = (ref = number.match(/\\.(\\d+)/)) != null ? (ref1 = ref[1]) != null ? ref1.length : void 0 : void 0;\n if (!scale) {\n scale = 0;\n }\n }\n reg = /(\\d)(?=(\\d{3})+\\.)/g;\n if (scale === 0) {\n reg = /(\\d)(?=(\\d{3})+\\b)/g;\n }\n number = number.replace(reg, '$1,');\n }\n return number;\n } else {\n return \"\";\n }\n },\n valiJquerySymbols: function(str) {\n var reg;\n reg = new RegExp(\"^[^!\\\"#$%&'()*\\+,\\.\\/:;<=>?@[\\\\]^`{|}~]+$\");\n return reg.test(str);\n }\n};\n\n\n/*\n * Kick off the global namespace for Steedos.\n * @namespace Steedos\n */\n\nif (Meteor.isCordova || Meteor.isClient) {\n rootUrl = Meteor.absoluteUrl.defaultOptions.rootUrl;\n if (rootUrl.endsWith('/')) {\n rootUrl = rootUrl.substr(0, rootUrl.length - 1);\n }\n if ((ref = window.stores) != null) {\n if ((ref1 = ref.API) != null) {\n if ((ref2 = ref1.client) != null) {\n ref2.setUrl = rootUrl;\n }\n }\n }\n if ((ref3 = window.stores) != null) {\n if ((ref4 = ref3.Settings) != null) {\n ref4.setRootUrl(rootUrl);\n }\n }\n window['steedos.setting'] = {\n rootUrl: rootUrl\n };\n}\n\nif (Meteor.isClient) {\n Meteor.autorun(function() {\n var ref5, ref6, ref7, ref8;\n if ((ref5 = window.stores) != null) {\n if ((ref6 = ref5.Settings) != null) {\n ref6.setUserId(Steedos.userId());\n }\n }\n return (ref7 = window.stores) != null ? (ref8 = ref7.Settings) != null ? ref8.setTenantId(Steedos.spaceId()) : void 0 : void 0;\n });\n}\n\nSteedos.getHelpUrl = function(locale) {\n var country;\n country = locale.substring(3);\n return \"http://www.steedos.com/\" + country + \"/help/\";\n};\n\nif (Meteor.isClient) {\n Steedos.spaceUpgradedModal = function() {\n return swal({\n title: TAPi18n.__(\"space_paid_info_title\"),\n text: TAPi18n.__(\"space_paid_info_text\"),\n html: true,\n type: \"warning\",\n confirmButtonText: TAPi18n.__(\"OK\")\n });\n };\n Steedos.getAccountBgBodyValue = function() {\n var accountBgBody;\n accountBgBody = db.steedos_keyvalues.findOne({\n user: Steedos.userId(),\n key: \"bg_body\"\n });\n if (accountBgBody) {\n return accountBgBody.value;\n } else {\n return {};\n }\n };\n Steedos.applyAccountBgBodyValue = function(accountBgBodyValue, isNeedToLocal) {\n var avatar, url;\n if (Meteor.loggingIn() || !Steedos.userId()) {\n accountBgBodyValue = {};\n accountBgBodyValue.url = localStorage.getItem(\"accountBgBodyValue.url\");\n accountBgBodyValue.avatar = localStorage.getItem(\"accountBgBodyValue.avatar\");\n }\n url = accountBgBodyValue.url;\n avatar = accountBgBodyValue.avatar;\n if (isNeedToLocal) {\n if (Meteor.loggingIn()) {\n return;\n }\n if (Steedos.userId()) {\n if (url) {\n localStorage.setItem(\"accountBgBodyValue.url\", url);\n return localStorage.setItem(\"accountBgBodyValue.avatar\", avatar);\n } else {\n localStorage.removeItem(\"accountBgBodyValue.url\");\n return localStorage.removeItem(\"accountBgBodyValue.avatar\");\n }\n }\n }\n };\n Steedos.getAccountSkinValue = function() {\n var accountSkin;\n accountSkin = db.steedos_keyvalues.findOne({\n user: Steedos.userId(),\n key: \"skin\"\n });\n if (accountSkin) {\n return accountSkin.value;\n } else {\n return {};\n }\n };\n Steedos.getAccountZoomValue = function() {\n var accountZoom;\n accountZoom = db.steedos_keyvalues.findOne({\n user: Steedos.userId(),\n key: \"zoom\"\n });\n if (accountZoom) {\n return accountZoom.value;\n } else {\n return {};\n }\n };\n Steedos.applyAccountZoomValue = function(accountZoomValue, isNeedToLocal) {\n var zoomName, zoomSize;\n if (Meteor.loggingIn() || !Steedos.userId()) {\n accountZoomValue = {};\n accountZoomValue.name = localStorage.getItem(\"accountZoomValue.name\");\n accountZoomValue.size = localStorage.getItem(\"accountZoomValue.size\");\n }\n $(\"body\").removeClass(\"zoom-normal\").removeClass(\"zoom-large\").removeClass(\"zoom-extra-large\");\n zoomName = accountZoomValue.name;\n zoomSize = accountZoomValue.size;\n if (!zoomName) {\n zoomName = \"large\";\n zoomSize = 1.2;\n }\n if (zoomName && !Session.get(\"instancePrint\")) {\n $(\"body\").addClass(\"zoom-\" + zoomName);\n }\n if (isNeedToLocal) {\n if (Meteor.loggingIn()) {\n return;\n }\n if (Steedos.userId()) {\n if (accountZoomValue.name) {\n localStorage.setItem(\"accountZoomValue.name\", accountZoomValue.name);\n return localStorage.setItem(\"accountZoomValue.size\", accountZoomValue.size);\n } else {\n localStorage.removeItem(\"accountZoomValue.name\");\n return localStorage.removeItem(\"accountZoomValue.size\");\n }\n }\n }\n };\n Steedos.showHelp = function(url) {\n var country, locale;\n locale = Steedos.getLocale();\n country = locale.substring(3);\n url = url || \"http://www.steedos.com/\" + country + \"/help/\";\n return window.open(url, '_help', 'EnableViewPortScale=yes');\n };\n Steedos.getUrlWithToken = function(url) {\n var authToken, linker;\n authToken = {};\n authToken[\"spaceId\"] = Steedos.getSpaceId();\n authToken[\"X-User-Id\"] = Meteor.userId();\n authToken[\"X-Auth-Token\"] = Accounts._storedLoginToken();\n linker = \"?\";\n if (url.indexOf(\"?\") > -1) {\n linker = \"&\";\n }\n return url + linker + $.param(authToken);\n };\n Steedos.getAppUrlWithToken = function(app_id) {\n var authToken;\n authToken = {};\n authToken[\"spaceId\"] = Steedos.getSpaceId();\n authToken[\"X-User-Id\"] = Meteor.userId();\n authToken[\"X-Auth-Token\"] = Accounts._storedLoginToken();\n return \"api/setup/sso/\" + app_id + \"?\" + $.param(authToken);\n };\n Steedos.openAppWithToken = function(app_id) {\n var app, url;\n url = Steedos.getAppUrlWithToken(app_id);\n url = Steedos.absoluteUrl(url);\n app = db.apps.findOne(app_id);\n if (!app.is_new_window && !Steedos.isMobile() && !Steedos.isCordova()) {\n return window.location = url;\n } else {\n return Steedos.openWindow(url);\n }\n };\n Steedos.openUrlWithIE = function(url) {\n var cmd, exec, open_url;\n if (url) {\n if (Steedos.isNode()) {\n exec = nw.require('child_process').exec;\n open_url = url;\n cmd = \"start iexplore.exe \\\"\" + open_url + \"\\\"\";\n return exec(cmd, function(error, stdout, stderr) {\n if (error) {\n toastr.error(error);\n }\n });\n } else {\n return Steedos.openWindow(url);\n }\n }\n };\n Steedos.openApp = function(app_id) {\n var app, cmd, e, evalFunString, exec, on_click, open_url, path;\n if (!Meteor.userId()) {\n Steedos.redirectToSignIn();\n return true;\n }\n app = db.apps.findOne(app_id);\n if (!app) {\n FlowRouter.go(\"/\");\n return;\n }\n on_click = app.on_click;\n if (app.is_use_ie) {\n if (Steedos.isNode()) {\n exec = nw.require('child_process').exec;\n if (on_click) {\n path = \"api/app/sso/\" + app_id + \"?authToken=\" + (Accounts._storedLoginToken()) + \"&userId=\" + (Meteor.userId());\n open_url = window.location.origin + \"/\" + path;\n } else {\n open_url = Steedos.getAppUrlWithToken(app_id);\n open_url = window.location.origin + \"/\" + open_url;\n }\n cmd = \"start iexplore.exe \\\"\" + open_url + \"\\\"\";\n exec(cmd, function(error, stdout, stderr) {\n if (error) {\n toastr.error(error);\n }\n });\n } else {\n Steedos.openAppWithToken(app_id);\n }\n } else if (db.apps.isInternalApp(app.url)) {\n FlowRouter.go(app.url);\n } else if (app.is_use_iframe) {\n if (app.is_new_window && !Steedos.isMobile() && !Steedos.isCordova()) {\n Steedos.openWindow(Steedos.absoluteUrl(\"apps/iframe/\" + app._id));\n } else if (Steedos.isMobile() || Steedos.isCordova()) {\n Steedos.openAppWithToken(app_id);\n } else {\n FlowRouter.go(\"/apps/iframe/\" + app._id);\n }\n } else if (on_click) {\n evalFunString = \"(function(){\" + on_click + \"})()\";\n try {\n eval(evalFunString);\n } catch (error1) {\n e = error1;\n console.error(\"catch some error when eval the on_click script for app link:\");\n console.error(e.message + \"\\r\\n\" + e.stack);\n }\n } else {\n Steedos.openAppWithToken(app_id);\n }\n if (!app.is_new_window && !Steedos.isMobile() && !Steedos.isCordova() && !app.is_use_ie && !on_click) {\n return Session.set(\"current_app_id\", app_id);\n }\n };\n Steedos.checkSpaceBalance = function(spaceId) {\n var end_date, min_months, space;\n if (!spaceId) {\n spaceId = Steedos.spaceId();\n }\n min_months = 1;\n if (Steedos.isSpaceAdmin()) {\n min_months = 3;\n }\n space = db.spaces.findOne(spaceId);\n end_date = space != null ? space.end_date : void 0;\n if (space && Steedos.hasFeature('paid', space._id) && end_date !== void 0 && (end_date - new Date) <= (min_months * 30 * 24 * 3600 * 1000)) {\n return toastr.error(t(\"space_balance_insufficient\"));\n }\n };\n Steedos.setModalMaxHeight = function() {\n var accountZoomValue, offset;\n accountZoomValue = Steedos.getAccountZoomValue();\n if (!accountZoomValue.name) {\n accountZoomValue.name = 'large';\n }\n switch (accountZoomValue.name) {\n case 'normal':\n if (Steedos.isMobile()) {\n offset = -12;\n } else {\n offset = 75;\n }\n break;\n case 'large':\n if (Steedos.isMobile()) {\n offset = -6;\n } else {\n if (Steedos.detectIE()) {\n offset = 199;\n } else {\n offset = 9;\n }\n }\n break;\n case 'extra-large':\n if (Steedos.isMobile()) {\n offset = -26;\n } else {\n if (Steedos.detectIE()) {\n offset = 303;\n } else {\n offset = 53;\n }\n }\n }\n if ($(\".modal\").length) {\n return $(\".modal\").each(function() {\n var footerHeight, headerHeight, height, totalHeight;\n headerHeight = 0;\n footerHeight = 0;\n totalHeight = 0;\n $(\".modal-header\", $(this)).each(function() {\n return headerHeight += $(this).outerHeight(false);\n });\n $(\".modal-footer\", $(this)).each(function() {\n return footerHeight += $(this).outerHeight(false);\n });\n totalHeight = headerHeight + footerHeight;\n height = $(\"body\").innerHeight() - totalHeight - offset;\n if ($(this).hasClass(\"cf_contact_modal\")) {\n return $(\".modal-body\", $(this)).css({\n \"max-height\": height + \"px\",\n \"height\": height + \"px\"\n });\n } else {\n return $(\".modal-body\", $(this)).css({\n \"max-height\": height + \"px\",\n \"height\": \"auto\"\n });\n }\n });\n }\n };\n Steedos.getModalMaxHeight = function(offset) {\n var accountZoomValue, reValue;\n if (Steedos.isMobile()) {\n reValue = window.screen.height - 126 - 180 - 25;\n } else {\n reValue = $(window).height() - 180 - 25;\n }\n if (!(Steedos.isiOS() || Steedos.isMobile())) {\n accountZoomValue = Steedos.getAccountZoomValue();\n switch (accountZoomValue.name) {\n case 'large':\n reValue -= 50;\n break;\n case 'extra-large':\n reValue -= 145;\n }\n }\n if (offset) {\n reValue -= offset;\n }\n return reValue + \"px\";\n };\n Steedos.isiOS = function(userAgent, language) {\n var DEVICE, browser, conExp, device, numExp;\n DEVICE = {\n android: 'android',\n blackberry: 'blackberry',\n desktop: 'desktop',\n ipad: 'ipad',\n iphone: 'iphone',\n ipod: 'ipod',\n mobile: 'mobile'\n };\n browser = {};\n conExp = '(?:[\\\\/:\\\\::\\\\s:;])';\n numExp = '(\\\\S+[^\\\\s:;:\\\\)]|)';\n userAgent = (userAgent || navigator.userAgent).toLowerCase();\n language = language || navigator.language || navigator.browserLanguage;\n device = userAgent.match(new RegExp('(android|ipad|iphone|ipod|blackberry)')) || userAgent.match(new RegExp('(mobile)')) || ['', DEVICE.desktop];\n browser.device = device[1];\n return browser.device === DEVICE.ipad || browser.device === DEVICE.iphone || browser.device === DEVICE.ipod;\n };\n Steedos.getUserOrganizations = function(isIncludeParents) {\n var organizations, parents, spaceId, space_user, userId;\n userId = Meteor.userId();\n spaceId = Steedos.spaceId();\n space_user = db.space_users.findOne({\n user: userId,\n space: spaceId\n }, {\n fields: {\n organizations: 1\n }\n });\n organizations = space_user != null ? space_user.organizations : void 0;\n if (!organizations) {\n return [];\n }\n if (isIncludeParents) {\n parents = _.flatten(db.organizations.find({\n _id: {\n $in: organizations\n }\n }).fetch().getProperty(\"parents\"));\n return _.union(organizations, parents);\n } else {\n return organizations;\n }\n };\n Steedos.forbidNodeContextmenu = function(target, ifr) {\n if (!Steedos.isNode()) {\n return;\n }\n target.document.body.addEventListener('contextmenu', function(ev) {\n ev.preventDefault();\n return false;\n });\n if (ifr) {\n if (typeof ifr === 'string') {\n ifr = target.$(ifr);\n }\n return ifr.load(function() {\n var ifrBody;\n ifrBody = ifr.contents().find('body');\n if (ifrBody) {\n return ifrBody[0].addEventListener('contextmenu', function(ev) {\n ev.preventDefault();\n return false;\n });\n }\n });\n }\n };\n}\n\nif (Meteor.isServer) {\n Steedos.getUserOrganizations = function(spaceId, userId, isIncludeParents) {\n var organizations, parents, space_user;\n space_user = db.space_users.findOne({\n user: userId,\n space: spaceId\n }, {\n fields: {\n organizations: 1\n }\n });\n organizations = space_user != null ? space_user.organizations : void 0;\n if (!organizations) {\n return [];\n }\n if (isIncludeParents) {\n parents = _.flatten(db.organizations.find({\n _id: {\n $in: organizations\n }\n }).fetch().getProperty(\"parents\"));\n return _.union(organizations, parents);\n } else {\n return organizations;\n }\n };\n}\n\nif (Meteor.isServer) {\n Cookies = require(\"cookies\");\n Steedos.isMobile = function() {\n return false;\n };\n Steedos.isSpaceAdmin = function(spaceId, userId) {\n var space;\n if (!spaceId || !userId) {\n return false;\n }\n space = db.spaces.findOne(spaceId);\n if (!space || !space.admins) {\n return false;\n }\n return space.admins.indexOf(userId) >= 0;\n };\n Steedos.isLegalVersion = function(spaceId, app_version) {\n var check, modules, ref5;\n if (!spaceId) {\n return false;\n }\n check = false;\n modules = (ref5 = db.spaces.findOne(spaceId)) != null ? ref5.modules : void 0;\n if (modules && modules.includes(app_version)) {\n check = true;\n }\n return check;\n };\n Steedos.isOrgAdminByOrgIds = function(orgIds, userId) {\n var allowAccessOrgs, isOrgAdmin, parents, useOrgs;\n isOrgAdmin = false;\n useOrgs = db.organizations.find({\n _id: {\n $in: orgIds\n }\n }, {\n fields: {\n parents: 1,\n admins: 1\n }\n }).fetch();\n parents = [];\n allowAccessOrgs = useOrgs.filter(function(org) {\n var ref5;\n if (org.parents) {\n parents = _.union(parents, org.parents);\n }\n return (ref5 = org.admins) != null ? ref5.includes(userId) : void 0;\n });\n if (allowAccessOrgs.length) {\n isOrgAdmin = true;\n } else {\n parents = _.flatten(parents);\n parents = _.uniq(parents);\n if (parents.length && db.organizations.findOne({\n _id: {\n $in: parents\n },\n admins: userId\n })) {\n isOrgAdmin = true;\n }\n }\n return isOrgAdmin;\n };\n Steedos.isOrgAdminByAllOrgIds = function(orgIds, userId) {\n var i, isOrgAdmin;\n if (!orgIds.length) {\n return true;\n }\n i = 0;\n while (i < orgIds.length) {\n isOrgAdmin = Steedos.isOrgAdminByOrgIds([orgIds[i]], userId);\n if (!isOrgAdmin) {\n break;\n }\n i++;\n }\n return isOrgAdmin;\n };\n Steedos.absoluteUrl = function(url) {\n var e, root_url;\n if (url) {\n url = url.replace(/^\\//, \"\");\n }\n if (Meteor.isCordova) {\n return Meteor.absoluteUrl(url);\n } else {\n if (Meteor.isClient) {\n try {\n root_url = new URL(Meteor.absoluteUrl());\n if (url) {\n return root_url.pathname + url;\n } else {\n return root_url.pathname;\n }\n } catch (error1) {\n e = error1;\n return Meteor.absoluteUrl(url);\n }\n } else {\n return Meteor.absoluteUrl(url);\n }\n }\n };\n Steedos.getAPILoginUser = function(req, res) {\n var authToken, cookies, password, ref5, ref6, ref7, ref8, result, user, userId, username;\n username = (ref5 = req.query) != null ? ref5.username : void 0;\n password = (ref6 = req.query) != null ? ref6.password : void 0;\n if (username && password) {\n user = db.users.findOne({\n steedos_id: username\n });\n if (!user) {\n return false;\n }\n result = Accounts._checkPassword(user, password);\n if (result.error) {\n throw new Error(result.error);\n } else {\n return user;\n }\n }\n userId = (ref7 = req.query) != null ? ref7[\"X-User-Id\"] : void 0;\n authToken = (ref8 = req.query) != null ? ref8[\"X-Auth-Token\"] : void 0;\n if (Steedos.checkAuthToken(userId, authToken)) {\n return db.users.findOne({\n _id: userId\n });\n }\n cookies = new Cookies(req, res);\n if (req.headers) {\n userId = req.headers[\"x-user-id\"];\n authToken = req.headers[\"x-auth-token\"];\n }\n if (!userId || !authToken) {\n userId = cookies.get(\"X-User-Id\");\n authToken = cookies.get(\"X-Auth-Token\");\n }\n if (!userId || !authToken) {\n return false;\n }\n if (Steedos.checkAuthToken(userId, authToken)) {\n return db.users.findOne({\n _id: userId\n });\n }\n return false;\n };\n Steedos.checkAuthToken = function(userId, authToken) {\n var hashedToken, user;\n if (userId && authToken) {\n hashedToken = Accounts._hashLoginToken(authToken);\n user = Meteor.users.findOne({\n _id: userId,\n \"services.resume.loginTokens.hashedToken\": hashedToken\n });\n if (user) {\n return true;\n } else {\n return false;\n }\n }\n return false;\n };\n}\n\nif (Meteor.isServer) {\n crypto = require('crypto');\n Steedos.decrypt = function(password, key, iv) {\n var c, decipher, decipherMsg, e, i, key32, len, m;\n try {\n key32 = \"\";\n len = key.length;\n if (len < 32) {\n c = \"\";\n i = 0;\n m = 32 - len;\n while (i < m) {\n c = \" \" + c;\n i++;\n }\n key32 = key + c;\n } else if (len >= 32) {\n key32 = key.slice(0, 32);\n }\n decipher = crypto.createDecipheriv('aes-256-cbc', new Buffer(key32, 'utf8'), new Buffer(iv, 'utf8'));\n decipherMsg = Buffer.concat([decipher.update(password, 'base64'), decipher.final()]);\n password = decipherMsg.toString();\n return password;\n } catch (error1) {\n e = error1;\n return password;\n }\n };\n Steedos.encrypt = function(password, key, iv) {\n var c, cipher, cipheredMsg, i, key32, len, m;\n key32 = \"\";\n len = key.length;\n if (len < 32) {\n c = \"\";\n i = 0;\n m = 32 - len;\n while (i < m) {\n c = \" \" + c;\n i++;\n }\n key32 = key + c;\n } else if (len >= 32) {\n key32 = key.slice(0, 32);\n }\n cipher = crypto.createCipheriv('aes-256-cbc', new Buffer(key32, 'utf8'), new Buffer(iv, 'utf8'));\n cipheredMsg = Buffer.concat([cipher.update(new Buffer(password, 'utf8')), cipher.final()]);\n password = cipheredMsg.toString('base64');\n return password;\n };\n Steedos.getUserIdFromAccessToken = function(access_token) {\n var collection, hashedToken, obj, user, userId;\n if (!access_token) {\n return null;\n }\n userId = access_token.split(\"-\")[0];\n hashedToken = Accounts._hashLoginToken(access_token);\n user = db.users.findOne({\n _id: userId,\n \"secrets.hashedToken\": hashedToken\n });\n if (user) {\n return userId;\n } else {\n collection = oAuth2Server.collections.accessToken;\n obj = collection.findOne({\n 'accessToken': access_token\n });\n if (obj) {\n if ((obj != null ? obj.expires : void 0) < new Date()) {\n return \"oauth2 access token:\" + access_token + \" is expired.\";\n } else {\n return obj != null ? obj.userId : void 0;\n }\n } else {\n return \"oauth2 access token:\" + access_token + \" is not found.\";\n }\n }\n return null;\n };\n Steedos.getUserIdFromAuthToken = function(req, res) {\n var authToken, cookies, ref5, ref6, ref7, ref8, userId;\n userId = (ref5 = req.query) != null ? ref5[\"X-User-Id\"] : void 0;\n authToken = (ref6 = req.query) != null ? ref6[\"X-Auth-Token\"] : void 0;\n if (Steedos.checkAuthToken(userId, authToken)) {\n return (ref7 = db.users.findOne({\n _id: userId\n })) != null ? ref7._id : void 0;\n }\n cookies = new Cookies(req, res);\n if (req.headers) {\n userId = req.headers[\"x-user-id\"];\n authToken = req.headers[\"x-auth-token\"];\n }\n if (!userId || !authToken) {\n userId = cookies.get(\"X-User-Id\");\n authToken = cookies.get(\"X-Auth-Token\");\n }\n if (!userId || !authToken) {\n return null;\n }\n if (Steedos.checkAuthToken(userId, authToken)) {\n return (ref8 = db.users.findOne({\n _id: userId\n })) != null ? ref8._id : void 0;\n }\n };\n Steedos.APIAuthenticationCheck = function(req, res) {\n var e, user, userId;\n try {\n userId = req.userId;\n user = db.users.findOne({\n _id: userId\n });\n if (!userId || !user) {\n JsonRoutes.sendResult(res, {\n data: {\n \"error\": \"Validate Request -- Missing X-Auth-Token,X-User-Id Or access_token\"\n },\n code: 401\n });\n return false;\n } else {\n return true;\n }\n } catch (error1) {\n e = error1;\n if (!userId || !user) {\n JsonRoutes.sendResult(res, {\n code: 401,\n data: {\n \"error\": e.message,\n \"success\": false\n }\n });\n return false;\n }\n }\n };\n}\n\nmixin = function(obj) {\n return _.each(_.functions(obj), function(name) {\n var func;\n if (!_[name] && (_.prototype[name] == null)) {\n func = _[name] = obj[name];\n return _.prototype[name] = function() {\n var args;\n args = [this._wrapped];\n push.apply(args, arguments);\n return result.call(this, func.apply(_, args));\n };\n }\n });\n};\n\nif (Meteor.isServer) {\n Steedos.isHoliday = function(date) {\n var day;\n if (!date) {\n date = new Date;\n }\n check(date, Date);\n day = date.getDay();\n if (day === 6 || day === 0) {\n return true;\n }\n return false;\n };\n Steedos.caculateWorkingTime = function(date, days) {\n var caculateDate, param_date;\n check(date, Date);\n check(days, Number);\n param_date = new Date(date);\n caculateDate = function(i, days) {\n if (i < days) {\n param_date = new Date(param_date.getTime() + 24 * 60 * 60 * 1000);\n if (!Steedos.isHoliday(param_date)) {\n i++;\n }\n caculateDate(i, days);\n }\n };\n caculateDate(0, days);\n return param_date;\n };\n Steedos.caculatePlusHalfWorkingDay = function(date, next) {\n var caculated_date, end_date, first_date, i, j, len, max_index, ref5, second_date, start_date, time_points;\n check(date, Date);\n time_points = (ref5 = Meteor.settings.remind) != null ? ref5.time_points : void 0;\n if (!time_points || _.isEmpty(time_points)) {\n console.error(\"time_points is null\");\n time_points = [\n {\n \"hour\": 8,\n \"minute\": 30\n }, {\n \"hour\": 14,\n \"minute\": 30\n }\n ];\n }\n len = time_points.length;\n start_date = new Date(date);\n end_date = new Date(date);\n start_date.setHours(time_points[0].hour);\n start_date.setMinutes(time_points[0].minute);\n end_date.setHours(time_points[len - 1].hour);\n end_date.setMinutes(time_points[len - 1].minute);\n caculated_date = new Date(date);\n j = 0;\n max_index = len - 1;\n if (date < start_date) {\n if (next) {\n j = 0;\n } else {\n j = len / 2;\n }\n } else if (date >= start_date && date < end_date) {\n i = 0;\n while (i < max_index) {\n first_date = new Date(date);\n second_date = new Date(date);\n first_date.setHours(time_points[i].hour);\n first_date.setMinutes(time_points[i].minute);\n second_date.setHours(time_points[i + 1].hour);\n second_date.setMinutes(time_points[i + 1].minute);\n if (date >= first_date && date < second_date) {\n break;\n }\n i++;\n }\n if (next) {\n j = i + 1;\n } else {\n j = i + len / 2;\n }\n } else if (date >= end_date) {\n if (next) {\n j = max_index + 1;\n } else {\n j = max_index + len / 2;\n }\n }\n if (j > max_index) {\n caculated_date = Steedos.caculateWorkingTime(date, 1);\n caculated_date.setHours(time_points[j - max_index - 1].hour);\n caculated_date.setMinutes(time_points[j - max_index - 1].minute);\n } else if (j <= max_index) {\n caculated_date.setHours(time_points[j].hour);\n caculated_date.setMinutes(time_points[j].minute);\n }\n return caculated_date;\n };\n}\n\nif (Meteor.isServer) {\n _.extend(Steedos, {\n getSteedosToken: function(appId, userId, authToken) {\n var app, c, cipher, cipheredMsg, hashedToken, i, iv, key32, len, m, now, secret, steedos_id, steedos_token, user;\n crypto = require('crypto');\n app = db.apps.findOne(appId);\n if (app) {\n secret = app.secret;\n }\n if (userId && authToken) {\n hashedToken = Accounts._hashLoginToken(authToken);\n user = Meteor.users.findOne({\n _id: userId,\n \"services.resume.loginTokens.hashedToken\": hashedToken\n });\n if (user) {\n steedos_id = user.steedos_id;\n if (app.secret) {\n iv = app.secret;\n } else {\n iv = \"-8762-fcb369b2e8\";\n }\n now = parseInt(new Date().getTime() / 1000).toString();\n key32 = \"\";\n len = steedos_id.length;\n if (len < 32) {\n c = \"\";\n i = 0;\n m = 32 - len;\n while (i < m) {\n c = \" \" + c;\n i++;\n }\n key32 = steedos_id + c;\n } else if (len >= 32) {\n key32 = steedos_id.slice(0, 32);\n }\n cipher = crypto.createCipheriv('aes-256-cbc', new Buffer(key32, 'utf8'), new Buffer(iv, 'utf8'));\n cipheredMsg = Buffer.concat([cipher.update(new Buffer(now, 'utf8')), cipher.final()]);\n steedos_token = cipheredMsg.toString('base64');\n }\n }\n return steedos_token;\n },\n locale: function(userId, isI18n) {\n var locale, user;\n user = db.users.findOne({\n _id: userId\n }, {\n fields: {\n locale: 1\n }\n });\n locale = user != null ? user.locale : void 0;\n if (isI18n) {\n if (locale === \"en-us\") {\n locale = \"en\";\n }\n if (locale === \"zh-cn\") {\n locale = \"zh-CN\";\n }\n }\n return locale;\n },\n checkUsernameAvailability: function(username) {\n return !Meteor.users.findOne({\n username: {\n $regex: new RegExp(\"^\" + Meteor._escapeRegExp(username).trim() + \"$\", \"i\")\n }\n });\n },\n validatePassword: function(pwd) {\n var passworPolicy, passworPolicyError, reason, ref5, ref6, ref7, ref8, valid;\n reason = t(\"password_invalid\");\n valid = true;\n if (!pwd) {\n valid = false;\n }\n passworPolicy = (ref5 = Meteor.settings[\"public\"]) != null ? (ref6 = ref5.password) != null ? ref6.policy : void 0 : void 0;\n passworPolicyError = (ref7 = Meteor.settings[\"public\"]) != null ? (ref8 = ref7.password) != null ? ref8.policyError : void 0 : void 0;\n if (passworPolicy) {\n if (!(new RegExp(passworPolicy)).test(pwd || '')) {\n reason = passworPolicyError;\n valid = false;\n } else {\n valid = true;\n }\n }\n if (valid) {\n return true;\n } else {\n return {\n error: {\n reason: reason\n }\n };\n }\n }\n });\n}\n\nSteedos.convertSpecialCharacter = function(str) {\n return str.replace(/([\\^\\$\\(\\)\\*\\+\\?\\.\\\\\\|\\[\\]\\{\\}])/g, \"\\\\$1\");\n};\n\nSteedos.removeSpecialCharacter = function(str) {\n return str.replace(/([\\^\\$\\(\\)\\*\\+\\?\\.\\\\\\|\\[\\]\\{\\}\\~\\`\\@\\#\\%\\&\\=\\'\\\"\\:\\;\\<\\>\\,\\/])/g, \"\");\n};\n\nCreator.getDBApps = function(space_id) {\n var dbApps;\n dbApps = {};\n Creator.Collections[\"apps\"].find({\n space: space_id,\n is_creator: true,\n visible: true\n }, {\n fields: {\n created: 0,\n created_by: 0,\n modified: 0,\n modified_by: 0\n }\n }).forEach(function(app) {\n return dbApps[app._id] = app;\n });\n return dbApps;\n};\n\nCreator.getDBDashboards = function(space_id) {\n var dbDashboards;\n dbDashboards = {};\n Creator.Collections[\"dashboard\"].find({\n space: space_id\n }, {\n fields: {\n created: 0,\n created_by: 0,\n modified: 0,\n modified_by: 0\n }\n }).forEach(function(dashboard) {\n return dbDashboards[dashboard._id] = dashboard;\n });\n return dbDashboards;\n};\n\nif (Meteor.isServer) {\n Cookies = require(\"cookies\");\n Steedos.getAuthToken = function(req, res) {\n var authToken, cookies;\n cookies = new Cookies(req, res);\n authToken = req.headers['x-auth-token'] || cookies.get(\"X-Auth-Token\");\n if (!authToken && req.headers.authorization && req.headers.authorization.split(' ')[0] === 'Bearer') {\n authToken = req.headers.authorization.split(' ')[1];\n }\n return authToken;\n };\n}\n\nif (Meteor.isClient) {\n Meteor.autorun(function() {\n if (Session.get('current_app_id')) {\n return sessionStorage.setItem('current_app_id', Session.get('current_app_id'));\n }\n });\n Steedos.getCurrentAppId = function() {\n if (Session.get('app_id')) {\n return Session.get('app_id');\n } else {\n return sessionStorage.getItem('current_app_id');\n }\n };\n}\n\nif (Meteor.isServer) {\n Steedos.formatIndex = function(array) {\n var indexName, isdocumentDB, object, ref5, ref6, ref7;\n object = {\n background: true\n };\n isdocumentDB = ((ref5 = Meteor.settings) != null ? (ref6 = ref5.datasources) != null ? (ref7 = ref6[\"default\"]) != null ? ref7.documentDB : void 0 : void 0 : void 0) || false;\n if (isdocumentDB) {\n if (array.length > 0) {\n indexName = array.join(\".\");\n object.name = indexName;\n if (indexName.length > 52) {\n object.name = indexName.substring(0, 52);\n }\n }\n }\n return object;\n };\n}\n","Meteor.startup(function () {\n\tSimpleSchema.extendOptions({foreign_key: Match.Optional(Boolean), references: Match.Optional(Object)});\n})","if Meteor.isServer\n Meteor.methods\n updateUserLastLogon: () ->\n if not @userId?\n return\n\n db.users.update({_id: @userId}, {$set: {last_logon: new Date()}}) \n\n\nif Meteor.isClient\n Accounts.onLogin ()->\n Meteor.call 'updateUserLastLogon'","if (Meteor.isServer) {\n Meteor.methods({\n updateUserLastLogon: function() {\n if (this.userId == null) {\n return;\n }\n return db.users.update({\n _id: this.userId\n }, {\n $set: {\n last_logon: new Date()\n }\n });\n }\n });\n}\n\nif (Meteor.isClient) {\n Accounts.onLogin(function() {\n return Meteor.call('updateUserLastLogon');\n });\n}\n","if Meteor.isServer\n Meteor.methods\n users_add_email: (email) ->\n if not @userId?\n return {error: true, message: \"email_login_required\"}\n if not email\n return {error: true, message: \"email_required\"}\n if not /^([A-Z0-9\\.\\-\\_\\+])*([A-Z0-9\\+\\-\\_])+\\@[A-Z0-9]+([\\-][A-Z0-9]+)*([\\.][A-Z0-9\\-]+){1,8}$/i.test(email)\n return {error: true, message: \"email_format_error\"}\n if db.users.find({\"emails.address\": email}).count()>0\n return {error: true, message: \"email_exists\"}\n\n user = db.users.findOne(_id: this.userId)\n if user.emails? and user.emails.length > 0 \n db.users.direct.update {_id: this.userId}, \n $push: \n emails: \n address: email\n verified: false\n else\n db.users.direct.update {_id: this.userId}, \n $set: \n steedos_id: email\n emails: [\n address: email\n verified: false\n ]\n\n Accounts.sendVerificationEmail(this.userId, email);\n\n return {}\n\n users_remove_email: (email) ->\n if not @userId?\n return {error: true, message: \"email_login_required\"}\n if not email\n return {error: true, message: \"email_required\"}\n\n user = db.users.findOne(_id: this.userId)\n if user.emails? and user.emails.length >= 2\n p = null\n user.emails.forEach (e)->\n if e.address == email\n p = e\n return\n \n db.users.direct.update {_id: this.userId}, \n $pull: \n emails: \n p\n else\n return {error: true, message: \"email_at_least_one\"}\n\n return {}\n\n users_verify_email: (email) ->\n if not @userId?\n return {error: true, message: \"email_login_required\"}\n if not email\n return {error: true, message: \"email_required\"}\n if not /^([A-Z0-9\\.\\-\\_\\+])*([A-Z0-9\\+\\-\\_])+\\@[A-Z0-9]+([\\-][A-Z0-9]+)*([\\.][A-Z0-9\\-]+){1,8}$/i.test(email)\n return {error: true, message: \"email_format_error\"}\n \n\n Accounts.sendVerificationEmail(this.userId, email);\n\n return {}\n\n users_set_primary_email: (email) ->\n if not @userId?\n return {error: true, message: \"email_login_required\"}\n if not email\n return {error: true, message: \"email_required\"}\n\n user = db.users.findOne(_id: this.userId)\n emails = user.emails\n emails.forEach (e)->\n if e.address == email\n e.primary = true\n else\n e.primary = false\n\n db.users.direct.update {_id: this.userId},\n $set:\n emails: emails\n email: email\n\n db.space_users.direct.update({user: this.userId},{$set: {email: email}}, {multi: true})\n return {}\n\n\n\nif Meteor.isClient\n Steedos.users_add_email = ()->\n swal\n title: t(\"primary_email_needed\"),\n text: t(\"primary_email_needed_description\"),\n type: 'input',\n showCancelButton: false,\n closeOnConfirm: false,\n animation: \"slide-from-top\"\n , (inputValue) ->\n Meteor.call \"users_add_email\", inputValue, (error, result)->\n if result?.error\n toastr.error result.message\n else\n swal t(\"primary_email_updated\"), \"\", \"success\"\n###\n Tracker.autorun (c) ->\n\n if Meteor.user()\n if Meteor.loggingIn()\n # 正在登录中,则不做处理,因为此时Meteor.userId()不足于证明已登录状态\n return\n primaryEmail = Meteor.user().emails?[0]?.address\n if !primaryEmail\n Steedos.users_add_email();\n###","if (Meteor.isServer) {\n Meteor.methods({\n users_add_email: function(email) {\n var user;\n if (this.userId == null) {\n return {\n error: true,\n message: \"email_login_required\"\n };\n }\n if (!email) {\n return {\n error: true,\n message: \"email_required\"\n };\n }\n if (!/^([A-Z0-9\\.\\-\\_\\+])*([A-Z0-9\\+\\-\\_])+\\@[A-Z0-9]+([\\-][A-Z0-9]+)*([\\.][A-Z0-9\\-]+){1,8}$/i.test(email)) {\n return {\n error: true,\n message: \"email_format_error\"\n };\n }\n if (db.users.find({\n \"emails.address\": email\n }).count() > 0) {\n return {\n error: true,\n message: \"email_exists\"\n };\n }\n user = db.users.findOne({\n _id: this.userId\n });\n if ((user.emails != null) && user.emails.length > 0) {\n db.users.direct.update({\n _id: this.userId\n }, {\n $push: {\n emails: {\n address: email,\n verified: false\n }\n }\n });\n } else {\n db.users.direct.update({\n _id: this.userId\n }, {\n $set: {\n steedos_id: email,\n emails: [\n {\n address: email,\n verified: false\n }\n ]\n }\n });\n }\n Accounts.sendVerificationEmail(this.userId, email);\n return {};\n },\n users_remove_email: function(email) {\n var p, user;\n if (this.userId == null) {\n return {\n error: true,\n message: \"email_login_required\"\n };\n }\n if (!email) {\n return {\n error: true,\n message: \"email_required\"\n };\n }\n user = db.users.findOne({\n _id: this.userId\n });\n if ((user.emails != null) && user.emails.length >= 2) {\n p = null;\n user.emails.forEach(function(e) {\n if (e.address === email) {\n p = e;\n }\n });\n db.users.direct.update({\n _id: this.userId\n }, {\n $pull: {\n emails: p\n }\n });\n } else {\n return {\n error: true,\n message: \"email_at_least_one\"\n };\n }\n return {};\n },\n users_verify_email: function(email) {\n if (this.userId == null) {\n return {\n error: true,\n message: \"email_login_required\"\n };\n }\n if (!email) {\n return {\n error: true,\n message: \"email_required\"\n };\n }\n if (!/^([A-Z0-9\\.\\-\\_\\+])*([A-Z0-9\\+\\-\\_])+\\@[A-Z0-9]+([\\-][A-Z0-9]+)*([\\.][A-Z0-9\\-]+){1,8}$/i.test(email)) {\n return {\n error: true,\n message: \"email_format_error\"\n };\n }\n Accounts.sendVerificationEmail(this.userId, email);\n return {};\n },\n users_set_primary_email: function(email) {\n var emails, user;\n if (this.userId == null) {\n return {\n error: true,\n message: \"email_login_required\"\n };\n }\n if (!email) {\n return {\n error: true,\n message: \"email_required\"\n };\n }\n user = db.users.findOne({\n _id: this.userId\n });\n emails = user.emails;\n emails.forEach(function(e) {\n if (e.address === email) {\n return e.primary = true;\n } else {\n return e.primary = false;\n }\n });\n db.users.direct.update({\n _id: this.userId\n }, {\n $set: {\n emails: emails,\n email: email\n }\n });\n db.space_users.direct.update({\n user: this.userId\n }, {\n $set: {\n email: email\n }\n }, {\n multi: true\n });\n return {};\n }\n });\n}\n\nif (Meteor.isClient) {\n Steedos.users_add_email = function() {\n return swal({\n title: t(\"primary_email_needed\"),\n text: t(\"primary_email_needed_description\"),\n type: 'input',\n showCancelButton: false,\n closeOnConfirm: false,\n animation: \"slide-from-top\"\n }, function(inputValue) {\n return Meteor.call(\"users_add_email\", inputValue, function(error, result) {\n if (result != null ? result.error : void 0) {\n return toastr.error(result.message);\n } else {\n return swal(t(\"primary_email_updated\"), \"\", \"success\");\n }\n });\n });\n };\n}\n\n\n/*\n Tracker.autorun (c) ->\n\n if Meteor.user()\n if Meteor.loggingIn()\n * 正在登录中,则不做处理,因为此时Meteor.userId()不足于证明已登录状态\n return\n primaryEmail = Meteor.user().emails?[0]?.address\n if !primaryEmail\n Steedos.users_add_email();\n */\n","if Meteor.isServer\n Meteor.methods\n updateUserAvatar: (avatar) ->\n if not @userId?\n return\n\n db.users.update({_id: @userId}, {$set: {avatar: avatar}}) ","if (Meteor.isServer) {\n Meteor.methods({\n updateUserAvatar: function(avatar) {\n if (this.userId == null) {\n return;\n }\n return db.users.update({\n _id: this.userId\n }, {\n $set: {\n avatar: avatar\n }\n });\n }\n });\n}\n","Accounts.emailTemplates = {\n\tfrom: (function(){\n\t\tvar defaultFrom = \"Steedos \";\n\t\tif(!Meteor.settings)\n\t\t\treturn defaultFrom;\n\t\t\n\t\tif(!Meteor.settings.email)\n\t\t\treturn defaultFrom;\n\n\t\tif(!Meteor.settings.email.from)\n\t\t\treturn defaultFrom;\n\t\t\n\t\treturn Meteor.settings.email.from;\n\t})(),\n\tresetPassword: {\n\t\tsubject: function (user) {\n\t\t\treturn TAPi18n.__(\"users_email_reset_password\",{},user.locale);\n\t\t},\n\t\ttext: function (user, url) {\n\t\t\tvar splits = url.split(\"/\");\n\t\t\tvar tokenCode = splits[splits.length-1];\n\t\t\tvar greeting = user.profile && user.profile.name ? TAPi18n.__(\"users_email_hello\",{},user.locale) + user.profile.name + \",\" : TAPi18n.__(\"users_email_hello\",{},user.locale) + \",\";\n\t\t\treturn greeting + \"\\n\\n\" + TAPi18n.__(\"users_email_reset_password_body\",{token_code:tokenCode},user.locale) + \"\\n\\n\" + url + \"\\n\\n\" + TAPi18n.__(\"users_email_thanks\",{},user.locale) + \"\\n\";\n\t\t}\n\t},\n\tverifyEmail: {\n\t\tsubject: function (user) {\n\t\t\treturn TAPi18n.__(\"users_email_verify_email\",{},user.locale);\n\t\t},\n\t\ttext: function (user, url) {\n\t\t\tvar greeting = user.profile && user.profile.name ? TAPi18n.__(\"users_email_hello\",{},user.locale) + user.profile.name + \",\" : TAPi18n.__(\"users_email_hello\",{},user.locale) + \",\";\n\t\t\treturn greeting + \"\\n\\n\" + TAPi18n.__(\"users_email_verify_account\",{},user.locale) + \"\\n\\n\" + url + \"\\n\\n\" + TAPi18n.__(\"users_email_thanks\",{},user.locale) + \"\\n\";\n\t\t}\n\t},\n\tenrollAccount: {\n\t\tsubject: function (user) {\n\t\t\treturn TAPi18n.__(\"users_email_create_account\",{},user.locale);\n\t\t},\n\t\ttext: function (user, url) {\n\t\t\tvar greeting = user.profile && user.profile.name ? TAPi18n.__(\"users_email_hello\",{},user.locale) + user.profile.name + \",\" : TAPi18n.__(\"users_email_hello\",{},user.locale) + \",\";\n\t\t\treturn greeting + \"\\n\\n\" + TAPi18n.__(\"users_email_start_service\",{},user.locale) + \"\\n\\n\" + url + \"\\n\\n\" + TAPi18n.__(\"users_email_thanks\",{},user.locale) + \"\\n\";\n\t\t}\n\t}\n};","// 修改fullname值有问题的organizations\nJsonRoutes.add(\"get\", \"/api/organizations/upgrade/\", function (req, res, next) {\n \n\tvar orgs = db.organizations.find({fullname:/新部门/,name:{$ne:\"新部门\"}});\n\tif (orgs.count()>0)\n\t{\n\t\torgs.forEach (function (org)\n\t\t{\n\t\t\t// 自己和子部门的fullname修改\n\t\t\tdb.organizations.direct.update(org._id, {$set: {fullname: org.calculateFullname()}});\n\t\t\t\n\t\t});\n\t}\t\n\n \tJsonRoutes.sendResult(res, {\n \tdata: {\n\t \tret: 0,\n\t \tmsg: \"Successfully\"\n \t}\n \t});\n});\n\n","if Meteor.isCordova\n Meteor.startup ->\n Push.Configure\n android:\n senderID: window.ANDROID_SENDER_ID\n sound: true\n vibrate: true\n ios:\n badge: true\n clearBadge: true\n sound: true\n alert: true\n appName: \"workflow\"\n","if (Meteor.isCordova) {\n Meteor.startup(function() {\n return Push.Configure({\n android: {\n senderID: window.ANDROID_SENDER_ID,\n sound: true,\n vibrate: true\n },\n ios: {\n badge: true,\n clearBadge: true,\n sound: true,\n alert: true\n },\n appName: \"workflow\"\n });\n });\n}\n","Selector = {}\n\n# Filter data on server by space field\nSelector.selectorCheckSpaceAdmin = (userId) ->\n\tif Meteor.isClient\n\t\tuserId = Meteor.userId()\n\t\tunless userId\n\t\t\treturn {_id: -1}\n\t\tif Steedos.isSpaceAdmin()\n\t\t\treturn {space: Session.get(\"spaceId\")}\n\t\telse\n\t\t\treturn {_id: -1}\n\n\tif Meteor.isServer\n\t\tunless userId\n\t\t\treturn {_id: -1}\n\t\tuser = db.users.findOne(userId, {fields: {is_cloudadmin: 1}})\n\t\tif !user\n\t\t\treturn {_id: -1}\n\t\tselector = {}\n\t\tif !user.is_cloudadmin\n\t\t\tspaces = db.spaces.find({admins:{$in:[userId]}}, {fields: {_id: 1}}).fetch()\n\t\t\tspaces = spaces.map (n) -> return n._id\n\t\t\tselector.space = {$in: spaces}\n\t\treturn selector\n\n# Filter data on server by space field\nSelector.selectorCheckSpace = (userId) ->\n\tif Meteor.isClient\n\t\tuserId = Meteor.userId()\n\t\tunless userId\n\t\t\treturn {_id: -1}\n\t\tspaceId = Session.get(\"spaceId\");\n\t\tif spaceId\n\t\t\tif db.space_users.findOne({user: userId,space: spaceId}, {fields: {_id: 1}})\n\t\t\t\treturn {space: spaceId}\n\t\t\telse\n\t\t\t\treturn {_id: -1}\n\t\telse\n\t\t\treturn {_id: -1}\n\n\tif Meteor.isServer\n\t\tunless userId\n\t\t\treturn {_id: -1}\n\t\tuser = db.users.findOne(userId, {fields: {_id: 1}})\n\t\tif !user\n\t\t\treturn {_id: -1}\n\t\tselector = {}\n\t\tspace_users = db.space_users.find({user: userId}, {fields: {space: 1}}).fetch()\n\t\tspaces = []\n\t\t_.each space_users, (u)->\n\t\t\tspaces.push(u.space)\n\t\tselector.space = {$in: spaces}\n\t\treturn selector\n\ndb.billing_pay_records.adminConfig =\n\ticon: \"globe\"\n\tcolor: \"blue\"\n\ttableColumns: [\n\t\t{name: \"order_created()\"},\n\t\t{name: \"modules\"},\n\t\t{name: \"user_count\"},\n\t\t{name: \"end_date\"},\n\t\t{name: \"order_total_fee()\"},\n\t\t{name: \"order_paid()\"}\n\t]\n\textraFields: [\"space\", \"created\", \"paid\", \"total_fee\"]\n\trouterAdmin: \"/admin\"\n\tselector: (userId) ->\n\t\tif Meteor.isClient\n\t\t\tif Steedos.isSpaceAdmin()\n\t\t\t\treturn {space: Session.get(\"spaceId\"), paid: true}\n\t\t\telse\n\t\t\t\treturn {_id: -1}\n\n\t\tif Meteor.isServer\n\t\t\treturn {}\n\tshowEditColumn: false\n\tshowDelColumn: false\n\tdisableAdd: true\n\tpageLength: 100\n\torder: [[0, \"desc\"]]\n\nMeteor.startup ->\n\t@space_user_signs = db.space_user_signs\n\t@billing_pay_records = db.billing_pay_records\n\tAdminConfig?.collections_add\n\t\tspace_user_signs: db.space_user_signs.adminConfig\n\t\tbilling_pay_records: db.billing_pay_records.adminConfig"," \n\nSelector = {};\n\nSelector.selectorCheckSpaceAdmin = function(userId) {\n var selector, spaces, user;\n if (Meteor.isClient) {\n userId = Meteor.userId();\n if (!userId) {\n return {\n _id: -1\n };\n }\n if (Steedos.isSpaceAdmin()) {\n return {\n space: Session.get(\"spaceId\")\n };\n } else {\n return {\n _id: -1\n };\n }\n }\n if (Meteor.isServer) {\n if (!userId) {\n return {\n _id: -1\n };\n }\n user = db.users.findOne(userId, {\n fields: {\n is_cloudadmin: 1\n }\n });\n if (!user) {\n return {\n _id: -1\n };\n }\n selector = {};\n if (!user.is_cloudadmin) {\n spaces = db.spaces.find({\n admins: {\n $in: [userId]\n }\n }, {\n fields: {\n _id: 1\n }\n }).fetch();\n spaces = spaces.map(function(n) {\n return n._id;\n });\n selector.space = {\n $in: spaces\n };\n }\n return selector;\n }\n};\n\nSelector.selectorCheckSpace = function(userId) {\n var selector, spaceId, space_users, spaces, user;\n if (Meteor.isClient) {\n userId = Meteor.userId();\n if (!userId) {\n return {\n _id: -1\n };\n }\n spaceId = Session.get(\"spaceId\");\n if (spaceId) {\n if (db.space_users.findOne({\n user: userId,\n space: spaceId\n }, {\n fields: {\n _id: 1\n }\n })) {\n return {\n space: spaceId\n };\n } else {\n return {\n _id: -1\n };\n }\n } else {\n return {\n _id: -1\n };\n }\n }\n if (Meteor.isServer) {\n if (!userId) {\n return {\n _id: -1\n };\n }\n user = db.users.findOne(userId, {\n fields: {\n _id: 1\n }\n });\n if (!user) {\n return {\n _id: -1\n };\n }\n selector = {};\n space_users = db.space_users.find({\n user: userId\n }, {\n fields: {\n space: 1\n }\n }).fetch();\n spaces = [];\n _.each(space_users, function(u) {\n return spaces.push(u.space);\n });\n selector.space = {\n $in: spaces\n };\n return selector;\n }\n};\n\ndb.billing_pay_records.adminConfig = {\n icon: \"globe\",\n color: \"blue\",\n tableColumns: [\n {\n name: \"order_created()\"\n }, {\n name: \"modules\"\n }, {\n name: \"user_count\"\n }, {\n name: \"end_date\"\n }, {\n name: \"order_total_fee()\"\n }, {\n name: \"order_paid()\"\n }\n ],\n extraFields: [\"space\", \"created\", \"paid\", \"total_fee\"],\n routerAdmin: \"/admin\",\n selector: function(userId) {\n if (Meteor.isClient) {\n if (Steedos.isSpaceAdmin()) {\n return {\n space: Session.get(\"spaceId\"),\n paid: true\n };\n } else {\n return {\n _id: -1\n };\n }\n }\n if (Meteor.isServer) {\n return {};\n }\n },\n showEditColumn: false,\n showDelColumn: false,\n disableAdd: true,\n pageLength: 100,\n order: [[0, \"desc\"]]\n};\n\nMeteor.startup(function() {\n this.space_user_signs = db.space_user_signs;\n this.billing_pay_records = db.billing_pay_records;\n return typeof AdminConfig !== \"undefined\" && AdminConfig !== null ? AdminConfig.collections_add({\n space_user_signs: db.space_user_signs.adminConfig,\n billing_pay_records: db.billing_pay_records.adminConfig\n }) : void 0;\n});\n","if (![].includes) {\n Array.prototype.includes = function(searchElement /*, fromIndex*/ ) {\n 'use strict';\n var O = Object(this);\n var len = parseInt(O.length) || 0;\n if (len === 0) {\n return false;\n }\n var n = parseInt(arguments[1]) || 0;\n var k;\n if (n >= 0) {\n k = n;\n } else {\n k = len + n;\n if (k < 0) {k = 0;}\n }\n var currentElement;\n while (k < len) {\n currentElement = O[k];\n if (searchElement === currentElement ||\n (searchElement !== searchElement && currentElement !== currentElement)) {\n return true;\n }\n k++;\n }\n return false;\n };\n}","Meteor.startup ->\n Steedos.settings.webservices = Meteor.settings.public.webservices\n\n if !Steedos.settings.webservices\n Steedos.settings.webservices =\n www: \n status: \"active\",\n url: \"/\"","Meteor.startup(function() {\n Steedos.settings.webservices = Meteor.settings[\"public\"].webservices;\n if (!Steedos.settings.webservices) {\n return Steedos.settings.webservices = {\n www: {\n status: \"active\",\n url: \"/\"\n }\n };\n }\n});\n","Creator.getUserObjectsListViews = (userId, spaceId, objects)->\n\tlistViews = {}\n\n\tkeys = _.keys(objects)\n\n\tobjectsViews = Creator.getCollection(\"object_listviews\").find({\n\t\tobject_name: {$in: keys},\n\t\tspace: spaceId,\n\t\t\"$or\": [{owner: userId}, {shared: true}]\n\t}, {\n\t\tfields: {\n\t\t\tcreated: 0,\n\t\t\tmodified: 0,\n\t\t\tcreated_by: 0,\n\t\t\tmodified_by: 0\n\t\t}\n\t}).fetch()\n\n\t_getUserObjectListViews = (object_name)->\n\t\t_user_object_list_views = {}\n\t\tolistViews = _.filter objectsViews, (ov)->\n\t\t\treturn ov.object_name == object_name\n\n\t\t_.each olistViews, (listview)->\n\t\t\t_user_object_list_views[listview._id] = listview\n\n\t\treturn _user_object_list_views\n\n\t_.forEach objects, (o, key)->\n\t\tlist_view = _getUserObjectListViews(key)\n\t\tif !_.isEmpty(list_view)\n\t\t\tlistViews[key] = list_view\n\treturn listViews\n\n\nCreator.getUserObjectListViews = (userId, spaceId, object_name)->\n\t_user_object_list_views = {}\n\n\tobject_listview = Creator.getCollection(\"object_listviews\").find({\n\t\tobject_name: object_name,\n\t\tspace: spaceId,\n\t\t\"$or\": [{owner: userId}, {shared: true}]\n\t}, {\n\t\tfields: {\n\t\t\tcreated: 0,\n\t\t\tmodified: 0,\n\t\t\tcreated_by: 0,\n\t\t\tmodified_by: 0\n\t\t}\n\t})\n\n\tobject_listview.forEach (listview)->\n\t\t_user_object_list_views[listview._id] = listview\n\n\treturn _user_object_list_views\n\n\n\n\n","Creator.getUserObjectsListViews = function(userId, spaceId, objects) {\n var _getUserObjectListViews, keys, listViews, objectsViews;\n listViews = {};\n keys = _.keys(objects);\n objectsViews = Creator.getCollection(\"object_listviews\").find({\n object_name: {\n $in: keys\n },\n space: spaceId,\n \"$or\": [\n {\n owner: userId\n }, {\n shared: true\n }\n ]\n }, {\n fields: {\n created: 0,\n modified: 0,\n created_by: 0,\n modified_by: 0\n }\n }).fetch();\n _getUserObjectListViews = function(object_name) {\n var _user_object_list_views, olistViews;\n _user_object_list_views = {};\n olistViews = _.filter(objectsViews, function(ov) {\n return ov.object_name === object_name;\n });\n _.each(olistViews, function(listview) {\n return _user_object_list_views[listview._id] = listview;\n });\n return _user_object_list_views;\n };\n _.forEach(objects, function(o, key) {\n var list_view;\n list_view = _getUserObjectListViews(key);\n if (!_.isEmpty(list_view)) {\n return listViews[key] = list_view;\n }\n });\n return listViews;\n};\n\nCreator.getUserObjectListViews = function(userId, spaceId, object_name) {\n var _user_object_list_views, object_listview;\n _user_object_list_views = {};\n object_listview = Creator.getCollection(\"object_listviews\").find({\n object_name: object_name,\n space: spaceId,\n \"$or\": [\n {\n owner: userId\n }, {\n shared: true\n }\n ]\n }, {\n fields: {\n created: 0,\n modified: 0,\n created_by: 0,\n modified_by: 0\n }\n });\n object_listview.forEach(function(listview) {\n return _user_object_list_views[listview._id] = listview;\n });\n return _user_object_list_views;\n};\n","// ServerSession = (function () {\n// 'use strict';\n\n// var Collection = new Mongo.Collection('server_sessions');\n\n// var checkForKey = function (key) {\n// if (typeof key === 'undefined') {\n// throw new Error('Please provide a key!');\n// }\n// };\n// var getSessionValue = function (obj, key) {\n// return obj && obj.values && obj.values[key];\n// };\n// var condition = function () {\n// return true;\n// };\n\n// Collection.deny({\n// 'insert': function () {\n// return true;\n// },\n// 'update' : function () {\n// return true;\n// },\n// 'remove': function () {\n// return true;\n// }\n// });\n\n// // public client and server api\n// var api = {\n// 'get': function (key) {\n// console.log(Collection.findOne());\n// var sessionObj = Collection.findOne();\n// if(Meteor.isServer){\n// Meteor.call('server-session/get');\n// }\n// // var sessionObj = Meteor.isServer ? \n// // Meteor.call('server-session/get') : Collection.findOne();\n// return getSessionValue(sessionObj, key);\n// },\n// 'equals': function (key, expected, identical) {\n// var sessionObj = Meteor.isServer ? \n// Meteor.call('server-session/get') : Collection.findOne();\n\n// var value = getSessionValue(sessionObj, key);\n\n// if (_.isObject(value) && _.isObject(expected)) {\n// return _(value).isEqual(expected);\n// }\n\n// if (identical == false) {\n// return expected == value;\n// }\n\n// return expected === value;\n// }\n// };\n\n// Meteor.startup(function(){\n// if (Meteor.isClient) {\n// Tracker.autorun(function(){\n// if(Meteor.userId()){\n// Meteor.subscribe('server-session');\n// }\n// })\n// }\n// })\n\n// if (Meteor.isServer) {\n// // Meteor.startup(function () {\n// // if (Collection.findOne()) {\n// // Collection.remove({}); // clear out all stale sessions\n// // }\n// // });\n\n// Meteor.onConnection(function (connection) {\n// var clientID = connection.id;\n\n// if (!Collection.findOne({ 'clientID': clientID })) {\n// Collection.insert({ 'clientID': clientID, 'values': {}, \"created\": new Date() });\n// }\n\n// connection.onClose(function () {\n// Collection.remove({ 'clientID': clientID });\n// });\n// });\n\n// Meteor.publish('server-session', function () {\n// return Collection.find({ 'clientID': this.connection.id });\n// });\n\n// Meteor.methods({\n// 'server-session/get': function () {\n// return Collection.findOne({ 'clientID': this.connection.id });\n// },\n// 'server-session/set': function (key, value) {\n// if (!this.randomSeed) return;\n\n// checkForKey(key);\n\n// if (!condition(key, value))\n// throw new Meteor.Error('Failed condition validation.');\n\n// var updateObj = {};\n// updateObj['values.' + key] = value;\n\n// Collection.update({ 'clientID': this.connection.id }, { $set: updateObj });\n// }\n// }); \n\n// // server-only api\n// _.extend(api, {\n// 'set': function (key, value) {\n// Meteor.call('server-session/set', key, value); \n// },\n// 'setCondition': function (newCondition) {\n// condition = newCondition;\n// }\n// });\n// }\n\n// return api;\n// })();","JsonRoutes.add 'get', '/api/get/apps', (req, res, next) ->\n\ttry\n\t\tuser_id = req.headers['x-user-id'] || req.query?.userId\n\n\t\tspace_id = req.headers['x-space-id'] || req.query?.spaceId\n\n\t\tuser = Steedos.getAPILoginUser(req, res)\n\t\t\n\t\tif !user\n\t\t\tJsonRoutes.sendResult res,\n\t\t\t\tcode: 401,\n\t\t\t\tdata:\n\t\t\t\t\t\"error\": \"Validate Request -- Missing X-Auth-Token,X-User-Id\",\n\t\t\t\t\t\"success\": false\n\t\t\treturn;\n\n\t\tuser_id = user._id\n\n\t\t# 校验space是否存在\n\t\tuuflowManager.getSpace(space_id)\n\n\t\tlocale = db.users.findOne({_id:user_id}).locale\n\t\tif locale == \"en-us\"\n\t\t\tlocale = \"en\"\n\t\tif locale == \"zh-cn\"\n\t\t\tlocale = \"zh-CN\"\n\n\t\tspaces = db.space_users.find({user: user_id}).fetch().getProperty(\"space\")\n\t\tapps = db.apps.find({$or: [{space: {$exists: false}}, {space: {$in:spaces}}]},{sort:{sort:1}}).fetch()\n\n\t\tapps.forEach (app) ->\n\t\t\tapp.name = TAPi18n.__(app.name,{},locale)\n\n\t\tJsonRoutes.sendResult res,\n\t\t\tcode: 200\n\t\t\tdata: { status: \"success\", data: apps}\n\tcatch e\n\t\tconsole.error e.stack\n\t\tJsonRoutes.sendResult res,\n\t\t\tcode: 200\n\t\t\tdata: { errors: [{errorMessage: e.message}]}\n\t\n\t\t","JsonRoutes.add('get', '/api/get/apps', function(req, res, next) {\n var apps, e, locale, ref, ref1, space_id, spaces, user, user_id;\n try {\n user_id = req.headers['x-user-id'] || ((ref = req.query) != null ? ref.userId : void 0);\n space_id = req.headers['x-space-id'] || ((ref1 = req.query) != null ? ref1.spaceId : void 0);\n user = Steedos.getAPILoginUser(req, res);\n if (!user) {\n JsonRoutes.sendResult(res, {\n code: 401,\n data: {\n \"error\": \"Validate Request -- Missing X-Auth-Token,X-User-Id\",\n \"success\": false\n }\n });\n return;\n }\n user_id = user._id;\n uuflowManager.getSpace(space_id);\n locale = db.users.findOne({\n _id: user_id\n }).locale;\n if (locale === \"en-us\") {\n locale = \"en\";\n }\n if (locale === \"zh-cn\") {\n locale = \"zh-CN\";\n }\n spaces = db.space_users.find({\n user: user_id\n }).fetch().getProperty(\"space\");\n apps = db.apps.find({\n $or: [\n {\n space: {\n $exists: false\n }\n }, {\n space: {\n $in: spaces\n }\n }\n ]\n }, {\n sort: {\n sort: 1\n }\n }).fetch();\n apps.forEach(function(app) {\n return app.name = TAPi18n.__(app.name, {}, locale);\n });\n return JsonRoutes.sendResult(res, {\n code: 200,\n data: {\n status: \"success\",\n data: apps\n }\n });\n } catch (error) {\n e = error;\n console.error(e.stack);\n return JsonRoutes.sendResult(res, {\n code: 200,\n data: {\n errors: [\n {\n errorMessage: e.message\n }\n ]\n }\n });\n }\n});\n","Cookies = require(\"cookies\")\nsteedosAuth = require(\"@steedos/auth\")\n\nJsonRoutes.add \"post\", \"/api/collection/find\", (req, res, next) ->\n try\n cookies = new Cookies( req, res )\n authToken = req.body[\"X-Auth-Token\"] || cookies.get(\"X-Auth-Token\")\n\n if !authToken\n JsonRoutes.sendResult res,\n code: 401,\n data:\n \"error\": \"Validate Request -- Missing X-Auth-Token\",\n \"instance\": \"1329598861\",\n \"success\": false\n return\n\n model = req.body.model\n selector = req.body.selector\n options = req.body.options\n space = req.body.space\n data = []\n allow_models = ['space_users', 'organizations', 'flow_roles', 'roles']\n\n if !space\n JsonRoutes.sendResult res,\n code: 403,\n data:\n \"error\": \"invalid space \" + space,\n \"success\": false\n return\n\n # 用户登录验证\n check(space, String)\n check(authToken, String)\n userSession = Meteor.wrapAsync((authToken, spaceId, cb) ->\n steedosAuth.getSession(authToken, spaceId).then (resolve, reject) ->\n cb(reject, resolve)\n )(authToken, space)\n unless userSession\n JsonRoutes.sendResult res,\n code: 500,\n data:\n \"error\": \"auth failed\",\n \"success\": false\n return\n userId = userSession.userId\n\n if !allow_models.includes(model)\n JsonRoutes.sendResult res,\n code: 403,\n data:\n \"error\": \"invalid model \" + model,\n \"success\": false\n return\n\n if !db[model]\n JsonRoutes.sendResult res,\n code: 403,\n data:\n \"error\": \"invalid model \" + model,\n \"success\": false\n return\n\n if !selector\n selector = {}\n\n if !options\n options = {}\n\n selector.space = space\n\n data = db[model].find(selector, options).fetch()\n\n JsonRoutes.sendResult res,\n code: 200,\n data: data\n catch e\n console.error e.stack\n JsonRoutes.sendResult res,\n code: 200,\n data: []\n\n\nJsonRoutes.add \"post\", \"/api/collection/findone\", (req, res, next) ->\n try\n cookies = new Cookies( req, res )\n authToken = req.body[\"X-Auth-Token\"] || cookies.get(\"X-Auth-Token\")\n\n if !authToken\n JsonRoutes.sendResult res,\n code: 401,\n data:\n \"error\": \"Validate Request -- Missing X-Auth-Token\",\n \"instance\": \"1329598861\",\n \"success\": false\n return\n\n model = req.body.model\n selector = req.body.selector\n options = req.body.options\n space = req.body.space\n data = []\n allow_models = ['space_users', 'organizations', 'flow_roles', 'mail_accounts', 'roles']\n\n if !space\n JsonRoutes.sendResult res,\n code: 403,\n data:\n \"error\": \"invalid space \" + space,\n \"success\": false\n return\n\n # 用户登录验证\n check(space, String)\n check(authToken, String)\n userSession = Meteor.wrapAsync((authToken, spaceId, cb) ->\n steedosAuth.getSession(authToken, spaceId).then (resolve, reject) ->\n cb(reject, resolve)\n )(authToken, space)\n unless userSession\n JsonRoutes.sendResult res,\n code: 500,\n data:\n \"error\": \"auth failed\",\n \"success\": false\n return\n userId = userSession.userId\n\n if !allow_models.includes(model)\n JsonRoutes.sendResult res,\n code: 403,\n data:\n \"error\": \"invalid model \" + model,\n \"success\": false\n return\n\n if !db[model]\n JsonRoutes.sendResult res,\n code: 403,\n data:\n \"error\": \"invalid model \" + model,\n \"success\": false\n return\n\n if !selector\n selector = {}\n\n if !options\n options = {}\n\n if model == 'mail_accounts'\n selector = {}\n selector.owner = userId\n data = db[model].findOne(selector)\n else\n selector.space = space\n\n data = db[model].findOne(selector, options)\n\n JsonRoutes.sendResult res,\n code: 200,\n data: data\n catch e\n console.error e.stack\n JsonRoutes.sendResult res,\n code: 200,\n data: {}\n","var Cookies, steedosAuth;\n\nCookies = require(\"cookies\");\n\nsteedosAuth = require(\"@steedos/auth\");\n\nJsonRoutes.add(\"post\", \"/api/collection/find\", function(req, res, next) {\n var allow_models, authToken, cookies, data, e, model, options, selector, space, userId, userSession;\n try {\n cookies = new Cookies(req, res);\n authToken = req.body[\"X-Auth-Token\"] || cookies.get(\"X-Auth-Token\");\n if (!authToken) {\n JsonRoutes.sendResult(res, {\n code: 401,\n data: {\n \"error\": \"Validate Request -- Missing X-Auth-Token\",\n \"instance\": \"1329598861\",\n \"success\": false\n }\n });\n return;\n }\n model = req.body.model;\n selector = req.body.selector;\n options = req.body.options;\n space = req.body.space;\n data = [];\n allow_models = ['space_users', 'organizations', 'flow_roles', 'roles'];\n if (!space) {\n JsonRoutes.sendResult(res, {\n code: 403,\n data: {\n \"error\": \"invalid space \" + space,\n \"success\": false\n }\n });\n return;\n }\n check(space, String);\n check(authToken, String);\n userSession = Meteor.wrapAsync(function(authToken, spaceId, cb) {\n return steedosAuth.getSession(authToken, spaceId).then(function(resolve, reject) {\n return cb(reject, resolve);\n });\n })(authToken, space);\n if (!userSession) {\n JsonRoutes.sendResult(res, {\n code: 500,\n data: {\n \"error\": \"auth failed\",\n \"success\": false\n }\n });\n return;\n }\n userId = userSession.userId;\n if (!allow_models.includes(model)) {\n JsonRoutes.sendResult(res, {\n code: 403,\n data: {\n \"error\": \"invalid model \" + model,\n \"success\": false\n }\n });\n return;\n }\n if (!db[model]) {\n JsonRoutes.sendResult(res, {\n code: 403,\n data: {\n \"error\": \"invalid model \" + model,\n \"success\": false\n }\n });\n return;\n }\n if (!selector) {\n selector = {};\n }\n if (!options) {\n options = {};\n }\n selector.space = space;\n data = db[model].find(selector, options).fetch();\n return JsonRoutes.sendResult(res, {\n code: 200,\n data: data\n });\n } catch (error) {\n e = error;\n console.error(e.stack);\n return JsonRoutes.sendResult(res, {\n code: 200,\n data: []\n });\n }\n});\n\nJsonRoutes.add(\"post\", \"/api/collection/findone\", function(req, res, next) {\n var allow_models, authToken, cookies, data, e, model, options, selector, space, userId, userSession;\n try {\n cookies = new Cookies(req, res);\n authToken = req.body[\"X-Auth-Token\"] || cookies.get(\"X-Auth-Token\");\n if (!authToken) {\n JsonRoutes.sendResult(res, {\n code: 401,\n data: {\n \"error\": \"Validate Request -- Missing X-Auth-Token\",\n \"instance\": \"1329598861\",\n \"success\": false\n }\n });\n return;\n }\n model = req.body.model;\n selector = req.body.selector;\n options = req.body.options;\n space = req.body.space;\n data = [];\n allow_models = ['space_users', 'organizations', 'flow_roles', 'mail_accounts', 'roles'];\n if (!space) {\n JsonRoutes.sendResult(res, {\n code: 403,\n data: {\n \"error\": \"invalid space \" + space,\n \"success\": false\n }\n });\n return;\n }\n check(space, String);\n check(authToken, String);\n userSession = Meteor.wrapAsync(function(authToken, spaceId, cb) {\n return steedosAuth.getSession(authToken, spaceId).then(function(resolve, reject) {\n return cb(reject, resolve);\n });\n })(authToken, space);\n if (!userSession) {\n JsonRoutes.sendResult(res, {\n code: 500,\n data: {\n \"error\": \"auth failed\",\n \"success\": false\n }\n });\n return;\n }\n userId = userSession.userId;\n if (!allow_models.includes(model)) {\n JsonRoutes.sendResult(res, {\n code: 403,\n data: {\n \"error\": \"invalid model \" + model,\n \"success\": false\n }\n });\n return;\n }\n if (!db[model]) {\n JsonRoutes.sendResult(res, {\n code: 403,\n data: {\n \"error\": \"invalid model \" + model,\n \"success\": false\n }\n });\n return;\n }\n if (!selector) {\n selector = {};\n }\n if (!options) {\n options = {};\n }\n if (model === 'mail_accounts') {\n selector = {};\n selector.owner = userId;\n data = db[model].findOne(selector);\n } else {\n selector.space = space;\n data = db[model].findOne(selector, options);\n }\n return JsonRoutes.sendResult(res, {\n code: 200,\n data: data\n });\n } catch (error) {\n e = error;\n console.error(e.stack);\n return JsonRoutes.sendResult(res, {\n code: 200,\n data: {}\n });\n }\n});\n","crypto = require('crypto')\nCookies = require(\"cookies\")\nexpress = require(\"express\")\n\nJsonRoutes.add \"get\", \"/api/setup/sso/:app_id\", (req, res, next) ->\n\n\tapp = db.apps.findOne(req.params.app_id)\n\tif app\n\t\tsecret = app.secret\n\t\tredirectUrl = app.url\n\telse\n\t\tsecret = \"-8762-fcb369b2e8\"\n\t\tredirectUrl = req.params.redirectUrl\n\n\tif !redirectUrl\n\t\tres.writeHead 401\n\t\tres.end()\n\t\treturn\n\n\tcookies = new Cookies( req, res );\n\n\t# first check request body\n\t# if req.body\n\t# \tuserId = req.body[\"X-User-Id\"]\n\t# \tauthToken = req.body[\"X-Auth-Token\"]\n\n\t# # then check cookie\n\t# if !userId or !authToken\n\t# \tuserId = cookies.get(\"X-User-Id\")\n\t# \tauthToken = cookies.get(\"X-Auth-Token\")\n\n\tif !userId and !authToken\n\t\tuserId = req.query[\"X-User-Id\"]\n\t\tauthToken = req.query[\"X-Auth-Token\"]\n\n\tif userId and authToken\n\t\thashedToken = Accounts._hashLoginToken(authToken)\n\t\tuser = Meteor.users.findOne\n\t\t\t_id: userId,\n\t\t\t\"services.resume.loginTokens.hashedToken\": hashedToken\n\t\tif user\n\t\t\tsteedos_id = user.steedos_id\n\t\t\tif app.secret\n\t\t\t\tiv = app.secret\n\t\t\telse\n\t\t\t\tiv = \"-8762-fcb369b2e8\"\n\t\t\tnow = parseInt(new Date().getTime()/1000).toString()\n\t\t\tkey32 = \"\"\n\t\t\tlen = steedos_id.length\n\t\t\tif len < 32\n\t\t\t\tc = \"\"\n\t\t\t\ti = 0\n\t\t\t\tm = 32 - len\n\t\t\t\twhile i < m\n\t\t\t\t\tc = \" \" + c\n\t\t\t\t\ti++\n\t\t\t\tkey32 = steedos_id + c\n\t\t\telse if len >= 32\n\t\t\t\tkey32 = steedos_id.slice(0,32)\n\n\t\t\tcipher = crypto.createCipheriv('aes-256-cbc', new Buffer(key32, 'utf8'), new Buffer(iv, 'utf8'))\n\n\t\t\tcipheredMsg = Buffer.concat([cipher.update(new Buffer(now, 'utf8')), cipher.final()])\n\n\t\t\tsteedos_token = cipheredMsg.toString('base64')\n\n\t\t\t# des-cbc\n\t\t\tdes_iv = \"-8762-fc\"\n\t\t\tkey8 = \"\"\n\t\t\tlen = steedos_id.length\n\t\t\tif len < 8\n\t\t\t\tc = \"\"\n\t\t\t\ti = 0\n\t\t\t\tm = 8 - len\n\t\t\t\twhile i < m\n\t\t\t\t\tc = \" \" + c\n\t\t\t\t\ti++\n\t\t\t\tkey8 = steedos_id + c\n\t\t\telse if len >= 8\n\t\t\t\tkey8 = steedos_id.slice(0,8)\n\t\t\tdes_cipher = crypto.createCipheriv('des-cbc', new Buffer(key8, 'utf8'), new Buffer(des_iv, 'utf8'))\n\t\t\tdes_cipheredMsg = Buffer.concat([des_cipher.update(new Buffer(now, 'utf8')), des_cipher.final()])\n\t\t\tdes_steedos_token = des_cipheredMsg.toString('base64')\n\n\t\t\tjoiner = \"?\"\n\n\t\t\tif redirectUrl.indexOf(\"?\") > -1\n\t\t\t\tjoiner = \"&\"\n\n\t\t\treturnurl = redirectUrl + joiner + \"X-User-Id=\" + userId + \"&X-Auth-Token=\" + authToken + \"&X-STEEDOS-WEB-ID=\" + steedos_id + \"&X-STEEDOS-AUTHTOKEN=\" + steedos_token + \"&STEEDOS-AUTHTOKEN=\" + des_steedos_token\n\n\t\t\tif user.username\n\t\t\t\treturnurl += \"&X-STEEDOS-USERNAME=#{encodeURI(user.username)}\"\n\t\t\tres.setHeader \"Location\", returnurl\n\t\t\tres.writeHead 302\n\t\t\tres.end()\n\t\t\treturn\n\n\tres.writeHead 401\n\tres.end()\n\treturn\n","var Cookies, crypto, express;\n\ncrypto = require('crypto');\n\nCookies = require(\"cookies\");\n\nexpress = require(\"express\");\n\nJsonRoutes.add(\"get\", \"/api/setup/sso/:app_id\", function(req, res, next) {\n var app, authToken, c, cipher, cipheredMsg, cookies, des_cipher, des_cipheredMsg, des_iv, des_steedos_token, hashedToken, i, iv, joiner, key32, key8, len, m, now, redirectUrl, returnurl, secret, steedos_id, steedos_token, user, userId;\n app = db.apps.findOne(req.params.app_id);\n if (app) {\n secret = app.secret;\n redirectUrl = app.url;\n } else {\n secret = \"-8762-fcb369b2e8\";\n redirectUrl = req.params.redirectUrl;\n }\n if (!redirectUrl) {\n res.writeHead(401);\n res.end();\n return;\n }\n cookies = new Cookies(req, res);\n if (!userId && !authToken) {\n userId = req.query[\"X-User-Id\"];\n authToken = req.query[\"X-Auth-Token\"];\n }\n if (userId && authToken) {\n hashedToken = Accounts._hashLoginToken(authToken);\n user = Meteor.users.findOne({\n _id: userId,\n \"services.resume.loginTokens.hashedToken\": hashedToken\n });\n if (user) {\n steedos_id = user.steedos_id;\n if (app.secret) {\n iv = app.secret;\n } else {\n iv = \"-8762-fcb369b2e8\";\n }\n now = parseInt(new Date().getTime() / 1000).toString();\n key32 = \"\";\n len = steedos_id.length;\n if (len < 32) {\n c = \"\";\n i = 0;\n m = 32 - len;\n while (i < m) {\n c = \" \" + c;\n i++;\n }\n key32 = steedos_id + c;\n } else if (len >= 32) {\n key32 = steedos_id.slice(0, 32);\n }\n cipher = crypto.createCipheriv('aes-256-cbc', new Buffer(key32, 'utf8'), new Buffer(iv, 'utf8'));\n cipheredMsg = Buffer.concat([cipher.update(new Buffer(now, 'utf8')), cipher.final()]);\n steedos_token = cipheredMsg.toString('base64');\n des_iv = \"-8762-fc\";\n key8 = \"\";\n len = steedos_id.length;\n if (len < 8) {\n c = \"\";\n i = 0;\n m = 8 - len;\n while (i < m) {\n c = \" \" + c;\n i++;\n }\n key8 = steedos_id + c;\n } else if (len >= 8) {\n key8 = steedos_id.slice(0, 8);\n }\n des_cipher = crypto.createCipheriv('des-cbc', new Buffer(key8, 'utf8'), new Buffer(des_iv, 'utf8'));\n des_cipheredMsg = Buffer.concat([des_cipher.update(new Buffer(now, 'utf8')), des_cipher.final()]);\n des_steedos_token = des_cipheredMsg.toString('base64');\n joiner = \"?\";\n if (redirectUrl.indexOf(\"?\") > -1) {\n joiner = \"&\";\n }\n returnurl = redirectUrl + joiner + \"X-User-Id=\" + userId + \"&X-Auth-Token=\" + authToken + \"&X-STEEDOS-WEB-ID=\" + steedos_id + \"&X-STEEDOS-AUTHTOKEN=\" + steedos_token + \"&STEEDOS-AUTHTOKEN=\" + des_steedos_token;\n if (user.username) {\n returnurl += \"&X-STEEDOS-USERNAME=\" + (encodeURI(user.username));\n }\n res.setHeader(\"Location\", returnurl);\n res.writeHead(302);\n res.end();\n return;\n }\n }\n res.writeHead(401);\n res.end();\n});\n","Meteor.startup ->\n\t\n\tJsonRoutes.add 'get', '/avatar/:userId', (req, res, next) ->\n\t\t# this.params =\n\t\t# \tuserId: decodeURI(req.url).replace(/^\\//, '').replace(/\\?.*$/, '')\n\t\twidth = 50 ;\n\t\theight = 50 ;\n\t\tfontSize = 28 ;\n\t\tif req.query.w\n\t\t width = req.query.w ;\n\t\tif req.query.h\n\t\t height = req.query.h ;\n\t\tif req.query.fs\n fontSize = req.query.fs ;\n\n\t\tuser = db.users.findOne(req.params.userId);\n\t\tif !user\n\t\t\tres.writeHead 401\n\t\t\tres.end()\n\t\t\treturn\n\n\t\tif user.avatar\n\t\t\tres.setHeader \"Location\", Creator.getRelativeUrl(\"api/files/avatars/\" + user.avatar)\n\t\t\tres.writeHead 302\n\t\t\tres.end()\n\t\t\treturn\n\n\t\tif user.profile?.avatar\n\t\t\tres.setHeader \"Location\", user.profile.avatar\n\t\t\tres.writeHead 302\n\t\t\tres.end()\n\t\t\treturn\n\n\t\tif user.avatarUrl\n\t\t\tres.setHeader \"Location\", user.avatarUrl\n\t\t\tres.writeHead 302\n\t\t\tres.end()\n\t\t\treturn\n\n\t\tif not file?\n\t\t\tres.setHeader 'Content-Disposition', 'inline'\n\t\t\tres.setHeader 'content-type', 'image/svg+xml'\n\t\t\tres.setHeader 'cache-control', 'public, max-age=31536000'\n\t\t\tsvg = \"\"\"\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\"\"\"\n\t\t\tres.write svg\n#\t\t\tres.setHeader \"Location\", Steedos.absoluteUrl(\"/packages/steedos_base/client/images/default-avatar.png\")\n#\t\t\tres.writeHead 302\n\t\t\tres.end()\n\t\t\treturn\n\n\t\tusername = user.name;\n\t\tif !username\n\t\t\tusername = \"\"\n\n\t\tres.setHeader 'Content-Disposition', 'inline'\n\n\t\tif not file?\n\t\t\tres.setHeader 'content-type', 'image/svg+xml'\n\t\t\tres.setHeader 'cache-control', 'public, max-age=31536000'\n\n\t\t\tcolors = ['#F44336','#E91E63','#9C27B0','#673AB7','#3F51B5','#2196F3','#03A9F4','#00BCD4','#009688','#4CAF50','#8BC34A','#CDDC39','#FFC107','#FF9800','#FF5722','#795548','#9E9E9E','#607D8B']\n\n\t\t\tusername_array = Array.from(username)\n\t\t\tcolor_index = 0\n\t\t\t_.each username_array, (item) ->\n\t\t\t\tcolor_index += item.charCodeAt(0);\n\n\t\t\tposition = color_index % colors.length\n\t\t\tcolor = colors[position]\n\t\t\t#color = \"#D6DADC\"\n\n\t\t\tinitials = ''\n\t\t\tif username.charCodeAt(0)>255\n\t\t\t\tinitials = username.substr(0, 1)\n\t\t\telse\n\t\t\t\tinitials = username.substr(0, 2)\n\n\t\t\tinitials = initials.toUpperCase()\n\n\t\t\tsvg = \"\"\"\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t#{initials}\n\t\t\t\t\n\t\t\t\n\t\t\t\"\"\"\n\n\t\t\tres.write svg\n\t\t\tres.end()\n\t\t\treturn\n\n\t\treqModifiedHeader = req.headers[\"if-modified-since\"];\n\t\tif reqModifiedHeader?\n\t\t\tif reqModifiedHeader == user.modified?.toUTCString()\n\t\t\t\tres.setHeader 'Last-Modified', reqModifiedHeader\n\t\t\t\tres.writeHead 304\n\t\t\t\tres.end()\n\t\t\t\treturn\n\n\t\tres.setHeader 'Last-Modified', user.modified?.toUTCString() or new Date().toUTCString()\n\t\tres.setHeader 'content-type', 'image/jpeg'\n\t\tres.setHeader 'Content-Length', file.length\n\n\t\tfile.readStream.pipe res\n\t\treturn","Meteor.startup(function() {\n return JsonRoutes.add('get', '/avatar/:userId', function(req, res, next) {\n var color, color_index, colors, fontSize, height, initials, position, ref, ref1, ref2, reqModifiedHeader, svg, user, username, username_array, width;\n width = 50;\n height = 50;\n fontSize = 28;\n if (req.query.w) {\n width = req.query.w;\n }\n if (req.query.h) {\n height = req.query.h;\n }\n if (req.query.fs) {\n fontSize = req.query.fs;\n }\n user = db.users.findOne(req.params.userId);\n if (!user) {\n res.writeHead(401);\n res.end();\n return;\n }\n if (user.avatar) {\n res.setHeader(\"Location\", Creator.getRelativeUrl(\"api/files/avatars/\" + user.avatar));\n res.writeHead(302);\n res.end();\n return;\n }\n if ((ref = user.profile) != null ? ref.avatar : void 0) {\n res.setHeader(\"Location\", user.profile.avatar);\n res.writeHead(302);\n res.end();\n return;\n }\n if (user.avatarUrl) {\n res.setHeader(\"Location\", user.avatarUrl);\n res.writeHead(302);\n res.end();\n return;\n }\n if (typeof file === \"undefined\" || file === null) {\n res.setHeader('Content-Disposition', 'inline');\n res.setHeader('content-type', 'image/svg+xml');\n res.setHeader('cache-control', 'public, max-age=31536000');\n svg = \"\\n\\n\\n\t\\n\t\\n\\n\\n\t\\n\t\t\\n\t\t\\n\t\\n\\n\";\n res.write(svg);\n res.end();\n return;\n }\n username = user.name;\n if (!username) {\n username = \"\";\n }\n res.setHeader('Content-Disposition', 'inline');\n if (typeof file === \"undefined\" || file === null) {\n res.setHeader('content-type', 'image/svg+xml');\n res.setHeader('cache-control', 'public, max-age=31536000');\n colors = ['#F44336', '#E91E63', '#9C27B0', '#673AB7', '#3F51B5', '#2196F3', '#03A9F4', '#00BCD4', '#009688', '#4CAF50', '#8BC34A', '#CDDC39', '#FFC107', '#FF9800', '#FF5722', '#795548', '#9E9E9E', '#607D8B'];\n username_array = Array.from(username);\n color_index = 0;\n _.each(username_array, function(item) {\n return color_index += item.charCodeAt(0);\n });\n position = color_index % colors.length;\n color = colors[position];\n initials = '';\n if (username.charCodeAt(0) > 255) {\n initials = username.substr(0, 1);\n } else {\n initials = username.substr(0, 2);\n }\n initials = initials.toUpperCase();\n svg = \"\\n\\n\t\\n\t\t\" + initials + \"\\n\t\\n\";\n res.write(svg);\n res.end();\n return;\n }\n reqModifiedHeader = req.headers[\"if-modified-since\"];\n if (reqModifiedHeader != null) {\n if (reqModifiedHeader === ((ref1 = user.modified) != null ? ref1.toUTCString() : void 0)) {\n res.setHeader('Last-Modified', reqModifiedHeader);\n res.writeHead(304);\n res.end();\n return;\n }\n }\n res.setHeader('Last-Modified', ((ref2 = user.modified) != null ? ref2.toUTCString() : void 0) || new Date().toUTCString());\n res.setHeader('content-type', 'image/jpeg');\n res.setHeader('Content-Length', file.length);\n file.readStream.pipe(res);\n });\n});\n","Meteor.startup ->\n\tJsonRoutes.add 'get', '/api/access/check', (req, res, next) ->\n\n\t\taccess_token = req.query?.access_token\n\n\t\tif Steedos.getUserIdFromAccessToken(access_token)\n\t\t\tres.writeHead 200\n\t\t\tres.end()\n\t\t\treturn\n\t\telse\n\t\t\tres.writeHead 401\n\t\t\tres.end()\n\t\t\treturn\n\n\n\n\n","Meteor.startup(function() {\n return JsonRoutes.add('get', '/api/access/check', function(req, res, next) {\n var access_token, ref;\n access_token = (ref = req.query) != null ? ref.access_token : void 0;\n if (Steedos.getUserIdFromAccessToken(access_token)) {\n res.writeHead(200);\n res.end();\n } else {\n res.writeHead(401);\n res.end();\n }\n });\n});\n","if Meteor.isServer\n Meteor.publish 'apps', (spaceId)->\n unless this.userId\n return this.ready()\n \n\n selector = {space: {$exists: false}}\n if spaceId\n selector = {$or: [{space: {$exists: false}}, {space: spaceId}]}\n \n return db.apps.find(selector, {sort: {sort: 1}});\n","if (Meteor.isServer) {\n Meteor.publish('apps', function(spaceId) {\n var selector;\n if (!this.userId) {\n return this.ready();\n }\n selector = {\n space: {\n $exists: false\n }\n };\n if (spaceId) {\n selector = {\n $or: [\n {\n space: {\n $exists: false\n }\n }, {\n space: spaceId\n }\n ]\n };\n }\n return db.apps.find(selector, {\n sort: {\n sort: 1\n }\n });\n });\n}\n","\n\n\t# publish users spaces\n\t# we only publish spaces current user joined.\n\tMeteor.publish 'my_spaces', ->\n\t\tunless this.userId\n\t\t\treturn this.ready()\n\n\n\t\tself = this;\n\t\tuserSpaces = []\n\t\tsus = db.space_users.find({user: this.userId, user_accepted: true}, {fields: {space:1}})\n\t\tsus.forEach (su) ->\n\t\t\tuserSpaces.push(su.space)\n\n\t\thandle2 = null\n\n\t\t# only return user joined spaces, and observes when user join or leave a space\n\t\thandle = db.space_users.find({user: this.userId, user_accepted: true}).observe\n\t\t\tadded: (doc) ->\n\t\t\t\tif doc.space\n\t\t\t\t\tif userSpaces.indexOf(doc.space) < 0\n\t\t\t\t\t\tuserSpaces.push(doc.space)\n\t\t\t\t\t\tobserveSpaces()\n\t\t\tremoved: (oldDoc) ->\n\t\t\t\tif oldDoc.space\n\t\t\t\t\tself.removed \"spaces\", oldDoc.space\n\t\t\t\t\tuserSpaces = _.without(userSpaces, oldDoc.space)\n\n\t\tobserveSpaces = ->\n\t\t\tif handle2\n\t\t\t\thandle2.stop();\n\t\t\thandle2 = db.spaces.find({_id: {$in: userSpaces}}).observe\n\t\t\t\tadded: (doc) ->\n\t\t\t\t\tself.added \"spaces\", doc._id, doc;\n\t\t\t\t\tuserSpaces.push(doc._id)\n\t\t\t\tchanged: (newDoc, oldDoc) ->\n\t\t\t\t\tself.changed \"spaces\", newDoc._id, newDoc;\n\t\t\t\tremoved: (oldDoc) ->\n\t\t\t\t\tself.removed \"spaces\", oldDoc._id\n\t\t\t\t\tuserSpaces = _.without(userSpaces, oldDoc._id)\n\n\t\tobserveSpaces();\n\n\t\tself.ready();\n\n\t\tself.onStop ->\n\t\t\thandle.stop();\n\t\t\tif handle2\n\t\t\t\thandle2.stop();\n","Meteor.publish('my_spaces', function() {\n var handle, handle2, observeSpaces, self, sus, userSpaces;\n if (!this.userId) {\n return this.ready();\n }\n self = this;\n userSpaces = [];\n sus = db.space_users.find({\n user: this.userId,\n user_accepted: true\n }, {\n fields: {\n space: 1\n }\n });\n sus.forEach(function(su) {\n return userSpaces.push(su.space);\n });\n handle2 = null;\n handle = db.space_users.find({\n user: this.userId,\n user_accepted: true\n }).observe({\n added: function(doc) {\n if (doc.space) {\n if (userSpaces.indexOf(doc.space) < 0) {\n userSpaces.push(doc.space);\n return observeSpaces();\n }\n }\n },\n removed: function(oldDoc) {\n if (oldDoc.space) {\n self.removed(\"spaces\", oldDoc.space);\n return userSpaces = _.without(userSpaces, oldDoc.space);\n }\n }\n });\n observeSpaces = function() {\n if (handle2) {\n handle2.stop();\n }\n return handle2 = db.spaces.find({\n _id: {\n $in: userSpaces\n }\n }).observe({\n added: function(doc) {\n self.added(\"spaces\", doc._id, doc);\n return userSpaces.push(doc._id);\n },\n changed: function(newDoc, oldDoc) {\n return self.changed(\"spaces\", newDoc._id, newDoc);\n },\n removed: function(oldDoc) {\n self.removed(\"spaces\", oldDoc._id);\n return userSpaces = _.without(userSpaces, oldDoc._id);\n }\n });\n };\n observeSpaces();\n self.ready();\n return self.onStop(function() {\n handle.stop();\n if (handle2) {\n return handle2.stop();\n }\n });\n});\n","# publish some one space's avatar\nMeteor.publish 'space_avatar', (spaceId)->\n\tunless spaceId\n\t\treturn this.ready()\n\n\treturn db.spaces.find({_id: spaceId}, {fields: {avatar: 1,name: 1,enable_register:1}});\n","Meteor.publish('space_avatar', function(spaceId) {\n if (!spaceId) {\n return this.ready();\n }\n return db.spaces.find({\n _id: spaceId\n }, {\n fields: {\n avatar: 1,\n name: 1,\n enable_register: 1\n }\n });\n});\n","Meteor.publish 'modules', ()->\n\tunless this.userId\n\t\treturn this.ready()\n\n\treturn db.modules.find();","Meteor.publish('modules', function() {\n if (!this.userId) {\n return this.ready();\n }\n return db.modules.find();\n});\n","Meteor.publish 'billing_weixin_pay_code_url', (_id)->\n\tunless this.userId\n\t\treturn this.ready()\n\n\tunless _id\n\t\treturn this.ready()\n\n\treturn db.billing_pay_records.find({_id: _id});","Meteor.publish('billing_weixin_pay_code_url', function(_id) {\n if (!this.userId) {\n return this.ready();\n }\n if (!_id) {\n return this.ready();\n }\n return db.billing_pay_records.find({\n _id: _id\n });\n});\n","JsonRoutes.add 'post', '/api/billing/recharge/notify', (req, res, next) ->\n\ttry\n\t\tbody = \"\"\n\t\treq.on('data', (chunk)->\n\t\t\tbody += chunk\n\t\t)\n\t\treq.on('end', Meteor.bindEnvironment((()->\n\t\t\t\txml2js = require('xml2js')\n\t\t\t\tparser = new xml2js.Parser({ trim:true, explicitArray:false, explicitRoot:false })\n\t\t\t\tparser.parseString(body, (err, result)->\n\t\t\t\t\t\t# 特别提醒:商户系统对于支付结果通知的内容一定要做签名验证,并校验返回的订单金额是否与商户侧的订单金额一致,防止数据泄漏导致出现“假通知”,造成资金损失\n\t\t\t\t\t\tWXPay = require('weixin-pay')\n\t\t\t\t\t\twxpay = WXPay({\n\t\t\t\t\t\t\tappid: Meteor.settings.billing.appid,\n\t\t\t\t\t\t\tmch_id: Meteor.settings.billing.mch_id,\n\t\t\t\t\t\t\tpartner_key: Meteor.settings.billing.partner_key #微信商户平台API密钥\n\t\t\t\t\t\t})\n\t\t\t\t\t\tsign = wxpay.sign(_.clone(result))\n\t\t\t\t\t\tattach = JSON.parse(result.attach)\n\t\t\t\t\t\tcode_url_id = attach.code_url_id\n\t\t\t\t\t\tbpr = db.billing_pay_records.findOne(code_url_id)\n\t\t\t\t\t\tif bpr and bpr.total_fee is Number(result.total_fee) and sign is result.sign\n\t\t\t\t\t\t\tdb.billing_pay_records.update({_id: code_url_id}, {$set: {paid: true}})\n\t\t\t\t\t\t\tbillingManager.special_pay(bpr.space, bpr.modules, Number(result.total_fee), bpr.created_by, bpr.end_date, bpr.user_count)\n\t\t\t\t\t\n\t\t\t\t)\n\t\t\t), (err)->\n\t\t\t\tconsole.error err.stack\n\t\t\t\tconsole.log 'Failed to bind environment: api_billing_recharge_notify.coffee'\n\t\t\t)\n\t\t)\n\t\t\n\tcatch e\n\t\tconsole.error e.stack\n\n\tres.writeHead(200, {'Content-Type': 'application/xml'})\n\tres.end('')\n\n\t\t","JsonRoutes.add('post', '/api/billing/recharge/notify', function(req, res, next) {\n var body, e;\n try {\n body = \"\";\n req.on('data', function(chunk) {\n return body += chunk;\n });\n req.on('end', Meteor.bindEnvironment((function() {\n var parser, xml2js;\n xml2js = require('xml2js');\n parser = new xml2js.Parser({\n trim: true,\n explicitArray: false,\n explicitRoot: false\n });\n return parser.parseString(body, function(err, result) {\n var WXPay, attach, bpr, code_url_id, sign, wxpay;\n WXPay = require('weixin-pay');\n wxpay = WXPay({\n appid: Meteor.settings.billing.appid,\n mch_id: Meteor.settings.billing.mch_id,\n partner_key: Meteor.settings.billing.partner_key\n });\n sign = wxpay.sign(_.clone(result));\n attach = JSON.parse(result.attach);\n code_url_id = attach.code_url_id;\n bpr = db.billing_pay_records.findOne(code_url_id);\n if (bpr && bpr.total_fee === Number(result.total_fee) && sign === result.sign) {\n db.billing_pay_records.update({\n _id: code_url_id\n }, {\n $set: {\n paid: true\n }\n });\n return billingManager.special_pay(bpr.space, bpr.modules, Number(result.total_fee), bpr.created_by, bpr.end_date, bpr.user_count);\n }\n });\n }), function(err) {\n console.error(err.stack);\n return console.log('Failed to bind environment: api_billing_recharge_notify.coffee');\n }));\n } catch (error) {\n e = error;\n console.error(e.stack);\n }\n res.writeHead(200, {\n 'Content-Type': 'application/xml'\n });\n return res.end('');\n});\n","Meteor.methods\n\tget_contacts_limit: (space)->\n\t\t# 根据当前用户所属组织,查询出当前用户限定的组织查看范围\n\t\t# 返回的isLimit为true表示限定在当前用户所在组织范围,organizations值记录额外的组织范围\n\t\t# 返回的isLimit为false表示不限定组织范围,即表示能看整个工作区的组织\n\t\t# 默认返回限定在当前用户所属组织\n\t\tcheck space, String\n\t\treValue =\n\t\t\tisLimit: true\n\t\t\toutside_organizations: []\n\t\tunless this.userId\n\t\t\treturn reValue\n\t\tisLimit = false\n\t\toutside_organizations = []\n\t\tsetting = db.space_settings.findOne({space: space, key: \"contacts_view_limits\"})\n\t\tlimits = setting?.values || [];\n\n\t\tif limits.length\n\t\t\tmyOrgs = db.organizations.find({space: space, users: this.userId}, {fields:{_id: 1}})\n\t\t\tmyOrgIds = myOrgs.map (n) ->\n\t\t\t\treturn n._id\n\t\t\tunless myOrgIds.length\n\t\t\t\treturn reValue\n\t\t\t\n\t\t\tmyLitmitOrgIds = []\n\t\t\tfor limit in limits\n\t\t\t\tfroms = limit.froms\n\t\t\t\ttos = limit.tos\n\t\t\t\tfromsChildren = db.organizations.find({space: space, parents: {$in: froms}}, {fields:{_id: 1}})\n\t\t\t\tfromsChildrenIds = fromsChildren?.map (n) ->\n\t\t\t\t\treturn n._id\n\t\t\t\tfor myOrgId in myOrgIds\n\t\t\t\t\ttempIsLimit = false\n\t\t\t\t\tif froms.indexOf(myOrgId) > -1\n\t\t\t\t\t\ttempIsLimit = true\n\t\t\t\t\telse\n\t\t\t\t\t\tif fromsChildrenIds.indexOf(myOrgId) > -1\n\t\t\t\t\t\t\ttempIsLimit = true\n\t\t\t\t\tif tempIsLimit\n\t\t\t\t\t\tisLimit = true\n\t\t\t\t\t\toutside_organizations.push tos\n\t\t\t\t\t\tmyLitmitOrgIds.push myOrgId\n\n\t\t\tmyLitmitOrgIds = _.uniq myLitmitOrgIds\n\t\t\tif myLitmitOrgIds.length < myOrgIds.length\n\t\t\t\t# 如果受限的组织个数小于用户所属组织的个数,则说明当前用户至少有一个组织是不受限的\n\t\t\t\tisLimit = false\n\t\t\t\toutside_organizations = []\n\t\t\telse\n\t\t\t\toutside_organizations = _.uniq _.flatten outside_organizations\n\n\t\tif isLimit\n\t\t\ttoOrgs = db.organizations.find({space: space, _id: {$in: outside_organizations}}, {fields:{_id: 1, parents: 1}}).fetch()\n\t\t\t# 把outside_organizations中有父子节点关系的节点筛选出来并取出最外层节点\n\t\t\t# 把outside_organizations中有属于用户所属组织的子孙节点的节点删除\n\t\t\torgs = _.filter toOrgs, (org) ->\n\t\t\t\tparents = org.parents or []\n\t\t\t\treturn _.intersection(parents, outside_organizations).length < 1 and _.intersection(parents, myOrgIds).length < 1\n\t\t\toutside_organizations = orgs.map (n) ->\n\t\t\t\treturn n._id\n\n\t\treValue.isLimit = isLimit\n\t\treValue.outside_organizations = outside_organizations\n\t\treturn reValue\n","Meteor.methods({\n get_contacts_limit: function(space) {\n var froms, fromsChildren, fromsChildrenIds, i, isLimit, j, len, len1, limit, limits, myLitmitOrgIds, myOrgId, myOrgIds, myOrgs, orgs, outside_organizations, reValue, setting, tempIsLimit, toOrgs, tos;\n check(space, String);\n reValue = {\n isLimit: true,\n outside_organizations: []\n };\n if (!this.userId) {\n return reValue;\n }\n isLimit = false;\n outside_organizations = [];\n setting = db.space_settings.findOne({\n space: space,\n key: \"contacts_view_limits\"\n });\n limits = (setting != null ? setting.values : void 0) || [];\n if (limits.length) {\n myOrgs = db.organizations.find({\n space: space,\n users: this.userId\n }, {\n fields: {\n _id: 1\n }\n });\n myOrgIds = myOrgs.map(function(n) {\n return n._id;\n });\n if (!myOrgIds.length) {\n return reValue;\n }\n myLitmitOrgIds = [];\n for (i = 0, len = limits.length; i < len; i++) {\n limit = limits[i];\n froms = limit.froms;\n tos = limit.tos;\n fromsChildren = db.organizations.find({\n space: space,\n parents: {\n $in: froms\n }\n }, {\n fields: {\n _id: 1\n }\n });\n fromsChildrenIds = fromsChildren != null ? fromsChildren.map(function(n) {\n return n._id;\n }) : void 0;\n for (j = 0, len1 = myOrgIds.length; j < len1; j++) {\n myOrgId = myOrgIds[j];\n tempIsLimit = false;\n if (froms.indexOf(myOrgId) > -1) {\n tempIsLimit = true;\n } else {\n if (fromsChildrenIds.indexOf(myOrgId) > -1) {\n tempIsLimit = true;\n }\n }\n if (tempIsLimit) {\n isLimit = true;\n outside_organizations.push(tos);\n myLitmitOrgIds.push(myOrgId);\n }\n }\n }\n myLitmitOrgIds = _.uniq(myLitmitOrgIds);\n if (myLitmitOrgIds.length < myOrgIds.length) {\n isLimit = false;\n outside_organizations = [];\n } else {\n outside_organizations = _.uniq(_.flatten(outside_organizations));\n }\n }\n if (isLimit) {\n toOrgs = db.organizations.find({\n space: space,\n _id: {\n $in: outside_organizations\n }\n }, {\n fields: {\n _id: 1,\n parents: 1\n }\n }).fetch();\n orgs = _.filter(toOrgs, function(org) {\n var parents;\n parents = org.parents || [];\n return _.intersection(parents, outside_organizations).length < 1 && _.intersection(parents, myOrgIds).length < 1;\n });\n outside_organizations = orgs.map(function(n) {\n return n._id;\n });\n }\n reValue.isLimit = isLimit;\n reValue.outside_organizations = outside_organizations;\n return reValue;\n }\n});\n","Meteor.methods({\n setKeyValue: function(key, value) {\n check(key, String);\n check(value, Object);\n\n obj = {};\n obj.user = this.userId;\n obj.key = key;\n obj.value = value;\n\n var c = db.steedos_keyvalues.find({\n user: this.userId,\n key: key\n }).count();\n if (c > 0) {\n db.steedos_keyvalues.update({\n user: this.userId,\n key: key\n }, {\n $set: {\n value: value\n }\n });\n } else {\n db.steedos_keyvalues.insert(obj);\n }\n\n return true;\n }\n})","Meteor.methods\n\tbilling_settleup: (accounting_month, space_id=\"\")->\n\t\tcheck(accounting_month, String)\n\t\tcheck(space_id, String)\n\n\t\tuser = db.users.findOne({_id: this.userId}, {fields: {is_cloudadmin: 1}})\n\n\t\tif not user.is_cloudadmin\n\t\t\treturn\n\n\t\tconsole.time 'billing'\n\t\tspaces = []\n\t\tif space_id\n\t\t\tspaces = db.spaces.find({_id: space_id, is_paid: true}, {fields: {_id: 1}})\n\t\telse\n\t\t\tspaces = db.spaces.find({is_paid: true}, {fields: {_id: 1}})\n\t\tresult = []\n\t\tspaces.forEach (s) ->\n\t\t\ttry\n\t\t\t\tbillingManager.caculate_by_accounting_month(accounting_month, s._id)\n\t\t\tcatch err\n\t\t\t\te = {}\n\t\t\t\te._id = s._id\n\t\t\t\te.name = s.name\n\t\t\t\te.err = err\n\t\t\t\tresult.push e\n\t\tif result.length > 0\n\t\t\tconsole.error result\n\t\t\ttry\n\t\t\t\tEmail = Package.email.Email\n\t\t\t\tEmail.send\n\t\t\t\t\tto: 'support@steedos.com'\n\t\t\t\t\tfrom: Accounts.emailTemplates.from\n\t\t\t\t\tsubject: 'billing settleup result'\n\t\t\t\t\ttext: JSON.stringify('result': result)\n\t\t\tcatch err\n\t\t\t\tconsole.error err\n\t\tconsole.timeEnd 'billing'","Meteor.methods({\n billing_settleup: function(accounting_month, space_id) {\n var Email, err, result, spaces, user;\n if (space_id == null) {\n space_id = \"\";\n }\n check(accounting_month, String);\n check(space_id, String);\n user = db.users.findOne({\n _id: this.userId\n }, {\n fields: {\n is_cloudadmin: 1\n }\n });\n if (!user.is_cloudadmin) {\n return;\n }\n console.time('billing');\n spaces = [];\n if (space_id) {\n spaces = db.spaces.find({\n _id: space_id,\n is_paid: true\n }, {\n fields: {\n _id: 1\n }\n });\n } else {\n spaces = db.spaces.find({\n is_paid: true\n }, {\n fields: {\n _id: 1\n }\n });\n }\n result = [];\n spaces.forEach(function(s) {\n var e, err;\n try {\n return billingManager.caculate_by_accounting_month(accounting_month, s._id);\n } catch (error) {\n err = error;\n e = {};\n e._id = s._id;\n e.name = s.name;\n e.err = err;\n return result.push(e);\n }\n });\n if (result.length > 0) {\n console.error(result);\n try {\n Email = Package.email.Email;\n Email.send({\n to: 'support@steedos.com',\n from: Accounts.emailTemplates.from,\n subject: 'billing settleup result',\n text: JSON.stringify({\n 'result': result\n })\n });\n } catch (error) {\n err = error;\n console.error(err);\n }\n }\n return console.timeEnd('billing');\n }\n});\n","Meteor.methods\n\tsetUsername: (space_id, username, user_id) ->\n\t\tcheck(space_id, String);\n\t\tcheck(username, String);\n\n\t\tif !Steedos.isSpaceAdmin(space_id, Meteor.userId()) and user_id\n\t\t\tthrow new Meteor.Error(400, 'contact_space_user_needed')\n\n\t\tif not Meteor.userId()\n\t\t\tthrow new Meteor.Error(400,'error-invalid-user')\n\n\t\tunless user_id\n\t\t\tuser_id = Meteor.user()._id\n\n\t\tspaceUser = db.space_users.findOne({user: user_id, space: space_id})\n\n\t\tif spaceUser.invite_state == \"pending\" or spaceUser.invite_state == \"refused\"\n\t\t\tthrow new Meteor.Error(400, \"该用户尚未同意加入该工作区,无法修改用户名\")\n\n\t\tdb.users.update({_id: user_id}, {$set: {username: username}})\n\n\t\treturn username\n","Meteor.methods({\n setUsername: function(space_id, username, user_id) {\n var spaceUser;\n check(space_id, String);\n check(username, String);\n if (!Steedos.isSpaceAdmin(space_id, Meteor.userId()) && user_id) {\n throw new Meteor.Error(400, 'contact_space_user_needed');\n }\n if (!Meteor.userId()) {\n throw new Meteor.Error(400, 'error-invalid-user');\n }\n if (!user_id) {\n user_id = Meteor.user()._id;\n }\n spaceUser = db.space_users.findOne({\n user: user_id,\n space: space_id\n });\n if (spaceUser.invite_state === \"pending\" || spaceUser.invite_state === \"refused\") {\n throw new Meteor.Error(400, \"该用户尚未同意加入该工作区,无法修改用户名\");\n }\n db.users.update({\n _id: user_id\n }, {\n $set: {\n username: username\n }\n });\n return username;\n }\n});\n","Meteor.methods\n\tbilling_recharge: (total_fee, space_id, new_id, module_names, end_date, user_count)->\n\t\tcheck total_fee, Number\n\t\tcheck space_id, String \n\t\tcheck new_id, String \n\t\tcheck module_names, Array \n\t\tcheck end_date, String \n\t\tcheck user_count, Number \n\n\t\tuser_id = this.userId\n\n\t\tlistprices = 0\n\t\torder_body = []\n\t\tdb.modules.find({name: {$in: module_names}}).forEach (m)->\n\t\t\tlistprices += m.listprice_rmb\n\t\t\torder_body.push m.name_zh\n\n\t\tspace = db.spaces.findOne(space_id)\n\t\tif not space.is_paid\n\t\t\tspace_user_count = db.space_users.find({space:space_id}).count()\n\t\t\tone_month_yuan = space_user_count * listprices\n\t\t\tif total_fee < one_month_yuan*100\n\t\t\t\tthrow new Meteor.Error 'error!', \"充值金额应不少于一个月所需费用:¥#{one_month_yuan}\"\n\n\t\tresult_obj = {}\n\n\t\tattach = {}\n\t\tattach.code_url_id = new_id\n\t\tWXPay = require('weixin-pay')\n\n\t\twxpay = WXPay({\n\t\t\tappid: Meteor.settings.billing.appid,\n\t\t\tmch_id: Meteor.settings.billing.mch_id,\n\t\t\tpartner_key: Meteor.settings.billing.partner_key #微信商户平台API密钥\n\t\t})\n\n\t\twxpay.createUnifiedOrder({\n\t\t\tbody: order_body.join(\",\"),\n\t\t\tout_trade_no: moment().format('YYYYMMDDHHmmssSSS'),\n\t\t\ttotal_fee: total_fee,\n\t\t\tspbill_create_ip: '127.0.0.1',\n\t\t\tnotify_url: Meteor.absoluteUrl() + 'api/billing/recharge/notify',\n\t\t\ttrade_type: 'NATIVE',\n\t\t\tproduct_id: moment().format('YYYYMMDDHHmmssSSS'),\n\t\t\tattach: JSON.stringify(attach)\n\t\t}, Meteor.bindEnvironment(((err, result) -> \n\t\t\t\tif err \n\t\t\t\t\tconsole.error err.stack\n\t\t\t\tif result\n\t\t\t\t\tobj = {}\n\t\t\t\t\tobj._id = new_id\n\t\t\t\t\tobj.created = new Date\n\t\t\t\t\tobj.info = result\n\t\t\t\t\tobj.total_fee = total_fee\n\t\t\t\t\tobj.created_by = user_id\n\t\t\t\t\tobj.space = space_id\n\t\t\t\t\tobj.paid = false\n\t\t\t\t\tobj.modules = module_names\n\t\t\t\t\tobj.end_date = end_date\n\t\t\t\t\tobj.user_count = user_count\n\t\t\t\t\tdb.billing_pay_records.insert(obj)\n\t\t\t), (e)->\n\t\t\t\tconsole.log 'Failed to bind environment: billing_recharge.coffee'\n\t\t\t\tconsole.log e.stack\n\t\t\t)\n\t\t)\n\n\t\t\n\t\treturn \"success\"","Meteor.methods({\n billing_recharge: function(total_fee, space_id, new_id, module_names, end_date, user_count) {\n var WXPay, attach, listprices, one_month_yuan, order_body, result_obj, space, space_user_count, user_id, wxpay;\n check(total_fee, Number);\n check(space_id, String);\n check(new_id, String);\n check(module_names, Array);\n check(end_date, String);\n check(user_count, Number);\n user_id = this.userId;\n listprices = 0;\n order_body = [];\n db.modules.find({\n name: {\n $in: module_names\n }\n }).forEach(function(m) {\n listprices += m.listprice_rmb;\n return order_body.push(m.name_zh);\n });\n space = db.spaces.findOne(space_id);\n if (!space.is_paid) {\n space_user_count = db.space_users.find({\n space: space_id\n }).count();\n one_month_yuan = space_user_count * listprices;\n if (total_fee < one_month_yuan * 100) {\n throw new Meteor.Error('error!', \"充值金额应不少于一个月所需费用:¥\" + one_month_yuan);\n }\n }\n result_obj = {};\n attach = {};\n attach.code_url_id = new_id;\n WXPay = require('weixin-pay');\n wxpay = WXPay({\n appid: Meteor.settings.billing.appid,\n mch_id: Meteor.settings.billing.mch_id,\n partner_key: Meteor.settings.billing.partner_key\n });\n wxpay.createUnifiedOrder({\n body: order_body.join(\",\"),\n out_trade_no: moment().format('YYYYMMDDHHmmssSSS'),\n total_fee: total_fee,\n spbill_create_ip: '127.0.0.1',\n notify_url: Meteor.absoluteUrl() + 'api/billing/recharge/notify',\n trade_type: 'NATIVE',\n product_id: moment().format('YYYYMMDDHHmmssSSS'),\n attach: JSON.stringify(attach)\n }, Meteor.bindEnvironment((function(err, result) {\n var obj;\n if (err) {\n console.error(err.stack);\n }\n if (result) {\n obj = {};\n obj._id = new_id;\n obj.created = new Date;\n obj.info = result;\n obj.total_fee = total_fee;\n obj.created_by = user_id;\n obj.space = space_id;\n obj.paid = false;\n obj.modules = module_names;\n obj.end_date = end_date;\n obj.user_count = user_count;\n return db.billing_pay_records.insert(obj);\n }\n }), function(e) {\n console.log('Failed to bind environment: billing_recharge.coffee');\n return console.log(e.stack);\n }));\n return \"success\";\n }\n});\n","Meteor.methods\n\tget_space_user_count: (space_id)->\n\t\tcheck space_id, String\n\t\tuser_count_info = new Object\n\t\tuser_count_info.total_user_count = db.space_users.find({space: space_id}).count()\n\t\tuser_count_info.accepted_user_count = db.space_users.find({space: space_id, user_accepted: true}).count()\n\t\treturn user_count_info","Meteor.methods\n\tcreate_secret: (name)->\n\t\tif !this.userId\n\t\t\treturn false;\n\n\t\tdb.users.create_secret this.userId, name\n\n\tremove_secret: (token)->\n\t\tif !this.userId || !token\n\t\t\treturn false;\n\n\t\thashedToken = Accounts._hashLoginToken(token)\n\n\t\tconsole.log(\"token\", token)\n\n\t\tdb.users.update({_id: this.userId}, {$pull: {\"secrets\": {hashedToken: hashedToken}}})\n","Meteor.methods({\n create_secret: function(name) {\n if (!this.userId) {\n return false;\n }\n return db.users.create_secret(this.userId, name);\n },\n remove_secret: function(token) {\n var hashedToken;\n if (!this.userId || !token) {\n return false;\n }\n hashedToken = Accounts._hashLoginToken(token);\n console.log(\"token\", token);\n return db.users.update({\n _id: this.userId\n }, {\n $pull: {\n \"secrets\": {\n hashedToken: hashedToken\n }\n }\n });\n }\n});\n","Meteor.methods\n 'object_workflows.get': (spaceId, userId) ->\n check spaceId, String\n check userId, String\n\n curSpaceUser = Creator.Collections[\"space_users\"].findOne({space: spaceId, user: userId}, {fields: {organizations: 1}})\n if !curSpaceUser\n throw new Meteor.Error 'not-authorized'\n\n organizations = Creator.getCollection('organizations').find({\n _id: {\n $in: curSpaceUser.organizations\n }\n }, {fields: {parents: 1}}).fetch()\n\n ows = Creator.getCollection('object_workflows').find({ space: spaceId }, { fields: { object_name: 1, flow_id: 1, space: 1 } }).fetch()\n _.each ows,(o) ->\n fl = Creator.getCollection('flows').findOne(o.flow_id, { fields: { name: 1, perms: 1 } })\n if fl\n o.flow_name = fl.name\n o.can_add = false\n\n perms = fl.perms\n if perms\n if perms.users_can_add && perms.users_can_add.includes(userId)\n o.can_add = true\n else if perms.orgs_can_add && perms.orgs_can_add.length > 0\n if curSpaceUser && curSpaceUser.organizations && _.intersection(curSpaceUser.organizations, perms.orgs_can_add).length > 0\n o.can_add = true\n else\n if organizations\n o.can_add = _.some organizations, (org)->\n return org.parents && _.intersection(org.parents, perms.orgs_can_add).length > 0\n\n ows = ows.filter (n)->\n return n.flow_name\n\n return ows","Meteor.methods({\n 'object_workflows.get': function(spaceId, userId) {\n var curSpaceUser, organizations, ows;\n check(spaceId, String);\n check(userId, String);\n curSpaceUser = Creator.Collections[\"space_users\"].findOne({\n space: spaceId,\n user: userId\n }, {\n fields: {\n organizations: 1\n }\n });\n if (!curSpaceUser) {\n throw new Meteor.Error('not-authorized');\n }\n organizations = Creator.getCollection('organizations').find({\n _id: {\n $in: curSpaceUser.organizations\n }\n }, {\n fields: {\n parents: 1\n }\n }).fetch();\n ows = Creator.getCollection('object_workflows').find({\n space: spaceId\n }, {\n fields: {\n object_name: 1,\n flow_id: 1,\n space: 1\n }\n }).fetch();\n _.each(ows, function(o) {\n var fl, perms;\n fl = Creator.getCollection('flows').findOne(o.flow_id, {\n fields: {\n name: 1,\n perms: 1\n }\n });\n if (fl) {\n o.flow_name = fl.name;\n o.can_add = false;\n perms = fl.perms;\n if (perms) {\n if (perms.users_can_add && perms.users_can_add.includes(userId)) {\n return o.can_add = true;\n } else if (perms.orgs_can_add && perms.orgs_can_add.length > 0) {\n if (curSpaceUser && curSpaceUser.organizations && _.intersection(curSpaceUser.organizations, perms.orgs_can_add).length > 0) {\n return o.can_add = true;\n } else {\n if (organizations) {\n return o.can_add = _.some(organizations, function(org) {\n return org.parents && _.intersection(org.parents, perms.orgs_can_add).length > 0;\n });\n }\n }\n }\n }\n }\n });\n ows = ows.filter(function(n) {\n return n.flow_name;\n });\n return ows;\n }\n});\n","Meteor.methods\n\tsetSpaceUserPassword: (space_user_id, space_id, password) ->\n\t\tif !this.userId\n\t\t\tthrow new Meteor.Error(400, \"请先登录\")\n\t\t\n\t\tspace = db.spaces.findOne({_id: space_id})\n\t\tisSpaceAdmin = space?.admins?.includes(this.userId)\n\n\t\tunless isSpaceAdmin\n\t\t\tthrow new Meteor.Error(400, \"您没有权限修改该用户密码\")\n\n\t\tspaceUser = db.space_users.findOne({_id: space_user_id, space: space_id})\n\t\tuser_id = spaceUser.user;\n\t\tuserCP = db.users.findOne({_id: user_id})\n\t\tcurrentUser = db.users.findOne({_id: this.userId})\n\n\t\tif spaceUser.invite_state == \"pending\" or spaceUser.invite_state == \"refused\"\n\t\t\tthrow new Meteor.Error(400, \"该用户尚未同意加入该工作区,无法修改密码\")\n\n\t\tSteedos.validatePassword(password)\n\t\tlogout = true;\n\t\tif this.userId == user_id\n\t\t\tlogout = false\n\t\tAccounts.setPassword(user_id, password, {logout: logout})\n\t\tchangedUserInfo = db.users.findOne({_id: user_id})\n\t\tif changedUserInfo\n\t\t\tdb.users.update({_id: user_id}, {$push: {'services.password_history': changedUserInfo.services?.password?.bcrypt}})\n\n\t\t# 如果用户手机号通过验证,就发短信提醒\n\t\tif userCP.mobile && userCP.mobile_verified\n\t\t\tlang = 'en'\n\t\t\tif userCP.locale is 'zh-cn'\n\t\t\t\tlang = 'zh-CN'\n\t\t\tSMSQueue.send\n\t\t\t\tFormat: 'JSON',\n\t\t\t\tAction: 'SingleSendSms',\n\t\t\t\tParamString: '',\n\t\t\t\tRecNum: userCP.mobile,\n\t\t\t\tSignName: '华炎办公',\n\t\t\t\tTemplateCode: 'SMS_67200967',\n\t\t\t\tmsg: TAPi18n.__('sms.change_password.template', {}, lang)\n\n","Meteor.methods({\n setSpaceUserPassword: function(space_user_id, space_id, password) {\n var changedUserInfo, currentUser, isSpaceAdmin, lang, logout, ref, ref1, ref2, space, spaceUser, userCP, user_id;\n if (!this.userId) {\n throw new Meteor.Error(400, \"请先登录\");\n }\n space = db.spaces.findOne({\n _id: space_id\n });\n isSpaceAdmin = space != null ? (ref = space.admins) != null ? ref.includes(this.userId) : void 0 : void 0;\n if (!isSpaceAdmin) {\n throw new Meteor.Error(400, \"您没有权限修改该用户密码\");\n }\n spaceUser = db.space_users.findOne({\n _id: space_user_id,\n space: space_id\n });\n user_id = spaceUser.user;\n userCP = db.users.findOne({\n _id: user_id\n });\n currentUser = db.users.findOne({\n _id: this.userId\n });\n if (spaceUser.invite_state === \"pending\" || spaceUser.invite_state === \"refused\") {\n throw new Meteor.Error(400, \"该用户尚未同意加入该工作区,无法修改密码\");\n }\n Steedos.validatePassword(password);\n logout = true;\n if (this.userId === user_id) {\n logout = false;\n }\n Accounts.setPassword(user_id, password, {\n logout: logout\n });\n changedUserInfo = db.users.findOne({\n _id: user_id\n });\n if (changedUserInfo) {\n db.users.update({\n _id: user_id\n }, {\n $push: {\n 'services.password_history': (ref1 = changedUserInfo.services) != null ? (ref2 = ref1.password) != null ? ref2.bcrypt : void 0 : void 0\n }\n });\n }\n if (userCP.mobile && userCP.mobile_verified) {\n lang = 'en';\n if (userCP.locale === 'zh-cn') {\n lang = 'zh-CN';\n }\n return SMSQueue.send({\n Format: 'JSON',\n Action: 'SingleSendSms',\n ParamString: '',\n RecNum: userCP.mobile,\n SignName: '华炎办公',\n TemplateCode: 'SMS_67200967',\n msg: TAPi18n.__('sms.change_password.template', {}, lang)\n });\n }\n }\n});\n","billingManager = {}\n\n# 获得结算周期内的可结算日数\n# space_id 结算对象工作区\n# accounting_month 结算月,格式:YYYYMM\nbillingManager.get_accounting_period = (space_id, accounting_month)->\n\tcount_days = 0\n\n\tend_date_time = new Date(parseInt(accounting_month.slice(0,4)), parseInt(accounting_month.slice(4,6)), 0)\n\tend_date = moment(end_date_time.getTime()).format('YYYYMMDD')\n\n\tbilling = db.billings.findOne({space: space_id, transaction: \"Starting balance\"})\n\tfirst_date = billing.billing_date\n\n\tstart_date = accounting_month + \"01\"\n\tstart_date_time = new Date(parseInt(accounting_month.slice(0,4)), parseInt(accounting_month.slice(4,6)), 1-end_date_time.getDate())\n\n\tif first_date >= end_date # 这个月不在本次结算范围之内,count_days=0\n\t\t# do nothing\n\telse if start_date <= first_date and first_date < end_date\n\t\tcount_days = (end_date_time - start_date_time)/(24*60*60*1000) + 1\n\telse if first_date < start_date\n\t\tcount_days = (end_date_time - start_date_time)/(24*60*60*1000) + 1\n\n\treturn {\"count_days\": count_days}\n\n# 重算这一日的余额\nbillingManager.refresh_balance = (space_id, refresh_date)->\n\tlast_bill = null\n\tbill = db.billings.findOne({space: space_id, created: refresh_date})\n\n\t# 获取正常付款的小于refresh_date的最近的一条记录\n\tpayment_bill = db.billings.findOne(\n\t\t{\n\t\t\tspace: space_id,\n\t\t\tcreated: {\n\t\t\t\t$lt: refresh_date\n\t\t\t},\n\t\t\tbilling_month: bill.billing_month\n\t\t},\n\t\t{\n\t\t\tsort: {\n\t\t\t\tmodified: -1\n\t\t\t}\n\t\t}\n\t)\n\tif payment_bill\n\t\tlast_bill = payment_bill\n\telse\n\t\t# 获取最新的结算的一条记录\n\t\tb_m_d = new Date(parseInt(bill.billing_month.slice(0,4)), parseInt(bill.billing_month.slice(4,6)), 0)\n\t\tb_m = moment(b_m_d.getTime()-(b_m_d.getDate()*24*60*60*1000)).format(\"YYYYMM\")\n\n\t\tapp_bill = db.billings.findOne(\n\t\t\t{\n\t\t\t\tspace: space_id,\n\t\t\t\tbilling_month: b_m\n\t\t\t},\n\t\t\t{\n\t\t\t\tsort: {\n\t\t\t\t\tmodified: -1\n\t\t\t\t}\n\t\t\t}\n\t\t)\n\t\tif app_bill\n\t\t\tlast_bill = app_bill\n\n\tlast_balance = if last_bill and last_bill.balance then last_bill.balance else 0.0\n\n\tdebits = if bill.debits then bill.debits else 0.0\n\tcredits = if bill.credits then bill.credits else 0.0\n\tsetObj = new Object\n\tsetObj.balance = Number((last_balance + credits - debits).toFixed(2))\n\tsetObj.modified = new Date\n\tdb.billings.direct.update({_id: bill._id}, {$set: setObj})\n\n# 结算当月的支出与余额\nbillingManager.get_balance = (space_id, accounting_month, user_count, count_days, module_name, listprice)->\n\taccounting_date = new Date(parseInt(accounting_month.slice(0,4)), parseInt(accounting_month.slice(4,6)), 0)\n\tdays_number = accounting_date.getDate()\n\taccounting_date_format = moment(accounting_date).format(\"YYYYMMDD\")\n\n\tdebits = Number(((count_days/days_number) * user_count * listprice).toFixed(2))\n\tlast_bill = db.billings.findOne(\n\t\t{\n\t\t\tspace: space_id,\n\t\t\tbilling_date: {\n\t\t\t\t$lte: accounting_date_format\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\tsort: {\n\t\t\t\tmodified: -1\n\t\t\t}\n\t\t}\n\t)\n\tlast_balance = if last_bill and last_bill.balance then last_bill.balance else 0.0\n\n\tnow = new Date\n\tnew_bill = new Object\n\tnew_bill._id = db.billings._makeNewID()\n\tnew_bill.billing_month = accounting_month\n\tnew_bill.billing_date = accounting_date_format\n\tnew_bill.space = space_id\n\tnew_bill.transaction = module_name\n\tnew_bill.listprice = listprice\n\tnew_bill.user_count = user_count\n\tnew_bill.debits = debits\n\tnew_bill.balance = Number((last_balance - debits).toFixed(2))\n\tnew_bill.created = now\n\tnew_bill.modified = now\n\tdb.billings.direct.insert(new_bill)\n\nbillingManager.getSpaceUserCount = (space_id)->\n\tdb.space_users.find({space: space_id, user_accepted: true}).count()\n\nbillingManager.recaculateBalance = (accounting_month, space_id)->\n\trefresh_dates = new Array\n\tdb.billings.find(\n\t\t{\n\t\t\tbilling_month: accounting_month,\n\t\t\tspace: space_id,\n\t\t\ttransaction: {$in: [\"Payment\", \"Service adjustment\"]}\n\t\t},\n\t\t{\n\t\t\tsort: {created: 1}\n\t\t}\n\t).forEach (bill)->\n\t\trefresh_dates.push(bill.created)\n\n\tif refresh_dates.length > 0\n\t\t_.each refresh_dates, (r_d)->\n\t\t\tbillingManager.refresh_balance(space_id, r_d)\n\nbillingManager.get_modules = (space_id, accounting_month)->\n\tmodules = new Array\n\tstart_date = accounting_month + \"01\"\n\tend_date_time = new Date(parseInt(accounting_month.slice(0,4)), parseInt(accounting_month.slice(4,6)), 0)\n\tend_date = moment(end_date_time.getTime()).format('YYYYMMDD')\n\n\tdb.modules.find().forEach (m)->\n\t\tm_changelog = db.modules_changelogs.findOne(\n\t\t\t{\n\t\t\t\tspace: space_id,\n\t\t\t\tmodule: m.name,\n\t\t\t\tchange_date: {\n\t\t\t\t\t$lte: end_date\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\tcreated: -1\n\t\t\t}\n\t\t)\n\t\t# 若未获得可匹配的记录,说明该module未安装,当月不计算费用\n\t\tif not m_changelog\n\t\t\t# do nothing\n\n\t\t# 若该记录的change_date= start_date\n\t\t\tmodules.push(m)\n\n\treturn modules\n\nbillingManager.get_modules_name = ()->\n\tmodules_name = new Array\n\tdb.modules.find().forEach((m)->\n\t\tmodules_name.push(m.name)\n\t)\n\treturn modules_name\n\n\nbillingManager.caculate_by_accounting_month = (accounting_month, space_id)->\n\tif accounting_month > (moment().format('YYYYMM'))\n\t\treturn\n\tif accounting_month == (moment().format('YYYYMM'))\n\t\t# 重算当月的充值后余额\n\t\tbillingManager.recaculateBalance(accounting_month, space_id)\n\n\t\tdebits = 0\n\t\tmodules_name = billingManager.get_modules_name()\n\t\tb_m_d = new Date(parseInt(accounting_month.slice(0,4)), parseInt(accounting_month.slice(4,6)), 0)\n\t\tb_m = moment(b_m_d.getTime()-(b_m_d.getDate()*24*60*60*1000)).format(\"YYYYMMDD\")\n\t\tdb.billings.find(\n\t\t\t{\n\t\t\t\tbilling_date: b_m,\n\t\t\t\tspace: space_id,\n\t\t\t\ttransaction: {\n\t\t\t\t\t$in: modules_name\n\t\t\t\t}\n\t\t\t}\n\t\t).forEach((b)->\n\t\t\tdebits += b.debits\n\t\t)\n\t\tnewest_bill = db.billings.findOne({space: space_id}, {sort: {modified: -1}})\n\t\tbalance = newest_bill.balance\n\t\tremaining_months = 0\n\t\tif balance > 0\n\t\t\tif debits > 0\n\t\t\t\tremaining_months = parseInt(balance/debits) + 1\n\t\t\telse\n\t\t\t\t# 当月刚升级,并没有扣款\n\t\t\t\tremaining_months = 1\n\n\t\tdb.spaces.direct.update(\n\t\t\t{\n\t\t\t\t_id: space_id\n\t\t\t},\n\t\t\t{\n\t\t\t\t$set: {\n\t\t\t\t\tbalance: balance,\n\t\t\t\t\t\"billing.remaining_months\": remaining_months\n\t\t\t\t}\n\t\t\t}\n\t\t)\n\telse\n\t\t# 获得其结算对象日期paymentdates数组和count_days可结算日数\n\t\tperiod_result = billingManager.get_accounting_period(space_id, accounting_month)\n\t\tif period_result[\"count_days\"] == 0\n\t\t\t# 也需对当月的充值记录执行更新\n\t\t\tbillingManager.recaculateBalance(accounting_month, space_id)\n\n\t\telse\n\t\t\tuser_count = billingManager.getSpaceUserCount(space_id)\n\n\t\t\t# 清除当月的已结算记录\n\t\t\tmodules_name = billingManager.get_modules_name()\n\t\t\taccounting_date = new Date(parseInt(accounting_month.slice(0,4)), parseInt(accounting_month.slice(4,6)), 0)\n\t\t\taccounting_date_format = moment(accounting_date).format(\"YYYYMMDD\")\n\t\t\tdb.billings.remove(\n\t\t\t\t{\n\t\t\t\t\tbilling_date: accounting_date_format,\n\t\t\t\t\tspace: space_id,\n\t\t\t\t\ttransaction: {\n\t\t\t\t\t\t$in: modules_name\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t)\n\t\t\t# 重算当月的充值后余额\n\t\t\tbillingManager.recaculateBalance(accounting_month, space_id)\n\n\t\t\t# 结算当月的APP使用后余额\n\t\t\tmodules = billingManager.get_modules(space_id, accounting_month)\n\t\t\tif modules and modules.length>0\n\t\t\t\t_.each modules, (m)->\n\t\t\t\t\tbillingManager.get_balance(space_id, accounting_month, user_count, period_result[\"count_days\"], m.name, m.listprice)\n\n\t\ta_m = moment(new Date(parseInt(accounting_month.slice(0,4)), parseInt(accounting_month.slice(4,6)), 1).getTime()).format(\"YYYYMM\")\n\t\tbillingManager.caculate_by_accounting_month(a_m, space_id)\n\nbillingManager.special_pay = (space_id, module_names, total_fee, operator_id, end_date, user_count)->\n\tspace = db.spaces.findOne(space_id)\n\n\tmodules = space.modules || new Array\n\n\tnew_modules = _.difference(module_names, modules)\n\n\tm = moment()\n\tnow = m._d\n\n\tspace_update_obj = new Object\n\n\t# 更新space是否专业版的标记\n\tif space.is_paid isnt true\n\t\tspace_update_obj.is_paid = true\n\t\tspace_update_obj.start_date = new Date\n\n\t# 更新modules\n\tspace_update_obj.modules = module_names\n\tspace_update_obj.modified = now\n\tspace_update_obj.modified_by = operator_id\n\tspace_update_obj.end_date = new Date(end_date)\n\tspace_update_obj.user_limit = user_count\n\n\tr = db.spaces.direct.update({_id: space_id}, {$set: space_update_obj})\n\tif r\n\t\t_.each new_modules, (module)->\n\t\t\tmcl = new Object\n\t\t\tmcl._id = db.modules_changelogs._makeNewID()\n\t\t\tmcl.change_date = m.format(\"YYYYMMDD\")\n\t\t\tmcl.operator = operator_id\n\t\t\tmcl.space = space_id\n\t\t\tmcl.operation = \"install\"\n\t\t\tmcl.module = module\n\t\t\tmcl.created = now\n\t\t\tdb.modules_changelogs.insert(mcl)\n\n\treturn"," \n\nbillingManager = {};\n\nbillingManager.get_accounting_period = function(space_id, accounting_month) {\n var billing, count_days, end_date, end_date_time, first_date, start_date, start_date_time;\n count_days = 0;\n end_date_time = new Date(parseInt(accounting_month.slice(0, 4)), parseInt(accounting_month.slice(4, 6)), 0);\n end_date = moment(end_date_time.getTime()).format('YYYYMMDD');\n billing = db.billings.findOne({\n space: space_id,\n transaction: \"Starting balance\"\n });\n first_date = billing.billing_date;\n start_date = accounting_month + \"01\";\n start_date_time = new Date(parseInt(accounting_month.slice(0, 4)), parseInt(accounting_month.slice(4, 6)), 1 - end_date_time.getDate());\n if (first_date >= end_date) {\n\n } else if (start_date <= first_date && first_date < end_date) {\n count_days = (end_date_time - start_date_time) / (24 * 60 * 60 * 1000) + 1;\n } else if (first_date < start_date) {\n count_days = (end_date_time - start_date_time) / (24 * 60 * 60 * 1000) + 1;\n }\n return {\n \"count_days\": count_days\n };\n};\n\nbillingManager.refresh_balance = function(space_id, refresh_date) {\n var app_bill, b_m, b_m_d, bill, credits, debits, last_balance, last_bill, payment_bill, setObj;\n last_bill = null;\n bill = db.billings.findOne({\n space: space_id,\n created: refresh_date\n });\n payment_bill = db.billings.findOne({\n space: space_id,\n created: {\n $lt: refresh_date\n },\n billing_month: bill.billing_month\n }, {\n sort: {\n modified: -1\n }\n });\n if (payment_bill) {\n last_bill = payment_bill;\n } else {\n b_m_d = new Date(parseInt(bill.billing_month.slice(0, 4)), parseInt(bill.billing_month.slice(4, 6)), 0);\n b_m = moment(b_m_d.getTime() - (b_m_d.getDate() * 24 * 60 * 60 * 1000)).format(\"YYYYMM\");\n app_bill = db.billings.findOne({\n space: space_id,\n billing_month: b_m\n }, {\n sort: {\n modified: -1\n }\n });\n if (app_bill) {\n last_bill = app_bill;\n }\n }\n last_balance = last_bill && last_bill.balance ? last_bill.balance : 0.0;\n debits = bill.debits ? bill.debits : 0.0;\n credits = bill.credits ? bill.credits : 0.0;\n setObj = new Object;\n setObj.balance = Number((last_balance + credits - debits).toFixed(2));\n setObj.modified = new Date;\n return db.billings.direct.update({\n _id: bill._id\n }, {\n $set: setObj\n });\n};\n\nbillingManager.get_balance = function(space_id, accounting_month, user_count, count_days, module_name, listprice) {\n var accounting_date, accounting_date_format, days_number, debits, last_balance, last_bill, new_bill, now;\n accounting_date = new Date(parseInt(accounting_month.slice(0, 4)), parseInt(accounting_month.slice(4, 6)), 0);\n days_number = accounting_date.getDate();\n accounting_date_format = moment(accounting_date).format(\"YYYYMMDD\");\n debits = Number(((count_days / days_number) * user_count * listprice).toFixed(2));\n last_bill = db.billings.findOne({\n space: space_id,\n billing_date: {\n $lte: accounting_date_format\n }\n }, {\n sort: {\n modified: -1\n }\n });\n last_balance = last_bill && last_bill.balance ? last_bill.balance : 0.0;\n now = new Date;\n new_bill = new Object;\n new_bill._id = db.billings._makeNewID();\n new_bill.billing_month = accounting_month;\n new_bill.billing_date = accounting_date_format;\n new_bill.space = space_id;\n new_bill.transaction = module_name;\n new_bill.listprice = listprice;\n new_bill.user_count = user_count;\n new_bill.debits = debits;\n new_bill.balance = Number((last_balance - debits).toFixed(2));\n new_bill.created = now;\n new_bill.modified = now;\n return db.billings.direct.insert(new_bill);\n};\n\nbillingManager.getSpaceUserCount = function(space_id) {\n return db.space_users.find({\n space: space_id,\n user_accepted: true\n }).count();\n};\n\nbillingManager.recaculateBalance = function(accounting_month, space_id) {\n var refresh_dates;\n refresh_dates = new Array;\n db.billings.find({\n billing_month: accounting_month,\n space: space_id,\n transaction: {\n $in: [\"Payment\", \"Service adjustment\"]\n }\n }, {\n sort: {\n created: 1\n }\n }).forEach(function(bill) {\n return refresh_dates.push(bill.created);\n });\n if (refresh_dates.length > 0) {\n return _.each(refresh_dates, function(r_d) {\n return billingManager.refresh_balance(space_id, r_d);\n });\n }\n};\n\nbillingManager.get_modules = function(space_id, accounting_month) {\n var end_date, end_date_time, modules, start_date;\n modules = new Array;\n start_date = accounting_month + \"01\";\n end_date_time = new Date(parseInt(accounting_month.slice(0, 4)), parseInt(accounting_month.slice(4, 6)), 0);\n end_date = moment(end_date_time.getTime()).format('YYYYMMDD');\n db.modules.find().forEach(function(m) {\n var m_changelog;\n m_changelog = db.modules_changelogs.findOne({\n space: space_id,\n module: m.name,\n change_date: {\n $lte: end_date\n }\n }, {\n created: -1\n });\n if (!m_changelog) {\n\n } else if (m_changelog.change_date < start_date && m_changelog.operation === \"install\") {\n return modules.push(m);\n } else if (m_changelog.change_date < start_date && m_changelog.operation === \"uninstall\") {\n\n } else if (m_changelog.change_date >= start_date) {\n return modules.push(m);\n }\n });\n return modules;\n};\n\nbillingManager.get_modules_name = function() {\n var modules_name;\n modules_name = new Array;\n db.modules.find().forEach(function(m) {\n return modules_name.push(m.name);\n });\n return modules_name;\n};\n\nbillingManager.caculate_by_accounting_month = function(accounting_month, space_id) {\n var a_m, accounting_date, accounting_date_format, b_m, b_m_d, balance, debits, modules, modules_name, newest_bill, period_result, remaining_months, user_count;\n if (accounting_month > (moment().format('YYYYMM'))) {\n return;\n }\n if (accounting_month === (moment().format('YYYYMM'))) {\n billingManager.recaculateBalance(accounting_month, space_id);\n debits = 0;\n modules_name = billingManager.get_modules_name();\n b_m_d = new Date(parseInt(accounting_month.slice(0, 4)), parseInt(accounting_month.slice(4, 6)), 0);\n b_m = moment(b_m_d.getTime() - (b_m_d.getDate() * 24 * 60 * 60 * 1000)).format(\"YYYYMMDD\");\n db.billings.find({\n billing_date: b_m,\n space: space_id,\n transaction: {\n $in: modules_name\n }\n }).forEach(function(b) {\n return debits += b.debits;\n });\n newest_bill = db.billings.findOne({\n space: space_id\n }, {\n sort: {\n modified: -1\n }\n });\n balance = newest_bill.balance;\n remaining_months = 0;\n if (balance > 0) {\n if (debits > 0) {\n remaining_months = parseInt(balance / debits) + 1;\n } else {\n remaining_months = 1;\n }\n }\n return db.spaces.direct.update({\n _id: space_id\n }, {\n $set: {\n balance: balance,\n \"billing.remaining_months\": remaining_months\n }\n });\n } else {\n period_result = billingManager.get_accounting_period(space_id, accounting_month);\n if (period_result[\"count_days\"] === 0) {\n billingManager.recaculateBalance(accounting_month, space_id);\n } else {\n user_count = billingManager.getSpaceUserCount(space_id);\n modules_name = billingManager.get_modules_name();\n accounting_date = new Date(parseInt(accounting_month.slice(0, 4)), parseInt(accounting_month.slice(4, 6)), 0);\n accounting_date_format = moment(accounting_date).format(\"YYYYMMDD\");\n db.billings.remove({\n billing_date: accounting_date_format,\n space: space_id,\n transaction: {\n $in: modules_name\n }\n });\n billingManager.recaculateBalance(accounting_month, space_id);\n modules = billingManager.get_modules(space_id, accounting_month);\n if (modules && modules.length > 0) {\n _.each(modules, function(m) {\n return billingManager.get_balance(space_id, accounting_month, user_count, period_result[\"count_days\"], m.name, m.listprice);\n });\n }\n }\n a_m = moment(new Date(parseInt(accounting_month.slice(0, 4)), parseInt(accounting_month.slice(4, 6)), 1).getTime()).format(\"YYYYMM\");\n return billingManager.caculate_by_accounting_month(a_m, space_id);\n }\n};\n\nbillingManager.special_pay = function(space_id, module_names, total_fee, operator_id, end_date, user_count) {\n var m, modules, new_modules, now, r, space, space_update_obj;\n space = db.spaces.findOne(space_id);\n modules = space.modules || new Array;\n new_modules = _.difference(module_names, modules);\n m = moment();\n now = m._d;\n space_update_obj = new Object;\n if (space.is_paid !== true) {\n space_update_obj.is_paid = true;\n space_update_obj.start_date = new Date;\n }\n space_update_obj.modules = module_names;\n space_update_obj.modified = now;\n space_update_obj.modified_by = operator_id;\n space_update_obj.end_date = new Date(end_date);\n space_update_obj.user_limit = user_count;\n r = db.spaces.direct.update({\n _id: space_id\n }, {\n $set: space_update_obj\n });\n if (r) {\n _.each(new_modules, function(module) {\n var mcl;\n mcl = new Object;\n mcl._id = db.modules_changelogs._makeNewID();\n mcl.change_date = m.format(\"YYYYMMDD\");\n mcl.operator = operator_id;\n mcl.space = space_id;\n mcl.operation = \"install\";\n mcl.module = module;\n mcl.created = now;\n return db.modules_changelogs.insert(mcl);\n });\n }\n};\n","Meteor.startup(function () {\n\n if (Meteor.settings.cron && Meteor.settings.cron.statistics) {\n\n var schedule = require('node-schedule');\n // 定时执行统计\n var rule = Meteor.settings.cron.statistics;\n\n var go_next = true;\n\n schedule.scheduleJob(rule, Meteor.bindEnvironment(function () {\n if (!go_next)\n return;\n go_next = false;\n\n console.time('statistics');\n // 日期格式化 \n var dateFormat = function (date) {\n var datekey = \"\"+date.getFullYear()+\"-\"+(date.getMonth()+1)+\"-\"+(date.getDate());\n return datekey;\n };\n // 计算前一天时间\n var yesterDay = function () {\n var dNow = new Date(); //当前时间\n var dBefore = new Date(dNow.getTime() - 24*3600*1000); //得到前一天的时间\n return dBefore;\n };\n // 统计当日数据\n var dailyStaticsCount = function (collection, space) {\n var statics = collection.find({\"space\":space[\"_id\"],\"created\":{$gt: yesterDay()}});\n return statics.count();\n };\n // 查询总数\n var staticsCount = function (collection, space) {\n var statics = collection.find({\"space\": space[\"_id\"]});\n return statics.count();\n };\n // 查询拥有者名字\n var ownerName = function (collection, space) {\n var owner = collection.findOne({\"_id\": space[\"owner\"]});\n var name = owner.name;\n return name;\n };\n // 最近登录日期\n var lastLogon = function (collection, space) {\n var lastLogon = 0;\n var sUsers = db.space_users.find({\"space\": space[\"_id\"]}, {fields: {user: 1}}); \n sUsers.forEach(function (sUser) {\n var user = collection.findOne({\"_id\":sUser[\"user\"]});\n if(user && (lastLogon < user.last_logon)){\n lastLogon = user.last_logon;\n }\n })\n return lastLogon;\n };\n // 最近修改日期\n var lastModified = function (collection, space) {\n var obj = collection.find({\"space\": space[\"_id\"]}, {sort: {modified: -1}, limit: 1});\n var objArr = obj.fetch();\n if(objArr.length > 0)\n var mod = objArr[0].modified;\n return mod;\n };\n // 文章附件大小\n var postsAttachments = function (collection, space) {\n var attSize = 0;\n var sizeSum = 0;\n var posts = collection.find({\"space\": space[\"_id\"]});\n posts.forEach(function (post) {\n var atts = cfs.posts.find({\"post\":post[\"_id\"]});\n atts.forEach(function (att) {\n attSize = att.original.size;\n sizeSum += attSize;\n }) \n })\n return sizeSum;\n };\n // 当日新增附件大小\n var dailyPostsAttachments = function (collection, space) {\n var attSize = 0;\n var sizeSum = 0;\n var posts = collection.find({\"space\": space[\"_id\"]});\n posts.forEach(function (post) {\n var atts = cfs.posts.find({\"post\": post[\"_id\"], \"uploadedAt\": {$gt: yesterDay()}});\n atts.forEach(function (att) {\n attSize = att.original.size;\n sizeSum += attSize;\n })\n })\n return sizeSum;\n };\n // 插入数据\n db.spaces.find({\"is_paid\":true}).forEach(function (space) {\n db.steedos_statistics.insert({\n space: space[\"_id\"],\n space_name: space[\"name\"],\n balance: space[\"balance\"],\n owner_name: ownerName(db.users, space),\n created: new Date(),\n steedos:{\n users: staticsCount(db.space_users, space),\n organizations: staticsCount(db.organizations, space),\n last_logon: lastLogon(db.users, space)\n },\n workflow:{\n flows: staticsCount(db.flows, space),\n forms: staticsCount(db.forms, space),\n flow_roles: staticsCount(db.flow_roles, space),\n flow_positions: staticsCount(db.flow_positions, space),\n instances: staticsCount(db.instances, space),\n instances_last_modified: lastModified(db.instances, space),\n daily_flows: dailyStaticsCount(db.flows, space),\n daily_forms: dailyStaticsCount(db.forms, space),\n daily_instances: dailyStaticsCount(db.instances, space)\n },\n cms: {\n sites: staticsCount(db.cms_sites, space),\n posts: staticsCount(db.cms_posts, space),\n posts_last_modified: lastModified(db.cms_posts, space),\n posts_attachments_size: postsAttachments(db.cms_posts, space),\n comments: staticsCount(db.cms_comments, space),\n daily_sites: dailyStaticsCount(db.cms_sites, space),\n daily_posts: dailyStaticsCount(db.cms_posts, space),\n daily_comments: dailyStaticsCount(db.cms_comments, space),\n daily_posts_attachments_size: dailyPostsAttachments(db.cms_posts, space)\n }\n });\n });\n \n console.timeEnd('statistics');\n\n go_next = true;\n\n }, function (e) {\n console.log('Failed to bind environment: statistics.js');\n console.log(e.stack);\n }));\n\n }\n\n})\n\n\n\n\n","Meteor.startup ->\n Migrations.add\n version: 1\n name: '在线编辑时,需给文件增加lock 属性,防止多人同时编辑 #429, 附件页面使用cfs显示'\n up: ->\n console.time('upgrade_cfs_instance')\n try\n update_cfs_instance = (parent_id, space_id, instance_id, attach_version, isCurrent)->\n metadata = {parent: parent_id, owner: attach_version['created_by'], owner_name: attach_version['created_by_name'], space: space_id, instance: instance_id, approve: attach_version['approve']}\n if isCurrent\n metadata.current = true\n\n cfs.instances.update({_id: attach_version['_rev']}, {$set: {metadata: metadata}})\n i = 0\n db.instances.find({\"attachments.current\": {$exists: true}}, {sort: {modified: -1}, fields: {space: 1, attachments: 1}}).forEach (ins) ->\n attachs = ins.attachments\n space_id = ins.space\n instance_id = ins._id\n attachs.forEach (att)->\n current_ver = att.current\n parent_id = current_ver._rev\n update_cfs_instance(parent_id, space_id, instance_id, current_ver, true)\n\n if att.historys\n att.historys.forEach (his) ->\n update_cfs_instance(parent_id, space_id, instance_id, his, false)\n\n i++\n\n catch e\n console.error(e)\n\n console.timeEnd('upgrade_cfs_instance')\n down: ->\n console.log('version 1 down')","Meteor.startup(function() {\n return Migrations.add({\n version: 1,\n name: '在线编辑时,需给文件增加lock 属性,防止多人同时编辑 #429, 附件页面使用cfs显示',\n up: function() {\n var e, i, update_cfs_instance;\n console.time('upgrade_cfs_instance');\n try {\n update_cfs_instance = function(parent_id, space_id, instance_id, attach_version, isCurrent) {\n var metadata;\n metadata = {\n parent: parent_id,\n owner: attach_version['created_by'],\n owner_name: attach_version['created_by_name'],\n space: space_id,\n instance: instance_id,\n approve: attach_version['approve']\n };\n if (isCurrent) {\n metadata.current = true;\n }\n return cfs.instances.update({\n _id: attach_version['_rev']\n }, {\n $set: {\n metadata: metadata\n }\n });\n };\n i = 0;\n db.instances.find({\n \"attachments.current\": {\n $exists: true\n }\n }, {\n sort: {\n modified: -1\n },\n fields: {\n space: 1,\n attachments: 1\n }\n }).forEach(function(ins) {\n var attachs, instance_id, space_id;\n attachs = ins.attachments;\n space_id = ins.space;\n instance_id = ins._id;\n attachs.forEach(function(att) {\n var current_ver, parent_id;\n current_ver = att.current;\n parent_id = current_ver._rev;\n update_cfs_instance(parent_id, space_id, instance_id, current_ver, true);\n if (att.historys) {\n return att.historys.forEach(function(his) {\n return update_cfs_instance(parent_id, space_id, instance_id, his, false);\n });\n }\n });\n return i++;\n });\n } catch (error) {\n e = error;\n console.error(e);\n }\n return console.timeEnd('upgrade_cfs_instance');\n },\n down: function() {\n return console.log('version 1 down');\n }\n });\n});\n","Meteor.startup ->\n Migrations.add\n version: 2\n name: '组织结构允许一个人属于多个部门 #379'\n up: ->\n console.log 'version 2 up'\n console.time 'upgrade_space_user'\n try\n collection = db.space_users\n collection.find({organizations: {$exists: false}}, {fields: {organization: 1}}).forEach (su)->\n if su.organization\n collection.direct.update(su._id, {$set: {organizations: [su.organization]}})\n\n catch e\n console.error e\n\n console.timeEnd 'upgrade_space_user'\n down: ->\n console.log 'version 2 down'\n","Meteor.startup(function() {\n return Migrations.add({\n version: 2,\n name: '组织结构允许一个人属于多个部门 #379',\n up: function() {\n var collection, e;\n console.log('version 2 up');\n console.time('upgrade_space_user');\n try {\n collection = db.space_users;\n collection.find({\n organizations: {\n $exists: false\n }\n }, {\n fields: {\n organization: 1\n }\n }).forEach(function(su) {\n if (su.organization) {\n return collection.direct.update(su._id, {\n $set: {\n organizations: [su.organization]\n }\n });\n }\n });\n } catch (error) {\n e = error;\n console.error(e);\n }\n return console.timeEnd('upgrade_space_user');\n },\n down: function() {\n return console.log('version 2 down');\n }\n });\n});\n","Meteor.startup ->\n Migrations.add\n version: 3\n name: '给space_users表email字段赋值'\n up: ->\n console.log 'version 3 up'\n console.time 'upgrade_space_user_email'\n try\n collection = db.space_users\n collection.find({email: {$exists: false}}, {fields: {user: 1}}).forEach (su)->\n if su.user\n u = db.users.findOne({_id: su.user}, {fields: {emails: 1}})\n if u && u.emails && u.emails.length > 0\n if /^([A-Z0-9\\.\\-\\_\\+])*([A-Z0-9\\+\\-\\_])+\\@[A-Z0-9]+([\\-][A-Z0-9]+)*([\\.][A-Z0-9\\-]+){1,8}$/i.test(u.emails[0].address)\n address = u.emails[0].address\n collection.direct.update(su._id, {$set: {email: address}})\n \n\n catch e\n console.error e\n\n console.timeEnd 'upgrade_space_user_email'\n down: ->\n console.log 'version 3 down'\n","Meteor.startup(function() {\n return Migrations.add({\n version: 3,\n name: '给space_users表email字段赋值',\n up: function() {\n var collection, e;\n console.log('version 3 up');\n console.time('upgrade_space_user_email');\n try {\n collection = db.space_users;\n collection.find({\n email: {\n $exists: false\n }\n }, {\n fields: {\n user: 1\n }\n }).forEach(function(su) {\n var address, u;\n if (su.user) {\n u = db.users.findOne({\n _id: su.user\n }, {\n fields: {\n emails: 1\n }\n });\n if (u && u.emails && u.emails.length > 0) {\n if (/^([A-Z0-9\\.\\-\\_\\+])*([A-Z0-9\\+\\-\\_])+\\@[A-Z0-9]+([\\-][A-Z0-9]+)*([\\.][A-Z0-9\\-]+){1,8}$/i.test(u.emails[0].address)) {\n address = u.emails[0].address;\n return collection.direct.update(su._id, {\n $set: {\n email: address\n }\n });\n }\n }\n }\n });\n } catch (error) {\n e = error;\n console.error(e);\n }\n return console.timeEnd('upgrade_space_user_email');\n },\n down: function() {\n return console.log('version 3 down');\n }\n });\n});\n","Meteor.startup ->\n Migrations.add\n version: 4\n name: '给organizations表设置sort_no'\n up: ->\n console.log 'version 4 up'\n console.time 'upgrade_organizations_sort_no'\n try\n db.organizations.direct.update({sort_no: {$exists: false}}, {$set: {sort_no: 100}}, {multi: true})\n catch e\n console.error e\n\n console.timeEnd 'upgrade_organizations_sort_no'\n down: ->\n console.log 'version 4 down'\n","Meteor.startup(function() {\n return Migrations.add({\n version: 4,\n name: '给organizations表设置sort_no',\n up: function() {\n var e;\n console.log('version 4 up');\n console.time('upgrade_organizations_sort_no');\n try {\n db.organizations.direct.update({\n sort_no: {\n $exists: false\n }\n }, {\n $set: {\n sort_no: 100\n }\n }, {\n multi: true\n });\n } catch (error) {\n e = error;\n console.error(e);\n }\n return console.timeEnd('upgrade_organizations_sort_no');\n },\n down: function() {\n return console.log('version 4 down');\n }\n });\n});\n","Meteor.startup ->\n\tMigrations.add\n\t\tversion: 5\n\t\tname: '解决删除organization导致space_user数据错误的问题'\n\t\tup: ->\n\t\t\tconsole.log 'version 5 up'\n\t\t\tconsole.time 'fix_space_user_organizations'\n\t\t\ttry\n\n\t\t\t\tdb.space_users.find().forEach (su)->\n\t\t\t\t\tif not su.organizations\n\t\t\t\t\t\treturn\n\t\t\t\t\tif su.organizations.length is 1\n\t\t\t\t\t\tcheck_count = db.organizations.find(su.organizations[0]).count()\n\t\t\t\t\t\tif check_count is 0\n\t\t\t\t\t\t\troot_org = db.organizations.findOne({space: su.space, parent: null})\n\t\t\t\t\t\t\tif root_org\n\t\t\t\t\t\t\t\tr = db.space_users.direct.update({_id: su._id}, {$set: {organizations: [root_org._id], organization: root_org._id}})\n\t\t\t\t\t\t\t\tif r\n\t\t\t\t\t\t\t\t\troot_org.updateUsers()\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tconsole.error \"fix_space_user_organizations\"\n\t\t\t\t\t\t\t\tconsole.error su._id\n\t\t\t\t\telse if su.organizations.length > 1\n\t\t\t\t\t\tremoved_org_ids = []\n\t\t\t\t\t\tsu.organizations.forEach (o)->\n\t\t\t\t\t\t\tcheck_count = db.organizations.find(o).count()\n\t\t\t\t\t\t\tif check_count is 0\n\t\t\t\t\t\t\t\tremoved_org_ids.push(o)\n\t\t\t\t\t\tif removed_org_ids.length > 0\n\t\t\t\t\t\t\tnew_org_ids = _.difference(su.organizations, removed_org_ids)\n\t\t\t\t\t\t\tif new_org_ids.includes(su.organization)\n\t\t\t\t\t\t\t\tdb.space_users.direct.update({_id: su._id}, {$set: {organizations: new_org_ids}})\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tdb.space_users.direct.update({_id: su._id}, {$set: {organizations: new_org_ids, organization: new_org_ids[0]}})\n\n\t\t\tcatch e\n\t\t\t\tconsole.error \"fix_space_user_organizations\"\n\t\t\t\tconsole.error e.stack\n\n\t\t\tconsole.timeEnd 'fix_space_user_organizations'\n\t\tdown: ->\n\t\t\tconsole.log 'version 5 down'\n","Meteor.startup(function() {\n return Migrations.add({\n version: 5,\n name: '解决删除organization导致space_user数据错误的问题',\n up: function() {\n var e;\n console.log('version 5 up');\n console.time('fix_space_user_organizations');\n try {\n db.space_users.find().forEach(function(su) {\n var check_count, new_org_ids, r, removed_org_ids, root_org;\n if (!su.organizations) {\n return;\n }\n if (su.organizations.length === 1) {\n check_count = db.organizations.find(su.organizations[0]).count();\n if (check_count === 0) {\n root_org = db.organizations.findOne({\n space: su.space,\n parent: null\n });\n if (root_org) {\n r = db.space_users.direct.update({\n _id: su._id\n }, {\n $set: {\n organizations: [root_org._id],\n organization: root_org._id\n }\n });\n if (r) {\n return root_org.updateUsers();\n }\n } else {\n console.error(\"fix_space_user_organizations\");\n return console.error(su._id);\n }\n }\n } else if (su.organizations.length > 1) {\n removed_org_ids = [];\n su.organizations.forEach(function(o) {\n check_count = db.organizations.find(o).count();\n if (check_count === 0) {\n return removed_org_ids.push(o);\n }\n });\n if (removed_org_ids.length > 0) {\n new_org_ids = _.difference(su.organizations, removed_org_ids);\n if (new_org_ids.includes(su.organization)) {\n return db.space_users.direct.update({\n _id: su._id\n }, {\n $set: {\n organizations: new_org_ids\n }\n });\n } else {\n return db.space_users.direct.update({\n _id: su._id\n }, {\n $set: {\n organizations: new_org_ids,\n organization: new_org_ids[0]\n }\n });\n }\n }\n }\n });\n } catch (error) {\n e = error;\n console.error(\"fix_space_user_organizations\");\n console.error(e.stack);\n }\n return console.timeEnd('fix_space_user_organizations');\n },\n down: function() {\n return console.log('version 5 down');\n }\n });\n});\n","Meteor.startup ->\n\tMigrations.add\n\t\tversion: 6\n\t\tname: '财务系统升级'\n\t\tup: ->\n\t\t\tconsole.log 'version 6 up'\n\t\t\tconsole.time 'billing upgrade'\n\t\t\ttry\n\t\t\t\t# 清空modules表\n\t\t\t\tdb.modules.remove({})\n\n\t\t\t\tdb.modules.insert({\n\t\t\t\t\t\"_id\": \"workflow.standard\",\n\t\t\t\t\t\"name_en\": \"Workflow Standard\",\n\t\t\t\t\t\"name\": \"workflow.standard\",\n\t\t\t\t\t\"name_zh\": \"审批王基础版\",\n\t\t\t\t\t\"listprice\": 1.0,\n\t\t\t\t\t\"listprice_rmb\": 2\n\t\t\t\t})\n\n\t\t\t\tdb.modules.insert({\n\t\t\t\t\t\"_id\": \"workflow.professional\",\n\t\t\t\t\t\"name_en\": \"Workflow Professional\",\n\t\t\t\t\t\"name\": \"workflow.professional\",\n\t\t\t\t\t\"name_zh\": \"审批王专业版扩展包\",\n\t\t\t\t\t\"listprice\": 3.0,\n\t\t\t\t\t\"listprice_rmb\": 18\n\t\t\t\t})\n\n\t\t\t\tdb.modules.insert({\n\t\t\t\t\t\"_id\": \"workflow.enterprise\",\n\t\t\t\t\t\"name_en\": \"Workflow Enterprise\",\n\t\t\t\t\t\"name\": \"workflow.enterprise\",\n\t\t\t\t\t\"name_zh\": \"审批王企业版扩展包\",\n\t\t\t\t\t\"listprice\": 6.0,\n\t\t\t\t\t\"listprice_rmb\": 40\n\t\t\t\t})\n\n\n\t\t\t\tstart_date = new Date(moment(new Date).format(\"YYYY-MM-DD\"))\n\t\t\t\tdb.spaces.find({is_paid: true, user_limit: {$exists: false}, modules: {$exists: true}}).forEach (s)->\n\t\t\t\t\ttry\n\t\t\t\t\t\tset_obj = {}\n\t\t\t\t\t\tuser_count = db.space_users.find({space: s._id, user_accepted: true}).count()\n\t\t\t\t\t\tset_obj.user_limit = user_count\n\t\t\t\t\t\tbalance = s.balance\n\t\t\t\t\t\tif balance > 0\n\t\t\t\t\t\t\tmonths = 0\n\t\t\t\t\t\t\tlistprices = 0\n\t\t\t\t\t\t\t_.each s.modules, (pm)->\n\t\t\t\t\t\t\t\tmodule = db.modules.findOne({name: pm})\n\t\t\t\t\t\t\t\tif module and module.listprice\n\t\t\t\t\t\t\t\t\tlistprices += module.listprice\n\t\t\t\t\t\t\tmonths = parseInt((balance/(listprices*user_count)).toFixed()) + 1\n\t\t\t\t\t\t\tend_date = new Date\n\t\t\t\t\t\t\tend_date.setMonth(end_date.getMonth()+months)\n\t\t\t\t\t\t\tend_date = new Date(moment(end_date).format(\"YYYY-MM-DD\"))\n\t\t\t\t\t\t\tset_obj.start_date = start_date\n\t\t\t\t\t\t\tset_obj.end_date = end_date\n\n\t\t\t\t\t\telse if balance <= 0\n\t\t\t\t\t\t\tset_obj.start_date = start_date\n\t\t\t\t\t\t\tset_obj.end_date = new Date\n\n\t\t\t\t\t\ts.modules.push(\"workflow.standard\")\n\t\t\t\t\t\tset_obj.modules = _.uniq(s.modules)\n\t\t\t\t\t\tdb.spaces.direct.update({_id: s._id}, {$set: set_obj})\n\t\t\t\t\tcatch e\n\t\t\t\t\t\tconsole.error \"billing space upgrade\"\n\t\t\t\t\t\tconsole.error(s._id)\n\t\t\t\t\t\tconsole.error(set_obj)\n\t\t\t\t\t\tconsole.error e.stack\n\n\t\t\tcatch e\n\t\t\t\tconsole.error \"billing upgrade\"\n\t\t\t\tconsole.error e.stack\n\n\t\t\tconsole.timeEnd 'billing upgrade'\n\t\tdown: ->\n\t\t\tconsole.log 'version 6 down'\n","Meteor.startup(function() {\n return Migrations.add({\n version: 6,\n name: '财务系统升级',\n up: function() {\n var e, start_date;\n console.log('version 6 up');\n console.time('billing upgrade');\n try {\n db.modules.remove({});\n db.modules.insert({\n \"_id\": \"workflow.standard\",\n \"name_en\": \"Workflow Standard\",\n \"name\": \"workflow.standard\",\n \"name_zh\": \"审批王基础版\",\n \"listprice\": 1.0,\n \"listprice_rmb\": 2\n });\n db.modules.insert({\n \"_id\": \"workflow.professional\",\n \"name_en\": \"Workflow Professional\",\n \"name\": \"workflow.professional\",\n \"name_zh\": \"审批王专业版扩展包\",\n \"listprice\": 3.0,\n \"listprice_rmb\": 18\n });\n db.modules.insert({\n \"_id\": \"workflow.enterprise\",\n \"name_en\": \"Workflow Enterprise\",\n \"name\": \"workflow.enterprise\",\n \"name_zh\": \"审批王企业版扩展包\",\n \"listprice\": 6.0,\n \"listprice_rmb\": 40\n });\n start_date = new Date(moment(new Date).format(\"YYYY-MM-DD\"));\n db.spaces.find({\n is_paid: true,\n user_limit: {\n $exists: false\n },\n modules: {\n $exists: true\n }\n }).forEach(function(s) {\n var balance, e, end_date, listprices, months, set_obj, user_count;\n try {\n set_obj = {};\n user_count = db.space_users.find({\n space: s._id,\n user_accepted: true\n }).count();\n set_obj.user_limit = user_count;\n balance = s.balance;\n if (balance > 0) {\n months = 0;\n listprices = 0;\n _.each(s.modules, function(pm) {\n var module;\n module = db.modules.findOne({\n name: pm\n });\n if (module && module.listprice) {\n return listprices += module.listprice;\n }\n });\n months = parseInt((balance / (listprices * user_count)).toFixed()) + 1;\n end_date = new Date;\n end_date.setMonth(end_date.getMonth() + months);\n end_date = new Date(moment(end_date).format(\"YYYY-MM-DD\"));\n set_obj.start_date = start_date;\n set_obj.end_date = end_date;\n } else if (balance <= 0) {\n set_obj.start_date = start_date;\n set_obj.end_date = new Date;\n }\n s.modules.push(\"workflow.standard\");\n set_obj.modules = _.uniq(s.modules);\n return db.spaces.direct.update({\n _id: s._id\n }, {\n $set: set_obj\n });\n } catch (error) {\n e = error;\n console.error(\"billing space upgrade\");\n console.error(s._id);\n console.error(set_obj);\n return console.error(e.stack);\n }\n });\n } catch (error) {\n e = error;\n console.error(\"billing upgrade\");\n console.error(e.stack);\n }\n return console.timeEnd('billing upgrade');\n },\n down: function() {\n return console.log('version 6 down');\n }\n });\n});\n","Meteor.startup ()->\n rootURL = Meteor.absoluteUrl()\n if !Meteor.settings.public.webservices\n Meteor.settings.public.webservices = {\n \"creator\": {\n \"url\": rootURL\n }\n }\n\n if !Meteor.settings.public.webservices.creator\n Meteor.settings.public.webservices.creator = {\n \"url\": rootURL\n }\n\n if !Meteor.settings.public.webservices.creator.url\n Meteor.settings.public.webservices.creator.url = rootURL","Meteor.startup(function() {\n var rootURL;\n rootURL = Meteor.absoluteUrl();\n if (!Meteor.settings[\"public\"].webservices) {\n Meteor.settings[\"public\"].webservices = {\n \"creator\": {\n \"url\": rootURL\n }\n };\n }\n if (!Meteor.settings[\"public\"].webservices.creator) {\n Meteor.settings[\"public\"].webservices.creator = {\n \"url\": rootURL\n };\n }\n if (!Meteor.settings[\"public\"].webservices.creator.url) {\n return Meteor.settings[\"public\"].webservices.creator.url = rootURL;\n }\n});\n","if(process.env.CREATOR_NODE_ENV == 'development'){\n\t//Meteor 版本升级到1.9 及以上时(node 版本 11+),可以删除此代码\n\tObject.defineProperty(Array.prototype, 'flat', {\n\t\tvalue: function(depth = 1) {\n\t\t\treturn this.reduce(function (flat, toFlatten) {\n\t\t\t\treturn flat.concat((Array.isArray(toFlatten) && (depth>1)) ? toFlatten.flat(depth-1) : toFlatten);\n\t\t\t}, []);\n\t\t}\n\t});\n}","Meteor.startup ()->\n\tnew Tabular.Table\n\t\tname: \"customize_apps\",\n\t\tcollection: db.apps,\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tdata: \"name\"\n\t\t\t\torderable: false\n\t\t\t}\n\t\t]\n\t\tdom: \"tp\"\n\t\textraFields: [\"_id\", \"space\"]\n\t\tlengthChange: false\n\t\tordering: false\n\t\tpageLength: 10\n\t\tinfo: false\n\t\tsearching: true\n\t\tautoWidth: true\n\t\tchangeSelector: (selector, userId) ->\n\t\t\tunless userId\n\t\t\t\treturn {_id: -1}\n\t\t\tspace = selector.space\n\t\t\tunless space\n\t\t\t\tif selector?.$and?.length > 0\n\t\t\t\t\tspace = selector.$and.getProperty('space')[0]\n\t\t\tunless space\n\t\t\t\treturn {_id: -1}\n\t\t\treturn selector","Meteor.startup(function() {\n return new Tabular.Table({\n name: \"customize_apps\",\n collection: db.apps,\n columns: [\n {\n data: \"name\",\n orderable: false\n }\n ],\n dom: \"tp\",\n extraFields: [\"_id\", \"space\"],\n lengthChange: false,\n ordering: false,\n pageLength: 10,\n info: false,\n searching: true,\n autoWidth: true,\n changeSelector: function(selector, userId) {\n var ref, space;\n if (!userId) {\n return {\n _id: -1\n };\n }\n space = selector.space;\n if (!space) {\n if ((selector != null ? (ref = selector.$and) != null ? ref.length : void 0 : void 0) > 0) {\n space = selector.$and.getProperty('space')[0];\n }\n }\n if (!space) {\n return {\n _id: -1\n };\n }\n return selector;\n }\n });\n});\n"]} \ No newline at end of file +{"version":3,"sources":["meteor://💻app/packages/steedos:base/checkNpm.js","meteor://💻app/packages/steedos:base/lib/steedos_util.js","meteor://💻app/packages/steedos_base/lib/core.coffee","meteor://💻app/lib/core.coffee","meteor://💻app/packages/steedos:base/lib/simple_schema_extend.js","meteor://💻app/packages/steedos_base/lib/methods/last_logon.coffee","meteor://💻app/lib/methods/last_logon.coffee","meteor://💻app/packages/steedos_base/lib/methods/user_add_email.coffee","meteor://💻app/lib/methods/user_add_email.coffee","meteor://💻app/packages/steedos_base/lib/methods/user_avatar.coffee","meteor://💻app/lib/methods/user_avatar.coffee","meteor://💻app/packages/steedos:base/lib/methods/email_templates_reset.js","meteor://💻app/packages/steedos:base/lib/methods/upgrade_data.js","meteor://💻app/packages/steedos_base/lib/steedos/push.coffee","meteor://💻app/lib/steedos/push.coffee","meteor://💻app/packages/steedos_base/lib/admin.coffee","meteor://💻app/lib/admin.coffee","meteor://💻app/packages/steedos:base/lib/array_includes.js","meteor://💻app/packages/steedos_base/lib/settings.coffee","meteor://💻app/lib/settings.coffee","meteor://💻app/packages/steedos_base/lib/user_object_view.coffee","meteor://💻app/lib/user_object_view.coffee","meteor://💻app/packages/steedos:base/lib/server_session.js","meteor://💻app/packages/steedos_base/routes/api_get_apps.coffee","meteor://💻app/routes/api_get_apps.coffee","meteor://💻app/packages/steedos_base/routes/collection.coffee","meteor://💻app/routes/collection.coffee","meteor://💻app/packages/steedos_base/routes/sso.coffee","meteor://💻app/routes/sso.coffee","meteor://💻app/packages/steedos_base/routes/avatar.coffee","meteor://💻app/routes/avatar.coffee","meteor://💻app/packages/steedos_base/routes/access_token.coffee","meteor://💻app/routes/access_token.coffee","meteor://💻app/packages/steedos_base/server/publications/apps.coffee","meteor://💻app/server/publications/apps.coffee","meteor://💻app/packages/steedos_base/server/publications/my_spaces.coffee","meteor://💻app/server/publications/my_spaces.coffee","meteor://💻app/packages/steedos_base/server/publications/space_avatar.coffee","meteor://💻app/server/publications/space_avatar.coffee","meteor://💻app/packages/steedos_base/server/publications/modules.coffee","meteor://💻app/server/publications/modules.coffee","meteor://💻app/packages/steedos_base/server/publications/weixin_pay_code_url.coffee","meteor://💻app/server/publications/weixin_pay_code_url.coffee","meteor://💻app/packages/steedos_base/server/routes/api_billing_recharge_notify.coffee","meteor://💻app/server/routes/api_billing_recharge_notify.coffee","meteor://💻app/packages/steedos_base/server/methods/my_contacts_limit.coffee","meteor://💻app/server/methods/my_contacts_limit.coffee","meteor://💻app/packages/steedos:base/server/methods/setKeyValue.js","meteor://💻app/packages/steedos_base/server/methods/billing_settleup.coffee","meteor://💻app/server/methods/billing_settleup.coffee","meteor://💻app/packages/steedos_base/server/methods/setUsername.coffee","meteor://💻app/server/methods/setUsername.coffee","meteor://💻app/packages/steedos_base/server/methods/billing_recharge.coffee","meteor://💻app/server/methods/billing_recharge.coffee","meteor://💻app/packages/steedos_base/server/methods/get_space_user_count.coffee","meteor://💻app/packages/steedos_base/server/methods/user_secret.coffee","meteor://💻app/server/methods/user_secret.coffee","meteor://💻app/packages/steedos_base/server/methods/object_workflows.coffee","meteor://💻app/server/methods/object_workflows.coffee","meteor://💻app/packages/steedos_base/server/methods/set_space_user_password.coffee","meteor://💻app/server/methods/set_space_user_password.coffee","meteor://💻app/packages/steedos_base/server/lib/billing_manager.coffee","meteor://💻app/server/lib/billing_manager.coffee","meteor://💻app/packages/steedos:base/server/schedule/statistics.js","meteor://💻app/packages/steedos_base/server/steedos/startup/migrations/v1.coffee","meteor://💻app/server/steedos/startup/migrations/v1.coffee","meteor://💻app/packages/steedos_base/server/steedos/startup/migrations/v2.coffee","meteor://💻app/server/steedos/startup/migrations/v2.coffee","meteor://💻app/packages/steedos_base/server/steedos/startup/migrations/v3.coffee","meteor://💻app/server/steedos/startup/migrations/v3.coffee","meteor://💻app/packages/steedos_base/server/steedos/startup/migrations/v4.coffee","meteor://💻app/server/steedos/startup/migrations/v4.coffee","meteor://💻app/packages/steedos_base/server/steedos/startup/migrations/v5.coffee","meteor://💻app/server/steedos/startup/migrations/v5.coffee","meteor://💻app/packages/steedos_base/server/steedos/startup/migrations/v6.coffee","meteor://💻app/server/steedos/startup/migrations/v6.coffee","meteor://💻app/packages/steedos_base/server/startup.coffee","meteor://💻app/server/startup.coffee","meteor://💻app/packages/steedos:base/server/development.js","meteor://💻app/packages/steedos_base/tabular.coffee","meteor://💻app/tabular.coffee"],"names":["checkNpmVersions","module","link","v","cookies","mkdirp","Meteor","settings","billing","Array","prototype","sortByName","locale","Steedos","sort","p1","p2","p1_sort_no","sort_no","p2_sort_no","name","localeCompare","getProperty","k","forEach","t","m","push","remove","from","to","rest","slice","length","apply","filterProperty","h","l","g","d","includes","Object","undefined","findPropertyByPK","r","Cookies","crypto","mixin","ref","ref1","ref2","ref3","ref4","rootUrl","db","subs","isPhoneEnabled","phone","numberToString","number","scale","notThousands","reg","toString","Number","toFixed","match","replace","valiJquerySymbols","str","RegExp","test","isCordova","isClient","absoluteUrl","defaultOptions","endsWith","substr","window","stores","API","client","setUrl","Settings","setRootUrl","autorun","ref5","ref6","ref7","ref8","setUserId","userId","setTenantId","spaceId","getHelpUrl","country","substring","isExpression","func","pattern","reg1","reg2","parseSingleExpression","formData","dataPath","global","error","funcBody","getParentPath","getValueByPath","globalTag","parent","parentPath","path","pathArr","split","pop","join","_","get","console","JSON","stringify","Function","error1","log","spaceUpgradedModal","swal","title","TAPi18n","__","text","html","type","confirmButtonText","getAccountBgBodyValue","accountBgBody","steedos_keyvalues","findOne","user","key","value","applyAccountBgBodyValue","accountBgBodyValue","isNeedToLocal","avatar","url","loggingIn","localStorage","getItem","setItem","removeItem","getAccountSkinValue","accountSkin","getAccountZoomValue","accountZoom","applyAccountZoomValue","accountZoomValue","zoomName","zoomSize","size","$","removeClass","Session","addClass","showHelp","getLocale","open","getUrlWithToken","authToken","linker","getSpaceId","Accounts","_storedLoginToken","indexOf","param","getAppUrlWithToken","app_id","openAppWithToken","app","apps","is_new_window","isMobile","location","openWindow","openUrlWithIE","cmd","exec","open_url","isNode","nw","require","stdout","stderr","toastr","openApp","e","evalFunString","on_click","redirectToSignIn","FlowRouter","go","is_use_ie","origin","isInternalApp","is_use_iframe","_id","eval","message","stack","set","checkSpaceBalance","end_date","min_months","space","isSpaceAdmin","spaces","hasFeature","Date","setModalMaxHeight","offset","detectIE","each","footerHeight","headerHeight","height","totalHeight","outerHeight","innerHeight","hasClass","css","getModalMaxHeight","reValue","screen","isiOS","userAgent","language","DEVICE","browser","conExp","device","numExp","android","blackberry","desktop","ipad","iphone","ipod","mobile","navigator","toLowerCase","browserLanguage","getUserOrganizations","isIncludeParents","organizations","parents","space_user","space_users","fields","flatten","find","$in","fetch","union","forbidNodeContextmenu","target","ifr","document","body","addEventListener","ev","preventDefault","load","ifrBody","contents","isServer","admins","isLegalVersion","app_version","check","modules","isOrgAdminByOrgIds","orgIds","allowAccessOrgs","isOrgAdmin","useOrgs","filter","org","uniq","isOrgAdminByAllOrgIds","i","root_url","URL","pathname","getAPILoginUser","req","res","password","result","username","query","users","steedos_id","_checkPassword","Error","checkAuthToken","headers","hashedToken","_hashLoginToken","decrypt","iv","c","decipher","decipherMsg","key32","len","createDecipheriv","Buffer","concat","update","final","encrypt","cipher","cipheredMsg","createCipheriv","getUserIdFromAccessToken","access_token","collection","obj","oAuth2Server","collections","accessToken","expires","getUserIdFromAuthToken","APIAuthenticationCheck","JsonRoutes","sendResult","data","code","functions","args","_wrapped","arguments","call","isHoliday","date","day","getDay","caculateWorkingTime","days","caculateDate","param_date","getTime","caculatePlusHalfWorkingDay","next","caculated_date","first_date","j","max_index","second_date","start_date","time_points","remind","isEmpty","setHours","hour","setMinutes","minute","extend","getSteedosToken","appId","now","secret","steedos_token","parseInt","isI18n","checkUsernameAvailability","$regex","_escapeRegExp","trim","validatePassword","pwd","passworPolicy","passworPolicyError","reason","valid","policy","policyError","convertSpecialCharacter","removeSpecialCharacter","Creator","getDBApps","space_id","dbApps","Collections","is_creator","visible","created","created_by","modified","modified_by","getDBDashboards","dbDashboards","dashboard","getAuthToken","authorization","sessionStorage","getCurrentAppId","formatIndex","array","indexName","isdocumentDB","object","background","datasources","documentDB","startup","SimpleSchema","extendOptions","foreign_key","Match","Optional","Boolean","references","methods","updateUserLastLogon","$set","last_logon","onLogin","users_add_email","email","count","emails","direct","$push","address","verified","sendVerificationEmail","users_remove_email","p","$pull","users_verify_email","users_set_primary_email","primary","multi","showCancelButton","closeOnConfirm","animation","inputValue","updateUserAvatar","emailTemplates","defaultFrom","resetPassword","subject","splits","tokenCode","greeting","profile","token_code","verifyEmail","enrollAccount","add","orgs","fullname","$ne","calculateFullname","ret","msg","Push","Configure","senderID","ANDROID_SENDER_ID","sound","vibrate","ios","badge","clearBadge","alert","appName","Selector","selectorCheckSpaceAdmin","selector","is_cloudadmin","map","n","selectorCheckSpace","u","billing_pay_records","adminConfig","icon","color","tableColumns","extraFields","routerAdmin","paid","showEditColumn","showDelColumn","disableAdd","pageLength","order","space_user_signs","AdminConfig","collections_add","searchElement","O","currentElement","webservices","www","status","getUserObjectsListViews","objects","_getUserObjectListViews","keys","listViews","objectsViews","getCollection","object_name","owner","shared","_user_object_list_views","olistViews","ov","listview","o","list_view","getUserObjectListViews","object_listview","user_id","uuflowManager","getSpace","$or","$exists","errors","errorMessage","steedosAuth","allow_models","model","options","userSession","String","wrapAsync","cb","getSession","then","resolve","reject","express","des_cipher","des_cipheredMsg","des_iv","des_steedos_token","joiner","key8","redirectUrl","returnurl","params","writeHead","end","encodeURI","setHeader","color_index","colors","fontSize","initials","position","reqModifiedHeader","svg","username_array","width","w","fs","getRelativeUrl","avatarUrl","file","write","item","charCodeAt","toUpperCase","toUTCString","readStream","pipe","publish","ready","handle","handle2","observeSpaces","self","sus","userSpaces","user_accepted","su","observe","added","doc","removed","oldDoc","without","stop","changed","newDoc","onStop","enable_register","on","chunk","bindEnvironment","parser","xml2js","Parser","explicitArray","explicitRoot","parseString","err","WXPay","attach","bpr","code_url_id","sign","wxpay","appid","mch_id","partner_key","clone","parse","total_fee","billingManager","special_pay","user_count","get_contacts_limit","froms","fromsChildren","fromsChildrenIds","isLimit","len1","limit","limits","myLitmitOrgIds","myOrgId","myOrgIds","myOrgs","outside_organizations","setting","tempIsLimit","toOrgs","tos","space_settings","values","intersection","setKeyValue","insert","billing_settleup","accounting_month","Email","time","is_paid","s","caculate_by_accounting_month","Package","send","timeEnd","setUsername","spaceUser","invite_state","billing_recharge","new_id","module_names","listprices","one_month_yuan","order_body","result_obj","space_user_count","listprice_rmb","name_zh","createUnifiedOrder","out_trade_no","moment","format","spbill_create_ip","notify_url","trade_type","product_id","info","get_space_user_count","user_count_info","total_user_count","accepted_user_count","create_secret","remove_secret","token","curSpaceUser","ows","flow_id","fl","perms","flow_name","can_add","users_can_add","orgs_can_add","some","setSpaceUserPassword","space_user_id","changedUserInfo","currentUser","lang","logout","userCP","setPassword","services","bcrypt","mobile_verified","SMSQueue","Format","Action","ParamString","RecNum","SignName","TemplateCode","get_accounting_period","count_days","end_date_time","start_date_time","billings","transaction","billing_date","getDate","refresh_balance","refresh_date","app_bill","b_m","b_m_d","bill","credits","debits","last_balance","last_bill","payment_bill","setObj","$lt","billing_month","balance","get_balance","module_name","listprice","accounting_date","accounting_date_format","days_number","new_bill","$lte","_makeNewID","getSpaceUserCount","recaculateBalance","refresh_dates","r_d","get_modules","m_changelog","modules_changelogs","change_date","operation","get_modules_name","modules_name","a_m","newest_bill","period_result","remaining_months","b","operator_id","new_modules","space_update_obj","difference","_d","user_limit","mcl","operator","cron","statistics","schedule","rule","go_next","scheduleJob","dateFormat","datekey","getFullYear","getMonth","yesterDay","dNow","dBefore","dailyStaticsCount","statics","$gt","staticsCount","ownerName","lastLogon","sUsers","sUser","lastModified","objArr","mod","postsAttachments","attSize","sizeSum","posts","post","atts","cfs","att","original","dailyPostsAttachments","steedos_statistics","space_name","owner_name","steedos","workflow","flows","forms","flow_roles","flow_positions","instances","instances_last_modified","daily_flows","daily_forms","daily_instances","cms","sites","cms_sites","cms_posts","posts_last_modified","posts_attachments_size","comments","cms_comments","daily_sites","daily_posts","daily_comments","daily_posts_attachments_size","Migrations","version","up","update_cfs_instance","parent_id","instance_id","attach_version","isCurrent","metadata","instance","approve","current","attachments","ins","attachs","current_ver","_rev","historys","his","down","organization","check_count","new_org_ids","removed_org_ids","root_org","updateUsers","months","set_obj","pm","setMonth","rootURL","creator","process","env","CREATOR_NODE_ENV","defineProperty","depth","reduce","flat","toFlatten","isArray","Tabular","Table","columns","orderable","dom","lengthChange","ordering","searching","autoWidth","changeSelector","$and"],"mappings":"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","file":"/packages/steedos_base.js","sourcesContent":["import {\n\tcheckNpmVersions\n} from 'meteor/tmeasday:check-npm-versions';\ncheckNpmVersions({\n\t\"node-schedule\": \"^1.3.1\",\n\tcookies: \"^0.6.2\",\n\t\"xml2js\": \"^0.4.19\",\n\tmkdirp: \"^0.3.5\",\n\t\"url-search-params-polyfill\": \"^7.0.0\",\n}, 'steedos:base');\n\nif (Meteor.settings && Meteor.settings.billing) {\n\tcheckNpmVersions({\n\t\t\"weixin-pay\": \"^1.1.7\"\n\t}, 'steedos:base');\n}","Array.prototype.sortByName = function (locale) {\n if (!this) {\n return;\n }\n if(!locale){\n locale = Steedos.locale()\n }\n this.sort(function (p1, p2) {\n\t\tvar p1_sort_no = p1.sort_no || 0;\n\t\tvar p2_sort_no = p2.sort_no || 0;\n\t\tif(p1_sort_no != p2_sort_no){\n return p1_sort_no > p2_sort_no ? -1 : 1\n }else{\n\t\t\treturn p1.name.localeCompare(p2.name, locale);\n\t\t}\n });\n};\n\n\nArray.prototype.getProperty = function (k) {\n var v = new Array();\n this.forEach(function (t) {\n var m = t ? t[k] : null;\n v.push(m);\n });\n return v;\n}\n\n/*\n * 添加Array的remove函数\n */\nArray.prototype.remove = function (from, to) {\n if (from < 0) {\n return;\n }\n var rest = this.slice((to || from) + 1 || this.length);\n this.length = from < 0 ? this.length + from : from;\n return this.push.apply(this, rest);\n};\n\n/*\n * 添加Array的过滤器\n * return 符合条件的对象Array\n */\nArray.prototype.filterProperty = function (h, l) {\n var g = [];\n this.forEach(function (t) {\n var m = t ? t[h] : null;\n var d = false;\n if (m instanceof Array) {\n d = m.includes(l);\n } else {\n if (m instanceof Object) {\n if (\"id\" in m) {\n m = m[\"id\"];\n } else if (\"_id\" in m) {\n m = m[\"_id\"];\n }\n\n }\n if (l instanceof Array) {\n d = (l === undefined) ? false : l.includes(m);\n } else {\n d = (l === undefined) ? false : m == l;\n }\n }\n\n if (d) {\n g.push(t);\n }\n });\n return g;\n}\n\n/*\n * 添加Array的过滤器\n * return 符合条件的第一个对象\n */\nArray.prototype.findPropertyByPK = function (h, l) {\n var r = null;\n this.forEach(function (t) {\n var m = t ? t[h] : null;\n var d = false;\n if (m instanceof Array) {\n d = m.includes(l);\n } else {\n d = (l === undefined) ? false : m == l;\n }\n\n if (d) {\n r = t;\n }\n });\n return r;\n}","Steedos =\n\tsettings: {}\n\tdb: db\n\tsubs: {}\n\tisPhoneEnabled: ->\n\t\treturn !!Meteor.settings?.public?.phone\n\tnumberToString: (number, scale, notThousands)->\n\t\tif typeof number == \"number\"\n\t\t\tnumber = number.toString()\n\n\t\tif !number\n\t\t\treturn '';\n\n\t\tif number != \"NaN\"\n\t\t\tif scale || scale == 0\n\t\t\t\tnumber = Number(number).toFixed(scale)\n\t\t\tunless notThousands\n\t\t\t\tif !(scale || scale == 0)\n\t\t\t\t\t# 没定义scale时,根据小数点位置算出scale值\n\t\t\t\t\tscale = number.match(/\\.(\\d+)/)?[1]?.length\n\t\t\t\t\tunless scale\n\t\t\t\t\t\tscale = 0\n\t\t\t\treg = /(\\d)(?=(\\d{3})+\\.)/g\n\t\t\t\tif scale == 0\n\t\t\t\t\treg = /(\\d)(?=(\\d{3})+\\b)/g\n\t\t\t\tnumber = number.replace(reg, '$1,')\n\t\t\treturn number\n\t\telse\n\t\t\treturn \"\"\n\tvaliJquerySymbols: (str)->\n\t\t# reg = /^[^!\"#$%&'()*+,./:;<=>?@[\\]^`{|}~]+$/g\n\t\treg = new RegExp(\"^[^!\\\"#$%&'()*\\+,\\.\\/:;<=>?@[\\\\]^`{|}~]+$\")\n\t\treturn reg.test(str)\n\n###\n# Kick off the global namespace for Steedos.\n# @namespace Steedos\n###\n# if Meteor.isCordova\nif Meteor.isCordova || Meteor.isClient\n\trootUrl = Meteor.absoluteUrl.defaultOptions.rootUrl\n\tif rootUrl.endsWith('/')\n\t\trootUrl = rootUrl.substr(0, rootUrl.length - 1)\n\n\twindow.stores?.API?.client?.setUrl = rootUrl\n\twindow.stores?.Settings?.setRootUrl(rootUrl)\n\twindow['steedos.setting'] = {\n\t\trootUrl: rootUrl\n\t}\n\nif Meteor.isClient\n\tMeteor.autorun ()->\n\t\twindow.stores?.Settings?.setUserId(Steedos.userId())\n\t\twindow.stores?.Settings?.setTenantId(Steedos.spaceId())\n\nSteedos.getHelpUrl = (locale)->\n\tcountry = locale.substring(3)\n\treturn \"http://www.steedos.com/\" + country + \"/help/\"\n\nSteedos.isExpression = (func) ->\n\tif typeof func != 'string'\n\t\treturn false\n\tpattern = /^{{(.+)}}$/\n\treg1 = /^{{(function.+)}}$/\n\treg2 = /^{{(.+=>.+)}}$/\n\tif typeof func == 'string' and func.match(pattern) and !func.match(reg1) and !func.match(reg2)\n\t\treturn true\n\tfalse\n\nSteedos.parseSingleExpression = (func, formData, dataPath, global) ->\n\tgetParentPath = (path) ->\n\t\tif typeof path == 'string'\n\t\t\tpathArr = path.split('.')\n\t\t\tif pathArr.length == 1\n\t\t\t\treturn '#'\n\t\t\tpathArr.pop()\n\t\t\treturn pathArr.join('.')\n\t\treturn '#'\n\tgetValueByPath = (formData, path) ->\n\t\tif path == '#' or !path\n\t\t\treturn formData or {}\n\t\telse if typeof path == 'string'\n\t\t\treturn _.get(formData, path)\n\t\telse\n\t\t\tconsole.error 'path has to be a string'\n\t\treturn\n\tif formData == undefined\n\t\tformData = {}\n\tparentPath = getParentPath(dataPath)\n\tparent = getValueByPath(formData, parentPath) or {}\n\tif typeof func == 'string'\n\t\tfuncBody = func.substring(2, func.length - 2)\n\t\tglobalTag = '__G_L_O_B_A_L__'\n\t\tstr = '\\n return ' + funcBody.replace(/\\bformData\\b/g, JSON.stringify(formData).replace(/\\bglobal\\b/g, globalTag)).replace(/\\bglobal\\b/g, JSON.stringify(global)).replace(new RegExp('\\\\b' + globalTag + '\\\\b', 'g'), 'global').replace(/rootValue/g, JSON.stringify(parent))\n\t\ttry\n\t\t\treturn Function(str)()\n\t\tcatch error\n\t\t\tconsole.log error, func, dataPath\n\t\t\treturn func\n\telse\n\t\treturn func\n\treturn\n\nif Meteor.isClient\n\n\tSteedos.spaceUpgradedModal = ()->\n\t\tswal({title: TAPi18n.__(\"space_paid_info_title\"), text: TAPi18n.__(\"space_paid_info_text\"), html: true, type:\"warning\", confirmButtonText: TAPi18n.__(\"OK\")});\n\n\tSteedos.getAccountBgBodyValue = ()->\n\t\taccountBgBody = db.steedos_keyvalues.findOne({user:Steedos.userId(),key:\"bg_body\"})\n\t\tif accountBgBody\n\t\t\treturn accountBgBody.value\n\t\telse\n\t\t\treturn {};\n\n\tSteedos.applyAccountBgBodyValue = (accountBgBodyValue,isNeedToLocal)->\n\t\tif Meteor.loggingIn() or !Steedos.userId()\n\t\t\t# 如果是正在登录中或在登录界面,则取localStorage中设置,而不是直接应用空设置\n\t\t\taccountBgBodyValue = {}\n\t\t\taccountBgBodyValue.url = localStorage.getItem(\"accountBgBodyValue.url\")\n\t\t\taccountBgBodyValue.avatar = localStorage.getItem(\"accountBgBodyValue.avatar\")\n\n\t\turl = accountBgBodyValue.url\n\t\tavatar = accountBgBodyValue.avatar\n\t\t# if accountBgBodyValue.url\n\t\t# \tif url == avatar\n\t\t# \t\tavatarUrl = 'api/files/avatars/' + avatar\n\t\t# \t\t$(\"body\").css \"backgroundImage\",\"url(#{Steedos.absoluteUrl(avatarUrl)})\"\n\t\t# \telse\n\t\t# \t\t$(\"body\").css \"backgroundImage\",\"url(#{Steedos.absoluteUrl(url)})\"\n\t\t# else\n\t\t# \tbackground = Meteor.settings?.public?.admin?.background\n\t\t# \tif background\n\t\t# \t\t$(\"body\").css \"backgroundImage\",\"url(#{Steedos.absoluteUrl(background)})\"\n\t\t# \telse\n\t\t# \t\tbackground = \"/packages/steedos_theme/client/background/sea.jpg\"\n\t\t# \t\t$(\"body\").css \"backgroundImage\",\"url(#{Steedos.absoluteUrl(background)})\"\n\n\t\tif isNeedToLocal\n\t\t\tif Meteor.loggingIn()\n\t\t\t\t# 正在登录中,则不做处理,因为此时Steedos.userId()不足于证明已登录状态\n\t\t\t\treturn\n\t\t\t# 这里特意不在localStorage中存储Steedos.userId(),因为需要保证登录界面也应用localStorage中的设置\n\t\t\t# 登录界面不设置localStorage,因为登录界面accountBgBodyValue肯定为空,设置的话,会造成无法保持登录界面也应用localStorage中的设置\n\t\t\tif Steedos.userId()\n\t\t\t\tif url\n\t\t\t\t\tlocalStorage.setItem(\"accountBgBodyValue.url\",url)\n\t\t\t\t\tlocalStorage.setItem(\"accountBgBodyValue.avatar\",avatar)\n\t\t\t\telse\n\t\t\t\t\tlocalStorage.removeItem(\"accountBgBodyValue.url\")\n\t\t\t\t\tlocalStorage.removeItem(\"accountBgBodyValue.avatar\")\n\n\tSteedos.getAccountSkinValue = ()->\n\t\taccountSkin = db.steedos_keyvalues.findOne({user:Steedos.userId(),key:\"skin\"})\n\t\tif accountSkin\n\t\t\treturn accountSkin.value\n\t\telse\n\t\t\treturn {};\n\n\tSteedos.getAccountZoomValue = ()->\n\t\taccountZoom = db.steedos_keyvalues.findOne({user:Steedos.userId(),key:\"zoom\"})\n\t\tif accountZoom\n\t\t\treturn accountZoom.value\n\t\telse\n\t\t\treturn {};\n\n\tSteedos.applyAccountZoomValue = (accountZoomValue,isNeedToLocal)->\n\t\tif Meteor.loggingIn() or !Steedos.userId()\n\t\t\t# 如果是正在登录中或在登录界面,则取localStorage中设置,而不是直接应用空设置\n\t\t\taccountZoomValue = {}\n\t\t\taccountZoomValue.name = localStorage.getItem(\"accountZoomValue.name\")\n\t\t\taccountZoomValue.size = localStorage.getItem(\"accountZoomValue.size\")\n\t\t$(\"body\").removeClass(\"zoom-normal\").removeClass(\"zoom-large\").removeClass(\"zoom-extra-large\");\n\t\tzoomName = accountZoomValue.name\n\t\tzoomSize = accountZoomValue.size\n\t\tunless zoomName\n\t\t\tzoomName = \"large\"\n\t\t\tzoomSize = 1.2\n\t\tif zoomName && !Session.get(\"instancePrint\")\n\t\t\t$(\"body\").addClass(\"zoom-#{zoomName}\")\n\t\t\t# if Steedos.isNode()\n\t\t\t# \tif accountZoomValue.size == \"1\"\n\t\t\t# \t\t# node-webkit中size为0才表示100%\n\t\t\t# \t\tzoomSize = 0\n\t\t\t# \tnw.Window.get().zoomLevel = Number.parseFloat(zoomSize)\n\t\t\t# else\n\t\t\t# \t$(\"body\").addClass(\"zoom-#{zoomName}\")\n\t\tif isNeedToLocal\n\t\t\tif Meteor.loggingIn()\n\t\t\t\t# 正在登录中,则不做处理,因为此时Steedos.userId()不足于证明已登录状态\n\t\t\t\treturn\n\t\t\t# 这里特意不在localStorage中存储Steedos.userId(),因为需要保证登录界面也应用localStorage中的设置\n\t\t\t# 登录界面不设置localStorage,因为登录界面accountZoomValue肯定为空,设置的话,会造成无法保持登录界面也应用localStorage中的设置\n\t\t\tif Steedos.userId()\n\t\t\t\tif accountZoomValue.name\n\t\t\t\t\tlocalStorage.setItem(\"accountZoomValue.name\",accountZoomValue.name)\n\t\t\t\t\tlocalStorage.setItem(\"accountZoomValue.size\",accountZoomValue.size)\n\t\t\t\telse\n\t\t\t\t\tlocalStorage.removeItem(\"accountZoomValue.name\")\n\t\t\t\t\tlocalStorage.removeItem(\"accountZoomValue.size\")\n\n\tSteedos.showHelp = (url)->\n\t\tlocale = Steedos.getLocale()\n\t\tcountry = locale.substring(3)\n\n\t\turl = url || \"http://www.steedos.com/\" + country + \"/help/\"\n\n\t\twindow.open(url, '_help', 'EnableViewPortScale=yes')\n\n\tSteedos.getUrlWithToken = (url)->\n\t\tauthToken = {};\n\t\tauthToken[\"spaceId\"] = Steedos.getSpaceId()\n\t\tauthToken[\"X-User-Id\"] = Meteor.userId();\n\t\tauthToken[\"X-Auth-Token\"] = Accounts._storedLoginToken();\n\n\t\tlinker = \"?\"\n\n\t\tif url.indexOf(\"?\") > -1\n\t\t\tlinker = \"&\"\n\n\t\treturn url + linker + $.param(authToken)\n\n\tSteedos.getAppUrlWithToken = (app_id)->\n\t\tauthToken = {};\n\t\tauthToken[\"spaceId\"] = Steedos.getSpaceId()\n\t\tauthToken[\"X-User-Id\"] = Meteor.userId();\n\t\tauthToken[\"X-Auth-Token\"] = Accounts._storedLoginToken();\n\t\treturn \"api/setup/sso/\" + app_id + \"?\" + $.param(authToken)\n\n\tSteedos.openAppWithToken = (app_id)->\n\t\turl = Steedos.getAppUrlWithToken app_id\n\t\turl = Steedos.absoluteUrl url\n\n\t\tapp = db.apps.findOne(app_id)\n\n\t\tif !app.is_new_window && !Steedos.isMobile() && !Steedos.isCordova()\n\t\t\twindow.location = url\n\t\telse\n\t\t\tSteedos.openWindow(url);\n\n\tSteedos.openUrlWithIE = (url)->\n\t\tif url\n\t\t\tif Steedos.isNode()\n\t\t\t\texec = nw.require('child_process').exec\n\t\t\t\topen_url = url\n\t\t\t\tcmd = \"start iexplore.exe \\\"#{open_url}\\\"\"\n\t\t\t\texec cmd, (error, stdout, stderr) ->\n\t\t\t\t\tif error\n\t\t\t\t\t\ttoastr.error error\n\t\t\t\t\treturn\n\t\t\telse\n\t\t\t\tSteedos.openWindow(url)\n\n\n\tSteedos.openApp = (app_id)->\n\t\tif !Meteor.userId()\n\t\t\tSteedos.redirectToSignIn()\n\t\t\treturn true\n\n\t\tapp = db.apps.findOne(app_id)\n\t\tif !app\n\t\t\tFlowRouter.go(\"/\")\n\t\t\treturn\n\n\t\t# creatorSettings = Meteor.settings.public?.webservices?.creator\n\t\t# if app._id == \"admin\" and creatorSettings?.status == \"active\"\n\t\t# \turl = creatorSettings.url\n\t\t# \treg = /\\/$/\n\t\t# \tunless reg.test url\n\t\t# \t\turl += \"/\"\n\t\t# \turl = \"#{url}app/admin\"\n\t\t# \tSteedos.openWindow(url)\n\t\t# \treturn\n\n\t\ton_click = app.on_click\n\t\tif app.is_use_ie\n\t\t\tif Steedos.isNode()\n\t\t\t\texec = nw.require('child_process').exec\n\t\t\t\tif on_click\n\t\t\t\t\tpath = \"api/app/sso/#{app_id}?authToken=#{Accounts._storedLoginToken()}&userId=#{Meteor.userId()}\"\n\t\t\t\t\topen_url = window.location.origin + \"/\" + path\n\t\t\t\telse\n\t\t\t\t\topen_url = Steedos.getAppUrlWithToken app_id\n\t\t\t\t\topen_url = window.location.origin + \"/\" + open_url\n\t\t\t\tcmd = \"start iexplore.exe \\\"#{open_url}\\\"\"\n\t\t\t\texec cmd, (error, stdout, stderr) ->\n\t\t\t\t\tif error\n\t\t\t\t\t\ttoastr.error error\n\t\t\t\t\treturn\n\t\t\telse\n\t\t\t\tSteedos.openAppWithToken(app_id)\n\n\t\telse if db.apps.isInternalApp(app.url)\n\t\t\tFlowRouter.go(app.url)\n\n\t\telse if app.is_use_iframe\n\t\t\tif app.is_new_window && !Steedos.isMobile() && !Steedos.isCordova()\n\t\t\t\tSteedos.openWindow(Steedos.absoluteUrl(\"apps/iframe/\" + app._id))\n\t\t\telse if Steedos.isMobile() || Steedos.isCordova()\n\t\t\t\tSteedos.openAppWithToken(app_id)\n\t\t\telse\n\t\t\t\tFlowRouter.go(\"/apps/iframe/#{app._id}\")\n\n\t\telse if on_click\n\t\t\t# 这里执行的是一个不带参数的闭包函数,用来避免变量污染\n\t\t\tevalFunString = \"(function(){#{on_click}})()\"\n\t\t\ttry\n\t\t\t\teval(evalFunString)\n\t\t\tcatch e\n\t\t\t\t# just console the error when catch error\n\t\t\t\tconsole.error \"catch some error when eval the on_click script for app link:\"\n\t\t\t\tconsole.error \"#{e.message}\\r\\n#{e.stack}\"\n\t\telse\n\t\t\tSteedos.openAppWithToken(app_id)\n\n\t\tif !app.is_new_window && !Steedos.isMobile() && !Steedos.isCordova() && !app.is_use_ie && !on_click\n\t\t\t# 需要选中当前app时,on_click函数里要单独加上Session.set(\"current_app_id\", app_id)\n\t\t\tSession.set(\"current_app_id\", app_id)\n\n\tSteedos.checkSpaceBalance = (spaceId)->\n\t\tunless spaceId\n\t\t\tspaceId = Steedos.spaceId()\n\t\tmin_months = 1\n\t\tif Steedos.isSpaceAdmin()\n\t\t\tmin_months = 3\n\t\tspace = db.spaces.findOne(spaceId)\n\t\tend_date = space?.end_date\n\t\tif space && Steedos.hasFeature('paid', space._id) and end_date != undefined and (end_date - new Date) <= (min_months*30*24*3600*1000)\n\t\t\t# 提示用户余额不足\n\t\t\ttoastr.error t(\"space_balance_insufficient\")\n\n\tSteedos.setModalMaxHeight = ()->\n\t\taccountZoomValue = Steedos.getAccountZoomValue()\n\t\tunless accountZoomValue.name\n\t\t\taccountZoomValue.name = 'large'\n\t\tswitch accountZoomValue.name\n\t\t\twhen 'normal'\n\t\t\t\tif Steedos.isMobile()\n\t\t\t\t\toffset = -12\n\t\t\t\telse\n\t\t\t\t\toffset = 75\n\t\t\twhen 'large'\n\t\t\t\tif Steedos.isMobile()\n\t\t\t\t\toffset = -6\n\t\t\t\telse\n\t\t\t\t\t# 区分IE浏览器\n\t\t\t\t\tif Steedos.detectIE()\n\t\t\t\t\t\toffset = 199\n\t\t\t\t\telse\n\t\t\t\t\t\toffset = 9\n\t\t\twhen 'extra-large'\n\t\t\t\tif Steedos.isMobile()\n\t\t\t\t\toffset = -26\n\t\t\t\telse\n\t\t\t\t\t# 区分IE浏览器\n\t\t\t\t\tif Steedos.detectIE()\n\t\t\t\t\t\toffset = 303\n\t\t\t\t\telse\n\t\t\t\t\t\toffset = 53\n\n\t\tif $(\".modal\").length\n\t\t\t$(\".modal\").each ->\n\t\t\t\theaderHeight = 0\n\t\t\t\tfooterHeight = 0\n\t\t\t\ttotalHeight = 0\n\t\t\t\t$(\".modal-header\", $(this)).each ->\n\t\t\t\t\theaderHeight += $(this).outerHeight(false)\n\t\t\t\t$(\".modal-footer\", $(this)).each ->\n\t\t\t\t\tfooterHeight += $(this).outerHeight(false)\n\n\t\t\t\ttotalHeight = headerHeight + footerHeight\n\t\t\t\theight = $(\"body\").innerHeight() - totalHeight - offset\n\t\t\t\tif $(this).hasClass(\"cf_contact_modal\")\n\t\t\t\t\t$(\".modal-body\",$(this)).css({\"max-height\": \"#{height}px\", \"height\": \"#{height}px\"})\n\t\t\t\telse\n\t\t\t\t\t$(\".modal-body\",$(this)).css({\"max-height\": \"#{height}px\", \"height\": \"auto\"})\n\n\tSteedos.getModalMaxHeight = (offset)->\n\t\tif Steedos.isMobile()\n\t\t\treValue = window.screen.height - 126 - 180 - 25\n\t\telse\n\t\t\treValue = $(window).height() - 180 - 25\n\t\tunless Steedos.isiOS() or Steedos.isMobile()\n\t\t\t# ios及手机上不需要为zoom放大功能额外计算\n\t\t\taccountZoomValue = Steedos.getAccountZoomValue()\n\t\t\tswitch accountZoomValue.name\n\t\t\t\twhen 'large'\n\t\t\t\t\t# 测下来这里不需要额外减数\n\t\t\t\t\treValue -= 50\n\t\t\t\twhen 'extra-large'\n\t\t\t\t\treValue -= 145\n\t\tif offset\n\t\t\treValue -= offset\n\t\treturn reValue + \"px\";\n\n\tSteedos.isiOS = (userAgent, language)->\n\t\tDEVICE =\n\t\t\tandroid: 'android'\n\t\t\tblackberry: 'blackberry'\n\t\t\tdesktop: 'desktop'\n\t\t\tipad: 'ipad'\n\t\t\tiphone: 'iphone'\n\t\t\tipod: 'ipod'\n\t\t\tmobile: 'mobile'\n\t\tbrowser = {}\n\t\tconExp = '(?:[\\\\/:\\\\::\\\\s:;])'\n\t\tnumExp = '(\\\\S+[^\\\\s:;:\\\\)]|)'\n\t\tuserAgent = (userAgent or navigator.userAgent).toLowerCase()\n\t\tlanguage = language or navigator.language or navigator.browserLanguage\n\t\tdevice = userAgent.match(new RegExp('(android|ipad|iphone|ipod|blackberry)')) or userAgent.match(new RegExp('(mobile)')) or [\n\t\t\t''\n\t\t\tDEVICE.desktop\n\t\t]\n\t\tbrowser.device = device[1]\n\t\treturn browser.device == DEVICE.ipad or browser.device == DEVICE.iphone or browser.device == DEVICE.ipod\n\n\tSteedos.getUserOrganizations = (isIncludeParents)->\n\t\tuserId = Meteor.userId()\n\t\tspaceId = Steedos.spaceId()\n\t\tspace_user = db.space_users.findOne({user:userId,space:spaceId},fields:{organizations:1})\n\t\torganizations = space_user?.organizations\n\t\tunless organizations\n\t\t\treturn []\n\t\tif isIncludeParents\n\t\t\tparents = _.flatten db.organizations.find(_id:{$in:organizations}).fetch().getProperty(\"parents\")\n\t\t\treturn _.union organizations,parents\n\t\telse\n\t\t\treturn organizations\n\n\tSteedos.forbidNodeContextmenu = (target, ifr)->\n\t\tunless Steedos.isNode()\n\t\t\treturn\n\t\ttarget.document.body.addEventListener 'contextmenu', (ev) ->\n\t\t\tev.preventDefault()\n\t\t\treturn false\n\t\tif ifr\n\t\t\tif typeof ifr == 'string'\n\t\t\t\tifr = target.$(ifr)\n\t\t\tifr.load ->\n\t\t\t\tifrBody = ifr.contents().find('body')\n\t\t\t\tif ifrBody\n\t\t\t\t\tifrBody[0].addEventListener 'contextmenu', (ev) ->\n\t\t\t\t\t\tev.preventDefault()\n\t\t\t\t\t\treturn false\n\nif Meteor.isServer\n\tSteedos.getUserOrganizations = (spaceId,userId,isIncludeParents)->\n\t\tspace_user = db.space_users.findOne({user:userId,space:spaceId},fields:{organizations:1})\n\t\torganizations = space_user?.organizations\n\t\tunless organizations\n\t\t\treturn []\n\t\tif isIncludeParents\n\t\t\tparents = _.flatten db.organizations.find(_id:{$in:organizations}).fetch().getProperty(\"parents\")\n\t\t\treturn _.union organizations,parents\n\t\telse\n\t\t\treturn organizations\n\n#\tSteedos.chargeAPIcheck = (spaceId)->\n\nif Meteor.isServer\n\tCookies = require(\"cookies\")\n\t#TODO 添加服务端是否手机的判断(依据request)\n\tSteedos.isMobile = ()->\n\t\treturn false;\n\n\tSteedos.isSpaceAdmin = (spaceId, userId)->\n\t\tif !spaceId || !userId\n\t\t\treturn false\n\t\tspace = db.spaces.findOne(spaceId)\n\t\tif !space || !space.admins\n\t\t\treturn false;\n\t\treturn space.admins.indexOf(userId)>=0\n\n\tSteedos.isLegalVersion = (spaceId,app_version)->\n\t\tif !spaceId\n\t\t\treturn false\n\t\tcheck = false\n\t\tmodules = db.spaces.findOne(spaceId)?.modules\n\t\tif modules and modules.includes(app_version)\n\t\t\tcheck = true\n\t\treturn check\n\n\t# 判断数组orgIds中的org id集合对于用户userId是否有组织管理员权限,只要数组orgIds中任何一个组织有权限就返回true,反之返回false\n\tSteedos.isOrgAdminByOrgIds = (orgIds, userId)->\n\t\tisOrgAdmin = false\n\t\tuseOrgs = db.organizations.find({_id: {$in:orgIds}},{fields:{parents:1,admins:1}}).fetch()\n\t\tparents = []\n\t\tallowAccessOrgs = useOrgs.filter (org) ->\n\t\t\tif org.parents\n\t\t\t\tparents = _.union parents,org.parents\n\t\t\treturn org.admins?.includes(userId)\n\t\tif allowAccessOrgs.length\n\t\t\tisOrgAdmin = true\n\t\telse\n\t\t\tparents = _.flatten parents\n\t\t\tparents = _.uniq parents\n\t\t\tif parents.length and db.organizations.findOne({_id:{$in:parents}, admins:userId})\n\t\t\t\tisOrgAdmin = true\n\t\treturn isOrgAdmin\n\n\n\t# 判断数组orgIds中的org id集合对于用户userId是否有全部组织管理员权限,只有数组orgIds中每个组织都有权限才返回true,反之返回false\n\tSteedos.isOrgAdminByAllOrgIds = (orgIds, userId)->\n\t\tunless orgIds.length\n\t\t\treturn true\n\t\ti = 0\n\t\twhile i < orgIds.length\n\t\t\tisOrgAdmin = Steedos.isOrgAdminByOrgIds [orgIds[i]], userId\n\t\t\tunless isOrgAdmin\n\t\t\t\tbreak\n\t\t\ti++\n\t\treturn isOrgAdmin\n\n\tSteedos.absoluteUrl = (url)->\n\t\tif url\n\t\t\t# url以\"/\"开头的话,去掉开头的\"/\"\n\t\t\turl = url.replace(/^\\//,\"\")\n\t\tif (Meteor.isCordova)\n\t\t\treturn Meteor.absoluteUrl(url);\n\t\telse\n\t\t\tif Meteor.isClient\n\t\t\t\ttry\n\t\t\t\t\troot_url = new URL(Meteor.absoluteUrl())\n\t\t\t\t\tif url\n\t\t\t\t\t\treturn root_url.pathname + url\n\t\t\t\t\telse\n\t\t\t\t\t\treturn root_url.pathname\n\t\t\t\tcatch e\n\t\t\t\t\treturn Meteor.absoluteUrl(url)\n\t\t\telse\n\t\t\t\tMeteor.absoluteUrl(url)\n\n\t#\t通过request.headers、cookie 获得有效用户\n\tSteedos.getAPILoginUser\t= (req, res) ->\n\n\t\tusername = req.query?.username\n\n\t\tpassword = req.query?.password\n\n\t\tif username && password\n\t\t\tuser = db.users.findOne({steedos_id: username})\n\n\t\t\tif !user\n\t\t\t\treturn false\n\n\t\t\tresult = Accounts._checkPassword user, password\n\n\t\t\tif result.error\n\t\t\t\tthrow new Error(result.error)\n\t\t\telse\n\t\t\t\treturn user\n\n\t\tuserId = req.query?[\"X-User-Id\"]\n\n\t\tauthToken = req.query?[\"X-Auth-Token\"]\n\n\t\tif Steedos.checkAuthToken(userId,authToken)\n\t\t\treturn db.users.findOne({_id: userId})\n\n\t\tcookies = new Cookies(req, res);\n\n\t\tif req.headers\n\t\t\tuserId = req.headers[\"x-user-id\"]\n\t\t\tauthToken = req.headers[\"x-auth-token\"]\n\n\t\t# then check cookie\n\t\tif !userId or !authToken\n\t\t\tuserId = cookies.get(\"X-User-Id\")\n\t\t\tauthToken = cookies.get(\"X-Auth-Token\")\n\n\t\tif !userId or !authToken\n\t\t\treturn false\n\n\t\tif Steedos.checkAuthToken(userId, authToken)\n\t\t\treturn db.users.findOne({_id: userId})\n\n\t\treturn false\n\n\t#\t检查userId、authToken是否有效\n\tSteedos.checkAuthToken = (userId, authToken) ->\n\t\tif userId and authToken\n\t\t\thashedToken = Accounts._hashLoginToken(authToken)\n\t\t\tuser = Meteor.users.findOne\n\t\t\t\t_id: userId,\n\t\t\t\t\"services.resume.loginTokens.hashedToken\": hashedToken\n\t\t\tif user\n\t\t\t\treturn true\n\t\t\telse\n\t\t\t\treturn false\n\t\treturn false\n\n\nif Meteor.isServer\n\tcrypto = require('crypto');\n\tSteedos.decrypt = (password, key, iv)->\n\t\ttry\n\t\t\tkey32 = \"\"\n\t\t\tlen = key.length\n\t\t\tif len < 32\n\t\t\t\tc = \"\"\n\t\t\t\ti = 0\n\t\t\t\tm = 32 - len\n\t\t\t\twhile i < m\n\t\t\t\t\tc = \" \" + c\n\t\t\t\t\ti++\n\t\t\t\tkey32 = key + c\n\t\t\telse if len >= 32\n\t\t\t\tkey32 = key.slice(0, 32)\n\n\t\t\tdecipher = crypto.createDecipheriv('aes-256-cbc', new Buffer(key32, 'utf8'), new Buffer(iv, 'utf8'))\n\n\t\t\tdecipherMsg = Buffer.concat([decipher.update(password, 'base64'), decipher.final()])\n\n\t\t\tpassword = decipherMsg.toString();\n\t\t\treturn password;\n\t\tcatch e\n\t\t\treturn password;\n\n\tSteedos.encrypt = (password, key, iv)->\n\t\tkey32 = \"\"\n\t\tlen = key.length\n\t\tif len < 32\n\t\t\tc = \"\"\n\t\t\ti = 0\n\t\t\tm = 32 - len\n\t\t\twhile i < m\n\t\t\t\tc = \" \" + c\n\t\t\t\ti++\n\t\t\tkey32 = key + c\n\t\telse if len >= 32\n\t\t\tkey32 = key.slice(0, 32)\n\n\t\tcipher = crypto.createCipheriv('aes-256-cbc', new Buffer(key32, 'utf8'), new Buffer(iv, 'utf8'))\n\n\t\tcipheredMsg = Buffer.concat([cipher.update(new Buffer(password, 'utf8')), cipher.final()])\n\n\t\tpassword = cipheredMsg.toString('base64')\n\n\t\treturn password;\n\n\tSteedos.getUserIdFromAccessToken = (access_token)->\n\n\t\tif !access_token\n\t\t\treturn null;\n\n\t\tuserId = access_token.split(\"-\")[0]\n\n\t\thashedToken = Accounts._hashLoginToken(access_token)\n\n\t\tuser = db.users.findOne({_id: userId, \"secrets.hashedToken\": hashedToken})\n\n\t\tif user\n\t\t\treturn userId\n\t\telse\n\t\t\t# 如果user表未查到,则使用oauth2协议生成的token查找用户\n\t\t\tcollection = oAuth2Server.collections.accessToken\n\n\t\t\tobj = collection.findOne({'accessToken': access_token})\n\t\t\tif obj\n\t\t\t\t# 判断token的有效期\n\t\t\t\tif obj?.expires < new Date()\n\t\t\t\t\treturn \"oauth2 access token:\"+access_token+\" is expired.\"\n\t\t\t\telse\n\t\t\t\t\treturn obj?.userId\n\t\t\telse\n\t\t\t\treturn \"oauth2 access token:\"+access_token+\" is not found.\"\n\t\treturn null\n\n\tSteedos.getUserIdFromAuthToken = (req, res)->\n\n\t\tuserId = req.query?[\"X-User-Id\"]\n\n\t\tauthToken = req.query?[\"X-Auth-Token\"]\n\n\t\tif Steedos.checkAuthToken(userId,authToken)\n\t\t\treturn db.users.findOne({_id: userId})?._id\n\n\t\tcookies = new Cookies(req, res);\n\n\t\tif req.headers\n\t\t\tuserId = req.headers[\"x-user-id\"]\n\t\t\tauthToken = req.headers[\"x-auth-token\"]\n\n\t\t# then check cookie\n\t\tif !userId or !authToken\n\t\t\tuserId = cookies.get(\"X-User-Id\")\n\t\t\tauthToken = cookies.get(\"X-Auth-Token\")\n\n\t\tif !userId or !authToken\n\t\t\treturn null\n\n\t\tif Steedos.checkAuthToken(userId, authToken)\n\t\t\treturn db.users.findOne({_id: userId})?._id\n\n\tSteedos.APIAuthenticationCheck = (req, res) ->\n\t\ttry\n\t\t\tuserId = req.userId\n\n\t\t\tuser = db.users.findOne({_id: userId})\n\n\t\t\tif !userId || !user\n\t\t\t\tJsonRoutes.sendResult res,\n\t\t\t\t\tdata:\n\t\t\t\t\t\t\"error\": \"Validate Request -- Missing X-Auth-Token,X-User-Id Or access_token\",\n\t\t\t\t\tcode: 401,\n\t\t\t\treturn false;\n\t\t\telse\n\t\t\t\treturn true;\n\t\tcatch e\n\t\t\tif !userId || !user\n\t\t\t\tJsonRoutes.sendResult res,\n\t\t\t\t\tcode: 401,\n\t\t\t\t\tdata:\n\t\t\t\t\t\t\"error\": e.message,\n\t\t\t\t\t\t\"success\": false\n\t\t\t\treturn false;\n\n\n# This will add underscore.string methods to Underscore.js\n# except for include, contains, reverse and join that are\n# dropped because they collide with the functions already\n# defined by Underscore.js.\n\nmixin = (obj) ->\n\t_.each _.functions(obj), (name) ->\n\t\tif not _[name] and not _.prototype[name]?\n\t\t\tfunc = _[name] = obj[name]\n\t\t\t_.prototype[name] = ->\n\t\t\t\targs = [this._wrapped]\n\t\t\t\tpush.apply(args, arguments)\n\t\t\t\treturn result.call(this, func.apply(_, args))\n\n#mixin(_s.exports())\n\nif Meteor.isServer\n# 判断是否是节假日\n\tSteedos.isHoliday = (date)->\n\t\tif !date\n\t\t\tdate = new Date\n\t\tcheck date, Date\n\t\tday = date.getDay()\n\t\t# 周六周日为假期\n\t\tif day is 6 or day is 0\n\t\t\treturn true\n\n\t\treturn false\n\t# 根据传入时间(date)计算几个工作日(days)后的时间,days目前只能是整数\n\tSteedos.caculateWorkingTime = (date, days)->\n\t\tcheck date, Date\n\t\tcheck days, Number\n\t\tparam_date = new Date date\n\t\tcaculateDate = (i, days)->\n\t\t\tif i < days\n\t\t\t\tparam_date = new Date(param_date.getTime() + 24*60*60*1000)\n\t\t\t\tif !Steedos.isHoliday(param_date)\n\t\t\t\t\ti++\n\t\t\t\tcaculateDate(i, days)\n\t\t\treturn\n\t\tcaculateDate(0, days)\n\t\treturn param_date\n\n\t# 计算半个工作日后的时间\n\t# 参数 next如果为true则表示只计算date时间后面紧接着的time_points\n\tSteedos.caculatePlusHalfWorkingDay = (date, next) ->\n\t\tcheck date, Date\n\t\ttime_points = Meteor.settings.remind?.time_points\n\t\tif not time_points or _.isEmpty(time_points)\n\t\t\tconsole.error \"time_points is null\"\n\t\t\ttime_points = [{\"hour\": 8, \"minute\": 30 }, {\"hour\": 14, \"minute\": 30 }]\n\n\t\tlen = time_points.length\n\t\tstart_date = new Date date\n\t\tend_date = new Date date\n\t\tstart_date.setHours time_points[0].hour\n\t\tstart_date.setMinutes time_points[0].minute\n\t\tend_date.setHours time_points[len - 1].hour\n\t\tend_date.setMinutes time_points[len - 1].minute\n\n\t\tcaculated_date = new Date date\n\n\t\tj = 0\n\t\tmax_index = len - 1\n\t\tif date < start_date\n\t\t\tif next\n\t\t\t\tj = 0\n\t\t\telse\n\t\t\t\t# 加半个time_points\n\t\t\t\tj = len/2\n\t\telse if date >= start_date and date < end_date\n\t\t\ti = 0\n\t\t\twhile i < max_index\n\t\t\t\tfirst_date = new Date date\n\t\t\t\tsecond_date = new Date date\n\t\t\t\tfirst_date.setHours time_points[i].hour\n\t\t\t\tfirst_date.setMinutes time_points[i].minute\n\t\t\t\tsecond_date.setHours time_points[i + 1].hour\n\t\t\t\tsecond_date.setMinutes time_points[i + 1].minute\n\n\t\t\t\tif date >= first_date and date < second_date\n\t\t\t\t\tbreak\n\n\t\t\t\ti++\n\n\t\t\tif next\n\t\t\t\tj = i + 1\n\t\t\telse\n\t\t\t\tj = i + len/2\n\n\t\telse if date >= end_date\n\t\t\tif next\n\t\t\t\tj = max_index + 1\n\t\t\telse\n\t\t\t\tj = max_index + len/2\n\n\t\tif j > max_index\n\t\t\t# 隔天需判断节假日\n\t\t\tcaculated_date = Steedos.caculateWorkingTime date, 1\n\t\t\tcaculated_date.setHours time_points[j - max_index - 1].hour\n\t\t\tcaculated_date.setMinutes time_points[j - max_index - 1].minute\n\t\telse if j <= max_index\n\t\t\tcaculated_date.setHours time_points[j].hour\n\t\t\tcaculated_date.setMinutes time_points[j].minute\n\n\t\treturn caculated_date\n\nif Meteor.isServer\n\t_.extend Steedos,\n\t\tgetSteedosToken: (appId, userId, authToken)->\n\t\t\tcrypto = require('crypto')\n\t\t\tapp = db.apps.findOne(appId)\n\t\t\tif app\n\t\t\t\tsecret = app.secret\n\n\t\t\tif userId and authToken\n\t\t\t\thashedToken = Accounts._hashLoginToken(authToken)\n\t\t\t\tuser = Meteor.users.findOne\n\t\t\t\t\t_id: userId,\n\t\t\t\t\t\"services.resume.loginTokens.hashedToken\": hashedToken\n\t\t\t\tif user\n\t\t\t\t\tsteedos_id = user.steedos_id\n\t\t\t\t\tif app.secret\n\t\t\t\t\t\tiv = app.secret\n\t\t\t\t\telse\n\t\t\t\t\t\tiv = \"-8762-fcb369b2e8\"\n\t\t\t\t\tnow = parseInt(new Date().getTime()/1000).toString()\n\t\t\t\t\tkey32 = \"\"\n\t\t\t\t\tlen = steedos_id.length\n\t\t\t\t\tif len < 32\n\t\t\t\t\t\tc = \"\"\n\t\t\t\t\t\ti = 0\n\t\t\t\t\t\tm = 32 - len\n\t\t\t\t\t\twhile i < m\n\t\t\t\t\t\t\tc = \" \" + c\n\t\t\t\t\t\t\ti++\n\t\t\t\t\t\tkey32 = steedos_id + c\n\t\t\t\t\telse if len >= 32\n\t\t\t\t\t\tkey32 = steedos_id.slice(0,32)\n\n\t\t\t\t\tcipher = crypto.createCipheriv('aes-256-cbc', new Buffer(key32, 'utf8'), new Buffer(iv, 'utf8'))\n\n\t\t\t\t\tcipheredMsg = Buffer.concat([cipher.update(new Buffer(now, 'utf8')), cipher.final()])\n\n\t\t\t\t\tsteedos_token = cipheredMsg.toString('base64')\n\n\t\t\treturn steedos_token\n\n\t\tlocale: (userId, isI18n)->\n\t\t\tuser = db.users.findOne({_id:userId},{fields: {locale: 1}})\n\t\t\tlocale = user?.locale\n\t\t\tif isI18n\n\t\t\t\tif locale == \"en-us\"\n\t\t\t\t\tlocale = \"en\"\n\t\t\t\tif locale == \"zh-cn\"\n\t\t\t\t\tlocale = \"zh-CN\"\n\t\t\treturn locale\n\n\t\tcheckUsernameAvailability: (username) ->\n\t\t\treturn not Meteor.users.findOne({ username: { $regex : new RegExp(\"^\" + Meteor._escapeRegExp(username).trim() + \"$\", \"i\") } })\n\n\n\t\tvalidatePassword: (pwd)->\n\t\t\treason = t \"password_invalid\"\n\t\t\tvalid = true\n\t\t\tunless pwd\n\t\t\t\tvalid = false\n\n\t\t\tpassworPolicy = Meteor.settings.public?.password?.policy\n\t\t\tpassworPolicyError = Meteor.settings.public?.password?.policyError\n\t\t\tif passworPolicy\n\t\t\t\tif !(new RegExp(passworPolicy)).test(pwd || '')\n\t\t\t\t\treason = passworPolicyError\n\t\t\t\t\tvalid = false\n\t\t\t\telse\n\t\t\t\t\tvalid = true\n#\t\t\telse\n#\t\t\t\tunless /\\d+/.test(pwd)\n#\t\t\t\t\tvalid = false\n#\t\t\t\tunless /[a-zA-Z]+/.test(pwd)\n#\t\t\t\t\tvalid = false\n#\t\t\t\tif pwd.length < 8\n#\t\t\t\t\tvalid = false\n\t\t\tif valid\n\t\t\t\treturn true\n\t\t\telse\n\t\t\t\treturn error:\n\t\t\t\t\treason: reason\n\nSteedos.convertSpecialCharacter = (str)->\n\treturn str.replace(/([\\^\\$\\(\\)\\*\\+\\?\\.\\\\\\|\\[\\]\\{\\}])/g, \"\\\\$1\")\n\nSteedos.removeSpecialCharacter = (str)->\n\treturn str.replace(/([\\^\\$\\(\\)\\*\\+\\?\\.\\\\\\|\\[\\]\\{\\}\\~\\`\\@\\#\\%\\&\\=\\'\\\"\\:\\;\\<\\>\\,\\/])/g, \"\")\n\nCreator.getDBApps = (space_id)->\n\tdbApps = {}\n\tCreator.Collections[\"apps\"].find({space: space_id,is_creator:true,visible:true}, {\n\t\tfields: {\n\t\t\tcreated: 0,\n\t\t\tcreated_by: 0,\n\t\t\tmodified: 0,\n\t\t\tmodified_by: 0\n\t\t}\n\t}).forEach (app)->\n\t\tdbApps[app._id] = app\n\n\treturn dbApps\n\nCreator.getDBDashboards = (space_id)->\n\tdbDashboards = {}\n\tCreator.Collections[\"dashboard\"].find({space: space_id}, {\n\t\tfields: {\n\t\t\tcreated: 0,\n\t\t\tcreated_by: 0,\n\t\t\tmodified: 0,\n\t\t\tmodified_by: 0\n\t\t}\n\t}).forEach (dashboard)->\n\t\tdbDashboards[dashboard._id] = dashboard\n\n\treturn dbDashboards\n\nif Meteor.isServer\n\tCookies = require(\"cookies\")\n\tSteedos.getAuthToken = (req, res)->\n\t\tcookies = new Cookies(req, res)\n\t\tauthToken = req.headers['x-auth-token'] || cookies.get(\"X-Auth-Token\")\n\t\tif !authToken && req.headers.authorization && req.headers.authorization.split(' ')[0] == 'Bearer'\n\t\t\tauthToken = req.headers.authorization.split(' ')[1]\n\t\treturn authToken\n\nif Meteor.isClient\n\tMeteor.autorun ()->\n\t\tif Session.get('current_app_id')\n\t\t\tsessionStorage.setItem('current_app_id', Session.get('current_app_id'))\n#\t\telse\n#\t\t\tconsole.log('remove current_app_id...');\n#\t\t\tsessionStorage.removeItem('current_app_id')\n\tSteedos.getCurrentAppId = ()->\n\t\tif Session.get('app_id')\n\t\t\treturn Session.get('app_id')\n\t\telse\n\t\t\treturn sessionStorage.getItem('current_app_id');\n\nif Meteor.isServer\n\tSteedos.formatIndex = (array) ->\n\t\tobject = {\n \tbackground: true\n \t};\n\t\tisdocumentDB = Meteor.settings?.datasources?.default?.documentDB || false;\n\t\tif isdocumentDB\n\t\t\tif array.length > 0\n\t\t\t\tindexName = array.join(\".\");\n\t\t\t\tobject.name = indexName;\n\t\t\t\t\n\t\t\t\tif (indexName.length > 52)\n\t\t\t\t\tobject.name = indexName.substring(0,52);\n\n\t\treturn object;","var Cookies, crypto, mixin, ref, ref1, ref2, ref3, ref4, rootUrl; \n\nSteedos = {\n settings: {},\n db: db,\n subs: {},\n isPhoneEnabled: function() {\n var ref, ref1;\n return !!((ref = Meteor.settings) != null ? (ref1 = ref[\"public\"]) != null ? ref1.phone : void 0 : void 0);\n },\n numberToString: function(number, scale, notThousands) {\n var ref, ref1, reg;\n if (typeof number === \"number\") {\n number = number.toString();\n }\n if (!number) {\n return '';\n }\n if (number !== \"NaN\") {\n if (scale || scale === 0) {\n number = Number(number).toFixed(scale);\n }\n if (!notThousands) {\n if (!(scale || scale === 0)) {\n scale = (ref = number.match(/\\.(\\d+)/)) != null ? (ref1 = ref[1]) != null ? ref1.length : void 0 : void 0;\n if (!scale) {\n scale = 0;\n }\n }\n reg = /(\\d)(?=(\\d{3})+\\.)/g;\n if (scale === 0) {\n reg = /(\\d)(?=(\\d{3})+\\b)/g;\n }\n number = number.replace(reg, '$1,');\n }\n return number;\n } else {\n return \"\";\n }\n },\n valiJquerySymbols: function(str) {\n var reg;\n reg = new RegExp(\"^[^!\\\"#$%&'()*\\+,\\.\\/:;<=>?@[\\\\]^`{|}~]+$\");\n return reg.test(str);\n }\n};\n\n\n/*\n * Kick off the global namespace for Steedos.\n * @namespace Steedos\n */\n\nif (Meteor.isCordova || Meteor.isClient) {\n rootUrl = Meteor.absoluteUrl.defaultOptions.rootUrl;\n if (rootUrl.endsWith('/')) {\n rootUrl = rootUrl.substr(0, rootUrl.length - 1);\n }\n if ((ref = window.stores) != null) {\n if ((ref1 = ref.API) != null) {\n if ((ref2 = ref1.client) != null) {\n ref2.setUrl = rootUrl;\n }\n }\n }\n if ((ref3 = window.stores) != null) {\n if ((ref4 = ref3.Settings) != null) {\n ref4.setRootUrl(rootUrl);\n }\n }\n window['steedos.setting'] = {\n rootUrl: rootUrl\n };\n}\n\nif (Meteor.isClient) {\n Meteor.autorun(function() {\n var ref5, ref6, ref7, ref8;\n if ((ref5 = window.stores) != null) {\n if ((ref6 = ref5.Settings) != null) {\n ref6.setUserId(Steedos.userId());\n }\n }\n return (ref7 = window.stores) != null ? (ref8 = ref7.Settings) != null ? ref8.setTenantId(Steedos.spaceId()) : void 0 : void 0;\n });\n}\n\nSteedos.getHelpUrl = function(locale) {\n var country;\n country = locale.substring(3);\n return \"http://www.steedos.com/\" + country + \"/help/\";\n};\n\nSteedos.isExpression = function(func) {\n var pattern, reg1, reg2;\n if (typeof func !== 'string') {\n return false;\n }\n pattern = /^{{(.+)}}$/;\n reg1 = /^{{(function.+)}}$/;\n reg2 = /^{{(.+=>.+)}}$/;\n if (typeof func === 'string' && func.match(pattern) && !func.match(reg1) && !func.match(reg2)) {\n return true;\n }\n return false;\n};\n\nSteedos.parseSingleExpression = function(func, formData, dataPath, global) {\n var error, funcBody, getParentPath, getValueByPath, globalTag, parent, parentPath, str;\n getParentPath = function(path) {\n var pathArr;\n if (typeof path === 'string') {\n pathArr = path.split('.');\n if (pathArr.length === 1) {\n return '#';\n }\n pathArr.pop();\n return pathArr.join('.');\n }\n return '#';\n };\n getValueByPath = function(formData, path) {\n if (path === '#' || !path) {\n return formData || {};\n } else if (typeof path === 'string') {\n return _.get(formData, path);\n } else {\n console.error('path has to be a string');\n }\n };\n if (formData === void 0) {\n formData = {};\n }\n parentPath = getParentPath(dataPath);\n parent = getValueByPath(formData, parentPath) || {};\n if (typeof func === 'string') {\n funcBody = func.substring(2, func.length - 2);\n globalTag = '__G_L_O_B_A_L__';\n str = '\\n return ' + funcBody.replace(/\\bformData\\b/g, JSON.stringify(formData).replace(/\\bglobal\\b/g, globalTag)).replace(/\\bglobal\\b/g, JSON.stringify(global)).replace(new RegExp('\\\\b' + globalTag + '\\\\b', 'g'), 'global').replace(/rootValue/g, JSON.stringify(parent));\n try {\n return Function(str)();\n } catch (error1) {\n error = error1;\n console.log(error, func, dataPath);\n return func;\n }\n } else {\n return func;\n }\n};\n\nif (Meteor.isClient) {\n Steedos.spaceUpgradedModal = function() {\n return swal({\n title: TAPi18n.__(\"space_paid_info_title\"),\n text: TAPi18n.__(\"space_paid_info_text\"),\n html: true,\n type: \"warning\",\n confirmButtonText: TAPi18n.__(\"OK\")\n });\n };\n Steedos.getAccountBgBodyValue = function() {\n var accountBgBody;\n accountBgBody = db.steedos_keyvalues.findOne({\n user: Steedos.userId(),\n key: \"bg_body\"\n });\n if (accountBgBody) {\n return accountBgBody.value;\n } else {\n return {};\n }\n };\n Steedos.applyAccountBgBodyValue = function(accountBgBodyValue, isNeedToLocal) {\n var avatar, url;\n if (Meteor.loggingIn() || !Steedos.userId()) {\n accountBgBodyValue = {};\n accountBgBodyValue.url = localStorage.getItem(\"accountBgBodyValue.url\");\n accountBgBodyValue.avatar = localStorage.getItem(\"accountBgBodyValue.avatar\");\n }\n url = accountBgBodyValue.url;\n avatar = accountBgBodyValue.avatar;\n if (isNeedToLocal) {\n if (Meteor.loggingIn()) {\n return;\n }\n if (Steedos.userId()) {\n if (url) {\n localStorage.setItem(\"accountBgBodyValue.url\", url);\n return localStorage.setItem(\"accountBgBodyValue.avatar\", avatar);\n } else {\n localStorage.removeItem(\"accountBgBodyValue.url\");\n return localStorage.removeItem(\"accountBgBodyValue.avatar\");\n }\n }\n }\n };\n Steedos.getAccountSkinValue = function() {\n var accountSkin;\n accountSkin = db.steedos_keyvalues.findOne({\n user: Steedos.userId(),\n key: \"skin\"\n });\n if (accountSkin) {\n return accountSkin.value;\n } else {\n return {};\n }\n };\n Steedos.getAccountZoomValue = function() {\n var accountZoom;\n accountZoom = db.steedos_keyvalues.findOne({\n user: Steedos.userId(),\n key: \"zoom\"\n });\n if (accountZoom) {\n return accountZoom.value;\n } else {\n return {};\n }\n };\n Steedos.applyAccountZoomValue = function(accountZoomValue, isNeedToLocal) {\n var zoomName, zoomSize;\n if (Meteor.loggingIn() || !Steedos.userId()) {\n accountZoomValue = {};\n accountZoomValue.name = localStorage.getItem(\"accountZoomValue.name\");\n accountZoomValue.size = localStorage.getItem(\"accountZoomValue.size\");\n }\n $(\"body\").removeClass(\"zoom-normal\").removeClass(\"zoom-large\").removeClass(\"zoom-extra-large\");\n zoomName = accountZoomValue.name;\n zoomSize = accountZoomValue.size;\n if (!zoomName) {\n zoomName = \"large\";\n zoomSize = 1.2;\n }\n if (zoomName && !Session.get(\"instancePrint\")) {\n $(\"body\").addClass(\"zoom-\" + zoomName);\n }\n if (isNeedToLocal) {\n if (Meteor.loggingIn()) {\n return;\n }\n if (Steedos.userId()) {\n if (accountZoomValue.name) {\n localStorage.setItem(\"accountZoomValue.name\", accountZoomValue.name);\n return localStorage.setItem(\"accountZoomValue.size\", accountZoomValue.size);\n } else {\n localStorage.removeItem(\"accountZoomValue.name\");\n return localStorage.removeItem(\"accountZoomValue.size\");\n }\n }\n }\n };\n Steedos.showHelp = function(url) {\n var country, locale;\n locale = Steedos.getLocale();\n country = locale.substring(3);\n url = url || \"http://www.steedos.com/\" + country + \"/help/\";\n return window.open(url, '_help', 'EnableViewPortScale=yes');\n };\n Steedos.getUrlWithToken = function(url) {\n var authToken, linker;\n authToken = {};\n authToken[\"spaceId\"] = Steedos.getSpaceId();\n authToken[\"X-User-Id\"] = Meteor.userId();\n authToken[\"X-Auth-Token\"] = Accounts._storedLoginToken();\n linker = \"?\";\n if (url.indexOf(\"?\") > -1) {\n linker = \"&\";\n }\n return url + linker + $.param(authToken);\n };\n Steedos.getAppUrlWithToken = function(app_id) {\n var authToken;\n authToken = {};\n authToken[\"spaceId\"] = Steedos.getSpaceId();\n authToken[\"X-User-Id\"] = Meteor.userId();\n authToken[\"X-Auth-Token\"] = Accounts._storedLoginToken();\n return \"api/setup/sso/\" + app_id + \"?\" + $.param(authToken);\n };\n Steedos.openAppWithToken = function(app_id) {\n var app, url;\n url = Steedos.getAppUrlWithToken(app_id);\n url = Steedos.absoluteUrl(url);\n app = db.apps.findOne(app_id);\n if (!app.is_new_window && !Steedos.isMobile() && !Steedos.isCordova()) {\n return window.location = url;\n } else {\n return Steedos.openWindow(url);\n }\n };\n Steedos.openUrlWithIE = function(url) {\n var cmd, exec, open_url;\n if (url) {\n if (Steedos.isNode()) {\n exec = nw.require('child_process').exec;\n open_url = url;\n cmd = \"start iexplore.exe \\\"\" + open_url + \"\\\"\";\n return exec(cmd, function(error, stdout, stderr) {\n if (error) {\n toastr.error(error);\n }\n });\n } else {\n return Steedos.openWindow(url);\n }\n }\n };\n Steedos.openApp = function(app_id) {\n var app, cmd, e, evalFunString, exec, on_click, open_url, path;\n if (!Meteor.userId()) {\n Steedos.redirectToSignIn();\n return true;\n }\n app = db.apps.findOne(app_id);\n if (!app) {\n FlowRouter.go(\"/\");\n return;\n }\n on_click = app.on_click;\n if (app.is_use_ie) {\n if (Steedos.isNode()) {\n exec = nw.require('child_process').exec;\n if (on_click) {\n path = \"api/app/sso/\" + app_id + \"?authToken=\" + (Accounts._storedLoginToken()) + \"&userId=\" + (Meteor.userId());\n open_url = window.location.origin + \"/\" + path;\n } else {\n open_url = Steedos.getAppUrlWithToken(app_id);\n open_url = window.location.origin + \"/\" + open_url;\n }\n cmd = \"start iexplore.exe \\\"\" + open_url + \"\\\"\";\n exec(cmd, function(error, stdout, stderr) {\n if (error) {\n toastr.error(error);\n }\n });\n } else {\n Steedos.openAppWithToken(app_id);\n }\n } else if (db.apps.isInternalApp(app.url)) {\n FlowRouter.go(app.url);\n } else if (app.is_use_iframe) {\n if (app.is_new_window && !Steedos.isMobile() && !Steedos.isCordova()) {\n Steedos.openWindow(Steedos.absoluteUrl(\"apps/iframe/\" + app._id));\n } else if (Steedos.isMobile() || Steedos.isCordova()) {\n Steedos.openAppWithToken(app_id);\n } else {\n FlowRouter.go(\"/apps/iframe/\" + app._id);\n }\n } else if (on_click) {\n evalFunString = \"(function(){\" + on_click + \"})()\";\n try {\n eval(evalFunString);\n } catch (error1) {\n e = error1;\n console.error(\"catch some error when eval the on_click script for app link:\");\n console.error(e.message + \"\\r\\n\" + e.stack);\n }\n } else {\n Steedos.openAppWithToken(app_id);\n }\n if (!app.is_new_window && !Steedos.isMobile() && !Steedos.isCordova() && !app.is_use_ie && !on_click) {\n return Session.set(\"current_app_id\", app_id);\n }\n };\n Steedos.checkSpaceBalance = function(spaceId) {\n var end_date, min_months, space;\n if (!spaceId) {\n spaceId = Steedos.spaceId();\n }\n min_months = 1;\n if (Steedos.isSpaceAdmin()) {\n min_months = 3;\n }\n space = db.spaces.findOne(spaceId);\n end_date = space != null ? space.end_date : void 0;\n if (space && Steedos.hasFeature('paid', space._id) && end_date !== void 0 && (end_date - new Date) <= (min_months * 30 * 24 * 3600 * 1000)) {\n return toastr.error(t(\"space_balance_insufficient\"));\n }\n };\n Steedos.setModalMaxHeight = function() {\n var accountZoomValue, offset;\n accountZoomValue = Steedos.getAccountZoomValue();\n if (!accountZoomValue.name) {\n accountZoomValue.name = 'large';\n }\n switch (accountZoomValue.name) {\n case 'normal':\n if (Steedos.isMobile()) {\n offset = -12;\n } else {\n offset = 75;\n }\n break;\n case 'large':\n if (Steedos.isMobile()) {\n offset = -6;\n } else {\n if (Steedos.detectIE()) {\n offset = 199;\n } else {\n offset = 9;\n }\n }\n break;\n case 'extra-large':\n if (Steedos.isMobile()) {\n offset = -26;\n } else {\n if (Steedos.detectIE()) {\n offset = 303;\n } else {\n offset = 53;\n }\n }\n }\n if ($(\".modal\").length) {\n return $(\".modal\").each(function() {\n var footerHeight, headerHeight, height, totalHeight;\n headerHeight = 0;\n footerHeight = 0;\n totalHeight = 0;\n $(\".modal-header\", $(this)).each(function() {\n return headerHeight += $(this).outerHeight(false);\n });\n $(\".modal-footer\", $(this)).each(function() {\n return footerHeight += $(this).outerHeight(false);\n });\n totalHeight = headerHeight + footerHeight;\n height = $(\"body\").innerHeight() - totalHeight - offset;\n if ($(this).hasClass(\"cf_contact_modal\")) {\n return $(\".modal-body\", $(this)).css({\n \"max-height\": height + \"px\",\n \"height\": height + \"px\"\n });\n } else {\n return $(\".modal-body\", $(this)).css({\n \"max-height\": height + \"px\",\n \"height\": \"auto\"\n });\n }\n });\n }\n };\n Steedos.getModalMaxHeight = function(offset) {\n var accountZoomValue, reValue;\n if (Steedos.isMobile()) {\n reValue = window.screen.height - 126 - 180 - 25;\n } else {\n reValue = $(window).height() - 180 - 25;\n }\n if (!(Steedos.isiOS() || Steedos.isMobile())) {\n accountZoomValue = Steedos.getAccountZoomValue();\n switch (accountZoomValue.name) {\n case 'large':\n reValue -= 50;\n break;\n case 'extra-large':\n reValue -= 145;\n }\n }\n if (offset) {\n reValue -= offset;\n }\n return reValue + \"px\";\n };\n Steedos.isiOS = function(userAgent, language) {\n var DEVICE, browser, conExp, device, numExp;\n DEVICE = {\n android: 'android',\n blackberry: 'blackberry',\n desktop: 'desktop',\n ipad: 'ipad',\n iphone: 'iphone',\n ipod: 'ipod',\n mobile: 'mobile'\n };\n browser = {};\n conExp = '(?:[\\\\/:\\\\::\\\\s:;])';\n numExp = '(\\\\S+[^\\\\s:;:\\\\)]|)';\n userAgent = (userAgent || navigator.userAgent).toLowerCase();\n language = language || navigator.language || navigator.browserLanguage;\n device = userAgent.match(new RegExp('(android|ipad|iphone|ipod|blackberry)')) || userAgent.match(new RegExp('(mobile)')) || ['', DEVICE.desktop];\n browser.device = device[1];\n return browser.device === DEVICE.ipad || browser.device === DEVICE.iphone || browser.device === DEVICE.ipod;\n };\n Steedos.getUserOrganizations = function(isIncludeParents) {\n var organizations, parents, spaceId, space_user, userId;\n userId = Meteor.userId();\n spaceId = Steedos.spaceId();\n space_user = db.space_users.findOne({\n user: userId,\n space: spaceId\n }, {\n fields: {\n organizations: 1\n }\n });\n organizations = space_user != null ? space_user.organizations : void 0;\n if (!organizations) {\n return [];\n }\n if (isIncludeParents) {\n parents = _.flatten(db.organizations.find({\n _id: {\n $in: organizations\n }\n }).fetch().getProperty(\"parents\"));\n return _.union(organizations, parents);\n } else {\n return organizations;\n }\n };\n Steedos.forbidNodeContextmenu = function(target, ifr) {\n if (!Steedos.isNode()) {\n return;\n }\n target.document.body.addEventListener('contextmenu', function(ev) {\n ev.preventDefault();\n return false;\n });\n if (ifr) {\n if (typeof ifr === 'string') {\n ifr = target.$(ifr);\n }\n return ifr.load(function() {\n var ifrBody;\n ifrBody = ifr.contents().find('body');\n if (ifrBody) {\n return ifrBody[0].addEventListener('contextmenu', function(ev) {\n ev.preventDefault();\n return false;\n });\n }\n });\n }\n };\n}\n\nif (Meteor.isServer) {\n Steedos.getUserOrganizations = function(spaceId, userId, isIncludeParents) {\n var organizations, parents, space_user;\n space_user = db.space_users.findOne({\n user: userId,\n space: spaceId\n }, {\n fields: {\n organizations: 1\n }\n });\n organizations = space_user != null ? space_user.organizations : void 0;\n if (!organizations) {\n return [];\n }\n if (isIncludeParents) {\n parents = _.flatten(db.organizations.find({\n _id: {\n $in: organizations\n }\n }).fetch().getProperty(\"parents\"));\n return _.union(organizations, parents);\n } else {\n return organizations;\n }\n };\n}\n\nif (Meteor.isServer) {\n Cookies = require(\"cookies\");\n Steedos.isMobile = function() {\n return false;\n };\n Steedos.isSpaceAdmin = function(spaceId, userId) {\n var space;\n if (!spaceId || !userId) {\n return false;\n }\n space = db.spaces.findOne(spaceId);\n if (!space || !space.admins) {\n return false;\n }\n return space.admins.indexOf(userId) >= 0;\n };\n Steedos.isLegalVersion = function(spaceId, app_version) {\n var check, modules, ref5;\n if (!spaceId) {\n return false;\n }\n check = false;\n modules = (ref5 = db.spaces.findOne(spaceId)) != null ? ref5.modules : void 0;\n if (modules && modules.includes(app_version)) {\n check = true;\n }\n return check;\n };\n Steedos.isOrgAdminByOrgIds = function(orgIds, userId) {\n var allowAccessOrgs, isOrgAdmin, parents, useOrgs;\n isOrgAdmin = false;\n useOrgs = db.organizations.find({\n _id: {\n $in: orgIds\n }\n }, {\n fields: {\n parents: 1,\n admins: 1\n }\n }).fetch();\n parents = [];\n allowAccessOrgs = useOrgs.filter(function(org) {\n var ref5;\n if (org.parents) {\n parents = _.union(parents, org.parents);\n }\n return (ref5 = org.admins) != null ? ref5.includes(userId) : void 0;\n });\n if (allowAccessOrgs.length) {\n isOrgAdmin = true;\n } else {\n parents = _.flatten(parents);\n parents = _.uniq(parents);\n if (parents.length && db.organizations.findOne({\n _id: {\n $in: parents\n },\n admins: userId\n })) {\n isOrgAdmin = true;\n }\n }\n return isOrgAdmin;\n };\n Steedos.isOrgAdminByAllOrgIds = function(orgIds, userId) {\n var i, isOrgAdmin;\n if (!orgIds.length) {\n return true;\n }\n i = 0;\n while (i < orgIds.length) {\n isOrgAdmin = Steedos.isOrgAdminByOrgIds([orgIds[i]], userId);\n if (!isOrgAdmin) {\n break;\n }\n i++;\n }\n return isOrgAdmin;\n };\n Steedos.absoluteUrl = function(url) {\n var e, root_url;\n if (url) {\n url = url.replace(/^\\//, \"\");\n }\n if (Meteor.isCordova) {\n return Meteor.absoluteUrl(url);\n } else {\n if (Meteor.isClient) {\n try {\n root_url = new URL(Meteor.absoluteUrl());\n if (url) {\n return root_url.pathname + url;\n } else {\n return root_url.pathname;\n }\n } catch (error1) {\n e = error1;\n return Meteor.absoluteUrl(url);\n }\n } else {\n return Meteor.absoluteUrl(url);\n }\n }\n };\n Steedos.getAPILoginUser = function(req, res) {\n var authToken, cookies, password, ref5, ref6, ref7, ref8, result, user, userId, username;\n username = (ref5 = req.query) != null ? ref5.username : void 0;\n password = (ref6 = req.query) != null ? ref6.password : void 0;\n if (username && password) {\n user = db.users.findOne({\n steedos_id: username\n });\n if (!user) {\n return false;\n }\n result = Accounts._checkPassword(user, password);\n if (result.error) {\n throw new Error(result.error);\n } else {\n return user;\n }\n }\n userId = (ref7 = req.query) != null ? ref7[\"X-User-Id\"] : void 0;\n authToken = (ref8 = req.query) != null ? ref8[\"X-Auth-Token\"] : void 0;\n if (Steedos.checkAuthToken(userId, authToken)) {\n return db.users.findOne({\n _id: userId\n });\n }\n cookies = new Cookies(req, res);\n if (req.headers) {\n userId = req.headers[\"x-user-id\"];\n authToken = req.headers[\"x-auth-token\"];\n }\n if (!userId || !authToken) {\n userId = cookies.get(\"X-User-Id\");\n authToken = cookies.get(\"X-Auth-Token\");\n }\n if (!userId || !authToken) {\n return false;\n }\n if (Steedos.checkAuthToken(userId, authToken)) {\n return db.users.findOne({\n _id: userId\n });\n }\n return false;\n };\n Steedos.checkAuthToken = function(userId, authToken) {\n var hashedToken, user;\n if (userId && authToken) {\n hashedToken = Accounts._hashLoginToken(authToken);\n user = Meteor.users.findOne({\n _id: userId,\n \"services.resume.loginTokens.hashedToken\": hashedToken\n });\n if (user) {\n return true;\n } else {\n return false;\n }\n }\n return false;\n };\n}\n\nif (Meteor.isServer) {\n crypto = require('crypto');\n Steedos.decrypt = function(password, key, iv) {\n var c, decipher, decipherMsg, e, i, key32, len, m;\n try {\n key32 = \"\";\n len = key.length;\n if (len < 32) {\n c = \"\";\n i = 0;\n m = 32 - len;\n while (i < m) {\n c = \" \" + c;\n i++;\n }\n key32 = key + c;\n } else if (len >= 32) {\n key32 = key.slice(0, 32);\n }\n decipher = crypto.createDecipheriv('aes-256-cbc', new Buffer(key32, 'utf8'), new Buffer(iv, 'utf8'));\n decipherMsg = Buffer.concat([decipher.update(password, 'base64'), decipher.final()]);\n password = decipherMsg.toString();\n return password;\n } catch (error1) {\n e = error1;\n return password;\n }\n };\n Steedos.encrypt = function(password, key, iv) {\n var c, cipher, cipheredMsg, i, key32, len, m;\n key32 = \"\";\n len = key.length;\n if (len < 32) {\n c = \"\";\n i = 0;\n m = 32 - len;\n while (i < m) {\n c = \" \" + c;\n i++;\n }\n key32 = key + c;\n } else if (len >= 32) {\n key32 = key.slice(0, 32);\n }\n cipher = crypto.createCipheriv('aes-256-cbc', new Buffer(key32, 'utf8'), new Buffer(iv, 'utf8'));\n cipheredMsg = Buffer.concat([cipher.update(new Buffer(password, 'utf8')), cipher.final()]);\n password = cipheredMsg.toString('base64');\n return password;\n };\n Steedos.getUserIdFromAccessToken = function(access_token) {\n var collection, hashedToken, obj, user, userId;\n if (!access_token) {\n return null;\n }\n userId = access_token.split(\"-\")[0];\n hashedToken = Accounts._hashLoginToken(access_token);\n user = db.users.findOne({\n _id: userId,\n \"secrets.hashedToken\": hashedToken\n });\n if (user) {\n return userId;\n } else {\n collection = oAuth2Server.collections.accessToken;\n obj = collection.findOne({\n 'accessToken': access_token\n });\n if (obj) {\n if ((obj != null ? obj.expires : void 0) < new Date()) {\n return \"oauth2 access token:\" + access_token + \" is expired.\";\n } else {\n return obj != null ? obj.userId : void 0;\n }\n } else {\n return \"oauth2 access token:\" + access_token + \" is not found.\";\n }\n }\n return null;\n };\n Steedos.getUserIdFromAuthToken = function(req, res) {\n var authToken, cookies, ref5, ref6, ref7, ref8, userId;\n userId = (ref5 = req.query) != null ? ref5[\"X-User-Id\"] : void 0;\n authToken = (ref6 = req.query) != null ? ref6[\"X-Auth-Token\"] : void 0;\n if (Steedos.checkAuthToken(userId, authToken)) {\n return (ref7 = db.users.findOne({\n _id: userId\n })) != null ? ref7._id : void 0;\n }\n cookies = new Cookies(req, res);\n if (req.headers) {\n userId = req.headers[\"x-user-id\"];\n authToken = req.headers[\"x-auth-token\"];\n }\n if (!userId || !authToken) {\n userId = cookies.get(\"X-User-Id\");\n authToken = cookies.get(\"X-Auth-Token\");\n }\n if (!userId || !authToken) {\n return null;\n }\n if (Steedos.checkAuthToken(userId, authToken)) {\n return (ref8 = db.users.findOne({\n _id: userId\n })) != null ? ref8._id : void 0;\n }\n };\n Steedos.APIAuthenticationCheck = function(req, res) {\n var e, user, userId;\n try {\n userId = req.userId;\n user = db.users.findOne({\n _id: userId\n });\n if (!userId || !user) {\n JsonRoutes.sendResult(res, {\n data: {\n \"error\": \"Validate Request -- Missing X-Auth-Token,X-User-Id Or access_token\"\n },\n code: 401\n });\n return false;\n } else {\n return true;\n }\n } catch (error1) {\n e = error1;\n if (!userId || !user) {\n JsonRoutes.sendResult(res, {\n code: 401,\n data: {\n \"error\": e.message,\n \"success\": false\n }\n });\n return false;\n }\n }\n };\n}\n\nmixin = function(obj) {\n return _.each(_.functions(obj), function(name) {\n var func;\n if (!_[name] && (_.prototype[name] == null)) {\n func = _[name] = obj[name];\n return _.prototype[name] = function() {\n var args;\n args = [this._wrapped];\n push.apply(args, arguments);\n return result.call(this, func.apply(_, args));\n };\n }\n });\n};\n\nif (Meteor.isServer) {\n Steedos.isHoliday = function(date) {\n var day;\n if (!date) {\n date = new Date;\n }\n check(date, Date);\n day = date.getDay();\n if (day === 6 || day === 0) {\n return true;\n }\n return false;\n };\n Steedos.caculateWorkingTime = function(date, days) {\n var caculateDate, param_date;\n check(date, Date);\n check(days, Number);\n param_date = new Date(date);\n caculateDate = function(i, days) {\n if (i < days) {\n param_date = new Date(param_date.getTime() + 24 * 60 * 60 * 1000);\n if (!Steedos.isHoliday(param_date)) {\n i++;\n }\n caculateDate(i, days);\n }\n };\n caculateDate(0, days);\n return param_date;\n };\n Steedos.caculatePlusHalfWorkingDay = function(date, next) {\n var caculated_date, end_date, first_date, i, j, len, max_index, ref5, second_date, start_date, time_points;\n check(date, Date);\n time_points = (ref5 = Meteor.settings.remind) != null ? ref5.time_points : void 0;\n if (!time_points || _.isEmpty(time_points)) {\n console.error(\"time_points is null\");\n time_points = [\n {\n \"hour\": 8,\n \"minute\": 30\n }, {\n \"hour\": 14,\n \"minute\": 30\n }\n ];\n }\n len = time_points.length;\n start_date = new Date(date);\n end_date = new Date(date);\n start_date.setHours(time_points[0].hour);\n start_date.setMinutes(time_points[0].minute);\n end_date.setHours(time_points[len - 1].hour);\n end_date.setMinutes(time_points[len - 1].minute);\n caculated_date = new Date(date);\n j = 0;\n max_index = len - 1;\n if (date < start_date) {\n if (next) {\n j = 0;\n } else {\n j = len / 2;\n }\n } else if (date >= start_date && date < end_date) {\n i = 0;\n while (i < max_index) {\n first_date = new Date(date);\n second_date = new Date(date);\n first_date.setHours(time_points[i].hour);\n first_date.setMinutes(time_points[i].minute);\n second_date.setHours(time_points[i + 1].hour);\n second_date.setMinutes(time_points[i + 1].minute);\n if (date >= first_date && date < second_date) {\n break;\n }\n i++;\n }\n if (next) {\n j = i + 1;\n } else {\n j = i + len / 2;\n }\n } else if (date >= end_date) {\n if (next) {\n j = max_index + 1;\n } else {\n j = max_index + len / 2;\n }\n }\n if (j > max_index) {\n caculated_date = Steedos.caculateWorkingTime(date, 1);\n caculated_date.setHours(time_points[j - max_index - 1].hour);\n caculated_date.setMinutes(time_points[j - max_index - 1].minute);\n } else if (j <= max_index) {\n caculated_date.setHours(time_points[j].hour);\n caculated_date.setMinutes(time_points[j].minute);\n }\n return caculated_date;\n };\n}\n\nif (Meteor.isServer) {\n _.extend(Steedos, {\n getSteedosToken: function(appId, userId, authToken) {\n var app, c, cipher, cipheredMsg, hashedToken, i, iv, key32, len, m, now, secret, steedos_id, steedos_token, user;\n crypto = require('crypto');\n app = db.apps.findOne(appId);\n if (app) {\n secret = app.secret;\n }\n if (userId && authToken) {\n hashedToken = Accounts._hashLoginToken(authToken);\n user = Meteor.users.findOne({\n _id: userId,\n \"services.resume.loginTokens.hashedToken\": hashedToken\n });\n if (user) {\n steedos_id = user.steedos_id;\n if (app.secret) {\n iv = app.secret;\n } else {\n iv = \"-8762-fcb369b2e8\";\n }\n now = parseInt(new Date().getTime() / 1000).toString();\n key32 = \"\";\n len = steedos_id.length;\n if (len < 32) {\n c = \"\";\n i = 0;\n m = 32 - len;\n while (i < m) {\n c = \" \" + c;\n i++;\n }\n key32 = steedos_id + c;\n } else if (len >= 32) {\n key32 = steedos_id.slice(0, 32);\n }\n cipher = crypto.createCipheriv('aes-256-cbc', new Buffer(key32, 'utf8'), new Buffer(iv, 'utf8'));\n cipheredMsg = Buffer.concat([cipher.update(new Buffer(now, 'utf8')), cipher.final()]);\n steedos_token = cipheredMsg.toString('base64');\n }\n }\n return steedos_token;\n },\n locale: function(userId, isI18n) {\n var locale, user;\n user = db.users.findOne({\n _id: userId\n }, {\n fields: {\n locale: 1\n }\n });\n locale = user != null ? user.locale : void 0;\n if (isI18n) {\n if (locale === \"en-us\") {\n locale = \"en\";\n }\n if (locale === \"zh-cn\") {\n locale = \"zh-CN\";\n }\n }\n return locale;\n },\n checkUsernameAvailability: function(username) {\n return !Meteor.users.findOne({\n username: {\n $regex: new RegExp(\"^\" + Meteor._escapeRegExp(username).trim() + \"$\", \"i\")\n }\n });\n },\n validatePassword: function(pwd) {\n var passworPolicy, passworPolicyError, reason, ref5, ref6, ref7, ref8, valid;\n reason = t(\"password_invalid\");\n valid = true;\n if (!pwd) {\n valid = false;\n }\n passworPolicy = (ref5 = Meteor.settings[\"public\"]) != null ? (ref6 = ref5.password) != null ? ref6.policy : void 0 : void 0;\n passworPolicyError = (ref7 = Meteor.settings[\"public\"]) != null ? (ref8 = ref7.password) != null ? ref8.policyError : void 0 : void 0;\n if (passworPolicy) {\n if (!(new RegExp(passworPolicy)).test(pwd || '')) {\n reason = passworPolicyError;\n valid = false;\n } else {\n valid = true;\n }\n }\n if (valid) {\n return true;\n } else {\n return {\n error: {\n reason: reason\n }\n };\n }\n }\n });\n}\n\nSteedos.convertSpecialCharacter = function(str) {\n return str.replace(/([\\^\\$\\(\\)\\*\\+\\?\\.\\\\\\|\\[\\]\\{\\}])/g, \"\\\\$1\");\n};\n\nSteedos.removeSpecialCharacter = function(str) {\n return str.replace(/([\\^\\$\\(\\)\\*\\+\\?\\.\\\\\\|\\[\\]\\{\\}\\~\\`\\@\\#\\%\\&\\=\\'\\\"\\:\\;\\<\\>\\,\\/])/g, \"\");\n};\n\nCreator.getDBApps = function(space_id) {\n var dbApps;\n dbApps = {};\n Creator.Collections[\"apps\"].find({\n space: space_id,\n is_creator: true,\n visible: true\n }, {\n fields: {\n created: 0,\n created_by: 0,\n modified: 0,\n modified_by: 0\n }\n }).forEach(function(app) {\n return dbApps[app._id] = app;\n });\n return dbApps;\n};\n\nCreator.getDBDashboards = function(space_id) {\n var dbDashboards;\n dbDashboards = {};\n Creator.Collections[\"dashboard\"].find({\n space: space_id\n }, {\n fields: {\n created: 0,\n created_by: 0,\n modified: 0,\n modified_by: 0\n }\n }).forEach(function(dashboard) {\n return dbDashboards[dashboard._id] = dashboard;\n });\n return dbDashboards;\n};\n\nif (Meteor.isServer) {\n Cookies = require(\"cookies\");\n Steedos.getAuthToken = function(req, res) {\n var authToken, cookies;\n cookies = new Cookies(req, res);\n authToken = req.headers['x-auth-token'] || cookies.get(\"X-Auth-Token\");\n if (!authToken && req.headers.authorization && req.headers.authorization.split(' ')[0] === 'Bearer') {\n authToken = req.headers.authorization.split(' ')[1];\n }\n return authToken;\n };\n}\n\nif (Meteor.isClient) {\n Meteor.autorun(function() {\n if (Session.get('current_app_id')) {\n return sessionStorage.setItem('current_app_id', Session.get('current_app_id'));\n }\n });\n Steedos.getCurrentAppId = function() {\n if (Session.get('app_id')) {\n return Session.get('app_id');\n } else {\n return sessionStorage.getItem('current_app_id');\n }\n };\n}\n\nif (Meteor.isServer) {\n Steedos.formatIndex = function(array) {\n var indexName, isdocumentDB, object, ref5, ref6, ref7;\n object = {\n background: true\n };\n isdocumentDB = ((ref5 = Meteor.settings) != null ? (ref6 = ref5.datasources) != null ? (ref7 = ref6[\"default\"]) != null ? ref7.documentDB : void 0 : void 0 : void 0) || false;\n if (isdocumentDB) {\n if (array.length > 0) {\n indexName = array.join(\".\");\n object.name = indexName;\n if (indexName.length > 52) {\n object.name = indexName.substring(0, 52);\n }\n }\n }\n return object;\n };\n}\n","Meteor.startup(function () {\n\tSimpleSchema.extendOptions({foreign_key: Match.Optional(Boolean), references: Match.Optional(Object)});\n})","if Meteor.isServer\n Meteor.methods\n updateUserLastLogon: () ->\n if not @userId?\n return\n\n db.users.update({_id: @userId}, {$set: {last_logon: new Date()}}) \n\n\nif Meteor.isClient\n Accounts.onLogin ()->\n Meteor.call 'updateUserLastLogon'","if (Meteor.isServer) {\n Meteor.methods({\n updateUserLastLogon: function() {\n if (this.userId == null) {\n return;\n }\n return db.users.update({\n _id: this.userId\n }, {\n $set: {\n last_logon: new Date()\n }\n });\n }\n });\n}\n\nif (Meteor.isClient) {\n Accounts.onLogin(function() {\n return Meteor.call('updateUserLastLogon');\n });\n}\n","if Meteor.isServer\n Meteor.methods\n users_add_email: (email) ->\n if not @userId?\n return {error: true, message: \"email_login_required\"}\n if not email\n return {error: true, message: \"email_required\"}\n if not /^([A-Z0-9\\.\\-\\_\\+])*([A-Z0-9\\+\\-\\_])+\\@[A-Z0-9]+([\\-][A-Z0-9]+)*([\\.][A-Z0-9\\-]+){1,8}$/i.test(email)\n return {error: true, message: \"email_format_error\"}\n if db.users.find({\"emails.address\": email}).count()>0\n return {error: true, message: \"email_exists\"}\n\n user = db.users.findOne(_id: this.userId)\n if user.emails? and user.emails.length > 0 \n db.users.direct.update {_id: this.userId}, \n $push: \n emails: \n address: email\n verified: false\n else\n db.users.direct.update {_id: this.userId}, \n $set: \n steedos_id: email\n emails: [\n address: email\n verified: false\n ]\n\n Accounts.sendVerificationEmail(this.userId, email);\n\n return {}\n\n users_remove_email: (email) ->\n if not @userId?\n return {error: true, message: \"email_login_required\"}\n if not email\n return {error: true, message: \"email_required\"}\n\n user = db.users.findOne(_id: this.userId)\n if user.emails? and user.emails.length >= 2\n p = null\n user.emails.forEach (e)->\n if e.address == email\n p = e\n return\n \n db.users.direct.update {_id: this.userId}, \n $pull: \n emails: \n p\n else\n return {error: true, message: \"email_at_least_one\"}\n\n return {}\n\n users_verify_email: (email) ->\n if not @userId?\n return {error: true, message: \"email_login_required\"}\n if not email\n return {error: true, message: \"email_required\"}\n if not /^([A-Z0-9\\.\\-\\_\\+])*([A-Z0-9\\+\\-\\_])+\\@[A-Z0-9]+([\\-][A-Z0-9]+)*([\\.][A-Z0-9\\-]+){1,8}$/i.test(email)\n return {error: true, message: \"email_format_error\"}\n \n\n Accounts.sendVerificationEmail(this.userId, email);\n\n return {}\n\n users_set_primary_email: (email) ->\n if not @userId?\n return {error: true, message: \"email_login_required\"}\n if not email\n return {error: true, message: \"email_required\"}\n\n user = db.users.findOne(_id: this.userId)\n emails = user.emails\n emails.forEach (e)->\n if e.address == email\n e.primary = true\n else\n e.primary = false\n\n db.users.direct.update {_id: this.userId},\n $set:\n emails: emails\n email: email\n\n db.space_users.direct.update({user: this.userId},{$set: {email: email}}, {multi: true})\n return {}\n\n\n\nif Meteor.isClient\n Steedos.users_add_email = ()->\n swal\n title: t(\"primary_email_needed\"),\n text: t(\"primary_email_needed_description\"),\n type: 'input',\n showCancelButton: false,\n closeOnConfirm: false,\n animation: \"slide-from-top\"\n , (inputValue) ->\n Meteor.call \"users_add_email\", inputValue, (error, result)->\n if result?.error\n toastr.error result.message\n else\n swal t(\"primary_email_updated\"), \"\", \"success\"\n###\n Tracker.autorun (c) ->\n\n if Meteor.user()\n if Meteor.loggingIn()\n # 正在登录中,则不做处理,因为此时Meteor.userId()不足于证明已登录状态\n return\n primaryEmail = Meteor.user().emails?[0]?.address\n if !primaryEmail\n Steedos.users_add_email();\n###","if (Meteor.isServer) {\n Meteor.methods({\n users_add_email: function(email) {\n var user;\n if (this.userId == null) {\n return {\n error: true,\n message: \"email_login_required\"\n };\n }\n if (!email) {\n return {\n error: true,\n message: \"email_required\"\n };\n }\n if (!/^([A-Z0-9\\.\\-\\_\\+])*([A-Z0-9\\+\\-\\_])+\\@[A-Z0-9]+([\\-][A-Z0-9]+)*([\\.][A-Z0-9\\-]+){1,8}$/i.test(email)) {\n return {\n error: true,\n message: \"email_format_error\"\n };\n }\n if (db.users.find({\n \"emails.address\": email\n }).count() > 0) {\n return {\n error: true,\n message: \"email_exists\"\n };\n }\n user = db.users.findOne({\n _id: this.userId\n });\n if ((user.emails != null) && user.emails.length > 0) {\n db.users.direct.update({\n _id: this.userId\n }, {\n $push: {\n emails: {\n address: email,\n verified: false\n }\n }\n });\n } else {\n db.users.direct.update({\n _id: this.userId\n }, {\n $set: {\n steedos_id: email,\n emails: [\n {\n address: email,\n verified: false\n }\n ]\n }\n });\n }\n Accounts.sendVerificationEmail(this.userId, email);\n return {};\n },\n users_remove_email: function(email) {\n var p, user;\n if (this.userId == null) {\n return {\n error: true,\n message: \"email_login_required\"\n };\n }\n if (!email) {\n return {\n error: true,\n message: \"email_required\"\n };\n }\n user = db.users.findOne({\n _id: this.userId\n });\n if ((user.emails != null) && user.emails.length >= 2) {\n p = null;\n user.emails.forEach(function(e) {\n if (e.address === email) {\n p = e;\n }\n });\n db.users.direct.update({\n _id: this.userId\n }, {\n $pull: {\n emails: p\n }\n });\n } else {\n return {\n error: true,\n message: \"email_at_least_one\"\n };\n }\n return {};\n },\n users_verify_email: function(email) {\n if (this.userId == null) {\n return {\n error: true,\n message: \"email_login_required\"\n };\n }\n if (!email) {\n return {\n error: true,\n message: \"email_required\"\n };\n }\n if (!/^([A-Z0-9\\.\\-\\_\\+])*([A-Z0-9\\+\\-\\_])+\\@[A-Z0-9]+([\\-][A-Z0-9]+)*([\\.][A-Z0-9\\-]+){1,8}$/i.test(email)) {\n return {\n error: true,\n message: \"email_format_error\"\n };\n }\n Accounts.sendVerificationEmail(this.userId, email);\n return {};\n },\n users_set_primary_email: function(email) {\n var emails, user;\n if (this.userId == null) {\n return {\n error: true,\n message: \"email_login_required\"\n };\n }\n if (!email) {\n return {\n error: true,\n message: \"email_required\"\n };\n }\n user = db.users.findOne({\n _id: this.userId\n });\n emails = user.emails;\n emails.forEach(function(e) {\n if (e.address === email) {\n return e.primary = true;\n } else {\n return e.primary = false;\n }\n });\n db.users.direct.update({\n _id: this.userId\n }, {\n $set: {\n emails: emails,\n email: email\n }\n });\n db.space_users.direct.update({\n user: this.userId\n }, {\n $set: {\n email: email\n }\n }, {\n multi: true\n });\n return {};\n }\n });\n}\n\nif (Meteor.isClient) {\n Steedos.users_add_email = function() {\n return swal({\n title: t(\"primary_email_needed\"),\n text: t(\"primary_email_needed_description\"),\n type: 'input',\n showCancelButton: false,\n closeOnConfirm: false,\n animation: \"slide-from-top\"\n }, function(inputValue) {\n return Meteor.call(\"users_add_email\", inputValue, function(error, result) {\n if (result != null ? result.error : void 0) {\n return toastr.error(result.message);\n } else {\n return swal(t(\"primary_email_updated\"), \"\", \"success\");\n }\n });\n });\n };\n}\n\n\n/*\n Tracker.autorun (c) ->\n\n if Meteor.user()\n if Meteor.loggingIn()\n * 正在登录中,则不做处理,因为此时Meteor.userId()不足于证明已登录状态\n return\n primaryEmail = Meteor.user().emails?[0]?.address\n if !primaryEmail\n Steedos.users_add_email();\n */\n","if Meteor.isServer\n Meteor.methods\n updateUserAvatar: (avatar) ->\n if not @userId?\n return\n\n db.users.update({_id: @userId}, {$set: {avatar: avatar}}) ","if (Meteor.isServer) {\n Meteor.methods({\n updateUserAvatar: function(avatar) {\n if (this.userId == null) {\n return;\n }\n return db.users.update({\n _id: this.userId\n }, {\n $set: {\n avatar: avatar\n }\n });\n }\n });\n}\n","Accounts.emailTemplates = {\n\tfrom: (function(){\n\t\tvar defaultFrom = \"Steedos \";\n\t\tif(!Meteor.settings)\n\t\t\treturn defaultFrom;\n\t\t\n\t\tif(!Meteor.settings.email)\n\t\t\treturn defaultFrom;\n\n\t\tif(!Meteor.settings.email.from)\n\t\t\treturn defaultFrom;\n\t\t\n\t\treturn Meteor.settings.email.from;\n\t})(),\n\tresetPassword: {\n\t\tsubject: function (user) {\n\t\t\treturn TAPi18n.__(\"users_email_reset_password\",{},user.locale);\n\t\t},\n\t\ttext: function (user, url) {\n\t\t\tvar splits = url.split(\"/\");\n\t\t\tvar tokenCode = splits[splits.length-1];\n\t\t\tvar greeting = user.profile && user.profile.name ? TAPi18n.__(\"users_email_hello\",{},user.locale) + user.profile.name + \",\" : TAPi18n.__(\"users_email_hello\",{},user.locale) + \",\";\n\t\t\treturn greeting + \"\\n\\n\" + TAPi18n.__(\"users_email_reset_password_body\",{token_code:tokenCode},user.locale) + \"\\n\\n\" + url + \"\\n\\n\" + TAPi18n.__(\"users_email_thanks\",{},user.locale) + \"\\n\";\n\t\t}\n\t},\n\tverifyEmail: {\n\t\tsubject: function (user) {\n\t\t\treturn TAPi18n.__(\"users_email_verify_email\",{},user.locale);\n\t\t},\n\t\ttext: function (user, url) {\n\t\t\tvar greeting = user.profile && user.profile.name ? TAPi18n.__(\"users_email_hello\",{},user.locale) + user.profile.name + \",\" : TAPi18n.__(\"users_email_hello\",{},user.locale) + \",\";\n\t\t\treturn greeting + \"\\n\\n\" + TAPi18n.__(\"users_email_verify_account\",{},user.locale) + \"\\n\\n\" + url + \"\\n\\n\" + TAPi18n.__(\"users_email_thanks\",{},user.locale) + \"\\n\";\n\t\t}\n\t},\n\tenrollAccount: {\n\t\tsubject: function (user) {\n\t\t\treturn TAPi18n.__(\"users_email_create_account\",{},user.locale);\n\t\t},\n\t\ttext: function (user, url) {\n\t\t\tvar greeting = user.profile && user.profile.name ? TAPi18n.__(\"users_email_hello\",{},user.locale) + user.profile.name + \",\" : TAPi18n.__(\"users_email_hello\",{},user.locale) + \",\";\n\t\t\treturn greeting + \"\\n\\n\" + TAPi18n.__(\"users_email_start_service\",{},user.locale) + \"\\n\\n\" + url + \"\\n\\n\" + TAPi18n.__(\"users_email_thanks\",{},user.locale) + \"\\n\";\n\t\t}\n\t}\n};","// 修改fullname值有问题的organizations\nJsonRoutes.add(\"get\", \"/api/organizations/upgrade/\", function (req, res, next) {\n \n\tvar orgs = db.organizations.find({fullname:/新部门/,name:{$ne:\"新部门\"}});\n\tif (orgs.count()>0)\n\t{\n\t\torgs.forEach (function (org)\n\t\t{\n\t\t\t// 自己和子部门的fullname修改\n\t\t\tdb.organizations.direct.update(org._id, {$set: {fullname: org.calculateFullname()}});\n\t\t\t\n\t\t});\n\t}\t\n\n \tJsonRoutes.sendResult(res, {\n \tdata: {\n\t \tret: 0,\n\t \tmsg: \"Successfully\"\n \t}\n \t});\n});\n\n","if Meteor.isCordova\n Meteor.startup ->\n Push.Configure\n android:\n senderID: window.ANDROID_SENDER_ID\n sound: true\n vibrate: true\n ios:\n badge: true\n clearBadge: true\n sound: true\n alert: true\n appName: \"workflow\"\n","if (Meteor.isCordova) {\n Meteor.startup(function() {\n return Push.Configure({\n android: {\n senderID: window.ANDROID_SENDER_ID,\n sound: true,\n vibrate: true\n },\n ios: {\n badge: true,\n clearBadge: true,\n sound: true,\n alert: true\n },\n appName: \"workflow\"\n });\n });\n}\n","Selector = {}\n\n# Filter data on server by space field\nSelector.selectorCheckSpaceAdmin = (userId) ->\n\tif Meteor.isClient\n\t\tuserId = Meteor.userId()\n\t\tunless userId\n\t\t\treturn {_id: -1}\n\t\tif Steedos.isSpaceAdmin()\n\t\t\treturn {space: Session.get(\"spaceId\")}\n\t\telse\n\t\t\treturn {_id: -1}\n\n\tif Meteor.isServer\n\t\tunless userId\n\t\t\treturn {_id: -1}\n\t\tuser = db.users.findOne(userId, {fields: {is_cloudadmin: 1}})\n\t\tif !user\n\t\t\treturn {_id: -1}\n\t\tselector = {}\n\t\tif !user.is_cloudadmin\n\t\t\tspaces = db.spaces.find({admins:{$in:[userId]}}, {fields: {_id: 1}}).fetch()\n\t\t\tspaces = spaces.map (n) -> return n._id\n\t\t\tselector.space = {$in: spaces}\n\t\treturn selector\n\n# Filter data on server by space field\nSelector.selectorCheckSpace = (userId) ->\n\tif Meteor.isClient\n\t\tuserId = Meteor.userId()\n\t\tunless userId\n\t\t\treturn {_id: -1}\n\t\tspaceId = Session.get(\"spaceId\");\n\t\tif spaceId\n\t\t\tif db.space_users.findOne({user: userId,space: spaceId}, {fields: {_id: 1}})\n\t\t\t\treturn {space: spaceId}\n\t\t\telse\n\t\t\t\treturn {_id: -1}\n\t\telse\n\t\t\treturn {_id: -1}\n\n\tif Meteor.isServer\n\t\tunless userId\n\t\t\treturn {_id: -1}\n\t\tuser = db.users.findOne(userId, {fields: {_id: 1}})\n\t\tif !user\n\t\t\treturn {_id: -1}\n\t\tselector = {}\n\t\tspace_users = db.space_users.find({user: userId}, {fields: {space: 1}}).fetch()\n\t\tspaces = []\n\t\t_.each space_users, (u)->\n\t\t\tspaces.push(u.space)\n\t\tselector.space = {$in: spaces}\n\t\treturn selector\n\ndb.billing_pay_records.adminConfig =\n\ticon: \"globe\"\n\tcolor: \"blue\"\n\ttableColumns: [\n\t\t{name: \"order_created()\"},\n\t\t{name: \"modules\"},\n\t\t{name: \"user_count\"},\n\t\t{name: \"end_date\"},\n\t\t{name: \"order_total_fee()\"},\n\t\t{name: \"order_paid()\"}\n\t]\n\textraFields: [\"space\", \"created\", \"paid\", \"total_fee\"]\n\trouterAdmin: \"/admin\"\n\tselector: (userId) ->\n\t\tif Meteor.isClient\n\t\t\tif Steedos.isSpaceAdmin()\n\t\t\t\treturn {space: Session.get(\"spaceId\"), paid: true}\n\t\t\telse\n\t\t\t\treturn {_id: -1}\n\n\t\tif Meteor.isServer\n\t\t\treturn {}\n\tshowEditColumn: false\n\tshowDelColumn: false\n\tdisableAdd: true\n\tpageLength: 100\n\torder: [[0, \"desc\"]]\n\nMeteor.startup ->\n\t@space_user_signs = db.space_user_signs\n\t@billing_pay_records = db.billing_pay_records\n\tAdminConfig?.collections_add\n\t\tspace_user_signs: db.space_user_signs.adminConfig\n\t\tbilling_pay_records: db.billing_pay_records.adminConfig"," \n\nSelector = {};\n\nSelector.selectorCheckSpaceAdmin = function(userId) {\n var selector, spaces, user;\n if (Meteor.isClient) {\n userId = Meteor.userId();\n if (!userId) {\n return {\n _id: -1\n };\n }\n if (Steedos.isSpaceAdmin()) {\n return {\n space: Session.get(\"spaceId\")\n };\n } else {\n return {\n _id: -1\n };\n }\n }\n if (Meteor.isServer) {\n if (!userId) {\n return {\n _id: -1\n };\n }\n user = db.users.findOne(userId, {\n fields: {\n is_cloudadmin: 1\n }\n });\n if (!user) {\n return {\n _id: -1\n };\n }\n selector = {};\n if (!user.is_cloudadmin) {\n spaces = db.spaces.find({\n admins: {\n $in: [userId]\n }\n }, {\n fields: {\n _id: 1\n }\n }).fetch();\n spaces = spaces.map(function(n) {\n return n._id;\n });\n selector.space = {\n $in: spaces\n };\n }\n return selector;\n }\n};\n\nSelector.selectorCheckSpace = function(userId) {\n var selector, spaceId, space_users, spaces, user;\n if (Meteor.isClient) {\n userId = Meteor.userId();\n if (!userId) {\n return {\n _id: -1\n };\n }\n spaceId = Session.get(\"spaceId\");\n if (spaceId) {\n if (db.space_users.findOne({\n user: userId,\n space: spaceId\n }, {\n fields: {\n _id: 1\n }\n })) {\n return {\n space: spaceId\n };\n } else {\n return {\n _id: -1\n };\n }\n } else {\n return {\n _id: -1\n };\n }\n }\n if (Meteor.isServer) {\n if (!userId) {\n return {\n _id: -1\n };\n }\n user = db.users.findOne(userId, {\n fields: {\n _id: 1\n }\n });\n if (!user) {\n return {\n _id: -1\n };\n }\n selector = {};\n space_users = db.space_users.find({\n user: userId\n }, {\n fields: {\n space: 1\n }\n }).fetch();\n spaces = [];\n _.each(space_users, function(u) {\n return spaces.push(u.space);\n });\n selector.space = {\n $in: spaces\n };\n return selector;\n }\n};\n\ndb.billing_pay_records.adminConfig = {\n icon: \"globe\",\n color: \"blue\",\n tableColumns: [\n {\n name: \"order_created()\"\n }, {\n name: \"modules\"\n }, {\n name: \"user_count\"\n }, {\n name: \"end_date\"\n }, {\n name: \"order_total_fee()\"\n }, {\n name: \"order_paid()\"\n }\n ],\n extraFields: [\"space\", \"created\", \"paid\", \"total_fee\"],\n routerAdmin: \"/admin\",\n selector: function(userId) {\n if (Meteor.isClient) {\n if (Steedos.isSpaceAdmin()) {\n return {\n space: Session.get(\"spaceId\"),\n paid: true\n };\n } else {\n return {\n _id: -1\n };\n }\n }\n if (Meteor.isServer) {\n return {};\n }\n },\n showEditColumn: false,\n showDelColumn: false,\n disableAdd: true,\n pageLength: 100,\n order: [[0, \"desc\"]]\n};\n\nMeteor.startup(function() {\n this.space_user_signs = db.space_user_signs;\n this.billing_pay_records = db.billing_pay_records;\n return typeof AdminConfig !== \"undefined\" && AdminConfig !== null ? AdminConfig.collections_add({\n space_user_signs: db.space_user_signs.adminConfig,\n billing_pay_records: db.billing_pay_records.adminConfig\n }) : void 0;\n});\n","if (![].includes) {\n Array.prototype.includes = function(searchElement /*, fromIndex*/ ) {\n 'use strict';\n var O = Object(this);\n var len = parseInt(O.length) || 0;\n if (len === 0) {\n return false;\n }\n var n = parseInt(arguments[1]) || 0;\n var k;\n if (n >= 0) {\n k = n;\n } else {\n k = len + n;\n if (k < 0) {k = 0;}\n }\n var currentElement;\n while (k < len) {\n currentElement = O[k];\n if (searchElement === currentElement ||\n (searchElement !== searchElement && currentElement !== currentElement)) {\n return true;\n }\n k++;\n }\n return false;\n };\n}","Meteor.startup ->\n Steedos.settings.webservices = Meteor.settings.public.webservices\n\n if !Steedos.settings.webservices\n Steedos.settings.webservices =\n www: \n status: \"active\",\n url: \"/\"","Meteor.startup(function() {\n Steedos.settings.webservices = Meteor.settings[\"public\"].webservices;\n if (!Steedos.settings.webservices) {\n return Steedos.settings.webservices = {\n www: {\n status: \"active\",\n url: \"/\"\n }\n };\n }\n});\n","Creator.getUserObjectsListViews = (userId, spaceId, objects)->\n\tlistViews = {}\n\n\tkeys = _.keys(objects)\n\n\tobjectsViews = Creator.getCollection(\"object_listviews\").find({\n\t\tobject_name: {$in: keys},\n\t\tspace: spaceId,\n\t\t\"$or\": [{owner: userId}, {shared: true}]\n\t}, {\n\t\tfields: {\n\t\t\tcreated: 0,\n\t\t\tmodified: 0,\n\t\t\tcreated_by: 0,\n\t\t\tmodified_by: 0\n\t\t}\n\t}).fetch()\n\n\t_getUserObjectListViews = (object_name)->\n\t\t_user_object_list_views = {}\n\t\tolistViews = _.filter objectsViews, (ov)->\n\t\t\treturn ov.object_name == object_name\n\n\t\t_.each olistViews, (listview)->\n\t\t\t_user_object_list_views[listview._id] = listview\n\n\t\treturn _user_object_list_views\n\n\t_.forEach objects, (o, key)->\n\t\tlist_view = _getUserObjectListViews(key)\n\t\tif !_.isEmpty(list_view)\n\t\t\tlistViews[key] = list_view\n\treturn listViews\n\n\nCreator.getUserObjectListViews = (userId, spaceId, object_name)->\n\t_user_object_list_views = {}\n\n\tobject_listview = Creator.getCollection(\"object_listviews\").find({\n\t\tobject_name: object_name,\n\t\tspace: spaceId,\n\t\t\"$or\": [{owner: userId}, {shared: true}]\n\t}, {\n\t\tfields: {\n\t\t\tcreated: 0,\n\t\t\tmodified: 0,\n\t\t\tcreated_by: 0,\n\t\t\tmodified_by: 0\n\t\t}\n\t})\n\n\tobject_listview.forEach (listview)->\n\t\t_user_object_list_views[listview._id] = listview\n\n\treturn _user_object_list_views\n\n\n\n\n","Creator.getUserObjectsListViews = function(userId, spaceId, objects) {\n var _getUserObjectListViews, keys, listViews, objectsViews;\n listViews = {};\n keys = _.keys(objects);\n objectsViews = Creator.getCollection(\"object_listviews\").find({\n object_name: {\n $in: keys\n },\n space: spaceId,\n \"$or\": [\n {\n owner: userId\n }, {\n shared: true\n }\n ]\n }, {\n fields: {\n created: 0,\n modified: 0,\n created_by: 0,\n modified_by: 0\n }\n }).fetch();\n _getUserObjectListViews = function(object_name) {\n var _user_object_list_views, olistViews;\n _user_object_list_views = {};\n olistViews = _.filter(objectsViews, function(ov) {\n return ov.object_name === object_name;\n });\n _.each(olistViews, function(listview) {\n return _user_object_list_views[listview._id] = listview;\n });\n return _user_object_list_views;\n };\n _.forEach(objects, function(o, key) {\n var list_view;\n list_view = _getUserObjectListViews(key);\n if (!_.isEmpty(list_view)) {\n return listViews[key] = list_view;\n }\n });\n return listViews;\n};\n\nCreator.getUserObjectListViews = function(userId, spaceId, object_name) {\n var _user_object_list_views, object_listview;\n _user_object_list_views = {};\n object_listview = Creator.getCollection(\"object_listviews\").find({\n object_name: object_name,\n space: spaceId,\n \"$or\": [\n {\n owner: userId\n }, {\n shared: true\n }\n ]\n }, {\n fields: {\n created: 0,\n modified: 0,\n created_by: 0,\n modified_by: 0\n }\n });\n object_listview.forEach(function(listview) {\n return _user_object_list_views[listview._id] = listview;\n });\n return _user_object_list_views;\n};\n","// ServerSession = (function () {\n// 'use strict';\n\n// var Collection = new Mongo.Collection('server_sessions');\n\n// var checkForKey = function (key) {\n// if (typeof key === 'undefined') {\n// throw new Error('Please provide a key!');\n// }\n// };\n// var getSessionValue = function (obj, key) {\n// return obj && obj.values && obj.values[key];\n// };\n// var condition = function () {\n// return true;\n// };\n\n// Collection.deny({\n// 'insert': function () {\n// return true;\n// },\n// 'update' : function () {\n// return true;\n// },\n// 'remove': function () {\n// return true;\n// }\n// });\n\n// // public client and server api\n// var api = {\n// 'get': function (key) {\n// console.log(Collection.findOne());\n// var sessionObj = Collection.findOne();\n// if(Meteor.isServer){\n// Meteor.call('server-session/get');\n// }\n// // var sessionObj = Meteor.isServer ? \n// // Meteor.call('server-session/get') : Collection.findOne();\n// return getSessionValue(sessionObj, key);\n// },\n// 'equals': function (key, expected, identical) {\n// var sessionObj = Meteor.isServer ? \n// Meteor.call('server-session/get') : Collection.findOne();\n\n// var value = getSessionValue(sessionObj, key);\n\n// if (_.isObject(value) && _.isObject(expected)) {\n// return _(value).isEqual(expected);\n// }\n\n// if (identical == false) {\n// return expected == value;\n// }\n\n// return expected === value;\n// }\n// };\n\n// Meteor.startup(function(){\n// if (Meteor.isClient) {\n// Tracker.autorun(function(){\n// if(Meteor.userId()){\n// Meteor.subscribe('server-session');\n// }\n// })\n// }\n// })\n\n// if (Meteor.isServer) {\n// // Meteor.startup(function () {\n// // if (Collection.findOne()) {\n// // Collection.remove({}); // clear out all stale sessions\n// // }\n// // });\n\n// Meteor.onConnection(function (connection) {\n// var clientID = connection.id;\n\n// if (!Collection.findOne({ 'clientID': clientID })) {\n// Collection.insert({ 'clientID': clientID, 'values': {}, \"created\": new Date() });\n// }\n\n// connection.onClose(function () {\n// Collection.remove({ 'clientID': clientID });\n// });\n// });\n\n// Meteor.publish('server-session', function () {\n// return Collection.find({ 'clientID': this.connection.id });\n// });\n\n// Meteor.methods({\n// 'server-session/get': function () {\n// return Collection.findOne({ 'clientID': this.connection.id });\n// },\n// 'server-session/set': function (key, value) {\n// if (!this.randomSeed) return;\n\n// checkForKey(key);\n\n// if (!condition(key, value))\n// throw new Meteor.Error('Failed condition validation.');\n\n// var updateObj = {};\n// updateObj['values.' + key] = value;\n\n// Collection.update({ 'clientID': this.connection.id }, { $set: updateObj });\n// }\n// }); \n\n// // server-only api\n// _.extend(api, {\n// 'set': function (key, value) {\n// Meteor.call('server-session/set', key, value); \n// },\n// 'setCondition': function (newCondition) {\n// condition = newCondition;\n// }\n// });\n// }\n\n// return api;\n// })();","JsonRoutes.add 'get', '/api/get/apps', (req, res, next) ->\n\ttry\n\t\tuser_id = req.headers['x-user-id'] || req.query?.userId\n\n\t\tspace_id = req.headers['x-space-id'] || req.query?.spaceId\n\n\t\tuser = Steedos.getAPILoginUser(req, res)\n\t\t\n\t\tif !user\n\t\t\tJsonRoutes.sendResult res,\n\t\t\t\tcode: 401,\n\t\t\t\tdata:\n\t\t\t\t\t\"error\": \"Validate Request -- Missing X-Auth-Token,X-User-Id\",\n\t\t\t\t\t\"success\": false\n\t\t\treturn;\n\n\t\tuser_id = user._id\n\n\t\t# 校验space是否存在\n\t\tuuflowManager.getSpace(space_id)\n\n\t\tlocale = db.users.findOne({_id:user_id}).locale\n\t\tif locale == \"en-us\"\n\t\t\tlocale = \"en\"\n\t\tif locale == \"zh-cn\"\n\t\t\tlocale = \"zh-CN\"\n\n\t\tspaces = db.space_users.find({user: user_id}).fetch().getProperty(\"space\")\n\t\tapps = db.apps.find({$or: [{space: {$exists: false}}, {space: {$in:spaces}}]},{sort:{sort:1}}).fetch()\n\n\t\tapps.forEach (app) ->\n\t\t\tapp.name = TAPi18n.__(app.name,{},locale)\n\n\t\tJsonRoutes.sendResult res,\n\t\t\tcode: 200\n\t\t\tdata: { status: \"success\", data: apps}\n\tcatch e\n\t\tconsole.error e.stack\n\t\tJsonRoutes.sendResult res,\n\t\t\tcode: 200\n\t\t\tdata: { errors: [{errorMessage: e.message}]}\n\t\n\t\t","JsonRoutes.add('get', '/api/get/apps', function(req, res, next) {\n var apps, e, locale, ref, ref1, space_id, spaces, user, user_id;\n try {\n user_id = req.headers['x-user-id'] || ((ref = req.query) != null ? ref.userId : void 0);\n space_id = req.headers['x-space-id'] || ((ref1 = req.query) != null ? ref1.spaceId : void 0);\n user = Steedos.getAPILoginUser(req, res);\n if (!user) {\n JsonRoutes.sendResult(res, {\n code: 401,\n data: {\n \"error\": \"Validate Request -- Missing X-Auth-Token,X-User-Id\",\n \"success\": false\n }\n });\n return;\n }\n user_id = user._id;\n uuflowManager.getSpace(space_id);\n locale = db.users.findOne({\n _id: user_id\n }).locale;\n if (locale === \"en-us\") {\n locale = \"en\";\n }\n if (locale === \"zh-cn\") {\n locale = \"zh-CN\";\n }\n spaces = db.space_users.find({\n user: user_id\n }).fetch().getProperty(\"space\");\n apps = db.apps.find({\n $or: [\n {\n space: {\n $exists: false\n }\n }, {\n space: {\n $in: spaces\n }\n }\n ]\n }, {\n sort: {\n sort: 1\n }\n }).fetch();\n apps.forEach(function(app) {\n return app.name = TAPi18n.__(app.name, {}, locale);\n });\n return JsonRoutes.sendResult(res, {\n code: 200,\n data: {\n status: \"success\",\n data: apps\n }\n });\n } catch (error) {\n e = error;\n console.error(e.stack);\n return JsonRoutes.sendResult(res, {\n code: 200,\n data: {\n errors: [\n {\n errorMessage: e.message\n }\n ]\n }\n });\n }\n});\n","Cookies = require(\"cookies\")\nsteedosAuth = require(\"@steedos/auth\")\n\nJsonRoutes.add \"post\", \"/api/collection/find\", (req, res, next) ->\n try\n cookies = new Cookies( req, res )\n authToken = req.body[\"X-Auth-Token\"] || cookies.get(\"X-Auth-Token\")\n\n if !authToken\n JsonRoutes.sendResult res,\n code: 401,\n data:\n \"error\": \"Validate Request -- Missing X-Auth-Token\",\n \"instance\": \"1329598861\",\n \"success\": false\n return\n\n model = req.body.model\n selector = req.body.selector\n options = req.body.options\n space = req.body.space\n data = []\n allow_models = ['space_users', 'organizations', 'flow_roles', 'roles']\n\n if !space\n JsonRoutes.sendResult res,\n code: 403,\n data:\n \"error\": \"invalid space \" + space,\n \"success\": false\n return\n\n # 用户登录验证\n check(space, String)\n check(authToken, String)\n userSession = Meteor.wrapAsync((authToken, spaceId, cb) ->\n steedosAuth.getSession(authToken, spaceId).then (resolve, reject) ->\n cb(reject, resolve)\n )(authToken, space)\n unless userSession\n JsonRoutes.sendResult res,\n code: 500,\n data:\n \"error\": \"auth failed\",\n \"success\": false\n return\n userId = userSession.userId\n\n if !allow_models.includes(model)\n JsonRoutes.sendResult res,\n code: 403,\n data:\n \"error\": \"invalid model \" + model,\n \"success\": false\n return\n\n if !db[model]\n JsonRoutes.sendResult res,\n code: 403,\n data:\n \"error\": \"invalid model \" + model,\n \"success\": false\n return\n\n if !selector\n selector = {}\n\n if !options\n options = {}\n\n selector.space = space\n\n data = db[model].find(selector, options).fetch()\n\n JsonRoutes.sendResult res,\n code: 200,\n data: data\n catch e\n console.error e.stack\n JsonRoutes.sendResult res,\n code: 200,\n data: []\n\n\nJsonRoutes.add \"post\", \"/api/collection/findone\", (req, res, next) ->\n try\n cookies = new Cookies( req, res )\n authToken = req.body[\"X-Auth-Token\"] || cookies.get(\"X-Auth-Token\")\n\n if !authToken\n JsonRoutes.sendResult res,\n code: 401,\n data:\n \"error\": \"Validate Request -- Missing X-Auth-Token\",\n \"instance\": \"1329598861\",\n \"success\": false\n return\n\n model = req.body.model\n selector = req.body.selector\n options = req.body.options\n space = req.body.space\n data = []\n allow_models = ['space_users', 'organizations', 'flow_roles', 'mail_accounts', 'roles']\n\n if !space\n JsonRoutes.sendResult res,\n code: 403,\n data:\n \"error\": \"invalid space \" + space,\n \"success\": false\n return\n\n # 用户登录验证\n check(space, String)\n check(authToken, String)\n userSession = Meteor.wrapAsync((authToken, spaceId, cb) ->\n steedosAuth.getSession(authToken, spaceId).then (resolve, reject) ->\n cb(reject, resolve)\n )(authToken, space)\n unless userSession\n JsonRoutes.sendResult res,\n code: 500,\n data:\n \"error\": \"auth failed\",\n \"success\": false\n return\n userId = userSession.userId\n\n if !allow_models.includes(model)\n JsonRoutes.sendResult res,\n code: 403,\n data:\n \"error\": \"invalid model \" + model,\n \"success\": false\n return\n\n if !db[model]\n JsonRoutes.sendResult res,\n code: 403,\n data:\n \"error\": \"invalid model \" + model,\n \"success\": false\n return\n\n if !selector\n selector = {}\n\n if !options\n options = {}\n\n if model == 'mail_accounts'\n selector = {}\n selector.owner = userId\n data = db[model].findOne(selector)\n else\n selector.space = space\n\n data = db[model].findOne(selector, options)\n\n JsonRoutes.sendResult res,\n code: 200,\n data: data\n catch e\n console.error e.stack\n JsonRoutes.sendResult res,\n code: 200,\n data: {}\n","var Cookies, steedosAuth;\n\nCookies = require(\"cookies\");\n\nsteedosAuth = require(\"@steedos/auth\");\n\nJsonRoutes.add(\"post\", \"/api/collection/find\", function(req, res, next) {\n var allow_models, authToken, cookies, data, e, model, options, selector, space, userId, userSession;\n try {\n cookies = new Cookies(req, res);\n authToken = req.body[\"X-Auth-Token\"] || cookies.get(\"X-Auth-Token\");\n if (!authToken) {\n JsonRoutes.sendResult(res, {\n code: 401,\n data: {\n \"error\": \"Validate Request -- Missing X-Auth-Token\",\n \"instance\": \"1329598861\",\n \"success\": false\n }\n });\n return;\n }\n model = req.body.model;\n selector = req.body.selector;\n options = req.body.options;\n space = req.body.space;\n data = [];\n allow_models = ['space_users', 'organizations', 'flow_roles', 'roles'];\n if (!space) {\n JsonRoutes.sendResult(res, {\n code: 403,\n data: {\n \"error\": \"invalid space \" + space,\n \"success\": false\n }\n });\n return;\n }\n check(space, String);\n check(authToken, String);\n userSession = Meteor.wrapAsync(function(authToken, spaceId, cb) {\n return steedosAuth.getSession(authToken, spaceId).then(function(resolve, reject) {\n return cb(reject, resolve);\n });\n })(authToken, space);\n if (!userSession) {\n JsonRoutes.sendResult(res, {\n code: 500,\n data: {\n \"error\": \"auth failed\",\n \"success\": false\n }\n });\n return;\n }\n userId = userSession.userId;\n if (!allow_models.includes(model)) {\n JsonRoutes.sendResult(res, {\n code: 403,\n data: {\n \"error\": \"invalid model \" + model,\n \"success\": false\n }\n });\n return;\n }\n if (!db[model]) {\n JsonRoutes.sendResult(res, {\n code: 403,\n data: {\n \"error\": \"invalid model \" + model,\n \"success\": false\n }\n });\n return;\n }\n if (!selector) {\n selector = {};\n }\n if (!options) {\n options = {};\n }\n selector.space = space;\n data = db[model].find(selector, options).fetch();\n return JsonRoutes.sendResult(res, {\n code: 200,\n data: data\n });\n } catch (error) {\n e = error;\n console.error(e.stack);\n return JsonRoutes.sendResult(res, {\n code: 200,\n data: []\n });\n }\n});\n\nJsonRoutes.add(\"post\", \"/api/collection/findone\", function(req, res, next) {\n var allow_models, authToken, cookies, data, e, model, options, selector, space, userId, userSession;\n try {\n cookies = new Cookies(req, res);\n authToken = req.body[\"X-Auth-Token\"] || cookies.get(\"X-Auth-Token\");\n if (!authToken) {\n JsonRoutes.sendResult(res, {\n code: 401,\n data: {\n \"error\": \"Validate Request -- Missing X-Auth-Token\",\n \"instance\": \"1329598861\",\n \"success\": false\n }\n });\n return;\n }\n model = req.body.model;\n selector = req.body.selector;\n options = req.body.options;\n space = req.body.space;\n data = [];\n allow_models = ['space_users', 'organizations', 'flow_roles', 'mail_accounts', 'roles'];\n if (!space) {\n JsonRoutes.sendResult(res, {\n code: 403,\n data: {\n \"error\": \"invalid space \" + space,\n \"success\": false\n }\n });\n return;\n }\n check(space, String);\n check(authToken, String);\n userSession = Meteor.wrapAsync(function(authToken, spaceId, cb) {\n return steedosAuth.getSession(authToken, spaceId).then(function(resolve, reject) {\n return cb(reject, resolve);\n });\n })(authToken, space);\n if (!userSession) {\n JsonRoutes.sendResult(res, {\n code: 500,\n data: {\n \"error\": \"auth failed\",\n \"success\": false\n }\n });\n return;\n }\n userId = userSession.userId;\n if (!allow_models.includes(model)) {\n JsonRoutes.sendResult(res, {\n code: 403,\n data: {\n \"error\": \"invalid model \" + model,\n \"success\": false\n }\n });\n return;\n }\n if (!db[model]) {\n JsonRoutes.sendResult(res, {\n code: 403,\n data: {\n \"error\": \"invalid model \" + model,\n \"success\": false\n }\n });\n return;\n }\n if (!selector) {\n selector = {};\n }\n if (!options) {\n options = {};\n }\n if (model === 'mail_accounts') {\n selector = {};\n selector.owner = userId;\n data = db[model].findOne(selector);\n } else {\n selector.space = space;\n data = db[model].findOne(selector, options);\n }\n return JsonRoutes.sendResult(res, {\n code: 200,\n data: data\n });\n } catch (error) {\n e = error;\n console.error(e.stack);\n return JsonRoutes.sendResult(res, {\n code: 200,\n data: {}\n });\n }\n});\n","crypto = require('crypto')\nCookies = require(\"cookies\")\nexpress = require(\"express\")\n\nJsonRoutes.add \"get\", \"/api/setup/sso/:app_id\", (req, res, next) ->\n\n\tapp = db.apps.findOne(req.params.app_id)\n\tif app\n\t\tsecret = app.secret\n\t\tredirectUrl = app.url\n\telse\n\t\tsecret = \"-8762-fcb369b2e8\"\n\t\tredirectUrl = req.params.redirectUrl\n\n\tif !redirectUrl\n\t\tres.writeHead 401\n\t\tres.end()\n\t\treturn\n\n\tcookies = new Cookies( req, res );\n\n\t# first check request body\n\t# if req.body\n\t# \tuserId = req.body[\"X-User-Id\"]\n\t# \tauthToken = req.body[\"X-Auth-Token\"]\n\n\t# # then check cookie\n\t# if !userId or !authToken\n\t# \tuserId = cookies.get(\"X-User-Id\")\n\t# \tauthToken = cookies.get(\"X-Auth-Token\")\n\n\tif !userId and !authToken\n\t\tuserId = req.query[\"X-User-Id\"]\n\t\tauthToken = req.query[\"X-Auth-Token\"]\n\n\tif userId and authToken\n\t\thashedToken = Accounts._hashLoginToken(authToken)\n\t\tuser = Meteor.users.findOne\n\t\t\t_id: userId,\n\t\t\t\"services.resume.loginTokens.hashedToken\": hashedToken\n\t\tif user\n\t\t\tsteedos_id = user.steedos_id\n\t\t\tif app.secret\n\t\t\t\tiv = app.secret\n\t\t\telse\n\t\t\t\tiv = \"-8762-fcb369b2e8\"\n\t\t\tnow = parseInt(new Date().getTime()/1000).toString()\n\t\t\tkey32 = \"\"\n\t\t\tlen = steedos_id.length\n\t\t\tif len < 32\n\t\t\t\tc = \"\"\n\t\t\t\ti = 0\n\t\t\t\tm = 32 - len\n\t\t\t\twhile i < m\n\t\t\t\t\tc = \" \" + c\n\t\t\t\t\ti++\n\t\t\t\tkey32 = steedos_id + c\n\t\t\telse if len >= 32\n\t\t\t\tkey32 = steedos_id.slice(0,32)\n\n\t\t\tcipher = crypto.createCipheriv('aes-256-cbc', new Buffer(key32, 'utf8'), new Buffer(iv, 'utf8'))\n\n\t\t\tcipheredMsg = Buffer.concat([cipher.update(new Buffer(now, 'utf8')), cipher.final()])\n\n\t\t\tsteedos_token = cipheredMsg.toString('base64')\n\n\t\t\t# des-cbc\n\t\t\tdes_iv = \"-8762-fc\"\n\t\t\tkey8 = \"\"\n\t\t\tlen = steedos_id.length\n\t\t\tif len < 8\n\t\t\t\tc = \"\"\n\t\t\t\ti = 0\n\t\t\t\tm = 8 - len\n\t\t\t\twhile i < m\n\t\t\t\t\tc = \" \" + c\n\t\t\t\t\ti++\n\t\t\t\tkey8 = steedos_id + c\n\t\t\telse if len >= 8\n\t\t\t\tkey8 = steedos_id.slice(0,8)\n\t\t\tdes_cipher = crypto.createCipheriv('des-cbc', new Buffer(key8, 'utf8'), new Buffer(des_iv, 'utf8'))\n\t\t\tdes_cipheredMsg = Buffer.concat([des_cipher.update(new Buffer(now, 'utf8')), des_cipher.final()])\n\t\t\tdes_steedos_token = des_cipheredMsg.toString('base64')\n\n\t\t\tjoiner = \"?\"\n\n\t\t\tif redirectUrl.indexOf(\"?\") > -1\n\t\t\t\tjoiner = \"&\"\n\n\t\t\treturnurl = redirectUrl + joiner + \"X-User-Id=\" + userId + \"&X-Auth-Token=\" + authToken + \"&X-STEEDOS-WEB-ID=\" + steedos_id + \"&X-STEEDOS-AUTHTOKEN=\" + steedos_token + \"&STEEDOS-AUTHTOKEN=\" + des_steedos_token\n\n\t\t\tif user.username\n\t\t\t\treturnurl += \"&X-STEEDOS-USERNAME=#{encodeURI(user.username)}\"\n\t\t\tres.setHeader \"Location\", returnurl\n\t\t\tres.writeHead 302\n\t\t\tres.end()\n\t\t\treturn\n\n\tres.writeHead 401\n\tres.end()\n\treturn\n","var Cookies, crypto, express;\n\ncrypto = require('crypto');\n\nCookies = require(\"cookies\");\n\nexpress = require(\"express\");\n\nJsonRoutes.add(\"get\", \"/api/setup/sso/:app_id\", function(req, res, next) {\n var app, authToken, c, cipher, cipheredMsg, cookies, des_cipher, des_cipheredMsg, des_iv, des_steedos_token, hashedToken, i, iv, joiner, key32, key8, len, m, now, redirectUrl, returnurl, secret, steedos_id, steedos_token, user, userId;\n app = db.apps.findOne(req.params.app_id);\n if (app) {\n secret = app.secret;\n redirectUrl = app.url;\n } else {\n secret = \"-8762-fcb369b2e8\";\n redirectUrl = req.params.redirectUrl;\n }\n if (!redirectUrl) {\n res.writeHead(401);\n res.end();\n return;\n }\n cookies = new Cookies(req, res);\n if (!userId && !authToken) {\n userId = req.query[\"X-User-Id\"];\n authToken = req.query[\"X-Auth-Token\"];\n }\n if (userId && authToken) {\n hashedToken = Accounts._hashLoginToken(authToken);\n user = Meteor.users.findOne({\n _id: userId,\n \"services.resume.loginTokens.hashedToken\": hashedToken\n });\n if (user) {\n steedos_id = user.steedos_id;\n if (app.secret) {\n iv = app.secret;\n } else {\n iv = \"-8762-fcb369b2e8\";\n }\n now = parseInt(new Date().getTime() / 1000).toString();\n key32 = \"\";\n len = steedos_id.length;\n if (len < 32) {\n c = \"\";\n i = 0;\n m = 32 - len;\n while (i < m) {\n c = \" \" + c;\n i++;\n }\n key32 = steedos_id + c;\n } else if (len >= 32) {\n key32 = steedos_id.slice(0, 32);\n }\n cipher = crypto.createCipheriv('aes-256-cbc', new Buffer(key32, 'utf8'), new Buffer(iv, 'utf8'));\n cipheredMsg = Buffer.concat([cipher.update(new Buffer(now, 'utf8')), cipher.final()]);\n steedos_token = cipheredMsg.toString('base64');\n des_iv = \"-8762-fc\";\n key8 = \"\";\n len = steedos_id.length;\n if (len < 8) {\n c = \"\";\n i = 0;\n m = 8 - len;\n while (i < m) {\n c = \" \" + c;\n i++;\n }\n key8 = steedos_id + c;\n } else if (len >= 8) {\n key8 = steedos_id.slice(0, 8);\n }\n des_cipher = crypto.createCipheriv('des-cbc', new Buffer(key8, 'utf8'), new Buffer(des_iv, 'utf8'));\n des_cipheredMsg = Buffer.concat([des_cipher.update(new Buffer(now, 'utf8')), des_cipher.final()]);\n des_steedos_token = des_cipheredMsg.toString('base64');\n joiner = \"?\";\n if (redirectUrl.indexOf(\"?\") > -1) {\n joiner = \"&\";\n }\n returnurl = redirectUrl + joiner + \"X-User-Id=\" + userId + \"&X-Auth-Token=\" + authToken + \"&X-STEEDOS-WEB-ID=\" + steedos_id + \"&X-STEEDOS-AUTHTOKEN=\" + steedos_token + \"&STEEDOS-AUTHTOKEN=\" + des_steedos_token;\n if (user.username) {\n returnurl += \"&X-STEEDOS-USERNAME=\" + (encodeURI(user.username));\n }\n res.setHeader(\"Location\", returnurl);\n res.writeHead(302);\n res.end();\n return;\n }\n }\n res.writeHead(401);\n res.end();\n});\n","Meteor.startup ->\n\t\n\tJsonRoutes.add 'get', '/avatar/:userId', (req, res, next) ->\n\t\t# this.params =\n\t\t# \tuserId: decodeURI(req.url).replace(/^\\//, '').replace(/\\?.*$/, '')\n\t\twidth = 50 ;\n\t\theight = 50 ;\n\t\tfontSize = 28 ;\n\t\tif req.query.w\n\t\t width = req.query.w ;\n\t\tif req.query.h\n\t\t height = req.query.h ;\n\t\tif req.query.fs\n fontSize = req.query.fs ;\n\n\t\tuser = db.users.findOne(req.params.userId);\n\t\tif !user\n\t\t\tres.writeHead 401\n\t\t\tres.end()\n\t\t\treturn\n\n\t\tif user.avatar\n\t\t\tres.setHeader \"Location\", Creator.getRelativeUrl(\"api/files/avatars/\" + user.avatar)\n\t\t\tres.writeHead 302\n\t\t\tres.end()\n\t\t\treturn\n\n\t\tif user.profile?.avatar\n\t\t\tres.setHeader \"Location\", user.profile.avatar\n\t\t\tres.writeHead 302\n\t\t\tres.end()\n\t\t\treturn\n\n\t\tif user.avatarUrl\n\t\t\tres.setHeader \"Location\", user.avatarUrl\n\t\t\tres.writeHead 302\n\t\t\tres.end()\n\t\t\treturn\n\n\t\tif not file?\n\t\t\tres.setHeader 'Content-Disposition', 'inline'\n\t\t\tres.setHeader 'content-type', 'image/svg+xml'\n\t\t\tres.setHeader 'cache-control', 'public, max-age=31536000'\n\t\t\tsvg = \"\"\"\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\n\t\t\t\"\"\"\n\t\t\tres.write svg\n#\t\t\tres.setHeader \"Location\", Steedos.absoluteUrl(\"/packages/steedos_base/client/images/default-avatar.png\")\n#\t\t\tres.writeHead 302\n\t\t\tres.end()\n\t\t\treturn\n\n\t\tusername = user.name;\n\t\tif !username\n\t\t\tusername = \"\"\n\n\t\tres.setHeader 'Content-Disposition', 'inline'\n\n\t\tif not file?\n\t\t\tres.setHeader 'content-type', 'image/svg+xml'\n\t\t\tres.setHeader 'cache-control', 'public, max-age=31536000'\n\n\t\t\tcolors = ['#F44336','#E91E63','#9C27B0','#673AB7','#3F51B5','#2196F3','#03A9F4','#00BCD4','#009688','#4CAF50','#8BC34A','#CDDC39','#FFC107','#FF9800','#FF5722','#795548','#9E9E9E','#607D8B']\n\n\t\t\tusername_array = Array.from(username)\n\t\t\tcolor_index = 0\n\t\t\t_.each username_array, (item) ->\n\t\t\t\tcolor_index += item.charCodeAt(0);\n\n\t\t\tposition = color_index % colors.length\n\t\t\tcolor = colors[position]\n\t\t\t#color = \"#D6DADC\"\n\n\t\t\tinitials = ''\n\t\t\tif username.charCodeAt(0)>255\n\t\t\t\tinitials = username.substr(0, 1)\n\t\t\telse\n\t\t\t\tinitials = username.substr(0, 2)\n\n\t\t\tinitials = initials.toUpperCase()\n\n\t\t\tsvg = \"\"\"\n\t\t\t\n\t\t\t\n\t\t\t\t\n\t\t\t\t\t#{initials}\n\t\t\t\t\n\t\t\t\n\t\t\t\"\"\"\n\n\t\t\tres.write svg\n\t\t\tres.end()\n\t\t\treturn\n\n\t\treqModifiedHeader = req.headers[\"if-modified-since\"];\n\t\tif reqModifiedHeader?\n\t\t\tif reqModifiedHeader == user.modified?.toUTCString()\n\t\t\t\tres.setHeader 'Last-Modified', reqModifiedHeader\n\t\t\t\tres.writeHead 304\n\t\t\t\tres.end()\n\t\t\t\treturn\n\n\t\tres.setHeader 'Last-Modified', user.modified?.toUTCString() or new Date().toUTCString()\n\t\tres.setHeader 'content-type', 'image/jpeg'\n\t\tres.setHeader 'Content-Length', file.length\n\n\t\tfile.readStream.pipe res\n\t\treturn","Meteor.startup(function() {\n return JsonRoutes.add('get', '/avatar/:userId', function(req, res, next) {\n var color, color_index, colors, fontSize, height, initials, position, ref, ref1, ref2, reqModifiedHeader, svg, user, username, username_array, width;\n width = 50;\n height = 50;\n fontSize = 28;\n if (req.query.w) {\n width = req.query.w;\n }\n if (req.query.h) {\n height = req.query.h;\n }\n if (req.query.fs) {\n fontSize = req.query.fs;\n }\n user = db.users.findOne(req.params.userId);\n if (!user) {\n res.writeHead(401);\n res.end();\n return;\n }\n if (user.avatar) {\n res.setHeader(\"Location\", Creator.getRelativeUrl(\"api/files/avatars/\" + user.avatar));\n res.writeHead(302);\n res.end();\n return;\n }\n if ((ref = user.profile) != null ? ref.avatar : void 0) {\n res.setHeader(\"Location\", user.profile.avatar);\n res.writeHead(302);\n res.end();\n return;\n }\n if (user.avatarUrl) {\n res.setHeader(\"Location\", user.avatarUrl);\n res.writeHead(302);\n res.end();\n return;\n }\n if (typeof file === \"undefined\" || file === null) {\n res.setHeader('Content-Disposition', 'inline');\n res.setHeader('content-type', 'image/svg+xml');\n res.setHeader('cache-control', 'public, max-age=31536000');\n svg = \"\\n\\n\\n\t\\n\t\\n\\n\\n\t\\n\t\t\\n\t\t\\n\t\\n\\n\";\n res.write(svg);\n res.end();\n return;\n }\n username = user.name;\n if (!username) {\n username = \"\";\n }\n res.setHeader('Content-Disposition', 'inline');\n if (typeof file === \"undefined\" || file === null) {\n res.setHeader('content-type', 'image/svg+xml');\n res.setHeader('cache-control', 'public, max-age=31536000');\n colors = ['#F44336', '#E91E63', '#9C27B0', '#673AB7', '#3F51B5', '#2196F3', '#03A9F4', '#00BCD4', '#009688', '#4CAF50', '#8BC34A', '#CDDC39', '#FFC107', '#FF9800', '#FF5722', '#795548', '#9E9E9E', '#607D8B'];\n username_array = Array.from(username);\n color_index = 0;\n _.each(username_array, function(item) {\n return color_index += item.charCodeAt(0);\n });\n position = color_index % colors.length;\n color = colors[position];\n initials = '';\n if (username.charCodeAt(0) > 255) {\n initials = username.substr(0, 1);\n } else {\n initials = username.substr(0, 2);\n }\n initials = initials.toUpperCase();\n svg = \"\\n\\n\t\\n\t\t\" + initials + \"\\n\t\\n\";\n res.write(svg);\n res.end();\n return;\n }\n reqModifiedHeader = req.headers[\"if-modified-since\"];\n if (reqModifiedHeader != null) {\n if (reqModifiedHeader === ((ref1 = user.modified) != null ? ref1.toUTCString() : void 0)) {\n res.setHeader('Last-Modified', reqModifiedHeader);\n res.writeHead(304);\n res.end();\n return;\n }\n }\n res.setHeader('Last-Modified', ((ref2 = user.modified) != null ? ref2.toUTCString() : void 0) || new Date().toUTCString());\n res.setHeader('content-type', 'image/jpeg');\n res.setHeader('Content-Length', file.length);\n file.readStream.pipe(res);\n });\n});\n","Meteor.startup ->\n\tJsonRoutes.add 'get', '/api/access/check', (req, res, next) ->\n\n\t\taccess_token = req.query?.access_token\n\n\t\tif Steedos.getUserIdFromAccessToken(access_token)\n\t\t\tres.writeHead 200\n\t\t\tres.end()\n\t\t\treturn\n\t\telse\n\t\t\tres.writeHead 401\n\t\t\tres.end()\n\t\t\treturn\n\n\n\n\n","Meteor.startup(function() {\n return JsonRoutes.add('get', '/api/access/check', function(req, res, next) {\n var access_token, ref;\n access_token = (ref = req.query) != null ? ref.access_token : void 0;\n if (Steedos.getUserIdFromAccessToken(access_token)) {\n res.writeHead(200);\n res.end();\n } else {\n res.writeHead(401);\n res.end();\n }\n });\n});\n","if Meteor.isServer\n Meteor.publish 'apps', (spaceId)->\n unless this.userId\n return this.ready()\n \n\n selector = {space: {$exists: false}}\n if spaceId\n selector = {$or: [{space: {$exists: false}}, {space: spaceId}]}\n \n return db.apps.find(selector, {sort: {sort: 1}});\n","if (Meteor.isServer) {\n Meteor.publish('apps', function(spaceId) {\n var selector;\n if (!this.userId) {\n return this.ready();\n }\n selector = {\n space: {\n $exists: false\n }\n };\n if (spaceId) {\n selector = {\n $or: [\n {\n space: {\n $exists: false\n }\n }, {\n space: spaceId\n }\n ]\n };\n }\n return db.apps.find(selector, {\n sort: {\n sort: 1\n }\n });\n });\n}\n","\n\n\t# publish users spaces\n\t# we only publish spaces current user joined.\n\tMeteor.publish 'my_spaces', ->\n\t\tunless this.userId\n\t\t\treturn this.ready()\n\n\n\t\tself = this;\n\t\tuserSpaces = []\n\t\tsus = db.space_users.find({user: this.userId, user_accepted: true}, {fields: {space:1}})\n\t\tsus.forEach (su) ->\n\t\t\tuserSpaces.push(su.space)\n\n\t\thandle2 = null\n\n\t\t# only return user joined spaces, and observes when user join or leave a space\n\t\thandle = db.space_users.find({user: this.userId, user_accepted: true}).observe\n\t\t\tadded: (doc) ->\n\t\t\t\tif doc.space\n\t\t\t\t\tif userSpaces.indexOf(doc.space) < 0\n\t\t\t\t\t\tuserSpaces.push(doc.space)\n\t\t\t\t\t\tobserveSpaces()\n\t\t\tremoved: (oldDoc) ->\n\t\t\t\tif oldDoc.space\n\t\t\t\t\tself.removed \"spaces\", oldDoc.space\n\t\t\t\t\tuserSpaces = _.without(userSpaces, oldDoc.space)\n\n\t\tobserveSpaces = ->\n\t\t\tif handle2\n\t\t\t\thandle2.stop();\n\t\t\thandle2 = db.spaces.find({_id: {$in: userSpaces}}).observe\n\t\t\t\tadded: (doc) ->\n\t\t\t\t\tself.added \"spaces\", doc._id, doc;\n\t\t\t\t\tuserSpaces.push(doc._id)\n\t\t\t\tchanged: (newDoc, oldDoc) ->\n\t\t\t\t\tself.changed \"spaces\", newDoc._id, newDoc;\n\t\t\t\tremoved: (oldDoc) ->\n\t\t\t\t\tself.removed \"spaces\", oldDoc._id\n\t\t\t\t\tuserSpaces = _.without(userSpaces, oldDoc._id)\n\n\t\tobserveSpaces();\n\n\t\tself.ready();\n\n\t\tself.onStop ->\n\t\t\thandle.stop();\n\t\t\tif handle2\n\t\t\t\thandle2.stop();\n","Meteor.publish('my_spaces', function() {\n var handle, handle2, observeSpaces, self, sus, userSpaces;\n if (!this.userId) {\n return this.ready();\n }\n self = this;\n userSpaces = [];\n sus = db.space_users.find({\n user: this.userId,\n user_accepted: true\n }, {\n fields: {\n space: 1\n }\n });\n sus.forEach(function(su) {\n return userSpaces.push(su.space);\n });\n handle2 = null;\n handle = db.space_users.find({\n user: this.userId,\n user_accepted: true\n }).observe({\n added: function(doc) {\n if (doc.space) {\n if (userSpaces.indexOf(doc.space) < 0) {\n userSpaces.push(doc.space);\n return observeSpaces();\n }\n }\n },\n removed: function(oldDoc) {\n if (oldDoc.space) {\n self.removed(\"spaces\", oldDoc.space);\n return userSpaces = _.without(userSpaces, oldDoc.space);\n }\n }\n });\n observeSpaces = function() {\n if (handle2) {\n handle2.stop();\n }\n return handle2 = db.spaces.find({\n _id: {\n $in: userSpaces\n }\n }).observe({\n added: function(doc) {\n self.added(\"spaces\", doc._id, doc);\n return userSpaces.push(doc._id);\n },\n changed: function(newDoc, oldDoc) {\n return self.changed(\"spaces\", newDoc._id, newDoc);\n },\n removed: function(oldDoc) {\n self.removed(\"spaces\", oldDoc._id);\n return userSpaces = _.without(userSpaces, oldDoc._id);\n }\n });\n };\n observeSpaces();\n self.ready();\n return self.onStop(function() {\n handle.stop();\n if (handle2) {\n return handle2.stop();\n }\n });\n});\n","# publish some one space's avatar\nMeteor.publish 'space_avatar', (spaceId)->\n\tunless spaceId\n\t\treturn this.ready()\n\n\treturn db.spaces.find({_id: spaceId}, {fields: {avatar: 1,name: 1,enable_register:1}});\n","Meteor.publish('space_avatar', function(spaceId) {\n if (!spaceId) {\n return this.ready();\n }\n return db.spaces.find({\n _id: spaceId\n }, {\n fields: {\n avatar: 1,\n name: 1,\n enable_register: 1\n }\n });\n});\n","Meteor.publish 'modules', ()->\n\tunless this.userId\n\t\treturn this.ready()\n\n\treturn db.modules.find();","Meteor.publish('modules', function() {\n if (!this.userId) {\n return this.ready();\n }\n return db.modules.find();\n});\n","Meteor.publish 'billing_weixin_pay_code_url', (_id)->\n\tunless this.userId\n\t\treturn this.ready()\n\n\tunless _id\n\t\treturn this.ready()\n\n\treturn db.billing_pay_records.find({_id: _id});","Meteor.publish('billing_weixin_pay_code_url', function(_id) {\n if (!this.userId) {\n return this.ready();\n }\n if (!_id) {\n return this.ready();\n }\n return db.billing_pay_records.find({\n _id: _id\n });\n});\n","JsonRoutes.add 'post', '/api/billing/recharge/notify', (req, res, next) ->\n\ttry\n\t\tbody = \"\"\n\t\treq.on('data', (chunk)->\n\t\t\tbody += chunk\n\t\t)\n\t\treq.on('end', Meteor.bindEnvironment((()->\n\t\t\t\txml2js = require('xml2js')\n\t\t\t\tparser = new xml2js.Parser({ trim:true, explicitArray:false, explicitRoot:false })\n\t\t\t\tparser.parseString(body, (err, result)->\n\t\t\t\t\t\t# 特别提醒:商户系统对于支付结果通知的内容一定要做签名验证,并校验返回的订单金额是否与商户侧的订单金额一致,防止数据泄漏导致出现“假通知”,造成资金损失\n\t\t\t\t\t\tWXPay = require('weixin-pay')\n\t\t\t\t\t\twxpay = WXPay({\n\t\t\t\t\t\t\tappid: Meteor.settings.billing.appid,\n\t\t\t\t\t\t\tmch_id: Meteor.settings.billing.mch_id,\n\t\t\t\t\t\t\tpartner_key: Meteor.settings.billing.partner_key #微信商户平台API密钥\n\t\t\t\t\t\t})\n\t\t\t\t\t\tsign = wxpay.sign(_.clone(result))\n\t\t\t\t\t\tattach = JSON.parse(result.attach)\n\t\t\t\t\t\tcode_url_id = attach.code_url_id\n\t\t\t\t\t\tbpr = db.billing_pay_records.findOne(code_url_id)\n\t\t\t\t\t\tif bpr and bpr.total_fee is Number(result.total_fee) and sign is result.sign\n\t\t\t\t\t\t\tdb.billing_pay_records.update({_id: code_url_id}, {$set: {paid: true}})\n\t\t\t\t\t\t\tbillingManager.special_pay(bpr.space, bpr.modules, Number(result.total_fee), bpr.created_by, bpr.end_date, bpr.user_count)\n\t\t\t\t\t\n\t\t\t\t)\n\t\t\t), (err)->\n\t\t\t\tconsole.error err.stack\n\t\t\t\tconsole.log 'Failed to bind environment: api_billing_recharge_notify.coffee'\n\t\t\t)\n\t\t)\n\t\t\n\tcatch e\n\t\tconsole.error e.stack\n\n\tres.writeHead(200, {'Content-Type': 'application/xml'})\n\tres.end('')\n\n\t\t","JsonRoutes.add('post', '/api/billing/recharge/notify', function(req, res, next) {\n var body, e;\n try {\n body = \"\";\n req.on('data', function(chunk) {\n return body += chunk;\n });\n req.on('end', Meteor.bindEnvironment((function() {\n var parser, xml2js;\n xml2js = require('xml2js');\n parser = new xml2js.Parser({\n trim: true,\n explicitArray: false,\n explicitRoot: false\n });\n return parser.parseString(body, function(err, result) {\n var WXPay, attach, bpr, code_url_id, sign, wxpay;\n WXPay = require('weixin-pay');\n wxpay = WXPay({\n appid: Meteor.settings.billing.appid,\n mch_id: Meteor.settings.billing.mch_id,\n partner_key: Meteor.settings.billing.partner_key\n });\n sign = wxpay.sign(_.clone(result));\n attach = JSON.parse(result.attach);\n code_url_id = attach.code_url_id;\n bpr = db.billing_pay_records.findOne(code_url_id);\n if (bpr && bpr.total_fee === Number(result.total_fee) && sign === result.sign) {\n db.billing_pay_records.update({\n _id: code_url_id\n }, {\n $set: {\n paid: true\n }\n });\n return billingManager.special_pay(bpr.space, bpr.modules, Number(result.total_fee), bpr.created_by, bpr.end_date, bpr.user_count);\n }\n });\n }), function(err) {\n console.error(err.stack);\n return console.log('Failed to bind environment: api_billing_recharge_notify.coffee');\n }));\n } catch (error) {\n e = error;\n console.error(e.stack);\n }\n res.writeHead(200, {\n 'Content-Type': 'application/xml'\n });\n return res.end('');\n});\n","Meteor.methods\n\tget_contacts_limit: (space)->\n\t\t# 根据当前用户所属组织,查询出当前用户限定的组织查看范围\n\t\t# 返回的isLimit为true表示限定在当前用户所在组织范围,organizations值记录额外的组织范围\n\t\t# 返回的isLimit为false表示不限定组织范围,即表示能看整个工作区的组织\n\t\t# 默认返回限定在当前用户所属组织\n\t\tcheck space, String\n\t\treValue =\n\t\t\tisLimit: true\n\t\t\toutside_organizations: []\n\t\tunless this.userId\n\t\t\treturn reValue\n\t\tisLimit = false\n\t\toutside_organizations = []\n\t\tsetting = db.space_settings.findOne({space: space, key: \"contacts_view_limits\"})\n\t\tlimits = setting?.values || [];\n\n\t\tif limits.length\n\t\t\tmyOrgs = db.organizations.find({space: space, users: this.userId}, {fields:{_id: 1}})\n\t\t\tmyOrgIds = myOrgs.map (n) ->\n\t\t\t\treturn n._id\n\t\t\tunless myOrgIds.length\n\t\t\t\treturn reValue\n\t\t\t\n\t\t\tmyLitmitOrgIds = []\n\t\t\tfor limit in limits\n\t\t\t\tfroms = limit.froms\n\t\t\t\ttos = limit.tos\n\t\t\t\tfromsChildren = db.organizations.find({space: space, parents: {$in: froms}}, {fields:{_id: 1}})\n\t\t\t\tfromsChildrenIds = fromsChildren?.map (n) ->\n\t\t\t\t\treturn n._id\n\t\t\t\tfor myOrgId in myOrgIds\n\t\t\t\t\ttempIsLimit = false\n\t\t\t\t\tif froms.indexOf(myOrgId) > -1\n\t\t\t\t\t\ttempIsLimit = true\n\t\t\t\t\telse\n\t\t\t\t\t\tif fromsChildrenIds.indexOf(myOrgId) > -1\n\t\t\t\t\t\t\ttempIsLimit = true\n\t\t\t\t\tif tempIsLimit\n\t\t\t\t\t\tisLimit = true\n\t\t\t\t\t\toutside_organizations.push tos\n\t\t\t\t\t\tmyLitmitOrgIds.push myOrgId\n\n\t\t\tmyLitmitOrgIds = _.uniq myLitmitOrgIds\n\t\t\tif myLitmitOrgIds.length < myOrgIds.length\n\t\t\t\t# 如果受限的组织个数小于用户所属组织的个数,则说明当前用户至少有一个组织是不受限的\n\t\t\t\tisLimit = false\n\t\t\t\toutside_organizations = []\n\t\t\telse\n\t\t\t\toutside_organizations = _.uniq _.flatten outside_organizations\n\n\t\tif isLimit\n\t\t\ttoOrgs = db.organizations.find({space: space, _id: {$in: outside_organizations}}, {fields:{_id: 1, parents: 1}}).fetch()\n\t\t\t# 把outside_organizations中有父子节点关系的节点筛选出来并取出最外层节点\n\t\t\t# 把outside_organizations中有属于用户所属组织的子孙节点的节点删除\n\t\t\torgs = _.filter toOrgs, (org) ->\n\t\t\t\tparents = org.parents or []\n\t\t\t\treturn _.intersection(parents, outside_organizations).length < 1 and _.intersection(parents, myOrgIds).length < 1\n\t\t\toutside_organizations = orgs.map (n) ->\n\t\t\t\treturn n._id\n\n\t\treValue.isLimit = isLimit\n\t\treValue.outside_organizations = outside_organizations\n\t\treturn reValue\n","Meteor.methods({\n get_contacts_limit: function(space) {\n var froms, fromsChildren, fromsChildrenIds, i, isLimit, j, len, len1, limit, limits, myLitmitOrgIds, myOrgId, myOrgIds, myOrgs, orgs, outside_organizations, reValue, setting, tempIsLimit, toOrgs, tos;\n check(space, String);\n reValue = {\n isLimit: true,\n outside_organizations: []\n };\n if (!this.userId) {\n return reValue;\n }\n isLimit = false;\n outside_organizations = [];\n setting = db.space_settings.findOne({\n space: space,\n key: \"contacts_view_limits\"\n });\n limits = (setting != null ? setting.values : void 0) || [];\n if (limits.length) {\n myOrgs = db.organizations.find({\n space: space,\n users: this.userId\n }, {\n fields: {\n _id: 1\n }\n });\n myOrgIds = myOrgs.map(function(n) {\n return n._id;\n });\n if (!myOrgIds.length) {\n return reValue;\n }\n myLitmitOrgIds = [];\n for (i = 0, len = limits.length; i < len; i++) {\n limit = limits[i];\n froms = limit.froms;\n tos = limit.tos;\n fromsChildren = db.organizations.find({\n space: space,\n parents: {\n $in: froms\n }\n }, {\n fields: {\n _id: 1\n }\n });\n fromsChildrenIds = fromsChildren != null ? fromsChildren.map(function(n) {\n return n._id;\n }) : void 0;\n for (j = 0, len1 = myOrgIds.length; j < len1; j++) {\n myOrgId = myOrgIds[j];\n tempIsLimit = false;\n if (froms.indexOf(myOrgId) > -1) {\n tempIsLimit = true;\n } else {\n if (fromsChildrenIds.indexOf(myOrgId) > -1) {\n tempIsLimit = true;\n }\n }\n if (tempIsLimit) {\n isLimit = true;\n outside_organizations.push(tos);\n myLitmitOrgIds.push(myOrgId);\n }\n }\n }\n myLitmitOrgIds = _.uniq(myLitmitOrgIds);\n if (myLitmitOrgIds.length < myOrgIds.length) {\n isLimit = false;\n outside_organizations = [];\n } else {\n outside_organizations = _.uniq(_.flatten(outside_organizations));\n }\n }\n if (isLimit) {\n toOrgs = db.organizations.find({\n space: space,\n _id: {\n $in: outside_organizations\n }\n }, {\n fields: {\n _id: 1,\n parents: 1\n }\n }).fetch();\n orgs = _.filter(toOrgs, function(org) {\n var parents;\n parents = org.parents || [];\n return _.intersection(parents, outside_organizations).length < 1 && _.intersection(parents, myOrgIds).length < 1;\n });\n outside_organizations = orgs.map(function(n) {\n return n._id;\n });\n }\n reValue.isLimit = isLimit;\n reValue.outside_organizations = outside_organizations;\n return reValue;\n }\n});\n","Meteor.methods({\n setKeyValue: function(key, value) {\n check(key, String);\n check(value, Object);\n\n obj = {};\n obj.user = this.userId;\n obj.key = key;\n obj.value = value;\n\n var c = db.steedos_keyvalues.find({\n user: this.userId,\n key: key\n }).count();\n if (c > 0) {\n db.steedos_keyvalues.update({\n user: this.userId,\n key: key\n }, {\n $set: {\n value: value\n }\n });\n } else {\n db.steedos_keyvalues.insert(obj);\n }\n\n return true;\n }\n})","Meteor.methods\n\tbilling_settleup: (accounting_month, space_id=\"\")->\n\t\tcheck(accounting_month, String)\n\t\tcheck(space_id, String)\n\n\t\tuser = db.users.findOne({_id: this.userId}, {fields: {is_cloudadmin: 1}})\n\n\t\tif not user.is_cloudadmin\n\t\t\treturn\n\n\t\tconsole.time 'billing'\n\t\tspaces = []\n\t\tif space_id\n\t\t\tspaces = db.spaces.find({_id: space_id, is_paid: true}, {fields: {_id: 1}})\n\t\telse\n\t\t\tspaces = db.spaces.find({is_paid: true}, {fields: {_id: 1}})\n\t\tresult = []\n\t\tspaces.forEach (s) ->\n\t\t\ttry\n\t\t\t\tbillingManager.caculate_by_accounting_month(accounting_month, s._id)\n\t\t\tcatch err\n\t\t\t\te = {}\n\t\t\t\te._id = s._id\n\t\t\t\te.name = s.name\n\t\t\t\te.err = err\n\t\t\t\tresult.push e\n\t\tif result.length > 0\n\t\t\tconsole.error result\n\t\t\ttry\n\t\t\t\tEmail = Package.email.Email\n\t\t\t\tEmail.send\n\t\t\t\t\tto: 'support@steedos.com'\n\t\t\t\t\tfrom: Accounts.emailTemplates.from\n\t\t\t\t\tsubject: 'billing settleup result'\n\t\t\t\t\ttext: JSON.stringify('result': result)\n\t\t\tcatch err\n\t\t\t\tconsole.error err\n\t\tconsole.timeEnd 'billing'","Meteor.methods({\n billing_settleup: function(accounting_month, space_id) {\n var Email, err, result, spaces, user;\n if (space_id == null) {\n space_id = \"\";\n }\n check(accounting_month, String);\n check(space_id, String);\n user = db.users.findOne({\n _id: this.userId\n }, {\n fields: {\n is_cloudadmin: 1\n }\n });\n if (!user.is_cloudadmin) {\n return;\n }\n console.time('billing');\n spaces = [];\n if (space_id) {\n spaces = db.spaces.find({\n _id: space_id,\n is_paid: true\n }, {\n fields: {\n _id: 1\n }\n });\n } else {\n spaces = db.spaces.find({\n is_paid: true\n }, {\n fields: {\n _id: 1\n }\n });\n }\n result = [];\n spaces.forEach(function(s) {\n var e, err;\n try {\n return billingManager.caculate_by_accounting_month(accounting_month, s._id);\n } catch (error) {\n err = error;\n e = {};\n e._id = s._id;\n e.name = s.name;\n e.err = err;\n return result.push(e);\n }\n });\n if (result.length > 0) {\n console.error(result);\n try {\n Email = Package.email.Email;\n Email.send({\n to: 'support@steedos.com',\n from: Accounts.emailTemplates.from,\n subject: 'billing settleup result',\n text: JSON.stringify({\n 'result': result\n })\n });\n } catch (error) {\n err = error;\n console.error(err);\n }\n }\n return console.timeEnd('billing');\n }\n});\n","Meteor.methods\n\tsetUsername: (space_id, username, user_id) ->\n\t\tcheck(space_id, String);\n\t\tcheck(username, String);\n\n\t\tif !Steedos.isSpaceAdmin(space_id, Meteor.userId()) and user_id\n\t\t\tthrow new Meteor.Error(400, 'contact_space_user_needed')\n\n\t\tif not Meteor.userId()\n\t\t\tthrow new Meteor.Error(400,'error-invalid-user')\n\n\t\tunless user_id\n\t\t\tuser_id = Meteor.user()._id\n\n\t\tspaceUser = db.space_users.findOne({user: user_id, space: space_id})\n\n\t\tif spaceUser.invite_state == \"pending\" or spaceUser.invite_state == \"refused\"\n\t\t\tthrow new Meteor.Error(400, \"该用户尚未同意加入该工作区,无法修改用户名\")\n\n\t\tdb.users.update({_id: user_id}, {$set: {username: username}})\n\n\t\treturn username\n","Meteor.methods({\n setUsername: function(space_id, username, user_id) {\n var spaceUser;\n check(space_id, String);\n check(username, String);\n if (!Steedos.isSpaceAdmin(space_id, Meteor.userId()) && user_id) {\n throw new Meteor.Error(400, 'contact_space_user_needed');\n }\n if (!Meteor.userId()) {\n throw new Meteor.Error(400, 'error-invalid-user');\n }\n if (!user_id) {\n user_id = Meteor.user()._id;\n }\n spaceUser = db.space_users.findOne({\n user: user_id,\n space: space_id\n });\n if (spaceUser.invite_state === \"pending\" || spaceUser.invite_state === \"refused\") {\n throw new Meteor.Error(400, \"该用户尚未同意加入该工作区,无法修改用户名\");\n }\n db.users.update({\n _id: user_id\n }, {\n $set: {\n username: username\n }\n });\n return username;\n }\n});\n","Meteor.methods\n\tbilling_recharge: (total_fee, space_id, new_id, module_names, end_date, user_count)->\n\t\tcheck total_fee, Number\n\t\tcheck space_id, String \n\t\tcheck new_id, String \n\t\tcheck module_names, Array \n\t\tcheck end_date, String \n\t\tcheck user_count, Number \n\n\t\tuser_id = this.userId\n\n\t\tlistprices = 0\n\t\torder_body = []\n\t\tdb.modules.find({name: {$in: module_names}}).forEach (m)->\n\t\t\tlistprices += m.listprice_rmb\n\t\t\torder_body.push m.name_zh\n\n\t\tspace = db.spaces.findOne(space_id)\n\t\tif not space.is_paid\n\t\t\tspace_user_count = db.space_users.find({space:space_id}).count()\n\t\t\tone_month_yuan = space_user_count * listprices\n\t\t\tif total_fee < one_month_yuan*100\n\t\t\t\tthrow new Meteor.Error 'error!', \"充值金额应不少于一个月所需费用:¥#{one_month_yuan}\"\n\n\t\tresult_obj = {}\n\n\t\tattach = {}\n\t\tattach.code_url_id = new_id\n\t\tWXPay = require('weixin-pay')\n\n\t\twxpay = WXPay({\n\t\t\tappid: Meteor.settings.billing.appid,\n\t\t\tmch_id: Meteor.settings.billing.mch_id,\n\t\t\tpartner_key: Meteor.settings.billing.partner_key #微信商户平台API密钥\n\t\t})\n\n\t\twxpay.createUnifiedOrder({\n\t\t\tbody: order_body.join(\",\"),\n\t\t\tout_trade_no: moment().format('YYYYMMDDHHmmssSSS'),\n\t\t\ttotal_fee: total_fee,\n\t\t\tspbill_create_ip: '127.0.0.1',\n\t\t\tnotify_url: Meteor.absoluteUrl() + 'api/billing/recharge/notify',\n\t\t\ttrade_type: 'NATIVE',\n\t\t\tproduct_id: moment().format('YYYYMMDDHHmmssSSS'),\n\t\t\tattach: JSON.stringify(attach)\n\t\t}, Meteor.bindEnvironment(((err, result) -> \n\t\t\t\tif err \n\t\t\t\t\tconsole.error err.stack\n\t\t\t\tif result\n\t\t\t\t\tobj = {}\n\t\t\t\t\tobj._id = new_id\n\t\t\t\t\tobj.created = new Date\n\t\t\t\t\tobj.info = result\n\t\t\t\t\tobj.total_fee = total_fee\n\t\t\t\t\tobj.created_by = user_id\n\t\t\t\t\tobj.space = space_id\n\t\t\t\t\tobj.paid = false\n\t\t\t\t\tobj.modules = module_names\n\t\t\t\t\tobj.end_date = end_date\n\t\t\t\t\tobj.user_count = user_count\n\t\t\t\t\tdb.billing_pay_records.insert(obj)\n\t\t\t), (e)->\n\t\t\t\tconsole.log 'Failed to bind environment: billing_recharge.coffee'\n\t\t\t\tconsole.log e.stack\n\t\t\t)\n\t\t)\n\n\t\t\n\t\treturn \"success\"","Meteor.methods({\n billing_recharge: function(total_fee, space_id, new_id, module_names, end_date, user_count) {\n var WXPay, attach, listprices, one_month_yuan, order_body, result_obj, space, space_user_count, user_id, wxpay;\n check(total_fee, Number);\n check(space_id, String);\n check(new_id, String);\n check(module_names, Array);\n check(end_date, String);\n check(user_count, Number);\n user_id = this.userId;\n listprices = 0;\n order_body = [];\n db.modules.find({\n name: {\n $in: module_names\n }\n }).forEach(function(m) {\n listprices += m.listprice_rmb;\n return order_body.push(m.name_zh);\n });\n space = db.spaces.findOne(space_id);\n if (!space.is_paid) {\n space_user_count = db.space_users.find({\n space: space_id\n }).count();\n one_month_yuan = space_user_count * listprices;\n if (total_fee < one_month_yuan * 100) {\n throw new Meteor.Error('error!', \"充值金额应不少于一个月所需费用:¥\" + one_month_yuan);\n }\n }\n result_obj = {};\n attach = {};\n attach.code_url_id = new_id;\n WXPay = require('weixin-pay');\n wxpay = WXPay({\n appid: Meteor.settings.billing.appid,\n mch_id: Meteor.settings.billing.mch_id,\n partner_key: Meteor.settings.billing.partner_key\n });\n wxpay.createUnifiedOrder({\n body: order_body.join(\",\"),\n out_trade_no: moment().format('YYYYMMDDHHmmssSSS'),\n total_fee: total_fee,\n spbill_create_ip: '127.0.0.1',\n notify_url: Meteor.absoluteUrl() + 'api/billing/recharge/notify',\n trade_type: 'NATIVE',\n product_id: moment().format('YYYYMMDDHHmmssSSS'),\n attach: JSON.stringify(attach)\n }, Meteor.bindEnvironment((function(err, result) {\n var obj;\n if (err) {\n console.error(err.stack);\n }\n if (result) {\n obj = {};\n obj._id = new_id;\n obj.created = new Date;\n obj.info = result;\n obj.total_fee = total_fee;\n obj.created_by = user_id;\n obj.space = space_id;\n obj.paid = false;\n obj.modules = module_names;\n obj.end_date = end_date;\n obj.user_count = user_count;\n return db.billing_pay_records.insert(obj);\n }\n }), function(e) {\n console.log('Failed to bind environment: billing_recharge.coffee');\n return console.log(e.stack);\n }));\n return \"success\";\n }\n});\n","Meteor.methods\n\tget_space_user_count: (space_id)->\n\t\tcheck space_id, String\n\t\tuser_count_info = new Object\n\t\tuser_count_info.total_user_count = db.space_users.find({space: space_id}).count()\n\t\tuser_count_info.accepted_user_count = db.space_users.find({space: space_id, user_accepted: true}).count()\n\t\treturn user_count_info","Meteor.methods\n\tcreate_secret: (name)->\n\t\tif !this.userId\n\t\t\treturn false;\n\n\t\tdb.users.create_secret this.userId, name\n\n\tremove_secret: (token)->\n\t\tif !this.userId || !token\n\t\t\treturn false;\n\n\t\thashedToken = Accounts._hashLoginToken(token)\n\n\t\tconsole.log(\"token\", token)\n\n\t\tdb.users.update({_id: this.userId}, {$pull: {\"secrets\": {hashedToken: hashedToken}}})\n","Meteor.methods({\n create_secret: function(name) {\n if (!this.userId) {\n return false;\n }\n return db.users.create_secret(this.userId, name);\n },\n remove_secret: function(token) {\n var hashedToken;\n if (!this.userId || !token) {\n return false;\n }\n hashedToken = Accounts._hashLoginToken(token);\n console.log(\"token\", token);\n return db.users.update({\n _id: this.userId\n }, {\n $pull: {\n \"secrets\": {\n hashedToken: hashedToken\n }\n }\n });\n }\n});\n","Meteor.methods\n 'object_workflows.get': (spaceId, userId) ->\n check spaceId, String\n check userId, String\n\n curSpaceUser = Creator.Collections[\"space_users\"].findOne({space: spaceId, user: userId}, {fields: {organizations: 1}})\n if !curSpaceUser\n throw new Meteor.Error 'not-authorized'\n\n organizations = Creator.getCollection('organizations').find({\n _id: {\n $in: curSpaceUser.organizations\n }\n }, {fields: {parents: 1}}).fetch()\n\n ows = Creator.getCollection('object_workflows').find({ space: spaceId }, { fields: { object_name: 1, flow_id: 1, space: 1 } }).fetch()\n _.each ows,(o) ->\n fl = Creator.getCollection('flows').findOne(o.flow_id, { fields: { name: 1, perms: 1 } })\n if fl\n o.flow_name = fl.name\n o.can_add = false\n\n perms = fl.perms\n if perms\n if perms.users_can_add && perms.users_can_add.includes(userId)\n o.can_add = true\n else if perms.orgs_can_add && perms.orgs_can_add.length > 0\n if curSpaceUser && curSpaceUser.organizations && _.intersection(curSpaceUser.organizations, perms.orgs_can_add).length > 0\n o.can_add = true\n else\n if organizations\n o.can_add = _.some organizations, (org)->\n return org.parents && _.intersection(org.parents, perms.orgs_can_add).length > 0\n\n ows = ows.filter (n)->\n return n.flow_name\n\n return ows","Meteor.methods({\n 'object_workflows.get': function(spaceId, userId) {\n var curSpaceUser, organizations, ows;\n check(spaceId, String);\n check(userId, String);\n curSpaceUser = Creator.Collections[\"space_users\"].findOne({\n space: spaceId,\n user: userId\n }, {\n fields: {\n organizations: 1\n }\n });\n if (!curSpaceUser) {\n throw new Meteor.Error('not-authorized');\n }\n organizations = Creator.getCollection('organizations').find({\n _id: {\n $in: curSpaceUser.organizations\n }\n }, {\n fields: {\n parents: 1\n }\n }).fetch();\n ows = Creator.getCollection('object_workflows').find({\n space: spaceId\n }, {\n fields: {\n object_name: 1,\n flow_id: 1,\n space: 1\n }\n }).fetch();\n _.each(ows, function(o) {\n var fl, perms;\n fl = Creator.getCollection('flows').findOne(o.flow_id, {\n fields: {\n name: 1,\n perms: 1\n }\n });\n if (fl) {\n o.flow_name = fl.name;\n o.can_add = false;\n perms = fl.perms;\n if (perms) {\n if (perms.users_can_add && perms.users_can_add.includes(userId)) {\n return o.can_add = true;\n } else if (perms.orgs_can_add && perms.orgs_can_add.length > 0) {\n if (curSpaceUser && curSpaceUser.organizations && _.intersection(curSpaceUser.organizations, perms.orgs_can_add).length > 0) {\n return o.can_add = true;\n } else {\n if (organizations) {\n return o.can_add = _.some(organizations, function(org) {\n return org.parents && _.intersection(org.parents, perms.orgs_can_add).length > 0;\n });\n }\n }\n }\n }\n }\n });\n ows = ows.filter(function(n) {\n return n.flow_name;\n });\n return ows;\n }\n});\n","Meteor.methods\n\tsetSpaceUserPassword: (space_user_id, space_id, password) ->\n\t\tif !this.userId\n\t\t\tthrow new Meteor.Error(400, \"请先登录\")\n\t\t\n\t\tspace = db.spaces.findOne({_id: space_id})\n\t\tisSpaceAdmin = space?.admins?.includes(this.userId)\n\n\t\tunless isSpaceAdmin\n\t\t\tthrow new Meteor.Error(400, \"您没有权限修改该用户密码\")\n\n\t\tspaceUser = db.space_users.findOne({_id: space_user_id, space: space_id})\n\t\tuser_id = spaceUser.user;\n\t\tuserCP = db.users.findOne({_id: user_id})\n\t\tcurrentUser = db.users.findOne({_id: this.userId})\n\n\t\tif spaceUser.invite_state == \"pending\" or spaceUser.invite_state == \"refused\"\n\t\t\tthrow new Meteor.Error(400, \"该用户尚未同意加入该工作区,无法修改密码\")\n\n\t\tSteedos.validatePassword(password)\n\t\tlogout = true;\n\t\tif this.userId == user_id\n\t\t\tlogout = false\n\t\tAccounts.setPassword(user_id, password, {logout: logout})\n\t\tchangedUserInfo = db.users.findOne({_id: user_id})\n\t\tif changedUserInfo\n\t\t\tdb.users.update({_id: user_id}, {$push: {'services.password_history': changedUserInfo.services?.password?.bcrypt}})\n\n\t\t# 如果用户手机号通过验证,就发短信提醒\n\t\tif userCP.mobile && userCP.mobile_verified\n\t\t\tlang = 'en'\n\t\t\tif userCP.locale is 'zh-cn'\n\t\t\t\tlang = 'zh-CN'\n\t\t\tSMSQueue.send\n\t\t\t\tFormat: 'JSON',\n\t\t\t\tAction: 'SingleSendSms',\n\t\t\t\tParamString: '',\n\t\t\t\tRecNum: userCP.mobile,\n\t\t\t\tSignName: '华炎办公',\n\t\t\t\tTemplateCode: 'SMS_67200967',\n\t\t\t\tmsg: TAPi18n.__('sms.change_password.template', {}, lang)\n\n","Meteor.methods({\n setSpaceUserPassword: function(space_user_id, space_id, password) {\n var changedUserInfo, currentUser, isSpaceAdmin, lang, logout, ref, ref1, ref2, space, spaceUser, userCP, user_id;\n if (!this.userId) {\n throw new Meteor.Error(400, \"请先登录\");\n }\n space = db.spaces.findOne({\n _id: space_id\n });\n isSpaceAdmin = space != null ? (ref = space.admins) != null ? ref.includes(this.userId) : void 0 : void 0;\n if (!isSpaceAdmin) {\n throw new Meteor.Error(400, \"您没有权限修改该用户密码\");\n }\n spaceUser = db.space_users.findOne({\n _id: space_user_id,\n space: space_id\n });\n user_id = spaceUser.user;\n userCP = db.users.findOne({\n _id: user_id\n });\n currentUser = db.users.findOne({\n _id: this.userId\n });\n if (spaceUser.invite_state === \"pending\" || spaceUser.invite_state === \"refused\") {\n throw new Meteor.Error(400, \"该用户尚未同意加入该工作区,无法修改密码\");\n }\n Steedos.validatePassword(password);\n logout = true;\n if (this.userId === user_id) {\n logout = false;\n }\n Accounts.setPassword(user_id, password, {\n logout: logout\n });\n changedUserInfo = db.users.findOne({\n _id: user_id\n });\n if (changedUserInfo) {\n db.users.update({\n _id: user_id\n }, {\n $push: {\n 'services.password_history': (ref1 = changedUserInfo.services) != null ? (ref2 = ref1.password) != null ? ref2.bcrypt : void 0 : void 0\n }\n });\n }\n if (userCP.mobile && userCP.mobile_verified) {\n lang = 'en';\n if (userCP.locale === 'zh-cn') {\n lang = 'zh-CN';\n }\n return SMSQueue.send({\n Format: 'JSON',\n Action: 'SingleSendSms',\n ParamString: '',\n RecNum: userCP.mobile,\n SignName: '华炎办公',\n TemplateCode: 'SMS_67200967',\n msg: TAPi18n.__('sms.change_password.template', {}, lang)\n });\n }\n }\n});\n","billingManager = {}\n\n# 获得结算周期内的可结算日数\n# space_id 结算对象工作区\n# accounting_month 结算月,格式:YYYYMM\nbillingManager.get_accounting_period = (space_id, accounting_month)->\n\tcount_days = 0\n\n\tend_date_time = new Date(parseInt(accounting_month.slice(0,4)), parseInt(accounting_month.slice(4,6)), 0)\n\tend_date = moment(end_date_time.getTime()).format('YYYYMMDD')\n\n\tbilling = db.billings.findOne({space: space_id, transaction: \"Starting balance\"})\n\tfirst_date = billing.billing_date\n\n\tstart_date = accounting_month + \"01\"\n\tstart_date_time = new Date(parseInt(accounting_month.slice(0,4)), parseInt(accounting_month.slice(4,6)), 1-end_date_time.getDate())\n\n\tif first_date >= end_date # 这个月不在本次结算范围之内,count_days=0\n\t\t# do nothing\n\telse if start_date <= first_date and first_date < end_date\n\t\tcount_days = (end_date_time - start_date_time)/(24*60*60*1000) + 1\n\telse if first_date < start_date\n\t\tcount_days = (end_date_time - start_date_time)/(24*60*60*1000) + 1\n\n\treturn {\"count_days\": count_days}\n\n# 重算这一日的余额\nbillingManager.refresh_balance = (space_id, refresh_date)->\n\tlast_bill = null\n\tbill = db.billings.findOne({space: space_id, created: refresh_date})\n\n\t# 获取正常付款的小于refresh_date的最近的一条记录\n\tpayment_bill = db.billings.findOne(\n\t\t{\n\t\t\tspace: space_id,\n\t\t\tcreated: {\n\t\t\t\t$lt: refresh_date\n\t\t\t},\n\t\t\tbilling_month: bill.billing_month\n\t\t},\n\t\t{\n\t\t\tsort: {\n\t\t\t\tmodified: -1\n\t\t\t}\n\t\t}\n\t)\n\tif payment_bill\n\t\tlast_bill = payment_bill\n\telse\n\t\t# 获取最新的结算的一条记录\n\t\tb_m_d = new Date(parseInt(bill.billing_month.slice(0,4)), parseInt(bill.billing_month.slice(4,6)), 0)\n\t\tb_m = moment(b_m_d.getTime()-(b_m_d.getDate()*24*60*60*1000)).format(\"YYYYMM\")\n\n\t\tapp_bill = db.billings.findOne(\n\t\t\t{\n\t\t\t\tspace: space_id,\n\t\t\t\tbilling_month: b_m\n\t\t\t},\n\t\t\t{\n\t\t\t\tsort: {\n\t\t\t\t\tmodified: -1\n\t\t\t\t}\n\t\t\t}\n\t\t)\n\t\tif app_bill\n\t\t\tlast_bill = app_bill\n\n\tlast_balance = if last_bill and last_bill.balance then last_bill.balance else 0.0\n\n\tdebits = if bill.debits then bill.debits else 0.0\n\tcredits = if bill.credits then bill.credits else 0.0\n\tsetObj = new Object\n\tsetObj.balance = Number((last_balance + credits - debits).toFixed(2))\n\tsetObj.modified = new Date\n\tdb.billings.direct.update({_id: bill._id}, {$set: setObj})\n\n# 结算当月的支出与余额\nbillingManager.get_balance = (space_id, accounting_month, user_count, count_days, module_name, listprice)->\n\taccounting_date = new Date(parseInt(accounting_month.slice(0,4)), parseInt(accounting_month.slice(4,6)), 0)\n\tdays_number = accounting_date.getDate()\n\taccounting_date_format = moment(accounting_date).format(\"YYYYMMDD\")\n\n\tdebits = Number(((count_days/days_number) * user_count * listprice).toFixed(2))\n\tlast_bill = db.billings.findOne(\n\t\t{\n\t\t\tspace: space_id,\n\t\t\tbilling_date: {\n\t\t\t\t$lte: accounting_date_format\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\tsort: {\n\t\t\t\tmodified: -1\n\t\t\t}\n\t\t}\n\t)\n\tlast_balance = if last_bill and last_bill.balance then last_bill.balance else 0.0\n\n\tnow = new Date\n\tnew_bill = new Object\n\tnew_bill._id = db.billings._makeNewID()\n\tnew_bill.billing_month = accounting_month\n\tnew_bill.billing_date = accounting_date_format\n\tnew_bill.space = space_id\n\tnew_bill.transaction = module_name\n\tnew_bill.listprice = listprice\n\tnew_bill.user_count = user_count\n\tnew_bill.debits = debits\n\tnew_bill.balance = Number((last_balance - debits).toFixed(2))\n\tnew_bill.created = now\n\tnew_bill.modified = now\n\tdb.billings.direct.insert(new_bill)\n\nbillingManager.getSpaceUserCount = (space_id)->\n\tdb.space_users.find({space: space_id, user_accepted: true}).count()\n\nbillingManager.recaculateBalance = (accounting_month, space_id)->\n\trefresh_dates = new Array\n\tdb.billings.find(\n\t\t{\n\t\t\tbilling_month: accounting_month,\n\t\t\tspace: space_id,\n\t\t\ttransaction: {$in: [\"Payment\", \"Service adjustment\"]}\n\t\t},\n\t\t{\n\t\t\tsort: {created: 1}\n\t\t}\n\t).forEach (bill)->\n\t\trefresh_dates.push(bill.created)\n\n\tif refresh_dates.length > 0\n\t\t_.each refresh_dates, (r_d)->\n\t\t\tbillingManager.refresh_balance(space_id, r_d)\n\nbillingManager.get_modules = (space_id, accounting_month)->\n\tmodules = new Array\n\tstart_date = accounting_month + \"01\"\n\tend_date_time = new Date(parseInt(accounting_month.slice(0,4)), parseInt(accounting_month.slice(4,6)), 0)\n\tend_date = moment(end_date_time.getTime()).format('YYYYMMDD')\n\n\tdb.modules.find().forEach (m)->\n\t\tm_changelog = db.modules_changelogs.findOne(\n\t\t\t{\n\t\t\t\tspace: space_id,\n\t\t\t\tmodule: m.name,\n\t\t\t\tchange_date: {\n\t\t\t\t\t$lte: end_date\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\tcreated: -1\n\t\t\t}\n\t\t)\n\t\t# 若未获得可匹配的记录,说明该module未安装,当月不计算费用\n\t\tif not m_changelog\n\t\t\t# do nothing\n\n\t\t# 若该记录的change_date= start_date\n\t\t\tmodules.push(m)\n\n\treturn modules\n\nbillingManager.get_modules_name = ()->\n\tmodules_name = new Array\n\tdb.modules.find().forEach((m)->\n\t\tmodules_name.push(m.name)\n\t)\n\treturn modules_name\n\n\nbillingManager.caculate_by_accounting_month = (accounting_month, space_id)->\n\tif accounting_month > (moment().format('YYYYMM'))\n\t\treturn\n\tif accounting_month == (moment().format('YYYYMM'))\n\t\t# 重算当月的充值后余额\n\t\tbillingManager.recaculateBalance(accounting_month, space_id)\n\n\t\tdebits = 0\n\t\tmodules_name = billingManager.get_modules_name()\n\t\tb_m_d = new Date(parseInt(accounting_month.slice(0,4)), parseInt(accounting_month.slice(4,6)), 0)\n\t\tb_m = moment(b_m_d.getTime()-(b_m_d.getDate()*24*60*60*1000)).format(\"YYYYMMDD\")\n\t\tdb.billings.find(\n\t\t\t{\n\t\t\t\tbilling_date: b_m,\n\t\t\t\tspace: space_id,\n\t\t\t\ttransaction: {\n\t\t\t\t\t$in: modules_name\n\t\t\t\t}\n\t\t\t}\n\t\t).forEach((b)->\n\t\t\tdebits += b.debits\n\t\t)\n\t\tnewest_bill = db.billings.findOne({space: space_id}, {sort: {modified: -1}})\n\t\tbalance = newest_bill.balance\n\t\tremaining_months = 0\n\t\tif balance > 0\n\t\t\tif debits > 0\n\t\t\t\tremaining_months = parseInt(balance/debits) + 1\n\t\t\telse\n\t\t\t\t# 当月刚升级,并没有扣款\n\t\t\t\tremaining_months = 1\n\n\t\tdb.spaces.direct.update(\n\t\t\t{\n\t\t\t\t_id: space_id\n\t\t\t},\n\t\t\t{\n\t\t\t\t$set: {\n\t\t\t\t\tbalance: balance,\n\t\t\t\t\t\"billing.remaining_months\": remaining_months\n\t\t\t\t}\n\t\t\t}\n\t\t)\n\telse\n\t\t# 获得其结算对象日期paymentdates数组和count_days可结算日数\n\t\tperiod_result = billingManager.get_accounting_period(space_id, accounting_month)\n\t\tif period_result[\"count_days\"] == 0\n\t\t\t# 也需对当月的充值记录执行更新\n\t\t\tbillingManager.recaculateBalance(accounting_month, space_id)\n\n\t\telse\n\t\t\tuser_count = billingManager.getSpaceUserCount(space_id)\n\n\t\t\t# 清除当月的已结算记录\n\t\t\tmodules_name = billingManager.get_modules_name()\n\t\t\taccounting_date = new Date(parseInt(accounting_month.slice(0,4)), parseInt(accounting_month.slice(4,6)), 0)\n\t\t\taccounting_date_format = moment(accounting_date).format(\"YYYYMMDD\")\n\t\t\tdb.billings.remove(\n\t\t\t\t{\n\t\t\t\t\tbilling_date: accounting_date_format,\n\t\t\t\t\tspace: space_id,\n\t\t\t\t\ttransaction: {\n\t\t\t\t\t\t$in: modules_name\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t)\n\t\t\t# 重算当月的充值后余额\n\t\t\tbillingManager.recaculateBalance(accounting_month, space_id)\n\n\t\t\t# 结算当月的APP使用后余额\n\t\t\tmodules = billingManager.get_modules(space_id, accounting_month)\n\t\t\tif modules and modules.length>0\n\t\t\t\t_.each modules, (m)->\n\t\t\t\t\tbillingManager.get_balance(space_id, accounting_month, user_count, period_result[\"count_days\"], m.name, m.listprice)\n\n\t\ta_m = moment(new Date(parseInt(accounting_month.slice(0,4)), parseInt(accounting_month.slice(4,6)), 1).getTime()).format(\"YYYYMM\")\n\t\tbillingManager.caculate_by_accounting_month(a_m, space_id)\n\nbillingManager.special_pay = (space_id, module_names, total_fee, operator_id, end_date, user_count)->\n\tspace = db.spaces.findOne(space_id)\n\n\tmodules = space.modules || new Array\n\n\tnew_modules = _.difference(module_names, modules)\n\n\tm = moment()\n\tnow = m._d\n\n\tspace_update_obj = new Object\n\n\t# 更新space是否专业版的标记\n\tif space.is_paid isnt true\n\t\tspace_update_obj.is_paid = true\n\t\tspace_update_obj.start_date = new Date\n\n\t# 更新modules\n\tspace_update_obj.modules = module_names\n\tspace_update_obj.modified = now\n\tspace_update_obj.modified_by = operator_id\n\tspace_update_obj.end_date = new Date(end_date)\n\tspace_update_obj.user_limit = user_count\n\n\tr = db.spaces.direct.update({_id: space_id}, {$set: space_update_obj})\n\tif r\n\t\t_.each new_modules, (module)->\n\t\t\tmcl = new Object\n\t\t\tmcl._id = db.modules_changelogs._makeNewID()\n\t\t\tmcl.change_date = m.format(\"YYYYMMDD\")\n\t\t\tmcl.operator = operator_id\n\t\t\tmcl.space = space_id\n\t\t\tmcl.operation = \"install\"\n\t\t\tmcl.module = module\n\t\t\tmcl.created = now\n\t\t\tdb.modules_changelogs.insert(mcl)\n\n\treturn"," \n\nbillingManager = {};\n\nbillingManager.get_accounting_period = function(space_id, accounting_month) {\n var billing, count_days, end_date, end_date_time, first_date, start_date, start_date_time;\n count_days = 0;\n end_date_time = new Date(parseInt(accounting_month.slice(0, 4)), parseInt(accounting_month.slice(4, 6)), 0);\n end_date = moment(end_date_time.getTime()).format('YYYYMMDD');\n billing = db.billings.findOne({\n space: space_id,\n transaction: \"Starting balance\"\n });\n first_date = billing.billing_date;\n start_date = accounting_month + \"01\";\n start_date_time = new Date(parseInt(accounting_month.slice(0, 4)), parseInt(accounting_month.slice(4, 6)), 1 - end_date_time.getDate());\n if (first_date >= end_date) {\n\n } else if (start_date <= first_date && first_date < end_date) {\n count_days = (end_date_time - start_date_time) / (24 * 60 * 60 * 1000) + 1;\n } else if (first_date < start_date) {\n count_days = (end_date_time - start_date_time) / (24 * 60 * 60 * 1000) + 1;\n }\n return {\n \"count_days\": count_days\n };\n};\n\nbillingManager.refresh_balance = function(space_id, refresh_date) {\n var app_bill, b_m, b_m_d, bill, credits, debits, last_balance, last_bill, payment_bill, setObj;\n last_bill = null;\n bill = db.billings.findOne({\n space: space_id,\n created: refresh_date\n });\n payment_bill = db.billings.findOne({\n space: space_id,\n created: {\n $lt: refresh_date\n },\n billing_month: bill.billing_month\n }, {\n sort: {\n modified: -1\n }\n });\n if (payment_bill) {\n last_bill = payment_bill;\n } else {\n b_m_d = new Date(parseInt(bill.billing_month.slice(0, 4)), parseInt(bill.billing_month.slice(4, 6)), 0);\n b_m = moment(b_m_d.getTime() - (b_m_d.getDate() * 24 * 60 * 60 * 1000)).format(\"YYYYMM\");\n app_bill = db.billings.findOne({\n space: space_id,\n billing_month: b_m\n }, {\n sort: {\n modified: -1\n }\n });\n if (app_bill) {\n last_bill = app_bill;\n }\n }\n last_balance = last_bill && last_bill.balance ? last_bill.balance : 0.0;\n debits = bill.debits ? bill.debits : 0.0;\n credits = bill.credits ? bill.credits : 0.0;\n setObj = new Object;\n setObj.balance = Number((last_balance + credits - debits).toFixed(2));\n setObj.modified = new Date;\n return db.billings.direct.update({\n _id: bill._id\n }, {\n $set: setObj\n });\n};\n\nbillingManager.get_balance = function(space_id, accounting_month, user_count, count_days, module_name, listprice) {\n var accounting_date, accounting_date_format, days_number, debits, last_balance, last_bill, new_bill, now;\n accounting_date = new Date(parseInt(accounting_month.slice(0, 4)), parseInt(accounting_month.slice(4, 6)), 0);\n days_number = accounting_date.getDate();\n accounting_date_format = moment(accounting_date).format(\"YYYYMMDD\");\n debits = Number(((count_days / days_number) * user_count * listprice).toFixed(2));\n last_bill = db.billings.findOne({\n space: space_id,\n billing_date: {\n $lte: accounting_date_format\n }\n }, {\n sort: {\n modified: -1\n }\n });\n last_balance = last_bill && last_bill.balance ? last_bill.balance : 0.0;\n now = new Date;\n new_bill = new Object;\n new_bill._id = db.billings._makeNewID();\n new_bill.billing_month = accounting_month;\n new_bill.billing_date = accounting_date_format;\n new_bill.space = space_id;\n new_bill.transaction = module_name;\n new_bill.listprice = listprice;\n new_bill.user_count = user_count;\n new_bill.debits = debits;\n new_bill.balance = Number((last_balance - debits).toFixed(2));\n new_bill.created = now;\n new_bill.modified = now;\n return db.billings.direct.insert(new_bill);\n};\n\nbillingManager.getSpaceUserCount = function(space_id) {\n return db.space_users.find({\n space: space_id,\n user_accepted: true\n }).count();\n};\n\nbillingManager.recaculateBalance = function(accounting_month, space_id) {\n var refresh_dates;\n refresh_dates = new Array;\n db.billings.find({\n billing_month: accounting_month,\n space: space_id,\n transaction: {\n $in: [\"Payment\", \"Service adjustment\"]\n }\n }, {\n sort: {\n created: 1\n }\n }).forEach(function(bill) {\n return refresh_dates.push(bill.created);\n });\n if (refresh_dates.length > 0) {\n return _.each(refresh_dates, function(r_d) {\n return billingManager.refresh_balance(space_id, r_d);\n });\n }\n};\n\nbillingManager.get_modules = function(space_id, accounting_month) {\n var end_date, end_date_time, modules, start_date;\n modules = new Array;\n start_date = accounting_month + \"01\";\n end_date_time = new Date(parseInt(accounting_month.slice(0, 4)), parseInt(accounting_month.slice(4, 6)), 0);\n end_date = moment(end_date_time.getTime()).format('YYYYMMDD');\n db.modules.find().forEach(function(m) {\n var m_changelog;\n m_changelog = db.modules_changelogs.findOne({\n space: space_id,\n module: m.name,\n change_date: {\n $lte: end_date\n }\n }, {\n created: -1\n });\n if (!m_changelog) {\n\n } else if (m_changelog.change_date < start_date && m_changelog.operation === \"install\") {\n return modules.push(m);\n } else if (m_changelog.change_date < start_date && m_changelog.operation === \"uninstall\") {\n\n } else if (m_changelog.change_date >= start_date) {\n return modules.push(m);\n }\n });\n return modules;\n};\n\nbillingManager.get_modules_name = function() {\n var modules_name;\n modules_name = new Array;\n db.modules.find().forEach(function(m) {\n return modules_name.push(m.name);\n });\n return modules_name;\n};\n\nbillingManager.caculate_by_accounting_month = function(accounting_month, space_id) {\n var a_m, accounting_date, accounting_date_format, b_m, b_m_d, balance, debits, modules, modules_name, newest_bill, period_result, remaining_months, user_count;\n if (accounting_month > (moment().format('YYYYMM'))) {\n return;\n }\n if (accounting_month === (moment().format('YYYYMM'))) {\n billingManager.recaculateBalance(accounting_month, space_id);\n debits = 0;\n modules_name = billingManager.get_modules_name();\n b_m_d = new Date(parseInt(accounting_month.slice(0, 4)), parseInt(accounting_month.slice(4, 6)), 0);\n b_m = moment(b_m_d.getTime() - (b_m_d.getDate() * 24 * 60 * 60 * 1000)).format(\"YYYYMMDD\");\n db.billings.find({\n billing_date: b_m,\n space: space_id,\n transaction: {\n $in: modules_name\n }\n }).forEach(function(b) {\n return debits += b.debits;\n });\n newest_bill = db.billings.findOne({\n space: space_id\n }, {\n sort: {\n modified: -1\n }\n });\n balance = newest_bill.balance;\n remaining_months = 0;\n if (balance > 0) {\n if (debits > 0) {\n remaining_months = parseInt(balance / debits) + 1;\n } else {\n remaining_months = 1;\n }\n }\n return db.spaces.direct.update({\n _id: space_id\n }, {\n $set: {\n balance: balance,\n \"billing.remaining_months\": remaining_months\n }\n });\n } else {\n period_result = billingManager.get_accounting_period(space_id, accounting_month);\n if (period_result[\"count_days\"] === 0) {\n billingManager.recaculateBalance(accounting_month, space_id);\n } else {\n user_count = billingManager.getSpaceUserCount(space_id);\n modules_name = billingManager.get_modules_name();\n accounting_date = new Date(parseInt(accounting_month.slice(0, 4)), parseInt(accounting_month.slice(4, 6)), 0);\n accounting_date_format = moment(accounting_date).format(\"YYYYMMDD\");\n db.billings.remove({\n billing_date: accounting_date_format,\n space: space_id,\n transaction: {\n $in: modules_name\n }\n });\n billingManager.recaculateBalance(accounting_month, space_id);\n modules = billingManager.get_modules(space_id, accounting_month);\n if (modules && modules.length > 0) {\n _.each(modules, function(m) {\n return billingManager.get_balance(space_id, accounting_month, user_count, period_result[\"count_days\"], m.name, m.listprice);\n });\n }\n }\n a_m = moment(new Date(parseInt(accounting_month.slice(0, 4)), parseInt(accounting_month.slice(4, 6)), 1).getTime()).format(\"YYYYMM\");\n return billingManager.caculate_by_accounting_month(a_m, space_id);\n }\n};\n\nbillingManager.special_pay = function(space_id, module_names, total_fee, operator_id, end_date, user_count) {\n var m, modules, new_modules, now, r, space, space_update_obj;\n space = db.spaces.findOne(space_id);\n modules = space.modules || new Array;\n new_modules = _.difference(module_names, modules);\n m = moment();\n now = m._d;\n space_update_obj = new Object;\n if (space.is_paid !== true) {\n space_update_obj.is_paid = true;\n space_update_obj.start_date = new Date;\n }\n space_update_obj.modules = module_names;\n space_update_obj.modified = now;\n space_update_obj.modified_by = operator_id;\n space_update_obj.end_date = new Date(end_date);\n space_update_obj.user_limit = user_count;\n r = db.spaces.direct.update({\n _id: space_id\n }, {\n $set: space_update_obj\n });\n if (r) {\n _.each(new_modules, function(module) {\n var mcl;\n mcl = new Object;\n mcl._id = db.modules_changelogs._makeNewID();\n mcl.change_date = m.format(\"YYYYMMDD\");\n mcl.operator = operator_id;\n mcl.space = space_id;\n mcl.operation = \"install\";\n mcl.module = module;\n mcl.created = now;\n return db.modules_changelogs.insert(mcl);\n });\n }\n};\n","Meteor.startup(function () {\n\n if (Meteor.settings.cron && Meteor.settings.cron.statistics) {\n\n var schedule = require('node-schedule');\n // 定时执行统计\n var rule = Meteor.settings.cron.statistics;\n\n var go_next = true;\n\n schedule.scheduleJob(rule, Meteor.bindEnvironment(function () {\n if (!go_next)\n return;\n go_next = false;\n\n console.time('statistics');\n // 日期格式化 \n var dateFormat = function (date) {\n var datekey = \"\"+date.getFullYear()+\"-\"+(date.getMonth()+1)+\"-\"+(date.getDate());\n return datekey;\n };\n // 计算前一天时间\n var yesterDay = function () {\n var dNow = new Date(); //当前时间\n var dBefore = new Date(dNow.getTime() - 24*3600*1000); //得到前一天的时间\n return dBefore;\n };\n // 统计当日数据\n var dailyStaticsCount = function (collection, space) {\n var statics = collection.find({\"space\":space[\"_id\"],\"created\":{$gt: yesterDay()}});\n return statics.count();\n };\n // 查询总数\n var staticsCount = function (collection, space) {\n var statics = collection.find({\"space\": space[\"_id\"]});\n return statics.count();\n };\n // 查询拥有者名字\n var ownerName = function (collection, space) {\n var owner = collection.findOne({\"_id\": space[\"owner\"]});\n var name = owner.name;\n return name;\n };\n // 最近登录日期\n var lastLogon = function (collection, space) {\n var lastLogon = 0;\n var sUsers = db.space_users.find({\"space\": space[\"_id\"]}, {fields: {user: 1}}); \n sUsers.forEach(function (sUser) {\n var user = collection.findOne({\"_id\":sUser[\"user\"]});\n if(user && (lastLogon < user.last_logon)){\n lastLogon = user.last_logon;\n }\n })\n return lastLogon;\n };\n // 最近修改日期\n var lastModified = function (collection, space) {\n var obj = collection.find({\"space\": space[\"_id\"]}, {sort: {modified: -1}, limit: 1});\n var objArr = obj.fetch();\n if(objArr.length > 0)\n var mod = objArr[0].modified;\n return mod;\n };\n // 文章附件大小\n var postsAttachments = function (collection, space) {\n var attSize = 0;\n var sizeSum = 0;\n var posts = collection.find({\"space\": space[\"_id\"]});\n posts.forEach(function (post) {\n var atts = cfs.posts.find({\"post\":post[\"_id\"]});\n atts.forEach(function (att) {\n attSize = att.original.size;\n sizeSum += attSize;\n }) \n })\n return sizeSum;\n };\n // 当日新增附件大小\n var dailyPostsAttachments = function (collection, space) {\n var attSize = 0;\n var sizeSum = 0;\n var posts = collection.find({\"space\": space[\"_id\"]});\n posts.forEach(function (post) {\n var atts = cfs.posts.find({\"post\": post[\"_id\"], \"uploadedAt\": {$gt: yesterDay()}});\n atts.forEach(function (att) {\n attSize = att.original.size;\n sizeSum += attSize;\n })\n })\n return sizeSum;\n };\n // 插入数据\n db.spaces.find({\"is_paid\":true}).forEach(function (space) {\n db.steedos_statistics.insert({\n space: space[\"_id\"],\n space_name: space[\"name\"],\n balance: space[\"balance\"],\n owner_name: ownerName(db.users, space),\n created: new Date(),\n steedos:{\n users: staticsCount(db.space_users, space),\n organizations: staticsCount(db.organizations, space),\n last_logon: lastLogon(db.users, space)\n },\n workflow:{\n flows: staticsCount(db.flows, space),\n forms: staticsCount(db.forms, space),\n flow_roles: staticsCount(db.flow_roles, space),\n flow_positions: staticsCount(db.flow_positions, space),\n instances: staticsCount(db.instances, space),\n instances_last_modified: lastModified(db.instances, space),\n daily_flows: dailyStaticsCount(db.flows, space),\n daily_forms: dailyStaticsCount(db.forms, space),\n daily_instances: dailyStaticsCount(db.instances, space)\n },\n cms: {\n sites: staticsCount(db.cms_sites, space),\n posts: staticsCount(db.cms_posts, space),\n posts_last_modified: lastModified(db.cms_posts, space),\n posts_attachments_size: postsAttachments(db.cms_posts, space),\n comments: staticsCount(db.cms_comments, space),\n daily_sites: dailyStaticsCount(db.cms_sites, space),\n daily_posts: dailyStaticsCount(db.cms_posts, space),\n daily_comments: dailyStaticsCount(db.cms_comments, space),\n daily_posts_attachments_size: dailyPostsAttachments(db.cms_posts, space)\n }\n });\n });\n \n console.timeEnd('statistics');\n\n go_next = true;\n\n }, function (e) {\n console.log('Failed to bind environment: statistics.js');\n console.log(e.stack);\n }));\n\n }\n\n})\n\n\n\n\n","Meteor.startup ->\n Migrations.add\n version: 1\n name: '在线编辑时,需给文件增加lock 属性,防止多人同时编辑 #429, 附件页面使用cfs显示'\n up: ->\n console.time('upgrade_cfs_instance')\n try\n update_cfs_instance = (parent_id, space_id, instance_id, attach_version, isCurrent)->\n metadata = {parent: parent_id, owner: attach_version['created_by'], owner_name: attach_version['created_by_name'], space: space_id, instance: instance_id, approve: attach_version['approve']}\n if isCurrent\n metadata.current = true\n\n cfs.instances.update({_id: attach_version['_rev']}, {$set: {metadata: metadata}})\n i = 0\n db.instances.find({\"attachments.current\": {$exists: true}}, {sort: {modified: -1}, fields: {space: 1, attachments: 1}}).forEach (ins) ->\n attachs = ins.attachments\n space_id = ins.space\n instance_id = ins._id\n attachs.forEach (att)->\n current_ver = att.current\n parent_id = current_ver._rev\n update_cfs_instance(parent_id, space_id, instance_id, current_ver, true)\n\n if att.historys\n att.historys.forEach (his) ->\n update_cfs_instance(parent_id, space_id, instance_id, his, false)\n\n i++\n\n catch e\n console.error(e)\n\n console.timeEnd('upgrade_cfs_instance')\n down: ->\n console.log('version 1 down')","Meteor.startup(function() {\n return Migrations.add({\n version: 1,\n name: '在线编辑时,需给文件增加lock 属性,防止多人同时编辑 #429, 附件页面使用cfs显示',\n up: function() {\n var e, i, update_cfs_instance;\n console.time('upgrade_cfs_instance');\n try {\n update_cfs_instance = function(parent_id, space_id, instance_id, attach_version, isCurrent) {\n var metadata;\n metadata = {\n parent: parent_id,\n owner: attach_version['created_by'],\n owner_name: attach_version['created_by_name'],\n space: space_id,\n instance: instance_id,\n approve: attach_version['approve']\n };\n if (isCurrent) {\n metadata.current = true;\n }\n return cfs.instances.update({\n _id: attach_version['_rev']\n }, {\n $set: {\n metadata: metadata\n }\n });\n };\n i = 0;\n db.instances.find({\n \"attachments.current\": {\n $exists: true\n }\n }, {\n sort: {\n modified: -1\n },\n fields: {\n space: 1,\n attachments: 1\n }\n }).forEach(function(ins) {\n var attachs, instance_id, space_id;\n attachs = ins.attachments;\n space_id = ins.space;\n instance_id = ins._id;\n attachs.forEach(function(att) {\n var current_ver, parent_id;\n current_ver = att.current;\n parent_id = current_ver._rev;\n update_cfs_instance(parent_id, space_id, instance_id, current_ver, true);\n if (att.historys) {\n return att.historys.forEach(function(his) {\n return update_cfs_instance(parent_id, space_id, instance_id, his, false);\n });\n }\n });\n return i++;\n });\n } catch (error) {\n e = error;\n console.error(e);\n }\n return console.timeEnd('upgrade_cfs_instance');\n },\n down: function() {\n return console.log('version 1 down');\n }\n });\n});\n","Meteor.startup ->\n Migrations.add\n version: 2\n name: '组织结构允许一个人属于多个部门 #379'\n up: ->\n console.log 'version 2 up'\n console.time 'upgrade_space_user'\n try\n collection = db.space_users\n collection.find({organizations: {$exists: false}}, {fields: {organization: 1}}).forEach (su)->\n if su.organization\n collection.direct.update(su._id, {$set: {organizations: [su.organization]}})\n\n catch e\n console.error e\n\n console.timeEnd 'upgrade_space_user'\n down: ->\n console.log 'version 2 down'\n","Meteor.startup(function() {\n return Migrations.add({\n version: 2,\n name: '组织结构允许一个人属于多个部门 #379',\n up: function() {\n var collection, e;\n console.log('version 2 up');\n console.time('upgrade_space_user');\n try {\n collection = db.space_users;\n collection.find({\n organizations: {\n $exists: false\n }\n }, {\n fields: {\n organization: 1\n }\n }).forEach(function(su) {\n if (su.organization) {\n return collection.direct.update(su._id, {\n $set: {\n organizations: [su.organization]\n }\n });\n }\n });\n } catch (error) {\n e = error;\n console.error(e);\n }\n return console.timeEnd('upgrade_space_user');\n },\n down: function() {\n return console.log('version 2 down');\n }\n });\n});\n","Meteor.startup ->\n Migrations.add\n version: 3\n name: '给space_users表email字段赋值'\n up: ->\n console.log 'version 3 up'\n console.time 'upgrade_space_user_email'\n try\n collection = db.space_users\n collection.find({email: {$exists: false}}, {fields: {user: 1}}).forEach (su)->\n if su.user\n u = db.users.findOne({_id: su.user}, {fields: {emails: 1}})\n if u && u.emails && u.emails.length > 0\n if /^([A-Z0-9\\.\\-\\_\\+])*([A-Z0-9\\+\\-\\_])+\\@[A-Z0-9]+([\\-][A-Z0-9]+)*([\\.][A-Z0-9\\-]+){1,8}$/i.test(u.emails[0].address)\n address = u.emails[0].address\n collection.direct.update(su._id, {$set: {email: address}})\n \n\n catch e\n console.error e\n\n console.timeEnd 'upgrade_space_user_email'\n down: ->\n console.log 'version 3 down'\n","Meteor.startup(function() {\n return Migrations.add({\n version: 3,\n name: '给space_users表email字段赋值',\n up: function() {\n var collection, e;\n console.log('version 3 up');\n console.time('upgrade_space_user_email');\n try {\n collection = db.space_users;\n collection.find({\n email: {\n $exists: false\n }\n }, {\n fields: {\n user: 1\n }\n }).forEach(function(su) {\n var address, u;\n if (su.user) {\n u = db.users.findOne({\n _id: su.user\n }, {\n fields: {\n emails: 1\n }\n });\n if (u && u.emails && u.emails.length > 0) {\n if (/^([A-Z0-9\\.\\-\\_\\+])*([A-Z0-9\\+\\-\\_])+\\@[A-Z0-9]+([\\-][A-Z0-9]+)*([\\.][A-Z0-9\\-]+){1,8}$/i.test(u.emails[0].address)) {\n address = u.emails[0].address;\n return collection.direct.update(su._id, {\n $set: {\n email: address\n }\n });\n }\n }\n }\n });\n } catch (error) {\n e = error;\n console.error(e);\n }\n return console.timeEnd('upgrade_space_user_email');\n },\n down: function() {\n return console.log('version 3 down');\n }\n });\n});\n","Meteor.startup ->\n Migrations.add\n version: 4\n name: '给organizations表设置sort_no'\n up: ->\n console.log 'version 4 up'\n console.time 'upgrade_organizations_sort_no'\n try\n db.organizations.direct.update({sort_no: {$exists: false}}, {$set: {sort_no: 100}}, {multi: true})\n catch e\n console.error e\n\n console.timeEnd 'upgrade_organizations_sort_no'\n down: ->\n console.log 'version 4 down'\n","Meteor.startup(function() {\n return Migrations.add({\n version: 4,\n name: '给organizations表设置sort_no',\n up: function() {\n var e;\n console.log('version 4 up');\n console.time('upgrade_organizations_sort_no');\n try {\n db.organizations.direct.update({\n sort_no: {\n $exists: false\n }\n }, {\n $set: {\n sort_no: 100\n }\n }, {\n multi: true\n });\n } catch (error) {\n e = error;\n console.error(e);\n }\n return console.timeEnd('upgrade_organizations_sort_no');\n },\n down: function() {\n return console.log('version 4 down');\n }\n });\n});\n","Meteor.startup ->\n\tMigrations.add\n\t\tversion: 5\n\t\tname: '解决删除organization导致space_user数据错误的问题'\n\t\tup: ->\n\t\t\tconsole.log 'version 5 up'\n\t\t\tconsole.time 'fix_space_user_organizations'\n\t\t\ttry\n\n\t\t\t\tdb.space_users.find().forEach (su)->\n\t\t\t\t\tif not su.organizations\n\t\t\t\t\t\treturn\n\t\t\t\t\tif su.organizations.length is 1\n\t\t\t\t\t\tcheck_count = db.organizations.find(su.organizations[0]).count()\n\t\t\t\t\t\tif check_count is 0\n\t\t\t\t\t\t\troot_org = db.organizations.findOne({space: su.space, parent: null})\n\t\t\t\t\t\t\tif root_org\n\t\t\t\t\t\t\t\tr = db.space_users.direct.update({_id: su._id}, {$set: {organizations: [root_org._id], organization: root_org._id}})\n\t\t\t\t\t\t\t\tif r\n\t\t\t\t\t\t\t\t\troot_org.updateUsers()\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tconsole.error \"fix_space_user_organizations\"\n\t\t\t\t\t\t\t\tconsole.error su._id\n\t\t\t\t\telse if su.organizations.length > 1\n\t\t\t\t\t\tremoved_org_ids = []\n\t\t\t\t\t\tsu.organizations.forEach (o)->\n\t\t\t\t\t\t\tcheck_count = db.organizations.find(o).count()\n\t\t\t\t\t\t\tif check_count is 0\n\t\t\t\t\t\t\t\tremoved_org_ids.push(o)\n\t\t\t\t\t\tif removed_org_ids.length > 0\n\t\t\t\t\t\t\tnew_org_ids = _.difference(su.organizations, removed_org_ids)\n\t\t\t\t\t\t\tif new_org_ids.includes(su.organization)\n\t\t\t\t\t\t\t\tdb.space_users.direct.update({_id: su._id}, {$set: {organizations: new_org_ids}})\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tdb.space_users.direct.update({_id: su._id}, {$set: {organizations: new_org_ids, organization: new_org_ids[0]}})\n\n\t\t\tcatch e\n\t\t\t\tconsole.error \"fix_space_user_organizations\"\n\t\t\t\tconsole.error e.stack\n\n\t\t\tconsole.timeEnd 'fix_space_user_organizations'\n\t\tdown: ->\n\t\t\tconsole.log 'version 5 down'\n","Meteor.startup(function() {\n return Migrations.add({\n version: 5,\n name: '解决删除organization导致space_user数据错误的问题',\n up: function() {\n var e;\n console.log('version 5 up');\n console.time('fix_space_user_organizations');\n try {\n db.space_users.find().forEach(function(su) {\n var check_count, new_org_ids, r, removed_org_ids, root_org;\n if (!su.organizations) {\n return;\n }\n if (su.organizations.length === 1) {\n check_count = db.organizations.find(su.organizations[0]).count();\n if (check_count === 0) {\n root_org = db.organizations.findOne({\n space: su.space,\n parent: null\n });\n if (root_org) {\n r = db.space_users.direct.update({\n _id: su._id\n }, {\n $set: {\n organizations: [root_org._id],\n organization: root_org._id\n }\n });\n if (r) {\n return root_org.updateUsers();\n }\n } else {\n console.error(\"fix_space_user_organizations\");\n return console.error(su._id);\n }\n }\n } else if (su.organizations.length > 1) {\n removed_org_ids = [];\n su.organizations.forEach(function(o) {\n check_count = db.organizations.find(o).count();\n if (check_count === 0) {\n return removed_org_ids.push(o);\n }\n });\n if (removed_org_ids.length > 0) {\n new_org_ids = _.difference(su.organizations, removed_org_ids);\n if (new_org_ids.includes(su.organization)) {\n return db.space_users.direct.update({\n _id: su._id\n }, {\n $set: {\n organizations: new_org_ids\n }\n });\n } else {\n return db.space_users.direct.update({\n _id: su._id\n }, {\n $set: {\n organizations: new_org_ids,\n organization: new_org_ids[0]\n }\n });\n }\n }\n }\n });\n } catch (error) {\n e = error;\n console.error(\"fix_space_user_organizations\");\n console.error(e.stack);\n }\n return console.timeEnd('fix_space_user_organizations');\n },\n down: function() {\n return console.log('version 5 down');\n }\n });\n});\n","Meteor.startup ->\n\tMigrations.add\n\t\tversion: 6\n\t\tname: '财务系统升级'\n\t\tup: ->\n\t\t\tconsole.log 'version 6 up'\n\t\t\tconsole.time 'billing upgrade'\n\t\t\ttry\n\t\t\t\t# 清空modules表\n\t\t\t\tdb.modules.remove({})\n\n\t\t\t\tdb.modules.insert({\n\t\t\t\t\t\"_id\": \"workflow.standard\",\n\t\t\t\t\t\"name_en\": \"Workflow Standard\",\n\t\t\t\t\t\"name\": \"workflow.standard\",\n\t\t\t\t\t\"name_zh\": \"审批王基础版\",\n\t\t\t\t\t\"listprice\": 1.0,\n\t\t\t\t\t\"listprice_rmb\": 2\n\t\t\t\t})\n\n\t\t\t\tdb.modules.insert({\n\t\t\t\t\t\"_id\": \"workflow.professional\",\n\t\t\t\t\t\"name_en\": \"Workflow Professional\",\n\t\t\t\t\t\"name\": \"workflow.professional\",\n\t\t\t\t\t\"name_zh\": \"审批王专业版扩展包\",\n\t\t\t\t\t\"listprice\": 3.0,\n\t\t\t\t\t\"listprice_rmb\": 18\n\t\t\t\t})\n\n\t\t\t\tdb.modules.insert({\n\t\t\t\t\t\"_id\": \"workflow.enterprise\",\n\t\t\t\t\t\"name_en\": \"Workflow Enterprise\",\n\t\t\t\t\t\"name\": \"workflow.enterprise\",\n\t\t\t\t\t\"name_zh\": \"审批王企业版扩展包\",\n\t\t\t\t\t\"listprice\": 6.0,\n\t\t\t\t\t\"listprice_rmb\": 40\n\t\t\t\t})\n\n\n\t\t\t\tstart_date = new Date(moment(new Date).format(\"YYYY-MM-DD\"))\n\t\t\t\tdb.spaces.find({is_paid: true, user_limit: {$exists: false}, modules: {$exists: true}}).forEach (s)->\n\t\t\t\t\ttry\n\t\t\t\t\t\tset_obj = {}\n\t\t\t\t\t\tuser_count = db.space_users.find({space: s._id, user_accepted: true}).count()\n\t\t\t\t\t\tset_obj.user_limit = user_count\n\t\t\t\t\t\tbalance = s.balance\n\t\t\t\t\t\tif balance > 0\n\t\t\t\t\t\t\tmonths = 0\n\t\t\t\t\t\t\tlistprices = 0\n\t\t\t\t\t\t\t_.each s.modules, (pm)->\n\t\t\t\t\t\t\t\tmodule = db.modules.findOne({name: pm})\n\t\t\t\t\t\t\t\tif module and module.listprice\n\t\t\t\t\t\t\t\t\tlistprices += module.listprice\n\t\t\t\t\t\t\tmonths = parseInt((balance/(listprices*user_count)).toFixed()) + 1\n\t\t\t\t\t\t\tend_date = new Date\n\t\t\t\t\t\t\tend_date.setMonth(end_date.getMonth()+months)\n\t\t\t\t\t\t\tend_date = new Date(moment(end_date).format(\"YYYY-MM-DD\"))\n\t\t\t\t\t\t\tset_obj.start_date = start_date\n\t\t\t\t\t\t\tset_obj.end_date = end_date\n\n\t\t\t\t\t\telse if balance <= 0\n\t\t\t\t\t\t\tset_obj.start_date = start_date\n\t\t\t\t\t\t\tset_obj.end_date = new Date\n\n\t\t\t\t\t\ts.modules.push(\"workflow.standard\")\n\t\t\t\t\t\tset_obj.modules = _.uniq(s.modules)\n\t\t\t\t\t\tdb.spaces.direct.update({_id: s._id}, {$set: set_obj})\n\t\t\t\t\tcatch e\n\t\t\t\t\t\tconsole.error \"billing space upgrade\"\n\t\t\t\t\t\tconsole.error(s._id)\n\t\t\t\t\t\tconsole.error(set_obj)\n\t\t\t\t\t\tconsole.error e.stack\n\n\t\t\tcatch e\n\t\t\t\tconsole.error \"billing upgrade\"\n\t\t\t\tconsole.error e.stack\n\n\t\t\tconsole.timeEnd 'billing upgrade'\n\t\tdown: ->\n\t\t\tconsole.log 'version 6 down'\n","Meteor.startup(function() {\n return Migrations.add({\n version: 6,\n name: '财务系统升级',\n up: function() {\n var e, start_date;\n console.log('version 6 up');\n console.time('billing upgrade');\n try {\n db.modules.remove({});\n db.modules.insert({\n \"_id\": \"workflow.standard\",\n \"name_en\": \"Workflow Standard\",\n \"name\": \"workflow.standard\",\n \"name_zh\": \"审批王基础版\",\n \"listprice\": 1.0,\n \"listprice_rmb\": 2\n });\n db.modules.insert({\n \"_id\": \"workflow.professional\",\n \"name_en\": \"Workflow Professional\",\n \"name\": \"workflow.professional\",\n \"name_zh\": \"审批王专业版扩展包\",\n \"listprice\": 3.0,\n \"listprice_rmb\": 18\n });\n db.modules.insert({\n \"_id\": \"workflow.enterprise\",\n \"name_en\": \"Workflow Enterprise\",\n \"name\": \"workflow.enterprise\",\n \"name_zh\": \"审批王企业版扩展包\",\n \"listprice\": 6.0,\n \"listprice_rmb\": 40\n });\n start_date = new Date(moment(new Date).format(\"YYYY-MM-DD\"));\n db.spaces.find({\n is_paid: true,\n user_limit: {\n $exists: false\n },\n modules: {\n $exists: true\n }\n }).forEach(function(s) {\n var balance, e, end_date, listprices, months, set_obj, user_count;\n try {\n set_obj = {};\n user_count = db.space_users.find({\n space: s._id,\n user_accepted: true\n }).count();\n set_obj.user_limit = user_count;\n balance = s.balance;\n if (balance > 0) {\n months = 0;\n listprices = 0;\n _.each(s.modules, function(pm) {\n var module;\n module = db.modules.findOne({\n name: pm\n });\n if (module && module.listprice) {\n return listprices += module.listprice;\n }\n });\n months = parseInt((balance / (listprices * user_count)).toFixed()) + 1;\n end_date = new Date;\n end_date.setMonth(end_date.getMonth() + months);\n end_date = new Date(moment(end_date).format(\"YYYY-MM-DD\"));\n set_obj.start_date = start_date;\n set_obj.end_date = end_date;\n } else if (balance <= 0) {\n set_obj.start_date = start_date;\n set_obj.end_date = new Date;\n }\n s.modules.push(\"workflow.standard\");\n set_obj.modules = _.uniq(s.modules);\n return db.spaces.direct.update({\n _id: s._id\n }, {\n $set: set_obj\n });\n } catch (error) {\n e = error;\n console.error(\"billing space upgrade\");\n console.error(s._id);\n console.error(set_obj);\n return console.error(e.stack);\n }\n });\n } catch (error) {\n e = error;\n console.error(\"billing upgrade\");\n console.error(e.stack);\n }\n return console.timeEnd('billing upgrade');\n },\n down: function() {\n return console.log('version 6 down');\n }\n });\n});\n","Meteor.startup ()->\n rootURL = Meteor.absoluteUrl()\n if !Meteor.settings.public.webservices\n Meteor.settings.public.webservices = {\n \"creator\": {\n \"url\": rootURL\n }\n }\n\n if !Meteor.settings.public.webservices.creator\n Meteor.settings.public.webservices.creator = {\n \"url\": rootURL\n }\n\n if !Meteor.settings.public.webservices.creator.url\n Meteor.settings.public.webservices.creator.url = rootURL","Meteor.startup(function() {\n var rootURL;\n rootURL = Meteor.absoluteUrl();\n if (!Meteor.settings[\"public\"].webservices) {\n Meteor.settings[\"public\"].webservices = {\n \"creator\": {\n \"url\": rootURL\n }\n };\n }\n if (!Meteor.settings[\"public\"].webservices.creator) {\n Meteor.settings[\"public\"].webservices.creator = {\n \"url\": rootURL\n };\n }\n if (!Meteor.settings[\"public\"].webservices.creator.url) {\n return Meteor.settings[\"public\"].webservices.creator.url = rootURL;\n }\n});\n","if(process.env.CREATOR_NODE_ENV == 'development'){\n\t//Meteor 版本升级到1.9 及以上时(node 版本 11+),可以删除此代码\n\tObject.defineProperty(Array.prototype, 'flat', {\n\t\tvalue: function(depth = 1) {\n\t\t\treturn this.reduce(function (flat, toFlatten) {\n\t\t\t\treturn flat.concat((Array.isArray(toFlatten) && (depth>1)) ? toFlatten.flat(depth-1) : toFlatten);\n\t\t\t}, []);\n\t\t}\n\t});\n}","Meteor.startup ()->\n\tnew Tabular.Table\n\t\tname: \"customize_apps\",\n\t\tcollection: db.apps,\n\t\tcolumns: [\n\t\t\t{\n\t\t\t\tdata: \"name\"\n\t\t\t\torderable: false\n\t\t\t}\n\t\t]\n\t\tdom: \"tp\"\n\t\textraFields: [\"_id\", \"space\"]\n\t\tlengthChange: false\n\t\tordering: false\n\t\tpageLength: 10\n\t\tinfo: false\n\t\tsearching: true\n\t\tautoWidth: true\n\t\tchangeSelector: (selector, userId) ->\n\t\t\tunless userId\n\t\t\t\treturn {_id: -1}\n\t\t\tspace = selector.space\n\t\t\tunless space\n\t\t\t\tif selector?.$and?.length > 0\n\t\t\t\t\tspace = selector.$and.getProperty('space')[0]\n\t\t\tunless space\n\t\t\t\treturn {_id: -1}\n\t\t\treturn selector","Meteor.startup(function() {\n return new Tabular.Table({\n name: \"customize_apps\",\n collection: db.apps,\n columns: [\n {\n data: \"name\",\n orderable: false\n }\n ],\n dom: \"tp\",\n extraFields: [\"_id\", \"space\"],\n lengthChange: false,\n ordering: false,\n pageLength: 10,\n info: false,\n searching: true,\n autoWidth: true,\n changeSelector: function(selector, userId) {\n var ref, space;\n if (!userId) {\n return {\n _id: -1\n };\n }\n space = selector.space;\n if (!space) {\n if ((selector != null ? (ref = selector.$and) != null ? ref.length : void 0 : void 0) > 0) {\n space = selector.$and.getProperty('space')[0];\n }\n }\n if (!space) {\n return {\n _id: -1\n };\n }\n return selector;\n }\n });\n});\n"]} \ No newline at end of file diff --git a/server/bundle/programs/web.browser.legacy/af6e638983a3186dbfd9e5dcad3cb92aa43e0adc.js b/server/bundle/programs/web.browser.legacy/1ccf35654b7e0df3cc5f549d7dfa462dc025f52f.js similarity index 97% rename from server/bundle/programs/web.browser.legacy/af6e638983a3186dbfd9e5dcad3cb92aa43e0adc.js rename to server/bundle/programs/web.browser.legacy/1ccf35654b7e0df3cc5f549d7dfa462dc025f52f.js index 4c344be008..7943d2b154 100644 --- a/server/bundle/programs/web.browser.legacy/af6e638983a3186dbfd9e5dcad3cb92aa43e0adc.js +++ b/server/bundle/programs/web.browser.legacy/1ccf35654b7e0df3cc5f549d7dfa462dc025f52f.js @@ -102,7 +102,7 @@ object-assign * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ -"use strict"}}},"hoist-non-react-statics":{"package.json":function e(t,n,e){e.exports={name:"hoist-non-react-statics",version:"3.3.2",main:"dist/hoist-non-react-statics.cjs.js"}},dist:{"hoist-non-react-statics.cjs.js":function e(t,n,e){"use strict";var r=t("react-is"),o={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},a={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},s={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},l={};function c(e){return r.isMemo(e)?s:l[e.$$typeof]||o}l[r.ForwardRef]=i,l[r.Memo]=s;var u=Object.defineProperty,d=Object.getOwnPropertyNames,p=Object.getOwnPropertySymbols,f=Object.getOwnPropertyDescriptor,h=Object.getPrototypeOf,m=Object.prototype;function g(e,t,n){if("string"!=typeof t){if(m){var r=h(t);r&&r!==m&&g(e,r,n)}var o=d(t);p&&(o=o.concat(p(t)));for(var i=c(e),s=c(t),l=0;l.slds-dashboard-column-center{\n .slds-dashboard-cell-bottom-left{\n padding-right: 0.5rem;\n margin-top: 1rem;\n @media (max-width: 767px) {\n padding-right: 0;\n }\n }\n .slds-dashboard-cell-bottom-right{\n padding-left: 0.5rem;\n margin-top: 1rem;\n @media (max-width: 767px) {\n padding-left: 0;\n }\n }\n }\n &>.slds-dashboard-column-right{\n margin-left: 1rem;\n @media (max-width: 767px) {\n margin-left: 0;\n }\n }\n &>.slds-dashboard-column{\n @media (max-width: 767px) {\n &:not(:first-of-type){\n margin-top: 1rem;\n }\n }\n }\n .steedos-tabs-container+.slds-card{\n margin-top: 1rem;\n }\n .slds-card+.steedos-tabs-container{\n margin-top: 1rem;\n }\n .steedos-tabs-container+.steedos-tabs-container{\n margin-top: 1rem;\n }\n .steedos-tabs-container{\n .slds-tabs_default{\n border: 1px solid #dddbda;\n border-radius: .25rem;\n }\n .slds-tabs_default, .slds-tabs_scoped{\n box-shadow: 0 2px 2px 0 rgba(0,0,0,.1);\n &>.slds-tabs_default__content, &>.slds-tabs_scoped__content{\n &>.slds-card{\n border: none;\n box-shadow: none;\n margin: -1rem;\n &>.slds-card__header{\n display: none;\n }\n }\n }\n }\n .slds-tabs_default{\n &>.slds-tabs_default__content{\n &>.slds-card{\n margin: -1rem 0;\n }\n }\n }\n .slds-vertical-tabs{\n &.slds-tabs_default{\n overflow: unset;\n box-shadow: unset;\n border: none;\n .slds-tabs_default__nav, .slds-tabs_default__content{\n box-shadow: 0 2px 2px 0 rgba(0,0,0,.1);\n }\n &>.slds-tabs_default__content{\n &>.slds-card{\n margin: -1rem;\n }\n }\n }\n &.slds-tabs_scoped{\n box-shadow: 0 2px 2px 0 rgba(0,0,0,.1);\n }\n &.slds-tabs_default, &.slds-tabs_scoped{\n &>.slds-tabs_default__content, &>.slds-tabs_scoped__content{\n &>.slds-card{\n &>.slds-card__header{\n display: flex;\n }\n }\n }\n }\n }\n }\n"],["\n display: flex;\n flex: 1;\n flex-wrap: wrap;\n margin: 1rem;\n @media (max-width: 767px) {\n margin: 0rem;\n margin-bottom: 1rem;\n .slds-grid{\n .slds-card{\n border: none;\n border-radius: 0;\n }\n }\n }\n &>.slds-dashboard-column-center{\n .slds-dashboard-cell-bottom-left{\n padding-right: 0.5rem;\n margin-top: 1rem;\n @media (max-width: 767px) {\n padding-right: 0;\n }\n }\n .slds-dashboard-cell-bottom-right{\n padding-left: 0.5rem;\n margin-top: 1rem;\n @media (max-width: 767px) {\n padding-left: 0;\n }\n }\n }\n &>.slds-dashboard-column-right{\n margin-left: 1rem;\n @media (max-width: 767px) {\n margin-left: 0;\n }\n }\n &>.slds-dashboard-column{\n @media (max-width: 767px) {\n &:not(:first-of-type){\n margin-top: 1rem;\n }\n }\n }\n .steedos-tabs-container+.slds-card{\n margin-top: 1rem;\n }\n .slds-card+.steedos-tabs-container{\n margin-top: 1rem;\n }\n .steedos-tabs-container+.steedos-tabs-container{\n margin-top: 1rem;\n }\n .steedos-tabs-container{\n .slds-tabs_default{\n border: 1px solid #dddbda;\n border-radius: .25rem;\n }\n .slds-tabs_default, .slds-tabs_scoped{\n box-shadow: 0 2px 2px 0 rgba(0,0,0,.1);\n &>.slds-tabs_default__content, &>.slds-tabs_scoped__content{\n &>.slds-card{\n border: none;\n box-shadow: none;\n margin: -1rem;\n &>.slds-card__header{\n display: none;\n }\n }\n }\n }\n .slds-tabs_default{\n &>.slds-tabs_default__content{\n &>.slds-card{\n margin: -1rem 0;\n }\n }\n }\n .slds-vertical-tabs{\n &.slds-tabs_default{\n overflow: unset;\n box-shadow: unset;\n border: none;\n .slds-tabs_default__nav, .slds-tabs_default__content{\n box-shadow: 0 2px 2px 0 rgba(0,0,0,.1);\n }\n &>.slds-tabs_default__content{\n &>.slds-card{\n margin: -1rem;\n }\n }\n }\n &.slds-tabs_scoped{\n box-shadow: 0 2px 2px 0 rgba(0,0,0,.1);\n }\n &.slds-tabs_default, &.slds-tabs_scoped{\n &>.slds-tabs_default__content, &>.slds-tabs_scoped__content{\n &>.slds-card{\n &>.slds-card__header{\n display: flex;\n }\n }\n }\n }\n }\n }\n"]))),w=f.default.div(O||(O=r(["\n display: flex;\n flex: 1;\n flex-wrap: wrap;\n align-content: flex-start;\n &:nth-child(2){\n flex: 0 0 33%;\n @media (max-width: 767px) {\n flex: 0 0 100%;\n }\n }\n"],["\n display: flex;\n flex: 1;\n flex-wrap: wrap;\n align-content: flex-start;\n &:nth-child(2){\n flex: 0 0 33%;\n @media (max-width: 767px) {\n flex: 0 0 100%;\n }\n }\n"]))),x=f.default.div(E||(E=r(["\n flex: 0 0 100%;\n align-content: flex-start;\n &.flex-split{\n flex: 1;\n @media (max-width: 767px) {\n flex: 0 0 100%;\n }\n }\n .slds-card__body{\n min-height: 7.6rem;\n .slds-illustration.slds-illustration_small{\n .slds-illustration__svg{\n height: 8rem;\n margin-bottom: 0.4rem;\n margin: -0.8rem 0;\n }\n .slds-text-longform{\n p{\n margin-bottom: 0;\n }\n }\n }\n }\n .slds-card__footer{\n margin-top: 0px;\n }\n"],["\n flex: 0 0 100%;\n align-content: flex-start;\n &.flex-split{\n flex: 1;\n @media (max-width: 767px) {\n flex: 0 0 100%;\n }\n }\n .slds-card__body{\n min-height: 7.6rem;\n .slds-illustration.slds-illustration_small{\n .slds-illustration__svg{\n height: 8rem;\n margin-bottom: 0.4rem;\n margin: -0.8rem 0;\n }\n .slds-text-longform{\n p{\n margin-bottom: 0;\n }\n }\n }\n }\n .slds-card__footer{\n margin-top: 0px;\n }\n"]))),C=function(e){function t(t){var n=e.call(this,t)||this;return n.state={leftSection:n.props.leftSection,centerTopSection:n.props.centerTopSection,centerBottomLeftSection:n.props.centerBottomLeftSection,centerBottomRightSection:n.props.centerBottomRightSection,rightSection:n.props.rightSection},n}return o(t,e),t.prototype.componentDidMount=function(){var e=this.props.init;e&&e(this.props)},t.prototype.convertConfigItemToSection=function(e,t){var n=this;switch(e.type){case"apps":"RIGHT"===e.position&&(e.mobile=!0);var o=window.Creator,a=o&&o.getApp();return a&&a._id&&(e.ignoreApps||(e.ignoreApps=[]),e.ignoreApps.push(a._id)),d.createElement(g.default,i({key:t},e));case"object":return d.createElement(m.default,i({key:t},e));case"react":if("function"==typeof e.component)return d.createElement(d.Fragment,{key:t},e.component(e));if("string"==typeof e.component&&e.component.length)return d.createElement(v.default,{key:t,label:e.label,url:e.component,assistiveText:e.assistiveText});case"html":"string"==typeof e.html&&e.html.length||(e.html="");var s={__html:e.html},l=f.default.article(T||(T=r(["\n position: relative;\n padding: 0;\n background: #fff;\n border: 1px solid #dddbda;\n border-radius: .25rem;\n background-clip: padding-box;\n -webkit-box-shadow: 0 2px 2px 0 rgba(0,0,0,.1);\n box-shadow: 0 2px 2px 0 rgba(0,0,0,.1);\n .slds-card__body{\n padding: 0 1rem;\n min-height: auto;\n }\n "],["\n position: relative;\n padding: 0;\n background: #fff;\n border: 1px solid #dddbda;\n border-radius: .25rem;\n background-clip: padding-box;\n -webkit-box-shadow: 0 2px 2px 0 rgba(0,0,0,.1);\n box-shadow: 0 2px 2px 0 rgba(0,0,0,.1);\n .slds-card__body{\n padding: 0 1rem;\n min-height: auto;\n }\n "]))),c=f.default.article(M||(M=r(["\n .slds-card__body{\n padding: 0 1rem;\n min-height: auto;\n }\n "],["\n .slds-card__body{\n padding: 0 1rem;\n min-height: auto;\n }\n "])));return d.createElement(d.Fragment,{key:t},e.label?d.createElement(c,{className:"slds-card"},d.createElement("div",{className:"slds-card__header slds-grid"},d.createElement("div",{className:"slds-media slds-media_center slds-has-flexi-truncate"},d.createElement("div",{className:"slds-media__body"},d.createElement("h2",{className:"slds-text-heading_small slds-truncate",title:"{value.label}"},e.label))),d.createElement("div",{className:"slds-no-flex"})),d.createElement("div",{className:"slds-card__body",dangerouslySetInnerHTML:s})):d.createElement(l,{className:"slds-card",dangerouslySetInnerHTML:s}));case"instances_pendings":return d.createElement(y.WidgetInstancesPendings,i({key:t},e));case"announcements_week":return d.createElement(y.WidgetAnnouncementsWeek,i({key:t},e));case"tasks_today":return d.createElement(y.WidgetTasksToday,i({key:t},e));case"events_today":return d.createElement(y.WidgetEventsToday,i({key:t},e));case"tabs":return e.panels?d.createElement(_.Tabs,i({key:t},e),e.panels.map((function(r,o){r.assistiveText=Object.assign({},e.assistiveText&&e.assistiveText[r.type],r.assistiveText);var a=r.label;return a||(a=r.assistiveText.label),d.createElement(_.TabsPanel,{key:t+"_panel_"+o,label:a},n.convertConfigItemToSection(r,t+"_panel_content_"+o))}))):null}},t.prototype.convertConfigToSection=function(e,t){var n=this,r={},o,a=t&&t.widgets;return h.default.each(e,(function(e,t){switch(a&&(["instances_pendings","announcements_week","tasks_today","events_today"].indexOf(e.type)>-1?e.assistiveText=h.default.extend({},a.object,a[e.type],e.assistiveText):"tabs"===e.type?e.assistiveText=h.default.extend({},a,e.assistiveText):e.assistiveText=h.default.extend({},a[e.type],e.assistiveText)),e.position){case"LEFT":(o=n.convertConfigItemToSection(e,t))&&(r.leftSection||(r.leftSection=[]),r.leftSection.push(o));break;case"CENTER_TOP":(o=n.convertConfigItemToSection(e,t))&&(r.centerTopSection||(r.centerTopSection=[]),r.centerTopSection.push(o));break;case"CENTER_BOTTOM_LEFT":(o=n.convertConfigItemToSection(e,t))&&(r.centerBottomLeftSection||(r.centerBottomLeftSection=[]),r.centerBottomLeftSection.push(o));break;case"CENTER_BOTTOM_RIGHT":(o=n.convertConfigItemToSection(e,t))&&(r.centerBottomRightSection||(r.centerBottomRightSection=[]),r.centerBottomRightSection.push(o));break;case"RIGHT":(o=n.convertConfigItemToSection(e,t))&&(r.rightSection||(r.rightSection=[]),r.rightSection.push(o))}})),r},t.prototype.render=function(){var e=this.props,t=e.config,n=e.assistiveText,r={};t&&(r=this.convertConfigToSection(t,n));var o=i(i({},this.state),r),a=o.leftSection,s=o.centerTopSection,l=o.centerBottomLeftSection,c=o.centerBottomRightSection,u=o.rightSection;return d.createElement(b,{className:"slds-dashboard"},d.createElement(w,{className:"slds-dashboard-column slds-dashboard-column-center"},s?d.createElement(x,{className:"slds-dashboard-cell slds-dashboard-cell-center-top"},d.createElement("div",{className:"slds-grid slds-grid_vertical"},s)):null,l?d.createElement(x,{className:"slds-dashboard-cell flex-split slds-dashboard-cell-bottom-left"},d.createElement("div",{className:"slds-grid slds-grid_vertical"},l)):null,c?d.createElement(x,{className:"slds-dashboard-cell flex-split slds-dashboard-cell-bottom-right"},d.createElement("div",{className:"slds-grid slds-grid_vertical"},c)):null),d.createElement(w,{className:"slds-dashboard-column slds-dashboard-column-right"},u?d.createElement(x,{className:"slds-dashboard-cell"},d.createElement("div",{className:"slds-grid slds-grid_vertical"},u)):null))},t.defaultProps={leftSection:null,centerTopSection:d.createElement(g.default,null),centerBottomLeftSection:null,centerBottomRightSection:null,rightSection:null},t.propTypes={config:p.default.oneOfType([p.default.object,p.default.array]),leftSection:p.default.node,centerTopSection:p.default.node,centerBottomLeftSection:p.default.node,centerBottomRightSection:p.default.node,rightSection:p.default.node,assistiveText:p.default.shape({widgets:p.default.object})},t.displayName="Dashboard",t}(d.Component),S,O,E,T,M;n.default=C}},widget_object:{"index.js":function e(t,n){"use strict";var r=this&&this.__assign||function(){return(r=Object.assign||function(e){for(var t,n=1,r=arguments.length;n.slds-grid_vertical{\n\t\t/*fix IE11 宽度在门户界面会跳出widget范围*/\n\t\twidth: 100%;\n\t\t/*fix IE11 grid列表顶部th列标题栏文字高度没有居中对齐*/\n\t\t.slds-table_header-fixed{\n\t\t\t.slds-cell-fixed{\n\t\t\t\t.slds-p-horizontal_x-small{\n\t\t\t\t\tline-height: 2rem!important\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t.slds-illustration.slds-illustration_small .slds-illustration__svg {\n\t\t/*fix IE11 高度未定义会造成footer有内容时底部界面错乱*/\n\t\theight: 10rem;\n\t}\n"],["\n\theight: 100%;\n\t&.slds-grid-no-header{\n\t\t.slds-table thead{\n\t\t\tdisplay: none;\n\t\t}\n\t}\n\t&>.slds-grid_vertical{\n\t\t/*fix IE11 宽度在门户界面会跳出widget范围*/\n\t\twidth: 100%;\n\t\t/*fix IE11 grid列表顶部th列标题栏文字高度没有居中对齐*/\n\t\t.slds-table_header-fixed{\n\t\t\t.slds-cell-fixed{\n\t\t\t\t.slds-p-horizontal_x-small{\n\t\t\t\t\tline-height: 2rem!important\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t.slds-illustration.slds-illustration_small .slds-illustration__svg {\n\t\t/*fix IE11 高度未定义会造成footer有内容时底部界面错乱*/\n\t\theight: 10rem;\n\t}\n"]))),C=function(e){var t,n;return n="KB",(t=e/1024)>1024&&(t/=1024,n="MB"),t>1024&&(t/=1024,n="GB"),t.toFixed(2)+n},S=function(e){var t=e.children,n=s(e,["children"]),r=n.field,o=r.onClick,a=r.format;if(d.default.isFunction(a)&&(t=a(t,n.item,n.options)),t||d.default.isBoolean(t))switch(r.type){case"datetime":if(d.default.isString(t)&&/\d+Z$/.test(t))t=y.default(t).format("YYYY-MM-DD H:mm");else{var l=y.default().utcOffset()/60;t=y.default(t).add(l,"hours").format("YYYY-MM-DD H:mm")}break;case"date":t=d.default.isString(t)&&/\d+Z$/.test(t)?y.default.utc(t).format("YYYY-MM-DD"):y.default(t).format("YYYY-MM-DD");break;case"boolean":t=t?"是":"否";break;case"lookup":case"master_detail":t=t._NAME_FIELD_VALUE;break;case"filesize":t=C(t);break;case"markdown":t=u.default.createElement("div",{dangerouslySetInnerHTML:{__html:w(t)}})}if(d.default.isFunction(o))return u.default.createElement(p.DataTableCell,i({title:t},n),u.default.createElement("a",{onClick:function(e){e.preventDefault(),o(e,n.item)}},t));var c="string"==typeof t?t:"";return u.default.createElement(p.DataTableCell,i({title:c},n),t)};S.displayName=p.DataTableCell.displayName;var O=function(e){var t=e.children,n=s(e,["children"]);return u.default.createElement(p.DataTableCell,i({},n),u.default.createElement(p.Icon,{category:n.category,name:n.name,size:n.size}))};O.displayName=p.DataTableCell.displayName;var E=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.state={items:t.props.rows,selection:t.props.selection},t.isEnableSearch=function(){var e;return t.props.enableSearch||!1},t.getObjectName=function(){var e;return t.props.objectName},t.handleChanged=function(e,n){t.setState({selection:n.selection}),console.log(e,n)},t.handleRowAction=function(e,t){console.log(e,t)},t.handleSort=function(e){for(var n,r=[],o=1;ot[a]&&(n=1),e[a]"}});var I=function(t,n){return m.createGridAction("requestRemoveSelectedOption",n.selection,e.props)},j=function(t,n){var r={};return L&&(r.count=!0,r.currentPage=0),m.createGridAction("search",n.value,Object.assign({},e.props,r))},N=function(){return e.isEnableSearch()?u.default.createElement("div",{className:"slds-p-vertical_x-small slds-p-horizontal_x-small slds-shrink-none slds-theme_shade"},u.default.createElement(f.default,{isOpen:!1,id:v,objectName:l,search:c,selectionLabel:a,onRequestRemoveSelectedOption:I,onSearch:j})):null},F=n||this.state.items,z,B=!this.props.loading&&0===F.length,H=this.getDataTableEmpty(B),V=[];y&&V.push("slds-grid-no-header");var G=V.length?V.join(" "):"";return u.default.createElement(x,{className:"slds-grid slds-nowrap "+G},u.default.createElement("div",{className:"slds-col slds-grid slds-grid_vertical slds-nowrap"},u.default.createElement(N,null),E&&u.default.createElement(h.default,{columns:g,objectName:l,gridProps:this.props}),B?u.default.createElement(H,null):u.default.createElement(u.default.Fragment,null,u.default.createElement(p.DataTable,{assistiveText:{actionsHeader:"actions",columnSort:"sort this column",columnSortedAscending:"asc",columnSortedDescending:"desc",selectAllRows:"all rows",selectRow:"Select this row"},unborderedRow:_,sort:w,fixedHeader:!y,fixedLayout:!0,items:F,id:v,onRowChange:r||this.handleChanged,selection:o||this.state.selection,selectRows:s},R),L&&D>1?u.default.createElement(b.default,{total:D,current:P,visiblePages:L.visiblePages,onPageChanged:M,titles:L.titles}):null)))},t.displayName="SteedosDataTable",t.defaultProps={rows:[],selection:[],selectRows:!1,type:"text",noHeader:!1,unborderedRow:!1,enableFilters:!1},t.propTypes={objectName:g.default.string.isRequired,columns:g.default.arrayOf(g.default.shape({field:g.default.string.isRequired,label:g.default.string.isRequired,width:g.default.string,hidden:g.default.bool,onClick:g.default.func,format:g.default.func})).isRequired,enableSearch:g.default.bool,enableFilters:g.default.bool,pageSize:g.default.number,searchMode:g.default.oneOf(["omitFilters"]),selectionLabel:g.default.oneOfType([g.default.string,g.default.func]),selectRows:g.default.oneOf(["radio","checkbox",!1]),type:g.default.oneOf(["date","datetime","boolean","lookup","master_detail","text"]),id:g.default.string,illustration:g.default.shape({heading:g.default.string,messageBody:g.default.string,name:g.default.string,path:g.default.string}),noHeader:g.default.bool,unborderedRow:g.default.bool,sort:g.default.oneOfType([g.default.string,g.default.array]),rowIcon:g.default.shape({width:g.default.string,category:g.default.string,name:g.default.string,size:g.default.string}),baseFilters:g.default.array,spaceId:g.default.string,keep:g.default.bool,pager:g.default.oneOfType([g.default.shape({visiblePages:g.default.number,titles:g.default.shape({first:g.default.string,prev:g.default.string,prevSet:g.default.string,nextSet:g.default.string,next:g.default.string,last:g.default.string})}),g.default.bool])},t}(u.default.Component),T;n.default=E}},lookup:{"index.js":function e(t,n){"use strict";var r=this&&this.__assign||function(){return(r=Object.assign||function(e){for(var t,n=1,r=arguments.length;n0&&n.push("or"),n.push([t.field,"=",e.id])})),n},n.onSelect=function(e,t,r){var o=n.props,a=o.onSelect,i=o.gridProps,s=n.getGridFilters(t,r);if(a)return a("filters",s,i)},n.onRequestRemoveSelectedOption=function(e,t){var r=n.getGridFilters(t.selection,t.column),o=n.props.gridProps;return p.createGridAction("filters",r,o)},n.action=function(e){if("onSelect"===e)return n.onSelect},n}return o(t,e),t.prototype.render=function(){var e=this,t=this.props,n=t.objectName,r=t.columns,o=function(t){var r=[];return u.default.each(t,(function(t){t.enableFilter&&(t.reference_to||t.rows)&&r.push(s.default.createElement(d.default,{className:"filter-item",id:n+"_filter_"+t.field,key:n+"_filter_"+t.field,variant:g,objectName:t.reference_to,placeholderReadOnly:""+t.label,selectionLabel:"name",columns:m,column:t,action:e.action,multiple:!0,autoload:u.default.has(t,"reference_to")}))})),r};return s.default.createElement(f,{className:"slds-p-vertical_x-small slds-p-horizontal_x-small"},o(r))},t.propTypes={objectName:c.default.string.isRequired,columns:c.default.arrayOf(c.default.shape({field:c.default.string.isRequired,label:c.default.string.isRequired,width:c.default.string,hidden:c.default.bool,onClick:c.default.func,format:c.default.func})).isRequired},t}(s.default.Component),y;n.default=v}},pager:{"index.js":function e(t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(n,"__esModule",{value:!0});var o=r(t("./pager"));n.default=o.default},"pager.js":function e(t,n){"use strict";var r=this&&this.__extends||(o=function(e,t){return(o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)},function(e,t){function n(){this.constructor=e}o(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),o,a=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(n,"__esModule",{value:!0});var i=a(t("react")),s=a(t("prop-types")),l=0,c=1,u={first:"First",prev:"«",prevSet:"...",nextSet:"...",next:"»",last:"Last"},d=function(e){function t(t){var n=e.call(this,t)||this;return n.handleFirstPage=n.handleFirstPage.bind(n),n.handlePreviousPage=n.handlePreviousPage.bind(n),n.handleNextPage=n.handleNextPage.bind(n),n.handleLastPage=n.handleLastPage.bind(n),n.handleMorePrevPages=n.handleMorePrevPages.bind(n),n.handleMoreNextPages=n.handleMoreNextPages.bind(n),n.handlePageChanged=n.handlePageChanged.bind(n),n}return r(t,e),t.prototype.getTitles=function(e){return this.props.titles[e]||u[e]},t.prototype.calcBlocks=function(){var e=this.props,t=e.total,n=e.visiblePages,r=e.current+1,o,a;return{total:Math.ceil(t/n),current:Math.ceil(r/n)-1,size:n}},t.prototype.isPrevDisabled=function(){return this.props.current<=0},t.prototype.isNextDisabled=function(){return this.props.current>=this.props.total-1},t.prototype.isPrevMoreHidden=function(){var e=this.calcBlocks();return 1===e.total||0===e.current},t.prototype.isNextMoreHidden=function(){var e=this.calcBlocks();return 1===e.total||e.current===e.total-1},t.prototype.visibleRange=function(){var e=this.calcBlocks(),t=e.current*e.size,n=this.props.total-t,r;return[t+1,t+(n>e.size?e.size:n)+1]},t.prototype.handleFirstPage=function(){this.isPrevDisabled()||this.handlePageChanged(0)},t.prototype.handlePreviousPage=function(){this.isPrevDisabled()||this.handlePageChanged(this.props.current-1)},t.prototype.handleNextPage=function(){this.isNextDisabled()||this.handlePageChanged(this.props.current+1)},t.prototype.handleLastPage=function(){this.isNextDisabled()||this.handlePageChanged(this.props.total-1)},t.prototype.handleMorePrevPages=function(){var e=this.calcBlocks();this.handlePageChanged(e.current*e.size-1)},t.prototype.handleMoreNextPages=function(){var e=this.calcBlocks();this.handlePageChanged((e.current+1)*e.size)},t.prototype.handlePageChanged=function(e){var t=this.props.onPageChanged;t&&t(e)},t.prototype.renderPages=function(e){var t=this;return f(e[0],e[1]).map((function(e,n){var r=e-1,o=t.handlePageChanged.bind(t,r),a=t.props.current===r;return i.default.createElement(p,{key:n,index:n,isActive:a,className:"btn-numbered-page",onClick:o},e)}))},t.prototype.render=function(){var e=this.getTitles.bind(this),t="pagination";return this.props.className&&(t+=" "+this.props.className),i.default.createElement("nav",null,i.default.createElement("ul",{className:t},i.default.createElement(p,{className:"btn-first-page",key:"btn-first-page",isDisabled:this.isPrevDisabled(),onClick:this.handleFirstPage},e("first")),i.default.createElement(p,{className:"btn-prev-page",key:"btn-prev-page",isDisabled:this.isPrevDisabled(),onClick:this.handlePreviousPage},e("prev")),i.default.createElement(p,{className:"btn-prev-more",key:"btn-prev-more",isHidden:this.isPrevMoreHidden(),onClick:this.handleMorePrevPages},e("prevSet")),this.renderPages(this.visibleRange()),i.default.createElement(p,{className:"btn-next-more",key:"btn-next-more",isHidden:this.isNextMoreHidden(),onClick:this.handleMoreNextPages},e("nextSet")),i.default.createElement(p,{className:"btn-next-page",key:"btn-next-page",isDisabled:this.isNextDisabled(),onClick:this.handleNextPage},e("next")),i.default.createElement(p,{className:"btn-last-page",key:"btn-last-page",isDisabled:this.isNextDisabled(),onClick:this.handleLastPage},e("last"))))},t}(i.default.Component);d.propTypes={current:s.default.number,total:s.default.number.isRequired,visiblePages:s.default.number,titles:s.default.object,onPageChanged:s.default.func},d.defaultProps={current:0,visiblePages:3,titles:u};var p=function(e){if(e.isHidden)return null;var t,n=(e.className?e.className+" ":"")+(e.isActive?" active":"")+(e.isDisabled?" disabled":"");return i.default.createElement("li",{key:e.index,className:n},i.default.createElement("a",{onClick:e.onClick},e.children))};function f(e,t){for(var n=[],r=e;r div {\n display: none;\n }\n .slds-link{\n &>span{\n overflow: hidden;\n width: 100%;\n display: inline-block;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n }\n }\n }\n .slds-medium-size--1-of-3, .slds-medium-size_1-of-3 {\n width: 16%;\n @media (max-width: 1280px) {\n width: 20%;\n }\n @media (max-width: 1024px) {\n width: 20%;\n }\n @media (max-width: 767px) {\n width: 25%;\n }\n }\n &.slds-app-launcher__mobile{\n .slds-medium-size--1-of-3, .slds-medium-size_1-of-3 {\n width: 25%;\n @media (max-width: 1680px) {\n width: 33.33%;\n }\n @media (max-width: 1280px) {\n width: 50%;\n }\n @media (max-width: 960px) {\n width: 100%;\n }\n @media (max-width: 767px) {\n width: 33.3333%;\n }\n }\n }\n }\n"],["\n padding: 0px 1rem;\n .slds-section.slds-is-open{\n .slds-section__content{\n padding-top: 0px;\n }\n }\n .slds-section__title{\n display: none;\n }\n &.slds-app-launcher__show-all-items{\n .slds-section__title{\n display: block;\n }\n }\n .slds-link{\n color: #006dcc;\n text-decoration: none;\n transition: color .1s linear;\n background-color: transparent;\n cursor: pointer;\n &:hover, &:focus{\n text-decoration: underline;\n color: #005fb2;\n }\n }\n &.slds-app-launcher__mobile{\n .slds-medium-size--1-of-3, .slds-medium-size_1-of-3{\n width: 100%;\n }\n }\n &.slds-app-launcher__mini{\n .slds-app-launcher__tile{\n flex-direction: column;\n .slds-app-launcher__tile-figure{\n justify-content: center;\n padding-bottom: 0;\n flex-direction: row;\n }\n .slds-app-launcher__tile-body{\n text-align: center;\n background: #fff;\n &> div {\n display: none;\n }\n .slds-link{\n &>span{\n overflow: hidden;\n width: 100%;\n display: inline-block;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n }\n }\n }\n .slds-medium-size--1-of-3, .slds-medium-size_1-of-3 {\n width: 16%;\n @media (max-width: 1280px) {\n width: 20%;\n }\n @media (max-width: 1024px) {\n width: 20%;\n }\n @media (max-width: 767px) {\n width: 25%;\n }\n }\n &.slds-app-launcher__mobile{\n .slds-medium-size--1-of-3, .slds-medium-size_1-of-3 {\n width: 25%;\n @media (max-width: 1680px) {\n width: 33.33%;\n }\n @media (max-width: 1280px) {\n width: 50%;\n }\n @media (max-width: 960px) {\n width: 100%;\n }\n @media (max-width: 767px) {\n width: 33.3333%;\n }\n }\n }\n }\n"]))),b=function(e){function t(t){var n=e.call(this,t)||this;return n.state={apps:[]},n}return o(t,e),t.prototype.componentDidMount=function(){var e=this.props.init;e&&e(this.props)},t.prototype.getAppUrl=function(e,t){var n="/app/"+e._id;return e.url&&(n=e.url),(n=g.getRelativeUrl(n)).indexOf("?")>-1?n+="&token="+t:n+="?token="+t,n},t.prototype.onTileClick=function(e,t,n,r){t&&window.Creator&&window.Creator.openApp&&window.Creator.openApp(t._id,e);var o=this.props.onTileClick;o&&o.call(this,e,t,n,r)},t.prototype.getAppCells=function(e){var t=this;if(e){var n=this.onTileClick,r=g.getCookie("X-Access-Token"),o=this;return h.default.map(e,(function(e,a){if(e&&e.label){var s=t.getAppUrl(e,r),l=e.is_new_window?"_blank":null;return d.createElement(v.AppLauncherTile,{assistiveText:{dragIconText:e.label},key:a,description:e.description,iconNode:d.createElement(m.Icon,{assistiveText:{label:e.label},category:"standard",name:e.icon_slds}),title:e.label,href:s,target:l,onClick:function(r){n.call(o,r,e,i({},t),a)},isDraggable:!1})}}))}return null},t.prototype.render=function(){var e=this.props,n=e.label,r=e.apps,o=e.mobile,a=e.showAllItems,i=e.ignoreApps,s=e.assistiveText,l=e.mini;i&&i.length&&(r=h.default.reject(r,(function(e){return i.indexOf(e._id)>-1}))),n||(n=s.label),s.tilesSectionLabel||(s.tilesSectionLabel=t.defaultProps.assistiveText.tilesSectionLabel),s.linksSectionLabel||(s.linksSectionLabel=t.defaultProps.assistiveText.linksSectionLabel);var c=this.getAppCells(r),u;return u=o?d.createElement(_,{className:y.default({"slds-app-launcher__mini":!0===l},"slds-app-launcher__content slds-app-launcher__mobile")},d.createElement(m.AppLauncherExpandableSection,{title:s.tilesSectionLabel},c)):d.createElement(_,{className:y.default({"slds-app-launcher__show-all-items":!0===a,"slds-app-launcher__mini":!0===l},"slds-app-launcher__content")},d.createElement(m.AppLauncherExpandableSection,{title:s.tilesSectionLabel},c)),d.createElement(m.Card,{heading:n},u)},t.defaultProps={mobile:!1,mini:!1,showAllItems:!1,assistiveText:{label:"应用",tilesSectionLabel:"所有应用",linksSectionLabel:"所有对象"}},t.propTypes={label:p.default.string,apps:p.default.array,mobile:p.default.bool,mini:p.default.bool,showAllItems:p.default.bool,ignoreApps:p.default.array,onTileClick:p.default.func,assistiveText:p.default.shape({label:p.default.string,tilesSectionLabel:p.default.string,linksSectionLabel:p.default.string})},t}(d.Component),w;n.default=b}},slds_app_launcher:{"index.js":function e(t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0});var r=t("./tile");Object.defineProperty(n,"AppLauncherTile",{enumerable:!0,get:function(){return r.default}})},"tile.js":function e(t,n){"use strict";var r=this&&this.__extends||(o=function(e,t){return(o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)},function(e,t){function n(){this.constructor=e}o(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),o,a=this&&this.__assign||function(){return(a=Object.assign||function(e){for(var t,n=1,r=arguments.length;n0&&a[a.length-1])&&(6===i[0]||2===i[0])){n=0;continue}if(3===i[0]&&(!a||i[1]>a[0]&&i[1].slds-grid_vertical{\n\t\t/*fix IE11 宽度在门户界面会跳出widget范围*/\n\t\twidth: 100%;\n\t\t/*fix IE11 grid列表顶部th列标题栏文字高度没有居中对齐*/\n\t\t.slds-table_header-fixed{\n\t\t\t.slds-cell-fixed{\n\t\t\t\t.slds-p-horizontal_x-small{\n\t\t\t\t\tline-height: 2rem!important\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t.slds-illustration.slds-illustration_small .slds-illustration__svg {\n\t\t/*fix IE11 高度未定义会造成footer有内容时底部界面错乱*/\n\t\theight: 10rem;\n\t}\n\t.steedos-list-footer{\n\t\tdisplay: flex;\n\t\tjustify-content: flex-end;\n\t\tpadding: 0.35rem 1rem 0.35rem 1rem;\n\t}\n"],["\n\tposition: relative;\n\theight: 100%;\n\t.slds-split-view__list-item-action{\n\t\tpadding: 0.6rem 1rem;\n\t\t.slds-text-heading_small{\n\t\t\t.slds-grid{\n\t\t\t\tcolor: #777;\n\t\t\t\tmargin-bottom: 0.35rem;\n\t\t\t\t&:first-child{\n\t\t\t\t\tcolor: #080707;\n\t\t\t\t\t.list-item-left-label{\n\t\t\t\t\t\tfont-weight: bold;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t&:last-child{\n\t\t\t\t\tmargin-bottom: 0;\n\t\t\t\t}\n\t\t\t\t.slds-text-body_regular{\n\t\t\t\t\tfont-size: unset;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t&.list-filtering{\n\t\t.list-filtering-bar{\n\t\t\theight: 2.5rem;\n\t\t\tline-height: 2.5rem;\n\t\t\tpadding: 0 1rem;\n\t\t\tborder-bottom: solid 1px #ddd;\n\t\t\t.slds-truncate{\n\t\t\t\tfont-size: 1rem;\n\t\t\t\tcolor: #666;\n\t\t\t}\n\t\t\t.slds-button{\n\t\t\t\tfloat: right;\n\t\t\t\theight: 2.5rem;\n\t\t\t\tline-height: 2.5rem;\n\t\t\t\tpadding: 0 0.5rem;\n\t\t\t\tmargin-right: -0.5rem;\n\t\t\t\t.slds-button__icon{\n\t\t\t\t\twidth: 1.25rem;\n\t\t\t\t\theight: 1.25rem;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t.pullable-container{\n\t\t\tmargin-top: 2.5rem;\n\t\t\tpadding-bottom: 2.5rem;\n\t\t}\n\t}\n\t&.slds-grid-no-header{\n\t\t.slds-table thead{\n\t\t\tdisplay: none;\n\t\t}\n\t}\n\t&>.slds-grid_vertical{\n\t\t/*fix IE11 宽度在门户界面会跳出widget范围*/\n\t\twidth: 100%;\n\t\t/*fix IE11 grid列表顶部th列标题栏文字高度没有居中对齐*/\n\t\t.slds-table_header-fixed{\n\t\t\t.slds-cell-fixed{\n\t\t\t\t.slds-p-horizontal_x-small{\n\t\t\t\t\tline-height: 2rem!important\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t.slds-illustration.slds-illustration_small .slds-illustration__svg {\n\t\t/*fix IE11 高度未定义会造成footer有内容时底部界面错乱*/\n\t\theight: 10rem;\n\t}\n\t.steedos-list-footer{\n\t\tdisplay: flex;\n\t\tjustify-content: flex-end;\n\t\tpadding: 0.35rem 1rem 0.35rem 1rem;\n\t}\n"]))),y=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.state={items:t.props.rows,selection:t.props.selection},t.isEnableSearch=function(){var e;return t.props.enableSearch||!1},t.getObjectName=function(){var e;return t.props.objectName},t.handleChanged=function(e,n){t.setState({selection:n.selection}),console.log(e,n)},t}return o(t,e),t.prototype.componentDidMount=function(){this.props.init&&this.props.init(this.props)},t.prototype.componentWillUnmount=function(){var e=this.props,t=e.keep,n=e.removeViewAction,r=e.id;t||n(r)},t.prototype.getDataTableEmpty=function(e){if(!e)return s.default.Fragment;var t;if(!this.props.showIllustration)return s.default.Fragment;var n=this.props.illustration;return n||(n={}),n.messageBody||(n.messageBody="没有可显示的项目"),n.path||(n.path=f.getRelativeUrl("/assets/images/illustrations/empty-state-no-results.svg#no-results")),function(){return s.default.createElement(c.Illustration,{heading:n.heading,messageBody:n.messageBody,name:n.name,path:n.path})}},t.prototype.getListOptions=function(e,t,n,r){var o=this,a;return e.map((function(e){var a=[],i=0,c={},u,d;return t.forEach((function(t){t.hidden||(d=l.default.reduce(t.field.split("."),(function(e,t){return e[t]}),e),u=s.default.createElement(g.default,{field:t,options:o.props,doc:e},d),t.is_wide?(0!==i&&a.push(c),(c={key:e._id+"_"+a.length+"_wide"}).label=u,i=0,a.push(c)):0===i?((c={key:e._id+"_"+a.length}).label=u,i++):(c.topRightText=u,i=0,a.push(c)))})),0!==i&&a.push(c),r&&"string"==typeof(n=e[r])&&(n={category:"standard",name:n}),{key:e._id,rows:a,rowIcon:n,content:e}}))},t.prototype.render=function(){var e=this,t=this.props,n=t.rows,r=t.handleChanged,o=t.selection,a=t.selectionLabel,i=t.selectRows,u=t.objectName,d=t.search,g=t.columns,y=t.id,_=t.noHeader,b=t.unborderedRow,w=t.sort,x=t.rowIcon,C=t.rowIconKey,S=t.pager,O=t.handlePageChanged,E=t.handleLoadMore,T=t.totalCount,M=t.pageSize,k=t.currentPage,$=t.showMoreLink,P=t.filteringText,R=t.resetFiltering,A=this.props.loading,D=n;k||(this.state.items=[]);var L=this.state.items;if(!A&&D.length){var I=this.getListOptions(D,g,x,C);L=l.default.union(this.state.items,I),this.state.items=L}var j=!A&&0===D.length,N=this.getDataTableEmpty(j),F=this.props.listItemHref?this.props.listItemHref:function(t){return f.getObjectRecordUrl(e.props.objectName,t.content._id)},z=this.props.moreLinkHref?this.props.moreLinkHref:function(e){return f.getObjectUrl(e.objectName)},B=Math.ceil(T/M),H=(k||0).slds-grid{\n\t\t\t.list-item-left-label{\n\t\t\t\tflex: 1;\n\t\t\t}\n\t\t\t.list-item-right-text{\n\t\t\t\tmargin-left: 1rem;\n\t\t\t\tmax-width: 50%;\n\t\t\t}\n\t\t}\n\t}\n"],["\n\tdisplay: flex;\n\talign-items: center;\n\t.slds-text-heading_small{\n\t\tflex: 1;\n\t\twidth: 100%;\n\t\t&>.slds-grid{\n\t\t\t.list-item-left-label{\n\t\t\t\tflex: 1;\n\t\t\t}\n\t\t\t.list-item-right-text{\n\t\t\t\tmargin-left: 1rem;\n\t\t\t\tmax-width: 50%;\n\t\t\t}\n\t\t}\n\t}\n"]))),f=function(e){var t=e.item;return a.default.createElement(p,{key:t.key},t.rowIcon?a.default.createElement("span",{className:"list-item-left-icon"},a.default.createElement(l.Icon,{category:t.rowIcon.category?t.rowIcon.category:"standard",name:t.rowIcon.name,size:t.rowIcon.size})):null,a.default.createElement("span",{className:s.default("slds-text-heading_small",t.rowIcon?"slds-m-left_medium":null)},t.rows?t.rows.map((function(e,t){return a.default.createElement("div",{className:"slds-grid slds-wrap",key:e.key},a.default.createElement("span",{className:s.default("slds-truncate list-item-left-label",0===t?"slds-text-body_regular slds-text-color_default":null),title:"string"==typeof e.label.props.children?e.label.props.children:null},e.label),e.topRightText?a.default.createElement("span",{className:"slds-truncate slds-col_bump-left list-item-right-text",title:"string"==typeof e.topRightText.props.children?e.topRightText.props.children:null},e.topRightText):null)})):a.default.createElement(a.default.Fragment,null,a.default.createElement("div",{className:"slds-grid slds-wrap"},a.default.createElement("span",{className:"slds-truncate slds-text-body_regular slds-text-color_default",title:t.label},t.label),a.default.createElement("span",{className:"slds-truncate slds-col_bump-left",title:t.topRightText},t.topRightText)),a.default.createElement("div",{className:"slds-grid slds-wrap"},a.default.createElement("span",{className:"slds-truncate",title:t.bottomLeftText},t.bottomLeftText),a.default.createElement("span",{className:"slds-truncate slds-col_bump-left",title:t.bottomLeftText},t.bottomRightText)))))},h;f.displayName=n.DISPLAY_NAME,f.propTypes=u,f.defaultProps=d,n.default=f},"list-item-with-content.js":function e(t,n){"use strict";var r=this&&this.__extends||(o=function(e,t){return(o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)},function(e,t){function n(){this.constructor=e}o(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),o,a=this&&this.__assign||function(){return(a=Object.assign||function(e){for(var t,n=1,r=arguments.length;n