UNPKG

app-state-utils

Version:

A set of utilities for state management in web apps, integrates well with front-end state management libraries like redux and vuex, and can be used on server side as well. It defines methods for mutating keys and values in a conventional javascript object

135 lines (119 loc) 23.3 kB
"use strict";var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.deleteEntry=void 0;var _typeof2=_interopRequireDefault(require("@babel/runtime/helpers/typeof"));/** * @author Peter Collins - https://github.com/onepetercollins * * @fileoverview : Exports a function: deleteEntry(state, payload) * * @function deleteEntry : For state drilling and surgical deletion of object [key: value] pairs. * This function can be used to dynamically delete infinitely nested object entries. * It takes current state and a payload object as arguments. * It returns a local function which returns updated state. * * @param {Object} state The object to be mutated. * @param {Object} payload { name: String, child: Array } * @param {String} payload.name Name of the [key: value] pair to be deleted or second object in the nesting hieriarchy. * @param {Array} payload.child Array of strings pointing to the nested [key: value] pair to be deleted. * @returns {Function} (local function) (payload) => : The new app state, or current state if it was not altered. */ var deleteEntry=function deleteEntry(state,payload){ /** * @param {Object} payload { name: String, child: Array } * @param {String} payload.name Name of the [key: value] pair to be deleted or second object in the nesting hieriarchy. * @param {Array} payload.child Array of strings pointing to the nested [key: value] pair to be deleted. * @returns {Object} { updatedState } : The new app state, or current state if it was not altered. */ return function(){var payloadInherited=arguments.length>0&&arguments[0]!==undefined?arguments[0]:payload; var currentState=JSON.parse(JSON.stringify(state)); var updatedState=null; var name=payloadInherited.name,child=payloadInherited.child; var nameField=name; var children=child; var testArray=state?Array.from(state):null; var snapshots=[]; if((0,_typeof2.default)(state)!=='object'||state[state.length-1]===testArray.pop()&&typeof testArray.pop()!=="undefined"){ console.error("[state] must be a valid javascript object"); return state; } if((0,_typeof2.default)(children)==="object")/* check if 'children' is an empty array and nullify it */{ if(children.length===0&&typeof children[children.length-1]==="undefined"){ children=null; } } if(!children&&!currentState.hasOwnProperty(nameField)){ console.error("The referenced property '".concat(nameField,"' does not exist in current state.")); return state; } if(!children&&currentState.hasOwnProperty(nameField)){ updatedState={}; if(Object.keys(currentState).length>1){ for(var index=0;index<Object.keys(currentState).length;index++){ if(Object.keys(currentState)[index]!==nameField){ updatedState[Object.keys(currentState)[index]]=Object.values(currentState)[index]; } } return updatedState; }else{ return updatedState; } }else if(children.length&&currentState.hasOwnProperty(nameField)){ for(var _index=0;_index<children.length;_index++){ if(!snapshots.length){ if(_index!==children.length-1){ snapshots.push(currentState[nameField][children[_index]]); }else{ var mutatedObject={}; for(var index0=0;index0<Object.keys(currentState[nameField]).length;index0++){ if(Object.keys(currentState[nameField])[index0]!==children[children.length-1]){ mutatedObject[Object.keys(currentState[nameField])[index0]]=currentState[nameField][Object.keys(currentState[nameField])[index0]]; } if(index0===Object.keys(currentState[nameField]).length-1){ Object.assign(currentState,state); currentState[nameField]=mutatedObject; updatedState=currentState; return updatedState; } } } }else{ if(_index===children.length-1){ var _mutatedObject={}; for(var _index2=0;_index2<Object.keys(snapshots[snapshots.length-1]).length;_index2++){ if(Object.keys(snapshots[snapshots.length-1])[_index2]!==children[children.length-1]){ if(typeof snapshots[snapshots.length-1][children[_index]]!=="undefined"){ _mutatedObject[Object.keys(snapshots[snapshots.length-1])[_index2]]=snapshots[snapshots.length-1][Object.keys(snapshots[snapshots.length-1])[_index2]]; }else if(typeof snapshots[snapshots.length-1][children[_index]]==="undefined"){ console.log("The referenced property '".concat(children[_index],"' does not exist in current state.")); return state; } } if(_index2===Object.keys(snapshots[snapshots.length-1]).length-1){ snapshots[snapshots.length-1]=_mutatedObject; } } for(var _index3=snapshots.length-1;_index3>=0;_index3--){ if(_index3<snapshots.length-1){ snapshots[_index3][children[_index3+1]]=snapshots[_index3+1]; } if(_index3===0){ Object.assign(currentState,state); currentState[nameField][children[_index3]]=snapshots[_index3]; updatedState=currentState; return updatedState; } } }else{ if((0,_typeof2.default)(snapshots[snapshots.length-1][children[_index]])==="object"&&typeof snapshots[snapshots.length-1][children[_index]]!=="undefined"){ snapshots.push(snapshots[snapshots.length-1][children[_index]]); }else if(typeof snapshots[snapshots.length-1][children[_index]]==="undefined"){ console.log("The referenced property '".concat(children[_index],"' does not exist in current state.")); return state; } } } } }else{ console.log("The referenced property '".concat(nameField,"' does not exist in current state.")); return state; } }; };exports.deleteEntry=deleteEntry; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImRlbGV0ZUVudHJ5LmpzIl0sIm5hbWVzIjpbImRlbGV0ZUVudHJ5Iiwic3RhdGUiLCJwYXlsb2FkIiwicGF5bG9hZEluaGVyaXRlZCIsImN1cnJlbnRTdGF0ZSIsIkpTT04iLCJwYXJzZSIsInN0cmluZ2lmeSIsInVwZGF0ZWRTdGF0ZSIsIm5hbWUiLCJjaGlsZCIsIm5hbWVGaWVsZCIsImNoaWxkcmVuIiwidGVzdEFycmF5IiwiQXJyYXkiLCJmcm9tIiwic25hcHNob3RzIiwibGVuZ3RoIiwicG9wIiwiY29uc29sZSIsImVycm9yIiwiaGFzT3duUHJvcGVydHkiLCJPYmplY3QiLCJrZXlzIiwiaW5kZXgiLCJ2YWx1ZXMiLCJwdXNoIiwibXV0YXRlZE9iamVjdCIsImluZGV4MCIsImFzc2lnbiIsImxvZyJdLCJtYXBwaW5ncyI6ImtRQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVRLEdBQU1BLENBQUFBLFdBQVcsQ0FBRyxRQUFkQSxDQUFBQSxXQUFjLENBQUNDLEtBQUQsQ0FBUUMsT0FBUixDQUFvQjs7QUFFNUM7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVJLE1BQU8sV0FBc0MsSUFBNUJDLENBQUFBLGdCQUE0QiwyREFBVEQsT0FBUztBQUN6QyxHQUFJRSxDQUFBQSxZQUFZLENBQUdDLElBQUksQ0FBQ0MsS0FBTCxDQUFXRCxJQUFJLENBQUNFLFNBQUwsQ0FBZU4sS0FBZixDQUFYLENBQW5CO0FBQ0EsR0FBSU8sQ0FBQUEsWUFBWSxDQUFHLElBQW5CO0FBQ0EsR0FBTUMsQ0FBQUEsSUFBTixDQUFzQk4sZ0JBQXRCLENBQU1NLElBQU4sQ0FBWUMsS0FBWixDQUFzQlAsZ0JBQXRCLENBQVlPLEtBQVo7QUFDQSxHQUFJQyxDQUFBQSxTQUFTLENBQUdGLElBQWhCO0FBQ0EsR0FBSUcsQ0FBQUEsUUFBUSxDQUFHRixLQUFmO0FBQ0EsR0FBSUcsQ0FB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QUFELENBQXhDLENBQVAsR0FBNEQsV0FBaEUsQ0FBNkU7QUFDaEZMLE9BQU8sQ0FBQ1csR0FBUixvQ0FBd0NsQixRQUFRLENBQUNZLE1BQUQsQ0FBaEQ7QUFDQSxNQUFPdkIsQ0FBQUEsS0FBUDtBQUNIO0FBQ0o7QUFDSjtBQUNKO0FBQ0osQ0E5RE0sSUE4REE7QUFDSGtCLE9BQU8sQ0FBQ1csR0FBUixvQ0FBd0NuQixTQUF4QztBQUNBLE1BQU9WLENBQUFBLEtBQVA7QUFDSDtBQUNKLENBekdEO0FBMEdILENBbkhPLEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQGF1dGhvciBQZXRlciBDb2xsaW5zIC0gaHR0cHM6Ly9naXRodWIuY29tL29uZXBldGVyY29sbGluc1xyXG4gKiBcclxuICogQGZpbGVvdmVydmlldyA6IEV4cG9ydHMgYSBmdW5jdGlvbjogZGVsZXRlRW50cnkoc3RhdGUsIHBheWxvYWQpXHJcbiAqIFxyXG4gKiBAZnVuY3Rpb24gZGVsZXRlRW50cnkgOiBGb3Igc3RhdGUgZHJpbGxpbmcgYW5kIHN1cmdpY2FsIGRlbGV0aW9uIG9mIG9iamVjdCBba2V5OiB2YWx1ZV0gcGFpcnMuXHJcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZHluYW1pY2FsbHkgZGVsZXRlIGluZmluaXRlbHkgbmVzdGVkIG9iamVjdCBlbnRyaWVzLlxyXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICBJdCB0YWtlcyBjdXJyZW50IHN0YXRlIGFuZCBhIHBheWxvYWQgb2JqZWN0IGFzIGFyZ3VtZW50cy5cclxuICogICAgICAgICAgICAgICAgICAgICAgICAgSXQgcmV0dXJucyBhIGxvY2FsIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgdXBkYXRlZCBzdGF0ZS5cclxuICogXHJcbiAqIEBwYXJhbSAgIHtPYmplY3R9ICAgc3RhdGUgVGhlIG9iamVjdCB0byBiZSBtdXRhdGVkLlxyXG4gKiBAcGFyYW0gICB7T2JqZWN0fSAgIHBheWxvYWQgeyBuYW1lOiBTdHJpbmcsIGNoaWxkOiBBcnJheSB9XHJcbiAqIEBwYXJhbSAgIHtTdHJpbmd9ICAgcGF5bG9hZC5uYW1lIE5hbWUgb2YgdGhlIFtrZXk6IHZhbHVlXSBwYWlyIHRvIGJlIGRlbGV0ZWQgb3Igc2Vjb25kIG9iamVjdCBpbiB0aGUgbmVzdGluZyBoaWVyaWFyY2h5LlxyXG4gKiBAcGFyYW0gICB7QXJyYXl9ICAgIHBheWxvYWQuY2hpbGQgQXJyYXkgb2Ygc3RyaW5ncyBwb2ludGluZyB0byB0aGUgbmVzdGVkIFtrZXk6IHZhbHVlXSBwYWlyIHRvIGJlIGRlbGV0ZWQuXHJcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gKGxvY2FsIGZ1bmN0aW9uKSAocGF5bG9hZCkgPT4gOiBUaGUgbmV3IGFwcCBzdGF0ZSwgb3IgY3VycmVudCBzdGF0ZSBpZiBpdCB3YXMgbm90IGFsdGVyZWQuXHJcbiAqL1xyXG5cclxuIGV4cG9ydCBjb25zdCBkZWxldGVFbnRyeSA9IChzdGF0ZSwgcGF5bG9hZCkgPT4ge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtICAge09iamVjdH0gcGF5bG9hZCB7IG5hbWU6IFN0cmluZywgY2hpbGQ6IEFycmF5IH1cclxuICAgICAqIEBwYXJhbSAgIHtTdHJpbmd9IHBheWxvYWQubmFtZSBOYW1lIG9mIHRoZSBba2V5OiB2YWx1ZV0gcGFpciB0byBiZSBkZWxldGVkIG9yIHNlY29uZCBvYmplY3QgaW4gdGhlIG5lc3RpbmcgaGllcmlhcmNoeS5cclxuICAgICAqIEBwYXJhbSAgIHtBcnJheX0gIHBheWxvYWQuY2hpbGQgQXJyYXkgb2Ygc3RyaW5ncyBwb2ludGluZyB0byB0aGUgbmVzdGVkIFtrZXk6IHZhbHVlXSBwYWlyIHRvIGJlIGRlbGV0ZWQuXHJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSB7IHVwZGF0ZWRTdGF0ZSB9IDogVGhlIG5ldyBhcHAgc3RhdGUsIG9yIGN1cnJlbnQgc3RhdGUgaWYgaXQgd2FzIG5vdCBhbHRlcmVkLlxyXG4gICAgICovXHJcblxyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChwYXlsb2FkSW5oZXJpdGVkID0gcGF5bG9hZCkge1xyXG4gICAgICAgIGxldCBjdXJyZW50U3RhdGUgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHN0YXRlKSk7XHJcbiAgICAgICAgbGV0IHVwZGF0ZWRTdGF0ZSA9IG51bGw7XHJcbiAgICAgICAgbGV0IHsgbmFtZSwgY2hpbGQgfSA9IHBheWxvYWRJbmhlcml0ZWQ7XHJcbiAgICAgICAgbGV0IG5hbWVGaWVsZCA9IG5hbWU7XHJcbiAgICAgICAgbGV0IGNoaWxkcmVuID0gY2hpbGQ7XHJcbiAgICAgICAgbGV0IHRlc3RBcnJheSA9IHN0YXRlID8gQXJyYXkuZnJvbShzdGF0ZSkgOiBudWxsXHJcbiAgICAgICAgbGV0IHNuYXBzaG90cyA9IFtdO1xyXG4gICAgXHJcbiAgICAgICAgaWYgKHR5cGVvZiBzdGF0ZSAhPT0gJ29iamVjdCcgfHwgKHN0YXRlW3N0YXRlLmxlbmd0aCAtIDFdID09PSB0ZXN0QXJyYXkucG9wKCkgJiYgdHlwZW9mIHRlc3RBcnJheS5wb3AoKSAhPT0gXCJ1bmRlZmluZWRcIikpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgW3N0YXRlXSBtdXN0IGJlIGEgdmFsaWQgamF2YXNjcmlwdCBvYmplY3RgKTtcclxuICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xyXG4gICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgIGlmICh0eXBlb2YgY2hpbGRyZW4gPT09IFwib2JqZWN0XCIpIC8qIGNoZWNrIGlmICdjaGlsZHJlbicgaXMgYW4gZW1wdHkgYXJyYXkgYW5kIG51bGxpZnkgaXQgKi8ge1xyXG4gICAgICAgICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmIHR5cGVvZiBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAxXSA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgaWYgKCFjaGlsZHJlbiAmJiAhY3VycmVudFN0YXRlLmhhc093blByb3BlcnR5KG5hbWVGaWVsZCkpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgVGhlIHJlZmVyZW5jZWQgcHJvcGVydHkgJyR7bmFtZUZpZWxkfScgZG9lcyBub3QgZXhpc3QgaW4gY3VycmVudCBzdGF0ZS5gKTtcclxuICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xyXG4gICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgIGlmICghY2hpbGRyZW4gJiYgY3VycmVudFN0YXRlLmhhc093blByb3BlcnR5KG5hbWVGaWVsZCkpIHtcclxuICAgICAgICAgICAgdXBkYXRlZFN0YXRlID0ge307XHJcbiAgICBcclxuICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKGN1cnJlbnRTdGF0ZSkubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IE9iamVjdC5rZXlzKGN1cnJlbnRTdGF0ZSkubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKGN1cnJlbnRTdGF0ZSlbaW5kZXhdICE9PSBuYW1lRmllbGQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZFN0YXRlW09iamVjdC5rZXlzKGN1cnJlbnRTdGF0ZSlbaW5kZXhdXSA9IE9iamVjdC52YWx1ZXMoY3VycmVudFN0YXRlKVtpbmRleF07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdXBkYXRlZFN0YXRlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZWRTdGF0ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoY2hpbGRyZW4ubGVuZ3RoICYmIGN1cnJlbnRTdGF0ZS5oYXNPd25Qcm9wZXJ0eShuYW1lRmllbGQpKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjaGlsZHJlbi5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICAgICAgICAgIGlmICghc25hcHNob3RzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gKGNoaWxkcmVuLmxlbmd0aCAtIDEpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNuYXBzaG90cy5wdXNoKGN1cnJlbnRTdGF0ZVtuYW1lRmllbGRdW2NoaWxkcmVuW2luZGV4XV0pXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG11dGF0ZWRPYmplY3QgPSB7fVxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGluZGV4MCA9IDA7IGluZGV4MCA8IE9iamVjdC5rZXlzKGN1cnJlbnRTdGF0ZVtuYW1lRmllbGRdKS5sZW5ndGg7IGluZGV4MCsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoY3VycmVudFN0YXRlW25hbWVGaWVsZF0pW2luZGV4MF0gIT09IGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlZE9iamVjdFtPYmplY3Qua2V5cyhjdXJyZW50U3RhdGVbbmFtZUZpZWxkXSlbaW5kZXgwXV0gPSBjdXJyZW50U3RhdGVbbmFtZUZpZWxkXVtPYmplY3Qua2V5cyhjdXJyZW50U3RhdGVbbmFtZUZpZWxkXSlbaW5kZXgwXV1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4MCA9PT0gKE9iamVjdC5rZXlzKGN1cnJlbnRTdGF0ZVtuYW1lRmllbGRdKS5sZW5ndGggLSAxKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oY3VycmVudFN0YXRlLCBzdGF0ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0YXRlW25hbWVGaWVsZF0gPSBtdXRhdGVkT2JqZWN0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRTdGF0ZSA9IGN1cnJlbnRTdGF0ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXBkYXRlZFN0YXRlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IChjaGlsZHJlbi5sZW5ndGggLSAxKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbXV0YXRlZE9iamVjdCA9IHt9XHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaW5kZXgwID0gMDsgaW5kZXgwIDwgT2JqZWN0LmtleXMoc25hcHNob3RzW3NuYXBzaG90cy5sZW5ndGggLSAxXSkubGVuZ3RoOyBpbmRleDArKykgeyAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHNuYXBzaG90c1tzbmFwc2hvdHMubGVuZ3RoIC0gMV0pW2luZGV4MF0gIT09IGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzbmFwc2hvdHNbc25hcHNob3RzLmxlbmd0aCAtIDFdW2NoaWxkcmVuW2luZGV4XV0gIT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlZE9iamVjdFtPYmplY3Qua2V5cyhzbmFwc2hvdHNbc25hcHNob3RzLmxlbmd0aCAtIDFdKVtpbmRleDBdXSA9IHNuYXBzaG90c1tzbmFwc2hvdHMubGVuZ3RoIC0gMV1bT2JqZWN0LmtleXMoc25hcHNob3RzW3NuYXBzaG90cy5sZW5ndGggLSAxXSlbaW5kZXgwXV1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzbmFwc2hvdHNbc25hcHNob3RzLmxlbmd0aCAtIDFdW2NoaWxkcmVuW2luZGV4XV0gPT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFRoZSByZWZlcmVuY2VkIHByb3BlcnR5ICcke2NoaWxkcmVuW2luZGV4XX0nIGRvZXMgbm90IGV4aXN0IGluIGN1cnJlbnQgc3RhdGUuYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleDAgPT09IChPYmplY3Qua2V5cyhzbmFwc2hvdHNbc25hcHNob3RzLmxlbmd0aCAtIDFdKS5sZW5ndGggLSAxKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuYXBzaG90c1tzbmFwc2hvdHMubGVuZ3RoIC0gMV0gPSBtdXRhdGVkT2JqZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpbmRleDAgPSBzbmFwc2hvdHMubGVuZ3RoIC0gMTsgaW5kZXgwID49IDA7IGluZGV4MC0tKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXgwIDwgKHNuYXBzaG90cy5sZW5ndGggLSAxKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuYXBzaG90c1tpbmRleDBdW2NoaWxkcmVuW2luZGV4MCArIDFdXSA9IHNuYXBzaG90c1tpbmRleDAgKyAxXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleDAgPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGN1cnJlbnRTdGF0ZSwgc3RhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdGF0ZVtuYW1lRmllbGRdW2NoaWxkcmVuW2luZGV4MF1dID0gc25hcHNob3RzW2luZGV4MF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZFN0YXRlID0gY3VycmVudFN0YXRlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1cGRhdGVkU3RhdGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHNuYXBzaG90c1tzbmFwc2hvdHMubGVuZ3RoIC0gMV1bY2hpbGRyZW5baW5kZXhdXSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2Ygc25hcHNob3RzW3NuYXBzaG90cy5sZW5ndGggLSAxXVtjaGlsZHJlbltpbmRleF1dICE9PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmFwc2hvdHMucHVzaChzbmFwc2hvdHNbc25hcHNob3RzLmxlbmd0aCAtIDFdW2NoaWxkcmVuW2luZGV4XV0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHNuYXBzaG90c1tzbmFwc2hvdHMubGVuZ3RoIC0gMV1bY2hpbGRyZW5baW5kZXhdXSA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFRoZSByZWZlcmVuY2VkIHByb3BlcnR5ICcke2NoaWxkcmVuW2luZGV4XX0nIGRvZXMgbm90IGV4aXN0IGluIGN1cnJlbnQgc3RhdGUuYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgVGhlIHJlZmVyZW5jZWQgcHJvcGVydHkgJyR7bmFtZUZpZWxkfScgZG9lcyBub3QgZXhpc3QgaW4gY3VycmVudCBzdGF0ZS5gKTtcclxuICAgICAgICAgICAgcmV0dXJuIHN0YXRlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iXX0=