Socket
Socket
Sign inDemoInstall

ngrx-store-localstorage

Package Overview
Dependencies
Maintainers
2
Versions
49
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

ngrx-store-localstorage - npm Package Compare versions

Comparing version 10.0.0 to 10.1.0

60

bundles/ngrx-store-localstorage.umd.js

@@ -34,3 +34,3 @@ (function (global, factory) {

// correctly parse dates from local storage
var dateReviver = function (key, value) {
var dateReviver = function (_key, value) {
if (typeof value === 'string' && detectDate.test(value)) {

@@ -41,3 +41,3 @@ return new Date(value);

};
var dummyReviver = function (key, value) { return value; };
var dummyReviver = function (_key, value) { return value; };
var ɵ0 = dummyReviver;

@@ -55,4 +55,3 @@ var checkIsBrowserEnv = function () {

if (typeof attr !== 'string') {
throw new TypeError("localStorageSync Unknown Parameter Type: " +
("Expected type of string, got " + typeof attr));
throw new TypeError("localStorageSync Unknown Parameter Type: " + ("Expected type of string, got " + typeof attr));
}

@@ -88,4 +87,3 @@ return key;

if (curr[key].encrypt && curr[key].decrypt) {
if (typeof curr[key].encrypt === 'function' &&
typeof curr[key].decrypt === 'function') {
if (typeof curr[key].encrypt === 'function' && typeof curr[key].decrypt === 'function') {
decrypt = curr[key].decrypt;

@@ -122,2 +120,23 @@ }

};
// Recursively traverse all properties of the existing slice as defined by the `filter` argument,
// and output the new object with extraneous properties removed.
function createStateSlice(existingSlice, filter) {
return filter.reduce(function (memo, attr) {
if (typeof attr === 'string' || typeof attr === 'number') {
var value = existingSlice === null || existingSlice === void 0 ? void 0 : existingSlice[attr];
if (value !== undefined) {
memo[attr] = value;
}
}
else {
for (var key in attr) {
if (Object.prototype.hasOwnProperty.call(attr, key)) {
var element = attr[key];
memo[key] = createStateSlice(existingSlice[key], element);
}
}
}
return memo;
}, {});
}
var syncStateUpdate = function (state, keys, storage, storageKeySerializer, removeOnUndefined, syncCondition) {

@@ -161,6 +180,3 @@ if (syncCondition) {

if (filter) {
stateSlice = filter.reduce(function (memo, attr) {
memo[attr] = stateSlice[attr];
return memo;
}, {});
stateSlice = createStateSlice(stateSlice, filter);
}

@@ -179,5 +195,5 @@ // Check if encrypt and decrypt are present, also checked at this#rehydrateApplicationState()

/*
Replacer and space arguments to pass to JSON.stringify.
If these fields don't exist, undefined will be passed.
*/
Replacer and space arguments to pass to JSON.stringify.
If these fields don't exist, undefined will be passed.
*/
replacer = key[name].replacer;

@@ -192,9 +208,5 @@ space = key[name].space;

// ensure that a string message is passed
stateSlice = encrypt(typeof stateSlice === 'string'
? stateSlice
: JSON.stringify(stateSlice, replacer, space));
stateSlice = encrypt(typeof stateSlice === 'string' ? stateSlice : JSON.stringify(stateSlice, replacer, space));
}
storage.setItem(storageKeySerializer(key), typeof stateSlice === 'string'
? stateSlice
: JSON.stringify(stateSlice, replacer, space));
storage.setItem(storageKeySerializer(key), typeof stateSlice === 'string' ? stateSlice : JSON.stringify(stateSlice, replacer, space));
}

@@ -220,3 +232,3 @@ catch (e) {

var options = {
arrayMerge: overwriteMerge
arrayMerge: overwriteMerge,
};

@@ -228,4 +240,4 @@ state = deepmerge__namespace(state, rehydratedState, options);

var localStorageSync = function (config) { return function (reducer) {
if (config.storage === undefined &&
!config.checkStorageAvailability || (config.checkStorageAvailability && checkIsBrowserEnv())) {
if ((config.storage === undefined && !config.checkStorageAvailability) ||
(config.checkStorageAvailability && checkIsBrowserEnv())) {
config.storage = localStorage || window.localStorage;

@@ -241,3 +253,3 @@ }

var mergeReducer = config.mergeReducer;
if (mergeReducer === undefined || typeof (mergeReducer) !== 'function') {
if (mergeReducer === undefined || typeof mergeReducer !== 'function') {
mergeReducer = defaultMergeReducer;

@@ -253,3 +265,3 @@ }

// in order to get a complete state as defined by user
if ((action.type === INIT_ACTION) && !state) {
if (action.type === INIT_ACTION && !state) {
nextState = reducer(state, action);

@@ -256,0 +268,0 @@ }

2

bundles/ngrx-store-localstorage.umd.min.js

@@ -1,2 +0,2 @@

!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("deepmerge")):"function"==typeof define&&define.amd?define("ngrx-store-localstorage",["exports","deepmerge"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self)["ngrx-store-localstorage"]={},e.deepmerge)}(this,(function(e,t){"use strict";function r(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}var n=r(t),o="@ngrx/store/init",i=/(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})/,c=function(e,t){return"string"==typeof t&&i.test(t)?new Date(t):t},a=function(e,t){return t},f=a,s=function(){return"undefined"!=typeof window},y=s,u=function(e){return e.map((function(e){var t=e;if("object"==typeof e&&(t=Object.keys(e)[0]),"string"!=typeof t)throw new TypeError("localStorageSync Unknown Parameter Type: Expected type of string, got "+typeof t);return e}))},d=u,p=function(e,t,r,n){return e.reduce((function(e,o){var i,f,s,y=o,u=n?c:a;if("object"==typeof y&&("function"==typeof o[y=Object.keys(y)[0]]?u=o[y]:(o[y].reviver&&(u=o[y].reviver),o[y].deserialize&&(f=o[y].deserialize)),o[y].encrypt&&o[y].decrypt?"function"==typeof o[y].encrypt&&"function"==typeof o[y].decrypt?s=o[y].decrypt:console.error("Either encrypt or decrypt is not a function on '"+o[y]+"' key object."):(o[y].encrypt||o[y].decrypt)&&console.error("Either encrypt or decrypt function is not present on '"+o[y]+"' key object.")),void 0!==t){var d=t.getItem(r(y));if(d){s&&(d=s(d));var p=new RegExp("{|\\["),l=d;return("null"===d||p.test(d.charAt(0)))&&(l=JSON.parse(d,u)),Object.assign({},e,((i={})[y]=f?f(l):l,i))}}return e}),{})},l=function(e,t,r,n,o,i){if(i)try{if(!0!==i(e))return}catch(e){if(e instanceof TypeError)return;throw e}t.forEach((function(t){var i,c,a,f=e[t];if("object"==typeof t){var s=Object.keys(t)[0];if(void 0!==(f=e[s])&&t[s]){if(t[s].serialize)f=t[s].serialize(f);else{var y=void 0;t[s].reduce?y=t[s]:t[s].filter&&(y=t[s].filter),y&&(f=y.reduce((function(e,t){return e[t]=f[t],e}),{})),t[s].encrypt&&t[s].decrypt?"function"==typeof t[s].encrypt&&(a=t[s].encrypt):(t[s].encrypt||t[s].decrypt)&&console.error("Either encrypt or decrypt function is not present on '"+t[s]+"' key object.")}i=t[s].replacer,c=t[s].space}t=s}if(void 0!==f&&void 0!==r)try{a&&(f=a("string"==typeof f?f:JSON.stringify(f,i,c))),r.setItem(n(t),"string"==typeof f?f:JSON.stringify(f,i,c))}catch(e){console.warn("Unable to save state to localStorage:",e)}else if(void 0===f&&o)try{r.removeItem(n(t))}catch(e){console.warn("Exception on removing/cleaning undefined '"+t+"' state",e)}}))},g=function(e,t,r){if((r.type===o||"@ngrx/store/update-reducers"===r.type)&&t){e=n(e,t,{arrayMerge:function(e,t,r){return t}})}return e};e.dateReviver=c,e.defaultMergeReducer=g,e.localStorageSync=function(e){return function(t){(void 0===e.storage&&!e.checkStorageAvailability||e.checkStorageAvailability&&s())&&(e.storage=localStorage||window.localStorage),void 0===e.storageKeySerializer&&(e.storageKeySerializer=function(e){return e}),void 0===e.restoreDates&&(e.restoreDates=!0);var r=e.mergeReducer;void 0!==r&&"function"==typeof r||(r=g);var n=u(e.keys),i=e.rehydrate?p(n,e.storage,e.storageKeySerializer,e.restoreDates):void 0;return function(c,a){var f;return f=a.type!==o||c?Object.assign({},c):t(c,a),f=r(f,i,a),f=t(f,a),a.type!==o&&l(f,n,e.storage,e.storageKeySerializer,e.removeOnUndefined,e.syncCondition),f}}},e.rehydrateApplicationState=p,e.syncStateUpdate=l,e.ɵ0=f,e.ɵ1=y,e.ɵ2=d,Object.defineProperty(e,"__esModule",{value:!0})}));
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("deepmerge")):"function"==typeof define&&define.amd?define("ngrx-store-localstorage",["exports","deepmerge"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self)["ngrx-store-localstorage"]={},e.deepmerge)}(this,(function(e,t){"use strict";function r(e){if(e&&e.__esModule)return e;var t=Object.create(null);return e&&Object.keys(e).forEach((function(r){if("default"!==r){var n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})}})),t.default=e,Object.freeze(t)}var n=r(t),o="@ngrx/store/init",i=/(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})/,c=function(e,t){return"string"==typeof t&&i.test(t)?new Date(t):t},a=function(e,t){return t},f=a,s=function(){return"undefined"!=typeof window},y=s,u=function(e){return e.map((function(e){var t=e;if("object"==typeof e&&(t=Object.keys(e)[0]),"string"!=typeof t)throw new TypeError("localStorageSync Unknown Parameter Type: Expected type of string, got "+typeof t);return e}))},p=u,d=function(e,t,r,n){return e.reduce((function(e,o){var i,f,s,y=o,u=n?c:a;if("object"==typeof y&&("function"==typeof o[y=Object.keys(y)[0]]?u=o[y]:(o[y].reviver&&(u=o[y].reviver),o[y].deserialize&&(f=o[y].deserialize)),o[y].encrypt&&o[y].decrypt?"function"==typeof o[y].encrypt&&"function"==typeof o[y].decrypt?s=o[y].decrypt:console.error("Either encrypt or decrypt is not a function on '"+o[y]+"' key object."):(o[y].encrypt||o[y].decrypt)&&console.error("Either encrypt or decrypt function is not present on '"+o[y]+"' key object.")),void 0!==t){var p=t.getItem(r(y));if(p){s&&(p=s(p));var d=new RegExp("{|\\["),l=p;return("null"===p||d.test(p.charAt(0)))&&(l=JSON.parse(p,u)),Object.assign({},e,((i={})[y]=f?f(l):l,i))}}return e}),{})};var l=function(e,t,r,n,o,i){if(i)try{if(!0!==i(e))return}catch(e){if(e instanceof TypeError)return;throw e}t.forEach((function(t){var i,c,a,f=e[t];if("object"==typeof t){var s=Object.keys(t)[0];if(void 0!==(f=e[s])&&t[s]){if(t[s].serialize)f=t[s].serialize(f);else{var y=void 0;t[s].reduce?y=t[s]:t[s].filter&&(y=t[s].filter),y&&(f=function e(t,r){return r.reduce((function(r,n){if("string"==typeof n||"number"==typeof n){var o=null==t?void 0:t[n];void 0!==o&&(r[n]=o)}else for(var i in n)if(Object.prototype.hasOwnProperty.call(n,i)){var c=n[i];r[i]=e(t[i],c)}return r}),{})}(f,y)),t[s].encrypt&&t[s].decrypt?"function"==typeof t[s].encrypt&&(a=t[s].encrypt):(t[s].encrypt||t[s].decrypt)&&console.error("Either encrypt or decrypt function is not present on '"+t[s]+"' key object.")}i=t[s].replacer,c=t[s].space}t=s}if(void 0!==f&&void 0!==r)try{a&&(f=a("string"==typeof f?f:JSON.stringify(f,i,c))),r.setItem(n(t),"string"==typeof f?f:JSON.stringify(f,i,c))}catch(e){console.warn("Unable to save state to localStorage:",e)}else if(void 0===f&&o)try{r.removeItem(n(t))}catch(e){console.warn("Exception on removing/cleaning undefined '"+t+"' state",e)}}))},g=function(e,t,r){if((r.type===o||"@ngrx/store/update-reducers"===r.type)&&t){e=n(e,t,{arrayMerge:function(e,t,r){return t}})}return e};e.dateReviver=c,e.defaultMergeReducer=g,e.localStorageSync=function(e){return function(t){(void 0===e.storage&&!e.checkStorageAvailability||e.checkStorageAvailability&&s())&&(e.storage=localStorage||window.localStorage),void 0===e.storageKeySerializer&&(e.storageKeySerializer=function(e){return e}),void 0===e.restoreDates&&(e.restoreDates=!0);var r=e.mergeReducer;void 0!==r&&"function"==typeof r||(r=g);var n=u(e.keys),i=e.rehydrate?d(n,e.storage,e.storageKeySerializer,e.restoreDates):void 0;return function(c,a){var f;return f=a.type!==o||c?Object.assign({},c):t(c,a),f=r(f,i,a),f=t(f,a),a.type!==o&&l(f,n,e.storage,e.storageKeySerializer,e.removeOnUndefined,e.syncCondition),f}}},e.rehydrateApplicationState=d,e.syncStateUpdate=l,e.ɵ0=f,e.ɵ1=y,e.ɵ2=p,Object.defineProperty(e,"__esModule",{value:!0})}));
//# sourceMappingURL=ngrx-store-localstorage.umd.min.js.map

@@ -6,3 +6,3 @@ import * as deepmerge from 'deepmerge';

// correctly parse dates from local storage
export const dateReviver = (key, value) => {
export const dateReviver = (_key, value) => {
if (typeof value === 'string' && detectDate.test(value)) {

@@ -13,3 +13,3 @@ return new Date(value);

};
const dummyReviver = (key, value) => value;
const dummyReviver = (_key, value) => value;
const ɵ0 = dummyReviver;

@@ -21,3 +21,3 @@ const checkIsBrowserEnv = () => {

const validateStateKeys = (keys) => {
return keys.map(key => {
return keys.map((key) => {
let attr = key;

@@ -28,4 +28,3 @@ if (typeof key === 'object') {

if (typeof attr !== 'string') {
throw new TypeError(`localStorageSync Unknown Parameter Type: ` +
`Expected type of string, got ${typeof attr}`);
throw new TypeError(`localStorageSync Unknown Parameter Type: ` + `Expected type of string, got ${typeof attr}`);
}

@@ -60,4 +59,3 @@ return key;

if (curr[key].encrypt && curr[key].decrypt) {
if (typeof curr[key].encrypt === 'function' &&
typeof curr[key].decrypt === 'function') {
if (typeof curr[key].encrypt === 'function' && typeof curr[key].decrypt === 'function') {
decrypt = curr[key].decrypt;

@@ -87,3 +85,3 @@ }

return Object.assign({}, acc, {
[key]: deserialize ? deserialize(raw) : raw
[key]: deserialize ? deserialize(raw) : raw,
});

@@ -95,2 +93,23 @@ }

};
// Recursively traverse all properties of the existing slice as defined by the `filter` argument,
// and output the new object with extraneous properties removed.
function createStateSlice(existingSlice, filter) {
return filter.reduce((memo, attr) => {
if (typeof attr === 'string' || typeof attr === 'number') {
const value = existingSlice === null || existingSlice === void 0 ? void 0 : existingSlice[attr];
if (value !== undefined) {
memo[attr] = value;
}
}
else {
for (const key in attr) {
if (Object.prototype.hasOwnProperty.call(attr, key)) {
const element = attr[key];
memo[key] = createStateSlice(existingSlice[key], element);
}
}
}
return memo;
}, {});
}
export const syncStateUpdate = (state, keys, storage, storageKeySerializer, removeOnUndefined, syncCondition) => {

@@ -111,3 +130,3 @@ if (syncCondition) {

}
keys.forEach(key => {
keys.forEach((key) => {
let stateSlice = state[key];

@@ -135,6 +154,3 @@ let replacer;

if (filter) {
stateSlice = filter.reduce((memo, attr) => {
memo[attr] = stateSlice[attr];
return memo;
}, {});
stateSlice = createStateSlice(stateSlice, filter);
}

@@ -153,5 +169,5 @@ // Check if encrypt and decrypt are present, also checked at this#rehydrateApplicationState()

/*
Replacer and space arguments to pass to JSON.stringify.
If these fields don't exist, undefined will be passed.
*/
Replacer and space arguments to pass to JSON.stringify.
If these fields don't exist, undefined will be passed.
*/
replacer = key[name].replacer;

@@ -166,9 +182,5 @@ space = key[name].space;

// ensure that a string message is passed
stateSlice = encrypt(typeof stateSlice === 'string'
? stateSlice
: JSON.stringify(stateSlice, replacer, space));
stateSlice = encrypt(typeof stateSlice === 'string' ? stateSlice : JSON.stringify(stateSlice, replacer, space));
}
storage.setItem(storageKeySerializer(key), typeof stateSlice === 'string'
? stateSlice
: JSON.stringify(stateSlice, replacer, space));
storage.setItem(storageKeySerializer(key), typeof stateSlice === 'string' ? stateSlice : JSON.stringify(stateSlice, replacer, space));
}

@@ -194,3 +206,3 @@ catch (e) {

const options = {
arrayMerge: overwriteMerge
arrayMerge: overwriteMerge,
};

@@ -202,8 +214,8 @@ state = deepmerge(state, rehydratedState, options);

export const localStorageSync = (config) => (reducer) => {
if (config.storage === undefined &&
!config.checkStorageAvailability || (config.checkStorageAvailability && checkIsBrowserEnv())) {
if ((config.storage === undefined && !config.checkStorageAvailability) ||
(config.checkStorageAvailability && checkIsBrowserEnv())) {
config.storage = localStorage || window.localStorage;
}
if (config.storageKeySerializer === undefined) {
config.storageKeySerializer = key => key;
config.storageKeySerializer = (key) => key;
}

@@ -215,3 +227,3 @@ if (config.restoreDates === undefined) {

let mergeReducer = config.mergeReducer;
if (mergeReducer === undefined || typeof (mergeReducer) !== 'function') {
if (mergeReducer === undefined || typeof mergeReducer !== 'function') {
mergeReducer = defaultMergeReducer;

@@ -227,3 +239,3 @@ }

// in order to get a complete state as defined by user
if ((action.type === INIT_ACTION) && !state) {
if (action.type === INIT_ACTION && !state) {
nextState = reducer(state, action);

@@ -245,2 +257,2 @@ }

export { ɵ0, ɵ1, ɵ2 };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxTQUFTLE1BQU0sV0FBVyxDQUFDO0FBRXZDLE1BQU0sV0FBVyxHQUFHLGtCQUFrQixDQUFDO0FBQ3ZDLE1BQU0sYUFBYSxHQUFHLDZCQUE2QixDQUFDO0FBQ3BELE1BQU0sVUFBVSxHQUFHLGlEQUFpRCxDQUFDO0FBRXJFLDJDQUEyQztBQUMzQyxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxHQUFXLEVBQUUsS0FBVSxFQUFFLEVBQUU7SUFDckQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUN2RCxPQUFPLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQ3hCO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDLENBQUM7QUFFRixNQUFNLFlBQVksR0FBRyxDQUFDLEdBQVcsRUFBRSxLQUFVLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQzs7QUFFeEQsTUFBTSxpQkFBaUIsR0FBRyxHQUFHLEVBQUU7SUFDN0IsT0FBTyxPQUFPLE1BQU0sS0FBSyxXQUFXLENBQUM7QUFDdkMsQ0FBQyxDQUFDOztBQUVGLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxJQUFXLEVBQUUsRUFBRTtJQUN4QyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDcEIsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDO1FBRWYsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUU7WUFDM0IsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDNUI7UUFFRCxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRTtZQUM1QixNQUFNLElBQUks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QUMvQixlQUFlLENBQ2IsU0FBUyxFQUNULFNBQVMsRUFDVCxNQUFNLENBQUMsT0FBTyxFQUNkLE1BQU0sQ0FBQyxvQkFBb0IsRUFDM0IsTUFBTSxDQUFDLGlCQUFpQixFQUN4QixNQUFNLENBQUMsYUFBYSxDQUNyQixDQUFDO1NBQ0g7UUFFRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDLENBQUM7QUFDSixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBkZWVwbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcblxuY29uc3QgSU5JVF9BQ1RJT04gPSAnQG5ncngvc3RvcmUvaW5pdCc7XG5jb25zdCBVUERBVEVfQUNUSU9OID0gJ0BuZ3J4L3N0b3JlL3VwZGF0ZS1yZWR1Y2Vycyc7XG5jb25zdCBkZXRlY3REYXRlID0gLyhcXGR7NH0pLShcXGR7Mn0pLShcXGR7Mn0pVChcXGR7Mn0pOihcXGR7Mn0pOihcXGR7Mn0pLztcblxuLy8gY29ycmVjdGx5IHBhcnNlIGRhdGVzIGZyb20gbG9jYWwgc3RvcmFnZVxuZXhwb3J0IGNvbnN0IGRhdGVSZXZpdmVyID0gKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIGRldGVjdERhdGUudGVzdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gbmV3IERhdGUodmFsdWUpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbmNvbnN0IGR1bW15UmV2aXZlciA9IChrZXk6IHN0cmluZywgdmFsdWU6IGFueSkgPT4gdmFsdWU7XG5cbmNvbnN0IGNoZWNrSXNCcm93c2VyRW52ID0gKCkgPT4ge1xuICByZXR1cm4gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCc7XG59O1xuXG5jb25zdCB2YWxpZGF0ZVN0YXRlS2V5cyA9IChrZXlzOiBhbnlbXSkgPT4ge1xuICByZXR1cm4ga2V5cy5tYXAoa2V5ID0+IHtcbiAgICBsZXQgYXR0ciA9IGtleTtcblxuICAgIGlmICh0eXBlb2Yga2V5ID09PSAnb2JqZWN0Jykge1xuICAgICAgYXR0ciA9IE9iamVjdC5rZXlzKGtleSlbMF07XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBhdHRyICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgYGxvY2FsU3RvcmFnZVN5bmMgVW5rbm93biBQYXJhbWV0ZXIgVHlwZTogYCArXG4gICAgICAgIGBFeHBlY3RlZCB0eXBlIG9mIHN0cmluZywgZ290ICR7dHlwZW9mIGF0dHJ9YFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGtleTtcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgcmVoeWRyYXRlQXBwbGljYXRpb25TdGF0ZSA9IChcbiAga2V5czogYW55W10sXG4gIHN0b3JhZ2U6IFN0b3JhZ2UsXG4gIHN0b3JhZ2VLZXlTZXJpYWxpemVyOiAoa2V5OiBzdHJpbmcpID0+IHN0cmluZyxcbiAgcmVzdG9yZURhdGVzOiBib29sZWFuXG4pID0+IHtcbiAgcmV0dXJuIGtleXMucmVkdWNlKChhY2MsIGN1cnIpID0+IHtcbiAgICBsZXQga2V5ID0gY3VycjtcbiAgICBsZXQgcmV2aXZlciA9IHJlc3RvcmVEYXRlcyA/IGRhdGVSZXZpdmVyIDogZHVtbXlSZXZpdmVyO1xuICAgIGxldCBkZXNlcmlhbGl6ZTtcbiAgICBsZXQgZGVjcnlwdDtcblxuICAgIGlmICh0eXBlb2Yga2V5ID09PSAnb2JqZWN0Jykge1xuICAgICAga2V5ID0gT2JqZWN0LmtleXMoa2V5KVswXTtcbiAgICAgIC8vIHVzZSB0aGUgY3VzdG9tIHJldml2ZXIgZnVuY3Rpb25cbiAgICAgIGlmICh0eXBlb2YgY3VycltrZXldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldml2ZXIgPSBjdXJyW2tleV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB1c2UgY3VzdG9tIHJldml2ZXIgZnVuY3Rpb24gaWYgYXZhaWxhYmxlXG4gICAgICAgIGlmIChjdXJyW2tleV0ucmV2aXZlcikge1xuICAgICAgICAgIHJldml2ZXIgPSBjdXJyW2tleV0ucmV2aXZlcjtcbiAgICAgICAgfVxuICAgICAgICAvLyB1c2UgY3VzdG9tIHNlcmlhbGl6ZSBmdW5jdGlvbiBpZiBhdmFpbGFibGVcbiAgICAgICAgaWYgKGN1cnJba2V5XS5kZXNlcmlhbGl6ZSkge1xuICAgICAgICAgIGRlc2VyaWFsaXplID0gY3VycltrZXldLmRlc2VyaWFsaXplO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEVuc3VyZSB0aGF0IGVuY3J5cHQgYW5kIGRlY3J5cHQgZnVuY3Rpb25zIGFyZSBib3RoIHByZXNlbnRcbiAgICAgIGlmIChjdXJyW2tleV0uZW5jcnlwdCAmJiBjdXJyW2tleV0uZGVjcnlwdCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdHlwZW9mIGN1cnJba2V5XS5lbmNyeXB0ID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAgICAgdHlwZW9mIGN1cnJba2V5XS5kZWNyeXB0ID09PSAnZnVuY3Rpb24nXG4gICAgICAgICkge1xuICAgICAgICAgIGRlY3J5cHQgPSBjdXJyW2tleV0uZGVjcnlwdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgYEVpdGhlciBlbmNyeXB0IG9yIGRlY3J5cHQgaXMgbm90IGEgZnVuY3Rpb24gb24gJyR7XG4gICAgICAgICAgICBjdXJyW2tleV1cbiAgICAgICAgICAgIH0nIGtleSBvYmplY3QuYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY3VycltrZXldLmVuY3J5cHQgfHwgY3VycltrZXldLmRlY3J5cHQpIHtcbiAgICAgICAgLy8gTGV0IGtub3cgdGhhdCBvbmUgb2YgdGhlIGVuY3J5cHRpb24gZnVuY3Rpb25zIGlzIG5vdCBwcm92aWRlZFxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIGBFaXRoZXIgZW5jcnlwdCBvciBkZWNyeXB0IGZ1bmN0aW9uIGlzIG5vdCBwcmVzZW50IG9uICcke1xuICAgICAgICAgIGN1cnJba2V5XVxuICAgICAgICAgIH0nIGtleSBvYmplY3QuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3RvcmFnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBsZXQgc3RhdGVTbGljZSA9IHN0b3JhZ2UuZ2V0SXRlbShzdG9yYWdlS2V5U2VyaWFsaXplcihrZXkpKTtcbiAgICAgIGlmIChzdGF0ZVNsaWNlKSB7XG4gICAgICAgIC8vIFVzZSBwcm92aWRlZCBkZWNyeXB0IGZ1bmN0aW9uXG4gICAgICAgIGlmIChkZWNyeXB0KSB7XG4gICAgICAgICAgc3RhdGVTbGljZSA9IGRlY3J5cHQoc3RhdGVTbGljZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc09iamVjdFJlZ2V4ID0gbmV3IFJlZ0V4cCgne3xcXFxcWycpO1xuICAgICAgICBsZXQgcmF3ID0gc3RhdGVTbGljZTtcblxuICAgICAgICBpZiAoc3RhdGVTbGljZSA9PT0gJ251bGwnIHx8IGlzT2JqZWN0UmVnZXgudGVzdChzdGF0ZVNsaWNlLmNoYXJBdCgwKSkpIHtcbiAgICAgICAgICByYXcgPSBKU09OLnBhcnNlKHN0YXRlU2xpY2UsIHJldml2ZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGFjYywge1xuICAgICAgICAgIFtrZXldOiBkZXNlcmlhbGl6ZSA/IGRlc2VyaWFsaXplKHJhdykgOiByYXdcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBzeW5jU3RhdGVVcGRhdGUgPSAoXG4gIHN0YXRlOiBhbnksXG4gIGtleXM6IGFueVtdLFxuICBzdG9yYWdlOiBTdG9yYWdlLFxuICBzdG9yYWdlS2V5U2VyaWFsaXplcjogKGtleTogc3RyaW5nKSA9PiBzdHJpbmcsXG4gIHJlbW92ZU9uVW5kZWZpbmVkOiBib29sZWFuLFxuICBzeW5jQ29uZGl0aW9uPzogKHN0YXRlOiBhbnkpID0+IGFueVxuKSA9PiB7XG4gIGlmIChzeW5jQ29uZGl0aW9uKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChzeW5jQ29uZGl0aW9uKHN0YXRlKSAhPT0gdHJ1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gVHJlYXQgVHlwZUVycm9yIGFzIGRvIG5vdCBzeW5jXG4gICAgICBpZiAoZSBpbnN0YW5jZW9mIFR5cGVFcnJvcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuICBrZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICBsZXQgc3RhdGVTbGljZSA9IHN0YXRlW2tleV07XG4gICAgbGV0IHJlcGxhY2VyO1xuICAgIGxldCBzcGFjZTtcbiAgICBsZXQgZW5jcnlwdDtcblxuICAgIGlmICh0eXBlb2Yga2V5ID09PSAnb2JqZWN0Jykge1xuICAgICAgbGV0IG5hbWUgPSBPYmplY3Qua2V5cyhrZXkpWzBdO1xuICAgICAgc3RhdGVTbGljZSA9IHN0YXRlW25hbWVdO1xuXG4gICAgICBpZiAodHlwZW9mIHN0YXRlU2xpY2UgIT09ICd1bmRlZmluZWQnICYmIGtleVtuYW1lXSkge1xuICAgICAgICAvLyB1c2Ugc2VyaWFsaXplIGZ1bmN0aW9uIGlmIHNwZWNpZmllZC5cbiAgICAgICAgaWYgKGtleVtuYW1lXS5zZXJpYWxpemUpIHtcbiAgICAgICAgICBzdGF0ZVNsaWNlID0ga2V5W25hbWVdLnNlcmlhbGl6ZShzdGF0ZVNsaWNlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBpZiBzZXJpYWxpemUgZnVuY3Rpb24gaXMgbm90IHNwZWNpZmllZCBmaWx0ZXIgb24gZmllbGRzIGlmIGFuIGFycmF5IGhhcyBiZWVuIHByb3ZpZGVkLlxuICAgICAgICAgIGxldCBmaWx0ZXI7XG4gICAgICAgICAgaWYgKGtleVtuYW1lXS5yZWR1Y2UpIHtcbiAgICAgICAgICAgIGZpbHRlciA9IGtleVtuYW1lXTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGtleVtuYW1lXS5maWx0ZXIpIHtcbiAgICAgICAgICAgIGZpbHRlciA9IGtleVtuYW1lXS5maWx0ZXI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChmaWx0ZXIpIHtcbiAgICAgICAgICAgIHN0YXRlU2xpY2UgPSBmaWx0ZXIucmVkdWNlKChtZW1vLCBhdHRyKSA9PiB7XG4gICAgICAgICAgICAgIG1lbW9bYXR0cl0gPSBzdGF0ZVNsaWNlW2F0dHJdO1xuICAgICAgICAgICAgICByZXR1cm4gbWVtbztcbiAgICAgICAgICAgIH0sIHt9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiBlbmNyeXB0IGFuZCBkZWNyeXB0IGFyZSBwcmVzZW50LCBhbHNvIGNoZWNrZWQgYXQgdGhpcyNyZWh5ZHJhdGVBcHBsaWNhdGlvblN0YXRlKClcbiAgICAgICAgICBpZiAoa2V5W25hbWVdLmVuY3J5cHQgJiYga2V5W25hbWVdLmRlY3J5cHQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Yga2V5W25hbWVdLmVuY3J5cHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgZW5jcnlwdCA9IGtleVtuYW1lXS5lbmNyeXB0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoa2V5W25hbWVdLmVuY3J5cHQgfHwga2V5W25hbWVdLmRlY3J5cHQpIHtcbiAgICAgICAgICAgIC8vIElmIG9uZSBvZiB0aG9zZSBpcyBub3QgcHJlc2VudCwgdGhlbiBsZXQga25vdyB0aGF0IG9uZSBpcyBtaXNzaW5nXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICBgRWl0aGVyIGVuY3J5cHQgb3IgZGVjcnlwdCBmdW5jdGlvbiBpcyBub3QgcHJlc2VudCBvbiAnJHtcbiAgICAgICAgICAgICAga2V5W25hbWVdXG4gICAgICAgICAgICAgIH0nIGtleSBvYmplY3QuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKlxuICAgICAgICAgIFJlcGxhY2VyIGFuZCBzcGFjZSBhcmd1bWVudHMgdG8gcGFzcyB0byBKU09OLnN0cmluZ2lmeS5cbiAgICAgICAgICBJZiB0aGVzZSBmaWVsZHMgZG9uJ3QgZXhpc3QsIHVuZGVmaW5lZCB3aWxsIGJlIHBhc3NlZC5cbiAgICAgICAgKi9cbiAgICAgICAgcmVwbGFjZXIgPSBrZXlbbmFtZV0ucmVwbGFjZXI7XG4gICAgICAgIHNwYWNlID0ga2V5W25hbWVdLnNwYWNlO1xuICAgICAgfVxuXG4gICAgICBrZXkgPSBuYW1lO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygc3RhdGVTbGljZSAhPT0gJ3VuZGVmaW5lZCcgJiYgc3RvcmFnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoZW5jcnlwdCkge1xuICAgICAgICAgIC8vIGVuc3VyZSB0aGF0IGEgc3RyaW5nIG1lc3NhZ2UgaXMgcGFzc2VkXG4gICAgICAgICAgc3RhdGVTbGljZSA9IGVuY3J5cHQoXG4gICAgICAgICAgICB0eXBlb2Ygc3RhdGVTbGljZSA9PT0gJ3N0cmluZydcbiAgICAgICAgICAgICAgPyBzdGF0ZVNsaWNlXG4gICAgICAgICAgICAgIDogSlNPTi5zdHJpbmdpZnkoc3RhdGVTbGljZSwgcmVwbGFjZXIsIHNwYWNlKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgc3RvcmFnZS5zZXRJdGVtKFxuICAgICAgICAgIHN0b3JhZ2VLZXlTZXJpYWxpemVyKGtleSksXG4gICAgICAgICAgdHlwZW9mIHN0YXRlU2xpY2UgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICA/IHN0YXRlU2xpY2VcbiAgICAgICAgICAgIDogSlNPTi5zdHJpbmdpZnkoc3RhdGVTbGljZSwgcmVwbGFjZXIsIHNwYWNlKVxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1VuYWJsZSB0byBzYXZlIHN0YXRlIHRvIGxvY2FsU3RvcmFnZTonLCBlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBzdGF0ZVNsaWNlID09PSAndW5kZWZpbmVkJyAmJiByZW1vdmVPblVuZGVmaW5lZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc3RvcmFnZS5yZW1vdmVJdGVtKHN0b3JhZ2VLZXlTZXJpYWxpemVyKGtleSkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYEV4Y2VwdGlvbiBvbiByZW1vdmluZy9jbGVhbmluZyB1bmRlZmluZWQgJyR7a2V5fScgc3RhdGVgLFxuICAgICAgICAgIGVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufTtcblxuLy8gRGVmYXVsdCBtZXJnZSBzdHJhdGVneSBpcyBhIGZ1bGwgZGVlcCBtZXJnZS5cbmV4cG9ydCBjb25zdCBkZWZhdWx0TWVyZ2VSZWR1Y2VyID0gKHN0YXRlOiBhbnksIHJlaHlkcmF0ZWRTdGF0ZTogYW55LCBhY3Rpb246IGFueSkgPT4ge1xuXG4gIGlmICgoYWN0aW9uLnR5cGUgPT09IElOSVRfQUNUSU9OIHx8IGFjdGlvbi50eXBlID09PSBVUERBVEVfQUNUSU9OKSAmJiByZWh5ZHJhdGVkU3RhdGUpIHtcbiAgICBjb25zdCBvdmVyd3JpdGVNZXJnZSA9IChkZXN0aW5hdGlvbkFycmF5LCBzb3VyY2VBcnJheSwgb3B0aW9ucykgPT4gc291cmNlQXJyYXk7XG4gICAgY29uc3Qgb3B0aW9uczogZGVlcG1lcmdlLk9wdGlvbnMgPSB7XG4gICAgICBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZVxuICAgIH07XG5cbiAgICBzdGF0ZSA9IGRlZXBtZXJnZShzdGF0ZSwgcmVoeWRyYXRlZFN0YXRlLCBvcHRpb25zKTtcbiAgfVxuXG4gIHJldHVybiBzdGF0ZTtcbn07XG5cbmV4cG9ydCBjb25zdCBsb2NhbFN0b3JhZ2VTeW5jID0gKGNvbmZpZzogTG9jYWxTdG9yYWdlQ29uZmlnKSA9PiAoXG4gIHJlZHVjZXI6IGFueVxuKSA9PiB7XG4gIGlmIChjb25maWcuc3RvcmFnZSA9PT0gdW5kZWZpbmVkICYmXG4gICAgIWNvbmZpZy5jaGVja1N0b3JhZ2VBdmFpbGFiaWxpdHkgfHwgKGNvbmZpZy5jaGVja1N0b3JhZ2VBdmFpbGFiaWxpdHkgJiYgY2hlY2tJc0Jyb3dzZXJFbnYoKSlcbiAgKSB7XG4gICAgY29uZmlnLnN0b3JhZ2UgPSBsb2NhbFN0b3JhZ2UgfHwgd2luZG93LmxvY2FsU3RvcmFnZTtcbiAgfVxuXG4gIGlmIChjb25maWcuc3RvcmFnZUtleVNlcmlhbGl6ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmZpZy5zdG9yYWdlS2V5U2VyaWFsaXplciA9IGtleSA9PiBrZXk7XG4gIH1cblxuICBpZiAoY29uZmlnLnJlc3RvcmVEYXRlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZmlnLnJlc3RvcmVEYXRlcyA9IHRydWU7XG4gIH1cblxuICAvLyBVc2UgZGVmYXVsdCBtZXJnZSByZWR1Y2VyLlxuICBsZXQgbWVyZ2VSZWR1Y2VyID0gY29uZmlnLm1lcmdlUmVkdWNlcjtcblxuICBpZiAobWVyZ2VSZWR1Y2VyID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIChtZXJnZVJlZHVjZXIpICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgbWVyZ2VSZWR1Y2VyID0gZGVmYXVsdE1lcmdlUmVkdWNlcjtcbiAgfVxuXG4gIGNvbnN0IHN0YXRlS2V5cyA9IHZhbGlkYXRlU3RhdGVLZXlzKGNvbmZpZy5rZXlzKTtcbiAgY29uc3QgcmVoeWRyYXRlZFN0YXRlID0gY29uZmlnLnJlaHlkcmF0ZVxuICAgID8gcmVoeWRyYXRlQXBwbGljYXRpb25TdGF0ZShcbiAgICAgIHN0YXRlS2V5cyxcbiAgICAgIGNvbmZpZy5zdG9yYWdlLFxuICAgICAgY29uZmlnLnN0b3JhZ2VLZXlTZXJpYWxpemVyLFxuICAgICAgY29uZmlnLnJlc3RvcmVEYXRlc1xuICAgIClcbiAgICA6IHVuZGVmaW5lZDtcblxuICByZXR1cm4gZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb246IGFueSkge1xuICAgIGxldCBuZXh0U3RhdGU7XG5cbiAgICAvLyBJZiBzdGF0ZSBhcnJpdmVzIHVuZGVmaW5lZCwgd2UgbmVlZCB0byBsZXQgaXQgdGhyb3VnaCB0aGUgc3VwcGxpZWQgcmVkdWNlclxuICAgIC8vIGluIG9yZGVyIHRvIGdldCBhIGNvbXBsZXRlIHN0YXRlIGFzIGRlZmluZWQgYnkgdXNlclxuICAgIGlmICgoYWN0aW9uLnR5cGUgPT09IElOSVRfQUNUSU9OKSAmJiAhc3RhdGUpIHtcbiAgICAgIG5leHRTdGF0ZSA9IHJlZHVjZXIoc3RhdGUsIGFjdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRTdGF0ZSA9IHsgLi4uc3RhdGUgfTtcbiAgICB9XG5cbiAgICAvLyBNZXJnZSB0aGUgc3RvcmUgc3RhdGUgd2l0aCB0aGUgcmVoeWRyYXRlZCBzdGF0ZSB1c2luZ1xuICAgIC8vIGVpdGhlciBhIHVzZXItZGVmaW5lZCByZWR1Y2VyIG9yIHRoZSBkZWZhdWx0LlxuICAgIG5leHRTdGF0ZSA9IG1lcmdlUmVkdWNlcihuZXh0U3RhdGUsIHJlaHlkcmF0ZWRTdGF0ZSwgYWN0aW9uKTtcblxuICAgIG5leHRTdGF0ZSA9IHJlZHVjZXIobmV4dFN0YXRlLCBhY3Rpb24pO1xuXG4gICAgaWYgKGFjdGlvbi50eXBlICE9PSBJTklUX0FDVElPTikge1xuICAgICAgc3luY1N0YXRlVXBkYXRlKFxuICAgICAgICBuZXh0U3RhdGUsXG4gICAgICAgIHN0YXRlS2V5cyxcbiAgICAgICAgY29uZmlnLnN0b3JhZ2UsXG4gICAgICAgIGNvbmZpZy5zdG9yYWdlS2V5U2VyaWFsaXplcixcbiAgICAgICAgY29uZmlnLnJlbW92ZU9uVW5kZWZpbmVkLFxuICAgICAgICBjb25maWcuc3luY0NvbmRpdGlvbixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHRTdGF0ZTtcbiAgfTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9jYWxTdG9yYWdlQ29uZmlnIHtcbiAga2V5czogYW55W107XG4gIHJlaHlkcmF0ZT86IGJvb2xlYW47XG4gIHN0b3JhZ2U/OiBTdG9yYWdlO1xuICByZW1vdmVPblVuZGVmaW5lZD86IGJvb2xlYW47XG4gIHJlc3RvcmVEYXRlcz86IGJvb2xlYW47XG4gIHN0b3JhZ2VLZXlTZXJpYWxpemVyPzogKGtleTogc3RyaW5nKSA9PiBzdHJpbmc7XG4gIHN5bmNDb25kaXRpb24/OiAoc3RhdGU6IGFueSkgPT4gYW55O1xuICBjaGVja1N0b3JhZ2VBdmFpbGFiaWxpdHk/OiBib29sZWFuO1xuICBtZXJnZVJlZHVjZXI/OiAoc3RhdGU6IGFueSwgcmVoeWRyYXRlZFN0YXRlOiBhbnksIGFjdGlvbjogYW55KSA9PiBhbnk7XG59XG4iXX0=
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxTQUFTLE1BQU0sV0FBVyxDQUFDO0FBRXZDLE1BQU0sV0FBVyxHQUFHLGtCQUFrQixDQUFDO0FBQ3ZDLE1BQU0sYUFBYSxHQUFHLDZCQUE2QixDQUFDO0FBQ3BELE1BQU0sVUFBVSxHQUFHLGlEQUFpRCxDQUFDO0FBRXJFLDJDQUEyQztBQUMzQyxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxJQUFZLEVBQUUsS0FBVSxFQUFFLEVBQUU7SUFDcEQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUNyRCxPQUFPLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQzFCO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDakIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxZQUFZLEdBQUcsQ0FBQyxJQUFZLEVBQUUsS0FBVSxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUM7O0FBRXpELE1BQU0saUJBQWlCLEdBQUcsR0FBRyxFQUFFO0lBQzNCLE9BQU8sT0FBTyxNQUFNLEtBQUssV0FBVyxDQUFDO0FBQ3pDLENBQUMsQ0FBQzs7QUFFRixNQUFNLGlCQUFpQixHQUFHLENBQUMsSUFBVSxFQUFFLEVBQUU7SUFDckMsT0FBUSxJQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7UUFDL0IsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDO1FBRWYsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUU7WUFDekIsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDOUI7UUFFRCxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRTtZQUMxQixNQUFNLElBQUksU0FBUyxDQUNmLDJDQUEyQyxHQUFHLGdDQUFnQyxPQUFPLElBQUksRUFBRSxDQUM5RixDQUFDO1NBQ0w7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyxDQUFDOztBQUVGLE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHLENBQ3JDLElBQVUsRUFDVixPQUFnQixFQUNoQixvQkFBNkMsRUFDN0MsWUFBcUIsRUFDdkIsRUFBRTtJQUNBLE9BQVEsSUFBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRTtRQUN4QyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUM7UUFDZixJQUFJLE9BQU8sR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDO1FBQ3hELElBQUksV0FBa0MsQ0FBQztRQUN2QyxJQUFJLE9BQWlDLENBQUM7UUFFdEMsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUU7WUFDekIsR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUIsa0NBQWtDO1lBQ2xDLElBQUksT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssVUFBVSxFQUFFO2dCQUNqQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ3ZCO2lCQUFNO2dCQUNILDJDQUEyQztnQkFDM0MsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFO29CQUNuQixPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQztpQkFDL0I7Z0JBQ0QsNkNBQTZDO2dCQUM3QyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUU7b0JBQ3ZCLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxDQUFDO2lCQUN2QzthQUNKO1lBRUQsNkRBQTZEO1lBQzdELElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFO2dCQUN4QyxJQUFJLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sS0FBSyxVQUFVLElBQUksT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxLQUFLLFVBQVUsRUFBRTtvQkFDcEYsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUM7aUJBQy9CO3FCQUFNO29CQUNILE9BQU8sQ0FBQyxLQUFLLENBQUMsbURBQW1ELElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7aUJBQzlGO2FBQ0o7aUJBQU0sSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUU7Z0JBQy9DLGdFQUFnRTtnQkFDaEUsT0FBTyxDQUFDLEtBQUssQ0FBQyx5REFBeUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQzthQUNwRztTQUNKO1FBQ0QsSUFBSSxPQUFPLEtBQUssU0FBUyxFQUFFO1lBQ3ZCLElBQUksVUFBVSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM1RCxJQUFJLFVBQVUsRUFBRTtnQkFDWixnQ0FBZ0M7Z0JBQ2hDLElBQUksT0FBTyxFQUFFO29CQUNULFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7aUJBQ3BDO2dCQUVELE1BQU0sYUFBYSxHQUFHLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUMxQyxJQUFJLEdBQUcsR0FBRyxVQUFVLENBQUM7Z0JBRXJCLElBQUksVUFBVSxLQUFLLE1BQU0sSUFBSSxhQUFhLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtvQkFDbkUsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2lCQUN6QztnQkFFRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRTtvQkFDMUIsQ0FBQyxHQUFHLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRztpQkFDOUMsQ0FBQyxDQUFDO2FBQ047U0FDSjtRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2YsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ1gsQ0FBQyxDQUFDO0FBRUYsaUdBQWlHO0FBQ2pHLGdFQUFnRTtBQUNoRSxTQUFTLGdCQUFnQixDQUFDLGFBQWtCLEVBQUUsTUFBd0Q7SUFDbEcsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUNoQixDQUFDLElBQTRDLEVBQUUsSUFBa0QsRUFBRSxFQUFFO1FBQ2pHLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRTtZQUN0RCxNQUFNLEtBQUssR0FBRyxhQUFhLGFBQWIsYUFBYSx1QkFBYixhQUFhLENBQUcsSUFBSSxDQUFDLENBQUM7WUFDcEMsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO2dCQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO2FBQ3RCO1NBQ0o7YUFBTTtZQUNILEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFO2dCQUNwQixJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUU7b0JBQ2pELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDMUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztpQkFDN0Q7YUFDSjtTQUNKO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQyxFQUNELEVBQUUsQ0FDTCxDQUFDO0FBQ04sQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxDQUMzQixLQUFVLEVBQ1YsSUFBVSxFQUNWLE9BQWdCLEVBQ2hCLG9CQUFzRCxFQUN0RCxpQkFBMEIsRUFDMUIsYUFBbUMsRUFDckMsRUFBRTtJQUNBLElBQUksYUFBYSxFQUFFO1FBQ2YsSUFBSTtZQUNBLElBQUksYUFBYSxDQUFDLEtBQUssQ0FBQyxLQUFLLElBQUksRUFBRTtnQkFDL0IsT0FBTzthQUNWO1NBQ0o7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNSLGlDQUFpQztZQUNqQyxJQUFJLENBQUMsWUFBWSxTQUFTLEVBQUU7Z0JBQ3hCLE9BQU87YUFDVjtZQUNELE1BQU0sQ0FBQyxDQUFDO1NBQ1g7S0FDSjtJQUVELElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUE2RSxFQUFRLEVBQUU7UUFDakcsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDLEdBQWEsQ0FBQyxDQUFDO1FBQ3RDLElBQUksUUFBUSxDQUFDO1FBQ2IsSUFBSSxLQUFzQixDQUFDO1FBQzNCLElBQUksT0FBTyxDQUFDO1FBRVosSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUU7WUFDekIsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvQixVQUFVLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRXpCLElBQUksT0FBTyxVQUFVLEtBQUssV0FBVyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDaEQsdUNBQXVDO2dCQUN2QyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUU7b0JBQ3JCLFVBQVUsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2lCQUNoRDtxQkFBTTtvQkFDSCx5RkFBeUY7b0JBQ3pGLElBQUksTUFBMEIsQ0FBQztvQkFDL0IsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFO3dCQUNsQixNQUFNLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO3FCQUN0Qjt5QkFBTSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUU7d0JBQ3pCLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDO3FCQUM3QjtvQkFDRCxJQUFJLE1BQU0sRUFBRTt3QkFDUixVQUFVLEdBQUcsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO3FCQUNyRDtvQkFFRCw2RkFBNkY7b0JBQzdGLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFO3dCQUN4QyxJQUFJLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sS0FBSyxVQUFVLEVBQUU7NEJBQ3pDLE9BQU8sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDO3lCQUMvQjtxQkFDSjt5QkFBTSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRTt3QkFDL0Msb0VBQW9FO3dCQUNwRSxPQUFPLENBQUMsS0FBSyxDQUNULHlEQUF5RCxHQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FDcEYsQ0FBQztxQkFDTDtpQkFDSjtnQkFFRDs7O1VBR047Z0JBQ00sUUFBUSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUM7Z0JBQzlCLEtBQUssR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDO2FBQzNCO1lBRUQsR0FBRyxHQUFHLElBQUksQ0FBQztTQUNkO1FBRUQsSUFBSSxPQUFPLFVBQVUsS0FBSyxXQUFXLElBQUksT0FBTyxLQUFLLFNBQVMsRUFBRTtZQUM1RCxJQUFJO2dCQUNBLElBQUksT0FBTyxFQUFFO29CQUNULHlDQUF5QztvQkFDekMsVUFBVSxHQUFHLE9BQU8sQ0FDaEIsT0FBTyxVQUFVLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FDNUYsQ0FBQztpQkFDTDtnQkFDRCxPQUFPLENBQUMsT0FBTyxDQUNYLG9CQUFvQixDQUFDLEdBQWEsQ0FBQyxFQUNuQyxPQUFPLFVBQVUsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUM1RixDQUFDO2FBQ0w7WUFBQyxPQUFPLENBQUMsRUFBRTtnQkFDUixPQUFPLENBQUMsSUFBSSxDQUFDLHVDQUF1QyxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQzVEO1NBQ0o7YUFBTSxJQUFJLE9BQU8sVUFBVSxLQUFLLFdBQVcsSUFBSSxpQkFBaUIsRUFBRTtZQUMvRCxJQUFJO2dCQUNBLE9BQU8sQ0FBQyxVQUFVLENBQUMsb0JBQW9CLENBQUMsR0FBYSxDQUFDLENBQUMsQ0FBQzthQUMzRDtZQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNSLE9BQU8sQ0FBQyxJQUFJLENBQUMsNkNBQTZDLEdBQUcsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQzlFO1NBQ0o7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMsQ0FBQztBQUVGLCtDQUErQztBQUMvQyxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLEtBQVUsRUFBRSxlQUFvQixFQUFFLE1BQVcsRUFBRSxFQUFFO0lBQ2pGLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLFdBQVcsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLGFBQWEsQ0FBQyxJQUFJLGVBQWUsRUFBRTtRQUNuRixNQUFNLGNBQWMsR0FBRyxDQUFDLGdCQUFxQixFQUFFLFdBQWdCLEVBQUUsT0FBWSxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUM7UUFDOUYsTUFBTSxPQUFPLEdBQXNCO1lBQy9CLFVBQVUsRUFBRSxjQUFjO1NBQzdCLENBQUM7UUFFRixLQUFLLEdBQUcsU0FBUyxDQUFDLEtBQUssRUFBRSxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUM7S0FDdEQ7SUFFRCxPQUFPLEtBQUssQ0FBQztBQUNqQixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLE1BQTBCLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBWSxFQUFFLEVBQUU7SUFDN0UsSUFDSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEtBQUssU0FBUyxJQUFJLENBQUMsTUFBTSxDQUFDLHdCQUF3QixDQUFDO1FBQ2xFLENBQUMsTUFBTSxDQUFDLHdCQUF3QixJQUFJLGlCQUFpQixFQUFFLENBQUMsRUFDMUQ7UUFDRSxNQUFNLENBQUMsT0FBTyxHQUFHLFlBQVksSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDO0tBQ3hEO0lBRUQsSUFBSSxNQUFNLENBQUMsb0JBQW9CLEtBQUssU0FBUyxFQUFFO1FBQzNDLE1BQU0sQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDO0tBQzlDO0lBRUQsSUFBSSxNQUFNLENBQUMsWUFBWSxLQUFLLFNBQVMsRUFBRTtRQUNuQyxNQUFNLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztLQUM5QjtJQUVELDZCQUE2QjtJQUM3QixJQUFJLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDO0lBRXZDLElBQUksWUFBWSxLQUFLLFNBQVMsSUFBSSxPQUFPLFlBQVksS0FBSyxVQUFVLEVBQUU7UUFDbEUsWUFBWSxHQUFHLG1CQUFtQixDQUFDO0tBQ3RDO0lBRUQsTUFBTSxTQUFTLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pELE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxTQUFTO1FBQ3BDLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsb0JBQW9CLEVBQUUsTUFBTSxDQUFDLFlBQVksQ0FBQztRQUN4RyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBRWhCLE9BQU8sVUFBVSxLQUFVLEVBQUUsTUFBVztRQUNwQyxJQUFJLFNBQWMsQ0FBQztRQUVuQiw2RUFBNkU7UUFDN0Usc0RBQXNEO1FBQ3RELElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxXQUFXLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDdkMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDdEM7YUFBTTtZQUNILFNBQVMscUJBQVEsS0FBSyxDQUFFLENBQUM7U0FDNUI7UUFFRCx3REFBd0Q7UUFDeEQsZ0RBQWdEO1FBQ2hELFNBQVMsR0FBRyxZQUFZLENBQUMsU0FBUyxFQUFFLGVBQWUsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUU3RCxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUV2QyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssV0FBVyxFQUFFO1lBQzdCLGVBQWUsQ0FDWCxTQUFTLEVBQ1QsU0FBUyxFQUNULE1BQU0sQ0FBQyxPQUFPLEVBQ2QsTUFBTSxDQUFDLG9CQUFvQixFQUMzQixNQUFNLENBQUMsaUJBQWlCLEVBQ3hCLE1BQU0sQ0FBQyxhQUFhLENBQ3ZCLENBQUM7U0FDTDtRQUVELE9BQU8sU0FBUyxDQUFDO0lBQ3JCLENBQUMsQ0FBQztBQUNOLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGRlZXBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuXG5jb25zdCBJTklUX0FDVElPTiA9ICdAbmdyeC9zdG9yZS9pbml0JztcbmNvbnN0IFVQREFURV9BQ1RJT04gPSAnQG5ncngvc3RvcmUvdXBkYXRlLXJlZHVjZXJzJztcbmNvbnN0IGRldGVjdERhdGUgPSAvKFxcZHs0fSktKFxcZHsyfSktKFxcZHsyfSlUKFxcZHsyfSk6KFxcZHsyfSk6KFxcZHsyfSkvO1xuXG4vLyBjb3JyZWN0bHkgcGFyc2UgZGF0ZXMgZnJvbSBsb2NhbCBzdG9yYWdlXG5leHBvcnQgY29uc3QgZGF0ZVJldml2ZXIgPSAoX2tleTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgZGV0ZWN0RGF0ZS50ZXN0KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gbmV3IERhdGUodmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59O1xuXG5jb25zdCBkdW1teVJldml2ZXIgPSAoX2tleTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiB2YWx1ZTtcblxuY29uc3QgY2hlY2tJc0Jyb3dzZXJFbnYgPSAoKSA9PiB7XG4gICAgcmV0dXJuIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnO1xufTtcblxuY29uc3QgdmFsaWRhdGVTdGF0ZUtleXMgPSAoa2V5czogS2V5cykgPT4ge1xuICAgIHJldHVybiAoa2V5cyBhcyBhbnlbXSkubWFwKChrZXkpID0+IHtcbiAgICAgICAgbGV0IGF0dHIgPSBrZXk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBhdHRyID0gT2JqZWN0LmtleXMoa2V5KVswXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgYXR0ciAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICAgICAgYGxvY2FsU3RvcmFnZVN5bmMgVW5rbm93biBQYXJhbWV0ZXIgVHlwZTogYCArIGBFeHBlY3RlZCB0eXBlIG9mIHN0cmluZywgZ290ICR7dHlwZW9mIGF0dHJ9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ga2V5O1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlaHlkcmF0ZUFwcGxpY2F0aW9uU3RhdGUgPSAoXG4gICAga2V5czogS2V5cyxcbiAgICBzdG9yYWdlOiBTdG9yYWdlLFxuICAgIHN0b3JhZ2VLZXlTZXJpYWxpemVyOiAoa2V5OiBzdHJpbmcpID0+IHN0cmluZyxcbiAgICByZXN0b3JlRGF0ZXM6IGJvb2xlYW5cbikgPT4ge1xuICAgIHJldHVybiAoa2V5cyBhcyBhbnlbXSkucmVkdWNlKChhY2MsIGN1cnIpID0+IHtcbiAgICAgICAgbGV0IGtleSA9IGN1cnI7XG4gICAgICAgIGxldCByZXZpdmVyID0gcmVzdG9yZURhdGVzID8gZGF0ZVJldml2ZXIgOiBkdW1teVJldml2ZXI7XG4gICAgICAgIGxldCBkZXNlcmlhbGl6ZTogKGFyZzA6IHN0cmluZykgPT4gYW55O1xuICAgICAgICBsZXQgZGVjcnlwdDogKGFyZzA6IHN0cmluZykgPT4gc3RyaW5nO1xuXG4gICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAga2V5ID0gT2JqZWN0LmtleXMoa2V5KVswXTtcbiAgICAgICAgICAgIC8vIHVzZSB0aGUgY3VzdG9tIHJldml2ZXIgZnVuY3Rpb25cbiAgICAgICAgICAgIGlmICh0eXBlb2YgY3VycltrZXldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgcmV2aXZlciA9IGN1cnJba2V5XTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gdXNlIGN1c3RvbSByZXZpdmVyIGZ1bmN0aW9uIGlmIGF2YWlsYWJsZVxuICAgICAgICAgICAgICAgIGlmIChjdXJyW2tleV0ucmV2aXZlcikge1xuICAgICAgICAgICAgICAgICAgICByZXZpdmVyID0gY3VycltrZXldLnJldml2ZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHVzZSBjdXN0b20gc2VyaWFsaXplIGZ1bmN0aW9uIGlmIGF2YWlsYWJsZVxuICAgICAgICAgICAgICAgIGlmIChjdXJyW2tleV0uZGVzZXJpYWxpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVzZXJpYWxpemUgPSBjdXJyW2tleV0uZGVzZXJpYWxpemU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCBlbmNyeXB0IGFuZCBkZWNyeXB0IGZ1bmN0aW9ucyBhcmUgYm90aCBwcmVzZW50XG4gICAgICAgICAgICBpZiAoY3VycltrZXldLmVuY3J5cHQgJiYgY3VycltrZXldLmRlY3J5cHQpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGN1cnJba2V5XS5lbmNyeXB0ID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBjdXJyW2tleV0uZGVjcnlwdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBkZWNyeXB0ID0gY3VycltrZXldLmRlY3J5cHQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRWl0aGVyIGVuY3J5cHQgb3IgZGVjcnlwdCBpcyBub3QgYSBmdW5jdGlvbiBvbiAnJHtjdXJyW2tleV19JyBrZXkgb2JqZWN0LmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VycltrZXldLmVuY3J5cHQgfHwgY3VycltrZXldLmRlY3J5cHQpIHtcbiAgICAgICAgICAgICAgICAvLyBMZXQga25vdyB0aGF0IG9uZSBvZiB0aGUgZW5jcnlwdGlvbiBmdW5jdGlvbnMgaXMgbm90IHByb3ZpZGVkXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRWl0aGVyIGVuY3J5cHQgb3IgZGVjcnlwdCBmdW5jdGlvbiBpcyBub3QgcHJlc2VudCBvbiAnJHtjdXJyW2tleV19JyBrZXkgb2JqZWN0LmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzdG9yYWdlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxldCBzdGF0ZVNsaWNlID0gc3RvcmFnZS5nZXRJdGVtKHN0b3JhZ2VLZXlTZXJpYWxpemVyKGtleSkpO1xuICAgICAgICAgICAgaWYgKHN0YXRlU2xpY2UpIHtcbiAgICAgICAgICAgICAgICAvLyBVc2UgcHJvdmlkZWQgZGVjcnlwdCBmdW5jdGlvblxuICAgICAgICAgICAgICAgIGlmIChkZWNyeXB0KSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlU2xpY2UgPSBkZWNyeXB0KHN0YXRlU2xpY2UpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGlzT2JqZWN0UmVnZXggPSBuZXcgUmVnRXhwKCd7fFxcXFxbJyk7XG4gICAgICAgICAgICAgICAgbGV0IHJhdyA9IHN0YXRlU2xpY2U7XG5cbiAgICAgICAgICAgICAgICBpZiAoc3RhdGVTbGljZSA9PT0gJ251bGwnIHx8IGlzT2JqZWN0UmVnZXgudGVzdChzdGF0ZVNsaWNlLmNoYXJBdCgwKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmF3ID0gSlNPTi5wYXJzZShzdGF0ZVNsaWNlLCByZXZpdmVyKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgYWNjLCB7XG4gICAgICAgICAgICAgICAgICAgIFtrZXldOiBkZXNlcmlhbGl6ZSA/IGRlc2VyaWFsaXplKHJhdykgOiByYXcsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSk7XG59O1xuXG4vLyBSZWN1cnNpdmVseSB0cmF2ZXJzZSBhbGwgcHJvcGVydGllcyBvZiB0aGUgZXhpc3Rpbmcgc2xpY2UgYXMgZGVmaW5lZCBieSB0aGUgYGZpbHRlcmAgYXJndW1lbnQsXG4vLyBhbmQgb3V0cHV0IHRoZSBuZXcgb2JqZWN0IHdpdGggZXh0cmFuZW91cyBwcm9wZXJ0aWVzIHJlbW92ZWQuXG5mdW5jdGlvbiBjcmVhdGVTdGF0ZVNsaWNlKGV4aXN0aW5nU2xpY2U6IGFueSwgZmlsdGVyOiAoc3RyaW5nIHwgbnVtYmVyIHwgS2V5Q29uZmlndXJhdGlvbiB8IE9wdGlvbnMpW10pIHtcbiAgICByZXR1cm4gZmlsdGVyLnJlZHVjZShcbiAgICAgICAgKG1lbW86IHsgW3g6IHN0cmluZ106IGFueTsgW3g6IG51bWJlcl06IGFueSB9LCBhdHRyOiBzdHJpbmcgfCBudW1iZXIgfCBLZXlDb25maWd1cmF0aW9uIHwgT3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBhdHRyID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgYXR0ciA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGV4aXN0aW5nU2xpY2U/LlthdHRyXTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBtZW1vW2F0dHJdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBhdHRyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYXR0ciwga2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGF0dHJba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9ba2V5XSA9IGNyZWF0ZVN0YXRlU2xpY2UoZXhpc3RpbmdTbGljZVtrZXldLCBlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtZW1vO1xuICAgICAgICB9LFxuICAgICAgICB7fVxuICAgICk7XG59XG5cbmV4cG9ydCBjb25zdCBzeW5jU3RhdGVVcGRhdGUgPSAoXG4gICAgc3RhdGU6IGFueSxcbiAgICBrZXlzOiBLZXlzLFxuICAgIHN0b3JhZ2U6IFN0b3JhZ2UsXG4gICAgc3RvcmFnZUtleVNlcmlhbGl6ZXI6IChrZXk6IHN0cmluZyB8IG51bWJlcikgPT4gc3RyaW5nLFxuICAgIHJlbW92ZU9uVW5kZWZpbmVkOiBib29sZWFuLFxuICAgIHN5bmNDb25kaXRpb24/OiAoc3RhdGU6IGFueSkgPT4gYW55XG4pID0+IHtcbiAgICBpZiAoc3luY0NvbmRpdGlvbikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHN5bmNDb25kaXRpb24oc3RhdGUpICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBUcmVhdCBUeXBlRXJyb3IgYXMgZG8gbm90IHN5bmNcbiAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgVHlwZUVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGtleXMuZm9yRWFjaCgoa2V5OiBzdHJpbmcgfCBLZXlDb25maWd1cmF0aW9uIHwgT3B0aW9ucyB8ICgoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IGFueSkpOiB2b2lkID0+IHtcbiAgICAgICAgbGV0IHN0YXRlU2xpY2UgPSBzdGF0ZVtrZXkgYXMgc3RyaW5nXTtcbiAgICAgICAgbGV0IHJlcGxhY2VyO1xuICAgICAgICBsZXQgc3BhY2U6IHN0cmluZyB8IG51bWJlcjtcbiAgICAgICAgbGV0IGVuY3J5cHQ7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBsZXQgbmFtZSA9IE9iamVjdC5rZXlzKGtleSlbMF07XG4gICAgICAgICAgICBzdGF0ZVNsaWNlID0gc3RhdGVbbmFtZV07XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc3RhdGVTbGljZSAhPT0gJ3VuZGVmaW5lZCcgJiYga2V5W25hbWVdKSB7XG4gICAgICAgICAgICAgICAgLy8gdXNlIHNlcmlhbGl6ZSBmdW5jdGlvbiBpZiBzcGVjaWZpZWQuXG4gICAgICAgICAgICAgICAgaWYgKGtleVtuYW1lXS5zZXJpYWxpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGVTbGljZSA9IGtleVtuYW1lXS5zZXJpYWxpemUoc3RhdGVTbGljZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgc2VyaWFsaXplIGZ1bmN0aW9uIGlzIG5vdCBzcGVjaWZpZWQgZmlsdGVyIG9uIGZpZWxkcyBpZiBhbiBhcnJheSBoYXMgYmVlbiBwcm92aWRlZC5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGZpbHRlcjogS2V5Q29uZmlndXJhdGlvbltdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5W25hbWVdLnJlZHVjZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0ga2V5W25hbWVdO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleVtuYW1lXS5maWx0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciA9IGtleVtuYW1lXS5maWx0ZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVTbGljZSA9IGNyZWF0ZVN0YXRlU2xpY2Uoc3RhdGVTbGljZSwgZmlsdGVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGVuY3J5cHQgYW5kIGRlY3J5cHQgYXJlIHByZXNlbnQsIGFsc28gY2hlY2tlZCBhdCB0aGlzI3JlaHlkcmF0ZUFwcGxpY2F0aW9uU3RhdGUoKVxuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5W25hbWVdLmVuY3J5cHQgJiYga2V5W25hbWVdLmRlY3J5cHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yga2V5W25hbWVdLmVuY3J5cHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0ID0ga2V5W25hbWVdLmVuY3J5cHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5W25hbWVdLmVuY3J5cHQgfHwga2V5W25hbWVdLmRlY3J5cHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIG9uZSBvZiB0aG9zZSBpcyBub3QgcHJlc2VudCwgdGhlbiBsZXQga25vdyB0aGF0IG9uZSBpcyBtaXNzaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBFaXRoZXIgZW5jcnlwdCBvciBkZWNyeXB0IGZ1bmN0aW9uIGlzIG5vdCBwcmVzZW50IG9uICcke2tleVtuYW1lXX0nIGtleSBvYmplY3QuYFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgUmVwbGFjZXIgYW5kIHNwYWNlIGFyZ3VtZW50cyB0byBwYXNzIHRvIEpTT04uc3RyaW5naWZ5LlxuICAgICAgICAgIElmIHRoZXNlIGZpZWxkcyBkb24ndCBleGlzdCwgdW5kZWZpbmVkIHdpbGwgYmUgcGFzc2VkLlxuICAgICAgICAqL1xuICAgICAgICAgICAgICAgIHJlcGxhY2VyID0ga2V5W25hbWVdLnJlcGxhY2VyO1xuICAgICAgICAgICAgICAgIHNwYWNlID0ga2V5W25hbWVdLnNwYWNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBrZXkgPSBuYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBzdGF0ZVNsaWNlICE9PSAndW5kZWZpbmVkJyAmJiBzdG9yYWdlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKGVuY3J5cHQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZW5zdXJlIHRoYXQgYSBzdHJpbmcgbWVzc2FnZSBpcyBwYXNzZWRcbiAgICAgICAgICAgICAgICAgICAgc3RhdGVTbGljZSA9IGVuY3J5cHQoXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2Ygc3RhdGVTbGljZSA9PT0gJ3N0cmluZycgPyBzdGF0ZVNsaWNlIDogSlNPTi5zdHJpbmdpZnkoc3RhdGVTbGljZSwgcmVwbGFjZXIsIHNwYWNlKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzdG9yYWdlLnNldEl0ZW0oXG4gICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VLZXlTZXJpYWxpemVyKGtleSBhcyBzdHJpbmcpLFxuICAgICAgICAgICAgICAgICAgICB0eXBlb2Ygc3RhdGVTbGljZSA9PT0gJ3N0cmluZycgPyBzdGF0ZVNsaWNlIDogSlNPTi5zdHJpbmdpZnkoc3RhdGVTbGljZSwgcmVwbGFjZXIsIHNwYWNlKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdVbmFibGUgdG8gc2F2ZSBzdGF0ZSB0byBsb2NhbFN0b3JhZ2U6JywgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHN0YXRlU2xpY2UgPT09ICd1bmRlZmluZWQnICYmIHJlbW92ZU9uVW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHN0b3JhZ2UucmVtb3ZlSXRlbShzdG9yYWdlS2V5U2VyaWFsaXplcihrZXkgYXMgc3RyaW5nKSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBFeGNlcHRpb24gb24gcmVtb3ZpbmcvY2xlYW5pbmcgdW5kZWZpbmVkICcke2tleX0nIHN0YXRlYCwgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn07XG5cbi8vIERlZmF1bHQgbWVyZ2Ugc3RyYXRlZ3kgaXMgYSBmdWxsIGRlZXAgbWVyZ2UuXG5leHBvcnQgY29uc3QgZGVmYXVsdE1lcmdlUmVkdWNlciA9IChzdGF0ZTogYW55LCByZWh5ZHJhdGVkU3RhdGU6IGFueSwgYWN0aW9uOiBhbnkpID0+IHtcbiAgICBpZiAoKGFjdGlvbi50eXBlID09PSBJTklUX0FDVElPTiB8fCBhY3Rpb24udHlwZSA9PT0gVVBEQVRFX0FDVElPTikgJiYgcmVoeWRyYXRlZFN0YXRlKSB7XG4gICAgICAgIGNvbnN0IG92ZXJ3cml0ZU1lcmdlID0gKGRlc3RpbmF0aW9uQXJyYXk6IGFueSwgc291cmNlQXJyYXk6IGFueSwgb3B0aW9uczogYW55KSA9PiBzb3VyY2VBcnJheTtcbiAgICAgICAgY29uc3Qgb3B0aW9uczogZGVlcG1lcmdlLk9wdGlvbnMgPSB7XG4gICAgICAgICAgICBhcnJheU1lcmdlOiBvdmVyd3JpdGVNZXJnZSxcbiAgICAgICAgfTtcblxuICAgICAgICBzdGF0ZSA9IGRlZXBtZXJnZShzdGF0ZSwgcmVoeWRyYXRlZFN0YXRlLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RhdGU7XG59O1xuXG5leHBvcnQgY29uc3QgbG9jYWxTdG9yYWdlU3luYyA9IChjb25maWc6IExvY2FsU3RvcmFnZUNvbmZpZykgPT4gKHJlZHVjZXI6IGFueSkgPT4ge1xuICAgIGlmIChcbiAgICAgICAgKGNvbmZpZy5zdG9yYWdlID09PSB1bmRlZmluZWQgJiYgIWNvbmZpZy5jaGVja1N0b3JhZ2VBdmFpbGFiaWxpdHkpIHx8XG4gICAgICAgIChjb25maWcuY2hlY2tTdG9yYWdlQXZhaWxhYmlsaXR5ICYmIGNoZWNrSXNCcm93c2VyRW52KCkpXG4gICAgKSB7XG4gICAgICAgIGNvbmZpZy5zdG9yYWdlID0gbG9jYWxTdG9yYWdlIHx8IHdpbmRvdy5sb2NhbFN0b3JhZ2U7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZy5zdG9yYWdlS2V5U2VyaWFsaXplciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbmZpZy5zdG9yYWdlS2V5U2VyaWFsaXplciA9IChrZXkpID0+IGtleTtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnLnJlc3RvcmVEYXRlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbmZpZy5yZXN0b3JlRGF0ZXMgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIFVzZSBkZWZhdWx0IG1lcmdlIHJlZHVjZXIuXG4gICAgbGV0IG1lcmdlUmVkdWNlciA9IGNvbmZpZy5tZXJnZVJlZHVjZXI7XG5cbiAgICBpZiAobWVyZ2VSZWR1Y2VyID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIG1lcmdlUmVkdWNlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBtZXJnZVJlZHVjZXIgPSBkZWZhdWx0TWVyZ2VSZWR1Y2VyO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXRlS2V5cyA9IHZhbGlkYXRlU3RhdGVLZXlzKGNvbmZpZy5rZXlzKTtcbiAgICBjb25zdCByZWh5ZHJhdGVkU3RhdGUgPSBjb25maWcucmVoeWRyYXRlXG4gICAgICAgID8gcmVoeWRyYXRlQXBwbGljYXRpb25TdGF0ZShzdGF0ZUtleXMsIGNvbmZpZy5zdG9yYWdlLCBjb25maWcuc3RvcmFnZUtleVNlcmlhbGl6ZXIsIGNvbmZpZy5yZXN0b3JlRGF0ZXMpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzdGF0ZTogYW55LCBhY3Rpb246IGFueSkge1xuICAgICAgICBsZXQgbmV4dFN0YXRlOiBhbnk7XG5cbiAgICAgICAgLy8gSWYgc3RhdGUgYXJyaXZlcyB1bmRlZmluZWQsIHdlIG5lZWQgdG8gbGV0IGl0IHRocm91Z2ggdGhlIHN1cHBsaWVkIHJlZHVjZXJcbiAgICAgICAgLy8gaW4gb3JkZXIgdG8gZ2V0IGEgY29tcGxldGUgc3RhdGUgYXMgZGVmaW5lZCBieSB1c2VyXG4gICAgICAgIGlmIChhY3Rpb24udHlwZSA9PT0gSU5JVF9BQ1RJT04gJiYgIXN0YXRlKSB7XG4gICAgICAgICAgICBuZXh0U3RhdGUgPSByZWR1Y2VyKHN0YXRlLCBhY3Rpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV4dFN0YXRlID0geyAuLi5zdGF0ZSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWVyZ2UgdGhlIHN0b3JlIHN0YXRlIHdpdGggdGhlIHJlaHlkcmF0ZWQgc3RhdGUgdXNpbmdcbiAgICAgICAgLy8gZWl0aGVyIGEgdXNlci1kZWZpbmVkIHJlZHVjZXIgb3IgdGhlIGRlZmF1bHQuXG4gICAgICAgIG5leHRTdGF0ZSA9IG1lcmdlUmVkdWNlcihuZXh0U3RhdGUsIHJlaHlkcmF0ZWRTdGF0ZSwgYWN0aW9uKTtcblxuICAgICAgICBuZXh0U3RhdGUgPSByZWR1Y2VyKG5leHRTdGF0ZSwgYWN0aW9uKTtcblxuICAgICAgICBpZiAoYWN0aW9uLnR5cGUgIT09IElOSVRfQUNUSU9OKSB7XG4gICAgICAgICAgICBzeW5jU3RhdGVVcGRhdGUoXG4gICAgICAgICAgICAgICAgbmV4dFN0YXRlLFxuICAgICAgICAgICAgICAgIHN0YXRlS2V5cyxcbiAgICAgICAgICAgICAgICBjb25maWcuc3RvcmFnZSxcbiAgICAgICAgICAgICAgICBjb25maWcuc3RvcmFnZUtleVNlcmlhbGl6ZXIsXG4gICAgICAgICAgICAgICAgY29uZmlnLnJlbW92ZU9uVW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGNvbmZpZy5zeW5jQ29uZGl0aW9uXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5leHRTdGF0ZTtcbiAgICB9O1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBMb2NhbFN0b3JhZ2VDb25maWcge1xuICAgIGtleXM6IEtleXM7XG4gICAgcmVoeWRyYXRlPzogYm9vbGVhbjtcbiAgICBzdG9yYWdlPzogU3RvcmFnZTtcbiAgICByZW1vdmVPblVuZGVmaW5lZD86IGJvb2xlYW47XG4gICAgcmVzdG9yZURhdGVzPzogYm9vbGVhbjtcbiAgICBzdG9yYWdlS2V5U2VyaWFsaXplcj86IChrZXk6IHN0cmluZykgPT4gc3RyaW5nO1xuICAgIHN5bmNDb25kaXRpb24/OiAoc3RhdGU6IGFueSkgPT4gYW55O1xuICAgIGNoZWNrU3RvcmFnZUF2YWlsYWJpbGl0eT86IGJvb2xlYW47XG4gICAgbWVyZ2VSZWR1Y2VyPzogKHN0YXRlOiBhbnksIHJlaHlkcmF0ZWRTdGF0ZTogYW55LCBhY3Rpb246IGFueSkgPT4gYW55O1xufVxuXG5pbnRlcmZhY2UgS2V5Q29uZmlndXJhdGlvbiB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nW10gfCBudW1iZXJbXSB8IEtleUNvbmZpZ3VyYXRpb25bXSB8IE9wdGlvbnMgfCAoKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiBhbnkpO1xufVxuXG5pbnRlcmZhY2UgT3B0aW9ucyB7XG4gICAgc2VyaWFsaXplPzogKHN0YXRlOiBhbnkpID0+IGFueTtcbiAgICBkZXNlcmlhbGl6ZT86IChzdGF0ZTogYW55KSA9PiBhbnk7XG4gICAgcmV2aXZlcj86IChrZXk6IHN0cmluZywgdmFsdWU6IGFueSkgPT4gYW55O1xuICAgIHJlcGxhY2VyPzogKChrZXk6IHN0cmluZywgdmFsdWU6IGFueSkgPT4gYW55KSB8IHN0cmluZ1tdO1xuICAgIGVuY3J5cHQ/OiAobWVzc2FnZTogc3RyaW5nKSA9PiBzdHJpbmc7XG4gICAgZGVjcnlwdD86IChtZXNzYWdlOiBzdHJpbmcpID0+IHN0cmluZztcbiAgICBmaWx0ZXI/OiBzdHJpbmdbXTtcbiAgICBzcGFjZT86IHN0cmluZyB8IG51bWJlcjtcbn1cblxuZXhwb3J0IHR5cGUgS2V5cyA9IHN0cmluZ1tdIHwgKEtleUNvbmZpZ3VyYXRpb24gfCBPcHRpb25zKVtdO1xuIl19

@@ -7,3 +7,3 @@ import * as deepmerge from 'deepmerge';

// correctly parse dates from local storage
const dateReviver = (key, value) => {
const dateReviver = (_key, value) => {
if (typeof value === 'string' && detectDate.test(value)) {

@@ -14,3 +14,3 @@ return new Date(value);

};
const dummyReviver = (key, value) => value;
const dummyReviver = (_key, value) => value;
const ɵ0 = dummyReviver;

@@ -22,3 +22,3 @@ const checkIsBrowserEnv = () => {

const validateStateKeys = (keys) => {
return keys.map(key => {
return keys.map((key) => {
let attr = key;

@@ -29,4 +29,3 @@ if (typeof key === 'object') {

if (typeof attr !== 'string') {
throw new TypeError(`localStorageSync Unknown Parameter Type: ` +
`Expected type of string, got ${typeof attr}`);
throw new TypeError(`localStorageSync Unknown Parameter Type: ` + `Expected type of string, got ${typeof attr}`);
}

@@ -61,4 +60,3 @@ return key;

if (curr[key].encrypt && curr[key].decrypt) {
if (typeof curr[key].encrypt === 'function' &&
typeof curr[key].decrypt === 'function') {
if (typeof curr[key].encrypt === 'function' && typeof curr[key].decrypt === 'function') {
decrypt = curr[key].decrypt;

@@ -88,3 +86,3 @@ }

return Object.assign({}, acc, {
[key]: deserialize ? deserialize(raw) : raw
[key]: deserialize ? deserialize(raw) : raw,
});

@@ -96,2 +94,23 @@ }

};
// Recursively traverse all properties of the existing slice as defined by the `filter` argument,
// and output the new object with extraneous properties removed.
function createStateSlice(existingSlice, filter) {
return filter.reduce((memo, attr) => {
if (typeof attr === 'string' || typeof attr === 'number') {
const value = existingSlice === null || existingSlice === void 0 ? void 0 : existingSlice[attr];
if (value !== undefined) {
memo[attr] = value;
}
}
else {
for (const key in attr) {
if (Object.prototype.hasOwnProperty.call(attr, key)) {
const element = attr[key];
memo[key] = createStateSlice(existingSlice[key], element);
}
}
}
return memo;
}, {});
}
const syncStateUpdate = (state, keys, storage, storageKeySerializer, removeOnUndefined, syncCondition) => {

@@ -112,3 +131,3 @@ if (syncCondition) {

}
keys.forEach(key => {
keys.forEach((key) => {
let stateSlice = state[key];

@@ -136,6 +155,3 @@ let replacer;

if (filter) {
stateSlice = filter.reduce((memo, attr) => {
memo[attr] = stateSlice[attr];
return memo;
}, {});
stateSlice = createStateSlice(stateSlice, filter);
}

@@ -154,5 +170,5 @@ // Check if encrypt and decrypt are present, also checked at this#rehydrateApplicationState()

/*
Replacer and space arguments to pass to JSON.stringify.
If these fields don't exist, undefined will be passed.
*/
Replacer and space arguments to pass to JSON.stringify.
If these fields don't exist, undefined will be passed.
*/
replacer = key[name].replacer;

@@ -167,9 +183,5 @@ space = key[name].space;

// ensure that a string message is passed
stateSlice = encrypt(typeof stateSlice === 'string'
? stateSlice
: JSON.stringify(stateSlice, replacer, space));
stateSlice = encrypt(typeof stateSlice === 'string' ? stateSlice : JSON.stringify(stateSlice, replacer, space));
}
storage.setItem(storageKeySerializer(key), typeof stateSlice === 'string'
? stateSlice
: JSON.stringify(stateSlice, replacer, space));
storage.setItem(storageKeySerializer(key), typeof stateSlice === 'string' ? stateSlice : JSON.stringify(stateSlice, replacer, space));
}

@@ -195,3 +207,3 @@ catch (e) {

const options = {
arrayMerge: overwriteMerge
arrayMerge: overwriteMerge,
};

@@ -203,8 +215,8 @@ state = deepmerge(state, rehydratedState, options);

const localStorageSync = (config) => (reducer) => {
if (config.storage === undefined &&
!config.checkStorageAvailability || (config.checkStorageAvailability && checkIsBrowserEnv())) {
if ((config.storage === undefined && !config.checkStorageAvailability) ||
(config.checkStorageAvailability && checkIsBrowserEnv())) {
config.storage = localStorage || window.localStorage;
}
if (config.storageKeySerializer === undefined) {
config.storageKeySerializer = key => key;
config.storageKeySerializer = (key) => key;
}

@@ -216,3 +228,3 @@ if (config.restoreDates === undefined) {

let mergeReducer = config.mergeReducer;
if (mergeReducer === undefined || typeof (mergeReducer) !== 'function') {
if (mergeReducer === undefined || typeof mergeReducer !== 'function') {
mergeReducer = defaultMergeReducer;

@@ -228,3 +240,3 @@ }

// in order to get a complete state as defined by user
if ((action.type === INIT_ACTION) && !state) {
if (action.type === INIT_ACTION && !state) {
nextState = reducer(state, action);

@@ -231,0 +243,0 @@ }

@@ -1,8 +0,8 @@

export declare const dateReviver: (key: string, value: any) => any;
export declare const rehydrateApplicationState: (keys: any[], storage: Storage, storageKeySerializer: (key: string) => string, restoreDates: boolean) => any;
export declare const syncStateUpdate: (state: any, keys: any[], storage: Storage, storageKeySerializer: (key: string) => string, removeOnUndefined: boolean, syncCondition?: (state: any) => any) => void;
export declare const dateReviver: (_key: string, value: any) => any;
export declare const rehydrateApplicationState: (keys: Keys, storage: Storage, storageKeySerializer: (key: string) => string, restoreDates: boolean) => any;
export declare const syncStateUpdate: (state: any, keys: Keys, storage: Storage, storageKeySerializer: (key: string | number) => string, removeOnUndefined: boolean, syncCondition?: (state: any) => any) => void;
export declare const defaultMergeReducer: (state: any, rehydratedState: any, action: any) => any;
export declare const localStorageSync: (config: LocalStorageConfig) => (reducer: any) => (state: any, action: any) => any;
export interface LocalStorageConfig {
keys: any[];
keys: Keys;
rehydrate?: boolean;

@@ -17,1 +17,16 @@ storage?: Storage;

}
interface KeyConfiguration {
[key: string]: string[] | number[] | KeyConfiguration[] | Options | ((key: string, value: any) => any);
}
interface Options {
serialize?: (state: any) => any;
deserialize?: (state: any) => any;
reviver?: (key: string, value: any) => any;
replacer?: ((key: string, value: any) => any) | string[];
encrypt?: (message: string) => string;
decrypt?: (message: string) => string;
filter?: string[];
space?: string | number;
}
export declare type Keys = string[] | (KeyConfiguration | Options)[];
export {};

@@ -1,1 +0,1 @@

{"__symbolic":"module","version":4,"metadata":{"dateReviver":{"__symbolic":"error","message":"Lambda not supported","line":7,"character":27,"module":"./lib/index"},"rehydrateApplicationState":{"__symbolic":"error","message":"Lambda not supported","line":38,"character":41,"module":"./lib/index"},"syncStateUpdate":{"__symbolic":"error","message":"Lambda not supported","line":113,"character":31,"module":"./lib/index"},"defaultMergeReducer":{"__symbolic":"error","message":"Lambda not supported","line":222,"character":35,"module":"./lib/index"},"localStorageSync":{"__symbolic":"error","message":"Lambda not supported","line":236,"character":32,"module":"./lib/index"},"LocalStorageConfig":{"__symbolic":"interface"}},"origins":{"dateReviver":"./lib/index","rehydrateApplicationState":"./lib/index","syncStateUpdate":"./lib/index","defaultMergeReducer":"./lib/index","localStorageSync":"./lib/index","LocalStorageConfig":"./lib/index"},"importAs":"ngrx-store-localstorage"}
{"__symbolic":"module","version":4,"metadata":{"dateReviver":{"__symbolic":"error","message":"Lambda not supported","line":7,"character":27,"module":"./lib/index"},"rehydrateApplicationState":{"__symbolic":"error","message":"Lambda not supported","line":37,"character":41,"module":"./lib/index"},"syncStateUpdate":{"__symbolic":"error","message":"Lambda not supported","line":125,"character":31,"module":"./lib/index"},"defaultMergeReducer":{"__symbolic":"error","message":"Lambda not supported","line":223,"character":35,"module":"./lib/index"},"localStorageSync":{"__symbolic":"error","message":"Lambda not supported","line":236,"character":32,"module":"./lib/index"},"LocalStorageConfig":{"__symbolic":"interface"},"Keys":{"__symbolic":"interface"}},"origins":{"dateReviver":"./lib/index","rehydrateApplicationState":"./lib/index","syncStateUpdate":"./lib/index","defaultMergeReducer":"./lib/index","localStorageSync":"./lib/index","LocalStorageConfig":"./lib/index","Keys":"./lib/index"},"importAs":"ngrx-store-localstorage"}
{
"name": "ngrx-store-localstorage",
"version": "10.0.0",
"version": "10.1.0",
"description": "State and local storage syncing for @ngrx/store",

@@ -5,0 +5,0 @@ "repository": {

@@ -66,3 +66,3 @@ # ngrx-store-localstorage

* An array of properties which should be synced. This allows for the partial state sync (e.g. `localStorageSync({keys: [{todos: ['name', 'status'] }, ... ]})`). Note: this config cannot go any deeper. So you cannot specify another object inside of the `todos` array for example.
* An array of properties which should be synced. This allows for the partial state sync (e.g. `localStorageSync({keys: [{todos: ['name', 'status'] }, ... ]})`).

@@ -100,4 +100,21 @@ * A reviver function as specified in the [JSON.parse documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse).

Usage: `localStorageSync({keys: ['todos', 'visibilityFilter'], storageKeySerializer: (key) => 'cool_' + key, ... })`. In this example `Storage` will use keys `cool_todos` and `cool_visibilityFilter` keys to store `todos` and `visibilityFilter` slices of state). The key itself is used by default - `(key) => key`.
### Usage
#### Key Prefix
```ts
localStorageSync({keys: ['todos', 'visibilityFilter'], storageKeySerializer: (key) => 'cool_' + key, ... });
```
In above example `Storage` will use keys `cool_todos` and `cool_visibilityFilter` keys to store `todos` and `visibilityFilter` slices of state). The key itself is used by default - `(key) => key`.
#### Target Depth Configuration
```ts
localStorageSync({
keys: [
{ feature1: [{ slice11: ['slice11_1'], slice14: ['slice14_2'] }] },
{ feature2: ['slice21'] }
],
});
```
In this example, `feature1.slice11.slice11_1`, `feature1.slice14.slice14_2`, and `feature2.slice21` will be synced to `localStorage.feature1` and `localStorage.feature2`.
## Release Notes / Changelog

@@ -104,0 +121,0 @@

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc