UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

145 lines (144 loc) 24.5 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import { EventEmitter } from '@angular/core'; import { DataUtils } from '../share/utils/DataUtils'; import { ArrayUtils } from '../share/utils/ArrayUtils'; /** * @param {?=} key * @return {?} */ export function Option(key) { let /** @type {?} */ OPTIONS_KEY = "options"; // add option to _options_ return function (target, propertyKey, descriptor) { let /** @type {?} */ propKey = key || propertyKey; let /** @type {?} */ optionsMap = target['_options_']; if (!Object.prototype.hasOwnProperty.call(target, '_options_')) { let /** @type {?} */ parentOptionsMap = optionsMap; if (typeof parentOptionsMap === 'object') { // Inherit optionsMap from super class optionsMap = JSON.parse(JSON.stringify(parentOptionsMap)); } else { optionsMap = {}; } Object.defineProperty(target, '_options_', { value: optionsMap, enumerable: false, writable: false }); } // { propKey: <class-property-key> } optionsMap[propKey] = propertyKey; // We're going to wrap ngOnInit() to intercept the function call to initialize @Option() fields first. if (typeof target['ngOnInit'] === 'function' && !target['_optionsNgOnInitWrapped_']) { // Keep original ngOnInit() function to call it later. let /** @type {?} */ originalInit = target['ngOnInit']; // Re-implement the ngOnInit() function. target['ngOnInit'] = function () { // We've to check the flag "_optionsNgOnInitExecuted_" to make sure that it will be executed only once. if (!this['_optionsNgOnInitExecuted_']) { // Call this.setOptions() to auto resolve @Option() field values // Passing overwrite = false means not to auto resolve the fields having value !== undefined. this.setOptions(this.options, false); this['_optionsNgOnInitExecuted_'] = true; } // Call original ngOnInit() originalInit.call(this); }; target['_optionsNgOnInitWrapped_'] = true; } // We're going to wrap setOptions() to intercept the function call to auto resolve @Option() fields. if (typeof target['setOptions'] === 'function' && !target['_optionsSetOptionsWrapped_']) { // Keep original setOptions() function to call it later. let /** @type {?} */ originalSetOptions = target['setOptions']; // Re-implement the setOptions() function. target['setOptions'] = function (options, overwrite = true) { if (this['_options_'] !== null && typeof this['_options_'] !== 'undefined') { for (let /** @type {?} */ optionKey in this['_options_']) { let /** @type {?} */ propKey = this['_options_'][optionKey] || optionKey; let /** @type {?} */ optionValue = this[propKey]; if (options !== null && typeof options !== 'undefined') { let /** @type {?} */ optionsToApply = undefined; if (DataUtils.containsDataKey(optionKey, options)) { // We'll only override @Option field value if it is specified in options object only. // Use DataUtils.getDataValue() here to support dot notation (.): foo.bar optionsToApply = DataUtils.getDataValue(optionKey, options); } else if (typeof this.getName === 'function') { // Auto resolve @Option() value from parent's option object automatically. // { compName: {compOptions} } let /** @type {?} */ name = this.getName(); if (name !== null && typeof name === 'string') { let /** @type {?} */ optionsByName = options[name]; if (optionsByName !== null && typeof optionsByName === 'object') { if (DataUtils.containsDataKey(optionKey, optionsByName)) { // We'll only override @Option field value if it is specified in options object only. // Use DataUtils.getDataValue() here to support dot notation (.): foo.bar optionsToApply = DataUtils.getDataValue(optionKey, optionsByName); } } } } if (optionsToApply !== undefined) { if (this[propKey] !== null && this[propKey] !== undefined && typeof this[propKey]['setOptions'] === 'function') { // If this[propKey] is IHasOptions, chain the method call into it. this[propKey].setOptions(optionsToApply); } else if (this[propKey] !== null && Array.isArray(this[propKey]) && ArrayUtils.isAllMemberHasPropertyTypeOf(this[propKey], 'setOptions', 'function')) { // If this[propKey] is an array of IHasOptions, chain the method call into its member. if (optionsToApply !== null && Array.isArray(optionsToApply)) { // If optionsToApply is an array, chain the method call 1-by-1. let /** @type {?} */ idx; for (idx = 0; idx < this[propKey].length && idx < optionsToApply.length; idx++) { // Set options value 1-by-1. this[propKey][idx].setOptions(optionsToApply[idx]); } for (; idx < this[propKey].length; idx++) { // Set "null" options into all members left. this[propKey][idx].setOptions(null); } } else { // Else, chain method call with the same value on all members. for (let /** @type {?} */ member of this[propKey]) { member.setOptions(optionsToApply); } } } else if (typeof this[propKey] !== undefined && this[propKey] instanceof EventEmitter) { // If this property is EventEmitter, it might be ng @Output. if (optionsToApply instanceof EventEmitter && overwrite) { // The option value is EventEmitter also. // We'll overwrite the value only if "overwrite" is set. this[propKey] = optionsToApply; } else if (typeof optionsToApply === 'function') { // If the option value is function, we'll subscribe this function to the emitter. this[propKey].subscribe(($event) => { // Call this function/handler. optionsToApply($event); }); } else { // Do nothing. } } else if (overwrite || typeof this[propKey] === 'undefined') { // Else, set this option value into the field. this[propKey] = optionsToApply; } } } } } // Call original setOptions() originalSetOptions.call(this, options); }; target['_optionsSetOptionsWrapped_'] = true; } }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3B0aW9uLmRlY29yYXRvci5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL2RlY29yYXRvci9PcHRpb24uZGVjb3JhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7Ozs7O0FBRXZELE1BQU0saUJBQWlCLEdBQVk7SUFFakMscUJBQUksV0FBVyxHQUFXLFNBQVMsQ0FBQzs7SUFHcEMsTUFBTSxDQUFDLFVBQVMsTUFBVyxFQUFFLFdBQWdCLEVBQUUsVUFBZTtRQUM1RCxxQkFBSSxPQUFPLEdBQVcsR0FBRyxJQUFJLFdBQVcsQ0FBQztRQUN6QyxxQkFBSSxVQUFVLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRXJDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0QscUJBQUksZ0JBQWdCLEdBQUcsVUFBVSxDQUFDO1lBRWxDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sZ0JBQWdCLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQzs7Z0JBRXpDLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO2FBQzNEO1lBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ04sVUFBVSxHQUFHLEVBQUUsQ0FBQzthQUNqQjtZQUVELE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRTtnQkFDekMsS0FBSyxFQUFFLFVBQVU7Z0JBQ2pCLFVBQVUsRUFBRSxLQUFLO2dCQUNqQixR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RUFBRSxPQUFPLENBQUMsQ0FBQzthQUN4QyxDQUFBO1lBRUQsTUFBTSxDQUFDLDRCQUE0QixDQUFDLEdBQUcsSUFBSSxDQUFDO1NBQzdDO0tBRUYsQ0FBQztDQUNIIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEYXRhVXRpbHMgfSBmcm9tICcuLi9zaGFyZS91dGlscy9EYXRhVXRpbHMnO1xuaW1wb3J0IHsgQXJyYXlVdGlscyB9IGZyb20gJy4uL3NoYXJlL3V0aWxzL0FycmF5VXRpbHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gT3B0aW9uKGtleT86IHN0cmluZyk6IGFueSB7XG5cbiAgbGV0IE9QVElPTlNfS0VZOiBzdHJpbmcgPSBcIm9wdGlvbnNcIjtcblxuICAvLyBhZGQgb3B0aW9uIHRvIF9vcHRpb25zX1xuICByZXR1cm4gZnVuY3Rpb24odGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBhbnksIGRlc2NyaXB0b3I6IGFueSkge1xuICAgIGxldCBwcm9wS2V5OiBzdHJpbmcgPSBrZXkgfHwgcHJvcGVydHlLZXk7XG4gICAgbGV0IG9wdGlvbnNNYXAgPSB0YXJnZXRbJ19vcHRpb25zXyddO1xuXG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGFyZ2V0LCAnX29wdGlvbnNfJykpIHtcbiAgICAgIGxldCBwYXJlbnRPcHRpb25zTWFwID0gb3B0aW9uc01hcDtcblxuICAgICAgaWYgKHR5cGVvZiBwYXJlbnRPcHRpb25zTWFwID09PSAnb2JqZWN0Jykge1xuICAgICAgICAvLyBJbmhlcml0IG9wdGlvbnNNYXAgZnJvbSBzdXBlciBjbGFzc1xuICAgICAgICBvcHRpb25zTWFwID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShwYXJlbnRPcHRpb25zTWFwKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcHRpb25zTWFwID0ge307XG4gICAgICB9XG5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsICdfb3B0aW9uc18nLCB7XG4gICAgICAgIHZhbHVlOiBvcHRpb25zTWFwLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyB7IHByb3BLZXk6IDxjbGFzcy1wcm9wZXJ0eS1rZXk+IH1cbiAgICBvcHRpb25zTWFwW3Byb3BLZXldID0gcHJvcGVydHlLZXk7XG5cbiAgICAvLyBXZSdyZSBnb2luZyB0byB3cmFwIG5nT25Jbml0KCkgdG8gaW50ZXJjZXB0IHRoZSBmdW5jdGlvbiBjYWxsIHRvIGluaXRpYWxpemUgQE9wdGlvbigpIGZpZWxkcyBmaXJzdC5cbiAgICBpZiAodHlwZW9mIHRhcmdldFsnbmdPbkluaXQnXSA9PT0gJ2Z1bmN0aW9uJyAmJiAhdGFyZ2V0Wydfb3B0aW9uc05nT25Jbml0V3JhcHBlZF8nXSkge1xuICAgICAgLy8gS2VlcCBvcmlnaW5hbCBuZ09uSW5pdCgpIGZ1bmN0aW9uIHRvIGNhbGwgaXQgbGF0ZXIuXG4gICAgICBsZXQgb3JpZ2luYWxJbml0ID0gdGFyZ2V0WyduZ09uSW5pdCddO1xuXG4gICAgICAvLyBSZS1pbXBsZW1lbnQgdGhlIG5nT25Jbml0KCkgZnVuY3Rpb24uXG4gICAgICB0YXJnZXRbJ25nT25Jbml0J10gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gV2UndmUgdG8gY2hlY2sgdGhlIGZsYWcgXCJfb3B0aW9uc05nT25Jbml0RXhlY3V0ZWRfXCIgdG8gbWFrZSBzdXJlIHRoYXQgaXQgd2lsbCBiZSBleGVjdXRlZCBvbmx5IG9uY2UuXG4gICAgICAgIGlmICghdGhpc1snX29wdGlvbnNOZ09uSW5pdEV4ZWN1dGVkXyddKSB7XG4gICAgICAgICAgLy8gQ2FsbCB0aGlzLnNldE9wdGlvbnMoKSB0byBhdXRvIHJlc29sdmUgQE9wdGlvbigpIGZpZWxkIHZhbHVlc1xuICAgICAgICAgIC8vIFBhc3Npbmcgb3ZlcndyaXRlID0gZmFsc2UgbWVhbnMgbm90IHRvIGF1dG8gcmVzb2x2ZSB0aGUgZmllbGRzIGhhdmluZyB2YWx1ZSAhPT0gdW5kZWZpbmVkLlxuICAgICAgICAgIHRoaXMuc2V0T3B0aW9ucyh0aGlzLm9wdGlvbnMsIGZhbHNlKTtcblxuICAgICAgICAgIHRoaXNbJ19vcHRpb25zTmdPbkluaXRFeGVjdXRlZF8nXSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWxsIG9yaWdpbmFsIG5nT25Jbml0KClcbiAgICAgICAgb3JpZ2luYWxJbml0LmNhbGwodGhpcyk7XG4gICAgICB9XG5cbiAgICAgIHRhcmdldFsnX29wdGlvbnNOZ09uSW5pdFdyYXBwZWRfJ10gPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIFdlJ3JlIGdvaW5nIHRvIHdyYXAgc2V0T3B0aW9ucygpIHRvIGludGVyY2VwdCB0aGUgZnVuY3Rpb24gY2FsbCB0byBhdXRvIHJlc29sdmUgQE9wdGlvbigpIGZpZWxkcy5cbiAgICBpZiAodHlwZW9mIHRhcmdldFsnc2V0T3B0aW9ucyddID09PSAnZnVuY3Rpb24nICYmICF0YXJnZXRbJ19vcHRpb25zU2V0T3B0aW9uc1dyYXBwZWRfJ10pIHtcbiAgICAgIC8vIEtlZXAgb3JpZ2luYWwgc2V0T3B0aW9ucygpIGZ1bmN0aW9uIHRvIGNhbGwgaXQgbGF0ZXIuXG4gICAgICBsZXQgb3JpZ2luYWxTZXRPcHRpb25zID0gdGFyZ2V0WydzZXRPcHRpb25zJ107XG5cbiAgICAgIC8vIFJlLWltcGxlbWVudCB0aGUgc2V0T3B0aW9ucygpIGZ1bmN0aW9uLlxuICAgICAgdGFyZ2V0WydzZXRPcHRpb25zJ10gPSBmdW5jdGlvbihvcHRpb25zOiBhbnksIG92ZXJ3cml0ZTogYm9vbGVhbiA9IHRydWUpIHtcbiAgICAgICAgaWYgKHRoaXNbJ19vcHRpb25zXyddICE9PSBudWxsICYmIHR5cGVvZiB0aGlzWydfb3B0aW9uc18nXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBmb3IgKGxldCBvcHRpb25LZXkgaW4gdGhpc1snX29wdGlvbnNfJ10pIHtcbiAgICAgICAgICAgIGxldCBwcm9wS2V5ID0gdGhpc1snX29wdGlvbnNfJ11bb3B0aW9uS2V5XSB8fCBvcHRpb25LZXk7XG5cbiAgICAgICAgICAgIGxldCBvcHRpb25WYWx1ZSA9IHRoaXNbcHJvcEtleV07XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zICE9PSBudWxsICYmIHR5cGVvZiBvcHRpb25zICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICBsZXQgb3B0aW9uc1RvQXBwbHk6IGFueSA9IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgICBpZiAoRGF0YVV0aWxzLmNvbnRhaW5zRGF0YUtleShvcHRpb25LZXksIG9wdGlvbnMpKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UnbGwgb25seSBvdmVycmlkZSBAT3B0aW9uIGZpZWxkIHZhbHVlIGlmIGl0IGlzIHNwZWNpZmllZCBpbiBvcHRpb25zIG9iamVjdCBvbmx5LlxuICAgICAgICAgICAgICAgIC8vIFVzZSBEYXRhVXRpbHMuZ2V0RGF0YVZhbHVlKCkgaGVyZSB0byBzdXBwb3J0IGRvdCBub3RhdGlvbiAoLik6IGZvby5iYXJcbiAgICAgICAgICAgICAgICBvcHRpb25zVG9BcHBseSA9IERhdGFVdGlscy5nZXREYXRhVmFsdWUob3B0aW9uS2V5LCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5nZXROYW1lID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgLy8gQXV0byByZXNvbHZlIEBPcHRpb24oKSB2YWx1ZSBmcm9tIHBhcmVudCdzIG9wdGlvbiBvYmplY3QgYXV0b21hdGljYWxseS5cbiAgICAgICAgICAgICAgICAvLyB7IGNvbXBOYW1lOiB7Y29tcE9wdGlvbnN9IH1cbiAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IHRoaXMuZ2V0TmFtZSgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKG5hbWUgIT09IG51bGwgJiYgdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICBsZXQgb3B0aW9uc0J5TmFtZSA9IG9wdGlvbnNbbmFtZV07XG5cbiAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zQnlOYW1lICE9PSBudWxsICYmIHR5cGVvZiBvcHRpb25zQnlOYW1lID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoRGF0YVV0aWxzLmNvbnRhaW5zRGF0YUtleShvcHRpb25LZXksIG9wdGlvbnNCeU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gV2UnbGwgb25seSBvdmVycmlkZSBAT3B0aW9uIGZpZWxkIHZhbHVlIGlmIGl0IGlzIHNwZWNpZmllZCBpbiBvcHRpb25zIG9iamVjdCBvbmx5LlxuICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSBEYXRhVXRpbHMuZ2V0RGF0YVZhbHVlKCkgaGVyZSB0byBzdXBwb3J0IGRvdCBub3RhdGlvbiAoLik6IGZvby5iYXJcbiAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zVG9BcHBseSA9IERhdGFVdGlscy5nZXREYXRhVmFsdWUob3B0aW9uS2V5LCBvcHRpb25zQnlOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zVG9BcHBseSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXNbcHJvcEtleV0gIT09IG51bGwgJiYgdGhpc1twcm9wS2V5XSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiB0aGlzW3Byb3BLZXldWydzZXRPcHRpb25zJ10gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgIC8vIElmIHRoaXNbcHJvcEtleV0gaXMgSUhhc09wdGlvbnMsIGNoYWluIHRoZSBtZXRob2QgY2FsbCBpbnRvIGl0LlxuICAgICAgICAgICAgICAgICAgdGhpc1twcm9wS2V5XS5zZXRPcHRpb25zKG9wdGlvbnNUb0FwcGx5KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXNbcHJvcEtleV0gIT09IG51bGwgJiYgQXJyYXkuaXNBcnJheSh0aGlzW3Byb3BLZXldKSAmJiBBcnJheVV0aWxzLmlzQWxsTWVtYmVySGFzUHJvcGVydHlUeXBlT2YodGhpc1twcm9wS2V5XSwgJ3NldE9wdGlvbnMnLCAnZnVuY3Rpb24nKSkge1xuICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpc1twcm9wS2V5XSBpcyBhbiBhcnJheSBvZiBJSGFzT3B0aW9ucywgY2hhaW4gdGhlIG1ldGhvZCBjYWxsIGludG8gaXRzIG1lbWJlci5cbiAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zVG9BcHBseSAhPT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KG9wdGlvbnNUb0FwcGx5KSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiBvcHRpb25zVG9BcHBseSBpcyBhbiBhcnJheSwgY2hhaW4gdGhlIG1ldGhvZCBjYWxsIDEtYnktMS5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGlkeDogbnVtYmVyO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IHRoaXNbcHJvcEtleV0ubGVuZ3RoICYmIGlkeCA8IG9wdGlvbnNUb0FwcGx5Lmxlbmd0aDsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgb3B0aW9ucyB2YWx1ZSAxLWJ5LTEuXG4gICAgICAgICAgICAgICAgICAgICAgdGhpc1twcm9wS2V5XVtpZHhdLnNldE9wdGlvbnMob3B0aW9uc1RvQXBwbHlbaWR4XSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZm9yICg7IGlkeCA8IHRoaXNbcHJvcEtleV0ubGVuZ3RoOyBpZHgrKykge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCBcIm51bGxcIiBvcHRpb25zIGludG8gYWxsIG1lbWJlcnMgbGVmdC5cbiAgICAgICAgICAgICAgICAgICAgICB0aGlzW3Byb3BLZXldW2lkeF0uc2V0T3B0aW9ucyhudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRWxzZSwgY2hhaW4gbWV0aG9kIGNhbGwgd2l0aCB0aGUgc2FtZSB2YWx1ZSBvbiBhbGwgbWVtYmVycy5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgbWVtYmVyIG9mIHRoaXNbcHJvcEtleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICBtZW1iZXIuc2V0T3B0aW9ucyhvcHRpb25zVG9BcHBseSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzW3Byb3BLZXldICE9PSB1bmRlZmluZWQgJiYgdGhpc1twcm9wS2V5XSBpbnN0YW5jZW9mIEV2ZW50RW1pdHRlcikge1xuICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBwcm9wZXJ0eSBpcyBFdmVudEVtaXR0ZXIsIGl0IG1pZ2h0IGJlIG5nIEBPdXRwdXQuXG4gICAgICAgICAgICAgICAgICBpZiAob3B0aW9uc1RvQXBwbHkgaW5zdGFuY2VvZiBFdmVudEVtaXR0ZXIgJiYgb3ZlcndyaXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBvcHRpb24gdmFsdWUgaXMgRXZlbnRFbWl0dGVyIGFsc28uXG4gICAgICAgICAgICAgICAgICAgIC8vIFdlJ2xsIG92ZXJ3cml0ZSB0aGUgdmFsdWUgb25seSBpZiBcIm92ZXJ3cml0ZVwiIGlzIHNldC5cbiAgICAgICAgICAgICAgICAgICAgdGhpc1twcm9wS2V5XSA9IG9wdGlvbnNUb0FwcGx5O1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb3B0aW9uc1RvQXBwbHkgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIG9wdGlvbiB2YWx1ZSBpcyBmdW5jdGlvbiwgd2UnbGwgc3Vic2NyaWJlIHRoaXMgZnVuY3Rpb24gdG8gdGhlIGVtaXR0ZXIuXG4gICAgICAgICAgICAgICAgICAgIHRoaXNbcHJvcEtleV0uc3Vic2NyaWJlKCgkZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIENhbGwgdGhpcyBmdW5jdGlvbi9oYW5kbGVyLlxuICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNUb0FwcGx5KCRldmVudCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90aGluZy5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG92ZXJ3cml0ZSB8fCB0eXBlb2YgdGhpc1twcm9wS2V5XSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgIC8vIEVsc2UsIHNldCB0aGlzIG9wdGlvbiB2YWx1ZSBpbnRvIHRoZSBmaWVsZC5cbiAgICAgICAgICAgICAgICAgIHRoaXNbcHJvcEtleV0gPSBvcHRpb25zVG9BcHBseTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWxsIG9yaWdpbmFsIHNldE9wdGlvbnMoKVxuICAgICAgICBvcmlnaW5hbFNldE9wdGlvbnMuY2FsbCh0aGlzLCBvcHRpb25zKTtcbiAgICAgIH1cblxuICAgICAgdGFyZ2V0Wydfb3B0aW9uc1NldE9wdGlvbnNXcmFwcGVkXyddID0gdHJ1ZTtcbiAgICB9XG5cbiAgfTtcbn1cbiJdfQ==