jsforce
Version:
Salesforce API Library for JavaScript
371 lines (356 loc) • 39.2 kB
JavaScript
import _Object$getOwnPropertySymbols from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols";
import _Object$getOwnPropertyDescriptor from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor";
import _forEachInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/for-each";
import _Object$getOwnPropertyDescriptors from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors";
import _Object$defineProperties from "@babel/runtime-corejs3/core-js-stable/object/define-properties";
import _Object$defineProperty from "@babel/runtime-corejs3/core-js-stable/object/define-property";
import _Reflect$construct from "@babel/runtime-corejs3/core-js-stable/reflect/construct";
import _sliceInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/slice";
import _Array$from from "@babel/runtime-corejs3/core-js-stable/array/from";
import _Symbol from "@babel/runtime-corejs3/core-js-stable/symbol";
import _getIteratorMethod from "@babel/runtime-corejs3/core-js/get-iterator-method";
import _Array$isArray from "@babel/runtime-corejs3/core-js-stable/array/is-array";
import _slicedToArray from "@babel/runtime-corejs3/helpers/slicedToArray";
import _classCallCheck from "@babel/runtime-corejs3/helpers/classCallCheck";
import _createClass from "@babel/runtime-corejs3/helpers/createClass";
import _possibleConstructorReturn from "@babel/runtime-corejs3/helpers/possibleConstructorReturn";
import _getPrototypeOf from "@babel/runtime-corejs3/helpers/getPrototypeOf";
import _get from "@babel/runtime-corejs3/helpers/get";
import _inherits from "@babel/runtime-corejs3/helpers/inherits";
import _objectWithoutProperties from "@babel/runtime-corejs3/helpers/objectWithoutProperties";
import _typeof from "@babel/runtime-corejs3/helpers/typeof";
import _defineProperty from "@babel/runtime-corejs3/helpers/defineProperty";
var _excluded = ["nullValue"];
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof _Symbol && _getIteratorMethod(r) || r["@@iterator"]; if (!t) { if (_Array$isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }
function _unsupportedIterableToArray(r, a) { if (r) { var _context8; if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = _sliceInstanceProperty(_context8 = {}.toString.call(r)).call(_context8, 8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? _Array$from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? _Reflect$construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
function _superPropGet(t, o, e, r) { var p = _get(_getPrototypeOf(1 & r ? t.prototype : t), o, e); return 2 & r && "function" == typeof p ? function (t) { return p.apply(e, t); } : p; }
function ownKeys(e, r) { var t = _Object$keys(e); if (_Object$getOwnPropertySymbols) { var o = _Object$getOwnPropertySymbols(e); r && (o = _filterInstanceProperty(o).call(o, function (r) { return _Object$getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var _context6, _context7; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty(_context6 = ownKeys(Object(t), !0)).call(_context6, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : _forEachInstanceProperty(_context7 = ownKeys(Object(t))).call(_context7, function (r) { _Object$defineProperty(e, r, _Object$getOwnPropertyDescriptor(t, r)); }); } return e; }
import _reduceInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/reduce";
import _Object$keys from "@babel/runtime-corejs3/core-js-stable/object/keys";
import _concatInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/concat";
import _mapInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/map";
import _filterInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/filter";
import "core-js/modules/es.error.cause.js";
import "core-js/modules/es.array.push.js";
import "core-js/modules/es.function.name.js";
import "core-js/modules/es.object.to-string.js";
import "core-js/modules/es.regexp.exec.js";
import "core-js/modules/es.regexp.test.js";
import "core-js/modules/es.regexp.to-string.js";
import "core-js/modules/es.string.replace.js";
/**
* @file Represents stream that handles Salesforce record as stream data
* @author Shinichi Tomita <shinichi.tomita@gmail.com>
*/
import { Transform, PassThrough } from 'stream';
import { serializeCSVStream, parseCSVStream } from './csv';
import { concatStreamsAsDuplex } from './util/stream';
/**
* type defs
*/
/**
* @private
*/
function evalMapping(value, mapping) {
if (typeof value === 'string') {
var m = /^\$\{(\w+)\}$/.exec(value);
if (m) {
return mapping[m[1]];
}
return value.replace(/\$\{(\w+)\}/g, function ($0, prop) {
var v = mapping[prop];
return typeof v === 'undefined' || v === null ? '' : String(v);
});
}
return value;
}
/**
* @private
*/
function convertRecordForSerialization(record) {
var _context;
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
return _reduceInstanceProperty(_context = _Object$keys(record)).call(_context, function (rec, key) {
var value = rec[key];
var urec;
if (key === 'attributes') {
// 'attributes' prop will be ignored
urec = _objectSpread({}, rec);
delete urec[key];
return urec;
} else if (options.nullValue && value === null) {
return _objectSpread(_objectSpread({}, rec), {}, _defineProperty({}, key, options.nullValue));
} else if (value !== null && _typeof(value) === 'object') {
var _context2;
var precord = convertRecordForSerialization(value, options);
return _reduceInstanceProperty(_context2 = _Object$keys(precord)).call(_context2, function (prec, pkey) {
var _context3;
prec[_concatInstanceProperty(_context3 = "".concat(key, ".")).call(_context3, pkey)] = precord[pkey]; // eslint-disable-line no-param-reassign
return prec;
}, _objectSpread({}, rec));
}
return rec;
}, record);
}
/**
* @private
*/
function createPipelineStream(s1, s2) {
s1.pipe(s2);
return concatStreamsAsDuplex(s1, s2, {
writableObjectMode: true
});
}
/**
* @private
*/
var CSVStreamConverter = {
serialize: function serialize() {
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var nullValue = options.nullValue,
csvOpts = _objectWithoutProperties(options, _excluded);
return createPipelineStream(
// eslint-disable-next-line no-use-before-define
_mapInstanceProperty(RecordStream).call(RecordStream, function (record) {
return convertRecordForSerialization(record, options);
}), serializeCSVStream(csvOpts));
},
parse: function parse() {
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
return parseCSVStream(options);
}
};
/**
* @private
*/
var DataStreamConverters = {
csv: CSVStreamConverter
};
/**
* Class for Record Stream
*
* @class
* @constructor
* @extends stream.Transform
*/
export var RecordStream = /*#__PURE__*/function (_PassThrough) {
/**
*
*/
function RecordStream() {
var _this;
_classCallCheck(this, RecordStream);
_this = _callSuper(this, RecordStream, [{
objectMode: true
}]);
/* @override */
_defineProperty(_this, "addListener", _this.on);
return _this;
}
/**
* Get record stream of queried records applying the given mapping function
*/
_inherits(RecordStream, _PassThrough);
return _createClass(RecordStream, [{
key: "map",
value: function map(fn) {
return this.pipe(_mapInstanceProperty(RecordStream).call(RecordStream, fn));
}
/**
* Get record stream of queried records, applying the given filter function
*/
}, {
key: "filter",
value: function filter(fn) {
return this.pipe(_filterInstanceProperty(RecordStream).call(RecordStream, fn));
}
/* @override */
}, {
key: "on",
value: function on(ev, fn) {
return _superPropGet(RecordStream, "on", this, 3)([ev === 'record' ? 'data' : ev, fn]);
}
}], [{
key: "map",
value: /* --------------------------------------------------- */
/**
* Create a record stream which maps records and pass them to downstream
*/
function map(fn) {
var mapStream = new Transform({
objectMode: true,
transform: function transform(record, enc, callback) {
var rec = fn(record) || record; // if not returned record, use same record
mapStream.push(rec);
callback();
}
});
return mapStream;
}
/**
* Create mapping stream using given record template
*/
}, {
key: "recordMapStream",
value: function recordMapStream(record, noeval) {
return _mapInstanceProperty(RecordStream).call(RecordStream, function (rec) {
var mapped = {
Id: rec.Id
};
for (var _i = 0, _Object$keys2 = _Object$keys(record); _i < _Object$keys2.length; _i++) {
var prop = _Object$keys2[_i];
mapped[prop] = noeval ? record[prop] : evalMapping(record[prop], rec);
}
return mapped;
});
}
/**
* Create a record stream which filters records and pass them to downstream
*
* @param {RecordFilterFunction} fn - Record filtering function
* @returns {RecordStream.Serializable}
*/
}, {
key: "filter",
value: function filter(fn) {
var filterStream = new Transform({
objectMode: true,
transform: function transform(record, enc, callback) {
if (fn(record)) {
filterStream.push(record);
}
callback();
}
});
return filterStream;
}
}]);
}(PassThrough);
/**
* @class RecordStream.Serializable
* @extends {RecordStream}
*/
export var Serializable = /*#__PURE__*/function (_RecordStream2) {
function Serializable() {
var _context4;
var _this2;
_classCallCheck(this, Serializable);
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this2 = _callSuper(this, Serializable, _concatInstanceProperty(_context4 = []).call(_context4, args));
_defineProperty(_this2, "_dataStreams", {});
return _this2;
}
_inherits(Serializable, _RecordStream2);
return _createClass(Serializable, [{
key: "stream",
value:
/**
* Get readable data stream which emits serialized record data
*/
function stream() {
var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'csv';
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
if (this._dataStreams[type]) {
return this._dataStreams[type];
}
var converter = DataStreamConverters[type];
if (!converter) {
throw new Error("Converting [".concat(type, "] data stream is not supported."));
}
var dataStream = new PassThrough();
this.pipe(converter.serialize(options)).pipe(dataStream);
this._dataStreams[type] = dataStream;
return dataStream;
}
}]);
}(RecordStream);
/**
* @class RecordStream.Parsable
* @extends {RecordStream}
*/
export var Parsable = /*#__PURE__*/function (_RecordStream3) {
function Parsable() {
var _context5;
var _this3;
_classCallCheck(this, Parsable);
for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
args[_key2] = arguments[_key2];
}
_this3 = _callSuper(this, Parsable, _concatInstanceProperty(_context5 = []).call(_context5, args));
_defineProperty(_this3, "_dataStreams", {});
_defineProperty(_this3, "_execParse", false);
_defineProperty(_this3, "_incomings", []);
/* @override */
_defineProperty(_this3, "addListener", _this3.on);
return _this3;
}
_inherits(Parsable, _RecordStream3);
return _createClass(Parsable, [{
key: "stream",
value:
/**
* Get writable data stream which accepts serialized record data
*/
function stream() {
var _this4 = this;
var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'csv';
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
if (this._dataStreams[type]) {
return this._dataStreams[type];
}
var converter = DataStreamConverters[type];
if (!converter) {
throw new Error("Converting [".concat(type, "] data stream is not supported."));
}
var dataStream = new PassThrough();
var parserStream = converter.parse(options);
parserStream.on('error', function (err) {
return _this4.emit('error', err);
});
parserStream.pipe(this).pipe(new PassThrough({
objectMode: true,
highWaterMark: 500 * 1000
}));
if (this._execParse) {
dataStream.pipe(parserStream);
} else {
this._incomings.push([dataStream, parserStream]);
}
this._dataStreams[type] = dataStream;
return dataStream;
}
/* @override */
}, {
key: "on",
value: function on(ev, fn) {
if (ev === 'readable' || ev === 'record') {
if (!this._execParse) {
this._execParse = true;
var _iterator = _createForOfIteratorHelper(this._incomings),
_step;
try {
for (_iterator.s(); !(_step = _iterator.n()).done;) {
var _step$value = _slicedToArray(_step.value, 2),
dataStream = _step$value[0],
parserStream = _step$value[1];
dataStream.pipe(parserStream);
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
}
}
return _superPropGet(Parsable, "on", this, 3)([ev, fn]);
}
}]);
}(RecordStream);
export default RecordStream;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJUcmFuc2Zvcm0iLCJQYXNzVGhyb3VnaCIsInNlcmlhbGl6ZUNTVlN0cmVhbSIsInBhcnNlQ1NWU3RyZWFtIiwiY29uY2F0U3RyZWFtc0FzRHVwbGV4IiwiZXZhbE1hcHBpbmciLCJ2YWx1ZSIsIm1hcHBpbmciLCJtIiwiZXhlYyIsInJlcGxhY2UiLCIkMCIsInByb3AiLCJ2IiwiU3RyaW5nIiwiY29udmVydFJlY29yZEZvclNlcmlhbGl6YXRpb24iLCJyZWNvcmQiLCJfY29udGV4dCIsIm9wdGlvbnMiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJfcmVkdWNlSW5zdGFuY2VQcm9wZXJ0eSIsIl9PYmplY3Qka2V5cyIsImNhbGwiLCJyZWMiLCJrZXkiLCJ1cmVjIiwiX29iamVjdFNwcmVhZCIsIm51bGxWYWx1ZSIsIl9kZWZpbmVQcm9wZXJ0eSIsIl90eXBlb2YiLCJfY29udGV4dDIiLCJwcmVjb3JkIiwicHJlYyIsInBrZXkiLCJfY29udGV4dDMiLCJfY29uY2F0SW5zdGFuY2VQcm9wZXJ0eSIsImNvbmNhdCIsImNyZWF0ZVBpcGVsaW5lU3RyZWFtIiwiczEiLCJzMiIsInBpcGUiLCJ3cml0YWJsZU9iamVjdE1vZGUiLCJDU1ZTdHJlYW1Db252ZXJ0ZXIiLCJzZXJpYWxpemUiLCJjc3ZPcHRzIiwiX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIiwiX2V4Y2x1ZGVkIiwiX21hcEluc3RhbmNlUHJvcGVydHkiLCJSZWNvcmRTdHJlYW0iLCJwYXJzZSIsIkRhdGFTdHJlYW1Db252ZXJ0ZXJzIiwiY3N2IiwiX1Bhc3NUaHJvdWdoIiwiX3RoaXMiLCJfY2xhc3NDYWxsQ2hlY2siLCJfY2FsbFN1cGVyIiwib2JqZWN0TW9kZSIsIm9uIiwiX2luaGVyaXRzIiwiX2NyZWF0ZUNsYXNzIiwibWFwIiwiZm4iLCJmaWx0ZXIiLCJfZmlsdGVySW5zdGFuY2VQcm9wZXJ0eSIsImV2IiwiX3N1cGVyUHJvcEdldCIsIm1hcFN0cmVhbSIsInRyYW5zZm9ybSIsImVuYyIsImNhbGxiYWNrIiwicHVzaCIsInJlY29yZE1hcFN0cmVhbSIsIm5vZXZhbCIsIm1hcHBlZCIsIklkIiwiX2kiLCJfT2JqZWN0JGtleXMyIiwiZmlsdGVyU3RyZWFtIiwiU2VyaWFsaXphYmxlIiwiX1JlY29yZFN0cmVhbTIiLCJfY29udGV4dDQiLCJfdGhpczIiLCJfbGVuIiwiYXJncyIsIkFycmF5IiwiX2tleSIsInN0cmVhbSIsInR5cGUiLCJfZGF0YVN0cmVhbXMiLCJjb252ZXJ0ZXIiLCJFcnJvciIsImRhdGFTdHJlYW0iLCJQYXJzYWJsZSIsIl9SZWNvcmRTdHJlYW0zIiwiX2NvbnRleHQ1IiwiX3RoaXMzIiwiX2xlbjIiLCJfa2V5MiIsIl90aGlzNCIsInBhcnNlclN0cmVhbSIsImVyciIsImVtaXQiLCJoaWdoV2F0ZXJNYXJrIiwiX2V4ZWNQYXJzZSIsIl9pbmNvbWluZ3MiLCJfaXRlcmF0b3IiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsIl9zdGVwIiwicyIsIm4iLCJkb25lIiwiX3N0ZXAkdmFsdWUiLCJfc2xpY2VkVG9BcnJheSIsImUiLCJmIl0sInNvdXJjZXMiOlsiLi4vc3JjL3JlY29yZC1zdHJlYW0udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZSBSZXByZXNlbnRzIHN0cmVhbSB0aGF0IGhhbmRsZXMgU2FsZXNmb3JjZSByZWNvcmQgYXMgc3RyZWFtIGRhdGFcbiAqIEBhdXRob3IgU2hpbmljaGkgVG9taXRhIDxzaGluaWNoaS50b21pdGFAZ21haWwuY29tPlxuICovXG5pbXBvcnQgeyBSZWFkYWJsZSwgV3JpdGFibGUsIER1cGxleCwgVHJhbnNmb3JtLCBQYXNzVGhyb3VnaCB9IGZyb20gJ3N0cmVhbSc7XG5pbXBvcnQgeyBSZWNvcmQsIE9wdGlvbmFsIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBzZXJpYWxpemVDU1ZTdHJlYW0sIHBhcnNlQ1NWU3RyZWFtIH0gZnJvbSAnLi9jc3YnO1xuaW1wb3J0IHsgY29uY2F0U3RyZWFtc0FzRHVwbGV4IH0gZnJvbSAnLi91dGlsL3N0cmVhbSc7XG5cbi8qKlxuICogdHlwZSBkZWZzXG4gKi9cbmV4cG9ydCB0eXBlIFJlY29yZFN0cmVhbVNlcmlhbGl6ZU9wdGlvbiA9IHtcbiAgbnVsbFZhbHVlPzogYW55O1xufTtcblxuZXhwb3J0IHR5cGUgUmVjb3JkU3RyZWFtUGFyc2VPcHRpb24gPSB7fTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBldmFsTWFwcGluZyh2YWx1ZTogYW55LCBtYXBwaW5nOiB7IFtwcm9wOiBzdHJpbmddOiBzdHJpbmcgfSkge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IG0gPSAvXlxcJFxceyhcXHcrKVxcfSQvLmV4ZWModmFsdWUpO1xuICAgIGlmIChtKSB7XG4gICAgICByZXR1cm4gbWFwcGluZ1ttWzFdXTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1xcJFxceyhcXHcrKVxcfS9nLCAoJDAsIHByb3ApID0+IHtcbiAgICAgIGNvbnN0IHYgPSBtYXBwaW5nW3Byb3BdO1xuICAgICAgcmV0dXJuIHR5cGVvZiB2ID09PSAndW5kZWZpbmVkJyB8fCB2ID09PSBudWxsID8gJycgOiBTdHJpbmcodik7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRSZWNvcmRGb3JTZXJpYWxpemF0aW9uKFxuICByZWNvcmQ6IFJlY29yZCxcbiAgb3B0aW9uczogeyBudWxsVmFsdWU/OiBib29sZWFuIH0gPSB7fSxcbik6IFJlY29yZCB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhyZWNvcmQpLnJlZHVjZSgocmVjOiBSZWNvcmQsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSAocmVjIGFzIGFueSlba2V5XTtcbiAgICBsZXQgdXJlYzogUmVjb3JkO1xuICAgIGlmIChrZXkgPT09ICdhdHRyaWJ1dGVzJykge1xuICAgICAgLy8gJ2F0dHJpYnV0ZXMnIHByb3Agd2lsbCBiZSBpZ25vcmVkXG4gICAgICB1cmVjID0geyAuLi5yZWMgfTtcbiAgICAgIGRlbGV0ZSB1cmVjW2tleV07XG4gICAgICByZXR1cm4gdXJlYztcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMubnVsbFZhbHVlICYmIHZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4geyAuLi5yZWMsIFtrZXldOiBvcHRpb25zLm51bGxWYWx1ZSB9IGFzIFJlY29yZDtcbiAgICB9IGVsc2UgaWYgKHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNvbnN0IHByZWNvcmQgPSBjb252ZXJ0UmVjb3JkRm9yU2VyaWFsaXphdGlvbih2YWx1ZSwgb3B0aW9ucyk7XG4gICAgICByZXR1cm4gT2JqZWN0LmtleXMocHJlY29yZCkucmVkdWNlKFxuICAgICAgICAocHJlYzogUmVjb3JkLCBwa2V5KSA9PiB7XG4gICAgICAgICAgcHJlY1tgJHtrZXl9LiR7cGtleX1gXSA9IHByZWNvcmRbcGtleV07IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICByZXR1cm4gcHJlYztcbiAgICAgICAgfSxcbiAgICAgICAgeyAuLi5yZWMgfSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiByZWM7XG4gIH0sIHJlY29yZCk7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY3JlYXRlUGlwZWxpbmVTdHJlYW0oczE6IER1cGxleCwgczI6IER1cGxleCkge1xuICBzMS5waXBlKHMyKTtcbiAgcmV0dXJuIGNvbmNhdFN0cmVhbXNBc0R1cGxleChzMSwgczIsIHsgd3JpdGFibGVPYmplY3RNb2RlOiB0cnVlIH0pO1xufVxuXG50eXBlIFN0cmVhbUNvbnZlcnRlciA9IHtcbiAgc2VyaWFsaXplOiAob3B0aW9ucz86IFJlY29yZFN0cmVhbVNlcmlhbGl6ZU9wdGlvbikgPT4gRHVwbGV4O1xuICBwYXJzZTogKG9wdGlvbnM/OiBSZWNvcmRTdHJlYW1QYXJzZU9wdGlvbikgPT4gRHVwbGV4O1xufTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBDU1ZTdHJlYW1Db252ZXJ0ZXI6IFN0cmVhbUNvbnZlcnRlciA9IHtcbiAgc2VyaWFsaXplKG9wdGlvbnM6IFJlY29yZFN0cmVhbVNlcmlhbGl6ZU9wdGlvbiA9IHt9KSB7XG4gICAgY29uc3QgeyBudWxsVmFsdWUsIC4uLmNzdk9wdHMgfSA9IG9wdGlvbnM7XG4gICAgcmV0dXJuIGNyZWF0ZVBpcGVsaW5lU3RyZWFtKFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgICBSZWNvcmRTdHJlYW0ubWFwKChyZWNvcmQpID0+XG4gICAgICAgIGNvbnZlcnRSZWNvcmRGb3JTZXJpYWxpemF0aW9uKHJlY29yZCwgb3B0aW9ucyksXG4gICAgICApLFxuICAgICAgc2VyaWFsaXplQ1NWU3RyZWFtKGNzdk9wdHMpLFxuICAgICk7XG4gIH0sXG4gIHBhcnNlKG9wdGlvbnM6IFJlY29yZFN0cmVhbVBhcnNlT3B0aW9uID0ge30pIHtcbiAgICByZXR1cm4gcGFyc2VDU1ZTdHJlYW0ob3B0aW9ucyk7XG4gIH0sXG59O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IERhdGFTdHJlYW1Db252ZXJ0ZXJzOiB7IFtrZXk6IHN0cmluZ106IFN0cmVhbUNvbnZlcnRlciB9ID0ge1xuICBjc3Y6IENTVlN0cmVhbUNvbnZlcnRlcixcbn07XG5cbi8qKlxuICogQ2xhc3MgZm9yIFJlY29yZCBTdHJlYW1cbiAqXG4gKiBAY2xhc3NcbiAqIEBjb25zdHJ1Y3RvclxuICogQGV4dGVuZHMgc3RyZWFtLlRyYW5zZm9ybVxuICovXG5leHBvcnQgY2xhc3MgUmVjb3JkU3RyZWFtPFIgZXh0ZW5kcyBSZWNvcmQgPSBSZWNvcmQ+IGV4dGVuZHMgUGFzc1Rocm91Z2gge1xuICAvKipcbiAgICpcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHsgb2JqZWN0TW9kZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcmVjb3JkIHN0cmVhbSBvZiBxdWVyaWVkIHJlY29yZHMgYXBwbHlpbmcgdGhlIGdpdmVuIG1hcHBpbmcgZnVuY3Rpb25cbiAgICovXG4gIG1hcDxSUiBleHRlbmRzIFJlY29yZD4oZm46IChyZWM6IFIpID0+IE9wdGlvbmFsPFJSPikge1xuICAgIHJldHVybiB0aGlzLnBpcGUoUmVjb3JkU3RyZWFtLm1hcDxSLCBSUj4oZm4pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcmVjb3JkIHN0cmVhbSBvZiBxdWVyaWVkIHJlY29yZHMsIGFwcGx5aW5nIHRoZSBnaXZlbiBmaWx0ZXIgZnVuY3Rpb25cbiAgICovXG4gIGZpbHRlcihmbjogKHJlYzogUikgPT4gYm9vbGVhbik6IER1cGxleCB7XG4gICAgcmV0dXJuIHRoaXMucGlwZShSZWNvcmRTdHJlYW0uZmlsdGVyPFI+KGZuKSk7XG4gIH1cblxuICAvKiBAb3ZlcnJpZGUgKi9cbiAgb24oZXY6IHN0cmluZywgZm46ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgIHJldHVybiBzdXBlci5vbihldiA9PT0gJ3JlY29yZCcgPyAnZGF0YScgOiBldiwgZm4pO1xuICB9XG5cbiAgLyogQG92ZXJyaWRlICovXG4gIGFkZExpc3RlbmVyID0gdGhpcy5vbjtcblxuICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuICAvKipcbiAgICogQ3JlYXRlIGEgcmVjb3JkIHN0cmVhbSB3aGljaCBtYXBzIHJlY29yZHMgYW5kIHBhc3MgdGhlbSB0byBkb3duc3RyZWFtXG4gICAqL1xuICBzdGF0aWMgbWFwPFIxIGV4dGVuZHMgUmVjb3JkID0gUmVjb3JkLCBSMiBleHRlbmRzIFJlY29yZCA9IFJlY29yZD4oXG4gICAgZm46IChyZWM6IFIxKSA9PiBPcHRpb25hbDxSMj4sXG4gICkge1xuICAgIGNvbnN0IG1hcFN0cmVhbSA9IG5ldyBUcmFuc2Zvcm0oe1xuICAgICAgb2JqZWN0TW9kZTogdHJ1ZSxcbiAgICAgIHRyYW5zZm9ybShyZWNvcmQsIGVuYywgY2FsbGJhY2spIHtcbiAgICAgICAgY29uc3QgcmVjID0gZm4ocmVjb3JkKSB8fCByZWNvcmQ7IC8vIGlmIG5vdCByZXR1cm5lZCByZWNvcmQsIHVzZSBzYW1lIHJlY29yZFxuICAgICAgICBtYXBTdHJlYW0ucHVzaChyZWMpO1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICByZXR1cm4gbWFwU3RyZWFtO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBtYXBwaW5nIHN0cmVhbSB1c2luZyBnaXZlbiByZWNvcmQgdGVtcGxhdGVcbiAgICovXG4gIHN0YXRpYyByZWNvcmRNYXBTdHJlYW08XG4gICAgUjEgZXh0ZW5kcyBSZWNvcmQgPSBSZWNvcmQsXG4gICAgUjIgZXh0ZW5kcyBSZWNvcmQgPSBSZWNvcmRcbiAgPihyZWNvcmQ6IFIyLCBub2V2YWw/OiBib29sZWFuKSB7XG4gICAgcmV0dXJuIFJlY29yZFN0cmVhbS5tYXA8UjEsIFIyPigocmVjKSA9PiB7XG4gICAgICBjb25zdCBtYXBwZWQ6IFJlY29yZCA9IHsgSWQ6IHJlYy5JZCB9O1xuICAgICAgZm9yIChjb25zdCBwcm9wIG9mIE9iamVjdC5rZXlzKHJlY29yZCkpIHtcbiAgICAgICAgbWFwcGVkW3Byb3BdID0gbm9ldmFsID8gcmVjb3JkW3Byb3BdIDogZXZhbE1hcHBpbmcocmVjb3JkW3Byb3BdLCByZWMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1hcHBlZCBhcyBSMjtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSByZWNvcmQgc3RyZWFtIHdoaWNoIGZpbHRlcnMgcmVjb3JkcyBhbmQgcGFzcyB0aGVtIHRvIGRvd25zdHJlYW1cbiAgICpcbiAgICogQHBhcmFtIHtSZWNvcmRGaWx0ZXJGdW5jdGlvbn0gZm4gLSBSZWNvcmQgZmlsdGVyaW5nIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIHtSZWNvcmRTdHJlYW0uU2VyaWFsaXphYmxlfVxuICAgKi9cbiAgc3RhdGljIGZpbHRlcjxSMSBleHRlbmRzIFJlY29yZCA9IFJlY29yZD4oZm46IChyZWM6IFIxKSA9PiBib29sZWFuKTogRHVwbGV4IHtcbiAgICBjb25zdCBmaWx0ZXJTdHJlYW0gPSBuZXcgVHJhbnNmb3JtKHtcbiAgICAgIG9iamVjdE1vZGU6IHRydWUsXG4gICAgICB0cmFuc2Zvcm0ocmVjb3JkLCBlbmMsIGNhbGxiYWNrKSB7XG4gICAgICAgIGlmIChmbihyZWNvcmQpKSB7XG4gICAgICAgICAgZmlsdGVyU3RyZWFtLnB1c2gocmVjb3JkKTtcbiAgICAgICAgfVxuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICByZXR1cm4gZmlsdGVyU3RyZWFtO1xuICB9XG59XG5cbi8qKlxuICogQGNsYXNzIFJlY29yZFN0cmVhbS5TZXJpYWxpemFibGVcbiAqIEBleHRlbmRzIHtSZWNvcmRTdHJlYW19XG4gKi9cbmV4cG9ydCBjbGFzcyBTZXJpYWxpemFibGU8UiBleHRlbmRzIFJlY29yZCA9IFJlY29yZD4gZXh0ZW5kcyBSZWNvcmRTdHJlYW08Uj4ge1xuICBfZGF0YVN0cmVhbXM6IHsgW3R5cGU6IHN0cmluZ106IER1cGxleCB9ID0ge307XG5cbiAgLyoqXG4gICAqIEdldCByZWFkYWJsZSBkYXRhIHN0cmVhbSB3aGljaCBlbWl0cyBzZXJpYWxpemVkIHJlY29yZCBkYXRhXG4gICAqL1xuICBzdHJlYW0odHlwZTogc3RyaW5nID0gJ2NzdicsIG9wdGlvbnM6IE9iamVjdCA9IHt9KTogRHVwbGV4IHtcbiAgICBpZiAodGhpcy5fZGF0YVN0cmVhbXNbdHlwZV0pIHtcbiAgICAgIHJldHVybiB0aGlzLl9kYXRhU3RyZWFtc1t0eXBlXTtcbiAgICB9XG4gICAgY29uc3QgY29udmVydGVyOiBPcHRpb25hbDxTdHJlYW1Db252ZXJ0ZXI+ID0gRGF0YVN0cmVhbUNvbnZlcnRlcnNbdHlwZV07XG4gICAgaWYgKCFjb252ZXJ0ZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ29udmVydGluZyBbJHt0eXBlfV0gZGF0YSBzdHJlYW0gaXMgbm90IHN1cHBvcnRlZC5gKTtcbiAgICB9XG4gICAgY29uc3QgZGF0YVN0cmVhbSA9IG5ldyBQYXNzVGhyb3VnaCgpO1xuICAgIHRoaXMucGlwZShjb252ZXJ0ZXIuc2VyaWFsaXplKG9wdGlvbnMpKS5waXBlKGRhdGFTdHJlYW0pO1xuICAgIHRoaXMuX2RhdGFTdHJlYW1zW3R5cGVdID0gZGF0YVN0cmVhbTtcbiAgICByZXR1cm4gZGF0YVN0cmVhbTtcbiAgfVxufVxuXG4vKipcbiAqIEBjbGFzcyBSZWNvcmRTdHJlYW0uUGFyc2FibGVcbiAqIEBleHRlbmRzIHtSZWNvcmRTdHJlYW19XG4gKi9cbmV4cG9ydCBjbGFzcyBQYXJzYWJsZTxSIGV4dGVuZHMgUmVjb3JkID0gUmVjb3JkPiBleHRlbmRzIFJlY29yZFN0cmVhbTxSPiB7XG4gIF9kYXRhU3RyZWFtczogeyBbdHlwZTogc3RyaW5nXTogRHVwbGV4IH0gPSB7fTtcbiAgX2V4ZWNQYXJzZTogYm9vbGVhbiA9IGZhbHNlO1xuICBfaW5jb21pbmdzOiBBcnJheTxbUmVhZGFibGUsIFdyaXRhYmxlXT4gPSBbXTtcblxuICAvKipcbiAgICogR2V0IHdyaXRhYmxlIGRhdGEgc3RyZWFtIHdoaWNoIGFjY2VwdHMgc2VyaWFsaXplZCByZWNvcmQgZGF0YVxuICAgKi9cbiAgc3RyZWFtKHR5cGU6IHN0cmluZyA9ICdjc3YnLCBvcHRpb25zOiBPYmplY3QgPSB7fSk6IER1cGxleCB7XG4gICAgaWYgKHRoaXMuX2RhdGFTdHJlYW1zW3R5cGVdKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZGF0YVN0cmVhbXNbdHlwZV07XG4gICAgfVxuICAgIGNvbnN0IGNvbnZlcnRlcjogT3B0aW9uYWw8U3RyZWFtQ29udmVydGVyPiA9IERhdGFTdHJlYW1Db252ZXJ0ZXJzW3R5cGVdO1xuICAgIGlmICghY29udmVydGVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbnZlcnRpbmcgWyR7dHlwZX1dIGRhdGEgc3RyZWFtIGlzIG5vdCBzdXBwb3J0ZWQuYCk7XG4gICAgfVxuICAgIGNvbnN0IGRhdGFTdHJlYW0gPSBuZXcgUGFzc1Rocm91Z2goKTtcbiAgICBjb25zdCBwYXJzZXJTdHJlYW0gPSBjb252ZXJ0ZXIucGFyc2Uob3B0aW9ucyk7XG4gICAgcGFyc2VyU3RyZWFtLm9uKCdlcnJvcicsIChlcnIpID0+IHRoaXMuZW1pdCgnZXJyb3InLCBlcnIpKTtcbiAgICBwYXJzZXJTdHJlYW1cbiAgICAgIC5waXBlKHRoaXMpXG4gICAgICAucGlwZShuZXcgUGFzc1Rocm91Z2goeyBvYmplY3RNb2RlOiB0cnVlLCBoaWdoV2F0ZXJNYXJrOiA1MDAgKiAxMDAwIH0pKTtcbiAgICBpZiAodGhpcy5fZXhlY1BhcnNlKSB7XG4gICAgICBkYXRhU3RyZWFtLnBpcGUocGFyc2VyU3RyZWFtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5faW5jb21pbmdzLnB1c2goW2RhdGFTdHJlYW0sIHBhcnNlclN0cmVhbV0pO1xuICAgIH1cbiAgICB0aGlzLl9kYXRhU3RyZWFtc1t0eXBlXSA9IGRhdGFTdHJlYW07XG4gICAgcmV0dXJuIGRhdGFTdHJlYW07XG4gIH1cblxuICAvKiBAb3ZlcnJpZGUgKi9cbiAgb24oZXY6IHN0cmluZywgZm46ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgIGlmIChldiA9PT0gJ3JlYWRhYmxlJyB8fCBldiA9PT0gJ3JlY29yZCcpIHtcbiAgICAgIGlmICghdGhpcy5fZXhlY1BhcnNlKSB7XG4gICAgICAgIHRoaXMuX2V4ZWNQYXJzZSA9IHRydWU7XG4gICAgICAgIGZvciAoY29uc3QgW2RhdGFTdHJlYW0sIHBhcnNlclN0cmVhbV0gb2YgdGhpcy5faW5jb21pbmdzKSB7XG4gICAgICAgICAgZGF0YVN0cmVhbS5waXBlKHBhcnNlclN0cmVhbSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN1cGVyLm9uKGV2LCBmbik7XG4gIH1cblxuICAvKiBAb3ZlcnJpZGUgKi9cbiAgYWRkTGlzdGVuZXIgPSB0aGlzLm9uO1xufVxuXG5leHBvcnQgZGVmYXVsdCBSZWNvcmRTdHJlYW07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFxQ0EsU0FBUyxFQUFFQyxXQUFXLFFBQVEsUUFBUTtBQUUzRSxTQUFTQyxrQkFBa0IsRUFBRUMsY0FBYyxRQUFRLE9BQU87QUFDMUQsU0FBU0MscUJBQXFCLFFBQVEsZUFBZTs7QUFFckQ7QUFDQTtBQUNBOztBQU9BO0FBQ0E7QUFDQTtBQUNBLFNBQVNDLFdBQVdBLENBQUNDLEtBQVUsRUFBRUMsT0FBbUMsRUFBRTtFQUNwRSxJQUFJLE9BQU9ELEtBQUssS0FBSyxRQUFRLEVBQUU7SUFDN0IsSUFBTUUsQ0FBQyxHQUFHLGVBQWUsQ0FBQ0MsSUFBSSxDQUFDSCxLQUFLLENBQUM7SUFDckMsSUFBSUUsQ0FBQyxFQUFFO01BQ0wsT0FBT0QsT0FBTyxDQUFDQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEI7SUFDQSxPQUFPRixLQUFLLENBQUNJLE9BQU8sQ0FBQyxjQUFjLEVBQUUsVUFBQ0MsRUFBRSxFQUFFQyxJQUFJLEVBQUs7TUFDakQsSUFBTUMsQ0FBQyxHQUFHTixPQUFPLENBQUNLLElBQUksQ0FBQztNQUN2QixPQUFPLE9BQU9DLENBQUMsS0FBSyxXQUFXLElBQUlBLENBQUMsS0FBSyxJQUFJLEdBQUcsRUFBRSxHQUFHQyxNQUFNLENBQUNELENBQUMsQ0FBQztJQUNoRSxDQUFDLENBQUM7RUFDSjtFQUNBLE9BQU9QLEtBQUs7QUFDZDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxTQUFTUyw2QkFBNkJBLENBQ3BDQyxNQUFjLEVBRU47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