@datorama/akita
Version:
State Management Tailored-Made for JS Applications
295 lines • 23.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { AkitaPlugin } from '../plugin';
import { debounceTime } from 'rxjs/operators';
import { getValue } from '../../getValueByString';
import { toBoolean } from '../../toBoolean';
import { isString } from '../../isString';
import { setValue } from '../../setValueByString';
import { logAction } from '../../actions';
// Todo: Return AbstractControl interface
/**
* @template T
*/
var
// Todo: Return AbstractControl interface
/**
* @template T
*/
PersistNgFormPlugin = /** @class */ (function (_super) {
tslib_1.__extends(PersistNgFormPlugin, _super);
function PersistNgFormPlugin(query, factoryFnOrPath, params) {
if (params === void 0) { params = {}; }
var _this = _super.call(this, query) || this;
_this.query = query;
_this.factoryFnOrPath = factoryFnOrPath;
_this.params = params;
_this.params = tslib_1.__assign({ debounceTime: 300, formKey: 'akitaForm', emitEvent: false, arrControlFactory: (/**
* @param {?} v
* @return {?}
*/
function (v) { return _this.builder.control(v); }) }, params);
_this.isRootKeys = toBoolean(factoryFnOrPath) === false;
_this.isKeyBased = isString(factoryFnOrPath) || _this.isRootKeys;
return _this;
}
/**
* @template THIS
* @this {THIS}
* @param {?} form
* @param {?=} builder
* @return {THIS}
*/
PersistNgFormPlugin.prototype.setForm = /**
* @template THIS
* @this {THIS}
* @param {?} form
* @param {?=} builder
* @return {THIS}
*/
function (form, builder) {
(/** @type {?} */ (this)).form = form;
(/** @type {?} */ (this)).builder = builder;
(/** @type {?} */ (this)).activate();
return (/** @type {?} */ (this));
};
/**
* @param {?=} initialState
* @return {?}
*/
PersistNgFormPlugin.prototype.reset = /**
* @param {?=} initialState
* @return {?}
*/
function (initialState) {
var _this = this;
var _a;
/** @type {?} */
var value;
if (initialState) {
value = initialState;
}
else {
value = this.isKeyBased ? this.initialValue : ((/** @type {?} */ (this))).factoryFnOrPath();
}
if (this.isKeyBased) {
Object.keys(this.initialValue).forEach((/**
* @param {?} stateKey
* @return {?}
*/
function (stateKey) {
/** @type {?} */
var value = _this.initialValue[stateKey];
if (Array.isArray(value) && _this.builder) {
/** @type {?} */
var formArray = _this.form.controls[stateKey];
_this.cleanArray(formArray);
value.forEach((/**
* @param {?} v
* @param {?} i
* @return {?}
*/
function (v, i) {
_this.form.get(stateKey).insert(i, ((/** @type {?} */ (_this.params.arrControlFactory)))(v));
}));
}
}));
}
this.form.patchValue(value, { emitEvent: this.params.emitEvent });
/** @type {?} */
var storeValue = this.isKeyBased ? setValue(this.getQuery().getValue(), this.getStore().storeName + "." + this.factoryFnOrPath, value) : (_a = {}, _a[this.params.formKey] = value, _a);
this.updateStore(storeValue);
};
/**
* @private
* @param {?} control
* @return {?}
*/
PersistNgFormPlugin.prototype.cleanArray = /**
* @private
* @param {?} control
* @return {?}
*/
function (control) {
while (control.length !== 0) {
control.removeAt(0);
}
};
/**
* @private
* @param {?} formValue
* @param {?} root
* @return {?}
*/
PersistNgFormPlugin.prototype.resolveInitialValue = /**
* @private
* @param {?} formValue
* @param {?} root
* @return {?}
*/
function (formValue, root) {
var _this = this;
if (!formValue)
return;
return Object.keys(formValue).reduce((/**
* @param {?} acc
* @param {?} stateKey
* @return {?}
*/
function (acc, stateKey) {
/** @type {?} */
var value = root[stateKey];
if (Array.isArray(value) && _this.builder) {
/** @type {?} */
var factory_1 = _this.params.arrControlFactory;
_this.cleanArray(_this.form.get(stateKey));
value.forEach((/**
* @param {?} v
* @param {?} i
* @return {?}
*/
function (v, i) {
_this.form.get(stateKey).insert(i, ((/** @type {?} */ (factory_1)))(v));
}));
}
acc[stateKey] = root[stateKey];
return acc;
}), {});
};
/**
* @private
* @return {?}
*/
PersistNgFormPlugin.prototype.activate = /**
* @private
* @return {?}
*/
function () {
var _this = this;
var _a;
/** @type {?} */
var path;
if (this.isKeyBased) {
if (this.isRootKeys) {
this.initialValue = this.resolveInitialValue(this.form.value, this.getQuery().getValue());
this.form.patchValue(this.initialValue, { emitEvent: this.params.emitEvent });
}
else {
path = this.getStore().storeName + "." + this.factoryFnOrPath;
/** @type {?} */
var root = getValue(this.getQuery().getValue(), path);
this.initialValue = this.resolveInitialValue(root, root);
this.form.patchValue(this.initialValue, { emitEvent: this.params.emitEvent });
}
}
else {
if (!((/** @type {?} */ (this.getQuery().getValue())))[this.params.formKey]) {
logAction('@PersistNgFormPlugin activate');
this.updateStore((_a = {}, _a[this.params.formKey] = ((/** @type {?} */ (this))).factoryFnOrPath(), _a));
}
/** @type {?} */
var value = this.getQuery().getValue()[this.params.formKey];
this.form.patchValue(value);
}
this.formChanges = this.form.valueChanges.pipe(debounceTime(this.params.debounceTime)).subscribe((/**
* @param {?} value
* @return {?}
*/
function (value) {
logAction('@PersistForm - Update');
/** @type {?} */
var newState;
if (_this.isKeyBased) {
if (_this.isRootKeys) {
newState = (/**
* @param {?} state
* @return {?}
*/
function (state) { return (tslib_1.__assign({}, state, value)); });
}
else {
newState = (/**
* @param {?} state
* @return {?}
*/
function (state) { return setValue(state, path, value); });
}
}
else {
newState = (/**
* @return {?}
*/
function () {
var _a;
return (_a = {}, _a[_this.params.formKey] = value, _a);
});
}
_this.updateStore(newState(_this.getQuery().getValue()));
}));
};
/**
* @return {?}
*/
PersistNgFormPlugin.prototype.destroy = /**
* @return {?}
*/
function () {
this.formChanges && this.formChanges.unsubscribe();
this.form = null;
this.builder = null;
};
return PersistNgFormPlugin;
}(AkitaPlugin));
// Todo: Return AbstractControl interface
/**
* @template T
*/
export { PersistNgFormPlugin };
if (false) {
/** @type {?} */
PersistNgFormPlugin.prototype.formChanges;
/**
* @type {?}
* @private
*/
PersistNgFormPlugin.prototype.isRootKeys;
/**
* @type {?}
* @private
*/
PersistNgFormPlugin.prototype.form;
/**
* @type {?}
* @private
*/
PersistNgFormPlugin.prototype.isKeyBased;
/**
* @type {?}
* @private
*/
PersistNgFormPlugin.prototype.initialValue;
/**
* @type {?}
* @private
*/
PersistNgFormPlugin.prototype.builder;
/**
* @type {?}
* @protected
*/
PersistNgFormPlugin.prototype.query;
/**
* @type {?}
* @private
*/
PersistNgFormPlugin.prototype.factoryFnOrPath;
/**
* @type {?}
* @private
*/
PersistNgFormPlugin.prototype.params;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVyc2lzdE5nRm9ybVBsdWdpbi5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BkYXRvcmFtYS9ha2l0YS8iLCJzb3VyY2VzIjpbInNyYy9wbHVnaW5zL3BlcnNpc3RGb3JtL3BlcnNpc3ROZ0Zvcm1QbHVnaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBR3hDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDbEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7Ozs7QUF3QjFDOzs7Ozs7SUFBa0QsK0NBQVc7SUFRM0QsNkJBQXNCLEtBQWlCLEVBQVUsZUFBbUMsRUFBVSxNQUE4QjtRQUE5Qix1QkFBQSxFQUFBLFdBQThCO1FBQTVILFlBQ0Usa0JBQU0sS0FBSyxDQUFDLFNBSWI7UUFMcUIsV0FBSyxHQUFMLEtBQUssQ0FBWTtRQUFVLHFCQUFlLEdBQWYsZUFBZSxDQUFvQjtRQUFVLFlBQU0sR0FBTixNQUFNLENBQXdCO1FBRTFILEtBQUksQ0FBQyxNQUFNLG9CQUFRLEVBQUUsWUFBWSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsaUJBQWlCOzs7O1lBQUUsVUFBQSxDQUFDLElBQUksT0FBQSxLQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBdkIsQ0FBdUIsQ0FBQSxFQUFFLEVBQUssTUFBTSxDQUFFLENBQUM7UUFDL0ksS0FBSSxDQUFDLFVBQVUs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Ozs7O0lBQ3JCLHNDQUFnQjs7Ozs7SUFFSixvQ0FBMkI7Ozs7O0lBQUUsOENBQTJDOzs7OztJQUFFLHFDQUFzQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFraXRhUGx1Z2luIH0gZnJvbSAnLi4vcGx1Z2luJztcbmltcG9ydCB7IFF1ZXJ5IH0gZnJvbSAnLi4vLi4vcXVlcnknO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBnZXRWYWx1ZSB9IGZyb20gJy4uLy4uL2dldFZhbHVlQnlTdHJpbmcnO1xuaW1wb3J0IHsgdG9Cb29sZWFuIH0gZnJvbSAnLi4vLi4vdG9Cb29sZWFuJztcbmltcG9ydCB7IGlzU3RyaW5nIH0gZnJvbSAnLi4vLi4vaXNTdHJpbmcnO1xuaW1wb3J0IHsgc2V0VmFsdWUgfSBmcm9tICcuLi8uLi9zZXRWYWx1ZUJ5U3RyaW5nJztcbmltcG9ydCB7IGxvZ0FjdGlvbiB9IGZyb20gJy4uLy4uL2FjdGlvbnMnO1xuXG5leHBvcnQgdHlwZSBGb3JtR3JvdXBMaWtlID0ge1xuICBwYXRjaFZhbHVlOiBGdW5jdGlvbjtcbiAgc2V0VmFsdWU6IEZ1bmN0aW9uO1xuICB2YWx1ZTogYW55O1xuICBnZXQ6IEZ1bmN0aW9uO1xuICB2YWx1ZUNoYW5nZXM6IE9ic2VydmFibGU8YW55PjtcbiAgY29udHJvbHM6IGFueTtcbn07XG5cbmV4cG9ydCB0eXBlIEFraXRhRm9ybVByb3A8VD4gPSB7XG4gIFtrZXk6IHN0cmluZ106IFQ7XG59O1xuXG5leHBvcnQgdHlwZSBQZXJzaXN0Rm9ybVBhcmFtcyA9IHtcbiAgZGVib3VuY2VUaW1lPzogbnVtYmVyO1xuICBmb3JtS2V5Pzogc3RyaW5nO1xuICBlbWl0RXZlbnQ/OiBib29sZWFuO1xuICBhcnJDb250cm9sRmFjdG9yeT86IEFycmF5Q29udHJvbEZhY3Rvcnk7XG59O1xuXG5leHBvcnQgdHlwZSBBcnJheUNvbnRyb2xGYWN0b3J5ID0gKHZhbHVlOiBhbnkpID0+IGFueTsgLy8gVG9kbzogUmV0dXJuICBBYnN0cmFjdENvbnRyb2wgaW50ZXJmYWNlXG5cbmV4cG9ydCBjbGFzcyBQZXJzaXN0TmdGb3JtUGx1Z2luPFQgPSBhbnk+IGV4dGVuZHMgQWtpdGFQbHVnaW4ge1xuICBmb3JtQ2hhbmdlczogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIGlzUm9vdEtleXM6IGJvb2xlYW47XG4gIHByaXZhdGUgZm9ybTogRm9ybUdyb3VwTGlrZTtcbiAgcHJpdmF0ZSBpc0tleUJhc2VkOiBib29sZWFuO1xuICBwcml2YXRlIGluaXRpYWxWYWx1ZTtcbiAgcHJpdmF0ZSBidWlsZGVyO1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBxdWVyeTogUXVlcnk8YW55PiwgcHJpdmF0ZSBmYWN0b3J5Rm5PclBhdGg/OiBGdW5jdGlvbiB8IHN0cmluZywgcHJpdmF0ZSBwYXJhbXM6IFBlcnNpc3RGb3JtUGFyYW1zID0ge30pIHtcbiAgICBzdXBlcihxdWVyeSk7XG4gICAgdGhpcy5wYXJhbXMgPSB7IC4uLnsgZGVib3VuY2VUaW1lOiAzMDAsIGZvcm1LZXk6ICdha2l0YUZvcm0nLCBlbWl0RXZlbnQ6IGZhbHNlLCBhcnJDb250cm9sRmFjdG9yeTogdiA9PiB0aGlzLmJ1aWxkZXIuY29udHJvbCh2KSB9LCAuLi5wYXJhbXMgfTtcbiAgICB0aGlzLmlzUm9vdEtleXMgPSB0b0Jvb2xlYW4oZmFjdG9yeUZuT3JQYXRoKSA9PT0gZmFsc2U7XG4gICAgdGhpcy5pc0tleUJhc2VkID0gaXNTdHJpbmcoZmFjdG9yeUZuT3JQYXRoKSB8fCB0aGlzLmlzUm9vdEtleXM7XG4gIH1cblxuICBzZXRGb3JtKGZvcm06IEZvcm1Hcm91cExpa2UsIGJ1aWxkZXI/KSB7XG4gICAgdGhpcy5mb3JtID0gZm9ybTtcbiAgICB0aGlzLmJ1aWxkZXIgPSBidWlsZGVyO1xuICAgIHRoaXMuYWN0aXZhdGUoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHJlc2V0KGluaXRpYWxTdGF0ZT86IFQpIHtcbiAgICBsZXQgdmFsdWU7XG4gICAgaWYgKGluaXRpYWxTdGF0ZSkge1xuICAgICAgdmFsdWUgPSBpbml0aWFsU3RhdGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlID0gdGhpcy5pc0tleUJhc2VkID8gdGhpcy5pbml0aWFsVmFsdWUgOiAodGhpcyBhcyBhbnkpLmZhY3RvcnlGbk9yUGF0aCgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzS2V5QmFzZWQpIHtcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMuaW5pdGlhbFZhbHVlKS5mb3JFYWNoKHN0YXRlS2V5ID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmluaXRpYWxWYWx1ZVtzdGF0ZUtleV07XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB0aGlzLmJ1aWxkZXIpIHtcbiAgICAgICAgICBjb25zdCBmb3JtQXJyYXkgPSB0aGlzLmZvcm0uY29udHJvbHNbc3RhdGVLZXldO1xuICAgICAgICAgIHRoaXMuY2xlYW5BcnJheShmb3JtQXJyYXkpO1xuICAgICAgICAgIHZhbHVlLmZvckVhY2goKHYsIGkpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoc3RhdGVLZXkpLmluc2VydChpLCAodGhpcy5wYXJhbXMuYXJyQ29udHJvbEZhY3RvcnkgYXMgRnVuY3Rpb24pKHYpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHZhbHVlLCB7IGVtaXRFdmVudDogdGhpcy5wYXJhbXMuZW1pdEV2ZW50IH0pO1xuXG4gICAgY29uc3Qgc3RvcmVWYWx1ZSA9IHRoaXMuaXNLZXlCYXNlZCA/IHNldFZhbHVlKHRoaXMuZ2V0UXVlcnkoKS5nZXRWYWx1ZSgpLCBgJHt0aGlzLmdldFN0b3JlKCkuc3RvcmVOYW1lfS4ke3RoaXMuZmFjdG9yeUZuT3JQYXRofWAsIHZhbHVlKSA6IHsgW3RoaXMucGFyYW1zLmZvcm1LZXldOiB2YWx1ZSB9O1xuICAgIHRoaXMudXBkYXRlU3RvcmUoc3RvcmVWYWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFuQXJyYXkoY29udHJvbCkge1xuICAgIHdoaWxlIChjb250cm9sLmxlbmd0aCAhPT0gMCkge1xuICAgICAgY29udHJvbC5yZW1vdmVBdCgwKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc29sdmVJbml0aWFsVmFsdWUoZm9ybVZhbHVlLCByb290KSB7XG4gICAgaWYgKCFmb3JtVmFsdWUpIHJldHVybjtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoZm9ybVZhbHVlKS5yZWR1Y2UoKGFjYywgc3RhdGVLZXkpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gcm9vdFtzdGF0ZUtleV07XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdGhpcy5idWlsZGVyKSB7XG4gICAgICAgIGNvbnN0IGZhY3RvcnkgPSB0aGlzLnBhcmFtcy5hcnJDb250cm9sRmFjdG9yeTtcbiAgICAgICAgdGhpcy5jbGVhbkFycmF5KHRoaXMuZm9ybS5nZXQoc3RhdGVLZXkpKTtcbiAgICAgICAgdmFsdWUuZm9yRWFjaCgodiwgaSkgPT4ge1xuICAgICAgICAgIHRoaXMuZm9ybS5nZXQoc3RhdGVLZXkpLmluc2VydChpLCAoZmFjdG9yeSBhcyBGdW5jdGlvbikodikpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGFjY1tzdGF0ZUtleV0gPSByb290W3N0YXRlS2V5XTtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30pO1xuICB9XG5cbiAgcHJpdmF0ZSBhY3RpdmF0ZSgpIHtcbiAgICBsZXQgcGF0aDtcblxuICAgIGlmICh0aGlzLmlzS2V5QmFzZWQpIHtcbiAgICAgIGlmICh0aGlzLmlzUm9vdEtleXMpIHtcbiAgICAgICAgdGhpcy5pbml0aWFsVmFsdWUgPSB0aGlzLnJlc29sdmVJbml0aWFsVmFsdWUodGhpcy5mb3JtLnZhbHVlLCB0aGlzLmdldFF1ZXJ5KCkuZ2V0VmFsdWUoKSk7XG4gICAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHRoaXMuaW5pdGlhbFZhbHVlLCB7IGVtaXRFdmVudDogdGhpcy5wYXJhbXMuZW1pdEV2ZW50IH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGF0aCA9IGAke3RoaXMuZ2V0U3RvcmUoKS5zdG9yZU5hbWV9LiR7dGhpcy5mYWN0b3J5Rm5PclBhdGh9YDtcbiAgICAgICAgY29uc3Qgcm9vdCA9IGdldFZhbHVlKHRoaXMuZ2V0UXVlcnkoKS5nZXRWYWx1ZSgpLCBwYXRoKTtcbiAgICAgICAgdGhpcy5pbml0aWFsVmFsdWUgPSB0aGlzLnJlc29sdmVJbml0aWFsVmFsdWUocm9vdCwgcm9vdCk7XG4gICAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHRoaXMuaW5pdGlhbFZhbHVlLCB7IGVtaXRFdmVudDogdGhpcy5wYXJhbXMuZW1pdEV2ZW50IH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoISh0aGlzLmdldFF1ZXJ5KCkuZ2V0VmFsdWUoKSBhcyBBa2l0YUZvcm1Qcm9wPFQ+KVt0aGlzLnBhcmFtcy5mb3JtS2V5XSkge1xuICAgICAgICBsb2dBY3Rpb24oJ0BQZXJzaXN0TmdGb3JtUGx1Z2luIGFjdGl2YXRlJyk7XG4gICAgICAgIHRoaXMudXBkYXRlU3RvcmUoeyBbdGhpcy5wYXJhbXMuZm9ybUtleV06ICh0aGlzIGFzIGFueSkuZmFjdG9yeUZuT3JQYXRoKCkgfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRRdWVyeSgpLmdldFZhbHVlKClbdGhpcy5wYXJhbXMuZm9ybUtleV07XG4gICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5mb3JtQ2hhbmdlcyA9IHRoaXMuZm9ybS52YWx1ZUNoYW5nZXMucGlwZShkZWJvdW5jZVRpbWUodGhpcy5wYXJhbXMuZGVib3VuY2VUaW1lKSkuc3Vic2NyaWJlKHZhbHVlID0+IHtcbiAgICAgIGxvZ0FjdGlvbignQFBlcnNpc3RGb3JtIC0gVXBkYXRlJyk7XG4gICAgICBsZXQgbmV3U3RhdGU7XG4gICAgICBpZiAodGhpcy5pc0tleUJhc2VkKSB7XG4gICAgICAgIGlmICh0aGlzLmlzUm9vdEtleXMpIHtcbiAgICAgICAgICBuZXdTdGF0ZSA9IHN0YXRlID0+ICh7IC4uLnN0YXRlLCAuLi52YWx1ZSB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdTdGF0ZSA9IHN0YXRlID0+IHNldFZhbHVlKHN0YXRlLCBwYXRoLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld1N0YXRlID0gKCkgPT4gKHsgW3RoaXMucGFyYW1zLmZvcm1LZXldOiB2YWx1ZSB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMudXBkYXRlU3RvcmUobmV3U3RhdGUodGhpcy5nZXRRdWVyeSgpLmdldFZhbHVlKCkpKTtcbiAgICB9KTtcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5mb3JtQ2hhbmdlcyAmJiB0aGlzLmZvcm1DaGFuZ2VzLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5mb3JtID0gbnVsbDtcbiAgICB0aGlzLmJ1aWxkZXIgPSBudWxsO1xuICB9XG59XG4iXX0=