com.phloxui
Version:
PhloxUI Ng2+ Framework
228 lines (227 loc) • 32.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import { DataUtils } from '../share/utils/DataUtils';
import { ArrayUtils } from '../share/utils/ArrayUtils';
/**
* @param {?=} options
* @return {?}
*/
export function I18N(options) {
// Set default option values
let /** @type {?} */ bypass = false;
let /** @type {?} */ key = undefined;
let /** @type {?} */ init = true;
if (options !== null && typeof options !== 'undefined') {
if (typeof options === 'object') {
if (!Array.isArray(options)) {
if (options.key !== null && typeof options.key === 'string') {
key = options.key;
}
if (options.bypass !== null && typeof options.bypass === 'boolean') {
bypass = options.bypass;
}
if (options.init !== null && typeof options.init === 'boolean') {
init = options.init;
}
}
}
else if (typeof options === 'string') {
key = options;
}
else if (typeof options === 'boolean') {
bypass = options;
}
}
return function (target, propertyKey, descriptor) {
let /** @type {?} */ propKey = key || propertyKey;
let /** @type {?} */ i18nProxyMap = target['_i18nProxies_'];
if (!Object.prototype.hasOwnProperty.call(target, '_i18nProxies_')) {
let /** @type {?} */ parentProxiesMap = i18nProxyMap;
if (typeof parentProxiesMap === 'object') {
i18nProxyMap = JSON.parse(JSON.stringify(parentProxiesMap));
}
else {
i18nProxyMap = {};
}
Object.defineProperty(target, '_i18nProxies_', {
value: i18nProxyMap,
enumerable: false,
writable: false
});
}
let /** @type {?} */ proxy = {
applyI18N: function (i18n, initMode = false) {
if (initMode && !init) {
// This method is called during ngOnInit (initMode=true) but
// field's auto init is set to false. So, do nothing.
return;
}
if (typeof i18n === 'undefined') {
return;
}
if (this['_i18nValues_'] === null || typeof this['_i18nValues_'] === 'undefined' || typeof this['_i18nValues_'] !== 'object') {
Object.defineProperty(this, '_i18nValues_', {
value: {},
enumerable: false,
writable: false
});
}
let /** @type {?} */ i18nValue = this['_i18nValues_'][propKey];
if (i18nValue === null || typeof i18nValue === 'undefined' || typeof i18nValue !== 'object' || typeof i18nValue['applyI18N'] !== 'function') {
// This field is not I18NApplicable
let /** @type {?} */ childProxyMap = undefined;
if (i18nValue !== null && typeof i18nValue !== 'undefined') {
childProxyMap = i18nValue['_i18nProxies_'];
}
if (typeof childProxyMap === 'object') {
// It has inner @I18N to be chained
for (let /** @type {?} */ childKey in childProxyMap) {
if (typeof childProxyMap[childKey].applyI18N !== 'function') {
continue;
}
let /** @type {?} */ childBypass = false;
if (typeof childProxyMap[childKey].isBypassKey === 'function') {
childBypass = childProxyMap[childKey].isBypassKey();
}
if (i18n === null) {
childProxyMap[childKey].applyI18N.apply(i18nValue, [null]);
}
else {
if (childBypass) {
childProxyMap[childKey].applyI18N.apply(i18nValue, [i18n]);
}
else {
// We use DataUtils.getDataValue() here to support dot notation (.) format:
// foo.bar ...
if (DataUtils.containsDataKey(childKey, i18n)) {
childProxyMap[childKey].applyI18N.apply(i18nValue, [DataUtils.getDataValue(childKey, i18n)]);
}
else {
childProxyMap[childKey].applyI18N.apply(i18nValue, [undefined]);
}
}
}
}
}
else if (Array.isArray(i18nValue) && ArrayUtils.isAllMemberHasPropertyTypeOf(i18nValue, 'applyI18N', 'function')) {
// It is an array of II18NApplicable.
// We're going to applyI18N() on each member of i18nValue.
if (i18n !== null && Array.isArray(i18n)) {
// If the given "i18n" is an array, we'll applyI18N 1-by-1.
let /** @type {?} */ idx;
for (idx = 0; idx < i18nValue.length && idx < i18n.length; idx++) {
i18nValue[idx].applyI18N(i18n[idx]);
}
for (; idx < i18nValue.length; idx++) {
// Apply "null" for all members left.
i18nValue[idx].applyI18N(null);
}
}
else {
// Apply all members with the same "i18n" value.
for (let /** @type {?} */ member of i18nValue) {
member.applyI18N(i18n);
}
}
}
else {
// It has no inner @I18N to be chained.
// So, set value into it directly.
this['_i18nValues_'][propKey] = i18n;
}
}
else {
// Delegate method call to I18NApplicable
i18nValue.applyI18N(i18n);
}
},
getValue: function () {
if (this['_i18nValues_'] === null || typeof this['_i18nValues_'] === 'undefined' || typeof this['_i18nValues_'] !== 'object') {
return undefined;
}
return this['_i18nValues_'][propKey];
},
setValue: function (value) {
if (this['_i18nValues_'] === null || typeof this['_i18nValues_'] === 'undefined' || typeof this['_i18nValues_'] !== 'object') {
Object.defineProperty(this, '_i18nValues_', {
value: {},
enumerable: false,
writable: false
});
}
this['_i18nValues_'][propKey] = value;
},
getI18NKey: function () {
return propKey;
},
isBypassKey: function () {
return bypass;
}
};
delete target[propertyKey];
Object.defineProperty(target, propertyKey, {
get: function () {
return proxy.getValue.apply(this, []);
},
set: function (value) {
proxy.setValue.apply(this, [value]);
},
enumerable: true
});
i18nProxyMap[propKey] = proxy;
// Wrap ngOnInit() to automatically call applyI18N() method.
if (typeof target['ngOnInit'] === 'function' && !target['_i18nNgOnInitWrapped_']) {
// Keep original ngOnInit() function to call it before resolving I18N field values.
let /** @type {?} */ originalInit = target['ngOnInit'];
// Re-implement the ngOnInit() function.
target['ngOnInit'] = function () {
// Call original ngOnInit() first
originalInit.call(this);
// We've to check the flag "_i18nNgOnInitExecuted_" to make sure that it will be executed only once.
if (!this['_i18nNgOnInitExecuted_']) {
let /** @type {?} */ value = this.i18nValue;
let /** @type {?} */ i18nProxyMap = this['_i18nProxies_'];
if (typeof i18nProxyMap === 'object') {
for (let /** @type {?} */ childKey in i18nProxyMap) {
if (typeof i18nProxyMap[childKey].applyI18N !== 'function') {
continue;
}
// check bypass
let /** @type {?} */ childBypass = false;
if (typeof i18nProxyMap[childKey].isBypassKey === 'function') {
childBypass = i18nProxyMap[childKey].isBypassKey();
}
if (childBypass) {
// Passing initMode = true
i18nProxyMap[childKey].applyI18N.apply(this, [value, true]);
}
else {
if (value === null) {
// Passing initMode = true
i18nProxyMap[childKey].applyI18N.apply(this, [null, true]);
}
else {
// We use DataUtils.getDataValue() here to support i18nKey in dot notation (.) format:
// foo.bar ...
if (DataUtils.containsDataKey(childKey, value)) {
// Passing initMode = true
i18nProxyMap[childKey].applyI18N.apply(this, [DataUtils.getDataValue(childKey, value), true]);
}
else {
// Passing initMode = true
i18nProxyMap[childKey].applyI18N.apply(this, [undefined, true]);
}
}
}
}
}
this['_i18nNgOnInitExecuted_'] = true;
}
};
target['_i18nNgOnInitWrapped_'] = true;
}
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSTE4Ti5kZWNvcmF0b3IuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9jb20ucGhsb3h1aS8iLCJzb3VyY2VzIjpbImxpYi9kZWNvcmF0b3IvSTE4Ti5kZWNvcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7Ozs7O0FBRXZELE1BQU0sZUFBZSxPQUFhOztJQUVoQyxxQkFBSSxNQUFNLEdBQVksS0FBSyxDQUFDO0lBQzVCLHFCQUFJLEdBQUcsR0FBVyxTQUFTLENBQUM7SUFDNUIscUJBQUksSUFBSSxHQUFZLElBQUksQ0FBQztJQUV6QixFQUFFLENBQUMsQ0FBQyxPQUFPLEtBQUssSUFBSSxJQUFJLE9BQU8sT0FBTyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDdkQsRUFBRSxDQUFDLENBQUMsT0FBTyxPQUFPLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNoQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM1QixFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxLQUFLLElBQUksSUFBSSxPQUFPLE9BQU8sQ0FBQyxHQUFHLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztvQkFDNUQsR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUM7aUJBQ25CO2dCQUNELEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssSUFBSSxJQUFJLE9BQU8sT0FBTyxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO29CQUNuRSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztpQkFDekI7Z0JBQ0QsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksT0FBTyxPQUFPLENB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SSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsSUFBSSxDQUFDO2lCQUN2QzthQUNGLENBQUE7WUFFRCxNQUFNLENBQUMsdUJBQXVCLENBQUMsR0FBRyxJQUFJLENBQUM7U0FDeEM7S0FDRixDQUFBO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRhVXRpbHMgfSBmcm9tICcuLi9zaGFyZS91dGlscy9EYXRhVXRpbHMnO1xuaW1wb3J0IHsgQXJyYXlVdGlscyB9IGZyb20gJy4uL3NoYXJlL3V0aWxzL0FycmF5VXRpbHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gSTE4TihvcHRpb25zPzogYW55KTogYW55IHtcbiAgLy8gU2V0IGRlZmF1bHQgb3B0aW9uIHZhbHVlc1xuICBsZXQgYnlwYXNzOiBib29sZWFuID0gZmFsc2U7XG4gIGxldCBrZXk6IHN0cmluZyA9IHVuZGVmaW5lZDtcbiAgbGV0IGluaXQ6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIGlmIChvcHRpb25zICE9PSBudWxsICYmIHR5cGVvZiBvcHRpb25zICE9PSAndW5kZWZpbmVkJykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShvcHRpb25zKSkge1xuICAgICAgICBpZiAob3B0aW9ucy5rZXkgIT09IG51bGwgJiYgdHlwZW9mIG9wdGlvbnMua2V5ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGtleSA9IG9wdGlvbnMua2V5O1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmJ5cGFzcyAhPT0gbnVsbCAmJiB0eXBlb2Ygb3B0aW9ucy5ieXBhc3MgPT09ICdib29sZWFuJykge1xuICAgICAgICAgIGJ5cGFzcyA9IG9wdGlvbnMuYnlwYXNzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmluaXQgIT09IG51bGwgJiYgdHlwZW9mIG9wdGlvbnMuaW5pdCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgaW5pdCA9IG9wdGlvbnMuaW5pdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnKSB7XG4gICAgICBrZXkgPSBvcHRpb25zO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdib29sZWFuJykge1xuICAgICAgYnlwYXNzID0gb3B0aW9ucztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24odGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBhbnksIGRlc2NyaXB0b3I6IGFueSkge1xuICAgIGxldCBwcm9wS2V5OiBzdHJpbmcgPSBrZXkgfHwgcHJvcGVydHlLZXk7XG5cbiAgICBsZXQgaTE4blByb3h5TWFwID0gdGFyZ2V0WydfaTE4blByb3hpZXNfJ107XG5cbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0YXJnZXQsICdfaTE4blByb3hpZXNfJykpIHtcbiAgICAgIGxldCBwYXJlbnRQcm94aWVzTWFwID0gaTE4blByb3h5TWFwO1xuXG4gICAgICBpZiAodHlwZW9mIHBhcmVudFByb3hpZXNNYXAgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGkxOG5Qcm94eU1hcCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocGFyZW50UHJveGllc01hcCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaTE4blByb3h5TWFwID0ge307XG4gICAgICB9XG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsICdfaTE4blByb3hpZXNfJywge1xuICAgICAgICB2YWx1ZTogaTE4blByb3h5TWFwLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG5cblxuICAgIGxldCBwcm94eTogYW55ID0ge1xuICAgICAgYXBwbHlJMThOOiBmdW5jdGlvbihpMThuOiBhbnksIGluaXRNb2RlOiBib29sZWFuID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKGluaXRNb2RlICYmICFpbml0KSB7XG4gICAgICAgICAgLy8gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGR1cmluZyBuZ09uSW5pdCAoaW5pdE1vZGU9dHJ1ZSkgYnV0XG4gICAgICAgICAgLy8gZmllbGQncyBhdXRvIGluaXQgaXMgc2V0IHRvIGZhbHNlLiBTbywgZG8gbm90aGluZy5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBpMThuID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpc1snX2kxOG5WYWx1ZXNfJ10gPT09IG51bGwgfHwgdHlwZW9mIHRoaXNbJ19pMThuVmFsdWVzXyddID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YgdGhpc1snX2kxOG5WYWx1ZXNfJ10gIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdfaTE4blZhbHVlc18nLCB7XG4gICAgICAgICAgICB2YWx1ZToge30sXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGkxOG5WYWx1ZTogYW55ID0gdGhpc1snX2kxOG5WYWx1ZXNfJ11bcHJvcEtleV07XG5cbiAgICAgICAgaWYgKGkxOG5WYWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgaTE4blZhbHVlID09PSAndW5kZWZpbmVkJyB8fCB0eXBlb2YgaTE4blZhbHVlICE9PSAnb2JqZWN0JyB8fCB0eXBlb2YgaTE4blZhbHVlWydhcHBseUkxOE4nXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIC8vIFRoaXMgZmllbGQgaXMgbm90IEkxOE5BcHBsaWNhYmxlXG4gICAgICAgICAgbGV0IGNoaWxkUHJveHlNYXAgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKGkxOG5WYWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgaTE4blZhbHVlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY2hpbGRQcm94eU1hcCA9IGkxOG5WYWx1ZVsnX2kxOG5Qcm94aWVzXyddO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh0eXBlb2YgY2hpbGRQcm94eU1hcCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIC8vIEl0IGhhcyBpbm5lciBASTE4TiB0byBiZSBjaGFpbmVkXG4gICAgICAgICAgICBmb3IgKGxldCBjaGlsZEtleSBpbiBjaGlsZFByb3h5TWFwKSB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgY2hpbGRQcm94eU1hcFtjaGlsZEtleV0uYXBwbHlJMThOICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGxldCBjaGlsZEJ5cGFzczogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgY2hpbGRQcm94eU1hcFtjaGlsZEtleV0uaXNCeXBhc3NLZXkgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBjaGlsZEJ5cGFzcyA9IGNoaWxkUHJveHlNYXBbY2hpbGRLZXldLmlzQnlwYXNzS2V5KCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAoaTE4biA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNoaWxkUHJveHlNYXBbY2hpbGRLZXldLmFwcGx5STE4Ti5hcHBseShpMThuVmFsdWUsIFtudWxsXSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkQnlwYXNzKSB7XG4gICAgICAgICAgICAgICAgICBjaGlsZFByb3h5TWFwW2NoaWxkS2V5XS5hcHBseUkxOE4uYXBwbHkoaTE4blZhbHVlLCBbaTE4bl0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAvLyBXZSB1c2UgRGF0YVV0aWxzLmdldERhdGFWYWx1ZSgpIGhlcmUgdG8gc3VwcG9ydCBkb3Qgbm90YXRpb24gKC4pIGZvcm1hdDpcbiAgICAgICAgICAgICAgICAgIC8vIGZvby5iYXIgLi4uXG4gICAgICAgICAgICAgICAgICBpZiAoRGF0YVV0aWxzLmNvbnRhaW5zRGF0YUtleShjaGlsZEtleSwgaTE4bikpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRQcm94eU1hcFtjaGlsZEtleV0uYXBwbHlJMThOLmFwcGx5KGkxOG5WYWx1ZSwgW0RhdGFVdGlscy5nZXREYXRhVmFsdWUoY2hpbGRLZXksIGkxOG4pXSk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjaGlsZFByb3h5TWFwW2NoaWxkS2V5XS5hcHBseUkxOE4uYXBwbHkoaTE4blZhbHVlLCBbdW5kZWZpbmVkXSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGkxOG5WYWx1ZSkgJiYgQXJyYXlVdGlscy5pc0FsbE1lbWJlckhhc1Byb3BlcnR5VHlwZU9mKGkxOG5WYWx1ZSwgJ2FwcGx5STE4TicsICdmdW5jdGlvbicpKSB7XG4gICAgICAgICAgICAvLyBJdCBpcyBhbiBhcnJheSBvZiBJSTE4TkFwcGxpY2FibGUuXG4gICAgICAgICAgICAvLyBXZSdyZSBnb2luZyB0byBhcHBseUkxOE4oKSBvbiBlYWNoIG1lbWJlciBvZiBpMThuVmFsdWUuXG4gICAgICAgICAgICBpZiAoaTE4biAhPT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KGkxOG4pKSB7XG4gICAgICAgICAgICAgIC8vIElmIHRoZSBnaXZlbiBcImkxOG5cIiBpcyBhbiBhcnJheSwgd2UnbGwgYXBwbHlJMThOIDEtYnktMS5cbiAgICAgICAgICAgICAgbGV0IGlkeDogbnVtYmVyO1xuICAgICAgICAgICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IGkxOG5WYWx1ZS5sZW5ndGggJiYgaWR4IDwgaTE4bi5sZW5ndGg7IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgaTE4blZhbHVlW2lkeF0uYXBwbHlJMThOKGkxOG5baWR4XSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZm9yICg7IGlkeCA8IGkxOG5WYWx1ZS5sZW5ndGg7IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgLy8gQXBwbHkgXCJudWxsXCIgZm9yIGFsbCBtZW1iZXJzIGxlZnQuXG4gICAgICAgICAgICAgICAgaTE4blZhbHVlW2lkeF0uYXBwbHlJMThOKG51bGwpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBBcHBseSBhbGwgbWVtYmVycyB3aXRoIHRoZSBzYW1lIFwiaTE4blwiIHZhbHVlLlxuICAgICAgICAgICAgICBmb3IgKGxldCBtZW1iZXIgb2YgaTE4blZhbHVlKSB7XG4gICAgICAgICAgICAgICAgbWVtYmVyLmFwcGx5STE4TihpMThuKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBJdCBoYXMgbm8gaW5uZXIgQEkxOE4gdG8gYmUgY2hhaW5lZC5cbiAgICAgICAgICAgIC8vIFNvLCBzZXQgdmFsdWUgaW50byBpdCBkaXJlY3RseS5cbiAgICAgICAgICAgIHRoaXNbJ19pMThuVmFsdWVzXyddW3Byb3BLZXldID0gaTE4bjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRGVsZWdhdGUgbWV0aG9kIGNhbGwgdG8gSTE4TkFwcGxpY2FibGVcbiAgICAgICAgICBpMThuVmFsdWUuYXBwbHlJMThOKGkxOG4pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZ2V0VmFsdWU6IGZ1bmN0aW9uKCk6IGFueSB7XG4gICAgICAgIGlmICh0aGlzWydfaTE4blZhbHVlc18nXSA9PT0gbnVsbCB8fCB0eXBlb2YgdGhpc1snX2kxOG5WYWx1ZXNfJ10gPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiB0aGlzWydfaTE4blZhbHVlc18nXSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXNbJ19pMThuVmFsdWVzXyddW3Byb3BLZXldO1xuICAgICAgfSxcbiAgICAgIHNldFZhbHVlOiBmdW5jdGlvbih2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzWydfaTE4blZhbHVlc18nXSA9PT0gbnVsbCB8fCB0eXBlb2YgdGhpc1snX2kxOG5WYWx1ZXNfJ10gPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiB0aGlzWydfaTE4blZhbHVlc18nXSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ19pMThuVmFsdWVzXycsIHtcbiAgICAgICAgICAgIHZhbHVlOiB7fSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzWydfaTE4blZhbHVlc18nXVtwcm9wS2V5XSA9IHZhbHVlO1xuICAgICAgfSxcbiAgICAgIGdldEkxOE5LZXk6IGZ1bmN0aW9uKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBwcm9wS2V5O1xuICAgICAgfSxcbiAgICAgIGlzQnlwYXNzS2V5OiBmdW5jdGlvbigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGJ5cGFzcztcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZGVsZXRlIHRhcmdldFtwcm9wZXJ0eUtleV07XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSwge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHByb3h5LmdldFZhbHVlLmFwcGx5KHRoaXMsIFtdKTtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHZhbHVlOiBhbnkpIHtcbiAgICAgICAgcHJveHkuc2V0VmFsdWUuYXBwbHkodGhpcywgW3ZhbHVlXSk7XG4gICAgICB9LFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZVxuICAgIH0pO1xuXG4gICAgaTE4blByb3h5TWFwW3Byb3BLZXldID0gcHJveHk7XG5cblxuICAgIC8vIFdyYXAgbmdPbkluaXQoKSB0byBhdXRvbWF0aWNhbGx5IGNhbGwgYXBwbHlJMThOKCkgbWV0aG9kLlxuICAgIGlmICh0eXBlb2YgdGFyZ2V0WyduZ09uSW5pdCddID09PSAnZnVuY3Rpb24nICYmICF0YXJnZXRbJ19pMThuTmdPbkluaXRXcmFwcGVkXyddKSB7XG4gICAgICAvLyBLZWVwIG9yaWdpbmFsIG5nT25Jbml0KCkgZnVuY3Rpb24gdG8gY2FsbCBpdCBiZWZvcmUgcmVzb2x2aW5nIEkxOE4gZmllbGQgdmFsdWVzLlxuICAgICAgbGV0IG9yaWdpbmFsSW5pdCA9IHRhcmdldFsnbmdPbkluaXQnXTtcblxuICAgICAgLy8gUmUtaW1wbGVtZW50IHRoZSBuZ09uSW5pdCgpIGZ1bmN0aW9uLlxuICAgICAgdGFyZ2V0WyduZ09uSW5pdCddID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIENhbGwgb3JpZ2luYWwgbmdPbkluaXQoKSBmaXJzdFxuICAgICAgICBvcmlnaW5hbEluaXQuY2FsbCh0aGlzKTtcblxuICAgICAgICAvLyBXZSd2ZSB0byBjaGVjayB0aGUgZmxhZyBcIl9pMThuTmdPbkluaXRFeGVjdXRlZF9cIiB0byBtYWtlIHN1cmUgdGhhdCBpdCB3aWxsIGJlIGV4ZWN1dGVkIG9ubHkgb25jZS5cbiAgICAgICAgaWYgKCF0aGlzWydfaTE4bk5nT25Jbml0RXhlY3V0ZWRfJ10pIHtcbiAgICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLmkxOG5WYWx1ZTtcbiAgICAgICAgICBsZXQgaTE4blByb3h5TWFwID0gdGhpc1snX2kxOG5Qcm94aWVzXyddO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBpMThuUHJveHlNYXAgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBjaGlsZEtleSBpbiBpMThuUHJveHlNYXApIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpMThuUHJveHlNYXBbY2hpbGRLZXldLmFwcGx5STE4TiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBjaGVjayBieXBhc3NcbiAgICAgICAgICAgICAgbGV0IGNoaWxkQnlwYXNzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpMThuUHJveHlNYXBbY2hpbGRLZXldLmlzQnlwYXNzS2V5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgY2hpbGRCeXBhc3MgPSBpMThuUHJveHlNYXBbY2hpbGRLZXldLmlzQnlwYXNzS2V5KCk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAoY2hpbGRCeXBhc3MpIHtcbiAgICAgICAgICAgICAgICAvLyBQYXNzaW5nIGluaXRNb2RlID0gdHJ1ZVxuICAgICAgICAgICAgICAgIGkxOG5Qcm94eU1hcFtjaGlsZEtleV0uYXBwbHlJMThOLmFwcGx5KHRoaXMsIFt2YWx1ZSwgdHJ1ZV0pO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmKHZhbHVlID09PSBudWxsKXtcbiAgICAgICAgICAgICAgICAgIC8vIFBhc3NpbmcgaW5pdE1vZGUgPSB0cnVlXG4gICAgICAgICAgICAgICAgICBpMThuUHJveHlNYXBbY2hpbGRLZXldLmFwcGx5STE4Ti5hcHBseSh0aGlzLCBbbnVsbCwgdHJ1ZV0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAvLyBXZSB1c2UgRGF0YVV0aWxzLmdldERhdGFWYWx1ZSgpIGhlcmUgdG8gc3VwcG9ydCBpMThuS2V5IGluIGRvdCBub3RhdGlvbiAoLikgZm9ybWF0OlxuICAgICAgICAgICAgICAgICAgLy8gZm9vLmJhciAuLi5cbiAgICAgICAgICAgICAgICAgIGlmIChEYXRhVXRpbHMuY29udGFpbnNEYXRhS2V5KGNoaWxkS2V5LCB2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUGFzc2luZyBpbml0TW9kZSA9IHRydWVcbiAgICAgICAgICAgICAgICAgICAgaTE4blByb3h5TWFwW2NoaWxkS2V5XS5hcHBseUkxOE4uYXBwbHkodGhpcywgW0RhdGFVdGlscy5nZXREYXRhVmFsdWUoY2hpbGRLZXksIHZhbHVlKSwgdHJ1ZV0pO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUGFzc2luZyBpbml0TW9kZSA9IHRydWVcbiAgICAgICAgICAgICAgICAgICAgaTE4blByb3h5TWFwW2NoaWxkS2V5XS5hcHBseUkxOE4uYXBwbHkodGhpcywgW3VuZGVmaW5lZCwgdHJ1ZV0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXNbJ19pMThuTmdPbkluaXRFeGVjdXRlZF8nXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGFyZ2V0WydfaTE4bk5nT25Jbml0V3JhcHBlZF8nXSA9IHRydWU7XG4gICAgfVxuICB9XG59XG4iXX0=