ngx-modialog-10
Version:
Modal / Dialog for Angular
401 lines • 30.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/framework/fluent-assign.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/** @type {?} */
var PRIVATE_PREFIX = '$$';
/** @type {?} */
var RESERVED_REGEX = /^(\$\$).*/;
/**
* @param {?} name
* @return {?}
*/
function validateMethodName(name) {
if (!name) {
throw new Error("Illegal method name. Empty method name is not allowed");
}
else if (name in this) {
throw new Error("A member name '" + name + "' already defined.");
}
}
/**
* Returns a list of assigned property names (non private)
* @param {?} subject
* @return {?}
*/
function getAssignedPropertyNames(subject) {
return Object.getOwnPropertyNames(subject)
.filter((/**
* @param {?} name
* @return {?}
*/
function (name) { return RESERVED_REGEX.test(name); }))
.map((/**
* @param {?} name
* @return {?}
*/
function (name) { return name.substr(2); }));
}
/**
* @param {?} name
* @return {?}
*/
export function privateKey(name) {
return PRIVATE_PREFIX + name;
}
/**
* @param {?} obj
* @param {?} propertyName
* @param {?} value
* @return {?}
*/
function objectDefinePropertyValue(obj, propertyName, value) {
Object.defineProperty(obj, propertyName, (/** @type {?} */ ({
configurable: false,
enumerable: false,
writable: false,
value: value
})));
}
/**
* Given a FluentAssign instance, apply all of the supplied default values so calling
* instance.toJSON will return those values (does not create a setter function)
* @param {?} instance
* @param {?} defaultValues
* @return {?}
*/
function applyDefaultValues(instance, defaultValues) {
Object.getOwnPropertyNames(defaultValues)
.forEach((/**
* @param {?} name
* @return {?}
*/
function (name) { return ((/** @type {?} */ (instance)))[privateKey(name)] = ((/** @type {?} */ (defaultValues)))[name]; }));
}
/**
* Create a function for setting a value for a property on a given object.
* @template T
* @param {?} obj The object to apply the key & setter on.
* @param {?} propertyName The name of the property on the object
* @param {?=} writeOnce If true will allow writing once (default: false)
*
* Example:
* let obj = new FluentAssign<any>;
* setAssignMethod(obj, 'myProp');
* obj.myProp('someValue');
* const result = obj.toJSON();
* console.log(result); //{ myProp: 'someValue' }
*
*
* let obj = new FluentAssign<any>;
* setAssignMethod(obj, 'myProp', true); // applying writeOnce
* obj.myProp('someValue');
* obj.myProp('someValue'); // ERROR: Overriding config property 'myProp' is not allowed.
* @return {?}
*/
export function setAssignMethod(obj, propertyName, writeOnce) {
var _this = this;
if (writeOnce === void 0) { writeOnce = false; }
validateMethodName.call(obj, propertyName);
/** @type {?} */
var key = privateKey(propertyName);
objectDefinePropertyValue(obj, propertyName, (/**
* @param {?} value
* @return {?}
*/
function (value) {
if (writeOnce && _this.hasOwnProperty(key)) {
throw new Error("Overriding config property '" + propertyName + "' is not allowed.");
}
obj[key] = value;
return obj;
}));
}
/**
* Create a function for setting a value that is an alias to an other setter function.
* @template T
* @param {?} obj The object to apply the key & setter on.
* @param {?} propertyName The name of the property on the object
* @param {?} srcPropertyName The name of the property on the object this alias points to
* @param {?=} hard If true, will set a readonly property on the object that returns
* the value of the source property. Default: false
*
* Example:
* let obj = new FluentAssign<any> ;
* setAssignMethod(obj, 'myProp');
* setAssignAlias(obj, 'myPropAlias', 'myProp');
* obj.myPropAlias('someValue');
* const result = obj.toJSON();
* console.log(result); //{ myProp: 'someValue' }
* result.myPropAlias // undefined
*
*
* let obj = new FluentAssign<any> ;
* setAssignMethod(obj, 'myProp');
* setAssignAlias(obj, 'myPropAlias', 'myProp', true); // setting a hard alias.
* obj.myPropAlias('someValue');
* const result = obj.toJSON();
* console.log(result); //{ myProp: 'someValue' }
* result.myPropAlias // someValue
* @return {?}
*/
export function setAssignAlias(obj, propertyName, srcPropertyName, hard) {
if (hard === void 0) { hard = false; }
validateMethodName.call(obj, propertyName);
objectDefinePropertyValue(obj, propertyName, (/**
* @param {?} value
* @return {?}
*/
function (value) {
obj[srcPropertyName](value);
return obj;
}));
if (hard === true) {
/** @type {?} */
var key = privateKey(propertyName);
/** @type {?} */
var srcKey_1 = privateKey(srcPropertyName);
Object.defineProperty(obj, key, (/** @type {?} */ ({
configurable: false,
enumerable: false,
get: (/**
* @return {?}
*/
function () { return obj[srcKey_1]; })
})));
}
}
/**
* @record
* @template Z
*/
export function IFluentAssignFactory() { }
if (false) {
/** @type {?} */
IFluentAssignFactory.prototype.fluentAssign;
/**
* @param {?} name
* @param {?=} defaultValue
* @return {?}
*/
IFluentAssignFactory.prototype.setMethod = function (name, defaultValue) { };
}
/**
* Represent a fluent API factory wrapper for defining FluentAssign instances.
* @template T
*/
var /**
* Represent a fluent API factory wrapper for defining FluentAssign instances.
* @template T
*/
FluentAssignFactory = /** @class */ (function () {
function FluentAssignFactory(fluentAssign) {
this._fluentAssign =
fluentAssign instanceof FluentAssign ? fluentAssign : (/** @type {?} */ (new FluentAssign()));
}
/**
* Create a setter method on the FluentAssign instance.
* @param name The name of the setter function.
* @param defaultValue If set (not undefined) set's the value on the instance immediately.
*/
/**
* Create a setter method on the FluentAssign instance.
* @param {?} name The name of the setter function.
* @param {?=} defaultValue If set (not undefined) set's the value on the instance immediately.
* @return {?}
*/
FluentAssignFactory.prototype.setMethod = /**
* Create a setter method on the FluentAssign instance.
* @param {?} name The name of the setter function.
* @param {?=} defaultValue If set (not undefined) set's the value on the instance immediately.
* @return {?}
*/
function (name, defaultValue) {
setAssignMethod(this._fluentAssign, name);
if (defaultValue !== undefined) {
((/** @type {?} */ (this._fluentAssign)))[name](defaultValue);
}
return this;
};
Object.defineProperty(FluentAssignFactory.prototype, "fluentAssign", {
/**
* The FluentAssign instance.
*/
get: /**
* The FluentAssign instance.
* @return {?}
*/
function () {
return this._fluentAssign;
},
enumerable: true,
configurable: true
});
return FluentAssignFactory;
}());
/**
* Represent a fluent API factory wrapper for defining FluentAssign instances.
* @template T
*/
export { FluentAssignFactory };
if (false) {
/**
* @type {?}
* @private
*/
FluentAssignFactory.prototype._fluentAssign;
}
/**
* Represent an object where every property is a function representing an assignment function.
* Calling each function with a value will assign the value to the object and return the object.
* Calling 'toJSON' returns an object with the same properties but this time representing the
* assigned values.
*
* This allows setting an object in a fluent API manner.
* Example:
* let fluent = new FluentAssign<any>(undefined, ['some', 'went']);
* fluent.some('thing').went('wrong').toJSON();
* // { some: 'thing', went: 'wrong' }
* @template T
*/
var /**
* Represent an object where every property is a function representing an assignment function.
* Calling each function with a value will assign the value to the object and return the object.
* Calling 'toJSON' returns an object with the same properties but this time representing the
* assigned values.
*
* This allows setting an object in a fluent API manner.
* Example:
* let fluent = new FluentAssign<any>(undefined, ['some', 'went']);
* fluent.some('thing').went('wrong').toJSON();
* // { some: 'thing', went: 'wrong' }
* @template T
*/
FluentAssign = /** @class */ (function () {
/**
*
* @param defaultValues An object representing default values for the underlying object.
* @param initialSetters A list of initial setters for this FluentAssign.
* @param baseType the class/type to create a new base. optional, {} is used if not supplied.
*/
function FluentAssign(defaultValues, initialSetters, baseType) {
var _this = this;
if (Array.isArray(defaultValues)) {
((/** @type {?} */ (defaultValues))).forEach((/**
* @param {?} d
* @return {?}
*/
function (d) { return applyDefaultValues(_this, d); }));
}
else if (defaultValues) {
applyDefaultValues(this, defaultValues);
}
if (Array.isArray(initialSetters)) {
initialSetters.forEach((/**
* @param {?} name
* @return {?}
*/
function (name) { return setAssignMethod(_this, name); }));
}
if (baseType) {
this.__fluent$base__ = baseType;
}
}
/**
* Returns a FluentAssignFactory<FluentAssign<T>> ready to define a FluentAssign type.
* @param defaultValues An object representing default values for the instance.
* @param initialSetters A list of initial setters for the instance.
*/
/**
* Returns a FluentAssignFactory<FluentAssign<T>> ready to define a FluentAssign type.
* @template T
* @param {?=} defaultValues An object representing default values for the instance.
* @param {?=} initialSetters A list of initial setters for the instance.
* @return {?}
*/
FluentAssign.compose = /**
* Returns a FluentAssignFactory<FluentAssign<T>> ready to define a FluentAssign type.
* @template T
* @param {?=} defaultValues An object representing default values for the instance.
* @param {?=} initialSetters A list of initial setters for the instance.
* @return {?}
*/
function (defaultValues, initialSetters) {
return (/** @type {?} */ (FluentAssign.composeWith(new FluentAssign(defaultValues, initialSetters))));
};
/**
* Returns a FluentAssignFactory<Z> where Z is an instance of FluentAssign<?> or a derived
* class of it.
* @param fluentAssign An instance of FluentAssign<?> or a derived class of FluentAssign<?>.
*/
/**
* Returns a FluentAssignFactory<Z> where Z is an instance of FluentAssign<?> or a derived
* class of it.
* @template Z
* @param {?} fluentAssign An instance of FluentAssign<?> or a derived class of FluentAssign<?>.
* @return {?}
*/
FluentAssign.composeWith = /**
* Returns a FluentAssignFactory<Z> where Z is an instance of FluentAssign<?> or a derived
* class of it.
* @template Z
* @param {?} fluentAssign An instance of FluentAssign<?> or a derived class of FluentAssign<?>.
* @return {?}
*/
function (fluentAssign) {
return (/** @type {?} */ (new FluentAssignFactory((/** @type {?} */ (fluentAssign)))));
};
/**
* @return {?}
*/
FluentAssign.prototype.toJSON = /**
* @return {?}
*/
function () {
var _this = this;
return getAssignedPropertyNames(this)
.reduce((/**
* @param {?} obj
* @param {?} name
* @return {?}
*/
function (obj, name) {
/** @type {?} */
var key = privateKey(name);
// re-define property descriptors (we dont want their value)
/** @type {?} */
var propDesc = Object.getOwnPropertyDescriptor(_this, key);
if (propDesc) {
Object.defineProperty(obj, name, propDesc);
}
else {
((/** @type {?} */ (obj)))[name] = ((/** @type {?} */ (_this)))[key];
}
return obj;
}), this.__fluent$base__ ? new this.__fluent$base__() : (/** @type {?} */ ({})));
};
return FluentAssign;
}());
/**
* Represent an object where every property is a function representing an assignment function.
* Calling each function with a value will assign the value to the object and return the object.
* Calling 'toJSON' returns an object with the same properties but this time representing the
* assigned values.
*
* This allows setting an object in a fluent API manner.
* Example:
* let fluent = new FluentAssign<any>(undefined, ['some', 'went']);
* fluent.some('thing').went('wrong').toJSON();
* // { some: 'thing', went: 'wrong' }
* @template T
*/
export { FluentAssign };
if (false) {
/**
* @type {?}
* @private
*/
FluentAssign.prototype.__fluent$base__;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmx1ZW50LWFzc2lnbi5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1tb2RpYWxvZy0xMC8iLCJzb3VyY2VzIjpbImxpYi9mcmFtZXdvcmsvZmx1ZW50LWFzc2lnbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7SUFFTSxjQUFjLEdBQUcsSUFBSTs7SUFDckIsY0FBYyxHQUFHLFdBQVc7Ozs7O0FBRWxDLFNBQVMsa0JBQWtCLENBQUMsSUFBWTtJQUN0QyxJQUFJLENBQUMsSUFBSSxFQUFFO1FBQ1QsTUFBTSxJQUFJLEtBQUssQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO0tBQzFFO1NBQU0sSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFO1FBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQWtCLElBQUksdUJBQW9CLENBQUMsQ0FBQztLQUM3RDtBQUNILENBQUM7Ozs7OztBQU1ELFNBQVMsd0JBQXdCLENBQUMsT0FBWTtJQUM1QyxPQUFPLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUM7U0FDdkMsTUFBTTs7OztJQUFDLFVBQUEsSUFBSSxJQUFJLE9BQUEsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBekIsQ0FBeUIsRUFBQztTQUN6QyxHQUFHOzs7O0lBQUMsVUFBQSxJQUFJLElBQUksT0FBQSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFkLENBQWMsRUFBQyxDQUFDO0FBQ2pDLENBQUM7Ozs7O0FBRUQsTUFBTSxVQUFVLFVBQVUsQ0FBQyxJQUFZO0lBQ3JDLE9BQU8sY0FBYyxHQUFHLElBQUksQ0FBQztBQUMvQixDQUFDOzs7Ozs7O0FBRUQsU0FBUyx5QkFBeUIsQ0FBQyxHQUFRLEVBQUUsWUFBWSxFQUFFLEtBQTJCO0lBQ3BGLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFLFlBQVksRUFBRSxtQkFBSztRQUM1QyxZQUFZLEVBQUUsS0FBSztRQUNuQixVQUFVLEVBQUUsS0FBSztRQUNqQixRQUFRLEVBQUUs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RUQ7Ozs7T0FJRzs7Ozs7Ozs7SUFDSSx3QkFBVzs7Ozs7OztJQUFsQixVQUFzQixZQUFlO1FBQ25DLE9BQU8sbUJBQUssSUFBSSxtQkFBbUIsQ0FBTSxtQkFBSyxZQUFZLEVBQUEsQ0FBQyxFQUFBLENBQUM7SUFDOUQsQ0FBQzs7OztJQXlCRCw2QkFBTTs7O0lBQU47UUFBQSxpQkFhQztRQVpDLE9BQU8sd0JBQXdCLENBQUMsSUFBSSxDQUFDO2FBQ2xDLE1BQU07Ozs7O1FBQUMsVUFBQyxHQUFNLEVBQUUsSUFBWTs7Z0JBQ3JCLEdBQUcsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDOzs7Z0JBRXRCLFFBQVEsR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQUMsS0FBSSxFQUFFLEdBQUcsQ0FBQztZQUMzRCxJQUFJLFFBQVEsRUFBRTtnQkFDWixNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7YUFDNUM7aUJBQU07Z0JBQ0wsQ0FBQyxtQkFBSyxHQUFHLEVBQUEsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsbUJBQUssS0FBSSxFQUFBLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzthQUNyQztZQUNELE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQyxHQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQyxtQkFBSyxFQUFFLEVBQUEsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFDSCxtQkFBQztBQUFELENBQUMsQUE1REQsSUE0REM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBM0RDLHVDQUFxQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4dGVuZCwgYXJyYXlVbmlvbiB9IGZyb20gJy4vdXRpbHMnO1xuXG5jb25zdCBQUklWQVRFX1BSRUZJWCA9ICckJCc7XG5jb25zdCBSRVNFUlZFRF9SRUdFWCA9IC9eKFxcJFxcJCkuKi87XG5cbmZ1bmN0aW9uIHZhbGlkYXRlTWV0aG9kTmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgaWYgKCFuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbGxlZ2FsIG1ldGhvZCBuYW1lLiBFbXB0eSBtZXRob2QgbmFtZSBpcyBub3QgYWxsb3dlZGApO1xuICB9IGVsc2UgaWYgKG5hbWUgaW4gdGhpcykge1xuICAgIHRocm93IG5ldyBFcnJvcihgQSBtZW1iZXIgbmFtZSAnJHtuYW1lfScgYWxyZWFkeSBkZWZpbmVkLmApO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGxpc3Qgb2YgYXNzaWduZWQgcHJvcGVydHkgbmFtZXMgKG5vbiBwcml2YXRlKVxuICogQHBhcmFtIHN1YmplY3RcbiAqL1xuZnVuY3Rpb24gZ2V0QXNzaWduZWRQcm9wZXJ0eU5hbWVzKHN1YmplY3Q6IGFueSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHN1YmplY3QpXG4gICAgLmZpbHRlcihuYW1lID0+IFJFU0VSVkVEX1JFR0VYLnRlc3QobmFtZSkpXG4gICAgLm1hcChuYW1lID0+IG5hbWUuc3Vic3RyKDIpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVLZXkobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIFBSSVZBVEVfUFJFRklYICsgbmFtZTtcbn1cblxuZnVuY3Rpb24gb2JqZWN0RGVmaW5lUHJvcGVydHlWYWx1ZShvYmo6IGFueSwgcHJvcGVydHlOYW1lLCB2YWx1ZTogKHZhbHVlOiBhbnkpID0+IHZvaWQpOiB2b2lkIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgcHJvcGVydHlOYW1lLCA8YW55PntcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICB2YWx1ZVxuICB9KTtcbn1cblxuLyoqXG4gKiBHaXZlbiBhIEZsdWVudEFzc2lnbiBpbnN0YW5jZSwgYXBwbHkgYWxsIG9mIHRoZSBzdXBwbGllZCBkZWZhdWx0IHZhbHVlcyBzbyBjYWxsaW5nXG4gKiBpbnN0YW5jZS50b0pTT04gd2lsbCByZXR1cm4gdGhvc2UgdmFsdWVzIChkb2VzIG5vdCBjcmVhdGUgYSBzZXR0ZXIgZnVuY3Rpb24pXG4gKiBAcGFyYW0gaW5zdGFuY2VcbiAqIEBwYXJhbSBkZWZhdWx0VmFsdWVzXG4gKi9cbmZ1bmN0aW9uIGFwcGx5RGVmYXVsdFZhbHVlcyhpbnN0YW5jZTogYW55LCBkZWZhdWx0VmFsdWVzOiBPYmplY3QpOiB2b2lkIHtcbiAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZGVmYXVsdFZhbHVlcylcbiAgICAuZm9yRWFjaChuYW1lID0+ICg8YW55Pmluc3RhbmNlKVtwcml2YXRlS2V5KG5hbWUpXSA9ICg8YW55PmRlZmF1bHRWYWx1ZXMpW25hbWVdKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBmdW5jdGlvbiBmb3Igc2V0dGluZyBhIHZhbHVlIGZvciBhIHByb3BlcnR5IG9uIGEgZ2l2ZW4gb2JqZWN0LlxuICogQHBhcmFtIG9iaiBUaGUgb2JqZWN0IHRvIGFwcGx5IHRoZSBrZXkgJiBzZXR0ZXIgb24uXG4gKiBAcGFyYW0gcHJvcGVydHlOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBvbiB0aGUgb2JqZWN0XG4gKiBAcGFyYW0gd3JpdGVPbmNlIElmIHRydWUgd2lsbCBhbGxvdyB3cml0aW5nIG9uY2UgKGRlZmF1bHQ6IGZhbHNlKVxuICpcbiAqIEV4YW1wbGU6XG4gKiBsZXQgb2JqID0gbmV3IEZsdWVudEFzc2lnbjxhbnk+O1xuICogc2V0QXNzaWduTWV0aG9kKG9iaiwgJ215UHJvcCcpO1xuICogb2JqLm15UHJvcCgnc29tZVZhbHVlJyk7XG4gKiBjb25zdCByZXN1bHQgPSBvYmoudG9KU09OKCk7XG4gKiBjb25zb2xlLmxvZyhyZXN1bHQpOyAvL3sgbXlQcm9wOiAnc29tZVZhbHVlJyB9XG4gKlxuICpcbiAqIGxldCBvYmogPSBuZXcgRmx1ZW50QXNzaWduPGFueT47XG4gKiBzZXRBc3NpZ25NZXRob2Qob2JqLCAnbXlQcm9wJywgdHJ1ZSk7IC8vIGFwcGx5aW5nIHdyaXRlT25jZVxuICogb2JqLm15UHJvcCgnc29tZVZhbHVlJyk7XG4gKiBvYmoubXlQcm9wKCdzb21lVmFsdWUnKTsgLy8gRVJST1I6IE92ZXJyaWRpbmcgY29uZmlnIHByb3BlcnR5ICdteVByb3AnIGlzIG5vdCBhbGxvd2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0QXNzaWduTWV0aG9kPFQ+KG9iajogVCwgcHJvcGVydHlOYW1lOiBzdHJpbmcsIHdyaXRlT25jZTogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XG4gIHZhbGlkYXRlTWV0aG9kTmFtZS5jYWxsKG9iaiwgcHJvcGVydHlOYW1lKTtcblxuICBjb25zdCBrZXkgPSBwcml2YXRlS2V5KHByb3BlcnR5TmFtZSk7XG4gIG9iamVjdERlZmluZVByb3BlcnR5VmFsdWUob2JqLCBwcm9wZXJ0eU5hbWUsICh2YWx1ZTogYW55KSA9PiB7XG4gICAgaWYgKHdyaXRlT25jZSAmJiB0aGlzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgT3ZlcnJpZGluZyBjb25maWcgcHJvcGVydHkgJyR7cHJvcGVydHlOYW1lfScgaXMgbm90IGFsbG93ZWQuYCk7XG4gICAgfVxuICAgIG9ialtrZXldID0gdmFsdWU7XG4gICAgcmV0dXJuIG9iajtcbiAgfSk7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgZnVuY3Rpb24gZm9yIHNldHRpbmcgYSB2YWx1ZSB0aGF0IGlzIGFuIGFsaWFzIHRvIGFuIG90aGVyIHNldHRlciBmdW5jdGlvbi5cbiAqIEBwYXJhbSBvYmogVGhlIG9iamVjdCB0byBhcHBseSB0aGUga2V5ICYgc2V0dGVyIG9uLlxuICogQHBhcmFtIHByb3BlcnR5TmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgb24gdGhlIG9iamVjdFxuICogQHBhcmFtIHNyY1Byb3BlcnR5TmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgb24gdGhlIG9iamVjdCB0aGlzIGFsaWFzIHBvaW50cyB0b1xuICogQHBhcmFtIGhhcmQgSWYgdHJ1ZSwgd2lsbCBzZXQgYSByZWFkb25seSBwcm9wZXJ0eSBvbiB0aGUgb2JqZWN0IHRoYXQgcmV0dXJuc1xuICogICAgICAgIHRoZSB2YWx1ZSBvZiB0aGUgc291cmNlIHByb3BlcnR5LiBEZWZhdWx0OiBmYWxzZVxuICpcbiAqIEV4YW1wbGU6XG4gKiBsZXQgb2JqID0gbmV3IEZsdWVudEFzc2lnbjxhbnk+IDtcbiAqIHNldEFzc2lnbk1ldGhvZChvYmosICdteVByb3AnKTtcbiAqIHNldEFzc2lnbkFsaWFzKG9iaiwgJ215UHJvcEFsaWFzJywgJ215UHJvcCcpO1xuICogb2JqLm15UHJvcEFsaWFzKCdzb21lVmFsdWUnKTtcbiAqIGNvbnN0IHJlc3VsdCA9IG9iai50b0pTT04oKTtcbiAqIGNvbnNvbGUubG9nKHJlc3VsdCk7IC8veyBteVByb3A6ICdzb21lVmFsdWUnIH1cbiAqIHJlc3VsdC5teVByb3BBbGlhcyAvLyB1bmRlZmluZWRcbiAqXG4gKlxuICogbGV0IG9iaiA9IG5ldyBGbHVlbnRBc3NpZ248YW55PiA7XG4gKiBzZXRBc3NpZ25NZXRob2Qob2JqLCAnbXlQcm9wJyk7XG4gKiBzZXRBc3NpZ25BbGlhcyhvYmosICdteVByb3BBbGlhcycsICdteVByb3AnLCB0cnVlKTsgLy8gc2V0dGluZyBhIGhhcmQgYWxpYXMuXG4gKiBvYmoubXlQcm9wQWxpYXMoJ3NvbWVWYWx1ZScpO1xuICogY29uc3QgcmVzdWx0ID0gb2JqLnRvSlNPTigpO1xuICogY29uc29sZS5sb2cocmVzdWx0KTsgLy97IG15UHJvcDogJ3NvbWVWYWx1ZScgfVxuICogcmVzdWx0Lm15UHJvcEFsaWFzIC8vIHNvbWVWYWx1ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0QXNzaWduQWxpYXM8VD4ob2JqOiBULCBwcm9wZXJ0eU5hbWU6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNQcm9wZXJ0eU5hbWU6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXJkOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgdmFsaWRhdGVNZXRob2ROYW1lLmNhbGwob2JqLCBwcm9wZXJ0eU5hbWUpO1xuXG4gIG9iamVjdERlZmluZVByb3BlcnR5VmFsdWUob2JqLCBwcm9wZXJ0eU5hbWUsICh2YWx1ZTogYW55KSA9PiB7XG4gICAgb2JqW3NyY1Byb3BlcnR5TmFtZV0odmFsdWUpO1xuICAgIHJldHVybiBvYmo7XG4gIH0pO1xuXG4gIGlmIChoYXJkID09PSB0cnVlKSB7XG4gICAgY29uc3Qga2V5ID0gcHJpdmF0ZUtleShwcm9wZXJ0eU5hbWUpLFxuICAgICAgc3JjS2V5ID0gcHJpdmF0ZUtleShzcmNQcm9wZXJ0eU5hbWUpO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCA8YW55PntcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGdldDogKCkgPT4gb2JqW3NyY0tleV1cbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIERlc2NyaWJlcyBhIGZsdWVudCBhc3NpZ24gbWV0aG9kLlxuICogQSBmdW5jdGlvbiB0aGF0IGdldHMgYSB2YWx1ZSBhbmQgcmV0dXJucyB0aGUgaW5zdGFuY2UgaXQgd29ya3Mgb24uXG4gKi9cbmV4cG9ydCB0eXBlIEZsdWVudEFzc2lnbk1ldGhvZDxULCBaPiA9ICh2YWx1ZTogVCkgPT4gWjtcblxuXG5leHBvcnQgaW50ZXJmYWNlIElGbHVlbnRBc3NpZ25GYWN0b3J5PFo+IHtcbiAgZmx1ZW50QXNzaWduOiBaO1xuXG4gIHNldE1ldGhvZChuYW1lOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZT86IGFueSk6IElGbHVlbnRBc3NpZ25GYWN0b3J5PFo+O1xufVxuXG4vKipcbiAqIFJlcHJlc2VudCBhIGZsdWVudCBBUEkgZmFjdG9yeSB3cmFwcGVyIGZvciBkZWZpbmluZyBGbHVlbnRBc3NpZ24gaW5zdGFuY2VzLlxuICovXG5leHBvcnQgY2xhc3MgRmx1ZW50QXNzaWduRmFjdG9yeTxUPiB7XG4gIHByaXZhdGUgX2ZsdWVudEFzc2lnbjogRmx1ZW50QXNzaWduPFQ+O1xuXG4gIGNvbnN0cnVjdG9yKGZsdWVudEFzc2lnbj86IEZsdWVudEFzc2lnbjxUPikge1xuICAgIHRoaXMuX2ZsdWVudEFzc2lnbiA9XG4gICAgICBmbHVlbnRBc3NpZ24gaW5zdGFuY2VvZiBGbHVlbnRBc3NpZ24gPyBmbHVlbnRBc3NpZ24gOiA8YW55Pm5ldyBGbHVlbnRBc3NpZ24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBzZXR0ZXIgbWV0aG9kIG9uIHRoZSBGbHVlbnRBc3NpZ24gaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBzZXR0ZXIgZnVuY3Rpb24uXG4gICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgSWYgc2V0IChub3QgdW5kZWZpbmVkKSBzZXQncyB0aGUgdmFsdWUgb24gdGhlIGluc3RhbmNlIGltbWVkaWF0ZWx5LlxuICAgKi9cbiAgc2V0TWV0aG9kKG5hbWU6IHN0cmluZywgZGVmYXVsdFZhbHVlPzogYW55KTogRmx1ZW50QXNzaWduRmFjdG9yeTxUPiB7XG4gICAgc2V0QXNzaWduTWV0aG9kKHRoaXMuX2ZsdWVudEFzc2lnbiwgbmFtZSk7XG4gICAgaWYgKGRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAoPGFueT50aGlzLl9mbHVlbnRBc3NpZ24pW25hbWVdKGRlZmF1bHRWYWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBGbHVlbnRBc3NpZ24gaW5zdGFuY2UuXG4gICAqL1xuICBnZXQgZmx1ZW50QXNzaWduKCk6IEZsdWVudEFzc2lnbjxUPiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZsdWVudEFzc2lnbjtcbiAgfVxufVxuXG5cbi8qKlxuICogUmVwcmVzZW50IGFuIG9iamVjdCB3aGVyZSBldmVyeSBwcm9wZXJ0eSBpcyBhIGZ1bmN0aW9uIHJlcHJlc2VudGluZyBhbiBhc3NpZ25tZW50IGZ1bmN0aW9uLlxuICogQ2FsbGluZyBlYWNoIGZ1bmN0aW9uIHdpdGggYSB2YWx1ZSB3aWxsIGFzc2lnbiB0aGUgdmFsdWUgdG8gdGhlIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBvYmplY3QuXG4gKiBDYWxsaW5nICd0b0pTT04nIHJldHVybnMgYW4gb2JqZWN0IHdpdGggdGhlIHNhbWUgcHJvcGVydGllcyBidXQgdGhpcyB0aW1lIHJlcHJlc2VudGluZyB0aGVcbiAqIGFzc2lnbmVkIHZhbHVlcy5cbiAqXG4gKiBUaGlzIGFsbG93cyBzZXR0aW5nIGFuIG9iamVjdCBpbiBhIGZsdWVudCBBUEkgbWFubmVyLlxuICogRXhhbXBsZTpcbiBsZXQgZmx1ZW50ID0gbmV3IEZsdWVudEFzc2lnbjxhbnk+KHVuZGVmaW5lZCwgWydzb21lJywgJ3dlbnQnXSk7XG4gZmx1ZW50LnNvbWUoJ3RoaW5nJykud2VudCgnd3JvbmcnKS50b0pTT04oKTtcbiAvLyB7IHNvbWU6ICd0aGluZycsIHdlbnQ6ICd3cm9uZycgfVxuICovXG5leHBvcnQgY2xhc3MgRmx1ZW50QXNzaWduPFQ+IHtcbiAgcHJpdmF0ZSBfX2ZsdWVudCRiYXNlX186IG5ldyAoKSA9PiBUO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgRmx1ZW50QXNzaWduRmFjdG9yeTxGbHVlbnRBc3NpZ248VD4+IHJlYWR5IHRvIGRlZmluZSBhIEZsdWVudEFzc2lnbiB0eXBlLlxuICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlcyBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBpbml0aWFsU2V0dGVycyBBIGxpc3Qgb2YgaW5pdGlhbCBzZXR0ZXJzIGZvciB0aGUgaW5zdGFuY2UuXG4gICAqL1xuICBzdGF0aWMgY29tcG9zZTxUPihkZWZhdWx0VmFsdWVzPzogVCwgaW5pdGlhbFNldHRlcnM/OiBzdHJpbmdbXSk6IEZsdWVudEFzc2lnbkZhY3Rvcnk8VD4ge1xuXG4gICAgcmV0dXJuIDxhbnk+Rmx1ZW50QXNzaWduLmNvbXBvc2VXaXRoPEZsdWVudEFzc2lnbjxUPj4oXG4gICAgICBuZXcgRmx1ZW50QXNzaWduPFQ+KGRlZmF1bHRWYWx1ZXMsIGluaXRpYWxTZXR0ZXJzKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIEZsdWVudEFzc2lnbkZhY3Rvcnk8Wj4gd2hlcmUgWiBpcyBhbiBpbnN0YW5jZSBvZiBGbHVlbnRBc3NpZ248Pz4gb3IgYSBkZXJpdmVkXG4gICAqIGNsYXNzIG9mIGl0LlxuICAgKiBAcGFyYW0gZmx1ZW50QXNzaWduIEFuIGluc3RhbmNlIG9mIEZsdWVudEFzc2lnbjw/PiBvciBhIGRlcml2ZWQgY2xhc3Mgb2YgRmx1ZW50QXNzaWduPD8+LlxuICAgKi9cbiAgc3RhdGljIGNvbXBvc2VXaXRoPFo+KGZsdWVudEFzc2lnbjogWik6IElGbHVlbnRBc3NpZ25GYWN0b3J5PFo+IHtcbiAgICByZXR1cm4gPGFueT5uZXcgRmx1ZW50QXNzaWduRmFjdG9yeTxhbnk+KDxhbnk+Zmx1ZW50QXNzaWduKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlcyBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgdW5kZXJseWluZyBvYmplY3QuXG4gICAqIEBwYXJhbSBpbml0aWFsU2V0dGVycyBBIGxpc3Qgb2YgaW5pdGlhbCBzZXR0ZXJzIGZvciB0aGlzIEZsdWVudEFzc2lnbi5cbiAgICogQHBhcmFtIGJhc2VUeXBlIHRoZSBjbGFzcy90eXBlIHRvIGNyZWF0ZSBhIG5ldyBiYXNlLiBvcHRpb25hbCwge30gaXMgdXNlZCBpZiBub3Qgc3VwcGxpZWQuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihkZWZhdWx0VmFsdWVzPzogVCB8IFRbXSwgaW5pdGlhbFNldHRlcnM/OiBzdHJpbmdbXSwgYmFzZVR5cGU/OiBuZXcgKCkgPT4gVCkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGRlZmF1bHRWYWx1ZXMpKSB7XG4gICAgICAoZGVmYXVsdFZhbHVlcyBhcyBBcnJheTxhbnk+KS5mb3JFYWNoKGQgPT4gYXBwbHlEZWZhdWx0VmFsdWVzKHRoaXMsIGQpKTtcbiAgICB9IGVsc2UgaWYgKGRlZmF1bHRWYWx1ZXMpIHtcbiAgICAgIGFwcGx5RGVmYXVsdFZhbHVlcyh0aGlzLCBkZWZhdWx0VmFsdWVzKTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShpbml0aWFsU2V0dGVycykpIHtcblxuICAgICAgaW5pdGlhbFNldHRlcnMuZm9yRWFjaChuYW1lID0+IHNldEFzc2lnbk1ldGhvZCh0aGlzLCBuYW1lKSk7XG4gICAgfVxuXG4gICAgaWYgKGJhc2VUeXBlKSB7XG4gICAgICB0aGlzLl9fZmx1ZW50JGJhc2VfXyA9IGJhc2VUeXBlO1xuICAgIH1cbiAgfVxuXG4gIHRvSlNPTigpOiBUIHtcbiAgICByZXR1cm4gZ2V0QXNzaWduZWRQcm9wZXJ0eU5hbWVzKHRoaXMpXG4gICAgICAucmVkdWNlKChvYmo6IFQsIG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBrZXkgPSBwcml2YXRlS2V5KG5hbWUpO1xuICAgICAgICAvLyByZS1kZWZpbmUgcHJvcGVydHkgZGVzY3JpcHRvcnMgKHdlIGRvbnQgd2FudCB0aGVpciB2YWx1ZSlcbiAgICAgICAgY29uc3QgcHJvcERlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMsIGtleSk7XG4gICAgICAgIGlmIChwcm9wRGVzYykge1xuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIG5hbWUsIHByb3BEZXNjKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAoPGFueT5vYmopW25hbWVdID0gKDxhbnk+dGhpcylba2V5XTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgfSwgdGhpcy5fX2ZsdWVudCRiYXNlX18gPyBuZXcgdGhpcy5fX2ZsdWVudCRiYXNlX18oKSA6IDxhbnk+e30pO1xuICB9XG59XG4iXX0=