jsforce2
Version:
Salesforce API Library for JavaScript
404 lines (373 loc) • 36.1 kB
JavaScript
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g=(g.jsforce||(g.jsforce = {}));g=(g.modules||(g.modules = {}));g=(g.api||(g.api = {}));g.Soap = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
/**
* @file Salesforce SOAP API
* @author Shinichi Tomita <shinichi.tomita@gmail.com>
*/
;
var _ = window.jsforce.require('lodash/core');
var jsforce = window.jsforce.require('./core');
var SOAP = window.jsforce.require('./soap');
/**
* API class for Partner SOAP call
*
* @class
* @param {Connection} conn - Connection
*/
var SoapApi = module.exports = function(conn) {
this._conn = conn;
};
/**
* Call SOAP Api (Partner) endpoint
* @private
*/
SoapApi.prototype._invoke = function(method, message, schema, callback) {
var soapEndpoint = new SOAP(this._conn, {
xmlns: "urn:partner.soap.sforce.com",
endpointUrl: this._conn.instanceUrl + "/services/Soap/u/" + this._conn.version
});
return soapEndpoint.invoke(method, message, { result: schema }).then(function(res) {
return res.result;
}).thenCall(callback);
};
/* */
var Schemas = {};
/**
* @typedef SoapApi~LeadConvert
* @prop {String} convertedStatus - Status of converted lead
* @prop {String} leadId - Lead record Id to convert
* @prop {String} [accountId] - Account record Id to assign the converted record
* @prop {String} [contactId] - Contact record Id to assign the converted record
* @prop {Boolean} [doNotCreateOpportunity] - True if you don't want to create a new opportunity
* @prop {String} [opportunityName] - Name of opportunity to create
* @prop {Boolean} [overwriteLeadSource] - True if overwriting lead source
* @prop {String} [ownerId] - Owner Id
* @prop {Boolean} [sendNotificationEmail] - True if send notification email
*/
/**
* @typedef SoapApi~LeadConvertResult
* @prop {String} leadId - Lead record Id to convert
* @prop {String} [accountId] - Account record Id of converted lead
* @prop {String} [contactId] - Contact record Id of converted lead
* @prop {String} [opportunityId] - Opportunity record Id created in conversion
* @prop {Boolean} success - True if successfully converted
* @prop {Array.<Object>} errors - Error
*/
/**
* Converts a Lead into an Account, Contact, or (optionally) an Opportunity.
*
* @param {SoapApi~LeadConvert|Array.<SoapApi~LeadConvert>} leadConverts
* @param {Callback.<SoapApi~LeadConvertResult|Array.<SoapApi~LeadConvertResult>>} [callback] - Callback function
* @returns {Promise.<SoapApi~LeadConvertResult|Array.<SoapApi~LeadConvertResult>>}
*/
SoapApi.prototype.convertLead = function(leadConverts, callback) {
var schema = _.isArray(leadConverts) ? [ Schemas.LeadConvertResult ] : Schemas.LeadConvertResult;
return this._invoke("convertLead", { leadConverts: leadConverts }, schema, callback);
};
Schemas.LeadConvertResult = {
success: 'boolean',
errors: [],
leadId: 'string',
accountId: 'string',
contactId: 'string',
opportunityId: 'string'
};
/**
* @typedef SoapApi~MergeRequest
* @prop {Object} masterRecord - The merge destination record
* @prop {Array.<String>} recordToMergeIds - Ids of records to merge
*/
/**
* @typedef SoapApi~MergeResult
* @prop {Boolean} success - True if successfully merged
* @prop {Array.<Object>} errors - Error
* @prop {String} id - ID of the master record
* @prop {Array.<String>} mergedRecordIds - ID of the records that were merged into the master record
* @prop {Array.<String>} updatedRelatedIds - ID of all related records that were moved (re-parented) as a result of the merge
*/
/**
* Merge up to three records into one
*
* @param {SoapApi~MergeRequest|Array.<SoapApi~MergeRequest>} mergeRequests
* @param {Callback.<SoapApi~MergeResult|Array.<SoapApi~MergeResult>>} [callback] - Callback function
* @returns {Promise.<SoapApi~MergeResult|Array.<SoapApi~MergeResult>>}
*/
SoapApi.prototype.merge = function(mergeRequests, callback) {
var schema = _.isArray(mergeRequests) ? [ Schemas.MergeResult ] : Schemas.MergeResult;
return this._invoke("merge", { mergeRequests: mergeRequests }, schema, callback);
};
Schemas.MergeResult = {
success: 'boolean',
errors: [],
id: 'string',
mergedRecordIds: ['string'],
updatedRelatedIds: ['string']
};
/**
* @typedef SoapApi~EmptyRecycleBinResult
* @prop {String} id - ID of an sObject that you attempted to delete from the Recycle Bin
* @prop {Boolean} success - Whether the call succeeded (true) or not (false) for this record
* @prop {Array.<Object>} errors - Errors
*/
/**
* Delete records from the recycle bin immediately
*
* @param {Array.<String>} ids - Record ids to empty from recycle bin
* @param {Callback.<Array.<SoapApi~EmptyRecycleBinResult>>} [callback] - Callback function
* @returns {Promise.<Array.<SoapApi~EmptyRecycleBinResult>>}
*/
SoapApi.prototype.emptyRecycleBin = function(ids, callback) {
return this._invoke("emptyRecycleBin", { ids: ids }, [ Schemas.EmptyRecycleBinResult ], callback);
};
Schemas.EmptyRecycleBinResult = {
id: 'string',
success: 'boolean',
errors: []
};
/**
* @typedef SoapApi~DescribeTabSetResult
* @prop {String} label - The display label for this standard or custom app
* @prop {String} logoUrl - A fully qualified URL to the logo image associated with the standard or custom app
* @prop {String} namespace - Namespace of application package
* @prop {Boolean} selected - If true, then this standard or custom app is the user’s currently selected app
* @prop {Array.<SoapApi~DescribeTab>} tabs - An array of tabs that are displayed for the specified standard app or custom app
*/
/**
* @typedef SoapApi~DescribeTab
* @prop {Array.<Object>} colors - Array of color information used for a tab
* @prop {Boolean} custom - true if this is a custom tab
* @prop {String} iconUrl - The URL for the main 32 x 32 pixel icon for a tab
* @prop {Array.<Object>} icons - Array of icon information used for a tab
* @prop {String} label - The display label for this tab
* @prop {String} miniIconUrl - The URL for the 16 x 16 pixel icon that represents a tab
* @prop {String} name - The API name of the tab
* @prop {String} sobjectName - The name of the sObject that is primarily displayed on this tab
* @prop {String} url - A fully qualified URL for viewing this tab
*/
/**
* Returns information about the standard and custom apps available to the logged-in user
*
* @param {Callback.<Array.<SoapApi~DescribeTabSetResult>>} [callback] - Callback function
* @returns {Promise.<Array.<SoapApi~DescribeTabSetResult>>}
*/
SoapApi.prototype.describeTabs = function(callback) {
return this._invoke("describeTabs", {}, [ Schemas.DescribeTabSetResult ], callback);
};
Schemas.DescribeTabSetResult = {
label: 'string',
logoUrl: 'string',
namespace: 'string',
selected: 'boolean',
tabs: [{
colors: [{
theme: 'string',
color: 'string',
context: 'string'
}],
iconUrl: 'string',
icons: [{
theme: 'string',
height: 'number',
width: 'number',
url: 'string',
contentType: 'string'
}],
label: 'string',
custom: 'boolean',
miniIconUrl: 'string',
name: 'string',
sobjectName: 'string',
url: 'string'
}]
};
/**
* Retrieves the current system timestamp (Coordinated Universal Time (UTC) time zone) from the API
*
* @typedef SoapApi~ServerTimestampResult
* @prop {String} timestamp - Timestamp
*/
/**
* @param {Callback.<SoapApi~ServerTimestampResult>} [callback] - Callback function
* @returns {Promise.<SoapApi~ServerTimestampResult>}
*/
SoapApi.prototype.getServerTimestamp = function(callback) {
return this._invoke("getServerTimestamp", {}, Schemas.GetServerTimestampResult, callback);
};
Schemas.GetServerTimestampResult = {
timestamp: 'string'
};
/**
* @typedef SoapApi~UserInfoResult
* @prop {Boolean} accessibilityMode
* @prop {String} currencySymbol
* @prop {Number} orgAttachmentFileSizeLimit
* @prop {String} orgDefaultCurrencyIsoCode
* @prop {String} orgDisallowHtmlAttachments
* @prop {Boolean} orgHasPersonAccounts
* @prop {String} organizationId
* @prop {Boolean} organizationMultiCurrency
* @prop {String} organizationName
* @prop {String} profileId
* @prop {String} roleId
* @prop {Number} sessionSecondsValid
* @prop {String} userDefaultCurrencyIsoCode
* @prop {String} userEmail
* @prop {String} userFullName
* @prop {String} userId
* @prop {String} userLanguage
* @prop {String} userLocale
* @prop {String} userName
* @prop {String} userTimeZone
* @prop {String} userType
* @prop {String} userUiSkin
*/
/**
* Retrieves personal information for the user associated with the current session
*
* @param {Callback.<SoapApi~UserInfoResult>} [callback] - Callback function
* @returns {Promise.<SoapApi~UserInfoResult>}
*/
SoapApi.prototype.getUserInfo = function(callback) {
return this._invoke("getUserInfo", {}, Schemas.GetUserInfoResult, callback);
};
Schemas.GetUserInfoResult = {
accessibilityMode: 'boolean',
currencySymbol: 'string',
orgAttachmentFileSizeLimit: 'number',
orgDefaultCurrencyIsoCode: 'string',
orgDisallowHtmlAttachments: 'boolean',
orgHasPersonAccounts: 'boolean',
organizationId: 'string',
organizationMultiCurrency: 'boolean',
organizationName: 'string',
profileId: 'string',
roleId: 'string',
sessionSecondsValid: 'number',
userDefaultCurrencyIsoCode: 'string',
userEmail: 'string',
userFullName: 'string',
userId: 'string',
userLanguage: 'string',
userLocale: 'string',
userName: 'string',
userTimeZone: 'string',
userType: 'string',
userUiSkin: 'string'
};
/**
* Sets the specified user’s password to the specified value
*
* @param {String} userId - User Id to set password
* @param {String} password - New password
* @param {Callback.<String>} [callback] - Callback function
* @returns {Promise.<String>}
*/
SoapApi.prototype.setPassword = function(userId, password, callback) {
return this._invoke("setPassword", { userId: userId, password: password }, callback);
};
/**
* @typedef SoapApi~ResetPasswordResult
* @prop {String} password
*/
/**
* Resets the specified user’s password
*
* @param {String} userId - User Id to set password
* @param {String} password - New password
* @param {Callback.<SoapApi~ResetPasswordResult>} [callback] - Callback function
* @returns {Promise.<SoapApi~ResetPasswordResult>}
*/
SoapApi.prototype.resetPassword = function(userId, callback) {
return this._invoke("resetPassword", { userId: userId }, callback);
};
/**
* Adds one or more new records to your organization’s data
*
* @param {Array.<Object>} sObjects - Records to insert
* @param {Callback.<SoapApi~SaveResult>} [callback] - Callback function
* @returns {Promise.<SoapApi~SaveResult>}
*/
SoapApi.prototype.create = function(sObjects, callback) {
var schema = _.isArray(sObjects) ? [ Schemas.SaveResult ] : Schemas.SaveResult;
var args = {
'@xmlns' : 'urn:partner.soap.sforce.com',
'@xmlns:ns1' : 'sobject.partner.soap.sforce.com',
'ns1:sObjects' : sObjects
};
return this._invoke("create", args, schema, callback);
};
/**
* Updates one or more existing records in your organization’s data.
*
* @param {Array.<Object>} sObjects - Records to update
* @param {Callback.<SoapApi~SaveResult>} [callback] - Callback function
* @returns {Promise.<SoapApi~SaveResult>}
*/
SoapApi.prototype.update = function(sObjects, callback) {
var schema = _.isArray(sObjects) ? [ Schemas.SaveResult ] : Schemas.SaveResult;
var args = {
'@xmlns' : 'urn:partner.soap.sforce.com',
'@xmlns:ns1' : 'sobject.partner.soap.sforce.com',
'ns1:sObjects' : sObjects
};
return this._invoke("update", args, schema, callback);
};
Schemas.SaveResult = {
success: 'boolean',
errors: [],
id: 'string'
};
/**
* Creates new records and updates existing records in your organization’s data.
*
* @param {Array.<Object>} sObjects - Records to upsert
* @param {Callback.<SoapApi~UpsertResult>} [callback] - Callback function
* @returns {Promise.<SoapApi~UpsertResult>}
*/
SoapApi.prototype.upsert = function(externalIdFieldName, sObjects, callback) {
var schema = _.isArray(sObjects) ? [ Schemas.UpsertResult ] : Schemas.UpsertResult;
var args = {
'@xmlns' : 'urn:partner.soap.sforce.com',
'@xmlns:ns1' : 'sobject.partner.soap.sforce.com',
'ns1:externalIDFieldName' : externalIdFieldName,
'ns1:sObjects' : sObjects
};
return this._invoke("upsert", args, schema, callback);
};
Schemas.UpsertResult = {
created: 'boolean',
success: 'boolean',
errors: [],
id: 'string'
};
/**
* Deletes one or more records from your organization’s data
*
* @param {Array.<Object>} ids - Id of records to delete
* @param {Callback.<SoapApi~DeleteResult>} [callback] - Callback function
* @returns {Promise.<SoapApi~DeleteResult>}
*/
SoapApi.prototype.delete = function(ids, callback) {
var schema = _.isArray(ids) ? [ Schemas.DeleteResult ] : Schemas.DeleteResult;
var args = {
'@xmlns' : 'urn:partner.soap.sforce.com',
'@xmlns:ns1' : 'sobject.partner.soap.sforce.com',
'ns1:ids' : ids
};
return this._invoke("delete", args, schema, callback);
};
Schemas.DeleteResult = {
success: 'boolean',
errors: [],
id: 'string'
};
/*--------------------------------------------*/
/*
* Register hook in connection instantiation for dynamically adding this API module features
*/
jsforce.on('connection:new', function(conn) {
conn.soap = new SoapApi(conn);
});
module.exports = SoapApi;
},{}]},{},[1])(1)
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJsaWIvYXBpL3NvYXAuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24oKXtmdW5jdGlvbiByKGUsbix0KXtmdW5jdGlvbiBvKGksZil7aWYoIW5baV0pe2lmKCFlW2ldKXt2YXIgYz1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFmJiZjKXJldHVybiBjKGksITApO2lmKHUpcmV0dXJuIHUoaSwhMCk7dmFyIGE9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitpK1wiJ1wiKTt0aHJvdyBhLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsYX12YXIgcD1uW2ldPXtleHBvcnRzOnt9fTtlW2ldWzBdLmNhbGwocC5leHBvcnRzLGZ1bmN0aW9uKHIpe3ZhciBuPWVbaV1bMV1bcl07cmV0dXJuIG8obnx8cil9LHAscC5leHBvcnRzLHIsZSxuLHQpfXJldHVybiBuW2ldLmV4cG9ydHN9Zm9yKHZhciB1PVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmUsaT0wO2k8dC5sZW5ndGg7aSsrKW8odFtpXSk7cmV0dXJuIG99cmV0dXJuIHJ9KSgpIiwiLyoqXG4gKiBAZmlsZSBTYWxlc2ZvcmNlIFNPQVAgQVBJXG4gKiBAYXV0aG9yIFNoaW5pY2hpIFRvbWl0YSA8c2hpbmljaGkudG9taXRhQGdtYWlsLmNvbT5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfID0gd2luZG93LmpzZm9yY2UucmVxdWlyZSgnbG9kYXNoL2NvcmUnKTtcbnZhciBqc2ZvcmNlID0gd2luZG93LmpzZm9yY2UucmVxdWlyZSgnLi9jb3JlJyk7XG52YXIgU09BUCA9IHdpbmRvdy5qc2ZvcmNlLnJlcXVpcmUoJy4vc29hcCcpO1xuXG4vKipcbiAqIEFQSSBjbGFzcyBmb3IgUGFydG5lciBTT0FQIGNhbGxcbiAqXG4gKiBAY2xhc3NcbiAqIEBwYXJhbSB7Q29ubmVjdGlvbn0gY29ubiAtIENvbm5lY3Rpb25cbiAqL1xudmFyIFNvYXBBcGkgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGNvbm4pIHtcbiAgdGhpcy5fY29ubiA9IGNvbm47XG59O1xuXG4vKipcbiAqIENhbGwgU09BUCBBcGkgKFBhcnRuZXIpIGVuZHBvaW50XG4gKiBAcHJpdmF0ZVxuICovXG5Tb2FwQXBpLnByb3RvdHlwZS5faW52b2tlID0gZnVuY3Rpb24obWV0aG9kLCBtZXNzYWdlLCBzY2hlbWEsIGNhbGxiYWNrKSB7XG4gIHZhciBzb2FwRW5kcG9pbnQgPSBuZXcgU09BUCh0aGlzLl9jb25uLCB7XG4gICAgeG1sbnM6IFwidXJuOnBhcnRuZXIuc29hcC5zZm9yY2UuY29tXCIsXG4gICAgZW5kcG9pbnRVcmw6IHRoaXMuX2Nvbm4uaW5zdGFuY2VVcmwgKyBcIi9zZXJ2aWNlcy9Tb2FwL3UvXCIgKyB0aGlzLl9jb25uLnZlcnNpb25cbiAgfSk7XG4gIHJldHVybiBzb2FwRW5kcG9pbnQuaW52b2tlKG1ldGhvZCwgbWVzc2FnZSwgeyByZXN1bHQ6IHNjaGVtYSB9KS50aGVuKGZ1bmN0aW9uKHJlcykge1xuICAgIHJldHVybiByZXMucmVzdWx0O1xuICB9KS50aGVuQ2FsbChjYWxsYmFjayk7XG59O1xuXG5cbi8qICovXG52YXIgU2NoZW1hcyA9IHt9O1xuXG4vKipcbiAqIEB0eXBlZGVmIFNvYXBBcGl+TGVhZENvbnZlcnRcbiAqIEBwcm9wIHtTdHJpbmd9IGNvbnZlcnRlZFN0YXR1cyAtIFN0YXR1cyBvZiBjb252ZXJ0ZWQgbGVhZFxuICogQHByb3Age1N0cmluZ30gbGVhZElkIC0gTGVhZCByZWNvcmQgSWQgdG8gY29udmVydFxuICogQHByb3Age1N0cmluZ30gW2FjY291bnRJZF0gLSBBY2NvdW50IHJlY29yZCBJZCB0byBhc3NpZ24gdGhlIGNvbnZlcnRlZCByZWNvcmRcbiAqIEBwcm9wIHtTdHJpbmd9IFtjb250YWN0SWRdIC0gQ29udGFjdCByZWNvcmQgSWQgdG8gYXNzaWduIHRoZSBjb252ZXJ0ZWQgcmVjb3JkXG4gKiBAcHJvcCB7Qm9vbGVhbn0gW2RvTm90Q3JlYXRlT3Bwb3J0dW5pdHldIC0gVHJ1ZSBpZiB5b3UgZG9uJ3Qgd2FudCB0byBjcmVhdGUgYSBuZXcgb3Bwb3J0dW5pdHlcbiAqIEBwcm9wIHtTdHJpbmd9IFtvcHBvcnR1bml0eU5hbWVdIC0gTmFtZSBvZiBvcHBvcnR1bml0eSB0byBjcmVhdGVcbiAqIEBwcm9wIHtCb29sZWFufSBbb3ZlcndyaXRlTGVhZFNvdXJjZV0gLSBUcnVlIGlmIG92ZXJ3cml0aW5nIGxlYWQgc291cmNlXG4gKiBAcHJvcCB7U3RyaW5nfSBbb3duZXJJZF0gLSBPd25lciBJZFxuICogQHByb3Age0Jvb2xlYW59IFtzZW5kTm90aWZpY2F0aW9uRW1haWxdIC0gVHJ1ZSBpZiBzZW5kIG5vdGlmaWNhdGlvbiBlbWFpbFxuICovXG4vKipcbiAqIEB0eXBlZGVmIFNvYXBBcGl+TGVhZENvbnZlcnRSZXN1bHRcbiAqIEBwcm9wIHtTdHJpbmd9IGxlYWRJZCAtIExlYWQgcmVjb3JkIElkIHRvIGNvbnZlcnRcbiAqIEBwcm9wIHtTdHJpbmd9IFthY2NvdW50SWRdIC0gQWNjb3VudCByZWNvcmQgSWQgb2YgY29udmVydGVkIGxlYWRcbiAqIEBwcm9wIHtTdHJpbmd9IFtjb250YWN0SWRdIC0gQ29udGFjdCByZWNvcmQgSWQgb2YgY29udmVydGVkIGxlYWRcbiAqIEBwcm9wIHtTdHJpbmd9IFtvcHBvcnR1bml0eUlkXSAtIE9wcG9ydHVuaXR5IHJlY29yZCBJZCBjcmVhdGVkIGluIGNvbnZlcnNpb25cbiAqIEBwcm9wIHtCb29sZWFufSBzdWNjZXNzIC0gVHJ1ZSBpZiBzdWNjZXNzZnVsbHkgY29udmVydGVkXG4gKiBAcHJvcCB7QXJyYXkuPE9iamVjdD59IGVycm9ycyAtIEVycm9yXG4gKi9cbi8qKlxuICogQ29udmVydHMgYSBMZWFkIGludG8gYW4gQWNjb3VudCwgQ29udGFjdCwgb3IgKG9wdGlvbmFsbHkpIGFuIE9wcG9ydHVuaXR5LlxuICpcbiAqIEBwYXJhbSB7U29hcEFwaX5MZWFkQ29udmVydHxBcnJheS48U29hcEFwaX5MZWFkQ29udmVydD59IGxlYWRDb252ZXJ0c1xuICogQHBhcmFtIHtDYWxsYmFjay48U29hcEFwaX5MZWFkQ29udmVydFJlc3VsdHxBcnJheS48U29hcEFwaX5MZWFkQ29udmVydFJlc3VsdD4+fSBbY2FsbGJhY2tdIC0gQ2FsbGJhY2sgZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtQcm9taXNlLjxTb2FwQXBpfkxlYWRDb252ZXJ0UmVzdWx0fEFycmF5LjxTb2FwQXBpfkxlYWRDb252ZXJ0UmVzdWx0Pj59XG4gKi9cblNvYXBBcGkucHJvdG90eXBlLmNvbnZlcnRMZWFkID0gZnVuY3Rpb24obGVhZENvbnZlcnRzLCBjYWxsYmFjaykge1xuICB2YXIgc2NoZW1hID0gXy5pc0FycmF5KGxlYWRDb252ZXJ0cykgPyBbIFNjaGVtYXMuTGVhZENvbnZlcnRSZXN1bHQgXSA6IFNjaGVtYXMuTGVhZENvbnZlcnRSZXN1bHQ7XG4gIHJldHVybiB0aGlzLl9pbnZva2UoXCJjb252ZXJ0TGVhZFwiLCB7IGxlYWRDb252ZXJ0czogbGVhZENvbnZlcnRzIH0sIHNjaGVtYSwgY2FsbGJhY2spO1xufTtcblNjaGVtYXMuTGVhZENvbnZlcnRSZXN1bHQgPSB7XG4gIHN1Y2Nlc3M6ICdib29sZWFuJyxcbiAgZXJyb3JzOiBbXSxcbiAgbGVhZElkOiAnc3RyaW5nJyxcbiAgYWNjb3VudElkOiAnc3RyaW5nJyxcbiAgY29udGFjdElkOiAnc3RyaW5nJyxcbiAgb3Bwb3J0dW5pdHlJZDogJ3N0cmluZydcbn07XG5cbi8qKlxuICogQHR5cGVkZWYgU29hcEFwaX5NZXJnZVJlcXVlc3RcbiAqIEBwcm9wIHtPYmplY3R9IG1hc3RlclJlY29yZCAtIFRoZSBtZXJnZSBkZXN0aW5hdGlvbiByZWNvcmRcbiAqIEBwcm9wIHtBcnJheS48U3RyaW5nPn0gcmVjb3JkVG9NZXJnZUlkcyAtIElkcyBvZiByZWNvcmRzIHRvIG1lcmdlXG4gKi9cbi8qKlxuICogQHR5cGVkZWYgU29hcEFwaX5NZXJnZVJlc3VsdFxuICogQHByb3Age0Jvb2xlYW59IHN1Y2Nlc3MgLSBUcnVlIGlmIHN1Y2Nlc3NmdWxseSBtZXJnZWRcbiAqIEBwcm9wIHtBcnJheS48T2JqZWN0Pn0gZXJyb3JzIC0gRXJyb3JcbiAqIEBwcm9wIHtTdHJpbmd9IGlkIC0gSUQgb2YgdGhlIG1hc3RlciByZWNvcmRcbiAqIEBwcm9wIHtBcnJheS48U3RyaW5nPn0gbWVyZ2VkUmVjb3JkSWRzIC0gSUQgb2YgdGhlIHJlY29yZHMgdGhhdCB3ZXJlIG1lcmdlZCBpbnRvIHRoZSBtYXN0ZXIgcmVjb3JkXG4gKiBAcHJvcCB7QXJyYXkuPFN0cmluZz59IHVwZGF0ZWRSZWxhdGVkSWRzIC0gSUQgb2YgYWxsIHJlbGF0ZWQgcmVjb3JkcyB0aGF0IHdlcmUgbW92ZWQgKHJlLXBhcmVudGVkKSBhcyBhIHJlc3VsdCBvZiB0aGUgbWVyZ2VcbiAqL1xuXG4vKipcbiAqIE1lcmdlIHVwIHRvIHRocmVlIHJlY29yZHMgaW50byBvbmVcbiAqXG4gKiBAcGFyYW0ge1NvYXBBcGl+TWVyZ2VSZXF1ZXN0fEFycmF5LjxTb2FwQXBpfk1lcmdlUmVxdWVzdD59IG1lcmdlUmVxdWVzdHNcbiAqIEBwYXJhbSB7Q2FsbGJhY2suPFNvYXBBcGl+TWVyZ2VSZXN1bHR8QXJyYXkuPFNvYXBBcGl+TWVyZ2VSZXN1bHQ+Pn0gW2NhbGxiYWNrXSAtIENhbGxiYWNrIGZ1bmN0aW9uXG4gKiBAcmV0dXJucyB7UHJvbWlzZS48U29hcEFwaX5NZXJnZVJlc3VsdHxBcnJheS48U29hcEFwaX5NZXJnZVJlc3VsdD4+fVxuICovXG5Tb2FwQXBpLnByb3RvdHlwZS5tZXJnZSA9IGZ1bmN0aW9uKG1lcmdlUmVxdWVzdHMsIGNhbGxiYWNrKSB7XG4gIHZhciBzY2hlbWEgPSBfLmlzQXJyYXkobWVyZ2VSZXF1ZXN0cykgPyBbIFNjaGVtYXMuTWVyZ2VSZXN1bHQgXSA6IFNjaGVtYXMuTWVyZ2VSZXN1bHQ7XG4gIHJldHVybiB0aGlzLl9pbnZva2UoXCJtZXJnZVwiLCB7IG1lcmdlUmVxdWVzdHM6IG1lcmdlUmVxdWVzdHMgfSwgc2NoZW1hLCBjYWxsYmFjayk7XG59O1xuU2NoZW1hcy5NZXJnZVJlc3VsdCA9IHtcbiAgc3VjY2VzczogJ2Jvb2xlYW4nLFxuICBlcnJvcnM6IFtdLFxuICBpZDogJ3N0cmluZycsXG4gIG1lcmdlZFJlY29yZElkczogWydzdHJpbmcnXSxcbiAgdXBkYXRlZFJlbGF0ZWRJZHM6IFsnc3RyaW5nJ11cbn07XG5cblxuLyoqXG4gKiBAdHlwZWRlZiBTb2FwQXBpfkVtcHR5UmVjeWNsZUJpblJlc3VsdFxuICogQHByb3Age1N0cmluZ30gaWQgLSBJRCBvZiBhbiBzT2JqZWN0IHRoYXQgeW91IGF0dGVtcHRlZCB0byBkZWxldGUgZnJvbSB0aGUgUmVjeWNsZSBCaW5cbiAqIEBwcm9wIHtCb29sZWFufSBzdWNjZXNzIC0gV2hldGhlciB0aGUgY2FsbCBzdWNjZWVkZWQgKHRydWUpIG9yIG5vdCAoZmFsc2UpIGZvciB0aGlzIHJlY29yZFxuICogQHByb3Age0FycmF5LjxPYmplY3Q+fSBlcnJvcnMgLSBFcnJvcnNcbiAqL1xuLyoqXG4gKiBEZWxldGUgcmVjb3JkcyBmcm9tIHRoZSByZWN5Y2xlIGJpbiBpbW1lZGlhdGVseVxuICpcbiAqIEBwYXJhbSB7QXJyYXkuPFN0cmluZz59IGlkcyAtIFJlY29yZCBpZHMgdG8gZW1wdHkgZnJvbSByZWN5Y2xlIGJpblxuICogQHBhcmFtIHtDYWxsYmFjay48QXJyYXkuPFNvYXBBcGl+RW1wdHlSZWN5Y2xlQmluUmVzdWx0Pj59IFtjYWxsYmFja10gLSBDYWxsYmFjayBmdW5jdGlvblxuICogQHJldHVybnMge1Byb21pc2UuPEFycmF5LjxTb2FwQXBpfkVtcHR5UmVjeWNsZUJpblJlc3VsdD4+fVxuICovXG5Tb2FwQXBpLnByb3RvdHlwZS5lbXB0eVJlY3ljbGVCaW4gPSBmdW5jdGlvbihpZHMsIGNhbGxiYWNrKSB7XG4gIHJldHVybiB0aGlzLl9pbnZva2UoXCJlbXB0eVJlY3ljbGVCaW5cIiwgeyBpZHM6IGlkcyB9LCBbIFNjaGVtYXMuRW1wdHlSZWN5Y2xlQmluUmVzdWx0IF0sIGNhbGxiYWNrKTtcbn07XG5TY2hlbWFzLkVtcHR5UmVjeWNsZUJpblJlc3VsdCA9IHtcbiAgaWQ6ICdzdHJpbmcnLFxuICBzdWNjZXNzOiAnYm9vbGVhbicsXG4gIGVycm9yczogW11cbn07XG5cblxuLyoqXG4gKiBAdHlwZWRlZiBTb2FwQXBpfkRlc2NyaWJlVGFiU2V0UmVzdWx0XG4gKiBAcHJvcCB7U3RyaW5nfSBsYWJlbCAtIFRoZSBkaXNwbGF5IGxhYmVsIGZvciB0aGlzIHN0YW5kYXJkIG9yIGN1c3RvbSBhcHBcbiAqIEBwcm9wIHtTdHJpbmd9IGxvZ29VcmwgLSBBIGZ1bGx5IHF1YWxpZmllZCBVUkwgdG8gdGhlIGxvZ28gaW1hZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdGFuZGFyZCBvciBjdXN0b20gYXBwXG4gKiBAcHJvcCB7U3RyaW5nfSBuYW1lc3BhY2UgLSBOYW1lc3BhY2Ugb2YgYXBwbGljYXRpb24gcGFja2FnZVxuICogQHByb3Age0Jvb2xlYW59IHNlbGVjdGVkIC0gSWYgdHJ1ZSwgdGhlbiB0aGlzIHN0YW5kYXJkIG9yIGN1c3RvbSBhcHAgaXMgdGhlIHVzZXLigJlzIGN1cnJlbnRseSBzZWxlY3RlZCBhcHBcbiAqIEBwcm9wIHtBcnJheS48U29hcEFwaX5EZXNjcmliZVRhYj59IHRhYnMgLSBBbiBhcnJheSBvZiB0YWJzIHRoYXQgYXJlIGRpc3BsYXllZCBmb3IgdGhlIHNwZWNpZmllZCBzdGFuZGFyZCBhcHAgb3IgY3VzdG9tIGFwcFxuICovXG4vKipcbiAqIEB0eXBlZGVmIFNvYXBBcGl+RGVzY3JpYmVUYWJcbiAqIEBwcm9wIHtBcnJheS48T2JqZWN0Pn0gY29sb3JzIC0gQXJyYXkgb2YgY29sb3IgaW5mb3JtYXRpb24gdXNlZCBmb3IgYSB0YWJcbiAqIEBwcm9wIHtCb29sZWFufSBjdXN0b20gLSB0cnVlIGlmIHRoaXMgaXMgYSBjdXN0b20gdGFiXG4gKiBAcHJvcCB7U3RyaW5nfSBpY29uVXJsIC0gVGhlIFVSTCBmb3IgdGhlIG1haW4gMzIgeCAzMiBwaXhlbCBpY29uIGZvciBhIHRhYlxuICogQHByb3Age0FycmF5LjxPYmplY3Q+fSBpY29ucyAtIEFycmF5IG9mIGljb24gaW5mb3JtYXRpb24gdXNlZCBmb3IgYSB0YWJcbiAqIEBwcm9wIHtTdHJpbmd9IGxhYmVsIC0gVGhlIGRpc3BsYXkgbGFiZWwgZm9yIHRoaXMgdGFiXG4gKiBAcHJvcCB7U3RyaW5nfSBtaW5pSWNvblVybCAtIFRoZSBVUkwgZm9yIHRoZSAxNiB4IDE2IHBpeGVsIGljb24gdGhhdCByZXByZXNlbnRzIGEgdGFiXG4gKiBAcHJvcCB7U3RyaW5nfSBuYW1lIC0gVGhlIEFQSSBuYW1lIG9mIHRoZSB0YWJcbiAqIEBwcm9wIHtTdHJpbmd9IHNvYmplY3ROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHNPYmplY3QgdGhhdCBpcyBwcmltYXJpbHkgZGlzcGxheWVkIG9uIHRoaXMgdGFiXG4gKiBAcHJvcCB7U3RyaW5nfSB1cmwgLSBBIGZ1bGx5IHF1YWxpZmllZCBVUkwgZm9yIHZpZXdpbmcgdGhpcyB0YWJcbiAqL1xuLyoqXG4gKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGFuZGFyZCBhbmQgY3VzdG9tIGFwcHMgYXZhaWxhYmxlIHRvIHRoZSBsb2dnZWQtaW4gdXNlclxuICpcbiAqIEBwYXJhbSB7Q2FsbGJhY2suPEFycmF5LjxTb2FwQXBpfkRlc2NyaWJlVGFiU2V0UmVzdWx0Pj59IFtjYWxsYmFja10gLSBDYWxsYmFjayBmdW5jdGlvblxuICogQHJldHVybnMge1Byb21pc2UuPEFycmF5LjxTb2FwQXBpfkRlc2NyaWJlVGFiU2V0UmVzdWx0Pj59XG4gKi9cblNvYXBBcGkucHJvdG90eXBlLmRlc2NyaWJlVGFicyA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gIHJldHVybiB0aGlzLl9pbnZva2UoXCJkZXNjcmliZVRhYnNcIiwge30sIFsgU2NoZW1hcy5EZXNjcmliZVRhYlNldFJlc3VsdCBdLCBjYWxsYmFjayk7XG59O1xuU2NoZW1hcy5EZXNjcmliZVRhYlNldFJlc3VsdCA9IHtcbiAgbGFiZWw6ICdzdHJpbmcnLFxuICBsb2dvVXJsOiAnc3RyaW5nJyxcbiAgbmFtZXNwYWNlOiAnc3RyaW5nJyxcbiAgc2VsZWN0ZWQ6ICdib29sZWFuJyxcbiAgdGFiczogW3tcbiAgICBjb2xvcnM6IFt7XG4gICAgICB0aGVtZTogJ3N0cmluZycsXG4gICAgICBjb2xvcjogJ3N0cmluZycsXG4gICAgICBjb250ZXh0OiAnc3RyaW5nJ1xuICAgIH1dLFxuICAgIGljb25Vcmw6ICdzdHJpbmcnLFxuICAgIGljb25zOiBbe1xuICAgICAgdGhlbWU6ICdzdHJpbmcnLFxuICAgICAgaGVpZ2h0OiAnbnVtYmVyJyxcbiAgICAgIHdpZHRoOiAnbnVtYmVyJyxcbiAgICAgIHVybDogJ3N0cmluZycsXG4gICAgICBjb250ZW50VHlwZTogJ3N0cmluZydcbiAgICB9XSxcbiAgICBsYWJlbDogJ3N0cmluZycsXG4gICAgY3VzdG9tOiAnYm9vbGVhbicsXG4gICAgbWluaUljb25Vcmw6ICdzdHJpbmcnLFxuICAgIG5hbWU6ICdzdHJpbmcnLFxuICAgIHNvYmplY3ROYW1lOiAnc3RyaW5nJyxcbiAgICB1cmw6ICdzdHJpbmcnXG4gIH1dXG59O1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgY3VycmVudCBzeXN0ZW0gdGltZXN0YW1wIChDb29yZGluYXRlZCBVbml2ZXJzYWwgVGltZSAoVVRDKSB0aW1lIHpvbmUpIGZyb20gdGhlIEFQSVxuICpcbiAqIEB0eXBlZGVmIFNvYXBBcGl+U2VydmVyVGltZXN0YW1wUmVzdWx0XG4gKiBAcHJvcCB7U3RyaW5nfSB0aW1lc3RhbXAgLSBUaW1lc3RhbXBcbiAqL1xuLyoqXG4gKiBAcGFyYW0ge0NhbGxiYWNrLjxTb2FwQXBpflNlcnZlclRpbWVzdGFtcFJlc3VsdD59IFtjYWxsYmFja10gLSBDYWxsYmFjayBmdW5jdGlvblxuICogQHJldHVybnMge1Byb21pc2UuPFNvYXBBcGl+U2VydmVyVGltZXN0YW1wUmVzdWx0Pn1cbiAqL1xuU29hcEFwaS5wcm90b3R5cGUuZ2V0U2VydmVyVGltZXN0YW1wID0gZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgcmV0dXJuIHRoaXMuX2ludm9rZShcImdldFNlcnZlclRpbWVzdGFtcFwiLCB7fSwgU2NoZW1hcy5HZXRTZXJ2ZXJUaW1lc3RhbXBSZXN1bHQsIGNhbGxiYWNrKTtcbn07XG5TY2hlbWFzLkdldFNlcnZlclRpbWVzdGFtcFJlc3VsdCA9IHtcbiAgdGltZXN0YW1wOiAnc3RyaW5nJ1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiBTb2FwQXBpflVzZXJJbmZvUmVzdWx0XG4gKiBAcHJvcCB7Qm9vbGVhbn0gYWNjZXNzaWJpbGl0eU1vZGVcbiAqIEBwcm9wIHtTdHJpbmd9IGN1cnJlbmN5U3ltYm9sXG4gKiBAcHJvcCB7TnVtYmVyfSBvcmdBdHRhY2htZW50RmlsZVNpemVMaW1pdFxuICogQHByb3Age1N0cmluZ30gb3JnRGVmYXVsdEN1cnJlbmN5SXNvQ29kZVxuICogQHByb3Age1N0cmluZ30gb3JnRGlzYWxsb3dIdG1sQXR0YWNobWVudHNcbiAqIEBwcm9wIHtCb29sZWFufSBvcmdIYXNQZXJzb25BY2NvdW50c1xuICogQHByb3Age1N0cmluZ30gb3JnYW5pemF0aW9uSWRcbiAqIEBwcm9wIHtCb29sZWFufSBvcmdhbml6YXRpb25NdWx0aUN1cnJlbmN5XG4gKiBAcHJvcCB7U3RyaW5nfSBvcmdhbml6YXRpb25OYW1lXG4gKiBAcHJvcCB7U3RyaW5nfSBwcm9maWxlSWRcbiAqIEBwcm9wIHtTdHJpbmd9IHJvbGVJZFxuICogQHByb3Age051bWJlcn0gc2Vzc2lvblNlY29uZHNWYWxpZFxuICogQHByb3Age1N0cmluZ30gdXNlckRlZmF1bHRDdXJyZW5jeUlzb0NvZGVcbiAqIEBwcm9wIHtTdHJpbmd9IHVzZXJFbWFpbFxuICogQHByb3Age1N0cmluZ30gdXNlckZ1bGxOYW1lXG4gKiBAcHJvcCB7U3RyaW5nfSB1c2VySWRcbiAqIEBwcm9wIHtTdHJpbmd9IHVzZXJMYW5ndWFnZVxuICogQHByb3Age1N0cmluZ30gdXNlckxvY2FsZVxuICogQHByb3Age1N0cmluZ30gdXNlck5hbWVcbiAqIEBwcm9wIHtTdHJpbmd9IHVzZXJUaW1lWm9uZVxuICogQHByb3Age1N0cmluZ30gdXNlclR5cGVcbiAqIEBwcm9wIHtTdHJpbmd9IHVzZXJVaVNraW5cbiAqL1xuLyoqXG4gKiBSZXRyaWV2ZXMgcGVyc29uYWwgaW5mb3JtYXRpb24gZm9yIHRoZSB1c2VyIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBzZXNzaW9uXG4gKlxuICogQHBhcmFtIHtDYWxsYmFjay48U29hcEFwaX5Vc2VySW5mb1Jlc3VsdD59IFtjYWxsYmFja10gLSBDYWxsYmFjayBmdW5jdGlvblxuICogQHJldHVybnMge1Byb21pc2UuPFNvYXBBcGl+VXNlckluZm9SZXN1bHQ+fVxuICovXG5Tb2FwQXBpLnByb3RvdHlwZS5nZXRVc2VySW5mbyA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gIHJldHVybiB0aGlzLl9pbnZva2UoXCJnZXRVc2VySW5mb1wiLCB7fSwgU2NoZW1hcy5HZXRVc2VySW5mb1Jlc3VsdCwgY2FsbGJhY2spO1xufTtcblNjaGVtYXMuR2V0VXNlckluZm9SZXN1bHQgPSB7XG4gIGFjY2Vzc2liaWxpdHlNb2RlOiAnYm9vbGVhbicsXG4gIGN1cnJlbmN5U3ltYm9sOiAnc3RyaW5nJyxcbiAgb3JnQXR0YWNobWVudEZpbGVTaXplTGltaXQ6ICdudW1iZXInLFxuICBvcmdEZWZhdWx0Q3VycmVuY3lJc29Db2RlOiAnc3RyaW5nJyxcbiAgb3JnRGlzYWxsb3dIdG1sQXR0YWNobWVudHM6ICdib29sZWFuJyxcbiAgb3JnSGFzUGVyc29uQWNjb3VudHM6ICdib29sZWFuJyxcbiAgb3JnYW5pemF0aW9uSWQ6ICdzdHJpbmcnLFxuICBvcmdhbml6YXRpb25NdWx0aUN1cnJlbmN5OiAnYm9vbGVhbicsXG4gIG9yZ2FuaXphdGlvbk5hbWU6ICdzdHJpbmcnLFxuICBwcm9maWxlSWQ6ICdzdHJpbmcnLFxuICByb2xlSWQ6ICdzdHJpbmcnLFxuICBzZXNzaW9uU2Vjb25kc1ZhbGlkOiAnbnVtYmVyJyxcbiAgdXNlckRlZmF1bHRDdXJyZW5jeUlzb0NvZGU6ICdzdHJpbmcnLFxuICB1c2VyRW1haWw6ICdzdHJpbmcnLFxuICB1c2VyRnVsbE5hbWU6ICdzdHJpbmcnLFxuICB1c2VySWQ6ICdzdHJpbmcnLFxuICB1c2VyTGFuZ3VhZ2U6ICdzdHJpbmcnLFxuICB1c2VyTG9jYWxlOiAnc3RyaW5nJyxcbiAgdXNlck5hbWU6ICdzdHJpbmcnLFxuICB1c2VyVGltZVpvbmU6ICdzdHJpbmcnLFxuICB1c2VyVHlwZTogJ3N0cmluZycsXG4gIHVzZXJVaVNraW46ICdzdHJpbmcnXG59O1xuXG4vKipcbiAqIFNldHMgdGhlIHNwZWNpZmllZCB1c2Vy4oCZcyBwYXNzd29yZCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHVzZXJJZCAtIFVzZXIgSWQgdG8gc2V0IHBhc3N3b3JkXG4gKiBAcGFyYW0ge1N0cmluZ30gcGFzc3dvcmQgLSBOZXcgcGFzc3dvcmRcbiAqIEBwYXJhbSB7Q2FsbGJhY2suPFN0cmluZz59IFtjYWxsYmFja10gLSBDYWxsYmFjayBmdW5jdGlvblxuICogQHJldHVybnMge1Byb21pc2UuPFN0cmluZz59XG4gKi9cblNvYXBBcGkucHJvdG90eXBlLnNldFBhc3N3b3JkID0gZnVuY3Rpb24odXNlcklkLCBwYXNzd29yZCwgY2FsbGJhY2spIHtcbiAgcmV0dXJuIHRoaXMuX2ludm9rZShcInNldFBhc3N3b3JkXCIsIHsgdXNlcklkOiB1c2VySWQsIHBhc3N3b3JkOiBwYXNzd29yZCB9LCBjYWxsYmFjayk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIFNvYXBBcGl+UmVzZXRQYXNzd29yZFJlc3VsdFxuICogQHByb3Age1N0cmluZ30gcGFzc3dvcmRcbiAqL1xuLyoqXG4gKiBSZXNldHMgdGhlIHNwZWNpZmllZCB1c2Vy4oCZcyBwYXNzd29yZFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1c2VySWQgLSBVc2VyIElkIHRvIHNldCBwYXNzd29yZFxuICogQHBhcmFtIHtTdHJpbmd9IHBhc3N3b3JkIC0gTmV3IHBhc3N3b3JkXG4gKiBAcGFyYW0ge0NhbGxiYWNrLjxTb2FwQXBpflJlc2V0UGFzc3dvcmRSZXN1bHQ+fSBbY2FsbGJhY2tdIC0gQ2FsbGJhY2sgZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtQcm9taXNlLjxTb2FwQXBpflJlc2V0UGFzc3dvcmRSZXN1bHQ+fVxuICovXG5Tb2FwQXBpLnByb3RvdHlwZS5yZXNldFBhc3N3b3JkID0gZnVuY3Rpb24odXNlcklkLCBjYWxsYmFjaykge1xuICByZXR1cm4gdGhpcy5faW52b2tlKFwicmVzZXRQYXNzd29yZFwiLCB7IHVzZXJJZDogdXNlcklkIH0sIGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogQWRkcyBvbmUgb3IgbW9yZSBuZXcgcmVjb3JkcyB0byB5b3VyIG9yZ2FuaXphdGlvbuKAmXMgZGF0YVxuICpcbiAqIEBwYXJhbSB7QXJyYXkuPE9iamVjdD59IHNPYmplY3RzIC0gUmVjb3JkcyB0byBpbnNlcnRcbiAqIEBwYXJhbSB7Q2FsbGJhY2suPFNvYXBBcGl+U2F2ZVJlc3VsdD59IFtjYWxsYmFja10gLSBDYWxsYmFjayBmdW5jdGlvblxuICogQHJldHVybnMge1Byb21pc2UuPFNvYXBBcGl+U2F2ZVJlc3VsdD59XG4gKi9cblNvYXBBcGkucHJvdG90eXBlLmNyZWF0ZSA9IGZ1bmN0aW9uKHNPYmplY3RzLCBjYWxsYmFjaykge1xuICB2YXIgc2NoZW1hID0gXy5pc0FycmF5KHNPYmplY3RzKSA/IFsgU2NoZW1hcy5TYXZlUmVzdWx0IF0gOiBTY2hlbWFzLlNhdmVSZXN1bHQ7XG4gIHZhciBhcmdzID0ge1xuICAgICdAeG1sbnMnIDogJ3VybjpwYXJ0bmVyLnNvYXAuc2ZvcmNlLmNvbScsXG4gICAgJ0B4bWxuczpuczEnIDogJ3NvYmplY3QucGFydG5lci5zb2FwLnNmb3JjZS5jb20nLFxuICAgICduczE6c09iamVjdHMnIDogc09iamVjdHNcbiAgfTtcbiAgcmV0dXJuIHRoaXMuX2ludm9rZShcImNyZWF0ZVwiLCBhcmdzLCBzY2hlbWEsIGNhbGxiYWNrKTtcbn07XG5cbi8qKlxuICogVXBkYXRlcyBvbmUgb3IgbW9yZSBleGlzdGluZyByZWNvcmRzIGluIHlvdXIgb3JnYW5pemF0aW9u4oCZcyBkYXRhLlxuICpcbiAqIEBwYXJhbSB7QXJyYXkuPE9iamVjdD59IHNPYmplY3RzIC0gUmVjb3JkcyB0byB1cGRhdGVcbiAqIEBwYXJhbSB7Q2FsbGJhY2suPFNvYXBBcGl+U2F2ZVJlc3VsdD59IFtjYWxsYmFja10gLSBDYWxsYmFjayBmdW5jdGlvblxuICogQHJldHVybnMge1Byb21pc2UuPFNvYXBBcGl+U2F2ZVJlc3VsdD59XG4gKi9cblNvYXBBcGkucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uKHNPYmplY3RzLCBjYWxsYmFjaykge1xuICB2YXIgc2NoZW1hID0gXy5pc0FycmF5KHNPYmplY3RzKSA/IFsgU2NoZW1hcy5TYXZlUmVzdWx0IF0gOiBTY2hlbWFzLlNhdmVSZXN1bHQ7XG4gIHZhciBhcmdzID0ge1xuICAgICdAeG1sbnMnIDogJ3VybjpwYXJ0bmVyLnNvYXAuc2ZvcmNlLmNvbScsXG4gICAgJ0B4bWxuczpuczEnIDogJ3NvYmplY3QucGFydG5lci5zb2FwLnNmb3JjZS5jb20nLFxuICAgICduczE6c09iamVjdHMnIDogc09iamVjdHNcbiAgfTtcbiAgcmV0dXJuIHRoaXMuX2ludm9rZShcInVwZGF0ZVwiLCBhcmdzLCBzY2hlbWEsIGNhbGxiYWNrKTtcbn07XG5cblNjaGVtYXMuU2F2ZVJlc3VsdCA9IHtcbiAgc3VjY2VzczogJ2Jvb2xlYW4nLFxuICBlcnJvcnM6IFtdLFxuICBpZDogJ3N0cmluZydcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBuZXcgcmVjb3JkcyBhbmQgdXBkYXRlcyBleGlzdGluZyByZWNvcmRzIGluIHlvdXIgb3JnYW5pemF0aW9u4oCZcyBkYXRhLlxuICpcbiAqIEBwYXJhbSB7QXJyYXkuPE9iamVjdD59IHNPYmplY3RzIC0gUmVjb3JkcyB0byB1cHNlcnRcbiAqIEBwYXJhbSB7Q2FsbGJhY2suPFNvYXBBcGl+VXBzZXJ0UmVzdWx0Pn0gW2NhbGxiYWNrXSAtIENhbGxiYWNrIGZ1bmN0aW9uXG4gKiBAcmV0dXJucyB7UHJvbWlzZS48U29hcEFwaX5VcHNlcnRSZXN1bHQ+fVxuICovXG5Tb2FwQXBpLnByb3RvdHlwZS51cHNlcnQgPSBmdW5jdGlvbihleHRlcm5hbElkRmllbGROYW1lLCBzT2JqZWN0cywgY2FsbGJhY2spIHtcbiAgdmFyIHNjaGVtYSA9IF8uaXNBcnJheShzT2JqZWN0cykgPyBbIFNjaGVtYXMuVXBzZXJ0UmVzdWx0IF0gOiBTY2hlbWFzLlVwc2VydFJlc3VsdDtcbiAgdmFyIGFyZ3MgPSB7XG4gICAgJ0B4bWxucycgOiAndXJuOnBhcnRuZXIuc29hcC5zZm9yY2UuY29tJyxcbiAgICAnQHhtbG5zOm5zMScgOiAnc29iamVjdC5wYXJ0bmVyLnNvYXAuc2ZvcmNlLmNvbScsXG4gICAgJ25zMTpleHRlcm5hbElERmllbGROYW1lJyA6IGV4dGVybmFsSWRGaWVsZE5hbWUsXG4gICAgJ25zMTpzT2JqZWN0cycgOiBzT2JqZWN0c1xuICB9O1xuICByZXR1cm4gdGhpcy5faW52b2tlKFwidXBzZXJ0XCIsIGFyZ3MsIHNjaGVtYSwgY2FsbGJhY2spO1xufTtcblxuU2NoZW1hcy5VcHNlcnRSZXN1bHQgPSB7XG4gIGNyZWF0ZWQ6ICdib29sZWFuJyxcbiAgc3VjY2VzczogJ2Jvb2xlYW4nLFxuICBlcnJvcnM6IFtdLFxuICBpZDogJ3N0cmluZydcbn07XG5cbi8qKlxuICogRGVsZXRlcyBvbmUgb3IgbW9yZSByZWNvcmRzIGZyb20geW91ciBvcmdhbml6YXRpb27igJlzIGRhdGFcbiAqXG4gKiBAcGFyYW0ge0FycmF5LjxPYmplY3Q+fSBpZHMgLSBJZCBvZiByZWNvcmRzIHRvIGRlbGV0ZVxuICogQHBhcmFtIHtDYWxsYmFjay48U29hcEFwaX5EZWxldGVSZXN1bHQ+fSBbY2FsbGJhY2tdIC0gQ2FsbGJhY2sgZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtQcm9taXNlLjxTb2FwQXBpfkRlbGV0ZVJlc3VsdD59XG4gKi9cblNvYXBBcGkucHJvdG90eXBlLmRlbGV0ZSA9IGZ1bmN0aW9uKGlkcywgY2FsbGJhY2spIHtcbiAgdmFyIHNjaGVtYSA9IF8uaXNBcnJheShpZHMpID8gWyBTY2hlbWFzLkRlbGV0ZVJlc3VsdCBdIDogU2NoZW1hcy5EZWxldGVSZXN1bHQ7XG4gIHZhciBhcmdzID0ge1xuICAgICdAeG1sbnMnIDogJ3VybjpwYXJ0bmVyLnNvYXAuc2ZvcmNlLmNvbScsXG4gICAgJ0B4bWxuczpuczEnIDogJ3NvYmplY3QucGFydG5lci5zb2FwLnNmb3JjZS5jb20nLFxuICAgICduczE6aWRzJyA6IGlkc1xuICB9O1xuICByZXR1cm4gdGhpcy5faW52b2tlKFwiZGVsZXRlXCIsIGFyZ3MsIHNjaGVtYSwgY2FsbGJhY2spO1xufTtcblxuU2NoZW1hcy5EZWxldGVSZXN1bHQgPSB7XG4gIHN1Y2Nlc3M6ICdib29sZWFuJyxcbiAgZXJyb3JzOiBbXSxcbiAgaWQ6ICdzdHJpbmcnXG59O1xuXG5cbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuLypcbiAqIFJlZ2lzdGVyIGhvb2sgaW4gY29ubmVjdGlvbiBpbnN0YW50aWF0aW9uIGZvciBkeW5hbWljYWxseSBhZGRpbmcgdGhpcyBBUEkgbW9kdWxlIGZlYXR1cmVzXG4gKi9cbmpzZm9yY2Uub24oJ2Nvbm5lY3Rpb246bmV3JywgZnVuY3Rpb24oY29ubikge1xuICBjb25uLnNvYXAgPSBuZXcgU29hcEFwaShjb25uKTtcbn0pO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gU29hcEFwaTtcbiJdfQ==